From 253de26f251e04a2738dc2a337b702e5fa271090 Mon Sep 17 00:00:00 2001 From: Rmys Date: Fri, 14 Nov 2025 14:07:20 +0300 Subject: [PATCH] kernel-6.12.58 --- .../aufs6-base.patch} | 133 +- .../aufs6-kbuild.patch} | 12 +- .../aufs6-loopback.patch} | 89 +- .../aufs6-mmap.patch} | 297 +- .../aufs6-standalone.patch} | 164 +- .../aufs6.12-20250414.patch} | 2515 +- .../files/patches/aufs6/lockdep-debug.patch | 16 + .../patches/{aufs5 => aufs6}/tmpfs-idr.patch | 126 +- .../patches/{aufs5 => aufs6}/vfs-ino.patch | 6 +- .../perf/files/patches/linux/patch-5.15.81.xz | Bin 3081452 -> 0 bytes .../perf/files/patches/linux/patch-6.12.54.xz | Bin 0 -> 3096864 bytes .../perf/files/patches/linux/patch-6.12.58.xz | Bin 0 -> 3286180 bytes ...21-from-list-of-device-supported-by-.patch | 28 + ...0001-rtl8812au-add-missed-prototypes.patch | 6262 ++ .../mageia/0002-rtl8812au-fix-warnings.patch | 22 + ...0005-rtl8812au-add-missed-prototypes.patch | 188 + ...ggested-braces-around-empty-body-in-.patch | 33 + ...ggested-braces-around-empty-body-in-.patch | 45 + ...ggested-braces-around-empty-body-in-.patch | 311 + ...ggested-braces-around-empty-body-in-.patch | 96 + ...0010-rtl8812au-add-missed-prototypes.patch | 42 + ...122-Fix-change_beacon-for-kernel-6.7.patch | 33 + ...123-Update-os_intfs.c-for-kernel-6.8.patch | 27 + ...124-Update-usb_intf.c-for-kernel-6.8.patch | 25 + ...tl_cfg80211.c-support-for-kernel-6.9.patch | 35 + .../patches/mageia/3rd-3rdparty-merge.patch | 57 - .../patches/mageia/3rd-3rdparty-tree.patch | 21 - .../patches/mageia/3rd-fix-kconfig.patch | 34 - .../patches/mageia/3rd-ndiswrapper-1.63.patch | 26570 ----- .../mageia/3rd-ndiswrapper-Kconfig.patch | 7 - .../3rd-ndiswrapper-Makefile-build-fix.patch | 45 - .../3rd-niswrapper-Kconfig-Makefile.patch | 16 - .../mageia/3rd-rtl8223de-kernel-5.6.patch | 244 - .../3rd-rtl8723de-Kconfig-Makefile.patch | 16 - ...3rd-rtl8723de-add-kernel-5.8-support.patch | 79 - .../mageia/3rd-rtl8723de-fix-redefine.patch | 13 - .../mageia/3rd-rtl8723de-nodebug.patch | 11 - .../3rd-rtl8812au-Kconfig-Makefile.patch | 16 - .../mageia/3rd-rtl8812au-kernel-5.10.patch | 281 - .../mageia/3rd-rtl8812au-kernel-5.12.patch | 12 - .../mageia/3rd-rtl8812au-kernel-5.15.patch | 66 - .../patches/mageia/3rd-rtl8812au-rename.patch | 78 - .../mageia/3rd-rtl8821ce-5.8-fix.patch | 301 - .../3rd-rtl8821ce-Kconfig-Makefile.patch | 20 - .../mageia/3rd-rtl8821ce-kernel-5.10.patch | 162 - .../mageia/3rd-rtl8821ce-kernel-5.12.patch | 12 - .../mageia/3rd-rtl8821ce-kernel-5.15.patch | 66 - .../patches/mageia/3rd-viahss-0.92.patch | 189 - .../mageia/3rd-viahss-2.6.35-buildfix.patch | 20 - .../mageia/3rd-viahss-3.0-buildfix.patch | 19 - .../mageia/3rd-viahss-Kconfig-Makefile.patch | 16 - .../patches/mageia/3rd-viahss-config.patch | 18 - .../mageia/3rd-viahss-module-license.patch | 7 - .../files/patches/mageia/CVE-2019-12379.patch | 37 - ...9-DCCP-CCID-structure-use-after-free.patch | 305 - ...github-https-github.com-for-terrelln.patch | 33 + .../mageia/fs-aufs5.10-symbol-exports.patch | 284 - .../patches/mageia/fs-aufs5.10-tristate.patch | 24 - .../files/patches/mageia/fs-aufs5.10.patch | 37866 -------- .../mageia/fs-aufs5.15-symbol-exports.patch | 260 - .../patches/mageia/fs-aufs5.15-tristate.patch | 24 - .../files/patches/mageia/fs-aufs5.15.patch | 38061 -------- ...s-do-not-list-TID-0-in-proc-pid-task.patch | 36 - .../mageia/hack-broken-rtla-cleaner.patch | 17 + ...Add-missing-MODULE_FIRMWARE-for-pnvm.patch | 40 + .../mageia/lib-zstd-Fix-comment-typo.patch | 29 + ...zstd-clean-up-double-word-in-comment.patch | 38 + ...-zstd-fix-repeated-words-in-comments.patch | 29 + ...ame-SDIO-ID-of-the-RTL8723DS-SDIO-wi.patch | 42 + ...less-iwlwifi-add-new-pci-id-for-6235.patch | 31 + .../mageia/net-wireless-rtw88-6.2-git.patch | 2377 + .../net-wireless-rtw88-add-8723de-alias.patch | 14 + ...net-wireless-rtw88-add-r8822be-alias.patch | 14 + .../mageia/net-wireless-rtw89-6.2-git.patch | 40911 ++++++++ .../platform-x86-add-shuttle-wmi-driver.patch | 48 +- .../patches/mageia/staging-add-r8188eu.patch | 81013 ++++++++++++++++ .../mageia/staging-rtl8812au-20231117.patch | 1720 + .../staging-rtl8812au-Kconfig-Makefile.patch | 33 + .../mageia/staging-rtl8812au-rename.patch | 78 + ...tl8812au.patch => staging-rtl8812au.patch} | 23953 +---- ...ssion-for-Broadcom-PCIe-wifi-devices.patch | 34 + .../wifi-iwlwifi-fw-skip-ppag-for-jf.patch | 46 + ...wlwifi-pcie-add-support-for-AX101NGW.patch | 33 + ...alization-of-rx-link-and-rx-link_sta.patch | 451 + ...upport-for-the-SDIO-based-RTL8723DS-.patch | 105 + ...23d-Implement-RTL8723DS-SDIO-efuse-p.patch | 73 + .../x86-default_poweroff_up_machines.patch | 58 + ...pci-toshiba-equium-a60-assign-busses.patch | 29 + ...ommon-module-exports-to-zstd_common_.patch | 163 + .../mageia/zstd-import-usptream-v1.5.2.patch | 14871 +++ kernel/tools/perf/pspec.xml | 97 +- 91 files changed, 155064 insertions(+), 127114 deletions(-) rename kernel/tools/perf/files/patches/{aufs5/aufs5-base.patch => aufs6/aufs6-base.patch} (59%) rename kernel/tools/perf/files/patches/{aufs5/aufs5-kbuild.patch => aufs6/aufs6-kbuild.patch} (63%) rename kernel/tools/perf/files/patches/{aufs5/aufs5-loopback.patch => aufs6/aufs6-loopback.patch} (73%) rename kernel/tools/perf/files/patches/{aufs5/aufs5-mmap.patch => aufs6/aufs6-mmap.patch} (64%) rename kernel/tools/perf/files/patches/{aufs5/aufs5-standalone.patch => aufs6/aufs6-standalone.patch} (51%) rename kernel/tools/perf/files/patches/{aufs5/aufs5.15.41-20220620.patch => aufs6/aufs6.12-20250414.patch} (94%) create mode 100644 kernel/tools/perf/files/patches/aufs6/lockdep-debug.patch rename kernel/tools/perf/files/patches/{aufs5 => aufs6}/tmpfs-idr.patch (62%) rename kernel/tools/perf/files/patches/{aufs5 => aufs6}/vfs-ino.patch (75%) delete mode 100644 kernel/tools/perf/files/patches/linux/patch-5.15.81.xz create mode 100644 kernel/tools/perf/files/patches/linux/patch-6.12.54.xz create mode 100644 kernel/tools/perf/files/patches/linux/patch-6.12.58.xz create mode 100644 kernel/tools/perf/files/patches/mageia/0001-Pull-device-0x0821-from-list-of-device-supported-by-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0001-rtl8812au-add-missed-prototypes.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0002-rtl8812au-fix-warnings.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0005-rtl8812au-add-missed-prototypes.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0006-rtl8812au-add-suggested-braces-around-empty-body-in-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0007-rtl8812au-add-suggested-braces-around-empty-body-in-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0008-rtl8812au-add-suggested-braces-around-empty-body-in-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0009-rtl8812au-add-suggested-braces-around-empty-body-in-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0010-rtl8812au-add-missed-prototypes.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0122-Fix-change_beacon-for-kernel-6.7.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0123-Update-os_intfs.c-for-kernel-6.8.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0124-Update-usb_intf.c-for-kernel-6.8.patch create mode 100644 kernel/tools/perf/files/patches/mageia/0128-Update-ioctl_cfg80211.c-support-for-kernel-6.9.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-3rdparty-merge.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-3rdparty-tree.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-fix-kconfig.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-1.63.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Kconfig.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Makefile-build-fix.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-niswrapper-Kconfig-Makefile.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8223de-kernel-5.6.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-Kconfig-Makefile.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-add-kernel-5.8-support.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-fix-redefine.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-nodebug.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-Kconfig-Makefile.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.10.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.12.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.15.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-rename.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-5.8-fix.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-Kconfig-Makefile.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.10.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.12.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.15.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-0.92.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-2.6.35-buildfix.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-3.0-buildfix.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-Kconfig-Makefile.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-config.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/3rd-viahss-module-license.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/CVE-2019-12379.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/CVE-2020-16119-DCCP-CCID-structure-use-after-free.patch create mode 100644 kernel/tools/perf/files/patches/mageia/MAINTAINERS-git-github-https-github.com-for-terrelln.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.10-symbol-exports.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.10-tristate.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.10.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.15-symbol-exports.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.15-tristate.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-aufs5.15.patch delete mode 100644 kernel/tools/perf/files/patches/mageia/fs-procfs-do-not-list-TID-0-in-proc-pid-task.patch create mode 100644 kernel/tools/perf/files/patches/mageia/hack-broken-rtla-cleaner.patch create mode 100644 kernel/tools/perf/files/patches/mageia/iwlwifi-cfg-Add-missing-MODULE_FIRMWARE-for-pnvm.patch create mode 100644 kernel/tools/perf/files/patches/mageia/lib-zstd-Fix-comment-typo.patch create mode 100644 kernel/tools/perf/files/patches/mageia/lib-zstd-clean-up-double-word-in-comment.patch create mode 100644 kernel/tools/perf/files/patches/mageia/lib-zstd-fix-repeated-words-in-comments.patch create mode 100644 kernel/tools/perf/files/patches/mageia/mmc-sdio-Add-rename-SDIO-ID-of-the-RTL8723DS-SDIO-wi.patch create mode 100644 kernel/tools/perf/files/patches/mageia/net-wireless-iwlwifi-add-new-pci-id-for-6235.patch create mode 100644 kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-6.2-git.patch create mode 100644 kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-8723de-alias.patch create mode 100644 kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-r8822be-alias.patch create mode 100644 kernel/tools/perf/files/patches/mageia/net-wireless-rtw89-6.2-git.patch create mode 100644 kernel/tools/perf/files/patches/mageia/staging-add-r8188eu.patch create mode 100644 kernel/tools/perf/files/patches/mageia/staging-rtl8812au-20231117.patch create mode 100644 kernel/tools/perf/files/patches/mageia/staging-rtl8812au-Kconfig-Makefile.patch create mode 100644 kernel/tools/perf/files/patches/mageia/staging-rtl8812au-rename.patch rename kernel/tools/perf/files/patches/mageia/{3rd-rtl8812au.patch => staging-rtl8812au.patch} (95%) create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-brcmfmac-fix-regression-for-Broadcom-PCIe-wifi-devices.patch create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-iwlwifi-fw-skip-ppag-for-jf.patch create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-iwlwifi-pcie-add-support-for-AX101NGW.patch create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-mac80211-fix-initialization-of-rx-link-and-rx-link_sta.patch create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-rtw88-Add-support-for-the-SDIO-based-RTL8723DS-.patch create mode 100644 kernel/tools/perf/files/patches/mageia/wifi-rtw88-rtw8723d-Implement-RTL8723DS-SDIO-efuse-p.patch create mode 100644 kernel/tools/perf/files/patches/mageia/x86-default_poweroff_up_machines.patch create mode 100644 kernel/tools/perf/files/patches/mageia/x86-pci-toshiba-equium-a60-assign-busses.patch create mode 100644 kernel/tools/perf/files/patches/mageia/zstd-Move-zstd-common-module-exports-to-zstd_common_.patch create mode 100644 kernel/tools/perf/files/patches/mageia/zstd-import-usptream-v1.5.2.patch diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5-base.patch b/kernel/tools/perf/files/patches/aufs6/aufs6-base.patch similarity index 59% rename from kernel/tools/perf/files/patches/aufs5/aufs5-base.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6-base.patch index b37e855f41..24983178a6 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5-base.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6-base.patch @@ -1,13 +1,13 @@ SPDX-License-Identifier: GPL-2.0 -aufs5.15.41 base patch +aufs6.12 base patch diff --git a/MAINTAINERS b/MAINTAINERS -index c8103e57a70b..e1b9eaca78fd 100644 +index b878ddc99f94e..8489754030b99 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3122,6 +3122,19 @@ F: include/uapi/linux/audit.h - F: kernel/audit* +@@ -3666,6 +3666,19 @@ F: kernel/audit* F: lib/*audit.c + K: \baudit_[a-z_0-9]\+\b +AUFS (advanced multi layered unification filesystem) FILESYSTEM +M: "J. R. Okajima" @@ -22,21 +22,23 @@ index c8103e57a70b..e1b9eaca78fd 100644 +F: fs/aufs/ +F: include/uapi/linux/aufs_type.h + - AUXILIARY DISPLAY DRIVERS - M: Miguel Ojeda - S: Maintained + AUXILIARY BUS DRIVER + M: Greg Kroah-Hartman + R: Dave Ertman diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 8cba10aafadb..7a9e40b97831 100644 +index 78a7bb28defe4..479480f25a6c0 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c -@@ -799,6 +799,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, - return error; +@@ -661,6 +661,26 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + goto done; } +/* + * for AUFS + * no get/put for file. + */ ++/* Just to make the compiler silence, declare it */ ++struct file *loop_backing_file(struct super_block *sb); +struct file *loop_backing_file(struct super_block *sb) +{ + struct file *ret; @@ -55,10 +57,20 @@ index 8cba10aafadb..7a9e40b97831 100644 static ssize_t loop_attr_show(struct device *dev, char *page, diff --git a/fs/dcache.c b/fs/dcache.c -index cf871a81f4fd..bc5095b734f5 100644 +index 0f6b16ba30d08..1ab11cad60e8c 100644 --- a/fs/dcache.c +++ b/fs/dcache.c -@@ -1320,7 +1320,7 @@ enum d_walk_ret { +@@ -1223,6 +1223,9 @@ enum d_walk_ret { + D_WALK_SKIP, + }; + ++/* AUFS calls d_walk(). Just to make the compiler silence, declare it */ ++void d_walk(struct dentry *parent, void *data, ++ enum d_walk_ret (*enter)(void *, struct dentry *)); + /** + * d_walk - walk the dentry tree + * @parent: start of walk +@@ -1231,7 +1234,7 @@ enum d_walk_ret { * * The @enter() callbacks are called with d_lock held. */ @@ -66,21 +78,21 @@ index cf871a81f4fd..bc5095b734f5 100644 +void d_walk(struct dentry *parent, void *data, enum d_walk_ret (*enter)(void *, struct dentry *)) { - struct dentry *this_parent; + struct dentry *this_parent, *dentry; diff --git a/fs/fcntl.c b/fs/fcntl.c -index 9c6c6a3e2de5..02382fa9bd34 100644 +index 22dd9dcce7ecc..460791727fd9c 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c -@@ -33,7 +33,7 @@ +@@ -37,7 +37,7 @@ #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) --static int setfl(int fd, struct file * filp, unsigned long arg) -+int setfl(int fd, struct file *filp, unsigned long arg) +-static int setfl(int fd, struct file * filp, unsigned int arg) ++int setfl(int fd, struct file * filp, unsigned int arg) { struct inode * inode = file_inode(filp); int error = 0; -@@ -64,6 +64,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg) +@@ -67,6 +67,8 @@ static int setfl(int fd, struct file * filp, unsigned int arg) if (filp->f_op->check_flags) error = filp->f_op->check_flags(arg); @@ -90,10 +102,10 @@ index 9c6c6a3e2de5..02382fa9bd34 100644 return error; diff --git a/fs/namespace.c b/fs/namespace.c -index b696543adab8..c45740054bc7 100644 +index d26f5e6d2ca35..85739e2d64c00 100644 --- a/fs/namespace.c +++ b/fs/namespace.c -@@ -808,6 +808,12 @@ static inline int check_mnt(struct mount *mnt) +@@ -966,6 +966,12 @@ static inline int check_mnt(struct mount *mnt) return mnt->mnt_ns == current->nsproxy->mnt_ns; } @@ -107,74 +119,43 @@ index b696543adab8..c45740054bc7 100644 * vfsmount lock must be held for write */ diff --git a/fs/splice.c b/fs/splice.c -index 5dbce4dcc1a7..3e6ba363b777 100644 +index 06232d7e505f6..b15fd6073b6d3 100644 --- a/fs/splice.c +++ b/fs/splice.c -@@ -759,8 +759,8 @@ static int warn_unsupported(struct file *file, const char *op) +@@ -933,7 +933,7 @@ static int warn_unsupported(struct file *file, const char *op) /* * Attempt to initiate a splice from pipe to file. */ --static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -- loff_t *ppos, size_t len, unsigned int flags) -+long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) +-static ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out, + loff_t *ppos, size_t len, unsigned int flags) { if (unlikely(!out->f_op->splice_write)) - return warn_unsupported(out, "write"); -@@ -770,9 +770,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, - /* - * Attempt to initiate a splice from a file to a pipe. - */ --static long do_splice_to(struct file *in, loff_t *ppos, -- struct pipe_inode_info *pipe, size_t len, -- unsigned int flags) -+long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) - { - unsigned int p_space; - int ret; diff --git a/include/linux/fs.h b/include/linux/fs.h -index 56eba723477e..e60d8ad85400 100644 +index 3559446279c15..51b64b2ad82c4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h -@@ -1381,6 +1381,7 @@ extern void fasync_free(struct fasync_struct *); +@@ -1160,6 +1160,7 @@ extern void fasync_free(struct fasync_struct *); /* can be called from interrupts */ extern void kill_fasync(struct fasync_struct **, int, int); -+extern int setfl(int fd, struct file *filp, unsigned long arg); ++extern int setfl(int fd, struct file *filp, unsigned int arg); 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 int f_setown(struct file *filp, int who, int force); extern void f_delown(struct file *filp); -@@ -2092,6 +2093,7 @@ struct file_operations { - ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); +@@ -2082,6 +2083,7 @@ struct file_operations { + int (*lock) (struct file *, int, struct file_lock *); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int); + int (*setfl)(struct file *, unsigned long); 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); -@@ -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); -+extern int update_time(struct inode *, struct timespec64 *, int); - - /* /sys/fs */ - extern struct kobject *fs_kobj; -@@ -2778,6 +2781,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb) - } - - void emergency_thaw_all(void); -+extern int __sync_filesystem(struct super_block *, int); - extern int sync_filesystem(struct super_block *); - 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 9fe165beb0f9..e47f7e15eeaf 100644 +index 217f7abf2cbfa..0e17b8c23f105 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, +@@ -210,6 +210,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock, return lock->key == key; } @@ -184,10 +165,10 @@ index 9fe165beb0f9..e47f7e15eeaf 100644 * Acquire a lock. * diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h -index 8f882f5881e8..6b9808f09843 100644 +index 70b366b648160..08cfdabb2721f 100644 --- a/include/linux/mnt_namespace.h +++ b/include/linux/mnt_namespace.h -@@ -7,12 +7,15 @@ struct mnt_namespace; +@@ -10,6 +10,7 @@ struct mnt_namespace; struct fs_struct; struct user_namespace; struct ns_common; @@ -195,7 +176,8 @@ index 8f882f5881e8..6b9808f09843 100644 extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, struct user_namespace *, struct fs_struct *); - extern void put_mnt_ns(struct mnt_namespace *ns); +@@ -17,6 +18,8 @@ extern void put_mnt_ns(struct mnt_namespace *ns); + DEFINE_FREE(put_mnt_ns, struct mnt_namespace *, if (!IS_ERR_OR_NULL(_T)) put_mnt_ns(_T)) extern struct ns_common *from_mnt_ns(struct mnt_namespace *); +extern int is_current_mnt_ns(struct vfsmount *mnt); @@ -204,25 +186,22 @@ index 8f882f5881e8..6b9808f09843 100644 extern const struct file_operations proc_mountinfo_operations; extern const struct file_operations proc_mountstats_operations; diff --git a/include/linux/splice.h b/include/linux/splice.h -index a55179fd60fc..8e21c53cf883 100644 +index 9dec4861d09f6..14583d8468640 100644 --- a/include/linux/splice.h +++ b/include/linux/splice.h -@@ -93,4 +93,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *); +@@ -108,4 +108,7 @@ extern void splice_shrink_spd(struct splice_pipe_desc *); extern const struct pipe_buf_operations page_cache_pipe_buf_ops; extern const struct pipe_buf_operations default_pipe_buf_ops; + -+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+extern long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); ++extern ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); #endif diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c -index a30702b847ba..ce380d0abdf0 100644 +index 536bd471557f5..34b378cf7a95f 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c -@@ -187,7 +187,7 @@ unsigned long max_lock_class_idx; +@@ -218,7 +218,7 @@ unsigned long max_lock_class_idx; struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS); @@ -231,7 +210,7 @@ index a30702b847ba..ce380d0abdf0 100644 { unsigned int class_idx = hlock->class_idx; -@@ -208,6 +208,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock) +@@ -239,6 +239,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock) */ return lock_classes + class_idx; } diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5-kbuild.patch b/kernel/tools/perf/files/patches/aufs6/aufs6-kbuild.patch similarity index 63% rename from kernel/tools/perf/files/patches/aufs5/aufs5-kbuild.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6-kbuild.patch index aa8869f06c..70c96059b0 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5-kbuild.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6-kbuild.patch @@ -1,11 +1,11 @@ SPDX-License-Identifier: GPL-2.0 -aufs5.15.41 kbuild patch +aufs6.12 kbuild patch diff --git a/fs/Kconfig b/fs/Kconfig -index a6313a969bc5..aca4b89d41a1 100644 +index aae170fc27952..d5bb584649f50 100644 --- a/fs/Kconfig +++ b/fs/Kconfig -@@ -312,6 +312,7 @@ source "fs/sysv/Kconfig" +@@ -341,6 +341,7 @@ source "fs/sysv/Kconfig" source "fs/ufs/Kconfig" source "fs/erofs/Kconfig" source "fs/vboxsf/Kconfig" @@ -14,11 +14,11 @@ index a6313a969bc5..aca4b89d41a1 100644 endif # MISC_FILESYSTEMS diff --git a/fs/Makefile b/fs/Makefile -index 84c5e4cdfee5..b4fcdad8412e 100644 +index 61679fd587b7e..b2539712b80d0 100644 --- a/fs/Makefile +++ b/fs/Makefile -@@ -138,3 +138,4 @@ obj-$(CONFIG_EFIVAR_FS) += efivarfs/ - obj-$(CONFIG_EROFS_FS) += erofs/ +@@ -130,3 +130,4 @@ obj-$(CONFIG_EROFS_FS) += erofs/ obj-$(CONFIG_VBOXSF_FS) += vboxsf/ obj-$(CONFIG_ZONEFS_FS) += zonefs/ + obj-$(CONFIG_BPF_LSM) += bpf_fs_kfuncs.o +obj-$(CONFIG_AUFS_FS) += aufs/ diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5-loopback.patch b/kernel/tools/perf/files/patches/aufs6/aufs6-loopback.patch similarity index 73% rename from kernel/tools/perf/files/patches/aufs5/aufs5-loopback.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6-loopback.patch index 753437f378..82c527f131 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5-loopback.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6-loopback.patch @@ -1,11 +1,20 @@ SPDX-License-Identifier: GPL-2.0 -aufs5.15.41 loopback patch +aufs6.12 loopback patch diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 7a9e40b97831..5ed06240cc9c 100644 +index 479480f25a6c0..ba3477c30e294 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c -@@ -673,6 +673,15 @@ static inline void loop_update_dio(struct loop_device *lo) +@@ -54,7 +54,7 @@ struct loop_device { + int lo_flags; + char lo_file_name[LO_NAME_SIZE]; + +- struct file * lo_backing_file; ++ struct file *lo_backing_file, *lo_backing_virt_file; + struct block_device *lo_device; + + gfp_t old_gfp_mask; +@@ -526,6 +526,15 @@ static inline void loop_update_dio(struct loop_device *lo) lo->use_dio); } @@ -21,7 +30,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 static void loop_reread_partitions(struct loop_device *lo) { int rc; -@@ -730,6 +739,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -583,6 +592,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, { struct file *file = fget(arg); struct file *old_file; @@ -29,7 +38,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 int error; bool partscan; bool is_loop; -@@ -749,11 +759,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -606,11 +616,19 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, if (!(lo->lo_flags & LO_FLAGS_READ_ONLY)) goto out_err; @@ -49,7 +58,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 error = -EINVAL; -@@ -766,6 +784,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -623,6 +641,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, blk_mq_freeze_queue(lo->lo_queue); mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask); lo->lo_backing_file = file; @@ -57,7 +66,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 lo->old_gfp_mask = mapping_gfp_mask(file->f_mapping); mapping_set_gfp_mask(file->f_mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); -@@ -788,6 +807,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, +@@ -645,6 +664,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, * dependency. */ fput(old_file); @@ -65,25 +74,25 @@ index 7a9e40b97831..5ed06240cc9c 100644 + fput(old_virt_file); if (partscan) loop_reread_partitions(lo); - return 0; -@@ -796,6 +817,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + +@@ -658,6 +679,8 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, loop_global_unlock(lo, is_loop); out_putf: fput(file); + if (virt_file) + fput(virt_file); - return error; + goto done; } -@@ -1201,6 +1224,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, +@@ -1039,6 +1062,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, const struct loop_config *config) { struct file *file = fget(config->fd); + struct file *f, *virt_file = NULL; - struct inode *inode; struct address_space *mapping; int error; -@@ -1216,6 +1240,13 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, + loff_t size; +@@ -1052,6 +1076,13 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, /* This is safe, since we have a reference from open(). */ __module_get(THIS_MODULE); @@ -97,7 +106,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 /* * If we don't hold exclusive handle for the device, upgrade to it * here to avoid changing device under exclusive owner. -@@ -1281,6 +1312,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, +@@ -1108,6 +1139,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO; lo->lo_device = bdev; lo->lo_backing_file = file; @@ -105,7 +114,7 @@ index 7a9e40b97831..5ed06240cc9c 100644 lo->old_gfp_mask = mapping_gfp_mask(mapping); mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); -@@ -1331,6 +1363,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, +@@ -1150,6 +1182,8 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, bd_abort_claiming(bdev, loop_configure); out_putf: fput(file); @@ -114,49 +123,34 @@ index 7a9e40b97831..5ed06240cc9c 100644 /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); return error; -@@ -1339,6 +1373,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, - static int __loop_clr_fd(struct loop_device *lo, bool release) +@@ -1159,11 +1193,13 @@ static void __loop_clr_fd(struct loop_device *lo) { - struct file *filp = NULL; + struct queue_limits lim; + struct file *filp; + struct file *virt_filp = lo->lo_backing_virt_file; gfp_t gfp = lo->old_gfp_mask; - struct block_device *bdev = lo->lo_device; - int err = 0; -@@ -1390,6 +1425,7 @@ static int __loop_clr_fd(struct loop_device *lo, bool release) spin_lock_irq(&lo->lo_lock); + filp = lo->lo_backing_file; lo->lo_backing_file = NULL; + lo->lo_backing_virt_file = NULL; spin_unlock_irq(&lo->lo_lock); - loop_release_xfer(lo); -@@ -1470,6 +1506,8 @@ static int __loop_clr_fd(struct loop_device *lo, bool release) + lo->lo_device = NULL; +@@ -1225,6 +1261,8 @@ static void __loop_clr_fd(struct loop_device *lo) + * fput can take open_mutex which is usually taken before lo_mutex. */ - if (filp) - fput(filp); + fput(filp); + if (virt_filp) + fput(virt_filp); - return err; } -diff --git a/drivers/block/loop.h b/drivers/block/loop.h -index 04c88dd6eabd..0ff3ba22ee17 100644 ---- a/drivers/block/loop.h -+++ b/drivers/block/loop.h -@@ -46,7 +46,7 @@ struct loop_device { - int (*ioctl)(struct loop_device *, int cmd, - unsigned long arg); - -- struct file * lo_backing_file; -+ struct file *lo_backing_file, *lo_backing_virt_file; - struct block_device *lo_device; - void *key_data; - + static int loop_clr_fd(struct loop_device *lo) diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c -index 99ceca144044..e49dfe855032 100644 +index db7e9fcf1056a..6d202136d29af 100644 --- a/fs/aufs/f_op.c +++ b/fs/aufs/f_op.c -@@ -304,7 +304,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) +@@ -317,7 +317,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) if (IS_ERR(h_file)) goto out; @@ -166,7 +160,7 @@ index 99ceca144044..e49dfe855032 100644 if (file->f_mapping != h_file->f_mapping) { file->f_mapping = h_file->f_mapping; diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c -index 74347bd75b38..5ef888a1d53f 100644 +index 69dea4cda00c0..92a74affb2208 100644 --- a/fs/aufs/loop.c +++ b/fs/aufs/loop.c @@ -133,3 +133,19 @@ void au_loopback_fin(void) @@ -190,7 +184,7 @@ index 74347bd75b38..5ef888a1d53f 100644 + return f; +} diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h -index 7293bee427f9..3345c098d0d4 100644 +index 519efba31c700..ac701381da792 100644 --- a/fs/aufs/loop.h +++ b/fs/aufs/loop.h @@ -26,6 +26,8 @@ void au_warn_loopback(struct super_block *h_sb); @@ -212,7 +206,7 @@ index 7293bee427f9..3345c098d0d4 100644 #endif /* __KERNEL__ */ diff --git a/fs/aufs/super.c b/fs/aufs/super.c -index 90043afec51c..0835f6da42d9 100644 +index 9c30cba527421..8161108d0f6d5 100644 --- a/fs/aufs/super.c +++ b/fs/aufs/super.c @@ -758,7 +758,10 @@ const struct super_operations aufs_sop = { @@ -228,13 +222,14 @@ index 90043afec51c..0835f6da42d9 100644 /* ---------------------------------------------------------------------- */ diff --git a/include/linux/fs.h b/include/linux/fs.h -index e60d8ad85400..2ac5317f9b79 100644 +index 51b64b2ad82c4..8c3ff295b020b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h -@@ -2226,6 +2226,10 @@ struct super_operations { - struct shrink_control *); +@@ -2248,6 +2248,11 @@ struct super_operations { long (*free_cached_objects)(struct super_block *, struct shrink_control *); + void (*shutdown)(struct super_block *sb); ++ +#if IS_ENABLED(CONFIG_BLK_DEV_LOOP) || IS_ENABLED(CONFIG_BLK_DEV_LOOP_MODULE) + /* and aufs */ + struct file *(*real_loop)(struct file *); diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5-mmap.patch b/kernel/tools/perf/files/patches/aufs6/aufs6-mmap.patch similarity index 64% rename from kernel/tools/perf/files/patches/aufs5/aufs5-mmap.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6-mmap.patch index 05ee1b401b..879079c95c 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5-mmap.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6-mmap.patch @@ -1,24 +1,24 @@ SPDX-License-Identifier: GPL-2.0 -aufs5.15.41 mmap patch +aufs6.12 mmap patch diff --git a/fs/proc/base.c b/fs/proc/base.c -index 1f394095eb88..93f2479ef319 100644 +index b31283d81c52e..644bd3d84cf76 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c -@@ -2189,7 +2189,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) +@@ -2270,7 +2270,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) { -- *path = vma->vm_file->f_path; +- *path = *file_user_path(vma->vm_file); + *path = vma_pr_or_file(vma)->f_path; path_get(path); rc = 0; } diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c -index 13452b32e2bd..38acccfef9d4 100644 +index c6e7ebc637562..d7ccfd9097646 100644 --- a/fs/proc/nommu.c +++ b/fs/proc/nommu.c -@@ -40,7 +40,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) +@@ -39,7 +39,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) file = region->vm_file; if (file) { @@ -31,35 +31,43 @@ index 13452b32e2bd..38acccfef9d4 100644 ino = inode->i_ino; } diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c -index 79ca4d69dfd6..3d3067c8d868 100644 +index 7eb010de39fe2..0c576103f7f15 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) - const char *name = NULL; +@@ -264,7 +264,8 @@ static void get_vma_name(struct vm_area_struct *vma, + *name_fmt = "[anon_shmem:%s]"; + *name = anon_name->name; + } else { +- *path = file_user_path(vma->vm_file); ++ struct file *f = vma_pr_or_file(vma); ++ *path = file_user_path(f); + } + return; + } +@@ -333,7 +334,8 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma) + dev_t dev = 0; + + if (vma->vm_file) { +- const struct inode *inode = file_user_inode(vma->vm_file); ++ const struct inode *inode ++ = file_inode(vma_pr_or_file(vma)); - if (file) { -- struct inode *inode = file_inode(vma->vm_file); -+ struct inode *inode; -+ -+ file = vma_pr_or_file(vma); -+ inode = file_inode(file); dev = inode->i_sb->s_dev; ino = inode->i_ino; - pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; -@@ -1888,7 +1891,7 @@ static int show_numa_map(struct seq_file *m, void *v) +@@ -3008,7 +3010,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; - struct file *file = vma->vm_file; + struct file *file = vma_pr_or_file(vma); struct mm_struct *mm = vma->vm_mm; - struct mempolicy *pol; char buffer[64]; + struct mempolicy *pol; diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c -index a6d21fc0033c..02c2de31196e 100644 +index bce6745330003..b12b5a75c799c 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c -@@ -155,7 +155,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) +@@ -137,7 +137,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) file = vma->vm_file; if (file) { @@ -72,14 +80,14 @@ 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 04345ff97f8c..4ab9bb75c894 100644 +index 61fff5d34ed53..94b66987b4bb0 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h -@@ -1813,6 +1813,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, - unmap_mapping_range(mapping, holebegin, holelen, 0); - } +@@ -2469,6 +2469,43 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, + static inline struct vm_area_struct *vma_lookup(struct mm_struct *mm, + unsigned long addr); -+#if IS_ENABLED(CONFIG_AUFS_FS) ++#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */ +extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int); +extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[], + int); @@ -120,172 +128,148 @@ index 04345ff97f8c..4ab9bb75c894 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 7f8ee09c711f..8fea872e08f7 100644 +index 6e3bdf8e38bca..c70247dc71022 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h -@@ -294,6 +294,9 @@ struct vm_region { +@@ -572,6 +572,9 @@ 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 */ -+#if IS_ENABLED(CONFIG_AUFS_FS) ++#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */ + struct file *vm_prfile; /* the virtual backing file or NULL */ +#endif int vm_usage; /* region usage count (access under nommu_region_sem) */ bool vm_icache_flushed : 1; /* true if the icache has been flushed for -@@ -373,6 +376,9 @@ struct vm_area_struct { +@@ -747,6 +750,9 @@ 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). */ -+#if IS_ENABLED(CONFIG_AUFS_FS) ++#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */ + struct file *vm_prfile; /* shadow of vm_file */ +#endif void * vm_private_data; /* was vm_pte (shared mem) */ - #ifdef CONFIG_SWAP + #ifdef CONFIG_ANON_VMA_NAME diff --git a/kernel/fork.c b/kernel/fork.c -index 89475c994ca9..82f46f8f4090 100644 +index 22f43721d031d..03abd72b3353d 100644 --- a/kernel/fork.c +++ b/kernel/fork.c -@@ -573,7 +573,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, +@@ -730,7 +730,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); i_mmap_lock_write(mapping); - if (tmp->vm_flags & VM_SHARED) + if (vma_is_shared_maywrite(tmp)) mapping_allow_writable(mapping); diff --git a/mm/Makefile b/mm/Makefile -index fc60a40ce954..d45773672730 100644 +index d5639b0361663..bb57f616f0325 100644 --- a/mm/Makefile +++ b/mm/Makefile -@@ -130,3 +130,4 @@ obj-$(CONFIG_PAGE_REPORTING) += page_reporting.o - obj-$(CONFIG_IO_MAPPING) += io-mapping.o - obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o - obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o -+obj-$(CONFIG_AUFS_FS:m=y) += prfile.o +@@ -145,3 +145,4 @@ obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o + obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o + obj-$(CONFIG_EXECMEM) += execmem.o + obj-$(CONFIG_TMPFS_QUOTA) += shmem_quota.o ++obj-y += prfile.o diff --git a/mm/filemap.c b/mm/filemap.c -index 00e391e75880..d8b52d814319 100644 +index 56fa431c52af7..d55fe4e7bcfd1 100644 --- a/mm/filemap.c +++ b/mm/filemap.c -@@ -3353,7 +3353,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf) +@@ -3707,7 +3707,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); - file_update_time(vmf->vma->vm_file); + vma_file_update_time(vmf->vma); - lock_page(page); - if (page->mapping != mapping) { - unlock_page(page); + folio_lock(folio); + if (folio->mapping != mapping) { + folio_unlock(folio); diff --git a/mm/mmap.c b/mm/mmap.c -index 6bb553ed5c55..3f9d6d155171 100644 +index 79d541f1502b2..2dc64f6dc0181 100644 --- a/mm/mmap.c +++ b/mm/mmap.c -@@ -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) -- fput(vma->vm_file); -+ vma_fput(vma); - mpol_put(vma_policy(vma)); - vm_area_free(vma); - return next; -@@ -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); -- fput(file); -+ vma_fput(vma); - } - if (next->anon_vma) - anon_vma_merge(vma, next); -@@ -1873,7 +1873,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, - return addr; - - unmap_and_free_vma: -- fput(vma->vm_file); -+ vma_fput(vma); - vma->vm_file = NULL; - - /* Undo any partial mapping done by a device driver. */ -@@ -2723,7 +2723,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, - goto out_free_mpol; - - if (new->vm_file) -- get_file(new->vm_file); -+ vma_get_file(new); - - if (new->vm_ops && new->vm_ops->open) - new->vm_ops->open(new); -@@ -2742,7 +2742,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) -- fput(new->vm_file); -+ vma_fput(new); - unlink_anon_vmas(new); - out_free_mpol: - mpol_put(vma_policy(new)); -@@ -2938,6 +2938,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, - unsigned long populate = 0; +@@ -1484,7 +1484,7 @@ static unsigned long __mmap_region(struct file *file, unsigned long addr, + * and cause general protection fault + * ultimately. + */ +- fput(vma->vm_file); ++ vma_fput(vma); + vm_area_free(vma); + vma = merge; + /* Update vm_flags to pick up the change. */ +@@ -1654,6 +1654,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long ret = -EINVAL; struct file *file; -+#if IS_ENABLED(CONFIG_AUFS_FS) -+ struct file *prfile; -+#endif + vm_flags_t vm_flags; ++ struct file *prfile = NULL; /* aufs */ - pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n", + pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n", current->comm, current->pid); -@@ -2993,10 +2996,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, - if (vma->vm_flags & VM_LOCKED) - flags |= MAP_LOCKED; +@@ -1696,14 +1697,18 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, -+#if IS_ENABLED(CONFIG_AUFS_FS) + /* Save vm_flags used to calculate prot and flags, and recheck later. */ + vm_flags = vma->vm_flags; +- file = get_file(vma->vm_file); + vma_get_file(vma); + file = vma->vm_file; ++#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */ + prfile = vma->vm_prfile; -+ ret = do_mmap(vma->vm_file, start, size, -+ prot, flags, pgoff, &populate, NULL); ++#endif + + mmap_read_unlock(mm); + + /* Call outside mmap_lock to be consistent with other callers. */ + ret = security_mmap_file(file, prot, flags); + if (ret) { +- fput(file); ++ vma_fput(vma); + return ret; + } + +@@ -1711,7 +1716,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + + /* OK security check passed, take write lock + let it rip. */ + if (mmap_write_lock_killable(mm)) { +- fput(file); ++ vma_fput(vma); + return -EINTR; + } + +@@ -1753,9 +1758,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + + ret = do_mmap(vma->vm_file, start, size, + prot, flags, 0, pgoff, &populate, NULL); ++#if 1 /* IS_ENABLED(CONFIG_AUFS_FS) */ + if (!IS_ERR_VALUE(ret) && file && prfile) { + struct vm_area_struct *new_vma; + + new_vma = find_vma(mm, ret); + if (!new_vma->vm_prfile) + new_vma->vm_prfile = prfile; -+ if (new_vma != vma) ++ if (prfile) + get_file(prfile); + } ++#endif ++ + out: + mmap_write_unlock(mm); + /* + * two fput()s instead of vma_fput(vma), + * coz vma may not be available anymore. + */ -+ fput(file); + fput(file); + if (prfile) + fput(prfile); -+#else - file = get_file(vma->vm_file); - ret = do_mmap(vma->vm_file, start, size, - prot, flags, pgoff, &populate, NULL); - fput(file); -+#endif /* CONFIG_AUFS_FS */ - out: - mmap_write_unlock(mm); if (populate) -@@ -3277,7 +3304,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) -- get_file(new_vma->vm_file); -+ vma_get_file(new_vma); - if (new_vma->vm_ops && new_vma->vm_ops->open) - new_vma->vm_ops->open(new_vma); - vma_link(mm, new_vma, prev, rb_link, rb_parent); + mm_populate(ret, populate); + if (!IS_ERR_VALUE(ret)) diff --git a/mm/nommu.c b/mm/nommu.c -index 02d2427b8f9e..a7419302ab4e 100644 +index 9cb6e99215e2b..5add36afa9786 100644 --- a/mm/nommu.c +++ b/mm/nommu.c -@@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region) +@@ -512,7 +512,7 @@ static void __put_nommu_region(struct vm_region *region) up_write(&nommu_region_sem); if (region->vm_file) @@ -294,16 +278,16 @@ index 02d2427b8f9e..a7419302ab4e 100644 /* IO memory and memory shared directly out of the pagecache * from ramfs/tmpfs mustn't be released here */ -@@ -655,7 +655,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); +@@ -591,7 +591,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) + { + vma_close(vma); if (vma->vm_file) - fput(vma->vm_file); + vma_fput(vma); put_nommu_region(vma->vm_region); vm_area_free(vma); } -@@ -1175,7 +1175,7 @@ unsigned long do_mmap(struct file *file, +@@ -1123,7 +1123,7 @@ unsigned long do_mmap(struct file *file, goto error_just_free; } } @@ -312,9 +296,9 @@ index 02d2427b8f9e..a7419302ab4e 100644 kmem_cache_free(vm_region_jar, region); region = pregion; result = start; -@@ -1252,10 +1252,10 @@ unsigned long do_mmap(struct file *file, - up_write(&nommu_region_sem); +@@ -1209,10 +1209,10 @@ unsigned long do_mmap(struct file *file, error: + vma_iter_free(&vmi); if (region->vm_file) - fput(region->vm_file); + vmr_fput(region); @@ -327,7 +311,7 @@ index 02d2427b8f9e..a7419302ab4e 100644 diff --git a/mm/prfile.c b/mm/prfile.c new file mode 100644 -index 000000000000..511543ab1b41 +index 0000000000000..b034d160a18f4 --- /dev/null +++ b/mm/prfile.c @@ -0,0 +1,86 @@ @@ -339,7 +323,7 @@ index 000000000000..511543ab1b41 + * + * See Documentation/filesystems/aufs/design/06mmap.txt + * -+ * Copyright (c) 2014-2021 Junjro R. Okajima ++ * Copyright (c) 2014-2025 Junjro R. Okajima + * Copyright (c) 2014 Ian Campbell + */ + @@ -417,3 +401,52 @@ index 000000000000..511543ab1b41 + fput(pr); +} +#endif /* !CONFIG_MMU */ +diff --git a/mm/vma.c b/mm/vma.c +index 7621384d64cf5..3bb41fe6ac48e 100644 +--- a/mm/vma.c ++++ b/mm/vma.c +@@ -248,7 +248,7 @@ static void vma_complete(struct vma_prepare *vp, struct vma_iterator *vmi, + if (vp->file) { + uprobe_munmap(vp->remove, vp->remove->vm_start, + vp->remove->vm_end); +- fput(vp->file); ++ vma_fput(vp->vma); + } + if (vp->remove->anon_vma) + anon_vma_merge(vp->vma, vp->remove); +@@ -328,7 +328,7 @@ void remove_vma(struct vm_area_struct *vma, bool unreachable) + might_sleep(); + vma_close(vma); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + mpol_put(vma_policy(vma)); + if (unreachable) + __vm_area_free(vma); +@@ -405,7 +405,7 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, + goto out_free_mpol; + + if (new->vm_file) +- get_file(new->vm_file); ++ vma_get_file(new); + + if (new->vm_ops && new->vm_ops->open) + new->vm_ops->open(new); +@@ -1671,7 +1671,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) +- get_file(new_vma->vm_file); ++ vma_get_file(new_vma); + if (new_vma->vm_ops && new_vma->vm_ops->open) + new_vma->vm_ops->open(new_vma); + if (vma_link(mm, new_vma)) +@@ -1684,7 +1684,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + vma_close(new_vma); + + if (new_vma->vm_file) +- fput(new_vma->vm_file); ++ vma_fput(new_vma); + + unlink_anon_vmas(new_vma); + out_free_mempol: diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5-standalone.patch b/kernel/tools/perf/files/patches/aufs6/aufs6-standalone.patch similarity index 51% rename from kernel/tools/perf/files/patches/aufs5/aufs5-standalone.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6-standalone.patch index 54fcb65bd3..828406cc5b 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5-standalone.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6-standalone.patch @@ -1,11 +1,11 @@ SPDX-License-Identifier: GPL-2.0 -aufs5.15.41 standalone patch +aufs6.12 standalone patch diff --git a/fs/dcache.c b/fs/dcache.c -index bc5095b734f5..9508bd57a3bc 100644 +index 1ab11cad60e8c..3a01c42c6639e 100644 --- a/fs/dcache.c +++ b/fs/dcache.c -@@ -1425,6 +1425,7 @@ void d_walk(struct dentry *parent, void *data, +@@ -1333,6 +1333,7 @@ void d_walk(struct dentry *parent, void *data, seq = 1; goto again; } @@ -13,7 +13,7 @@ index bc5095b734f5..9508bd57a3bc 100644 struct check_mount { struct vfsmount *mnt; -@@ -2970,6 +2971,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2) +@@ -2899,6 +2900,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2) write_sequnlock(&rename_lock); } @@ -22,10 +22,10 @@ index bc5095b734f5..9508bd57a3bc 100644 /** * d_ancestor - search for an ancestor diff --git a/fs/exec.c b/fs/exec.c -index 29e865c59854..3ea36fa14622 100644 +index 6c53920795c2e..22e10087e34fa 100644 --- a/fs/exec.c +++ b/fs/exec.c -@@ -111,6 +111,7 @@ bool path_noexec(const struct path *path) +@@ -114,6 +114,7 @@ bool path_noexec(const struct path *path) return (path->mnt->mnt_flags & MNT_NOEXEC) || (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC); } @@ -34,22 +34,22 @@ index 29e865c59854..3ea36fa14622 100644 #ifdef CONFIG_USELIB /* diff --git a/fs/fcntl.c b/fs/fcntl.c -index 02382fa9bd34..3418c60b9014 100644 +index 460791727fd9c..75ab59a3df36f 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c -@@ -86,6 +86,7 @@ int setfl(int fd, struct file *filp, unsigned long arg) +@@ -90,6 +90,7 @@ int setfl(int fd, struct file * filp, unsigned int arg) out: return error; } +EXPORT_SYMBOL_GPL(setfl); - static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, - int force) + /* + * Allocate an file->f_owner struct if it doesn't exist, handling racing diff --git a/fs/file_table.c b/fs/file_table.c -index e8c9016703ad..5e7a880830fb 100644 +index eed5ffad9997c..2f6bead424786 100644 --- a/fs/file_table.c +++ b/fs/file_table.c -@@ -161,6 +161,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) +@@ -228,6 +228,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) } return ERR_PTR(-ENFILE); } @@ -58,18 +58,10 @@ index e8c9016703ad..5e7a880830fb 100644 /* * Variant of alloc_empty_file() that doesn't check and modify nr_files. diff --git a/fs/namespace.c b/fs/namespace.c -index c45740054bc7..d3d750635610 100644 +index 85739e2d64c00..8aa96de6c151e 100644 --- a/fs/namespace.c +++ b/fs/namespace.c -@@ -439,6 +439,7 @@ void __mnt_drop_write(struct vfsmount *mnt) - mnt_dec_writers(real_mount(mnt)); - preempt_enable(); - } -+EXPORT_SYMBOL_GPL(__mnt_drop_write); - - /** - * mnt_drop_write - give up write access to a mount -@@ -813,6 +814,7 @@ int is_current_mnt_ns(struct vfsmount *mnt) +@@ -971,6 +971,7 @@ int is_current_mnt_ns(struct vfsmount *mnt) { return check_mnt(real_mount(mnt)); } @@ -77,7 +69,23 @@ index c45740054bc7..d3d750635610 100644 /* * vfsmount lock must be held for write -@@ -2011,6 +2013,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, +@@ -2200,6 +2201,7 @@ struct vfsmount *collect_mounts(const struct path *path) + return ERR_CAST(tree); + return &tree->mnt; + } ++EXPORT_SYMBOL_GPL(collect_mounts); + + static void free_mnt_ns(struct mnt_namespace *); + static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *, bool); +@@ -2230,6 +2232,7 @@ void drop_collected_mounts(struct vfsmount *mnt) + unlock_mount_hash(); + namespace_unlock(); + } ++EXPORT_SYMBOL_GPL(drop_collected_mounts); + + bool has_locked_children(struct mount *mnt, struct dentry *dentry) + { +@@ -2301,6 +2304,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, } return 0; } @@ -86,7 +94,7 @@ index c45740054bc7..d3d750635610 100644 static void lock_mnt_tree(struct mount *mnt) { diff --git a/fs/notify/group.c b/fs/notify/group.c -index fb89c351295d..460ad19c2570 100644 +index 18446b7b0d495..09138e0b8a6a5 100644 --- a/fs/notify/group.c +++ b/fs/notify/group.c @@ -100,6 +100,7 @@ void fsnotify_get_group(struct fsnotify_group *group) @@ -98,10 +106,10 @@ 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 e0df1536eb69..81b2d7c83add 100644 +index 5da4df2f9b18a..6024098fc6444 100644 --- a/fs/open.c +++ b/fs/open.c -@@ -65,6 +65,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry, +@@ -66,6 +66,7 @@ int do_truncate(struct mnt_idmap *idmap, struct dentry *dentry, inode_unlock(dentry->d_inode); return ret; } @@ -110,10 +118,10 @@ index e0df1536eb69..81b2d7c83add 100644 long vfs_truncate(const struct path *path, loff_t length) { diff --git a/fs/read_write.c b/fs/read_write.c -index af057c57bdc6..76017f8331fb 100644 +index 64dc24afdb3a7..ec1fd6aab1759 100644 --- a/fs/read_write.c +++ b/fs/read_write.c -@@ -492,6 +492,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) +@@ -576,6 +576,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) inc_syscr(current); return ret; } @@ -121,7 +129,7 @@ index af057c57bdc6..76017f8331fb 100644 static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) { -@@ -602,6 +603,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ +@@ -691,6 +692,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ file_end_write(file); return ret; } @@ -130,30 +138,22 @@ index af057c57bdc6..76017f8331fb 100644 /* file_ppos returns &file->f_pos or NULL if file is stream */ static inline loff_t *file_ppos(struct file *file) diff --git a/fs/splice.c b/fs/splice.c -index 3e6ba363b777..7c1be373eb7c 100644 +index b15fd6073b6d3..0fdb86c3813e2 100644 --- a/fs/splice.c +++ b/fs/splice.c -@@ -766,6 +766,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out, +@@ -940,6 +940,7 @@ ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out, return warn_unsupported(out, "write"); return out->f_op->splice_write(pipe, out, ppos, len, flags); } +EXPORT_SYMBOL_GPL(do_splice_from); /* - * Attempt to initiate a splice from a file to a pipe. -@@ -795,6 +796,7 @@ long do_splice_to(struct file *in, loff_t *ppos, - return warn_unsupported(in, "read"); - return in->f_op->splice_read(in, ppos, pipe, len, flags); - } -+EXPORT_SYMBOL_GPL(do_splice_to); - - /** - * splice_direct_to_actor - splices data directly between two non-pipes + * Indicate to the caller that there was a premature EOF when reading from the diff --git a/fs/xattr.c b/fs/xattr.c -index 5c8c5175b385..ff7e9ff774b7 100644 +index 05ec7e7d9e87e..e07ffa052dfb4 100644 --- a/fs/xattr.c +++ b/fs/xattr.c -@@ -384,6 +384,7 @@ vfs_getxattr_alloc(struct user_namespace *mnt_userns, struct dentry *dentry, +@@ -405,6 +405,7 @@ vfs_getxattr_alloc(struct mnt_idmap *idmap, struct dentry *dentry, *xattr_value = value; return error; } @@ -162,10 +162,10 @@ 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 ce380d0abdf0..409c7d1a6803 100644 +index 34b378cf7a95f..df6a751298b32 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c -@@ -208,6 +208,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) +@@ -239,6 +239,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) */ return lock_classes + class_idx; } @@ -174,79 +174,79 @@ index ce380d0abdf0..409c7d1a6803 100644 #ifdef CONFIG_LOCK_STAT diff --git a/kernel/task_work.c b/kernel/task_work.c -index 1698fbe6f0e1..081b05acadf8 100644 +index c969f1f26be58..68eb672f425d9 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c -@@ -167,3 +167,4 @@ void task_work_run(void) +@@ -242,3 +242,4 @@ void task_work_run(void) } while (work); } } +EXPORT_SYMBOL_GPL(task_work_run); diff --git a/security/security.c b/security/security.c -index da631339e969..894203de3bcb 100644 +index c5981e558bc26..045dd716e3400 100644 --- a/security/security.c +++ b/security/security.c -@@ -1160,6 +1160,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) +@@ -1944,6 +1944,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) return 0; - return call_int_hook(path_rmdir, 0, dir, dentry); + return call_int_hook(path_rmdir, dir, dentry); } +EXPORT_SYMBOL_GPL(security_path_rmdir); - int security_path_unlink(const struct path *dir, struct dentry *dentry) - { -@@ -1176,6 +1177,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, + /** + * security_path_unlink() - Check if removing a hard link is allowed +@@ -1979,6 +1980,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, return 0; - return call_int_hook(path_symlink, 0, dir, dentry, old_name); + return call_int_hook(path_symlink, dir, dentry, old_name); } +EXPORT_SYMBOL_GPL(security_path_symlink); - int security_path_link(struct dentry *old_dentry, const struct path *new_dir, - struct dentry *new_dentry) -@@ -1184,6 +1186,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, + /** + * security_path_link - Check if creating a hard link is allowed +@@ -1997,6 +1999,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, return 0; - return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry); + return call_int_hook(path_link, old_dentry, new_dir, new_dentry); } +EXPORT_SYMBOL_GPL(security_path_link); - int security_path_rename(const struct path *old_dir, struct dentry *old_dentry, - const struct path *new_dir, struct dentry *new_dentry, -@@ -1211,6 +1214,7 @@ int security_path_truncate(const struct path *path) + /** + * security_path_rename() - Check if renaming a file is allowed +@@ -2058,6 +2061,7 @@ int security_path_chmod(const struct path *path, umode_t mode) return 0; - return call_int_hook(path_truncate, 0, path); - } -+EXPORT_SYMBOL_GPL(security_path_truncate); - - int security_path_chmod(const struct path *path, umode_t mode) - { -@@ -1218,6 +1222,7 @@ int security_path_chmod(const struct path *path, umode_t mode) - return 0; - return call_int_hook(path_chmod, 0, path, mode); + return call_int_hook(path_chmod, path, mode); } +EXPORT_SYMBOL_GPL(security_path_chmod); - int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) - { -@@ -1225,6 +1230,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) + /** + * security_path_chown() - Check if changing the file's owner/group is allowed +@@ -2075,6 +2079,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) return 0; - return call_int_hook(path_chown, 0, path, uid, gid); + return call_int_hook(path_chown, path, uid, gid); } +EXPORT_SYMBOL_GPL(security_path_chown); - int security_path_chroot(const struct path *path) - { -@@ -1325,6 +1331,7 @@ int security_inode_permission(struct inode *inode, int mask) + /** + * security_path_chroot() - Check if changing the root directory is allowed +@@ -2319,6 +2324,7 @@ int security_inode_permission(struct inode *inode, int mask) return 0; - return call_int_hook(inode_permission, 0, inode, mask); + return call_int_hook(inode_permission, inode, mask); } +EXPORT_SYMBOL_GPL(security_inode_permission); - int security_inode_setattr(struct dentry *dentry, struct iattr *attr) + /** + * security_inode_setattr() - Check if setting file attributes is allowed +@@ -2840,6 +2846,7 @@ int security_file_permission(struct file *file, int mask) { -@@ -1522,6 +1529,7 @@ int security_file_permission(struct file *file, int mask) - - return fsnotify_perm(file, mask); + return call_int_hook(file_permission, file, mask); } +EXPORT_SYMBOL_GPL(security_file_permission); - int security_file_alloc(struct file *file) + /** + * security_file_alloc() - Allocate and init a file's LSM blob +@@ -3144,6 +3151,7 @@ int security_file_truncate(struct file *file) { + return call_int_hook(file_truncate, file); + } ++EXPORT_SYMBOL_GPL(security_file_truncate); + + /** + * security_task_alloc() - Allocate a task's LSM blob diff --git a/kernel/tools/perf/files/patches/aufs5/aufs5.15.41-20220620.patch b/kernel/tools/perf/files/patches/aufs6/aufs6.12-20250414.patch similarity index 94% rename from kernel/tools/perf/files/patches/aufs5/aufs5.15.41-20220620.patch rename to kernel/tools/perf/files/patches/aufs6/aufs6.12-20250414.patch index ab0613211c..d0af9e9652 100644 --- a/kernel/tools/perf/files/patches/aufs5/aufs5.15.41-20220620.patch +++ b/kernel/tools/perf/files/patches/aufs6/aufs6.12-20250414.patch @@ -1,6 +1,6 @@ -diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-5.15.41/Documentation/ABI/testing/debugfs-aufs +diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-6.12.30/Documentation/ABI/testing/debugfs-aufs --- /dev/null -+++ linux-5.15.41/Documentation/ABI/testing/debugfs-aufs 2022-09-06 12:51:51.030710012 +0300 ++++ linux-6.12.30/Documentation/ABI/testing/debugfs-aufs 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,55 @@ +What: /debug/aufs/si_/ +Date: March 2009 @@ -57,9 +57,9 @@ diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-5.15.41/Documentati + be created. + When the aufs mount option 'noxino' is specified, it + will be empty. About XINO files, see the aufs manual. -diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-5.15.41/Documentation/ABI/testing/sysfs-aufs +diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-6.12.30/Documentation/ABI/testing/sysfs-aufs --- /dev/null -+++ linux-5.15.41/Documentation/ABI/testing/sysfs-aufs 2022-09-06 12:51:51.030710012 +0300 ++++ linux-6.12.30/Documentation/ABI/testing/sysfs-aufs 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,31 @@ +What: /sys/fs/aufs/si_/ +Date: March 2009 @@ -92,23 +92,23 @@ diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-5.15.41/Documentation + even if it is the default path. + When the aufs mount option 'noxino' is specified, it + will be empty. About XINO files, see the aufs manual. -diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-5.15.41/Documentation/filesystems/aufs/design/01intro.txt +diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-6.12.30/Documentation/filesystems/aufs/design/01intro.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/01intro.txt 2022-09-06 12:51:51.031709999 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/01intro.txt 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,171 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -267,23 +267,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-5.15.41/ +Some people may think it is better to pass such work to user space +helper, instead of doing in kernel space. Actually I am still thinking +about it. But currently I have implemented it in kernel space. -diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-5.15.41/Documentation/filesystems/aufs/design/02struct.txt +diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-6.12.30/Documentation/filesystems/aufs/design/02struct.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/02struct.txt 2022-09-06 12:51:51.031709999 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/02struct.txt 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,258 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -529,23 +529,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-5.15.41 +- etc. + +For this purpose, use "aumvdown" command in aufs-util.git. -diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5.15.41/Documentation/filesystems/aufs/design/03atomic_open.txt +diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-6.12.30/Documentation/filesystems/aufs/design/03atomic_open.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/03atomic_open.txt 2022-09-06 12:51:51.031709999 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/03atomic_open.txt 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,85 @@ + -+# Copyright (C) 2015-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2015-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -618,23 +618,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5. + ->atomic_open() are lost. in the ordinary case, the checks are + done by VFS:do_last(), lookup_open() and atomic_open(). some can + be implemented in aufs, but not all I am afraid. -diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-5.15.41/Documentation/filesystems/aufs/design/03lookup.txt +diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-6.12.30/Documentation/filesystems/aufs/design/03lookup.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/03lookup.txt 2022-09-06 12:51:51.031709999 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/03lookup.txt 2025-05-27 19:28:00.097257513 +0300 @@ -0,0 +1,113 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -735,23 +735,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-5.15.41 + test, and skip the revalidation in step 4. It is useful and improves + aufs performance when system surely hide the aufs branches from user, + by over-mounting something (or another method). -diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-5.15.41/Documentation/filesystems/aufs/design/04branch.txt +diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-6.12.30/Documentation/filesystems/aufs/design/04branch.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/04branch.txt 2022-09-06 12:51:51.031709999 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/04branch.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,74 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -813,23 +813,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-5.15.41 + - a file on the branch is mmap-ed. + - a regular file on the branch is opened for write and there is no + same named entry on the upper branch. -diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-5.15.41/Documentation/filesystems/aufs/design/05wbr_policy.txt +diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-6.12.30/Documentation/filesystems/aufs/design/05wbr_policy.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/05wbr_policy.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/05wbr_policy.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,64 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -881,12 +881,25 @@ diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-5.1 + where the source and the target exists and selects the higher + one. If the selected branch is readonly, then aufs follows the + copyup policy. -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.dot +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.dot --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.dot 2022-09-06 12:51:51.032709987 +0300 -@@ -0,0 +1,31 @@ ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.dot 2025-05-27 19:28:00.098257501 +0300 +@@ -0,0 +1,44 @@ + +// to view this graph, run dot(1) command in GRAPHVIZ. ++// ++// This program is free software; you can redistribute it and/or modify ++// it under the terms of the GNU General Public License as published by ++// the Free Software Foundation; either version 2 of the License, or ++// (at your option) any later version. ++// ++// This program is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++// ++// You should have received a copy of the GNU General Public License ++// along with this program. If not, see . + +digraph G { +node [shape=box]; @@ -916,12 +929,12 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-5.15.41 + +aufs_lookup -> whinfo [label="load/remove"]; +} -diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.txt +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06dirren.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06dirren.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,102 @@ + -+# Copyright (C) 2017-2021 Junjiro R. Okajima ++# Copyright (C) 2017-2025 Junjiro R. Okajima +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -1022,27 +1035,25 @@ diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.41 +contains two names, before- and after-rename, the name comparision in +UDBA handler may not work correctly. In this case, the behaviour will be +equivalen to udba=reval case. -diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-5.15.41/Documentation/filesystems/aufs/design/06fhsm.txt +diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-6.12.30/Documentation/filesystems/aufs/design/06fhsm.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06fhsm.txt 2022-09-06 12:51:51.032709987 +0300 -@@ -0,0 +1,120 @@ ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06fhsm.txt 2025-05-27 19:28:00.098257501 +0300 +@@ -0,0 +1,118 @@ + -+# Copyright (C) 2011-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2011-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ ++# along with this program. If not, see . + +File-based Hierarchical Storage Management (FHSM) +---------------------------------------------------------------------- @@ -1146,23 +1157,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-5.15.41/D + +And of course, in every step, an error may happen. So the operation +should restore the original file state after an error happens. -diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-5.15.41/Documentation/filesystems/aufs/design/06mmap.txt +diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-6.12.30/Documentation/filesystems/aufs/design/06mmap.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06mmap.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06mmap.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,72 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -1222,12 +1233,12 @@ diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-5.15.41/D + equivalent to vm_prfile described above. + +I have to give up this "looks-smater" approach. -diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.41/Documentation/filesystems/aufs/design/06xattr.txt +diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-6.12.30/Documentation/filesystems/aufs/design/06xattr.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/06xattr.txt 2022-09-06 12:51:51.032709987 +0300 -@@ -0,0 +1,96 @@ ++++ linux-6.12.30/Documentation/filesystems/aufs/design/06xattr.txt 2025-05-27 19:28:00.098257501 +0300 +@@ -0,0 +1,94 @@ + -+# Copyright (C) 2014-2021 Junjiro R. Okajima ++# Copyright (C) 2014-2025 Junjiro R. Okajima +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -1240,9 +1251,7 @@ diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.41/ +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ ++# along with this program. If not, see . + +Listing XATTR/EA and getting the value +---------------------------------------------------------------------- @@ -1322,23 +1331,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.41/ +Some contradiction may happen I am afraid. +Do we need another attribute to stop copying XATTR? I am unsure. For +now, aufs implements the branch attributes to ignore the error. -diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-5.15.41/Documentation/filesystems/aufs/design/07export.txt +diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-6.12.30/Documentation/filesystems/aufs/design/07export.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/07export.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/07export.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,58 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -1384,23 +1393,23 @@ diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-5.15.41 + convert it into ESTALE for NFSD. +- readdir(): call lockdep_on/off() because filldir in NFSD calls + lookup_one_len(), vfs_getattr(), encode_fh() and others. -diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-5.15.41/Documentation/filesystems/aufs/design/08shwh.txt +diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-6.12.30/Documentation/filesystems/aufs/design/08shwh.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/08shwh.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/08shwh.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,52 @@ + -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+# ++# Copyright (C) 2005-2025 Junjiro R. Okajima ++# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. -+# ++# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. -+# ++# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + @@ -1440,12 +1449,12 @@ diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-5.15.41/D + +This new squashfs archive can be stored on the boot device and the +initramfs will use it to replace the old one at the next boot. -diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-5.15.41/Documentation/filesystems/aufs/design/10dynop.txt +diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-6.12.30/Documentation/filesystems/aufs/design/10dynop.txt --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/design/10dynop.txt 2022-09-06 12:51:51.032709987 +0300 ++++ linux-6.12.30/Documentation/filesystems/aufs/design/10dynop.txt 2025-05-27 19:28:00.098257501 +0300 @@ -0,0 +1,47 @@ + -+# Copyright (C) 2010-2021 Junjiro R. Okajima ++# Copyright (C) 2010-2025 Junjiro R. Okajima +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -1491,12 +1500,12 @@ diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-5.15.41/ +XIP (DAX) mainly. +Currently this approach is applied to address_space_operations for +regular files only. -diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentation/filesystems/aufs/README +diff -Naur null/Documentation/filesystems/aufs/README linux-6.12.30/Documentation/filesystems/aufs/README --- /dev/null -+++ linux-5.15.41/Documentation/filesystems/aufs/README 2022-09-06 12:51:51.031709999 +0300 -@@ -0,0 +1,397 @@ ++++ linux-6.12.30/Documentation/filesystems/aufs/README 2025-05-27 19:28:00.097257513 +0300 +@@ -0,0 +1,409 @@ + -+Aufs5 -- advanced multi layered unification filesystem version 5.x ++Aufs6 -- advanced multi layered unification filesystem version 6.x +http://aufs.sf.net +Junjiro R. Okajima + @@ -1512,13 +1521,19 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +Unionfs was being developed by Professor Erez Zadok at Stony Brook +University and his team. + -+Aufs5 supports linux-v5.0 and later, If you want older kernel version -+support, ++Aufs6 supports linux-v6.0 and later, try aufs6.0 branch in ++aufs-linux.git or aufs-standalone.git. ++If you want older kernel version support, ++- for linux-v5.x series, try aufs-linux.git or aufs-standalone.git +- for linux-v4.x series, try aufs4-linux.git or aufs4-standalone.git +- for linux-v3.x series, try aufs3-linux.git or aufs3-standalone.git +- for linux-v2.6.16 and later, try aufs2-2.6.git, aufs2-standalone.git + or aufs1 from CVS on SourceForge. + ++Note: the name of aufs5-linux.git and aufs5-standalone.git on github ++ were changed. Now they are aufs-linux.git and ++ aufs-standalone.git and they contain aufs5 and later branches. ++ +Note: it becomes clear that "Aufs was rejected. Let's give it up." + According to Christoph Hellwig, linux rejects all union-type + filesystems but UnionMount. @@ -1577,7 +1592,7 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. +- and more... + -+Currently these features are dropped temporary from aufs5. ++Currently these features are dropped temporary from aufs6. +See design/08plan.txt in detail. +- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs + (robr) @@ -1595,64 +1610,63 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + +2. Download +---------------------------------------- -+There are three GIT trees for aufs5, aufs5-linux.git, -+aufs5-standalone.git, and aufs-util.git. Note that there is no "5" in -+"aufs-util.git." -+While the aufs-util is always necessary, you need either of aufs5-linux -+or aufs5-standalone. ++There are three GIT trees for aufs6, aufs-linux.git, ++aufs-standalone.git, and aufs-util.git. ++While the aufs-util is always necessary, you need either of aufs-linux ++or aufs-standalone. + -+The aufs5-linux tree includes the whole linux mainline GIT tree, ++The aufs-linux tree includes the whole linux mainline GIT tree, +git://git.kernel.org/.../torvalds/linux.git. +And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot -+build aufs5 as an external kernel module. ++build aufs6 as an external kernel module. +Several extra patches are not included in this tree. Only -+aufs5-standalone tree contains them. They are described in the later ++aufs-standalone tree contains them. They are described in the later +section "Configuration and Compilation." + -+On the other hand, the aufs5-standalone tree has only aufs source files ++On the other hand, the aufs-standalone tree has only aufs source files +and necessary patches, and you can select CONFIG_AUFS_FS=m. +But you need to apply all aufs patches manually. + -+You will find GIT branches whose name is in form of "aufs5.x" where "x" -+represents the linux kernel version, "linux-5.x". For instance, -+"aufs5.0" is for linux-5.0. For latest "linux-5.x-rcN", use -+"aufs5.x-rcN" branch. ++You will find GIT branches whose name is in form of "aufs6.x" where "x" ++represents the linux kernel version, "linux-6.x". For instance, ++"aufs6.0" is for linux-6.0. For latest "linux-6.x-rcN", use ++"aufs6.x-rcN" branch. + -+o aufs5-linux tree ++o aufs-linux tree +$ git clone --reference /your/linux/git/tree \ -+ git://github.com/sfjro/aufs5-linux.git aufs5-linux.git ++ git://github.com/sfjro/aufs-linux.git aufs-linux.git +- if you don't have linux GIT tree, then remove "--reference ..." -+$ cd aufs5-linux.git -+$ git checkout origin/aufs5.0 ++$ cd aufs-linux.git ++$ git checkout origin/aufs6.0 + +Or You may want to directly git-pull aufs into your linux GIT tree, and +leave the patch-work to GIT. +$ cd /your/linux/git/tree -+$ git remote add aufs5 git://github.com/sfjro/aufs5-linux.git -+$ git fetch aufs5 -+$ git checkout -b my5.0 v5.0 ++$ git remote add aufs git://github.com/sfjro/aufs-linux.git ++$ git fetch aufs ++$ git checkout -b my6.0 v6.0 +$ (add your local change...) -+$ git pull aufs5 aufs5.0 -+- now you have v5.0 + your_changes + aufs5.0 in you my5.0 branch. ++$ git pull aufs aufs6.0 ++- now you have v6.0 + your_changes + aufs6.0 in you my6.0 branch. +- you may need to solve some conflicts between your_changes and -+ aufs5.0. in this case, git-rerere is recommended so that you can -+ solve the similar conflicts automatically when you upgrade to 5.1 or ++ aufs6.0. in this case, git-rerere is recommended so that you can ++ solve the similar conflicts automatically when you upgrade to 6.1 or + later in the future. + -+o aufs5-standalone tree -+$ git clone git://github.com/sfjro/aufs5-standalone.git aufs5-standalone.git -+$ cd aufs5-standalone.git -+$ git checkout origin/aufs5.0 ++o aufs-standalone tree ++$ git clone git://github.com/sfjro/aufs-standalone.git aufs-standalone.git ++$ cd aufs-standalone.git ++$ git checkout origin/aufs6.0 + +o aufs-util tree +$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git +- note that the public aufs-util.git is on SourceForge instead of + GitHUB. +$ cd aufs-util.git -+$ git checkout origin/aufs5.0 ++$ git checkout origin/aufs6.0 + -+Note: The 5.x-rcN branch is to be used with `rc' kernel versions ONLY. -+The minor version number, 'x' in '5.x', of aufs may not always ++Note: The 6.x-rcN branch is to be used with `rc' kernel versions ONLY. ++The minor version number, 'x' in '6.x', of aufs may not always +follow the minor version number of the kernel. +Because changes in the kernel that cause the use of a new +minor version number do not always require changes to aufs-util. @@ -1664,8 +1678,8 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +nearest lower number. + +For (an unreleased) example: -+If you are using "linux-5.10" and the "aufs5.10" branch -+does not exist in aufs-util repository, then "aufs5.9", "aufs5.8" ++If you are using "linux-6.10" and the "aufs6.10" branch ++does not exist in aufs-util repository, then "aufs6.9", "aufs6.8" +or something numerically smaller is the branch for your kernel. + +Also you can view all branches by @@ -1676,7 +1690,7 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +---------------------------------------- +Make sure you have git-checkout'ed the correct branch. + -+For aufs5-linux tree, ++For aufs-linux tree, +- enable CONFIG_AUFS_FS. +- set other aufs configurations if necessary. +- for aufs5.13 and later @@ -1689,16 +1703,18 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + CONFIG_LOCKDEP_BITS=21 + CONFIG_LOCKDEP_CHAINS_BITS=21 + CONFIG_LOCKDEP_STACK_TRACE_BITS=24 ++ Also you will need to expand some constant values in LOCKDEP. Refer ++ to lockdep-debug.patch in aufs-standalone.git. + -+For aufs5-standalone tree, ++For aufs-standalone tree, +There are several ways to build. + +1. -+- apply ./aufs5-kbuild.patch to your kernel source files. -+- apply ./aufs5-base.patch too. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too, if you have a plan to set -+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs5-standalone.patch. ++- apply ./aufs6-kbuild.patch to your kernel source files. ++- apply ./aufs6-base.patch too. ++- apply ./aufs6-mmap.patch too. ++- apply ./aufs6-standalone.patch too, if you have a plan to set ++ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs-standalone.patch. +- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your + kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. +- enable CONFIG_AUFS_FS, you can select either @@ -1712,9 +1728,9 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + +2. +- module only (CONFIG_AUFS_FS=m). -+- apply ./aufs5-base.patch to your kernel source files. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too. ++- apply ./aufs6-base.patch to your kernel source files. ++- apply ./aufs6-mmap.patch too. ++- apply ./aufs6-standalone.patch too. +- build your kernel, don't forget "make headers_install", and reboot. +- edit ./config.mk and set other aufs configurations if necessary. + Note: You should read $PWD/fs/aufs/Kconfig carefully which describes @@ -1730,7 +1746,7 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + available in aufs standalone version's Makefile only), or copy + $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever + you like manually. By default, the target directory is $PWD/usr. -+- no need to apply aufs5-kbuild.patch, nor copying source files to your ++- no need to apply aufs6-kbuild.patch, nor copying source files to your + kernel source tree. + +Note: The header file aufs_type.h is necessary to build aufs-util @@ -1750,9 +1766,9 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + then run "make install_ulib" too. And refer to the aufs manual in + detail. + -+There several other patches in aufs5-standalone.git. They are all ++There several other patches in aufs-standalone.git. They are all +optional. When you meet some problems, they will help you. -+- aufs5-loopback.patch ++- aufs6-loopback.patch + Supports a nested loopback mount in a branch-fs. This patch is + unnecessary until aufs produces a message like "you may want to try + another patch for loopback file". @@ -1766,6 +1782,10 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio + duplication of inode number, which is important for backup tools and + other utilities. When you find aufs XINO files for tmpfs branch + growing too much, try this patch. ++- lockdep-debug.patch ++ Similar to some kernel configurations for LOCKDEP (see the top of ++ this section), you will need expand some constants in LOCKDEP for ++ aufs if you enable CONFIG_LOCKDEP. + + +4. Usage @@ -1874,7 +1894,8 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +James Burry made a donation (2016/12). +Carsten Rose made a donation (2018/9). +Porteus Kiosk made a donation (2018/10). -+Enya Quetzalli Gomez Rodriguez made a donation (2022/5). ++huronOS team: Enya Quetzalli made donations (2022/5, 2023/5, 8 and 2024/8). ++Vasily Mikhaylichenko made a donation (2023/5 and 2024/5). + +Thank you very much. +Donations are always, including future donations, very important and @@ -1892,15 +1913,15 @@ diff -Naur null/Documentation/filesystems/aufs/README linux-5.15.41/Documentatio +# Local variables: ; +# mode: text; +# End: ; -diff -Naur null/fs/aufs/aufs.h linux-5.15.41/fs/aufs/aufs.h +diff -Naur null/fs/aufs/aufs.h linux-6.12.30/fs/aufs/aufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/aufs.h 2022-09-06 12:51:51.034709962 +0300 ++++ linux-6.12.30/fs/aufs/aufs.h 2025-05-27 19:28:00.099257488 +0300 @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -1958,15 +1979,15 @@ diff -Naur null/fs/aufs/aufs.h linux-5.15.41/fs/aufs/aufs.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_H__ */ -diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c +diff -Naur null/fs/aufs/branch.c linux-6.12.30/fs/aufs/branch.c --- /dev/null -+++ linux-5.15.41/fs/aufs/branch.c 2022-09-06 12:51:51.034709962 +0300 ++++ linux-6.12.30/fs/aufs/branch.c 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,1427 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -2207,7 +2228,7 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + + inode = d_inode(add->path.dentry); + err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { ++ if (unlikely(!vfsub_inode_nlink(inode, AU_I_UNKNOWN))) { + pr_err("no existence %s\n", add->pathname); + goto out; + } @@ -2457,14 +2478,14 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + bbot = au_sbbot(sb); + amount = bbot + 1 - bindex; + h_dentry = au_br_dentry(br); -+ au_sbilist_lock(); ++ au_sbilist_write_lock(); + au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); + au_br_do_add_hdp(au_di(root), bindex, bbot, amount); + au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); + au_set_h_dptr(root, bindex, dget(h_dentry)); + h_inode = d_inode(h_dentry); + au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); -+ au_sbilist_unlock(); ++ au_sbilist_write_unlock(); +} + +int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) @@ -2942,11 +2963,11 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + h_inode = au_igrab(hinode->hi_inode); + au_hiput(hinode); + -+ au_sbilist_lock(); ++ au_sbilist_write_lock(); + au_br_do_del_brp(sbinfo, bindex, bbot); + au_br_do_del_hdp(au_di(root), bindex, bbot); + au_br_do_del_hip(au_ii(inode), bindex, bbot); -+ au_sbilist_unlock(); ++ au_sbilist_write_unlock(); + + /* ignore an error */ + au_dr_br_fin(sb, br); /* always, regardless the mount option */ @@ -3257,7 +3278,7 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + if (hf->f_mode & FMODE_READ) + i_readcount_inc(h_inode); + put_write_access(h_inode); -+ __mnt_drop_write(hf->f_path.mnt); ++ mnt_put_write_access(hf->f_path.mnt); + } + } + @@ -3389,15 +3410,15 @@ diff -Naur null/fs/aufs/branch.c linux-5.15.41/fs/aufs/branch.c + + return err; +} -diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h +diff -Naur null/fs/aufs/branch.h linux-6.12.30/fs/aufs/branch.h --- /dev/null -+++ linux-5.15.41/fs/aufs/branch.h 2022-09-06 12:51:51.034709962 +0300 ++++ linux-6.12.30/fs/aufs/branch.h 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,375 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -3541,9 +3562,9 @@ diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h + return br->br_path.dentry; +} + -+static inline struct user_namespace *au_br_userns(struct au_branch *br) ++static inline struct mnt_idmap *au_br_idmap(struct au_branch *br) +{ -+ return mnt_user_ns(br->br_path.mnt); ++ return mnt_idmap(br->br_path.mnt); +} + +static inline struct super_block *au_br_sb(struct au_branch *br) @@ -3705,9 +3726,9 @@ diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h +} + +static inline -+struct user_namespace *au_sbr_userns(struct super_block *sb, aufs_bindex_t bindex) ++struct mnt_idmap *au_sbr_idmap(struct super_block *sb, aufs_bindex_t bindex) +{ -+ return au_br_userns(au_sbr(sb, bindex)); ++ return au_br_idmap(au_sbr(sb, bindex)); +} + +static inline @@ -3768,9 +3789,9 @@ diff -Naur null/fs/aufs/branch.h linux-5.15.41/fs/aufs/branch.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_BRANCH_H__ */ -diff -Naur null/fs/aufs/conf.mk linux-5.15.41/fs/aufs/conf.mk +diff -Naur null/fs/aufs/conf.mk linux-6.12.30/fs/aufs/conf.mk --- /dev/null -+++ linux-5.15.41/fs/aufs/conf.mk 2022-09-06 12:51:51.035709949 +0300 ++++ linux-6.12.30/fs/aufs/conf.mk 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -3812,15 +3833,15 @@ diff -Naur null/fs/aufs/conf.mk linux-5.15.41/fs/aufs/conf.mk +${obj}/sysfs.o: ${AuConfName} + +-include ${srctree}/${src}/conf_priv.mk -diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c +diff -Naur null/fs/aufs/cpup.c linux-6.12.30/fs/aufs/cpup.c --- /dev/null -+++ linux-5.15.41/fs/aufs/cpup.c 2022-09-06 12:51:51.035709949 +0300 -@@ -0,0 +1,1459 @@ ++++ linux-6.12.30/fs/aufs/cpup.c 2025-05-27 19:28:00.100257476 +0300 +@@ -0,0 +1,1458 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -3887,7 +3908,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause + * the incorrect link count. + */ -+ set_nlink(inode, h_inode->i_nlink); ++ vfsub_set_nlink(inode, vfsub_inode_nlink(h_inode, AU_I_BRANCH)); + + /* + * fewer nlink makes find(1) noisy, but larger nlink doesn't. @@ -3931,8 +3952,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + + h_inode = au_h_iptr(inode, au_ibtop(inode)); + au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); ++ au_cpup_attr_nlink(inode, force); + inode->i_rdev = h_inode->i_rdev; + inode->i_blkbits = h_inode->i_blkbits; + au_cpup_igen(inode, h_inode); @@ -3951,8 +3971,8 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + dt->dt_dentry = dentry; + dt->dt_h_path = *h_path; + h_inode = d_inode(h_path->dentry); -+ dt->dt_atime = h_inode->i_atime; -+ dt->dt_mtime = h_inode->i_mtime; ++ dt->dt_atime = inode_get_atime(h_inode); ++ dt->dt_mtime = inode_get_mtime(h_inode); + /* smp_mb(); */ +} + @@ -4018,8 +4038,8 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + } else { + ia.ia_uid = h_isrc->i_uid; + ia.ia_gid = h_isrc->i_gid; -+ ia.ia_atime = h_isrc->i_atime; -+ ia.ia_mtime = h_isrc->i_mtime; ++ ia.ia_atime = inode_get_atime(h_isrc); ++ ia.ia_mtime = inode_get_mtime(h_isrc); + if (h_idst->i_mode != h_isrc->i_mode + && !S_ISLNK(h_idst->i_mode)) { + ia.ia_valid |= ATTR_MODE; @@ -4361,7 +4381,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + goto out; + } + h_src_attr->valid = 1; -+ if (!au_test_nfs(h_src_inode->i_sb)) { ++ if (!au_test_fs_unlock_for_open(h_src_inode->i_sb)) { + err = au_cp_regular(cpg); + inode_unlock_shared(h_src_inode); + } else { @@ -4407,23 +4427,23 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + * regardless 'acl' option, reset all ACL. + * All ACL will be copied up later from the original entry on the lower branch. + */ -+static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) ++static int au_reset_acl(struct path *h_path, umode_t mode) +{ + int err; + struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; ++ /* struct inode *h_inode; */ ++ struct mnt_idmap *h_idmap; + -+ h_userns = mnt_user_ns(h_path->mnt); ++ h_idmap = mnt_idmap(h_path->mnt); + h_dentry = h_path->dentry; -+ h_inode = d_inode(h_dentry); ++ /* h_inode = d_inode(h_dentry); */ + /* forget_all_cached_acls(h_inode)); */ -+ err = vfsub_removexattr(h_userns, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); ++ err = vfsub_remove_acl(h_idmap, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); + AuTraceErr(err); + if (err == -EOPNOTSUPP) + err = 0; + if (!err) -+ err = vfsub_acl_chmod(h_userns, h_inode, mode); ++ err = vfsub_acl_chmod(h_idmap, h_dentry, mode); + + AuTraceErr(err); + return err; @@ -4434,11 +4454,11 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c +{ + int err; + struct inode *dir, *inode; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + -+ h_userns = mnt_user_ns(h_path->mnt); -+ err = vfsub_removexattr(h_userns, h_path->dentry, -+ XATTR_NAME_POSIX_ACL_DEFAULT); ++ h_idmap = mnt_idmap(h_path->mnt); ++ err = vfsub_remove_acl(h_idmap, h_path->dentry, ++ XATTR_NAME_POSIX_ACL_DEFAULT); + AuTraceErr(err); + if (err == -EOPNOTSUPP) + err = 0; @@ -4529,13 +4549,13 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + err = -EIO; + } + if (!err) -+ err = au_reset_acl(h_dir, &h_path, mode); ++ err = au_reset_acl(&h_path, mode); + + mnt_flags = au_mntflags(sb); + if (!au_opt_test(mnt_flags, UDBA_NONE) + && !isdir + && au_opt_test(mnt_flags, XINO) -+ && (h_inode->i_nlink == 1 ++ && (vfsub_inode_nlink(h_inode, AU_I_BRANCH) == 1 + || (h_inode->i_state & I_LINKABLE)) + /* todo: unnecessary? */ + /* && d_inode(cpg->dentry)->i_nlink == 1 */ @@ -4662,7 +4682,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + goto out_parent; + } + -+ if (dst_inode->i_nlink) { ++ if (vfsub_inode_nlink(dst_inode, AU_I_BRANCH)) { + const int do_dt = au_ftest_cpup(cpg->flags, DTIME); + + h_src = au_plink_lkup(inode, cpg->bdst); @@ -4747,7 +4767,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + + src_inode = d_inode(h_src); + if (!isdir -+ && (src_inode->i_nlink > 1 ++ && (vfsub_inode_nlink(src_inode, AU_I_BRANCH) > 1 + || src_inode->i_state & I_LINKABLE) + && plink) + au_plink_append(inode, cpg->bdst, h_dst); @@ -4917,7 +4937,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + struct dentry *dentry, *parent; + struct file *h_file; + struct inode *h_dir; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + dentry = cpg->dentry; + h_file = NULL; @@ -4931,8 +4951,8 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + + parent = dget_parent(dentry); + h_dir = au_h_iptr(d_inode(parent), cpg->bdst); -+ h_userns = au_sbr_userns(dentry->d_sb, cpg->bdst); -+ if (!au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC | MAY_WRITE) ++ h_idmap = au_sbr_idmap(dentry->d_sb, cpg->bdst); ++ if (!au_test_h_perm_sio(h_idmap, h_dir, MAY_EXEC | MAY_WRITE) + && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) + err = au_cpup_simple(cpg); + else { @@ -5102,7 +5122,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + struct inode *dir, *h_dir, *h_tmpdir; + struct au_wbr *wbr; + struct au_pin wh_pin, *pin_orig; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + dentry = cpg->dentry; + bdst = cpg->bdst; @@ -5113,7 +5133,7 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + h_dir = au_igrab(au_h_iptr(dir, bdst)); + h_tmpdir = h_dir; + pin_orig = NULL; -+ if (!h_dir->i_nlink) { ++ if (!vfsub_inode_nlink(h_dir, AU_I_BRANCH)) { + wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; + h_orph = wbr->wbr_orph; + @@ -5131,8 +5151,8 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + cpg->pin = &wh_pin; + } + -+ h_userns = au_sbr_userns(dentry->d_sb, bdst); -+ if (!au_test_h_perm_sio(h_userns, h_tmpdir, MAY_EXEC | MAY_WRITE) ++ h_idmap = au_sbr_idmap(dentry->d_sb, bdst); ++ if (!au_test_h_perm_sio(h_idmap, h_tmpdir, MAY_EXEC | MAY_WRITE) + && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) + err = au_cpup_wh(cpg, file); + else { @@ -5275,15 +5295,15 @@ diff -Naur null/fs/aufs/cpup.c linux-5.15.41/fs/aufs/cpup.c + dput(parent); + return err; +} -diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h +diff -Naur null/fs/aufs/cpup.h linux-6.12.30/fs/aufs/cpup.h --- /dev/null -+++ linux-5.15.41/fs/aufs/cpup.h 2022-09-06 12:51:51.035709949 +0300 -@@ -0,0 +1,100 @@ ++++ linux-6.12.30/fs/aufs/cpup.h 2025-05-27 19:28:00.100257476 +0300 +@@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -5307,6 +5327,7 @@ diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h +#ifdef __KERNEL__ + +#include ++#include + +struct inode; +struct file; @@ -5330,15 +5351,15 @@ diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h +}; + +/* cpup flags */ -+#define AuCpup_DTIME 1 /* do dtime_store/revert */ -+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, ++#define AuCpup_DTIME BIT(0) /* do dtime_store/revert */ ++#define AuCpup_KEEPLINO BIT(1) /* do not clear the lower xino, + for link(2) */ -+#define AuCpup_RENAME (1 << 2) /* rename after cpup */ -+#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in ++#define AuCpup_RENAME BIT(2) /* rename after cpup */ ++#define AuCpup_HOPEN BIT(3) /* call h_open_pre/post() in + cpup */ -+#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the ++#define AuCpup_OVERWRITE BIT(4) /* allow overwriting the + existing entry */ -+#define AuCpup_RWDST (1 << 5) /* force write target even if ++#define AuCpup_RWDST BIT(5) /* force write target even if + the branch is marked as RO */ + +#ifndef CONFIG_AUFS_BR_HFSPLUS @@ -5379,15 +5400,15 @@ diff -Naur null/fs/aufs/cpup.h linux-5.15.41/fs/aufs/cpup.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_CPUP_H__ */ -diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.41/fs/aufs/dbgaufs.c +diff -Naur null/fs/aufs/dbgaufs.c linux-6.12.30/fs/aufs/dbgaufs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dbgaufs.c 2022-09-06 12:51:51.035709949 +0300 ++++ linux-6.12.30/fs/aufs/dbgaufs.c 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,526 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -5549,7 +5570,7 @@ diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.41/fs/aufs/dbgaufs.c + } else { +#define str "1\n0\n0\n" + p->n = sizeof(str) - 1; -+ strcpy(p->a, str); ++ strscpy(p->a, str, sizeof(str)); +#undef str + } + si_read_unlock(sb); @@ -5909,15 +5930,15 @@ diff -Naur null/fs/aufs/dbgaufs.c linux-5.15.41/fs/aufs/dbgaufs.c + err = 0; + return err; +} -diff -Naur null/fs/aufs/dbgaufs.h linux-5.15.41/fs/aufs/dbgaufs.h +diff -Naur null/fs/aufs/dbgaufs.h linux-6.12.30/fs/aufs/dbgaufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dbgaufs.h 2022-09-06 12:51:51.035709949 +0300 ++++ linux-6.12.30/fs/aufs/dbgaufs.h 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -5966,15 +5987,15 @@ diff -Naur null/fs/aufs/dbgaufs.h linux-5.15.41/fs/aufs/dbgaufs.h + +#endif /* __KERNEL__ */ +#endif /* __DBGAUFS_H__ */ -diff -Naur null/fs/aufs/dcsub.c linux-5.15.41/fs/aufs/dcsub.c +diff -Naur null/fs/aufs/dcsub.c linux-6.12.30/fs/aufs/dcsub.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dcsub.c 2022-09-06 12:51:51.035709949 +0300 ++++ linux-6.12.30/fs/aufs/dcsub.c 2025-05-27 19:28:00.100257476 +0300 @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -6195,15 +6216,15 @@ diff -Naur null/fs/aufs/dcsub.c linux-5.15.41/fs/aufs/dcsub.c + + return path_is_under(path + 0, path + 1); +} -diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h +diff -Naur null/fs/aufs/dcsub.h linux-6.12.30/fs/aufs/dcsub.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dcsub.h 2022-09-06 12:51:51.035709949 +0300 -@@ -0,0 +1,137 @@ ++++ linux-6.12.30/fs/aufs/dcsub.h 2025-05-27 19:28:00.100257476 +0300 +@@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -6228,6 +6249,7 @@ diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h + +#include +#include ++#include "vfsub.h" + +struct au_dpage { + int ndentry; @@ -6268,7 +6290,8 @@ diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h + err = 0; + if (unlikely(d_unhashed(d) + || d_is_negative(d) -+ || !inode->i_nlink)) ++ /* to support both aufs and branches */ ++ || !vfsub_inode_nlink(inode, AU_I_UNKNOWN))) + err = -ENOENT; + return err; +} @@ -6298,7 +6321,7 @@ diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h + inode = d_inode(d); + if (unlikely(d_unlinked(d) + || d_is_negative(d) -+ || !inode->i_nlink)) ++ || !vfsub_inode_nlink(inode, AU_I_UNKNOWN))) + err = -ENOENT; + } + return err; @@ -6336,15 +6359,15 @@ diff -Naur null/fs/aufs/dcsub.h linux-5.15.41/fs/aufs/dcsub.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DCSUB_H__ */ -diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c +diff -Naur null/fs/aufs/debug.c linux-6.12.30/fs/aufs/debug.c --- /dev/null -+++ linux-5.15.41/fs/aufs/debug.c 2022-09-06 12:51:51.036709937 +0300 -@@ -0,0 +1,444 @@ ++++ linux-6.12.30/fs/aufs/debug.c 2025-05-27 19:28:00.101257463 +0300 +@@ -0,0 +1,448 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -6454,6 +6477,7 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c +{ + char *n = NULL; + int l = 0; ++ struct timespec64 ctime; + + if (!inode || IS_ERR(inode)) { + dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); @@ -6468,13 +6492,16 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c + l = wh->d_name.len; + } + -+ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," -+ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", ++ ctime = inode_get_ctime(inode); ++ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u?, 0%o, sz %llu, blk %llu," ++ " acl %p, def_acl %p," ++ " hn %d, ct %lld, np %lu, st 0x%x, f 0x%x, v %llu, g %x%s%.*s\n", + bindex, inode, + inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", + atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, + i_size_read(inode), (unsigned long long)inode->i_blocks, -+ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff, ++ inode->i_acl, inode->i_default_acl, ++ hn, (long long)timespec64_to_ns(&ctime) & 0x0ffff, + inode->i_mapping ? inode->i_mapping->nrpages : 0, + inode->i_state, inode->i_flags, inode_peek_iversion(inode), + inode->i_generation, @@ -6590,9 +6617,9 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c + && au_fi(file)) + snprintf(a, sizeof(a), ", gen %d, mmapped %d", + au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); -+ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", ++ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, pos %llu%s\n", + bindex, file->f_mode, file->f_flags, (long)file_count(file), -+ file->f_version, file->f_pos, a); ++ file->f_pos, a); + if (!IS_ERR_OR_NULL(file->f_path.dentry)) + do_pri_dentry(bindex, file->f_path.dentry); + return 0; @@ -6784,15 +6811,15 @@ diff -Naur null/fs/aufs/debug.c linux-5.15.41/fs/aufs/debug.c + + return 0; +} -diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h +diff -Naur null/fs/aufs/debug.h linux-6.12.30/fs/aufs/debug.h --- /dev/null -+++ linux-5.15.41/fs/aufs/debug.h 2022-09-06 12:51:51.036709937 +0300 ++++ linux-6.12.30/fs/aufs/debug.h 2025-05-27 19:28:00.101257463 +0300 @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -6839,7 +6866,7 @@ diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h + return atomic_read(&aufs_debug) > 0; +} +#else -+#define AuDebugOn(a) do {} while (0) ++AuStubVoid(AuDebugOn, bool expr __maybe_unused) +AuStubVoid(au_debug_on, void) +AuStubVoid(au_debug_off, void) +AuStubInt0(au_debug_test, void) @@ -6898,14 +6925,14 @@ diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h +/* ---------------------------------------------------------------------- */ + +struct dentry; ++struct inode; ++struct au_nhash; ++struct au_vdir; +#ifdef CONFIG_AUFS_DEBUG +extern struct mutex au_dbg_mtx; +extern char *au_plevel; -+struct au_nhash; +void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; +void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; +void au_dpri_inode(struct inode *inode); +void au_dpri_dalias(struct inode *inode); +void au_dpri_dentry(struct dentry *dentry); @@ -6981,14 +7008,14 @@ diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h +AuStubVoid(au_dbg_verify_kthread, void) +AuStubInt0(__init au_debug_init, void) + -+#define AuDbgWhlist(w) do {} while (0) -+#define AuDbgVdir(v) do {} while (0) -+#define AuDbgInode(i) do {} while (0) -+#define AuDbgDAlias(i) do {} while (0) -+#define AuDbgDentry(d) do {} while (0) -+#define AuDbgFile(f) do {} while (0) -+#define AuDbgSb(sb) do {} while (0) -+#define AuDbgSym(addr) do {} while (0) ++AuStubVoid(AuDbgWhlist, struct au_nhash *whlist) ++AuStubVoid(AuDbgVdir, struct au_vdir *vdir) ++AuStubVoid(AuDbgInode, struct inode *inode) ++AuStubVoid(AuDbgDAlias, struct inode *inode) ++AuStubVoid(AuDbgDentry, struct dentry *dentry) ++AuStubVoid(AuDbgFile, struct file *filp) ++AuStubVoid(AuDbgSb, struct super_block *sb) ++AuStubVoid(AuDbgSym, void *addr) +#endif /* CONFIG_AUFS_DEBUG */ + +/* ---------------------------------------------------------------------- */ @@ -7014,15 +7041,15 @@ diff -Naur null/fs/aufs/debug.h linux-5.15.41/fs/aufs/debug.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DEBUG_H__ */ -diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c +diff -Naur null/fs/aufs/dentry.c linux-6.12.30/fs/aufs/dentry.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dentry.c 2022-09-06 12:51:51.036709937 +0300 -@@ -0,0 +1,1168 @@ ++++ linux-6.12.30/fs/aufs/dentry.c 2025-05-27 19:28:00.101257463 +0300 +@@ -0,0 +1,1176 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -7054,7 +7081,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + struct dentry *h_dentry; + struct inode *h_inode; + struct au_branch *br; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + struct path h_path; + int wh_found, opq; + unsigned char wh_able; @@ -7066,10 +7093,10 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + 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); ++ h_idmap = au_br_idmap(br); + wh_able = !!au_br_whable(br->br_perm); + if (wh_able) -+ wh_found = au_wh_test(h_userns, &h_path, &args->whname, ++ wh_found = au_wh_test(h_idmap, &h_path, &args->whname, + ignore_perm); + h_dentry = ERR_PTR(wh_found); + if (!wh_found) @@ -7087,7 +7114,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + if (!ignore_perm) + h_dentry = vfsub_lkup_one(args->name, &h_path); + else -+ h_dentry = au_sio_lkup_one(h_userns, args->name, &h_path); ++ h_dentry = au_sio_lkup_one(h_idmap, args->name, &h_path); + if (IS_ERR(h_dentry)) { + if (PTR_ERR(h_dentry) == -ENAMETOOLONG + && !allow_neg) @@ -7123,7 +7150,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + + h_path.dentry = h_dentry; + inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ opq = au_diropq_test(h_userns, &h_path); ++ opq = au_diropq_test(h_idmap, &h_path); + inode_unlock_shared(h_inode); + if (opq > 0) + au_set_dbdiropq(dentry, bindex); @@ -7268,13 +7295,13 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + return err; +} + -+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name, ++struct dentry *au_sio_lkup_one(struct mnt_idmap *idmap, struct qstr *name, + struct path *ppath) +{ + struct dentry *dentry; + int wkq_err; + -+ if (!au_test_h_perm_sio(userns, d_inode(ppath->dentry), MAY_EXEC)) ++ if (!au_test_h_perm_sio(idmap, d_inode(ppath->dentry), MAY_EXEC)) + dentry = vfsub_lkup_one(name, ppath); + else { + struct vfsub_lkup_one_args args = { @@ -7299,18 +7326,18 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + int err; + struct dentry *parent, *h_dentry; + struct au_branch *br; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + struct path h_ppath; + + parent = dget_parent(dentry); + 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); ++ h_idmap = au_br_idmap(br); + if (wh) + 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_ppath); ++ h_dentry = au_sio_lkup_one(h_idmap, &dentry->d_name, &h_ppath); + err = PTR_ERR(h_dentry); + if (IS_ERR(h_dentry)) + goto out; @@ -7526,10 +7553,11 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + if (d_really_is_positive(dentry)) { + inode = d_inode(dentry); + if (!d_is_dir(dentry)) { -+ if (inode->i_nlink && !d_unhashed(dentry)) -+ drop_nlink(inode); ++ if (vfsub_inode_nlink(inode, AU_I_AUFS) ++ && !d_unhashed(dentry)) ++ vfsub_drop_nlink(inode); + } else { -+ clear_nlink(inode); ++ vfsub_clear_nlink(inode); + /* stop next lookup */ + inode->i_flags |= S_DEAD; + } @@ -7884,7 +7912,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c +{ + int err; + umode_t mode, h_mode; -+ aufs_bindex_t bindex, btail, btop, ibs, ibe; ++ aufs_bindex_t bindex, btail, btop, ibs, ibe, bwh; + unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; + struct inode *h_inode, *h_cached_inode; + struct dentry *h_dentry; @@ -7909,17 +7937,23 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + */ + if (do_udba && inode) { + mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); ++ plus = (vfsub_inode_nlink(inode, AU_I_AUFS) > 0); + ibs = au_ibtop(inode); + ibe = au_ibbot(inode); + } + + btop = au_dbtop(dentry); ++ bwh = au_dbwh(dentry); ++ if (0 <= bwh && bwh < btop) ++ btop = bwh; + btail = btop; + if (inode && S_ISDIR(inode->i_mode)) + btail = au_dbtaildir(dentry); + for (bindex = btop; bindex <= btail; bindex++) { + h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry ++ && (bindex == bwh && inode)) ++ h_dentry = au_hi_wh(inode, bindex); + if (!h_dentry) + continue; + @@ -7928,6 +7962,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + spin_lock(&h_dentry->d_lock); + h_name = &h_dentry->d_name; + if (unlikely(do_udba ++ && bindex != bwh + && !is_root + && ((!h_nfs + && (unhashed != !!d_unhashed(h_dentry) @@ -7968,9 +8003,9 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + h_plus = plus; + h_mode = mode; + h_cached_inode = h_inode; -+ if (h_inode) { ++ if (h_inode && bindex != bwh) { + h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); ++ h_plus = (vfsub_inode_nlink(h_inode, AU_I_BRANCH) > 0); + } + if (inode && ibs <= bindex && bindex <= ibe) + h_cached_inode = au_h_iptr(inode, bindex); @@ -8126,7 +8161,7 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c + if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) + && inode + && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !inode->i_nlink)) { ++ && (IS_DEADDIR(inode) || !vfsub_inode_nlink(inode, AU_I_AUFS))) { + AuTraceErr(err); + goto out_inval; + } @@ -8186,15 +8221,15 @@ diff -Naur null/fs/aufs/dentry.c linux-5.15.41/fs/aufs/dentry.c +const struct dentry_operations aufs_dop_noreval = { + .d_release = aufs_d_release +}; -diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h +diff -Naur null/fs/aufs/dentry.h linux-6.12.30/fs/aufs/dentry.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dentry.h 2022-09-06 12:51:51.036709937 +0300 -@@ -0,0 +1,269 @@ ++++ linux-6.12.30/fs/aufs/dentry.h 2025-05-27 19:28:00.101257463 +0300 +@@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -8233,15 +8268,16 @@ diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h + aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; + unsigned char di_tmpfile; /* to allow the different name */ + struct au_hdentry *di_hdentry; ++ struct file *di_htmpfile; + struct rcu_head rcu; +} ____cacheline_aligned_in_smp; + +/* ---------------------------------------------------------------------- */ + +/* flags for au_lkup_dentry() */ -+#define AuLkup_ALLOW_NEG 1 -+#define AuLkup_IGNORE_PERM (1 << 1) -+#define AuLkup_DIRREN (1 << 2) ++#define AuLkup_ALLOW_NEG BIT(0) ++#define AuLkup_IGNORE_PERM BIT(1) ++#define AuLkup_DIRREN BIT(2) +#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) +#define au_fset_lkup(flags, name) \ + do { (flags) |= AuLkup_##name; } while (0) @@ -8265,7 +8301,7 @@ diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h +/* dentry.c */ +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 *au_sio_lkup_one(struct mnt_idmap *idmap, struct qstr *name, + 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); @@ -8459,15 +8495,15 @@ diff -Naur null/fs/aufs/dentry.h linux-5.15.41/fs/aufs/dentry.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DENTRY_H__ */ -diff -Naur null/fs/aufs/dinfo.c linux-5.15.41/fs/aufs/dinfo.c +diff -Naur null/fs/aufs/dinfo.c linux-6.12.30/fs/aufs/dinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dinfo.c 2022-09-06 12:51:51.037709924 +0300 -@@ -0,0 +1,554 @@ ++++ linux-6.12.30/fs/aufs/dinfo.c 2025-05-27 19:28:00.101257463 +0300 +@@ -0,0 +1,555 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -8516,6 +8552,7 @@ diff -Naur null/fs/aufs/dinfo.c linux-5.15.41/fs/aufs/dinfo.c + dinfo->di_tmpfile = 0; + for (i = 0; i < nbr; i++) + dinfo->di_hdentry[i].hd_id = -1; ++ dinfo->di_htmpfile = NULL; + goto out; + } + @@ -9017,15 +9054,15 @@ diff -Naur null/fs/aufs/dinfo.c linux-5.15.41/fs/aufs/dinfo.c + return bindex; + return -1; +} -diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c +diff -Naur null/fs/aufs/dir.c linux-6.12.30/fs/aufs/dir.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dir.c 2022-09-06 12:51:51.037709924 +0300 ++++ linux-6.12.30/fs/aufs/dir.c 2025-05-27 19:28:00.101257463 +0300 @@ -0,0 +1,765 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -9049,32 +9086,32 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + +void au_add_nlink(struct inode *dir, struct inode *h_dir) +{ -+ unsigned int nlink; ++ unsigned int nlink, h_nlink; + + AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); + -+ nlink = dir->i_nlink; -+ nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) ++ nlink = vfsub_inode_nlink(dir, AU_I_AUFS); ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); ++ nlink += h_nlink - 2; ++ if (h_nlink < 2) + nlink += 2; -+ smp_mb(); /* for i_nlink */ + /* 0 can happen in revaliding */ -+ set_nlink(dir, nlink); ++ vfsub_set_nlink(dir, nlink); +} + +void au_sub_nlink(struct inode *dir, struct inode *h_dir) +{ -+ unsigned int nlink; ++ unsigned int nlink, h_nlink; + + AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); + -+ nlink = dir->i_nlink; -+ nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) ++ nlink = vfsub_inode_nlink(dir, AU_I_AUFS); ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); ++ nlink -= h_nlink - 2; ++ if (h_nlink < 2) + nlink -= 2; -+ smp_mb(); /* for i_nlink */ + /* nlink == 0 means the branch-fs is broken */ -+ set_nlink(dir, nlink); ++ vfsub_set_nlink(dir, nlink); +} + +loff_t au_dir_size(struct file *file, struct dentry *dentry) @@ -9130,6 +9167,7 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + struct au_dir_ts_arg *a = arg; + struct au_dtime dt; + struct path h_path; ++ struct timespec64 ts; + struct inode *dir, *h_dir; + struct super_block *sb; + struct au_branch *br; @@ -9167,8 +9205,9 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + hdir = au_hi(dir, btop); + au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); + h_dir = au_h_iptr(dir, btop); -+ if (h_dir->i_nlink -+ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { ++ ts = inode_get_mtime(h_dir); ++ if (vfsub_inode_nlink(h_dir, AU_I_BRANCH) ++ && timespec64_compare(&ts, &dt.dt_mtime) < 0) { + dt.dt_h_path = h_path; + au_dtime_revert(&dt); + } @@ -9283,7 +9322,6 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + err = 0; + mnt = file->f_path.mnt; + dentry = file->f_path.dentry; -+ file->f_version = inode_query_iversion(d_inode(dentry)); + bindex = au_dbtop(dentry); + au_set_fbtop(file, bindex); + btail = au_dbtaildir(dentry); @@ -9550,9 +9588,9 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + +/* ---------------------------------------------------------------------- */ + -+#define AuTestEmpty_WHONLY 1 -+#define AuTestEmpty_CALLED (1 << 1) -+#define AuTestEmpty_SHWH (1 << 2) ++#define AuTestEmpty_WHONLY BIT(0) ++#define AuTestEmpty_CALLED BIT(1) ++#define AuTestEmpty_SHWH BIT(2) +#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) +#define au_fset_testempty(flags, name) \ + do { (flags) |= AuTestEmpty_##name; } while (0) @@ -9572,9 +9610,9 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + aufs_bindex_t bindex; +}; + -+static int test_empty_cb(struct dir_context *ctx, const char *__name, -+ int namelen, loff_t offset __maybe_unused, u64 ino, -+ unsigned int d_type) ++static bool test_empty_cb(struct dir_context *ctx, const char *__name, ++ int namelen, loff_t offset __maybe_unused, u64 ino, ++ unsigned int d_type) +{ + struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, + ctx); @@ -9583,8 +9621,7 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + arg->err = 0; + au_fset_testempty(arg->flags, CALLED); + /* smp_mb(); */ -+ if (name[0] == '.' -+ && (namelen == 1 || (name[1] == '.' && namelen == 2))) ++ if (is_dot_dotdot(name, namelen)) + goto out; /* success */ + + if (namelen <= AUFS_WH_PFX_LEN @@ -9605,7 +9642,7 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c +out: + /* smp_mb(); */ + AuTraceErr(arg->err); -+ return arg->err; ++ return !arg->err; +} + +static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) @@ -9623,7 +9660,7 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + + err = 0; + if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !file_inode(h_file)->i_nlink) ++ && !vfsub_inode_nlink(file_inode(h_file), AU_I_BRANCH)) + goto out_put; + + do { @@ -9660,14 +9697,14 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + int err, wkq_err; + struct dentry *h_dentry; + struct inode *h_inode; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + -+ h_userns = au_sbr_userns(dentry->d_sb, arg->bindex); ++ h_idmap = au_sbr_idmap(dentry->d_sb, arg->bindex); + h_dentry = au_h_dptr(dentry, arg->bindex); + h_inode = d_inode(h_dentry); + /* todo: i_mode changes anytime? */ + inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ err = au_test_h_perm_sio(h_userns, h_inode, MAY_EXEC | MAY_READ); ++ err = au_test_h_perm_sio(h_idmap, h_inode, MAY_EXEC | MAY_READ); + inode_unlock_shared(h_inode); + if (!err) + err = do_test_empty(dentry, arg); @@ -9786,15 +9823,15 @@ diff -Naur null/fs/aufs/dir.c linux-5.15.41/fs/aufs/dir.c + .flush = aufs_flush_dir, + .fsync = aufs_fsync_dir +}; -diff -Naur null/fs/aufs/dir.h linux-5.15.41/fs/aufs/dir.h +diff -Naur null/fs/aufs/dir.h linux-6.12.30/fs/aufs/dir.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dir.h 2022-09-06 12:51:51.037709924 +0300 ++++ linux-6.12.30/fs/aufs/dir.h 2025-05-27 19:28:00.101257463 +0300 @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -9924,15 +9961,15 @@ diff -Naur null/fs/aufs/dir.h linux-5.15.41/fs/aufs/dir.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIR_H__ */ -diff -Naur null/fs/aufs/dirren.c linux-5.15.41/fs/aufs/dirren.c +diff -Naur null/fs/aufs/dirren.c linux-6.12.30/fs/aufs/dirren.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dirren.c 2022-09-06 12:51:51.037709924 +0300 ++++ linux-6.12.30/fs/aufs/dirren.c 2025-05-27 19:28:00.101257463 +0300 @@ -0,0 +1,1315 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima ++ * Copyright (C) 2017-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -10665,7 +10702,7 @@ diff -Naur null/fs/aufs/dirren.c linux-5.15.41/fs/aufs/dirren.c + + memset(w, 0, sizeof(*w)); + w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); -+ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); ++ strscpy(w->whname, AUFS_WH_DR_INFO_PFX, sizeof(AUFS_WH_DR_INFO_PFX)); + w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; + w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); + w->btgt = btgt; @@ -11243,15 +11280,15 @@ diff -Naur null/fs/aufs/dirren.c linux-5.15.41/fs/aufs/dirren.c +out: + return err; +} -diff -Naur null/fs/aufs/dirren.h linux-5.15.41/fs/aufs/dirren.h +diff -Naur null/fs/aufs/dirren.h linux-6.12.30/fs/aufs/dirren.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dirren.h 2022-09-06 12:51:51.037709924 +0300 ++++ linux-6.12.30/fs/aufs/dirren.h 2025-05-27 19:28:00.102257451 +0300 @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima ++ * Copyright (C) 2017-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -11387,15 +11424,15 @@ diff -Naur null/fs/aufs/dirren.h linux-5.15.41/fs/aufs/dirren.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DIRREN_H__ */ -diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c +diff -Naur null/fs/aufs/dynop.c linux-6.12.30/fs/aufs/dynop.c --- /dev/null -+++ linux-5.15.41/fs/aufs/dynop.c 2022-09-06 12:51:51.037709924 +0300 -@@ -0,0 +1,368 @@ ++++ linux-6.12.30/fs/aufs/dynop.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,365 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima ++ * Copyright (C) 2010-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -11415,7 +11452,7 @@ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c + +#include "aufs.h" + -+#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) ++#define DyPrSym(key) AuDbgSym((void*)(key->dk_op.dy_hop)) + +/* + * How large will these lists be? @@ -11530,12 +11567,11 @@ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c + +#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) + ++#define DyDbgDeclare(cnt) unsigned int cnt __maybe_unused = 0 +#ifdef CONFIG_AUFS_DEBUG -+#define DyDbgDeclare(cnt) unsigned int cnt = 0 +#define DyDbgInc(cnt) do { cnt++; } while (0) +#else -+#define DyDbgDeclare(cnt) do {} while (0) -+#define DyDbgInc(cnt) do {} while (0) ++AuStubVoid(DyDbgInc, unsigned int cnt __maybe_unused); +#endif + +#define DySet(func, dst, src, h_op, h_sb) do { \ @@ -11569,28 +11605,26 @@ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c + AuDbg("%s\n", au_sbtype(h_sb)); + + DySetAop(writepage); -+ DySetAopForce(readpage); /* force */ ++ DySetAopForce(read_folio); /* force */ + DySetAop(writepages); -+ DySetAop(set_page_dirty); -+ DySetAop(readpages); ++ DySetAop(dirty_folio); ++ DySetAop(invalidate_folio); + DySetAop(readahead); + DySetAop(write_begin); + DySetAop(write_end); + DySetAop(bmap); -+ DySetAop(invalidatepage); -+ DySetAop(releasepage); -+ DySetAop(freepage); ++ DySetAop(release_folio); ++ DySetAop(free_folio); + /* this one will be changed according to an aufs mount option */ + DySetAop(direct_IO); -+ DySetAop(migratepage); -+ DySetAop(isolate_page); -+ DySetAop(putback_page); -+ DySetAop(launder_page); ++ DySetAop(migrate_folio); ++ DySetAop(launder_folio); + DySetAop(is_partially_uptodate); + DySetAop(is_dirty_writeback); -+ DySetAop(error_remove_page); ++ DySetAop(error_remove_folio); + DySetAop(swap_activate); + DySetAop(swap_deactivate); ++ DySetAop(swap_rw); + + DyDbgSize(cnt, *h_aop); +} @@ -11759,15 +11793,15 @@ diff -Naur null/fs/aufs/dynop.c linux-5.15.41/fs/aufs/dynop.c + for (i = 0; i < AuDyLast; i++) + WARN_ON(!hlist_bl_empty(dynop + i)); +} -diff -Naur null/fs/aufs/dynop.h linux-5.15.41/fs/aufs/dynop.h +diff -Naur null/fs/aufs/dynop.h linux-6.12.30/fs/aufs/dynop.h --- /dev/null -+++ linux-5.15.41/fs/aufs/dynop.h 2022-09-06 12:51:51.038709912 +0300 ++++ linux-6.12.30/fs/aufs/dynop.h 2025-05-27 19:28:00.102257451 +0300 @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima ++ * Copyright (C) 2010-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -11840,15 +11874,15 @@ diff -Naur null/fs/aufs/dynop.h linux-5.15.41/fs/aufs/dynop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_DYNOP_H__ */ -diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c +diff -Naur null/fs/aufs/export.c linux-6.12.30/fs/aufs/export.c --- /dev/null -+++ linux-5.15.41/fs/aufs/export.c 2022-09-06 12:51:51.038709912 +0300 -@@ -0,0 +1,830 @@ ++++ linux-6.12.30/fs/aufs/export.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,846 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -12140,17 +12174,33 @@ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c +{ + int err; + struct path root; ++ struct vfsmount *mnt; + struct au_compare_mnt_args args = { + .sb = sb + }; + + get_fs_root(current->fs, &root); ++ /* ++ * as long as this sb is alive, this temporary unlock is safe. ++ * Really? ++ */ ++ si_read_unlock(sb); ++ mnt = collect_mounts(&root); ++ if (IS_ERR(mnt)) { ++ args.mnt = mnt; ++ goto out; ++ } ++ + rcu_read_lock(); -+ err = iterate_mounts(au_compare_mnt, &args, root.mnt); ++ err = iterate_mounts(au_compare_mnt, &args, mnt); + rcu_read_unlock(); -+ path_put(&root); ++ drop_collected_mounts(mnt); + AuDebugOn(!err); ++ ++out: ++ si_noflush_read_lock(sb); + AuDebugOn(!args.mnt); ++ path_put(&root); + return args.mnt; +} + @@ -12192,7 +12242,7 @@ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c + int namelen; +}; + -+static int ++static bool +find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, + loff_t offset, u64 ino, unsigned int d_type) +{ @@ -12201,12 +12251,12 @@ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c + + a->called++; + if (a->ino != ino) -+ return 0; ++ return true; + + memcpy(a->name, name, namelen); + a->namelen = namelen; + a->found = 1; -+ return 1; ++ return false; +} + +static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, @@ -12674,15 +12724,15 @@ diff -Naur null/fs/aufs/export.c linux-5.15.41/fs/aufs/export.c + BUILD_BUG_ON(sizeof(u) != sizeof(int)); + atomic_set(&sbinfo->si_xigen_next, u); +} -diff -Naur null/fs/aufs/fhsm.c linux-5.15.41/fs/aufs/fhsm.c +diff -Naur null/fs/aufs/fhsm.c linux-6.12.30/fs/aufs/fhsm.c --- /dev/null -+++ linux-5.15.41/fs/aufs/fhsm.c 2022-09-06 12:51:51.038709912 +0300 -@@ -0,0 +1,427 @@ ++++ linux-6.12.30/fs/aufs/fhsm.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,426 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima ++ * Copyright (C) 2011-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -12693,8 +12743,7 @@ diff -Naur null/fs/aufs/fhsm.c linux-5.15.41/fs/aufs/fhsm.c + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ * along with this program. If not, see . + */ + +/* @@ -13105,15 +13154,15 @@ diff -Naur null/fs/aufs/fhsm.c linux-5.15.41/fs/aufs/fhsm.c + if (u != AUFS_FHSM_CACHE_DEF_SEC) + seq_printf(seq, ",fhsm_sec=%u", u); +} -diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c +diff -Naur null/fs/aufs/file.c linux-6.12.30/fs/aufs/file.c --- /dev/null -+++ linux-5.15.41/fs/aufs/file.c 2022-09-06 12:51:51.039709899 +0300 -@@ -0,0 +1,863 @@ ++++ linux-6.12.30/fs/aufs/file.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,858 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -13197,18 +13246,15 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c + au_lcnt_inc(&br->br_nfiles); + h_path.dentry = h_dentry; + h_path.mnt = au_br_mnt(br); ++ /* ++ * vfs::backing_file_open() looks promising since it can get rid of ++ * mm::vm_prfile approach from my mind. ++ * but I keep current approach for a while. ++ */ + h_file = vfsub_dentry_open(&h_path, flags); + if (IS_ERR(h_file)) + goto out_br; + -+ if (flags & __FMODE_EXEC) { -+ err = deny_write_access(h_file); -+ if (unlikely(err)) { -+ fput(h_file); -+ h_file = ERR_PTR(err); -+ goto out_br; -+ } -+ } + fsnotify_open(h_file); + goto out; /* success */ + @@ -13355,18 +13401,20 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c + AuDebugOn(IS_ERR_OR_NULL(dentry)); + di_write_lock_child(dentry); + err = au_cmoo(dentry); -+ di_downgrade_lock(dentry, AuLock_IR); + if (!err) { -+ if (!aopen) -+ err = args->open(file, vfsub_file_flags(file), NULL); -+ else { ++ if (!aopen) { ++ err = args->open(file, vfsub_file_flags(file), ++ au_di(dentry)->di_htmpfile); ++ di_write_unlock(dentry); ++ } else { ++ di_downgrade_lock(dentry, AuLock_IR); + lockdep_off(); + err = args->open(file, vfsub_file_flags(file), + args->h_file); + lockdep_on(); ++ di_read_unlock(dentry, AuLock_IR); + } + } -+ di_read_unlock(dentry, AuLock_IR); + + finfo = au_fi(file); + if (!err) { @@ -13441,6 +13489,7 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c + au_set_fbtop(file, btop); + au_set_h_fptr(file, btop, h_file); + au_update_figen(file); ++ file->f_mode |= h_file->f_mode & FMODE_CAN_ODIRECT; + /* todo: necessary? */ + /* file->f_ra = h_file->f_ra; */ + @@ -13509,7 +13558,7 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c + err = au_reopen_wh(file, bcpup, hi_wh); + + if (!err -+ && (inode->i_nlink > 1 ++ && (vfsub_inode_nlink(inode, AU_I_AUFS) > 1 + || (inode->i_state & I_LINKABLE)) + && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) + au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); @@ -13889,9 +13938,9 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c + +/* cf. aufs_nopage() */ +/* for madvise(2) */ -+static int aufs_readpage(struct file *file __maybe_unused, struct page *page) ++static int aufs_read_folio(struct file *file __maybe_unused, struct folio *folio) +{ -+ unlock_page(page); ++ folio_unlock(folio); + return 0; +} + @@ -13902,85 +13951,80 @@ diff -Naur null/fs/aufs/file.c linux-5.15.41/fs/aufs/file.c +/* they will never be called. */ +#ifdef CONFIG_AUFS_DEBUG +static int aufs_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned flags, -+ struct page **pagep, void **fsdata) ++ loff_t pos, unsigned len, ++ struct folio **foliop, void **fsdata) +{ AuUnsupport(); return 0; } +static int aufs_write_end(struct file *file, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, -+ struct page *page, void *fsdata) ++ struct folio *folio, void *fsdata) +{ AuUnsupport(); return 0; } +static int aufs_writepage(struct page *page, struct writeback_control *wbc) +{ AuUnsupport(); return 0; } + -+static int aufs_set_page_dirty(struct page *page) -+{ AuUnsupport(); return 0; } -+static void aufs_invalidatepage(struct page *page, unsigned int offset, -+ unsigned int length) ++static bool aufs_dirty_folio(struct address_space *mapping, struct folio *folio) ++{ AuUnsupport(); return true; } ++static void aufs_invalidate_folio(struct folio *folio, size_t offset, size_t len) +{ AuUnsupport(); } -+static int aufs_releasepage(struct page *page, gfp_t gfp) -+{ AuUnsupport(); return 0; } ++static bool aufs_release_folio(struct folio *folio, gfp_t gfp) ++{ AuUnsupport(); return true; } +#if 0 /* called by memory compaction regardless file */ -+static int aufs_migratepage(struct address_space *mapping, struct page *newpage, -+ struct page *page, enum migrate_mode mode) ++static int aufs_migrate_folio(struct address_space *mapping, struct folio *dst, ++ struct folio *src, enum migrate_mode mode) +{ AuUnsupport(); return 0; } +#endif -+static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) ++static int aufs_launder_folio(struct folio *folio) ++{ AuUnsupport(); return 0; } ++static bool aufs_is_partially_uptodate(struct folio *folio, size_t from, ++ size_t count) +{ AuUnsupport(); return true; } -+static void aufs_putback_page(struct page *page) -+{ AuUnsupport(); } -+static int aufs_launder_page(struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_is_partially_uptodate(struct page *page, -+ unsigned long from, -+ unsigned long count) -+{ AuUnsupport(); return 0; } -+static void aufs_is_dirty_writeback(struct page *page, bool *dirty, ++static void aufs_is_dirty_writeback(struct folio *folio, bool *dirty, + bool *writeback) +{ AuUnsupport(); } -+static int aufs_error_remove_page(struct address_space *mapping, -+ struct page *page) ++static int aufs_error_remove_folio(struct address_space *mapping, ++ struct folio *folio) +{ AuUnsupport(); return 0; } +static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, + sector_t *span) +{ AuUnsupport(); return 0; } +static void aufs_swap_deactivate(struct file *file) +{ AuUnsupport(); } ++static int aufs_swap_rw(struct kiocb *iocb, struct iov_iter *iter) ++{ AuUnsupport(); return 0; } +#endif /* CONFIG_AUFS_DEBUG */ + +const struct address_space_operations aufs_aop = { -+ .readpage = aufs_readpage, ++ .read_folio = aufs_read_folio, + .direct_IO = aufs_direct_IO, +#ifdef CONFIG_AUFS_DEBUG + .writepage = aufs_writepage, + /* no writepages, because of writepage */ -+ .set_page_dirty = aufs_set_page_dirty, ++ .dirty_folio = aufs_dirty_folio, + /* no readpages, because of readpage */ + .write_begin = aufs_write_begin, + .write_end = aufs_write_end, + /* no bmap, no block device */ -+ .invalidatepage = aufs_invalidatepage, -+ .releasepage = aufs_releasepage, ++ .invalidate_folio = aufs_invalidate_folio, ++ .release_folio = aufs_release_folio, + /* is fallback_migrate_page ok? */ -+ /* .migratepage = aufs_migratepage, */ -+ .isolate_page = aufs_isolate_page, -+ .putback_page = aufs_putback_page, -+ .launder_page = aufs_launder_page, ++ /* .migrate_folio = aufs_migrate_folio, */ ++ .launder_folio = aufs_launder_folio, + .is_partially_uptodate = aufs_is_partially_uptodate, + .is_dirty_writeback = aufs_is_dirty_writeback, -+ .error_remove_page = aufs_error_remove_page, ++ .error_remove_folio = aufs_error_remove_folio, + .swap_activate = aufs_swap_activate, -+ .swap_deactivate = aufs_swap_deactivate ++ .swap_deactivate = aufs_swap_deactivate, ++ .swap_rw = aufs_swap_rw +#endif /* CONFIG_AUFS_DEBUG */ +}; -diff -Naur null/fs/aufs/file.h linux-5.15.41/fs/aufs/file.h +diff -Naur null/fs/aufs/file.h linux-6.12.30/fs/aufs/file.h --- /dev/null -+++ linux-5.15.41/fs/aufs/file.h 2022-09-06 12:51:51.039709899 +0300 ++++ linux-6.12.30/fs/aufs/file.h 2025-05-27 19:28:00.102257451 +0300 @@ -0,0 +1,342 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -14280,7 +14324,7 @@ diff -Naur null/fs/aufs/file.h linux-5.15.41/fs/aufs/file.h +} + +#ifdef CONFIG_MMU -+#define AuDbgVmRegion(file, vma) do {} while (0) ++AuStubVoid(AuDbgVmRegion, struct file *file, struct vm_area_struct *vma) + +static inline void au_vm_file_reset(struct vm_area_struct *vma, + struct file *file) @@ -14318,15 +14362,15 @@ diff -Naur null/fs/aufs/file.h linux-5.15.41/fs/aufs/file.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_FILE_H__ */ -diff -Naur null/fs/aufs/finfo.c linux-5.15.41/fs/aufs/finfo.c +diff -Naur null/fs/aufs/finfo.c linux-6.12.30/fs/aufs/finfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/finfo.c 2022-09-06 12:51:51.039709899 +0300 -@@ -0,0 +1,149 @@ ++++ linux-6.12.30/fs/aufs/finfo.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -14348,8 +14392,6 @@ diff -Naur null/fs/aufs/finfo.c linux-5.15.41/fs/aufs/finfo.c + +void au_hfput(struct au_hfile *hf, int execed) +{ -+ if (execed) -+ allow_write_access(hf->hf_file); + fput(hf->hf_file); + hf->hf_file = NULL; + au_lcnt_dec(&hf->hf_br->br_nfiles); @@ -14471,15 +14513,15 @@ diff -Naur null/fs/aufs/finfo.c linux-5.15.41/fs/aufs/finfo.c +out: + return err; +} -diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c +diff -Naur null/fs/aufs/f_op.c linux-6.12.30/fs/aufs/f_op.c --- /dev/null -+++ linux-5.15.41/fs/aufs/f_op.c 2022-09-06 12:51:51.038709912 +0300 -@@ -0,0 +1,771 @@ ++++ linux-6.12.30/fs/aufs/f_op.c 2025-05-27 19:28:00.102257451 +0300 +@@ -0,0 +1,782 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -14538,16 +14580,22 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + /* br ref is already inc-ed */ + } + -+ if ((flags & __O_TMPFILE) -+ && !(flags & O_EXCL)) { -+ h_inode = file_inode(h_file); -+ spin_lock(&h_inode->i_lock); -+ h_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_inode->i_lock); ++ if (flags & __O_TMPFILE) { ++ AuDebugOn(!h_file); ++ AuDebugOn(h_file != au_di(dentry)->di_htmpfile); ++ au_di(dentry)->di_htmpfile = NULL; ++ ++ if (!(flags & O_EXCL)) { ++ h_inode = file_inode(h_file); ++ spin_lock(&h_inode->i_lock); ++ h_inode->i_state |= I_LINKABLE; ++ spin_unlock(&h_inode->i_lock); ++ } + } + au_set_fbtop(file, bindex); + au_set_h_fptr(file, bindex, h_file); + au_update_figen(file); ++ file->f_mode |= h_file->f_mode & FMODE_CAN_ODIRECT; + /* todo: necessary? */ + /* file->f_ra = h_file->f_ra; */ + @@ -14695,6 +14743,7 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + if (do_ready) + au_unpin(&pin); + di_read_unlock(dentry, /*flags*/0); ++ vfsub_file_start_write(h_file); + +out_fi: + fi_write_unlock(file); @@ -14707,6 +14756,7 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c +{ + struct inode *h_inode; + ++ vfsub_file_end_write(h_file); + au_cpup_attr_timesizes(inode); + AuDebugOn(au_ibtop(inode) != wpre->btop); + h_inode = file_inode(h_file); @@ -14768,7 +14818,12 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + } else + /* currently there is no such fs */ + WARN_ON_ONCE(1); -+ kio->ki_filp = file; ++ if (!is_sync_kiocb(kio)) { ++ /* do not restore ki_filp */ ++ fput(file); ++ get_file(h_file); ++ } else ++ kio->ki_filp = file; + +out: + return err; @@ -14826,7 +14881,12 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + err = PTR_ERR(h_file); + if (IS_ERR(h_file)) + goto out; -+ ++ if (!is_sync_kiocb(kio)) { ++ /* .vs. sb_start_write() in aio_write() */ ++ if (S_ISREG(inode->i_mode)) ++ __sb_writers_acquired(inode->i_sb, SB_FREEZE_WRITE); ++ file_end_write(file); ++ } + err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); + au_write_post(inode, h_file, &wpre, err); + @@ -14863,7 +14923,7 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + if (IS_ERR(h_file)) + goto out; + -+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); ++ err = vfsub_splice_read(h_file, ppos, pipe, len, flags); + /* todo: necessary? */ + /* file->f_ra = h_file->f_ra; */ + au_read_post(inode, h_file); @@ -14920,6 +14980,10 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + lockdep_off(); + err = vfs_fallocate(h_file, mode, offset, len); + lockdep_on(); ++ /* ++ * we don't need to call file_modifed() here since au_write_post() ++ * is equivalent and copies-up all timestamps and permission bits. ++ */ + au_write_post(inode, h_file, &wpre, /*written*/1); + +out: @@ -15204,16 +15268,6 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + +/* ---------------------------------------------------------------------- */ + -+/* no one supports this operation, currently */ -+#if 0 /* reserved for future use */ -+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, -+ size_t len, loff_t *pos, int more) -+{ -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ +const struct file_operations aufs_file_fop = { + .owner = THIS_MODULE, + @@ -15235,7 +15289,6 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + .release = aufs_release_nondir, + .fsync = aufs_fsync_nondir, + .fasync = aufs_fasync, -+ /* .sendpage = aufs_sendpage, */ + .setfl = aufs_setfl, + .splice_write = aufs_splice_write, + .splice_read = aufs_splice_read, @@ -15246,15 +15299,15 @@ diff -Naur null/fs/aufs/f_op.c linux-5.15.41/fs/aufs/f_op.c + .fallocate = aufs_fallocate, + .copy_file_range = aufs_copy_file_range +}; -diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c +diff -Naur null/fs/aufs/fsctx.c linux-6.12.30/fs/aufs/fsctx.c --- /dev/null -+++ linux-5.15.41/fs/aufs/fsctx.c 2022-09-06 12:51:51.039709899 +0300 -@@ -0,0 +1,1242 @@ ++++ linux-6.12.30/fs/aufs/fsctx.c 2025-05-27 19:28:00.103257438 +0300 +@@ -0,0 +1,1244 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2022 Junjiro R. Okajima ++ * Copyright (C) 2022-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -15312,6 +15365,8 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c + + root = fc->root; + sb = root->d_sb; ++ root = sb->s_root; /* "bind"-mount may give us non-root */ ++ AuDebugOn(!IS_ROOT(root)); + err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); + if (!err) { + di_write_lock_child(root); @@ -15345,7 +15400,8 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c +out: + inode_unlock(inode); + err = cvt_err(err); -+ AuTraceErr(err); ++ if (unlikely(err)) ++ pr_err("remount err %d\n", err); + + return err; +} @@ -15369,8 +15425,7 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c + au_sbilist_add(sb); + + /* all timestamps always follow the ones on the branch */ -+ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; -+ sb->s_flags |= SB_I_VERSION; /* do we really need this? */ ++ sb->s_flags |= SB_NOATIME | SB_NODIRATIME | SB_I_VERSION; + sb->s_op = &aufs_sop; + sb->s_d_op = &aufs_dop; + sb->s_magic = AUFS_SUPER_MAGIC; @@ -16492,15 +16547,15 @@ diff -Naur null/fs/aufs/fsctx.c linux-5.15.41/fs/aufs/fsctx.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/fstype.h linux-5.15.41/fs/aufs/fstype.h +diff -Naur null/fs/aufs/fstype.h linux-6.12.30/fs/aufs/fstype.h --- /dev/null -+++ linux-5.15.41/fs/aufs/fstype.h 2022-09-06 12:51:51.039709899 +0300 -@@ -0,0 +1,401 @@ ++++ linux-6.12.30/fs/aufs/fstype.h 2025-05-27 19:28:00.103257438 +0300 +@@ -0,0 +1,419 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -16745,6 +16800,15 @@ diff -Naur null/fs/aufs/fstype.h linux-5.15.41/fs/aufs/fstype.h +#endif +} + ++static inline int au_test_f2fs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_F2FS_FS) ++ return sb->s_magic == F2FS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ +/* ---------------------------------------------------------------------- */ +/* + * they can't be an aufs branch. @@ -16895,17 +16959,26 @@ diff -Naur null/fs/aufs/fstype.h linux-5.15.41/fs/aufs/fstype.h + && !nfs_server_capable(inode, NFS_CAP_ACLS); +} + ++/* ++ * filesystems which requires inode-lock in open. ++ */ ++static inline int au_test_fs_unlock_for_open(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_f2fs(sb); ++} ++ +#endif /* __KERNEL__ */ +#endif /* __AUFS_FSTYPE_H__ */ -diff -Naur null/fs/aufs/hbl.h linux-5.15.41/fs/aufs/hbl.h +diff -Naur null/fs/aufs/hbl.h linux-6.12.30/fs/aufs/hbl.h --- /dev/null -+++ linux-5.15.41/fs/aufs/hbl.h 2022-09-06 12:51:51.039709899 +0300 ++++ linux-6.12.30/fs/aufs/hbl.h 2025-05-27 19:28:00.103257438 +0300 @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima ++ * Copyright (C) 2017-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -16966,15 +17039,15 @@ diff -Naur null/fs/aufs/hbl.h linux-5.15.41/fs/aufs/hbl.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_HBL_H__ */ -diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c +diff -Naur null/fs/aufs/hfsnotify.c linux-6.12.30/fs/aufs/hfsnotify.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hfsnotify.c 2022-09-06 12:51:51.040709887 +0300 -@@ -0,0 +1,288 @@ ++++ linux-6.12.30/fs/aufs/hfsnotify.c 2025-05-27 19:28:00.103257438 +0300 +@@ -0,0 +1,290 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -17142,7 +17215,8 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c + struct inode *h_dir, *h_inode; + struct fsnotify_mark *inode_mark; + -+ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); ++ AuDebugOn(!(data_type == FSNOTIFY_EVENT_INODE ++ || data_type == FSNOTIFY_EVENT_DENTRY)); + + err = 0; + /* if FS_UNMOUNT happens, there must be another bug */ @@ -17154,11 +17228,11 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c + h_inode = NULL; +#ifdef AuDbgHnotify + au_debug_on(); -+ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 -+ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { ++ if (1 || file_name.len != sizeof(AUFS_XINO_FNAME) - 1 ++ || strncmp(file_name.name, AUFS_XINO_FNAME, file_name.len)) { + AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", + h_dir->i_ino, mask, au_hfsn_name(mask), -+ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); ++ AuLNPair(file_name), h_inode ? h_inode->i_ino : 0); + /* WARN_ON(1); */ + } + au_debug_off(); @@ -17210,7 +17284,8 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c + goto out; + + err = 0; -+ group = fsnotify_alloc_group(&au_hfsn_ops); ++ group = fsnotify_alloc_group(&au_hfsn_ops, ++ /*flags - not for userspace*/0); + if (IS_ERR(group)) { + err = PTR_ERR(group); + pr_err("fsnotify_alloc_group() failed, %d\n", err); @@ -17258,15 +17333,15 @@ diff -Naur null/fs/aufs/hfsnotify.c linux-5.15.41/fs/aufs/hfsnotify.c + .fin_br = au_hfsn_fin_br, + .init_br = au_hfsn_init_br +}; -diff -Naur null/fs/aufs/hfsplus.c linux-5.15.41/fs/aufs/hfsplus.c +diff -Naur null/fs/aufs/hfsplus.c linux-6.12.30/fs/aufs/hfsplus.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hfsplus.c 2022-09-06 12:51:51.040709887 +0300 ++++ linux-6.12.30/fs/aufs/hfsplus.c 2025-05-27 19:28:00.103257438 +0300 @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima ++ * Copyright (C) 2010-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -17322,15 +17397,15 @@ diff -Naur null/fs/aufs/hfsplus.c linux-5.15.41/fs/aufs/hfsplus.c + au_lcnt_dec(&br->br_nfiles); + } +} -diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c +diff -Naur null/fs/aufs/hnotify.c linux-6.12.30/fs/aufs/hnotify.c --- /dev/null -+++ linux-5.15.41/fs/aufs/hnotify.c 2022-09-06 12:51:51.040709887 +0300 ++++ linux-6.12.30/fs/aufs/hnotify.c 2025-05-27 19:28:00.103257438 +0300 @@ -0,0 +1,715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -17600,12 +17675,12 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c +/* ---------------------------------------------------------------------- */ + +/* hnotify job flags */ -+#define AuHnJob_XINO0 1 -+#define AuHnJob_GEN (1 << 1) -+#define AuHnJob_DIRENT (1 << 2) -+#define AuHnJob_ISDIR (1 << 3) -+#define AuHnJob_TRYXINO0 (1 << 4) -+#define AuHnJob_MNTPNT (1 << 5) ++#define AuHnJob_XINO0 BIT(0) ++#define AuHnJob_GEN BIT(1) ++#define AuHnJob_DIRENT BIT(2) ++#define AuHnJob_ISDIR BIT(3) ++#define AuHnJob_TRYXINO0 BIT(4) ++#define AuHnJob_MNTPNT BIT(5) +#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) +#define au_fset_hnjob(flags, name) \ + do { (flags) |= AuHnJob_##name; } while (0) @@ -17647,7 +17722,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c + && a->inode + && a->h_inode) { + inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink ++ if (!vfsub_inode_nlink(a->h_inode, AU_I_BRANCH) + && !(a->h_inode->i_state & I_LINKABLE)) + hn_xino(a->inode, a->h_inode); /* ignore this error */ + inode_unlock_shared(a->h_inode); @@ -17698,7 +17773,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c + + dentry = NULL; + spin_lock(&parent->d_lock); -+ list_for_each_entry(d, &parent->d_subdirs, d_child) { ++ hlist_for_each_entry(d, &parent->d_children, d_sib) { + /* AuDbg("%pd\n", d); */ + spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); + dname = &d->d_name; @@ -17961,7 +18036,7 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c + + /* NFS fires the event for silly-renamed one from kworker */ + f = 0; -+ if (!dir->i_nlink ++ if (!vfsub_inode_nlink(dir, AU_I_AUFS) + || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) + f = AuWkq_NEST; + err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); @@ -18041,15 +18116,15 @@ diff -Naur null/fs/aufs/hnotify.c linux-5.15.41/fs/aufs/hnotify.c + if (au_cache[AuCache_HNOTIFY]) + au_hn_destroy_cache(); +} -diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c +diff -Naur null/fs/aufs/iinfo.c linux-6.12.30/fs/aufs/iinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/iinfo.c 2022-09-06 12:51:51.041709874 +0300 -@@ -0,0 +1,286 @@ ++++ linux-6.12.30/fs/aufs/iinfo.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,287 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -18194,7 +18269,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c + + h_i = au_hinode(iinfo, bindex)->hi_inode; + if (h_i -+ && !h_i->i_nlink ++ && !vfsub_inode_nlink(h_i, AU_I_BRANCH) + && !(h_i->i_state & I_LINKABLE)) + au_set_h_iptr(inode, bindex, NULL, 0); + } @@ -18227,6 +18302,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c + spin_lock_init(&iinfo->ii_generation.ig_spin); + au_rw_init(&iinfo->ii_rwsem); + inode_init_once(&c->vfs_inode); ++ spin_lock_init(&c->nlink_spin); +} + +void au_hinode_init(struct au_hinode *hinode) @@ -18294,7 +18370,7 @@ diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c + struct au_hinode *hi; + struct super_block *sb; + aufs_bindex_t bindex, bbot; -+ const unsigned char unlinked = !inode->i_nlink; ++ const unsigned char unlinked = !vfsub_inode_nlink(inode, AU_I_AUFS); + + AuDebugOn(au_is_bad_inode(inode)); + @@ -18331,15 +18407,15 @@ diff -Naur null/fs/aufs/iinfo.c linux-5.15.41/fs/aufs/iinfo.c + au_kfree_rcu(iinfo->ii_hinode); + AuRwDestroy(&iinfo->ii_rwsem); +} -diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c +diff -Naur null/fs/aufs/inode.c linux-6.12.30/fs/aufs/inode.c --- /dev/null -+++ linux-5.15.41/fs/aufs/inode.c 2022-09-06 12:51:51.041709874 +0300 -@@ -0,0 +1,531 @@ ++++ linux-6.12.30/fs/aufs/inode.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,532 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -18611,7 +18687,7 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + } + au_cpup_attr_all(inode, /*force*/1); + /* -+ * to force calling aufs_get_acl() every time, ++ * to force calling aufs_get_inode_acl() every time, + * do not call cache_no_acl() for aufs inode. + */ + @@ -18639,7 +18715,7 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + * it can happen by UDBA and the obsoleted inode number. + */ + err = -EIO; -+ if (unlikely(inode->i_ino == parent_ino(dentry))) ++ if (unlikely(inode->i_ino == d_parent_ino(dentry))) + goto out; + + err = 1; @@ -18721,7 +18797,7 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + h_dentry = au_h_dptr(dentry, btop); + h_inode = d_inode(h_dentry); + h_ino = h_inode->i_ino; -+ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; ++ hlinked = !d_is_dir(h_dentry) && vfsub_inode_nlink(h_inode, AU_I_BRANCH) > 1; + +new_ino: + /* @@ -18754,7 +18830,7 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + if (IS_ERR(inode)) + goto out_xinondir; + -+ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); ++ AuDbg("%x, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); + if (inode->i_state & I_NEW) { + ii_write_lock_new_child(inode); + err = set_inode(inode, dentry); @@ -18774,7 +18850,8 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + au_xino_write(sb, btop, h_ino, /*ino*/0); + /* ignore this error */ + goto out_iput; -+ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { ++ } else if (!must_new && !IS_DEADDIR(inode) ++ && vfsub_inode_nlink(inode, AU_I_AUFS)) { + /* + * horrible race condition between lookup, readdir and copyup + * (or something). @@ -18849,32 +18926,32 @@ diff -Naur null/fs/aufs/inode.c linux-5.15.41/fs/aufs/inode.c + return err; +} + -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, ++int au_test_h_perm(struct mnt_idmap *h_idmap, struct inode *h_inode, + int mask) +{ + if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) + return 0; -+ return inode_permission(h_userns, h_inode, mask); ++ return inode_permission(h_idmap, h_inode, mask); +} + -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, ++int au_test_h_perm_sio(struct mnt_idmap *h_idmap, struct inode *h_inode, + int mask) +{ + if (au_test_nfs(h_inode->i_sb) + && (mask & MAY_WRITE) + && S_ISDIR(h_inode->i_mode)) + mask |= MAY_READ; /* force permission check */ -+ return au_test_h_perm(h_userns, h_inode, mask); ++ return au_test_h_perm(h_idmap, h_inode, mask); +} -diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +diff -Naur null/fs/aufs/inode.h linux-6.12.30/fs/aufs/inode.h --- /dev/null -+++ linux-5.15.41/fs/aufs/inode.h 2022-09-06 12:51:51.042709862 +0300 -@@ -0,0 +1,705 @@ ++++ linux-6.12.30/fs/aufs/inode.h 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,727 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -18898,6 +18975,7 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +#ifdef __KERNEL__ + +#include ++#include "fstype.h" +#include "rwsem.h" + +struct vfsmount; @@ -18952,13 +19030,14 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +struct au_icntnr { + struct au_iinfo iinfo; + struct inode vfs_inode; ++ spinlock_t nlink_spin; /* protects vfs_inode.i_nlink */ + struct hlist_bl_node plink; + struct rcu_head rcu; +} ____cacheline_aligned_in_smp; + +/* au_pin flags */ -+#define AuPin_DI_LOCKED 1 -+#define AuPin_MNT_WRITE (1 << 1) ++#define AuPin_DI_LOCKED BIT(0) ++#define AuPin_MNT_WRITE BIT(1) +#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) +#define au_fset_pin(flags, name) \ + do { (flags) |= AuPin_##name; } while (0) @@ -18997,6 +19076,24 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h + return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); +} + ++static inline void au_nlink_lock(struct inode *inode) ++{ ++ spinlock_t *spin; ++ ++ AuDebugOn(!au_test_aufs(inode->i_sb)); ++ AuDebugOn(is_bad_inode(inode)); ++ spin = &(container_of(inode, struct au_icntnr, vfs_inode)->nlink_spin); ++ spin_lock(spin); ++} ++ ++static inline void au_nlink_unlock(struct inode *inode) ++{ ++ spinlock_t *spin; ++ ++ spin = &(container_of(inode, struct au_icntnr, vfs_inode)->nlink_spin); ++ spin_unlock(spin); ++} ++ +/* ---------------------------------------------------------------------- */ + +/* inode.c */ @@ -19009,9 +19106,9 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +struct inode *au_new_inode(struct dentry *dentry, int must_new); +int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, + struct inode *inode); -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, ++int au_test_h_perm(struct mnt_idmap *h_idmap, struct inode *h_inode, + int mask); -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, ++int au_test_h_perm_sio(struct mnt_idmap *h_idmap, struct inode *h_inode, + int mask); + +static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, @@ -19035,9 +19132,9 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h + aufs_iop_nogetattr[AuIop_Last]; + +/* au_wr_dir flags */ -+#define AuWrDir_ADD_ENTRY 1 -+#define AuWrDir_ISDIR (1 << 1) -+#define AuWrDir_TMPFILE (1 << 2) ++#define AuWrDir_ADD_ENTRY BIT(0) ++#define AuWrDir_ISDIR BIT(1) ++#define AuWrDir_TMPFILE BIT(2) +#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) +#define au_fset_wrdir(flags, name) \ + do { (flags) |= AuWrDir_##name; } while (0) @@ -19087,20 +19184,20 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +/* i_op_add.c */ +int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, + struct dentry *h_parent, int isdir); -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, ++int aufs_mknod(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode, dev_t dev); -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, ++int aufs_symlink(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, const char *symname); -+int aufs_create(struct user_namespace *userns, struct inode *dir, ++int aufs_create(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode, bool want_excl); +struct vfsub_aopen_args; +int au_aopen_or_create(struct inode *dir, struct dentry *dentry, + struct vfsub_aopen_args *args); -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode); ++int aufs_tmpfile(struct mnt_idmap *idmap, struct inode *dir, ++ struct file *file, umode_t mode); +int aufs_link(struct dentry *src_dentry, struct inode *dir, + struct dentry *dentry); -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, ++int aufs_mkdir(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode); + +/* i_op_del.c */ @@ -19112,7 +19209,7 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h + +/* i_op_ren.c */ +int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); -+int aufs_rename(struct user_namespace *userns, ++int aufs_rename(struct mnt_idmap *idmap, + struct inode *_src_dir, struct dentry *_src_dentry, + struct inode *_dst_dir, struct dentry *_dst_dentry, + unsigned int _flags); @@ -19125,8 +19222,8 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +unsigned int au_hi_flags(struct inode *inode, int isdir); + +/* hinode flags */ -+#define AuHi_XINO 1 -+#define AuHi_HNOTIFY (1 << 1) ++#define AuHi_XINO BIT(0) ++#define AuHi_HNOTIFY BIT(1) +#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) +#define au_fset_hi(flags, name) \ + do { (flags) |= AuHi_##name; } while (0) @@ -19196,8 +19293,10 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h +#endif + +#ifdef CONFIG_FS_POSIX_ACL -+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 *aufs_get_inode_acl(struct inode *inode, int type, bool rcu); ++struct posix_acl *aufs_get_acl(struct mnt_idmap *idmap, ++ struct dentry *dentry, int type); ++int aufs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, + struct posix_acl *acl, int type); +#endif + @@ -19575,15 +19674,15 @@ diff -Naur null/fs/aufs/inode.h linux-5.15.41/fs/aufs/inode.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_INODE_H__ */ -diff -Naur null/fs/aufs/ioctl.c linux-5.15.41/fs/aufs/ioctl.c +diff -Naur null/fs/aufs/ioctl.c linux-6.12.30/fs/aufs/ioctl.c --- /dev/null -+++ linux-5.15.41/fs/aufs/ioctl.c 2022-09-06 12:51:51.042709862 +0300 ++++ linux-6.12.30/fs/aufs/ioctl.c 2025-05-27 19:28:00.105257413 +0300 @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -19799,15 +19898,15 @@ diff -Naur null/fs/aufs/ioctl.c linux-5.15.41/fs/aufs/ioctl.c + return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); +} +#endif -diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c +diff -Naur null/fs/aufs/i_op_add.c linux-6.12.30/fs/aufs/i_op_add.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_add.c 2022-09-06 12:51:51.041709874 +0300 -@@ -0,0 +1,941 @@ ++++ linux-6.12.30/fs/aufs/i_op_add.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,971 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -19928,7 +20027,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + if (unlikely(d_is_negative(h_dentry))) + goto out; + h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + goto out; + + h_mode = h_inode->i_mode; @@ -20171,7 +20270,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + return err; +} + -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, ++int aufs_mknod(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode, dev_t dev) +{ + struct simple_arg arg = { @@ -20184,7 +20283,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + return add_simple(dir, dentry, &arg); +} + -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, ++int aufs_symlink(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, const char *symname) +{ + struct simple_arg arg = { @@ -20194,7 +20293,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + return add_simple(dir, dentry, &arg); +} + -+int aufs_create(struct user_namespace *userns, struct inode *dir, ++int aufs_create(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode, bool want_excl) +{ + struct simple_arg arg = { @@ -20222,16 +20321,19 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + return add_simple(dir, dentry, &arg); +} + -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode) ++int aufs_tmpfile(struct mnt_idmap *idmap, struct inode *dir, ++ struct file *file, umode_t mode) +{ + int err; + aufs_bindex_t bindex; ++ struct path h_ppath; + struct super_block *sb; -+ struct dentry *parent, *h_parent, *h_dentry; ++ struct au_branch *br; ++ struct dentry *dentry, *parent, *h_parent, *h_dentry; + struct inode *h_dir, *inode; + struct vfsmount *h_mnt; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; ++ struct file *h_file; + struct au_wr_dir_args wr_dir_args = { + .force_btgt = -1, + .flags = AuWrDir_TMPFILE @@ -20240,11 +20342,13 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + /* copy-up may happen */ + inode_lock(dir); + ++ h_file = NULL; + sb = dir->i_sb; + err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); + if (unlikely(err)) + goto out; + ++ dentry = file->f_path.dentry; + err = au_di_init(dentry); + if (unlikely(err)) + goto out_si; @@ -20273,19 +20377,25 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + if (unlikely(!h_dir->i_op->tmpfile)) + goto out_parent; + -+ h_mnt = au_sbr_mnt(sb, bindex); ++ br = au_sbr(sb, bindex); ++ h_mnt = au_br_mnt(br); + err = vfsub_mnt_want_write(h_mnt); + if (unlikely(err)) + goto out_parent; + -+ h_userns = mnt_user_ns(h_mnt); ++ h_idmap = mnt_idmap(h_mnt); + h_parent = au_h_dptr(parent, bindex); -+ h_dentry = vfs_tmpfile(h_userns, h_parent, mode, /*open_flag*/0); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); ++ h_ppath.mnt = h_mnt; ++ h_ppath.dentry = h_parent; ++ h_file = kernel_tmpfile_open(h_idmap, &h_ppath, mode, /*open_flag*/0, ++ current_cred()); ++ if (IS_ERR(h_file)) { ++ err = PTR_ERR(h_file); ++ h_file = NULL; + goto out_mnt; + } + ++ h_dentry = h_file->f_path.dentry; + au_set_dbtop(dentry, bindex); + au_set_dbbot(dentry, bindex); + au_set_h_dptr(dentry, bindex, dget(h_dentry)); @@ -20295,32 +20405,51 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + au_set_h_dptr(dentry, bindex, NULL); + au_set_dbtop(dentry, -1); + au_set_dbbot(dentry, -1); -+ } else { -+ if (!inode->i_nlink) -+ set_nlink(inode, 1); -+ d_tmpfile(dentry, inode); -+ au_di(dentry)->di_tmpfile = 1; -+ -+ /* update without i_mutex */ -+ if (au_ibtop(dir) == au_dbtop(dentry)) -+ au_cpup_attr_timesizes(dir); ++ goto out_h_file; + } -+ dput(h_dentry); + ++ vfsub_inode_nlink_init(inode, 1); ++ d_tmpfile(file, inode); ++ au_di(dentry)->di_tmpfile = 1; ++ get_file(h_file); ++ au_di(dentry)->di_htmpfile = h_file; ++ ++ /* update without i_mutex */ ++ if (au_ibtop(dir) == au_dbtop(dentry)) ++ au_cpup_attr_timesizes(dir); ++ ++out_h_file: ++ fput(h_file); +out_mnt: + vfsub_mnt_drop_write(h_mnt); +out_parent: + di_write_unlock(parent); + dput(parent); + di_write_unlock(dentry); -+ if (unlikely(err)) { -+ au_di_fin(dentry); -+ dentry->d_fsdata = NULL; -+ } ++ if (!err) ++ goto out_si; ++ if (h_file) ++ fput(h_file); ++ au_di(dentry)->di_htmpfile = NULL; ++ au_di_fin(dentry); ++ dentry->d_fsdata = NULL; +out_si: + si_read_unlock(sb); ++ if (!err && h_file) { ++ /* finally... */ ++ err = finish_open_simple(file, err); ++ if (!err) ++ au_lcnt_inc(&br->br_nfiles); ++ else { ++ fput(h_file); ++ au_di(dentry)->di_htmpfile = NULL; ++ au_di_fin(dentry); ++ dentry->d_fsdata = NULL; ++ } ++ } +out: + inode_unlock(dir); ++ AuTraceErr(err); + return err; +} + @@ -20384,7 +20513,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + inode = d_inode(src_dentry); + if (au_ibtop(inode) <= a->bdst) + h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { ++ if (!h_inode || !vfsub_inode_nlink(h_inode, AU_I_BRANCH)) { + /* copyup src_dentry as the name of dentry. */ + bbot = au_dbbot(dentry); + if (bbot < a->bsrc) @@ -20597,8 +20726,8 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + + au_dir_ts(dir, a->bdst); + inode_inc_iversion(dir); -+ inc_nlink(inode); -+ inode->i_ctime = dir->i_ctime; ++ vfsub_inc_nlink(inode); ++ inode_set_ctime_to_ts(inode, inode_get_ctime(dir)); + d_instantiate(dentry, au_igrab(inode)); + if (d_unhashed(a->h_path.dentry)) + /* some filesystem calls d_drop() */ @@ -20636,7 +20765,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + return err; +} + -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, ++int aufs_mkdir(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode) +{ + int err, rerr; @@ -20702,7 +20831,7 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c + + err = epilog(dir, bindex, wh_dentry, dentry); + if (!err) { -+ inc_nlink(dir); ++ vfsub_inc_nlink(dir); + goto out_unpin; /* success */ + } + @@ -20744,15 +20873,15 @@ diff -Naur null/fs/aufs/i_op_add.c linux-5.15.41/fs/aufs/i_op_add.c +out: + return err; +} -diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c +diff -Naur null/fs/aufs/i_op.c linux-6.12.30/fs/aufs/i_op.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op.c 2022-09-06 12:51:51.040709887 +0300 -@@ -0,0 +1,1512 @@ ++++ linux-6.12.30/fs/aufs/i_op.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,1526 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -20771,6 +20900,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + */ + +#include ++#include +#include +#include +#include @@ -20781,7 +20911,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c +{ + int err; + const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + err = -EPERM; + if (write_mask && IS_IMMUTABLE(h_inode)) @@ -20801,21 +20931,22 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' + * in this case, generic_permission() returns -EOPNOTSUPP. + */ -+ h_userns = mnt_user_ns(h_path->mnt); ++ h_idmap = mnt_idmap(h_path->mnt); + if ((write_mask && !au_br_writable(brperm)) + || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) + && write_mask && !(mask & MAY_READ)) + || !h_inode->i_op->permission) { + /* AuLabel(generic_permission); */ -+ /* AuDbg("get_acl %ps\n", h_inode->i_op->get_acl); */ -+ err = generic_permission(h_userns, h_inode, mask); ++ /* AuDbg("get_inode_acl %ps\n", ++ h_inode->i_op->get_inode_acl); */ ++ err = generic_permission(h_idmap, h_inode, mask); + if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) -+ err = h_inode->i_op->permission(h_userns, h_inode, ++ err = h_inode->i_op->permission(h_idmap, h_inode, + mask); + AuTraceErr(err); + } else { + /* AuLabel(h_inode->permission); */ -+ err = h_inode->i_op->permission(h_userns, h_inode, mask); ++ err = h_inode->i_op->permission(h_idmap, h_inode, mask); + AuTraceErr(err); + } + @@ -20828,7 +20959,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + return err; +} + -+static int aufs_permission(struct user_namespace *userns, struct inode *inode, ++static int aufs_permission(struct mnt_idmap *idmap, struct inode *inode, + int mask) +{ + int err; @@ -21376,7 +21507,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + continue; + if (d_is_positive(h_d[i])) { + h_i = d_inode(h_d[i]); -+ err = !h_i->i_nlink; ++ err = !vfsub_inode_nlink(h_i, AU_I_BRANCH); + } + } + @@ -21386,7 +21517,13 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + +static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) +{ ++ AuRwMustWriteLock(&p->hdir->hi_inode->i_rwsem); ++#ifndef CONFIG_PREEMPT_RT + atomic_long_set(&p->hdir->hi_inode->i_rwsem.owner, (long)task); ++#else ++ p->hdir->hi_inode->i_rwsem.rwbase.rtmutex.owner = task; ++ smp_mb(); /* advertise the owner */ ++#endif +} + +void au_pin_hdir_acquire_nest(struct au_pin *p) @@ -21677,7 +21814,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + return err; +} + -+static int aufs_setattr(struct user_namespace *userns, struct dentry *dentry, ++static int aufs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *ia) +{ + int err; @@ -21685,12 +21822,12 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + struct super_block *sb; + struct file *file; + struct au_icpup_args *a; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + inode = d_inode(dentry); + IMustLock(inode); + -+ err = setattr_prepare(userns, dentry, ia); ++ err = setattr_prepare(idmap, dentry, ia); + if (unlikely(err)) + goto out; + @@ -21784,8 +21921,8 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + * why don't all acl-aware fs call this func from their ->setattr()? + */ + if (!err && (ia->ia_valid & ATTR_MODE)) { -+ h_userns = mnt_user_ns(a->h_path.mnt); -+ err = vfsub_acl_chmod(h_userns, a->h_inode, ia->ia_mode); ++ h_idmap = mnt_idmap(a->h_path.mnt); ++ err = vfsub_acl_chmod(h_idmap, a->h_path.dentry, ia->ia_mode); + } + if (!err) + au_cpup_attr_changeable(inode); @@ -21848,7 +21985,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + struct super_block *sb; + struct au_icpup_args *a; + struct inode *h_inode; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + IMustLock(inode); + @@ -21867,13 +22004,13 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + err = au_h_path_to_set_attr(dentry, a, &h_path); + if (unlikely(err)) + goto out_di; -+ h_userns = mnt_user_ns(h_path.mnt); ++ h_idmap = mnt_idmap(h_path.mnt); + + inode_unlock(a->h_inode); + switch (arg->type) { + case AU_XATTR_SET: + AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfsub_setxattr(h_userns, h_path.dentry, ++ err = vfsub_setxattr(h_idmap, h_path.dentry, + arg->u.set.name, arg->u.set.value, + arg->u.set.size, arg->u.set.flags); + break; @@ -21882,7 +22019,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + h_inode = d_inode(h_path.dentry); + if (h_inode->i_op->set_acl) { + /* this will call posix_acl_update_mode */ -+ err = h_inode->i_op->set_acl(h_userns, h_inode, ++ err = h_inode->i_op->set_acl(h_idmap, h_path.dentry, + arg->u.acl_set.acl, + arg->u.acl_set.type); + } @@ -21915,18 +22052,17 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + /* don't i_[ug]id_write() here */ + inode->i_uid = st->uid; + inode->i_gid = st->gid; -+ inode->i_atime = st->atime; -+ inode->i_mtime = st->mtime; -+ inode->i_ctime = st->ctime; ++ inode_set_atime_to_ts(inode, st->atime); ++ inode_set_mtime_to_ts(inode, st->mtime); ++ inode_set_ctime_to_ts(inode, st->ctime); + + au_cpup_attr_nlink(inode, /*force*/0); + if (S_ISDIR(inode->i_mode)) { -+ n = inode->i_nlink; ++ n = vfsub_inode_nlink(inode, AU_I_AUFS); + n -= nlink; + n += st->nlink; -+ smp_mb(); /* for i_nlink */ + /* 0 can happen */ -+ set_nlink(inode, n); ++ vfsub_set_nlink(inode, n); + } + + spin_lock(&inode->i_lock); @@ -22016,7 +22152,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + return err; +} + -+static int aufs_getattr(struct user_namespace *userns, const struct path *path, ++static int aufs_getattr(struct mnt_idmap *idmap, const struct path *path, + struct kstat *st, u32 request, unsigned int query) +{ + int err; @@ -22041,20 +22177,25 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + goto out_fill; /* pretending success */ + + positive = d_is_positive(h_path.dentry); -+ if (positive) ++ if (positive) { + /* no vfsub version */ -+ err = vfs_getattr(&h_path, st, request, query); ++ if (query & AT_GETATTR_NOSEC) ++ err = vfs_getattr_nosec(&h_path, st, request, query); ++ else ++ err = vfs_getattr(&h_path, st, request, query); ++ } + if (!err) { + if (positive) + au_refresh_iattr(inode, st, -+ d_inode(h_path.dentry)->i_nlink); ++ vfsub_inode_nlink(d_inode(h_path.dentry), ++ AU_I_BRANCH)); + goto out_fill; /* success */ + } + AuTraceErr(err); + goto out_di; + +out_fill: -+ generic_fillattr(userns, inode, st); ++ generic_fillattr(idmap, request, inode, st); +out_di: + di_read_unlock(dentry, AuLock_IR); +out_si: @@ -22136,8 +22277,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); +} + -+static int aufs_update_time(struct inode *inode, struct timespec64 *ts, -+ int flags) ++static int aufs_update_time(struct inode *inode, int flags) +{ + int err; + aufs_bindex_t bindex; @@ -22161,7 +22301,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + h_mnt = au_sbr_mnt(sb, bindex); + err = vfsub_mnt_want_write(h_mnt); + if (!err) { -+ err = vfsub_update_time(h_inode, ts, flags); ++ err = vfsub_update_time(h_inode, flags); + vfsub_mnt_drop_write(h_mnt); + } + } else if (au_is_special(h_inode)) { @@ -22200,6 +22340,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + [AuIop_SYMLINK] = { + .permission = aufs_permission, +#ifdef CONFIG_FS_POSIX_ACL ++ .get_inode_acl = aufs_get_inode_acl, + .get_acl = aufs_get_acl, + .set_acl = aufs_set_acl, /* unsupport for symlink? */ +#endif @@ -22211,7 +22352,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + .listxattr = aufs_listxattr, +#endif + -+ .get_link = aufs_get_link, ++ .get_link = aufs_get_link + + /* .update_time = aufs_update_time */ + }, @@ -22228,6 +22369,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + + .permission = aufs_permission, +#ifdef CONFIG_FS_POSIX_ACL ++ .get_inode_acl = aufs_get_inode_acl, + .get_acl = aufs_get_acl, + .set_acl = aufs_set_acl, +#endif @@ -22246,6 +22388,7 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + [AuIop_OTHER] = { + .permission = aufs_permission, +#ifdef CONFIG_FS_POSIX_ACL ++ .get_inode_acl = aufs_get_inode_acl, + .get_acl = aufs_get_acl, + .set_acl = aufs_set_acl, +#endif @@ -22260,15 +22403,15 @@ diff -Naur null/fs/aufs/i_op.c linux-5.15.41/fs/aufs/i_op.c + .update_time = aufs_update_time + } +}; -diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c +diff -Naur null/fs/aufs/i_op_del.c linux-6.12.30/fs/aufs/i_op_del.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_del.c 2022-09-06 12:51:51.041709874 +0300 -@@ -0,0 +1,522 @@ ++++ linux-6.12.30/fs/aufs/i_op_del.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,523 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -22363,7 +22506,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + struct path h_ppath; + struct super_block *sb; + struct au_branch *br; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + h_dentry = au_h_dptr(dentry, bindex); + if (d_really_is_positive(dentry)) { @@ -22371,7 +22514,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + if (unlikely(d_is_negative(h_dentry))) + goto out; + h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + goto out; + + h_mode = h_inode->i_mode; @@ -22403,15 +22546,15 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + err = -EACCES; + sb = dentry->d_sb; + br = au_sbr(sb, bindex); -+ h_userns = au_br_userns(br); ++ h_idmap = au_br_idmap(br); + if (unlikely(!au_opt_test(au_mntflags(sb), DIRPERM1) -+ && au_test_h_perm(h_userns, d_inode(h_parent), ++ && au_test_h_perm(h_idmap, d_inode(h_parent), + MAY_EXEC | MAY_WRITE))) + goto out; + + 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); ++ h_latest = au_sio_lkup_one(h_idmap, &dentry->d_name, &h_ppath); + err = -EIO; + if (IS_ERR(h_latest)) + goto out; @@ -22543,7 +22686,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + + inode = d_inode(dentry); + d_drop(dentry); -+ inode->i_ctime = dir->i_ctime; ++ inode_set_ctime_to_ts(inode, inode_get_ctime(dir)); + + au_dir_ts(dir, bindex); + inode_inc_iversion(dir); @@ -22579,7 +22722,7 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c +{ + int err; + aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode, *h_dir, *delegated; ++ struct inode *inode, *h_dir, *delegated, *h_inode; + struct dentry *parent, *wh_dentry; + /* to reduce stack size */ + struct { @@ -22645,10 +22788,11 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + if (bindex == btop) { + vfsub_update_h_iattr(&a->h_path, /*did*/NULL); + /*ignore*/ -+ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ h_inode = d_inode(a->h_path.dentry); ++ inode_set_ctime_to_ts(inode, inode_get_ctime(h_inode)); + } else + /* todo: this timestamp may be reverted later */ -+ inode->i_ctime = h_dir->i_ctime; ++ inode_set_ctime_to_ts(inode, inode_get_ctime(h_dir)); + goto out_unpin; /* success */ + } + @@ -22786,15 +22930,15 @@ diff -Naur null/fs/aufs/i_op_del.c linux-5.15.41/fs/aufs/i_op_del.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c +diff -Naur null/fs/aufs/i_op_ren.c linux-6.12.30/fs/aufs/i_op_ren.c --- /dev/null -+++ linux-5.15.41/fs/aufs/i_op_ren.c 2022-09-06 12:51:51.041709874 +0300 -@@ -0,0 +1,1257 @@ ++++ linux-6.12.30/fs/aufs/i_op_ren.c 2025-05-27 19:28:00.104257426 +0300 +@@ -0,0 +1,1264 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -22819,18 +22963,18 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c +enum { AuSRC, AuDST, AuSrcDst }; +enum { AuPARENT, AuCHILD, AuParentChild }; + -+#define AuRen_ISDIR_SRC 1 -+#define AuRen_ISDIR_DST (1 << 1) -+#define AuRen_ISSAMEDIR (1 << 2) -+#define AuRen_WHSRC (1 << 3) -+#define AuRen_WHDST (1 << 4) -+#define AuRen_MNT_WRITE (1 << 5) -+#define AuRen_DT_DSTDIR (1 << 6) -+#define AuRen_DIROPQ_SRC (1 << 7) -+#define AuRen_DIROPQ_DST (1 << 8) -+#define AuRen_DIRREN (1 << 9) -+#define AuRen_DROPPED_SRC (1 << 10) -+#define AuRen_DROPPED_DST (1 << 11) ++#define AuRen_ISDIR_SRC BIT(0) ++#define AuRen_ISDIR_DST BIT(1) ++#define AuRen_ISSAMEDIR BIT(2) ++#define AuRen_WHSRC BIT(3) ++#define AuRen_WHDST BIT(4) ++#define AuRen_MNT_WRITE BIT(5) ++#define AuRen_DT_DSTDIR BIT(6) ++#define AuRen_DIROPQ_SRC BIT(7) ++#define AuRen_DIROPQ_DST BIT(8) ++#define AuRen_DIRREN BIT(9) ++#define AuRen_DROPPED_SRC BIT(10) ++#define AuRen_DROPPED_DST BIT(11) +#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) +#define au_fset_ren(flags, name) \ + do { (flags) |= AuRen_##name; } while (0) @@ -23158,6 +23302,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c +{ + int err; + struct dentry *d, *h_d; ++ struct inode *h_inode; + + if (!a->exchange) { + /* prepare workqueue args for asynchronous rmdir */ @@ -23235,12 +23380,14 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); + a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); + vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ h_inode = d_inode(a->h_path.dentry); ++ inode_set_ctime_to_ts(a->dst_inode, inode_get_ctime(h_inode)); + } + AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); + a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); + vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ h_inode = d_inode(a->h_path.dentry); ++ inode_set_ctime_to_ts(a->src_inode, inode_get_ctime(h_inode)); + + if (!a->exchange) { + /* remove whiteout for dentry */ @@ -23440,7 +23587,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + if (unlikely(d_is_negative(a->dst_h_dentry))) + goto out; + h_inode = d_inode(a->dst_h_dentry); -+ if (h_inode->i_nlink) ++ if (vfsub_inode_nlink(h_inode, AU_I_BRANCH)) + err = au_may_del(a->dst_dentry, a->btgt, + a->dst_h_parent, isdir); + } @@ -23522,6 +23669,10 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + } + a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, + a->dst_h_parent, a->dst_hdir); ++ if (IS_ERR(a->h_trap)) { ++ err = PTR_ERR(a->h_trap); ++ goto out; ++ } + udba = au_opt_udba(a->src_dentry->d_sb); + if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) + || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) @@ -23751,7 +23902,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + +/* ---------------------------------------------------------------------- */ + -+int aufs_rename(struct user_namespace *userns, ++int aufs_rename(struct mnt_idmap *idmap, + struct inode *_src_dir, struct dentry *_src_dentry, + struct inode *_dst_dir, struct dentry *_dst_dentry, + unsigned int _flags) @@ -23833,7 +23984,7 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + * If it is a dir, VFS unhash it before this + * function. It means we cannot rely upon d_unhashed(). + */ -+ if (unlikely(!a->dst_inode->i_nlink)) ++ if (unlikely(!vfsub_inode_nlink(a->dst_inode, AU_I_AUFS))) + goto out_unlock; + if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { + err = au_d_hashed_positive(a->dst_dentry); @@ -24047,10 +24198,10 @@ diff -Naur null/fs/aufs/i_op_ren.c linux-5.15.41/fs/aufs/i_op_ren.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig +diff -Naur null/fs/aufs/Kconfig linux-6.12.30/fs/aufs/Kconfig --- /dev/null -+++ linux-5.15.41/fs/aufs/Kconfig 2022-09-06 12:51:51.034709962 +0300 -@@ -0,0 +1,199 @@ ++++ linux-6.12.30/fs/aufs/Kconfig 2025-05-27 19:28:00.099257488 +0300 +@@ -0,0 +1,201 @@ +# SPDX-License-Identifier: GPL-2.0 +config AUFS_FS + tristate "Aufs (Advanced multi layered unification filesystem) support" @@ -24115,13 +24266,15 @@ diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig + It will have a negative impact to the performance. + See detail in aufs.5. + ++if AUFS_HNOTIFY +choice -+ prompt "method" if AUFS_HNOTIFY ++ prompt "method" + default AUFS_HFSNOTIFY +config AUFS_HFSNOTIFY + bool "fsnotify" + select FSNOTIFY +endchoice ++endif + +config AUFS_EXPORT + bool "NFS-exportable aufs" @@ -24250,15 +24403,15 @@ diff -Naur null/fs/aufs/Kconfig linux-5.15.41/fs/aufs/Kconfig + Automatic configuration for internal use. + When aufs supports Magic SysRq, enabled automatically. +endif -diff -Naur null/fs/aufs/lcnt.h linux-5.15.41/fs/aufs/lcnt.h +diff -Naur null/fs/aufs/lcnt.h linux-6.12.30/fs/aufs/lcnt.h --- /dev/null -+++ linux-5.15.41/fs/aufs/lcnt.h 2022-09-06 12:51:51.042709862 +0300 ++++ linux-6.12.30/fs/aufs/lcnt.h 2025-05-27 19:28:00.105257413 +0300 @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2018-2021 Junjiro R. Okajima ++ * Copyright (C) 2018-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -24435,20 +24588,20 @@ diff -Naur null/fs/aufs/lcnt.h linux-5.15.41/fs/aufs/lcnt.h + AuDbg("%s = %ld\n", #val, l); \ +} while (0) +#else -+#define AuLCntZero(val) do {} while (0) ++AuStubVoid(AuLCntZero, long val __maybe_unused); +#endif + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LCNT_H__ */ -diff -Naur null/fs/aufs/loop.c linux-5.15.41/fs/aufs/loop.c +diff -Naur null/fs/aufs/loop.c linux-6.12.30/fs/aufs/loop.c --- /dev/null -+++ linux-5.15.41/fs/aufs/loop.c 2022-09-06 12:51:51.042709862 +0300 ++++ linux-6.12.30/fs/aufs/loop.c 2025-05-27 19:28:00.105257413 +0300 @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -24592,15 +24745,15 @@ diff -Naur null/fs/aufs/loop.c linux-5.15.41/fs/aufs/loop.c + symbol_put(loop_backing_file); + au_kfree_try_rcu(au_warn_loopback_array); +} -diff -Naur null/fs/aufs/loop.h linux-5.15.41/fs/aufs/loop.h +diff -Naur null/fs/aufs/loop.h linux-6.12.30/fs/aufs/loop.h --- /dev/null -+++ linux-5.15.41/fs/aufs/loop.h 2022-09-06 12:51:51.042709862 +0300 ++++ linux-6.12.30/fs/aufs/loop.h 2025-05-27 19:28:00.105257413 +0300 @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -24651,9 +24804,9 @@ diff -Naur null/fs/aufs/loop.h linux-5.15.41/fs/aufs/loop.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_LOOP_H__ */ -diff -Naur null/fs/aufs/magic.mk linux-5.15.41/fs/aufs/magic.mk +diff -Naur null/fs/aufs/magic.mk linux-6.12.30/fs/aufs/magic.mk --- /dev/null -+++ linux-5.15.41/fs/aufs/magic.mk 2022-09-06 12:51:51.042709862 +0300 ++++ linux-6.12.30/fs/aufs/magic.mk 2025-05-27 19:28:00.105257413 +0300 @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24686,9 +24839,9 @@ diff -Naur null/fs/aufs/magic.mk linux-5.15.41/fs/aufs/magic.mk +ifdef CONFIG_HFSPLUS_FS +ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b +endif -diff -Naur null/fs/aufs/Makefile linux-5.15.41/fs/aufs/Makefile +diff -Naur null/fs/aufs/Makefile linux-6.12.30/fs/aufs/Makefile --- /dev/null -+++ linux-5.15.41/fs/aufs/Makefile 2022-09-06 12:51:51.034709962 +0300 ++++ linux-6.12.30/fs/aufs/Makefile 2025-05-27 19:28:00.099257488 +0300 @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: GPL-2.0 + @@ -24736,15 +24889,15 @@ diff -Naur null/fs/aufs/Makefile linux-5.15.41/fs/aufs/Makefile +aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o +aufs-$(CONFIG_AUFS_DEBUG) += debug.o +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff -Naur null/fs/aufs/module.c linux-5.15.41/fs/aufs/module.c +diff -Naur null/fs/aufs/module.c linux-6.12.30/fs/aufs/module.c --- /dev/null -+++ linux-5.15.41/fs/aufs/module.c 2022-09-06 12:51:51.042709862 +0300 -@@ -0,0 +1,273 @@ ++++ linux-6.12.30/fs/aufs/module.c 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,275 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -24875,7 +25028,8 @@ diff -Naur null/fs/aufs/module.c linux-5.15.41/fs/aufs/module.c + * iterate_supers_type() doesn't protect us from + * remounting (branch management) + */ -+struct hlist_bl_head au_sbilist; ++struct au_rwsem au_sbilist_lock; ++struct hlist_head au_sbilist; +#endif + +/* @@ -25009,19 +25163,20 @@ diff -Naur null/fs/aufs/module.c linux-5.15.41/fs/aufs/module.c + dbgaufs_fin(); + sysaufs_fin(); + au_dy_fin(); ++ au_sbilist_fin(); +} + +module_init(aufs_init); +module_exit(aufs_exit); -diff -Naur null/fs/aufs/module.h linux-5.15.41/fs/aufs/module.h +diff -Naur null/fs/aufs/module.h linux-6.12.30/fs/aufs/module.h --- /dev/null -+++ linux-5.15.41/fs/aufs/module.h 2022-09-06 12:51:51.042709862 +0300 -@@ -0,0 +1,166 @@ ++++ linux-6.12.30/fs/aufs/module.h 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,180 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -25148,15 +25303,17 @@ diff -Naur null/fs/aufs/module.h linux-5.15.41/fs/aufs/module.h + +extern struct kmem_cache *au_cache[AuCache_Last]; + -+#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) ++#define AuCacheFlags SLAB_RECLAIM_ACCOUNT +#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) +#define AuCacheCtor(type, ctor) \ + kmem_cache_create(#type, sizeof(struct type), \ + __alignof__(struct type), AuCacheFlags, ctor) + -+#define AuCacheFuncs(name, index) \ ++#define AuCacheFuncAlloc(name, index) \ + static inline struct au_##name *au_cache_alloc_##name(void) \ -+ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ ++ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } ++ ++#define AuCacheFuncs(name, index) \ + static inline void au_cache_free_##name##_norcu(struct au_##name *p) \ + { kmem_cache_free(au_cache[AuCache_##index], p); } \ + \ @@ -25173,25 +25330,37 @@ diff -Naur null/fs/aufs/module.h linux-5.15.41/fs/aufs/module.h + au_cache_free_##name##_rcu(p); } + +AuCacheFuncs(dinfo, DINFO); ++AuCacheFuncAlloc(dinfo, DINFO); ++ +AuCacheFuncs(icntnr, ICNTNR); ++static inline struct au_icntnr *au_cache_alloc_icntnr(struct super_block *sb) ++{ return alloc_inode_sb(sb, au_cache[AuCache_ICNTNR], GFP_NOFS); } ++ +AuCacheFuncs(finfo, FINFO); ++AuCacheFuncAlloc(finfo, FINFO); ++ +AuCacheFuncs(vdir, VDIR); ++AuCacheFuncAlloc(vdir, VDIR); ++ +AuCacheFuncs(vdir_dehstr, DEHSTR); ++AuCacheFuncAlloc(vdir_dehstr, DEHSTR); ++ +#ifdef CONFIG_AUFS_HNOTIFY +AuCacheFuncs(hnotify, HNOTIFY); ++AuCacheFuncAlloc(hnotify, HNOTIFY); +#endif + +#endif /* __KERNEL__ */ +#endif /* __AUFS_MODULE_H__ */ -diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c +diff -Naur null/fs/aufs/mvdown.c linux-6.12.30/fs/aufs/mvdown.c --- /dev/null -+++ linux-5.15.41/fs/aufs/mvdown.c 2022-09-06 12:51:51.043709849 +0300 -@@ -0,0 +1,706 @@ ++++ linux-6.12.30/fs/aufs/mvdown.c 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,714 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima ++ * Copyright (C) 2011-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -25363,6 +25532,13 @@ diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c + au_pin_hdir_unlock(&a->mvd_pin_src); + h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, + a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ if (IS_ERR(h_trap)) { ++ err = PTR_ERR(h_trap); ++ au_pin_hdir_lock(&a->mvd_pin_src); ++ au_unpin(&a->mvd_pin_src); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ goto out_dst; ++ } + if (h_trap) { + err = (h_trap != a->mvd_h_src_parent); + if (err) @@ -25589,15 +25765,16 @@ diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c + && atomic_read(&a->inode->i_count) == 1 + /* && a->mvd_h_src_inode->i_nlink == 1 */ + && (!plinked || !au_plink_test(a->inode)) -+ && a->inode->i_nlink == 1) ++ && vfsub_inode_nlink(a->inode, AU_I_AUFS) == 1) + goto out; + + err = -EBUSY; + AU_MVD_PR(dmsg, + "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", + a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), -+ atomic_read(&a->inode->i_count), a->inode->i_nlink, -+ a->mvd_h_src_inode->i_nlink, ++ atomic_read(&a->inode->i_count), ++ vfsub_inode_nlink(a->inode, AU_I_AUFS), ++ vfsub_inode_nlink(a->mvd_h_src_inode, AU_I_BRANCH), + plinked, plinked ? au_plink_test(a->inode) : 0); + +out: @@ -25893,15 +26070,15 @@ diff -Naur null/fs/aufs/mvdown.c linux-5.15.41/fs/aufs/mvdown.c + AuTraceErr(err); + return err; +} -diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c +diff -Naur null/fs/aufs/opts.c linux-6.12.30/fs/aufs/opts.c --- /dev/null -+++ linux-5.15.41/fs/aufs/opts.c 2022-09-06 12:51:51.043709849 +0300 -@@ -0,0 +1,1032 @@ ++++ linux-6.12.30/fs/aufs/opts.c 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,1030 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -26408,10 +26585,8 @@ diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c + if (opt->tf) { + au_opt_set(sbinfo->si_mntflags, DIO); + au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } else { -+ au_opt_clr(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } ++ } else ++ pr_warn_once("ignored nodio\n"); + break; + + case Opt_fhsm_sec: @@ -26570,8 +26745,8 @@ diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c + case Opt_prepend: + opt->add.bindex = 0; + fallthrough; -+ add: /* indented label */ + case Opt_add: ++ add: /* indented label */ + err = au_br_add(sb, &opt->add, + au_ftest_opts(opts->flags, REMOUNT)); + if (!err) { @@ -26929,15 +27104,15 @@ diff -Naur null/fs/aufs/opts.c linux-5.15.41/fs/aufs/opts.c +{ + return au_mntflags(sb) & AuOptMask_UDBA; +} -diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h +diff -Naur null/fs/aufs/opts.h linux-6.12.30/fs/aufs/opts.h --- /dev/null -+++ linux-5.15.41/fs/aufs/opts.h 2022-09-06 12:51:51.043709849 +0300 -@@ -0,0 +1,263 @@ ++++ linux-6.12.30/fs/aufs/opts.h 2025-05-27 19:28:00.105257413 +0300 +@@ -0,0 +1,264 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -26992,23 +27167,23 @@ diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h +/* ---------------------------------------------------------------------- */ + +/* mount flags */ -+#define AuOpt_XINO 1 /* external inode number bitmap ++#define AuOpt_XINO BIT(0) /* external inode number bitmap + and translation table */ -+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ -+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ -+#define AuOpt_UDBA_REVAL (1 << 3) -+#define AuOpt_UDBA_HNOTIFY (1 << 4) -+#define AuOpt_SHWH (1 << 5) /* show whiteout */ -+#define AuOpt_PLINK (1 << 6) /* pseudo-link */ -+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm ++#define AuOpt_TRUNC_XINO BIT(1) /* truncate xino files */ ++#define AuOpt_UDBA_NONE BIT(2) /* users direct branch access */ ++#define AuOpt_UDBA_REVAL BIT(3) ++#define AuOpt_UDBA_HNOTIFY BIT(4) ++#define AuOpt_SHWH BIT(5) /* show whiteout */ ++#define AuOpt_PLINK BIT(6) /* pseudo-link */ ++#define AuOpt_DIRPERM1 BIT(7) /* ignore the lower dir's perm + bits */ -+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ -+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ -+#define AuOpt_SUM_W (1 << 11) /* unimplemented */ -+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ -+#define AuOpt_VERBOSE (1 << 13) /* print the cause of error */ -+#define AuOpt_DIO (1 << 14) /* direct io */ -+#define AuOpt_DIRREN (1 << 15) /* directory rename */ ++#define AuOpt_ALWAYS_DIROPQ BIT(8) /* policy to creating diropq */ ++#define AuOpt_SUM BIT(9) /* summation for statfs(2) */ ++#define AuOpt_SUM_W BIT(10) /* unimplemented */ ++#define AuOpt_WARN_PERM BIT(11) /* warn when add-branch */ ++#define AuOpt_VERBOSE BIT(12) /* print the cause of error */ ++#define AuOpt_DIO BIT(13) /* direct io */ ++#define AuOpt_DIRREN BIT(14) /* directory rename */ + +#ifndef CONFIG_AUFS_HNOTIFY +#undef AuOpt_UDBA_HNOTIFY @@ -27027,7 +27202,8 @@ diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h + | AuOpt_UDBA_REVAL \ + | AuOpt_PLINK \ + /* | AuOpt_DIRPERM1 */ \ -+ | AuOpt_WARN_PERM) ++ | AuOpt_WARN_PERM \ ++ | AuOpt_DIO) +#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ + | AuOpt_UDBA_REVAL \ + | AuOpt_UDBA_HNOTIFY) @@ -27142,12 +27318,12 @@ diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h +}; + +/* opts flags */ -+#define AuOpts_REMOUNT 1 -+#define AuOpts_REFRESH (1 << 1) -+#define AuOpts_TRUNC_XIB (1 << 2) -+#define AuOpts_REFRESH_DYAOP (1 << 3) -+#define AuOpts_REFRESH_IDOP (1 << 4) -+#define AuOpts_DR_FLUSHED (1 << 5) ++#define AuOpts_REMOUNT BIT(0) ++#define AuOpts_REFRESH BIT(1) ++#define AuOpts_TRUNC_XIB BIT(2) ++#define AuOpts_REFRESH_DYAOP BIT(3) ++#define AuOpts_REFRESH_IDOP BIT(4) ++#define AuOpts_DR_FLUSHED BIT(5) +#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) +#define au_fset_opts(flags, name) \ + do { (flags) |= AuOpts_##name; } while (0) @@ -27196,15 +27372,15 @@ diff -Naur null/fs/aufs/opts.h linux-5.15.41/fs/aufs/opts.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_OPTS_H__ */ -diff -Naur null/fs/aufs/plink.c linux-5.15.41/fs/aufs/plink.c +diff -Naur null/fs/aufs/plink.c linux-6.12.30/fs/aufs/plink.c --- /dev/null -+++ linux-5.15.41/fs/aufs/plink.c 2022-09-06 12:51:51.043709849 +0300 ++++ linux-6.12.30/fs/aufs/plink.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,516 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -27716,15 +27892,15 @@ diff -Naur null/fs/aufs/plink.c linux-5.15.41/fs/aufs/plink.c + } + } +} -diff -Naur null/fs/aufs/poll.c linux-5.15.41/fs/aufs/poll.c +diff -Naur null/fs/aufs/poll.c linux-6.12.30/fs/aufs/poll.c --- /dev/null -+++ linux-5.15.41/fs/aufs/poll.c 2022-09-06 12:51:51.044709837 +0300 ++++ linux-6.12.30/fs/aufs/poll.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -27771,15 +27947,15 @@ diff -Naur null/fs/aufs/poll.c linux-5.15.41/fs/aufs/poll.c + AuDbg("mask 0x%x\n", mask); + return mask; +} -diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c +diff -Naur null/fs/aufs/posix_acl.c linux-6.12.30/fs/aufs/posix_acl.c --- /dev/null -+++ linux-5.15.41/fs/aufs/posix_acl.c 2022-09-06 12:51:51.044709837 +0300 -@@ -0,0 +1,111 @@ ++++ linux-6.12.30/fs/aufs/posix_acl.c 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima ++ * Copyright (C) 2014-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -27800,7 +27976,7 @@ diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c +#include +#include "aufs.h" + -+struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu) ++struct posix_acl *aufs_get_inode_acl(struct inode *inode, int type, bool rcu) +{ + struct posix_acl *acl; + int err; @@ -27830,7 +28006,7 @@ diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c + } + + /* always topmost only */ -+ acl = get_acl(h_inode, type); ++ acl = get_inode_acl(h_inode, type); + if (IS_ERR(acl)) + forget_cached_acl(inode, type); + else @@ -27845,12 +28021,24 @@ diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c + return acl; +} + -+int aufs_set_acl(struct user_namespace *userns, struct inode *inode, ++struct posix_acl *aufs_get_acl(struct mnt_idmap *idmap, ++ struct dentry *dentry, int type) ++{ ++ struct posix_acl *acl; ++ struct inode *inode; ++ ++ inode = d_inode(dentry); ++ acl = aufs_get_inode_acl(inode, type, /*rcu*/false); ++ ++ return acl; ++} ++ ++int aufs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, + struct posix_acl *acl, int type) +{ + int err; + ssize_t ssz; -+ struct dentry *dentry; ++ struct inode *inode; + struct au_sxattr arg = { + .type = AU_ACL_SET, + .u.acl_set = { @@ -27859,42 +28047,27 @@ diff -Naur null/fs/aufs/posix_acl.c linux-5.15.41/fs/aufs/posix_acl.c + }, + }; + ++ inode = d_inode(dentry); + IMustLock(inode); + -+ if (inode->i_ino == AUFS_ROOT_INO) -+ dentry = dget(inode->i_sb->s_root); -+ else { -+ dentry = d_find_alias(inode); -+ if (!dentry) -+ dentry = d_find_any_alias(inode); -+ if (!dentry) { -+ pr_warn("cannot handle this inode, " -+ "please report to aufs-users ML\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ } -+ + ssz = au_sxattr(dentry, inode, &arg); + /* forget even it if succeeds since the branch might set differently */ + forget_cached_acl(inode, type); -+ dput(dentry); + err = ssz; + if (ssz >= 0) + err = 0; + -+out: + return err; +} -diff -Naur null/fs/aufs/procfs.c linux-5.15.41/fs/aufs/procfs.c +diff -Naur null/fs/aufs/procfs.c linux-6.12.30/fs/aufs/procfs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/procfs.c 2022-09-06 12:51:51.044709837 +0300 -@@ -0,0 +1,170 @@ ++++ linux-6.12.30/fs/aufs/procfs.c 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,168 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima ++ * Copyright (C) 2010-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -27942,22 +28115,20 @@ diff -Naur null/fs/aufs/procfs.c linux-5.15.41/fs/aufs/procfs.c + int err; + struct super_block *sb; + struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; + + err = -EBUSY; + if (unlikely(file->private_data)) + goto out; + + sb = NULL; -+ /* don't use au_sbilist_lock() here */ -+ hlist_bl_lock(&au_sbilist); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ au_sbilist_read_lock(); ++ hlist_for_each_entry(sbinfo, &au_sbilist, si_list) + if (id == sysaufs_si_id(sbinfo)) { + if (kobject_get_unless_zero(&sbinfo->si_kobj)) + sb = sbinfo->si_sb; + break; + } -+ hlist_bl_unlock(&au_sbilist); ++ au_sbilist_read_unlock(); + + err = -EINVAL; + if (unlikely(!sb)) @@ -28060,15 +28231,15 @@ diff -Naur null/fs/aufs/procfs.c linux-5.15.41/fs/aufs/procfs.c +out: + return err; +} -diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c +diff -Naur null/fs/aufs/rdu.c linux-6.12.30/fs/aufs/rdu.c --- /dev/null -+++ linux-5.15.41/fs/aufs/rdu.c 2022-09-06 12:51:51.044709837 +0300 ++++ linux-6.12.30/fs/aufs/rdu.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -28092,9 +28263,9 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c +#include "aufs.h" + +/* bits for struct aufs_rdu.flags */ -+#define AuRdu_CALLED 1 -+#define AuRdu_CONT (1 << 1) -+#define AuRdu_FULL (1 << 2) ++#define AuRdu_CALLED BIT(0) ++#define AuRdu_CONT BIT(1) ++#define AuRdu_FULL BIT(2) +#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) +#define au_fset_rdu(flags, name) \ + do { (flags) |= AuRdu_##name; } while (0) @@ -28111,8 +28282,8 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c + int err; +}; + -+static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, -+ loff_t offset, u64 h_ino, unsigned int d_type) ++static bool au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, ++ loff_t offset, u64 h_ino, unsigned int d_type) +{ + int err, len; + struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); @@ -28153,7 +28324,7 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c + +out: + /* AuTraceErr(err); */ -+ return err; ++ return !err; +} + +static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) @@ -28216,7 +28387,7 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c + arg.end += rdu->sz; + + err = -ENOTDIR; -+ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) ++ if (unlikely(!file->f_op->iterate_shared)) + goto out; + + err = security_file_permission(file, MAY_READ); @@ -28448,15 +28619,15 @@ diff -Naur null/fs/aufs/rdu.c linux-5.15.41/fs/aufs/rdu.c + return err; +} +#endif -diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h +diff -Naur null/fs/aufs/rwsem.h linux-6.12.30/fs/aufs/rwsem.h --- /dev/null -+++ linux-5.15.41/fs/aufs/rwsem.h 2022-09-06 12:51:51.044709837 +0300 -@@ -0,0 +1,85 @@ ++++ linux-6.12.30/fs/aufs/rwsem.h 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -28485,7 +28656,11 @@ diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h +#define au_rwsem rw_semaphore + +/* to debug easier, do not make them inlined functions */ ++#ifndef CONFIG_PREEMPT_RT +#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) ++#else ++AuStubVoid(AuRwMustNoWaiters, struct rw_semaphore *rw) ++#endif + +#ifdef CONFIG_LOCKDEP +/* rwsem_is_locked() is unusable */ @@ -28506,10 +28681,10 @@ diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h + && debug_locks \ + && lockdep_is_held(rw)) +#else -+#define AuRwMustReadLock(rw) do {} while (0) -+#define AuRwMustWriteLock(rw) do {} while (0) -+#define AuRwMustAnyLock(rw) do {} while (0) -+#define AuRwDestroy(rw) do {} while (0) ++AuStubVoid(AuRwMustReadLock, struct rw_semaphore *rw) ++AuStubVoid(AuRwMustWriteLock, struct rw_semaphore *rw) ++AuStubVoid(AuRwMustAnyLock, struct rw_semaphore *rw) ++AuStubVoid(AuRwDestroy, struct rw_semaphore *rw) +#endif + +#define au_rw_init(rw) init_rwsem(rw) @@ -28537,15 +28712,15 @@ diff -Naur null/fs/aufs/rwsem.h linux-5.15.41/fs/aufs/rwsem.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_RWSEM_H__ */ -diff -Naur null/fs/aufs/sbinfo.c linux-5.15.41/fs/aufs/sbinfo.c +diff -Naur null/fs/aufs/sbinfo.c linux-6.12.30/fs/aufs/sbinfo.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sbinfo.c 2022-09-06 12:51:51.044709837 +0300 ++++ linux-6.12.30/fs/aufs/sbinfo.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -28857,15 +29032,15 @@ diff -Naur null/fs/aufs/sbinfo.c linux-5.15.41/fs/aufs/sbinfo.c + di_write_unlock2(d1, d2); + si_read_unlock(d1->d_sb); +} -diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c +diff -Naur null/fs/aufs/super.c linux-6.12.30/fs/aufs/super.c --- /dev/null -+++ linux-5.15.41/fs/aufs/super.c 2022-09-06 12:51:51.044709837 +0300 ++++ linux-6.12.30/fs/aufs/super.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,871 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -28897,7 +29072,7 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c +{ + struct au_icntnr *c; + -+ c = au_cache_alloc_icntnr(); ++ c = au_cache_alloc_icntnr(sb); + if (c) { + au_icntnr_init(c); + inode_set_iversion(&c->vfs_inode, 1); /* sigen(sb); */ @@ -28980,7 +29155,7 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c + return err; +} + -+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, ++static void au_gen_fmt(char *fmt, int len, const char *pat, + const char *append) +{ + char *p; @@ -28989,7 +29164,7 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c + while (*pat != ':') + *p++ = *pat++; + *p++ = *pat++; -+ strcpy(p, append); ++ strscpy(p, append, len - (p - fmt)); + AuDebugOn(strlen(fmt) >= len); +} + @@ -29654,7 +29829,7 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c + inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ + inode->i_fop = &aufs_dir_fop; + inode->i_mode = S_IFDIR; -+ set_nlink(inode, 2); ++ vfsub_inode_nlink_init(inode, 2); + unlock_new_inode(inode); + + root = d_make_root(inode); @@ -29732,15 +29907,15 @@ diff -Naur null/fs/aufs/super.c linux-5.15.41/fs/aufs/super.c + /* no need to __module_get() and module_put(). */ + .owner = THIS_MODULE, +}; -diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h +diff -Naur null/fs/aufs/super.h linux-6.12.30/fs/aufs/super.h --- /dev/null -+++ linux-5.15.41/fs/aufs/super.h 2022-09-06 12:51:51.045709824 +0300 -@@ -0,0 +1,592 @@ ++++ linux-6.12.30/fs/aufs/super.h 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,618 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -29775,8 +29950,8 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h + int (*copyup)(struct dentry *dentry); +}; + -+#define AuWbr_DIR 1 /* target is a dir */ -+#define AuWbr_PARENT (1 << 1) /* always require a parent */ ++#define AuWbr_DIR BIT(0) /* target is a dir */ ++#define AuWbr_PARENT BIT(1) /* always require a parent */ + +#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) +#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } @@ -29934,7 +30109,7 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h +#endif + +#ifdef CONFIG_AUFS_SBILIST -+ struct hlist_bl_node si_list; ++ struct hlist_node si_list; +#endif + + /* dirty, necessary for unmounting, sysfs and sysrq */ @@ -29947,9 +30122,9 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h + * then try refreshing dirs at access time again. + * if it is false, refreshing dirs at access time is unnecessary + */ -+#define AuSi_FAILED_REFRESH_DIR 1 -+#define AuSi_FHSM (1 << 1) /* fhsm is active now */ -+#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ ++#define AuSi_FAILED_REFRESH_DIR BIT(0) ++#define AuSi_FHSM BIT(1) /* fhsm is active now */ ++#define AuSi_NO_DREVAL BIT(2) /* disable all d_revalidate */ + +#ifndef CONFIG_AUFS_FHSM +#undef AuSi_FHSM @@ -29981,15 +30156,15 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h + ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) + +/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ -+#define AuLock_DW 1 /* write-lock dentry */ -+#define AuLock_IR (1 << 1) /* read-lock inode */ -+#define AuLock_IW (1 << 2) /* write-lock inode */ -+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ -+#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ ++#define AuLock_DW BIT(0) /* write-lock dentry */ ++#define AuLock_IR BIT(1) /* read-lock inode */ ++#define AuLock_IW BIT(2) /* write-lock inode */ ++#define AuLock_FLUSH BIT(3) /* wait for 'nowait' tasks */ ++#define AuLock_DIRS BIT(4) /* target is a pair of dirs */ + /* except RENAME_EXCHANGE */ -+#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ -+#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ -+#define AuLock_GEN (1 << 7) /* test digen/iigen */ ++#define AuLock_NOPLM BIT(5) /* return err in plm mode */ ++#define AuLock_NOPLMW BIT(6) /* wait for plm mode ends */ ++#define AuLock_GEN BIT(7) /* test digen/iigen */ +#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) +#define au_fset_lock(flags, name) \ + do { (flags) |= AuLock_##name; } while (0) @@ -30114,45 +30289,71 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h + +#ifdef CONFIG_AUFS_SBILIST +/* module.c */ -+extern struct hlist_bl_head au_sbilist; ++extern struct au_rwsem au_sbilist_lock; ++extern struct hlist_head au_sbilist; + +static inline void au_sbilist_init(void) +{ -+ INIT_HLIST_BL_HEAD(&au_sbilist); ++ au_rw_init(&au_sbilist_lock); ++ INIT_HLIST_HEAD(&au_sbilist); ++} ++ ++static inline void au_sbilist_fin(void) ++{ ++ AuRwDestroy(&au_sbilist_lock); +} + +static inline void au_sbilist_add(struct super_block *sb) +{ -+ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); ++ au_rw_write_lock(&au_sbilist_lock); ++ hlist_add_head(&au_sbi(sb)->si_list, &au_sbilist); ++ au_rw_write_unlock(&au_sbilist_lock); +} + +static inline void au_sbilist_del(struct super_block *sb) +{ -+ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); ++ au_rw_write_lock(&au_sbilist_lock); ++ hlist_del(&au_sbi(sb)->si_list); ++ au_rw_write_unlock(&au_sbilist_lock); +} + +#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+static inline void au_sbilist_lock(void) ++static inline void au_sbilist_write_lock(void) +{ -+ hlist_bl_lock(&au_sbilist); ++ au_rw_write_lock(&au_sbilist_lock); +} + -+static inline void au_sbilist_unlock(void) ++static inline void au_sbilist_write_unlock(void) +{ -+ hlist_bl_unlock(&au_sbilist); ++ au_rw_write_unlock(&au_sbilist_lock); ++} ++ ++static inline void au_sbilist_read_lock(void) ++{ ++ au_rw_read_lock(&au_sbilist_lock); ++} ++ ++static inline void au_sbilist_read_unlock(void) ++{ ++ au_rw_read_unlock(&au_sbilist_lock); +} +#define AuGFP_SBILIST GFP_ATOMIC +#else -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) ++AuStubVoid(au_sbilist_write_lock, void) ++AuStubVoid(au_sbilist_write_unlock, void) ++AuStubVoid(au_sbilist_read_lock, void) ++AuStubVoid(au_sbilist_read_unlock, void) +#define AuGFP_SBILIST GFP_NOFS +#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ +#else +AuStubVoid(au_sbilist_init, void) ++AuStubVoid(au_sbilist_fin, void) +AuStubVoid(au_sbilist_add, struct super_block *sb) +AuStubVoid(au_sbilist_del, struct super_block *sb) -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) ++AuStubVoid(au_sbilist_write_lock, void) ++AuStubVoid(au_sbilist_write_unlock, void) ++AuStubVoid(au_sbilist_read_lock, void) ++AuStubVoid(au_sbilist_read_unlock, void) +#define AuGFP_SBILIST GFP_NOFS +#endif + @@ -30328,15 +30529,15 @@ diff -Naur null/fs/aufs/super.h linux-5.15.41/fs/aufs/super.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_SUPER_H__ */ -diff -Naur null/fs/aufs/sysaufs.c linux-5.15.41/fs/aufs/sysaufs.c +diff -Naur null/fs/aufs/sysaufs.c linux-6.12.30/fs/aufs/sysaufs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysaufs.c 2022-09-06 12:51:51.045709824 +0300 -@@ -0,0 +1,93 @@ ++++ linux-6.12.30/fs/aufs/sysaufs.c 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -30371,15 +30572,16 @@ diff -Naur null/fs/aufs/sysaufs.c linux-5.15.41/fs/aufs/sysaufs.c + &sysaufs_si_attr_xi_path.attr, + NULL, +}; ++ATTRIBUTE_GROUPS(sysaufs_si); + +static const struct sysfs_ops au_sbi_ops = { + .show = sysaufs_si_show +}; + -+static struct kobj_type au_sbi_ktype = { ++static const struct kobj_type au_sbi_ktype = { + .release = au_si_free, + .sysfs_ops = &au_sbi_ops, -+ .default_attrs = sysaufs_si_attrs ++ .default_groups = sysaufs_si_groups +}; + +/* ---------------------------------------------------------------------- */ @@ -30425,15 +30627,15 @@ diff -Naur null/fs/aufs/sysaufs.c linux-5.15.41/fs/aufs/sysaufs.c +out: + return err; +} -diff -Naur null/fs/aufs/sysaufs.h linux-5.15.41/fs/aufs/sysaufs.h +diff -Naur null/fs/aufs/sysaufs.h linux-6.12.30/fs/aufs/sysaufs.h --- /dev/null -+++ linux-5.15.41/fs/aufs/sysaufs.h 2022-09-06 12:51:51.045709824 +0300 ++++ linux-6.12.30/fs/aufs/sysaufs.h 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -30531,15 +30733,15 @@ diff -Naur null/fs/aufs/sysaufs.h linux-5.15.41/fs/aufs/sysaufs.h + +#endif /* __KERNEL__ */ +#endif /* __SYSAUFS_H__ */ -diff -Naur null/fs/aufs/sysfs.c linux-5.15.41/fs/aufs/sysfs.c +diff -Naur null/fs/aufs/sysfs.c linux-6.12.30/fs/aufs/sysfs.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysfs.c 2022-09-06 12:51:51.045709824 +0300 ++++ linux-6.12.30/fs/aufs/sysfs.c 2025-05-27 19:28:00.106257401 +0300 @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -30909,15 +31111,15 @@ diff -Naur null/fs/aufs/sysfs.c linux-5.15.41/fs/aufs/sysfs.c + } + } +} -diff -Naur null/fs/aufs/sysrq.c linux-5.15.41/fs/aufs/sysrq.c +diff -Naur null/fs/aufs/sysrq.c linux-6.12.30/fs/aufs/sysrq.c --- /dev/null -+++ linux-5.15.41/fs/aufs/sysrq.c 2022-09-06 12:51:51.045709824 +0300 -@@ -0,0 +1,149 @@ ++++ linux-6.12.30/fs/aufs/sysrq.c 2025-05-27 19:28:00.106257401 +0300 +@@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -31018,17 +31220,25 @@ diff -Naur null/fs/aufs/sysrq.c linux-5.15.41/fs/aufs/sysrq.c +module_param_named(sysrq, aufs_sysrq_key, charp, 0444); +MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); + -+static void au_sysrq(int key __maybe_unused) ++static void au_sysrq_work_fn(struct work_struct *wk __maybe_unused) +{ + struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; + -+ lockdep_off(); -+ au_sbilist_lock(); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ au_sbilist_read_lock(); ++ hlist_for_each_entry(sbinfo, &au_sbilist, si_list) + sysrq_sb(sbinfo->si_sb); -+ au_sbilist_unlock(); -+ lockdep_on(); ++ au_sbilist_read_unlock(); ++ ++ module_put(THIS_MODULE); ++} ++ ++static DECLARE_WORK(au_sysrq_work, au_sysrq_work_fn); ++ ++static void au_sysrq(u8 key __maybe_unused) ++{ ++ /* au_wkq is too much here */ ++ __module_get(THIS_MODULE); ++ schedule_work(&au_sysrq_work); +} + +static struct sysrq_key_op au_sysrq_op = { @@ -31062,15 +31272,15 @@ diff -Naur null/fs/aufs/sysrq.c linux-5.15.41/fs/aufs/sysrq.c + if (unlikely(err)) + pr_err("err %d (ignored)\n", err); +} -diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c +diff -Naur null/fs/aufs/vdir.c linux-6.12.30/fs/aufs/vdir.c --- /dev/null -+++ linux-5.15.41/fs/aufs/vdir.c 2022-09-06 12:51:51.045709824 +0300 ++++ linux-6.12.30/fs/aufs/vdir.c 2025-05-27 19:28:00.107257388 +0300 @@ -0,0 +1,896 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -31495,9 +31705,9 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + +/* ---------------------------------------------------------------------- */ + -+#define AuFillVdir_CALLED 1 -+#define AuFillVdir_WHABLE (1 << 1) -+#define AuFillVdir_SHWH (1 << 2) ++#define AuFillVdir_CALLED BIT(0) ++#define AuFillVdir_WHABLE BIT(1) ++#define AuFillVdir_SHWH BIT(2) +#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) +#define au_fset_fillvdir(flags, name) \ + do { (flags) |= AuFillVdir_##name; } while (0) @@ -31520,7 +31730,7 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + int err; +}; + -+static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, ++static bool fillvdir(struct dir_context *ctx, const char *__name, int nlen, + loff_t offset __maybe_unused, u64 h_ino, + unsigned int d_type) +{ @@ -31571,7 +31781,7 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + arg->vdir->vd_jiffy = jiffies; + /* smp_mb(); */ + AuTraceErr(arg->err); -+ return arg->err; ++ return !arg->err; +} + +static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, @@ -31821,6 +32031,7 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + goto out; + + allocated = NULL; ++ inode = file_inode(file); + vdir_cache = au_fvdir_cache(file); + if (!vdir_cache) { + vdir_cache = alloc_vdir(file); @@ -31828,7 +32039,8 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + if (IS_ERR(vdir_cache)) + goto out; + allocated = vdir_cache; -+ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { ++ } else if (!file->f_pos ++ && vdir_cache->vd_version != inode_query_iversion(inode)) { + /* test file->f_pos here instead of ctx->pos */ + err = reinit_vdir(vdir_cache); + if (unlikely(err)) @@ -31836,10 +32048,8 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + } else + return 0; /* success */ + -+ inode = file_inode(file); + err = copy_vdir(vdir_cache, au_ivdir(inode)); + if (!err) { -+ file->f_version = inode_query_iversion(inode); + if (allocated) + au_set_fvdir_cache(file, allocated); + } else if (allocated) @@ -31962,15 +32172,15 @@ diff -Naur null/fs/aufs/vdir.c linux-5.15.41/fs/aufs/vdir.c + /* smp_mb(); */ + return 0; +} -diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +diff -Naur null/fs/aufs/vfsub.c linux-6.12.30/fs/aufs/vfsub.c --- /dev/null -+++ linux-5.15.41/fs/aufs/vfsub.c 2022-09-06 12:51:51.045709824 +0300 -@@ -0,0 +1,918 @@ ++++ linux-6.12.30/fs/aufs/vfsub.c 2025-05-27 19:28:00.107257388 +0300 +@@ -0,0 +1,966 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -32019,6 +32229,53 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + +/* ---------------------------------------------------------------------- */ + ++unsigned int vfsub_inode_nlink_aufs(struct inode *inode) ++{ ++ unsigned int nlink; ++ ++ au_nlink_lock(inode); ++ nlink = inode->i_nlink; ++ au_nlink_unlock(inode); ++ ++ return nlink; ++} ++ ++void vfsub_inc_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ inc_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_drop_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ AuDebugOn(!inode->i_nlink); ++ drop_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_clear_nlink(struct inode *inode) ++{ ++ au_nlink_lock(inode); ++ /* it can happen */ ++ /* AuDebugOn(!inode->i_nlink); */ ++ clear_nlink(inode); ++ au_nlink_unlock(inode); ++} ++ ++void vfsub_set_nlink(struct inode *inode, unsigned int nlink) ++{ ++ /* ++ * stop setting the value equal to the current one, in order to stop ++ * a useless warning from vfs:destroy_inode() about sb->s_remove_count. ++ */ ++ au_nlink_lock(inode); ++ if (nlink != inode->i_nlink) ++ set_nlink(inode, nlink); ++ au_nlink_unlock(inode); ++} ++ +int vfsub_update_h_iattr(struct path *h_path, int *did) +{ + int err; @@ -32115,8 +32372,6 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + + /* todo: call VFS:may_open() here */ + /* todo: ima_file_check() too? */ -+ if (!err && (args->open_flag & __FMODE_EXEC)) -+ err = deny_write_access(file); + if (!err) + fsnotify_open(file); + else @@ -32192,10 +32447,13 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + lockdep_off(); + d = lock_rename(d1, d2); + lockdep_on(); ++ if (IS_ERR(d)) ++ goto out; + au_hn_suspend(hdir1); + if (hdir1 != hdir2) + au_hn_suspend(hdir2); + ++out: + return d; +} + @@ -32216,7 +32474,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32226,10 +32484,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_create(userns, dir, path->dentry, mode, want_excl); ++ err = vfs_create(idmap, dir, path->dentry, mode, want_excl); + lockdep_on(); + if (!err) { + struct path tmp = *path; @@ -32251,7 +32509,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32261,10 +32519,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_symlink(userns, dir, path->dentry, symname); ++ err = vfs_symlink(idmap, dir, path->dentry, symname); + lockdep_on(); + if (!err) { + struct path tmp = *path; @@ -32286,7 +32544,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32296,10 +32554,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_mknod(userns, dir, path->dentry, mode, dev); ++ err = vfs_mknod(idmap, dir, path->dentry, mode, dev); + lockdep_on(); + if (!err) { + struct path tmp = *path; @@ -32322,7 +32580,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ + + if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) ++ || vfsub_inode_nlink(inode, AU_I_BRANCH) < link_max) + return 0; + return -EMLINK; +} @@ -32332,7 +32590,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32347,10 +32605,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_link(src_dentry, userns, dir, path->dentry, delegated_inode); ++ err = vfs_link(src_dentry, idmap, dir, path->dentry, delegated_inode); + lockdep_on(); + if (!err) { + struct path tmp = *path; @@ -32393,10 +32651,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + if (unlikely(err)) + goto out; + -+ rd.old_mnt_userns = mnt_user_ns(path->mnt); ++ rd.old_mnt_idmap = mnt_idmap(path->mnt); + rd.old_dir = src_dir; + rd.old_dentry = src_dentry; -+ rd.new_mnt_userns = rd.old_mnt_userns; ++ rd.new_mnt_idmap = rd.old_mnt_idmap; + rd.new_dir = dir; + rd.new_dentry = path->dentry; + rd.delegated_inode = delegated_inode; @@ -32426,7 +32684,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32436,10 +32694,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_mkdir(userns, dir, path->dentry, mode); ++ err = vfs_mkdir(idmap, dir, path->dentry, mode); + lockdep_on(); + if (!err) { + struct path tmp = *path; @@ -32461,7 +32719,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + int err; + struct dentry *d; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + IMustLock(dir); + @@ -32471,10 +32729,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + path->dentry = d; + if (unlikely(err)) + goto out; -+ userns = mnt_user_ns(path->mnt); ++ idmap = mnt_idmap(path->mnt); + + lockdep_off(); -+ err = vfs_rmdir(userns, dir, path->dentry); ++ err = vfs_rmdir(idmap, dir, path->dentry); + lockdep_on(); + if (!err) { + struct path tmp = { @@ -32579,14 +32837,14 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + return err; +} + -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) ++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) +{ -+ long err; ++ ssize_t err; + + lockdep_off(); -+ err = do_splice_to(in, ppos, pipe, len, flags); ++ err = vfs_splice_read(in, ppos, pipe, len, flags); + lockdep_on(); + file_accessed(in); + if (err >= 0) @@ -32594,10 +32852,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + return err; +} + -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) ++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags) +{ -+ long err; ++ ssize_t err; + + lockdep_off(); + err = do_splice_from(pipe, out, ppos, len, flags); @@ -32632,7 +32890,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + int err; + struct inode *h_inode; + struct super_block *h_sb; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + if (!h_file) { + err = vfsub_truncate(h_path, length); @@ -32644,11 +32902,11 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + lockdep_off(); + sb_start_write(h_sb); + lockdep_on(); -+ err = security_path_truncate(h_path); ++ err = security_file_truncate(h_file); + if (!err) { -+ h_userns = mnt_user_ns(h_path->mnt); ++ h_idmap = mnt_idmap(h_path->mnt); + lockdep_off(); -+ err = do_truncate(h_userns, h_path->dentry, length, attr, ++ err = do_truncate(h_idmap, h_path->dentry, length, attr, + h_file); + lockdep_on(); + } @@ -32678,10 +32936,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) +{ + int err, do_sio, wkq_err; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); ++ idmap = mnt_idmap(path->mnt); ++ do_sio = au_test_h_perm_sio(idmap, dir, MAY_EXEC | MAY_WRITE); + if (!do_sio) { + lockdep_off(); + err = vfsub_mkdir(dir, path, mode); @@ -32716,10 +32974,10 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +int vfsub_sio_rmdir(struct inode *dir, struct path *path) +{ + int err, do_sio, wkq_err; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); ++ idmap = mnt_idmap(path->mnt); ++ do_sio = au_test_h_perm_sio(idmap, dir, MAY_EXEC | MAY_WRITE); + if (!do_sio) { + lockdep_off(); + err = vfsub_rmdir(dir, path); @@ -32751,16 +33009,16 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c +{ + struct notify_change_args *a = args; + struct inode *h_inode; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + + h_inode = d_inode(a->path->dentry); + IMustLock(h_inode); + + *a->errp = -EPERM; + if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ userns = mnt_user_ns(a->path->mnt); ++ idmap = mnt_idmap(a->path->mnt); + lockdep_off(); -+ *a->errp = notify_change(userns, a->path->dentry, a->ia, ++ *a->errp = notify_change(idmap, a->path->dentry, a->ia, + a->delegated_inode); + lockdep_on(); + if (!*a->errp) @@ -32817,7 +33075,7 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + struct unlink_args *a = args; + struct dentry *d = a->path->dentry; + struct inode *h_inode; -+ struct user_namespace *userns; ++ struct mnt_idmap *idmap; + const int stop_sillyrename = (au_test_nfs(d->d_sb) + && au_dcount(d) == 1); + @@ -32837,9 +33095,9 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + ihold(h_inode); + } + -+ userns = mnt_user_ns(a->path->mnt); ++ idmap = mnt_idmap(a->path->mnt); + lockdep_off(); -+ *a->errp = vfs_unlink(userns, a->dir, d, a->delegated_inode); ++ *a->errp = vfs_unlink(idmap, a->dir, d, a->delegated_inode); + lockdep_on(); + if (!*a->errp) { + struct path tmp = { @@ -32884,15 +33142,15 @@ diff -Naur null/fs/aufs/vfsub.c linux-5.15.41/fs/aufs/vfsub.c + + return err; +} -diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h +diff -Naur null/fs/aufs/vfsub.h linux-6.12.30/fs/aufs/vfsub.h --- /dev/null -+++ linux-5.15.41/fs/aufs/vfsub.h 2022-09-06 12:51:51.046709812 +0300 -@@ -0,0 +1,358 @@ ++++ linux-6.12.30/fs/aufs/vfsub.h 2025-05-27 19:28:00.107257388 +0300 +@@ -0,0 +1,441 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -32920,10 +33178,10 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h +#include +#include +#include "debug.h" ++#include "fstype.h" + +/* copied from linux/fs/internal.h */ +/* todo: BAD approach!! */ -+extern void __mnt_drop_write(struct vfsmount *); +extern struct file *alloc_empty_file(int, const struct cred *); + +/* ---------------------------------------------------------------------- */ @@ -32947,17 +33205,55 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h + +/* ---------------------------------------------------------------------- */ + -+static inline void vfsub_drop_nlink(struct inode *inode) ++unsigned int vfsub_inode_nlink_aufs(struct inode *inode); ++ ++enum au_inode_type { ++ AU_I_AUFS, ++ AU_I_BRANCH, ++ AU_I_UNKNOWN ++}; ++ ++static inline unsigned int vfsub_inode_nlink(struct inode *inode, ++ enum au_inode_type type) +{ -+ AuDebugOn(!inode->i_nlink); -+ drop_nlink(inode); ++ unsigned int nlink; ++ ++ switch (type) { ++ case AU_I_AUFS: ++ nlink = vfsub_inode_nlink_aufs(inode); ++ break; ++ case AU_I_BRANCH: /* aufs cannot be a branch of another aufs mount */ ++ AuDebugOn(au_test_aufs(inode->i_sb)); ++ nlink = inode->i_nlink; ++ break; ++ case AU_I_UNKNOWN: ++ if (au_test_aufs(inode->i_sb)) ++ nlink = vfsub_inode_nlink_aufs(inode); ++ else ++ nlink = inode->i_nlink; ++ break; ++ }; ++ ++ return nlink; ++} ++ ++void vfsub_inc_nlink(struct inode *inode); ++void vfsub_drop_nlink(struct inode *inode); ++void vfsub_clear_nlink(struct inode *inode); ++void vfsub_set_nlink(struct inode *inode, unsigned int nlink); ++ ++static inline void vfsub_inode_nlink_init(struct inode *inode, ++ unsigned int nlink) ++{ ++ /* to ignore sb->s_remove_count, do not use set_nlink() */ ++ inode->__i_nlink = nlink; +} + +static inline void vfsub_dead_dir(struct inode *inode) +{ + AuDebugOn(!S_ISDIR(inode->i_mode)); + inode->i_flags |= S_DEAD; -+ clear_nlink(inode); ++ vfsub_clear_nlink(inode); +} + +static inline int vfsub_native_ro(struct inode *inode) @@ -33039,6 +33335,20 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h +} +#endif + ++static inline void vfsub_file_start_write(struct file *file) ++{ ++ lockdep_off(); ++ file_start_write(file); ++ lockdep_on(); ++} ++ ++static inline void vfsub_file_end_write(struct file *file) ++{ ++ lockdep_off(); ++ file_end_write(file); ++ lockdep_on(); ++} ++ +/* ---------------------------------------------------------------------- */ + +struct au_hinode; @@ -33116,34 +33426,33 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h +} +#endif + -+static inline int vfsub_update_time(struct inode *h_inode, -+ struct timespec64 *ts, int flags) ++static inline int vfsub_update_time(struct inode *h_inode, int flags) +{ -+ return inode_update_time(h_inode, ts, flags); ++ return inode_update_time(h_inode, flags); + /* no vfsub_update_h_iattr() since we don't have struct path */ +} + +#ifdef CONFIG_FS_POSIX_ACL -+static inline int vfsub_acl_chmod(struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode) ++static inline int vfsub_acl_chmod(struct mnt_idmap *h_idmap, ++ struct dentry *h_dentry, umode_t h_mode) +{ + int err; + -+ err = posix_acl_chmod(h_userns, h_inode, h_mode); ++ err = posix_acl_chmod(h_idmap, h_dentry, h_mode); + if (err == -EOPNOTSUPP) + err = 0; + return err; +} +#else -+AuStubInt0(vfsub_acl_chmod, struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode); ++AuStubInt0(vfsub_acl_chmod, struct mnt_idmap *h_idmap, ++ struct dentry *h_dentry, umode_t h_mode); +#endif + -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); ++ssize_t vfsub_splice_read(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags); ++ssize_t vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); + +static inline long vfsub_truncate(struct path *path, loff_t length) +{ @@ -33219,42 +33528,74 @@ diff -Naur null/fs/aufs/vfsub.h linux-5.15.41/fs/aufs/vfsub.h + +/* ---------------------------------------------------------------------- */ + -+static inline int vfsub_setxattr(struct user_namespace *userns, ++static inline int vfsub_setxattr(struct mnt_idmap *idmap, + struct dentry *dentry, const char *name, + const void *value, size_t size, int flags) +{ + int err; + + lockdep_off(); -+ err = vfs_setxattr(userns, dentry, name, value, size, flags); ++ err = vfs_setxattr(idmap, dentry, name, value, size, flags); + lockdep_on(); + + return err; +} + -+static inline int vfsub_removexattr(struct user_namespace *userns, ++static inline int vfsub_removexattr(struct mnt_idmap *idmap, + struct dentry *dentry, const char *name) +{ + int err; + + lockdep_off(); -+ err = vfs_removexattr(userns, dentry, name); ++ err = vfs_removexattr(idmap, dentry, name); + lockdep_on(); + + return err; +} + ++#ifdef CONFIG_FS_POSIX_ACL ++static inline int vfsub_set_acl(struct mnt_idmap *idmap, ++ struct dentry *dentry, const char *name, ++ struct posix_acl *acl) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_set_acl(idmap, dentry, name, acl); ++ lockdep_on(); ++ ++ return err; ++} ++ ++static inline int vfsub_remove_acl(struct mnt_idmap *idmap, ++ struct dentry *dentry, const char *name) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_remove_acl(idmap, dentry, name); ++ lockdep_on(); ++ ++ return err; ++} ++#else ++AuStubInt0(vfsub_set_acl, struct mnt_idmap *idmap, struct dentry *dentry, ++ const char *name, struct posix_acl *acl); ++AuStubInt0(vfsub_remove_acl, struct mnt_idmap *idmap, ++ struct dentry *dentry, const char *name); ++#endif ++ +#endif /* __KERNEL__ */ +#endif /* __AUFS_VFSUB_H__ */ -diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.41/fs/aufs/wbr_policy.c +diff -Naur null/fs/aufs/wbr_policy.c linux-6.12.30/fs/aufs/wbr_policy.c --- /dev/null -+++ linux-5.15.41/fs/aufs/wbr_policy.c 2022-09-06 12:51:51.046709812 +0300 ++++ linux-6.12.30/fs/aufs/wbr_policy.c 2025-05-27 19:28:00.107257388 +0300 @@ -0,0 +1,830 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -33303,10 +33644,10 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.41/fs/aufs/wbr_policy.c + return err; +} + -+#define AuCpdown_PARENT_OPQ 1 -+#define AuCpdown_WHED (1 << 1) -+#define AuCpdown_MADE_DIR (1 << 2) -+#define AuCpdown_DIROPQ (1 << 3) ++#define AuCpdown_PARENT_OPQ BIT(0) ++#define AuCpdown_WHED BIT(1) ++#define AuCpdown_MADE_DIR BIT(2) ++#define AuCpdown_DIROPQ BIT(3) +#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) +#define au_fset_cpdown(flags, name) \ + do { (flags) |= AuCpdown_##name; } while (0) @@ -34080,15 +34421,15 @@ diff -Naur null/fs/aufs/wbr_policy.c linux-5.15.41/fs/aufs/wbr_policy.c + .fin = au_wbr_create_fin_mfs + } +}; -diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c +diff -Naur null/fs/aufs/whout.c linux-6.12.30/fs/aufs/whout.c --- /dev/null -+++ linux-5.15.41/fs/aufs/whout.c 2022-09-06 12:51:51.046709812 +0300 ++++ linux-6.12.30/fs/aufs/whout.c 2025-05-27 19:28:00.107257388 +0300 @@ -0,0 +1,1072 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -34150,7 +34491,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + * 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 path *h_ppath, ++int au_wh_test(struct mnt_idmap *h_idmap, struct path *h_ppath, + struct qstr *wh_name, int try_sio) +{ + int err; @@ -34159,7 +34500,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + if (!try_sio) + wh_dentry = vfsub_lkup_one(wh_name, h_ppath); + else -+ wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_ppath); ++ wh_dentry = au_sio_lkup_one(h_idmap, wh_name, h_ppath); + err = PTR_ERR(wh_dentry); + if (IS_ERR(wh_dentry)) { + if (err == -ENAMETOOLONG) @@ -34188,14 +34529,14 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c +/* + * test if the @h_path->dentry sets opaque or not. + */ -+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path) ++int au_diropq_test(struct mnt_idmap *h_idmap, struct path *h_path) +{ + int err; + struct inode *h_dir; + + 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)); ++ err = au_wh_test(h_idmap, h_path, &diropq_name, ++ au_test_h_perm_sio(h_idmap, h_dir, MAY_EXEC)); + return err; +} + @@ -34213,7 +34554,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + static unsigned short cnt; + struct qstr qs; + struct path h_ppath; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); + @@ -34239,11 +34580,11 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + + h_ppath.dentry = h_parent; + h_ppath.mnt = au_br_mnt(br); -+ h_userns = au_br_userns(br); ++ h_idmap = au_br_idmap(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_ppath); ++ dentry = au_sio_lkup_one(h_idmap, &qs, &h_ppath); + if (IS_ERR(dentry) || d_is_negative(dentry)) + goto out_name; + dput(dentry); @@ -34840,11 +35181,11 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + unsigned int flags) +{ + struct dentry *diropq, *h_dentry; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + -+ h_userns = au_sbr_userns(dentry->d_sb, bindex); ++ h_idmap = au_sbr_idmap(dentry->d_sb, bindex); + h_dentry = au_h_dptr(dentry, bindex); -+ if (!au_test_h_perm_sio(h_userns, d_inode(h_dentry), ++ if (!au_test_h_perm_sio(h_idmap, d_inode(h_dentry), + MAY_EXEC | MAY_WRITE)) + diropq = do_diropq(dentry, bindex, flags); + else { @@ -35033,7 +35374,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + struct path wh_path; + struct inode *wh_inode, *h_dir; + struct au_branch *br; -+ struct user_namespace *h_userns; ++ struct mnt_idmap *h_idmap; + + h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ + IMustLock(h_dir); @@ -35041,7 +35382,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + 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); ++ h_idmap = au_br_idmap(br); + wh_inode = d_inode(wh_dentry); + inode_lock_nested(wh_inode, AuLsc_I_CHILD); + @@ -35049,7 +35390,7 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + * someone else might change some whiteouts while we were sleeping. + * it means this whlist may have an obsoleted entry. + */ -+ if (!au_test_h_perm_sio(h_userns, wh_inode, MAY_EXEC | MAY_WRITE)) ++ if (!au_test_h_perm_sio(h_idmap, wh_inode, MAY_EXEC | MAY_WRITE)) + err = del_wh_children(&wh_path, whlist, bindex); + else { + int wkq_err; @@ -35067,10 +35408,10 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + inode_unlock(wh_inode); + + if (!err) { -+ h_nlink = h_dir->i_nlink; ++ h_nlink = vfsub_inode_nlink(h_dir, AU_I_BRANCH); + err = vfsub_rmdir(h_dir, &wh_path); + /* some fs doesn't change the parent nlink in some cases */ -+ h_nlink -= h_dir->i_nlink; ++ h_nlink -= vfsub_inode_nlink(h_dir, AU_I_BRANCH); + } + + if (!err) { @@ -35156,15 +35497,15 @@ diff -Naur null/fs/aufs/whout.c linux-5.15.41/fs/aufs/whout.c + au_whtmp_rmdir_free(args); + } +} -diff -Naur null/fs/aufs/whout.h linux-5.15.41/fs/aufs/whout.h +diff -Naur null/fs/aufs/whout.h linux-6.12.30/fs/aufs/whout.h --- /dev/null -+++ linux-5.15.41/fs/aufs/whout.h 2022-09-06 12:51:51.046709812 +0300 ++++ linux-6.12.30/fs/aufs/whout.h 2025-05-27 19:28:00.107257388 +0300 @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -35191,9 +35532,9 @@ diff -Naur null/fs/aufs/whout.h linux-5.15.41/fs/aufs/whout.h + +/* whout.c */ +int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); -+int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath, ++int au_wh_test(struct mnt_idmap *h_idmap, struct path *h_ppath, + struct qstr *wh_name, int try_sio); -+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path); ++int au_diropq_test(struct mnt_idmap *h_idmap, struct path *h_path); +struct au_branch; +struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, + struct qstr *prefix); @@ -35247,15 +35588,15 @@ diff -Naur null/fs/aufs/whout.h linux-5.15.41/fs/aufs/whout.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WHOUT_H__ */ -diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c +diff -Naur null/fs/aufs/wkq.c linux-6.12.30/fs/aufs/wkq.c --- /dev/null -+++ linux-5.15.41/fs/aufs/wkq.c 2022-09-06 12:51:51.046709812 +0300 -@@ -0,0 +1,372 @@ ++++ linux-6.12.30/fs/aufs/wkq.c 2025-05-27 19:28:00.107257388 +0300 +@@ -0,0 +1,370 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -35484,8 +35825,6 @@ diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c +/* + * Since struct completion is large, try allocating it dynamically. + */ -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ +static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) +{ + *comp = kmalloc(sizeof(**comp), GFP_NOFS); @@ -35532,7 +35871,7 @@ diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c +int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) +{ + int err; -+ AuWkqCompDeclare(comp); ++ struct completion *comp = NULL; + struct au_wkinfo wkinfo = { + .flags = flags, + .func = func, @@ -35623,15 +35962,15 @@ diff -Naur null/fs/aufs/wkq.c linux-5.15.41/fs/aufs/wkq.c + + return err; +} -diff -Naur null/fs/aufs/wkq.h linux-5.15.41/fs/aufs/wkq.h +diff -Naur null/fs/aufs/wkq.h linux-6.12.30/fs/aufs/wkq.h --- /dev/null -+++ linux-5.15.41/fs/aufs/wkq.h 2022-09-06 12:51:51.047709799 +0300 ++++ linux-6.12.30/fs/aufs/wkq.h 2025-05-27 19:28:00.108257376 +0300 @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -35674,8 +36013,8 @@ diff -Naur null/fs/aufs/wkq.h linux-5.15.41/fs/aufs/wkq.h +typedef void (*au_wkq_func_t)(void *args); + +/* wkq flags */ -+#define AuWkq_WAIT 1 -+#define AuWkq_NEST (1 << 1) ++#define AuWkq_WAIT BIT(0) ++#define AuWkq_NEST BIT(1) +#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) +#define au_fset_wkq(flags, name) \ + do { (flags) |= AuWkq_##name; } while (0) @@ -35716,15 +36055,15 @@ diff -Naur null/fs/aufs/wkq.h linux-5.15.41/fs/aufs/wkq.h + +#endif /* __KERNEL__ */ +#endif /* __AUFS_WKQ_H__ */ -diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +diff -Naur null/fs/aufs/xattr.c linux-6.12.30/fs/aufs/xattr.c --- /dev/null -+++ linux-5.15.41/fs/aufs/xattr.c 2022-09-06 12:51:51.047709799 +0300 -@@ -0,0 +1,368 @@ ++++ linux-6.12.30/fs/aufs/xattr.c 2025-05-27 19:28:00.108257376 +0300 +@@ -0,0 +1,360 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima ++ * Copyright (C) 2014-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -35743,7 +36082,6 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c + */ + +#include -+#include +#include +#include "aufs.h" + @@ -35790,39 +36128,57 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c + char *name, char **buf, unsigned int ignore_flags, + unsigned int verbose) +{ -+ int err; ++ int err, is_acl; + ssize_t ssz; + struct inode *h_idst; + struct dentry *h_dst_dentry, *h_src_dentry; -+ struct user_namespace *h_dst_userns, *h_src_userns; ++ struct mnt_idmap *h_dst_idmap, *h_src_idmap; ++ struct posix_acl *acl; + -+ h_src_userns = mnt_user_ns(h_src->mnt); ++ is_acl = !!is_posix_acl_xattr(name); ++ h_src_idmap = mnt_idmap(h_src->mnt); + h_src_dentry = h_src->dentry; -+ ssz = vfs_getxattr_alloc(h_src_userns, h_src_dentry, name, buf, 0, -+ GFP_NOFS); -+ err = ssz; -+ if (unlikely(err <= 0)) { -+ if (err == -ENODATA -+ || (err == -EOPNOTSUPP -+ && ((ignore_flags & au_xattr_out_of_list) -+ || (au_test_nfs_noacl(d_inode(h_src_dentry)) -+ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) -+ || !strcmp(name, -+ XATTR_NAME_POSIX_ACL_DEFAULT)))) -+ )) -+ err = 0; -+ if (err && (verbose || au_debug_test())) -+ pr_err("%s, err %d\n", name, err); -+ goto out; ++ if (is_acl) { ++ acl = vfs_get_acl(h_src_idmap, h_src_dentry, name); ++ AuDebugOn(!acl); ++ if (IS_ERR(acl)) { ++ err = PTR_ERR(acl); ++ if (err == -ENODATA) ++ err = 0; ++ else if (err == -EOPNOTSUPP ++ && au_test_nfs_noacl(d_inode(h_src_dentry))) ++ err = 0; ++ else if (verbose || au_debug_test()) ++ pr_err("%s, err %d\n", name, err); ++ goto out; ++ } ++ } else { ++ ssz = vfs_getxattr_alloc(h_src_idmap, h_src_dentry, name, buf, ++ 0, GFP_NOFS); ++ if (unlikely(ssz <= 0)) { ++ err = ssz; ++ if (err == -ENODATA) ++ err = 0; ++ else if (err == -EOPNOTSUPP ++ && (ignore_flags & au_xattr_out_of_list)) ++ err = 0; ++ else if (err && (verbose || au_debug_test())) ++ pr_err("%s, err %d\n", name, err); ++ goto out; ++ } + } + + /* unlock it temporary */ -+ h_dst_userns = mnt_user_ns(h_dst->mnt); ++ h_dst_idmap = mnt_idmap(h_dst->mnt); + h_dst_dentry = h_dst->dentry; + h_idst = d_inode(h_dst_dentry); + inode_unlock(h_idst); -+ err = vfsub_setxattr(h_dst_userns, h_dst_dentry, name, *buf, ssz, -+ /*flags*/0); ++ if (is_acl) { ++ err = vfsub_set_acl(h_dst_idmap, h_dst_dentry, name, acl); ++ posix_acl_release(acl); ++ } else ++ err = vfsub_setxattr(h_dst_idmap, h_dst_dentry, name, *buf, ++ ssz, /*flags*/0); + inode_lock_nested(h_idst, AuLsc_I_CHILD2); + if (unlikely(err)) { + if (verbose || au_debug_test()) @@ -35837,7 +36193,7 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +int au_cpup_xattr(struct path *h_dst, struct path *h_src, int ignore_flags, + unsigned int verbose) +{ -+ int err, unlocked, acl_access, acl_default; ++ int err, unlocked; + ssize_t ssz; + struct dentry *h_dst_dentry, *h_src_dentry; + struct inode *h_isrc, *h_idst; @@ -35885,33 +36241,12 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c + err = 0; + e = p + ssz; + value = NULL; -+ acl_access = 0; -+ acl_default = 0; ++ ignore_flags |= au_xattr_out_of_list; + while (!err && p < e) { -+ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, -+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); -+ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, -+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) -+ - 1); + err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, + verbose); + p += strlen(p) + 1; + } -+ AuTraceErr(err); -+ ignore_flags |= au_xattr_out_of_list; -+ if (!err && !acl_access) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_ACCESS, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ if (!err && !acl_default) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_DEFAULT, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ + au_kfree_try_rcu(value); + +out_free: @@ -35988,7 +36323,7 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c + break; + case AU_XATTR_GET: + AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfs_getxattr(mnt_user_ns(h_path.mnt), h_path.dentry, ++ err = vfs_getxattr(mnt_idmap(h_path.mnt), h_path.dentry, + arg->u.get.name, arg->u.get.value, + arg->u.get.size); + break; @@ -36060,7 +36395,7 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +} + +static int au_xattr_set(const struct xattr_handler *handler, -+ struct user_namespace *userns, ++ struct mnt_idmap *idmap, + struct dentry *dentry, struct inode *inode, + const char *name, const void *value, size_t size, + int flags) @@ -36076,10 +36411,6 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +}; + +static const struct xattr_handler *au_xattr_handlers[] = { -+#ifdef CONFIG_FS_POSIX_ACL -+ &posix_acl_access_xattr_handler, -+ &posix_acl_default_xattr_handler, -+#endif + &au_xattr_handler, /* must be last */ + NULL +}; @@ -36088,15 +36419,15 @@ diff -Naur null/fs/aufs/xattr.c linux-5.15.41/fs/aufs/xattr.c +{ + sb->s_xattr = au_xattr_handlers; +} -diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c +diff -Naur null/fs/aufs/xino.c linux-6.12.30/fs/aufs/xino.c --- /dev/null -+++ linux-5.15.41/fs/aufs/xino.c 2022-09-06 12:51:51.047709799 +0300 ++++ linux-6.12.30/fs/aufs/xino.c 2025-05-27 19:28:00.108257376 +0300 @@ -0,0 +1,1926 @@ +// SPDX-License-Identifier: GPL-2.0 +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -36291,7 +36622,7 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c + h_dir = d_inode(h_parent); + inode = file_inode(file); + /* no delegation since it is just created */ -+ if (inode->i_nlink) ++ if (vfsub_inode_nlink(inode, AU_I_BRANCH)) + err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, + /*force*/0); + inode_unlock(h_dir); @@ -36353,7 +36684,7 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c + } + + /* no need to mnt_want_write() since we call dentry_open() later */ -+ err = vfs_create(mnt_user_ns(base->mnt), dir, path.dentry, 0666, NULL); ++ err = vfs_create(mnt_idmap(base->mnt), dir, path.dentry, 0666, NULL); + if (unlikely(err)) { + file = ERR_PTR(err); + pr_err("%pd create err %d\n", dentry, err); @@ -37192,7 +37523,7 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c + struct super_block *sb; + struct au_sbinfo *sbinfo; + -+ AuDebugOn(inode->i_nlink); ++ AuDebugOn(vfsub_inode_nlink(inode, AU_I_AUFS)); + + sb = inode->i_sb; + xib_calc_bit(inode->i_ino, &pindex, &bit); @@ -37881,7 +38212,7 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c + for (; bindex <= bbot; bindex++, hi++) { + h_inode = hi->hi_inode; + if (!h_inode -+ || (!unlinked && h_inode->i_nlink)) ++ || (!unlinked && vfsub_inode_nlink(h_inode, AU_I_BRANCH))) + continue; + + /* inode may not be revalidated */ @@ -38018,15 +38349,15 @@ diff -Naur null/fs/aufs/xino.c linux-5.15.41/fs/aufs/xino.c +out: + return err; +} -diff -Naur null/include/uapi/linux/aufs_type.h linux-5.15.41/include/uapi/linux/aufs_type.h +diff -Naur null/include/uapi/linux/aufs_type.h linux-6.12.30/include/uapi/linux/aufs_type.h --- /dev/null -+++ linux-5.15.41/include/uapi/linux/aufs_type.h 2022-09-06 12:51:51.048709787 +0300 ++++ linux-6.12.30/include/uapi/linux/aufs_type.h 2025-05-27 19:28:00.108257376 +0300 @@ -0,0 +1,452 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima ++ * Copyright (C) 2005-2025 Junjiro R. Okajima + * -+ * This program, aufs is free software; you can redistribute it and/or modify ++ * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. @@ -38064,7 +38395,7 @@ diff -Naur null/include/uapi/linux/aufs_type.h linux-5.15.41/include/uapi/linux/ +#include +#endif /* __KERNEL__ */ + -+#define AUFS_VERSION "5.15.41-20220620" ++#define AUFS_VERSION "6.12-20250414" + +/* 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/kernel/tools/perf/files/patches/aufs6/lockdep-debug.patch b/kernel/tools/perf/files/patches/aufs6/lockdep-debug.patch new file mode 100644 index 0000000000..81033ab74c --- /dev/null +++ b/kernel/tools/perf/files/patches/aufs6/lockdep-debug.patch @@ -0,0 +1,16 @@ +SPDX-License-Identifier: GPL-2.0 +aufs6.12 lockdep patch + +diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h +index 9f361d3ab9d95..57efd6ffe7a44 100644 +--- a/include/linux/lockdep_types.h ++++ b/include/linux/lockdep_types.h +@@ -12,7 +12,7 @@ + + #include + +-#define MAX_LOCKDEP_SUBCLASSES 8UL ++#define MAX_LOCKDEP_SUBCLASSES (8UL + 4) + + enum lockdep_wait_type { + LD_WAIT_INV = 0, /* not checked, catch all */ diff --git a/kernel/tools/perf/files/patches/aufs5/tmpfs-idr.patch b/kernel/tools/perf/files/patches/aufs6/tmpfs-idr.patch similarity index 62% rename from kernel/tools/perf/files/patches/aufs5/tmpfs-idr.patch rename to kernel/tools/perf/files/patches/aufs6/tmpfs-idr.patch index f4313145bf..40cf01c2f3 100644 --- a/kernel/tools/perf/files/patches/aufs5/tmpfs-idr.patch +++ b/kernel/tools/perf/files/patches/aufs6/tmpfs-idr.patch @@ -1,10 +1,10 @@ SPDX-License-Identifier: GPL-2.0 diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h -index 166158b6e917..0e9606171432 100644 +index 515a9a6a3c6f..9de809dac3be 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h -@@ -28,10 +28,13 @@ struct shmem_inode_info { +@@ -55,10 +55,13 @@ struct shmem_quota_limits { }; struct shmem_sb_info { @@ -14,17 +14,17 @@ index 166158b6e917..0e9606171432 100644 unsigned long max_blocks; /* How many blocks are allowed */ struct percpu_counter used_blocks; /* How many are allocated */ - unsigned long max_inodes; /* How many inodes are allowed */ -- unsigned long free_inodes; /* How many are left for allocation */ +- unsigned long free_ispace; /* How much ispace left for allocation */ + int max_inodes; /* How many inodes are allowed */ -+ int free_inodes; /* How many are left for allocation */ ++ unsigned long free_ispace; /* How many are left for allocation */ raw_spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ umode_t mode; /* Mount mode for root directory */ unsigned char huge; /* Whether to try for hugepages */ diff --git a/mm/shmem.c b/mm/shmem.c -index 342d1bc72867..460e4c54483f 100644 +index 568bb290bdce..f8869230f782 100644 --- a/mm/shmem.c +++ b/mm/shmem.c -@@ -108,7 +108,7 @@ struct shmem_falloc { +@@ -112,7 +112,7 @@ struct shmem_falloc { struct shmem_options { unsigned long long blocks; @@ -33,7 +33,7 @@ index 342d1bc72867..460e4c54483f 100644 struct mempolicy *mpol; kuid_t uid; kgid_t gid; -@@ -128,11 +128,14 @@ static unsigned long shmem_default_max_blocks(void) +@@ -144,12 +144,14 @@ static unsigned long shmem_default_max_blocks(void) return totalram_pages() / 2; } @@ -43,52 +43,53 @@ index 342d1bc72867..460e4c54483f 100644 unsigned long nr_pages = totalram_pages(); + unsigned long ul; -- return min(nr_pages - totalhigh_pages(), nr_pages / 2); +- return min3(nr_pages - totalhigh_pages(), nr_pages / 2, +- ULONG_MAX / BOGO_INODE_SIZE); + ul = INT_MAX; + ul = min3(ul, nr_pages - totalhigh_pages(), nr_pages / 2); + return ul; } #endif -@@ -1165,6 +1168,11 @@ static void shmem_evict_inode(struct inode *inode) +@@ -1291,6 +1293,11 @@ static void shmem_evict_inode(struct inode *inode) + } - simple_xattrs_free(&info->xattrs); - WARN_ON(inode->i_blocks); + simple_xattrs_free(&info->xattrs, sbinfo->max_inodes ? &freed : NULL); + if (!sbinfo->idr_nouse && inode->i_ino) { + mutex_lock(&sbinfo->idr_lock); + idr_remove(&sbinfo->idr, inode->i_ino); + mutex_unlock(&sbinfo->idr_lock); + } - shmem_free_inode(inode->i_sb); + shmem_free_inode(inode->i_sb, freed); + WARN_ON(inode->i_blocks); clear_inode(inode); - } -@@ -2336,6 +2344,25 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode - break; - } +@@ -2854,6 +2861,25 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap, + break; + } -+ if (!sbinfo->idr_nouse) { -+ /* inum 0 and 1 are unused */ -+ mutex_lock(&sbinfo->idr_lock); -+ ino = idr_alloc(&sbinfo->idr, inode, 2, INT_MAX, -+ GFP_NOFS); -+ if (ino > 0) { -+ inode->i_ino = ino; -+ mutex_unlock(&sbinfo->idr_lock); -+ __insert_inode_hash(inode, inode->i_ino); -+ } else { -+ inode->i_ino = 0; -+ mutex_unlock(&sbinfo->idr_lock); -+ iput(inode); -+ /* shmem_free_inode() will be called */ -+ inode = NULL; -+ } -+ } else ++ if (!sbinfo->idr_nouse) { ++ /* inum 0 and 1 are unused */ ++ mutex_lock(&sbinfo->idr_lock); ++ ino = idr_alloc(&sbinfo->idr, inode, 2, INT_MAX, ++ GFP_NOFS); ++ if (ino > 0) { + inode->i_ino = ino; ++ mutex_unlock(&sbinfo->idr_lock); ++ __insert_inode_hash(inode, inode->i_ino); ++ } else { ++ inode->i_ino = 0; ++ mutex_unlock(&sbinfo->idr_lock); ++ iput(inode); ++ /* shmem_free_inode() will be called */ ++ inode = NULL; ++ } ++ } else ++ inode->i_ino = ino; + - lockdep_annotate_inode_mutex_key(inode); - } else - shmem_free_inode(sb); -@@ -3252,8 +3279,7 @@ static struct dentry *shmem_get_parent(struct dentry *child) + lockdep_annotate_inode_mutex_key(inode); + return inode; + } +@@ -4098,8 +4124,7 @@ static struct dentry *shmem_get_parent(struct dentry *child) static int shmem_match(struct inode *ino, void *vfh) { __u32 *fh = vfh; @@ -98,7 +99,7 @@ index 342d1bc72867..460e4c54483f 100644 return ino->i_ino == inum && fh[0] == ino->i_generation; } -@@ -3273,14 +3299,11 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, +@@ -4118,14 +4143,11 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, struct dentry *dentry = NULL; u64 inum; @@ -116,7 +117,7 @@ index 342d1bc72867..460e4c54483f 100644 if (inode) { dentry = shmem_find_alias(inode); iput(inode); -@@ -3292,30 +3315,15 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, +@@ -4137,30 +4159,15 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, static int shmem_encode_fh(struct inode *inode, __u32 *fh, int *len, struct inode *parent) { @@ -150,53 +151,48 @@ index 342d1bc72867..460e4c54483f 100644 return 1; } -@@ -3394,7 +3402,7 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) +@@ -4259,7 +4266,7 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) break; case Opt_nr_inodes: ctx->inodes = memparse(param->string, &rest); -- if (*rest) -+ if (*rest || ctx->inodes < 2) +- if (*rest || ctx->inodes > ULONG_MAX / BOGO_INODE_SIZE) ++ if (*rest || ctx->inodes < 2 || ctx->inodes > INT_MAX) goto bad_value; ctx->seen |= SHMEM_SEEN_INODES; break; -@@ -3504,7 +3512,7 @@ static int shmem_reconfigure(struct fs_context *fc) - { - struct shmem_options *ctx = fc->fs_private; - struct shmem_sb_info *sbinfo = SHMEM_SB(fc->root->d_sb); -- unsigned long inodes; -+ int inodes; - struct mempolicy *mpol = NULL; - const char *err; - -@@ -3573,7 +3581,7 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root) - seq_printf(seq, ",size=%luk", - sbinfo->max_blocks << (PAGE_SHIFT - 10)); +@@ -4541,7 +4548,7 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root) + if (sbinfo->max_blocks != shmem_default_max_blocks()) + seq_printf(seq, ",size=%luk", K(sbinfo->max_blocks)); if (sbinfo->max_inodes != shmem_default_max_inodes()) - seq_printf(seq, ",nr_inodes=%lu", sbinfo->max_inodes); + seq_printf(seq, ",nr_inodes=%d", sbinfo->max_inodes); if (sbinfo->mode != (0777 | S_ISVTX)) seq_printf(seq, ",mode=%03ho", sbinfo->mode); if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID)) -@@ -3620,6 +3628,8 @@ static void shmem_put_super(struct super_block *sb) - { - struct shmem_sb_info *sbinfo = SHMEM_SB(sb); - +@@ -4613,6 +4620,8 @@ static void shmem_put_super(struct super_block *sb) + #ifdef CONFIG_TMPFS_QUOTA + shmem_disable_quotas(sb); + #endif + if (!sbinfo->idr_nouse) + idr_destroy(&sbinfo->idr); free_percpu(sbinfo->ino_batch); percpu_counter_destroy(&sbinfo->used_blocks); mpol_put(sbinfo->mpol); -@@ -3662,6 +3672,8 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) +@@ -4657,9 +4666,11 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) #else sb->s_flags |= SB_NOUSER; #endif + mutex_init(&sbinfo->idr_lock); + idr_init(&sbinfo->idr); sbinfo->max_blocks = ctx->blocks; - sbinfo->free_inodes = sbinfo->max_inodes = ctx->inodes; + sbinfo->max_inodes = ctx->inodes; +- sbinfo->free_ispace = sbinfo->max_inodes * BOGO_INODE_SIZE; ++ sbinfo->free_ispace = (unsigned long)sbinfo->max_inodes * BOGO_INODE_SIZE; if (sb->s_flags & SB_KERNMOUNT) { -@@ -3779,6 +3791,15 @@ static void shmem_destroy_inodecache(void) - kmem_cache_destroy(shmem_inode_cachep); + sbinfo->ino_batch = alloc_percpu(ino_t); + if (!sbinfo->ino_batch) +@@ -4804,6 +4815,15 @@ static int shmem_error_remove_folio(struct address_space *mapping, + return 0; } +static __init void shmem_no_idr(struct super_block *sb) @@ -208,10 +204,10 @@ index 342d1bc72867..460e4c54483f 100644 + idr_destroy(&sbinfo->idr); +} + - const struct address_space_operations shmem_aops = { + static const struct address_space_operations shmem_aops = { .writepage = shmem_writepage, - .set_page_dirty = __set_page_dirty_no_writeback, -@@ -3920,6 +3941,7 @@ int __init shmem_init(void) + .dirty_folio = noop_dirty_folio, +@@ -4968,6 +4988,7 @@ void __init shmem_init(void) pr_err("Could not kern_mount tmpfs\n"); goto out1; } diff --git a/kernel/tools/perf/files/patches/aufs5/vfs-ino.patch b/kernel/tools/perf/files/patches/aufs6/vfs-ino.patch similarity index 75% rename from kernel/tools/perf/files/patches/aufs5/vfs-ino.patch rename to kernel/tools/perf/files/patches/aufs6/vfs-ino.patch index 992d86c106..6ff72c1a42 100644 --- a/kernel/tools/perf/files/patches/aufs5/vfs-ino.patch +++ b/kernel/tools/perf/files/patches/aufs6/vfs-ino.patch @@ -1,10 +1,10 @@ SPDX-License-Identifier: GPL-2.0 diff --git a/fs/inode.c b/fs/inode.c -index 9abc88d7959c..82b13641423c 100644 +index 8dabb224f941..4f03eaa25cc2 100644 --- a/fs/inode.c +++ b/fs/inode.c -@@ -904,6 +904,8 @@ unsigned int get_next_ino(void) +@@ -1070,6 +1070,8 @@ unsigned int get_next_ino(void) unsigned int *p = &get_cpu_var(last_ino); unsigned int res = *p; @@ -13,7 +13,7 @@ index 9abc88d7959c..82b13641423c 100644 #ifdef CONFIG_SMP if (unlikely((res & (LAST_INO_BATCH-1)) == 0)) { static atomic_t shared_last_ino; -@@ -916,7 +918,7 @@ unsigned int get_next_ino(void) +@@ -1082,7 +1084,7 @@ unsigned int get_next_ino(void) res++; /* get_next_ino should not provide a 0 inode number */ if (unlikely(!res)) diff --git a/kernel/tools/perf/files/patches/linux/patch-5.15.81.xz b/kernel/tools/perf/files/patches/linux/patch-5.15.81.xz deleted file mode 100644 index ece5544ea1b50bb411fe99ab1b4f0d9ff4e9b844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081452 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 z

%d2so>!F$iu2WR}(Fl+zqX^%*nS$;N=eXU_4kD^t!XtX-+aO>Gl>&YJy$|41n- z|DCo62;$ZLqUQfzwRClreu>1h%h+N>@jJ^?^}!VNQ8-SZFdHg+lC{}TTPh6;Kn3(!q#G2I!_e+!AA+2s zsdn;!kC|=E)KLTnk}7BYm|jAPx#T6!Ri4BuMZN>t&4-r~qO)9W0mmBDG@TM$H4+Af@SaeP2}b z>xX|!KTLBADu26-5$i#(O3u8L1|aGnj?wSt)eOaME5uO-sTLQ|UsZUb2f!zX(6Uyu zgk}q-6d@WMdr`z!7l}cSGP2Moi^OQnxaZy;G%P#is02`scF~U!dvELdQ~oWX188sc z3hAt2yCE_sWIx;nfF#xR9gCN1qm$QsfVaNuzkpiL$HG`+ruoh`2IO>`TAVsZ@)rQgM`@y33JfHk zDjWX|hTB)IIVNk{ZX0BPf2gMyEwCs6l;f?uF)vY)QGPog^D#S#w5H)}eX%NfmK0De z?eU`TIo+KemB`_cRe%K-MRUWkJJ4tRlc=Cx$^>*ZV*&UpwRjCdfad|>RIH$s2x*P9#z<3 zeVUw5ofyNi1@P9^z~?q{Y*o}mt-*l1I6O1Jc>Q=KzV|7+MiVK5mOnLWA&3d3NbP!aMJ_w)pTeHqIsJ!dXG_J=4fwpo&*uEgnpETh95m-CP3_G_LS+Q7j z9BTZ9Qa3SkAT7B|Gg+?2$F4qGPCQp6vy*6gcaf7L$?JYxzg@w{*ef8F2&lW%;qfF2 z=RsYCJUP&3{C?hZ@10M9+s-^y{(M(1@gxKz{~?w+>uJobXSLY`5LxTFaKXUL>4M)n zDYTV$F~Ke--%?;NQGJlY)14O%=XUPWJSli=qdWqKbnh9FztUo#ze1`b{wyTXZ7T-!@MZYvcoV}jY@lV z_v3Vqad#WTXEH%+DfaKf!k6P4l^KkN(e7{lJdVLT~TUCBc2=F;cwpyi;AEqdGXW~ zBMIFr0Ixh!YN0UA4V+rQE#uKv#QK5la6>QK%phU*tQn9uTTI28hrxuxAaXcC3>xJ( zJcy>&T|G;`Yp5lV$Ihm9OIU#_ig{ZBb4ddptoj)}<~w&-PU+ojEFFKKLMC6ZG9a=( zQ;{$bo;!e`=4j#cgI{wnEOwOXp>aVF9l(~Q$|0n@FfNz zV>$6+cpX;G?XF$me8C^EnRmsYy)aKM7{_Ks9cj^omO$e8Nls?@BH-!+z8d>;q#OMi z)4$M;!q^{Tam2OM2y;f8KOH{;ceg~ol9+{%=zLC?z7@Rk%BgcLY3k4ZV1GBftC z&#R`gdB%}-U)gG|3V}H1YAw54b%^GR=jJ5PKK9Fv*hn4n{wKkzlox`!y3)#_8yVN1 zoVQn{Bq#qeqCji#J=85 zqppL`ti;Hy9U}Bi6_CC# z7r%7}3tYpfx!%u`ZA8<)Vgkt`hbNwL9r`>1y|qO$TYB9;ZU!VY z;Hlp^YRR@HmL(9uUI4AOEwsP>H|m&lZykeY7>>ck0i}b^-B?iEI71f5~UW?I7WaHR8AT5AW%8KAdHzVEek{^N4DTqok3V zW7NbCN&~VAM=4s^jWqFva51!0!VvPT&qPm*NS3cTyUiq>8Ffg0pzoiX)X{$6qaZuF_o)8=n;Z2_r5Dm7{M%Lz2b#}PNWq})kyERJ}Kw8o#E~xqbva^ zG@&@0r5lM`oa`k?$9e9IG${>rR}MSCvZw|aZuHBkn^rZ}mZE-0ct&WH4tm11-Schy zSM!KL=9=s<#q2_ED<%)u-#Xr!uadiJ0)B;XK5iw&>~s`5{2lILnvu4G!fnsRn4XZ- zf$16-n%J2VizEaS8{=aJ7I!AXwC7hMTz17>HD#V8wViS3>ffoq=r@uR6GP1%*M!xthfCp z@c>F6@Zbqxi)A986znz*_C8)z#|Jq@fbs!z&tY_a24^)}s>k{f0GTWf7f;ME<_3LP zpe1IOi5b24UZ&1E0__6f*?PAaIR#Ci5Ebh*GU!E@ia`lO^m~~k#WgFS2Co6$)&;=f zb9wQ{f_mFSR3C4a=*9|0wA&&G^IpDFdq|#H%X&eSizk13#0RRxg4shLi5HB1s+ka!CV$ zMZS3shJeZsqr@88Xq_@(w89FEfJuvTRa>B=N*~_39>pw~BWuRILi@&mWazpCP*{V>5xu8l^>MSYc0lyMP`eoHB|0eGKrD38?DH*0En#$%z*L*Tm3y647S070i(BcNdl;POs}l(3Fj#uAM9Gkz=K|27>&Ok&7a8CSLX(AG(`WZ#jz;@{as!Ffp3CzV47LPVB^&T+G@n(y83VNF;jYYenOAju9w2ri6q7HKm-KTNtVYWo2*g zK@NfR1Yjl|#eq&DQ&U==&JEUCVkHm)dgrw#=6je7*A-qX&R)wkMU8Gyf3-w07+Xw` z_tbJApW4~DXxWo#j@SNu&tPMg{dbsh@jsQI7hP>n@7%PmA_l2iC|kzrKduk(ICcMbu}hqHDp_ZgQl@ zLh&|AOA`Z^Uy;vvyfRBWu3DE(ZU_Y!u{7j$OCEFdllL$Nf-h|p_Pj!F$+>t3tl{|t zULly5%yamv(aW-SvR2Ej?5Un)SrTKB00ARZQ*6}-C8UyKo_R>l{0by+_w(-T%)I~C z_)AKzvf%h0=k9<_J)1$=nVHTKQ(h+kV1QZ8TKX=TL8V$J#_3}f?2jb2iyegxtzry;&W)&nEOv0a7}*M zLquv2@3V_Q$CMPCKvblp;r`@uK&lHdP5yldTDiH_6V$ajhEHy{V(f36-89HG?#N#- zenqUopuNrMTc&uAEhuRtd7y=YZL^;Ybgm}aSEj4<*Ck^>4li-Ds<9%mSKqpn3Jf{~ z$$T%2wj`%}#*b-5;16NP6QAr;1Mh-}AZnFiPM1N2+0Wn{GI3(O!iOm@-Cp}A_2OwQ zb7s}n(pi{h_M>JM@v9d2tO#TvO|%s>p2bnJmERMRsft4=d=7Hc0RYoe8uF?Em z)kr38$<>s@dY<5jA7#wt|H+{=56tWUEU^m;R}`T_36c*K?T2fm?$&v;*4PsWBiKFe zpPN?ITtaLC&{2=J{}UsUfyw!ti3-=A#_}SbEo{=vcRN7tAB_~86#ys-#v7mMa=bqd z$|o}PLJ?6XmwIat0E;6jFko|tqb3)#zKj8F6qKQxv?B7O*-<|6mp|7BFS6Sj1LHt; zfz7;3rLX;hji_TtB#jGHPCRq;kPhr0Gh=Ij2Me zPW5MZvK*W?qMevf#N5B54Q;#+iFV0fY7Q#D+|`X@>x}z*L)CCan&V!Uv?8=kvc(re zMoDpgiOT6j2&#VW))t*5+=H9tm`{bs76wBi-JnefDPGyLq&)3$z3Q5%9pE2=fjI*H zs}CzA3tq6(j~|1+iikDdWZBikgk8mp$&3jz7?Es?p`Edl2(8*XO}FEb_7)N9K4Oqe@XYvf$v}nR-8d) zMrBIV&u?6`95QZh#t?F0L*S8H`Mw8K)EVI+czEJrVq8{~J|{cZwJMrif-=?7(s(wO(xcn2 zbXmdsHQuMj50l0q<8)|K(#^~+X>#-rCJ=L_x= zdjV?W+cVvc8MUMT`qL2Z@X=iqSOBhG_JrKyZEWS~&B{I#w{P7zDVEtAp(p)K2PV8E zJp+^8&#IjBw{k-9x#G%9amr>B=)pga=eHn)lPHd$I)H<90cvQmW9y=bAEu<|g>%Gp zBw#tVA!D`tWECZtJI zxoUMsX{M-P9J6udjrq92zTXRmDxQ&?$9#f)PSi%#NEP1vh>b^kIpgo>^;~@MWb6HNI}y3;2};UCrJH&L zC5LyEKhDM~P1uS=|A>td-$s}nvr^fMJUliq*l1T#sZI$6hf6?3QFS1CR;EVa{_25t zWt&^wvXN&#WwCq%qFZ}|M5b`#BRX~9x$p>wqP)~XR=2P*)&oWph*b(d3^fDi(LvQm9qdp zi3kIMI+@rU;J7Byx_rmc2FU0=DUjmpL1TGV?_LuTDP}cT$I!>WV7#%Y7y&IdT)iy8 zz}VHf;%`xX;}*H$NyRkbZT)}$*V0wTQi^-pigkn2^bbNK%b!3~7_;MB25He@G#7e|xj8J^;Ft%SGZH$t0yl^$7O*1MHHXXY*%s@ z@%i21cBT76jctWHek$HL9g{}Ww%Rb{JdE3&?u7z9{-)SYU zJ-BmKEfF2CNa-=0B)nKn+?tQVgzPxVlp&zKhc#~EJ81qmfh z`TdR|V00I$mDn;z$Go8aSZ36;gWdO(4}LvQ+AONkxd*3>yIDqwOPOM;S!Zfzb!ks* z4DW03kc(rY-}sp)5UG84h%xvim%ykK4In?LTqyLO|9KV>?4ELta!%3nwo3Q_z6`QM zc=Z<@Rn^hA{%AE8m{+aX)Td1oW3*Jl^uN~g7WjHlP-3xyVo<%p+Qfv%IOe8cu|^Qj z@kltj3AO|c%8%OP5RC*esOEsEr&6wvWu|HvkE8byq^?ngyoa zj=WudqXodgRSD%DM%&ufBHd5#MCL57jitoP6VyBxz8ph&g($q2O~mOx!*9Y;b_C z!W1dcVQ>Jt4I2t_5r_xng_Qi@y*{Yr*tGI;0eOh5_g$*X;Bb-(qmP`s>f*GSw$d55srhBmCW7D2M}_uDjPoBP)~d7r-T8k{Qa!~H)&uY5Dsflq zR*~oraz?t$*O{H`nyCg-2!zN+&BpjGeV{rNf5d6BpcL=7=8={9!Eo0$Ip2s0UBMOo zktd%C+_6spp|)|2(Wd8KQ6rtmI?Ckx_zcb_6F~Wr`_8E51^uXvj+f1%PfO7!uy1`_ z4eovX}HZ~w22T;mqUV&4%ku&8{r$PkE2elX9+ zsM8Rc*VSBbx{D<`T6=QgPHx_)*V1su%_R{wOmuP0woa}JR*5!Ss!k4}BHpDg=cuxkwL@4+usY+$f)#FjcN z1DXGm|853@9JT8>gX%Hofgv0*3bm zebiv#a!o8}uvWvtwY9~~$aZtsOr1WpYr35~6WzVf%b>V%_#4E^T*O4YDpt&^GFe}w zyKpZlRi8s={pwGJj*_i^PS(Mc0q3K0_N5D)N<7Pmj`3B4Ipd}XvM2`L#PdV`*QU(MCQ&K8JNw8l>>@sDc-Gx0dxThjOTL}<4#Z0MmrXaLhzvnvNt z03cnVrG7fT0@+%*HsLd^$hQSAW#H0*B|9Oc-%TNue@Zqki0muSzJ)Ic7jX(Mv^B|3 za|j&Y$AIPKJkG+giYkVs;M3Fx`Dn_^g&>U(dhsjYx@^bV>;TwmT>U{We&$pLRSrgV zFcr0Gizns!fsRUk;QTMmsn&QPtwD>k!f5G%VA9?u6V@wxIF8N;+6!SCQ(SKKB8A2D z_ki8ZdCZAME)2D0&x@lA+PicV5&B)h6B87=I#|#PN9Th`bx*s~^X)W@h>N~`EZ>}y z%QQ;*+*eRP5muT=;WY!*L8y8HN3g$DhD&=cuD{aasH|ZJBch8DGp5w&IwxHX1URj5 zF_7m0>vV&4|Z$-mpBoC9-a8FJ;Fe;=UR4mJHjK zx#jnDVD6!d2rLgD!a`K$ptC_MG5X2HYgM69{C*OhoQhckh83y^T}{PRq6OgxCSo7I zpuBQz3OeigUYE3h7ITj$wLa*xl-XB*G2q>ZIC`CsG!E|j_>WN5Z>DvWy7-?=Gl~;2 zfFFD`u_A6mL(HZmd~A@0fdqbgiXy0s$cU&bTKP(_ z0`-daJ<3U?UDU308b|dI!22`6VkH6T`vfZvFCB(u@P-#)84T-Ph)h#bbW>7$RIeV} z5tvD_y*sVI_aZH3$KrHFNh z+d0cgx(CqxSzF<`U3ZIxIDc@I`Tj1{nFfOB00PlgGPPqmJN~r#4LvDVndj%qE~~Tx z-G|S^hnag(;J&2fO>;R*2dz%sMC?k>t|^iuS^D2kJQ%C%L+<@Xl@iDswu(G-u%1f! z!6!+YTmUEa{n3Gs&>Y77;@j~*dg_hdJA>F#ajzn_C41}R4NpWv2Gsx9!UJwErrT#= z@}h&ClwHKsfRa-*> zp7vFQTV^+n@!ji+FEbJ_Vx>}Hx0o21XiA)MCS`sVs3z1z!4rGY!G4>*d>KEjP2dAp z$!D&x#f)z(wlgpir$INh9z~z(oJx!?)tIhN{w9=xu@?i3ks!(I>7lK2%aJbBH@4&br&ZdZ?pu_oLlp=VQt*rEz-^yBvOC*8!*Be2_B$!zH}qnM^>?t z0{FCyl7BF*{shGB-RUwvxr(cQuGGCFWHJgD0z0x_N3Oaf{2o~6)WRU<8z5*mz7T_K zc-L)5rMm3uemi|lS|c<)7N!qXl0){uqEqnY?|Dp2NsM>g4;o8JHCGOmPiLDPkul z?pYe$s&zUbRea#uhmjZoaypOSiRd7Z%j|#PqUD+)8@lL zdJNd_j{yQ({eq_#Wwx0q*+PEF*_b1nS++RfRRCSY^-|@9*pR_j8PW$1NFsxmOfa^v z!fN2s>X(YEn0QYjqz#*+M<>$<1&y6^N!qCiV(lozw8-MTlMk`5ZiO}?i0Rqgq_qvg zHd*efE=DQw+{3MWrw-IT*?@v$Nx1#;7bnhgW5~W+c|!l1#YiUF+AHpng_N(mLasG7 zywA8k#}WDh-;=3?+s&(*IxgE_h52CA*(*;nzK{e*4PM~0K~896)A<*X{X90NZvmb6 z^&-p{M|0Xz>1nPw{S(!yN3^4_vB});3$d8}zpHY0QX>J~t%ZxPr24&xY*{)@j$IXo zJo&j6hGLCe;yac1y<19DX>M1dT}l}>NXRRa76@9Omq&Ib1MRXo=l(hOUQ8Wua#sE% z&;;e{ohO!t%-cHl)UtBb$J@XMbMBYMuQVR^8;_9$8F4h%&?G;NpXtp;xzwk`Grb0D zS)c;RC;dsg@#7rFA>Dx5iw&tUC&NL0|1C2HzF1iPSat7(`DZjxG3sM3p5K%&^ypS< zl7r}CKaH|cl1qx-i_P>U$(P07Rl$Z5NxnkCHmcU5s{GQJ6?5a}_*@GJk`LXnj*b#h z?=aZOwtA`zeKMGrZZ`jWo7tn6^VS6i0z z|F@tTLOnJpl0Os66O-7!hLZ*=bZ_OI`iChu)zH8Pq#ar*Hc_;!N?@wjb(NE9FLbuS+M|yKz28I6OQ)Am^3SD7JNgjqqaculdhQ z1)UW$o0B8A0x}dXumrvek!8jvL05-#&CW=%x*I@mV+iu{cN9|Y;Opq z{TVxb#W5`cb>1iadOxQS(E;B%9;6=`&}*XDU~dD5dB0QP+oE*pm_#=sNb=g` zSZV*KA!6=Kpu%$3=g_9z9EWVa2{*X$#pyh}l&5itJvK182TB<|bU2cUthg`@hwzlO z_P^K_jHg2m=ROl3x7e5n7Snx5GDNJjBUYFL2d%02M7gaYj+x0LCSvlw7N$~NR0<~m z(WGsAshA*aQ_@%w*PP)L%IFBF>=LlBqRWh)pvTo+<+Y#teA2g3sKci$GT)VoG7c4O z;R}^MsRB@b#>_IEn@j0`$|kw#)D3flM}SACtOw!0GSIgQ#Vo^{>%7Snodra@is(GF zVw*jTsLhyCeK!CcvVjZB1Lx$!ir>M}m&t?YZz@S(9;t@R^sA@>(6k>cQEjKxQVH(J|L@T$w9rh?HuNJ#Vs267mNdt2NWz<#3bjrZV;V z=aM{mJxHzTjZaSJ1P$6Bo?G&v14P5YmP_+S6bq{YIzqX5542l^>iUga6#|K)&@N*} zd+hbwhSqN;^@CyUV`J%_^=cRzsLcM!-$83`Twk4?+yZ6Z_j=K9u2Li?6#Co|y>QFT zxwyHd@J=*ak}2Dxo>nsvSPOm%o?I%Xm`y44F)>>A5RGA!t9CY_AV!?IDv!GjP*jMW zczdIJ6Lq4m%p~8-ekq3TI@!3NVXH(?==tF? z#M^D*J0?cHc%x=8szSc>nXCUsf7bcZg&#A0PBKY6ui2=6Y>y5!=ktiP5zzFJW~EFS zNwA*otK}IzVSWa1Io@C=4Ol1@s_uM10RXMF$%s0uwhF7br=FYUzRl+2&ncob|lB@pJ)_{C*h#y$Y#;t$`Rq^FLLkWzjSRc;yz;cK5cN5I$ zz8PF6U<@!dIcrYrd~FF6d?J488@}fuTUZs52HAF|F<88W)Yr1+4E&t_{uWP zdztv94$;sSmUfV<9{Ml_fmbL9|bw^fhptX-car z@FSb|!Av8h^fK_Xm}t5zF7RGgi9xj&zG$j}vo3L>p4>(v@Vu9_lwACMNUuv)ZlnYN z8rIK46#9tim-A@%(b2)w<+}1F!jaY_q4;fiGHrBhh<(&!cU~a@99j614dtQHb(r!X zBS2LAnYFCOaI2tl?hIOSnPizo|43En^e$=|N5?A>JSI!(((t$U;_~1HpL|_|S#0)z z^y5oVGI5?UxseEenmR?*xi0KyqX2Hdy9R zDt>ADg1g16b?PC|-Dj?%!>}h3Id0wAU|ak^7!_)ey8)$6IvzH*l;&^1gp|7K^`Oq{ zvP4c5X03qd@cozM$o9Oxg8;3W^tP&11Y-TPcSUG0!FYiYpZpy}z`z@XxCT5F)o<}m zL(!Du3sz0%EOIBXdWHPVMPKw6c^ih~n>uu?>5DCUqV{x_{6OLOB>66oa(-NDyFMa&xjC z7y4W0MYtI!OL|QIwQ6@{PQ~5MRNBpCb5Jc6>!>bnAxa%m76@d*XU0Gr^k7*)xe`>BEF;+}BHC<(#mlFit9=okBu3g!;Iq7iV>!TrpC_P(V0bfa?wlq!kH!46Id$0X5Z z6QovNRv@fOEN0IL))%4J&R*cyMzcTP3C2-J&gNEEFG)(v6Lwb4wrb&=oa@b_NmVpk z{Aat~RF$|%aE_`sV6lAN8jrawOri#_nYb)7H5IO< zHc3>hDelEYL4Lw|vnn#jvs^;b?{Cx0!W_CiMXN!j#(K5k;`)##laVO;0| z2^=q+DK%*>aVYY#wqxOW+t4*$!^m|@{jk*F&>U28r`-E-Y7A4{DZFxhE`I1G?4C5Q z%;{$B!@pETe3D%Vs9-%f2U~R-S*l*enh(f~)_xlmVo%tc^IVfDm}$zN!4Rz1ZUqma zPbt`g#9&yJLaVJ}c|I86TM+dySW%TsK`u2&(kY6(bNmk`%W~aK@z;|U4mlmXs}i5{ zbE8`ie>}e?E0vfAv|183<bJz}CuV7LD>vsmoh2v#8?3h=!h6>rN41O0j)4%uRLM4;bi7GZPexZ;` z=eW!UXfukFG~Ns<@6a+yi(-5HF*X6ZsC{eg**{{>ZHH04)T;_;z0%a_NfIkSQV?XN-m|AcUKp&2f zo==VjcVQZ+cmOoTDxMRgi#8A8f4DZ2pQ$`2DdN5{eB#+bK@~UVNl{ zjGt=O*5g*FS#xahxnDIyH{$aNoo~YWGn^2l`2)IeHR2J~+cfuybzFNL#NDm*Y0v%v za`92rgko?=(-S8XDFq5Xhu)muLn&3!87a0eI&MOuul?&Q2q^~m1E95BP*D9F%(Fgh zzQ_L|Ml036^Ii)2pC8;&BC#25Rz!hWf?b1STZS4^CpeIfT{-C;LzG3Ze8Li{j^=O* zyT_~dhoWe~%)N)(&r`58csG8Trg^KxK`?X$P$>~nU7(sLu|Ce{rEs$(-4wC{AK{+W z!*wYjJ|7u%V3zx)J(KVC&mlo7mR$-qRLNC`bqUp~1YGt${9uJ)h{xF%F$?Q~)2PDS z20TX&CFLSG&=>Cu|JX_$nl*9>@jhWgntf3 z#6Vnil9o7QmJ;F6Q47JOLRC?m^K;)R)i#Fyb=;nR{#Emd zY3qujZv~IoPs<7}WXd22d1azv7din|6qurQzsXvtNdb?@fl3{@l`V1^zS6oX%RSI& zicN4BX`GNN>&gPGZPDAkOj(RelCxWY$y013Xzr+^gRf~(Z9#`^^hJ{0!_Vv;fy`(V zEmq(^U@OO`mdaM8+M{^bd=bs*R2Q)+;cAQmXbr8Q%L)a^EWY3-sAcJLt3f=kHuqgJ zT2%e@vJ*B;x(J2`Q>7gQzcKOA|7WgS5`5vgH`Lb8K_>=j-8F{Mn5Pb3`MCF{V~C7? z;)R{}01~G4#&6E{QcGu?Eq%;n-0;j>9E{IwfCTXY;`k?a2+}@C!O&A$-DFnXPL7dI z%i!0BkdYSTGhI)-?%>%tis`Ivh)Jz?Q^Y4;tV4oxkF#T(-&t_-LiAPb9Vz9UZI96b zi4^jWER~io9$1!`b%{`Inm&z1Pe0)WK3JJ~CueiL(dWQH0x7W*EF38ssgy32PlYq!)gjl5aJGc~PuvNb#T+?uo6c(a!)@P9G!6b{{>rc! zNai5E6(L9+gW?}?l0CpI8!%U&?mYZn=44}{Eu^-i>BL*(w}y${Sv!g*l^cU-Ti+>k zq;Ehu-MSo9@apl9&LNb>G;LnwU$B_JR9laW3w)N*RX}OL8?M7=;B&iyileW|{SS!A z&{pcR5XIQ7o<0&AgxR&bNa8Q5>O<=I=NqV#IsWE0W-UGjW5!qViC!2pq)clG47XnQ zkwPRz8_v3STaKmKNI@OGMNW$p{0?KFa-{5nNkp5}Lokt%E0e-DH@+mWS6W@LDX zjqg}s8?@mj#XhXX(vGZb!#G>^e0Qi8dx{zv8J^H4BsvEsnw@6w+La;Rh>z;@KVhw> zoxq+s3<KylGm0@l z&d*dIzh%Ko>UnDr4)S>@res4cVLX@Ha@O<^rnGyO6mo1uhci+zIpccVC>jw7;dCw=kA1UP(wA8j|oGVSs+ zx#b6OrJ=R4?o4(Dx65!Ouyjxf;z*_Pfz#1Qd)b8{J6#|C+Y6OCNt6*n)vMO~(N>SQ z5j=B%NEbenc>%YVbs&#&H~D^q?q&gI+L3eTADvkD{GDd9gRBo2#QOgUt;tuS_^_|VrAy$BY9pOEe1y*2(HP!JDSEY+gl!c$zjG)B6G?Z5x9=7q zm8x7#VAj5q7zuvUWf6T8=tmK5#+#pA$8euYK+AjlF(Jbvekht#Wm? zMJjdyLEZh{(go@Qi0mShf)Ys#zQiC?aGvuH0fTyqOq4^c3T?hXG%L{xb|Qh*=a!2m z%aw5XBR!{~Of^=eMXoZ3piCZ@csF(^E0f7KudXoTExU^#5&|vmHZPvs1`?JhJ?9>V zY)WhrvlY14YRDR({I6SqA*Z~SyYB>Hbb{yIAT#!ILrXevYXvw3>odc zFCA^4Eo?EcRgkZN{ml4<%}`!De2Xw$cEht%jkp1UF;z*2z;H$t#Br2uNYf30pFnh) z`OkQRe~EabOvghm*7Nxu;&m8*Sj`omgGe!(|**-4$ZQ3s-P+ zmrCxO?iaQ9%nQrpxuYxHBXh>%qUxh&Mtq>OTAQ~Xd|Gj|GI(dy0ga_4j zXqobZ#N+&DJEEXpUJO5wBHGQu@=uB7e7{`gaJMr8>BZBQ5E6pt-C3w0Af%9(GG{Jw zKPOSq3A{md99UFK+6ZhXOl&iazAme*!@ws%;WZO8v#kwUsrG8 z@AKfjAlJ;3YTC{DU>%gF+2ksPI);;o;vp!Ijh2r-%rw5m;mR{|kR}x>>x&=HSf6E&a)))m)9luIe8=b=_Ty z`r%H*$e-)o2>mF~@fy>9#f&%elP?TJw25ajb~{f0Ai3Z#i>AJ9zVA@YTinFok^}&Z zbpq=rYMF#8aAbyH3^AFHg zeNRO7YwB2c5~A63Vn?dUbPUkQ!PVY(gd(7*N$i~EkrVk-aI9-9^g|MJ8?l)zP=`n; z$57?6!JPjv;BD4lVFhhdK8gx?Sa7jy?2qO!o4b(W3gbL25t#SHA{k$N_A?YlN&F(=#p0%=q;-uoKs9K`8lg8_mU|IK#Xt6He}MU~$v zDUcBPb9>2390iZuG1od&m31Ih)*SF`7J&1I_}$Aw3Yoxs(ni~NQtXXBwJ8zaU`{0_=tiqNIo)hTn_{q*Sq%K@NdUcacUF_XEJ8qIHF z|DoPYv)lK5Dfm4ieYs{%Ou8%UdIclF_9K{$_w$`iW6#(ee1$1==z~qjkU3TR)7X0J zDkgO+P97-r7;pW~!`-qfKOsG9sl7KkS9=tp4iu2TvY+j~UFk0x{bOZTIP473`~!Sq zi+|0Ej^F9tE~H0e&w?HZ6Mm$7cb>w!7{Qw^ka_=osgNmkRgLuGpCGw7T!8M3iQY?o?Q)h~Td85tgMG7p| z8S_q`EuKlvOG0Azc3X+T6$*idwN)dvj8=l}7z#OL6&4{5a=ZwL_y6Yi7Hf;Tjcn7Q ziM19h@JXELb8booO><*L}xclFb*cH1?=?)yUJ z16Xp<3gMNikUTn$VSe~ijR<8BM_xF7Ry-$uA6TW$Jf%U}Q%l}RF6!kMv1SFAwz+dD z03lo~SL83@?0ITrx$}}9A^{qe;<{ov%n8$YM5g!O;Wko48Amt+RUU}Y4@%yv@XO5h zYJ>l}4JH0uCMDQ{Zh(XrbQlR`nNVk+oo2@hDQOo@5AE2}!SXoH5XdarN`DAcApOH7 zM530I^DtghMk-XSo8d<|IG7|jLoFH)nkL@2FJ2#UQqSYIUEk6}y4KbzKOx7MXHXoy zJye<>t}OH%o~b_fh$j97z;j`?r(t|FG6xWdf7=Ko_ICjve&#W{K@?wXoThW{|E^$F zgG11BPKu7tILXG-WSU}MB*=A8{`(q6DhPT!vL)P|-q&j(U~H#Rm#%ZCX@Ue}Nc=!O zS@-%(x7!bJz9Uzpl7q5FZnE?4jY|{NiwGkxL5efb*>H@<%(eo72l8qb^p}3dtPx)_ zXgEDb*@AQaE%4Oio0%S{86{_=PNBMeg`yhMKWiDiB{VqeqSp0M_${#nTJz1;-b>n8 z{|oMU%l`)w&7iWU4%G6+;z^Az!#Qd57D7RoN~+f(!hZKE7que*3R3YRkwfl{_@a6& z2S~VQUt%%fyz?cID(%H)PkFU2dZH+j5rmC?*uzbC`yeJC!aUKtmL*uiy%3w&^5HKQ;Q8Tw=e-gc*w@Cc`;&Ux+XF zJd~aK3NJMS-=NB!F$+6zMu6oG(mjSZ$2esS@r_w4C1}HzLP>bnkC)67c0-H!7MH>S zWZ~-(-QERRl8z>OUUq8hj=VeFliavJpyZb?u7tYjvg9adhJIJ0!H`c20G{0UmMTPA zS_(%n2yAOQw__&{cEYd>s%~#%cfhgLA)Q4Pg@etm_GZ9($n;=r%nqt69pVqKg$kM> z@d`|Y(FUI5eX(GSG5;+5+Xvu26+FVEX5Zn{xTm3nMxr1fJBGkqZTYa^SRtA_QSZT< z1L6Cr5F|ME$98w3C*PFz))AcRao&*A8?GBEVTikg>WVA80uXz76EN~Te&2qhhjH9G z?l*{mPrL3}dXC$iOwHb}la3i|8Vvrc8Zm~f7*XeK`()i)2&>uyp1tO?4i1g;F{2U} zv?LH4;C>!}?GoK6@Plt>pQZe6yWN$j*w>{~$VA5>6MXWt(Ett~UUPh$`kY&iKCbN( zV1Vg!!az}C{chgMH^iy6nB-C^jpz%T_^HDg)F?+Gz8q|aR~izv8~GS#Hr04}By{Ab z|3~Y}b+&mO73wb^2)kk}n<)+Amxa*z^u#~tJdt3>TDhCmHD~+WmA>xGGPll#gv;XZ z0NF3)qt8hyW0VoD{Nh+N^bt6uqfn~QWI;gAo#!C9ePgR8a`u=C8L)~4IGaXwo z@}ZUM&Nq>|8+WGthALo#^y;DA%y|k*34m)U2F8EWY)DWf8RPIW=q9Yad1kc@<-Y=m zK=Z@H?AiJvIX=cY5KDaKOIn_MeG(I^Z`OIUpZy5B8PCqaeVlukhLfdV@BVqfkE?14 z1hK3N7#47ea!lp=@Bpb0G#kM?gK5(PB{AWkaA(duC)l}o%-s#oj{tB2eqNMb=Pr&f z!f{b}pIIA^YKKpH|NGdH#Pn_OO&8+3nHfF_t4W09hJU|5e!2j!-}KC0ob>28ia1-u z*-`U3T@CrD;}MQB%gWLi^H==R|5=~#S{e=llD@08>D$zw0nR&T3TrY$cLgs8zcsY$I8AOV)<104j1m zwESPwH1+rW+dOfW02JV~_l{V^6(w*(u1T!& zg;jy+20wZ>iCX$YEk9Qb%wul(Ibq92bS7B za>>On939u^udE`ep*i_IDl4`&Ba~ID-p&e-QII#-ISpB!`8Yp}+RV6>K8m*yfsA94mL{7oNQFZS@eIqbe%sMYln zYYfW*cn4TfwcVQA;az6ZXkIBz>r%?zXMnje=+>EMkwr4W^xOJ7pynelW>JiT3|zG~ zq1L+9k)qCMVT*wi;Ql( z>`0!p<7Tqhb2H@b9evn43f4u|3Kiw@ZA(-JrQ4)BI1`uCFjt3Xq{BXpFh*2iRgIKJF1z5(YYch_f9KwgoWFQ%M#VyGb5Qp*b4aI~jJcXumhYPw&$zKVx z|Iviy#i`Ma|Ig81bTEaw?#6|rc}Xs@1!dQF5s-GWQ5aja%^AE6#NnxBzlNX8daPz! zmUhgM5IM;ZQ^}qYE@j*4c%}4{ViU@AV9#fUP=^?}7&?zIA}5K|(0D)gG3Sq>`2RI) z(AisGNiO1re#0392PX-$L`v#>#RQvFiQZtzFZ%aWf>e`N`-iu%Rx3>nL|kmaMY6~| z7BaEBe@si?CLNHBWc0QxQ%chiKF8_P`8~MbSWJ2lrkCE=Vv}iXST6Ts9kr z*R?kXHgVabh!@#YF5Th@qieBcb5|fVqvaFBUzu6Df$Rw7-chVY7=dbEen9ePYu1|D z{Kbc&Pikh^a4U&vNz@^hbzBFVV+|$q-1uY}UU|Z3#@C{!`X1cv!yl#NOhjU5S0iE29D2BcSLwJKMR_8ny=e zs=bKbA@sE>Dk=u7IKQ(@@&L+&g2f~K=@@02dtC=| znYbfNH{=~)t+uhv1|EbfxYhAk$AE6p6Svahg@<4z2nHQO`)#3X_>8M{&JUU1R-6MK z1rxG`r=PUO7CdUJ2FPJt+&1$@@*~JLI4Pj8kH5_k5g4f@tlVbdE}5%M<=h#c_Bv4I zhyZ~0<)3_QACNfAHQq|c())D8tCnWw!Fb*h(a!iU|GO;bzT>KhH2PGQ2y7>LBvUU7 ziI`T-*r}&yx)wT926y>{If24@tI6|Nz_!#;gS?0zJ(Gkf>&yL;kN(!}8+8s^aM86N zH|3dE=5r5w{Nd_cC(6PR{jdKMbQ?{XO0r;_BWg1AR4fufqCKxnLwp1rnJQGb6W_Mx zPpb%0=5W11A8f#n@gL=bNi>9a(;?O?bN-N%6T1-OM(7ZYO{&kl{fHX50Ku zHB15JvuEsIK&SkQybf{V&wN9iGJPN8kL*oe5Ff3PtQM#)5(nyOVGBTF)WCja`rApZpia zA42*zE3eW5(y**R1%ItZdAZL6P*yo!=By5*Y#^MJ%wNEGKAHG@+ysJ?Gw_zx{{LA5 zDZmFUi4DM+;HK@vt0YR>(8^Ref3nH-Hm7)gQ{DB6a^WsnH8%eI;|impEwo?MM0P!f z_yXB9omgPHP)#Mch6nX4x^nVWw+n3WL%5JLj%Ta9;gsigFLV^^IYnamcTBZFi&%w0 zQG!Lx0t%6K=}=J_P#+v(N!fI=_|42r7Q|bs&aZ6DGE*n$T*9)+yOF(P|DMR0(pX01 zj+f?@?n2FAJ*f+~R~I8%or!+9zBqmPnj-0*g+`QkNC%l7Bfd*?fomI3k;!((T-!S#3oYUn)+)NR=8RzW`GbT zyEG+S6p8QfFFLRb9DGC_p9w+>6wy@7RDqS_kXQ9L&$6mYaBNOL0%rmkEsLPOyk|zM zNS+}tdpvwq)Tbg{b7M40i?^O42(dfYr578FVlP^`MI50)0S|?sv)oBbA3AU~f(1%) z|8ejs=9n6~Eq|HK^)u;~75m*nNp&X??uwMjZ7Vt#c>r^tHglCdY_9_Cpv`y#AW@Nh z&rlzv=2&N$$SFR)I;TM;46@OxL&NQ9pU-=mF!R6&fOe3IA3p^;`pQ?x|CxHPHlIDD zDq{X;h5UcBOeSC52|!c_#gBv;uf6;DQ)P)-8oZDhi1#6L|jvvg@4 zgkP{t%Sf)v?jv$W*QoR{|Aq?etWjMEJ)Ag6&{1?SibaLJcI#Z8WaG$AIP8S?(pQBngGsAl6J2P;meNnIokjQ3)5 zq;IgVppAgl4`*TO(1S5~-~XWnqv2gE^s#hiHMuZo+_LN9u2bfoAZ%@~jS0D+fhQET zD$s|c6L(}wZ5cJ@6ZhtbFHe6PKWkxs-%Vq|Y7z~;*%V)LIKxm#>$h_Aw7(mh8F zhUHUe)t1t;HdvuF8F#W=Pfz8aRbFp)up^>v`1N+~#?Ydf z^q1s3HekaaA^L|$?@#w=qhj7)c#U2rI_&AEMr#!Y9#2YWoFF?)%j^N*LkC~3#qQ;p z)KzvudKf8#;=JUz&`@T2A##8xDwb-&eGOi&tLS5^A;oPx&iqgaAySm_j!`4s@Go|3$m%9Im_9K`FHciADNFda;fpUHLc*O3l zq;VzuV148@38a>;nx?I@odO${>jlL2S^9^2odrCU(aHm{tg0!I_k?h`2US~OPw&W z`?Sn-k+)IInkz@4X4fNYZYTUXeHo2+Zo}&olq`_+fJnX%-DV2|=#wB(e#X=V9 z0Pz4aG`Dy@GvJG0c92&j^*Ovxrhp^AYtY)6ZN$CJ-NP*n;7<7+OIscbbY*g;9;p8r z8~@X(u1$2e=r1O-GJRh!G)L$9t{NeL@5E3;mue4%+;fAP)D_Wi6+W$y@|TIh}wDn zIHL8=qwuNtYHkynQ^hjos+IlzhAxeBM8vyZ6@QhhH%Vo+_UXWqg$WEm@O8H&dG9Se zyrnZ6pOfpwI9yeyrxwFyD3Vx?k}x^oOiYtMTJ}W)Y-m?>mzU2v-B08tf}{Oe(bHPQ4O%Se9&I#CJ+dzXDFfC)~ke4ZTgC!vt^m4y7KM%|@`efmV*l zO1>@Nqefm(+}A8;ghBx0eXqG?((nJuDo*%ks0^g1Zq2DKB^*2?m#0(K_*Z^-zS69& zw_LU1yER(Yu5Le59yo-xb>UGXMgco&I1MNBACyH;yEDJ!PbuwTH6k5+|1l0uiYei6ULuEvps*WqQxW0-mvNJX_mf5YyA^)-5&HYmBpPufjVeUE zs`71Ay>`#lV|S+d+u05D+b9+ko@4H4aw$rIGIgdch2VUQg4&WObFz%url9cNd8nwO z@#aUtr6PSSXM<)4$o^g!H;02s4~7QF`2)2WL6|_!_o=-)WCv;d;}Aa+R%~$BO8t+3 zv-t;w1?6pn0@LaFW1bcle`oMk`*V8Mz}cbT7`P9^1^;q?-HjVF{z6R(`+;>3N`?ZR z?EmgaBM%no4zj(=Zw9OxkWWSGdsCBoZ5z3*-~&m5v)&5hd~AD(D62}NTrwX9ZD$XP zD$)+wT!d0TGW=0;_VgUAyIXVd6MU0d7L8avc#ecMf@gMYA?c}c+~YIe9ytETMh54- zWfvp^gOz~_k46`VL$Oe559h*VSL;!^IXVUO-)u!l5*RZEvC=`I7rsps;I!a&lY9PM zSrd$W=O$#kzI>mc;=P3p(6rePwK3AAxC=2P$Pr?>60WGvVF@H_Rg8-?haUM^_t(t>*KTl z$H&*gF`ewXBjq}Oe+rq^N%z1Zv5Dq%rNyCxC(K-9!IDXfN#9=Ip@$D-#yydrBjM3e zg#bNf=VixZE)Iklm-XH%%eH|^2l)${A4-hNNd*2(01jmjmF*=Iwu)ijS(4^z1gpBA z&LOw0DLGZ|e&P|68;)0ly#wE}KVjq->)N6zy?t0^QLyvE+B-^x81gN!XXYgwy_Bk# zGZjO4(N3X>hCHrwXVBi=IqZL5cLpoU=XzOpePD@EhQi~P&tFDyBr*sB5OZwgkVd0^ zd$TtjxBP;)b%H~X*!M>NT_t~^WSq}SjB2nnGd9+*DdJej!NpNKE&VHMAM8lwR5`qT zaj6OGX0!k%VXoSO|+c=%@xL7%tfhiEo)>F z2UwG264@tAWrwWME_&yJ-jqaCTN~FDpghI^HSyV-tB>{1RNmcQpHhc<>8?FLv$vi}aM4mu-V(Ml(8!-seOZDkUHxVHwbi7Fu0Ca2Q6dGL z_$F?rjr5j9t9Ri5;|~z?&c|dn+8U>gcVj{)R=6gpQ#`fst+ZrhBK@w%c}a@+v$Q`3 zC3uQQBdzyj-u2ccHT&4<%=>@r34Dg-q$%^Y3q4_@%#q5Y^J66`N}k+X`oF)vDOxPw zH$7;TEDmO(i_Wk?GWK*v8t?7=Cek{$+v_XxSS8y9)uiDF!U-EuQ^6L)d{P$3Dh~Q8 zq8@ArA*ZdXX^Z1TogJ+Ms?E^8$Jgin;RN{S7@w@92S4NQ&lGx7S$)t61uSM%=(;q}X$o@tS_61I-YHIn7?@73i)Ns$!HDt%~p zEW4=0I4)WX4vn?O>ik&#T_IHfI1n3Q#YbTap$hIu<(iM(+!^*Gjk_%h9xpTX%LHK( z+p)J7RHeG>58%@gQ6qEsuoG7mPlfe9(gWXeU;J5wZ?QB0Dmi`aqM65#TTPd|Nj_l2 zdH2r7{=!5yti<8^x?LwBpFZy^4S8wt0;FrEV@KX8-4}x4b)esvr2RQdp9SlU>xB8i z>s3KeFA$u?wC;tj>afs*&%?4|$8!N6c_q#FjKuv9z|^>76`W8%D>3C)0JeYS)-%sT zDc<`LV2?<2$d0@dZvFQve_?`XE0diYgmINoAG=5HZ;EK4R2w5+mJxpR2;_H1cJnx5 zs9a3pY*sPSX(+9>>=*7q;;Ns{_xX3ojo?|PwZhIh0H{4^{`?`wQP*e=07rON+D5_W zoyZ(;22zdpRKfbL#3ZEPv-gA!rKGL*&K?2MsOEt+UQH?+M${MGPD=gu{8(~<3EB{;@Ko6w4bK@5s8c-u5!i6})7f4; z%wjYK&0`%zntPsKik_C-wVS?6ATkNkmWyL%`f1H!c^@N5=W)u$| z>prXPD&=jr#K`t~q38um*NVgv$pR8rRn(y6S$Y$GRy-wn{apLoy`I@VHNxcqSEn7) zNBCia$9tKD$;yN4i9;9iJ{t8k}euljZtJm$n})Vj}Dmq9(?y;v7!$#{P}yl zhv4rqg*u)cuP9c9jH$Q-%#yE9ss~F2OP5e|8OwfvX=?Dejn`#}yhny9;@twrvWW3Hk&& zqIg*hSoyX$1y5|WAJbdwF7;=F2s7x@w0CtXZ*93zqH z04f)zg-VAR&vfX9n|pKX-;{U!TEv8kib*D!Z4d%;OS%92i`}r-^8&Ee1!Eh`&xvpO zM5Ti1DATN&z=YI}Q*&LF0|@Jbg>gUq?b$CgJ&OGisu%u4k!E6ppb^OF@4CO14*N6K zk}c9v7BV7{!7jy#Q8azlLp&bIvnZVtP46f)GVH|P3LWTHi5~ZUyT&6PZ_asbpE$glGSe4a->ID8n3h?dOXsNWtZJU&a>F(ufLiJ( ze$8ib#`XlXYqZfE8VXHWJA&SRIyFXT%?z>(YQpiGHA-tL-k{*3ez<@Ofrgdovn){0 zQ4Gvx9O5YWq!3n9OF7=_sF@7)!E#OI@IrxDuFlTpH1MW&Y`j9;#%mgp*I|9zQ#=K@ zPGoovHab_o4EPR ztJKtfeczjG+L+x>6LgDDj=Ss*;krlDc*jk4{(23Cp_T=OK$ z)K&IyLIrPzRDwT_S0p$DurTLu)NIPkQ~ofC-YT&iaq8~u_V(fcdebu=C2na!SzNty zeWq)jp#3fZOa5r3GclaPuKhC-5Zoi^!giBEg4C^pef0=^wzUsbx3wd((p71aQRC*w zp)_o`ttd(lr^lTmc$@sDp@wXFeU-B(=!gBmg?z08H*9=RZe*ns$#M^Byk|~nVMd;? z{l1*%-7~mDtcup(k>g~_q90?Sdk5qLAg6JPL$Y&#VwbZJ$f|eIHLDe)>omiRH&(S)EOj^uZE<)3v!>3l~uT#(W< zl}esQh+inpO8$f?sFI6p+~qS6;3*A+VV9U%s%%RCw9wk~QJGmI;SdnLXSxI!+}NB7 zi;$brLc?(aNYqd!ofjECob3vnmD}l{A$A^4Of=yxNp46+<7_=4#W?DlWH+*o4mZ_O zJI%rj)GZCN0alG68h2><%}sFSYfPhpYvTY?=`dz4?ZaPXbEO8;R)xEX-kFMEpM{SS zC(|}cQ$qFj&<@Dnti)y&QoY(@jBvz9<_Qo@!h=p^m=+u$oF_xHFN~X(tW#HK?!J4H zyj1L@VHC&&A?94Fr&oAku%e0AN69|?@n?-tWj=SEHrvM#iZ-(7DO#Uj%7W|{*N^Cn z)EBz#w7wXj_dwQ?+3hDQ_Ov16B5RjtW&WpH+24nJ9sdqqkp7ywX6{Q5%{^I8dGzt!A$kbjU3w z4CW85gubN%+;Y8MiwBnYX4qAA8t&> zu_t7j=$hjbIjc3>gmXRGT2LL{zNi`R%elVM#=nth*qkvf&sbs{$V4UNj1 zIOxGWBGh!S`K8-5hY4#;d7k{kX)_5ZlJM37^Yahs#`@<&%p`Ip`gdQR4xK<1a|_sm zOZM^k7-VMtz`9O(BcU8*meni>=AQPV3U&W|Q00imH^Z(l4fe5;SKl-iBE?6Vqtm}f zhr(=1KNH3(1}MdRP}v=R@}7OfL3sVIG}WQL)J!`fV@J2M7UkIHev}s>L&lyVv;3nh zdT*Tm23--au?_cmm9ME}IONn_tS9*4_Lp3FX^Rdy)@du!8?I7e*X!{{aNXWS9^WjS zO5iP=vI%Xh)XVI$SHwd#`Kspv_%kir-@iO~-!^RvPWGgT zprUw6IG+hkU>ey!K&+?)u-z!`DQv~F8E$YtBU zT1jnTxwQWKOsfUEFU8r$QN}wbf>a9{j|Xqw+Lz|_1q|-I=je4id%gK4j>zuF!0c~> z)AYom@A3{NemiF0aG0SlI6OxC!x55E(Hv6i;s>9AYzV}Wgk_C#hLrw!zjkV;5yghC zyG*x*&GW(1h&m+4)EE7T`4n^IyLwkOLn6*njRcew@az>d>_zTl35G4e~bG$wWS zWdpoU+|-_bxxeDf2G|IL%hbgS(p%|e)GMvb#oL4(iO%n=wY3gHj%m>Q>&oijPzLa41J?}@~r{JHHpFx$^JY;ks zn$K#dXS%uupa+eY)nf)!c-KN^Z>?)15k;w6oqNILs-m~c(o{Z;`v)N_9WC4-ae}3- z8Z$0QGA|q#{WYFK6p^>Q0%xo>Pl$=F8*qhKif+CDkik7sGA8IH`cVK5IY8#BcvPJfr_<%h z6zv}Fp}qcjZ>Iv9_?f+=IpJGYCex~%FUdKJhuNPmhb;!-R3eJuNCYp%r;98eyOhym zAiID##{E}_`?-RWBF@G~xGF}v;uu-`cEN7$?gHKVD*G17j8p56uu;|>y_kBb6IbgA z;L+k37C*j6HftC2#7x2s3q2)kzOTuV8wt-uVHv;7H~^rj%*o%ji1JRt{4KN*|O1efyMI`43&-T5Nex`p9cIi%uvhO{JfT!zDrIzLMB+ z?4lU3_pwPdVE@H2we&9dL8^Ccyy{ORmJsn@e+Ff*=P7XsWkoHDbM!ZN zV5q!Zsb!f8rLep^Gb9<7236%j}!~U55p4z6;MOL4~(2U$i zKXuobNqdLjL6u7)^ce^)sZXNaBL&QL!*{%=zu01|s(9J}baRG6Mp48>MJbc}MpOv6 z1ZNUrQV5zCd(O}3LlrZ^k5aABdHWr~R~)0qQ}381!)}Q93NT{|;XZH-FEI zx3TS4ulOijN)wA)9i&51%xgN`zBxNM)uw8csy_7Xz9}|)SNiBjeuQ-Zjhx4#THx;d zwqGY>>&o8VM%nG1JKn{Qc6rTK5@>wcOH5n4B2cx%E!nlDF{W_s*OmC zYd199?QCapH$*ti+7%C0jq^=y^lRC%^nKf(n^m?i#W%3u{hRbC+%PU^$TJgpwFod( zZhY4LFD3oP)-9bFbQ$hDycz!sZ4wNFV>@vXrA$hd*r=MMW7V6RSrKkvl>Oh^pa@>eIE5rJid8xoe+j-1|!{p8X@L$|mHc+TWa9c7KS!p9h;=;v)PO2b()9RiF4K2aRy+!AHgfGUS{z%S za)3o=6h0!>%Mr0(nfy`qql^4+8l*(T&EKv(-7rA)AA&a5cQIf34X{pszsu9?r#v}{hlBq647p1)`byV-E74<9>5l+1p<~&`-EN1 z52e)KZf>h}dI&obHX7jI#b*!bPO+#u#jxxfSq8b^+=sX_i3X=08NbC%ZmYUELqfF{ zJMT^?P`}UWFI??o&h7Wq$rkjL`7+h6nHfvhy5v@KFYZQx&n$*Zvn3V4jU7}DyhKn> zINctHJ#DxZiwPUZvHMSD=MJ@I9x9+c)5PL?;8(uZWN&*#eB`HXG6S?Xy&iFx&jFpnIdbnDUx5fx;}3G zrFOs@kc=|4dd^i@RBPe!9ed`Pn7I~Zl5TfSYgX#REv!bL`NiXK5Jd%rC|+`yUi-&` zM8pZFWDhxgAL3#5#(T^v-+dS?*$txWMH7z6T3ZVbG z|HblRWlZoqELQgTBzJlou@;4jT2lOqFpH=A5tj@s*sDdM0fLD^yD`mC%zbl#@~h8c zcvN)qCsu6=axXyf0pGq_W}V)lZXvR1vAjgkoPuYBbe`fTy`(f~HLo6chd})`e8CSK z1wSd_uA-8J`H&Vw@saoa@NX~F=l7(F&E+Pg*tT?zYI;mBLnz2k*d{I-s*S+rV8CrG zi`xOoLj$>wH1^wlFjjG?ESn9x9!@tbkZNOrXEOz27k8jBiSM~aN@Y=WpZt@m0QseX zq!nP(V*er&--Gk^qy-DyGTXYt36`ACFZ``WOO_y9wjXz)ip;#Vt7Y~oxb35? zvWf1FwHmD%8*hjTk*rUjL#s*jZ?(DNQZe4q*;F>c zu?!qv5&@}h7tAmy-66bgFtEyJHe%Bn>_M%6dPI(EKL~;<6!z5V7KdwV9qKsR*|p)r zmbd8(^e7AV)s05ayPx8bu=@#W!TJt+! ztolnkvmSkqCkyj@XF#96vNJs_tA8PX$vbS#(4R-m;_hLig!(y7`A0l7Y~Yl$vc;&X~DAvd7J;PPyOeka6 z%Hp=;s-QE?8A)r}xW}m)Rg_o>b8{ZXfyK?t0{&l6t1a(e9x?hNk`Mn}lzJ6x(`Sc4 z$?OZ1q@@uY|I>yQv#VzXxJJn7m5z-rK%qUgE>#a0ZuhQ~9PIWWj_Hpioz^}&U_xgCv+1h>!Z=TtZd43jPPDCt&OnyB*{nI zLbI`iXlC)IHF#6nWHK#4|I7rp)!xzqGYO;{pZxoN{6~P`!Pim2;p80(A>%ZHjc3_H zu3p$}H+^-l!e-4U9o?jKus3EA1|@QKZ|B263OYz8T- z*WpTN#xa9ca~>}i7Vd1ZsDe#xv>+0Tcoyw=9=~#0{s<*-IkTB>O}wr`)^xTemP#98 zI{jrxjP}sQX3Xdaz=Mz~6@wkew-uXQS6EDTwW^cfY|EU3umuN#Ku$@Yv@g#XWya-8 z>xc}gQ>k8jYpFWWX5|ghM6ncizqtKaUlV0BLohDDUQ4C4eTz~7*H#nKXEd^=Xi2o5 z1XWo{BFgdNOmpIl7fO^@!xA^3<^Zm>4DFoa6o~kN6!|Wi)VJViDc_LDA})TrVXXo` zIDrsnhW~$rw^X3@7i)~t7Sp?=r>D<Qyes#!)PqJL0CekKkk zQn*h2Nkm_pe23wtZu znF?XD)UGuA`Z8qJiFhIbOR{M{A{T_9G7dn5%|KLyWrD9SAF^L1%fDKs@>#0f*i>fm zR6X-n(if~o3r}#wMGAhA4g7%!lCe(o{skkgnY8hxsx;ZH8)(?nG(oMZv0!Wg8F&A2gav zr=aIBkhOAcj$E`lO@JBmhP~As_Z)gD@7Ipq($p6uSa57jvqLcY_V0t67=vSZx9VR1 znz+Lg<*IWSaeP#)2Ike~kc?!8Zn0`=&e9>RuS`X)N)F?+%L?&?a zz19|~%|ZdLhoX*IH(J;|DY#p-0GylH(-93=k5&FU?nX6}oK*fY)SfPqL#&!U-K?yJ z5c=o>J4!p$Xb4C@(z*pmOR?xURx6etwhRDmUjOWBL$)JTuZL=y$j`=wP0ayF@RDs& zR?YR!V@{E&D3dWfXnoJ)?LaR&dJc(>n+&v@RCiYA%7dojlRPZ(Mmcn;j;v5jf3~D_ zCJ#C>bNZXy-J;9`-Q|aWE99ZGjd@c|qlS6-gVqNN2onN8wG17eg+n<5TYMJO}-1N^p>U zX`N)Y=DxVd+Ii{aYe(9eQ@0rrx2Fp_62)0)PP4_!rierUKr52_GA_>~=kP#8Nx{zO z>Ja)Uua`S3l}8oU9n4@wjv=6d&u~1k!3Dq&U9?rODiZmOXB!L4vKGKqlyhUsR)MW4 z%$p8Y;sz}iB|_caD*byRXt&R+`z!}f!X_cT>1mX^2Gs(56v_`30WDp8MWg~7jG-@N zmUhPq#80MPib2ivb+Fv$A-@Cw4y3rJqvS`!_S??AuL3{&?v%}kYvZ-h(}*=T(3 zc+f9TQisFd1hOmH(KG;v{v)FD)96i4C*u%Y*(T(F-bA@BJ}PZZ;C7*zXuZ88dj@Yn z`zcd{9o|*4r)7-GzYN619TTD{=fi{5R)(MJOUWL(&K>s25x}RUx>07juy21kiwFp3 zZhBZdz~b&{7#@TK+AaMT9Jk-I8x=i6KnCzr1%?q!1vJKEgj%shs7wza9XahTuHBhW zoe&e>+%(5e#%8{)0=vK6^Ie;KLMHA~TTF!aC{6Dn=rkH#P#WwO>vi#KOoxr9=4ITi zx3A5h14(ujOl6krRodvk_;rBvjQ#yPs^@cv8N=s}@=S$6-8~albr^ z6^3TL38J!2UKrQcJ?Pop$Fw)at_mcMBNlhg0PfemELc}7AW)HSv?4r@DtPEU806i7@?pE>cYi`I$Q?n-5W0YRL)Ze)cwRzu?A|mLbQ}sq>X1z(A%VZ5 zg-eNT8;_bxfB&?TD$|djwhKLJpC*k~y(IiBk4>oTK$MJGMFqH+MeQcCS_NSO*(0*QX|)}TJ;B5H=hgd`JJ8OAz}nyVd=2W3!dzz-HupqcN` zSAo?6j$BM&MtjCJ7i9C%qUYc66bw94p+kx`4qZAsUuKsC;h5hKApvCE14vWZ`HAl% zcDdq6=HHIuT4LY7$ThaBcPf%RU6CXgbSSfu1D>09)quC>F zUb6|*s5?b54guGgsX5Gund;pq1NW;29ri3X8CQ=w_jAw0;SsB97y(6Bkrc2nZ50zdiX5adKu`tmgeNU*)Q1@+U*ae=0m?4e2DhkVK` zs!K}O$#x(Gk|Cr(1|xzES(xhI!}8l_gRVomBk<2JBbcV2T!ZF?Ya28}fV*a@K}-D? z3Kh8;pyo62r7j#i{PH`|!cV4LZ+uQ5=X43u%AFepUg06dV@+KOo<5;Cw_)<}?I5)xTyh;iJ$!rgZ6uSN2V|2Vl~4Jk%0g z-82)JOTNisR$MGx?-d$%H%j*tJeq6Qav>~4KbZA0N7}~4A{cdInqo_s%VF>W zLg6wSb$+h&SQw_;$5`fK4Q&|^(T1U>)1bshchR~fHviT#B_49b6u%4=M@583Bo#yKB!Ang&3sE*P4%UFd-wl=1>)6rkqmjH9!C*+Z>RF z0&E;fAQ5~UBkwsY7{Qvzs4RD~07%owta_l?cnv?%$F50wQ!YWrg^9*r7yYh{YBW_? zN~v_7eGt)EptcS+7^m>F3u{jo?Peh4nE0D0MScmWtu!u zt1i%&+R)EGkQ}ic+YrSPh1%VgroE9X4w2(Nw6iXXp`hr(C68=XblgMT9W0Bd@U4z{ z)6AsxBn!otg?ry%iA<&;!pe)3@s$LarjE~)nOqVcTG?Q{{$F11x4;n@D>6V2Lvf`E ziq58eVYwcB65Fs&!y(CriLTNTs{tYtc*X2@F74wSAb|h|pbgQQYf42jIC*3`;BNL; zR0>7R`s1Y39*MAIb7lOy+wdR&j%~M1sDPq$Pj@K{4#pA{M&L)&Rts^@7@S_?Bfre( zb~ygruHqJURm?Ez>;zj3b3jHk<1*4*)wa0(x<29>nNxNBqGR%!O=}LrU%V(0Rc5VJ zfHaC_)Mqxs)VyL5GAew}KVjXZzQ1g)hr_%V+L3nYv>ZsOy%GhpJ?iC6U^lO|B<&>> zkO{Z(h!8+QhQ}f%bPI>%C<$DzhGiz}#w5e3esl>~gNWDU+>>gf1lv7>YfT9oNtQt^ z$21$xK%*Xridm>sETJ_sxIHWQgvx1FL8v$)^lS5GYw##EP$*xL+IE>l*t*fv`bvkj z80xtB%lPR4b*QkxT6JaAm(FurAN|?ed)s_ZZKNQfX7+^htC!+Ku7jgY;H}oF5+V3x zT^sl6tPyLjiVM5|TUQDK3Y7O>`?F`+tM7e0C^<%qKN=ti;xwVJ-$2ePsE}_9Z`tnlU0cD_eO)4L)x#iab50k|FTH{0!m6Z!YB;qbD!sD z=%J1sirzqOo#a2buKtcDG`hKD6B}A7j|s0_e5)&SVmmoSrtWSQ>_!M!O)0)a3E;@J zK1t!71QfyvG;xp^DPB~TKqQBd77*pu{$$9`0gT#C zmsFK@Oyd?Q%E6K$j9OU(9{AO}#3|mLF+Fir1U9M|)vxuHY7m0n2~mr?gcQjFwG9?T zQFMI}#nlouyEGa(X}5ylvy|Q{SSm(E_jfK}di1h4TH*t70F~y1bD^nS4Z&nOWzIQg z{UZ9Q(UiymtCyvaG03Ht#0n3fZS$TA11}* zCIh?PnYmz0N+-EK?aNjt2b{>b_mN5?czRK`=(@FaXAn@5b5Y+n zTVqKG<2$Vo%AbOQ_aQ3oHv7ZbbI=^TTO#@;sL!V8bPC#IEh6kcZ3EZ*XOviK`#x#C zn^VTCcoHBTr0v(?dm_ZRm4tdFPE%{G?DqtnJtlw-x0s?t8_Pr0pfBxYf^*hkRE`^m z{cFt)-4mv1SaG{qV961U7o^jqmQfx_Nz{1I9Dkyy_H{7A zQRw&P%7y<`g3w}pd5&&)aphyLxTb4PxHR{(4TURnz8+qNDXiND)c2NH6h;tB*k%PI zUg*RB0DzqO<0Zj;%ESj-k07SfV-%cX^Ls4 z*0(}euoT1^GyNUf(Yz{W;6>mkuhj@F6{n1HK&=8)YV_ZZm|uBp^| z<9^Ihs1=BI04wFu3%@V!RA=TU7(s@H^X2RpiHBu9E{3=^l0YhXYEO9yofI)ZNbl1o zd0WRYohk!PQ3nM*j$7p1&v$ zX`SA3?!O8$Ws5wpt}oa39R>)O<^oK2N0JZ#Y=TgRaujiGD+y{bDzlqvQ&QS3CYW8G zeS&_E-LbkSK?yon9^fu3$59o9+N#}bsG9OO()U}t@x#CNiA+;b`wpAY`{kvcIG!F` zE5ME^ykJz$hDe=iF>)=&xGjs11_JpAR)`i}%7;O7-`pPuJo`($nZ>&Q$kkjG816Fzmq`v!ba0;(*<;~dUWsh z4Q*Ffrnb(w(E9MFr|$bYKi(;Pn7k&XysKZXW-*n672vEwQ zPNqIs&jOMQp@yQG%!7`N+5SdQ$BB`_heBP#)VFl9m!|?-)|I7l?bA#iS9SOB63I2h zz5HYv4Qq3S*a#<=4gIiC7#{)R>1j9t;9Yfl>A*(!BE&l7rBhJ2&LUJsXPZB&tI~zU z{B)Qw_Pv&a40GMYwRPonreHG1oNNCW+&L#U;Oqvud_2(=Q%*CoZH#6t%r<5gM}0Nh z$*ddQ3A>`A5u3iGm|@K-Z=POLDAGixrloEAR<4EU@StSMzp5OAO#G@2w54k7?c7Iy zcv7Ajbv**g_je31knrd{6^#WTs_%!_W$Q@KdV=XZAp-aUx#-rg#B7`43YtRP!NGY> zLl?{}f706jp$zqG{2Q&p#6)GnEUj1>4VUKoRzdiRaXYBG|g33|Hh1x&#h%lAv4 zV*c1gT(zq6>=7bi<-c)*{H*nYlIYG1lUK6pTbP|M!5KBse0UvRKr4XJ4wN@QSx@#| zb}U95YVu!Y^`Xw4{44DQ+%=>Dpd0m^h4^uAY+xD_ zeG&f+s7SK6Yt#`dGP?g{8%W#DG#CWeIav_)VM-9ca;Sx1rSVU&P?2T}Ox;pVKM&^)`?nR0z-r^m6 zA(=+f58=hX_i{DPJeuXcq-082Kixb{3))=7%rpJoSL8dwAmb~RWNIN|GKD8SaYA=5 zRd4-Y#QHh8d2={Is`;1TQ0I|xWkseQp@3w+e0T1`ZtJ3WHl?WcsWA?=p-^R0=Sa=))y2lS&4 z5h1IJ;y>1X32bS8na2@?l0v;#@Nv^@9oD8q{=*DU{6wO}!TG}D@}WC4pDY?)K z-ohpb@)H~r3^T?vA>F$W4^JksL%lWEf9^}xWLXqVW?w_{k2)8Q7m!mb;mSJFB;X2A zog72Txn9+HXyFF`{Sz;e?v3S15+RH+=q1S{+z>{n*6e7HA2ZGN!wv9)p+~|ITgjGegFj!&WRI45`M`D^Mz20T22Gp4jEDy1@wfI8C8~vDQ4nOMz}J!5^$3CwvIJ2}F-{n9Has zG(0{t;z<~b{l-G+L(0dq(XD}pCvSB*0QF9K0Po@^qdO{z%q}fWMigRrWPpS??-3){v<;4WZR_(5 z177Hh(Q&zB;X(EfAkZLCe!X+#X_^by?gn{MjTn?^MvXm&oJEwX7e;km*9q#czO0(8 zcvgd-*=|1bwQD=GnqCA$oAxn;o<&S=ubQ!3`OuoUcKd#w zDr*cv)n@w$;3~cQ$B5li1`3W5e0}AKHGifCp1~VFgg)Gw)D#BMLVUcxX7xAyDla^| zX4q~Xw(2>r%+Sf=C^=G2@y2nckUc9q6n6vqD4N;K6$2d@Km!ljo6xu7(!?{>U43~t zRUu*p!ga3@%=Ta>z>(9-4{j8skQ2-LiOzeGQf#{tNm}U?!}&5k4=)3#yDMacNa+O+ zxa3z!LoFco%=)lG-5qI=e=)wc2TM1}R|+Wd+`EckzZ3bh2bPaP1kuG|p)XG9%A##7 zn`pbw_jhS95nu#nsW;)$d^RDZKjA|_90l+YZTT*~BcbC_{hbW`;i?=?DSv>nG{$`r zSGV2KYL`wj=t4(R!)mzhpxj!M0&Ra^=LA~Qy^Rbqw6?sw+iy#SQy&J`IIa~6EFrl5 znr^%mvY!RIR)L%P>><~Xaa~Bobo+4_<7}Gr&nsb>#AINCMw2I!)mujJXnuz$CIECw z4a^TSjp+s82X!=sM=#^7#;}#4(zfN$Q;fDa`*vTpNXo$K<5k~LSq)rgM=4%Bja!3lfuoHxP4w}t4wkPmw= z(VaXETxH*uTbQmvB6~=(lKqO)=`*aN{qq@|9tPLd*z)u}V`pZJRXudXC$wFMug_Ck z3^_m~U8>DviCdUuWrWbo7SR~NR?W}Y;>g$f9+A(80lcl1^Chr&yZJyCv?h~0jweRE z=&GRE$4pFRwG4~PaG{$F%B}>9ki#nyl`+7{G?5Z3&fy`Z9jU8x9~43FY4F>Vd?<8c z8WV6KVp)Flu^eAkPePhQ$)!l^^8dY`6!%y`jl`ZkZ{NZ~iy;Z#fuL?@Q&&~GRg!4d zx`D5p??m|4?7t)X`UHc+e)InlJ6g8BsUMSLFObfoACab2tya;Crva5^76ZU>15V`T za7$GRsv(5_R_w8E#2DpTHX9BR`@Bq5JNSty4EmF0pf)vR8;GUPYCL^XrMUzfP5vr* zLpit=vt$5`{&ZoZf3({zcKE=hul7v%r{?a5v4dk_b)e}P=zX@nS(AcVz*xC8EDmdG zrD`wis@C`bf?3WYS0_$seEqPc;zg&JyTMvc?Z!LOAQ$r|pC9!y*`2hK(6#$@ZG!ca zH_Q_i?TeVO#8Qg;!o}p0g4ro@U1@YKvO#S{i`HqF%lr@WN1?MrpWauNftlpUOe-@2 zyIs0a!*?KM(RqIwdRkc*=O=OzD?oNEg`;dU8jv-(uNCUBil={N#V(#&1;6au{s6hjU_BQ%FVVhe-HkgG91sWs~uO6w*^6xF7JzeuWKo z?tPgZTAO1c1WMUgHx40pjn5T1uaK>mC0YCcP8RI}e5QAus<1K+&ug~i;iMWZM?(vL zAF1mCFUw9_&0FN}aXmRTwKkSq)}w4%%J-&tbrll^I6S9Nwjvb%D?Z}s$_1OgKq&IL z4=oDF2)5=bQC8xrzO7W``Q)eKM>%y;CK}jL)ER_cu=q|O&)znLOE|_t_2#fJ;ohKF zNV3~~PiJY|c%G6aU@L1|LNwDocfNdR_=+;Zgdg4T004NfG;wes2i~{@pA&n`ER>Oe zO_=N(gNbWe7N&~NUO^g}cQTE)BP4a{C`d@c93Nu^qf23u1=XrZGWu-;Sx5P!pySA= zsf3ab0$6*4BEcd$#d&0fQq&grwGo|X==tyWO~r9^wI2NDSNB49ROS&XMQRx&&Eoh1 zQcEt$mL+6Qk*0w7kHGVeQA~grrtU@YxCEd(M-!B;MkTs~2yaEFF7xI$I_drs1OLaK^s6pvOZ*E2 z<8<=H*AA0l-yzV)MHk=3q^*U`po0G0q%t-{>c#{>I+++bRMzgj6E6?Xf(z=kj`?$Y zfYZzdX%!7>>vf&QFgMl|_5;}vx*y}++FT{3NL_SWb&7DlbPnuX+K`m1$L(UU;^%rq zbo8`kZQ#`J3(z!17H=^tW40p90%3k>`%?q4QamqV2r7Ds-cBvRTQ)I!IQFImk_R%L zgq`J15ZLWq?cb7yaC$K=c^OsXXdjgIQ$4?vlW9(Y(;*q?Kh&Ws=qwtGV5G{m)o91q zVm?ksYFJ4x#@13(-T058KlP6%%OZiULk59A!;ttLn@DM3@My)SJmHQ)0WT3O>I9on zVosOrLO=mL)7OE}MZX;q2eNA^mOnBG0Z&k@6b16Yn7R z^wgxEHm=1W(DEig%)!M?4eSm%F5OId*w*a`l9RXsg*oNlE=JTCv{;f_wElM$kGhu_ z5F%#2l}x!oB}x0Ig&-F8avX7iWGJ|@C6}eVnbK>f)ByO>nECNE)dc5*lg@=1a(*hK z@WhKh%1BS{qzKgJ%TCD?94cbSX{ZnE5G6on3h=@~dJgXxo>!jaC^*!RJ(=Zf^~~HT zEK4LxSkiTUK2dQkGDe#kNehCO_5p7sO0h2s;N(;Ke8~xuusxPGC}Z|v zF7=wT)W!d$$Vzi0klT=rdRMmU0J}-OA_;rK->)kmgeqM&*8Nrn)H-0~n%qY_yKq{@ zr2RS-&&jG3q-NeYMn3Nz8e~8Yj042;f05D(WFbu{Hz7{w$evu>h!N5h#2>Ha^wIdU zt}J=}(uZhQ{9lzr1z5L-RXU_z)L?$lmZN?r!*M|my?`p_qR%q>8SY25rB7Z9-~h+n z@E98c`&v7YtdGXEY)}B`b=ScN1;eqBs=b`{+kq;6kp396AE9W#9QrBYG~Ei{X(Y`< z>M9k|4D=D3)xE)+egFbi{qGZFZ35|Gi-klObU!A2@;c9Y0lC(T{E)umd!BUfv0=e2 z88PrUTJmmNs4t0$$Twev;&(f&Ha;I9bj3T6W8sIWku46d8Ic}vZ|qQ^xEHaAAn+TV zOSLYfZRWq;AxAXrj5tA(L51el^XZG3Eiy#^oRo2{ZMhR=2Y(mRXxS~UFa+RAe~0_X zdMhQ>*W7PPOr8i7#^NQI_s#D{LmTF)+}o0t7RQUmLNj-`RI%d^AF=Pvb&4#7v(A`gk2KtbSg5o|JljsqpPeTt@qxcxNQ8sZ9givr zHfALMWnDcZ84(UDXB?HV0L~|=7!@M$tDa%ZK_CStOKLgF*no5Nw5xL+G-n$HE*#N- zsE-<5*0P_|m>4w?P-mNn1v!Wn$JKdnm(n5{K)TVT5ZFm|*>#IK9T_6=V#``yZgPDrU7WqI+-_LmMVVSD)jS!Ib z8hj7y!;0M)DgdVAw0O&8_lQ??;o}#D_6;Oe=%-3rcQ~<`V7k7$Aea+t6h~bHNsV{j zoGpf0X)%TM3_WM;vqZr)8&KZIjAnWi; zN>jN|i7;o6s?jZvyE|I%{crKQg5hIwTHE7 z=gp?G5)U|UfrPs|+7yV9Sm{5)ZxcVS(q5Xtr1df^9e><;CuRv<=e5km&&1AhtSHbs z{^?6rW7?V?D{_Yj-s9Snb z$;_K&yyhS%xDH)S?n<2zQKE6@8KB}0E8*qO))S4iP=2foeRT#IH3Fsfyxl%hB4Q9)UwN1(YIh8UZkLwvU= z8)i^h&HHg2YYFTqmD~a$bypwzSyFQ79r&wTOJY0h?I|JYhlhtTwU8aU*($X9YE8!y~%}(_XJ8hvDZb7ozr2S zrQeh~0B9F0m+8nadm={lNcF^>?aLrBx!{d^Orij!(Hp3oI+>{nW8{s-Afm_xBwvcN zieJSEcGPngqL%@@1C7I2#bmS20y>HA`4%f{@aJg_qWzL;u!ZISj;MwJC~SU@9tQ(A z2DN=c0(_SwQv?ylyE>n`8Wu!sP@N{jg$CBy<+5feL zK6K#fok^HQPC17$qPrc(L6qa#&?0GDsBJ7dth+VtT$aV~(T?)^<%5Ayc641xo<`Lm zQ525~&^ipRm-5HtiUnACAIi*uNT^+vxe5ovpEyv&N!k94 zR!ezLwEw`x%~a|Z?$v-dE45|LT*KM5GiUZ5(~dG(dy0QhSZ1qFzOF()>IP#Drj7_; z`}zM`D2hQcc2lctL%_6YLB&@$E)WS)T9)Bq%-AKh=f|%e@`Xq&dCzJZe~~PIptJhU zBf_SM+O#QAC@Zn69^?yEWxC=XY+R@4xU>3Qyk`b#{jE(z?7^1?Ix%cdiN0s&I-E!8 zEc*8VAcv;LlqxuDW`3%1rC8g$DaQkh@kAzMDig&ALL5g1Gr zXADhdQ1S4+3ADZG`xB9?-Ym61vvg|eMr|d94h*QYF7Fm6IXh}ohv3APad|$c*aUOC zwHC@{E-gM3#$8voA)=PvdJzL|NV3PfCA%WS*4=-mrL0ssKqKT) zZjkzt_dyh22LYG1u%q0kKC^*eqSpr0#`@oo1=`*~Pk<)km^2RtPjEEkNrAHE`!_K| z$QaxOZ-s0G_j+N1#*(jANr)ci%KS5)1O1T6+78-?ub`3?Rk47s{0*2Ix9AVJE z&l78hSsz(jyN*x7nOVhDO@lR~6i6RT4(-ihu-#;C;~>*Cx!kS=>e+}?L5EkeNjT!Z z;3~S1j>V*0P*4M8Q!-Wa^5jB;>vOmCQ(xKK;T864rw zt2uFobyvJx4(-(n=jH4k7fjnl2=VHQz*p%PEW6imyaK36xIS-uvs>^DOYc*-_8)1W zf=~Qk)BH_@jTKH+0Jemc(M0adN`1D)0US3c3!YRIz8rpsNSe+z^K-3J^Z-aMYACfW zE_sL8%aV$)(8;fg2KyuuSZ;P;(g_Z^jM`vN%T7yqm6LIGt*cnWtrQ9zxb?@AdTVKD z>q7!6aCQ+_$hLH1trgr1oDWFEa9^f zwmqZi#fT!G>@?p+-@MO}2vEhJ>6A#Dsc}(M=AG7@CZB~;+O_RcRxHBumPD{@oKBmK zG?q%Wt(9K3yY_8Q8oiu27c%F4py%t&XY+K9@vHr*|2;DkRVDe0Nd1}=EZnrqB&dDa z@gk07+EGz`e~uxly#@+IvJvpJ;;pS082G17?Rs8cPA%xv2Z)f{9o$Tl*ft-Q4XZ}g zfh_pPKX#k$DIfckh86a5Qqf!*pz15clT16u!?{IJ6af@V=#KmSR=E6Jd@;0h{6~Bi z`5mF;{KN8rR1E3d2~JZC&j4*?*$jlbskju%0%xVrrK^YaS`RPcCZ1Nfk2yz{#2MUK z!DwW)Pa_WjbF7kDN0oK&IANsAd*;hRd|p3YZUn{4p1X}qsw$$-_2WB5DB+jrRM*jl z2rf-iSQ`iyrl)?nLu;v(1x9XQ{C8$jr^A|(=<~ECx=zR-jywb%STBNiH+&Ia9E2nQ4yIuJ zhMhc_T6HV6q4Oo!jCC4JGT}reg~$`Ogg78~RYGyas4SYmboK#QSma9z`Ac7=#kwDN zZ^CcmzP*ThlvqfUw2DTzC`ve|KVIDF)(sR+F;!Zffx4f(W zYM;0{Tpn5Xikmd~vyW%a6vCw6#fi+t$QPw@HMI)cl!&?(^b0`zSiv4Z@a)huf(_dTS#!;)-g_G$#Hs2el{@qzPH15u*IXG>F#2|O#qd)u2mxP)}&|gP`uCBNGL&kHb*H~L;AX>S4$2hyXcCp7}Q-u z3FHf%(ttJ(p@IzPR^dCLb~NLf&^_QuF?`xH-~ceZN;P92RfMPQ*GpXxA<6Q}&#*Q_ zYV0#mROppE?cmrLjYnmfHF#6E1p8YF#o+V-)y0|jKIPI5XAxgaEP1>o88AgO3~zX5HQ~ zOJ_w%=}@!TBag0?CCxMByt59%%8u?(#Py%a6K+$!_gg8%>Qe$jNzdgL55V1cnCiU- zBq7{7DD!MSAKaZ@DYXQO@R={eqw0#WEsWN+j#R|?@8)_U+}077mOQ-#%KH%gNUZ_4 zoGQH?S3tJHNK-W_dMk)cZl&Ht&a2ve*Nz2JruuxsW+t8@je;|P{_!AYw`q}WIi znBZQyP*PhZhOP}tB3QP1*<7569Q85Yjn%C^?HpBU7bjKuFb~>_-LzF8k#W?<#qL0f zfmf|_+KHAy@XO4e(Sdmh8qt;O?;$yv$X{6R? zdQ1*Vhp|}+rWuMxB>ockcs*p^(kc*Ol71|`~wJaiF%Wyu|)~j*mljzLx%H8n*a@0umPj+4wTPmlvIZXNz zq`i}a2#XNR(MtzrLW>l2I{y*nrTdRqWb%pLxlHEnv7cnl6~M}_nPNlAhsWLW{_!)1 zw_k2JvTjjg*94&!SigzL-dCD$iP81E)pv`cDpz1ao0s8p#+Rh>9hpWHQ&E$LIA;z) ztAH=q9Z4wBrbTBrCOS^03-ujT6VBIKUD;mYA|1rGqB>sTyy zoS&fI4^@%ETi;={e!d;2Yj{=u>2V(IihI#RycL2cnqumNWyPm{)2LXHkNDno?xY+k za8CS?vV(*qfhuHcL9;nZRAH-2xI`J`{HC&9OtBb$wvMDhAwd2>%&rKlll~o^;1Z z-d2UK9@O5+W8Omy;!lU3RHJ%6wAh&6_8}aj9ZcQ}t;@eC$PM^If=^(ObC3hHWFj+H z!uv+I(g4!);KGsmp00(UF}<}GrFV{0%W~{dbqxJZJFjGKijQq@g_$Axo-CnaD7R6o z@eD0nFb%A3zURq;$<)9TmDw-9!k-`CDT^QWoA>36XGKa^XXuDX4!(d;1R+M6#f4K$ zqu2{|mn$=|2pHID zuaU zaI_MVI&bbo4s)BzID+a6lxC^Z=9%jQ0wp30qj!^v#YgOz`ds_f$fkIg@{&uf2WD^Q zH{+Vn29ho+(rq_E%JD#EI|8{yucuTdc7~U75%cQO7}P}*=jlvXW6D?*Oz|aDOaBxA zj-kQ?$H{`#%(8PaYAvgvU#Z6=+aCDv3x=mUJQsYRS|23w6nglUT4S1hC1umeTT1sQ z0l_VvoaUf`0qQl`EVDyJ>FVXCkPVEL@KZbaYh-A%(VkIz+Q6*weF#Ii59?}Z&}(D+ z=J40Q^ioVyyk+R_l!qw^T5jG0k1OcpFG+4wyRIJ;SxQIVkK?6{fVy8F(vA?sA{^I2 zQ?npK3!Pt{HV+ND7Gtd=5NCh@Tw1Ie0yXMOTsY5v(`ZJ>w-6Yoi3u zxz!#not`JQhm=(%HRL1-BB4BRaX3?O9DS$#As7)!c*)gIgJeaG8w7Zt5(|7olaX?N zX3~4;T$sWuv=nFal~RuvZ+QFk+@1#*Ka1x34XT(u)L(Em5cXw8aik>(SKxLLwl88) zy$7H90#MmjSS_b5;PI(qTL&115C^XrvaSrte3WEa&&lGq$Y`f7J~R|$Gys9yu~c8X zR_m9|sZcv4jFuve-xSqbtEga|^FVxvrM}5q+oQQuhb7ZTC&FqJydmEo zvtuzuu68Gg8g`v%h3l8M@H8-Xr^H4y)J|dELBIh9Lq&xWxi~z=Z&?Wx$u?%SA|yiC zcX3ruC%Gi@tP~pyuLN4*=IiH$$Ed+@+mnP6-kA+F)9NV7qI)khWL8YCPIR}jwlRTE z6EY!k1khsZTuzjj&STlSRD`K-n?CqgmsLPm7xDD=Ny~lVy_Mg8B%IeH!a%nq5W3!_ zN)yVUr+&Dm@ui1x7gi*ke}B#Suw>sdWv^dG`e{}L!ItCN+Qo}Ccx^M$0(Vn61)~#6 z*yGm1H0@W4Q9k|w>nUt-6{rP?1{kB!BpJX+1CLH5DO8eT-;*kL#Um^pevD<2&2K|sccUmX0XyRXpL=W>+G|f0903Wq&7AQw@)(%mZ6ZFoPhEaZL6)%PGZRoVqL>4Z5)WDokv>)gd1 z03!i9XfT8@%krbSqeX)-x{@2H>IlIX({@O~rH0I7YjNEC?_HkWVqt zzWd}Z%j|a9Y{q)p|?m_b~vON=R`h zX~1b+)RTr@(7iLAS923bBl^#gCbv}t{|!DFo|Bi()_L&*UF)orTgpp0iaG|!#TLd| z?0HVb7}Pg;%2bClWg;e95Xs>^nTCIK_SNZqdv^Q#=-D_^+*{f+_H&&0(T0P~AUMuW zx0_0e^6sbRh${vZ%+mW0>-6&rlF)EDu(|+C!|?s9oJ(PlYaD|oeo4S|MKW1m1aihSo~zOaP#d zU9I~AclZNNsQTuJJ`(KmygB;l%`oURt04d=0MrmGqi?L)<Cs^JV`$g1L9kW?9X!cmEbP<@9v-^$;YcE*etrwxkk9Jy==d>@-pRt6g3}JhJpI%yBSMkFEXVb zhkYgFFIAAgk$G{l*s3fa`wmfg{oeB8Bu`QMNhK5tfw^og;a6-8X#sFz-c zN!caAbH*fT$FvAPbl~zGWV2i-q!@jM0Alg+IdPEouST$Dp1769n30OdmL(=tA5Q_w zbr%%uj!Abtq&@ZnVUfgIyeQ9~xm5yosiOPp5LTQrN<&$Z=AxL22%86P5R4lK~E8){%{SA&1^69C&EQNHXbu{16P#J z?$|oZ9+e-Q^BCY^M_69g3tCSy!`Cd70O6C@qI9Qpk@0>_Xc3^72`1rBiD88ZW&jz@ z+2pPQF8#ONv|ppAAZs*=&u`^GGUq=xUH)Tx&#nR15I4SwpR^%UVmKM2bOp``xU{k@zNaz%lG07I1ZWEGx)vj2;^s~C31^k-L z&-2)osxbditJtloap+Q`Dr1t9&mD-sV|-pt*XU=!jimeZEi!&{+nIZp8(VDeRhuUd zg{q}jD-&5zb`|uzZnaf)Og9;Ld+pzht?-!uW6On7vi&1dKz&ZNj!Y+4+yU*;=4x3} zH!*}PZu&EX&d4#D`rBA_4;`U39c8&Ilfu!<27}DHoj~~&ApGy|tE$N4IKKG6TP2Q5 z?~O1XZD`dLe>B3a)VeomkG-}T^nR^0eK zu<#(o7Ede)*IaQRR}Azf)&oML5MKK`+`X93&r?VI??YNHeu*jqT<+RnQC0shG(~>- z*M%c27LXffR5sUuJYODCmv?3}iisR5Cl|BkQo0vN?>W(ZP79PT z$naWZCd|~|T{6a@*J9C!6eZ>XZDn>S_DWQ`E|n|jEE}Mg?Gnb0p_1`p&H(_O9uUE9 zup)4Qv3wcchOFV|`=$;e^+X3e@-@_mUQ;k4AO-1$T92tyVke*3JU@#Z zyypSAJdvB2TWlq1KJ#&z>pgFuPf1U+dczdoZ zN2l3=9jdV=`Jb%>EnundgTr@(eamFIKOgztoGo>vQS&Hpq;ydwJ5HbPwq;sUyyiW3 zl+$SMgzHAHzJMs{C3J*jahdfhK*kPd^3r3~bjEu`2ML*`<{nTXBK059A|?;nPdxLp zM;7%Lw<@rbHzAB>}s`y8mB-3!VxdrZFGIF76Ps4mg9vTw>={3Adp0G_#S zCKgH;fzxAVjlK|C_qU5>yT1Chfn4?;W1e*Dp?mtX`bNCq9W>hsL)jJ+a%kv;_87T3 z6a>?*F1L1s{C57E?^o7Q$at(j5JahL4zP7T?RHR|WarApW)8^YGOWlR`nhhLtyUwt9FRoPG zFcFDtaLtVoovWKMQ6NznpKt=|4PcO@fSV%0D(OA}n-uI1wMM1}4yOal739=WFc8!Q=Zf3q?22!;sn^~<;O4XKQdHOMgxbQakC@wNN+ z#z~EGXly`ZkTtOOhuPK#NMqPgz#PQumI!7z{u!mZIU*9`$|5B%`y*4ukztM*`S&GC3omb&|l}UI%mar!*9D$hXw+*|QQSA%y z1908NkSVIMbH8heN(dXg^DAe;Gn3Y5c1&8wSR8{s01(XENoUna360zbY26rZ`RKa_ zm%RSrrB_AdglYoL!X=c0{SHGGpf$ZmV*g@{n3>Z`Xivf%+ibhRKpH|>ZblY@$Xv2-Hz74$?5`1Ok1;*dt`W}!-6Lt zgDHyUTY52u_*FWl$Suve*m?$fosZ-X@Gk+t#xl9I1C{+ zZ+Ej44NjkCW@-s9w>Wgyt#v4AeQTkB`O((iUOL;UwW8G2WN`d9b^ zP@yg{N}JA-mw|Vu$fEXXNFo*?buk`Yd6QJbq|Wbhwh^6WwR44;B%~o$K|mzgvrQyL z+lZYqk4un5LnUF|IE&=Dt!LHXRk+Zn533)4$d;-KczTm}@o z4Wxv4kf6~V-hVkTTWGgG6AcSzPxdJST}U;;gOV2D@UaVCz<;W2$UziG@kE68M7e}B zN8hpj(I_OJ3E%^J!{&SUwk5h=l(+YB9&U)oh9C0B7RC#DcGH@XVLT_9xiOwQ@5yAP z^o`ZQ`&OKRDIR9E&PVY=pFY-pBN01@+5{nqve&+5fuBp4)ri6bCu$?QeQnycm8i&< zYazWp#rhJrHFS*5?iLzO1IqM$gB{aAc}i1-yMXHuCGe9>$CjpB9YpKi;Q1z1H|S%v z-%AWWX4;*1C|Lw?j)fS`6MntTf0`fYEPUAqUN%p|~> z1TYjff#*Xca$m>f;^_UXwdSxe_F}dbI21+V#9a|v1+FKXCL0PQv`$zA@l=IBkX80W z(2*?+yu6D=cB0qj8TQC)n2YufXaJlXpLz}8w&{Tom`-m>+Hj;P=V0%M(~4rk zi@ICdy#=|CK%<8@|4v12Jvi3#2alh-B@xq>Lsxk|!AE2aEJ{9^w+?NWb>qQr$mx8p{Phn0n_iUVe> zy*o$`mhGbk)@HOAD}z_d0-)ZfS4z4UjMmGtH@(Yydt5VKT%LI$1l=vbe;RwR$&*kS z=gF4b@h(Ga1NL_%SMV!rLEK69J7=?C5{vc**WX!wPFDCg25~l@kVKi z!nm#y$9_P|?V?MgSvy|+iHeb;WS~M)ZI5-YTuhrQZ_iB!(TDVCO$j^PQ$fv5Z7(UV zNa9jI(1@HR8Qd$Gj|UcF!z(Z2UEhFLxO(z%8oA*OwS;*|ihl=DRzQBYf01GHfs3#A`oUPKhF^k7$DILca6FIu!XvFePUDxihPSeL$PCd}& zUXmHopur){_ZrC+ww^p!49MJh`@c$G>3yT|8b1Y;e`wW4CLI$;HYtkCSTbdC`M zu$^O{qtGrfsRX}3KPyGWSOm0>$bI}+kw679E2bGMo*#>?VaPET%sunY+Wa$`3oa|+ zYKw~n3XLXUZZA)Qb}(8IAHY1q3{Dp&#c_fAX4?lQX(x&#h}gp z!LsP(y&#od*GNwxEc`|Z;n!A#h&K!#=l5URI0=`YDQZoEGo*X`WzzRZZlPulb|OVV zFkwJF>8W7sJygJd29Gc>L!^|*|^gMG)-O||Ax`$un`T5y=)K^N46KvFmxi9cNl^V3) zeZ$1vKRB9z@SzppYl1dSvf?weVrshbKoU^0~)kN}~% zfVCAW)AGsaz(+9*KR%PvDp;_9@_lO|+R<0TYKftoof)ri`wMA5-4;F{d7xoaLG_Sd z9uQ;dQWBH#GPO}7j}i`2*SR#dh-T60wkKdBB+_`vIZ~*)Fg1O?;b%1v^4C9d>8gez zK4_U+$0#jH#*{Tow&$H3qF+YU^pXhedzfkCSW6lv-#B65Whu|lRTB9_ucdGW*5?l- zI>U{{1Ku5hWU7bfpwm#|dVgxg$k|0tfzu`lTW#vHDr)Enx5qTYoz80j=+Ag#FEUlG zlO#saf#mX;>Smv9?}k)W?fyq7xJ4qy3In`C)kn712{)wD|bs;no4zlwVlNyjA zqrP$6>EQBVW|C!L_OCWcvoK7g615zZuQVA1W2r#y!4zHHWb>(8Yw!a8vsvttN7x2% z?f*;-`6nPLAPtr(wWxntuN;=N2xSh#`N#k{K*qn$jrb?hva}eZl`%<^?+5^i%LYB; z9PvbO!;f9Cdjmh5TS4yappZBl2DJDixY4TFsK3WWovydvD zOZL(_cz2DEvw|JID~F5%y0@-dniA$6X>RZ(J2i@9iM(`-8vUY>+FZ-&6yrF^qk+Ug z*tZuGf_FQdU2=?wU%}3|?qK>LDq?5rPj_kh7|&(HlQDR$zVUe<0dHjsh9VqF@75NH zAixZu*20%XO(Ti}&cok{v!-m4;zh3Hv|?4UlM5OFzZ8A>YLx)sTIw=37}`oA#d~)x z*X?>K@A9Q{nTTl=sClLNox*B6e<5vR&6xq4is%cO5G~%Zx-pX*n3BPSO$kpA#W5EZ zR$pT1rZzy^|EB=MB-mFHiU$+JOAq`j(vf@{jE4_3j-EL=tmM921)_Q|)Db@71`Ylr z?W28;3)FkpcyKX;U7LIBHn~<1kA5)O1x#VJ7zWTFmR{1sMC-WA9qT=Cz68_Irs1`v zN8@i}6}ELNJ4_RKp1f~&Q1J674t+3;r$|7N8+`8-A8-oL)Y}yCey9m+L;ZSEA_1aP zdw_X~Kix68ToI^Z2-k(>QlA+c)HmGb5`+w4kciSn>S>of(^p5_RfW?xRpHUKMR-_S?^b z9N(N>F+rd?a&meU`b;&MZ5=&fmDMVadyT6Q6dz%j=Ydx905AjiF@Id~zpFr~I%>2z z#p?Dwxhz?YOKLndG1k)yt*eWtr5jo6H#Z0dr@&z-Yc|u8+Jx6JTw-jjB*I{LpK~mUq&sI7-+F1D`5p_Q7`M=5i;Xw&cGoZjRU`@Y4}<^i zPgT03#f`QxY0=_o*uHn|eXpO6NNZ7I(mP#mAl}A;E*rK+vEMpP8fNubsT)sMmOo3-r%6t90@50#MdcdQ0~&Lb{xONo(C>Zp4w25kCy(Dd0^UL0&wb%DJez%#Qx z*A{M|_5E(k{+c~On#^Pl2e>^B&}uXooAWIo%FLoAYR~+6jEZmqBrqNEG}q6Py$3Av z76-E`CQ#Not<^tcc~>&wLSU>Ls?Q+c6VLgG{ZesZVpfPn$6I!)L)MV_YCk+Dt>Y11 zm8;2japt%Q|E{PSX<0XhynEnyPrCAi! zKW;wrUf_hX9)KYL7*{$w0RX0-eB-Q)#*`6j30+oLPk#l1YL`J z{QJ7w#Tk1h)b?VuU1c-Epb-tECNWyaxPtx(>6^)g?(w7C3s2uW(x-HAwUnse&U-us zTuq32H@sr`pMe6L*5wm_HWm#i*?1A;KX)*t)n+5J`n7I#61;12rP@0l*Z^M)4rV`K z7-h=~&DxJ1ekd6#(X$dHRLZQ0LY4G{Z~cVdYfT8e!UYiTyctU5wbv8EXtnlSl>{KZ>97Cf7<7h)F?LHBrTL1fmdbrCBtNB4|5 zL#THmAb+u1+6P!2IOdn&o{rRu%u36w{dkJOn!-hkkq`?aUmK>}Q#G_eP#`fzHvL6$ zgHC#zhLm|($dde;=zdZLcKf#;m0&ba{@ov^Vnr?P4{f>JyC?4g_4H!#A&Wd|q*#G( z1?oZcM!uTMfWqqoZr$oaf_$fbha>lyp*+DxKqJSjBlHf%fni{(tmrh}Xly_KSj(LI zyOInGO_33q()!N*$SF_*G}kn3lEx^SMlf`4KvH}a%qf%~q&q(pEoHbfSIlt}2=$>}bM&@yOAm`9kwSTS73b~GYHWFI;P1X) zl}mT?i#J~$AJ9xwSi!~C{ZQuM92oW<+#f!0U)pD>$M243bNXgEG$Twm2ptXv*#A?A z9>WN;w&yNw-o36NkFnmY7gZ%aMTUjvt^FNBwK8|KB|$G7s@zO=BDSX+B&F%*n_uP_ zAYZj{hE;~6gU#=3{Xla8U>Me<8bg{{;#vGNcK92oj5OP=*|4~EiSjkoAA+UiucK;SYg13h;lGNQd$bV$t>u=P3EnWs_5fw2$=* zMA%+mNd9G4IJh#U%ePu1+s3La<)LqNF=@sOp&Dy~OiP81K15VVD3^tJ6)Qbx3+b1o zb-G|n##_Ae8dE`v3fqhttv@2frum{$e{NxGt|lz=)hx|p?kA}eK`7!@=;`o6%1wjP zTNO2Y&Pla?Kbpg}-w3j8mZ5-YOipdl6;i&yp4M?FTrg-a&7}os%*<RVRK85(e5QUYkXZ-G9|qs0U)-2n0m@qC*yIE}L4}n|UbYdr549y~fkqqqn&q zgPNxh&!ZJLImR5dWc!L=N;M0lC`4{1Cdg!XO9p(e3dVBeqL)yt!SZejo&*NLizA(? zD)cbX6h`|dLR|e*M{2m86c-z#cg89ib)4h1y0aMLz8U*tQs|@sa>D~lx?J~MbdLvT zynq`@^k5C#-RB>rwNc#+0dm&QJr-BUzrRlK?yWpJPi%Z8v_CoM5KEIh6)qFtx)OF9 z;4@Dof()<2ZtQp|HE@3+?UZro#e)wXovRnvAb@>mEa5i@tBK1ThxSE?0UWGg9temr zmH-w^6Hy&k8`0Tn%nWlHM^(038K-&*UA&dt6LPd`j&QTZ?%DnJ2X0BbD>Yc@wCra# zkiHN6g~TiGlN&=iO^1K28y9i>RKX(ZMsa3+ESb(w2C z6tB6iyoOp`#*AxlFWWZcDU`$g!h20GpaFL#Z>ODYgA#bL7=GzgHwh#Qzt>|<-3HG% z1`9X68c`Inimo9TyGAaeM&_uWVpD{Rl(CS-Vj6(tB-~!RZgLEqbg5j%b?Xd?sNVeJ zL51FHtK)>NXU{EdFre=lHqsO;vfA=92}LmQ$6$;giaF@G%?aCAiNE{*&%;8Fgh_(X zR7O+n$Zu6r>-BoAMqSWH=T%hp~9T`t7Whet6_T9PBpnXPnjxm!3N}audHc-&;z|>@hbz19;guM z6jH@qfEMQJi;h%?5H!)kq8gl&7_aXNG{oz z*K0ErWc+pqDH+R5V?On!>63CsT)#Mu4`9X<^!)6EBW@}^Xju<{bWbsM7DE0*%nN*Q zB&7?Fe4JKt%XQsJR@SzNDUSPhYzd2|xZb6UMjvc^^`J8WWlqr!kG==q88HFs;U<5Q z5cCRSi%fi?%0AV4aq$Cg$sHd}Qv=^Auz<}i@36pPuXvtp6YiARGt&$fk|`VJW2UVC zfMCvy^7EbGACKoW^I&7eGBAxYO3y4^BcD9L&1sg76smpe5W1-wxNZoo!Rb|4r(7bB zDxa4RHKjl~wy#Ly?V3fq1D@Nr8aYD@t-M=}y}Ro&*QeXBAxOg^f~^@jii#PTt8}Ad z+QLLvG~Rzij@SLhpm(vFCf$w`9->{aF%niB(}d0@1~?i|h=rZKB*BW*GrX0;1{0w;J)(d z&qJ^4?LjdB{3J9^1{i@opY$!6E-T@v6vG}+g5hvT)HhTiGH`G!GPS^rgQFy6)}Y(9 z*f7+_@%<6_L%UIDPKk`{`o>ZiurMQ!n&8ge;v-PEEacoZp-3YrizVlTRi z1XAOkhDwlnVuQ0|*)vUqpsg67ogv`s7 zK6QnXn#MBRau8%{ae#DYI-XNSPux4fCX0UvB)dnqu>bdeFr+P9Gohos=%e@Cb}?5a z4F(f1e?bYTu>3-gs$+PuGkEqyizXOBjM473c|vJ1HirZPE~1aYj9~*Z;Z9wF2N9;y zmLmd%fY1V+hwtL}^FgJt%f}eUu2RO->?MMDmJpWybAN>?mmZtVe6Uec_S(hA!HfzO zjB{5Hr%eRO2tGviS<|%5Yq9w8_XPzQzI(sQpaou+{v}D}b5A?{srtXlhAW?g^c)$X zdyu=B*M1J3O+;hbvhV_l;`LL_m9@(u6DRv2>PqJuzJgz zgwvmns2tyv2gJ9x7-M~MM~g7b?Scy(v3?A(x(nxGSPq-Zux|Nqrm)&7uoLqlayDWR zbZwW^k?PatP26Ok-d$cO-2VTN&a$ynQ@ai&aqGh4(zc@2?uDB8OM)vcN+BMNamg3(_NLvGBVKkp-NB2Ns?ziIE%ww-PeR z5@yrMXJt=8bT5ekX;Oh7H-Hx4Cm%G3Hf^*IwzT-k&sW|0d=UQw&Tz~o9Tm}Q^dAxn zzYMEO1$wn&6O+Qr&~i~cDG_nQgKTv@{X3xU_?Qx32FBEy+i!E_^>Sq@670z0Fu|ut z2JGgprLbqJ?CJns>7}Pb@St+Iva+N-T+}wCq{`a3GmssS#=;ZZ?h8!oO+?DK5Ep*u zOw&XWK{CPEgg9EVHW#@$?Rr#fULVsVn%om0ePwMc!F&6bubHb;J1=3-_jo18NP(Fx*bVY-EOtb|X7)ztJxFKuPrveMDk%f>!REX21A#MW|6k@>Ce?YCRn#_$1WxR^SchN` zR~dB^9M&h?M2$#qRO~=h0+Od^H(7Gr3QzeW7)b0D3p%x*IlFdsfF6uKS|s=kL}1c| zml^s(M)n3q*-AEp(aC}*qZcn-7Br+RS@iI?ZMhg&Q2T|-+GUvW=5l)y@Hjs& z&;P<88|9=ST$`w-r!@>7>t~S^1}lTV6cT?r@0O?ePayb;jV228%DQ+!O)}^7x!1T~ zNyh}U#1ZI{uBJxcnlU`qn~E=NfVY^dZj`yIR@6c)%)c38QlWjY3>f4J zF=CgYN|U=q>Y`KvS?r0?*xK|e*~d)VN90FJuHeQWe?f4}k8EBiSBt_;sR2oM2rxo6 zBssNA)*P%|hWQP*l)G{4-7zn-+Ccn6J-6V=B~k){SLb8iU-INz&As!?v?kz4+3Tgt zyzhREWJgrtuHbME`iL)Y2up=Tlb$U0Q6DbuF;swE(tl9Q5xrM6;|auKjV3PL%Y6{O zVpzk<#9;wVe9WP%U4a{mN{A{B8R{$`9yri6DA=VA04quvIQk%t04x>_SpA#7fenCI zBX^=w(ynJUdNZ!oNeHXz@|Vv@S^)5Ap5FV! z9~xv=*G0HViEmnr`Q-(b&>reX?N>6K%U?H4W@#S^26Nmli%h6Sbsj*F-wH4n(K<{G zT9pVkl%RTi`SOo;-~eqwq38B7{X0M5x)AbCut>W>6$Sa>5Yo+-46TO4E?nqN6S`e zD%6IJk}b}bsKA$q^Zkjwhn8bhURUlKl0yS7H3h~TI#aQiSuF=!O{3TObLU6>o|f&M z3{mx*5%-o<-wr>xVi!b1T&=1@3L@Pf0O!?EM)0(0d$l+w4}iJRS!e05gwb3!G0B+y z6aZN7`Q|MrX={*MPwxnaV7UkZFl_0iM{Alj`!I<7B2U+#bIW##K(ckP&-DbZBs1v8 z)g+{Th`QH*<$Vi5XvK!-T(Q$Z3$P^C+nC|}K#m+JhMcq_oV4N44$+^ROYWH}SeiVM zGLi3mJzpFEu%-|m+{Zg6go#Lt!4YB(Jk60KrI#^EthBuuBd#yeo1l|%F(~)O<#>t% zfZCRKw6Kf$bG^Lu@K!3sR444_)!VKbujaN_krmB?s586+tqG9#RJrJ0J*`$zAFm0` zhY^4dEkWRFt0fHqjJlv^>k*cvr3PL3_r%L@2Nsv=GRmZ-doCb3$B75y z^9;=8iV{FHsn1<({2KZO=x#dPm`*dE8OfV>*wxLN@H!`rmXR&aXTs8_jIAQ||G}A;>^tK^xr!4%;{g;MDGu znh69mUYA8CqthiEzJw)Ry3c!MB5kS;hoLu(Q9cZ;c1?k5C3k*SPu-Wzr#?225cvle zFtL!fUFaD*5|_u6{+$J^mnH86(OfL`cBaq_Koe2?nl-mjdQZXLFC~psQyGs>j!eqC z^mP3Dn~qJ!jOl5qI#zBXw$C{h5;cK~D1*E%6@pCQ9oV;j#K*5ErzOkM)tPleG18=D zT|j_}s#5s_z)ulC!(Z}09z6)HSfB|XmodhHG$!G=2iDOvLd$py*8EnbAf)69P?AVC zPHY3lH5q7d*ciNR(c2w(#qk19WjP^N`EPHvm&Xt@{1z%V`Sxi+z@8C=(F1#z6#3I1 z;Ah1=_dnb6ddKj7mbr_r5vDgricxGZ4#pEHF8vQZEoiri;EE}vLp z0w2K;n)Gq^9(L4D$Bp4y?B(ltG}9f2h&HebhV+7l|5IitfF&O$u{$|EH3vE?A@p5v z+3|X-sY|0e#mMI_RqCS07Zh&>PWQCe5+)yS;cS#ez|*7MYFWJ_t{Z6@4C59gvH21&?C066D$arU$-hnMa{ z9b&K=~^eo$;(%C)rz03wC6VbExW%_Bu{wXKcAqp)!N2mD&*fS`IIXiqS>m)OQ<@~_ z++uh@?rkwdiKyw2>x0?RQP?a1SdhwdR-b6x_%3e=(Ps|fE|eRL_ktQxDJ*dAc)p~f zt9r!zuj$9X#b^M`#6zh7JOklJllxYhQRxmeN|O9^*9dWh|KcUq zyU!iqd9#uIc+@GcAZar{{_=a+u}DuoCR2=xX@0ad@hxoz^G`MpEuDjqf4SlD8=(mX z(Z24lyTlF4gAR!CelPU@2k}Q|FtU5>gP^TDSK*3*UuaS1`B1{byGExsJ-uS~9|*J1 zDDniO7OMX@WlB$)G0(kTmumcnf$4FK6#E{d0}n$qW~2L_@cT-)t{GvX$f;6;4eQny zyLTL4OtTFftO(>dPXdxogQ7NZ{z<87wpG(z51G!tP(*bs8HpSWfoPxVvaw5C(ch;_ zU%TF<7DLFXc`(LBXaziiP}(u9+I&w*cFWt?x+D8@)nQqWJ3imT2}WwPpUY~7^mzG~ zN_k0;jFdQsP4MOr)o}g=XX#@ap0@{?-ze=Ws3vs;P&8xU-XytjP;B6RH6beL9g;4= za52nJ^T=rDv+0Xw@!9oDyS#i3$z&X~N3kues(&I$nE~|cfJ0N4#6C;C6fWAHqsh6f zjZQ!HN}1GQ3%0|VHBAV+PM%jHri=X{hiOJfs)(SdtGXQs+|xhdu?cT`WJ7eq855bT zrQea0+qdUFy{aXtucRmHc{Mo+6-Wo4QD1#IzP|OrCv`@oE66eHI(Ub zI2!rANMy7qpE0ky@+;{NYY>Mo5cyPDMo1cd*$D(>4&!Y*sc&pe@x*&;pg%DC{F4S9 z>}CTi`!#3&>iKZM?UbzwMWG2M1DOCh061nc1!rmp2+>4kV!#etJix+?2`h(d-;nef z+U|+ih?3@m z|ES^wD%UL0rHB^;9n=@;zN1~fgJ@}V#2$SM?SIKm-r=oDlB&cFbZQ++W$v9EEsq{R z;nLW3wOcS_p2Bkk{#5B1CuWv{mr&pS)S38Vz~g}WbJUf5{$)YGA#A$G>@T>skeB-xet%4jhMZ&cLE*UoJo zc%d)Xr^Mv8UOTsOk{)@H@%sY&*gEKKsoq1b@?*lbXLkT3@ZE&9a5?t0?0&L0LL>T; zXkwlmp!!Wq7`*YBMv8Sb|8uaC-+(mj@_g|1=AiyR&}o@)Pc;oplO0lt%_GjKt}{Gc;aU;|FWLN+iuSr%`B<)3GH1qDeF^b9BL zdl_;U7F9JfumEo-vUY@#e+hN*(uDno(b2N}*Wg{;4ak;9XRVc-9&u&VOAYvkt zl8=)7uUqT8!jc1#c0H$-A;>8W2%!NJBwTSG{>yr{NWC_K@VpU{lN1Hv;@H^ZfMdsy$pDe$Tx8AzE!uWPnQ72+aqKf%GL`n zGiTaXwo{WXVfG4wr2k5~R=xU!=lzEwU5w$@<~AjDb~CNX(w6l1iU^L-wF{%A>4kGI zHbqlM6zCrJYo~7=zKq)3X2u)7;i_VSEzi{eyr!(*6doaAkuB!OR)``NLYk(=6ZV1F z?sR<^Obx&CP(vOYof#nz!D2Kr&CXYti{iY-UEY!W+z4C-0YQ8rEFge+-`fbB z_NkZzXV=K{(#IY)@1mE2I{Ud^)eM>f=-c!70m6Czct}&!P@sh@X0nVWo@#bkjo24YaYekvSA)_C;8Y-AQp_vj)-h# zMl(g;>KxZqG&-+#wNCa#&D`Adg*5n!*}{N8JF71qNrqQ?#6lq@jB9b6HYIDCFeUQt|NLQw@n0y98{NFo%$vgI@ahD~J{51Sn9#n!R(|oqQ zn|C4t(e#?>u~HglcnVfvuzV%34D4MhVlSJ`{IQOp&442LLb-bCZos}D>h*U767CL5 zuk_UND>dkBlyS%OO6e^5+O=PWNzS59?pU5#Ck6k1!>A2-AYqjFy4+X=Q`D(?SBJt>h+PsmEln#o?pi2?)x=h)IPo$>pB*udlZ^z zIrPs7z26t&z$Kr@A;HIFU!hI5dx_vdBihN{?eF>@gY|b(a--M~O%-`HO_T&m1S;AV zBTSBtB6GXse@)e+^A{fspQLPCZti2zUc6mVj#qV&xb9@u+r6Whn;rHGtc_M8&^ zpi31So!ZH+rR{ysKtJ%3s4N!2-QGw@v_!+M^d=Q9HMQcz;EwT+D+gc%y+y}8u}4ix zt230TtRGkh3wz37BkP;J6t;|EIB~6SgrFI?MxXDBZQG-n*C_on`bRGOB>m!XT0Dz> zoL+ZD`ANIbegogmPD?pbfK)AKIgDeYwXw=cPBYG5z-J%O9({1&b;@!>kf7libQ{_wKy~H0uSW1#g^*bT+y6#7219{lLL7%9$ed( ze0jnm)iDP%i>t$waS_`9;TTWqa!|u|m&=iR%tdEay|!pfx@XX?ZSGTVyMx%`=f}zM z6(KCmDo@6#vz8(BFpdLpGpivR18i20&8{-)CpM-d=%Cu8blnaXO%koh(K}8GDf(H{ z#@^}Ik;m#RbFs!)_;ass;pmzTGKLXwEC|$VcYthigl>r_At1&~0$s&u;oafQ)uj0j z&%KMHLkS1q*Dna99Q<|`m%u*2N{S4{(1eO90RObL&A5kjuh|L!=8*Ob6Bh1xWME}@ zR<8=OJ6S%Iw|l~$BJllS3iPF~Hb(3KbZ1TGED!}<_HRdvRm5>W5jW`!m7BP2TEmgc zrj!Sw4UGY?V>0lf*ZzPxw_dc%q9?uPKO=nYFcPAuE0*4YF?T?YfAy^8a3B7mzECzy zIj}>CeyyExz%?brv5&q;o}Q27>C*@S{k2)il4ka>&ECRm_?DXkWfyEAK0b+GX)QA7 zzKcg;+kya#5i8fVGOAFDX-!X4wf@o#=;S5rx=k5V4l=ui+>x*#?8TR zj`3@_SJM8uQSIGCWRBbcZaOZAXtts{9mJ7+BRd`$R)^DWV^JA&Jb=h@Zbq3u`uKCE zC`_J$6rUK?$Ul&mfS{9q4L)lO{ZuZEW%ctf!Lc(sIIO_HfI_5i1b^7+)|{ z;hZw!c4-G`mDFCEe#qyI?R)j}W(a(ee#$-qP)uUA$k2TeumMfT=-Uc!>*uQoF&Byl z^Z4xgOy<&*J#@vBXNV0)WtqR>5=2~f5F!q+WW-}GP-46eX@kkc?w4zLAdEZHbRA|x zuIKDw8@GcS_!r8`{_b0yOA^S%whlZ5^QGWNd{&b+MUZ%_1#4RK*nu~05%zc_-z@#X zlNNxLKP%!Ct{bhWjhjo)RxYTmEV``4iy%jZI?1

6{LtAS=wk>g0nEdRWN=fKShI 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 z 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%0DR=L5 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

rVh1!|?W05qyD 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�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≺O#ac% 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

u~saB9CqcPygfb|GKUQYN2 zsNL?;tf_5tlNSx|Lb8`(%YN+A+jhPQ`L=sQ9BCZ=z(^_WHu3mM;;0H_a0vNX1@ zC{Ec7>V!Rv@C1c0m=A_3ZVNSSQ4Xz4Sj(g{c01vv5e{151v#&P_cp-WJ#y-T3LEAN3APanV`!ndx*(aIw%V3+23vz_U93zF%s0lH zY+Zb{_r3~_JE_V&krL;ey|+ic61d|*t>uVY_R*sOctP*KwJB(HDSt- zX&qCsFH+8W!<9;%FSIU5l0~JN4nEOZ!l5CeRV}i+z%kd>!MpL(g0GawWd^WV)p>99 zpQA{xp@ol6amn}zuiXCAuwao*nR2;vqZJ>z^Uc^!Z`ZaptQByzxx*=@;N|>59J5og z7Rhj6CR-5qM4_FyzcJ>a+@-ZHR`~1d-|&q5+h>Ev(QnW&p6>UrInr1o3t~;b^=bN$ zChM04ljaiBOgwuhzvvY!fp`up4x?%)jd)!Yt#4SZ8TK`H68$ZzCi)$OKk+7=6PIV} z8%3a48Up9k3vrF;lLYcE&toY8b%hn79*nfa?Wgnp>KwzH{2j}w5}KfX-hQU6d|4gT zGH#Y_?T%qJk%*mr^aFyvGPMsllb{6KrCl|RnT_-Cwiz+x`vNBE*d zu~HMOw9=i&Vf4Xcq&+fsFSAKBLXQ54K@wen-#T<%5cBnDkRRdF^L2abQycj8DxR+& zlaqKE6=;xzDBmAa(LHbQr{sG{g7Hr11JDoh@$#_YV80R^StDSh3M#s;RAI4%MCPWc zCt*?kBlOKC{}BwEbzLUjgMX%Cy|NI@Y*k-_x8H34q5&=t`!!$FMVOMBzEpKw;%M+l zByH7&Va}+g$+3G zc_(AtJR7#E!ol#-v`H$|TdR-oOkA6aR;6A3rfI$bSSSFQAGB?vVlwVIRi_zuvQphX zYOpB!_|9ZK{9fLzHa&B+aAP~% z?sh)Sh&ZJGfh+8Ts`UrORdhy*)Lg%`8{Nur8Dp8c^p9h%^z9T`Y6lWwK$#;N77<%M zQ=#PWtd(MFb_hOkX?y||!)jle_aH}VM9I#-+0Y2D^G2pRoy2R8Li4Q`PA9|@zqzBl zlvlfi(%3Z6TpghmNgI%jcKtMv4Q&k+N-BRQk+#pBMbt%w@Bj3HmE*@J(uB29TWL}m zdb{oBR|+F{;XXy7RunrC)|uqsh)Qx z{@0GMDzrq$Tvsd`2#D)TEqJY zqm^Ofa>=b3E0RU%Z8X{!(=MtF=nKdVktcIeB;jLO|CaD4K-r zS}7i}n%INQd!d4BvJAWGuNI}8w?0?&odp1Tp&x<~E_56UfLS6ZYi zQ?s&=XH^Cv#u7f=(H53hM7Rrf+n8mqL)Cg4gs)?~{Fr=vr8f}xQD8Sk>2i{pI$Lp! zpF#F#?XO>_M;BBzAv3 z3%HVK0+&{`XRW63qZoKcOei?mP>*ej;W=&#eU&>0rxIJtAG@vpCHKEcxQo5@Js?kJ zN>W`Z)M-2u7wPKM%o>}{CI_qL3a~C1XwpWX+mmV55n!z5jv_*g$Z(XX{9t2FL0+(O z8zChHa-8Wat|w<&{c1}sy&IhE=&bZk>XjXZ6zA44WE=L`=r9FPcKof8?ree7oa3}__1T@PKHFvgp?w9A+bUaE+dO?VnV@6V^8}=wb`jBMKY8r zyhTY8-1=KzGj+VLNqay-JM;+<5l{}$E@6--cDL{2T3eXcSaCje3l-WLf5ta*Q1h!~ ztaT?t=g@Hq)|KMNvJ@pn^Kd_FNr?}hl8dSnr*}YWmlMQrqtB=H=EcT2p{SW|UlFi% zFW#jfBS89! ze^py50e3bS?ti|Vwht^rc=n|`^}7<{5tTvX&2kLjeF*sDLF-FxT3=1YF^}V*I-5Op_fJ`90sqB1+w%-i+ zm%3%Pf5qcjp!dVXn`wK>!MuFi^o0s0kl@WyNewRR2k4`FsB>>yvMQRVdDb3FKxP4} zc~Z@a`eUIFJO;YNN z-fiWv&9$z5%mQso zBb~^29kajaLliHC$>R+a1<-PcW+LlbdcQ^kQ&TYwIXggIeOm~jJn{jjuMS6-7fUKb zXUeOxeECKQ*G-9c8@A6#Y|U&cRPNR--|6S-h2z!ph7RkmXQDWwBrf@YPoi=`{bIu7S5!;oM;9 zCR%oh*fJZms|r85wJa5k$&6i$-3=;gN%W2gKvJ> zIBWkQ(#7_mP)~8V*2C-`2ybMQRfgn-BEfw5;%m=^!Nv*H*;l@NGG>LUSi{6mTp+@%| z4_JPFcu05sC9ni>1aTOyeaOrA((m)*#x2TU=@`LAM4DS_tTWjzYa;3H zS=Y)b&Hj)27{+)sX^!6l+JW{?nBcAYcbQ9DL4TA$B!Zf1S^vvB z$|l}tso+}eD($C6e;vHm#p3g^F%s}=Y2P)r+x|X9hi_EEkf~Gh0A)8nDyNjW(8lzX z-G;y=0}UFQ;`$X}ql(npJras1*F6p(zSfkE-OvQqvXQdZh2MtHyqXp57I&XjleX7T zHPr=JH4N>97?g!5{N$ExWP2gf(<3*FSOANMJ<0s%_3$a3GYEF0xezQ2>cKBqt8in@ zj?Ddl=FD6m@P{##f^y?(F!*WTDOW=*2Q$v|`@l2p#6W)76czAb(s0SXWkJqDs3y(< z_S9e0P&SdG!Bo&j-PNyt*43$vOQXhdSnw>k?y@*j`i)iRI4@eM`ISr463&6q=TZ!4 zI|Fb#NS-YVuPs2)aml?Anp16J3tMk7ht7xgqUxGaU2ddpcL^za z<&4E^Ww6iMK(nGhrX;WUg4!UAyqNmdQb^NQUeXO4nQBD8kypF`BT%ot?f~qr%#?aJ za#vA*L3)^~;fQD3bgi&HHwmZsYSF zBSlovd7D-9j?Pp7+?qK2oYuKysPxsnn0aQo>8^$k;}4PI8+gj#j4r*#I&UZgd0yR& z_2gK$;9dm!NW?N_=_W$nXO!YF4&`HP^#GlX>+}k?b%`x8NT)1z^+2N1yIce1Pj^=v z!Erg4r8y7L52~r#qR*PnAU?MjO+!yY{=@qIDU@yrDg!)tSgP+Ih|?vE7CmwSGutOP zj$dX;FL-f~QR&3vD%odzwAp6PP=+(4A4@9SH#eRyf75P!LkS@Q)Ks4N#Y=r(q>g6y zDRT2_l#8N^`5-+M{nn#&vxo8Msj0cv$YdUVAM=#E{-? z_F&WUn?TmDX8iYqqA&)d#2b?S-%!4X0r$ASh)Ujg430ydY^)`)yL;!gc^0f)1BV`v z^d;NsECrdUQy$550)uQd_ac==O4JdlP%1q7ov+)VJEKvZ)vJg|0T`B*$dnUQ^H>n8 zk>kPW0TW7EDRVhigrKf{{?Xclz5srMM16{sp_Fzi)Kkrx|F0n}gL`snD&x^5f<$!TeF5F6pbndR{G?GWWCW6}gPSP3ckcv3$y3J>==;#0J z%n!5tKS^nP#Y@uFq4nP$s{XU8qih*xU$%9#%6^Gz;*I>p3Lx1WqjDpbZt9>p#B6y+ zHtPZkqL!%Q7dqT;eIMXB7Sf(4@&EYyMzNFR%8%}9;x@|Fqcn_s>^*KaE zhFQyv%kXl;?moF}_6pXPe`X^>F*LM|(35LQ6SjBlnr63;($X&dNw7wSg_!&Vgu-|2 zWZVgrsb13qEVq4G4^2=c6!^Q3j844%bWDwnAle3XiuguMO(65fL`ezdhi<^COB79q zaw?P_ov}xR39ibFqHA!PBu0XS(6v%lXmCeVjg0Hr1TaM2?l+$ck3%kpqA3zihL`B#2vqh!ugQW!cmHo;~Yi1)8)=v=8+d2hch^j4U zCKcszv*XPM-`3i@B*-GrjJCZsBpOxtV%uGPhYZxDx|iE7G9pV6^M#^%g0pzyEpF^h z#wKBQu=iR(tO7syNWjH_i z`$q$eZ{fjKHn%9zA*nr?CMi$ju_Vba|4G?R`s%4~xfmIbd=A=9=a$&7R$ity7`&Wu z-_+#U<331`pJw;3ydK=3Rr{NN1S+#@BdIryO-UEyY(b@jxYLg6b)jKdA!y)^++d3P zQ6YN7%d&1E|7ln7E&*JXS=pCuVGO)Ij>Q7(LT1rwVB(WAzlcW^TKJ0-Ka>qGhkWmf zF#pXd8hlN$*ZN}*LF#4ik;IyoOVP-=*g;x&GVh>-L>aep&Qqnu45_PBV1im?YU)v@ z-k3-_4Ex-&!+oxU7US(5KU9%LsH`M*usnX9DfibvTPzDn`|lDLX5llW(fS6~*EwDr zyPJ9vq&|rV^94M2g-S1Jd`Fo1j|M(bKnETec?wluQ6ntQ%NvLYnX6EZTPoqBgCLM2 zxHyDi5f3sr^W1->PjNEeo4cW*l@zpG_Q(PtM=Zil^tOr9@xA)?@rcwhVM8Wo~+UC$E_ z;X>p2P!gCKz>6zKeE~BvZ#h|Tx+{te1N#U@Bt7I5$!%Q7ohD!je(r>P$M1?CfEP3^ z#wgd(tN^cWL`xf9DVA2IgYyJb_6f!cal4nwXnWm^&)*j$NqfDx3yZ`7I-)m!T@Y~j z5;sEIw~As{W@=;U^1?xhOZFVFogasCdVi z2$=GCCr@fJhRKB^$oE|6h0j7srgf9?Ll>ho({Fd6MiF8fO-q=6?f?VB7~L^XL6h@b~bq*cTd*65KO~`_Igh&9lS_BWNekF zQX{RDhMbJ3iY_;>zpBI*oex3Kxe8nR!(vI-h!Bh1sG7a|F92Z^MbblvN1a(2{|jHV z?r`|s*J&dG0g}@U1CP4~|kq1&nJH~d!imO_3}<5U)z#?ExU zYsNiv0gHbPGP0g5pDhkJk@69eg@JCd?78FKM~|Ii;h50J4HW0DVuVpUSFG4|&~REl zLj%uqUT~-cR=+K&x$vSoph}o7S%-^WXc&l#Bl0#UFT2-fs(^J1-&JWaW;oXDJuc54 z>rBjm+{}l%W>cTU`4(V((Hh-CPmrk1GcDzoJaB|jo}vPfQkBrnJB8juLay-`-;ZW% z(ZeCZRB-BYfT!u{G3s{jhuGkt>kbwfcIJqxvRwJYAoa3#RViqE-9ifoXV@xo)9iD#8n~+}$A_93{ zsN4TZ=a2GHe}IiOUU&rr4VW$z0$vcHiB;TWEp7I>j)tf0DvUAv@&lZCm@-V8X}bI= zZmlHA#uuIFUM3_LnU<=nRF)s+zjjofU!-inRbWSgig9KT?UV|OK=v!q^_V%Ihs}R2 zsuWR(+H*ny)s-{KE8MS|75pG&+a-!MB~9 z+k<8LiY&Odf7zi(`4&+}1_BP4B#i~0yOE6XZ$i+)V*LYS1J)hu-xy%_Jbw1t@?j1# zl}3AUACtf%1O}t7unOCSX<=kFxvA#Zw3O4frVi){atcSKRhfI&gVSfTCj2 z|Bl@zG(yf~yDvSjKoSlsXHR^I;LDr(umjk1+hxBGvzt6@Dr_IFSIK$+Fv<_UFV^`%$+d= zidVkiZV~KQ!DYR}4%Nkn9(2h-1lACQD2GV%jE#nidGF|#D^+EAX1*UI<21#qA;@V? zam-Y3O3~j!JrSf;fUk?5E7dojV<&gv+Vll{dkv6Ch;G27$CAQ~IY-CR%XrhLkweyg z6@L&-g*rXK_l&|~E*hk^duRWI7_lo?NFekehwg4nw5gfQ${|Fve{U}1Rq=mJYd9(``7?(IC;p_SIGS@d#7f#W33-J8WUYZo_XBaB2i zg?@??Mx1mlbGUS+WD^#+M$KNML~Ml>O#d0B%8qM>e-+Go@siF ziqqe?yhNLKxv9zLHWrKi>Ypl)J{w*Y+|cb zm>Xf;nm{K-^*p9|%^s?cK)_CPf;oNIqvuY02gx!s&ms4oB)6x2J&I@0O29pV?}VC9 zifYjg4=+obpRy8}wxg7$P~3X6$eWg4-#Tv_$EOh!a^=j>j@{#TPv@Hn$7r&Fpm#>* z@|F?}Fc15IC9`WNHJ~lh`Yv^4^<1sUv10SQf&}UjDydBQo9d8>AAdg>4StD$PEC+7 zRuzuGr&_#?y-ajnUz5BzX0*%Ze{DemmkvLue$kiulbsEE*umgbi>I9A_p`kTDoxKq zc0o|IEV(7?@SMYgtFMm{mQq)XQkLR<7JFR5B2DA0G#PWOUKwV&%K=|!nCVyxRF>?Q z7y%uFBAq7~9oaq71|@7G?X}g?gK5$|i^IwEQEOe>ex8a-96*_?r8o$P*^|#@W)u3t z75_7`=OtzYV7sXdskbe6uTuzU0As@@Vu~If)HBiEU`rw8N?f9PyKZC#l2Hc{w{v3G zXbrU(M!YOf2p%@pAf5P&5Q-L&&iM!A9;`y-QUqZMR5|#Ck6F`93%NWZeK}PdV%SbR zlwnpK;|?&qik;y}+xA8zYAo;>YmDNSy#*|JKR~1|hi@z;$jN4k4gpV!P6Kqx8W(;R zklVBKNJ3tlTRZ5U&q6*BP{}Hb|BH@7j6|Yd9(VQE^UX6M@LMn~8&LU2SSJ!DEFo|} zrApH&@}FH3*$ZDxm_1z2c$3ENeJL$HeqgCY4o)azw2aJ_hjWw_Z}eh0voUnFjq%-@ zLnsO9Iyk;tzDRV?nrW0NPMKO*Lf>fx)o@M5rF8~vP8q)!t!@8O`fo@|>A%!bjyce- zFihPR( zncv?%{%GbfL$;IIt6WjVR=mdbU06MGXY~^e)aIw1%o=wP>hO@+`C@*S4(x5*n>Q7& z(vc_$aB054VVh8LsC48uR~xzPqmlTYPs4^sjEc!_lWD5&3s9WrFh(~>)E;R+haDfp zm0VV$!R82nxsAg*3?`E|L;mQ6yfQ7{RQqulahhr&D>xqDd{Ho*I88{qgg6t$?sS|= zhDcCwX^OymituP*Jf(%{{HpJwp($M3gDF#MRT2xIRM8=n+q$^!;aCU+NL5luv$Won z%;0{g6>yl$f*!mIU>DowYjGs!kIjmX7-i^%tXbB0i6ynpLrpSklZ{9O`9;=;hqvw? z?3Fq~^I1}`v~=1?+@(C-4V^LpmrlDZ6#`?84Q^xgs3hrzG&Nb5I|NOpyO zbY2_M=TVL><2N9H-?SHlR${|}*~9#i7cl6`dmi78aul5`#1;w?Ssrx}{$(gimAIPA zQ>fh~#btmz4!wR-i7=5}R8l^%{RvgeT|i`IQjV>*$wJpw*4{|SD^ zE@qbEMj{IQ7N#h3{ZpH7$~X}gLP|`t6Bpq4 z1ezAC{3?GvFOPO4oND%@_SsS67{B~_RD4pwBAF%}Efd%*q)4m4+AS*q->u4kkN3V)5-^)q~LvwFa>!%rKW_ z7jan|>Hq<`%d@%R3MF?6xfq|}G)tQCPp*Jlx6gAyMMB^k365IOb? z7PD8;TY>h59Vu>^jy)Fbq`G&*vo*PR{CX{+=kjFpSTGVUSQxPAua)u0BTA3zU*A|r z{%C-Y6)t)QQ@Xw&C2?{<22aU2P(`b=)_3$1A&g}RejE;Lzm(8vlk@sDxUe)N7^*M> zL$pMQ`t2Iw1!L`0)-m`5lInLl`Z)=N^~ePml)@| zpBWXG>A(b^2;H#4nuh#{|$g_IW z934=P+cn|ozW6q+vnJg#p>8%CcAUqg2p0mF8UWk_aNq;TrTrC<#E;Z(v>2=i945#- z6ElEafEEtRpYjIRDegtLBy_bqo980l4{@w(-iYy7>2NMks{_1M)J6Ze` z7-ief#V7RCFkFS*?eBfOZvk6f4a)ak5&YRIL^&|iy!42(`Bxq+*O$p)OdJhttqsff zunz;5!@I4yP!39=nOEQ&3?C7?oQ6>-sm~nOy5o!=!dY5FPU@z`n{2c&l#)$j{~m#? z;+#8@lkhKq^FhwA_mZ0`foK2lRw<6Knv(0mVyxfafmNg9mcAfF-u2rwTm>Bcr)iQ5 zHu)MEXX8P8G61p!#aK56ayePc%;if&$|uJ=GZ=-!*&?7jJDONxX{Qjbi*y zn{~qBIM`1eP60^|lop0{BQ)73dq6B%-^lF5N9Hw;h z`kPZQu6tl;M7g_t*>SPX5V^IQ0*t_WUw6;98mo87cXWwhOWR^ekcjTT_XR1fU1zqR zSA?9wf{%*+x!K_)9UT)t=ZYmyi95~3MThz-p>|%Aw;I+X+;4slP*!~Cg8r=_bf15n zvbhP@^sgRClWOf3|HnT+MZZZ8N4R4JxTof(%lYXUlpvglJS1_v2xgseX8)}SZs)d& ziX?)(7Hlzwq3l6KE_;Ge7BW>~UFlHNS?4A^Emxrn>j9~zVnJ`Os<|Fecr4PCZE2yY*=`+dA}CCj39Rh&jb$|%!M3^2YOaX zrI>R7eE|-)v+PiADs@t9o7#A%iRh#;P;j3Bcvpj`R)H-L+D-P?)6iM9ox8QndVjMT z$*$;k0>Y`h!#)dS4u@8eAwip5vtO5erL_|qJzBeHHRJJ(td^>>t@U_xodghuCRhqe zBrHrl>ks}%aOBcjAW1x|GvuWD&qPR@x$u$#^ZchCIbj@XGpm~oU=jV_kVHdE`}67C z_0ig!x(TlvW)pDggiFtpFz|r=-J&4n74@GSq0_1TEa;!UTRP@wMM*QRygwN0-tN55 z#G)G=IR;|XwCJ2BaZdU0{&wwCN~3P34$@XwFpF>>FG@(hRLmaw$r@?w7ies1y6qvcJ5W#PC6$pRZHDV$;2YO+wxvC9 zivaCSFatY9wRgs-h|#0+1tNK4e_ZK|y$!`JcC$)I7pH;x;Z~W_Q%~Hv7Ct*$KWe@D zt}8bJah*SR$4V4@oga)RZ4>NMQ+|5y!NRR^(_v4203y* zu^P>_p$B8M4YN&0QwyW}dS=z_!OYATXY~zGtO**n;_JzDHdr2UPxbkia$yTT0K!5k zs2ZqyV>&wd5Hcy<2lzX7+K;|j{4(m`snD{$>FW*5@Ky>7ppr*vyg$M+nbRbe)pe?J zsGZWOm-mN>;{d6cHtb7~|p{du#wh*+F zAIryBpk$-VbC0yNlG)AoeSE1wag#ohrs^F>rt{8ZT$@nfn@JM>2DS|#xhp8L-)eZo zS<$^TaOBRNC?Npu`s#vNt6D9k0ECI_@BaXx-**nnM&AoWIskI`?4`Ueyw6SizgkEGaI*TkI?P%4ar(} zc&*aiuqs?m)C}cO>6Y-TysB72_?==vir&*KhQqO-OA^BlJ*}XW- zVX{kBD)ZGFM2EqsSB^=nyLs=3Z*H5j`OKXmlOm@NU{9Fw<;@R8N!KK zqTF8wIg$Cu%|&P9XcStGE^L$cN}3R9Ss*Qgk`BfT1xKO!jtW}r?M-QHko{l+O|`r- z$dl3jt3RH)D+xsX1u}|?HPTzYmaUcGcQFhBK3EYLF-FzxXLXb9OkBz9Az{WwR#r=&!{ zzX2c`DhkTVnWr`w?i*IH8Fb@aBC^|zTzz~Tw2?~rGT{~tYaCAi*sfdKTi2-NN$WSm zGH5d5$4o76zb6BP4^f3&92)D}&vKWRaRj`+Hcahql9fA>$mwNJEkfD zomDOP^^_;h$c07FZ%%q}=>S4z3<*rQvA4RpqKL@`q)jaG(;x?$?nhUVqZp(0Q-oI( z+URz3GJTEHP;mxr{tSVu(D}~q`?_xB(%GhGJ_2Vre8KW%oF9wnp0UAMmSBP8K!NUd`@kgclUfbZ+ z8wM>5zvUp_BTV|Kvqc~e3kP0yAd6O5b|exUc)tWk;(>2np~&ALxsp-%huB>3HJ{`w63cym1X4AP=piY~dZ=-xGBxcUaB^U!VPsdzW~kERXp?EO zc=)Xi`FTUB0`l&-Nzx+~R_E&}hc`QTt{WIcF)Da$;)VqxH9P3dxak`EYVcW42FKXA zkI}sR%CUe=g}>XD6u){^5jHqpnJGh8A#81-mKCq6msC^bUMJ2uy-;x2qk@Pn63|WW z7s@p@ox*ZZ6?AcZ-N*+BNl1)2!E^0HatbN5!Zz&&f)NOKv5Y0*Hmy39E$|RNujdT)p z#m`hC?(AVe6VlR%0a;RDi;|QR5?)xD+XaI!5vPWCV=S9l7zX!eZHE|4a4bPIhQP0P zHE^*&kwlW8W)HHAZq!|K{)WwLZ#@N}RU17}#$`@cKR!C^kgTAKiGbx6bs8Or-rGT- zS3cj9;C{O49>v~nnPJ@~XfT!*UHnLu!;bdQR?^^8~!n6~=f5z^O?AW2%0D{-3M8R&DTdI?TIqld<%CYdyxN--)*P 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

Ai`DejSUcu?@w&glyiRH8h;<>9 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 z

AO%#%~RR&SK6wcVP0ho#w`B=$TQfH2|QB*oYM?#YCDKTZ1;))PO$DFw3BUEkGL z7B-+!juB|u>=~%V7;hRikSSP)x9`>Km@JEHe73|C@uA0nS{U*Et_)jEl}B#WV=xE^ zwS#o7U+#ajmn--W=4eL8^%{#7Cy7lgU+UHigO>pAmg&rELn?uZ#^Sd9D^h+}LnP^S z75jqQt?5Kli5=hsfaV}%we>z65HBK~eD^UTtu>uITk}R23*~ArYAYc6;r;+pg+-g3 zU^)|52L55RuY2!S3@&Yyl5R2TlZKVUFt0hmloXTbH^wY1;eB6)Fogyh(c79!;P<%h6sR3M`)y2a+ z$OLOk?VIsn^Z15FVT|-AT!u}9b3Q9?Hrnj!S9Yp5X&40AZG8SFATzvG(X{kzlI6S& zI7*!#WeiL}RlhgNHcG}yHc11*{+tQkD%JfZ5n_%dJ%k!)`>>1g?e4az8ex(1Y8L%9D;dwbX65$j#kAD8HJckHIhMmwo)aay=9 zdYbKE@9I(*^bUM=Wq0n;1ullY=R&5RS5wa*cUypRq~^vr@F1;aa*I8pnjZdwHj*1J zK;fO@0zTEM5RP$xm?6;yYGouMmJ(k&doxSyr4G>utwppaDyr_Ix;lwO_BcjmPodba z0~nK8l@1bE#UVvln4CNaMnaCsI*aWPiL%m<2gtATMw38bMK{?k5W0TUXii)iPiND2 zj_e1qbLRz_RXqG<3KhkE*%t!P!i&9QSYGnw{+viZDR?m`taVJfi=8v~e)3-!p&)8dxR}@2jTDuRGR9q|Rv{x%B@J$^?uWBe>g-p}A!uZ1g z1bUVB@1+k7jLLF9PZNNLm%qF5R7v0<`_eR+@hM;9`=q?gHxQ}|4%U+ScRQOboTE3H zcv+$1Yoz4-=G0;{6ZS;vAYnf!eejrb#*j*6U=WmJA($z; z>|U+AJ;SD)k_?0jw5iS0=GXt5+8an>eVyB*{96T=m4(~0VTCOj9%Hux=osCoTK#Zh zsgia=5ebe%IASj>D7O$fZ(DzLjSdc0&awbRFh&Z~OmX}_O@KGiRlvNTPOfsL=WYkO zM?5Z`TzMpi=jg$eqz&rwoJ_qi_JSvpGt%k#4KG5rT>V{^KWM4YuATnrs^{K{a>4aM z{9n;Tkc=5^gHz)m8-x`cw((Ji__iQy*&?llikM$kQkgUQ*=Q)s+ScKAp!_QneHSNH z;9B5m)8Jl%TqU?H3fL3v*i-Hs$1(W1m=jG;2*Z{_~=pe zkEJ82>}B~&sO35R5v_d^zPGr1O=3SAL&8mXc)H~<;}xXT+IG>Ad=PCX7x-`t7O#{I z!0}by{_)!CerD-l8bjy!9Lofm^>ShuBZj^Fb1bTCYJ)R4JcLjZOP)kf4Hz#Wd4atk zi}Dg8Vx}w3;1eGHuY_Du#s@4^>E=n%ypCO;YV8n($@lBdnJH~PBnNQx4w zf;_qgmCJrDE)j`=cyZ>t&6esP%MNfQPvY;OiMeIMT^IHzyj00?_03b0Fpa_G>co!? zjW%)D{ae0u5Aq$qcC*tT{vbq?tt3r-DTl@UfCYt7EG9AXyafvI_RKlE$t}Z z?+w^!Efy>yL7vH}5S#38UgliLoRt3xp_7f1A+NC;Vw}<6bPQ0~)vBL!km(9G7Z{2F zWf9iM4$O+e{*)dSl5j84&)%Vo(-ee{86=+LF`yrRqg7^Sl{@zFu{sX zrn{MLu_{VP;km<`RF;coNFkR+jL4C>f}>8)o|cVhzWoA}!e085{R+R>`T_*qt5yxy z;h*vwHhoUNOqhrrtRlqVOh7dyukFWzBeV3Vy%~mHFCXY@$C_^1U-?+YAXVIbn;}VO z5Wx&2*MMq~VIFJ@hoPFek(}{4L|bc9(5UnxCq1PAT=wb zfWrOP5YIY&z36b;QTqpkGO>Li`ihfMVp1e`@l5%f2`CH(m$e;4_Y08fiz63_VS(o9 zW0i64$&;xNW&5McSi&7mG;q}8VIi{mecrCpg`?1jK4(Wh^&|&2p1&dI@Tc3p#?riz zeRK%Lj|IOvcVJJk%J-8H4?ILfZeNIyP+CL2!MppNEu7e0EN$$a&vDG7yJPx}rPql- zttbd@OG1MK`KjXNan0{Gj;#2Q`=%k~i|#gS3_2}a^P}7Np$Z7&P?Np#rrkS*D?iD>pVKCSL;YhvNvsKzXY`x`65Wc&{nok^Qdr zf&B6^4t8od#apB{#0Qc{1iyrr$}p2wW;ia=lDOjb^{{`352LGc@mO*h@k3Ypo+7S& zl8%7=eg3Q@Y_oU$;vi*ND{=vfYk6y1d%?syuPIc;mOb__zdrA9LawpGw?A}#Oz@rO zo)?6%d|g@h(`<_mp_oX{28m9!z$JdYYAe8ijF9Uw3`jn{OJns*h_x>cCMpS$F`Uiw+?OwjHeOk=ADgwndN4$<;i7~4-}isJ{86OY6myPS08`B$YgM*uV^>% zK}9oL6rr%Y*U~L5>^99(tWG6W4B@p_AUMdGQ(uWj5!-JKk8F~GC`Akvp2VrLV_#aL zNg6f?I>V^LGvJA@QoPEg#1doQX(l*yalS+!2@pgQA=@K1?Y^J8v>$|x@ zAMA&PQ6X#F597zO^Qh}NY)mqt4CSl`MwK-K@SBc`O>6j?3I9>@^J~NfJu@Jft=Vxq zA2SIcTjwBkn(%xMrC}|4Ih7)-5w}>~@=ruA&_{}A(pwSoNdDCTskkpVY7`H1`{7}{~yPy>>{;SvETuKKhRI_>m%-7s&S_8JvFEC1F-t6mT; z$NRZ3h*Z3iqn)%fny21CsS>AZoe@@fH9kjgWjJ?MJqe`3etV~kAPI@oGQv9~WZ zGUGtk+rb{jvAeu2y!|k?hfA$o11%Ej!#-O-iWr(HP4P?a&zyln-U5r}K~5i0b&YRa zu^76$^R}OC_gKYI3ds}L)JPrf>2?*?|uJ#-1?~0N2;PRui+d ziW0`Q1Ce^~pd|!?yCBw3gEO=d&t~mg66ptQ%erHUNXu_!kuEnr z>i$+z^z_r!ZH{gMhJe$T@=sxa)rUvO9d=z@@*Ah!d|3#?@Nkv4qE&!GvQVYD3Wnqk zBW(X&cB5|Bm!km>$ac}UkZ|$vBeBa#(jt?r*+(fV=hCuF+&}^$PwA{iMW(%X;pN!7 zZb(UetZAt_w6{%EannOnzZb_K3*se`t_P&dB1io+6D3-9T}W=zH~U>-sAd?YQTx>a z4Tj*}TE+$=DF$OsZ-!8Cm*AroyrCCv~8!p!uG#$lC4PBOx%o z`mOAJB94FLV=?uHn9#6}K8I>o0!jY}e>JIFvS(W(@YjaDwL$|^9RvRI+UN7vq4j< z<%A%j2j;sFWZq}E(|0}wHef!=0r>Azau%eDoEpg9hajH9YO{IRE7J1Y`pk!WqcZmX z7jw;xxfgUR^8=VJ(fJ6f2NNGTPeZRFTOeIBDP@u-Eql-e1s{#>UAz7NKS~W`S>p;A zKU&m3lBi}fC&v{=oO8(3c|M!sQI3;w5Hbu!*~{O^mU(T< z9-H7e>$l7m6MpJ5+i^){zWK{i9iD)D*Q?izss%c?_+-@%i;a`VC5V3N3G=&?pG_r?&@*gjZIpDCnx0K_sa)%^0Xj5su6+z^^8Qdy(RYc zX+Xq9ohd#(2&ScUplrbGGg%();W_EYqaZMKzeYUi*=WhP_VtOt;Wh-0e3od|qh`!f zwLf?AbHIB4w=KZdm=fUf{uW(c&(KxQh~EO3fK5J0$;P>l?wffa1Gke;Y{4VmR|ny9 zYv9jg3Oqagtyh&m;@z4%Mv7~~^?t_hIf2z@9_ON#vo-G{++o`f4hnWU3N!-WP2M3H zUNYH{)*3jUrR=G_8b5J{3Bd1!H+p~RqgP5_CcQ>RUHrcq!5`_-aLp4P$3RyTINe+V zrt5wHJwU?0FKD(+0S>2S0Y*h}Hl{fu4IYW4aEKyd@D(tA@V5Jk^sYW|di(zZ4N9W> z{=ZF3Cf1eO7Fv2PdvS_6KwL!iP)wJj0b=pD=QEAKL))Z5C@frSw_yesjxk4XMzZpM zk<*O&!8{IMU;-pW-U#>%t*Sa@4cni|hN!h2S~G;2`Pl$jXatDjDTqVZasXJ}%Vjq%puH~{jhm5WyiusH zq>sPWgTqVe5Zpj#no-78k39$4(u(R)q$Nn=OaIv`yn+{my#R8?VR5Y7qo?C4xXtjG zfp2;;64b#dub*Ol6}Zh#1)6Tm$;z9DXM$6rdlaH>yc_Xc;FXmvT-rmeOuL(WbI-;+ z12;m#wD_k-cwuU4tVXA>B>BW4nb;KJ?|E#ho0e3~7g}T2?x#zSnA3}b^(*SlJp+Rg z;0?cZI3b15sGm0%M+*kl-0f_!+=Vr1D^m|n7=xZ>wtT

>B`(3x`kGmA?aIk}utzo*j=@$=io?YrbTbsSDZIzE&P^#BLc zd`xinonF`%G#@Stj1+t7*K3l`g6<4U^td+%Pjvq%x58*LIOSX<IM z=#0|Ki|F||O*0J9?UAhKC2aJc($QoO}ZUSa47i~r2 zW7m^M#;w3NuopzFtE^?=XQCbCg`J%~l8_O!E}pJOf^~=?L^;!lrHtRei3Wo=MZ3pb z6MhOTHL@qvR;O2;Uzk#4ma2kJaF1n~$CJj#8$Fw9x#YP_EGSz7*Vif8IOJnh@QQp? z9B%pB(1xf}x`3eYy9z|5!rXc!oqhr(C7*9pvpva6&BXd4oZyK#SqsvJ@dqBMC>qh# zbG?RbieM}Ounw?_)PC(}DiKG*GVcxJ|8K;1S#e#I>LGJg|!*K2$(PMcB>3gC~91)9oCfpO^fu^pfqfAaI6T z3G&FX>A?7UG#{|1OVx7AiXL<5VQ7Kb0+~YNvL3&Ob-Ykv zFS5;_eTq0|tCY+_D+tfafxaFc_T4g^7Q18Rg$|FR)bZQDY!1~Dt%8^l;>Cq9Y!LRY z_Pk6>IwwS--R#IYdZ;c=v4|_1>A=1&%?|_f5T=>7xV*x|bijKM+`hU4TyNCQtw$ok z7oVqc5fs^Q3f+qTRrx8<iDT#DIketz^Mm;C4U*QH1j&>atU<$RBcP1Wse^0XEo9adEABRs)l6ni* z1*{6z3w>%ZuwibmLDa3`9Sp-?!CFACa@8h>*D>ryC92haV^*?Em(aIVUlk49~N0_lDSy5(3QxY#?LeX7Rt-b3#~}z`THAb zvP+^oqt;Y3ZQxYHppyT)-w^L~Exbf3U%^Onc zIFCLH*%)<`b}PKAWUn2wZ?M%0%eY+Droto>LYUW<;%ha#l~$9S8_w9)oE65y=Znf* z`esirVvmYFJrP3H3q+#>BdIBo{Ta}k^HYawnymKLn-P3cZCZK5Kp1&IZ?a?Fs8w7U zF&=LquHn&TkuVx(pl5wlcijBd0jdFOvqubB`LHt_<4|g6d>)PKzzl_G9Y&eC=1{Dk z_m5s-(BL3utD+Ll74k)23_bq2(Nu)KA|>jLhU?>SwZKN7M*PvdRFIBNB22SwZ@0m6 zN{y!u4CeF7o->A5TL)9uKl3f1u>K?_O7o+6+3N0$c%`fFt9gApBRflz4^zj&#$Rbe zcCeWr$>L6?V_LGBZ;9R}=A*RcF<@!Dnb#zNmq%M#i2UzsBizu3c#h60s%(G3jBIht zdEqtcf{#Krf~oEt9US~1fx@jJ-^7L*q^x14xB^0@DZIT`f0572LK_;RT{C`VI1~D9 ztCP1&n@0!|s9$BT_ykUI^xot^(kDKB?9FKtA&!)$ zye>iI(Fva}16yo0q$?DM6^wT#qfNUpI@$$Z<<AxcQzU|!5FSbOms9r z{S7p|1c(a=H87(acrn}?(lzK>hh%Vav%FC$7gik!{JSU=Xaa;j7A@Iu@H^hh_>Mo= z(_pQ225`k=$wS_yHzaS!a-+!|?ctpDPr#_z4%GG{VM9|4<|taol(iY*^QE1*20{cg z>Ns=er6!7ocH+kfZoC?B5A<7$&TjaJ(KopIk(vPSxn1@@E_eKBo{<$=;^Hy&d701a z7nn2RW5>is51ebrziADyRx?7TpHY)?c7&KGZv&-Fs~wrQRS~@>htzx&wV$KjR_p>O z2;dPReD4fjpZKESd_hClFJP|oERGqLC>jv7dd#pkE!K`g1?OV$vSfw`I5K z;npgUm_f~1pA1QtI=_MeyEWNfYnSK(I)2$KKoZ{=fE*5cgQ-?Hq~oRBJ!m^(g+uX8 zNd(lD=4vfgSQ#-NL2+fEHD^k6T@hKja_60JMxI)&+kH=WFbl`Tv2X5i@!u<}$-}e! z+DNjl%WTpYmb z=5VJYvey#(Km+iNlsHP$pEU3{vSAHfB;fDFDwHTm03yV-VF^g-T}>6p;WI{FIdB33 zsrV6i{l}Aj7vEeto;KFJ{*^W#px7K*$S^N}f5F}0O=ndS9J)fz;;Lm-!T?Jw{m)Fu)FUD0Qd0=CRzCBesX(HGNHW5< z0`7o44~)D#mvht7zn}-9J3gBfrfnSKQwSYZmWD?aeQxkcMh|{}L((JyW5f}#BJ+|3 z3;JlFBm=iY7fT%~FyBNcDnA3{dX-EBUw+A~!K{3J**Sg#Kyz|IC*NUB)_8}@J^IZB ziUBIt2Z_B=AZIilSq4vk`|29`K4A6*m>)_}qG>Hvn=FfVV7{$8qTPB*WqLY_@4>+t z7=2njgAi#Q&AV2%e2`-jxQU4_O5nfJcxXJVB50(_W~rp`hK59drC!k-ot8XvE}IK% z@6$sppkv|LZnxgpp&uilch;oI|4ZW6B;WkmU!4{RUx|i3+<58)4(X%w-p3Gzd$HCM z7;>_;PsS+KeSxO6;VX&PQx^$)DuijJf?7B+#U?QTXW99S4|HD#yGZI5nryN7(|8vC z-%YmMaHV7Kmml zHr;j3_wc+M-CLgIr%|z?wAIe0EpKu@KUJ-$E=dt<=z`bVMl6-;A&8xzoREv#zU$e( zCB#y8jM+g%?x{^-YgM_8zi(CRkHx}3|4|qO@?QplMh~Xw^VITgj*xez8LJWZ78N49PC@fyGqUsocYqE))icB}y}?r1yk{&_DGD zx7t&@)hmE}G4lgzJzc6^HyeHy!})-pNs$1O&|wCq9Y`qtmhDsAS${m{JHsfR)T|2X zb%KLYcp*c~4A}RQpVn0jsL6I?I<`+YCY6Joib+7rkM>fO$ur+0r97Dz70*RqGG^mn z&--dTda_C%29=WC;wjvporjB|-4kF&5UH=f4M|VaK2CH0a++e(yKw7m0v8c{v^^t) z1Sy6y@*Pw%J)?%K0?v-JD#voOy*LiYm%@QBfVyj zx&a{DV(~M_wKSlbqu~}L(3dj&0iOLK@SqBSWu_*dl>X`kuS9vNsErJP!t+PuYG4--^;(btA8B$8k5hpvHg2L zXElTHO~tWDvvv4YFLpUq8N8g`8UiRzCU+%A%xljS^?wjTr~opbkh|E8)S_s)Gv0P; zGkS5oQpm9%k&Aw^a{H{A1!}j7y^}=YWEFGOQZMuK33-LmqZ;{l0sDT`2n*LS3BHpX zjKCZJW_8?&Fr(sC7cJ0GRP9FxnKf!7NMRq2Frf2#Zg9R+f>6a7Eox1$6a!?A0cM?v zb12i23$(Ql+-Wv(eb0$WX}rP87&&BKa@?nKy%$%)0Ba7>Ci@7PsZ>0~Ye;=Y$@8)p znQkwY0;(LaQKY!HSCczbEyxBlBqY_~6U#hUKYrB6WHHn+u8K-*UkRQzbGu_H!a?=} zo=KfnTE@ zI{3&=$cSsqS*H99BzXIHqJ@II?9#=5>pQaDS3Asa&zX0AP4fL^dB0b-AN(^{zt2DpBWtD8J<)ZDnEw{={c#UTOmJ0D87orfCRM(l+UulJ}Y zj>@>B6r+&!$Fmn?T;Zk?>@k{&*~xV`Qf?&j3i1_s99tM)41cSVmjd-Blv?lghd(5+kWMLCVsjzPCtwOQwrc8Z{!}NwS~R zn80u^(e?W0jnUl>qFXF9Rb~TnUwp5pgR~RGktH@wJKy)6O+ZI?89`dgK6awZHb<>X zf%vkMZXRsG$Wop3GsonK<2G&7q&+TgC=C${s7i{ZRsjGV;4_2AC&R4pVszSL@5i)3 ziC06f#AGD$^=A*n*8M++O#GS7{Z^STFZQdaEAC6Xy}5|Ncyr52k~UZuac_DxWY-0= z#Z|!!*1%_qgU^c*!W(Ijk3ZaymJ|a(?Vg^zl_#~{!t%j!55mISxF1g`Q^eDlux}hw zt|ICTxd|~LY;x0>|9dI25~t(*&u=0>s-YmC$J41K=&iWNE# zM}d1Z<{%d&?33P0Ih79Zl7^B1zun|sLr>XAcdPmV>n3INsNC@i7#FHLPq^uJ-A9pkoK$ythQ{t6_m%`wVYa zmdlC4qu(4}p+C*jq;JLb(e~o`fZZrALeyo5-LJ9j>>vCQlB$_UOEQWMie4M#1?NsE z^fi<25ahJ))@!o!R(5QRt>j$qb=7a}97I|Y$P*>rIZ%Ml_2crQ^Or|sCLQQ%ZqkW* z<<@GZeVL7D?DiEONxiO7;>|h#uVq5UfXy8&|Itl;mc?zc91a>Epla5atqxKwwc^uS zTc}=3O>`{_I(~UwPy24=0hupFUMcEcxB2#hab=X!5&$M&7pk7fP+eac+iMyMBC_dj z+Cn!$rEypT44>Wzp9OrL58b)6S3L!sq%{S*>zh5F$~ZUR7vtHulnn2s87;_l(d5hp z%yTj_>UYBh%mK^k`l`3?Y^k|=F$4$dozzZ$${gh;BfW{fdqJB_HgFulMTfhZMw!|r z1$g;^Ilc$lVA_=qJhmA6M0~1(?NgRzsSo}4a^HIJjB+b=&R_G=6Yiluyf{7x?4Fk@ zI^p?Rgkhj+mYL$xZfUf+H4a{2S834E{K@}t$`-jpcQkXy`%GTs+4<*Rjdodb-ZWry zRUv6Ccv1r*s1Z(zgf6jaPd#a081soDhaga<@x}Gvu&ah+U8CX&iyMnWdly@3G%|43 zeb&W{d!H_ZDRkL`s{aj<=6YGGY$K1lHjv3Vw?z^^2T8GaPfV*voH+6qT1D1N7oP`A3fSQZtE&=NC-jgoC+>|Bc6#@L!0{8l8qo zC9`>EdlLTEISvz3L~5jzt~%3egyDZ?gDr3D{f{Kg zBulxQ@W|Xlf+&kgYvz~z;Kt~P1WjY_>jB&}+VL<4zeU~}wPE3ax_exmp%hk1Zd;5h~)Ic%+g&Y;T9EUX^a^+K3-a^({!GP@BU5fe6dw zh&1tT(tdz>@h;mhB9@&L2>l3%X#sZaj_pn8!W0?!QQ!`wLhKdD@-3usB-@^{6{u>D z5^3002y{ThK>jisr6M+As#IYx5jG@?Z-5Wdc%S_c<{!JrT_;sknXAOWPx)BScaZ0{ z?NapS(%}WOC~C;1i(so>FOOlgbhb)uM=#9Yhd@# zT=A&Ho50Ejt%yb+G-9RpMuAqA7lW7anZp?gh>o3+$t{S!g76bwb?yszjXkAgJ$%lk zk3=Q5$hPjBoWx}}(jdjqx|<~!&;3C1Tz(DDWIlr40+rK|J8+O&?dcW<_o);``H;L> z-4At=@n{{tZe&)M==6VsHN``o?zGcTH=GJ>$N zS>(6ZkPPZGhR99qPy;9|2d`v@PaV@EP9lWSWWkroZ1Og0Zq=Tdvd)Y^B3?oSs|drK zTolJX78xnegc;j(`J37Ue!d(vo`iJ`P1F3W#a>2)y!@&z2@v*E&^klqPc-2JO`fg81-$ z_V-(u>}ChuIVIo9siV`L`iYzV&3xM!J%R#gK=^KI4Egxz(4|C0Uq%OTOcL+6t@f*O z*WpM}{_hTjhu>ihM1Bi+#z&cC+RcKMN)aV8U%YWAE)}=#Yrtp5Vb_H0TIQ)liV)1v@ z!%B%i92{>?jlZ*O{g3K!oVX?_4@E&KGqJG>i}N~hBgyd_Z1+Lj_MDT&t+jCQ0?W=X z@L*>_!9orI8-330=5N$H*tSU=f?cUYqw>qs6nB%&pI_Qf#fga>s%ii*V2#8oC`?4k zyP}QA_XL_q>!Pb=gJl!S{ZjJgGd&nY z;UYFZ9{&|-3wZG6f0fIKugE{VO3%vYqh4PT8_E26L{{=C&w^zvlwK}W^7X}$JT1oc z>1YSEoz-o4yAb~K_sF=wp55|3ilFmfgcv0Vtmo9Pn{#*51UUV?MgFIA2gn4JZ-K*X zBz&?d;sp4&-Y7<19K->B2sK3c#IFbj(oXzB+p0IAaQRCRsnD$$>Q+IWxnShoO94Hy zW5Ua#k^0}t)yeTfEKs(B3F05`ytgKmZjmFbmCOq~@_R=W0nG1)clEd3hym1IGBY!w z`{f42TQ7YDL}weZ$B4u&g7&ljW1Nfpc>(8r^Uv{&jgPb{Ovv|F8;7-ImvTFH2kl+g` zR$Cs)i$r)-YwrW~9(1RYCjKjXC$wZ1F7&b*mD*4T-rWpTB=Hrb*faZ*RUOx2Qjn?m zr^4*&Qs!XgRR*Q9aL-|F_q1ELZlEs(y`2MH(9fc9ralkB!m`M6_pqw5{)Q7447%!& zf<7)J2>8ce(nH+Ek^C)fu_5#hB=jhxbvDTKjzAM0^0{#Z_N-W;$p?y+ZRC!}>*Bf! z(?YYGNkrH+sNFmuQ(FU|h?6@S6CxPGThat#uGDG8-TzG?9s(mqpYjx$mtE#b{oxNM zg&_Y726S$5GQ)i#?{OXZp+|3o)A?`+g)H(j^kQ3QqglK#u1dWvut{|{+D1RJ_8?R^ z^MgIPLOHq(5PPKBzM?xQ+N(0nnz3EV3t+ARKxe4^ntsLXn_0iCvCEbK)3f6^fw{~C zqknFZhs%TII&kfau;gdMe;RSswK^Rb@P!#)h^RftPfD?VVPmT}u>DiaSZ3~fc65!P zZ+Xe64tE{^Pg_kHu#|4jo%g^R^Hz5bl^Y<^T3OAPA7N^x;iaZ#M>SEfXg|wm6GFn~ zghd$+a;ik27l{3z&u!VC3$|@n>2h)5ep>V~j{iz}|M-V;li|%I$BF0v$py+O!}uj( zW5BjS@KU@P4P-Vvk%WC>mws{Ws#(=<|j{Wi=#vW|N~Gvv4Db11J!9IBD6I?K?0lsEq_3V1)qARF7FwL}jk z7*SJ6BLyg7MylK%6_cZ3B#Ub$5?RoGISpqyBr$-Ta6G(Ek$~ zj0RKbg`NYNlW~L;`UijjC?See`DK~K9j1P!6tVj+n`xqjc=1yFLcNE^o6a4yAQ;>+ z>gn_kx72nILTQ$zo*W+dj@>mjnB}H$7#mAiJA8m#qMB=%OgaQT$CJBor}p$@;@Rbq z7<*-rmgQRR&7lF6Plcx>l5T#@);Z~*kCiKrop?@3+x8EYY*)A6!xFd``va2w3KwbgY4rM+r7nw0XhLXa}j7uHkjQL65zn6X}_HC3Et925U{W*^rI;6R(D@ z33m1EOno-zO@?4gkp@)x%1~fOU7kx_?R^)<0Ga%oYI_Yc&vkH#5Mj|nQ2RZ_3*}nV zMo4qvMQU}HG*NOpr(3b*OBjxgQdq!2a|$&m;GZ;OOAd?n0Av*PK@W?WAf%UUPewi0NLL7!Jkw+$(cD|5fQp{r zFJF`Y%@G1DDQ`MEq<6Hq;jvLXuFp5*jc1e0A@YsxA7=V>*T(Yk5dOFK((Q_#eLo=1!x7VtrHeponaulqmvoZvA{tq_MY%Z&Q2 zOvYAHJxX!{OHDXT6K(YxV%7J<>R%P>)f}O6Ugd5Fv)+3cgg@BbbK(r%tcMzUb66D$ zfIs_-)xFie)9U|z0r@(BWWhz3Cg4h$I`F5GEvS{7vXRsLAr#6!4SJC~T@KbHLnMjy z#l;Z6fj(A94{I82>*6ue8R$IXw*+G>v*Df){UcN@a=gaZOgpL+p3FmKmTR4xF$x(9 zm${L^t7)`jUI7>h(5CCRNV@gQ8(WJZ^&d7sp#2tWoZt($EDRSYT;%B!{!dysSX!D!&NoQNC-@7=?|R{zf~7pEHo&Z_ z>5bbKLXU_Y)JXUCzMSLvP?drU{PGLvz;%6l3p)s;nuF0BWa~k)({L;aA$IKBw7}O) z9B(h<=f=^niOpX#`Q*aNRf%Q~L^E759w(7*l9tA>6DKgvQR7)Zr4dL&P%;i*5^3fM zG<=6kzg7=3;GAQG;-bozq>3yJWy^hEx#jaca6LCiRxJ&2c9$C7ap4A(9ztAS59FR9 zh2qd6!|5Q+ylv_B%!W1{VxkfSaTwK>jY!TnWK8k%C;eSZQsWKh7?AqB2aFPqza`#}iPSx>$j zOl?M{3E`iv$fA~^dvYaGj<}Q@hRiFPq~G!Slkae{PAKoFTRk^(vb~*kr>*#HE=JY8 z*&2jMVbMOm$mI+sc2;GngGo{b6IdmbcL?Zxm4owyL!CoUdXZp~VpwW!7t!1CONo;x z$hIId;B0D$*W{`<@ruL!lE3VtQvVf)XaieorSg<=T;^)%t1t3p>R~qR+I4L$%@sNKOhMTl7A%1z);o64&}_Z5i@O~$xPQ@ z95hw6tLii{ta`0%c90;C&X(#=`D55mAGb{-E{^{ zvf&IQgU+KE#Z=yr>XS=e(90q#R0R-4&k0+F2uO%7zqO))f++`1Cta&<8*46NL-Hz8Ai6z=K*}vkAF4N2Fw%P0z`G|(nL}tc^Qy6 zDfO&hMwSO|@+jLAg}@(cyoW3(Duf3vD+xh%+APW^)mfs_AJCd-+S@8DXc98>4cZ^Q+{}h#%nZD zr}{%DZ>=>ZhjOmf(;ViB`IH=(lgtEu#2XdT!_aYY3hOTuPmoDQ}cZF7$82pQF@g_Nw4X~isqG+=1(h;e_Xcm-T$t!V9d9>?PxIi6el(=wllcU5JOTq44M(Iw5H28$R-nrw?c< z>!`@z(q{$M1q~ND0fe`&t?mhRLldlnDQuOjv~}oSU#rl$=kV`{9Za6?^Ecg z!pnv^Y_cj98~j#@x;o>KSU$ECiWnYyL2VV~EvTM;(fk@XaJ;6g{3zj<*eCx;RB8v7 z&*%*i^>QoYUE8sXvwlVkJqA3r)1iz2#~91J6?H9?In1rrD1Qzt*Fg5b<#S%z_glU; z2SG0`7Z6220Ykspl%ea;O?-fFZt}9H+P-dffn03)3}!L`Ohm^ii3>o_aXue^uJs%(7(D8A#jiMMc2k+E{H*V_CQ_Tu(F>~Wh`}jrDSTKA+*v!nd&^pXsUeO93 z!EBIlf7NBowqBW&&s7Owc6f6v=_W)%RgAf950DYhm;(AK--7i)fK`#+pts#Z830fP zvl1%RL0AKiEh9i~Lj&EO+GY3h+sYn!CZeruC~ei8HD5&&J+PQST*HThpdLlyF&XQ* zVDjgl>kuj+U%@1CHhs8>%|lEjUUhan#FwEjfP*xb>!!+&0MWnQ_HHvMqS`W6=!uOU zH@NYn_#{{%^sqb&u*O*SdY>~<)O*v=^~4t225s_65&&^5UT09B*N>lxv6LDEPg+Ll z0iy95g=4A(6rnd#^|#5;wh=7+%L%*He&Nn&R~_}a(c7v$rP-$pL2EX7b7o%$|IvuK z>lb57+6D^(2eT_@^=qYeRA^mCh0wM7rFG71&0b!U=@+|pZ1rW-zu}axYqL>1gkjjB zmTZ$pVbb^ByLGTXz%Tv9H0z2hq?$EI2lcmA7B(Z?QFUqR5FLzUW|j$;d+}eO7qq@2 zvFE6p<)zP^F>_Kpw1;U^Kqnwx}A_}a1*^#$%Gcdj%^I#&??^Qd^asFSKkb>##bP8Gu+*- zJBn8_N6Nb)qh@obn?LKIuMZ9n$DKQB!m~E(o$kGkw& zu)`*BUs{Yo-m6|nH{Rl|y9cVcgwCTc@KNinYsq34rR^cxExLrVUNs95Hm1wS&M~z%X=#PuzKJ8h;aL(6=i=s z+bxSLwGMYD@*|5^_}tiJ zP%-Pf{Yt1yM?d39Bt@Qzo&3X}j1gXkt0FGW7bB1a7Q|wetJDE?@su}gHr$9x+cV%3 zNRzQ;wpzRA%<@{o{hTY9f?R!G4)hU`K9I4igdhm1FLgZ{7sD_aR?GWjy?euwscpXj zxLKs7xhF_|h%R7i6Ze{i`)v1dUS7j=1V+Vv6I^uxN|lDrYM8u2dSqs^9Wd^3^(vdB z;^g*o>2iW)A7Dh&km}+O;gIDv=%!Lh_vMjp$5!}3e8bFw-|G%oYb`Br^rfI>Wkiq* za&(UU7(FZN*WoN@K-FR3n*4o-;^#XWq#> zRHbI)dU%+aL%`@JXlsIO{0=IBj{?^eV-ih`Y&x#y+gPIYesFNXwP4;0t9|>yH8O;4 zp-`s;BV<@2EThDWz0Wf_YKn24sww!2fdO(6C&-#OPaIwmQUCXuMqS@r37*BYWe%9n z50dwYI2eBNs-BVqQiRw{5y7D zXw|$Cn`n7Ba(t=5Tu#}>n)pv*(LlT_zm>~iQ8G@wD@@lA5Srg?a$F3mi8O6by%HEv z&6IZHnyW(#3CJF6bhBWiuFx}KFX66-9uQXQ3gzNiumBNMO<=OeSGlUs0)hI2`Eu;Z zr-GQuWn+1MtY2cL^hoIR>j@sB?R?pp7UW-=iM7aV4i4Of_hoVX++J)QNnv&1V z_tj2$xUnE8%-A1U5oTj@WQP@ysO`*Ps2zf7J2dc2pg93;uIoOz_J#h4fa;{eax^@fXYE6(Mrs2_l5GZcT&i8&JH0GwuhDQh_UE7@zZ?@dP_e@e)Uvy^C`{PEI zH+^-2^-5gcl4L890%uw@q`!NdI$Dt3syYdKR7J{)^2d^am{zvYw{@t)AY@1{cifoc zB$ZDB!45~`ec@3#C$f3*{k?avxQPL4sv!zlXj?aP$hlZbH?7+pB!f|bw}ce+rA6SV zcxc&k8yEK@E$b7$00Yf@OwD>-9TX9pG1LUgq_8U|#^?H`=xvKv-_y=9)GULe&vBD+ zP@qqlX?2MD!I(4EJ}(VyNJ7!eIiFo5@M{Mf0JqgoR+)qy-c+}0J^6|sn|3va2Ss?2 z63)=&M6$QheYTSWb%6166sllvdRLLL^#NZDD>-T&w^A7yt^`oV#e!@eRdVmWpakni zDdL2k28DGSk1c~W>(%MTj?}rb*f;yr*ru8vpY^u#ZrDzA{GC+wB*!=V5GUgXdzSh} z9N_qd^9$nAU^tH_3MM=1II*g1ad^O<;RQ8Xz=HdZ&<}ZlR|aVAT|r&bQ}YX9{R+At z_|W9aHm6nWlY3?WsCrp4F@+t2${ahbvOhb0ILJ^p#n`bSfT!dl=k%yFKaxL1NJ*ci zi)tQc-Hscz_y1tMW*lz10ejl$nWqb5^94F@oYBSN3KB z5+$dQ@fo`iy8SV4JHv(;1qmpbID{)fna)rYV)%RUS0Wz5@iv*|Z zNc0~F`GN8slBFA2o$2{EjkeE=cURlvXCM*F;5=~p!X`Yi3&2hhhg6VnD;cgocd>9K z6}r`~M=a?-dg%7{(S+KH^5~hJq@&ym&A`T(X(AF*liL;0R>CIGYl3AM>LUDvAefFt z^%;sWzrxAPTf)l`K-0MPvAA#sRp;6jhcM6!j3(Rg<<2LM?1WL>xi0WCMNcrT>5VF2B^m$E=`^Bl<-yC| zFxeu2xirp|8N#~0ttQq0?>=A(`kf?+qtxU#Rfr4oQ=OT zN9z8hiA~f_Ej0Jh`JG>o*`4ZmYHWTyQn)=r6arp~^rr8&_5}B;P{4qy1v0-qpu%X* zcW=;S9NrK?R$dgWXLz!LplJdtq^&8+RgI`j2zpxL!gm*N;TG9Xg-%`kTkmZbG8(U+ zk)M{9R`^h@8yvoKis<1d2;W}~e{6&LA`&0~hc}>2!Qf;Fk0=0-$6+1lM==HMO0 zX>+epy_3j^Hz!j%9uz7hi}m!@oPYyQ1&w%vr_ixx6gDz~7iI7ghHg(5LA7J7zaB}$ z(vsjWs=-lT7kU{kSyQrt@wggplko2+g zenywgKFH(ypLM^%F`$g2G+7xjWt?E{VJCB<@(b5&om6ORua~*rCY%iH|Dz5StUz9D ztnWk8Y%g4TYwbHJksjRb!imDfcleMA^7JHViYI?Jco2|0&_chMAvVtL`Pdg;sy+5q z7cTDTHms_p+C~I<78ymH=D%4sv6)9Lgjq$Pgp!?o%Rf#Fuy%p;6tIAqm&2Qv2B(~) zjFMU!Po&ZZWKJz)>6Wz@%~C9oEHY}8ohjT{I~atb{8{;|$HXeY@P0K{hvvN{v29BA z)%-N+#0c7Ad+>VGBczP54QFX$BtWRCKgNUS+_s$&K?c|`<;KNRj!$(N8~)zzj;-}$ zyev_d+F=DhhOsNdg9^2J8(hwtP9R#8(7`UdXA0Ti(~9wYBc1DFu!9_`VDJwmi3#}h zR@~$uiA8mgG+*gN zYC~soUhe=@u)3D1SR~IQE{GyGf03Oo?nC#w**D?zfX$?0)04zqd6vbVrCclyKyol; zeJFiMpoCX<^->XCc*^le5Is>Jx(qB{DKyYMvd?AtX4M}iNO`~ zjoQ|w2t&8!2B$6q&kJ)Z;`3V@U&zq+$g?GJ#WrdpyUyb zTU@&Z%Pf_;Oj{w51K~QdK6oTVbhQG|#J9vuLiMBXymQA2$z}@}7I%EAz_cqu+UN2Jc?m=SB8v2^4B}S30q~BpqlZPi zF5xIif1C2H|JB%ZvAX0b5D#DWy-u2kvg5}#Bg%^M)~ z?ZBD=1H(s{Irdl7i@ZX|q3Dg__NrYEIJ6!$6({j^o1tY}7=S`o)1#&pk5ur-3$jAbHGFTVaYQonZ#n0A!z)?!P3OgWJhzk( zPwJI_5AX-#Kaejkf?8ePxw%w`l-QwQb@6BMgP@sBp(j-AYOMd|~t z(UNljEPs}}wM<)u|`K1uPfiY>p?MUwg|s^MeDrm-x}!l~){hDawzzguB+6Yb6-3>ii=)zbiJzpb2# zwS+&L!j09)CX!wj5muT7MzZN^`E~*PyD>;hs7qqG*=z;i^^^~DV(6<*6Bj~v+60(%;nv`CTf{~laQq@j z6fy{{JFm*99EN{89h%s?IYngOn@J)MTy7eF7>~QsbUqPLg2i5FZyMi4IBb)L?m(fO z`8%^mU(0jfz|SI5(`Au#saZ9Ep>PtQu-JaTe%lAL*91N zx!pvtoQ)NZv>w*Uh5=PkArEwo1pIRjVDx|kw)-%6N2QkWw)ds#cth50`7eIjp9g+s zGKDuW%W`w1viQWeX}Fp+mr#qvdF6P`i{*Oj&Th1lY#f)y-t=O_bfstBf5$ax--e#M z{W2W&gpZ_F&mZVp75dcL%y1#l0hLtqbBsliI~H`G zr8IaxNAxcDBrqL<^52hX|8mfn2e5-Y4%R!S;lV-nHIBhGl_CyG$M4<30DFz??hdQ9 zmxy>r?>CyZNHaVsNf`r`kNE-!b?@XG*q;4%cR70t@182`iY{Y3?+Po8V&vN+lGy>Z z@&+;AyqQ7LF=vcO?saSr&8rUr%R{&-8`U+4Ex=TMY1VNuk6|S%73VNop=O|;paiFs zvx(c-i(?sbZw83;>&!t%dwxbVZ=h>-rKd|jy~6DHG3W{u31uIyx15GRVHF0ibc>Rq zqF3g0l4t$=edOh=jkGMM7w?ElFyIu@G~cyA-ueTT!3rD`1ep`rGNDS*+n!S#GeRTT zo#|-Z1WR)vMjaay|D~Dq|Hwe->9491GfGjG<{s(CvpxXz&IBlqyjuYFS(8#;bL)jx z6&rhDsNt`kz_=MmMC$6wFB2QsEPx|6_@;HSN^A}rUwz?Kwa_u#Q&sNJ_}I={)j4dbx&8hLh*6y;AP$2KpC@O z`hdUGmtbeRFN$Ytdh>+&jsc@vZhZ<_#?{93+V#p9i$deChgIkXTwW~PYDD}XX<+N( zy__#;^HR%qioe+h|MQJ**GNGit@8Oh1x2Un;4}l-RqIa#%H*Q8%MktXa zU`i3j;c0meXDS=N zA%D7C+Jtu)S?mx25eFU6KU!WkX^`A4+52rjYNI1P_TG^euW9|p^0k)Z$68etNQg5+ zs1s9xdV)v{J&2&G+vXAEan}zQbi!PbhZ4Dc0N$WeDBw)JH^ms5&_rvW+TqU{06E~D z8mc$#V*0c7y+yIXG1F+kNg5Ulec z#sza1ZnF{iF*Lzz2Qc{WyZdM*0R&BfIEKUW|5hW-f7)ZZH7P0ko@kgJ#i)Ija#Yr( z|9?@B9s1L6Y<~%cApY92W*faa5rxKxsr^{;LUeGA4;E91vSxT-7Do8T%ARi~KsRU> z!y)*Hsn;?lN^3hE;;qr2n+DXeXnQJQ<*cNskuw3wqIj`t3g~wtR%u6;ZSVmWS|Z^e;=ebxma3@E6Q@b$PRX^^ z;bzH;1sVMvZ~q-yQea_ zxQnQ&uOkwKDQNasqn=paPe^O%Jd2HR@YA4``aa^2X)l?Pz^E}}QoRG8C?Ak| z$SBH4$#c2H$7czxL)d@R6|{bKYmOfSOiD4yMGkzZfc%vCKELXm`pNhiTUI7Fv* zanVpLCfT+l!jl)vYV+oSC@#-;1HO}=6unJxy4k0@62fjolhbMOrZU7g>t!xOgt&Vk z!lILhG$m{M9^yc!A|SDH;!A;nJCUAf(8{7oM1qxM8R*0sMAzdAn84}hLKlt43I+K} zbEk}Iz_B$lJ#}zZm?K;!(b6Jd#RW-bV!gW75t(${EP6> z+fGaNC7+*2inDz5a@dnua}A|C{}V5Q+_nzTZ2j|5p$GrNQ94UQpHc{t)$q@ zp{%@l5I=G)?j#>>t>uJY|AbCn@rNtqJi;gC+nOq5L{ojjgO-lI3F+PW|3h6RI-uWEHZ@8S0A5)ny2|e8PG5I}7O6H)DTs6`M=|D!J54zV`#li ziDq-co{|>yAzZSfi=CnHMO3znlyo!-{*L8=8jboBUtrPS|NMI`^*Z~t5%6}dI$bQq z4UVHdiE&}otbt*^(3HKG-NqRMr)s4>`F)a#0zchUo0Jq4y98f>3%l`j7_&{xG;^K( zxRx~5xM1_V1}+^k>&f$oxGRdJ`7L9Xb~}zAa_UFr*j>;)cQ6&bPT5XX1BfbTM7g^ z;L?uQ64y5;x0*!+1w@B86qM-VI+|{@e4{m5kkc|cqr3cOl=aO{HkQ2Jk1|LI1OrpI zxfM!_(smZbcli#S(1SG!^s~B<#XsgDfBwFx+cPI zz=6%B!b1)V4N|(^2+m+bm0*sb>b+eG7NZgkqjVfLJ8X>(tf9Ksjq=@bItDWwB1qCH zs?_8sp)WhZ0qxx94EqYMZS z2-b#q2)p}gaU?%aF=3VnIGCYOk{4&RJ}v*ifgRJY5C4dPT zq`MetU%Nr^h+l9rxn`}i+BbQ8!jOxB+(o=;yMX%6j|;caQ+l&Z?%xMosC}*i?2Bf_ znY!LyQ|`2ELxpX%$8B}*^#?^WwEuFh5FpKWxC%D^Vg-;+-W}5h2;M?A&%>5NnyuP90XRk z@5vN3CN9};o;JxkIet$)V#2zLp%Kf@X+D{Q!L07i?Ab`5(@!&RM#0+99^ zScpR7A--@&oo2PcP!;Q-$5mbl`3hDZEw=U8Uwha+E&X*jz6LHHE>VjII*Hz~gj>^h z^&mVxY!M*NCJy%MwdF@uZxrSH0EOE=H%pH4o}jXEJq-uPU|F7U$Q7ES>ERm+%o zOT|6Hu=hA$M=~L`8g~DV7Q!LN5%qViB@Do`A(2lKkRSoFLx2$jVwrmEw{6<63Y63^ zTfYXFO1E~BW9Cvc(0*l5_eik#C@oUs@mo=BiU#~Tj1YLR$I*j{IALdI5PP$hL2b{1 z(0$q!^HPKd0GdZ_f8cX|ew zHf-75L`oj`dp5FJq&t z+i4J|CQ$y(grrmL%rV&a=N~!XC*)`t@9w)NzqJTYUph#S!>NTC8+0)7Nf8zDGzeTG zCi`1KMKG!hI56)gLWSf`-u3KeadEYZb%-ZB^2bl#GeFqsG=hH!m#w}je;b$y~Yh~VAEycv!4}8HVWWw!#GC0f1>lS6zG3Q7&9W1ZQ{J& z=U)EGSNI|Ane>q<)#8&LiauR_p0a$j)ORqoM4Ep~FD21&dUEf{2*|`TC3SatXfgXd zxF$!D8;lIz#9h{3T!%=mYxT`>erIZcl95eziOk8^(Tgp-ZF>5k)MipH(xHL1DU2ok zDpm0jfZTjN<?eauh%*6@)#hSG_{t2MKph#4q z=>h{L{9NK!FC==|#n^0=;$7(DDiXp~1UM(p#iSUAp)I?PMuNbG-Sds! z_(ZOubTdNT={KgbDa4wS;xG=Jcd0&uPII}=ea-#c$(*zoUfU-cGg!b6i-q4H`-gsI zpU9DtCjOTBZy$u7)=bpWMr4p)6TJG427qVd% z0|u81pj{-0s5=wom<@NK2JdtUowoRP4L3D56y5G|t@9XDMCiM=?F=bGa~vL3 z3lfntZ`oi-xxG^wH^gUmmZf)%Ae3z>mF{pVh|mumE=iq{mWtWfu0U;uu}$4-OMKHL zr0gm@2-t<2Ax&|7cUpB=WoG#H(>u}ri@fxq3Xcz-kf>-vmDeoRIJlJ_P7iOKHeN-; z2UwVZnrO%fu8H=eUXyD$QG+ktz$qAc8|G9Z1bjMiM3d2Y)yYpOLt0dh8`ExEy%X%8 ze^M9-v}y4oy-<9c6>|Pkqso!TARq;BrT;#4zjggdr$ONyxsxh^9T%_*RxP%1?0Qb_|YuFK9d1X)NRJr za(SmS2Bn@8mIvi}ZH$d~#*k6nU`DBcO3ztt5?&2sk(`ad7GvGCTA5sg;pdN>;q7Mz z^agy$yp(jCf6QLzJm)xk_*k0he3nb8tT!@sWWi*WBi$ZA$wWp`6wFd1pdal~lN7n8 ze=Wj5&McXxt}oi)n^d(aGg^%fC{w@(spp=#5q+C>IHrvayOgmviRQQ{KyRL>vA1Xg zBKP|WS2MBsjpy>z5TnZOz6IV!{Cy@-lmzmmLttUt;<1vKpH904x~jRPM*^TFdl@O0 zR9+3n5g8QTv<5^TXW*A0upA(8!G?h^ozOeUglS|CbkQ?!&2(Tn4=PWXhD!B?`wn!g zdWuo~T}%gWO1_72i<~H*V5Q+AK&gampxc6Fqr{B!jVGGFeaL-KET7&NKkd3?EOqH*A+Hv}GnHPGIb#|cvp+z(knMfOb5EWigC0>K= z1BL=iEx+cO4FkR2Gz+Y305;r4&JPwBAqQgnrd%1q(;gCpo>rsHM1z*+E5r`06#Z=!! zv<(nCQq3Vd$M|_@mtLnqdVm4bovV}38mDpnc8Xf=lHs6)9iUB|y~6UvAWJhWV}B=N z1>7y}XEfD!_e1G=%~}nNi*n(EW0lw4-#9+ZykS~cwLr=kB!xRXQx9IVJ=ybrT^_v{ zD8Zd4a%gnvE}S|=^ngsHMm+rTj0kW@irwP*2hb&gQ0QKPH zP_|NuN0fG$49=YMi)-OIT^JRhqm;{72$vjgDhKgB-Xp8pu~}>~&*ktH0SFm3v1R`_ z6FRMZ6ZA6Bp<%FoRPLI>KrNm4*4gDNj)76}z0Y#0boG0I@Cu0udVEc_ULUZL)&edO z=DYeD;#MIOzro(2gF{C(b5mP$N`X|2@Uvmi>*GU$W<|msl_O(8^}RU zr+$2yWp(TfV$Qp)p3c{%_@jYJWK7<{E0?((7d@H~O~QTL2CDhIG0ppbsUvS3pir@T z(;EIVFVcr&vlPN@{_eIC{paYGDeVAQaH#MW0r`qcK-z_?tcS;T6BDeAbjGw@^2uDX zlyJ6(H=;PnR>8JF1=du=zg!9BPI`M9qt<$&D2IJ^p+|H(6L)3p2NeeddRpT|N0TY4K$Tp4 z*xJ@*+&N@G_OQqu{8{^$U~@!M&@V5?X?7ze{DXq{o`0%(en0w8!=lTVy_ec9{g8Cc z%VICoQ*CR+csMe|mTLGHH0CNS51BC=`Zo>)`l8;$mj3S4Oc8LPZ){5loKwx$cQihy zLy-rEJksYYu&NAO^_=m9P!5UzP6@1g-+S*g2x~>8KQpJ-qK??SJox&W6{hs(w@r`S zAm~^_chV?lV6F>n*#6w6;!L&I1riS?$RF!|NbdwMTe9)_xPflltd?HdRbXJop9&lC zndPs`&CmvThXHL^^b(Y9k(&`)fZk({bfZ<=?&5+wzms-j>FS$R@Id3r11h8+P%9f@ zAO!$9!Hhz?y5fzopakI=&w`d8DU6)ySxc9ocp+?TYl5Tw14X9ag_HIMysCVmT- zSV=7uDlF1Y3HOrOk7|Y)hpg3H=aYfcy@J>(7C4ntsRbSx-0h@{o-VS)V&944FLJ9R z?_(`MZ2U7slG5m(C`(-z7O)G99;7+PU%`lpX%nu#0s+mmg7>b#KAG|&dL~H|+KALV zNZWRle82j8HGdmVdx%&m(xOniPsrznbAnzfUEuvsKFops%+{ZAp-wdH)^){>IYJwK ze<=26;KQVG53=Ch@QG&lcd;>Lwx#J8HGAs#%LIa4#=OC)s~gMZcm$tUm$#u<*|K+b zte=XSI-*E{%2FNIJ&fwB+N!R>s7eSUsr4F}hU!c>OhA0hp3$ znEuh017M<{92pD0g^9vV2a+M)wls*UUn;BAUsI*KhD%CS`0JzCvzma!X*6sV#03A< z)FFz|+p@^~qOn3)*x$@rIosR9g`Jwwgn2Y&a4G0wCem%;E} z7#W51CJZU0Az~Mc@*}PX%Az&(zo9@@%qz~*h9dM*wza1M%+>HS*vCiV=z~v5?Ukds zJ!fQ{f|!zcN^B!|RUDx^NG5eqXo zmfmJ(ox}&H77C1y5=saX)sx`yo>KAu9qyrC%7x7^_rniCc-5cHNgSM=}<9`L_6T2o{{Ik@CM%u6N`$ zC5*%%3agKRM5SRiZJzEN*WOm~PE!?Oh!mShd#zwzsi#-lw}V9Ng8`V3xQxtyE@oT6 z{C?h6$q=okG$a;X>(vxX(s*@qh#Gxb`9hzx&OB-&jufh4LjUrbZt0TK;P5k5{+WHKC~nFh0{P7&=qa|4+5zhBWO}S&=4y?WUE|kv=h-{T!c47B*v_78u4059mq(X-X z94uSK8fNnbc8E5*o;?~{Nq7+V2-1OoSXN!K$fX)N=`$z;lHVh#=y8w9v0422&EZL%HK?xoYE6rT%igMdW@_{FLp*|m&3iJu5f$uWMu%^ z47N17Aur%G*SSD+XGcisqoC5mKT}36w9oB04#R9$aOSFEsw(u&5%>d>(DyvXT*HnA z{QwAzGcqby)EKnois_(<522DIi&qRXO)g=#FdhwMk80+nLr07EoiE_#z9jom@kd#o z>u0EP*n74?KU=Ja_Pfg$uq(@p+yz4f9nO`FBhqiK-vXB~*g=s%Ry&NBx*8B1c-fK{ zvFw{b0u*aTe9Q^RTxfDa4M7-wA57uC&!gYsjjTQ{O;bsj3Lx@A7OQ9dnS%}~S)JHN zD5-jp4>ti}pRLfQ^l2|5`HBzm23&HM%Js;D8mXz(CKm6bs=Xbg5QqjH^kSLw>}iSr zrPE8Kx>jM*}7G>05vvC{kbusY%vWIDl7_kV_$=3_56(*g3 ze&gfFXSW44gt`#p9;nD>b=Xl!hzmiJSRo`D{sIOkZ~FIKCd2|_l@fl8+VNWJ0B=h` zVaTPU!S@Xl5ca`aKvGOQ0PwmcC>by&GXies-v?tkU3`x&%&!A%8BBeDrPaYvRNOs5 zQc~1Z-380?9(UTn2Hpk)Z7>8fFzODUz!qBTW8m1v{WA$zVSlD->Qr}6=Fn{QPx+%` zy;T)aqd4#}#cyvjEQD*LhbXSuYe4eggHL%dmLXEMXt{??qc8yJwIuK99l-V92)?3( z^#l*~_leg1w4xQ6n_w>QV;JrVsBZy1z}iB&&ijlv-oO8p^h4SgK#4^#GDoT0DA4Gv ztOum0GPnu_5I*y)s$W{)?8Kn>}qEi`2A7=;4D*RNHV*_km{`++&RMB%UssctU2-(G5L< zC;fn=tS$zRoJVnx;+5Q;=o~-JeIxsn$q36X*+CKY`i<_P$GcjHK6_F(;P~wCG;eV| z!`8}_yxL*ltr%u{RcAjPenE-k&qcARr$BNn#v%r(8yM+*nW}idtI{U=x1FJ(E7FKR zmD2nw5-qSk#tDVW$#NtzN+LNewq|u#lm!pNz84$)6m%qRz7E0@He+XY4XWmzE6|XG zsTtCrA`&S;K^N<&LXx@ST|lPEf>P7j4Q}A< z_9`&vjx+8a;p2kzo7siV7U{Ew*&e1BSVeIMu%?;sX_zdVg^u)PqZSIlyH%uNFP3;UeA`WrD{C9{3-OGXC$e@s*QBdqn?rq{C7Akt|_@R!yoX&f#p z3S8Zi{B#?VvlC213(dC7JDxf)+RTXI0GH5bx%C=3bpxvj9IF7j5_@$zxkESkEn`Rb zBOsi)fp6Hgxl4uiB%>mNQF;w#h9Xk=#3coV(_AAc;55PB2++}^l}<%{@H=it{niC+ zR(JoqH$vvd=d?*L&@AfZATq@`SKo)KAXF43=PMIveYU_$(T=)&hg~~vt-rtYE@VCN zqRuCIcjC~()mL0|e(5bm1w+L>0d(qOBkQ;V?MwZKztrs};lo9(4K82>viX?Kul zg?taaHHKYQh@=;s96>T01@~+!46J6~2-4V8T*_=qWvJV@bSW(Boe$bi?^9~rwWv=NU1}o+| zkR0W1pH!tnS>6Oi9^8KVZ6DZ<2NM3s8e`oV2s1#Two zLJl(eO>5hEmoKET9ko5sRZ2*~krj7s(RtFh>BgY+OhpvzcV`eFJ{_#tYsmaAg68b@ zYS1uQPs`)HU+zE^IL77E5BJ-*-+7EinjDE8KDlhx#N}Z2lcxMzDRJ=7`-l74ZC|&e z$>W-aSp*n|Azq0e7;FR!3bZk8HD#j(j1N>dDY`sWyY#e#7=0U#?4HJj0W5 zZFf{}9Zp7=z>m{0Avsu=j(%ablMa=y|iK(7&R znRsn>X#Db_8G&G#yeS{#X(4DrMzM1dLN?Ezn;#|n?r<&)8s+^1hN?Za{n|7zZcyde z>uUR+V-!&!|0Pf8V7DCMFwv8cjvR$eiUUiTlVo&1@~rNTjARL3<fA+$wAc=%kTV(y0ckZ@? z+abDn%kG>^UpP#dNQ+F!fXPs6zL!w~1hgt_Q05@IL^*XugXu@Js=PTs+OS{vv4RC= zgAomYq9g{b22vUW6ZXPCjeF!}gyV5bM6j z9lWwlFA&Xqa;$SNcep0KS)qu~c=0*cF|5q#T_ZF5&rI3x$ru5LQAy^Y&8P322L(yB z(h?SSQi$Yyw>huM0V&c+dWHgrq7(|&*Yy1inO}tybo6#~O+3qwMdeioSjsejyY-f- z=Vz}_0~}zkHu2m+4i90`99nfIZzfpFq6TEK@!9hp8gaIT18)Z~1 zy+Mova3fdDBbV;YoJXgs)T5Yh+VbsW2WVJt7_LWIlbRa$e|-FZ#1(gY(pf_7Uia{2 zMn*nDY?9}jefb_x9$IOeQ`(1~Q`8$M?CRu*t`-Ob=+YX5nb-;MDJ(X{g1@eT4&Y&0 zdoKOZ*m9R%BfSWhKB=EZ5JWzbmN98wQ{}LYTe*8(L&~qid%yM1Wo);otHbj|`7BS@ zq%H{0k}O2w0zwpElpye z_S^)n)9%CzKRSL?YU}CH_)FN2+P1hxy-`2B$oEA)v6)CEAH)Gc9wX2nuGBlfC` ze-xGK8UON`k2?B5Reea8X60aK?4@ooKes2!bEbEnT0G5^e)O!hj^MKh-N39w{MFXv zM_h`rPcvKl`v7+mSCLil|5^$+V>`mxzJ~|w=J80cP6}+gDPy|?kL!ZNEDP?Zr^8*x ziNxH~z4TW>P$EqX>~H{^GbNP*4hyFWH8Anfj(B4pY;xl-GAp(=*PMvEr$7qQ2-Ang zZ;=pc8Iz+;=~}gs#!?C&TC0x-*X|afMECaImO#*vfWZhu7zrVFSb9F5$X(-?lV%DL zmAbEoMAeZYk@YziE?D|^hh6X;)5k0I#Q~AOA$y8~rut)>ymTHZQk1EQ%H*~|E2 z_oTNa2ZeYc$Fy}k3FZDm8?UMS_P#l`Eo$on@}`jTC*Y@wBd?@~0mq37qY1xyKDl>hF3Ec+fG1Xmf<059_b2QK%C}U81*pA*Et1mU%;H|2p*Q{I4}7 zN7BJ3oDG0iw1+X&l9v}lX3o=I@Q@T!GS$}oW7f+(rLa^a1s|6IWz0+pl{yaSU)o;) z2$PT1EO093#k10j^{8XgkF_cIcbSMi!x6;Ln@!X4@P#Bm0CZ^UK;$-UN~PO5U6c`rUNiO4mM&*&%*l0&4dq~ss~R79_7fy{&_+8tk={)b*09eWObxciWw&c@$*HjnoKRy@IHx*noSn6uo)P1Cj{K1BW*r-jC zv)cU(q#15DZu`=gU%4q#_pY8bEAmg3$*0Z7DM7WXZ$OQ^K&}PHEZ5Bs%}GsOGlR~x z@=bG==xF;t`Auu|C)*Fnv)W!-&2#&I(~s@^XeB$~JA*$hm8M=E1} zdxuPxHZ;()z&v+42zgej%aaw*AH)z}ShvvV89>f$Wlb(_VE$wEI&6$q<>XN^kk~Dl z*L`e^J6&tz><+XEMft9rxsu@%F^TOt%BtspcTwauFvrGbinkPG)!(64cqj?Fw4l01CgB8K-M^DuwEtv1yL(V7@-3Dc9x%}O!R1g}YJLL}o_GFM(N z-DNZAKG6H+!r~@Qdl<2m_~c%1Ys54NS!k#XcJ*N zUaa@r`Otw({knd^ReaZUd14BPo96?RHm6u#&1QYiS$vBGhU#2TF6&(BGw_ln98&}p zriX(IngfgRdLS0C8EN|x{F=PkLH7>;<%OQ00O$@GcGozatO+pd`Csj+(}#hBXlBUi z_(}LuCz8m~d3N@& z+a?c2d!sM2oN9ib*W~NJQw}GlBieHy0>MOjFyQF!E)S4cP$7(fHkoQ8FEqv^dbMRa*>x+ zA}0FA#7XO)@K)fDpUL(RFo)Hf0pKRA;;b5QCGQBHBQH%z4DEf`>Wvl5uGTFZSC&1) zj_^wFMo%?NTex*%;vARq+h+`wN^81n21M(FV_>P;KmES@4VE}aN5JcT(5sUwhn15z z?Ne!rrpBAx1I2%crAeVgxelQjyKjUn0R&T*VPYD?sEN)X&V!&7W<<6xc#k<-bAFHw zGh7JWtt55b3JV=QMF0qHMtc&6xgZiT=)g6Of~!Hbh~gJEf)b;;5mq68BL}}*t3@nm zrdD<*sO^?10jF;#T^Uvn#)}=fJO?0o%>=hhTdic5B$4wy@pgr6{A_DNYXZ7#rz?XU z34vDGWICLQqeRQMDx?={_G~QJ-76d(6nWecwJ1i2SbUr#j=8 zcl;+v%-Tj?6i6=rFtN}$`jhhdyMvdkr>Pk@5b#!)6x#6zHA4&O#Xdeitaof_*Cj2? zbTj)&w0+$-#zE3(rlBAvyr!NZ?gn`N6{4(NLv-mHY-RY*nJLQaOG9Be+F2xNJjYcQ zXaKU=T0U%kigOAC*I5G24rb?5do6iK&;#0MtK5>3UZxas!GeZZNpgA$q(h4>>cnvF z-09hSIWYq80}p8^bKRw9Mf)!5N%_cG7!jt;YBseUZ1Q6KLuFF^NTDh2u#3OhMS{5x z$Fd27RHE^{KJAKF5LTP8T6QJ9Z8696$l z8Xf3zV2FBRcOIEWh@4p`MK3{wwBFzeT4CC=Y=|${hswQQ`6h~3JE2@Q*8U=u^)JsU z>C1xn!f0B!$w`!9x?9Y+dSGuNkt#TyEG?;_u&o%hf}MayI-(g7gWLtO$*nkYOZ3Ff zrE>PtgpY$N_r7}HVa;O2u2Fg6qqD}}C`9nt$o$P)1)|o!t=^3`-|x;Qfc#q-zxQ+? za>E$*+z#hOiob0(Jl~=Duh`Z)jVNo)em+CLE>+10m!m-Ls&-t*WkJtFx2s`MnQ@F$ z()X28|K_X#F7C;QuT8V$H`$PSAHln_&O3h24P^5l8wRZab`L2NQd^EQbydp*+X(AN zH!|i4OA0SVj#5rD9=I)mGwKk|JkX6Wa2^zK%kJmMO_i1*E<0)UKsNue{?#U)f0rPM zDqPV^f3Y!44XhcuH)GBo!*thAq8t%akDPMWUUxhER_6(Q}SV;HsLPY+Mo|Q`xK1CskJrs<_0Y2{>iGO-^ zcB|4eX8P&!NgqD&qMXLMIUsGUXr*xcE*m6T$)~#uk#k^9c{(j=^w+7 zMmE47SBQHy1FpwU=BJUhPbd?hjvM%n(Wv{JHr5m$5ANQcaB1HJDC2WnR03~lC*?6< zY-}^PR$Fppy5eOoRpFHxB~_o&_6B-?lJ>tI#sQZR)J4CXajD^le@n&v49q7-- zzhdD1Nl%kBu%a4*1DI>HF9z~(oqG|ufUj==puvcaYOhAbi3Efa0Ee7dWB>m363-+e zxg$me?2(%DQd)M-|51{BUoNIsLWQw)*BjxcO2uiQnv#U3lD_ikp*rTkz9E|N57#B_C z9%9>dt@KvJ`jh!wktmi?W|`7yJg>T_X*!z}=7N_L*dsk?Zsz$?!HDSR`0@v*=MKA2 z?9(KG?Y`%kkj0J33^qf7ENdHj@&^RGS{n0l#XAVhHOgFxMeZ-fMoSYnZ>^Rct*nfu z-TzB$ihy~&I|uLoB!nlFrN*?Dg(Qfq|3i*07f&~s>jci>t+!I|-VUm1i~GMwP+>NI zJpVQL$sJea-yiQpBsAYJ4<1~GF&-C=$i|z334=ViD^q!!3{mv;k*0WzIF^&WQ72L$ z%HukRtxZi2$ z68ot`Z4^U$S*Ddo&6M(`vz@6Jl@Y29CUPOl*)=9LE}dl6U!1BWwe7;(PZRbK3A5v; zj>p+4GQS|YvNq#YjR}lKeYoBmWGpS@pCteWFxl*FuWQLn228V-u2N5 ze9W7b+EVIja8LLGs|s7cI%dwEh}B>-#}aA2V#4?zUmv$7Gp4>+1io$x12*33Zd+mR znsCP3!=?Y_rF&B9BD%LE&UKY=EKl^}E_ROi00jIPfuHju7=c8>;ROgEg_su6jA32M}|1)UkB zOZuu&k%uggu7-eW>(cg|^o(X3F&G3Ttz9nIx?>Rb9W>qitl3tRx$tN5iP${hKSj}$ z5)@z$Y{m8Ys&#AL&#FvM58*AlQ65!*bITw!-O;t6Mwv#Z01>4BTLXPcM~Uby9R!{< zcXplFzWvioF4mOZj=+&sc&hI^6}cnZ;-(#HRD6ISTtJYh!o~>#r1C9ex4Ko~+7Gt) zzrG$iaeZ~c=T3|Te#G(AeL_>GfP#bs_2v2iNU-Gr&ZdGel031mZ-uIN5Igh$^ePJ7 zC-YiN;VWcSIlA|Uk?!;&+7yeu z7#qHI9=b-yw}U5}vRPrO8dzVkk{gbvh)K*cKj}PWl)X|GThnqN=_$YmK#Y|J!=F^x znBN6QeL7~r*bT&EaGpAq(y_`cS`5AS!032HfGJF~;^%d8p?`tn`p}dUItx-gbIh4} z#=eD(XbS1Ah|a6ASOMm+M&qZrL>XK(@0tUHSn$Y^@GnvmlcMv&jXV$WG<=yB(0y`5 z%S8iXlSka=)CeLX=X!OnsF@|ODZVNwqF7(RjgaH#iP%XBbI!iGPU!Q9L zjQpuAFYX`i)3OyK!C`w6i+xa%KgRCpBCQMlxL9<-itFYCb4_t%{Ad4Wyy{>oGyr|- z+*bPMS6K3KoB#R`x7urb>8#9h3+-ThChx!}&`|Vt!^zf`pRWq0+5S5@CAKQ420Fna zG32`%J*C^{d{jS9iX0&vG2IJ`3^0T7Nf>1DtP`3f?79Yf-lr)UsO-s+H_-G@7eTAp zTvm&oH&PM96=){>L{y1Jui_QuM)QDwkL~w2wsQl12=0zV+zmhp{1#!Q{Dj?`SMYZW z3-j8erK-dQfuqxf+vbV_$xKJru)KIS@M{R5>V$4T;5amF)py`IaQ1e;W~dJHUQrX= zG%xLXYH4`oeHE-!I|3^Q+gi+k!3X!50O`7I8L4{OSPL5s1wxSx zs0~*nKjo*Mb#tCMNk_UF95=XA5&PrG1D4YOY$taLAl&NLrGm%6Y-m~q*75q9&7{=# zyqZA{UiU6qb>zy5@BO)+c9y`a8Jy^c+~AH=zhe8MVz%N%o4I6@2jd!tM2I1DLs&F6 zA23b9L6cIN;;#3))}bFejzhC>7E_lbqRY2=+XSXch3Y3VNl)>Mkx+5Nps9Lqu>H`B zaY=(~rO3OqUrKwR(TFr&!tlbbWVxPS1_MP>WB{xmZ1@mR4~usA>&>dPAIJ~b6D zy056vTLqbV+p`6vVUAW({)?$d7A(TJaY#Gk9jxGlS$nkjB%IjvP zJpN5WsEawOjpejSZwglZJJPCyS=M*qxBo5?pT;fsG^Bfr;!i2$+kZ%62-KDUJwU?0 z<_(eoEdLtC(pwV+Qf=RyYbvc zS|YKAzVh#6n`Qio&*P}#w-IK74`ESr4}@Pfh#s|OgyCOn1;`V^6X`HGBW;GqfG%CtxTN5 zx0gJ2Y_f`|ud3e=*8x4U|IwBh6!unulaurFUy1EkfCh(!KnvE~OupBx}$ zwEV;{2zXf&In>T=d+{j!86K{mvX>bgXPqY$*#Al-^0~_eA4uFF(}AV0cN#y`7y)r< zP@i$6%{9YmWfDQ@K1!;(H%n)fF2^xkSmv0uV00sljg@ zDWjI|96q9bTC!f`+Q%A|&$?SF#>t+Zc6|1w@KzrjyRQm4+i_q|!m%e-L-x1Ps6sNN zK}c%)9pQgnse>VYD%BGtpQ9VTPF2{xg4;}u#LjQKjHbtN8lq509gR4n794b;J!JPkscg;PVN>37dgpe6nYq0TdJz*ZrF=q#l7P5*#Q}2n0BfPe zxKt?6&*)D@LMnexC@o`4LTJZ6kAq)!y9s}o61nZnP@_zhoQYoh(@Wr;V`$GVZ2!aIQZqx={BCSfYoZ74JH&uuEcQq`UW^p`%^rPzYs8@9*@cV3PiYIX1?t5 z5Hk_u(Zb$)49n$kb%Fc!qjXDXf#RLh!k|TkkLi zo3JI&!(m-G+-&*Xn~jKuoqW~$0@Zj3mr3IdM>A$w{c_oLT)$^YhIS^0eN)%x2Rpj) zZkUT9>L4wXXd?$k31eM7K~0|5&yGu~BeLY371Xa@E+f20#>KecOuLX4DW>I0jpn>V z+Bi(x6O|L3rOv{>#)4kZfTL7mflCbh3l<*;cz=g?CgbNVpvj3_C7ilM+ni!R|3TbT z?zSv=uQkpFNd|`LKJ_LU3F!ps-Z&a&V(h>BAOch5kHMpKwvpM+u%B2ysZy5TysiaS z9o*V`Dy?DP;Dygwh?EC7CV!SbE^(d1is)3*QSYf}=o~pJ$F&V08DH0+??&X7n&SOW zo9YF^k?RAjN-eixz4ccFBGm30f9!1pi>FO~W$_rIgMY1nPooc|L!7>dzV~n;fDQ6T zruw8*lU#bV_S7c(TBUV^l0~q-#@9R>@1Uj4_~0+tiELN1U*RkRRCu8+Mp4Om=$7tL zQov_64|FdB-_k@GKqR{JnTxM^8*D8-WN;!7v?IYkFz2wMD_&@rmoUoU+GBo-)rcJg zBy)eOm*g}%v+@m*G>6Ubz&gIm3Fkp<-av^isNb2Nr~v=n;HR&x>$q}b44V5~*wbc) z)XyNRd?t$gBDfa#RB+4BRol1>oFxYTC75??h$DY;p}q7q#3ViJW?ub_i0jJYEFk-! ztPcA!l_pdCKXFq0GVam&KB!^+)!&_5tBEKOUzCLA%du9w+s8Dl)cI!`CeBT^vGK1j z5jS#mUNwVdVI!G3PPC;eAc|*YPa9WS2&?V4fTc2#EGs{c#f6rfX{(Hj$H-ek#6Q4; zpqjC*AKpOSK0^~Ik-p{=(=zeXEzHMzkmK=V5-a+VqAn9&U^#nwUJ0h#02zv>se?Wx zmZMOSIDz8`tL-1z;2v|*`dd1sc%yq24ld=pADa)ESV?`E>tJXobSe;--;m+TE*tI( zpM>g!5*vB;@-6HFMTD@&Qctm_Ws`w+@c!Rsr^hgLwBiYDS++7AiG$e`evHx$)m#~J<_#vZ#-fQICENzrh@Z52 zO-e*LH?<KM12j$D;zK`_M$jU|G`m>a*Xf50! zE_AW77G3OsQN-Qlv0hb5#oGaiiE3$@{{Ae7Ge9Za9J>CE;mF{N-Z74K=C{X~iZVNt zqRV&OTC1W_W9yULEfAhaiG-Jo1X}O%3y2zzub7PILeJ%7dQ2?M#Z0g~*ftJ9VNC3F z=(SoFT<1dg2d^@M3Lgq*>_(;X%x#$}=Tw}`2h+PN%Md#00PY=tG!;nci%9b} zJ}T*oQ#yxe?#bniz?kO|{jZI01wiPqwNfa3thh)HgW|(RQVv*VX^kdHzn$z28cB+u z#r_A0M6yY?OQT5t2CU><69(z(odL5DgsM(Glft6O5x-lhF0oV9B5WGcRn5<10tvLt zPKFe|KVt8msR8`Sb9;exSSO{B*%H^3fTaM^b}Azq-^hl=y6v(A8$(v;>2%4K3x2j4twz@I~$kU|JpT z8bL=p-v^Enl)5tYqRrg~OI#OZqO@zAiunR`{fa!z&UtsBk0M$3!N~7Yq9dDMo}11~ zseK44{7@a{?F!$oEvYTPW)tihvvi2xW;}^sOqY7}7(=>DOOO>uUaiqn(BdYr*^YE$ zuvkk?wYV*jt3#1#m#4I#=jX=)P@2*}Zmm}g!y>l~0Z~vwW^&$Q$F^i$c`$|!WE*z7 zIRaQSC7h(VV%0u`FeQRrV0p1WrFirM*zI3*slF>n1xUODhVt8}Ol=O!$f=G_h`XOf zTl7L({|}b^Bs=Z{^)Rb}xhyLm0w_1>{^$4l0=e!r1aQ4@9O|}QBX~3+$os$5#I8@r zVUN$w6>m1!OI0w}(%Xdsl!l0_QEe#>O{7Th8a@m+=6f);*!-*f^Z*|M`gz|GeFJZZ zHa4(y{0i${+U)76_~I16UO`5Ubn}~wQuy3p`@;$znKeIWoInp`E2j(->U|eZVd*&L zb4u4Nbt7r@=92o_36`@dzxevknu7ny2sNqK62OKE=)My(?mI9La)jZn#ovnEt2k)P zU#L>nG-mm}9P4!mcP0u9V9bnpC{w31PAo@I{>M&Pkfa7n!@p{@s!LNl5hhLraHKm5 zm#WPhf6x}|Xg3kEYN+_-Ns`pb76Ga@Vkxwb5x3_|V%qlcMXjMez)Gtfy-IUlyE7{i z#SBQzIg$vW^`wkhOfv%EO~-N+Z!t}|fvm;~@3%)+=)LZ&u=z1_F;fr4n)7LX^qGXJ z37I#|=RM1Q;vc!Jv?z`a*f#X{PE9xg(f~izgO3PN2E*b)i~KpG?w+M7U8?$Aeao)( zh;8qe3mZzDic@%HGTAg9bo3ukMu+W3V0q0bKsO;X(LTf9^-;Rt`7E*x5FqDj`b(x8 z8D8n_ZW&vLO69tct5QEW3B6559sM5rAefQfeq`Zs6i*Ev#@{{0WydxI_bMz5j~e-3 z&AV%!;_s4d(ZKg&kJypWuy0zgg|*+bap`Wgq(EkD+eoD8191~!9Je4Z+Lid5$Kt-2 zE)Hk!ar9e`(~t^Kktgxu>Vsr4sf?*r!Hw>^P}n9KItYZXcgEf)dH)Yjy~f;Ka2kieQnQs&PS<=PwjD8P*N5R z7WBMXJB?GD*(4sN0|P+g~GM`;Pgv`e|cxm)3Yvxp@&>{P(ZjIaFWTaeMdK8Dc1@k1cj^E!4BwXCPN(8fz!q51Ry?fgz#`C_^xA5WoCSUP`;0A@$GFNDL#}lck=Xk17rIiE`qda%5`@%%AzlF?aPSN0))_PF(V;I3B@uJ7$e1 z`@rA?-x6U)t+g*AH&Ikl$L1WKW#t97Az_M^TdgqhJXDTb`M-3N>*@?AB?mHf% z!*hwcI#Ku^VpjPegDgXp&$KdplrDIVDiwL1ChnN&$G{;wSqb%O2Qm}HaojfD{-?_I z%S!^a*F|u5n|?1j8wI_^qy6CIT1iG+*{8-z9Cq9V@WP%=k9AyrPqZ~q;p&r=gRuZv z;BKYFD*rvJ)s_S=nlVN_zAOFhyPFQi6ew@%e58jrmGZ)fAFG$_KDdk(zTFr2gZD_4avmF-AE z3sH@*q=xrakZz{})oIdVy-h&CelN4&R1Q8`N~laJH_hQ1o)3{8n=Y~lps8cF)tB}S zxg1_~?YZmKTCBRFWZTWJ|J9U3w6!Lyflb@z)?FE5j*9xEKl^4ayAtNaQ3{eyNFe& z@QCg=;?rk5(41BNuEqVL1fht2z%vJ;wrLc~buN8p2sn{vB|^IKB}BE!AW|EJ^?B~( z0M_mN za2URQ9c7n1c(dLF6eF$fhB{hdvIYoEDo9~2=-JX>V}d%lra(eG$=bFUWxy21j8QPJ z;=;n_PAKvT0HP@Z$uC|Qm%=qu81N-Kn=lIVd$5{8JEyFX|6g)dA?ryD5MaRIZ5>m> zqQ;WB5~N2vnC%|m4~I~15w93#N#riS66*dYf2>nd2ZbG>rV;r%vL%vVWLik{CL3m- z`0Q)zVprccv}ElhQ(dy;P*Vt{lqkx1ZZtAw{#s_q*aagLil<_ zp9Nlom_CTRkd4m9wS0PHpk1047qcWbWb!b$6c4~s3(n;QgLX2RgJmODUte_0OUj3i zZIF?B`sFpYdHK8TiX;o{pKDarJ6Wu^A(Fy#W8U0^F4^{rjTuy%Y>s zia|4W6Sd~MF35S52Ah4E=Dy>*{<*UhYdb*fGkI=u)g=5{M@qz=OZodP<7-fScZ&EHWqMn7FYw;7=J5O>5_c~aPABwP?+ zmR`>+a$36tqWQwpXl228850hkB6;$3XfTB1%atbZgDiQw*j@_9uZauY3GO|+XhFop zNnn-+{Iz7?Z|r>OL9X}W{23!BW0~a;B&t*plHT_tm8}kS;Ha}BEJEvhI1BX9}VpH#e~Dm2$fu9BMt?{QlQ(rmJ{-0Nkoa26W?yWGnx>=NyI z)m>t7<+mE*8|M7;6?S47FZCQyE*fr{g(NC?$-bJDMZZ4)Qex-Z`S_L+8<#WUE`4T& zo!;}0NE^PQ=#)8KY+0J+_g((m_{bo?NQ7p@+)6})1|w011O(rjL|LOKmc8_LA@BuC zK|>HwIUqF_e3+E=k3ygicDbme>Yn=ykRRTrVbSih-wpow(VXA{zK*QuVe9?AzZmM{ zg6GA#4q{Y_q<+L$l=9cJ3Zt)p*_}LWn_>p1AMkbOP)tITV#Kwl^WJuBFh8|wdSs^`Nzs4 zd=b6-5UXMCcJ&B`k9=XyEiB#ZXXDm90F^CEPh<6Zz4xv@tH=41fB{6L&wUKN zm=99=7}en$Zw9y(KvPzR-j-lySr|qZcc!BY1x+(%4rJs02kI01u3f@bR-Zt|wmBKr z2OeFLMYi_)9S2BYi3!iIry%KXxkh;>Qxl$e;$IMM;Rm}bbcxP@dRS@>uC|K0mo8GB^)k-%g?MEq3_H*5>5cMD+q@BrrP`@d&p|D@nRu z0!BN}jV??PW~*grpI<1Ic@$aKGo;QzM$R0n)H4g+C*}N{70xs>vU#{@9I!41tMVF4 zq0Yr!;$Bx9_E>k9c(6p^bThISZ{JVJEna2pQV%u9S}R zq?K;=Bf_#Eu+L&+^77 QFO0)@cIN2jgU&JLQiX7F#dDvntUtLRtP9z2ml0RKDg< z49J$-?q~srH@}4|3etQ8NUJB#$J7^VD3J~#ih2rLVj9m_wPRXpi(;R>xg{?sP(MG_ zmN%Vw)ZCuwP4ZXdo2hj{x$w?&;%3^j((sG8}f$0x7Oa>#|Z(o6#^{1r_gOhaYkpj{9EbTpV8=2>5gO0#vAxGTdKR&0-f_MM}TCSvtZOU|H@5y?zNL(p>fXOhnE4cf! zKBLu~{H%ir%b=@E@Tkb=J?3X&MIGNd_uau6xL~rU%{PWH*oCy>r>ra5iaD59FK4D3 zc=&Gkqn7{l!8Xh>avkFpf;wOrN1_lDp&rti4kTK(r58u}wHM|YdeI*;DD>BP9;s$d@CX+C(ubwj88l5?vgVvo4dl1B^P>=JA!?3U042*- z1eI9BbK}2HHO75?0%q3WrCA!Nq`}=rm~`jY*umwP)_J;}>xX7rOEU8Kt!KIl9Ff>n z@%oJJDt7m!w}t`~hQWV#?|imvriwCk4=x7w~{8N7H2x$lNgxZEDN3 zX*22no5Jv;89S5UeTRK!a(T`;v>Ye;i+biOwmpdsR{|o2d0bmdO6Jm5UvKsX0Aovu zW-+e|zK_8QY>z)V7nZ^y4o)V6|IY4?^dqi_%(LgX*Hou|`G0rI=?t~GOxgp~G)QKX z_ou{hxeTqfY~;C)h=79y`BUE;IQ4bM(ecK+jpF%kiUrNz=#9?N6;fl_uVRcOJ@mOC zT=776^I?0b;MoUENj)?jRsQ^_Nt#Mw)~&fvr?1lNQ>)b7>*9}|F0+JIsb&6@=&?ne z+ee?Ydf4gxiio*=|V?Fl|lT3_N zFk0u=yGvaRHB3l3bekt2Ba=H_NICuX7*F9BCXwpGjpWXP8BDq2xkat8)4q~}F1DH> z4oj;ddu<9E>jtETES}OkkcbwzTS5CNCpM0X%8^}*Bq^=?gQ1*}#ymH#o z_dKoXzriro#`nRVx?ZRZ35Sql$GA(377-%z^x7!+rcHjiZf2qCC5*F4DVcIZ= zPK9M3#H$=DSCw#kZuBe!$YVZpbPr~s=}c9vAx4y{@_6X8Q-6G56N-;{bWm4;i<}p4_b|Ynv-yoRJ?0N%{%5Mk_)CltF*<1|Tj=M%sj77zr<}cHL zf@&UJR9d?iA}EPF!!wiiE$Jug&jbAW+U%9aO=c1$Q9aa*7Lfh!6z4#%9|xVn*klTv zF@DxCZWASI(RvX=t2y#Ki8QV6bH;Zp>9;$w^MPcJ|8ovO%u0lIEET~25))O4qNPpX z9{-WLww7&b=_9tAb4p+zK}7XZUN=RjEs@}rQ>uYBS5D4#p*14_UuL5JOC!2Q#=CAb z)==`WPmRjizVnAR^>&lbCfejr{Fxz>KrG6eSt$RBS0(T)x!jK%{v634~?_gQbNh@imO`h-{5Gf$(X*OXI}JU zEb^NJx(;*iiDTp~KrvZySOX-RD;269WEu6Xp|YB6%Itah?iuH1eTLu(Q9<0>=C`SZ zH%OaRjj#NGz3Vy32n(?yXsIs7d*9jh)u^*bkZ)?4DU}q&*_7~8iDDv!zrFwzGN{ss zIlA`_z?Uy5VimW+P=A40iz$$pdHcwK6+HOc^!L} zSsBLkMWR^h3>}nELf&*j%Eux2O*&UFdHx>(KREFC_;XQ;#;%}UdJ~xQ@I2m5!DELV z(a9?Cwl`+cwc5^=A_q*d4lXL=eVxLsIo*b6Z`4>dnJ7}s*iwZl;a85D#z=~*;>v*8 zm?7)iX8f5B>R$axP$5N8onwgN`xyN6QYiw17|;!^kvg&Zd*zNZ>>nxQ=BT;hbD#j4 zZ;4-W)?lO5DTTdNZ)v<5sFmjX9JVFLr)wY-zb)Q-6xM_wA{iP*_WTNZ!*IfE5aPTNC0>9pJCaOhQcE4Caty`rYLv@^^@> z`vL}Rz*}v0A~0bd4s7wgVz`AQby|0U^Wga0zCs#FX#~7Ovo6`j8h*D*-?p`jbAN0G zLS#2W_4#`(8(?$Wx@AZ_=+6QHagn$$#jXQOdR=Ut}x&)#Q}^BnaV z7owjL-yxwT^40+;T^}iStu&OJ9(Ka1T8Q9`oq(P{}9+ znYQPawZOY|s5m-jb6JIRqkPWga(N_eeUMs854u`%t9}uT^i-Z6F;1nur5m@x+dk4>81J`ScfftJf6s;f$5cB<-|mrLIvBT`9?Q-CBg$bKu8?2 zccci`Rh8Lnb=ETZ>qTHy(EEgSA{ADa`mGfh*dKpqrwdyuDcnbdRmoNikqW3aJsfNv z&W}^p6BL_6=Tw&YSw4d;{<@k1`Y$uv`US$5Wof;hhAmPGuiY~|J`(uu$GuTuk^B_G zwOo5CF4?68srA6t^EC61fF{gNGe5=}qzmUH7_IzZ6CXT5HKn{%ah|_91S0Q{!Gv;% z=n-+4_f(wP$@)c41xlP{54|$Kzo*iCi5ofcAC7bRmg^YHCrtq&~lej7W`;wQ= z3N#?j&MKiyFq(2qNgwgl4s^DpKG?Y(h-=|cA0B4j zc5^B_n2(tLyYwv)N*5(Z>yAk~ILmLC^NLenq z3)xoMDA<#SSRNS9O%+7yQM($CW&|o2N>wwt78z z-Z94G`b*qz-uiTbm44Vfa=i|AAD(IYBbB^-jWGnNQUgjR!UFVbHCo{>>pFN)^-but zLv`3%u|=m@=jc=NHB|ef*-bbUb4a&Nhs8Khmpw@Ij^F#@*AhS%j#Yo8CsR(lF#I7h z>-gAUs18#nD|vL6T)fpcegm0L`oQqpc1#G8V5g(xGfgDR8E6pH8p62%fcm)SS zoWzN?yfHtqWNXu+fUm}FWqoeor%Q@5G>uC7yY$7<^_N?#Q@DxyJvUyLvLiSyGN*lGDhiT&*kc*huD$d!g1V=Im=6k2sTu}^iCvAr%wx*<9RoEiH zvUuD;@Up8nU_5U%I&tLS{bdhOb!8gjqsEGo#6A&B#I2LnpGO3TdZ+~2ct1?{pIHeI z=2y{aSyY5>iMUN*=Cf~u-v6Z#l2)ZD)%?HL1`wmcrbejQgxPX&x25-rm!;WPK`p#< zw6H~b+~w=-S{LGuDFn%;oo*F}bJlX)3GCLrUDVJN*gl{k03hFQ_gR9h4m@rIx|_dg z=~%ah(Cju>p|%aR#=Yk`w?maRRnM2@N{FEOVLC@uIStH<@>V>=w*nL$N=SxR^stDI z&Clz{BUhY)ogCWsB1L*B?dz7*|C(^g62om+6T_%q{SR@vv#7T*smy%^oypMf%2B`g zWL>5@!~@-H!FdK>bt)EXFt_EbcVFMTJ* z*l&X5FGS2OVPMONL6!@iDu$~~9!>`0BrH$<9SM&$Iisk8x=pF(Jxd==5db8eVg?P( zhx>>Qu-M+qzwU+g59yUL_kD^h+0lNX8$s(H6jSgrQhoE#YFhYFBmcr?!-gz5>B1S{BLS{ zqY|${K=@+ln=Zb8njk7`AQdt|)x!W{J9h|Q>8Ac6`eLBcyL9yJfJE9F3eYsj0m?-h zc>lu(@)g#209CRy{NZq=F63I%SMnmP@rI#jVk_42NOh-{m;bdKL%%)yq>cuNk4>@- zxWik)h^YJifhm(3VHcx@J|b5E^H<+GL&QT-4tK83fnVC{Qq_0MiRBw z0z;V3_v;%(dQ9Z-B)Eyt&k5F=g|kVzo-I?I3X5Fyd*P7*ePiZhTIF3tD<^YI<2p*{ z9i}~MiX1JyNO|?(zP}fIUmuJmwvL}&Ub&0Ai(e$0_?BLm=XUG&T9_0yhQaeE4E^u0 zQZ0yb!y6E`q+OX4znF>?cG})l8sOA!14VdcIJ*m#pr9VX>NolsO7rj)vl4XM z8H3x2VBej17hp%_KHnaE?i)-r>iqi_roQ|x2H;7rCjc}cD207V~X%_TRge#F?b z{!c9tzjaL%oxe6{w{NYzroNlusTJ07r?swnmdHk#`XSz7OkFchTej_MgVmRAL043X zcxIllJ=+V^8^vp$IfS0$ORzY_ZD(?IFn|sU_qhz*4IZ9UnFSYMvLrG4KsEYUBaqnM ze3X#md~taZ6p3&iiM5!`i;|CIM*yc$oAU%;PuX@Iv42JKWC`w{21vj08h$Qw;~$Cc zi`ON9itbJJ6lFVrAnbC;cWJ&})AD9N$;$=UNB6DLk8-JJ&NV_j<_fcqhj%@IiYZ$2 z@2WI6=NfdPg_i~uljpDLzPBeAw}S1X0Uw-%;H^L*s37vI0HOQ@F(r`vo(nLe?ke_g z0@#g;(zdc4Xab?eJ!6Ygv7n>@FvSa&NkuBJK1Fmzc7CHXfcK!P7br@tr8ziVD|>aD z1W#RjA|JN{`Fi7`yL*@2&C~>=sm7TpjNaMeT?Fk8TLu|IWV`DbaQPWT zy=i*Zz4N^r&>FeQow7qzMH9RIp({mMkhWF9GmzmdpgChB6a0z~lRW`6Q!x*nY@ekk znXk0whq9;6A+}N1Z0Ai$wK<#e3YaZK$gNGI;_?ynF}mE#hx8q12#~>;z#x_U6GVA#^M+Rq7cuf{XF_9AJo8Xt9+bpsvYuyANy-NYvOo)#F_{ z9DklYyiFxAd)eMabAFJan3Z2_b|2(crw^Pc#uv27@;=C)VAHAy#Zz;n;y-DA$wF9H3y z(iO_crC@$5CoWn;!HZO$Xi zSc(}|0ZQFm_(CG@zE3ILjrCjC%$!>I4k#=2av7-@qT+(Ev)`}T#fm6prrN6>b_{VG zJ0z24$^pNbd7#JW1R&rBhWM_VhUf_06z6Bh>&>j4vK1Wk#x~(T^|Ydfd$vq08zk?g!@SwVe_W zWqo9{;D8C*60p|W-^o;L)FO#jz#InQ13G4ku){;iJvp#VeKp9x@D2xkmMk!Op$Qic zO;_-v#0wN(cgl~Oux9Av^`qO%jVob&k^L5utWV+p*9XrU*_ur%vdL+9*c9t@M~D7o zpT`-=EKRF-5PymsvqhE>)k_~&9yEw#V{2JWbyz1kAVo?gmgSI>P=|;BKzetm>tQ)O z8NY`dPjj%_h_AAj>D5Lix(ilc6lRPYb`Dsq> zW&MAPKF1Wzb(cS1bO+7(HC^YkzNW{9(GSV;+(ZFLfoMwL$-geGCO)xAX~AdGfez7T zO(;jWB(&2gC{+Oi(6XMPmORmrd;RoleNxzS@o77;+UQw!#Wa6rl`Jo!9N;=%IHIsWyCF(U%V0v%ig^<4NI#9Almlwh(489d_(N!tc?Yus80UYIB=q003XQfgcyUN{9TAR)l&`cuH* zZqu%N6rS>L&JrltUguKP$eEY;3xD}cJy1yEY@ANIc5>5(p zWNr<2d>AXPzQgddr|(NxE}(8PWqX!`?8_)`)OTCCxjfEFrv))#!E^2<$evaQlpP9x&W4WJ^Sv600tLlVes}A&DxZy8n&3P*Dww~2z=iV0f1ec?( zf`d*J*osyQ*mE{l6>8&g8@GWZ{i`MMw#}GjENc z)dLF$Ij?P)Oc`G$fUc(rj>QDZrXIzLn1>KWN00q?n9+smcA%A9Btw^cyN~G(Q&ouj zEC`v-eY-QCkwZyZ)XVaPkj0J!wksi~wT;&qO#vF;{>Q~0&`c0MQHueJc{_mE-K zL4^Yf*Cx%e{ib_2dnWCKhjXm;Yb=k_Q1}F_^MA`h)5MzpvPo=~GH4>oq z?)uNpeC7>ug#2HKyB zq44u>H5m&IQh$Ij?yylIaWCu9b&~HT``)`-B-$724FH_@3>TbEON$`x1%2THeZOAe zg_0)`L=&jN!m}$~*;>^3G(E&bJMI|Te(~G+3NPol9W^qQso}D)f*R$P%Lsb+c0gl>_Xe}D@*trD47juf)TmalG{Y4A$+C~ zcrRzFxI!4>03e1n2sEdw{c`KnDHf76b1?A26l$qJGap9Ec0!9(kVCqG{8VcwXac_8MwHl3|9{}veren z0DS8oHe;Kj*fBHF!Rjq%4(?!Z?cvCjZN9(wdFCLwcpUu_9!5oXi|fK3lI^_I+hOvk z$Uc=RhVu*DGD1q1$W8vq?4w$vyIO(t$8R3_M^#dbN^Uflj2Cf`s^Vu$${aU+THm0-k0524FDcD<*mZmHbfm%Ukr&|Ss%B>q@>*gJr7NcOtXiF zIFvYHq9!m`)C{+rohItZ%mOmYw4~@YJU`S|`$*4?(3|j0C^R2`$j<|8z<;RQqh65D zxN_fuO#v!l*pE!X8Avq}GzXun;rK2IXkd%RAKB2oMhV9LyhN!Ui zDbyZEp$31&h8Ac#R3oGOI>}ADM5km4*kpx#+CO4u%+3%i?go zIQ2TD?f$Q8&d0s^RaP92f{K;CRENQraad`{u>T!u9o}Tq@7Gt<&QFR6x4d%yenS7> zGov3>YV76^xT1E*Iawj+Fb~aMpRY!D_NBQ9QG)vI>t*vcNK;u-S#gNwJGgCt)TF!$dL{W_lF-Le&I^;qKg40>1{ zE|3jXN7@SvoVuCrc>hH}K@UnNTjm*3M)&pSbB)p`Z(QlHjdYg^MTbojD{-N5M-ZA(W>xh(G(0a_i#&jXrbYL((6$<18CUZW^kD;=@l2XBnwrCq8dZ=M z)%Sye8(+tL66_|AIkjMCQDPkr=Z zpZFjGpeDt1R?t>$;|^%?h&3x~am!JqJIw=C2`%41(Bp>nd~k~M6yu{kpTZ|wG9TtR(;jm2Jtekm-hAv5n0M;2jnXHp)xA?eh`^fRx=) z(R4ATt&#zN&?pP!y9K&gFPpn$KeF5oxbOuzL>$-#3r{HbYI1d1%K!K;eyng< zQcO_!)-2$hG-aiG&}7GlbLZm^DyfEk3?qTWJt%-2+2G?Qwr6uOEYxuarlO3(uX3+>%3IWanWF4C^@tK0&(H|GifoevBNCVHkriw;)^Xo< z1Fe+IMo4Ov|MN=OK+wr}V;3GI?2Jadyubsp*$?LbMKc#CesumiH_EXUQ7lq_U~(4s zw5V#H3HX`eroR3Ir^d*)_zz6!y@&kp$WVWL!1-{-Px%}mih=RsQ3GBY%6ljUWXQl~ z6-Ff>bx`X-)wXkdBr}=7yX6Z4e6^tHi0Q1x(68)HTtu$Ro2vdm353DExg{GK>w6(x zrj?lzm947*?U)}4ZOCOp%hr!Ok`p!pICd269f|5yk!veQjUFRqJZ6zExG5eBfko5s z7x4WkIA#*ERK(#5?~=CMXHj^9?ZTSS76ZAFIpV!1TaiGCq?^4c&j)S-At2CNV=5a6 zDd(%UxikU}9fWy*?qt;f5CmlPdmHSSkggn-A6e9ffM!0kB)L!i(^;h>HhE{SjRVH6fxOcOJvmokjN_xI;VvG!#7@^m8Kz=Pf=Z% zT;B66DLd(20(}ucil5=^9>`&t`x1)uXq{#v>xC!!ZS`aJ6h+Jp`hgD38f@vlC{hey z`U*;ixOJVVq)6=p{BNBuW-lBH@Bo&b^accu56DPF7(d80myC{06NRB2lv#jjJgI<7 zrk4^&Q_5;ss=0B<4O^jzycazC!Te^(X_o>?G8<>bd*fh;*hbu{Y~9Th))M_P)3`Ue zwqyn!sN&vh&iY<@h^W~xRG3fZ)4ZDUNCTd;48fW*6>DX{d)Q?o7u(7W$*m|qAtnQ` z1+f|Nu{D#s-SMN>V{jd__!fQB(t_9@{*MbkUWMh9u(e2quCReG&_9g{2f#+2+o-bS z_}xH2(4VKz{t9em22-pf!kevG-4}C3J4G{=-^$Wf; znwk7G;6w;6Omi@3Vtwsu{_p!%AqoOYQt>CY_J^d`#A&K>%VQL9M$1-%!%^S zr(LaSZfjaJ=OgXf%UkCNd26>a(1x43{Wm1OPVkU{qSe*KQHkel z3X0Xq%$Za=iunp#QyhQNuNW-(b(+SpMj`N`=S)DF+NCbISHsSJ7x)gkUcBq0@vw8O-4&p ze-}+`T_v93<7vLz9A|(2%Ez5IYB{Cgr#nRAH`|!nLX)DR{@eurB@TZA$zmH6stt9o zE-FI$B0@iuwfAu6Z?7C_dlacf%_jR6>6cSru@=R`miAk6c?Q{i^6uq8U}*n*d-38( zg_cJ+PP@q#dcS!$-<0lTaCC@-ZV3(R7!Vg`YkXRHyJFq}~0p4<(`(WEy zV=K_-PODGD(?X1__t;dDLDYTwfHvB!#CEBE_X+ZIWp$V*B0ekilH!X*I*fp^w^(#W zk0e(NoPyoo=c}7S!;c$Vn|=F7sM{AKFoz#(dy{H~{y=mygk&f!#2n_|-9@0D29NB% zn1*W?=EP~J?Ubz!$9ho3XH+2^fsNmctZVdO2D3)Uj#OY zC+Ta8eONc^LilZnbF%KxMp*D=#5FiMPK7YNngBDdA8?HWIJ&z&5!%VE0GEs;W3;}} zf_Y$;llvM(vSRx(V};iRjhpnDVTnMUduP8Yo8b92c~V7^22~Q{+`o#0z^7V}Al?AC zX5~7HQ%ccxJdhs!dSv+=!?NVT>?N6LtR(P+1~1^FxrBo${%`vk!FO;5Qv;+@X~&rG zyeE8d^F?np9L`*|(ZIda3h#7ddr<$B5`iEeHOZAohDNkNr1=a`^k;eT!h4W5ob-pR zA}5Y%TB-5eVlvzqAS8!m$6`~4_zwQLXNyw|q{#TQKH6f&Dhhp z39~Iun{407Vw26RplzIHc-rd^NUXycl(^+ibvmQ`k$8~us5v6aG-ix?xcRSTtN+w= z{{;ivn`O(fz8c2hR^gvq(c$Lz2hAf)C=)BK^D=9m8j5ii!u|}lQndnv^Fe5W7XegQ zoX*>W8t*HIy5AlThG5gja%uNrn__Qm%^yD8)#5BW)NX4B{n{#J+%;vo9o8FFe$@fi zMsNRopap=>#mpP$HXU=eG989ZB^B?k+Zj|d5pgC>RooP--E=HVW}666;XFQ<$?5JA z^YdOneArRA7YG06((v{-N8poQywKX{9Df%Tmj^s}Zi3~aFj8)w4yX@NORmZ%ur=3p zA#-*Ua0mss{sm;H{1teX?QqrcCBZa@uC2? z%!PVamU=!(821>p`9w@qN6c^11dEQh0`_PD#XU!Rt|dwND3)=B+U(8Cf#skATC~Hc zNm5fT5;8%z`{_O#~ zN~3A2?0`$&TDqqo54U*uS_$sk*A!j8Nw$#1@$12jY^{AWvldCZz$D;6!(;3ZxbhFG z)}YV8hOG1Vfm)tv)Twoa)?PEX5XUCH)>mj?C74eo)3%c6{6I_A zDml@fw1h#&dvyrZp@g$#UyjfFR;%a<_*>n`a!jW|ZSK?reC2|zM6ms2gJ3on9USgTkBta6~aqpBC@8CA$ot`U9iTTN>@EMt}~k?1|839DTBotf^r9!Agg(lQIeYkny)fScLs zgnN=f-+JAR`u#fd1R5X49Wq6%#Q&Xvwh-?o46)ytqp#(Ow0_!!D$mcF13&)3B@X+# z^Dg8M?;FU(M@}SV^mk4fn2>43EGwWKHdpMmYG8$Tru=NK3pOPzjg~2xjzLP5M$guP zpH>}wNPYFAEWHI_l46x`f#dv99;+Ml#m4h|PCc+zC_NeVwg+d#eilP3fxK6N3kY?F&+>n& zD{t95HJiAJlbVS$j{Dm6b+jC2K?VfXjBu46?&`z^nrgu!s-NU+_zkx-!6g6ziaU3( zdC9` z9}w$r^Fs3hb}-b5=^owk;4QBFqy9d}XrP_R;U!r~FxG1n0?Qpgtk@_K z)($8So;6~c-FeP~t-rg<0$gWj(j^PyBT_L>CbwI2Nz4kqy<#8zUZ7q~LAmH=6*pH= zxw`jiXQb)!9ASY+oei?_oG^!bwnat|cJYzsJTj6;HP<}U939L$xWtsuM?fF`Ib~z* zV%L2Lz`1)_W!>}4az^>W?iXM1a#0fxEf+l#&9+A4x2RGvkXU?~6(v378-iSH6qTA^MlWX|WscOQfICta^6&JA^y0%*1g0$Gz>i;fAXfu( zT3)o`pi`Y@*62mPd#o6(9R9FgLNqV@miPQoFrsKuA}1n-bYuwK|2lw269$L z(Jb1#9S=`My@E2jg9mI-NJ0j)cO#K|CMW!2WjoyCOT-SaXtc<2yJE}v3z$xS4nTFI z)IWmIg)o`ZG3<7RXH|1$B;$jP62u!Zu zb0mO@sua^L6V*x)8GnT4I^-|{?+dXq+OvH#Q}tNe^QG8^?XV@LgbJZ8r6HDWTkzwP ziG~Y;-*s^_9fbOwEcFTd;1rIv6fseCwZPt#GU7*LZtx$PBu~}?PZU=X5fo0quGFS@ z(uceO+iFRIK0AaC&B0q^mi%{vAe09-<-)vDa*;C}S32120z57RK=KpDU8c>L4rK?L1%DSW%Z`U%bB313>u$mxGLsp_R)-1D_j2JkR3%+-(p5%8gFi_T0P9yOD@ix8csEEo}>^Yg)v&F<~;C{qH-FApQ3)nU5 zE_*co(4YpEi6g$!RBxt^MZgZaJ&ara$DP z2LuC*Fu6i~N?g)%!(W-ucM(BN74~tc^UMJ*7ha&Dg&b%3L{WS%%?71!#Kk#aSXJhp zEcN3+pJTdGGZUxs0_2t&j#>26_1q7JBHd4O%g4iJNo%5eB_?l=&AfWli^iPK{WuaS zTjANQ0yd~_@0ERFm|@@R41|bP?!3trG5WcCNZG(SD0S^BK9WK+Z5@hWY`@+SaH9y}=W%R|F zwtb7A+I1Rs`Ax#;s4I!JrD4j%q;S5!XCF&`mx?w|Ol)?uH6G+dl+6FWv8DY@_Ica^ z)4e)P+Ckxs1o6p{s?eL?HM)$H6_pq?09`DDOWa=)-X(DXr6zZZSz#)AP-(f#0p0=q zp7YzNm$AIR8o8Mby`&n7gwUB9qoeY>$#-3%z(%8BcVO2LmgG{+OUf-)r37800YIx1 zPg^Q3MZ&IDn!7TK=Kf<_M%%hSC>B_uCHu)e-0JYZnLSB!Pv&WJuX@<||GTVYyQq=f zelFx3XYh0NtlXnA;liC1S~%NceQ!u-r<=X8bCudHD$JjbZTO4$ePQu*yyo}WOY=qR z?`Qi8g#zNV{(21{)y^Q%dYrYc&TKQ9HY1nq+3?EofO{XlsST6z|NM?vR;(cwS%6v} zB;pMq+h-{8fgkxjiYI8Nkh!aiKQ*U0r1~~F#2oySeuJ$ptjz47@eF_Q9IAMG*yhuA z(79x1pIi4Xn6u=faC&e~PtkY!tsEv=r#9YNi$%7A;-?)vawepLoZ{x&w5q!k*{s)Z zEcY-9cM1icq)ZvaBjaxihGq{u`4Ii%ff=lh6pC+YQCjlRGF-2@YR&2L}&dPrd zau%rbk|DV0rP)aGBNqfSWTWdHQik)90nYfAU<(CJqW^;5>bS~Gm)R>JA+f-ip!F)+ zD5J%9`l-Jhb40A+wni?~xss8vqAo>`zI+~6 zwh1d*5{crb%E8oc$Y-k(M%PkK7^o+Mr(Sw41x_$EU+|k7_H@geVSQzcTdfv?Z6uj} zH_tK=oKj-bkh+*mxeN8U{r51v*C`EaDIe5*e6k3OM8OmSBV@D#(TB$7mH>ZskD4Dw zPRh_)6?W7<4rtajmwTE`dEA#;mn-JeVGsUTII%2f`^ft&4P)Yp##4#tK0SC1`4L6U;xL5A>*v9c1C*|Q z7Eeh}ZdMofU2Wl;7cS+P4|1nekEukAK9R=xXVuzsL$f={BTw9Krw4aGHLzs6Wd8Md z=e$V^ly}%z8apf6d$Zkhs&8KLR~@=zc@5~!W#eJa}OUboYm~m1b zeN>b05!QWKn222Ec2ND6Rf#`A*Ai2)M$Bv6l`4~Vo?2o>`+}A&OM?+nE%17$uK`O0 z_6|)A41u+9yur{b{Io+G4h0;kJCp5HT*p)Q1=@3z8NZ%NSe9JpA;)U z24K?6vF-3Y&Vzbe@lw)JKH_H)l+_6lfhhvwN;Oi7)|5=u%Kf0_Cd~o6Y>t^Eq14a< z8v_mwD_IlS2gV9B|7tx6FoPr2&H&SDo^*BL70wR1?K6=Sz`yGqup?L@dT_`J^c)?~XegBjyk0ycrOPJNGnqVTJw%V;jzi zVY<%<$)Z`4+AHxz!_Wl;{hMJmI`yJ=i?ZIHjwkYgk2i@iobE3rB@SyAz2FJ5Lu`Kc z4na_Ij@L~4Jww)-ZXhK=3^Os~0u@D7It3yc9XSt@RPSdAeC_<+7qTtd z5361wvss9Fa-mH@nEID~qvvcOb0)s#)+Q2hO&)C-m8J_Vzr7W7p%X!3WJ5U) z^vgacXJRSEX8qNT`Ooyf#^?_~pqF3Ec0PR|(^vBTemx`KUBk&(Z`bE|L(UaS2B9)M zv+8*5IE_r#+^1@T$B?F?1VyO=ae@qw%Bh*qXo|yy2W#cuAMQ&zmja+Xa{pNu&R+p1 z;lfs5?8uH81wVz9LD`)Ucg^8M0&9`lFy}Tii)zl@OmbL1&u_(TK(nseH}cC&*x)C>==5L6W;ILUu>jADZqA4# zg(A?zx6l?xEwtYYgu}Pz+et_a;qBjI31_dX%z$6jp?l2vHM>$u&uRk6dQEh|SC_?` zBET{Mf6fVOP&-yX!u@~07g1%I$HTaYyOk78?_P#UGP)Mdf}TW2{rrojgyH3 zs+oO$m0F-)(Qgy-ouxYbjmz^!mGNnh{J4?VJq2|S}#ncUI=N7mlK9s=vsA?dxd5_ zG5ftPfzE!{lgRIchNx zRg7PN-C(4*)XFNnu<1Bo>0sZp=FuJD@jF%xb0j4gGU|Q^hTe}6)AVmoVw}Yys2z^X zqKG_<$?0lBJRgn$)fsw)~CjqtvL8& zPUj^3@q^vS3&rEblUUW4V4fU~5_}ta)<5^rnjlw2(ay3yP(Y&W-3Mty3g)hO_xGEG z62UA+L+$x6RIzwp{)Z*8@Acgv5(oJqAT{Gr8j=}FY-3P&@BAu>E<+XiN<6HEGW0U1 zlsr7QD$IK@VVi|?)q_193(7vKze?X9JB$;ZA);{Y5qtYsBuKWG*A%jps#AkQ<7^d3cQM}x2dhmJA}xIE0Quo<#D0z^#o_v6c4Q^I|QbOM;TLHyA;ax)bJ{@ z^RC!E@)Ou%9X}OnPN#ofFsWb@nqyEn>~{A>13)+k>ADU^b?I6WQP1y`I50>5b%)8H z1(Zp7D`fWiW?L)<<0fsoVNecm5T-0lPkzTTTtwY=CI!m{0m4z;)fGS{Q92UtKIpk8Z}o_?^O8DxexVzEzJoPS2^5GO_XAb2fiS_0@gt_t zth;dOKa#42r`xe*INzNM^OhXhL$4&gv4l&m-5+_$^%3b=b#Y1B8LfPHpdaAv{U^7X z=4IkzmgL=E-jM0EXBSOjrA2EVpdZuRusnC``qvCP!;*Aulrck!EK)=jO}V()MS$03v0>*N=CG#vT7+-)=Tb#oW52~-$M*oSQH|FT7W zsEili@TBlf(~gRa2?ifmAnVWB*}tuS3o?(xV2tiH|2Fzq4X&8pa=s9 z-PZC{PgFCzP*+L?7E=!d^Y+DoH7w@@O;h+7wFA_Lgxk2zEC#Dfc6uIhzti_|-uRtJ zWIO-=4bOwWC$1k9?SAJ{{ikd0!EpfIhhOyqOC97iX!gCtnYenjz*Za#>s}|qd`|V- zyhRz#erNBSt{&;+>%4mb*TM_Q)eW=BU!`0}p`flB`F+uBtNTv~xX~9Y4&LyD3kF-W z21?-`IA3e%Ib=?fFxACdH~^x+huZ%h)Cu$8mPO?J_9n76*wP%D+N<_b)>i6w-%yey zjnmXP=Nc`oAwi5lnJZ{KW1dP!oL?xBg8Me~m`Jm!)5_$5BJDo5QM zIh@@JGgUSz5h=)x63H;A*)*Dr5b*Lom5jS~Q(kn@{J;+K(ex2ag2)kKUugCEqZYi7y#2wZ{ZCG6&rkDoy`A~h0O8r9T0g_T4ePyYA)|O2Bb0^ zP)`$ITi6BQHh<8@S&79j2~O^Cko43V(H7kxSK>Q6K{nk>0fdrb&b*$c z6C4KJOA~#jPJv8!>kDT_#xpv2(ZT>UOn!$J zk2Vo@zeR_3{E&Nc&3Y~GfTQcrjP3gllm6{YZ>#jY4v=jpbR*qu;PDymn7?UzlO#_) z$5;yjZ0oTMeOcQ2S9nVVi@d-5XgE)Ys)w%97c-yL4sp6m3P$p_B_hdSiB7@kA~=z} zaB6uJp^x$AhX75#YB-$cEIo>%|6TH96V%jfdM@*~+;g1OW6e}Q*b`Y`q`80P;!1VO zk(P#mj-e#(o$z)LCz~ADinFa!BG|w6MSlD41!6Lwd%niIteas^C_J86&iCM;0{TqC zb>S0hQ}kG%?R5}?5IRXQ2zgUy0uTP*etK2c0(M76v{6Q3%oO2Ii;0fS8<#F!J@?fy z1zGMAAGBEB6lgoX*jjLKE8SGl4;M(iFtwsKiXW;$CPV4}g#nm>4tpzLtAlxM=!0#8V7E1iHHdDbT6(fi$N%5ur3-ySSxC8NLrsT0pwO!hT+NP5*%*b5CV-4lg`=2u#vz_ zI`dgfEf@3y`nAI3E#PPbO>e;|usoH%)Aq`i`4=r>m?^%QfcVWiAC}|_J9+Er;O)bQ z>!az;viSss4ShxXj4Hf@-;}#7khVOB>qXszU23Z5X`vOiX0!b+#>sD}i zBk`(%OW;#aJGJ(pb>q5X%KUY+-5+cTl(LApIjHWyuA_?_`>xsaVMR0;A*%O@?qTQ|CD^kr$;F&vWcd6(VQi34>i$aNj6PQ8`eLnL zBZQz#dwhS%P54;C1mM`rz6t>DBCU<~{whwx0D*f~(qH2?4M%7uxIdoO`$lwE#q|I= znIs<0HAV6*qBv~dg8vx&66JK;K8hlmK5pErDram{{GD*8HtYp&Yhazy9fEI_wJ{t2|xxIUV1#Z6QpsAm3;h zrV9IrLE=>;qBvOSRSzH86~uDVL6+9P55p)F4Q2)DVb@v(F5%0s*kMQ;gGvzm8H<`F zvKM$2za9oL08_`e3MT2ZjrA?6qUFpIA$x*t6v&v@hiImwL1yDIo47XgMBXw`bzpji z8OZg=7hy;G&Q7wVwgz3!_9RXhS)9xCyRTyv`$rJ;Z*Uc3evFZcf5(M}bY zQUH)g5I(5C0tk5-j}{qhaB^>GJX%UT>qbWWu|BO}c~H&;t3(CDj*1U6pj z-qvpU$%}r<)6W?HB0D^2ZA8Ai+B0FKp`;yaAd>9jIlw%vSoi;bokV?+`frw`Osg@m ztLY1RXb8&*PDuzF4@`Gu^U>>96@v;&Wv8^j4O*OkZ zD0?RgqXb-p%24>&;J7f+ZmOL7y42+6%@&czR^o^(&RfMFz}b4VlL>`3Zf|ev9o4xa zPpzKhc<;$$Gb-0Ubt3CAECwIUCVt~0*N!KAOmju9LqOdko8uKEzNc$5SXU!<8$ztY z%dlwgs~N1N8YHYp{|h~2HfoNyQ)cP(*(D$bnPNgM$?b)L5hQ=o83qMzo+0q^TV>WC zO))qXF78Z-E2d>X5-adp$W@gE)yx}WE9C(gGx~of!ia$$lEavZ1{`ilI1PDSlmjA3 zxpg;3STpi80>#DbX>3ZaC9beV3VSkcKUQfQ!j^E}#+Zj7~I&}vZ z8?NQfxCGYdwt1hy@m_z`q=d8oRIYIAMy$sXD`06~;FICj#_ODtMP7|q=TZctzfTRo z?ghrN;n@0=&~1A8KIn8Vc&rrnGvuRxFW6{gK!>%RD{Bc-G}yC1o|HD2KTJKHmh=xp{qsa? zfX8;WF?_IOd4#Qy!{n>{ecGY*mQ<+7U{mpZuNCUO4#rWJfcD1|w3fwvGRC!fJ0}?j zyy2x&HU`S?@j}$T<76xP+qGNG8Xisa6DZ!|8YESud*nNPgj~I!>KD`H4i(;=;+hZd zN#hFndm_tc`?1;kIZnlIlo1q3g!V?^bow z6Dgjvvpyh{SPH;KivN3FP~z*Ak0DCv{tneE0b_8UCZQ|LnsufwWr?907C#dk$rE~Q zK^bK&N^44Ka1j%~w1kfU@Bsjno}wnObk1 zx?coM@#^y5y8`ByEmeL-C7L$M;`cLQWx5d2MyBeMvq13Rm>aOq0NXh!|EvkU?*vQ3 zV3WFb)|YD+#4X*H+_M(($zl~!WKz7=4Nj}0KqypeI$t2N zlH48iAtoL5!oC91{&bYxr=Gr~qt#U6ng{=i@e^$Zu3TC%5Qrh{ zk&ybbfC4Vdc=O?wjljZrV97yRfB|%KT}<4~T;SE3jAomGTXv_Hn6tl=t}An% zd=8ZeC!0gB%U@U%1LP`a%xcLG7#fI^tn<8Da$8^v@bK&6JWnqE4?`mubBA36nn+&9 zyqXE88fvp}mJtc~2B9SG68iTQ?FeYvaL7S5A*i+#`x!A}1JjRmDBkBsBpK1J!?&nw&%Z8W6ib9z_ZRGT* zW08Nv(XsKk4cjdqq+(E0-rD?^;fhFoO$%PU=T&$cjrN^pC#R!ot_E*1F>?tvk-tYA zLb1fj8zj=paFRQ=V5t(v{t@-qoMnO!-Owr*52N*}aPsKk#gV@1oMk;wOg=#ur&#Nc zsFOsd5~B1`E{LK?N@34oZuXzd2npMc?=0LPV(L(u3Tk`WA3Jpja|%vE2cN_dBrXgr z`Bx~$1G@NH!k?{5F!}lvUwjwuZ7F(r?bmR)vW9gjF&46Kf|5$x-xL)L zp$jYZk@9N{BuYuWW8FfW!G~CM>U7I7JTNDCtoTLCrE`PUtm?Vke=OE6fD$QlllA!NSlN}hUkDBZ#=*<_64`4 zm4~BU{>@Gx%jf(q$zu(NHRdtWGdyn;G|$Z_-54epP@O;1VwjSen4aX?8PW+Me=cL7 z8MxZAl_p*8Vbk{e(yB^4814zHK8Lw%L$L{Hr9mr;^K!gzExYJKyeHk?^>m12tGUW7 znNo#}mqSCE1auxsJS!l9nd^)DbtSJxF^a7CU@K>QP4%=uX%n|}+R_gI$Cs$o_46Wi z5&VL4xE1~Eh9GcyY_P&4sboc|e+Ja8^UvZfmUlKJV*vmqo)*)L4o-h3tQzq_X%{aM z*Od3Dg?t^;&$FH`?~~s>ypRDlfEcc$D;@qPBSVbh;Ve;B_>l#vxZ&CgwNf0FR`mWVGw!!1pnAnn8is$)H?4IU779Q! z7gH_Tfe&(3_oVB7f^b+G&9Klgm)=;B`K$+b^ZBEP&O5aW7blQGV)|{kY?_S(o!{vM zvc-_;U*%8dY>ksIW|J&7H>vAvX8P^(CVk+B&~Wdge@Q^lItTauP|GTKBy!oqjHSMN zmzVG*?E`r8?j6_^I~Nkz-X|jg3U!Q{3H+t&70;`k81o$0^nEJo4d)CNI!jUAc`$|U z_&oE~=dEt_(IVltKhSM_Mv=h=V`g&g6t`u-lt581R?#t${L!yz9*v2*#Klt8YQX91TA;ON&%oNs`G*C(3c73z zP^M|EM!Hd+#Z+O}d@t6t7+^3``Gr8#wU|wNpd0jeumZjfg11iYg#syR^{%$`g|mkQ zBQu)Cf%tA78=hAk(uxUqIDKE`RTZnD-Iex~$ulRrYH&yzq)qd#kW%Y)Q8r%t2;VX& z;CsL2ce5)*H6;rh~=M$RD4WA15^BkrSvC@c!~im zi=VtM^Atp(nyBVT&JKaj;-4h%{DWQ9EyqAX(TVHjPS4_+lt$P`fgFg3kDzuP5+X|^ zrDP7wL>*cbQi)!XzvZAMJp&wGq^(sRd2M|N&5qlyJ9VCifDuZ2IAiL0hlPQ{SD^6^ zWzJ&M=>fScuy>Nv&2`##K16GKlDU^}K+Za#Wkp*w6V?MbrkQ`5Ys!&3{ku}gw{D0)qg0v@bVm#=7 z_CV$h;cjdB=C#)+wmcbk=&Imo3K%q1CoZtJ8(vPPl*ASOEJr6a0@U) zCG6Hazn^F{xN0f|FjW2vcwNP2C1?R#P&m6u$kT61Q!f00Xe9nHn}KbQkQFZGppR-` zL=nF{lnb4j7Y-frQZ13v%uO3JE46Io5QOPHalM!5-C(wa4^(^8PIwexg_p)VM*e`6 zRs>Q?a$%H>J7vA}3<}(== zHeEC*&s6EpQby7}y3A{5-HCaWR38)dp2)ARX>&^OMkGL2eC>5lEp=VHnS=GcONanM1DY2wP;}wKe$zvWHwtR;ouX(X#db{s;{Hfx zFHrw9&bJAM+ZElt37-mgu^zKy+R`FS_$|+M8qsi>)k8#d4jjV@IGcFLi2mhbba@lE z6!+wguD&&vVytG!T+X-XSvN)o!=DtvThVV}{WqwQl7B@`1Pt#$10HIoSo5@q znl)fTRoFqdi&aYg#Z<}MOGaeV&q(G4ChRHdE+F`Em1bOARCcD0wB>O$ z3av$OFacP_gf;wb(mu3&X#ql8?P%jhbyFivc6ISi03_+Ld`Kl*1`XDa9DuXONAM;N zcS_>A@RrH?6{9+&&Wm4ZZ$!~uqHk(96%iCP3~+99c571wAuvw&d<&L#L4btV1Bxd* zwOg085sUY_AXF~!kKQ#Wv!(EmSDE$FQ0vPN%VHSV9<_R|rwnQE*9|k*Ue$CSL3ca5 zq^re(=g3{02w$Oei~x;E#muzxt`w+U71_I13jKtYCcc`79i zMfnJ`-o038uBm@21{%4f!7$<7obV}TLq@mXfMUe)$Ei4fXhOJHY?YrDq7L|@SAEF=A zlGnlwoD%>;(Fo3g$Otvy`&y&`B@30LC?6JYd39Hv5%P0QP;461gNlR?-ynKg>}JN$ z5TM*q!;2uw*bC+$Eih_f1Ji7ts+mR72$ygsE=Q?>9A;I?wzqeFaDHA=D0aJ1oJ_hTtw^fAQeL)VybGE~7@=8;;59q6T& zg3HC^tu(MlUzA)Ypi?d@--0fW7`?LmuK-X%o)ym$KZd&`fTT>9ewLa;@?Zrzj&#@bLR^vEAeT%?dS;zV+?`Bo zc|OCsfC0z1ZR&2s=Y~m*+3^1BLMzVw)7i3&=Gcqj>6YrRgp&2K%JXSvhe0U`@N4LNZnxQ>43;dp&%oGRe2tNQOcBR{7>OHR7gDd#|l3vrFJ z8PL{(t9~*(5Upn`J85k{UErs9?K48H>l7UbSR_w7WVybM45~DmRc?*oHKDnZoDp%n ze>+L{f+CgmG`QC3`{$1k<7H!Q)3-Q_S3%rD7`SRa#aYvLzNth^W#hjEWF9zJ)h8m) zp0F$ORky>r5=fnF@kHUTMdoFN;Om5t%BwvD>w-7APk}CvAV3p!N3SKZmoi$DcMpRg znACNel=O5osXgG9ey^&)S5-Vnsgt9+W_EV=*6)Gv`mDD|C~W21gs*4u)^}Wzy)zt8 zM0wsSgaNYl?&R;Yc5DnLM#D}BUy)lyvX$hQdLB7iP3?zjt&y$hZxwsbc5-09R21+h zxZpN>`&YVJq)bRRdNXFXFXzM#WZa&VgMOqmQ2W!?2pEJ)akg-ba7am`Gbi(P03Izo z{`%phlbgpXk~bp>CR|G5B!SwTQ#5+5%m`Oho|A=J@n{1~P!ub@Tz6 z!0HE4mjp=s`y7js+}sKu<)q<;{cEJjAVZ8V4U2^|mekaa{K4D@@9XbtxXJHMb{h_v zh7KnnH;WdY;s&hjG76mM%V@S%h!P#w9QUu*7@62oN!#;^`hYjJ*YCRqfCQd5P6FpT z3Zpya!(G41KLuZ@Sd zUQ+DoJ$PMwYl(&I{vS@s;w1sl5e2Tfm^bppLBQKjBvod z#KOvT@xPQZl62pMO;65!AM%5vC$faAZcG&4ZUlQDp~l&89r~ga)HYYlq-6?I;LX*C z-ANLj-weA3I+d!s$My_!&8St{xM}qj>7+aC*7!J@v?(OStlL*z96~`sjHw(~0e73l zaOspF+343&6)K-iPzn~T9a+^*^<%Q*3|Z~q?dm7r9XyY+Q&_J;(mSfQms4W(KEIsA z^zje((nQ3pn)Xonpam< zuX1pbM6NPO2!a;KdDBK_UTq7U9vf^dA}s$c%2LU2-n!ew+(t@zBxDMqtOz8!yk8X` z!sOUS|Ej)-E|_8ak^VEzQCp@^1HTa4<|>3BM=>CjBH%Wd7bv%4io|t$0nn z=I;?fH@@pcO50&VR3e}ut}(HN2WJX8arRtD;N>~dZ;Y=%FtSckT6ADsU3fg|U+Y6( zjGOsKN5?UFN`wgC!B1s-B$(q*`7$698GIN_Pne``thy0xrVxyYYtl;Q^_g`x9umWH zMQUPDbNw9r3kkz-TMG`uZ*hM0`qLW10uDUnKn&9d@70YIZz2-C^3#S8{FsG=T|!;i zgXWYK6KoHBu(z?T=Dlz7)&-)-R=3^dB&VoC0@>Kj@ifgO3TaRmx(vk!28UYXxiyWp zKp!bfPKVAC+Q-20dWOb|QoV1$t}*1xC@_7=wq#OfQVCs{I|Yb(rue18Vl&drVxDTJ zkKbta#^J<&gJnmNBl&r}>xz9ACc2b^!Z(IV(9YzCuTbhzl_dk6SU|sOS_B(0hbLOq zJT}cQ9fjke*$IJ#r-fyZN}&|tqmt1~b#EY?uUIYg*3}E!B6jpO^(6)ZpieoZyWyX# z%)lIQ>j0Hjg4v1H@4zQo8#>7)BmjUEIi<->kVdhsIxngQWA`Yy_n`~3E`Nch@x435iG4*g0tVMQME>C{f~zAFRMxUMGVHTJvl>{`$#E+)F?S8%OftgldZ zWiBh-_sPrzDB@~@Ab&swP3lKR?mO_y9W(gX+-bEDI?hyF zBr2b3liVRJRZ7g@_--zqY|+m{gLmYq_@tY}&tp2AQ%6m|f|E5EJqghFqG14$MRnqa zNm{J3XoZJC)^z#ZAgZm@E7C{HZO4OZ=b}gqbw8=~qt+$7af5s&ZQf4Pu+pxOt+h$z z8BX6Kl6$93S4c^FL~392lwuCk73jUW=GEM|6qwI0eVAXPubFftosxNWPQ+m*nZqq` zKno;~U0h1*#PYTuk6NW8B3S4csNks-UD3S&t41}!H2_9HxxbuzuqJi$Jo#u(L+1{< z4w62j+RFl!DS0vHeK>Q2dN4iM)H?Wsc5UvF;B=t=KYFV=u7_*)XX2r+l;4^;03Q)_ z)eqagwW4Iup%;J&G_I2(+TRn47@Kx~Dobk}7346*qJL^heF2@;7}qp7 zLWFPvC>rbfq27qENIJ^5n^vsf2CN3$m?B_g$N=h zAn1iNvJuKfX{B}k-86R{^%d`~!Q)dy%Hk5Ee()T@UQEEanF@`Ie_$P>NpaG)!GI0l;|x zOwbv}>ziiG)|43DEgFU%?9{oDfpd+}q~(JVi`kBR)e}h^ZE#T}|5ag*d|6%pvuOklZz;OH_3T%+wKhkd}+oZZ`9E$mg3n++e%xzoZY&})NG$6Bt&#&8`y@$xe_1WaJ{6dc8zGk9Obzq$08Ys?s09jYe@W z3*uJaShU7~x>}i_bRTl-0^1lab%|hwRZNcX6m0T8mN0Lhz~Iu)`( zSi?0a)$2a(-DfL**>$USGwzPR+3IaKaUyAL;Rtee3;rie?rUyy#q(zF{DhE<9Pj!Q ztgZ}d`XASP%=$8&hO`>3-rfjJrBG#r(S(BNMeL1QESdUwT)BHe~L~kMmL? zGGlt%&N3xS7T}0sMB7Up#Y~UHvKf+DyHmPQ&F#l=!~GSWZ+CX>1BpnAs4s|$6N#^j z0t9^v2sa4k)vrjnBvZ;sC;}yihW1opD}TgAIgS`}cc)=MK#8<%*i&icUbz3L^NXa% z4KAI7ed6rQ$=(s)CKgE|71oV;*E%=W^08(84Y#EHHRyfTuh@cQf>}nB?Fcj0e6^XA z&j=uwmmvu#C^+&z{PePV2QAVZw3i9Y7#JB6(vJ&Oi482}wp-GC(B)qfG>Wo>dGn*Q zoqhaGN^D&-f}nWoqo3+)?%7l)sR)I!y8K&#^n|Oxd@cdFY00Jz_`kSps)mn#>G_kc zVZLwZNHf!12+?VsJ_}4RMkc2WdLd8Bs=>LzK7jYEXdc~$t<9I7Vc||bm^#VWo6w6A zXBWt0e#avu3y(j(`F8UE@an>Q?!L-1v3oxAECg0E{A;=c`$>q+hwHxkiId5Iud1`G zUU{Zi$7wg=!W}Wf0DH4?U-6v^H-6pj)I%AToma7h2bW~F4YZYBk>RzD> zCsj+^T_LUCJf%C|xC9_=Rl&-{dq4~riOV0GC~qa|V0tKH=Iyc2+LVa8FT{-s0Gq}2 zSdgc3X~fv(euPOL`h~Wt`wR7-7Z>9yy_DEi?*$W>oOdY{4X*i^sZ0 zo@g+-?FC7e1qlikmTOz30CRLA;8>!qmyU<&b{woW5(O?K5}fl#;~!cFs%Dox9RN2T zf#pE!?NYH{BeShsQmGI;GRdPqP6dR_UuHwE7}m+@oWajF8=_4>N9U&EQvx!TL9!-* z&>VfkYZ&4WQVoW~GBq^YCwZbl)Rt<6ZrR7co?5PoxIN8Do?-3B&$5Ptcm*yU!IEub znq41!e^YI)3R8#Q3e|T6y)S``b2>^TJUAiRRy4~5yFd>C**kEku91f5FSY+@T$Nr5 zKCTppuE55(b|(4vWhxuqh{BAb7@eoq>OO%HY|uY@ ztQq5WkR~RC|7yg=764DY1boMUP1)T6rYn}K2vS53cgacw1&Paqv%yn5nCvd);I6v< zYdWEnhh?seT|IwmYE4_D{Pg4i9ubdBf5IS5a%ZBVoA@Dohze<2s}1QqGnN^`4{#B*l|GDGI*X!< zt~U&X!?;$-#mg?r;emM!`TuVk8TUtor&R68ym-{c%{U6opc#?6%l{(#x(HT*3!N$J z!rXTTtjJh?LyhSEgVq@OY1fQAy)a?ESx+LnP|4286~f8ywYuomVJlApv7_@w^+j13 z9gY_h$yKvas~tVuexbNH%gqW`*XN&9tgU(~CmVQZqyQ7W#DE(D$?k|?BlyFOoH*Bl zjva0p@IW(pN)>78_{>F+-8QESJ=p>J8>=G{llI?2p6?fNMooqHuaprs^stww(G(_C z27dC#A45@JM@KWv%>z;~5R)yM_qAh7tU1MlbZ_S7@cyb>~)!p&y?QT zA7-!w%|bSF>zh<&-P9^p>bI%VO#*2_yHnQ}q*qcKg3UlK zq0dI{8YtwZ$R^aX<8GXHLL~@&TQbvpRb|fWU+oKFGopu@r8(l}J?o%3$8WBibXN4G z4aK~_^IDVc&WZg&l{ zUjk}%?!E-zn6{^2OgM74Nu)_#6Fq=Q3Z45I_6q-)`~Hdb!rD|kHyyCAb#i;KC#)kD zh%33-evh7dRqBvBaL~VVL&VRo0EbsmaWaN3oWf-gZ(nxNj{_w%DZ-KAbSqLidM2vn zeu;(LQn9c|CeTq>(UQU*tD=VajGj4qH6f^z$mQk3s)dU?HU{UR?%EXV#uRg!o{Rt) zbru#8oVDLhgNDtWA#JYrx9`;-DTF%;ZbcWh<(?lp>7mFQHl0b3Oc%KUPp-$Y)C`Y? zG|!3&_mgS~m>d`*-P!52Fv!A>+T3r! z20m=U_ZdwfXG($q@dMdPD}WKnG9#x412Dqsb_5%Y5Ziu^o0H0N1Wl3tnqBe;~d*b@ZwKjw!@Qw89qkJP+i3s38_pPSNYiU&#JJS0zhEsqT~) z#1S|xUO2KsmW>Z0!e(w`Si|*Uk`qSxBJB<9iam#6sgE~9YsnbmKal9$i$lnP)nP8i~A^C9$;tl=w-m z;>PXv_8NZs0{tP5Q@p)h^Xi=x^@8b_Cx>KQN(T+pFzOREzYH5@KZRo)VlU6&8Y5ej z?1MP5%AZqZ(I+kNE`@wxZ63Q`G{bA5XEA=q#eMG0p9M z3Ct7aPMQek>y*s`04@wfH2LcB3U$29Uzomo@AJHnx9-m*t~1-l`Bw$v%+l1SAdg#- z(BTmM-wn=krxFn&SQSFf_aFS4T{*0YYJq5V+O zyncA4^W|NY0wa-ooeW4#00l`yT$|?b9_VVUI+R@9boncx4dZ$k9wqXu&iRl5P9>KgKH_>C}l<^6oA>Ju$o;#RuOE42wO%y>AlYh+i9+Qg751^hvK~fFlb-((pxw_x z=Wf&hgN>>-pOYm3NlkcJ7gas(;n4H%UdiHi52@Po^xFO?urainS1%*>=*vFNt@*ca zIXCqY+15z_kj7Fw#+u^I5n@QX5!JdtGMXyUkOUv5Fbp4f?v{hi>=9X_(T<4r>a7Y5 zvvaJ~6y~HcJ;%^TMV!vsk#^ok%c8AJne`X{cKH3WdrF^3-06yp-6|SnZ=D{jYQMDM zn@Tcmm83$YtC3%%A$uukRFh(MY$w^10(}K08OO&UH7$WM!g3 zDv8?y@oY?xBTkss8j~>*D7w#455N;)7|U#m7lzrs|>i=N4!%&Qf{vNbQ}v zw~Hs!bpkWgjgDQ&Pn}XzsTj4pii+yoxELnApD+42O#$q;{go(bXV)_6?p5Zx6NDZf zXao3v)?z5MBw;N_I}!w%Zzu3xM$GIM0h4*54ht^X3Jgk1HH9O=0d70VcO{p66q^Pk z0XsdWP%1Nq{ov~3ytL1SmLkB2wnIA?Hz$=SICV&28&=2}dt4_9oSOkZ8Y$T40>EP2 zXB2WG^)s!_7xi&aCHRT7YG~kYE}7K+)Lu}nfyoRHg4QwewmB#3Q{|yLoJD(kaYNSi z**39S!_)4OeE+964v8E{+8X3cMsrIyP`#{7RH8j1gW3|w71=@2ZIA{nJA$OcT?04R z1P|#xFDGC0YrJg+p?h;G#Zx#^N(&+!(N}CxKf>4?H9|}IEr(4O^ppn`h=Vz`fPE`5wW^8wtbYVj{4mS6{hKIzocXe1J=o)M#Vv zKSd6cRsGi@3lYstl=ueg6>JhpMp}V=-q;;51WJ&1WV=sWsc%ooC?3AmGwCboL$KcH zTPgi!Lt5;2r?m>t3R!8iwBJ#uJa0BD^lLx6D{`L51}^T?o-}FR?zupF_4P!B86j7B zkqgkJZG@coO$Q7#=fhS7H&cds$Dq;OC(Dl94#=wG)Xo^t7)N-Oi5gN58rl@7CrSU} zo713#V>NlyXE3z;U>QMUt8vn3#9{>tKL&Y0j^V9ugpz`%Fn!0}m=Zc_h2OTjSqwGI zG!!29&~h&7;#?j{v}3dP@^-q7U598j7f`~Yx(5joxIzu?$Vu13f>esFwB>zHCGAjZ zM_*3E<}oiVwWL3UdLDm0f-e(%Gp0$Pwxy=rizOQG-PgED6J=2FfYis!Zmo~JLomjm z6w~OdY zLPx)GA~b#95IE{}c!!UUwytOn+;eV@dloVqLJ7wPlzazl;1)G0bK%mOO=Gp&LxgJ~ zW7xC48Z(pM#R5BT`e)I~^d}bd$R8Ey2K=R^P9gav@9kK8>w-@?(g39`+35qG9h@R~ z2jmIYFBo49_%yc>VP@H^O=6rw%zCVcuXd-n789t;9LPYqK8(JPq?1EPh6+7$3r3)iaZR6bz58)o4 zGE2>4{+r>HSdf6644cJT9r!c|O>{LgnIRbCB$DVc z74nRnY$rfQBKEeq`xbZqK}YW5JWh;G3IHkgA-q~qlS8b$#dRW!C8PM4m6Cjqb~D!g znbw(`g}N0c-`&lbUdMKJJ9Jcms0I|esP#G96fDr4V}_+Gu{MI>gyl;Hfy1X~8XXa} zru5aE$nV7pmdp%7EFqOGQ=x-`%`3oy&GK7~yWDx;cALFstt(RqnrIIk!p;n>(uTnN zv6Vvdi&xu@+}9>2kOrP0l*OI<+T2YY&s{T8TsKWEoAZJAsh2HX{>Cab#|7#<@d=WW z_31Q;S}@appIjx%=!6_bpk${f5rc&Tw9AY5cx$p28k~Bbu*Lq=w4sxSlI)} zO=>0=xRu^f*vc1<>ojjr7I~yprxUaMM9%A9d}!m6C^a$m`7k@!KM#|i*!ZbmM z0^n*2ahIkr<;5|IFxeEbtVPP`1&J8819J0+i*EV5Np5~mEN4EmQw-sCp~5K0cAYH- z)XtR6h|Q^hxD=>VYVP3+a*Q@_A;n;3G;=!VLC63Xg(ri~q($Rp@FaQ|tj)p8{^wm- zfA#}Su&&5-x4KTx9)|kQR9Yqd<A!Vz321>^q@5fQ5UW_2S8NNeb3y7e4rOxfu*zLt%K?|ScenqPGYmTUB z-qob^dh)S2@(?d$B<^x7M{{+8%iA~RkL{NAcqw4j{A@#O?)ft*=Udo%0>?wMUO`;9 zWr72q*3PI)&Fb|Q@*zVmNYx6jNtETBw6THi{qy=gZtU4bkt z>}eGoiIU)PEAquS>U7_j7z7JktCtv05)GARkGRGpjyKw|A5K>UseLUr#O_{>qnFBp zP(HzqhSn#e_|gAf-N1SkK_D_hsfM4jRSdr$`MXP8ibk-phiObJmp^O*ziAM=2NKw3 zSgIoOXDL&K+}BrZVy(SoO#@9YTVfaJ6xaxbnn7S@^bW1*$M1?5m~uUmLNv2i+bcyJe(0ZcZhwAkTA%%D$fbP3SXb|2NkUh`6gn-=ik5!7G*NNXZbM=!?44p8Mb=32T~$=t0;flj2D6KI;X0{Cv#Qkz^*&eQJ%ljtm_q zd>zgK>pvS`0BOp?w4m`?!@>hCw-m8c8^SvbbflC!6;!dQ%{+*s0GD$-d8j7ga}{Z| zzj7urhX*r`-;^78;yxDk;5558?N`O3!>V1>luCZd!%5XRYoROq^`4^DSwSTQk7cZ` z89KeuN_xaVb6p;W?2*Uv1e91rXf*mR$V+wnh3X}i_t@dN-tc`Z^|L|#+6O~}u&Jwu&;i25fCbN;OMVs#oN$zC z=KCxDJ}zRS54HheQkEkHo+3SC?mvKjg3x8$5wpl~o~!I+1)(^r6Lp?sAJ|YUd_}Lg zqu+yn79i1T8VFQxA*EMTxGUEb@DK=!SSlTNiY=cudL0P3rWJk;{9bV8qoCxs#aL+* z!?04CmYPcV#J`E{%f4jMx}57$VlaUOL-8C2)lVuyo6m5&DME-*I|8ZjO@@ z*n!0ZwJ(A8OG?`utjle2Ty?6dtU8~SQUF{kiZ>p}g-Ffxrslor;@1UjzSFkdv^Dso zcH47yog~B5pF>8|zTbTFWv8&!x%T?l;a6g$zS@5F$9%=n;+YsT-YkvyIR~B2aS;4I z9HVQL_r`~sOYWx6q8gO&4CB3nP6o`mYI0#nSPRa`92T!>+!g`&%5vKlt3Ew>Y1$^m z2DTXLQlrS))X`nF(YY!J$~9_mWU-tle~?BK(BM*<8H}pu=&xk6HoA&20yO0~R$?L; z|F?FL$#n#lbSEptue%kDFS|ZRS?Mdhi#26lf{U2e+Q^AhYa)!Y_ykj1_4@l@Zx)h! zO*rdd+4*7e0*o+z*{O4K=nHBXJmGjZ$P^L{w*ca@Yg->Pq*>JpOCdIL-JG2xkFHXq zjiywp^!fK*q3gM=ws%!;Mw^EI9HM|=56TzoZL;m1GRydvUB+(`%3HhwfzWY*iHk8> z+CWFHuKlYfEZtoAay4Kg;H4xVM)pB`oZ@q`LnJW%@B?BU$F^r=%eQH4R$4Nk&LHA} z?6`7}G;rJ1gFB&ZQ1$oMdAHdl5|CjvgOcE5+CTw|pqwk`7WJVmswxLN|4Pv;ns z$}R@>bssa8!*ltbvFsUD;UTPh?ohv7>WF=A4K$6*^@%MeMNx94*}>R0Ehy-w?`H$Y zUy;#Sj!A1ShZWB3E!!;*fr6nS5w59dzsgGcCuie?arc0giIrNQZRA9{_xI(8(Amp? zr4Pm}(u>Q%B?F>9G~T$8>y-3+h>-?lA43^{ovtF5>yz%4j{!(sz2e;Ckzr6C5DW7hQ;jsOSB#N3=3I>H@IV7u{$oykK0DucaV~e(DOykgvDb)kt0fBqG*=`v z@zvA9I@2IrZVIYc0ZL$QS2#ygDD6tyIeyF}lLpCedLTh)(tM&l5L8U_yStxIQEKB& zby)sax~HMk*7`1TA0*@!Z)5oeWe8TkB}~$pr@R*&hBT@=8vN#*7z;ZRrKpcq^7N zn$?8JPx7=JB~_m^pJ`d~5{!(rQow`5Y|XoH(?E4j?kZ&M4lT)$Iy#D2D;@EXp8=#r z-r~o0JZ!Bjtc8-8NeXDjY91k2%m41O_U&`OygFd-1c0Wpvjze(9Lv z15K1A^u*sREK2x?5iZO8afr~U?9k7Yhp(%OuqKIt>tqwr5j?PG+*&E2NFu7sBg=e-EHkvmyUl$7ov(Eq?s94&hjoSAoPf)ch;0^0EsBX!O~Roiujq6K!M4aSLc zlioCJb;&=>ENaN~u6>Cxgbt>I{6N$77-Ik7*bjBU}OdzPkgH0!kU6@ z(Ip2+gvD6qi#u@@(KuBNW`MxeVxKgAXF2xvxc!9v1B$jWQS2Cp0k-MsH56t)HQ^eFH2@BrTu$M6zs{FCB^(A>f0B$MLU84# zisy;OFQ5FL$!$)T#5DS15bP0}$D)WH%t|LD#ddRrSr6b$7Rb)p0BngRHsThm%)9f< zx3!+AbzQXB8i)TjMGP#-A98?ld?PSdBw^7LU35HFc4aOge;EUvt)%yQtTMZQEYHmO ziTS1I@-@=qojmHph_}bJ=jwXf?p*rzNlw!M)B~%{_cqib2ST%HoFw!nY+m zox8hJ?jnq@B0GK}fZQK$=A)j=bWTg_BS@ebbIW!7D+UWN~d$rKy!2DGA zb)^aV*i&5Pa1xdFpC<-=jeSMNXIT}$KXPJeA#tUs%Kz;*cGrUh>>1P4Wlh^2i^L{S zZNEf#2T}u`@>yrYj5)7;rZ?^r$|tg~{*Z|zG^3H6vt_>r1>&{p)~K@Yva^bC9j+If zZyme!aVi!r6~CVP$lN&xBMzapbDSA~!U>V2uChh@tP%^8o;W!44<1e|j)G%#ChMz> zi79_P-k=x3>|t`8*kNoLr(P}?enL%*CMi7yIZGQbg3WWQp{_VN>1U;&K9vWPluP<& zrje`MTY5N3&mVKn?6RTzA~Z%!pKk^1XJ9}E0X6wMpu`~irFMc)?*pw(_gzbk3?m{K zV+`%87S*YWFaFe_Q{KeQUsS0M?Rxp=EUVU7fTt27b@X3_c~tD2Z<+8BS3pOFuvMbm zn}g=uB^Pev+4a|L_Y_Ilzn5tHaU#Pd^X69K#PbCJHEW$8h*Xtx4jsgdTz(jd?^^Tc zmXlr4F3;#9C$!X7YL^2tbh$X<3*P7`i1Kt(A?2htDbr(-GzMfIAf=IolQ9Yy`=7jE zJ;9=FQabTnG6O!(eih%&r%#Bnv@N|N28Oa!%hUCUs1if^jzvD1pt75PWy#>bQlI9f z`r3N@xqF7HSiFSW#oVEaPy$#3(|lX!;#g7*ksH+yL(+t1+oUkUV+GcfeR0gbAx!p2^qNCkZ<_Ya$6fi;*ub1=pXO>&z+Ex{QI zmQbHBIkQAht*uk>tupC(agWtxqU?~Q#TG1Mq>6hK_Sl%>S;K}9=HioMD-4S5j?5&@!%Y$MM<#eq2(|qM@Qv`)q zrh$4owN=~nXje5lTra=*EnI_S5=r}9B5ge47A+pZP0c(W2(*&a>L@Ns)yd)*q{cszS2V6i7LD{m6 znPllaD968kQSq^soVCQebL+!8_>3U>L;-=aM922E0iaNsvr$0-gV=(k!_NmP4Ou{m z<4p`z@CyL^!qOCh#K;XW_9xR6Ya8s`v-%RjZn5lh&7wWuCg5C0+(bEaR5kZkkj{pW z1_cGX#>JT=DX|y8r*%dp^l8IPTN;@2yN|8C&KwZIn(G+ep?fDEradMHQy%G%igVOW z!bohcqkah;&s4#oUnI98U?C{dO&ciNpy_1px$d&vo2U@9WvfCoG~{g2Q#O;78d znk%L;iv*eTVtw!-SQfP9$Fmg(*x4IEJk$hmf%b$XrMr;m#_*cc7fQ%zTB`IF)p4vi z@(&i2!O5_D{_sntfVh?=oj}fX>pgY8(u7MKYr#*c@j|9_n5dabxGk{48b!6l<8^Y@8tMUm=ammgvv=lNp+rst>Q8Vsq1l#( zSk+WTtVb~3py^OoHL}|%pezTC%da~EvpfgpeIaM64#C$6WvjJ^Ept>?n;;@@9oUF5 zSD;!jP9CvoF}S1nWk6Q^fZzi%?#kk9@|iycIkIC^FF>KYYq~4oO`o!>M21DGc-DUD zeWQQ(>`Qo+=R<4K5Fu~PDhWUFvB z>iu^v*hN&$DXJL@2GU+M`+~jz`_P{gpm)`f`Ish!(ZH!!nJVGWw3m>8}P|*R#(Ur&&d8 ziJRc9im4mljd!-B-3=eOG3O9dw@LowS~`!$46A|rM5{=;yxr+~7Sh=4Tn9A4q24+# zFNhmCVUxGP?!&tJ1z>r30VeMDlGw8=M(@638)ULzHg!niS9qZSW6>jWqTzscs+-YI zL%o5p3A1uhK~YpzeJW-&U`sd0d1tN0s@OHrtX5XO8Qf({Ys}^&`$;X%f9&1xSQKIG zoD~MCdih29f36mR^_<8I3+Y(BceJ15Z+GtHwK7P{C@cKW#t-E$eNhSlwtLU~7{!M? zXyyWWtiISyh?ckNvm=iN?A&I3>Z&Tcn49E*RJy)=c?Rl-dwD1Uh7s*~4MGQvk9{)luj;4wT22`Frc!H_#3g$7%8-^}zY3K7v(`Op@M;zG@N#a1*(=pYW4GcE!7Zdh+A ztV~erX<-+>!7N(;BHnLjyRS3hmmrshGS%!j2mOo>$E=h7nLp;=^-W~!m61@Z{YnoX zAfpz(V-OjiiWkHW)NufUHWpXbZ$zFAyVAJTcTVLnbELePY4R@+yjb&IbJn}VP)$lt zWC2IHesO}^?At+(z2)bZm$8+ix77+X^?VT+LQL85l9pg|Voj5mW?2rw82pT=&m7#I zql=CDL;>WRq5V2Wf<;}T6$xu0cz&%Q=S~7qm@skky^0{J_Hl0SvvwH7)H8s=FcBcQ zT^#qN)2bjo`VHYqfdO7rY5h|s^^yZxZ}P8!(ZwZ-3EIv*J>kTVO3!1iiBXVo#GBQQ z1q?_|9lZeexKAOh3d0FklerP?%rD}q44SxtDVL_09?%8kEG&$Mi8IW7llBND(;nN! zH5;&-OvzvHn#2%h0|6r=){Yb`)7#g53Vl{6ZvB$N)PP5mlq}W3jBdfXgGiVUv+RQY zf3Y(7^u#}BWyN@?4)yq#p>~v|A9(_?PEv2qnwfuTU5XS(#yW=YLc$HFD#53KEBOs} z2(V7n$u`zi4O5c=qQg=}G|3YcGG2ueLW++pBUhz~gaXKycilEJLkQb#OrZ!Dncv<` zxy+5dtDVsXS^goue8pv-&_^2w^PJ=S!lr}Hz{P?9X{Dl~(wSfsP0xEzicYzdo4bgq zJFLD+mc4{y0E~j&$-MuX7ISfSq#Ui&15YEQAeB$L{7OvM6CUc*=4E%BAEQB3R2MUV0I#7-1=e-vOw+$y zZ)(oJKk# zkeLrSO~B0Qc&KCU5*9xx#u|ksU9qXAYG%tYTjASQ+??Xsg*#cX)2977zH0C-Mp zCL4n*8v>AUjfY{(F)4(`teGHbUqNsG5dl<&_h`=PS8Wrpu_;12wuj7@@@BsmU{kYG zjre1v?{px}PDV$2eAmtH*)|}wh=^S~o&N=99(Jb%ODKVBwx`qHlIbJ`=hch`qJMi{ zzXR}Shf-N4j$>H36zlcK?TeN4&VHq{p=W>5wUfcQxy(}YZ5y@q=!^$Nd}1Tk1xoWJ z|NCrG>W2$h0jmW-M!kULBwP%qeOi5}IzdgwNcwmt{UmtX)sJt>U23!v`MpOPlQ_YC2ohDbpiAr%A>ga{ZNwiz$L7u(}H(|zGYh3&I^ z;tM++&{)`;9<8|OJ(<42i#`I13L^>H@r(-ivDi#5eYW10j>>K;{HZ2o-jpLeka!xm z&J^)$l&&nN=y*HtVbPPTc=sl0G(;z3PYUkHb(g0NCr75fR%ORTPImS)_A9v>N-G+O zRlGal)9GqjfBdSNc==1;!al_CejXi$2*=D|K{#ANS4`~%L^%`v_xx`?=O;E?bCWMd zs7({;dz?UZ$_dKfc9@~TgTbqmL>z%pn{otSj%rpR&b?dI1`P)&u9&Ilt<{+PN4gV? z15oM~um%74eTdBRs%RPTPJV>}gqcLLW->+~^1Q$q=^}~$NOFJi!QxSMj8q}blKdY& zMn-zxX^IP`#$yTlN8o-7l%PgCW-}aW+202)0iPNh&|u+58SJJ_0<7&S+(;|4CHr9# z@w?y_f-XaXEk>K_mD_9fu{2*1v8@v|nNVDasD>ij8KIFS3UE`CTISj)Zhf*0}inTGU=f6^9h9i&p z34}di-O;1$KkRs*%saDqLF5e}W#pwv$?}U*zxx>8r4DKX`So)O4;VyzCPvqf&oOLi z2zYhOppB7%+=UOA=GWWpkQ{=KM$AFe;v@)sj*Ud7xD7f> zKxq17UC^3EYA9wxdX!;hI^rbsUXO_QY*+e9CKI|HkJp0nM|!8BHoc3k z2mbl*k~sME9S>ZE_{@r z?Vp9Wd^DB?Qb5ywRpc-&H2&@jy)el^ig0#I-!(_ zg3se z$#(9bUMI7_@_CxG#V(}1+E1kZ1o9#XH=mq=CNt)IM4xI{5J!<{HeP)Wb=0!%9%?$83Hr=>g( ziYeHWbV4Yye72xb_Ws+8Bp+FgDwsI!p%AOFAW9oJ(5u}v!iQX-4|P>Hcj*o9S6*za z{=%zct?ys;hz^a#J_>?*h!WE+m_f`F5NQp4B-d9Ey@PvN0Mz>fKF&X@_HXz?d`g%} zvE(lyREd7fkY%O2-6iRUa=2>ITd~~_R^wu@rM&71`kH6oyV`|CGJWQYjpucjC7I`a zOd00w<((7k9N1wIN7k=3`6XzbeuFTuv#%2SpgT5!#{$oX{n8k z8tZc8MN4%9I z|I%%Sg$-7yXO?}K$y!pCD1IKgc24lWb$_1(~-7d1)<^Pp|?(5z+OAen|zohV!Kfxv|RSOsJ%ou3`ZV?>gIQ(h5^QojGRzsLCpo+;d@#$Gs z3L;VukJk*%xBpb$!~72^x*WQC#i1^h!s39XLMD0E1ygirA&t*&hZS&= zf#&RPWxDA%64Esmi3WKO23zUOS0d-`LS=Bv7bNuAkSfTxP;&>@`Eo(ps3d{g^^Rz|E zNq`hz=-nQN|Aov8J48vd=Ql+~^Fy<5kb|3(;A#<+NPPV{^UD0HNw+xQ8S~6d&??Xn zZ0~pf_=p!xO{D_4<{>mZ|Ua144xL~H2=r;c+ zmVSQ$N8I2lj$`F{a%gKa#Hu^S(mTpBPDYRs4pZEvdbx} zGU~FH^5UdL#cAlWw$Jl$rQJWXhd{Qa@s1Ykks|TISy58k((Ys;o;4zAZY;->+1)ai z2jpWZ#karMs|TAqR_SPZ^}C=h^5@?k)PID&fw6A`st(~h=peDDmJ@$g+W}S-X;eK! zos_HJtc&ISGKIt_|MLU`qse5MfT7yWi)74gh}n0d+j3GdDQgt}&^@L7uMzPsr7%|i z$#z1j!K)!NM2SQ8)yBW8ty4SLRRopV6AZOwXn7NVTvAJ}3?~m+Zvih`M*U=LC&XXW zn>}6&AVOZi6yPU~jV=u3T)W{Ym`KzPg`9sagAA+XecGu-v4AShn~JkA&9a2 zTAQTXqkgnk0EGU&_?pVZ24Be{=)uqf{Dzgj4JH`^+NO(1S_fF*vm-1K8HI>gjasY?phD@SQfocxrFG2oRD!&-a=(0J2>!;$rqvZ( zT%N)Lqd5b863I$%BXr)-VxFw3`-j#%Jz_d+6FOE=U^T{nh;s$h2*sGWr@}+$;-eZe zx=%(rv1>z{yU;w1$2o0h0jVRS=wUh|0FImlY>nx_K^e4HEkaA5g`5apKM`k1l01$O zsxuELf8<#9L%0TMBKkNtO+@hBw=HS|Z)o4F(1IWB6^mD$K`tKbZ5K7&47n}JVo4WD zq+M#94S8N61XINYw0ZJa)$yYeTK8U|_oB3G<#YA4kCC}NziEESvT8PTQ%5nr+ga(N zRBuQ|azbWCcK_nh7elz~PUmWYmYmhe8P?3Zf8k9AG1F`+T(Fsd73S&(Yt7m3qC9jh z2gH>s%X5?_S%*5Kbir`oq6J2{y4(phz>m3Ts8TRET4A-F^6)VxBfuybv5K9R;yIn# zfDATvR~oxLv}e?LOxanWJYV~h!ctaDLKll&Z>hQk&6$*$(jD`LyHGM-Q8T>RGn-gJ za31JDWP&|&4q4e&YI>sUnUY1oMZ9~-4ScXmuw{Q!1>{Elx~Espkzf*HMabH1+i_~- zXCg0GN0-Z01h6`gcFsr^?MDXyV#~lG-!oM}nDFAn3>NxElv;4%ff}FF8kpZ{uWPd39G{d^iQ4 z!!z5=n?bt+kqW=QsJf2a8siM3l+v!J*!zu*(C#9P4xQ7!r`v9yhV_0`3n)R`f71SP=oyn*8%8HCG8@C$UV;Nn}y8Q-6a z;IqZqKmbK(c6?WBM)q&$7--ubd6JaHz!5QtqiA|N zf_XG6IWRMHUGZxxg_;Nf`BDaIKjW&sm22_|F*6}DHQ)v1Tpjx<;l>XM!m!f>7 zeZXkwJC;`~$}YjL|5Vyb(IhZ?qv!*#%F$O5@jA-8%!A9w8^1})F#WCR^OWJu5l7Bt z7TY<5bfQ7|4@eoKt(Bbs#v%yE1#F`!AI|JgE6ri}oXfgn!Q0<5vW6j>UA*j#Y9eQz zDH8YO#$+lSd05d?$zqGQ=yfG5nd<>uFXf+!d_f6|MA%I2OakvZ+*j^bX=7C7)Vs?1l zul^o0(~i8cYiq<)e*d_LqL7&i0`TR0Yb}`2$|~kVl^EfEj>wj*1f3A1Y^gG-p+27J zB%;2ItN;aGFKY6p|&76HpBsrD=LD4_&FG3Zsi z%5r0##@EtP3ydXH1|NIX8h9>26#X1u!b za`qg1i_hGp4#BhilevexwgL_!$7pP>KwXMvgOVu8{a^2li!_QOqy_S(i_I( zlq+omKTQHT-da!hzYdcp++|3< z+_hoZK26?xlsQ}-bm)>C?vPLCCKD8s!f+ZoEy~c~bcgm2TmUI)Ctp}-x9t`*Eg#3&H4^HFrY!6%`AMt~I*YUyrnFgcMD?+K?5^z+!dN_p`| z^^i{uZxLXbphs6hsLvHcMO3a|p22;5_hHMI5T81e9xnvgKe>-DIrq82AmJdur&WB5ujP*zMWS7Qf4S3L6FRxT^uLNMkq)8zS*_nH7|T@p$Y(7o1F=o>#Pv_Qw4jZpA?0>l6487EIun3e zvNO-#v_>V=5wU7JEx=gd+uL%BB=*HLUnkbZ<4er;F1OM!{aJKw>u{K%puXnw&)9LLtZsD0kkcgpzSQ25{ABzukL zdATphK`fbE5E9!0X+ZOwtn1wgSfhi!V2c%LPzDTDIFv>)V~3~?T!p#*6Q8f&Fbc!n z9E!psThs)Mxcc1xMg$xthkR&!V;UL#5DT)6&P0#eksfAK0iH$+P?c7fVCvaQ!@VfD zo6pcAKid^CIQER5loTjHrL|e55Uled#z^M=v>csJRlczf8%?gmcINigg)(4|GBVEg zN2gd$3^d8%ouj~vAde+8+(2#f2zI2dy_q&GJotMi$ih>>5{HN$oG&62s42S7C&9@` zVFuTc@=@qE+6}1Ge4b6gQHJbQm)~aoLc8q6m>tJ;5}jefttc1{C>ZfN~+tLv#?DzPhh)S%H3D+>Wi|* zb)Iu{4py?x@|mG&b~*g}EX4Rf`u42awM%LnuQRJC4qF%VxhSr{GE`5&tCHj9c{Q`c z$r>b)LHoOQ%A^Sn3=s;D6r(MVwq-gomzTH=L9PZ4OxYNk?!1nN{?`)Z83{0n>sEmc zGl@>VYH8SsI=~gq&sW@AO^I@<5^oW_6$A{DDk48{JdqzJ3Rqq0Wtj5(3AD;d*r5i= zZQ@3H!Xlm^taEvow>`;+FjP(-El+3R#M$+*k~`hz(RbUpP&?~>9etafC7Ryq{qXMV zT$-&;^P*%!S@iC7n<_nGSnIxL88HskVi;nOm~*}Rh!cfx)cj9n@{UpF#d3M4?r|@6f00bq>iVcQ1r;q;PXM@D|7mMDF|+PODP!O=jk1h z)%vM$t%lS5KQT;RZvDAPt1H4nk7*b7%;2i1_on_BezkYd#%WNhu`z*?pu?_mqiWyE zO#|5FglbDAK)j4u2kG4^QXkxJbDR zTIEGAue+4dNlHP^Rg!L?@SWE zEkkU6Qg`_I(gjfj0JgQrYD@6Y78mJ>0?615F(>Vlk}eij3UEr#G;oJOJ7>Ow z5gpk9nV8V6G960ACn`Yki;KEw4|KXw^5P}pFb;ZrL%ly4oou70O~C_~2;D#vZp#jr zZ0HLvU2Al^M)^+^66QBo_d!%y|0iN)j4?GQ7~9sAF#8BXUvi)Pg?Cg^u6@~^&yS`i zSgG~H2H_12ZN2%5zoj_@=aZAJTLI6_+!GA3)E3d+>vKpV3cao$)eY8k&w`MtQc1;~cWGHq zB|<9pj6^Oms$SI`W;&>batYg_ij!?PP}rpKW_<`e$6j5uKrl{=w7T3;y5L!Y_bIcv zklq;~#(Z?bek)eH8bCVn=7}2jRE|YCi(9u|4)9ap)=9+x+fgdbxjHOSkT&8gVtM_;9m7y)oyYd)|4}|Ow>KeJaG*_4lRnoe zm(t`lNCKxcVL|3GZ0Qcj#s16x2M&bQiTeb}A zz=f*{HEfH5b7!^JhelGuT3^dTS)9l=X%|#X4J7b8(LVNL>$x9#jfv4NzFfU6)VR(F zzO5y~AY@staQVM9O52E`-rO>&0laW6?lyQrs6ZKS16b@{+8m~m+Gk7AacPbnWX2*I z7{qh0Mgv_vkJo;e`C-E)BpntzrK-4DWR32>5Eku?PHtyKFfc2JraEL8?{-4>VP+7Y z38)_vYtx*3ntj!_Ch=?HSH?)2T82}?2e0Wgi+oZk*U%zYt*d%&6=AUV(oOhGt?r6S z!av?-S7BQak~tT_GkiRZm>F3n`zp<~WoD)YRA-q&QdzdyiYi{nEQZwcB)is#(DA}O zC{*b3<;A49Wu^iImw!J%71ZZahmbiioGM?|RV9E-TaTpgVtT=Y0bAL~iabJwUW`dx ziJlPLTSpA?wB2l#0hEy>^T$A?!!7BvDPak4Z}#`ha?%zp%uO;ZYAKj?IVJU(_P`)X z3=<-i^;Ayn<7`0a^=~>g6v8sN0mwo5UDUC=^hRIh^e0HCw_noK2#LwP%b;qfHEE6l z>CW?JcWQQa!xPyn5vB8H zp|L%5UM*AZOyy{bi`w?J)jRhoVhf!0LQ2URcX{=kWF!mmL_Kc!rxBeN_|ENUhZU>H ze}t0w!{=zj$aIyX2^s46V8^9@@!lfSo)JPmXz%450(sma!GrU}_mPC^1hLm7&qmII zshUbdt4Fo!#w9^x$zw7FIsW3w6e$ErT_W3XbC?>kK&K39FftQ`aq(NGG@1kFE%5;i zyq0EsQ=HAifv`)}@?N(qd)UImIvptVZ4M`3$ zb5*wTG3`rAr>VI zu=ngSh26&Fik>AbR5hiieZGJuT;17eOl6#jb*bZ#W}?8p^kU)2B&*OnH3@W!4P|JI zM)i-UKoAb%IYr~vz6N*#-9Yv0&b1kkKY?qIiHcA;7Hlq)wZU!H4fO)@LgCU5DysRfXT3a6s@8=;|Ev0^t8>0 zUW$q-G(QyY6RKP&V9#j$&=w(N-Mloz))ihvDc34bmW&rD}uPDJt%F?D72gTlunjBpL=W!DP( z)Se1lM9+I0!m{#z|6xg1@DhA0>-Nu{D?V3q`oy`Ma^TK;(rR^ z&)Q*Q!8IUeAW2uDcrI(dYbr%gT%-gAAL!WoSap5^hljA z)NhpLq)p8H-&!?2y{!ndurSo9C+?aJI&htcy?y)kuXikfq#uuG4`@GB01@r}clEUS z9qRQlasvji5n3Drx@*Q5Svpr|3wwg-FKlYUCHi_H-q5^>u)jYqP|cC>Q1$y#wU+Xa z#aO45g2WOe-2@?`B>Cn;#&&CgBWn=W#6HPaB@0s^n@tMWis8t0W}U#kq5Ft(+=9Nw zAk8QY2MdiZ3lQ-uU6+JDzK;?Wm~DR!1>iKJWy`&q)Ekshpu_og_^E@>yGb46?z*rt<3y=hMS?u<$q5Pt}GSYqr4g-peadt?>&5_vsl^C`uGRRZfmz!EHgCJ@Bq3@ONtI!-rdl897c~D%$sP zl6!aq?H6@Z@IzzuCaP%6%vay2v7`2h<^++cGDj54BNp9iYSi}t<8-NIc2rmf8Gwf|%CK}BAla(g9wm1(V8?h@ zaRwXD_WXc|{+i}4>hE}UjyK3j@J^7$t=a7gRa^u08k3FY%7|NKX+hY~QQhXvj!V!Q zpi)QWK~WCW4YC=<&0c-fLT#cg+CCiVivCSue0-3~mTQ0ZxsFW*Ua-A{Rw6$_5pNL@6nV)F1msbeJhRRiEPO z9n8`Q!-@PsEHEp|-5SV(NdG+wL*-N)dAwI}A!Sm2&stCY2+|tdjbiTf2kLSPBq#(4 zBT#Q<^QM3wO9lp5GmJB|W25V7Un{|&_46k13(|>Vv_D^Du@OjmyhaD+QE9rXp57<} zA_g6?_?E=IGXv7xEUIxnW1?}FL9_E1D)s2Vi2T(Fg-^)gx7RS97Jr*a4@Mz>&oTXY z8RgiDk_XP>06}xMInSkIk=G5P&bA@UMDoIz zN}b;p-nWwB`cgjkjt!B;eR{{n&Y|1NM5d1wa`w&1$XMPQA_qaU zlL1pkAlg%4(Bw#~wpX8%2mTra4}nd5&;!EBBp|c?>~+tsSGpi& zcr#REC}}RMWK5uw1_b`$U}M4m=f>6ZQ$agVt6`?3ny2?k zIz(3#vpTXrR8f9DxR0S(1e4=l`c2>3N!s}v5y7w-uD=B5VUY6ARe#C%bOblr?snatxq-DgjZXa3`k+XHAQ8WD&VTglGR&Ip~9 z_+LhnNHp{=Kj|ZIc?_Io2V$)3J$#gla_HE-QSZ7}C#X6)#0YPt>w&rl-paL9p3*u~TGQ;1%W?c5j6cth+KlD=aF@4O2Aw+pGG(TC8YkhQTXNH##e zsr?GxnR&9Ld@t~g*#m^Z?)_XdVC|)C9i=MB$Pk;)B*@9=e>#Wup}O>uQ>IFpatGT9 z)tMium(AsKT&ost*3g9BU0$O8_;7NijcyW+u6RT~zSjnl1hlwD%hUOE-`y zlubUS3J`=xtCB4|+U!2F$f-(2{D8PIZi?&W{GIokIyn<*IIS_Zbtvi2Kt&o4#bnAc zGR8RMhThR6QWS&1k;RUXTYARrS1gxh$ z=#G*47wNe5<00h|rZrXNRF^11Og1yol_bB8ltw0i5k~*}evfu8TSZ#gmxjBxI)Qi~UczMi9abIvt}#dI zVj_i%&eKdiik_tj*K`~Ilp2FwovfUpwkIu5luAF1Dqw|}o1Q)=viMJ~-Ird>B$!H% zyln?&;c~lj0Ab1mJE*_s8#}s$Oj&Gq);t>tk4M@tTykh(2zessRl|^UV~W&EMX;C0B362-kr z_||$S&8!Q33G*p-mba8vErqI=K zOi5%y*Vert39Ou7gG~ADveV}%*XNl-r9(!W9z@ho=q}|;Q$Y3NOD_#r7YCr?x#W#+ zb5C0n+vu|<7PC(Ky<;c|PXIu0G3Sy5@pDLX`9@qY8yoAnB*kE>H=N~0<5>m{gah_x z*5-WBp`*JVjXbHr`4l@8H!lW+!fpFkxb)jFpTh-$ix9#*o`>+8?mNLwrb8>%k8*}* zCSQD32Y$(Oz7%g!Z4DFjJ)O$NwK=dw<)08f%{zNG>rV;kWY#G6$+nc-b-ykYI)5%G z7vJZta^`f%^85|j22#(km^yz%kLvK;#ih*Kr;=+&%HEgT0}6Mj$~pV0*&}4z&;Fz; z5W#X6Sm#v{r?B*hh^V=K{XcPPW*1ak&)|H6>{(M5Wj?))V#6JeRXOWZgb8qJM2;9i z8%cW@!{k-~1`hq9Pj^5GvVd%XD6Hp&FHASR_?S`M&04JkLbWRKNj=o|^SrzbVUU+l zYlJ(JZbZt~k#EH6`4}Jr9l03*Sd^A_-wOKC2qiw_Wnq_`oo6*8^MEYM7#Zek0~J}~ zZRg5;yCt!ZqCpk?)AK=Fg?NsABSK+BCLMp!`S%DY#~;$LZ0ME>kaW!rA#GQeYyUbH~=7iY9W)%Q=$h517vt9;w2E^#67H&NWh;>7&;>Y*w3>)wKE z+gR7TGZ6BrU;jRYnro_8P-s@YwN$-4T@MvDLGaiPm4)sU0_=?FQ(-D(TN?PdYySCn z`PvY+9g`J3HKOD+J&Z$<5tiCIR)>qW zez0$M(c2t&J;J;+^n4oF?cJ9cz5T7_#a*hV>|wH{Y!EAFC}%#N7s4X9=aK^qb^m!? zk+N|OL#e%9P-YGKZPw<#eXZ@wm}-2T5wc?a&2Fib(si$8{qpdFqvg3sU16r38+d~w zlgAi%z&HO{0bynEw?S$IOLWEIl(^Fk?4cwr6er|_LAF*ReuG_*kfTOIM}%>OI}B=d z$Sy#5QJvXj!iCcmD#h79pbBfNpAdJXZ~HVn%i0)O!PZcxnC z7a8xx`|EN!jmi8weAs_|lW19A+<12I`UpbdQ#J31ps+;=;n*f=++y(#jGgx=CJe7_ zB4r%<>>xLKXwogmLi8H~S)BSGn#K7lzUTC0`CgvzTz4p&-8e2nt@h?MYz(Te$@>)Q z+u^~~1Q=3LkQ?cE&jHK!ezG`=B(f!D)({o2Yx?o2=(gDim4#bv0(Fl~EE^mZVqsgv z<3#_FPWqqfB+64qZ6(d+z?&=NnhahMZ1;$Ui*`a-ysPa>Wj+V=%j-$!4ApqHpHfTr z%k*8fGQMGo0Rp83z|>_8keUmtCp$y>b}PPF`nZtBpN`>($uP6COOp=mg&KC9-ZIJ5 z8EsMHlb{8Fk1*{(%@AFj3^*&lYVT40(W&u&&+m~w@@TtuC~qZ5kisj_B_FhR@~Hp; z;5^YlR^4x-jP0&NP6YHH9lIZz1rUeV=oY2^C}EckE9`2ZL`yX~7s76|bzV+9vqmDh zpxB{+b7u_np!-+_*P!{!6I06UTif%@;zlzGY-waiHOpcE)%ur6j9QJ-k+y3z`9*LD zEz$K_802K7=A=*O=O@bjcasA&`=rof&$YZPw%{6jftsk%{fbqK#MK)Ix+Bi$4B!{Z z8(;*KxrC6xM=}=FK=+B?H57Efzt8CEb=&X6>gtYW*WV2_xMoYRN@;a+ddsCp-|NcMp15= zRNbVX{$pIH+vP4K$$0qGYYSUw+9jnHfTZEMUF`igjy%mWN@$QD*to|75C zkZE?Q2LS%(No4=cnPkrKh8VuyLg0AE7#R$FIZ>!fYzAPf+r*Dh&H~^1Ny>yfkJIdO zHA*}u?~zm+Wq-}3@7(^_xg2}qNW$=+piQnQWb2wt(Jt`Rc6&-4*th|*TGwVox@(nN zLS*9p@Y(^z`|LQf*Z8$k>Q-x~JA*VbOKKtSUkY$H8;DaVhZ$vq)Xp3Vwug7&Vlh+) z^cP^Tm)PN~0U#mu%8)U=bdNxvU2GR4e#D{kN`roXGrr}jd6`@J@YN@&Dw%dF1qnfS zyj@LT)GFPkr&_5#X!NdiBN`iTL16`E#L~?X*i!Mif{KXiKf_?PvZ~52!`wx-&`jZE z6JF-E_K4KtgbEW!jDVaD5#>LD*K|0E&9hL?wRr4i=;ibUmbZOKdxYd(Q}LMsE;(Yn zrZw_$?KHB*ZlqBi z3w(^GZ5Uh`^HB|W^N-qYb6UalA}qT_Ah05cHJL@?iVg^gr18QXpmCTITS5KeThMryE&E*oij#osipmycj8whH7hworFUvL#NRk(NWA@=)Qd1{B%Skaz{=zqPuWLXmlMl zWc-#6c2$*pa~`lXYm9fczkcZZVh(+-uHok|8vrY8)bl|QtgM43R zXR*>I0Us`w`dv0Qzm$QKZz1e`3~Tk-9xEtpvflLh!ocE;B0_b4H6`VeNL_gVfBf6B zsTaSFPo&)WoecM32*rg6lw&%f7AEZon`19x@d8>I>VP>%L<160EQUgMhO0%wIh^9C zF-;G3LI8L_=lfG+v>8}m;hfbJwJ~rcwI}F08z$M$G#gBsYS1@6;%N*j1_2Y`qPR2W)y{Xcfn zu%I^}6kOpYbBxkr4%eN=u9StNf^8%p zQp`iw*X7j#UTOjR_ngY!%h?jQ-8HRk^DSd1=6v(;)VF5aD3yPL?CAOufz{O#AY!#t zbV@6Rs|n2^02o6|2PE=1qU~I`qzjR|?6sp>y7{cN$L?`Fpkdly{o~H$`ye}+Qp!8S zmtS`dS}cQ8fkyOP4;Cp3OL>LbR4AdeJ|Q?ccow>PO=^!dc0)-u?b~H3y4zenC^4jp zSFT_KU71??!zY9|TyV3AOaMUl;<0?4)c-KWQsE z-Ub9){XHsvW*wJuBjgz)t+m%kQT_dQi5y=+EHD6qeL|`E-#}h6jXdX}FN|&c!4<;U z!HPe(F!c53WC+_+QH|hotYYDkZBa@R9iQiOcx6l!-KWR{=1_T#G-O5IT&loCgV=on zfgY}oSH}@*OEj5|sC7M3j6Fmku+R1Caa#$!WsnSU50y<0@~dz2I(VeF)}@q}{h^Wg9N*%5mhQfPOS7ft**6y*@$-Dlo-m0VZA9}6Z5Bi-@5 z5@~hr=la;^4pW`TVVVA)jRl3u451AV=ckY7ppc_s(r9E&;%p|QTgoL?APMk4SGbukimeJIqP6fiVDr}i9^qq?(T{l=YKWh^zcx55*{2FV| zn)M>{SI3$$sWF_i;CVGB3Tn>gjxeEufD~7p*rWMlc@Tt&FEy9uE2R`XBhknw%5pQ( z^ZC%fs#>cd3eB+5DG2CYm$+jJh=|?gcq-$tj>CnS8H#!Z5TDhf<7a81@EG%X>5`(- z^LPB)`Gb2Rd-KkTicV7k`OOkgfgc2a<)isLGw~rW>>?rS5cr0D1v5%4N4%GVw~Fvl zfOgwwPOsxupSifs1P!K+7&C`-S7v<9vT;CGHV3RIyI#P)yRtE`Ix5XKco}yduFq;i zKkq`-O8zlo0z`vbA8#sY)ATuDMH+MBf1rgz)Ed6J2k5Hu@wz4}_>YdU7ppAj7BIjp z4cMGe?qp!o`Ylrsqq*+?$`8__b5efeFES$f_4-AVsHT`|-Fvy_fB^4hHkkoBWM4Jx zt>ZX(I_qPQpxGo)-m$JPCj^k-Qrew?kZ$s>B>S^}mHn^9n;fLEU-qTFP6suYEPM zi>-!S!pH|aHWZ>F{iMtuu?{~}w?ZSa+CTK_{?Z)bn`Zi9ZKO@#Z(3eCj6!uPV6-V0 ztum?Fh@1Z@q9s!L;bp+#8sLpr9S8}^Lu!08Tb`TeF9}pdvY*OSr~^+ZW}klKu)6a6 zK@j`xTplv4DGpE3wU!X_q6zi_qfMT;_*}E;Zyd~BQr>=2Tg>+)4zk&{8gpDdhiYSP zV{NLU^KZ{{luho)U)+a{wZ|2I_5@Hb#mmQIq)3jl@tt)^?<*xcCUs4I2+c@-LRV5* z%WTk{(5@YIc>?{YgsH-`qTybKP`2I^7h|oKKo7CiirQvv4BYOuz)E<-NSPsbC=9rHGnJKP6z)p>U z?%p4-l#(^Pzye*zFJ10n{uQrS4r_mxmi=PJ|G8x>pD2l6g}U^)I{XSy`)(EXub+vUU5~O3fqEc~`*GF3*ueez?GvDh=a%2?7x!v`R~U zPA0M8J#EGOOgmTL)G=}Z0 zK*QhS%=D+*g9+1kv8rm9;B1ufO;*P7BSw~WOh9w7vfj)2D<27|`4g3Cf zHlm19F+5?-lPj-IG)v>Sml~m&M%d9OYqD3pcuS1nx*-SJ!BjfW3`N%wToiD&95Flq~PH^tI|pJmp#`(rd$v zl}Tt#x`OCbp5vM#K^+1sD7@|r6UDmLuW0!!@Sn-nnNCTeVSaF;Fcxlk-a4m(Z%HmK zeTN55dEAhHd*P)x*=ue)29#T>szmjd1hWg4{32cK;PVDL03!xT{4p)osHTFLxL?72 zif1XWPhUWLphvcb(jr?g&Im2P5-u__6Z}dwEPb$vc%T1F$)t-O-080T4f*?q3sWMmQj#~TR6pg@;hEfWo1V55*7@1m5K#Wu$3sSqT?OgCP zkNYrnitZ7^S1H>lgF+#7fdJ+O(UN{MaeybvIVe={jX1^uXkyJHBjZ$i*~uEDUQS&< zTn_Qk{e!)AidYtUpX~^Q4aSuG@^Z@XnR@TlG;^(V ze#;f~U$N4>+<3fjY?sO}oIIq;klIKJYOh2h_;+RkK~__K{7pBhhNsTU>0o}4YoIPE;LSQOXNCgl%(G;1N)^H1d2v;}Z2v`{RydzTxY3K4 zg?s-Bf~p{Bph#hs6X>umRT0CyG_r9A5rIg7CF@Xp%vato5A~j0^YnZBWtYYNtxL;T z#V(UIl=Zi48ZKh8Uuu}S=s$PRCi2r;2-ILdu*XlUz`z#xN7tN?{n-y6?igp`PK)?a zHN`4!I^n;GR6Mo~w$N4`sG}nFqPR`8O`i~OhoUQiQg|LHvX4`EXwDyyC`1~L2cf!q z2iAZ6Cd+@PN^}TbDW$p#XCh7ec?DZRYHWY_g1d*`H+8`pkeG27@t%7%xvSq$o8?lc zW=}X16i}5q39aN>9xm+Sn!L5_b}vtUHm%y%LK291>^c^w>Hnc%D)XDkZB9S^x{ate zbPXqUhy`J$c0njK^Fv4r@VMbZ+*Ea)eO^AR{|F(iw?pX_X}PKxX$-3A>;Hi=6S^6^7l8 z=q5K0Cid>$^jizJ$9VT}OqWc|^b>k5OROhUN{qIdR){*xhtYt!|t7#YDG>jhH@R~W12c=bET z-9HMMH_=E12BHv}4ml}r|HKd81XXtA=@d|XQ?_Z$WXYm}W*KU&0Fz&n`{ECCq1bQ( z*y-t3g(yd-qYdiO099r60f2*oj9y`sEzI>cysE>iN*+9EE z1#9HR@PC%?_@!*G&!I_!s5w@Qa? zvkn)CTfi5l)>Q-S-i5CnYgYF~73Qlu;AVY?jinNRvXPOF|2+Zw!7CSs@$f|cW7up4uSdGxaTFov`#IL1Y>mM}FLrf$HWB7CFG#{Vg$vh83Nku?ENiM(K z19yH5jpZP~-;7Dl83(U1VKc_v)%RhusnVr1&O@l9n%4S*uhCX+yK5MCw&3te>UMTh zK&f1dI#aZJLGsKL`fo7tRtKa;$}V-JhWa(n?QPu&NuGLG7@%O=o7XyF~U9Vf)LXX1;~!@DpVp)OeCd9 z^Mw{^(+^SVTky4))coxYMSa=1L0c%=Lq*YMA!Z8;>5S6HQa5`Rp(M=}qZzzbUaVDg zFJ+LYuY7XNx7gWGv^U@3-)Rrv$}weg7FUiLSCv3TKu>(P4i+*1`e|px)J$O^ z%K)|&i4BCULHv{>ZCLE*rf>{@5*_TfD|?z5%Absng3(J)Lu#mD9?nFV*Xj5&=>~c( zX*vGHkpq`k{Y00Ls3B1em7H0l3UEbOL{uF@A-BdARLHm2@x@puO;JGCFbq>Yz z@kZrOJU4ahE?bnoMoJ}#f7K@p#0@nocyf5`ancod8RH(@Q`IV2kK*$*=XrMu4kw2n zSI(1K5vV%cK%6sJT!P62VX@xq>3aZ$nJ<^vOzkDrnY+NUGB6B)UhGc}-wpE~KbjmR@y`Fth23QZ z#&JVeoRLTmDMZM_rEKvjvFQ`Nb?eMKRzdJ07nYO2-yGVlU*?JtKy*(aQj0=dPc`2y z0Zz&X!t`K+P_UJguv4N-)dZA^y^<-zxDnU^Lk8=?n+N$5E3j^?(Q)at+60VFW`V+| zs_1jw_+DJTnLLADt*(2tS&CaeF2?;_m5m;=gsTIGQ8qc7GimxFj#110UuS-PTAsIF z)A=@Z8f%>baV&4=memp%2wecbT4+*>c0r@x;70cY=FK+sF(UDwJZrx2-Z5+{Yw5;| z+G5p(O;zM4*s<-wnwzU8eMWQ&f;FK1r}~}?ir&M0xYvFOYnnNRr)y`$3+cpcjty}6 zv7_X1{#0&#oQ&WuN-*w?1R(%ZQo!mu4Sdt?J4xC`sa3C)C*sed8ftMI2#=s!Jv15h z?K4q&1!ga8+WQ>IU)X{c?Jz4sQ&=T5H$CdHZ)nS)Uy9gM6iFU}UscOzo7A{Z*`88F zpu>`^f$_lf0BP+$EE;$>)nKe1u8FO8Zj72OoF=Nc>? z^PeErVXjn@4$|rv4M!QZ9iou|Qzk;vzp%#{2u5**wlhj}aep-Sq&B6!WA_grBm{4B z^HS&;47fc0M0ZoCH8izi5`7z&I71*xtF*9kZQHh7Alvy-)ik(T>!_zzq%#{hQqm43 ze6O~85_KW}(cOCV+>ijRn z^2(2NV5P=5CS}LK$t2D?gVWLp%o-OujRpHTGna?MFbXBJjf?Pl|6z3i5_UYr-+NcQ zFmUj79qAp)K4gC!&6i@rG)xHVv-m7%IVnO>Zd_yR2WeK5Ke9Aky>D0n+K&beXkb^d zy+;Im;00!uP(@OQhZ(1LbY$4Ee*?S@ma|~yhd5oA z08S{>!<)V)?R5pLlpA{3133%U5IZS zqJw+P!X(o0!x~tGfbnoyd45Dc}Q_p)e?_ zHR}m~3U5QKq7@)JL0oLdDeod_Lp2rl42%$fntiVBOT*vlnmi)xrR}}+#QXV8{EHw$ zbisE-CF1~%I%i*E;M=g;S6kX$YUxi9&0otDRBss_w$9h;QYacs^rE=w8~*&PXj8Sh z3SD&}3UqpG-r^$t{AcKgbJheLl?EDVft_>c21J<+@3pb{Cd;74`y|4`ecpK$DaauZ z3aKA?>>Gq7JPK>zmbaQ`m&yBNFboo2?jSVhLK3#=)rC$zE-64&Ndq#d_I7VHCB7{2 zD`W|wBq>E6w_hHvF|m`w{8a& zK^{6;-oWOOBaAFtu=%SoU#nhZ)|dVW&h0C;GKz5=!Fa8pStp1)Ek7W|3)A>CI)cEZ z6$2(>qcj|u;fBlF5J4Wvoa$~JRb=j(S65BrJuDY#s4#h&%CahCMBS~}DTJ0jFg4gy zc!u|4kHMF!C^$uW+f{o3XW{Gn-NF(> zxykBrq&l*7v2+Kwl5>QwaBo!GN zJW(g=N|bG&d~;KLq0Am;^!9py(#QZ3f*3aogdPmkj8^K_!8c5^wzJFx?UF!L2lv;N z&@sch=uq}9Im1mY7?IXzLO|3RN-_8pn_)9%G!({7$76HM(**nr{eh0N=|@UK2r)a= z|0>5Ry)|Ao?fQjt`lMDX6mZ(hbVUi-v7#WSY$yaIC>_gW+P@DA=IymYxV|awN+?F5 zkQG8J7y6z5qeoje7#C}#mWH3Y;Xb<)?%1nf(%Yf5_lI(Go;o=kI6o>8nUXgRUmo+D1i`(B0c3~YPwI z;!FM%6ou+&$fVQY@rXDAIi$lS-}wt=&m7n>*>$tsr+Z_K=Q}>_<(UN(^yh4Wn}($` z++;AjE7MkSz>4}Hby)v@07F2$zf**1MZWov(h~3MKhI0S^-XL4f2Twk%35~ryz(2v zeI}~Ht|!kNM`&cV6dW6R_U|rk6$u(7D$=G-uXG7E>@Y-vMO|jLCqArGcXgw{N3zbYHJ36u9y|>=!FDs z08q>y*(rXcIRkLnN(@zZjGrKRdqE-au#{3wVQt%0UMv9zmx_c)@#%Ts1aj?tCuXHc z;cBK<>T>9jo0V1w#oLdWS+-wv#Icfw*}ZNWC%KgO`!0YE83RjJ=D&pCPHj&-&%hi+ zPYCu}TUvf8j&yrqXiAAG;>n;VC^w?~ZCM9Brv_NuD@>m*)ywWFRFj;uN8Sg>*le2s z{=0-6VLZuHXeF=hG7&&@!Pw?s(_|Jj3LgiCBVPq#Zjt#c+>y}!a3eCZQ82Wz zmYn-$D9jSNGg3uhg;Zk1IBo^!j7_;rgGE|KI7v95VYNugY4ov)o4MKqQOCV;a42D4 zD7T9+=%P(97-Shl;nOIY8S=yHQ`Eo?MVaQd?DllW{QIf%6Yd(PW4_7xBxhab<|Z*(*YF9 z;k?vsG^ScjXXf1&-?oK(-NDn^rO3TU{TrrNPO;+DRQTF6Q~wk1Ar$c!0{Q%=0IFXz zE*`A)$3|2NbuQkR8lU>p`NRyE7kK@b3h@E}+R^w=vSh5D<6bvr6e()#-G5FTu;D1P za-Eq|kZvK}7!Q>d6}jyrog0qmCIg5s0Vd8!20g!SYQoy3AYsxu*>t2^NDPGAzoI`( z66os|scupbrW($?_ro03T3~5e@G0)rI8(B?+k3&o#Z?RXt(c@(QqN)8kq2a+q08`=L=I8NtR>}hqso>=2;p@-gfsRE{!y7u~hWQ9t2rUnQT~3 ztRJYVgjXn}Er&1EN#I7%PihVa2H($Pba%eEL$iPw)5r zo)iE6{?JFJSnlO`))%OdV7y9AzcWReUFbz?fMV;aVV76_jq4Rmysw2!x}w9( zmOR(!ot7V2M(pef>(A;V9&7;g8m$gYSw?dU4zPQ2{cAo)RmX*d4+?&{Fe}5$p7e+> z1D;0xokxWUs^=XZU@JHWq3GYLa(A{eGXIQaVqs64iUyfo{I zP$!_TMIO$^bG{fksqJBb@b~FNY0CBVsy0n@L53LLo;t^BPS?(Y56{H527#!v3FD|$ z74DpGFM3FM9#67Ok78@?hE19bZG1;ehlLlc?Q>|w5l^;DSF2dG#yODHwL7WMn=kkZ=6*n^p zd1B7-z2tc&9fHcA9AG|9&C4r5rBtCuMq%p|fOT46)7!V^YDQeytz48zaA;R9v6C{0 z*<8q&Dy<=^@*X-qVWReXQ?^X`#CW1s!e}Z>qhG-@DQGR?*b!Z`(>X{B(b?uoa0ePa zdv+dyTj4FbDp%9DsYLrdIG!oUd>x>QLp$C18^Q5#24^Hg&Zw=!9xlFc`|oi&&5Uvl&#p z%%~Mrj$Y}K)%1;@K$L)OPq?LF$=7Ie7lfj0 zrK;(cZa4G#DHy7zt7ox4?}sad$`FuNj!<1uovAQmH-Hk7|0X#r&YBg7NhM^MN-BFP zw9)iW2*fWcP|J;rPbx;o!{+R-VJcK7ge zeDw&3^uWWR_X)-88+p`p=0)3F1KhJ`rZ zz@T;h(L#Yq-D0WoLcgcu(2>9$!pZN9YAL9tM;2|5cw7`or)-u z;xI-BVc%c4jD>YJuShuLew7YTsPds)e3ng$@yh)s88&LB!bR+8KexH9dsQP4l9yl; zK!1?&3__E4w<1H(*8(2~lI<|lCG1qjrY~@V&SFT0z_KZc-qE7}T;~m;a~aDeePVfp z{~4{QMOd=bBDbTQqYge;VMQ>TU=DP8+VUR>K_oaAwGypuD9f;*8eESnme`7%(DAde;Y1 zs#7MWffM0z#|4NpQHNX*a(=P-=bSNSAo zx1wRllVzuRS$2^%qm0Qe)hhPQh~Zb*JMg8A?_*$6rIlxxLhNg9k6z~;O+Bd?5MXBZ zIfA4}9yKgPR1|dOx_o(|vsYFhLG|@y@=lgEZ|(yoU~assN=OyNz1wG>xZ6Y^tY0m# zM&KLbGl$0)N9x^3j+H66_^BkEEcyYHziXTWnXx6>za_yx|D~dZx4mIA_1l0RB}}VZ z<1bgI#+z+YhER)LW0*qpt2L6#{L(CnyI0J^S0iM%zxaFP62`QSZd3aDT7vMWT^VxLk;27Y zM2L$l0_1tREOQ|K1~k{u;DV0MzP9s3y)O$_H@9?8=RZdP$_8n@DY7g7ha5UXN{!Pt z+g^4T+T&z4C;i87pm>2OUYboH7+E{M0K$VJRdLj$hV1Tat2CE%qQ%(E_RB0Yeq*93 zJO<92g6oIK`Kagcro2#@Hu^|6W!4jez0kE77?{E^onVfrAmORQ(3{l{56NB-1z)dg zdHb$%rGF=-3k&u~IcM%uQ*P@OEeAp)2;llwfO>ZY{>QWHQV*DyYZ9)+=ExVxymH{b zrS4VXNf{7_z=ofi!pWE{F#^2H{VBFZhl{lfahOzOfI`q7$VvpS$;XPKIoR4Jr|7)u z{&Qi3sA5|!!>GOUuMFsUgA^%_pYyvf=8925nUGwR?;k)8nGk7OP*-U_1IC$Dc--z^ z;#25gL`rzXP+}$~OBu^s80ypOIp8_{50<~=7);%sTyh;Nu;6}X9$1Q~e==s9I%%vl z2=4qS%I(8| z7jY&DLl+x90xW1I+gh69tZU=^KP&INurCjkbuKKL&b}5G=?RHfy$A% z3vwFURVN9P2C*>a_DsH;n%4j_2-?AbJN(BRCG7Qjlh-L+dwXESb0!J-zN!#6_4|v? z`8J)O7?l&!V~v8qFX?rs=Y0o($F1M#v?Vl*o&{%SMUX%vts)F>+~YDqH_A*-_}Uk& zIQ#N4<*?<%ycj&9E*wOD+gS9dbe~Q>fS&EinQGP2F-9IAM(p8+er>}Kx~n9_xkO4e zzJ_Z-=o%T_TajgGwu=58^aw|;83jEeng>Y+ly<6;sh zCpmO_zc_h?KQy`e-7ix{Pc|#CK;l7!)=#f)ICS`CZOyZnRlNHnn_Q;vi@*GxKKOF9 zA_{m=23&$O$sGh*c{F=bm^QGV;&VT!PxtAwK*M!s4{VSJ{lV?jQD5wZ3}1V-fLZyi z0Pv*E;RS(f`WKmU-XpCy@ogO2cbh=!4p<7wTzxv0C@etavC7FVqFMlploPEX4Vs62 z{0tx`0L`YQc{TcPd(ic(OVa^(-endi6V0}rrEtd2}h&FfM?N;Jt#@*4Ss;~$i zzA3c*IyorApQGsea~VbBRW<2AZ{;w9vr}`L*VSMP9CHN=?vo>ZPPP3taT4ZwNd#*p zkymLWfGvGY9);nE#HMiM$(%e4O$d_Kcro3^SsLOwrGQA=Pz{dkNxLT>Fi;Z<`O170 zlnE-nv?TC*l8T1+4+%E!^LWL_!(1pPdiPXpq4HDa#tl@th0)lrH@Dtps!fvu7GFm= zP zJ;bcHH?2GmS?E@Fdqq+u(8uY#+FhfB*O}jDZ)p*HGm@?GsS>SZwpw|(8E4(4Q3#}! zmbuP`$|Q<#AU&5hT6cv$l&jxp&4-C6z|_fpXc-u_?K@1P2M>?5#x2C+LJQUWT&%vXpDI(haJq+?BMuQRK&HRAXDANtey4-LKz zc`J_9daM&sU%NO;(5#$-tbfpY1jcsd5VHqxYMJ zKE?xiehRiH3W?L`mBv(H-1a?&;;mVTwqQV=)6!2k?x5!#^*cQTA=G}f7;V{cxfsuzt}>i&!r zyp#IoN_!%a^M&M&JKOqD>S0ScN}!Z#Kjz)ERhE0R*gI2@pv)+xM07^EeP5^qv5&~( zGnlkX{KNB~qeaxh)V7!#0~bZdf8+W#GOuvxEU*nMKKq7@X7N;a*mMx@EMbk=jaL5iDuTF$_i$+~dCE@m1QtHpYUP(vo?vl1firn2rhIa||j2uGrn z2lH#zU$JQhu$0ziF|!nfTT}1cCfGNm{t+XBb~0M4&Q-uTY61I$?=+F~-MgA}O>M*; za+qu!ItwyksXpKxAl0&nU@TDBcT8whUQtq?D&c1tRp60J!x)b05Ua<-74X!tFde3! zhTD#y17JPVVIb{|`i(UI7qBz8|337{WM?fCfzq0h%TVm52{t(i+LmNbnXrQQqd4{8 zzf_Y1>yk(2RBdz6EqRG|s2?KR%0|AKLM&~_6ve?&%t^UMqoSxTgsZp|ua zY!jB3S~5}_FIv6Tai-=hiSi>%3a*U)nsr)Z+}w3{>_-VUjle%Um@`amz2k{z@)r(o zde{z{8vwVZ_Uz?(Wx!2~wu^i@J#KUR_AKoCf7g1m;_a+ivY_o(CDd1NSQu@b1pZyq zD~;n?S-CBo^RcC@DUa=8syCK6dCS&o&9lMTi|xn;pSdmVMrK+&qV&zRh13~69B4&yKd4V!y33BCF| z=UB#+rken^Lj(O#q8mM`a6k`%z1rc*H}KuW)qnQRlAsm*(maO3Z6F#z;LczwUZ{24 z>a#C8ySi)8xA9kYA5cg-(xf6XW9Imw8=p#P855+#=5TXdZRC zBajakx2f65jE}}ymJRatvdIYVRKmnepG0x3h*+PgX6r3z6z`Dn=nh6KWjp~z8M4{f ze&tZu&rfZ|4lcqc3gmgKVJCnr4)05)DMhWzgkRpz|!bjn(qf=2Cl`ushU&8$}OZm-$Er*hBusxm|~FHPct-1Ey_ z(y@;KPgNhMv+G51w-#X1l53+Z%m~}HTlh$qA~HyPuFZ4BfyM7eTK<%1jziW(!h@8w zb#R6c!wV_PHWywM25Mg{Ub&NnV>osrP9IENkJBe~$paUH! z?8BI(fo!dcZov}d-snaHDmBWUI3h!$LR5Sbg80*tx}|%sTvR%1Z2wOJW_v|RN#eRu zbT55MEs}r(P2kzI{WA3L!Ti}l=30rTT*6x*a!I7VBW5FbmU)i}IAqwiQagZ*+iqH` zLO7ENPl_&;9sFK1%a7H9b~xAN)n4aFcr~EdY z2JzIO(W!p#|0pMjP&TJ34w8QZA0jI#1k!JCMj!EJy=&M9l_!LuUQkDPjukBDzC#Cw z5_G5ZgLBoUmYiduq`3QXT2*#bDwfKAiNaFd)HqYoDm7VC{S-2`BSzW7)C~%}ZHopO z;&xQqwLc4jqoc|1EG)unBNdtNb)&X;jLGo;V?%XKuGp6H-RtKreDHL;#ver^82g5t z@$0I%eMY=pe&^6ON}nkY&HJZSQiV*ytL5`4OkPPod3(LA_91^1#1-)4JSf%;l%CSa zAvCj$W_~@$Dw_NH*4p z0Boydw*$oN!;jBnl4SMxs*hsQ)a8$7?)>fOd0C{c1&XIW6-B|}F}e~@f*hHUPWJ@h z8EtE+U}0V@?7#5k$m-FoT5c5Aw%-5TR*e>B5(S)rh*X(Q=!Rj{f%}QIAk457H8IpD z#%+Uzmxi65tE!1iw%P!2fU%3f&U-dQ^~&UlNlp<{=iDMXjLIqIoK{^-gr?bMlDRa# zwO-!l-i2Y^o}*)D8DX3-f_6FOzhYLT*L0X(JO;s3Ga_Inz6n z8H&x~`Gb&7gPa33A{44P+-rSvU|9Dh(aR~^cxE$4fUq|R=@Qj(7rasE`ff9Tj36VV zY~uiQdRgLqPrF!-=^Nlb!Apx$6o*w^43tlo=!h)aiC*WW$acCHkJgf_RpR0l^-{rl zCXuR5zP7PPA25y)5C1l9<7H_HtYXOl$p--kfrn6TBi*t~K*6tHu&gp0Y=&AMF!1gK+;h3{Q%9p5esL{A(q4vODe@J@v zb2De@;q?i{mc*;5TL=4~f5vmP_9t}4-nvV-SB8A7v(i^$@pa+NV);$^=nqnJOg^8_X4yq$bA;~P4J`9`%2LpC(q?rU>=utj=oN?1|b|>vQfI{=H zS=3j~59uKEKUm8GLPtK*Ei(CzY2DbxAxXsH0`}nm)ZNLpk#Q{%`YwzZW7$)7m zA7Ba0APp`#tz|5(A6yi7UKO+S3mZ*C@LkDQtArggrIMi zN)#K@Q|E~r`zRxHE4DF#`syvS=JAX4`6K@EZI8m5D)^<4*S}v#@-IR__ ziyu3$6kq|-IUH%biJ-n!|LG^#QS9nOatuBfV_fdKD7`}l#22bbdEI-cYhwmPk{t0z zub8i&ND|t{9-6;oIoj8Qe`VhGSw)^s5%Xf$B}k7y-TDUsHt(YuCc;f=l*ae@ToPu8 z&p+4WW)``;=dm}V2A;;4K_|gobca9Q(iSqM*q}hwqD_1CHXfcaA~-)9ny(~{QkmH} z3rY3@;K#l#F|*`*p6_F{A>7mh@wG;1!g;#TG1mBVF_1nd%Wc{E3*s#%k za8e%atoyO>Y0q>Y8C`OugEZ9?Ex+X9-ErV{=2vBP{!H3s11qr`J0qTz*PBw8E7q-N zN`zYbm-RJ5HZfpVh>2Z2xO~?%jLITAv78tK?*3K#S63$0#1#7Ib5N~>(Bm)sf80_6 z4?6+3QqJ0ADi-nzwqHV0oyD@!n~dzFe*5*EEa}DjrJ)vn7)u{k8|U5lPeuvo4U8q0 zyn1((1j$vt74EN+Og94*Z1%ob2tmOqqak?#o+9Z+@7CwOV<@-4#|mWeac(iy2&Ig7CKy&uM8=Mv-UufZDdN1vRUk?E z_p3HAZLUn1Qx)@-!y2u#gA%oWC9j`V#>D_UU`mA18h#4!6b@d7q^un47KzN2L_r6whrSn^@jh)0vc>X~lTcY=D4*Zm}`a<}6w)1-i_tad_HD3ZESXjq|tWKjNs1 z>5@?>^ohwcUj7s+G6$$&=j*67yNVo1arIe36wouhkHG?y??^~Mgyw2r=&pSd2}4ui zr^bk^iXw!fJj*#}Lr|-{-uimJDC#4~t<(F?C^Vg$8aUj+*Sj}uW8v%9RotLV;LeS3Xhu1NM}q5* zv{4kw+&qMoL#3;eu!=cTM%kd&zEW5yl=llhFbv|hqc!wwlM@O(Ww21T-Xp$bj4zm_ zibdHfv%fu#Fiho?yfxv7^bVgf4&pNaDn3}p6)9H_$N+^lV2Vxd@p=}di zBn|)8dY2M|vsMs6z=Y>^RHhEQ3UiDdGc@#w+~Il9KJwHY{!Y~_%Wk~)K5&v_)QOb} zb}oRgc#)s^ci@u{etEwKxX^gT1A=iX&NY1Lny5)@t3>xWL9nu3n%^wgtzs4xu$GQX z%rE&{fB$Ed{0h7;0T$%gZ>Q1 z%CX%@YZ&9p$sQwXx{zagDwHb=hxuxYz~CLn9=mPW(QW*$KYeAGUy^c~R_ujsbO`Ag zt3YQuICQ@cu!oy%`ivhORDu8=w}Vr1=fE7Mhr+McXX_?dyydqV;OD#?VOTTo-6<`X zpOF-=sNPk~1m=>BgcC#UAVA*P6T(Qo0dhA~Tfcr_w|4XC9l(9fV( zLD*aVj4EAc?WO)WiqFC%y?aR2%kB*pw$?GHgZF!vXjp>_}M z+oYnRh$5kW(Ip>kHG>POC}49bo2M$Cf3pCRu08i`7R!IW2mONBfQby)DA^2!Izv;pTn*fe?SdsT)+xo1HUm& zTvN6RP$W10eiTw;p47GkZe}`VwOg1+xywTE)#|8t?lR5cg$)K>3-g}#_$HTM?n*8GrNjm?fw(8-?Dxy)fQv6rWp|wyu9j*G0%w**l%m00 zs*-FBEZ2i;xL0LKKr9&t)-&9qr}Wu`a*Z+74A8Dx^KhC;QpiKS97WBN#m)6Le92gIffZ9>HtB{ ze&P+RI9iCRa9t$(Q`r{+KznngdNa%d+jpzAR`_UdODRxioK4--kU`SI>G3eDzDf;! zRJ@#?UFrTU-itQK!y51>mV*N@!5uKUuL~hUisDD4E}=f=h#}k=2jH($pwNv~z5uVB zKLjZcR!oTHj#X!Qupsa76MJ2UX&97w)~*<1*9MN*)lno+MEM)`cY-0$r)Gp(fQuG$ zXL1i6UNP17);Zipl!wijA*h*be8^Hp^g$X21-m=}5wZq52G_IoZ>O6m0rrs56jU=$ zB5ZV@OzM+T+e^5^Go!;G23?#33LS}iqiZ2B9`)aR>-h8o{7e2@(r_;?s33+aIThh{ zH|y^#3VSgvM|hIfwBLtiAj`QoC7aWuScQisj_P~`o1`)F?_dNqR06D(Y#QvhXs;mb z{A?WXkX3d(VMK+wERHMf*@Bf)i9TZl!G&GOBEdR1gc2oHJI9u}0L*c+E4ep}b96xY z=RZb5(R?CumD$;QS*8kEN7SQd@Ny{wrB)OBR>f5lsgS@PoHMVa<^;gk-v!IK~{FFD9*NhZ(QU>Nlg zMZvi9r%zKd9{R=#Fcn*`TGFK%6-cIi4&%ix=dGJ%W|WI93$bl`IHHR7XlFc@qVS?6S!jO$ zf;n)j;Kyw)^M~6;!^Rq*y>(Mu{}J$zeKTKIjp$Ds^Fb>x9yM-GZXh>}UF)5ivbxf) z(JdNlL>BY<0?7&qWyW`qPprtrgrtTpii57*-QDhh4Ab+E5FSc=30rJ@)8=V!9o!1R zjO2?oWc4TdF647_WPk;7UlTHRsZWcca2)o;1k-{6=DT=;e2-vvVp+WBN}5FPEm{7q z1J935|Mf+Z2>29eQ~$E0@Q{NKI!#J_SlkORpPyAen+9D#zwfRDgu@U4URj48>jIMl z8q_K0#AS5-m~iB%Y2luT;~D4Ps?U5gv|(+WFcY%r-Cc|i-HAd! zTgPiCrSqfSH)+=FsKTQ~(dSBr!t7LU5eP>|maP)aHMZk?W$mP2aGJ+g#rL&RN{FzW zcUPcM!)4yJm41N$B@UEhz6htwqn{k6(l z_mvbQmVlEi@XuDSXj=WI(shL)t{2f{*)JEj{@^IAh8^l-Fbc2Zcf14zUlP>HL5y7ndj&GWo&MVJpHTvBsMWnVe*%26Nbz9LqC2V=&A(SZu**Dg@ zy;=(Tnb-URg_o7xjjc0!PfHe{-zc6;!>F8Xni{CCy-w~7#dLOG>EiPL>pLzBgnqh> zHIDMt$qjXgUwA2yqklev5bk3SajQawv;Vq_>m#Eic`GZ@(3(yc!67U6eD2h}SEKW$ zi(?|rq?me;}Ok7tAECLXi=Qmf(4k#Zo(RV!B+&E;l%WWozn+6!T>Zm(UXA}Mx8<$lROmAo97^RQ34_*!om@9l4#|l@lHlv z&t))#%2re6p0JWj>fpn%*g>3hkkUrdA4&2D2!1R<$(i)(dXFw;nLS*Ii#rLQB3D&K_n;HsO0?sd2MXH`5l9S9BrmiL_JNZdf*cK@U*lV-;noO%r7qA*$#VaZu=MGCfMpGgcSM$H zj#aM0H@0wJFsVcn$ZvrD%|b5RWzi@e;01!Iz+fY-2U>8c z;U2DvrE2-~fNN43PFOZV#(#Sf!GK+`GTNjid8=xme26E4r5QgcrHxrtsW@J@DJ;Rd+nUWT*o!m(AmKY) z6MuS8gK~lLR|N)iwlAAWrMP0BW?&Q`GBj12TcWB_azYA_|DZAm&{1_wo&S$q>zgIk zwCaL&$Vp?RMO0rW_#cR-?!_FE$)4)mI54Z+<7nKpu+LVC+Khc>pZ4?PWh_&`nq(@- z(NI;|K071)JeN+UbMXy#ne@mo4@9@z3 zVu8B0p#Y2uQE{}$l?kAz{Zogs!SN2+*{$Xf+sEyM7P?)G#1PqAc%cm>ul7_@r|TM@ zK$bL4_)o!QUApCT@jbh?0);==#LnJ{L@2Hqvye%Cth~JBq{AhkHP!$sbQRNy8T3_G z1_2Oou|7mHFBF%C;{%tpxf~O}uZ!sC&otW4(J005+92yHJoCJVVwL2>gOuPrPH3g; z>~??f{fXJhIltzb4}q27@J`rCCppYoS1K#WbngWGP8G60@dt6`^Pr*0gYcfTTyYT0vc zGlH~9>zQ?0?AUa^m?`(${Iu8|;uu(Uymol?TdabwWAX@wztYZr(cCFq+YYa{jiwin zNHf)s@Aum%8-5Y(mr9P?mC)h`8pAZfyM87#%cBb3O(fgZC83&?#ctPES2`32_K(om zKxS-$YUZcT<$1zXOfcyq?-va8DmObQIv!|_)8llksp}TJ{ds*zg1jZZ>e?u4Zhn&^ zZxda5f#JN2ZjVs7le_fER{IxWo70}M zw4OvT|E|_*s&s<}W{T-74b3ISEYs$MgT1Ej^ZNY%h>9&gT7U>Gv2GjQm28bRI0&nT z+|<5ODvfAsFGvHUI~_TC<<3x-eT0GbPJ%QH-9K{bp5#u`4$e@Ci#F4&$*xG_uvHd4 z-C+KTh;E#2G=ZOL@TvzhZeR4*MpvEDAjy{x%q0v&-R*@WiC5PpXiIUrj%8AuezeY% zP8~AlMfNJ<%w0*WjkcZF*$K84Mohto7wwV|g~w?iyHcQRf@0pCf2EKA3&#H{>15#w zfD|`SS?74GYt}v{K`LB1;t{hac;dZ)wO^9tU8uNSoO5ysY`AtsqC1E$>PnVN7Fvkb z-biBmFk2;=vs0^$CW}-86rf_FpvjhLm`(2fR|x7EWFE-hjJIoB&YC83;aM4MR4*HK zY6%A<00Crhf6@Hu%w8G^G)Zj>vAy0WbjfXHjT3%F{52R`211?jNmfW|{zHVszKZ9u zquKYw6)czI#^sR48TK-EaKT}C?wZV^C zX>y9e<5gzRSbsL#wHko*!(L636~G&Zd6G;L z+@MTXNA_@52-@14r{}Rr!~on~Z~UU#jsr+TxCTtT$R*hHF9)+Dha)F!$`|Y_^xbOR=Is9$i z6)UA|lufNg9&I}uU(pG4W`yeAEnoa{9rG$%!^ifn? zQ)$$hH~4+YpJ~ZGq2p+Xj&))X`ur*ga$Z?P-Z__S&#_3+aMw^lz#QQLaE}!W7(RPa zw+s0|*#B237Y0^eiisjpvb!VRS{lz{mTwcyE#V-9It>Ylbq!faiSU0uS>Z1-spvg+ zNcFG?QIyMuaci_@WkNhQLlb{==&TJ-xEj(;p^gnt|7JD^ZPX7?Ap@|U3ypB&NwKx^k7;>oB`7hP?b zhBnl54lfoL-bI33h{MglIh-cp{YkH$%DN5jKs-b~TsoVZ>EVEyF_(P1+79>d3qfoa z#>*yz@SkKHUe6p(juShSx&tZsCSyOhZlVuOzl52?|AdOGM-+st{x5JKYA9dL?B>`{ zyMk!EU33jc)ozU3o$(>Sfp>a8^EGWJ^xNSXPR`|%0S7Fe^d^z1!O+s7QBHpRU;Abk zbrkY=>69JBLEMVG&p5mK|L`s_U055VjYWdGx;XTScpFXX&OcU-WSn@b_f^${_6;f{BPAV2JwxUlIW_r>!$rVTb)c~Mxr4IcY1p?B{zCkoL3|wd zS1rMeRhnZ>Gt)E7$MaL++*DPao;jvnAu%s{*}A@rCb;Z>&l^)(w><$7L%v)Q+(#v! zw`l5K8>9SF=`s48@s7)E^RTQ(^@~_ySkD~PFcx7<3NXRoH0LiW6IOtL85#loL$oxy3> ze+ugj>=s)Pd;>E)=5&f$W}$Za!lF-LFj&qh&KPI8(jOxBRpB2E$5BzlKvGT4JBl-WZX9 zm8e^;4=<11E?s}1^q+e5V(u2!&Un4V+?Rvk%IKPj0T8{}SIRjj&W!>4E2*z+uGA)+ zd5)7nJswfx9ogRaE9AY#zhm`)d4&^he z=-K`%`(Rpk1w3%bi9CkIi||Jl-7+vG1Pj&ya&|o~0%9&@c60aegOTBa7AA1*6E^r6 zj9?EhCvMcXiC`B-PyUk~nEgptgQZ*_SAbfY`-s=@m`Jlk@21v71`c%bh^aX4%cr$A z^$5banyVBUAJ<6862~A_R5Qr^nHDJ^QUJl)jKiH)+9RH%Q71%X3ZHrp{bwuwofCSK zh7P--LA~rtY>Dz)ei@i^S~GH3j{*+xxzc7of^N^VQBbBdd5l&MEom2x`WojBVVxj6 zFgO07gBB4dF=gGL7K&=~d?TP#)CYW*MHWQIh*N#a?m>XGk?NclN z;YjM9BD7b;V!yC^2%!W$d5TDc-ztRKKr$(FW%N2$N#^R)_yC^j94wX|6Xm=-h~TOq z3CtFhf(F%p@*^_QQqCv7Zn17QXH@8X9fJ*aN{AYFS3ymzq}THRVr_LaDNw6{=1WQB zW8d%d`|db-G88xrPNT64OSZ9wbWvv$I(JNyrrY6bddFdn;$y)w1Ra-2mg>f%6us`M z_V{i4RqTOR{?$t9P|OzhLQTk()FnTrQ-%E@e7=qn*qEymYAwpjjtLp0fAjABOJtlM zmCwolkmn#cB+Tklnj5QK6q$tl!4+0pf#paS*b^-fphwr$c924DC9unMEiLz+>bkMF6S1JMpE{Aq)kv_BZvDY zN%DaL%bfO>K|4e+GQ&1!G(|-|?ViD9y*ZAAe?Xy>Io_>%&HR0RL z!)7LkOts$Z=>P1Q_vv(@v7BW6cq(1}pGJ;xZUB9?sPRb-<4fk4?8-*I)f>@;J6lsn z;)=r(lvm`AEk#(%-n_#3ncEg6vz&Qh_qAKm8-{iSsN+yEm?Bqgi zd|Md}AJ-AHc3DEwYDBkj*VX?_w%|pTl~#JThXU19aAJ#nrvjlwuY4gXnEfhwgr8z1 zPKzKzP#l*K`hH$~s9KX3Jm`B)aaG@TWDY@vNz3B(x1|PA92}qAO=YZAw<6j9wVCxA zGtE==q9*&dOI^5s;z>N><={z`u->G{ov+JQa;Ed1Tp5MoB+W?TRWMG#h+RzTMZ(3- z<4#sL^Wm6Il%}HpWkSY8E4(GUzBa60r>XGNcX;z3_0&uE=kcE@33uQz!R zHob@gu@KFilJ`3Wm!_obs9*XWrQEZKzC5d|`MocRZ=X`a!9=gPT;j1axlHkAX{`Nj z65&Kh5D#%tP{XntCLU+iUPP&L1<-nwVN-l8j-^*0k(^flw`SzDVIx^=t8*}UH$&jm5YL?N`RW)ddJjYb z8rG8=6Em+xK=EJe(F9}p@1>f42|M}|8vZ5ENGkitkKZ(fo<@%C&>Lh~cn6iFW^qp*;x?zuSz*DM$xN@Gz=U06c&9`9?)ayN^sM1t{_PPhH3;Pr#N$w1DlE5C^(ItFz3X%AA9E z-np-QZRvEl?eZBv+#q){{Lz4vU{HHRb< zBOXrn+n*wjUV)eXpUBP@e+r*sBd|LBQel#`TIu75DUOiH&9yI6TITao8Bb*H<%Q#o zvC0&#tS=7ael5e(Qxy4eqQ@8xU3y4et984H4L(R@y&rWOof*4UM;>~zzFHQwlxcF} zo9O@r(5JrPFJlDt*fVjD6Go3_6Lih46 zxF|1|l;@(uX3J9_ocMAd-f^VZdlS69qWK6o&8?R`TrT2mx<=?j$YX`;8jY=c%lrTe zK%G4Z&a5C}STcIj$!{9Xcw$)D;a+##uN-?RknWFBGWt>2>mo|_WChYHCk~!JbZo3D z(6rEZ0Rj~3ZT(a?$7A2gA2vtGz!>67zG1B^1H$>BE*viW!f1*OgBaXvX zI(oPQA#Jaa{$Im=lW^$~rsggL`B}~nx?G8hTp%b;R-BI}m~PAXx`m}rM`{p=?zHEZ zGI5RQ_HX$H8IpH|K-zm7p0c@5nhL zZH*!Uurs@EsNIjhw2}}6NlL$kjQJ_Px=FYi$WIr$ z{FiV34u<}lwVo((SAIv|!7;69`#2K|{Ot`TRB_QCpaRRxIwHx+9j;J1et)~B0h4Tf zFc%9mY~ChdhtTyq4fPm4G}PvGj>(IihxXN&|F1x-zxCauTG|_}dR6g2U$eC&c5gGb z`*jP!lw{`Ad|oJ}+c9Br(Q>KQ9rakaV;jLnGqE7vVWoEbL(4c=HlBEcO6=#}Fa>IW z0}!KT%I|y;Z7YYoY;GXivE-TbKOdXN(b`MjvwpJ>T~H4b1L9FMEY?CzXpbW>JS~7> zL^gK!dqwh_2OLUIKyELAg`(k77ir5ntS*6RY9Pv`nP%>~K1y+jDoywEt{dDZT3{@i z^L8LWf4KUzSgO!**!d)1&g0loaH^eQOvVqNM6J9Zwr|ax(5k*o{h&6socZWAamW@O zmC6l9wbI`++A3H@DZQ)HguuyZWCIsIN^uq~CQ=fUHX5M;%3?EWTzDn=wBO8b_(+}9 zeHzI*ON)Z>Cr=F0h1b3H%3|4bXh+YTT>Lu2t9=wz7xSRT70v94_TxACrRj29wJ1Yw~4Q+8PUY##jT`wcynJ~a~-J}5!k3?GjQX3XI zA)jUW%ZBU90*ldBS1O7ttB@6EeZ`tno;>gHB^GTOHtt10genAjYjhF8{~vKae`(cc z4HM)@7yhEmi=#hGOX^K`k$j?kN!1*l=^hl5xgFe>5R?jpd4G$U$$4GuEK;2cDemX z*K<%gnY&Ix>Ps0%83I%MtPd#K%ei~yIe3Ioii6)v9|=eYoaa@w9q}JDnNpOp zjmPjz-HxC44B8iMZ>#9>_eX}I4o_kU)#X?svSxVEu!+DsiIiypspk#f;`_ttu~BUH z@4yunXc;)ZE2Wz7z&kdX$J1iuWuK-50(3~~HTo_HzoMmh^Bq4AN2Y><*Ejv?e6z{v zDWc1(bxXG#tPR+0$vUX=7zjT7M0X{#^V(oE<8Vnh#QS@>P<*ZUY}6rogHey8>Huab zxCxYu0z-4jP42gGsCX}==?}>GZRT&6)V`)`NxtewQuX-g5%En%wszRzP@~U{*wXK9 zSDfNlzb9QC|f{a7; zUks7(&%Tlp9lvXt+V^sX=?fC{AI4P}NdO8AO0xZ0yjBgKNxp#c>H}k$slovuo4bjH zhV@(X8>rnXha`n;cc19MRfLWt4trz2jdIW>*K^41V$u?_$*&quo>RaC|g64fx-m-TrW2(x8vwz4c`f+vw@_Ew?g2RnE21s_I;P=G+%$ zSIkOm9eDs;9KjG*ftY`&+DHIkM>>~JtE4dXe5j?oWS^1gGO)t}dwGRN*9qU)LP*X_ z4^?6rMyl38>u5fUnR)q4!ZwX2k}4kcH*jpSDI3{}kJ*r8lLoo!qjB~wy2Z`NbE;Nm zH&%Q-5jC-m((r~Um~y(6hJ6?ev|->+#tA`X|LhHaC`N#Ql?S10k!-+p3&9$+={Zvp z`q)wvkfsfUrT>S|{z172U}$C=Gn6Dyy*&ZLbxb^U>pk-p?V)vB*IK7zgaE4Ky{BZV z8}i;emgaN<-5CakKIAO$P*DL|U16{X$rG$`k`$!U4VI3t$>r-hN1Y@;gz8 zqkueHQ_eG(dX~g(`2E7PMY|m{+6M&a2kuO;%rYM_2fP?t3HDD$6BmAY`>W|o?zU>8 z9Z}9RM7#+q)?+TI3Rmv~62)>onx4Z4KMMmWj1Ydj$LuF@)|s)a9{Mei5AY*q`46E3 z{5e3-xJO_}r!0Nz%Rrq`RWQ~#jK7wbIBwAC-wBQq>vF$z~o$sbJ6qf1dv5tJ}r5?J)Vi#kWn(Wl7m{H+bz9xHJi8 zg0hlxj5r3rwfqA4S9m@&x|Qj;&MAJJSV$FndDySFoDX~LjyPxaKKuRk^L`=vePE7R zrr0&L|4+<~4ao$4N&vFx)70-{@XMMpbtM>$5Ttp4@(qqrPbeWHl0ZctcU;BMqiUKb z5j+r<@e$1FZz@+z@FYL;52Y~xrNuz&wQzq1lPTE%Rc8?$*>?7DG+70z6Dn9xi^W%C z#*~8_0qMIN_Dc>r9YZjXx>iZO?RxF?5Jw!d^n3ms;-0!^X@N)lkeG#O*!Bh7J{__30xvUC&>sz z^hMQI)0Nl4bn=XA=z+~|EINrjarJwi9j#t|76Ab3;xPXMxv&tCdgd_F?%PsX0HBlb zAks;+Na}nX6@WYAIIsfSKBrWb(CNdd)d4NvJomlpnzX74z<7Sq z68x}jl-31>L1Z`Ts_=QEOL8ZDK&0kWF~=U9u>Nf)6E%5g9SiEzY+Sv!v^DXQ>8oJm z5(F{;CP;A7L>$@1_JZ=Yud^5rWiMi%MlVALNpkMYyU^{E)v2R0tn7BZ`&Dp8&9SeN=e7i(wjmS-zhsS~7op%_d4T@L)y^Bwre$8Ez zy+sLQ?ZHKZ3(i^eCQ$Gdtf1zSNIb_wmJ3&X;?>cQ{)tTmz-syu3W(3&|1WM7b83_+ z>44a+8_#a52ffUnYTnl&X7HI$5T=KlT|=vuObm9l?hj?tCDA`U>S;>3*LT}!gJ#@$ z9W#bhhB*Xy!$^jXJ&QdZ$o|n{dB-vg3~z2KC04v3zjPUa?$=nO<% z`5=4jQtp4j;zW1e>;_zv9mN0_8rH9)iK!ZU$C_>iX{Z8QqP^-;5z3aI_@O1I4yicnFK`lQq)pU>4oz(%~wj&CE@@!QPDg}V73 zvDkZ&K2DK9iKtzw1*Q4axQ-K@o3(IqW+IZe%tFkVFyNaHW4R+0^2!%-nC6ca2Q?#E zQG&?Bvtyg_WFx3H(f@R!>N{~h?{&N~*N?p^iTORcW9c916lOd6v7>k2#6}fYDwoQBy^D}e75R{n!Le`jlvMKES_b?C&zA@v zU~_4GeAJLlA4~|$m^I;C54uAErwdFg^^NQjyKEvkEOl;FLbMc(6I3I${d1t{%Dr`b zu3{|2XYscut}i&jX`~*dZ@`X;s?R_q?TyZ*<#rGw9!2PfpvfD1(Jqt$Ou&2K@{~8DEn}|vlzOo(1IGDi0>prJ%B?&~ZK7Qo&);yroV9XgV9q<{Plr@{u ziN7nZ5xPR`i`axEHSU=Q*xs2UKd<3xgyb=AKLZJ%hDqFaU|cT>Z?c(VRT{IXKh`2S ze~kl56ga??3AB*J!t%R5RD~64$MD)ulT)XciNazHBo1mvXQMg-#T4?*{Lu7|ydZPu zr(C~_crM;d;xtHNi9!@IS9H)9Lt(P?=UN^hAc+z}m;bv%^PL^W!wCI(~~ ze%!-l#Xc_cr-=Vf65G?@<{eME;d1;tWbt_w(+{;s^|hGd*ijr@cb$U?*T@$_$kIsR zuu?f@pUi|TXIhVfQ}r!1`&er-HL>ZbwQa5CTqET>9Rk0ar0>-}cEBacT>bVC=B>Fi%z-%HBvjpk?(DIdd_Nj2x+aNR-~W?OZvEl zFFF&t0t(&=*nRjK?zCeNF|3ayoj&OC*FYJ+18hP12AZA!X}waFe7Sv(fKjiSk-jpv z|DyfuV07{4*0KHg?5xwNY~!iby|PoTAYJ}&HF|{#ur>Lu+So{>Rr4L69w#bIoXDHT zeYzyo{&-UI=y(~p+&Vq+(?Jj2J8B0#G%M;zQf?heImoT^e%D88_0!bC>QXhT!!PG5Pa!Kqdgb3gsh&cK9{{f>P# zS+JR344qhXPh@q9~TY|6{(?w_1 zVS!gTuQ7|-4Jy+%tdfZbD(Miy%(Flyo2-Fq3V7}8A~-S;lB`8EWPHXI=03YYA$v%4 zOp)0h7y@5N6%Ha#fd$Kg!93r(eIf3Wiu{u3peWPNhaud^qz)7)7{_Myc<>idny%Q@ z(Hpm*|x`WG+GQJV61HnCl0sV`#BBvw-46 zGy&srzuMQm5}&D^Fk{1iVZSiFH`t4A)!bg`MBa7rf=UOY+n!E+=fI4NX!N}YEmosn zm(t<7IM0>PjREi+8|GK<5K4-2Ovm?{E!Da^^U(p*)ES&XolVSGvAHmluh!suFHz@# z8le4O2d0MR*)}lh3ENj#k8l8^Q(O7>`##3l_|GLu+0U;~`Ft@^-T*9w+b3{wlG3`ic_9hT1Z0SpcvpSr=L{ApHuw0rTIzf9AAz_uY4 zhR(a0Zvd}69j-bzt-^$gl_WTnatGq|$tEG1lP++g-i3o-`Us#p-TLFa zK&}J`n!T7H3IZ}`LlGf1>HODIU~{SD0?5AXp7D^>kNdCIs55C4f{cYY$3}!g_tZhf zjv@e)MGG^v`vd3HDCYP(KJI)Ek+!H1(H_)!A`P-kL2Fl*3SbwD5u zZaJl9LMZZT?DM5}?ulB7#=WgE+y0EpR_??)wp)ekVG31PGq4 zKWAkOEOE=gQ&zEs*dGmUQL#*a$}LSR9e5hvt*kPro(uq(I(mL?LvdCv>PQ`ae5DXB z={?a`5i<&Ds(pn0zTc`8(Ca*;Vynh+2%z{)yZKuoQV3(iVIX8}GZxv`xFrVrqoOuS zMR$T2lGuumd5ZMT=)s{)79{X2YMDEI4lYs&K(QplC5p8FnBlhOEC<=ZZH@!ee)_AK zzg>R9{IVFD!zXX7Uo}Ppxf_(9PYA_e?wkGki-+p9ZO94dvo1eA2pUk<1lTIkX&ib1 z)ZUdr*!BM2sEi$@U_i%^vZUAD1pyl4+DmO<>j#y6Ce`UmL=8*su^XEa67+AN*MSJY zS@8aq`Yq-VZ&`g(@6Lwg<+Tdv!xUGs0L_-P8kwaJrKYx{cnmJ8=fEH$?pLjxrMMOwEJ9Tw3jq0AL>?dRHSae=GN1Sd zSuE0Su0esmz$AHKL@XOFtcsE{*9oX1TfJ0i4(F4V21=N#oZ-9;>;w8aRw)t34{2&R zq2@`-Fyi?r*dfBu@s_;yEl_Qkfy<1yPH_zmfl(EJ1mxhb)m`iIH<-KjUTmK956;59 z$wp>cRapo?S~C*BgzKZhQ^R%u@BC#rcY+GZK&yUWHBMB+czdX$wmGP?KhI}6?5)+3 zpX=iA#S%O)_I*i8c&;Q74JoMC;yb%~r?sa@i9O~eKayHDtH~obdl}q9tuKBWMEg51 zWQB-VXDn?qPJ^MNXwB_BsSL6`2#HZWli&dO&D^8W9~|B6tNEQIE&T@yf&cpJ8`H%p z=ANMQu@{=jz6^vq(;bDy=Xe7+V0D|E@K%5I5EYTJVnD5w*m4YV=fBL}coT$CQ)B5j zbRxLfa9_1@SdkvBlR}Dt*Hxtco1WuZgqYiZ^4j%w0E!R_xA;P%Ey--bGI>U?RZ_Sh zm6VXWGa7G0^v}NozQ9YL6~NGhMu&0L8W1F9G&-dc4;*3f0&-Brbr?p4H#3!~N=Edbf=oRKZ_Dp6~DqJG@vYx4x=T@swn4q0tDn*z-i&{rpXXH{I(5}RFac{7*6>@_z;XGoH>7OfG6^rNI}7Q`)~S@@GFpq|J5J9yGBxSp{YwUF zVqm74E(%?yxmLdDE#X5W_ge0f8fUw;9fv{~M*1+rl}MB|QsNQp$KwCrjTwa8y#r(+ zm^icvr%X6sz+_S3&zP&0Lr{}h*g;pV;{oi(o~>Ipx-1*$s}#n(bOk;eXOyCo=0=WD zb}pQOQ=C0az;5|CZ)(mT0V9|>)X*F|BxMH(m6lzw$I7>jG?{7ti-EI_6iULHuY1sx zovJoERT8x>7ZLabUWQyWmoCMHIZrRpm<=Yk^wW$*_&{r;Jm24#?F7CWGK`JB-N4IlJKm4VL8sdgrL{aB+aoG516NKqD zLi;3SAKXVa=~bNa5D5a}&YCRp6*7h~>tbM7D#{wZ*b@-XWh0QEy+F3WnU*J;`_%)UN7 z|Cr~#6-O}#89WB@D88MFrQjwzO$NU&W2;#CM3ILWe&TIOtDb{zc~w9WYR}p}U3GVr zAM;CC&;3e&p2*h$SmOXaX6W8FpQC4zeNos-)&2Ea+?mdtAs+Q1yFFTM_%byNE7X!e z3wkl`DCqj%GLL6hY*?A3sBcJD*O`mEP`6agR zTioMENh_KRziVwGX}=3XgA8ync0C?2Zq#D5QUv5qFd0xX_*VAJyHZPa|4oDID@b4&II8z(jxaMRxq z-0wumHsVxnP|!Sa;bg|(*w|d3CWVdb;C?r01MLyGe9y52(oP1===gi&5@DWwyG9ru zv+xz3IhgCPji+5NTX^T7U(u-q&1>WQ<FHHU4-vfR@_ICOp{n{J{W+2rdn5k(~NnTZ!{ktTx(_0~Tkcb5OK6#z!!j_5&wqK>2oF;B=yL(GQt%1+cI z)r6Sjb8(yBRcA#a0}456zTYa9eAh(*JE+zu8Gk)DYNGj8m4x!4jbMfB8uHZpo7eAO zz{bno_#-v;6=Yb*EMRekePl5Y)jhSdBr8e$=s&cB008DLTd1j1UUQAiArJh@E5YsJ zzxvUd9$n^NYX8jAuT`dgC@LClZRyNV&8nXuI%$~a;$v+rke#ggNJ}nZh**aKf6Rj| zMi||%S^q|dA@8KfV%hhu#=*8j&*1splBb3}0M5}#hLq|7!X{BBvI4}0v`y(_iX0E2 zot@XOAaLh>MIB(JM8TNqTFpIlAMVjXy(zDVnT4PDkx@7z016GT(4xYT*h_3&w6$F4 z;g_5XyO(j1g1M-sVh)N<)PhY|79pM5jTv^<1~FdMZ&S}QO4GB|8dy6$QmW0gYP3OU zgZw7mQYdhV=fVaSDnUS$)pxGk$7aq7AY62N0&AoHNiY2Mb@4ZWZDOMHkdpuvP_Daf z8N~`j-LC=ZR-*@Yb!O9l^!7E6l+v69`eWlu>Li|=g39+(elT$XKulYYX`o*1LJ_#C zs6<)5X9 zHJ2ddL+^798g*8-lwhK2XAG1`QgNbhSl8kubX6o}>Lf|*fZ|xkvJq2eBTGD>mM4z$ zw%-{N{Kaf@*ZwZyko7DsMNQxvGLPSNoupXjM`!;1g!c*=8#GK?`9mo0UrSgn8Pc+k zTH8sORY1>P@3-ZZQ~MTG+^U^$`Yl zS@g#jO;k!t^hI)DHom+iy^s9nYysLc9DPzlx3;Rb%z}DlFxu+f@FwNh4jH5{3K0#K zcNin?zwZBB;y>SuHZu}8&U2Q#YKPq~tA^96vZ6QT&go6XE*ZyVEdFEfy7THzS^Ny+ zKiR154>+NqWel)etERy~s;A=NN}&>iay!6tD-qR; z;pVX5LS5nRW>9i8oYZLHE|@`JgQi0iuMPgF(LQz;NbeGJIm>=C97DAUY}ue2aox>l zcAx1vdLR0jIpk~2a=a;e*BphT4jLSZ)G~J!T)pYhm)Ci2X_Sw>H=g`z=VB5CoqKJr-d}=Pjtr14tl_{<5 z-!4IO6gp8RJU%csBnScprUp4X(-P6FQoGwxkL}}7Q+$_`yX`HXs*J>ahIVS!1P2Om z0>ak(Qiskemkx(UmUy3Q>;kz~3uu5$VPv}ZxhDz2S7o999!?mj8-8*3TT?aM#$?#G zl#eZw0rMvc4yNA-@DrNNG3%@O=lpsb7BMJN;4t5c1jk4KNqyq$GsaFmg0|XiH(z}S z+20WjX>brzPzH{(`zxnli2@4{?9pXwaaur}i#ABZ5J8up=}_DS5Gc;aYB7Tw8rmYV z)26yX6@W{BRbbj&+yl-Kvp~YM%z4~uc_J-v0BGR9TnQ@9lF7Dt$KqMyyX7c}x_l1d zY|Bs5`5sE%HBp}3Xx=^yo$2ocX9I!2q}-rupD0J>&13$riS{_Qg#x)Y>y$WI)vnON zPAt992BlQCO9vofuqNDQ@!P920~!QexzR3ltm58V5OI*F|7>%5KQF~Qa}%|k=QuP9 zgHyIk%?HC=RnX_h&m1BOOawX*9f)jfyjUjafm(ee2*U{3c`OZ(yQIoQk02=o$FKUo zzi2gy58fU;qYfgC|8d+8(>gmRLRP~76rNDwB|N-yat<36G*E;}apq65ax@Qd%)e9O z$7lKfL&7I03ccYtahM!j#-+`?pZW-*ORf4UzZ`@xcg+i9Zn;*!b4+!HJjo;o>rCWq zdF~PTjwIZ;7pFx84K$v20o8A0b2jpC6;7r^4 zl;8`tHJHNIf=s!Kb15CsK#qiWp@&*p?HlGjWp`h1(J{gb@>wj;_xOFbVi0oqrDXoHE?kKSVC`@AN*! z_`cEmYQ^*$=fe`$D$(5b0I@@|sp$!)ZK7duvEKuX!qm_lZ9+L|+S3`MY5!Rp?T$S? z^IY&C4sZgB?i*bys?iapmd)6pwZ{K{#`2%bWD9`1=ShTdYYRB70oTv76kIQ3GD|bz z5+YpZWe*1jpS*)*-=}IID`wYPj6BCy>Ik`9aR3=F%kUDF3+oL!2QhHzM|=uFS?9RH z*fVejO}E~02DQI1)zb_h{f-$Axs8m~I0B7>0`6yL9=I&ud`7N7BPQbhlbA8d@6AS` zjdn%YTfwjDY>}rrP~7f$rqD*8pr(Y1y>sgUlODUcnlENJ5C*I&q4y|RR{z2~jtt6O zVdn$3Sf+BuPJvoBNfg~Q5y90vPX>WuIS5N%M;k5^gdS; z)zjpffGxCEcbOjSVsP8L)FSwT67OS6EF0t1}jD^4hBQ-T3g)K zX&GJ-=Y2VFNuao>qb3fwPCXbCL-)P#3FGD&^|{oHIf>tW{D=wNyB<9Un1hKK<{yeB z_JF*@;}udXi4sWw1l4b4P?H+ias5DznY#+OPxW(#bZ#qx2??dK6?r(a#zPjDX=L7r z5SJog_4#rA_inw7CV`*+i(cfYGn<1{?RS*c9S;)XAw^?TKslU)pD|BQ&qa)2tzrCG z#=s);ap~tDHr?Jl+l70`+K|C6J4~lqG6j6|ob~yKu-_7lGdGkE`FF4n2kUPvnjhqr zqIcTwJjW<5qeJHUHbyoH8K#@IEyau66+rE z8|zyk8gxj-_L10(?&_?32uZUP-`q$T`~rRBVZO2m$;q-z(@+*4a79NxO%}f;Pj~X56qnT_Yhp2%X+7+$lGd1 z05#+jo)|cw>(sD82P|DC1JY^WzhS5=9#FADROVDcTTS=K&{XhU@6bdM4@2A4-KZH60d7`l7Gl@feh z(SvNx#Tf;0?H&*f%r$vS(jC}d&#uvD=LKR8}93tPwChpUl*Ew z1Jp&ZAMjT~qNu|vp9}pVfkOO$nx&&2(lZY?O>2@rNxFj4fbw6MeMfImkRphtXK7>9 zN$)sP?K#NW`A$M$vf%>ETrk$5@~40GXPjtnV?N-)r1#A#Dktwn06;mg9k+D=8cwbH z5jjYnu!!azFLXc1~Q;s(o~e{ZsBI;Yec9wc)5Ta8+5c)4WLY{&rfM ztPfr5cwRdDypo9=>?|_}$Q=UXL?d-~{I}CR)vcR&zBMCd^=QpS>}92n8KbMvo@Pbb zipOywhevvi?NJK7HnXN>2umr4R1ALi{wzh{_9TyCow7C*=3oG79ihggLe+(OYOm5Q zsNDdqYR~yan~C%u@U+&HOX5dSz#B4taRqh4PsWy@2G-F}`p8TVovpH^Gf=ApD-7Ou zmG#ter_+G}%U9TrCq_`QK#)y=4&J9pLSvSF`gxSt;2Jt(9NJX@D_hfbR%w;K4(gW? zqyzf1!UQlX0(ipO8RnV^0EsuMWEl@Z?5Vbt3NHA_yDK`P@(NpDlz)F?+owq|v^X;7 zshb)fH3o21gc62x4wChhH9$CprU#Qge=-@`1#PWn##NRZ06**|ky8=vm%?8#(RK$Q z1`j2GV*_eq7<98xwf8)(tJtJ@+LIX9y^gY24q11ptz1{;8j+?cu1`m2ZXAH+aUook z3EUUEJ-xH-A{Q-D#Q-zKTnYFU_9wGEG6dx{RVjF-4D_iSKsR09(H>TU)noq8(np9~nOA$@K{b#8 zd4U%LU-ORFRicbZ03{Dib-2IPp~v4MLx#}{&!Y&S4^7>q`f9K2h{@K)Ke4-M#r=S% z0BH%$V@N{^n26kch!ckH(`OJ5S07%*xYxbKHd`MWn603#L$oPTbx`3q#RrsL!K?#H zbIvA2692Hh?beSHK4h*EBI~di08X2WgK>Zc5faJQCC5@$F7gurM#xj&7JAeb51lSB z!gAjm&W$hNCGf3v0LisY3-z%b8bSU(dRx=_T}6xO-~8z-2TJIZ?h*s{mbDbXYvGg! zhGj{gy+ZAE*|a#Zn4vt}rGgMA9{kdOoDd-sojwsIoD7+yG~u!pMu1O2fg`}EzWg{`;3~n7q)~Wdo{0K8gBl`D7cMt z_*is!fo|J1#EetT10IH<{;B5Zp zN#u^&hel_@v{d#0N8m>G`zh%;A`|}P13IY-d(l;z5i&>?@3Iij<}FbRtGHPZ28g9P ze^huc5i~yh2_GzHpXT(KSNFk5&MwOP5Q;(u^g@wN_Zr!j)4%aIua9t4EW&)!8V|uK zhqp4t(=d-Av7G})lc>U1xkB{iy}vWRnYn4CA+H7!nzcm)qsu|v;;ae@8cx)^a zd5j?GhkAup@KZ0y@OfwTe0R6??Hct_L!&2Bm=*=WD8m*VNQcBlx#XbC+v+2#sxLj< z%&~nP=-cuosmCuxX#xhf3D4UPO#*yEUrDD<=Wro;pukCIC{x(hu63zo_iy-+G_@-- zCE$YR9(^VZ#$-_=eRB*Q9-LF`S}-<@bQOmkcF63$cq?lKPoHh zs}MeS-?8FMU`A73Xop#lS)y#WB8DXn+LS|*u~d%wZ^W_htM@C+Va%Tvi@+#=?~3q$ zLNl7>x;f@;*Xu$8ikz+XVkvAf!q_eVF*pRUz2=`-CkZNAw2rQsuF0q)@>xQ}*^gEq zT?ygfQK}Mhc$1K)4vmJ}+?C9;6#cpQ`;1?Q-Q9H-UUQ09k?C@50$aE$vRaW-JW4Lb z`4AfIabJ6dmNpfLT(q&ZPN4l}?Iq`NU5>G>kgy6AkyhOc6O2+~bvPCZE1^dz#jhEp zpKvH9?yzhTX^CfhZ`uh)_L1J@;h^Oy(Gd*{N^@XndNPGgG(6jrN|3wC9#SUNB7IsC z+x+n8cxb_J=-WgM4i(V8qnEBY2hpQnZ}x(uGpa|{Ug>ZC#h#F!_MarLr<<gk6FxMnXwh2OlY1~>*vBwZJ<3!ealNsm(wuU)->ib{ z<;4!+c7{SAq)OC@Gjrsx&U{>2O5CjEzh{oYl5h>U+eC<5W!5c~!n|P%mtW9jwvHiy z=JrTFxcln6JrU_C^@Ej}MU`}l3rV6B0)~r$vx-~SSw`a+QNFM!NH)a88kfz(b1&(Y z!jSp%QqbC@wFKR8=$X%RtsqNM4I{*Ivcd%;acOJb<=84XYn|5= zL6T`6q@OPSaEye+-%DQ6N!5mn{7k`N+f#tbyj%hSMfN)utQVG%U_p&k5TDi{%7!Iw zuSONNPRb~G_*ZyL6Kh>bHLW45GcYS830YZ(?n{E&9~jyb>4*QwxA|&NRuX%iKvpoe z#w>ku7NRbw-K_b5)0G_;}YQq49pIOAy-Pv#R^_7g2h57$25Fq{GLA`eOxoIdw& zD!5rFkxZ@;=Gb@g+|b~(2Pw3!pgH4M!EX-(@T{2C$~i$E0LRW=)lKLR9T<`vf|Xzo z^Ocav9*d(1I;e;ak5XFgDsAMC`jg5dX(Uj|9w6MQBX3c>_mH zNi@nOi)VCQY^jg}oEI()Y2|pOCsw{kmC7E6RrL+40GFXivDVA1XmRQILSrqZ4zA!& z+60l254q8DW@dXUQt=x_v`nIi--u@wD3%PQ7@xE$jXxQr?d`@o;#OleTNmEHSWL^H z6^I5(0VmO!!SAjFF-ES|{qwz-EgPtMZU`>-&8DRv<#q5{4HR58y;x3CHlMF65Yf+A zO6!y3$)ynNF8oZ@tWhMrut>QgJy&sE#C?jjyfhuY_3M?>pWR3`@XuU(6k`E?4=z z>wy@HuaJ6zZhNN^WfsPI-hZg1FwE6uo8yNPx3+>GSws78)M!$RmmXkREtkDQ_WPks zUvr%^<&2|rwbt&*@Ycsm&B=CnC}sO7SiY-lV|DDrSomL{{mN^+VD$LjwviPW2a~UI zz38TZaalVHGG#wQvfnbfdyBd^u)!usP@h3vUcBliz&fjmp1Jd7&9z<9S|Bqd-r?V8 zNkyo?tn$9ctpGnjz`sxLpSMBok}1(!v`7FpJxk7~iL-{o2_*x65s-{G5G=d;Y@~27 zio4LUPQ3W+h9c!9#}q=JTc6PA%KWF>A#$y{*`xGL?TkGrR3kv(<`ZcICLS*Z7N}Tb z$s$Tm;O*(8vsnnvyRQHzle2b~@AMk0lhyNc(aKvKg+)T3!V&PS*t7WZX1cpSnrNNr?K70A{F&p6Y^62kPCe zdQ-B$z7YO{GU#Q%c<)fZmh9s%M#x(=J8!4V0PAKU+%CWS$bPa zrluF)Z_ksTvX#a7PLO72)yQ#UTrWa;&apt+t!Czum_aM(HgXM~47gTun@gZK-jZW& zFp7(+ZKSN!khyt>H^pBk(DKIvp-7(uDuz@V%ltJX{`TGtiw+Ya>%zSiC6_bby2{*s z#@*QkijJ2>q>{@5${)q>$CB*ffB52;Rv?psQ$FjPkh>rWWPQx69Z+tD3c!<*L=V>u zNCru>aedqVp7#fS``%+j8QsbjyF(2R&`RxYu(>{My zG{srp&#=F{|412Cu*zX4=xLskKvMxhGc9BGMTi;LoX=%;(PK(f?3X0t2NTtV__IdIK>MAh4%QqER z2+$6+`-wC$tcW(vr0hLSRGr+R3iF2qPhM|(8Gu8Or;M1oazIZQydn#@Vg<_0{Jmu* z%fjEi4QC@*liK*5gK7c*ACEcYh5L5jO0X++nU_jyoFd!Ex&^Q0=37|C=l+tW)AMMM z*PaHQh(BWRJ;c-@HRmRAcDvKcfa;ON<34O)XiH((=SZ&}>DsI;q4W=mxaHUXLgY;r zu~~+$uyqK!VpA_mS-h}Ll(#~+uZWfmL|4o!wYwL0lYT#S%z~LML}uA-SBDo@?*vBp z{!XiNQTLnLnccQ$Pf;G=sJt zGD-qvZVa@^oez;nH}0eY;W}K-lPiF~FG0kBvjZzXI}Wr`rrWZdLH}jo=UNYE)U|(( zP%Y;E>G*J>XWzd-k>5%zb8?Pko1(pJzdJZRlxQ+iT`rcm>lUdd*z9iTc!++}pvO93 zg2jMDYrbG>eOxdvGb)J_S1^E&z%~iIuZw=-agt47WB#WyA!CW|I<9vp(ju4Y1NWE) z1)PfKcjA%EDVNj;*m<{PmcOqg?QLxAO-U6xLh=Y9ez@Svmg9*d3N96YYgagn9r43> zRrQ-IrPRxs^sV3m6z$e?0XpR+LZg(mj|U2)Ik=d)$}plH8ZMOSCXL*1(rxiTgvKJQ ztbnwJW{!>xEfYiQW+#-UD*$du<>;_XIg!5{I6m+ji&K;2+~!SA5Ox(M;Q;SSjEfra zV5ETE*u1gg{WIms4P(gD(sbc`cBJY=V$}>Dq`@$rZVaUcYK-L!V# znmZ)t-RNhx+$&bbgm$_h+RWN*xNq50D268KN$mPg&=r$or6MQZ1o7ZdanUmoMX5nq z*LCM#POdG>9R;8%Q<_7OZ}=6@bFu&dQ}h=<2Q<8wQCJT=>q)@bTS-dy3_XvFd@rc^>n;y}lUZ)txR zW=RS-5V`3(IoFAta*stZAE~QNLbaRr2}MC99}{RzEY49OQ--msme&!3A55nP?D+cE z2Ix027mQrAK_!P1uTHuT)Xl&!Ri`WY_g{^~ZQ-;2>;cqxtaUwmdyL+1WJ5V*C=3H( z8i3fj_<|WN+bESmYJJ|jAZhp0SUeCvOhm94@@w+<5aQI4K^5z4yd}~f9vT zK%@(MU4|xz`r0#DWjeE6v2h{5EIjeO93%%vzp2IBqeEo?dvrUMDCY5Xu6_&piINe# zrvPe0H3bF_Hz8HUFU{e{{$@OMw1Y1avD!?jtDZCX#tINYfzj^!6q-MunWicVBQc*5 zLGYUv^REsGkAjn0)+}{#Pp0xA!6SW}1mAv$%DJjYII1EX4;9^+6TJZC{G`?6m^%9r zMKC?)34YMcPBWYnVIu#>QhzU0G^gq~f=6LQ0V1SbqxgF06klxnMmqRW->u@14>3-P)aIkh={NKOxv*r9R`L z2ew>Hq-G$o2!-;sVtO8gg+Tsmz% z$O)V9jKnD^G^zN&i(cFbyI5Ls!*6M}tnPSbmX)jzpdWC9AQz4_nYI97k_?_}d!)8; zb#2wIJr3`M0K}Y0;cl%YP9Ay&d6k-DO>nM7g(%5vnQdrX&Kup#5|%B*ReJ??DkR}2 z^Sv9t7&tCSX;uBhZ?cz=i4E zG1DHYTX7h~5+GkU3bPpU{37ns>>yrP0bXNHJVy+nxB#Q16tr=ciuB~nXZOphjdy(f z{UaLe6f7)}Y81d-1AKh>HKd99s+q*;+FC$X-F?K2|O-XfKsR zXrwdnGJI{rn%J5d3>hk?sasZ#1Vt(wu^O$%$zhfEl0u>S3~6+8r97{6%5n-370RidJ$ z8Lg=v#;VAleC7(qgYgo<9NzE94nP!;X#&X#pOh-}Cyap#_z^w*Ij3*+W$Ce;Ga=5N zJ`J3AB|%z=`Z$uy1*ffIYzvQeC)Iy%YoJxS!BfWmDuYQQMwq3ccOHK5S)y#CGM?8( zI@&+cDznq?fyYzceYZL$b#{NT4!k&_o9gqjGiH;a-fZ&O(oE*jxe zvAHhj9xBkFZRTS-FAI8-;RQxelb_@l!wz1JAT=P0%Iwj7lQ^j0(AguEshI&4ECE+ysBs@D+~rJ_D;?v^ofT!hV2g!0&ryu@@t7q9fs@n;}C25rCI^x%mqmfGuf6&KZs z&fF}scySErDA%teG-cu3LbgnUpF&sJ(^KJD7(U6cSYNzT!ZN=$Whh*}lMz6DE1#E^ z5o84w$(uE%cF1#$N8WvAB!^ZA3^BhR3EFRUl1S-5iB2Z#;mg*bm zSo$T0&m9|-}lX` zeozy1=?{Scb4+p1fQaHrtpW z#*@^YLZcR!8^9zCQlkj9i2RQ4G$ z7eC>~tcCb^b0FO>OkpBYNt${Hs}?g6YRE$JAIB$j>2b$cc| zvhznLc;7o9$q+ChR%)iU+|Jnn$T^5VL#MAd$>_+P8J@&0b*vo$!#8*6!LQwiL(_an zm_*WQx=lsiP+Ig$*))Cmn`hH0nA54LG7GX+Wx0z;G4tH$7#Xm>fkm5e@^6{j`jTL@ zm4u)mOCQL{b+!>IbD`Q>d+V@`emuDMUkL@z44UNC`mha^+<1hQ^2_ z{B4(wwM{f>DG?4Gw|iJ7Caekkp@I#6WIQ^q7(Wp>T7|=q9=J4kV8gPFw1_JTRGX^j zk@l}?!jco&pjs%)9Ku^Dh6cV#pz9QZ|Lycmq_!h8gX2)wjbWP5OO|!48G+lFg=DzaGV1WzabBch zF0NvJVZ7S1wO00Pl>RcWrb=z!lRo06!sXDyUu-Li{AT%%d^(B=nYbW zq%5$DnHMj`paGj7^r)D=Eri!nE><(;8hG59!tu%BAiR3WG}BD+0-;Ew?!C4Wa0AmH zh(41y(PagldK40HN=~iiVp{@wI*~JbyO7(D`20ZC1?mZsKzL5c_FEjHMZYqN@}aMa z%jCZg@#E=4Ns!~;An*SzJV|VZqvkCQz5 z0;{)OGO!kcC-`&k^`!f0ejM~lCH4u|y)GQjSX&vHyR>A~VXtlEDA+`ql&aDdu;@*$ z(1$uJ;2=O>NvH#5V4zRork7einj-l~X#JL^qv*xV)8Snmj9UW*x3ggtXHVeZl=>_n zQVx7`oDPSkc{!-oXl{G`WJb9ORr4YZy>YK1jTc($nWJwifuB6mcW>+k*Dw5Taw;!u z_pO5p0*9<}(c{VOmVb`8^9T$P#p5QvHh8dpCLE3+B&(6vz?xiNi^T31*F$eT`!xHf znmyx=h$|{hgHjF&A^4^_*&5NZFZE@ajb3GL=D@1Ydl^@60`P2Uiwm#YlbqJMPuOPs!YzELW8%e7?G(ln~|IF~54N}Px#X0k9 zHjcp+&dk8?+crl+G*@lY1sY??`g~C0U&&dfK~y@!6#v36?Qh#}i=A%-FjL)luFNE- z<6oOy;2vU3?KBmN=yc20s!|DyJ0tzF17q1@xjiquQ46XI z%?yl(L%vrwJR@5Bsy57xK9N;LQ%i%9=a@Q$BQiC#|Y<@{2U@RWyrl1TXEjX-EgK zSmS*RPVn-;*Uj=jU(ry10Vm;?)0pI|wg{C*NLNq1@qB!8eEC3@x6oOyr@c`EXa{0xF|NrMcR32M)ylu$9iOS!p1 z1i4yPuQU$i0K>g~PO0zj{3HR$V@6GFsILAyRzvII;og5i9cHKbLk?)n4J#CaB8 z6c|&%$ad3ZRhu^K?oGwRJfn4J?T4Ee7&P}!Jf>>00_4HZGw9x@oY&>Hw*kZ2A(Z@p z3pFvBS=CVsN)r~DJ=fA#SqhzAMo|9cyf@H($PWID*su;-^NQ?w!sf)USNuH=w^RQlIIy*3w=I3V}yZKi#u+AY)=W z2mGPG4lob@U7EC309c$Azb^B$MFZx2zjTZ)=A`>$<0N>i2-7iBvsR+*Cyx*6F5ZlE zIJhCPd>{_KH)R;SKGN}T8;XbRa-B5SpbF8Z+H}fY36;%+u6OAfwrlrqSTYL(wto}M zu-3nsV+Cztzd5{S6G2qn77p;0{})vV_s>MRBHsrv1IxWcIs*d&^ZSs+C+7|CvH5QV zi)`IYQ$G|lP0%&ynkVKtXnjL9CYUGV1H`KF9UGNOK zovy4rU;!HA(z|uAv_6;nmbXNnvRwttIayCc83WL5k*i5|L~CAF_+=`ihNWa2%x67Q2EFc%>>LN38XvF8E##P26~BI_KH+j{Wh3W^w1G z?R%+nSZz<>IKqoE_YgRl?F4S3a~DLe`Yt7f9|QBLeZH@Tds=&X%K$nje42^4nf+K! z$ZkA{Zg)!ZND{_2X5h2yj!6*LrCcBmku(Dm3Q`-jL%mqE{dV2{`FE^6`*o@H=WKK_ z?+-nD2BDUDf)*GlYud_>(Q{8^<+leUAop429gYs&D>5WcRvJz-AvvNU4hrz>ewuri zqwlrtiZT;XSbd)EXq=f&O$70PEqP?%HYa4+QwPlRgI~d!abE71Y8O1LQ5ZCo9> z>6aSN#4=cncNL?QTekZuy;5?XYygoX01#EySv?o9|_!{Xd$ zFcsHjM<{8|;CCQFL6{jq=FJ==SjC<$Dyk8gG$%Ztd1Q?7aCjGSaHJ~4HW&LC{-^!g zOH0<8+uq6Xf=PiN0!@9b=X9p`m**xM0q!J{P8?te|ArQDBLY~R#$5Zzu1;ipy6V31F?`KKwKl{I8XqvVJsE=yz z(nV_VZf~;VH@myog=a0_kkbS)v(j~W@iGE8ApWGe-zY<5jnu$t-HB8OLJX9+dp`i# z;6-r!K%!Ia^&q(|rArW6%r3zVsr=%&?%eQ6ICH5FrE!}3GniRJ2~8lkh+rLw!S)30 zbsb>C_`;u|lE+o0zO=&OI_GluI4-2#^K(tj*8TSJ#bYN!oC5w7utCJZX3Q$U0-UbQ zv}h=PiV>slvzdL8pILkTwlSE8xLcv5iU8ApnRDOuSrL<*`kHz`A^BM1`*pj$(5Lf) z=NG=FcsQNPdoESw+W6kw>L9{5$FlPc08R~bQo*2w0K0KLdFoLsveaw0K(aC;zV;{# zXc(!q5xrT4gnrGlA&^H5=z*63`w;(Y3UwbDyJ^Tqw68a6{)m zO{L!%YkgFJc~G&;C~%NjB_<*j&I@gYo>0Waxr0_hAvn%f<1H34xxd4pK92@lJVY>I zBfZIo&}Ues<Frgr@7q z4mdtf%eGhpNPduMBHrInN3ss1C2*Yo&8aE?SJ_ml7gn)=9c=Xjkq$(@{<_4e)Xsaa z-|PNrzgH@R#kzcqysw%F*U!KOuH&}K>Ps(ysRih_ds?Q&1?Y(_Lf^)8o^ffV=Bmr( zk|wS7!X1HkQ|BxFe+ecOtNZir8rs=<1QrnMIi(|6O6Fh4 zPPFJXF8uZq8H0n=(V&YZ6+mN`a7ry60k2v@eHi}%2)nslD^XnZXNkFo%R{#@`i`(? zwKLo|3$s6ujFwS%WxPhv720nvVtGXvQc=7lxDLe0l=qBoK3cq%muGaGq&j@aYnWew zols-xvEf};73O@Z?#3>uV~u)f7_C*~9G!>x8tSTOa=8`54P*HtjM_MfU76Qo_)xJb zP+@dVh3rQ2_)4%PG`wWD92eyk>%Z*FrvUF0` z7{S(n#bRe>V62B`vDfPbkr}Uo$!c>98BrQqYfH@@@=2 zz|fEgyPJkm!LckwvRHTHmCCUwP4!)v1QTZ~9qRN$rM?R7>4EYIYGK_CJV6AWz|@Fk z9!|r5M=TMy3eAebyJINt3osG; zi%bB8yFQ*>wgt`z81!`FgPegdM**>9Zde=EG+INL3LvQ#*YSa+8D9TDl=w}xnM8Hz z_=8A8PI%J=qACX%5M6TGnjgWA7qSdgkRf=yN>1fa1PASsXowQPd2Z-MkxALApHb>8 zXZ>VXITC|?MgnfZp;g|)$`y0U_8)VCYsbauZ>2rOWK=Zw@3VwvEdHc64L1PChVN(y zFqFDapds5jL%Y{_Pk}{<4@v;GB+9HS32?h{iF2P9a)5~lO-|6NtL1amJ0fK!AAOq* zEUPpk52xn;Ku{$@O3#H`YPzjT?bHj^2S|rI9?U12*Uk^nBmQqM{ib}}Agaqq4l6xL zt1trrGHF>I>_Dw(iSD-~td*sm{4v5I>=@4%BP`}Ok|dgGPXogxWlbA7%b2z_h~jJc zlY9cx0&RdS275_3`d>p5XVPr5mguG5-%jR^N1f;h@jFG4c^j|+a|ingJ`O5cn1glq z#BdK$#_rs|9Nl2>S4%|fDm?6sEVN_8SsP9~mQz1+cWP=tS0fNm?9^?)5>4LeJoJ-B zVB#K7wp`~iMlF!l*~GC%;?A}Pv`qIVZReLAO-_2q67Jp-31r6?8UP09n>nsm+2mvv_Ex2Lp`JC~2qjohHwuuE?3no{?wHWNHpLCIY%Z&{ zCe7tcBMzxkR8arjM{s07*w+kje2Zt|K?iVc{DYvkK=k@+e`P%vZ6(;j2pd^XbT!_M zAUOKmvVsy}*Tb(Nf}i{syMdaf+{o0=PY{ZA^ZhKDbPv|3F32|MM) z6VZT>un)izvxh%!?Jz=t311q?*>ue-Vbw&q&OG^k!91C`e1BJ{h`buP1;BY#%?u=9f%ic)Gr4J&lQ z+US0}Q9oe2StiTxO#5%`x&k({9RI+83o{_MR}Lr|nn?4RQOO;AGPJ8#on2Ug5a`SKt6iFC=5{ zG+r5x9Y=SILQY7MC!p*FXsUpN9Lv3Vy6~xEzKUcJ@(fSuXuoLOlR?|I&7Yq@Iz{Td znC_r;*F2^c<;2@$STd7Tv`s-^TBm0jFec_!``S`Rq6_vbO|8CHFWY0l`6zg&Dk9gx zhRad&?O8CSmfN33dvF_S`TRd~fBNYu_JkYJ<4c zFVDhoY0)}Kf>eF<{&K^GVY^DV=dLmmHrB??JR)9PfrE}JTKefNr6?#ca)L@wI$Pgo z=piDLg}gRfmj!bK#5LOD!fODga&lg@aJ%7UpBF=;T|uClj33mgYw>k};0+LAbV2@L z7gt4&5XhqO_VV&8RHxX0&~JFvP}(KI*gu zt{tI_@D5b{*9`&Jtv(<0m~;R?9bt%(l}x?ob;nnj34aCP)fMq4+L25Wdz+jPzn*$y z)$U8}FP3C?PZ)o{=cP(yo<}!vl$zIve69vA!~;2?^lg5yoQBDA#n_jSyGemZ==3;`2kD(NHl;VW7U!zQ{e}_mTvZkh8uH%zbhRD!f4?ZChkR>w% zlmNe8c*B9t&Zf=!WN~0hNHFPs1q5dPV?lC)F+yEq>om6bcm^ASKQYN+I5gKENhI<( zp^^9zRDbU1I_J*B`DKfRE{XO%>AsM5WoHl0?qJggdN2iGURQvNMvA@ot~;0&G|8C! zD-7mzbZBQok|6)Ok5~^n-1miCV%o6%14-m9CHTPvzNU1KDv5`LKGEnM(Yf%37H+l} zT{}%+(K{xmdZv$VdA=JN=@wUJgKB$-f*e6=zPVO4;Iq!HoM2SuRPHhQ*>U7gxZ)X* z9$d`9WQ4sdYT@IUW+<<<=nOV;POWJ&2)Qpy;FEqfn&Ps=s z?2m(dU5+ancML9p-#tsfe|Uv=hTkqlFjZn*@pj>)oay_ri8p)a%n&V zmqUxDic}G%NGKrWtpuS2NV!(~eNN0b8YQ>LL)Lv{g#_2yf?TT)!dg9{VCw@T(1%CH zxjA7YBx0j`75T{fTegga-#>x(rfY!9Yca@*I|E6OWLVGzBVom%ek=8Dm<80$~)E#=fL%DrG`6wu3Is;{g zXJh!mMdn5{stoRULm^++wS8|r$S-rjSLb42E>B&&X^$=8jRrkwhC^oi0BHO`FvKX* zbd{B!+M&s!2e8%cB#TdNAUd~~=5&UT>WsrUO5UJjj;l93H`F~lWo$)g{vzW9tJ0xm zXfK~{R%0`UbR$OAL_yvTR~~Vqe8k4D4;%tzzx2_|JAJ9xHY-1mB5J15vs$E&O;t~< zDL-aUpc>1YXU{*W)HOoTG4Ny`v9YlvqyB6-B8NRln2`xST&LvzqYnU3`aP^DKqA;y zWYQNIY}kRGV3=l|v7^O%cK)IU4^<=grhlXTWgXzoR7rs;Ff6cee9(u|)5i>e#z&IjcxZF51lLn$W8mCix|B}bpq2HiXkC$i~uLDu=_T_$mxE&BSn@M??5qH0P3OMYvVrYvl1v2_@g|2Mo=kwYQ;S*tYyn zZI%5lAw+7mN=vkYX>fkJJfz8V>S(3I-pHGAozW|{C`TsurTnNGvFR0ru%Gvn84I86 zxtVVV+AaFLMamI&=ebfJR`kH2U&)*zk=WQC_6i9Vzm8eK38w4aCl=z%Aifc}rdpyS zoV;XZ{HW&Xe)X^d4>l`wiFGXTFVtmDH>R9RGus9|?d@a9(R6%&TkR2~(&eX^)XR8mLrpgi%U4Nk=yDOdGF`L9-=Cf{rVlpJl+dJojWkkK|GQ_64Q*3H6tLT z;T{?Iy#ekFaB6~Rwn;pdFz&U-i3nIW4H=po>zXQYcDvZKMM=TyI-q``1qg8vhkKH~ zQ};$1b&6a1V9=(v4bf;uj7;WZX%_+xCX^biC@++7g*?)?Vg_-8sk*abxUvoA5fR|F zyK!P_m{%G&Y~hT4Fd9g((k2Jon~6E{_GwCs{PT@rIKpv*>_-2Mvi(LNTtbihy4@NQ zRWc6naeX$|0(qZ7on(ey(Qs?d6XmjwqI@+1hByiPhwu(UUX~0zTZ}AF)u{$p3iG%! z`ADIWZFkF#V}}E8U?ODJA72td5$My4VJCEJ5*x`s9-bi^@m3~HeWm5!+@NJO6JA8^ zRK<4sb+AKqEj407wPPG8n#aNZ6H9ycL_}gEoE_n4^&#c99MJ0G*QUa+$*1d;OfBCg zc)uuUu1fdCZj%f4ERh=|6bZL?*(}U`7DsuPro^tAfJ8K>T1B+Yo$?77EzfK$a+Ja9_4MXx zCC9xpD*o^&%IE4!v z6%NFy00XHWM#BD0ry$a<&5@p^jp?^UG))}IY}o_}fk7Y77L(ho-Q|iUMAXTMZX9(j zcDe&RyQJdvCQc;^Z^~aZ*)F^D80itI6GW}6jrJAlg0CU@_I_-fB{`ko3)q)HYS`F4 zK0Pipj=Kl0z}pj_Z70x#oa0{^wXDy@oX%fmQih4~Vg>#&6CWTIQR=48l>Kv`wO^Jp zL3Vr3uxB+QkgmU8#fQ7rmE`p>`V0U0IWk#rBUe_!QBua5uZMdZg{{_KdqIFlc`r*c zt0K3=kpy6%vATsb6ZBRF+rp0zDVtKC)8kK?2?vsxC}_;zgyenqpI6e7$k}4#HWvB+ zHK)+DK_L$;QkoB}!;Ge!VA^#DF@m;m#@yqeCrI^U_-@$%@&f9@BimB5uH_zk6RDxPki&=)D!Sk;yN zhD~Ni%&W|d3%9!V%oOGFvo6+cZ@9Mj8@nA{4WsClNpB^WZkMQyAz%dejbMhrjkgb# zKP?)oLcDYObIC1>UUQZW3|*bpnd!?JH1JP#O`zAg5HRR>Tc=;Tx=RwcLV1h8z@dL2 z8e#yFRRN%xr3=gXMZI=z*v49^_n2d64l}E$)tJ=+x#T=ACH?t;fI^Lk1+^I8sNk=l zvrpo)J(c=le(q`|mOnzgV>;8z@L1$|oh;&#n8d2wmCKrkfJ;^w5yXkM+m(t7zxEy+ zO=ZAuGWFrFHl34YZNShoq4XbCzjhwojRFBFy-K0hf|V-8iA!0sqLWBo@yNQF3mEir zozB&hOmGU)r5o#=akZd@Rj|!zBpe#n%JjyPrI$9Cd4rL+HDR{>tcIyhYWcejexFs# z%guF8pe2O!bn}>Nz4-GRijRd3wXxpM6oNeu3nai7KPfXn*qBV&VdiW7{;{~kl7mS< z03cE({Jp^A=Orak{q3Eg28mUCf?j09T-5>j7sSmDML8rsaKmYauBgDEj?~JV^?<^x zox5&L&%8uLN!dnbiDxH3ft#%Z{`7LNGk8dek2?{FY%jmIW%|5G=5=1^z(nlk_G0fG zBTt}X-TS$ z@L8Gyi6EDyl>l`jlp(iY1+xp%Q=vgtv}5PQTFi*x{~f_m?uX6nwtbGeR)h6jAw^^A zh)_`mkvK2VI1St~3F$F^haYXwp5;(hE#-VCUC<~1fX31GH zijr7jHG(!~A*j2;v9D0H*#$4AU!a2uEM%6HOJsML)hU@#IhT#yz+i$d!_6foOhR$q z9Y~CRA*sVmGl?!JCI%nbcj~JHBAvMg>Vnt8 z`h<}5gLX5t@E_U5&Y7C3@=t#j03kBsL(l(aCez1=HaPJccK;7nvpNicI{j7hP{lZi zT&C7b1yX*PMSk?FZ#l>@%0Hd8*^h6B`yVJPf_*c`K= z3FC$6Tnat{!D;}GDZ{XVE^%?XBCrjEw$Ioas)vrx>Z(Zc z*u77WqlX@;6M<$1yl{#e4zHx2@-nF#fixNlZ*Pf^F1|imD59)>ID*01PU_RdDHjZB z*ml%6t^R@@?$D}=tdgL}e4y-9VKdhH)8?nCtiE)?j~k-bUWF6NSN^;tXyS6Dy3;yG zS)QO^1nisLvgVZP6U}p*wf3*}owDL+nA%dWxSV@JddJ5rNa|-G6A)Srg z0r0(lh{3I(sJ?^hN=AwsBA&ds*K~cIpWlLfcVShbWBRHt_BAc!CGbb@gr@1JJku9Z zOrrGSCzG){cd+NC1=b`Hl5^Vhx1(}C-zhA%;jbQ9I)+us1SYKNA~zQ=4DlNszM4ud z)lM4Ekz^AK;k9xa4{3d`%c?*0V*Z3bWnz}gxF`?sS>O*1m!ftpZ5E%) zsAJ2hv1L_F;6S39x{4@@&SI={4H}=UUZ%t&YQ{U}L*wTrx|?PhP`cI6r)4^kc|B+q zh=sNx0?Pg9D^*Pg!*j>>!$K)syJ+g$+%1kJr|4f#N*!b|#3sJo)~^k6F|KW@Xobn3 zc40kt@J2^5&qd>6&*f0I?TVpc2Oy$XsnIT|ZRik*-xiCDQM8QfavLx+zoc`gFYWJ! zAoXt_rr=VIE7Hh37)^9?R<6gwZ3Jrh2zlxats=L&kx)A}-c54EEYap^U|UOsqew8K zz$&i}+;LGVddBKJP%}rJ6qx6KkBs$k$>eD+)V2&mW~FaoWet_X~| z!EZQdJc!<`w?tlm`xRE&^;&K={4^Dn1O+z_yV8UF5&G(M4H5H5JOEn^Uh(l8LF&P5 zYqRmtuFRoFw*;|FdxT{iQK=kCbJNy*#p>U1-3u%|)+Beep@Wo1lq07w5|*e*i~Hge z%X(HVH*c7X453yK(l-5`gF{4JG?|j+J+pi9UJ0swurHzk5n}uiJQ=qE;g78Iv32C6UeLxK?qzU-A#zyq-}Hv-k@1>nvQoz;w0VTi0j2m%9r{QVn_PFAm{YO)Ho1 zg{)7#coA!>Qo-*T`+C|reLj*f`cq``)1^L^|E2tcwUk?S&gbzy_#*TJ z{dEmV41(pp+oKc2INsTBm_p@gM;X&*TB^&y2?Top6BnD}TG4)k;PhiYZ%z7FaLK~M zHk9C@c^m+@iBP=nS5^-_Nw#i{B?34D#75ptS-qq}+5m`BQOV@EaygYMe0XnO9f3dq zWUP;5k@4z4<^XCRL$E0BAF6`h{nPcmkl)*WfV$z8JZ-KAnjlzLTLv7; z*@tjEL9aM2gp^ipIxj&^${nGzHPg$9&2F$!?JHoO5Q=-tJ`e9geKDbT7X$C-Nq2^W z7fo-8xV`E+>UTS+xu-KnNw~fxI4A)p-$w_S)>fJrhvfM<`@)5AR zzq!t%%1|`}mfr|Ye9enNqjGw@=2m^49QjC{oR~&s|L$Lb53l&45I8dMVGemhF31YA zV7|{!cIKfbXpv~VX&QQ;BjE`XohK6j-iB8+iWcU?6jngm{lRI%@8tZ&w$TWtQuWUZ zM=NwroFC(PfB-;yB$?%m(|^__@ejs$q1*QWtmf&DQb1Lv`upoFqQAw7%D|Q4cn@YK zqa^UZvmw|ao1lb7#{jSbx$bjX8KrQgQ`%g4$!}y)TU^wF#ols=ERFAEkp5 zPN>9`qltc3uCLF$1P0M_0#;_|q@4{P=}2$BuDy5v@z$E;tmp(RYX^nPsZkmK%rXS{ z70HH2(6+F05*e*_;Q`@!o@%stxaNGf1|9DKv8JgA2S z&0NZiFq=gGq?%R+Q~b9cj)bqI8L6{n&Jr*$ z?qxB@Qle)r>6ebP0%s+EFyl?ck6|f$0!WVx@lm|UJ_-0~Kq+V_kD{qx`UddjLN`z`t}+y&&*||NfqE9kd3blupM~ z;|Ww)bM!K1H0p6D1osSJ`2BZzkg%AriGTGhpWd0$h(D2VQHpOGx7E_+@ z$3YVyBtNz!Ih!v;y{k45V80vaQvq9uF~Z;49n}7!3Sj_96X;+GdKS>na7v`m+wxCA z6&_CYSlDt_h{|TlySElZx`#w8%x}uVL&Q3k9dftSx%LM<6bpe4f14rQ{&k3Qs0$>p zDNnkETpE1QLJ#lhT>T9n)7qHnH+XoRr|y*G+iW2dtVto^K01UXVAa=a(5U?@@hWo) zr!Ny{V1uU7ut&c0ZXq;d)8j&uNQDs1uFc1kjkr#~kN7EA zH=m_?Ly!InlZXNMkC_HLXAh7NxE4_+fomHq**UDh=lDkzd>s)(>?;%c&bW&4?h-6Q ziC%q`vgm*cH#r#&YEV`hEH}7DhBo{(^?qqW=5-h6S0w=t9IxZC0;DQ0?#l9-Y}3P) z7AtOyXN-D`Zt^r{J2w?m{Zmnm3V9^RCD6++GE=c{K9^0ntw` zFsaGEa2OrllVzK0O~aIo=}=#B-F2vR1r)q{$0|u3T*jYS24{xWA^C&dZAqM9YWU@0!-nU?t&A9#L$nwj3C9;_+q){NFs7AE^N zjXrc?2KM^<9p-;hWcVVxGw>XlliJiEkhr+*7>o3T$H}-ZKWrBH{a-Xz&~{TLl5QHu zfb#(;b=5f1Jk0DvqYuJd*XM?tTRxU~8*KQI2P4yYklpkrXKoH2AL+tui7FLSol8|A{Zxl{LOkEl;vy#`WP)ad|Go zVapiOG$YeehH!+$>29IiF}RG|qua_+!xy}TPz)X82#x7EH)RRh?~ye*zDp_SWhWDM zsUikM-X&A9=w;$a8~U&czQCU(E@se)c2c>g_~0Zm%(0hTEL$>E;$LntZZ8$Ux4Ooc zYUN*e$c5~-gE5WXevr5XEyP#y-{sNxbv}d|Ke{BJn%+nVW{@EBSUDCBlKr^wVz%6{ zPAl$4qy_*lWkW(l@<`I$c^pbQTs2tZPc)$F3y}Xpm<6c^`v{8dru#HzU!{yR$typm zvj{lms3j=le(KN?o0E^t$TQHmIu-S$*pu@Ev?q~T=?e{fnJ=M&8CN3M8xtKEiiE^e zRploAgy3R4-O2f&Z2C9Ju0c)tu~q8-3YqDUpY$8Azd#y_{eV(u>qbkfBG)-GCpHj> zb9}NmD1z8Y7OJSusKs8!l{2~D{!SlLgZRhvyb|1ZuhmJCW z9}@_!QK~o&v}ngQoI$^*@&EmIb->VzX?vuLCgzuf#*Fh+ZR#PzORGo5rGUZOPoc54 zHI~9x4}?`9wI*Fq9jbX zA<^(DapcRvnkbqk$54~)8GBnACh4YZShQ=_Vix7#06dJKM*4Y7+ z;_yK}ylAL2%}Xr_J~Fw|jc2GI&!UtkD8&g=!LCs=yX9nixPw57*_Ft^=xRbH=83YL zl8^~$LB4hTr>|^J_l<>uIL0J5yA7~O;{z8dWXUs3svPRUTaaq;;>fb+ZA7{L<*z*4 z<(*cIZ>XfHUDYTA$%X)(a)5qT%y}80s4n!d?fUz5@%y~8_ zu70Y3&h5+q!s7&@3w|Ltpa`VX?Y%wx?QVZCI~jq%^3>JStGMlYLtX~7{_b&WP`*8QE8M&Yqxn8-`n65;Rq3o=)T{Tep z*QgbiRl5|f!C^!aLQpH$g?E*X`erexo!HIdioRq~*&|v`EjLCIJ<{LMOPZx`(bW7! zUdKEM$Y8!8j(MbVv*#K#evc*9p{)=pE1|tM8~36!Qyc(rm)#Hdkvh9&f_)1c5)%yFr8G2MW!@FFDY)g$8_|20N|*<9pem3c++7Aa+A z&TD&AtM2Sos~_I}ZB-lxb9(+`uloY68?#BNB2|sBeOmat!8e~M^xxdO+7PSszDB!` zXRrWunTYc=l0jd&?LZcPM7wrXIR$K!3J5%U#c6v4J4s19cR(*T_P@Vw&q916865dB zm>HQ=8|&S1_PR}RWpg_?$9cOib7on?2Ei;FMHr$>2?l;htUy9|Bel3BrQaz8iqcG7 z_S6pEiw?H*S?K33GEI*|bQC8&btnB&qYkTO^G2l7hcl={>7Ulr!Yy=~$j+94euAgf zywf521iHl9oTHD(CYm{zGk!`eKWQru;320*caN)Wn4JV%M#IUARYF$kwqp3Os_7tw z_K&zbh&9+F3l0#ygD*a7)o)AK9fY73^!ZJo*W(ND0sDe`+lyhJg*V_Q`a?e73*8w=#M;Xjp?p4+Iq8{yh!zF=Y3CX^w#*Nq%J)~`*1 z_@~7714{+b5et}+0r=7xEj_e;PxwS{DR&7)Hj#e;b z+OFM%%=MuMq(-65eRKTzITqQ4E!R`*1TUjfD~Z#%UC#{Am6&7TIG~&hMRTx?X^jlU zwxuB!9{8V<$%z{B0OW*9dn7m$y~^jo_RCNTdTIC7`mveX!`D=Cp^c}yfNy1T12=KX zU^+<1L*wHx5iGwvhS=}$F$$4OPa*H(I& zW)TdJO9c)$BEEWH@!5MBB*h2s;^VfZ(9>lKL@ z>Y29fZ^|Tg=|B>ZV)fkc z&S5TzqX?)vB~0MKiy;Y7fq*0QZ}AX_GM!l!id3xlzXJo{C3fJRO@m0+?BgrksntrO z;88zNMp)dT99raqtF`Hk%Pub#8N(!G)<;OiSBnO%87 zV#o}tKeqf%nvW8P($bT(psqK~l(9O!Ceg^GvqF9DrumkHVDXCr-Dd8CZ?oqXlL9^D zM1}aYOa=%iK`q$n@w8i@fgw>z&^NJ$p_f)LHia3(3cTuh=K#>(eLS)Mvo&66{bkzd zZaf4|aGG@Z?W&`vK3 z7pK;qbo@?1YDT^RM)&qUE4pvD2C>Xg&=u!hmLV_`hJL={%slYA%Y@ooNtv_&{ywgA zTkXb>#TurI$TY^W#^DTsp1{=|`11mASOS8+0@5l5xC0A1dK+POC|Cn?+Y&h>O@pE^ z`<$y)SLaUqTVnCN-*WCs;wb@`a>{%%e%50DG4)D>)RUW~ht`WvT}5(R+0Aq0qwB$I3MOYew%t z!YEsu-sOI8x37lJy`l7Sle`Ru{r_b2#evDu4)NESm>J>XT!6WFGw^rxtc?9+5eVQG z{C+h`zjO6KMb+0^srSt+tvm)n(R?dwQKjW&R%C9-j9Rm}Ifz0Z#pl~g*#uXZVb}nH zV)})L^twQ{yMZ$u-%;eePNt2BL%EM6PC>Yt^{6jeeVt{P6wPy%rk=e7Vz}I!`_OW% zn>PKuB#WK!cecaWntIX83^@stxfN2pUSNRg4pd_O8#1_dlHk}BVLzC{Z1ci4#JEhR>@&?PS9@_k;A+${^VjT#zih=yLy6|s-r)4L)0gfipvA01Dz>A|7W0Cd24Lvk zsfDVcw^HJyW~x6=Tf!JsrWavCMPv)-9sxD)0n;EG`eax@w-c&|Xm2KAS^w^kSpY;3 zlCNBvm9`l>%e`kjAANn?xwBT$&w3HDdb(o7y`ME_TkmUxt6{otlBr8W)=Fn>n z%-q#fl8u%Tox1SfWR0ag#7e*L@0qlvh;v2@qeNn* zh&BP4z(8aoSrhafJ*miN1cUiI_@D$&dX;(1=`tEJdPpO!x~GZ(2p{m5{>z#W07UquKul zd$|9kI4G?H;FwPzd`OH03{9c1A(vx;DbYZ&v6q#idQw1p@;5<8j))~gsj%kj)>J8C zB%ki$un=#LiTFr3kf~1|_#Lym8`+HMvCL5&(BZ{ljE zJ)^x&9$Ad2>+memHq4nK)0M58Hv2R5u`giTOG52&#z}NXIIJ(1aIqgy;hNrsf-9t+ z6i&B<#nys@InKupR^?#MiR# zQ@+@f^re8xed#U2&V&>TJJyLb*TAwBB&&yIw4<<=SK<~_qUox4k#+Kaa%xJ8NL#Ob zv<4g^iHB|1)!4SXX@vC_CVo>DrIlH6bE|B+vGBs*gc}L0JLWj`$RcB@+zXLS=Hw2E z=g_Y2zT+f8G@)?oRP^g1kW*H_hRds{{*!jmVU=$5W8eV<}HjzI0UqZGQp8I#JcFFwe}+}zv$Cj7IANB3*OXdw_sl8Bs}@wAXjbFfnPsX$ylvP z%6)7t01nhte?6rYY>&Rcyee9CG}YU*slOdm&Cdc;;QpOp#L!P2?CFM>ucP#~{($F& zd<)MeX=pSJxgAa+$daa{@F9|&K+)X8(-zO^-Bp7V2t9E+7suc&iJ;VGwRScZKKVU_ zFg$bo+N<18DBn2`Ot*)xi|8ai(kAW^ls3Gk`4`nOa$$YC(tqL=)g(r$^n67LS>tiS zaR&rsnd`6S5UU`A*~Ulwkx24?8Pqtjxv~!du%jPMkj#f;EZ0ThBspeN^gNN)NDgJeWUZ=lyAZV0ohy-San3%06KB0wCD zjS|9LGMmFe6J&ThaBs$*gPoyV_CZQ3c|3*ebE4(_=UOTSeYQ)-2;#K66JBy&w?ht; zvG4S2$!M@)SHP;;pL6tN@sk=}p_Ex5+V|Oy6;IIr^Djj+(sI6|+b2W$i#`1{xHEmF6n39}*%*GAgO^pM-Qe;lqVvuQFmqQ}e}j zZXm%IJvc;>mp4G6*WlDvm3XqpWb%5HgZ?bjR=aw+H^^s_NpDZ|XeMi$9W56cSsxWK zjbw7K*;taEDjQEsNT=<6@;U6m5?EL*si}(^ZI*J)Wi(C zzD!KJAu|w?D|$k;?0#`P%TmwLmDrU;Ukhsb(4(9l-+Ixif;c~S$QaWa-aL`2wLn^H z6H@~6jA5G`69vh+p^g+!VcTDPFi*X4|1Eiah7iJW1t6*re+$Dh`pmtf>$hlwnb``Q zaC}>|;3qyvM=F8Cj_+XPX2%HM9=C73N3$0rrgNU0NSjVUhXYt50onlc>gnCbXkSAi zJHkIr>I9$%!yIBk7bzSki{CRQm7z{3BcRa}&Qe~s)6}Q9Q~RfGs;i`HVV!+w1)J1_ zi9hg=Om2`w8)Fqv)w*9+EgP(2I!64Y5S>+(RhmnQm=JO}ad?rtsL9pHGuBRP{y$zG zNLh1Ksfz)TqY2P?(F6C0+S>JDm=a`Z@A~|a?;N*&uXc<#&k9QQxr(@d)J4i$TqUj$HcC(w1S0D3E zC4LA<@QUnf5)$3m7t_3k>fOH@cz3sl4wW8Vx`y#kukPt#)?tSemP=$hDtRcNdgNHn z-@gAv^BnphR9W@}MX2lHuS9v$#B%nsd2>YhwgqE{>dM$2sxaBQ9rtYHvNHrH-7tX8GpyU<$l;_jJ;i?myOix}V9zDlB(R0Y zOV+hRT_Zzr)T8yC)I4RNc3b|-^Du>#=0d-p>jWwVcUcHPeNj$1qINn+l0fvzbEPsqx9M z;}c!IDK$Qd3ebkR;$cbg&t)scR>$%GDT<9d_JxIy^ix+Skj=NhRjcR#504JdIU{n% zJzf0q1=NL>pc`7pa;eM_h`;T^)_usb0q$9BUkMm#>5;O>YwYi%^?QB`>TOsBI}dwE z0Yv)HRB|K6aKSr$IB7plc9Lw-4PB^Q>R8>2_xp&oNyD!N@Wn-YtS6pCll?I1OGYek z5aYQ(nbd=!w_o!^Bc$ziXw}do*X;E>2(TUoRG!<}C^)BjWQqXdiOKzAQ)n@2&}<#1 zeq?A@*m>3sHzd)$!uO9WRR~UL&W7>IqMXQlSazJXro0`G?y3u5EzziGzQnb9tHUp4%&Cg;HW*eJwb1r?+e^WhiyUa#$){ly zf-!TIzqT-XYj8#l$Q_kbalU170J~0aD3iLlD^STT$5X@w=us0fN7kW4&fzV?g(;fB zU;aZW7R)_Kjjo9=yk{N6xoT&cJqt;!LzY#GwDrQ;px>~e(r{O3!pN{rE@b#Ec5DAl z5=?^&v%+Onj;Ok+*8i)o@+IPsnBJtkpyeQbMKLXo-n|~ z_=Q$VM+d_wUP<(J45?DkMHU7 zY@8f*Qpg`|J%MuWw=utQ-RtOaLU6-J+6t9X(K3~ladKIVq1aeYw?0U0z`R2Oz_>)D z96(9n&p;loAs2(Npd`NNoaWry?f~-oilq|*TCVgMYw3P>SVAzjMyn`=>6qD(BSYTR z@9INu&={6ZIBKj62Ci>K$U+T#(juL6rUF+MI+}NxxJKyB*>lly^0~aowKtPn*BId| zRWWDE*U4)7?m(4eAHnpdmt}n1^Xb}Y9pQoeZw2%|k3ude%I}+MpX>(*SxEj*wo7ra z(>jyXOOo>TB)u!rC1Tr#0olv#<8HjUW2LRYaULa+dOD=hEt>d&u360S_00h9xa3-9 z0LL@!xJiWgI`B&_lhX@=<@SP`Edu0le?OwOD`{2M?(@1{q#>6fECk3s{uac~-sLeg zsz_6s8sI+BB|uGA%opl%-eti;_+~1$Dj7zwsU@(-tI5?35=eZ>HH_7H?lWmC;{{`z zN$%cz1{fg32If~UsULu^%A7^iGc+rnAuVLleE0G)viD_M2p>+c9aDEyeOVYz3FQQH zGnpCf&9+Ny6)YarNN>nK{oA!gC&&- zW}<|>KmRE3Q2AlPYr~z7+_Jh@@>hY_@i^SSOjcS};Kly7dhH3Sk>Sb1W6MLhHjP;Iex%`XVU) zL6PJTSM7iYaCpcil*)X-!$}7D-W(_-V`@EyY^=0bVB$YJtL4Ux)1~|>3>M1zidOY= zc1t0hkw@r^E!IWDw{Z%p)Jpx~Q0sJrLq)3ooRM7rNd;DCKlDwL0d`2ss~iO5p0703vLsTF#lCzpu7v-qwih8z zoUh7~@xfF?OO5Jbq)&fgJF$H~b-Y3vGvizd*1i@Rkpv|CNvKmH5nD?I7o1{%#K^Q# zwA5kp%jT*8>+=u6k+WBDN#XN)~7kD?`MbLvpLCcJtsjqT1gs_33v7NAkD= zW9-bhUf4~AVI`28|LgblH!JJmtYX;b%)!+jVIipFc(hgG!zx@r?B95nF?Hx)Pm-}3~LHl|Vgtk^L zk+s{mn(@H}&$UUDyvtAdHa|*4)JR~SGWvDx#o{R^fMu^DC3VsTUOlGH)+KLlBAlznyvZaX?_5{mkd?Hw3~Seyblu7X3>oomeTnpUW#N%mEstBfTn zg%G)NK^@NMpoj?F`Z%uz0N{YA0%b(&OvAznWI%Eb>l3chw13EkB~jCT1mr}t zJ>y&cjI1W6Ds6vuy(;w7A_OG%moR4tGF(*xly`?qCZdc8jPRT z)#$#o%fnE*!~&rd5g{@lpcTP!B_kTs)7Y?+i@r&i z8!s_?ypXNjye>V)mw2`l_fb9z4vU;AswqTDyKt#}P(=uwB0YsatF4m-R$IZ?v57?6 z>_Nz6>*z~IcJLpEDT4`uJLqp#{1IOOeqv2 zM0F{PGejW`?>>1nY#V9>&1OoMm_>}B_}z>13WvUc+Sp%tN2@N;)H;A1qxz>B8UPm* z07wX`lxgMu>V(h-cNl2&=$|xws3UCy5o#jMhlZ$uexc#94;Y$K#&1s+@(;I$n=0$h zlA>mSonUc9F|)t4+hjNDj!GtoOF_bOuH;wGdXzfCsBfjL>vtH%x~#i7{Au^k@~SeF zloLy-Fa7iK^tUgP9Q6PK@K^d;fZgMRp#5WzFrVzVBV(gz^d4&rMZu^tLprm#L|J4{l7Wd#2C z`0R<-oIXrs25H}EL~a7%3nLXu5fIJA$oqwcBA&WGJ=j5x9cAk;`j+?7*8GlhUaQii zL#$|A8Fwj9{G(DKE_y z$OGnm?-BH8y?I=ek-*aCSRir4|h7;2y#U)UW5YJ$Q+`+uaXd z(Dk#1FHD}%6!w;;i!^zqC7=hr*V0*4Nq^U+Bgr{6!`7rX*91ORutjoIgdOrKRyn_- zYf$ynKz&ip-W&_&u}0B4kG4Z(en4quuEAfxMfIN?L&@A4L{x!*pf7_~Xs?ayyu~z6 zMp;4m2Ur3R3=-K5zt6|V0UdeTTdS3>n7QfTG%|Ig5}v+6AS!hBNK5L8}c-z=EhDmJD(=nHe#iP z2O!N|C!FrU@pSGO=Rc0*jK&N!6YY`ajo&TXAadPu9B|;2<_?!%*hJ@(QgW^j%m-sy zn4_$xu^c`rB0IjVw_Mxtrk60$DLCBwG<4Ff!@0G?P!Ve~CKV64R55_prN&;o8{7s2 zY!!q!sYwq8G_qtGV5@H~(87EhZZ;Qz(d&d|cKYv!gbe;|cvYLIel;RvguJu!F9j-xVh~uKw(6Tz|w(Me=|6lhIdFqxx6!#r3G-4tqhZDkX8{w^Xv%6`#9f zuDDfEVQXE+9yteN9TP$QWQMX_a7&p4uQx1MveV6fx9PX1wRe8IE{sVVyOSU_i;Yo`(4{Hg5?1x*+g`uYVH*sELE%(LvN&@YlN9T`PNc{LK zg)so+f>dey;EX)Ee@iG2ES(a$5VSvBB#oH-9KUNQPvqo_2K1XTPfl*l!7a&gAW_@| znt0Zx)d?k}mJvIE0i5mXO%NK~SV%d>#$D2$8AvS1Dv@2bKAo@BtJfN@77*;mS4JGB z_3h|*h5ERRE}J{fyh1u-plCmRJ_x{#NBnOGv?xV*+s2fV@L#5=|AaH?!qI`S)yLzYwL5svFQ&rc{Z`X3@p_Rz*Eb30`Ee6F|PV znwxE=nWaxsLZo-^D?fLFLI=i> z>0}{_l1%a*N*2;rsHey_kh#jA)86&iIJvo%6fmdFe~>ux`dHh3B~O2A?u1}pn5>OR z4qFdjnJA}YRn%CjkyDN^wTwiF>>78hb9a!~g18WNd=YnB9Qhbe-Ho|$qNZ3v4lQG@ zAEIKFHWOy8`j0m##UFN+CtZdor#itE$|Nbh();fJEQ@|>sV|v^LDJIqLVf5-VW7sW z?0jw-S5`oQ=O+RIs9YLlroIbo5gC_6bvV({TM63%wgZhK^L8e}Ygcw8B7!uR>fE6? z7T7?N+ zMj}O57{XLh>EnRz%C9{#8I{_?bMOTkq$eJdm)-oL#b9W>m#IeC)SA%*{horB)w#K> zo?-QCc6gWf$PoUi@_n!`&WUx%lMWrj3GW%itBLt}R3-eP#Bn8pcg)4|zXfRd_!h%A zV@tw(_D#ktCnmrc4dDtd3mC7YAJg+eScM3fVO!<$SIC+8Tyf_T3qIP5cTUI1_^2NjwH88*m!k7gt59*v>g<3}o( z_L7pG7k^8f0MLbI4$iOSCi703v;UeKnfkmoc?iF8GlQlb`Y!d$z?90pa2XIvEwe&V8uZ=%T5O|>z!bI8Axx8uG`B>T z;=1rhO9v=3x|j9cjd)8Vzo{qe&W1!{vP^JR&ns?N{1m7DqWOM4Q@D1!2W|!r6B;A! zK+;kK!0;hX#ID^ecpf={fXPHwgA}H~KH7+M8EyhKX9-hJ;-zY4DGFjnX?=nKyE$NI zaoGFP=SG+8`dT%xT=Pk>mzAghgiaD;`8%V=u&iY;Xc>IQ131wH+S~Pkiu+#*UM&!T z>}Vuzr7*gJ5K%CCoZ}TqCPI9OkRXFOc96#t6kJ_a1MDuGM{H`ZOsqt1EECt&-?0#S zl=`g0<9p(G5ao7F2_KU|f0ZhhrC*O8hZ&fb>_LfAYP>F`dU|Tq2Uk71iI5xHzl(PR zfes$#wK9;S+Lr)&uMPY-Sw@)B=f~*4n_k$&gX16?=4<>BYC7Ry1HsBkz4h*y9?!inLaL!ue9U}Ec_yr=EqbK+bWb2oxprlb-!5fu(gumcJafO znWERhDLi2=%Ss}(C4Ym&_-K`QgiY5)0F7T1H*60=St|5aNUe_#35;d*N3+!pe28>g zND45kzS)!MlRtH0jb+(^oZVk`kNG(ql1X&NAX3H1ePN>=V;u>!dTfy1ToQW1>9ft5 z%sROdaKe{T(XCRI3HaJ_*q|(&8ReC+W1=h}`Wvl;oCx-@ zkaPXwwd(l4pCy;WKedHaL`NbM7AY7#ob-0tr524hn`BIq+37Q`IJ3vt!+APMP__o9 z+B`JPs+Lld3BmIpdIIDa?^68b%|{2a#*-`F%^)lXz}71A#1Zgamj|a7P1%cTroi96 zVk|g;E{OIj$RXr$<;5^mJk+djsJMLx!r>9zt5=~COvV5opV0(VBv)KFf~}ozq|Ap{ z5az>rWCcT?h*|@{IIbBGG#Z#g%`eJpHP^lecimJ=mc!m`g3>vFx2$%~uR3GKBSH`X zBA)oMy(IBqB8`{1Mcwq99N~IQzMV4l+Gym$N%y=N(EBmMN*JJm5Qe*pd6(vF;T%a4 z>~Uv-Uf?XnCSPAvPwE3?YZ8H%dr~zR@jd(W99r?wL3x` zh^0nJiZA|4c9n1GI5P+H6BnjN6GdUm6F=KLx9@SinD*3CugzD029GQe2vS;QgXDrs z{<1K6&`fNE#%sf8bCht+-#Z?(i2?En$347{RgAh&-ezKkQ!&fr=$mLuND{l!Q(u0! zgddnPURu{`^!`vjc2Cv>k{$RF3FaSfgvuv|)L~wC*0zq*y3X;Fi15JSuj3;g8F6~ zBOc)x+=?ba$)0mljhLX8#Ce&fIx%RihmR1z!Q7;N7(P()kj@Ej>VXxEjU$P>BzBR^ zEjGVCO|4h8e%vMwR!`p?guus5&T#W~q7_0_5r{?)yy&|hx-TNr@4~!5sUCEAMuLuF zt*Cs`+Yv*W-9<#HtW7L_x-8u3fo{p;_%N&~+tjzdc2+vr-TG`9$OwV}l?LccYBjMn z{_-A>9amY|JkSxbFX!_~nwgcFoi6PMFLkv~zHt1WeW#6}HyJtmfq?ii9|L~(J$(W!DD~8%65ZD@v47p!A zW$&$e?l9hen$MQm{3BJ|CSx6S&8Ix*^+G#fS$i@ov}v;| z(wi6Ai{DCSy)gGHL+f}#E^rIoWJNILy!RAb6}U*32$Wr+TqpplRnv$)j7;|&K1c0S zDnvCCLd?y5c*YIdb)Ir0-!r%2CfEZ(f|w3z`JWeC3BhzT{4@O)3HUPR_^V1CWRtrz za{rMFwd`WY=FtGM(20ZJ?tVym9dk0l(S@9?x;EPVO1K%9^q5awn4HYnns~D_iH7o@ zf*SIPlO*hfvNXhF_zB?Ne@=u^TP=1MYVgLgho=MyJ`phHdOw3w&BHMp`xmx`og0Bu zZ*J^YR+~ds8^=ZCz79`a|Jv4O!z>Tr0oN5^#?%pwpPc={f2g_zvUHs%Abv*ACYF4f ze}%rzlBjIHY57aUp$KBEV0O=pfw8Al(Ir()yBI1QJ0Fc{o|{{S2T{)iKMxg8+5&a@ zs2E!C=I4_Rb(59piN%4h!$n0rWy4aPBy72JN8WpdR2)(;wkVmHR7n9+ZjpQFi+}vu zQhn3kjC&HGL}ir|1I5+CtR2~YfWD-ww&05Ab|)cCh+csIrOk)t+4Cr)mTsXr3c<|K zEZ@@WaZH}Yk)J$bB$Swd0ZCK*VSosXJZ8h{Ky@^RLUywZ>ER7)jyOSO2`#B=@=tj` zjP&zmoHPDmvm*F9T-PQ3I`tutx zfA&o3pzu?E?Z-0*BIVU0(ls_}O5k-CrXR_tWNa)66Bf%Jn}mC6J<9ud6s`;5vum!fEHb(}qW#bA!k6^%BIsLb zRfHTDvJ5*3FVIiui0jE^S@xA@o?T2>lsEvh=LU;73&2dLUG|I(WDW2f{q>+Q`ytP1 z><7PIw!@hw{=1}3uZcMkst|ct>ZTFtMnXu~)DY}RCkIVxoe@89ILs>UxzlbPZ_nRF zNXSftiQ}L#rjXNBz-)wH=3b2#ty6snJlA>KU^Gf*f)$GrUl6y%-VK2cS4eel0H{EQAjF}q03 zDj?v%|FEljAsB&85Jj7=pLj_xI2r*|qn8CdRP_4j!EECCvvA;<4Dg~h-yv_OM7!$> z8q*HdqvHHg`bcNr>pz#I@ck||V5OpDf}soq7|HPdG<-UkiXVDV*9q$^Ul65Ed{wU! z=lWHnVjsNz-E~Kq-=S$?SfY5>AFf9s^!Deqd-cLE5&_5zFnQr7ksYggIIAyUqR%>9FtUAacd&p)9)V=|oVE>sP3-00P zFtF>98ob)-7OIEs^U>t!LUkaj zG_1&Glfo*^uTUWdvASSnu_XBPY}ZJ=f~pTV_q~2>DF#cWn2CpgbJ>8=I>H+KK!Qr~ z*$k&+gYXfvVFSSh3GHQ#ia( z%8YT=&ebcQZc34J(4Lm7QKduau6ci{WKXB(heb()=D9gF%)~7(Vbe8*?pdfBfD|!P zR3gK26L01Z-n1mO`gc_}{$z!!|5ZAd@NA1jDs`QE%lTUmMwIBkWIPjMX)g#0!Uv@;O!r_14|1^m#L`jOm))SecZGt zC7CYMPLtGbP7yzm6!qa(^xM#I)~E`VS&S`K=?E|i=gjZY%#R^yZ29jea1@Hi! z6cZ@-1H$+fQk=clwv@$aewk5q7tAuiBu`0_f+&I6)h}DBW6~d;4S(sC1kKs;>Mery zvK&?-HGs*9v*U7MgDrw4%W^ijHPrT|eYY^(IUNJnLbwVM+?FL3Bh~aGuf&b#Wk{In zHxqFJ_Zho9vc88|kL*ZS$1^j+Am2Q6>01B!#vV8l0|=wOAo*;MZrPk6+uVzkMMj0JY&tEk+x=__Z^NvBZtudr;*Q59 zQ!hKDAcvfAAk}V%DmgsYsOk5L+t{Uz*c3iIx21sDDH$qJP5UCvOu&zNJLoyp?x^63 z>`D2JInuR4nr;1CbfBNU%?zJ6pqyaMk2(@Wrl~8{Yi!0IsUOrf&l9^vMAd=QJRs-H z=~~$p)fvN7cJ`&utyd7>+U_!nNdG8AWW?TW;7|U7o6^FUh!OoRz7IGCnb%%ttW-Ln zfQER5w%JQ_%3zQB7A* zwdCX1G!1Eex{U-y>WptITN@zEP!n@8W66R>LPj7qy)l;{@BLrYyl)@{E7PVq9)e(S z9WoB85G%7Xbd7!M4m(#-zpe)FdFyaPR17LId`zOw(}^3x4fwj2IjWOy=b8}=4)Igu zr2lb2B|4?ynJ2KEw`FB!itWd}7pF&y8qBjAxg3euDX-i4FCLaT^t-$BmcS`uHG8%u zZY0m|>V|}jY1!*sh@_c;OVb9cj$uNdj*9=Dp>USnTGRk?lZH@$)L0-~h>SCOAV4rQ9QpUT z$Uffw+4dXEmfe)%*EbUB_I#lk(`daq4bF#i-XBPjP5V;v5G!r(R4%nYLcvn7N2n#NUT0>Ho*pTxH5QhJKr43;K@V_(}AC z;s%Z1Uj}QoQe0P4%%zC>H%F9R8=HObl292)#6Q2 zvEhhM@V%}6kUjaN-=6e-$UQZpqVOP;%UuMXR~XA(&H}9Dt3d%a@B-Cre(Cz$$i;v3 zb@sB=9>gcUds1rLHgQt9QU2n(y^P)1jILKPj7&S8;G?a) zx6ok|*cA@yUL<+<)D|d$X!RKH_ADwLnoPdJX}`20Aw>iVR|?l23$aI?F7~DBdsiuR=JyUK8K9BrpY}{V2wb& zJy5(HW4z%!xTL0Uzz5GDI6Rv6v;>o(F>}oNKIk`~otgadDfWvP)?1(K_N4cmBlsNs zatN9OxQRV=e+GMaUa2Uy4gOP%K{B|=`T$Bm zwZGRoqSMxvfGVZCbPe|I%2N1Wpv>cRnaTT3f0fBq?2lrtW%%*dy{#$KR<=g?{qjGw z4$%B{0m!{EF;x9sr432m#!FJxbjVVEXI)Av%KTB&T&Ye_A$rP zcmdqYCJ?F;Ku!c6I|i7hCZ|RaloKE+heH91x%f)^|0$u>^J62JO)Dxi?n!BtU;;Tx z6`{767zfhQZe%^kN!+)7u(8(Ry^?{|w}eGZvD z9<1N3%kY5Geb{6Nq{+(xtd&P5*OlqDE663kA!TrekisgF-CtBr(SLw#1~ZOni836B zq(GidnH=BwWr4)d(awhxNPd6y{Jy&5Uod@_z>csel{ONm-v(ySFr*1OV+dar--R3u zHan_=kQ2+%fwr0wm>=FE4?TU|^|_@aT(gcJ6G-}67}yhI`vxm`QQZ@P0AaH;f3Hrx zu&zYlupAPw5Mbd~{(`KywDA(#w$*PN#l3Q3(kx%zfMD#EBHyb={2fpx00_#%9IBBm zkV`eSI%@U(;?YkW7U!nW;_yf)P?PH#lg@VlYt*sn4KY?avJ3r?BmABSgp_}pxxLY| z{BKve^{fdwq9gZ*g5}01<+j|koUqD2W@rcqcP6q{8zotZ-gx09`?c~J_6k%TDnFSTH@FNH;PJ!(8CQ{m#t?zi9`ut zl)BK2N21yu?{Kpoq594Vhhr4I<%}_vvV2o!0*__ppST98YkcEk+kb1CV@gXlK{X8i z9&MPZDe(*ohk)8}SVl0ki&V>sqVXu)kUOAm`eL<)ZFB#UusS@YJf*b+l{LwO*=p5# zC!RA-RceympInA>W8H{*K z-PjhB?RA^x06o41%m&4E4Wu|7Rj3V%6F>D076nn5A_=(D1`<<)GP^y?{QKK_W$Rk5 zY8FxS?HyQwYfz*JB9=n%;IZL?R^3MXP!Nz29nD-n@K*M_;zS#UG|BT_pL7dXddIyx z->Sp~nMrf?;%-df>J$9%(Y8)HTdTLDzFbg36i5<3$0$AKSRp(%i2aHsn z!TE^Sm^o&03Xl`6n*Iy`EzSOBkFM#IPdX~SK#Bz?x0XKFET13*=!>VkcxHzc$dtYS z9TMdK5%cE#5niBPy8pBz&&hUl6h=W!nlF45yZ`>m8HvzK4ci6YENL_huR+FM;vA=f z;cjWrU-n{=lRhJ_US#pfyCeTA44iAiu~WrvzK9V;{2=Y*O^sFDB9sId^S3W@Q766`yXEbs~+n}Yj`T>x|>aq(wxw#X}8%`)*!79+VftHoj6MP z%5n1gm(d?abG41#Ly@ZNSE!3#^>@M4nh%c9!` zxEUd^apb)^B}4RcYT{821*+hF;MmK}8I1EPdt&OE-31vNq{;v?S|4kmqyc|`GgjGz zzi*=bRwr_Rajl!s>*UI!QSGbLmM0ipT9rz1-pS@II^m{*ed<1aYY|@~8@sQMP3S=U z?@OQ#dZZ)S&e19=2F~r#NL=Ps;ZpuzV9}~zVE8{(0o6SmORpy@a^3$W#*IFXM{6<( z2`+zkzq=xKe)Tf_@;t6o3e|~RLy_(!mnwY&5qj-FDY1WD-qm19@`+0ipISy|C4CiX zq@Bu)JE_+*NH(Yqu4hlW_=TAMlV~3URsrJqt*?LO*_(VRL(jo5Ek2)UOs+D%5zMb# zp+{W`9n*YlOB_N%d|L#P{2cg0-3H!0?C!~gD^sX)7vI@jv#q|Ib75ejUsmG)V^&q7 zr`n}01i|a)gBz{NmS*5SuI4wvlYE29(CwNl3{Q-O!l0wmr%6<~$zj>2{-ud_HAyHf zt7hipLNpI!-faYCo%wy=;}K)HrY^+W>&Qh%sYwMh`q9ViAu3VTl zitAVd-&kbQ|HZ3HF3e3aI|sj1s1iC4C@O+k!}eJN(HjkPX&z&Zh2rG?B$RU5tuiVl zW|B1(=lXVs`!wJj|GBR8N_uE7h$A{ddgJq^a&6LJqhfF6i7xbCM3_m;c%{WZF4;$r zBk5Qb7bsust1__;M|9aqNP$z-BzF+bvM=>+zf@6eqY6eq|09g#uPpYclq?Sry@X2s zBUCOYcnFwJ4(BpYn2Gw5g=wia#Bo0-z%BQj!@N|t0H`EvYwsvds#Cz={U~hwBilzG zs=4+cv0!y@T}5V4{qlInhWC7js9U?C=U@V!0;tI z0z>?mqMK)m&aM1(t7m4mez!w9O#~5Qh6HBf7b9vx=i7PAR!BdKJ%0|4{01aF!_IH< zAitcJPOHWDde_Gp3nW{>d+-lUuz#OBzVZ}yOS1BmC^rQKXj7p!6UyMf5V78C79@Yw z-MSe7dkr$zkog)~b!0U4@>KJtekt?f6BlMUH6v;Xt7T0Q$Hg<_=I!`zo^F5;!chxl zE>bJvg&@Q%c@2zo6+f`zyRBNpRf%KTNDhQ#e#Q8fo~$NMZC%Mk_(m(}Ii*)R^V~%x z(O}yF1MlM&GRq^)|M22nvg(Z(`E$CbFTCIIOs7uk%!?wAcU>Tt)Aa!&JDmw0nOe4U z|Hm7myPlOa4}6f7%nwlCZC@}l2!#6iWsIN?#$g3(Glkvr5A@5DXIZAnX;c{tErTV2 zw|tE!%=JyI1n6Xd`u(iasoycjxsX5dAz9)LM>F+6*EP$J)OvQQKtQKi+=RO;eGHbT z=*V09PnRRxR84Krle9lrGyUCM;+{Q2YLejB2yIL>(sES_#yj?X*Glt%sa@>9o1XU= zf)^k7lxXydN#C6dKo)py9$fv>QAbespYGeD;H$n@PBs{LxRzDd8NmyTZ;-?407<@$`ySJ*>T9d)PpE2P&KRn5_9O42pzA~=zG8Ma zZgUd3%kX8k!=If==p=!;2#E7#;I462f^3W6C`lPAt$|yB`3xSE>3DGl?lCo8K)Kuy zP6^!d>tkW$h-Gmj>GWWoA0ljWt3D~q4}OFiJV19KV&jK}DDDjCXxLoJg;WKz!{DlMW}<9ouj!JNuBM|MYG9yE7ZZMlYx?x@;qZmQRMO0mDU zzE|-R-JeI3-{zR~)LPSsJPryH{>zs*wv={a&SLGxhn!>e>3SG*M4@c>x)}R(Xm)eAQeW<-;*R(ekR{Q*N)mJLT_^&~$#7 zG*cWX<{+A8tcThHP@@#tFh3Nk;|JoN3~!F-QI=PhC&E2$0!)MANdRlrJawHI zp5!s$I`QCsp<g@nq%%g{Rrk9;p3M!c&pd^={_RWwsHu4*9Wuy?=*PgK*#gZtCp+ zP9l4Q!99TfJm=}Ld3}MPihn##zA1)?F!u6(wyUkj@;u8Ss(hd+y%Bnr z`+Tn(`4)k1$52Tq7&#`mb1`ywXrke(O2o)NXVI`!c zwo3I>9(%#;Aq_ePhWCynd}W9<(krA{%fOP`?M})?Z(31r{h?cc!A+#5HDfwn^+na^JXe+p9;hwpZQ&o1zvZav~9#0Ir7>9D4{(h#Z&tV#Y*cyw`5-e+1FXxX} zIdStojR+z?Vy!hD?p){SIl%_WPbUqR+7i5?3fyX8WxpWtGKWgr4?+NFYntlj0kJ+x z`O|idW<xt+U^;oMG@5Us$f^m9XmTRGRbu|$1wagVnPqtKm|B$vgVH0an6xE!GC z=ofsfb^16mvH1yEce{dVut`k27Rq4{8Y&WT&@}Q)*HSFbKyBaRiN_TJsp$QOSO8nT zni6cLVN)j$9Yq22;ck_-k2*acPsxkCJig>`W!dKug9HVZUL4tdDn6jYswgZNH%Ycy z3xo!p|Cq7|Kq3ss(LgJ*@PCmS_K9+tEw}i8~MS&NNq>?rWo08HT8Vq!9&E``gb1vP`>id)OPVQU~^!&)Wb5) zPpaml$FfJt0~nLjcVfS~{kv1w-0cX^QY>ZKMI+RpM0H0^w&n$@8<3G~MGzFi!pfC1 z_y}CuH?aElO$o98|DaPLv!oZ`yTNxNNlXIX1d@^o8V&6xwPfdK`HlnWYxwSvdi^Q` zHvKW45IAD}Bu=rfkc~_r-&fJXjMl7P+D27pM{jKTFop^of}f%0pHJTDLlIkLdtIf2 zr5=GaS&t9F_vj)qVo+UWo#>@&yh9BbQ(Mi$7Tw#%#OMV$)+@pUQY>TC>WM~=7!DBT|KF+y4m)n#1>YCkYk zn`*WTN~GL#<8cbY6~YL+`tD1-1l7V+;1s#QS8c+4z{4F*5@nvuXc_X|gpkPip*D}C zd_KmLoKp?uTq8JIT1K=}O8+KiS&<2|fQeXwJOCsvWGU?%-wbZd2*3tFu!rxi`J0w5DKMx7cZz-5A-FN-O4I@u${R`!5b>1Jy zC_|yf)UEh)LKOBR-Z9)h`kwjY?W`6SzXgeGxlgosnNGoXZ`t;m;l`{NA(Z_sZV6B1 z1NifU8?p71z(M=E?jT8y^K6z1t-yG>C1!iu~17c80K zh-ZR*0zOyohuZ0{JKt%OcK0!p9BQ!O=#E%WjPPEA8q_s2M`SlLX55b9?U$;2U3d<{ zy2VPYFP%OhswoKgDlq&4xf557o+tKxU^o%qT9-&%99Om7U>o+?n>-=hE+otYBmmZz ztT5SGKTT8Krpt4J@-VQ2cSD^3Op#{-ZRhEeSj#=euo<^zBc0j#`rVkUppHu7360*6 zTEBgh4V5P|(k)-v)%GPlV3i2+2i0lSq5fZ3@`coTpDE(LR?0Nqzp)0rb+q zwZ5%r)I9&!k)TL!O1exw9muiFCcKDGb4(Ax7Uo4m>eSWQC7X6J%z>(C2pvmfy2sD| zEh2V`n~?jM>MXwAWPcn$32*96hJ07V$iOvEYs&Eq%wfZzWi@kdrZ+NHm>sh1?*UNs zq0d0}4PN?f@j%@3BEP=<|K_WwoE8>DhZ!g=>KD8U5&0OHzKY6n7u~0!6$c!Hym!Hu zU7WOavcNFSFIDW@rUAC+oW$Rxvyj zb0K-ZjvpZ+roFd%x~7Hu^o_d}2rB*fWY|%Iy=!RylnC5Pe5YYQn z#oh@%d4p}iw~4N=_Q^MZT)#|x`5bgsacbJ>gV>Q^H$`zQ7mAk9p<0W<9ick{@GX5# zYLV(fxEuVz0~Brgl?o4AMm)7!jCs8qa~G*m-Eh3s<*Y{A>s+=R@3NFG>x28*{wN>CpU)C|L<%ucYs7{;4xzU z7`-+-x64A|k{nrGUlHMTKu2m2JiF)+tYQre%16?zUDW3SWZMr`0W z@=jju`9OVn%NEbgfaqjTAIw&l&vnf9#;e}oO z6Xv0c54E=|1qyUP2PAUw4YorH-ImDJECTLA?&L^4&9h+#CC(d z5|sxfE2jFOlij=LCL!l~|Eb?W9Ph<(Il56UDRRRMOdG!+&+_5Av2y4413V7u&<)jjlx zJRXzje2gh09@+$df*{swOG_4BP%C1`YeolJ27!NZ*)Z9V`oiQ>32=4i+=~z4-VQV% z^&{N?SP(Lo=S?ahln6u3we+moX47>t3o|->WXqY33?5aFF*4f!3D4S4B8scFlRXE7 zdv#tmt{6(W>A?HN+^!Ly6Ft6tT5&ulsOBP>s2b|z_^B?<$OtyIIH*Equh=fytWyp* zUW=m0!3Yx#M(oF2qLnwlgAKREiGtCx{0{xHUiA)?hniDdcpcc?Y=NMoVfNFAs~M_Q z2wWjwxL49>clHJk_i}|oxXXmopKm`o*iW61wbJcDZDjD{+AQjYMKDkinn+5X3jRlo zCQ=VN?Zn337+*v`#8x)Z-ABxFU@8WIFDI$s# z$Rm5q{uI9aU&8kihk&}6ef~YW8V+@>Y3#nQ_q*?e0cr3c#wahpb=KFQQI2_2@ys@~!6V`O^6m4hJy~&sJWb+Xpg*k0gma{GyH`PnG0|SADc{=X!kqzWp@FLN!=H9=_Yw8NZE}h@N5MiLwEb>}Q z^^%}{TNrxs(6Qqt#i+k(3=b}i#RPyjZc^C(-q(}zXC)btTG5H;FH?y%NCQ!OI#<^%dn7>8h!-z#=fL{V&g zi!GG){e}ypJ-EwwGhue>jp#p(n7>HiHhbfUL-)vTDEdXT=X2SCyK7~ zYUU54cwr_L^vs=`=AzO6MsS~Nd`7na#)4dcH5s#0C8z`2!EkZKqmi$On*CXT!@FT2 zFA9WuI@lPdBT6ycq2A6gaYgz7Z476O3a%qFG)?)t z+Q-^3sL^A0vgEz3;VDb6v@OcJ+Nv&V5Z9K4*sILYkOrDgh!=y@riojjX#enN4GM-u zMAzsaE*|1O2YNrZQCFKmYH$(yej%tKd==x>8UtxyL&zOhG62A21hFEQ~dNDoN= z+(tcJ7%GJqpWDW^%r+I?CxBBtKq-h4uQh{E#B|-vZ;dF*Q7(c%C`@th*QD zVx4~YZl4hmXx#PdPB_ZosEUCu3SOeB$}-`(i&uK_8k_y5>eT_AhmS{mK_=juam3sK z(k%r~Di&30wu$2Q<_8zVfnQK|Pfr3r9Kp#~p`>MvzgdloCvpk+Agf4zPzl(3U6583 z(Gb19Wr^0Go#L>h;76k^3p#JDco!(z=N5=WA`1LKoUsvl#1k2vP#|}(bSE}oY(8QG zJs+$A6er0{Vbikm6^Z(_pSBILr`A9`TOAi~VjXexqf5SPXo*#dD#8M;j9K*w@FR;`JvKaBx!%b+*Em2p{?l3>0qQ*Y==}IRz3hJA@7L<{o z%s2f@O>Ze=xS92n;wue0-QRhAp}6ZfgD%4vcO9b?W$5ODYL*g#{Zv-AhIU@=Kl#`A z7U33}W}FB2n~kvhS7gfW!LOHx%aJY_!7oN>5P;qX*P_iKbwWl3r+6PVhPjq0b`?AN z=RozCx^jM_&0L}X|B@GcK$J34SnunbNnAJ!pGRBwUwoXdh`#dk769mo0Gi*z0CJDZ zV3jXMlUce5>xnofmhH_KE>^h2;4D0Gy?7>RfvNK@MVhZlTyx#)GFa@4F6Upq8vWuY z7asXp9wq_LJXbIa`R*Ngx-~VjN5En|z)33(WirPDWdjKSmKb>BR&>13by;z+K0A}E zBSK0lG(-_kdcQ^}n8u460~Px0##FL0U$7QM&OY_!tdH30bB?9n zWO37d{quR}j{yK=h+EYoif{>DVNl}Vtvq-!p~x$ zs`u8DbFfp2Po?0neiIL>I7L7oygVK_ZN*fNwpa_B7zy{(g{l;`R9XxIoFTC{UZWyk zr0SzgdA@oXw~LFwW>&`&6dF2Wckst)NWaA|c3$?wiBMdf^?qh8^R{^2Mzabq1=lga zp)U8M)YZaZFt>^=aY5BB#9UQGmF##Zwc2JyVv6 z^p@BJ77U?E{&^Cuq*NOB?bX=EbB0E}G{5W0f^$MVPOX%gcek^<@V+DG(mW-ZU@u&t|HZxoY|3cf7zV%G)QAk zBwaPh5g)8)dlKL71*a#TUU>=^Vu5tBshltmKWP0hE@0lUuzLlLS;JRcRoFHHf;S#Xsj0*M zIsgNESOAR~7U{F_WI8b9&4SE&G%JtE5@JpPW!&Q%J!EL&*ba8GMr}$=^c82((0l5q zLD&wxG-11r9+fDWdMU_436tkR`~2$j%nMsxJb(PL>3|%GbI)arf6{3Y9gw&1f{3E_khh^pDT zTae}%&<9z#qE7pns5==<7eZDT+chX+ob6E zB8VMYzqmqI38K1f$?8AJCv25eAD;%zk8`w@7NVjh=PR!w2pV$%)s-Z7C^8mxW%@nS z`%vRCXnY&^B!t^~MZlPPZU(@4T{9z97`*o@IZlj&(z^?#R!MkjH{jOm5P;W8AL~PR zU9k3DpT3a63Xm`*@OD=R%)m@yCuuUt08DvklxYJ2^5J$*V_NPkac_O{z+LT}<`5t}ijs^1+4OftrHaSS}9Nea*xJnf5Yp)4lWsQYDc2fxKAI+I-rTQz z3=H4L>I*V9f0aQCgm@*{Ap$CxmCvTUF(UxY79i9MG>{JXPl4Y)A=lh5*Y&XNLYNc)= zvt`YkLsc+oyNw9$;bE+IC@K(#cq^ZpA>y{o>>}6ih%6Xpe=inJOm`kojyUN z3f8jvDaVGs3;;?xWNS7hfWziOe_O&8zAtJ$AGp92&KV+i%3m?D+T|8%%5NpyFS-in|`r}4=tE3x;6AkD=e-za^Uu6rt0?a;2+1Z zTxl}zS~361Kl&7-Vsc5cMHW0RS^&xkub_qe95gZSGzu@4}GVgiYlC*VygZGQp52$+y@AJ_86@g&f+ge47! zb%?m~%LxTJo6bwPXXtHVcTW(m8)L1pdu>KKFH93LpeMTM6X)msM`Ida)XjUhu8XO# zInWs z#_fN7(?j%5@&N=nn<~q=scI}Es609Clif6jVBM|LfJLd*{Yo;h;60KyGW6lZmxVji zlv__pZR3QD^&gb56&{*xv8EvA6Y!;h>#HV}BTB?}lb5`wBt}XGPIfJv37ga9dS27n z;hfa5Um+5pR@gcLks{lP)-=OE-s%rTdcP0*2}HvfjWN{2YJkDTGH)k(4LZ?;4Kq*(tSJ1&JW8FkKoEr%160@NE>s=v~`1ejKSexNJ zU|4#fju`tL2MwTIjKd3iO`(X^XsCBhXe0#^m7SYwfYC#b%(V$F-H})^5`_Q`#zfAu zN>O}EV|oXp(F^p@7(N(L7Q(evjz2|E#%i$mr@wj#nwt*T(&2yEGp9}YkxyRPXn>@Y zQZ&WyE-abZ;DcZP!TfNj(ib=X)gBs~qP3;Gn#&(CBq-sK7mzN+j4AScfR`212x;|? zq@gH}NO)d+t8jReVw`_Xv1nHI)_j z6LPE})4==UhDZ2xCXNo7x;G-;28XzVfJ6Ph5+(T}n(;_EFn$hCD@{0qh{x*RPJyF` z1n8I1%8PYK>%Hegd3m>=%NUw5tetJkUoM^w&8csXu+F%KjDrL9jIUEsp2O3> z00nJ4lG5wanQRZ<1DcL&1aaAk6BJLFc->-k5u!#>mmWf-xMbXsE<{)7gw!XNtqRgT?N#xM z{KWzPa|yRJ3+RPL`}WeB#ApZ7^^ka7j3PS_G=1$s{KIjy^(jzb^xIb=(K5hf;G;jp8MTo!Vb8Rf2Y33&J{^iQ(ENXhC^+Wrptj*tPJ+# zM09Z~olZbR@W=A$r9O-)ROoFd$wCm${&o&6Y)1Po?OND*2A^-rIhOKiBt=K6*W)lFv9NFbX!zSZB9L&iK6u`a(`MimR zleBy~<7?B;6#}105H?c#^twjYO`2zE!6^C=AyPy)M>4v7TjyoKjLHLiIb4u%oQqR8 z|4(NZK&A*u_C`gRj4ChwX34p`7hAvL#xzu9V>gi99Wbr3$X6A&vmY#^g3oAfXR-Fja8*y7%hjrgB4CTd#Y z6F0G*R|~&yeQzFDIQ-qo#_q-~zJzl^6E*r3f`Vq81LQ!k9)t^o*7|IjYuQe|mLy?n zD)%IoB3IE-6>HSW?xZ>!++FElTcO$|r|SVxxM#VyukxC6EjGt7Xwl|Y{8uv);>Sm6 zp{TTSEJn^L?)VOadmY(RyPwT3bImf@%^W}zoHIA*(H*=)QUxQlSc*`ZDKYr`)Jhoc z9Ayj`cYiexL0$L?#N8HrKNH%3B4(f5H%q_cq?6~yv)>$LI^w&4_R2XvIz727+< ztPox}7<(6ai)5n1D-ETj8#w%^#2|O7%3{}+UGyra!%g9#vpRi)2T;+yO{632?0ev= z;l8_Ads+S$mxquL=NVSppf}DqZ$!<5?6v-DQBi9$p85h`PoSpbcxkUw5{8hZ7uEKg zd%^|SSTcIvtX{K@T~mL3sg0akunnU5WAby3Eg}S~)cZ<&1Wp}wg+X1N24OOxJl0}_H$a%g-O$9zzd38 z)z&uFX7UW>Un9bsR^yaqX`vvVeWq+wqTE+eu=8EPF7;Wy9H;>J`*&%aS*-SWe~NeR zL`?^tDOb8yk8GM427>i|h~iB$=3S#KA~mn=S)UONvnzBs$4puawZhjp9GE0#S3tK5 zUe7M3B0q%AjrUcRS^yBoBh}2b0*2tHW^VNuSz-q6oOc9|>@h^ViYPS~{vOmz;K28!9b}_!?`m zlk5->^@^U)n0Y64!24LVsaLWg)^cPzLpK)!E@*!T=%eN%SSKvHfQ|~M+fIu$=3xgW zHuzG>&o(Smr`eX+d#QrW$-kQa=i-p5zQyYFB?0d_px00V$fDZo)U|10R@&;tc4>2e zn~|!G&DLcaJ(Dj4!qQ5ZYl2Wj4lg?meTA2YhjrQa6TVw+ilw?xPu2{18jB!|T z@{3O^r!+Ml)GMy0$61e=3!`>6td6_xBh8$3+O$YEMbQGT`Z|gEr|Sr*8nckD5_-Pc zK4EmBT#p*A(V01#h@msXsBxW08rZ7~HuJ%=5%|ycMrkiYPv&SorX0+A3pBU+oYk7L z=|#ugCZ*45t`0~Slr%z&;uE_=B9H6&nKz~uNVL*PnV{yywk(U3TYc3j7KJHOnLsoQ>=e?^)wyie;J!6%{OQ0w&6I8B*G z3_eJrorX4Eo_-fcpntEtB{-+yykH>B_C)TLGA-t zz)*_QZp_0-jqI8jQaj|nNSLTIDLH;Y^OZVdG>hkzc)w+J4cu2*H2|=LP~3RcK)40t zu|E%01;q|T1tFUfof_C+BO9qw`h?2${ghr9h555(@JYwylxB5Q7_u_C-Wc1c*WAZP z=39l+!G>{JyElNhpG6ltQRk}(CBm{5y3;CUMG~wGx3qBROyUMK{vw@(%jx+!vxJq5 zUx9>PS{?UT3ki^$#f{=p<^(T*@m!h$35TZ>amJef6Cc(S!8<5m_+A9c>&@@3a+yQTYjkGn%88#ajfhQMGB za+f^wu2V#PQ{$+xxP%9(8qr$c-5Nn?s6-6q`{Ay{bsQ`DH|SI2eclG5@_^1L`hZ<% z>?0nF`2X&yvcI3obQ4E7S>lwhSsd0{7d$RynbZ7n-ks_-oEILhwr^de9^`hF%>z5< zXY+6tFKA}(J~(JKmY7@K))ff@hD{DeK{6M~sv*6+E4*Bn zFRJ~*J^$`WU+Qyu)u|hv-#3U15=h>@WKyb2jKn&tE>>KZPW=zxrRx>#>$9og8{uGW z9JcXHc1)TIi{{}FrtZcEZAU^dQKTg-*iyWt#a=QN?~G%1$)~dv8pQhL->_rizw>aV z1}8rux3ZP5pGiu9cF@B*PnE`z^Vzn05x_Qosp@{lWis=faK|zW#Nh8%zf9$-1b4B4 zxB|v#M1GlJuumN^F&|1M1&3hiS~tr!>x~v91a?AB{m?~{ngIN)TXD)@iSn~YSf9#k zo^j0=?1E=y#KB|mba2k$n16o$YCG6ec0Csb3c1c!Q({yy_t0Xh-m6eT!>$FN{zQ_me zN`t{z_zkJlP|_5R`95cE2r=u8j$2b7+M(X!e9Et0-qqE%zachnaq}+eF+69XMR>I! zD#P$6^Q`hh!|SFklwI39vSy%SBOE5?pKM1D@a2n|Gr;$B%F@u=6;}0L*(6d9A}|ui zkb=Mq(3SRRd+jReeLd?a6^WUU{ep|=HU+K?467U^^4X`x_(x2Oz$eEs9@~&@hufp^ zY&!;am*jp)39yGbg z|JvmqSWv@_4rNCtgGl4z%Nl|kgu*EOkrM*kmT(!w`ot*HszYmDg*?E4+%b#WelYWs z@MI~+>^|F;oxuLR-Kjys2nlBjfsRG1W?XQd0|6lfR*icSwYQz4yh(zy{ujaVxq_{O zYe=^$0hdB_;zP2W8~k2?5fLl{t|yTDIli6*4)0oKKVgweYCn$*Uy6%;2;=%daN zc~zJ}HWmyEs)b0vr#eN5!gH#JXHI=astL;?7MPL3@!iQkNzV{pSldtzYLvl@SJba+ z|JPMKZ)5nII^#>Eue`Qe{*Ntr6on1Ib$9+6k*0q%XUfDVgUla44<)<^y$$f7C4Uy7 z!!N|?ZtQDHmPqS0ei|A%eK&JTM>l!0N{xP026DFSRK|jc9lFf3Nn)pDSfMW{VxaJy zHxdo`t4q5bQZK`khGa^7BB>dfC?OiclIa3b`%hObpe>d@mAWv_%RF~MiuIro<=_bc zMshb7Ah431eguS1miO-WEp^Dlilw+c33BhfWn|o~u0PPwv-B*BVF@(1@672k{w6dH z?Sv19z~0RuXTS`dbqf>j{3t9UhZt+ORyH2@Z^r))w~3YVKD&S)i&!e%JwEOKy57BX za1AX>a(#j|^lN(sT}#)1g|*HlxtHfBTLhX}mE4ai3Z7v1@VxF*Sl{qxmQ6c1dl?K1{+vY*1?K78v=MgHWx_)MoLJ#xS! zcJXEZ_C#7+MTo-HejHN3U~X4Ui zrXn=Mx5Y42g|6#!H()YOGG^b&{)L_;zpb-UpKRO)lH~6;{3WsVJR9!o=Y-~B6U;;p zUjV*DQ@0={OFeSFdu63rAbIvElBhQ5a0gnA-w8UIKWn3BqeUMiiws*3Uu_1zI9N%i zjd@7@sDY}10@>z)#aIb_BOu~`0F0bphobIu+$PiwMs&7{lEYYM__cdh?6A$7r~*Mj zBqCy0z_$a}$ThQez8qI@=Y=2dMc((JgFg8y(sN9ZcS4J_&^61mH2?p*(3HuzNGHTz zZ3A&A*4M4f#IK{>#*Gv0-7lrqV-p#KUJ$zA>5jI3%APOBoa#ZyWxlKvd`6)~qzyu4 zCr}4CI7{C0;!>kF+6wty0&Qlpdh&d^@_uQt!em;pNw)I22`)4bv{eeK7zl3H zcgsJ~Ku?WSF4gV-sm6x59&X9s6hDobw|o=kfxExKFZ|J~Ms2WG zgcg*|j+=(`SyxNlH?^!d=Y~x2%Cx-rs?*HG_@pg`&2m!ViqU9P1G-L#83sS+r@T*M z!q3u!K9y`#+=l0v?Ig+--8H$pe+t;e8$c#TcUQpTerR*Xzz%ZuUBYxv+|ZYI!($np zM(~LGeM0UYe6<&+dYGk$dKo4Z+>JiKrDgU2nVH6|Rd@OF)GAdR+oOIewGm%RVpE0L zXI5bhGHfnhIz|$esy2%L2ai$0<$~cO1xhtZjsP8m)C&U2uGitGR(vH^$&P{PJ&0EG*&{rF46UfP3zitcu#m zj2tS`5W|xN5=(PoUsi93NJKW3BxyY`=cUqgvL)opR4Vk}t<2CV`E?wZSon7rtblBh z)r&HlMU^p6vHpqMHAW5BZAws&tpP z@2r6J!~)_40y}8H6)S14expgphubN_&);a4P*17#mtkiZtYIuMutf7{VUSjo=ya35 zb)hU`Cq(mTP7VI{F~=+n5s-fESu`7n*7c1A7g&(O<5A_SPRe z`a7q@)bd_Usj##vepBP&5wEQ`dez6#`JEy;5rqF$*7D2!O&+eV>#P40ft!FO(J#kh zedsWjy_G2o5Wi+!#STt)sSni(I~`LN_-(;fYautVKt&F#c_g0VM!pA|kedP0Wd0|e zsy`a#v|&5X?umSd9FH87!`!oyaqlYNOy7B{@?*C+w%CnmQ-0@EzItJ@h#49m*-F`G zJX+s&9!zBF2YzYZq`p1WF2AjZzL~ZO_-!TNuOQctwTXejkgFDA9otUY$n&5zjy&6% z0OAvdP_XioPcEinKg3Wmcwg;n-bEu#`pCJu$# zV_#x4r_nxb1Q@5QfYQ%@0wuxT@nA`qOorW;J=@KHMc%A7{Gwk&g@aYUjr&i;bdg`V zY%M{-mh9foJ)!wqrLWR49q&u6O%m#*(??Jdhf&x5YXNe}A_s6YnLE1hwh~_oKn)|O z>;>`~pe_bhSsKlnl)a72vTE5Z{&Xr0qwm*nSy)}#qb^&<-VIhligo2#xIFu{`$T5& zY16~E*fb4%7?g7)qlJ64mjMu$WSz+=X=Uc?(HqLm?@0pq9`u~E*FtAU(A(Ry>j+ll zW0w`y^uPT>nXKne^g|5)CbD%I#5jtRTDQ|Hft2vD{aA35A{mE2w0LsvtQe93P8cPx zvMKYnixQ&*+d|hZYmuAa2E(JbVz~#*i7m&R)z515YTHX&S%NtKKR_PrVvI9__KdUM zgrcO$4-Vs~-u~evi9ous>JNWBqFpxqL7`qNYT^nB19bjlh2VmVH zqS`2y^T@vx$dS|r$M zv_`(rOgXVd*eu(@3Q|?7DLA#OsHZPQCD?uJYiortY4pco4<>GLUcAK!4Ulwl&oHzdlHtnp zoaJr~Sj$f31Pvp}kiwOadV_UsIEca8P{XN5xpg8~y+1Q1UpCT5MQppBF&c_fHNsHf zqST?tO0t1Q=g65<46uPgCi9T)4owP}8=h(Ht*6h>m!I9t3CZUA z5-p<8;I;=k#cWB z`o_3l5+LWrBlG_jtlW7?;+s@+!t~zr?0w*X(AIXe@W9Qb#WwokIf*M zn4P=?SfjcM;@8;RFFkuD$S!DIACZK=fw=VRPLbVzr@#&h7$*jQ4X_nnzE|B5&K~Wl z#~k=eL;=3pAMsy0O-UGGUyF+`y9Q8ktP0xVvB6Slg81fHz#8B3p4O z2i&RSB~RNKK4mJSu^#s5H^!Z!Ia})P>d(f2JbPQBs0L!CWlS!3s1PbW-`{9p32grf zXh#RSD8XujV~Pc1ouP0H)Q`NmtbP+DA`C7ZJf3uON90kaxb@n}p}auO>mcHg%91H$ zSas|AE+tc730sSA>TI87)LX@Rt5VA3HdWhVd~prQh|8gZ=9AcJ{`yz$n3qTElvT<} zq)Bqc!VrX+Tjmc6K5=l7*Q129_FoqkVIlC1I^B)sM zoM&ekXk(3{yd}@c;RscNN+r|Gt!2J0ZS$zhuyuRA6ha%7`{iPVla&RW;W0i?|2t8h zXy1;gGH}+R>O#Ryv+SCjp7#3JjTCCjyCScYB-H#Q$j$-bE&+~;d?$ug>iGvI88@I^ zFl+G9ap#W_pz4 zaHwdk@(Le_gAXi4WO>MPXZKEK$ zZz&4`EL`0kY?JSG67Dj?dEL5YRnk7IBk|#Ekz6#Y7g1c9@>ccvO%>w6rOLe_Y6(x_?_M0tjjhycc+adl)runA5(BOP2IR|#fNZO*Ew z_h1xWgO9kLs93_YHu{}7qv`*FxE==^NJIx?3z5a>rdC@8y2!SAH)=kLIIw3374ZZ+p5K6q)t@;!Ia+8EAJK z>i~i2YTmw)ej0rcEBNHYSXL&~hFY!u$_r zi^C)+qu`_HQ?@5A(PFBODVX3Wv!R|WTp5k*1U(f#<(tS4X(v1ytd;-&nD?^OYMlfQ6R`2OeP3nco zn%Q-zS0yIhYu+js17k#$_O!1y2`EZs*Mv<*&$jDA> z-K046lgRGNkyisB9OYl~VLgn*mvy$IZd({Dz*V=afTb{WiCMD5!_8N_KkX^U8>{1h zcshFqK!(hi1zhZ>9ZKBAhwmJ>-1y+031#zfRq!mMb7|LD4M>> zYZqWKJK}JhKgTd@{|di zcXKK!-(37@y~A^x*ZXvax(kJeUGM$?&cmok*?{0iO3VcL+RR3I5+G9?Y*Gx6VtCq`U%|>|SA+ZxCztdj|deDIC@{R)zFB+cwUv^!P}3ak&9^7gB~rZpYLp zH3MWlt!>)^8~mjNT_1VxM1!;}fog90z=dU6Sz-3gnw3qMMENhQ<;NB5Wu#dKk&gIf z30T%8SC)a#_!^!f(Lxr>Bv@?Vr)so^(4AW0z@ybbt@HH5&|xHKZA}2s(8%wfWZ%hXYW&N@8Y}~WEyeZ zKH~gZC<=}6Xu7b|Fh8A}c%lT``9u<@>#`-o@D3&`~}ZaEGW0rzb_vO@tS-YY3IBGrO#+LF|k z5k28;hS&@Vc!zm|raysLAIQZrf01^`RcCXLECG(PQA}*cu2LSoEK$s%Nr5iA^NXx$ zkV8tkI9i|t2-?08fOG6|Y$P}S!b6IpVhdTGI>yN?LWM85ZZPPPXiMsepk1%Ny9{Fo z$%#-Epyx#C=^Iw?FpXUd9_fDJ9T#W~cnP^#Wn?Jg-@U&^S$@xnT@f~E}WoPW6&+p(7KjWE&7m_@zrZ;?a6bHF7 z3cv826$sUv|1hG!#`H#%U^BChC+^QxhE;sUs`1=c>a2-Kp)WBkK!RM~Z@$`JB;g)Q zhb=F_hkq4*CKwxqWe;gVQ1D4$GBxk`$UN6E^W)VQA_hs*nFhV&-C1_hQonIcfl}T- zPWjcSo+YOsh(U*ylhpqKA`C5hC%G_$#}6D`$vaUl8-q;tU*bhWQMEWeL{q`xBr3>i z)ozlJ1FgU1nW>}54?Af2Rh}I7Hq>^K8rxo4dZ}}nI389@5U#BdzP_MTxS+mICT!4X9!IGtLIhQV zz#Z@-<;%;||>Bc9{tLh5eHRf^_v_dOrnWg5d7hL1RHp zJgoGN(aBL=4qmQNneI8jlb|TWILY1tV;MWusI0u;K6m1)LXqnnQo3R zr^iU`TZmUfYV>hULh*BqnN-2M{nye=$D|RO(>d=4j9bC3>{H4RO#3QGT%51^LoHJl9jx9t6+Q%g@EJ1Nal$aFvwVAB#PR zaHYbh2L5d3pn#t3rQu(Mna#;$x7`8oCk_p9tZ&1jA)n8QzCsA|TsLyvRYQD*ni7#E zL`|unC#yhy3pjrrSw53H*5GG`nfMp9W{g=(^K0}UE@}aHabZYKZvM^jroPqmIbKDg z21;EdRAP7qc<(sKK74#L_zq1fr$$q-);H}HcNrtwUz&H`kVTbv$KmdNm?0W6SENX! z@ie(w$DdRF*C6TfRC?>)1l=kye~IMcZ`TR3%2JTqmd{iLGg_?G8~Kal&KKbd@a)42 zFf2<2h>X1b{f*#g{6U%U*Kz{Q9w2tHD`&Puk#0lvT#E))2r?=UU&)o7HM_K=0J#VO zDlQTAcTh8&C%e!V)MbV_)Mn_RLup@uQve^b96_m;x^@w6T?`Y}%qr~4Sk^33@(Af7 z7_z}3G-^S)8NtV@X3_4e+9c)A7pwFjBMm#L_jgxwfk{WdfoVa{>iq$u_-Sc6GBEpA zvW{EImBOB()d8;e4>|C~&fqllkeVmVYmt~9^}tG#hc zi$Ze2*=C57+{=4Yu;moz5UBnaEQ`w+ zHXz?q6>e_aPuz@i=tyJYT&mQqgkK0R_qXAxpl2rF1R?&mIP4Ufr>9~@x4o+$j9fV@ ziwIyR_{Hmhz&9wVA)k@kUMVd^yeL_`%nP7GF?{=Cp_>L;(qBl@y8z$cEE`}jHd0^LBFk`PgVT{LN<(!VoglsKd5C1dt)`W8@ z&hUYP?QAO60R0xAP9vw+N}d^-Q&ugb`$PhVK_E1X9Jp?5Ds3!ZJj)jBO4#`%-4i#f zbl#9KK=%tq#o6J{f39jcMkc~8M09bu7^|B9tyiXFRLcPPsq}Ex!*x>zl|7b>K#^u+ zl_`op*1t~M{TMc67FbIM1^Wcyh_IKb8MgG}OO)Tv&Ft86z(f^}5!6ePr?8G4BE0#^ zg8Pw|Ef*`K!8m%N2kr|zL0f&>#e(RhP)kbi+~y>Ij*uHp)zCNqitzHgM|Th`GT4Sv zn&nV4jX<6}_OH6XXDcdDb_=f%^bphkK6fZF;J+|nn!4%jeM&#vvu5KT-pgT4;!Vq^ zprVKn0O6pS+TJFgy#ZQreI%Xa$==>q0u53~Sx+W@ z*cFz?)t<=b<^yIF@~ch3*zqwkg@dr#fv-Nn37l7N&~cy{d$0*qbE zpUs%1E2B-6(=9DM`aunzD$pUM5?RJM{aeCSCBD!lM;QK`Iyj!=f$dumGI_+C+fzZf zC*?~*L7J8X80>`GtNVMH<`^N8VK5s_m~2I)RBl@PWrr`|_;sJ;+ud?OM_Z*@D>eIt zrFd@rEVa!FFuLC>61|-Zh7D;owcHS<7kxl}ETw6@l)?9cW$2*`qh}M=*L4j_ET`x| z@0Fjx~uRI1oX|hZbx+2UZwg9@rEhf)lg+-$Q8BJq%9k81+n~}stimzUkeX^aG zZ@xCqjr!ujWZA;#k|5E-76^LI+nYN+9YAGsQmgMTC~U~0Zr*{0cTb#ivovGzln1sk zL_zx^BUhKg?qFVfku(T++iRHhcLF`7hb31tkLicg^JxKsD<7h6YjoHZ+x7!%Ai2x& zF~0i~EctDsRJlGrch)R10^`wPLFzYByK#Y{`|bv5moRud)$wxhfAAuyUWvewFc!5C zuQ}N>1samoBm`=2zoX0d=ORI6OPQzAvgw-Z%0X6ry&4U4kQ$u-7^36|kqlp(usmor#^`Zec(P+JGVyh?t*mYO z`Y5xs4Zv{8;`wh^E?2%z3{leKr1)mtN!U|516io((iio9*<1!%Q76{(_nr+q`G;-GqQ2zBJ+Ch|*oQe&-!!poOWaY<#GeXQY0K zgs{;|w)^XcW%~90cz6?c#AujnkV|DRU;n6;@w+gFDGD||C&zRRA3qF z#n5FwM?6av(6^KJvMV-}r77#3x*)iJR8>rG54A`rM6NUh=c(90R3#O~x$^&EeHqeM zziw9d?XfGUE4XrP01?)Voqd|%Y4VMDwzO^*HCFP?j1h1omzJl_qm}J`iqAvb8e@p> zrtPZIq9AgeU^JA6i@#sU!{ z9j2;@j2KxL?#*+(#oJj1U#_sCuw9awv&QQLYwM1K1n?8yS{fQxCKvG~pu++CftJYn=J3qFH)`KAO}M{#SwwLz0e? zDMJ%_MI^j)uu6>cWXUebJ9XAw5`y7^kk{}^1`?4W#9kaZ(}ytaH}*dsESmto)ELE; z#UT6*07mMG$7a#XV33c>Vb^8B5D zwf2Rt-&1D@nUBzuqu@C&rcHYke&uEqklfX=(lM4-f~W zIG1D^@W9%GFFK@4=Z)FB1n}+L{hyd@By%KcE2weC_s<4B6YZ zQEML2cJC)L;rIT9MSOZW`Q%(w85HAQ7~1QV3uj(TjcTj$1c`_jIi##fn|qBO{CdlC z>yQ8l79VDaTJyThf)4`fb2DO>ZdkC1A{(q#>=ElcdUHevvs-q%WoTP}^u8H^!$;`N z8~wbT(T;FN2;E>WMJ9;&8-a+64SrhEe2VNXysct}C0FpC80&wLwn$vc*}XpQKy;~N z>_4Q_4H9wmntKz#X}S#MVLeR=ma5Lxt1+FK_(SoVK%~IsedbM7?WAxinxc#og-F6a zPsvXywz$dv`at#X896xvTMht&86F|vpe_rNB&TyBrP|ZBgP!!h?Ox2Z9-r+@bH6kK z=~Y0U;UL;iLn2dFM#-AhTdK0s^2 zwn@Mue@z08e7!9hNeZ6w`8V7cG>!ShO@*PzRD7x$T!r#p_q9jX)hqyMW&C=>fxllV zsi%VYlz3}l*MUfxQw0p<%(T(Y;S)_$TX$C{7W5B2Y=ZpoZ|wWG!C3C0NH#{N`wCiu zf6Z?}jsm=pY|1-r%VNWlp{j`SV*aQ1G}D8^CQk#E?DUSla*uL`RCYq&%yCgYZs*K= zXw#f9F{qAfiTIG0hA+M}94rqHATf~{>yg9wp3~0dtD6~Fp+rM#@Rmr5b@?&Lkq~C5 z2qGumD6cvUuteKbK|$XpwIDX+BYZ`{s4=oj|6gfE!uJ9WYwIR@F^=O2K49#7;pZ{3 zW`@18138V(+YpL^L5b~1LswCqYooWjn+LJWOyZ3|=*UgRNTbq4_eqp(%YL?yCd~4x ztkIzMV+yZ)bbxQ~^<=ZmL@u+zzC>O9)*gY-NasHYXt+-&TeP~c5?r$cQfcnVy7La9 z?M!!_813kG%NE=V(ft$ zFAPlt0d4AjJ}J1m-_3f zPBBLH7BQ*6NNc8c#<^Ln#~!Bq!CK9V5IXsDEkf~S9a`CaFe~G!+(cJ!7*6n;K}o6d zPtRB%JV4l~JWWh}d9FK|F#8VGtnXfz)wVKO)hsI*`FK|6H ztk;#|tJHHD6+$wqEzs(FnyZA4%L|^8W6eu$n?o8DZz^#QWOo~|p1-ZcRC;=FWy}*P zfaNmh5q%_geOt;$CrHTdcBjqsG?h7%5#tK z*X$CLrVB`;1y%));2?yWY46LMpsbzz7Yo#+gi5$6&GdIQGmhz)rs5p9`3!6oC0W9B z;+(FR*kA(Fd=^loWinVJ8mld4(E+s$+Riv?E_YS~tr#!lZl6!QG&g5iX!G;(UZJ@U z5ppD>1}6qRK^n_oGW=$$og+^(*Z?!Rj|xQ-FUl>xCOH*e0U-+59~vk0qodIo2$>uKby2158i}hag8b7 zsr@@7c3C}#%q~V2{)pCI0h6_Y#$K&wuj;(404QJ&;1?WEbgcBJsFX|C3r z2&xebTo5}2mbes@L%j3ig*vhQ>H;!dB`<9b6dSAu8}pMz*NJ1Q;@uK1zq|s346pjk zD+Iz|ls$*H49v%&-XcorA3tO7@~bxbpp&2f@VRm!YLAyd2nzqfY!~79+k^jC*q~q0 zBfA&1%!j#}&Jh|9J1<{d*G;)kesu=KrK(6rW47-H;L4bh`Up_qM*zxPa` zdkJO@TtP53&SS}kGKSnW@EagVxwRz7^AesGP(?CxC<7|m)klUot6C@Pfdji~L5`Nk88H( zS|0f!vwv;YG}&gcpVm-c;og|9 z`eq5(P#b4k6AMRcO)4YqO896C2XqpXY~^F{jf!ztKZWR6o6>?7i25F3hg-e`>|LwU z&*IWSD|Z}L2o!3s!Q{s0MewBcbwy>1s*)@i`l4*9ZwaGyJMAS6XF zXx-)*REdq~8r{Pke@>pCx_h=zVxtuHB~y;H29%!sh?c3>wWa5nz~XDeR`AH_vgPf1 zaB;J)Jw-A8vq){X_Kn*rnT7%uL)CrMoE4jJp7gVydE+TzgewuzfZO+qm!#E2Eh9%JE7>;Pt{+}I<9Y2Y0{TDE6=+GeLD31KA9D>a3=XPf@j!~xV zZVAUcR{(VxBZ(eoQjcOd{BA2t54Bru6tNr`0ec}CN0sA8?YX(l0TF})P6 zV9+B5mh+smPXZ)1K8`B}`u~WShY@;=PzWY4`nP;!FCJDo94sB7*mwzwND+E<({L8) z)Xo^)zQ}E0u1#*1cGcO$Hovop-&c^&zgiR-_SC@P%}u28^DsU+M z@U)t_fT*7sSJ`fZe)Lcn#x*JQTkoS8uGq!7JyTlL4`@Kk z6sx$pFl8#;P;Qull9&cc@mOK?=4>D%hlU#x)a_&;8%nLY+^;s*8PLza!XQuXhqwJt zfQg=nD&}p z1N(+PKi=ib*Vhw|crIhTc#Cl0hrhX>A#KlXl^=tpQ7AsB;92^6QVFr54|Yk+5Xp}U1@te|Tiqylw|{<4@&~sr zN#e-JjEy9Inzw1rCiN$%Go?aap{o35rbOe+s#c?$#5?*)u_6|qFZYMvDa00HLko=Z zH>4mekz(mTJaS10-oF|fYoTRpResqAmI&A?i42L?WeFm6Ph#}+KIE9Q31h}|-mBg0 z1k;-Ilm;;#u~!!&QpS%NiM*d=*o+2~|sE; zeSH_Bs(Hx(_iFZ^qd^HB9ImUf51#c~(jfCjcYKXwUDwEx%}KANfngoVaWP@fzQE|W z3}Zm7QO#7rz|+DZQhgC!qKY^=>g*Vrz?fdI8F2_mP|OImL0gGnv}BlE&hBh*1RFn< zgqHW-6sE{lvf=35Ma89v@03G3;des&o4u(WDSSq!t}>N%TNkXH>|9G#S!vk1RJFyN z;HArF_d{p|_oB?o#NOCKw^@v1hD0ZrX{QAR!_`zBCDIzHu6t~hG9^W4IWh_?FdZbh z-|n2w4q;N03)8-~*;tQqa!7_UR_@J4V_13v8KJPut!ULaS%+F%qhf~!J#W=zN^8FA z*-O##1Rm0PRLSHFs$#2&wU7LN7~#gcvt-yrbyVJWO{LhdW){VY4Dc=QK}RMhf>`eAey^q1*DWR#izu(}q&)<2G^sgo zOp*W}^3HG|sQgGdjn6?hKIi)y6ibQbjct3S^KK zxxGG-C`*yTBh1Fl-n`x=czw~|cIo}E|LCpwLbb(?ZCoIh`r&Da#%b@Hqgq1H6vlRD=0CpR+w1(z8CrbefB5*>F>}+H~$8qClcjN|k zm_p)K$n50As(oSAUV{$Ogumz;)|6P%xll0LyBP;Fqj%DjhZf#F=%UER7AuH91{|QP z`tL};rN1B}vkw$JZ$4Pjo;JpXs|Q_x4hs)<(t-_~-OV`F1SSH!@&AJ3cYG4Uj(X^n z1ksf-zxD{dh+>$>4CiKX6@G8plUgr7*e>HL#I9Hm#oou9`t$)kC+ImhwSLbVlQLQ? z3Q$4GRf`RJ_d`sjBEqzk(eY{y)C_+Lsr%>aoA9y@m>r3|)EyMcYwus(|A;}=gn%=6 zE7^T0d6s9&t8Ti}u!qOZy*|6DO@9Mnh?vq*$36unQ`TGJgY}Dx+*`}CN`rt5<1;Va zEWrD>8ygMXQ{YwZq-!+b zAK`|j;JqcNvNp(4*@a@dr*u7xzz)fP!C>-_R*8zPJCnGJI~Xfz z^~yA`Zxoz4bEN)lD@(^u&;NO%R^k+6c!h-KF`OJVFNa-4n{-ZE;&e%HGc6zhR#Xa*T<3?G=NLaf&T8NLR z_G;w?Gq47(_ANOOGz%+7nC9vt zz&u$6^q*hkzFaD2E2Zg7W)N)k?LivC`W!Pz2ih4m-{^0-?Lnu1p%Whn(2ElOV*S_S zNPac#oS2qr+2S)Hro&mm&=#LY$E>0$7X$b0dR_~BTOvu(mKuE;F;wm{Z5O)CcZEzy z@(u}^#Y+h5VEt3CACCe-@4y5nv5@hY0#|Pp$jugoz%M^PfIAR*O(o~d)uF>kHc{w6 z^$w{nb;4jgSN_)K9ZXBYGW(vh?@$Q;;B|rBvDdf7eej#4Wn8I0g5W5UFHI_(Xsz_G z@X&U}*%om2PeL2_-q1*H(rcqePT#+8afj!@Cs=c3vwFVyyJrcnl*KV#p#2t)h=Awl zzxLL)y@}4*dTP%q$afV!JSz1!$wDLD|6sZ&P=O8EqGg8y>p}@qk z@lKxZd=D6yhnYBJwpkfzmU8%z3NDJe)7V%$G_H*`^scLmaE8&e=D?Y0W;s2SVuh~< ze1tj;5#g%r@9h3_)bv}Qz0LTGYZ%QWgdmnQ!V9JMH^;D7zkedovr*dNl zC|fQ?20CouY;asj9NGds_EutM+U@PR)GWf*=ctHH4Pkq-bfc{)MEqD4*j?F{4XTp6fO;zhO7bxN*msh?W%76+4 z>L{gU5?l$69$yxZxfRFJo*Aq5$G{0(sdiO&Ml-`|EYJ@BNl4afBsVgr+>=uGWLcmE zl9%vg&V4vkM_cg%WE0IzaQ0bw~WdH%|z|1BV zKvHrmP54$T`}2xf^i{uZI;b?J96hMi4 z006ig68ct{ba6ajEpB0U{Y!=gR_K|bBx2IJGNF6QZ;AqQ{7wsX$=BCP@Q^cA=MQ6hHE_dCEu$_Vuu1GZfEVsIGUMN{#@9@Da*R3gDAx__ zt>Yg|97t%!t-J~aFeM>1P#jy+15B950m!AL=xL&p)$bE?YGd`Zbf3;uJ6LKh4t-i_ zIN})Ui(&px(Lr$kqq!BVu>K`36DKo}k4Nt`5Cr0sB*W3N7^zYI{}tCvWgbf>0<3mz zH>5>7Y1FiXk6+EXM>sosUQG~D3Dm9whlaIg6|M%t5XX@G2cbpylUG6Rw;`D`pA=j* zoFGNiNi}+XVGFmc20fPV`6h^ty}7p`1EE%be>rzPb1RhotpSjiKzuYQGUnoR^Xi!n z1&*;Qt~w<9LtQ+#eDBN!*VDIG)5SbH^+t!NqNpH+ieEQZM;CVp76vD`ACd(sN6_*@ zSTnH}@&Wb%xVKC0X)zLDHfJ^^O*t62Zb6rJTvWN`2;B;Zm=H*S5yKKFsU9J`(_pw| zWov-z(&E5tB0um#UaVU7MA?xGIKt4mCV%3Pu7^;V&ui0C#wsJ^7-1bqE!3G6 zvQO`Ryjo=t!?S9kSqi+J@2D~CQu#2tDM}y5zw|Nz6Ea64kL%MgX_5+4KS1E;_o{2r ziP?Tz+v(3l1V-iDYj>1Pi<{V7->mTDAN`_eoe{Ox+0J`MfJ*-z%EBsCJb*kjLLf^n zCSbY!9C_p7H_Cq@Y0;yMOfq@Io_ntd$P6R01f$p5ylBz22b+XpG>5s^AyE|>$&G_F z|1-K>)2`$&^z$3{XLFS%&~h2KeLKMrP5TO$sTFhf1ved=eM1S}255Tmd@JJ+;Ma<1 zQqE%Mp7NwZ)4W{=gU;^Die9F1f0u<^TIaZGX+sO$*6TjJ;;#g;>Pvp$SYyd)%@_NhKFWH);aCVMEIVBAN=_QA<@FfM9-JranaLg=j+wMJe=aWUI z;$RWzs>2Vh3wut_i$~6G1-gxP9@i0#UZ1v-s$7%x1n}baDjjNfwcBUR1Z1q;;S{WD zZO7NMm9i?ZXC1i9M0!UqoGg#WsszzfC_Dk{+;;sQ$5oi^An5nf&at%mAqfofTWJbc zS<}4VJxI{n39LN$FjuVn+?LuWz37N4Q z`jlT1`BXxS$m|o}_a}9Eo&_n2PRTloJ)W`59 zV{mv>iA107Pb4)UCRt`-w(OGK=5J392STEklXZmS@#ojmFypv@|M+lXo`baS7!Bt=5 z)Qw4xf5H7-HkozT_p}O}VGJq3V`AV0rw3?OA1r};O%P*%G;A^q&(&n~4b>1!0yyUz z0nB%Qt~!mU^|bFkvo#vk|8o{WhP4?8=(XN^i$w)onLo7rh^%)bjx{B70=*~5XO`0X z{$Bol-SF;Zr*l(|c<;9u-rsIe5s3iYwm%Jt4cQC;%{A3ED5c#qt2JVIAZH z(+0D;GPcDtR#?Qm`yh00orUN_p5v;_tC}qqNU0+dQxlYl#Q)Amus__kQjGhxHos}@ z`V7QduM;h?)36+#R`9Ah!TC;)MN@xGST50C;|$r0gKu(q;-(cBlk22Gg`{ELBYTTD z8wuS+2#d3beC`I}7Fl_p#0F>L;6aEdElM-Vd zGvBz$=SDz~f`cEN>Se4pst{030BfG4KE5eN{u&!nw9baIqFt)(t~vX;bO!fYH7i({$^{L&)&?aeUVKY^8ae$&`c?t^M+6Cw*@5=N3ls4Lh zx!N{DiHfWVJ$9@cG)2IGyTuvZx-rjhj^KYB9Jeo|OxJ%?nrJ%Rb(3M|55H!@?%}L} z>AOrKAJBNDEb`wXDg^@@e!}~cP=^IU?0|a^B_RVauQnCr?l!JAPr^jtMG2p+eE#r$ zWt_auz*E$(?fU9P$eh!(*QITVVV!s}F$;e=XQ4i%jH*yhWxfbB@TjB$HgnK?vO4z@ zd3GujtLiZJ7Tr<;tV@Ky#JZqX5ZH7>^CjwmzbC2qaD^V(FO*8LVq2C-tI;_;My8O= z9p3JIeY&S3PWoDx%(&M1B#8NHQVUI!HV$V6$I_5d!ADcScW0+fCkAEZ=U?M!jSt21 zFgdL`?f`U`@f=YBdW19d(_@f9dh5aqSx~9aqd*^{>Ahr*Qx7L|(b(U8|1h3LMsWzN zGv`4{hCmDh1{!-UeN8x`KDJiYm!vCIi& z8O^MQvAJE0ck6coLe|X1lEiKD;i4SLo*9ToWG&cbFsXp+2OS1cm4AjrLgHvS|HUQe z%or{kp)B&1J3<7Jw&J(RRJWS7hE##SMwt`3>LfVbtARwmeq)CyhNyFn_PR3HVRyry zapZK^L#GaOBo56TxjB(vZWDVSRM+ab6d+fDcSC@tCBzJIKxI!9P;`>5Rs1

OyNIE0G^s^3#;sQO8=!oi0v2 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 cnSF2*PY~5T4;xMJ-lZWA3 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

T;uhSRkvL_%`}0(s<=)z%usj3halu_kNa5`m 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

e)rlUQQ!+oWTv2e9%3 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

fe()Nxr4RPDOo$|6PY?ifG+NYW%PgIp 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

F`W0g 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

!?t@F;kO$Mn_SF?cf;Io}( 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 z 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⋙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

FGB;^OtxG|AT4E)jx_J-`5~sEO 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%0AQK94E&CBK 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¬^)Qt!uB2E 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�j2ksJ9g>Snk$MXs9hr` z#K;S#bRmQL2)^N;3*R&)mJn%jb)jbdulTTT)7

dMu*CY$zbT$as_Nq&fXgq_X#h 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 Und{$}f@EwaM?hlHSQ9*3-F6hrriqbyMoxRq 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 !`K*c?TXRqE8$3A_r2huknO|!PPIY1c!e0ENdJ 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ⅈ;>E{%Vy2Z9NSh&5C&-0OWfLQR`xV$ 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 diff --git a/kernel/tools/perf/files/patches/linux/patch-6.12.54.xz b/kernel/tools/perf/files/patches/linux/patch-6.12.54.xz new file mode 100644 index 0000000000000000000000000000000000000000..eea7560b90a291ba01f597326a90a41881b5a3a2 GIT binary patch literal 3096864 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�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

&RVeNGf5jHwK(JL>lUGbu~P}B)^yrP4wN<_QJoU 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≪UvEGUeA5ua%=oqEEtZS+oFDA`x~KSN`QGD|Yxl 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

S*ye9Gb zq?6%n+?bHlkTS?GOt0Pa$M~}|F7;7Onp5E zh3;H5o+9jc$pHA0A9vzwgymP{UiJYVMzy3^%@M*n>I>>X)(7NIW47qu+O$)yT7(7| zDZhd&%hN7e>*Gs%lX_5wvT*QuvN$Nyw}3nh1oZwXviy=&B*+SY`0dB)|K`o*Yas>pH|U{z}$-R~9-( zVh7HFvS#jbgI^E0ZEd_OJT4R{Rkp?Q77#8V5IILB*;?pVSjIj{uTNk{`A6{A0}eMz5ko*suiZMWZ+}i$q(4*d;B$0B7T8! zmcYwSE!~V2Sni`Gu)UiRn2CQtCq(Ly{+x`Uoi!${3fP@QTVFgG?OG@)XyJQD&S2Cp3HY zm(3DHCDx_%gTQBRN>!r}3{(|V-q%CYv#iQyD=M5_$Q5IPXL4@=CEb7R5 zdS!{Ge6F_MJM73avu;-8<3)N-`dlt1JXa+snbkS z(_#h#G60$T#zSL!ZN?5F##8%j6mF-pjk7`9ncbw^5yU{o2qlXxbs1ENb}|zvHbsQN zJU{u3iW5xeA$MHmTi7&eS_sVBMhnC~NVwKSdd5UME-ksjBSfea>v=OUD7UzH{0Qs` z%~d@-pZhgq@yd&kdjE0of@2Gn;OyUI=Lb>!9#8n zgQ_auP&^c*p-Aj-4))?Hd&$9}@`?a+7s7HyWYF=z!IPy$0}!U4+}!q=${3eO0gANv zTaMx`a1~BLLZgHIbkfgjdpL!v*q6`tvSG)UUxl3Ix%t<^LoJ!0Pg%l~?QWcjHphC(@Ys{`2DZ{`CL*6AUIm9SE!$(Tm99E0nmdPfy(~Mnss1uYxh)WFa(sZP`0nqVA~^JtH-mov3-etSaRWhs&LU`0jS^ZFZ|Z~EK@bS-{1whi7+d6ZX$haLPYv+! z2VomfW}t`7ZmJ>XJX_y4G<@)BGSxk~FH?TO|D9P{jIm;jbyU_!q-dxG7d6S;UZtA<-(UX-dj4MCDvjkB59fhclZ7_`^0dkGBn$ca%EH8Yg z7$~jBMT9?Gt#*1W3>jpEVA1ZFuWb=;OWlc+d3c$ z3F55&`MM2Fd2!J<(~(8c{?MzvIs*#A9D+fv_yU6tsC9ECq_Mi9g6%Q@TGtc4cM zTp1VxPlAMLfUL_5#~__io=lu*xqdjlT1<%Y+}R%zo)&mL665ywaFElr~dj2rH}E@CyLZCV`yPtu0nfi5NG=mvf;pw2m{U> z*k44P?mu7JHXn=UY8v!pW)Dq>ac?lEA(ztX2u7Z4SV04D6V~{0y@28&Vi0r~syY*H zEqrJkO^KMUbsQ=f&!pQnvm(doZNg+czX?&be0WcidVzXH>Otz?4d z^ALVhteGwPmg}Uq8#Yu$9v5lpFw@WNALHEPrG*NL7_xM=EFjpL`hqFU>)d~4cbvoy z?2*`hmKoNX86VAu71iFL+TuON!G|0mnoLDkqb)D-pm%#I?O&4h{>!kM6UnJE9S{hucXK528VN2D=gl53{gJ!CGR&h!Y6^Z zw$5?C-B0R2e;J^pw=L^zVO39iI#+UP2 zUIkyP1{Z^=Ik|j6+Mk!R-LT3*)&o3(5@z~d8KVn7Z%4^V4S-r-m9fb=1&+p&V4MuW z#&0gk;ZLYla<95`$81>dpLgserfk$7lFboYbJ0UiS-aX2{T^_zcatB;cZ#jtV|dy8 zX&$kUtgCxIo_0>eMCO!N?ql&3vle2gDH=h5|C~ZHJfemR=BPDds?TDR`w_$K8K z0S1epL_-DL%sh z)B-K#4byOl!`eX#Y&miiTPvG_p0`^fn`w~t z6YYPq5lw#S?4s9`Z-Uz2JAfL6U)p^d8vC1D-ZEV?BR!F({R|rBR7VMb3SW%XI0UNd z_Ns`M7VPSCi4{w8$9vFDQVHC%&ENaWer|bDvCR5ort$%EHpi5&u^`BiOW!U086N0* z;i&%mz(#O9I3e-}bKbi#C+R9;)W5KD+PU5;WzNE+d&h^im=T@mR=)#Z>NOtF;eDL@mhX0BVRmUrIhQ* zYDmgYgZZp2#p(x4WsRSKE^?ed74nKHON6XQeG!JT6~`g|H4zhV8axr*a0Rrh|2tj& znn*=!b6KO?D2G1>>;&H5yf#6gU404czYeI)G{c17rfwrxG{wpi7B$O@A?H5kft$F# z8Va<(F}jUbF=P8WKPWHY&dUP#r?F8(FfmXNNl27f)X{48A}4cHP5JxS=BrD19Ul@5 zv+n~dQPNlMYea*z1i8zRBiNK?)`9kY2KKiD^7P#GtNi--{wd7$9P}h`Rh+T8hnO#~ z_juuA4^g~~vb3gbL2|_^b%;s!t40Qt=K8qwgIM~!IyGV&+Lw!{^J)287#}Qhc$LbI z3WjkCs?!Q=S?Vovj-;s1uJ#<=Rv8=E{jK)8&QXUafKw0GOMXh3b=PBHTW+_5=LS<-0$B<5wn7V31LGmWJV0cO%N5djOg%g7hhPH7ql1u{&* z9O=chrN?g6)XursfB8*+%y%}8UP25;UyjvzAaufTey_}qnyYjA(8mvhhl+gQY{n3_ ziWdePyDH6?Ef=^HYe*8yykk!~68~Y`3x0&>s(Qaxn&Hs6N$feMog?2-IYjC$zyDU+ zt+h$=?gkeJ)4+G=O6YoP0Ya0@VX$6QaiJd&;Y5&@N=%ckI4C_X-UV zt?m7la{P<+@jd1rQ7f+PO7<;aP0XIy(+A2c=N@Ut1zlkl`ihXYE-I*L*N5X+W1-|Y z`Y8pzhew`?YT{@HC|7b8c?%O(J`{r<-ouvsUTSB4vYjxFym;xgiF5Q+d&sLCC4T56 zLm$dH;V@!@&}186AhSD=dIs;GFxAr6uD^SE`G$f5^pFIl1y`8x4%(e#A#Z=m@b%C6 z4ydLGCYS08)1}c-k?$bIy|X~DcqJR`#s#+>x5Ofs=PD;s7H;Ob5dtL3OSt8#RMsR|+SzLiS%5bx2jMG*B zJ5x!b@Da7CY5(@)xx!Bi@e{HzR7p%PW%rKE^ZBF^*zwJ3N~d{Jm{#5pWLc&CUDeH+ zmmR>bTi#Bk6 z;EpurP0;m&0;ma{h=T*~ku3KKE-){$1xRH3Y6f6`B_;e+KY5G*FxD2n=EIYOwCoG# zjH<;ku>`W)Pq{Sd>c#lgWsGCousl7#9EEORfDxj6b4;8gp78!P$UlFDoL#{YOmA-g zkPL8l>_x`uZ=0#W-WR@2W^Hy`%ovWynq}S@qkxdR3-pmN>d^J`5PT1lel#xLD+ysh z5P8;z=tpQ|0FUCuv#z^Kz=t{&wEhR&uijOU|e`*{!SL|ZKt-Jj58UkaX=uq`#uJB5w?c7x9>r$ya4T*QIKGS|c(}hKN(=uYxWrLbsb?^OH~<)7W2ENM z(teT_d8JuqGYVE0g4fIBif$N9T*H;}*}oX;NGb$A9A@6#;Fn-i_&=O^34(^MxMwlz zyk9*}NrYtm8p%h!wYOeI14_U`LUr+ZA@Z%XuTsfpDAmn5ia0@z9T=CI>TvX5R#HgU zkm`9HR0!*^ay}yY0ptSIS-vt{tuFsfow)A3|J>Q^9Kba+q>w9rEB9WeOY_|lJp@&R znu(`Y{oFWOR%lLlUX1Ckp;?7)c|(Z}Qdy*`5!k)F{MZh0akmgKI6CSKp_Uw%@FPwf z+BJ_08X9h3(UTc@cgWwCoW=vdzC9zIgyPjefrG)NYCp^Oxt3(!y-O}6WY_FehxR~0 zau;bLSvDx!-!*=joHxB*nS!MxW>yLZ*+EoO+rBxBXTeP2EruZcJo9b;WH5|gY1mE3 zeY`q3VraC=lOt)l@GdPyPZz|;jp6E6LrAJW@hDq48L!HfHdQ@K6>Q4(oUDaX@SZY6|w6pa6!d?_@*a+D6a8a<3(%Pn|G2IaieWWeYi4(jBB=bBh{;5^Ol3UB zh6grT11kRLLDfYBDmha2iZHA6SZvWCCd58|(m}eh-SqVi&h)ODF`wa^(j+R4hv@U~ z`riyR6{0&(k+CqFrovCeBs=5=x`^JJS7T>tg;LX%2x)(g&KklYRtJ7;P%xut+x|@e z9XvBH0_=!9uxUsVg@U3UAllfA81N7~-(`*x<(z?LTD~rb9RiMSHc{z{EJ!vymMLuO zUWMRq;syhMqimTc%^SXWOWDs_$UvK7YR!lFe}3DZ$p$ZCo=xyA?aQWF#zTFONfEvP zUyx9+@%rlF)dyK27Jbi|5;9cL1Wg#}s5k*w&rn-Gp$l{$-@wJ%v}} zi@IBYb4P=bdiZK|N|^nfm}j|W4+j_sfQ5|g#Mx!;uF(fdOh1hjPG!D++hOvN`)xmw z=q}}+k*KMnND&KJsgtBz==5mC031Fq0QqSH=t6P#6&h>w0Tl-=sL>?Y6S;F|{CUG4 zofF+#Cx$w9#;SG59$o(Ad1RcUgFoQ{=7S%@zArk#KU2* zSRK@!+Qo_!8_iVDM%8$E7`iRf=5D>qzimA7T1H_yzJ0xT$v&>GFI@u{)kJ8~+bym< zD83|IkB1WqJ9Dk`9#iLao(W4x+_0f5j)%Ys2fakiQ(27w{O&40*GvO9=;w_M#sHN4 zJ^5s3f)XERF&|50RY22H%ZhHyucc3nocWR80MT}3ad)YqL8W_~GD2FN{?lEcC zPWGT2p@|$V9~?n8>LRp$5~B6#7_=iVE}F`uFO z+J^3W6X+I(De$@H_&SZDobqqAWx<6{5}{CgubszDXW%Vj->U%`yPXt4o+xA;-Kb@; ze;JICPx4(N8p^?ME=*olU!#GNR9u}HMUNDMVLH}z($CK+FQJGe$zmLfJDm0iLy9rq5FsX~8x&8zgItv9Q`y*XC9FTfO-FkKl+0n&kNlPeSv?rSpK7-53YUV(J`6ql6l{-ZmlTH~ThZ4~*si;>NCH7F4WALAE;zY< z&Z0goR>};On?a=QD4D1S+F)pdqPGVA?XEky`{r}LEPfX>e7%EwY@||_Z}(ZxBYpbs zIMu7GVRCa#6wJ8?GQx(-6~y%913i1XMW2P}66U8IlDl)i#pxQ1&n5g2J;Rkf6ACR) zSlsA}1NZQoFa{{Sd{Yw{ex9&sVkdis34{@D?+xr4?cczmYsTUrJwjlRU9ritVQrMEkC*>%aE_02itSAEB$5+LSi z7ani-_s0gzWd)7G;HiK=?R`gg!P{ggFjbIuNc@_#t%m}lVV*z%R)k(s*yvD*{}@DgH=YRytY`SSP?7IfbdP;3zM0!Gvk*8PMFK0 z9L60=Vjgs~O-ZG;a>!Ni(biKP=$MCGq|#cbKDcQe-8NyOt=qo~5Qr!}lWN1})?Z8d z{%(Xi3n@3gN;^@a3Gp82j(-+rSmt19#ipI-jFY6Y4FF|Iyc~p_wzOsZ|JF$TP9IFl zs2Z$3`alh~cZgMixNkB)GuK}27!YbcMSsFiU~@dl;i|k32=P5~!fpwgQ1$PC1toaj zPINO5Z*(U&l8e<@Lea;?QhD?s2c*#n?GcAG_W7{=)F|Qwm)V2JO@>8NBxT+B6k3f^ z?2{~FJDSG4H&1CbLnIsk-P+h}d91DJ1B-MP9{jM6^l=#d_d69q2H5Z%kg148~~cxp&roq?uy!6uU=O=&U)LV?QY3+ zBuCNtB?g$Zk@=0JnbCIWv7|TgeEEcnx#cNd8;PIAHGBxoD|f!@RtALvojP4;fmhqr z%-@`*VRH?#Pw@g5=_)zFbS|6T!p?Oj%L)A}z?YYFEgK!46VDie?hv>_t%XjF?*L6_ z#p3PX<70i{w8ji|VJs#Z9Ze8rx3#d>?Oxo;E#2M1R3k`ALb}cYZ(PWg`iD@~RBr-f zYQvz4>k{BX1n29@gq}RO1YqTEf*+^#LjaaElA&dkpm{{38A3D*3BY@4X&qj)CBc1R z#aihl2P&P8(gHXXFgZ%6gc{~|8i4%e$hloLasHoFaypAG0hum-n4>CNk@)h-crAY% zMRjo}Aa4j7Qnu<-X%T&!(gIDwrhS@JO7Wjj)r99)dJ<1X&~ZKK`q1M~sz+86p5%%SNCrqiPrCwpXm!am!b|o3fXH zKG(*MFH3vR>y)|0GRaS>xci*FZ%eC{=CP8dR_%w7o7@J_Nbj15?2nR=`$eu|Dn3Jg zI6RvoA&my}PB)giUE$H$a~Unc35}!CB?E(5S1RZe_W4sWcr6z~%TxW9?M0rpZ4pL~ zhZ%?GHYXzekGeEyg02SiT>MyCZ3hf+Wq$;$K=RJfMncv3&!=Oa)oZ;_RKN9sRI8_B zYR7_fECLJ=e<@4klG^V|DEUbk4Ae#VK=H4v0LC5+`aPZBoc5{LsC>S)QieG+?MWZ! zjkpnF4iB_4i$OYIfhB?+j}q|pxp8lxg-BPQr;YK~Zn6CyI;}G8ek4chW(JdlSzdzf z!0F~Ad4Zor4~b1PP2&2(b*{?7N+wCb4o6S6cI$**`l*${6?`@($TKSi9Ml@+G~XLA z$e6aJH!!SO9t}t5daR&^GcWJGh-c%cWuJ$j(HGs|Y5{T+3}wip@I9dZ&Am^WAaxUw zaU5CC3;m>aZvbi_d}WQePKIsmw%|^kt0f9n0=$|BfjSkTon4Tm&lh1;#!S?qE|E6x z2?j|06FQ!pP!_wNx-P}Wxw+FL$gjgIJY51J1wJc~OQ^4Ny{Xm5&nJ4O*=8LIu| z1}XO4Sm^`0BX5k2O6fpIgGrSqFBf-TaM}x;$UHZHvTfm|k9_Zt_L-c6x~w(yB;z%x zpw>r1hAUkPM;+Yp72ay(U|R%kwt7jNq;l%gz@8P{%PJWGY1JD!p5MdlV>!?r)$zs> zW&bjh76wKjh9S>FylIGG36?&1lyeB?l@+gGa(|cLy^@$GPwW-05DF|qOZ^dZ_t*|f zeUKv2{X-$WBgnf2^N2i%=>0AMMEo~z-{ysW4NLyLft|RLFOL&YN_A6tOZGR+pnI2a z!CUceU$}?swp-S(Wj@;W$~j#rk;g)9-65X3xD(?ulha-`zS07n5>&S1jOSrkIT~o! zO_-)s@idjt;BV`1x0eK`cj*6qC2whIsRI~g>(HU(7?i6=(CvYe!)iTOw`XcZz{zs8 zW-{7TmJcUNGVGU|HpI5U0PV|bS_Bgwf3#f*B?3$G!q*&O!-<5NiJfYF)-f7gDM7I- zLWE_~;vr?LgzKBjHUQc=Gc@Q#{j4tin;+~FO3NR0>0k_NLP}rnF{ImF3J^l*K%u=_ zdG69Pm3X%_9VxVg4KIh|Re#NFFV8llCs7?8NR#cq5d~R$(hnj$PWIA(@(;F!r1On( z7;4S*LVN*AW3dbbml@z7)j(}4Ox;-xz$dp|RSCoH?&uEYQw_BN|AIaan|H_Ss8#L> z7;kct1s8~AX93x*^);fUh1b+xE)kvxFW%y(79^pI%u;Sc!kQ@2 zqV9LZ=Urn8sl`yz5ffQ!=IMB%LAaaxDPLafM|SVBWXWY1VJJM)F8Sq|sqaz=4g6_UFLhB!1%Jhh+jz%lwh~osH)& zOJ`t3Q7<5D7ArZ^xRT2@WqtUL$PVk0e>{)`fx|J_l^am)&Y7~7xp zT;SegU=Y{L`W;+)fGR{#+0QgFU4;J7%+bBRCqL-;INkWD4~XFZSit%=)8`xRY9U7sIOpvP}8vV32X<1)7ak(hPKE5zWjpw#QlZ|srOXW4{pLXWl`}p$#mAc>Xyz;!qZ`X zVvMBLJq2S}skS~`hEVX%JLHe&ulFA(xhw$kqJp)hTrJ$CATWHgLGk5P(V z#p@Y9fzrT6A=s>|=lXMDkw5pf@l6brWOoCGpF$`fm;$FVg_b<>%9;Zk2^-m zK=FDDQz3O@73XFd)TWT3&lvUA)JEXjDnC5iTbNP1IlTi_KZ%J0A}HQ8{FJ;K(}nzu z`C}Wr<8^MRK<36d9#$}kJ|N;Sl?^|{J`r!2)cM;PZxn|b+j#dA+i})Hjh9PvEBMrt z%C{Ob>39(3%)PCPaJ7pc(CEiUct6qLb|Mz{2dasyK)UR0t;=;Ht=zF$iKL*1qyJP$SeT5vv;W+h@lM#9iP z`DZCSAEG^jx#&q;cCq$Dt+{~8k|`B2aucX{@~ zsE<}9QW`t2NrYg68oq)!fX(d?GXp~?AwFrZVhF}KVl~*O^f6>3&b(L@6OS_|ZZI23 z6!-ZR%7WAKa$&i7=)mSRj!f9IsxymsF;IKmDKse$_|2ywMXHr@m3Lfo4Q_8P6m8wR z5YVqqG}+e~2Ewz3Uxw8`Y#tFY_qk5FpYPb6Es5tB#VsZsyr@u+nf`GN%3|zd*2dmV zBH40SCrpkL$8(7H$pAN~!Kz!xVC!;& zbwX90sPs*oa5Qf5`+}7(=XRqmI&ZR1FnoW7ve~`wU!n_AsELu)ZXi~Ww!EChr5Kht zgHapi0w2AO1uK|_(G<~94BuiSA1Q>4e?a$|3(-4}=yz6gkv3(-A|*EUA-t>xUlm@< z`GAosH`||~j$!=s7*As17?;)v%b4<3!4QCdI59~jr2EA@lpX5%OQe(SV!@{}^Im!1 zB}9J>3qL2tp9Y>~!(&tWH_(hNqzI_@ z;Px>1gd@OZ(Tbq6kRyASvnLxbtH;*vr(E1rC7vvAWgP3qR9+Clj?~&d-RDl}h)To+n6FKtBvJCU}HJcXovy1;3A4IGqFZ}EzC{fLI|8Qy zfU2wZe(|ef*e16k=3;dJ6oA=0HFlqT^WG--*|-$ESRQ7Ht}xVgr>^+7sq`!2hHZ_} z)v1U;*W(m%;BG&zsaXbZ<*-&FTxXl&xMG9Md6Q`|U+n4txG=ZrUdfhO<;O8UCXH+3 z<$qj#TmC#JN%IARXnG!_lV|g704UBb%7i8~zdKB~aF)sA+QEWZ`P(+^FA44v5?L!~ z8p)LdcIlMRRDaHeMx9t9syldm5=Y>ftz=$l*0OpieVgfGWD#ELl_}Ol_kz`op9HQi zTy1vzdjy~9rjxb$V$whq0S?qT#hCi~eLHfYlQm>&%o*o+_CFl25VH{uA+t%l~ku<|@_x~u~Ucm-1c2GGDNPs7MVYwL}UirOe%=c2^mfX5_FI4CnHhL4+Pz0 z3V^@#MWe%u&Me(GY)_13xS(beN*XXAepy0)s4~a7G0pl9A+Dbeb)6Zh<&^EA|Dtt? z6r+C^!Sf|4uZy)^MPrjc=Jh)V(X&t|hM9xAyzhL)5o*dKkC9ZIjpj-L>1anmAH`_A zQHLfrhAqqCx!KOm!+-!g>}&Gf4RSXr$m%HgU8=;vcmz1DV-G->2z=YxrIZ6;5h3^M z@z^cP?hFA0!+awEKXsnqI*~Qf7xK0Ik=Gp6==1&3Jh}=Id;ApEj2jF{jQUFDJZLtq zi>s4FQawn2cdp}M$p`PXAyAi=(VFoTO z`$F4J^(=t0#Xr#)PIu5~89LS20Z0f8`C2!-YxpN5>^(KVa{0rJ7%~>PHfzT?YZ_3X zTdn0KB~s5$;?7v6NYAoInw8X(VY?7n)3sh^4;5-S}-62Sn(Es&M z&Eh)@)W_4@c|l7~5(K3PR!EWbIt#5hpe}Zt11G`%b+XaPoHo3x33p_JI{{lgaStu?>fLB1TV)~g8tLVmjh~=Q zkD5-Z=|dH^g!Fh+CN@=_ZK-o)deVXJKr~Bo-Va`H~r6>EOIo2Ao`h4L~ z<%BuMSsp z(Ax8VosdiVMaqV{0GCa3vk4<2Joc5R`=<2sa2#zsOGe3CD@<+<7 zUtEYN)KquVza?at{N(^zl*tFynLz?5y#1iDErWfDU^%>4en|I?c>%zphL(qc(A00x=eRNPT5?_hO#!q2Ef(rSlPdK~8L8 z=a8Y&wCXr+34ZU|@p>q%UJbo{i*ngIAVpD0tFx6jvaMN@*6o&ccoK&_ZHIdr>O(H; zJ&T1-U6j8g&QX;juPr9ZmU7*0zxZRD4Ms-AAUT=X#KvR;RxovGNple4$^$4QPC$yW?qxSo zWA4!Lh_-Q~XLjZ54>{PW9+)C2xDGz?0yL)cb|01biM9&`wH7wMY`_G@bSG-=lEaHmLWwdC@8pFR265tJ z9}(|04wOQp!Bpi`m=0V0r3%MS;Ma-4*U7r8u6Z*|u1x7#6p)z+T9VX&h=C)hW+GxF z2IoWjY&tqWdMwttQ^i!-xawLES$I0c*%r~yFZGF@G%iacm7ppRWflw52D15mimzAP zZ8#$yZj!e7Bi*KMwWxMe>*Aau8c=@{nz6{EC=f``}Veux1c0YDAw19aX}^c)rpxeii?kSjz~$K-(s8n!RH~^T;^Z3UaZ$`KSf6Nz z0|U$AQR)wZcT#R6<5P6Y!qX*45|74(htBUWew7(THdi%k^kfsAl5;k?psQi?=cRX0 zLX#$OuP7x1)&W)_Q`U~Tyx@8UL<4mJ;t|Ti;G?6Ae?thZ;}aJ^{X)AsYHhn3eLcgceg{?BuU+u==CD1^*+xAc-;no5?Z5 zaOcpD_pPrC@i)i7)(_KVam{ANt24~hFZ@sXZ84D8v>l8>wSza9j5Nuz+18PF3KNV5 z8GBNK#$}cdi13JHf9|Ws9avddNvzrRqPVFaM)j9`I2U&>k2Ap>sTQS>8I6U?mR$L@ zmkgx-QR^&Qs%8hH%@U?kreE?V+2#n8g*AG5Y>6>P6>w8lIQ>Is(3r2~K+v{Buipd! zuV_;VbzT#wS^CG*g<>y>G1g&XPHBXoAXavtTj|%lVJ_+ne^hBqdI2g%CHy?eo6o+zx?)#WHqj$5 zQ%%Be-%GE<#3t_`seeV4?VvN3QGNNC{vLW!-sTkAmk^lzN1!%_c;OgOT&ycWLuB=W zRcI`yhD4ZE#*|fsX1|jg*io<+$?^-P7`3Wm=$Sn(=yQxz+?L~PW@5`a- z%sC-S10=DQpf(Y=&E?b_G7ctev3o;KM0PzFTEJljUhD)<;sRO4wdyVRbV`@NFmm`( zZP}Z^LtxBM{B*tn6i*XCsxWzq!AJDi=TK>|dFw5ZN1*11$KS13;+h<-(XrQxWH&(jeK@%ulR`8$3S41W#2DcC6HZ-yclYc` zLpdtIbvz@~HDXtB02Y=8_c8s~I=^2g`L?;r?cZ3!1qD@@Y>(v|96u;e8&8a6 z@kqKMEj1VgZxA=I5e4+$+|_K4H`O@mjm)_rBko+_enbpkJxP&vLg1OcGFWJH+ebO^ zuQ;7bDFC&LN9z7cW}?x=l_a4wPskSJ?|x9?Vitu$@g|wuw*Nj1=j;Ez@u}JW=K%>z zD-x-2keo<;|uf)>2hh0H*9`2Sa|$y(5FmIGoL#PU7}r z;U!eJclp=X7bdJ+>Ec@V3%HQyQ45ym3MRV>PVwphsK2n}`NT}CLZ>@T)Dxo6b`UDoBwzZ$wH5 zR~S(#Wsb_43p6)C&kk^Av&c5d#8fWKEbpPDW4t0fGLP`2CKu^?;F!@u@{NI}SiSr! z25U+`-s~yC7d(>_KA6^CeWf;Act7kirn)IdStLo(aGS$Cmc4a(HUNIJ5!LrB$ZvgYr}FbP$jlF(W2Mb|U-5U_e0yS~weULzH|mY%LmIZc1+ zm>NudE7zR`oJzT7Z9TBv*P5$1SG5yXn`s# zd0L{rkhYDW7^5YswIFz}II(|R_ZKiGbg&KySRPqbv^_aM^rI&pD98YHlC`wr-*rV4S~!b<9(3)Ub7HKnUvaZe4M~ zyYd93OQwu=ng}<=qC~Vc{?!<&!%w!6S5b#hyQ-gGSU_StNrl%dRDjcO z%jyob^02e33ipF5WCTU%V}_&7daO0Ms^i3HKgyBcegQu0Y4XWPom7z;ku2GJjhl`c zm~giY*ID#F3B_q?khd?~cDzFD*bmy8wQZUQ>iEG2+_PSb!I&@Y(^Yd+Sj-Y@#We?O zEcgA9GiiVCoP_#ZAL%Y^pI;g@7n7}fV~sFD593%LHBRa_(KbmkV$@5LIFh`|r_V@Z zt%_>LmsVNTVf1C&cG=Ac6TUmFooV^-JL?09G63g9*%y+}L(pwX9Qf)|i|`s!)Oc5x zUIpTpAD&Zx+>~Q7^{TI1AdZkaCG;P5z~zD5$3YO;V4=?-zJ_L z8q(*j!!}EX_E3Sgj9gTO_VU8&xk|c|P3_$X%q75O@3-vfT9U513t4we#THfclDSCG z8(ncKgWChm)x+-*7q{n-r(_90y|A)Yc`>2@Z}5-6LD&E(K-Ry{sh@pmNQ#|XQuMRO z0rm`aj&fTw)eyUkAJtHZtXH~~B{0^93R3qo%EV>6yI zPv4O@+CE6@Cq|1hF=?pi>P|G8336es^rA-Nn{||VQVGd>JS~Dm&ug0C_p39{6hT95 z*oMT*#FW^Krs3u<@%ReVl>ByJMs5G}oDk^7Bl@xLb{yv)rsltONJU$6ZeFA5t3HxH zUqTPB304{+hnDJ;c3K$C!28_Y5*V1yHDok2qt>&*S%9abClCY57vrPo#%$Hl2u`C5 z2lw0mFQ}3zzAdQ+e))W2~#q@kF<$UY4U zCx8EV9wf=J^;DynQ34Nj5;7O9GE8Y@wM8;*d7-D7EC08*HvXUXnxgd*mw0w_ebwHn z6H-Oni=@juzWA+r#6Fo%89dhK?5>DtxlkrZ3e=`&l&1gsx}<509Ict6VuVANiMT%K-GPB?WX~%4#}LqSIPm_q z#O7-LCZsxg$vkKD;Kg|ZC}0}BI(Jt0>~QK}a>4d5=Ws#x8z~y$;NT!FNeB!_z(*0e zR*NI2{yi$Fe;xzSE>&5VT@SA!0;^G|mgYL$@B?N0n6 zGA^{0$F6lGllbTkw_-B6xJ|3`JL0~+OB^fX6%Gc*wc^-W)%hA%Dl{C3#)6&l}0S(!h4%|{l`U`HF#X9wn z!<+)OYg<7s8PRdcrrP2egoW%8rRQwB&hk*j8xK8e-d4{-=dmh9?RG3AXqb^4v7P#~ z)^V5TruN=Xk8Pvu^SYPzGQ2_h%Dv8~E(Q2|(u<$BT>@CS^oNSNMGpYW?@N%gAE;SE zqWCaJP*3-VWw$`n*hyWX-|PKcSXE_sw_V-nZ!hm0(;H{P0?Ztj9{upjH*1&wh0FpY zpW5BHGp_kFxzS`V7t%s7%1>z(4!_d1F6TdW(5@dk=v?bJn|n-ubBxGg*L3e+h|VSiKQyAqfcfwqjxq=?V1+ll%j}<{{EQRFnqz zPK*jJE-B=YIu6qe$!QhQkkV~#-Yo=b{~+4r3~~ZzDo>&nI1Hofw@+}SNXeUAq<3pub8u?(c!rf;^kJ9YOMRKKP4wR zrttsenLlC*Jl#L)DN=XRu2dRLPtwXY(2CEv);o6vada~7e67Uz&eq%gm6U`|xXw`5 zf|0d5R+fjcJ=IIM8+-!cJESXFlu?|$j`79XsnS_7)80QW<*d`s5YRh!lj21$o*@@s zI)C&8Cq}Agsa?@*iX}yh&k~jtxvM7tfd*r(c^fBK1KsI3UY{c_E0KbVYy z21?zi>77>>f&pm=#gadbNClV?RuZl=tV4Q|--kmhL4{et(?N~sWp6EWxn-L!%7VIv z&nQSo3o9!r86j@y63v<&QUo25SV&erB=)kf#U$=qX{ernmtM^E45As=g^bvjg-O(v9*%-6iRc|E*3Pa`Go{%aANh@lr@BtGS&{>F$mw1SXeW0DF=GTWu<^L+boBn|oqQFa5 zXW%yQ-DKsRmOvo{KX`D0(##-sR@MD%UMW6`(v#~43}PGZ7h@$c=V|pou`vCZ_D^R8 zB!pI}g^{?XCOBb`>&|B_Kp^@~3x&AyyeqV#@W+bY!QC254KYWDw7`GTcU@&$l>%S_ zv$_3B(wsc*#kR7vH;(+S2KGhh{-j+%h(Ora=epS!n4nYi>J1NmyaRI!5Kunfi+T+g z8@A)Du4KJQXcBly&5^Yea2m0~E~Ra>ZGn|ZEa+`*y~v-$Wt4p)C`an$V&`08VOK&s z9ZJB5|KhfKfY7Y8I~~`(h1Ok6WHdpLmd;^*8F2gn!8n?OU!JAO61wzE!TLlEv@5l> z1_PHF?ahn#4rnkf3(>;2hH+QM+e8KvO4UC=RFgtlRFddD;Y-ykU~C!fy4H~jw@}fH zfutnq7QwGac`m)!PzAOgI`JB{Tcg8{#t^uzE-2b(XEV@TT>Cuc$%egnF7&vQBGv zy=Ye9KM|AeCfqT~JVK5N!!OSAzjw6MG6sIb_}IpuPpSEbnNf=Xz^E;0=`W)VmJ=oZ zz$F5akyxF>GP(N|tu?*325F^CIb5EB?deCHHqqj{kUe!>x~3Bm`0PNPkWqXzCM3la zM86pkuo3SsSam!V7zl^2alrw`5$;D1|!tqi%|&?|W0>r+)-`Lb?n;v)!+t!WT0_! z2IDb{V&$1K=Yr!|%Vz*BL4WQ1W$9Xl68{;koKrz0;=7D#)1~uy6o-IDkE%o4V*Z?! z0O`_){SY%jNnK+uds5O4cnLqSK3WqIzi&h?xFQ_L{L%sbiR1wRx zS9pzzAH5xkqv`Bi=D=qJ*3P&+Ctn5|jyS>f(owNDLELP6{vs{u$lUbe%ihfxia5sv z!*)S+x!*gZ>x}Ck#xKQQxKkz`vM@9*0mF}z!_;y~rG2db@EW{%8Jl{<^<364Gjm7HjZk}J7*E<;Kk$k0pcrAyM=~XYmbv7?>tN}t`Ywp>o6T?v zKFtxga>y*tbE6DY;K;R~c!!w~XdFr-{hUaSRF;ES?_S4g)!O|*KjUujaj18=Q#{zQ3v`9hcMR+AWe|Zr<<85 zXx!NVMiBHWg88#u?Z$KakoPhI|3@?Y@3ixSOjtRQ$i{fagewS%UkxL#{u`V3Y!qE! z!}W=Qvqjzs$f~0uk7g@MUY!58)upN>T|-HMdTk}zT?cubi(DfEb^i?Qlzj5d-{xE` zNpc;8J?TI$If|6SI!f;SOS}EFq`|9M^ynotL=V^9IzU4v?LlT_jcpzj2jBLK>(0C~ zv|AKA$Eq(Z54F4OuCfLn$3a9r{K$ZgVgKxUGnln+P~qLtMIt-k!un)-_PMBA}|$tex*Pk!pSwG=y>l+BJxi{IZlL zO-tu8>*rS08szi;aRRXYB9dwzOJaQU_6cpiBMqQLDKkZ^!EhO?f?ds>|XtSCeMi7SyOCbz;mcR9w zo2EUm2G48uW7Gco8gQ!Z$mzT-OR#QG4y^LP3e;*?iz#`pt8>(&=r6^+?bS)-ii!Yz z5mVU#5lLU%tD0qWC}J z_iF!>z^k_P$7Oft{7(%dRqxbbQ4g8}a(#E02Sp9lKV^VrQK!MJD~plMt!s(pm@5U) zy8F18!IKQAOFB|01r?kfC+s(lH>O2hjee+83%0$8ktL$sfRUu+(6406X zZNJTeP{9KvkfBSZv^n|N0$tmD z?{=~7>WwMYonU5k+TxM{2ZK=J&mcf}B?^*^m@AcoRk+qeMtBL85`>Fw546)yJAqQ} z_(z(Hb*4~Fc0&e}UUUsEB4bUTW>?9V_aiTK*~5He9%vhSr`62r@&#V zd^fIn!C(b#C~rOv{ty;kj~0pE=-#+V#7R-1NVazQ;fnE^{~ZovJxV&f&9)u*HyiDA zH*BcWvJ+(IvEmF}baTon`{Wo}Yg?3J9@Zw#Lg+BH@woY?XA@_L0sTI!YVx?sVXXoI zUi-So+}FWh_QD4%2F$%f(yA=6n+bEg=%+MA5lXq@UL|RbCmY53wFtbNXBC<5+VY|k zene!2QEikkg(B+Yh-EN~r^zhBeB0AA_j-B_W`0P$7Z9DP8-$48n`vhsm}cbb+KQ%k zc4y|&iZ(p(3 zzE1U^orVl3g_~R#u>o&Oe(w-U0jJo9#Xdut?>fD^+#Leki^*G`;?lmXMa~jm+9B^&9)XP;UGxnVXj$u@A@Z-0?CaNEBTyRxf?&+vk*<`ZW zcxPTnHjA69(ihZN2=goFML9&uo|FP2g~?d(rlloz9i#Vg=o;b%{&o0VZh~s3 zHZ_bVXE%dmH+b}L+7B|bPTNaz@KpQ+4o`>Cp+e9!g?LPh7s@f>k=&6xmhtA~-ewcb zRbfmR%&1K?##{Aqn)B|e!QOxEm*FP^TBuZwRW7 zH+z2R2w4tdeHJrKZYIX6DW1j)0X%>>`@)2JsD`vbi)GScqoF1D1*k_TA6xegx>3_y zDCvoe0{)siJ$je=UowVXo>G+K;Xs4x6%G)(N1t#5Q4$^V#zgwAO4 zYwLh-3ePKrx983z7EaaA5)`5|LnFAC;o~y~FPo;{9HzH%06BSNbkNirXR8mwJEG$3 z%Ze&ANo!(4i>8q7i`g#AQiEF;gEh>Nr727g3GhYrrIsJ8;Oo1Svb)lih#f=T+d_ z2C)6dJ*ko0ltckhgM-62n?WZ-nlp_9;pZOT`|2nzc@Gmd8P&-~m4DNI;%fdLx9)Fk zt~FiS5=g#&v&R>T(HEO5J$i!=pwuJXRxGmYm-$}-a?$A29HG3FgwR2EXl<)KzDM68 z@d3UBAT@U!7V?-8=!54?xmg|fHp$0^ z*P<}d6D2KVEs$C5zb}6;S7RrU_)5-R*h+oXjHd&!)N4&-`Z%NY`FbhF+|y+j{oK{2 z0gUohHmW4mN$KynrXs|Lx4x{(G2OQD5$@ps6FRtHLVIVz91w*5EuoH&ZQ18I!MF8H zSA~cRXrZzp|BwDg6 zk{jjla{TH<^Z-@=wZm3ezw}!!>jvKVKN?Nix#po`;0PKR=xJymC}5;-ur^N>bUZsa z?$e?mcF$rkVkQ?8eoQYvBYWr;=V6Y?uO+#K6&wv|!58D2R59UiE*kUrH)o0AqwT=v zFtFB>jP13ps|9LqabrRkMvFAkurLk@aIk+CciIpE&kMNjj11HFWn$6)4o@)mWy6c< zn0tYyXz)*KOv|JUx~#$`q)f!Vm2=7^C}QQRrU)))=O};G$E(_W;pDLYgjgQJ1=g#m z6UxN7X|;hi;@(D{oM(YmYFBS`&)mCK*xYt<%_66E>?S!k9&=_LKYq*3vbnbQY z>$qeb8DjpOLbX&b*w(rP-P7hDv6GDU25a7il4br&uN!YfpA_Cm_rWZEC(nzCADGLyD(=ZyDOMg|Ce2}FG?`USq zn5zXesd`zlX>4RV*Ky%-y;s@FVC+9bJ)nrb3peth{_OVHZz0=ZVxOZufSi_?*<>nK z2p?n#WpnA>|Jui()N0;2WhG^Zu|B2M0K|1);qBZ!5=)R|>e`Q9JsBpAr~=IfHN2rx zKNeepo+Ewb@aBA0Ebn|Oa@Rj5?%vncyfN6(vE+vxY1l{vE|qrMS>b!2Ci z8aM-O8dE%nS}lhM1V4zm&3=X4D^4bHurg1{y|3$JV9r7GKc;daiH1MrH}NPJRJLaE zwbhaz{3_kShwi%>TX((3KN_HSw;)sGpHfjFFQ|<+J%MXHB}eZ*T5M{g`Iu5c`9Hcl z-<_^SkUgpWTBX|9ENYS&gktBV@v2r2SuOiK!xE4+v?@-^B=m@ZMia7pTkzUa^!DAlVR{ITRMjiivI@^rL_(c>J-R%cYbd`Hp&US3whRIXz$^9E>%{7HHTkD7~N1JRX?&KjHdlAnJRL0~?* z6ujG3{jsq8MO=jOD>$X0%GXkFWyM{{aRWzoz_Zl#7x7=wGGGWQPQTF*M6vQMsAR%Kv)qS)iAzmh^J&7*Z?k zEK_a0F#PvY`aJ&S`EWvtmb~^88Qpz!A^sk@ z8}3m%KTmEC<(IUqf;d?R3ke-MpLkTkEI(p4f_8yc+brK(n0VAszNZ+R2W3t_+6QR) zvQrR9(;qifvGeKS`)1UCKd>I4iVm|b7rIX>`Mwujrdq_pE8?#9%RMb^g{VO2aDFqh zz3e+?7Fg>h!Rc&llySvXl6^lOM?pW-ii1N7d9P&r(XmyGl@W4U5FA_0hzFV;Mu9Eo zz6*^C8x)TAV6v71Az^0B`%C}vZRa#j((ElIr|>L4^C7M^qRcA#2nOT^-YWmh@AHE*21aJsi6rbe7Gib=xai{ za(~nlu>i5N8HUyD7+Q1HQrhiAS>?$@Y|AqWZcL;g2^ECIN)ry51(q?_ncl;a-ZrX` zFoQBE*0b^MfRPG$DK<$^{v@jWp+ogPVtC*nnfj}0HU5gDJeWVLW2KF*hhAleB3E1S z+B-qF-w7}y!tCh(6s3i794jWI=*|~(8A9;#psZjsuRH2y{Wju1_HI%Cl2!2?-v${2 z4?f&9KM&=;EJUAxVjhC_%YmK*)`t9CbgJDZ|MnVUhFrRDg)0irNenXh)E~Ngu@Avy z(Nz&e!hx0Q=!Nyjl)F$aSF}G@vcUBIGz$6ayzqnU9&1g>#z~RVVe;z|^`n;#qPyFB zn}J4_ApKHW8~Ph0A{SdLRC+0Hn>fmkAYll~?302?@sXwDw56FFh-lJKLW0^c9Aim6 zQRvW;!P*&$kK(6$8xS_*HzK4r(r`sHH)+$N9P9~BCILY_rH3TUY#4uNI|dpcgZh*l z@kJ(P`?zCHy(=Z3B>AZGCHYh6(l9>ex}dGjM<2dq@I>2v40!%yZmIg5Wq|k$`1vm? z(lFa^;`Sn*V5r9+E7Hhp^#o;W3)bc}``9Ni6e!A*!;DP@D3l5kL|Rbhcnva&m46Dt z(_qcWO%f*pT`t!Fj$I@tu^tQC(dFh>Ux_Pa)@!C(iQrx6VOB)3WnfIlNn@R2sfG{} z3~5K;uX*}D501?Mf*)K^x|=fby%T{=;s60b=y1nE1U`T5VuO4I@K^Gae}2 ziausP>d~M7RoEedP~&isjzqA)qu<2sKYXGEy~&XRpshmdNg*zW6$&TErVpt+4O80@ z6h;WU2EioEJ8K&!nb@k8o`P=T27G0tmrS&`o5HU>$>e4$bxV%~ODoXD9^lDxc9~6m zSGj~j^1zQ z8O2zVT89T9_aTjtV>jm0W%0_?LF_!)n2rTQv6eg5Z~0(Pl@y90KxJE8AG3O%dP_63 z?sb2s@sOi8>Q^nrQl&7%f~$xs247OA>d18dS8-r&BOI$nq9pNQbsN5+6|iQY<^7Q4 zk!c5(7_R?izt{`Sv}gTgPlOzPv@picbc+(R1t!y1r5`Y)b|qRaTpEg4_w4Px0F%y% zcl8LD=DkvDBdPrOtVmMZv`?SLr~$5*ouJd9Yo*!*pv&q`kChH zTbCA`lrduIw=9V}nUV_h{Y>8diHDjy`ayezk1k-Z~jlbqg!C+59T9M-!;B5o5`OF*owO)<4r#Tqo^w>1I=B8D5Cd8n{6>l0+_m*?3oLT za_g%py<)&Zd?@(_2%gtRLtQ6nriml8Ex;~Ik|!6P{Dwq9es(8U z{jiu&?f-K{UF0Ii$y%>U@*m{i3=&5R1kgyuUG}K))o2X$^D&|Q_nuF|%|WI|_%4;h z^*dynwGVf?)_((Ox{GL_gJ@wCkOq)N=eGj0Ek2%Gi+{?v%Bmu8xN6nIhX6t{aQgC} ze((JH5#va<@-SU<;twt(7f-k_lv(Znkrlx*a3IOJCvBJvZIyyHuKyuZ)qQ*s+2qU1 z01IpIDfaV$enZkz&VOGqvt(d?dY4}cof1}Ve}|`z_HIfV+G!YOf*2g2FMF>Vgt_pN zxdqnsH^mlj{}7n=4oqm^P2WjZN$?Qk`ula@a3kCONOTl4WM*RT7$5Zz7fE3*UI}2M zxD<{D4u?KYQe-Pf=TTyxajj=Le9O4qeC4^#$T7GEtZey~OEaJYxBtBP)%dAstdBhO z_T+hs%5e$YdB71=MOR|NNufegp8o#bDl5LA-iU9$tQ$&deMqhBChHbRDtJMah3LEA z+|gcn`!Q4a&e^DPAXwiGdM6QAjUk--mluz(1rXaL#Fy}?j#cpF3Z47UF_5KUaT1A6 zg-5i-vQUQ|Z2`9X=SqKaL|VJ{LgrPdvjzBWGtWzbVhzGE=G`7S0N*HA3h6ngg%o10 zJOKE$sy0K-IdDd(w+z2Ui|s5aH%y{p+TOCOB;Zp(MRY1nc6&Ne!%}}57K`G~k&u!R zaB8-O%UII&5~*5w5yS`!&F%Kz1042=4BT*Jn7~&#ayX3C9s?bV?J^8}jdQuwAI?i@W}41PF=xbV9P7jV%fU}0g>65c(2d)dutX=KZg=me^iBB03gsHt zGsG*(*_37xzZXlM25I2d(EG7Ds~&JTGWnZ&ciYcYiecT>n~yzSGr|G~X924CnebNC zW0mP|iLmqq@7FNZs0Q%Qs|lVKtVOtV)=X(_DSgU5ZWzXw90O?c40mE2U@%wmCEtMt zFklF5u!gTYCB6NFC1^!4_e6(IS!;a#t}f4p19>9D(g5knD?@mbDYZO_X7UbX3{Bl2 zosx}}Xj!N}wW<8+v9m;m^t&hbIy+ZLf72iv=+-^MrI}hTP+}mVDGq%$iKkV0pg5EE zT+jFmav{{36_iC|0TUxG=BE`LS_hqmYyqrhOImF&{>!xgpw!on8)M2pCo;stM9FsLrO-!jm~h90RBJL#Q#juJ5PlN|)?i9i!*Ax2TFs zt2R(%&JA!=Xnk4XYBzNp-7Rd|vUB&nR}nf!Atgg>X3F?>P5du%LT+X0(y$0x$kWCo zt3krbQ~c{{DUj}V!+wBPFcG6&8D=KEEYDlP+^S7~Eq}GcV@~{WR5-a1)haB%#xiEL zz??=71CZM*YV5@U%v(flYDLTMg>L?4@LAefg(vA2FP2RUc37tY3$Sa8E@7H&aLG&D z2Itjtgzj|<`1la~dI8%yhTodsl{GH{S8|!Sd?@j$A4fFD))NEABHiYZZNgctkvr@~ zv9KGO>1U1w`FQ_`TRk ze8b3BAG3ZHNpbotJbN6Al*Syt)ge2|W!XS>VGh%eyaeiF1fAKo(d80{R9qi&VTQ{5 zE*@8*_sV{-C(^z`67P=PJJhH6xC5eBmycs0Uk~SY5 z_n3NRl}vOi#;ETkDMHx$2nvp|I1eo)_YLHh$Yz3p;olQ^IZhQ4WdN(~5x|j34R|u| zdeL0M*~14px0f77oyk~1W|#k$dIfnIuoKKYoe(!gi_l-v1YK-b%Z$n-#{JRqkhxfc z!>s>f44Th1?@X7=Oamc8~X;mk{nELpiFSOVQiefg}i-@AVJ?#)5B0Fl2i z0~v2$vGy`|2(>-;!%H=M*yez|^4Mu{f&l5?$4BK@z5nKu9l3#2%nobKbn5+?U#Z2y zg`{FQ>J$Ve$S{*=>;G*u$4ac9=55mIoc7_U_*V7F^CdHMLvf+G1(k&srD-rionjWy zN-Wh>Cm}+Pr|iqp>50eiqKR@XR{h}}6s z4;OQ;Nw_doV9njl4%He^{STzo{bN37-<`dWN@C3edtIRXoA3E!E*mVv_^{8)bHWvNf2ysD1V@Kit74 zLs6$jtHQlUy2O+{ta_oF2zvuo@p9b4rctKi4`MeMJvD#)hDPlpFb*Ek83nfwPM3=& zm3Fkfe?~M8f+ag^LiIs0AT59yeC6O`&j1-|H$o+e4#Bys#hz9XxB5QyAzkYp&aFl; zPal`}? zNSvtka|=T=goVDJeH_ipgYd#7ZP6Wmd9OYf6au_5)Cdx;>|hoRcPALy{7bSW3{L<{ zJw9BY<%5)ZC-g`|3H1-*zzayelYMAQ#pgVP1~wNZRZCenM-EeiIKuDu2HJ2=V#koC zNq?7~IK7n#s}v>tj+;W*jKqy~+_yk8*m-*GyGEL;oAk&t2^3wS{m$4Wd_ItUA0@luW5cxX_V@E_mm9w4h^Ft0?T1up}86o7sm_DVg2Y{BOmBs4Q z>wnxkc?W{hKP7dwT$k%Rbp}W&fo%Z%1zGz@abn+&8vR`4L^(S^I_oU>fAV1BO`1pK z<$*V2dJ{b7mKzW!J9C&D_LDoPIB$f^P&5ZAWD)IWQva9CU1?AI%J5SVi`i`n!0j7m zy;{Ziv(r4$z5)RbMqE(llFd+7WSxYmo3ndAMZ{_4i6n(yDntRV`(TJd*e{wT_N zL(?@tZ;k1@=8iuAlMr`UgU^>eW+v+Oi<#C!+G*Iq%`zPZ#f^lno^BRYWHFv8tvCDE9`a_VXMj1qt|Z-;Z7{AwCq;-)0-Vyk)!nIA?3coki0kZ zbvDCga@%C;crdu8U|+blXD*tG`xHKtb?b!WF@@DZjO+efq@2}pDG#oa7d`{L{qICH zLbtFt1_yx9*n-@YBlyI>l5DU(pcDi_k~1DRs@9ZWnx`LC)cNh{XjGsX&Vd$T0f?zC zmHelw9AzhU1{SUjuip7FJ_)7jdGkSo!-#axr#t(1@(*}uyRdxnCMo2tYc@eOpGtyQ z<)E>-z%Q=v67ZSS9Y$zp#`i^{`A?@415!MUR+q0J(j^pi>^)ecgDqzTWc8rWgdNIh zGwKEq3jDbY8N?6aTnh|oXXoi_8*IDoE+c#eWsBXJnLd@&ckZenm@V2l&lIIZ7?4Wu zjwd2vFWEg>_R@u4;=Pw9&b!3B%!`4vk?N zUR}8Qw}jx+308PzFA`XBgnkOU)dV;yg%7V}5Cm znhzqh=m66OcSQXeI3X&c-HpNdMuE^8s7=DoA?^ESpZe?jfJuuY{n$)1yg)U72ednv z$KXhQUZ+qv7ykg;@k!27ExH$5OxSs#`Vd7g2f!!7s7=lOxU7L|W|j5#cu`Ldwv^^k z?+=nQQnC^t@lN=$(a(4zr2 zXFUMg7S5L8aUezD7jO!dcBa#u$ewIBt`>dIfEX|%S{~chYGTssTO(}5IV2Ie_ZSQ_ zUS_Xj!CXceXU;pyGJKfGQIc$816l{8q>`H=vQW!jnGm>sX22O-?@KDu5*Vh04cd9N zhd)f0^em!8^1VJAEibj9C(zi>UJOBS-(zs11fpZ7-6K2P>GX!WG-<{X&>bEhwOWg?=mjspvDz+Z1$g-%hu_Y%%X+%>Iw-r4 zh-(dg@wl$rMtK9kVg^9UZCrYrw!-0JsBZ1ZmC0r0DvTbCRcl9JGf%-_{(nH2-Y4|- z&|nS}lr_#i(jGWk zHGIGp?;m06`+X0i(Dk2_Ht)SmVR#D*8v;+aFuI!{8EL~BRI_Ybq4k(Zs<@K1b?kJb zf&@<{2u}}#aX_6MBe6Qt92;aaF{G5r48HsRq85nvvZ zmtlx@(X;%gVS4>aDpjFEPzVki8lxu0z)M)pXe{V%?D(>yXTZ}KRyy>e0MEOCax$GB z0;bR)B7lam=FgPZk3>q4kEx(#=EUC#B_(3ltkLKy89D>i<^h%6Gx94XxXF4a)hvBX z0ujW?Yr$`A8*01KXI2K0wt7_2{z{%@l0x?h=2u~Q2!-toe0swuFtW17H0!k9!D&_m z?8;(3hG9>%{g6}M`uBM9#fyEcq^mQL>0Ah+q(z?aPw>T_fL7*GfW$rh5aG#B_{0MB z_7q5c0pJZZs}H!Yn5%2tz~V7~Qnv3GWB@!|cscvxqa6UU5kaJI>Ry^pTAlZ_+WfH8 zoYa)ay1naIZuUI56>&VIL>vGLqes#iCa68hlfJJtNz<%&9v>l-!=^`##wn!@nlUB$$sPX76+wWv)kN2EhOWX=nJBb7ue8G)u9v8{ zTDdN!N3TZq&*4YU_ldZO|0_2{GWIeB6bwE*qd0woWk_VC81atfOzDcnSC`iS`Hb`P zxTHWWNi@W0{{8p$8qVI+T;^M}Es;fWekjbJB0L@5vhagSe6KVhN6-}QL=m-ie;4ty zN3|RFvRd_cx!}X-Li+LR8fWy4!s1+SJI_GjpjtB0b%qT$$i+-V-3Rt>J!; zhpKvfpV*aw1uOKw_D|uUOlE8Iv`~e^H2Fs6*ue0b-i3w{zj-af&wc!_Sag%R(Q41E z8d~4UflQKWI6LuF)!Q%nOVSzzrh~C)Eg_raRYru@!&WLKTNGCdHk8XxdOO3b5 zAhji%eOgxEaze7?SE?Y2OB0&8R(kq^vdqo~>}<2=vnr}^TtrOf-?7OlO{GZ?rHD59 zwL&mjFx?SlZBLG-Zv- zF=xtYss}ugVgeKH@ICi6f3Bk?E=@3#fz`QS{TD5r0iH&N7u`MBQm@7EW@L?-z&6$@ zu5<>x<68+EV!Ma_&CF1;6J+XQLp@z-!9g>o{7ndU8x{)}aXsv&571yzU?C|po`9|# zzNbCU9}`1@DHF3BBmKXgxv;eKGdGoTrZ{%+g&)6iXt`NzC$?OVMK!zp!FNJe8N4v1 zrFD1eT%08H{IX~aQG&?0Wp18KV>o?GDyi?#%Tr&KPl`{{pTuI^daGP4b3KCcnWmg@ zqC!{O9jVTQP0onj%3`WG#_)smd{K)ZW);Bb?!aUd{}7kO6hQDf_=`|1_bmB~xeKIE zddY*bOePG`or-nl+X+hK>Z!WW40CFz9*^)URU()p9tXW$bC3yKNR;8!y<40s-PK{f zEmty@=A3VsART}SjiMS1x6M|Er6edS>`sWI3jiomo$@MXMS!; zJcRjgVoAnfk>3o~qu;y-4fB>%LJPX;{$0A3n6EP8BDPMXDEf>FID&xEO`oyZ?22oU zP{)Y(`g{e37>X=)gFpUs8ok?`oO3aWnX)7iiE6cgHaC3(8HTfvv>;EU5a7MT)X7a! z$=^L4F2#*j)~hB3hY>F{4o_uRdVcDt$2K7%kn>`AE4q>>MLK3 zyD~dL-y^t|=A?WHg5NW+oY7kQ4(QL;9`|WskpRQ26Zel&%j3sENq<3xdELR`!c0^6 zlTmk}-o$|5{+1nEIja3k;I;Q82rEra1!X_hGp(J(aY>zy65hd@aH7CV23t@(dhTMV zWJPJoN4SxSclT(=qaWuj1_)i^=ef={h<@PIfvimdL5w7)b$EBl%V5e-(TO$(ZGRYd zGYaON4%tiBH{JC28;2*CmqNoRr2fZ*8*k?xCOIAdu;KPGr*Xmus%=K#{-QaLd9^&H z3v>=H?SKkuSq|-$f*#B!Z>AF0C(>?6dlLu>qW^7nsL`#evR7C^Ejb4Q-*sW z;`J{lpw>hQH{4&}3a3!Fdq3+Npkn(oPKW7}**9tdKBjWA5I>|7eHeYu-v)kh+E?`T zR~mfh+z&*nb|Mqr$Fr6WnmX*^@%OiBjR_JVTlw`OCET4l;Vxl9jNH5~DlBPiUJbt` z6X={%J&?`m&)t$)2O`o!$qgD%2IB7ytXv7qczHokyCqBzlaXlDvD3-=1R+4~cjvKG>A` zJ3orkk|1U^*B!iy%9L2fBRJaU=w1~?A`rIMcXxn`@dOziV9T?J5I17g!=w{h)$1rS^_XsnQ?MLYK zmAK)lQuX1n^5C!QhB4K@mIEnzA0os!SIy|!E<(-P+ikp1m=Z<_=NmdiVF01y)$D-6?_|J);oz&){9X2*Vh`|H=t z_(O+Wn=Q&i(fa{f{u@7W#XeJb-lPWa)=_X2x&;1s#H;Z zb=RFs4h0R|n{pEiyz!-93JVt#$42~prQ6MzTe32tbt3uyv*&x-3-pbF>ugDDNEi*` z*^bvh7OWd7YaJ2z1-)V1j)CB7CRKfU%PV5;`1~dMx?|HGNKM%H3-eqZsXS9g zHVB{c`QH(5IG|UM(4z-kuC-x9pM~<;%soLpG3(7%i#Jl!R}u+Bl>{cJ;0vj!wD3jc zT-Ke=6X3!b@En7!D!gy|loqr_miQao*f`0Ut6^#ru|$7lnLnTHzS*#I?n1E1&?3u< z8^gx&XuynWbaHJ$5UnPsbXM$thyd$bSn z$2f=Ilv!DWWqF6c3zVDV`k(FKxkpFl?>wi%iWaNhX4MIIcH`oVtINt%D?`9&ZLqB? z9P2H8twdY62nAZDveON~40kLsjFB8VMc-PDpw*7?)!cg9CFAKAuT0#O6=6rBmU-gA z_5m2qm0!6M+n5=#ZgkS$tB`@+Cn zdDY&FoN%42*cMa{He*N#XuJQTg8A@RiE&Ocw#xBX-h-BQypvsx)0?jEGUSZWxjolT z9-ceTyF6`R?LcR)fb2rb<4kW07G=_3rG3u00@5)hU?JMvjoj zXP{<}sUZc*6e@s_V0@RZW}gg<)n9wFW;DD_@vG*)7~F)gy|XJ6JZ5TdeV2GFD+mS>VI)as)`feJ_*S_4x2 zXYw%=-IPii?!2st`!W%-?!?{*FIw46jRbS0IAHD6+lml3Ue=7WcKZ)RreW8do4d{5 z!Sn0c8?+fKe|t}yulUe;S64@tg3R_Fpc@oyW|7p)>6dwCme9PvY0ZaS0Sw~aPA?gX zcP>hHF%R#0aAB1OBY5vwP$V1s8lC_q`kxkUcwS6tZbV5ds-b7&szPrvgub_8P5E-k zB}|1%Yb-H(^325N_Mwde{C|>j0nB)r=B?URWRVrG6^V;uCA9qaKj2z0I7{4e^VA8P zR9*^TdFCBUm>4?ukfkvTkVESOOfG3Id0Nvs<~Cg#U)uNVF--%V9fDYrVD2Nz18M7L zkB6jrH@4;ZS*zIfv`2KBIn2z_^h6J-I~&sgs4m>(92WgHA1W`Cr#MO9>(2E!No%G?q52&V-{}?F!JvFS@J^#k$yB?VIp(j)O$!ln z;Ll*im~Pc^gcVj8VvFz*a26)Ka8*Yz_+m5#|M~kw06##$zso>81G^el&wa?0+G%Jv zW~Dagbh*|=MzH}+iYST1$mx)WM4Bo@!WeY@*aTs<{iKqb4hkhE5p@LizXLJ&2(Bi@ zROQp^r^RoWYHHE4mG(5_YOD=KupgzycEIn%2uE-DS{;jLE8#G3bM*@`{P8M?)z4%U zw@gA-P>R!<5G~?A=~Qq~eHt&0+nP zen3R70gKH<;jCIR{vwXJ|9vRoh@$8G8sn{;vJFWceOaK4mJRF%G8Y1$sO!T7!!9SE z$z^eZmr=bPCgoyJ&l&{Ejuo zIn;L8UHW0p60Co}&%cygqAWZp=Qhk1Cj5QrKcs(zgk6;86;*u55lz5dHBlI#G>ySL zphfncj7#7rCqH$LJUN2*n>X$&V2I|*y5NM~l5CzJZW49w+-<|o5nbA;fYIDq7BMCa za{DZaJfQ(k9?T)^1ayD83PAWS6=j6GeaHi9!W3yJtndY%QteYjW{yBolYVfzToO!; zCItw_+38nf${;BjCTf7&B@P5J>TX(+t)2Nxp=-%O}R`_KVAsd2l z`-+nYhW(nvPHC6@+2;Y!K5Q&^wD>#Z6C2~_uaM+>4%c3%(<>WB@GBrNMH5-_71GBY z14##34OA#5S%Qn1;@6h@Eu;XQswKcj?XT*g z)na?PLv1&L)Q>V^@@QBzCUXzzw_(J%BE;~{$uaT+9$AbEA_QeP25Ownpr?0zvd8q~ zrPIie7NCvH_n6)6kd_o*62Rjb$WDlvB{fE@M;Jw>(CwJaIZ-qo*!e6O%%Ck0YuSH?ScD&Xgu&at(@ zd4`INCLeUGjMZEbBtnnQ0HjZj*pejhmLXW*FA|z4_&Z^d6}@?W!#Xyduy=UAJMFQw zI|*-maJ-sq#y+vOT*(H=aHo1`3^~9VSv^~ywsfw&3z&Dp^K7QXKjsy_UNLoJvw4Sf zu86;m5<}6n6=Eo-l@G!&GgrIPA# z2H^-R%}xM=Gr7gaK$@+UWxB6u>RMm!;pJh&5ivqA)Wkp7jxd-9rLz4pB&|R(Xf)(#P0`MY@+uF z3BE*Sfrdo;h2kxm9^?{?jG+_(={d!tdy;ki{H=GkqurC0aWMm+xVV*s7y;#3G(Cq% zf=%AO(#vh_#N59{{2`_{Da-xCN`}?6B)85oYnqO$08?pdkzN;s5+A{+FqTSfe4LxY zLIDz@RXn<;Kfor0H+~N_3D8-Zin~tKb#L+nkE;SKG*_a#6}87*@=2?`IJU}Il+gpE z#H+sQ*69S6&4G&Qs3@gCtcs4cPTRIM~lt%vMb)2-(t!EM4w!T2n%r zCj|IBnrIr=KZT!}p85Y4HGtO0L`+PCawck;#$Tqvly*9pM-16G77#NmV1Gp4)y zOnrd~3Zf)Z24B{XTH~j@Kuu>L8s95Lv;Y_Gwxf(8rhoASgD&J+oi zlSVAI;&etYom==8lAd}soSc4M>)tZ`U>XGR^}mZ@umJsc0@o{n^G_t11totqJJ9=a z%5ensyD`~z6ewWJ;igz~0sI|KIQT2?OxWmxtM^3LQ~qFD7RZ0PqIT%Y1Pnd7`lINk zJYmu@&@~WW0lcRIBcGu!#&n_f6y`%poAa?Z&b#SOCVNj;o+Xu}xT9mx3reI>@NcwO z4*OA%5#s^7#j9T7nx~L2QLIB-N*6r|BJ1YF6zfbMFDKFV3?pQy#^Okj-~^ALp~>xJ ziwx0DGr=$%%hZ}SOoE! zfgdyzDgqM*;*R&3+n8q)L@a^?)IwtPsvbmDOcA8j2BZ2r*AeFQzO$s>))$r9gblOU zbzhHS8qL5eY)ZJuOf`##?h~>O>(ui9u*hl-oq5k~2%Q{$_7`AES{zURXu_}?BX&fA z(Ln7#PBah$`voQ2ZSiN)w1v6qTTxR_kE^bW*naFeWR@f#LKoGWSC#2aba?nmshAHf z$u7LMfGiF%B@s5t%NN*@Cb$@zLS74IiuR$4Vj=DtfdG!vgqWuRO(st_*3Nqj8-EQU z(6%Um8{&yrs2>MI575Dbh{*sv6@eKiod5;L!oG{ugoO{0XY3K74hfV#x9@E+PUcQETXgLzf}Kxu;L9cMmz@w9+Q@o#}`epjUQ(GAaN=%Q4a^m&w@BMpcvQNDVS>d zWNr-&Vf%(19U+OJAZuc3eX~S^&pF9ke5JI@-obX0=Pi^5Lc;d;X25zflir?k|H+^z zuQB1FGKnpM{&To7P2vm`0kDocm_F|PnGet7ol)f{yGj_8^AwLCiDDJw_)rab{u+o#yB2v?4ym)0zEWs$cg4y;{J%$G{<>GoS zB`-QrkG&SG`s~Gs8*GNDrpO{%=y}gMCFYvRfy2;ES^3*e@be*RW3j!9c$I}c8%rA5 zW1v`s|J=7btC|IJq;y*D*uwHQ8{76!@=*firMsvk`Bwf`TVWt~3QcAEx5E`>DzbQ_790!+6P1fsGI_p}ky{&ib5r~MV zuADIG8)F)fEjax}mzt8B2+>*dN>UzIJfZG}V62Yto|XS7Ar^4i?gTrmwX*Zc&Zk$J_F2?^+#YluW>DW*}j*tlad2l-f1LAXc7+bT8OeFYveCDLu6KExhVxsN6C$h zEt8Ri5rd?g|9#kdi)i8sUF=Er-x7Y+bPm&whh<6?yMSfbl*%@5 zv4f8}LH3nGI8Q>=?5=8)pG{i<$uX@q+pCr9xe_LUs!uI1svelr;0(Pg=a0YVZDc5$CPRQgpDroA zjZ>V+f#Mqmdz>fS00v2(O#oyZ!NNZMU{L-`!a~V_NB1Zj=2pT6n^Q|kK`lZBQcQKqs z@=@cxSlYgTg}JKy_B+r6dL@tjl_2;&Vc$+2m3<3dtN}F}nc2+4zsZO4Z|JD0(>u@z zgTAgncXI77Y%_Gi9I3I5J)JGOz>RV5{mRG;odv-> z@vKEa$!$auX;?yVF}ln01@gsPOJd`Y4# z62XH3qXb1XkR-OZDNfnONSU&`_T$sMM=xBBa0YjZy>d@Xa3-XC(_g}zV$O_lCDT$3 z^Hxm9Z!VN|sc+u>8XytLV3mcUslUoEMLbEz6A&52UkvMlONJb+Grwo_wu43EW=Ese z6KzbYE(;!>E@(Vluml;Wcr)C6!IK&5NWVh)7;lfj?DXcMqH6aL$N7nJ*R!e%WfH@XMk!^jD(Bi+jc&G^LE0iM*id_G>b6=c{=I;l5=~x-* zfm)(ZJv=U~JH7zha(@$p+-^V?e0g)T2_VFLbMY-lWO55FD=h?E5Jvi#ed-DkZoFwP zZIE?w@zF%V^m!U1yjjEiS&4SP?;Jg2_$X7v+k0nl2xO*!yN$(pNccUOeUj)3$|ytL zmz}z80M`_SHm&o8q}}ehi|F@$^`T~r6y_}J-NIw)I zyQwUMGS6;f85s(M;f~dg1sm2j@Riw{7#*!TgCbB!mLpO@mp*v8KUm@s@Ir;VsP9dd5r;D?CokOdT~<8atlmox`t8WKmwk1am5{i;TiEA82Vb~a zkOc{hqA6z>=NCY!C#roTA$~*dDabA|K)|T*NLs`cwEm8qGmELtfYZOE(+)F^WSd|+ z?RiF~pLv28Nxm&_|Jwf3SpoP=Vb8Sm@j0>R6vABpbWt{E^m%TD0F!ggq-vS)l-$kN zRmV3Rs?eP3T5xHrEn+Au!0iZD@gkETKU?zTg^M+tm@ZsWFthqin9?~fYT8}8PoAnN z|K7tV1gC$Uc0nDz&+`L3z)ySu^uI zuuNxfq2<+#tH6BvT+b}I--eG!vikYVu<>tlIbivNw$+cLvWJ4x2)leM)jsc_~kLBc(yW6)6GuXks4uL?GW>@J4 zl!7f{=#%-aD5lfJst(PDIiSm5Vcbc`!Um?}pFL$LAUV|> zaIErsZPSc(c+8x{>mnin-|Nuj0ufr}UK`bjN%|@cEkN5m6Lx0<5v^H+-xtG!Hb0mp zEdLzsu6V@xBW$F&J86u2kUyGDXIVQeD*4g1Tm+e50e(I^(B)Y&VBArVFsYi+{sz5~ z!CC#tolVV0`xEY|MOrxjw!L%Yy5K!%qEOn$Tjngm37E^ghZn4Rt)8{vM4PJvxZ|Jp9ek#3^8)?i9DY>1KsDuuaZWc0>MQ#*3Ua%VzV=MurcVpo zd|CTnv#-;pl;gjr(k!YQrKE!R<(Xc)XM)8kQ^wbpf((uoX>BJdC*LALwR*t3oX^P1 zdq$3l9uauyMI@Tg@aEzShbomlg<&;rWa|b0~E$ch+5wP@h zfQwTjTKnX+umM$EPruMjQ96^$=I)$|pEMksVM$>N?axLVOkwdD|EqAIntOuW?%Sl6 zhN>`Ta+G)U=BxO~U}c?#25hgPe$@wT0IWLmzveWku)-;Dfi9XD%4UyI8k%5%)+<(7 zsZoSCwbP!) z2dc;E+3-bxdkvb zPwa}*FD!|kX|I_xn<^zq9NGH^ed5I1H_pjo7OPfYYJ;H^r(oh2dC`<68pXM)aDBk* z%zS;}MwO(gNOit*zQk(6ow9dz%D3nB@M%c>W~QDet6=|ls;1|^r#g88P`~86jS3(p z>9`mS4wl|b=o7`mf?@g@46+*}`;`_VSWAZUJ)yLodNQ%oyVCWw_@?4>8DBX$`j5md z+XbiTFW#Gz8zam=fD3Q=b+bJs!v{r>U!lqzh__ryN~ojSep;O!(<-iE+UCFo5&&sGH zR@s1V`o9Qr#BqRDk356zojRsB~ssPq;C3nbX zuQ0Fy?gO!J`oB3ehWOHzD$<+1{^W-A>o;eerNVf6V8eGOkgE&kz>!oQtiq8Cx|%rp z{ZJzQQPgk{#%>kIED<@v=L+9#%d39IsQ#|Po@XF*7mT{6S2OpEDX-Tr6u+_S+k$Gz z6&o&(lmr%wz^~s3rv4MhRs-*NXx0;55WAwD+y$yJ89jolu_xefN=<(Sp83YopZM+S zbkSn6lDc(6IBwsd>YC{D?D*Ic?ee==u1iL2YiJACpOuvvB~iXZ*pfPQ1K7a%Q_ZPC z!Xg{RN^6Q9zvE2(YpmF7&f_Oyf!Vg8fpuFa6vLC^C_GinMcF|# zJ3;Gi;7-F804Z?`>8%M*<>;a#Q_ka6mQw&HcsKY<%*w7xFKEFvE|l;qNe>n{jl)qt zfVrH)S#HYO#1;@Mij!zMM_9?a7dCRa3`ietn{OGV8u^Y%>fHNaltEayPhEpU+gW=A zdU1!E!gn)A3r+%4{j>Eo-)mcdu8Z7i6iIN|W31q!bhxQ2Y13@lz*>xW3RzWblx7Oq z!T;<^u6OeI&}KaCPS@N!~&| zAAMwZ1ol6Yz09f}>8!EzVpGa9glL#TEDw5{A$A63K!v}6ICsOOPlA5xsY$B%M{X9Q zvQPP}fWm$n{{b%_zV8T9j7B24?{KDFUAXhNoTl^-<_1bF=1ntiiPpIt3N`Q?w;{X+ zuUq?uht*--#b>W^$!4uX&q0Ax&1;~K&GQ|l?@I!V?_5&&G;vpR$Ds)pLkbHM;=Q9p zSemZl*f@ET{ld28;lw*rr4oZuFN;{*>n?KxZiMd7{+RC!$2zRGabgabJ=C$R5kw^cM{P`cV$ z;)MTV3|;pAL>^_RT5^~iw*&ITwKlEZI5LV(+PNaEFV`J#?{KPUoPJsmHLlw}OvqVr za_Bj*9^~tygtmwDQ7EjroLfLn4KWcC2o-WhvbhvU8%4sR$QW1)oBN?sgk*d*8H8WE zcy2<0qxVl;Z~$`o`U|vlZ&zr1v|`J=4j<-e0BF3_6cl6_8nP2x>jJG7gbP)~0bjG? zO(|1Z8niRfb}-k@|J#O%%k1;^3(l0nbL|oI{=Oww6q01pI#ed~5usZC-)XZ~b%2RY z%G0vDAXCR_KsVCsPUrp~HN^(nK*)A+Wf#T_kxQ?Xnd+Dy~RMhja#tn!b(o-U*M@{2s9 z7rQoRUq*%I{66?%UEf|xk=AOaIdJbFri)M;FOHSC__tCX<}SY_ED*V1($<3bk9O0T z((|<#A^PI@t;! zn!gH=jptkl)&gK6E6-h^i)A`wJV8aH=_9_}8xh{8DdXZ>-kqtVdEWV7X&tAA1m4`J zfL*_r`}U%W*pP9W*Dx=6PDv(*{?TV5`ukB;inDUzY`bH{o;z| z%w3HH7xTA03PX*g*ij)7f>w@rUMC?S;wW#K!C@v8$A}27UHkZ{)XV1UOt@KDa_x-; z34j4}V-SFvPMyJF?{`ROnN5oZN6XUYfttdfY$IQ1;;`U2jq=r*`+#<1`fjg=0|!^h zhO#WLm;1W9S~y^J0F+8Kj{+b}uPNPyEB!|qQ^)4Ttmmr}++gc|=#l_1T7a=su%M77FYYEaUbk+dfV3`yEo*uOyNv{T&b338tyQEXQg zd}^G4(k-=sXOmc=nA@)G?I#|Zvj9=|VUn9=DNCp!S@7w-BEMMg^nGLvhGNY$=z4Na zl_xD9r|sIbbW1ubdM46^Oj11qbIrBy3*F_k7Mp=31Tu5_4Veu`j9GOsPCo?M z8v9IH1!xTVUdlV?GHTwT%}y9O7VPoi(3MeT`8cfO+937TQ`yn+OI1YoAKT{uv|5SH zb4%S~4efR=yw=xV<_N~>lm!sQ=BnO;I>S+q?aeHw#z$J;Sm1C>Kxdt%1qb6L2bR5g zHK>0|_$zTr=X6&=J5~%;=9J_ZC^rWzG44yFEErb*NXxT%kuVZJ2)GfCp8d5`N`7+FBuOcNvQ=A*Q)@h}YEc0WWp{BncRhk}cQx@;c2y_BU`mJO2tc+r38+mFS>&Jv4lXLP}qB?QVVqLJ@Hr+bZD_~^^1+v5}y}>J^rGPpB@LP z%K%xQZ(Z5iQ^30rFD{OF5`ZC!Zk%i=4B>Zv`g@cR&E;}?cZ2_I~x2NMY2SYHdT zmz5yW=5c%QpP)_1^onJQk2CrgrJj-!e;PT#kYWkl zDvmlF2>8vZ6B7S?C;+Dv={Q^;>}efSNORypTwW@;F<4?WN-HJbGA~Y+so5OND_Z5~ z6(`oQ!l`eih-FA|QHRD9l>-urs7}ekU*8e*1CKK{zet%E-WsrS50bNR+*;Uq8<^KC zt`!BL@HX(yv7Q{ss<;|=cWn_P;GD?e`@FDZD<#VN4a|i1hHg%>9`)|)}-&w zAoEpabGT!EVBtmjdgSTa$3lK~5J$sk}?TWhx1C*e$ltw}yl*lG00i`32Tc zeG9xML8h%oX>IYJz>W4ZbYK2PL9(OQ&Nj-YHbQynvEZzxBG#_}Enh_4xjzEQAqw zQI8`uVa=n=$K7T*8pJ#5M-8dul8J|TySY5z+fB?h(B%5(E+4Igw*sg2U3o2aU~?0^ zP(vUxAM-icH%59I>x-^bx;wbfGamdLSf9Amrx#e=-!6Zk-ZR0xHzoLVlS5lE-{Zw+ z4lKBZLPhdVI{|~|+RyKBuMayY$8Zh)?Ia_D%_opH%sykhH9AD03+GfJJyuHX(uY- z)!Cr{znD1%E;xr7gbX@GO-7e*w#W`?on=dS?xf(;=b5obejcl#6MipViKV*}a3HH= z$V<5N)|(kg#a`!fv(|j8uQ_x@oLR8!?Be8BbM-OPKV+|n@K!1dS+^%*@Pqv`T%s>W zJTuZ(?gr;H(Lq5G_~AJ3-`}?{4kAIqtFjP=08SwX#4E?v9s}WPP04>mK>)^}9+i@4 zM_j1%mT(X#pSU9ub_F%+7m_?7)Ls#{v^`_xOXAOxa`c4$2GGDKHd3M&Nfr(Ow#jm9 z&jUx3Fyb@(lu>$g(~K4a-GZ)ZTVyte`Go|Am4wn6T*V{JQOEo5siy2Tp1d6jr=#p| zl?_M+@qh!AF48qnqn`FYQ=%AoI9jv5-q72S?q}keoxS`Bmb3|EvcBO;(?}Y6I9^0=VSb1t zJeE~Rs>Gq3&91GE@$S6B7_^F6Z5Um%UF~io6!oPk;U(tFg->?EtYv&r@LDTD?2w{& z3B3G1(nEsAb}``8=hhIhcA29qi*QMp1RF7a=iEfj0tJGb&m&y=9v2tF*Z>TDGa%X{ z`dOG|zO%tN`4V{F#N)K;hxF~35v{l0Lj>*5cwz+h{Zv3FLH=H>P?GzJfkIn;OeV~J zw{n|PY2PO19aq-;Ojxx+CkPevvu@8vRt}|Nf1tw=&fbzDs{W##ro;u@)cvBwo#EAP zC!~0Hf)L0?J_SEd9EP&NxVqAvwzq00kCQHoxkB94SQVrI>!(=4SNuy1%fj@*6p-+8 zIZNi0m-J&!dL)UR{A#j3p##(`62Xo z`Fn-Vn!j|c^5~{*X!!ztcpHA*d9NE~am+;IzAr$%RBMK$ZPwvvZ@WRXdQza?o>95D zjzCHEy_XQbl{WTHgv?I~Ab$U&B`v~GUAF2~%ghy(w9MO+VSEdZn|$Jh%qJ(gxRaSB zPaI!O|09YnnuHAfzm!v0ygL+7A^92{2m2jLpvH&s{5=nQI>xAbhJB6hW{r`zn>IkFV9)Qx>ro%xRoJM#PCdO0alK1tC` zTyH2c>$rlJ_Hq+e*R)gHJv>@-))a|G#kP&o2zJo<3Yb1=8gazue&dGIn~%r2`@Jn9 zB+oHX`XYzb<9I%60yk*{7S6Y^zH&~4;drTry@Q^D6HQSSq z%bJ-mWECVxDP+wsImb_BJRqBq0CSz%_j@2%Iu3S_XdV9LmycmS2MFq^4h-jsi1fBn zzG&fSCT{VgAnjPtx9ry)0C#jbM}=>2RNcta2II7SFTVE%u9MQHHFga^SE?N0NPH=9Xi#+SUV{|LfSo`tHv`WngydLmD&m{-d`(lwq6AloEzfn_Ox@i1nMRG{> z<`cn2(Vgj|in2uSa|p{EZy>nS2I=azO4jG~epGk%QD`DgTV*) zZf1})iC1a;VU^I@i{$)>!dLa2`E*b%q&?-5OhK&zwkma+a{0*Gyaxqg&}Vm{AAU104{RgZv5R|TKhUfzipAQb2U4e*-2gAowy5Lb^DeagCY9s4 z`Tq;ozVT`Yjc0?b?oULQ7MNnzen+A{(%;hJ^7=`Z`@ekOhwyC6>Fph)wjIDP%?G!u z6f-vhqe`bWFGJBEfzn@X}jM30N_HFu{M}(|ZXo$yJnOYHE z4c|GN=#3k_-^FX>9b>UfbigZkv@>Q4Q;nC1f)bwOPigBT*GS$IJUfMXw>bA_W1sJf zJ+)|woEIjMag20Jr2h_SVFHHG;Bl#-d0pshxr%ZA_Ifckq}O!lqSeE= zw?V$_vT3y5(S6$6#VdY9l<*E-`73BOnB8wA3)tww|H?}Q z!)#atMpw~k>P%KPN%LH#pdDq506am@5CGOrTgR3x1KE`Zg=E5>yxPEN@NF^72Zn*t zIj+iyYA^pvYA3S|)@#m_VU@$OQns=Ho^N)%!9zKUqW9j049gyTSY&Nfx2Z(nrFrU) zcJY`f49P(IFAXC;TgsjeyT*#C7<-ZqG@Oh>F?Yj`jUFF&IGi>o;btas5HcB9BvDGZ zMLW&ehRZ@J1|AITo)rMi46U;ThQgy^|=#!B^2O7Xq%&`^!l6fIn$jY!QcVGyU0ODWRegyv33A; zWJS6r_jFB!lK4FRNbSQM(EK-m8T$JQZydsI9|-VUgchDp^ocsbII?QrRM2IpbKL4KSr&{RX+JoTqbln80|-bWjGcA1bD`cQI=V zZD8Imc9D=8JAO+-vUMG#!_L2~T>XZK=I@PW7c^9*gsT%_P3F!BM9}`x;>t0$B;( zvKvcS#4Z80r%H>lrRBv71bvcFG`#s&`EjWtUMuHzmE*d3( zEqAr;Ffb(LbZZx_^6%JZ1WdB$1vJ71^Vwc%wO`TZQ)V=itI!u%?WJ4*{E#eqx;@4; zdu@KcU#lfCGvEvx=LVt>Z7j|J!CAfcp~_jo$yk!c-<*_X1)Bq&9dqxLGS8_oBjM#K zT?hvq1lenQtg5=#<^ewnqnEYl4zwQ{D>S9_Sce+j+p2;XclL0#k%FLvh2o7_a}`3~ zVz<~7m;j_FP?A;25vePIWL?r zKeVk;OQ^?S_7wc%tQ2XA3YDT|1Z!)@@>VvRY=TD0t5DmPc?Sis$ApyyySObkiTBdi zW)OJiwBL$@%vMU>>hdc$jCO>@@ed60NemKp@0fc zGu3pf1A%`CB>w`P260$(Y0*G}Ff(kj)2i+qpvbnX4vmCCd%ptWN`8Ur|$X>p*`jtb>f%MGF+!>Yp z2k@1HNrc4K6xI^D4tsTy&!eu{5W1k{#L{{9LB0=Dd;<$qyd_Abb`55_MPrtnSJKW_ zmh4Zgbo1wOG|&D0L^dnwUegN2v{SqNZvo_#a5bmW?GxlHz_cuQ z+HH`BUZXMrYI8-VzH0Y^CS$&t#HxG4qUhGD6y7ae@GXA=2iIJXDhiR{lTLG%Z4u{w zZ|NfRRfn_07o>7Ok``Iv8LQe$l46ux);CaA7Mck$#JtvmRcMTDz~gH? zWav08;U&!AmPdJPchWaWieq1!oBRC`_bQY6r1Y1a$le1wO&n!uE-3_^Yt;yXkaVBB z7x$p`>pqI(|b{W7+w6}Z(vi8TN!P@f83vdBrRyHWa6W*0mar1MofKTW5s;t z_q!Ewg4(&&gkmtwvoY4L(UPH#j62>C#N%Yx?6FGFBe3UZ!}5fa`#{)bO+XgJ%lxL7 zg7A>31_rv*7eDK}BzQ+ILlBenvgkt1Qe}?AGblSIAf`f(39eFWmhx>Z+ZDBv&7<&fC+2vj&xiQV?J2`OArE${^vE4jxQ1~y3+7RSW? zEg>$O>=$CWM#|0&>GP!odt9wf2!YG?-b!mEs_Cv$``onB*0IOXZw!$wQHokg?WBxu zjw&uS`qRg&Rh4B*5iw52MCTan6V?5Ng!4Oa<7`RAbnGrbo605urdV-l!pfR4enrtq zm`&d3WQzdXr~jfD$0?r>qok$4xwRBVLu9y@YDcsf5x`W{4l@vT)`Dm<{rH~ks=Vhy zA5U@e`R!uE_6UBe;p>&oypJD%=?0q|H+}UgTx&5b`gk9 zTL99FGz=el>9oDQ^|7%Ia)Y_ca_t8kReDIB)JtI5&_Yt+>ju*e>vt-0n>_f}b?$h) zGZ6iiBK{@1n(?XMXoRRW8TOWamahlXtpp!X06T~WbEgk8o;+zDn2FoH-MoM!gv7yo z?n3d8er!;@tl92?oVf5=kbrLnyexZ?;k=Qq6uiffcv*Q`%TVPc2g3>xjjoOW^a9K- zw#QrWwvyd1v`g8GOZu^v!><(*4n+2Yadm`iZY2^lcAI>njd7hZj&%0i=ylFe;$!V~ zPgqb$TkrssTs3j=&E(Imi*7)-`Iub5qZCkG|B59rn&T-3r1d3%zoU;!!gVB%^(*l2 z$Tnr3hDS?WRTU7|4yZXZjfO$-xj$GPPVZu@&-6N=d|gnxpRu|)wSQ*R3#pEm`lTv5 z9X!rB(QE2bN1(TMq8rg^xS>TZm*#nmo!J+TUN_9QurzPQn-$X(+6I0C;pY#L{{EH% z;rv?Lo8_^mfB);6MS|MkPyBP1^VXiUAPUJH&;GB>=*#0E2W`aA`8U1mET^F$_v z{jI$)BVS-rXzW*6=__UiL~ZJS+|Ywxfv;qy!FDMgZR%4fgv~y!3JNJbDtYppXu1T7 zNyxNdx*b$_6}QANp#1~8jRG*2t5^Q*{R-7Vyzj>!GV4?2P}G2Njnl!5+QyQ}A&K;t1U2G9y68}BU~n#@1e1*fMRYHB<4wP@v<6g^44@XhB5?G z82{qB&lH+4g(eOj(kQ7XFqjcV@oSz9sr65Ktc>2bZ2q&(JO1tN+47RUrD`^hVS+I) zLz|xFdyzhl1RCB)?#;cJo4fQ{sLc+~18zWU|>n9a>XB1o>|=(bc8#3h6bd+xm>JhHRH^Q zqnFm?i#sb>_V(Yax7YZZvY1W>+5EIW0P3_S-&giPB~i0bqFtZ=u>vc!J!Iyy7W9@Xc+0C2w50in8%^5lr%KH#telezF3moyL&aO4xLjt1%$Z(= z1;R6Y7MsU5ua#71YGHGvv&7rNjv@vYEMZ z;Bu5T>ZL?gauWQV;?~;GmLLp3exg4XmyKAv9O#JSET|Za$q-&9Wz96GFu0E!t3r4& zEH~Y;(CHG6PZ}@Pub*=E=yt~jFz14Nug8KzPC0AF=`>@C>=XPBAHP_uxp>mAyYTny z#hAr3qP$yJE2AxOl(F#TU}*P?nE{vzRac*m+dXljGe{X1pZusCW6szWUC*a+U*M9Z z2q?4BwU8|7Dw-=GbYW7BKj|?Uh)Go+ts18M-;FeF#8|)gygK zPv$@7T}qdsEdC}o_hCUsMfaJQxa|@T z&adSCSq<~*@RH_}{o{O91i!pTc%{@v$CPkDpmGi6YP2CGWD*B&xwq_h=w`9TDBlL z!9^!1`g~4e_fGlq%xFyWkgjuWJis1m4Sv1s4Ze}+KfaKgVa0j)-DTQiNhmn;+a88i z(!Qf{|Lr`)ubGjk&_y|;<}NwYq_R9Bb?WCKThC#G6yKpe&6IbBm>Ev+m2=4@77Q8% zj14%ez0aQLqrs1~+1);<`&iZ1&9P!5l&Zk13+})D9e5vonWKm#0*yLBrE3QW;=Y1) z@jK?&$Fg>|7nsZun+G%L^Aybs@qic|Z!!sU+2XCoou)i4MUbNnr~kM@BEm^S@MJlP zQK&Sn-{oYIR&nI9fc=%#O!-UDIb{&7xc(1|2>U7AG~S}tc!>*fOI>e{dm7+QdtvSy zeacw6-gT5u1|lg(3z;OFvO-Rpf|^W=J-#GUn$(21;e8$82a|l?EMXJ1=6B^jQUZZJ zSdz;wMj{kz$E3$sUmW8(<#Yd+YcHoY0#gFq5mAl<92y>$dxzQ=;_c&1cAl)-Rj49( zt28(O{4te@r@_XbOi8$^oZs3Tf>sRtl=eSicox>J$6UVD*dE!1^5KSljdr zFb+5D6_}EM4E*pOO>=4&nCcwDW=VwB=p?f4WZ0v?o%+Z{tgCU(=dxoh-{B=bN2v|_ z9m^A3t{}_D zR%^pJY{|`JDv?WfAlavsJqBW1YiS%@!@a6r0kt#VA+dg4Sy}NGQNCG&lJxEGu^S^|^%Rfho$(43%#ka+jRXE7=l9);h_ZnilddRg%6!TR30Fb}+^|zp{-9o{Q2v zSn+Z+krzO%AVqc9f8~v_CKKiIc@?LA)ZDfF#da5=shUXWJQ&StBept2=)yLS|HeV(hFRPNvc@>8%ZYn2X{Eiv zVOW1mj6m(hD#ZGqg#MK_ub5l1P^z90hYPJj60fzepju>BjJkA&tt2HNnW8WAbuZ1GA^F-BY>j)?^ifa^rTQUiyMBp9p^_YF(B1-*Q?;z$I zeT4alkok;{vN$D5Z zyPIcPxruNmW#x^$AO#QY! zpDWrt#_x4+Y6ji_R`v6ze4zMhAB5`8HXC)(gRv1f&|nS*LoDkbbxVWi1G2NCh7>6kno`k2v6B z9&33Wh463KF)I@Y5t&%O))S7?%zy{l8BZ0AP>Ygo+6%;M?b%aG9F2p&+2ByVUeYUW zO%VVYGB1$W>Qi{MfD%PK>5i~yC6goQahhTNok5G0YVR%^(C8j`f(?0x)V!%0l~AMS zERH{Om4#<)ZK=TdokxcCUEq6{aogEs)Y$5?z$|YKprJbND03$F)7p5U3ZWN)Eymc=Z7BWU-cI&k61ZbWBq= zSdBAFXpoaP+Cvo|V5;-bMrDxYY-Caelf9H)8di{M5090v@g^L$8S{*9#9A}bfFK4a z{&OPQCR5ol)dY|n-rvU$en&3=^>rN5-3JwmB+&rsT@@JDa?!m?H|gIu@#KeHGizt5 zD;JPdswb^gn~h61=8BgeyAmO1lw7QvT>>a78QKHHBT{T~@*`sEjYH_Dwi{dy|E>vT z@)XHRE_{I|4E;himoN;!_$b^h#Cs>XFUyD3P`|Af`CY-N;X&L|Cmuu$^*AL=!kTgl z3pQSk2CPz&c2LG6F+;I3JUg7_KJY?mE6m?JA>-8%>zC3tnfI>L&L=wlZVr!JH? zT>=DvUH7=kj*<&z!1D%I9(Hc4e2Yat@}Z$?&qf%oj>xH!vE-B&df>jgrHqV|mrVr~ znz2W~JC8w2%qJFCxeB*~1@r~?cm$`($xeiR91#jT?C2V~+!f-)z%&7R=PrLgO^@Lmp$w?X^N3Owki1T=TALj#6$PAr5YjL_ZTh{5`BAK8lk*LXD zcUB$(hq8^cqpZ6L`vZhUi!tWZRGfmVabX3w0Ejenc#ItAi7zCgI9)X$q5vcPZ-sJ!&Gb=~-$ed`Z1^hn57rO;%|Et7-8uoqwBw zXT{AHkEd&CAbM;c9dxWhgn8whc#yX?A z%?Rin3Y4khTxa9RMk210l##qOsgCM+V~2XLf6O%ZuihaK7)2hg^)*#$&8NDR^GBKA zP>I*Q?lVBHSKOA{;Ja}dv=u6bb_`5Ce0Vsr$K)wpOck_(J z-?`#f3H7gP)!lFR<#sB%gcg6q+Yk;PWl$lZnnDV4$rLxW^9RZq*<6K*0`PxoetM#X zTGp9;7WseCQLZ5v+3%JgB<4w8X$mjW_9fCvvVba$Uoqdf1$l%vzK3VI-zP>*mEs=# z^yRB3)W@c3at|zov$$})*gy*MOOrX7HhpuO;b?{6(i->u+-n|+oK`);0^<^l>A1Lo&$S^$&v}(vpBcL8pU!9S~lU; zF-m>DVC-!vRC0t1oFplgYq&?CC9wGFMeipxeI|IiRe??@YT=A3hNnN{%1C0xFenQ< zJ^}8|#weR`#pQ+po~+Gx@dli{IB>MP7+|JJ-hZJNm{PY&;gPhQL81#Q-xA&nKiv~Y zZx)NSu-ft5Aava1D_s%U&qZB{0*qNjtQ)_1w3uJ3cG4Er={sc%OymO}bPHpM2TG|2 zI}7xo)ztyX5l|6Z>~sX%Rfx!b{RxyAcQf)z%8&8#7Q1qCxb%~9nCPl6J=nT(jN6tM zdn)R1Wik)$==&e0{ULkKewJm}p&?;PL=+Vqvn;cyE5yZJQ9ZguW3MGVXsUJC0?-{B zz{=n!tpTBq-Ul4ko5K$ui!~h#8O3t-23S^jnVE_2JOBAa@|%Jwh&VPy@Mm*_w}RLV z^>)Z`5wz{TBP9C?kj&(cWhyN5p1wv_9J5U@=-OZZZ0FTLaK+!53y?oz81-H>E&<*t zx$83-OQ|KKM}zoG19sM>N^o| znNE)U%6&}5!&zw(m?lUNf`>yN;aI`3+7AToiId$1IGWrc01LPNGt1xf0d7D#dYu;@O3CuEnCT^hn*)7U*MP5gJg2XqHU>gcjn=}t-sg`YuL zu=bOkfj$VzdiW$)RW&7e?aBHFBAg#wo~OyIM6R&!_w)b%HZBz+;i36jXzWcNa`hluOHTYKu6RXKL&9^o|G5v!L&1*hzFX5`#Z-I zy32#W6%+k3sSi8+g?$CD%(fGpng?=0Ec_<{%3ZDDWypZ0d0u534TWc_jln9+^R$%0 zBlR#yTY*^b#op7qZNfeKnBD^0>G$f=9=9sxjVof_{6K~?397qCZE$Pr>~Ny|wC=M> zWum|ut!oVLq-DG}t;LN~Aqti9R@wI?7sW6U`56(Kgxi zMBKqP0guWLfacg)ghNPN*T;j;Qs$h$LzbD=d`MaV9kTUZopjbZ&%S zjjokD%r2RupoWqiBDqNfvQP1awbKciiAVnNnC+gqwOnnc=oWf)?Z0_^J;2w=rU2@d`q`f(?3G4r8$r+ES$J5B67l`B!SDrwzjX@DqYiOz z>B|#NrNpIGiz<`!;4g&8PVwG-W zaNocIw8t>LP96-a;iL#WLU&DIt~>uz!Twkkvs1OCV?$D`e#>5x3lSTtXHs%h8K-EN zf9|#jO}=o!56VLWxh^?_i0f#TRfmknwY(%+9T*us(NfUKXc3pH2?rfMp0vN0QJMqt zIkds(5e;kf$vL;aS`Q;bqemil2FC1vRx^BQ{ygu{zTiVX z)W1e6Fj6`vWQ(h9G6@*O%w@BOYD$61J6KRi)|4< zRfXo$lXmGogpRpz=pU!#zeciDLF{<_Sg{@v^v)%D3P+_A&w7D%b;7a*N=KXd^Le5^ z&n^H}2U4X%Ru6Auvh#Wh;72Y3g`aw^LuBRrs7KY3&Y}{p8!^IR3Nl<*BZARJp3H?3 zQ{J+Qs8mScyP-Z*+rOExpep5qS#|JEKdPK)7m9&es6Y(+>@gR?!809L_F%5#a3{8@ zOG5ewqJdCzD4%mHuM5GUE{Vo|p$wsyrr}mzt;&;2o*w7K@+AT>|NVn7H+=5ybEr6=JqKXXW{KwgbAUYL!_fHtC$jW;jbP3w|5;ISJ^s{6$ zIfDxXg9_K4B}6jZ4V4ZTcUUz&xGJN%SwyLj{de%G)2dN;YQhurg4$Ry19J|15QBM|H!553>C;@l@ZfL(#2MFz}=6yO(Jd#Vqdd0!Tp!!1-K%5wE{s{ej4UBE%= zN7yleZQ%GTwN>0doILAW;%v|g)P`~4d%oSm*etfpG}JmGu(CX}Qh}`Kjkpfh7M}JL z0D^5DK_g;?!6-2A_Xp~f*xz#C9zup?$7|lkvoy^q#ezR2O^6@sbyHp+^-~1O(ir;y zXfMtEYgx9t?ClFwVraE*7PJ<2d%Bs9sqOKp3*b$c4HNPnYHDEfP&_aE4U?QlghtDe zd}^v3FOgXI7yM;CUYyjfEe}Ot+E=N@T0198{BYaaiwpvc_h;wRK%A}d_xD~=-i679 z46VEp#yn7d8%;fDMTd}re>i4_+OJ0(twE+_1fr23a8v4o05gL1WmR^@xTSNL0x=yN z|AvZQ6YUqPU*BCL9x)Zt4^hY|KwemUpy9j)I@Yt5Sk~SY-Nw%2+cf8Y!3593|K{QW z=i1)3x3p_YLKh=&>AjKqRde+RJw+qI7Z{u)vXf?Hl|jE6kL2$PrKh|N!GG7sTt8gY z{z>YD(IJ?bi(8c?W2Am?Q@+T(&34kg9=cj8i(vN9xf=>t%Oi2b$087eNuHSHcj(%*f^tRVZ90wNJmQdc0Vf=7Qd=QZlX3vLf-_cQu^4dnYo{+Oq zL+3?)_Y4f;bMDhIxEoMrd>=U;wz1)iQ~P5eM4`w^tr9Qnpl z2^^FcF(Z$nV#A~aSV)$yT5cW-()f<_Xr61<|#B-V{dB5_0`ZgPXth#68I%` zjv&Ku@W{kSNuA0;;BY^udIwt75MJs(EAX!9tdOv%%EP1Y3^A(ow}7666hca(c68p| z1S}EJF0zKTI`bcYG1%C=-t37e?l>G!g;U_pD$3NE1WWP& zsa*kYe`iN;&*Tb2qR!KHXvm)-Pl6tt!UGH0Gz1(de+OZWDL}94gA;!$Gr4fk<4hRs z*YB&HdOkUUwv)OYcx}f%S`oQ+pD$6D73o8m-GcBzix`I9>TsrQMJ-^C-jHRBo{X_y z5|f|m=y<(qS)KX^3CcQh$~}ccs@VjO5$M2#rYWj9xQx@3#m2ZXN16MDLpd^bY?WZ? zw18q+;xdyW55--b> zKSL3Y3i5vLAPqx$$b+pcDihp-xOmK7F+1>BdV3)8EDGClqqo{gea&oYYPAnj4RjF% ze;QI?;EfQ(&e$%@9T-z_Nvh6t?8|g!Y@f7l7^oml+n~S-2ldHT`545d3#k+?OLs4ym==7OC z873Y;@68FOH_8QXNETbJnGusY!wJEI{G4^BCko6Gu;}~=v793mAHUR<9?)ybQ*f^b zu?`yYbk12#Na7>hfR)2#I?1AhxP1O`j)#K9CAoII{>IYWed}OirUqM94BTc#{Pn#VGhtw=DX9`+h z_X6=+3?+7cpB)cR6Em`Na2XD<1aC%AU+>1~BkEKFXr$k2s7HnCO7i=??t~}wD8!|P zA;*XaES!w%=TNB2=7P|;YW;@RP+8h2hKkRTe@aABE*$UPI5ldLc20|KFGa~Bxj^lpqN@Tow-AFlEm#qR&fEtP9Xs)i^+xfLUn@1i#=Rx0LHKc~9||7mQTvHG-QM zTG}O9cyJ1S3S2l4zuE6Et1(a%pHmxvCGxXDc13;@cZ7Si#_;fSzuJj7;2(N8O3nm; zCQ6J~tBTZF%S}LG3bD@UiO}imMO>h@({8$h@%NRb`Z~F#kmeC`Pr^&r*@k}jYuPLw z@0!)_vMbC*v~QBL_wH;oiE#LlUzY`yVk+aB3L$tWCoKIIUr1(>b+(}d?QpcJt?*GNZC*dklSWbO$y|hjT$w_PYY7N6`HFVzz|Z` z#@FrilZpwdM>O}Ee|_DB%R<6yLp)^(I%NTJxK@C4Xyj6Ki`S7`{m_}6=~p#ONhMk3 zMvia`$l;@9_~URLV6AG+nn>?VS^Z#9wROfBQDPpFX@X1MI)XhN*}#y23lX9KsTLR({+AB5Al3U%!#KEA0 zaE?EZ4Zqxsz#9<176i$-$k8W)b9o9&ztK8lFO0wVC-&w*(>y7eCS;3o2B?pF66`0+ z(f41X^8mosfP3@NeIwl80=bsyd zF*_J%M=-zYuSHAo;=+vje+-Nr%w^89kd3<{!(RtX6E*K1SO{=u{iVo5nwFBKL=lI& zS>BR3-K}SAF;)V1{B#RkVRHP_Q%*?Do`{CHK@FSmw$eyC)6(k`#1J*Ez<6XbUGiua z2Dax+lGuo#QR6~(ZH#<9qZJ_>!t@H6VJrQzyp@jz4X{$>pKFz_L95{}MQPVTs4r1VbEbe)|fKxW~=mh~QTbL11Hr2nfO6Co#OS zlgfCM;oSnbtcEWHo3S}v_Pr4AhXmB%s6OrviP&-575a|%E}~CZnq#fM#zQLp^7Dcz zj-uk_zOH1Nf?bEgdus@eFAuQ{r^VdKE?4TN5a-$U(HBXBhn%Mo&$C|qfS3|GrYJqG zahO^Q%q!H_Rnt8W4k^ipk_iOb6y^D*YBzbAbE9)-u6Lu%P&Z1fA~?}RpJdZqN_^;K zr*1({LIchKF0BfGPecgQN@lYt7$!hpqB%A7$?M;}K_HgbxgT|3WN7np1`W(6i;h== zhv%O=%U=|y*#Bp3ELQa@X_|1(DOdcT9~cLfQox~Aa6efMVf{>nIGbh`LFy0jsW z>8taop`apn!RIK_XW6Ajfq?I1*$HQq@>Dg24eWsv2GNz%1e)bcJU;qKvE_rmU=NoK zhL$pgffX~HEnCM+b>MqREVK!0pA;UBIcX%$$^TLxA_O_B_F`@bAybh$*7@Qhmhuog zCIf}i261@^aB>mRgpG@4#7>~yK%~xzB=HA(Hih!*ndX3BTJb|YPi|X#cr6N(zy-|= zTN8jMrpqhJ>fJ>IMe>g;j>#}_&mT=^2ZzmhI{d5#m`xA}_6wOy9jexfl?4m%qO1HT zrPZ)jluys4q-G)&!)#vM3+)d~ei=E`!R~kbo6G&RM0)LeEDESyBK*g!!m4Tm0gjgI zeNj))S%@Kf#X@Vs! zR4>gGL9k2Yn2aM~-WvP+KCPEo#9C3&LI}R_pf;v^j2NN;ewXHZ6AolN zy4B9|8}*_`GkfyXceKljqTN`tcBSG{y-BJ4_b0XVTxTlKM$ z+sII%>p%`5>gPusk=EQwZTAc+QN;+Ve*qD3WCD$#`zESH6hja?yP-Qn=E{fecrp7k zClr~egEc<`Z$E3#gmf(bXo^I;%KN+|Tz^bjqFvg7= z_>((vXvm+QF=Bq|=*k?FvCv$opj6Mc(*R#4>K&AW0LB^;sa^hlurQ%jZn57w{Rly~ zn;GTm3$5XwBAJ3+Sc3p%^vGWNjf#s!w4 z+Gj&qn!sJFuDZWQSf+SNP@p9F=5+LW=aMB+CmR;@)8aqtgS&gsS4B%jb-y!QQCzHzsnWZ#Er z$2d#F+6(gw+lF{&+g!$j@p}T3DIBD;o++%3Cy0!m{{E}XhUuW*xB4I(Ono1 z>EwEClm&rHKN*c=c%wdZAz)a6|4Iuyi3m5ynRc~Oj4 zts`^!@Txn)*?*O;>naMtdPmk4xRUN8ezJKSa9Vt~TJI`@xol6GltpQ*4!h-MCUB-CAu3eDRn0n8x9PEVMTc zeW-*DZ70MerZ+}bh*iw5AuC_$9cO<;5!zJ)W0=Zq(^N<_IfpvfwjgKf%nkr07#s~^ zou(>iH^Q3Jiaf;8TIQ|r=74S@j<5=c@?-wo zTVvzL7J?+xH#Uo4L#lOg7elWe23S97@OUTZ&a|e(p>{mq*yE4a5$04%@#p7IrEPG= zHZ73AiU4Cl-mqL@)|WYtSYD)SCVW)E41Mb}9VM&4ZchK);iGT_ktjn&o0?5@p}Ait zO6hJsngWul3Qw9L$ZYUNDH@1pV5-5b<1&b(G0EtXc?z2`Fr!mv+^*dj+9Fp2y zEF-H>C)r^}x*3L2EQk=zbecd|4W%bQPximp;_jh#Ae&WBuMY2`7S4z=SR(l3-;^{W zT12mO9p;v38bc8?clbb*p!gaACtSNeRMiUQ-OEcvv0sBr(HVrt#P5^gMTTcK0L-gWtC(J_g0NO zf+*8FrZa8Ounv4)hXU>&xo4SlBDAm2KmC?GegrX4&Q2cR-QND9qzfz)Ih?AHMnPzs z$Xv@Dls+i7S;&-BiFx(>CF28cXInHJwNx%MQ%r5{W-aFgV9nszdHxH5D|H!YPb;5+ zz2fa{Oc|G}*y9((pU*AJZRCm8p-h)CKnP`d?|H%sHF+!CpI+Zf>JNpmwJP`|Wt-%W zi*owr8#&TzM-zlK*5>P0l>+`6Fnzg;RmW`gVh4|BYKGv$##w&7=ax-kiU+wv#MWfq zhvjyb0;#tsqbGcSpG7Uoba1%(z4#-Uun)N_xbBIp-YTf9KDe00#iH4^h|D*-C|1b+ z@Lr~xn0ANSyBp1xeSh>Yhr{h`SqM!h>dh-obn^|6T8l(%)S+ouQ=~V5cg_o)RrS-d za1t0=Kvmk*HtpoaP8v4z0=~d^F@SAG4GddEu8!tJFrvbc;$&T{CC`0B9q>|n>8luD zk4K>0(ts+T{nu@L`Q(*tr2XPY)J5Jd?LnQ~SG2wG+iYWz9Rbt8b5}_o5wIsLG-r&1 zL4vY4l_&jrrma^kDHM1LyTR!2-Vf||i0a7QMN|2;EuO>wNaXg=~>NAI|D z!EVX%_-7blIDsn>i1g_vH|@!GZ&`<- zNx!?b4inMRHUb*~X`~#0!Rq=4+p>Dkc(gqVa)(19*#a!;acPoAUur^uVwh@M*+|#iEZA*rv@0Av`yc#~^%HP}vF(NRuN` zoHdRr87HD6RqUOWYF>(#^IMzx>jr6q>vw zT?3H_i+0rLL}X7LlCjQa=AXFA$LJz4m$9Mk^TJAgKwP7EqdVa&ypRG|F=?(TJZg=M zuL_Z1kD2-*6-Y<(7PXCiy)RG3nwWfh`69B0)70~|PVK35FJf7g+(YqGJVSsY>c)IN z+lh^u`=XpVKT%P`q7BaCgPZB^hm1GCO)%&ler7n#Jp#dae(zXhD6F0eu4^$d3^YW8 zNd=CXGGlk5ijU_5jF7H&5^-?%BOh=nA5NKw(yG9k`2mB4Da#~w zyCusdGazRYr$IyesXbF$+0)44$}#1RFVhiHn+w{}=UOpJBDN=^OLS5MK6kA5n6gbr^m|b_75GV z;zDfRPBMhilnq=QDy*x9Y2^puTu(cOX^En2c*ne=NV4np?>)aly|Oyv?pV*Tkc?hf z{|qTMBk?W(GH0n16dr83c&to$^|PkqSk3MSYFLNwhupT(PrkIWU-ZC2k5D_N$oYJz ztvmV6!hFJ5aWipZ@HnJP76KR&@2!l|18#D*hjfq3SKOxLDg{K)hx23M;1${o=`eqb ze$M zXMeb`o87}N9l^&;yE+RaAZgF`KSdiyK-A?<#N&>s?pU2NzKi%U*!Z2}_Axe2!TUF@ zr?%fl99e**!DSglhY!!4+rIuKuu#9bxpt`bfkn_?Bn|tv#XPx&w*d+i{=BB2B#S3o zqX0p#I@**pX0bW*IOSzDE|WJ|J+8^`5(N?Zen5FgnLcu(CRmR=lc^tumc_Nfp8$B< zUB6014(RgWo?6V9{&^jw^svKWV@V=P>PM0#@DR?>+*wujcYgRf(3wF-zvoT}q!?kl zS2?iealu*)Y9ZaQ-ZtA7<@~t~Ru8v?V{$#RFkg6K-su$^o5OZv@xdqisVFG8lGAUD z$`C7J!lFWyHA-byv8{v|YZKB*OhEb8!6>Ea*%&fhR!3qXIX3xm1%E z7P)1iL{%KMey*~Pa(53nfrs+M6jgE#t0bQlL-HwBX3(W8fuMHnc{+DYoS^1NU0hOC z9|-7qG`+CfqO#D{{X`!k0jIT3(w1TSgy4gXT@f7R@8$5cc(GMa^U&bhQi;<73I^9w z3-yV^Csv>tQ2D%=M#Lu$-XZLHkYiqlz#_yyrdzjO5?8>@>*KuIEQz z|LD4iJDZo{VCD?OG^tS?uRQRg4W%E}_99M?uKmSKbz*|J_yIo?Zz)h`_rCQA`fzSr@a7lZU5)Gog>y0=x-%)i%U!HqqSg+D{f}fUlI)WGOFO;d?moV1 zt(=o_lTG|hBKB!;Xc;+T*ea%7%mU7R6uq%aCGG4HT~Y1~^1?sMmldz{eXOQaX+Gb! zG3^d`8*scVQpdrJNtiL^gWf4JZVESQKyL`z;tNvsuI<;=)STp!(As93!V}`c=N%GapVWoEbO3#D7Nkv z{qPt4IugJZ4=2Q9r!cKYOzh$(V_RWM()}|KvcCVv7V2A|#?c+N2~0SLMObunl*4{_ zZ*SpJ*$JYEJNDfM%(if6CDThawi#TnHY&Tw+>QV8KVshrj)Oy$hA)7Fz{CUSIac(? zb>e$2G$bzAvQ%+FHRn@9$~Ot&rQM|AG6Mc7_sU0EXJHCl3sVlUF2Q0`h2V90eCAmQ;z0Uox)?i;jBILSz z=#iaWg==qFp`xGgv#@nKILA8q*H{lA>51}DV{X2OBkfNih9BtzpE)@t!^{_I==m(% zPR(-iCkE>fC4Z7#kYQzy87sSE>I3z=+QJgT(dj{dtsq@JZc0^f;DYomrpWL0PV#_D z1sMph%f`3myi;cAq1BG1*G^3LIowzeAr~>mQK}Y6_<|gS)gT*r&smh>>$Kmo>n|wY zQIh_Bnt?s~`gWZjr#-^#?lcCP;<8*7eEx)cdW_)0I2~MyNbK2bOb0YTGs^$OKO!d$ z#3DaK@0S~NIYkvgC7}Y9=iSwttC`Z?oz`c6m9608g1_wkuqcRh<=-nc`x9}lCsI{$ z2=eaGGex^+skixgXi^8QiCC(*_*L{=3Mb0tix5{eamRU%BKx4AOgsHa#NS!qMZl;TSty{=8ZJcH)?PG_iM{hS>_qlu zms0H^t?KuP$X54V`o9H~*tD+&zQ4ovT!uRwhDf@ged0t)g~w}&CKw5^DHAM|zML@G zx+ZGo9R)6IKpeu)JEsl}m{2^I$ZFol=2p552k>{b#=K}G~>D;b2x zl*qXA6{jcdk2%S_lluDt;|92q%S|?gzXrqP9^=^$D)ijl`XW zw+pPj9D@{7G+|XhcMl>@e1oshLVm0c!%Fy7nwzp5*yizGi3ONjaZWh5bGNzR)Ax@% z2(6Teu!O9+()UCuxe#nR%g{zBUeR63zlKj zo?z6M7^CEw6D0e}w`*4P*6q!D3#8cPKyRW_DtW_aiVR&tHE#%|XOjS$3e#gi2pvUs zLP#YM0xQI^W+me_+W8!~{0ICdA0yky#pMgJUsX=?&(HCyrWkl0Jkdk0`2Q|10G-3s z#?oJ`n4^oEi9uU5!q#!2e|>3@(=qT%UWTv_0oFS$ZcQ3S7f6%swT2P)xGjWpR8`E| zS9eMSMzXS=yDlUZu%7`0)3URs_qqn| ze-k}=V1dnb8%^K?YQAwwy& zp^FileJ2zM$(M=3QKGE?156t)F;#l=8(fIbhLwt9ocu7Qo6+~4L|O_|isZEFZt$P& zQLKPdl3*?%^k5E9yOjA1XYIX zH+tDLZs-zc06sj zm$g&5%}!xOf)97oXh){KBZJc>;P={oF!je^^N77+1(>T(%gf94;Qb@1jm2$Rl+ZDa z#3!YgPUwvp398y7`J~nIh7;%Rnmh=Sen?Kb1C8gGAByKl(ruH8gW>6tSPHFX%PO^j zpd|BDuLCwdozc*itN|P1T!6Ai5k*+K)XvcFKE7$TowLQUF^7ivRX~CDPp(ajr^3mV z+n#R5>xFn~gWFye2+jF^>Urp^B?$;ux^e&FiwB*gL(fu}%G897nnJpIDRmgZ5G4If=#7 zwC)8{ABna=~RZcf5X$ zXQMwg@7_Anjot3f&YI?)*S1h$(Uipg3=vDu;!F@sz*cRh-omsaTl>&Usy~(mh9=Eu=#J!S8bAWB%=yckPQ+L8hIFY!p4`xa@~4Xm zq@!Q#hLV$?+^edZ3wjv5Y+dp@${NFUNgCYY-d+X&!rv}aTy8HgCNqwti1{Z{U(Cbs z6aJQk=rc4RUK?(vWY6P&jrz!vMN{%X8cw)^iYlN>L@JxwCIubgs1$yIAZzawUJi%xfI~3Jf&Ecj7_F?49T;*T6j6@wp-wk26XyKcM zaJEc{zzpo7v-{BDWSO3+vFO}WC539eb}bStfC{4r(%6ANLQz;~5_^0Rl%yxf*u3dd zNazFk1T?7VKBoca{Uq`!Q~Z7cRdxlRnG$1~&2^RS)mOVXLlnEw-w){f<7h_;oM*}^ zDgG)e?on`Sjmy<$ONOXxzFopA7NOuyXnH79dTom*Z)b*l@#RP?cXh3=X}1qU8+HSB z9@lgkgh9x-s#!qmrjR9xke#DEEUxH$@5%q2PcSk@;*?YC_PHSYnjL@j*s2i%g4Pt( zF^JSOxMOAy6fsc%sj$$h7jeYjiZn=#&nS}aitD{kRWorRFA5dDl_%&j!4kLXoqsRq zWEuYN16-%`AD}Re6NqZcYzuf#f1&Z9Zo~gD-^`g6)g>kXsmpYR5wFp?YX4`t0)(`i7IPh-rM~(Gb?SfAAk9zSg%7i zomOU-DZnlbLitx^ddVpy;QME0RI5v$oXK34alMlF0Ok8g$m82=?%gm)bYtPfSYOXR ziK2zxSc;o2Qp=9^ie?q{i37n@q`zWQxcF5yLm#MlpsMWM@P%TfLau z=o=O5?fofN!dm@;OSjf6H^uT+3y&w-BVmnB1Y&=?xYq2k58P3!8xiyRzmVaIKaBjw zaYB~c`377(P388HP2e4t1@Hb;7mB#AHTWP%Xr;Cw(|(HRvX$0_8A5!+l$Ek_ma~Ck zBSoN|Ax~2V+HJq3*&)P_VGFJ>2c68@g z`FXLHaP`m~08T)$za^Ay()Gv+IR8m-0+4yprc>=xkZVRFH6yyCdN{z)b!ln<^k5iG zi|rikk2!z^&LE~9_TAh@87OINQeqSi#o0nRGg&f6aWDwKy(JB?xm^wJ9-KcA^=-msK980GQDloC+E zfiqC8)!;by>T;G5r5BPS*d_ROQN*mS;_z@5wyx62KkCKe-niJbs>-hUxtwJ8gW%ET z;M^dZtM~=ub^z&o{Bk1vP`^pTg~;p~;(1IHP9|-cNKWmp?p@NWfeJJrsre#LZHYfC z;VwfkV`A(_;`!>fQK`$Er(Lfg8>-`+)kabkny~^&M^Fu%05d88SuqboA{u9R~ z!o4UO;!b8LubP`zbfS=(SmmXc?XDt+Zp_bE z%TqO=*{Tq{$E>UKE?Y2NfOP2yym%03K+pNruyFZbhnqo3+;MbjGG^q%$V$oeR|_i< z5%jf0nGlB#X`VN|>BB*Zi_ezzVoROS!UYYp3)@QJp@sFhhy1CCfK$G=x!82ktJEPC z(lwwxoRu2yVkxSQ2%+>d;^9@foUgMw5{b^%J@l{RO%~Ky!U6>iX^BUj0dr|gEhZ!* zVp|wYazQ+7S4ZUzJwUt(nZtdUoe~4w6m|ZuLI^#MQgYrtda)*KMOv`<-za}IVt)Jf z46i@K*(sIYE_qco?$n{ zMNv75$buw!{7K1s`?Ao!HIBfWY@k)0`w_sw%}zx-CX zgSR41^h6!|5NUJZEpkn=h=4i_B*Dl)^oj<~dF*1XhkUUEWX!#5e8qpLuR_4&j3(0j-;v`mE9(cCuIeE+T>K~ob$64 zZrlVDQ4N&^G`l9^%a7inDz(-jogK&h0H#xU9MMKI+zoH}lfi+)>lRrV5b3tiVhvj1 z<9jB@lzCF|9X?xA<W*@JwML}UzEd))p@WhqXlk+BfUlXr4OeT0hT|CH>G>H2J(ctizse&x0lS_&&p z=BbtMh?x2jNuNdh>?JKZBA96*+ftvoAf2du`sjvL^u{kSH~G^Gcgf4-kk5Y&5U%z?7M8Q-|AV zM)ef^h$BfA%`f8-Flm_e z+v<&~$Bw~n>@Q)PrIQ!ybfnoR2Bd>tg2^7xn+Z6iK$Zuog$uF63lf~d$Td(0LXR(O z`|}Kg^UqipFgLda1}}A2lj~b!c|v>YDKHjw=66pe7x{e7Py5tnx7}=023A%Z z_R{_2a5`|?BlwBiM1ot&TDISpiOTUaosbhC2_p9}m6!#Yy5+tl4OGPZbMii#@WMgC zeB|1|?N6PlmSnT-G?PmUN*e*IDpyA?(xQ|ea4*faTmwz(8QjcqQ?RnT{mM!RXN1#x zyjI)Zj3VXke<$;_^i--E)z{g&uuqENL|)P#*t0|&|DebUW{_yZ)fiP+=72RwS4K=r zz)4_ytfrA`C*(UXhmZ?^J)fEk@Kg=qOOy>YnaV=7DvqZ?S*CK%4kkyHMhu%|0c<&z z1gb3t^fb>{GqLf5&Y)L4oI$R+%cUrxlkeL`)xa z?ASzSF023$rAyD}k@yHq_&Vsx`af za+Dr+^r@_e=udqkY11iRTB`@-D7{=*)~{MCj!Ui>oX6HER{zihA2SGH%ei9L2O)_j zh%fIw{EaH*)i7Kr0?%~FLJ?U~3d{b9dd+d_Fw(=42-BST>oXHG{6w4TGQ*+;F`C;<<6nKX`K7YI#{2Ri@00mZD ziKY4y`pr!U*G&QFgBzzP{J^amZs^umMIE_#Hik4z;YMjS=YH!U=hc0LXI6}SUZe>F zhkhZ;OzM|Ejdy6E-d*XqcINoRZ5fCT*P->mq4vS#V=NM@?AvK}c>=LKajzrs(+p+IsZ2sf-|8R%KC@nzsJ_ONFI1%;K4z$U24PQmXt-w!AmhP5n#=t$AXcBwc#{2 z=`Bv~!lt{a~%G~%2?&AL}&huSb$WH?NIPT-;RS=f9IJqkUDMXrs!)j6N&0q z2r6*x|-ZMIR1(5{_E|TF@7`HA8@TDuA0G!EO3fX z9cDB?{Y8G0#2>#d?ASfVz?+fqBvC$`8pvlOsz8<-I3y{>au;PIEEUVpC%^W*SD4AD zqg&MFTQl3>!x)w}t znuhmvNN0Soz~Ds8V?SQf`|h~Zvnt8#UXo(n!XZ6=lgH#==2Hi5sOH>H^Vy}MMQN6f z!Y~T(2$!%9P3kNYx>Dq*dLEE+0%Vn+dbapHxcWvGRL4M!B7=&!Uab(bU^yD`#!zj& z)pzASt+vbU+GfZ+Dw1#YW_Ja82EA+YDp}3=yFGD2L1tI`0;q?X zm^UW&u{6Y3T;JYqQu&+-yU=1#KA0Uydzy0SYq86cY0@{p3+>p$25ABpiC<^S{kqp$IMp3PMl5wA8kSQ&k3g+Fnje! zrxR%ChW(!z2{tV?Z)Q_ZtpX$7Au9QGP5bx%{anAC|3}NLbOL$~F8VE)Tr8hJQKac+ zh00tA2I!IyzK-x(e?DBqntR^3;=Yv8`-p=o!_R}cCd?U2!;i4K;aO%Q(wJPGytic- z8i*RI8;Zr*2DA!iP!?~vv)?&0@5c`nJ5?4e{WvSJsqQhGo@_uPb&u^48H|KKcwSdY zV~r*NlD{2xvlAeI(U5G+qWlcmnQ?q!dchkqy|1Og^4pm;k6wZ+6h|dq4kO2nKVOGI z*8Ut=FlTl=kxqGgOtxikEaNp0D>#C{*L?!S>sCLpBTY|(PL|cMXZqGX7I7Hldi}+Z zsxw@2ib(40a8*3FVu+~%a6_BNH=!rzGybQTHadtih{Ob}NVzB{9BYUw_##CNl`#Ap zgR7r9f`L8F1?aj$2+OShqYwj*k2a1c7kk4f&1~(gyw&gVc2J#~*Q|j-+O^7JiH$k< zU`)_RX75=3!|Z$IHmE$5SY;$fo7^ZV(~JOttkz9k2>b837zH39#YjI$=#C<3$AxkA z>E32Ce|bLuLg+i%U%er!Qy&-|glGGfGO)SGCAx9Xp8epf%<{)(5jBo{kgsnHdci6- z-uL%QPT{p$MgbdUzfjKD^X6@A0hkYY&H)!xeVj(<5{x^$fMKkq90CrqLQExR5wE4l zO)~yd74+SkJaj_du?R=KrP)com+uj7CBU+MYJ3QaWx07L?Tu_#Jv>ru~u&Gqo zOm_4j`TMkvJ?TI5x9lPKX5%+%36qq{W&nj9fB~dfdKms*0cb?#&SBQ{lI)*bdRY9E zG(cQ2^g)y1J>oaDc%Ck`)pO6td_xTHY6;3v8M}~7-pOj)rqxfcQP!OVyfUb9l@#62mvBb(MPI#ey1DFG`G-;De^ii*glD|b z%)MU6_M(gabcT@IBJ+Q#7$P<`JNufZN3%+y2I*POr*`5L1^}UCeBxb-V)~Lvhl+E!*m?^#Zj<{Ew@hKs1TvZgE z8ZPy(kVSbm@Mn|Pz4yEV7{ll{+NzupI3K7>9nvQALNlM^Kw<4*uU&5Ik5nkgdyQSV1KsDJhoUkr0Lm_vXmTBcts){6UWo zLTn6(P{*~sZ{W1?9ki^r0 zntu!#D1VP3q&!Uh=Wr0xgGt*VIo9NjZ(6zy^qcswQD$_a7=|!IaQ6Ns^L6wXE2W$+ zf(Ce0)YvY&?7rBmst__97X}p@@jB2L{zgJxdVNljb_PuVC+VB7QHYfEV5Az0r-oF{ z9erHE;I^r4fc>?fC6I3=JEQwX@6qZ>C)Fn(?PIut+|`}ei|PWXIP-YE9Wj#Gc1mLG zL3PkC9Gxgb^C+^=>u?dJsyzfELmcDEqmI2BEC%_M6J?DKutCax^=4o#JJI6$hKYi1 zz!*=ZsNcJQ+MGhz*chyE9&@WtXM@x;98?c_HVsyZBHC!;TOIvK9A^dEgFj#uqLxxojTy|$1Kh}#kHrO}Yh=^^^KcZOPc8|nZ=O+St`X+C-OYg?fRlr35r@U*7Q4NS{eVjZ6MST| zy~aetAu-wxU2)6gh0AaW*mErHk?t@D9MP2$w$s`NFbo?R7LP^M#;NoD1{>cTgkJ2C zDR5h&%#&PMb$T%lOOji0ohdzth^%k^GkxWjLd{8FUoO%K1j$6>9O)7RI1?A#YPtx~ z!2dTpnJ}oAF#&{%^5Bb%Q9{}8gTZ;j6cCs-Df*XOP01w4!`do|Q6^hcSt=XppUAW) zYNe!~#w2Cr5CgOS{Os(|#dDIL@2+vNWMrXkGRh6a1^E+ab{o_%f7Y>^TK3fFN<3}U zAbf1ne|+el%WBi~EF*<}Hn}U(a|_?#h@e&p>q)Mx{q)B`^kS$X1~NARPeH&S+_pL@ zBw-P)09q|Zg2uQ9#AM`FMj$ajflrxwa4^(@X>S96=xm8WCJNqc58G-$ftwu`GiU#; z*&nW;(J54n0k9gCFpIzY%1)it%lR5!60RWQJgjg&8dQ1@U(t-Vqbl>IE_{Sl5OetA zkJv8pJ;hU~mJ9_3AZBz6QQ9`lh+hOmO>W3;`mgcI32@fhOj2{N0`G@~955mW?MAb@ z;8SfeEb^d4jqWj&!;%^Pf@ZF0BV(Mc9eArGV)(>#U!HG~C2Ll85tFH)gzTm`j6`He zF6E4tTrY%;4<%px2l21&ZUmKMG zm-cz2%O}R+`oCLEA%4EcrS8%r=&NM3#V7bXdmgq(e$Z#uE{bayTL7 z?p5a_>C)9X5xqObc>t57{EwOFz$|YB>Ad5`Eko&g(qArw?)anTK>L5O&&u-inIu%W zf5@-E>bXj|Cz4AdtbpPQIq^1(36t{4>-i-5)MKJV6!21_dXbr8%zz>(oAY0a z7zwd%uzkD+A!iW_h2m7g@H^=z6ffiW*H++G!z>H=*ovE-bQ!r7=CUq5ar+cq)7~Il z+8I{+ILNR6IN$TUoyrQ5JA}6~c!vnFrXKa^`NJuS<0K7(Xx0bBh16<6v!KM9-6cu; z!b+U~U-S)7GolnZAyA*ngO80pI`eoRcfxpiT9kn?2K1YYTokQ1g2|0HvT{TFOH1@| z8W@7_f=1(1rBn+*LU=``kZPPJpq6G~NB1|6LSH6xmeG2Bl>AJ$1+yR*Dc&^QlISc6 zmfH%127;V1K!wf7!3FTneO}66^#cjjbuSKPwxBR5LC)h`SB7;mg%CnmkU#<{Coe*Q zV^>$r&mlFczf=Eqpf8atO;{qU)=ts4WWKm}vxB~lX;PS7;TGe%1x?-6S)D5UepQmj7TLir*Rs6r5HLFW-?TJ~Cgq#dk z#&1^qBf3(eq-d*%s|OprgM0cB&U?5&H9`}r2-jTbYr9Qg>v%IcwvT)!)kTdZUW6!5 zDMXe^->N1JUQmqYq+&kdyGH{r%hA#_;^ersbmV5N*g(<^I?eFfg1dokMv~rrI?v8d zGoHpG9skLE@eq$IClDV8;9?s-2|LpjUP4w^a$a+I@Wi8#d3-1_QAD8F_Y`cd$amV# z$D0)fTz$dka!dgHem^<{wzJZS2PalDpDdwitTFu@g#r}d zY&J6%UXL*+HP*7MdLjc?n+OEbbglum>4((CGx!e{yUW74`GQc;FNgGL8E&(Zl0ob2U+W(bZgh}IX(tbA>UFdRu%1Rx~C0a})lMhm}@aJ5ce zJuuON4{EdBgepjad%4*|;p3L8HE~Xxo!*~tD0=u5>FYwEBjdOal1SUC1755FB~T60 zl4rKY(q-dAmb7IU3$_)r9=VO2Td(CBWr>(bJNU|EgvhbiPpCz#tN)9` z&80o8F$SLUpqz=nprSjgcjA*i$|;U$ z8ju>8Dk}C==`R6GWRQn%mY}PO9i=up32qYUmpmW0;^dT8`M?KKnC(LW3am_WW zknJGcid9^D0D$p~7D`H-iNQZ4)?Pz$I`oyS2bZGO^*o`iIEmke{j0Yqi}W^ZnRT4% zMB3k3*-`nYVHIGc3qo4n&Hle5t6~t%$3S~=Ji>9T{@|_bWh28 z9>{KP41!hR3Nz*vw+M9HySPkDc!Yv9S+0wMI##N#pkH^>dH-@msNRDht7ka)$Q& z1vsHvrh8o*$I*saZ%4DATP<@cOgL7adB!%*I|k2jWm9p(AL~c3fKdx~1_M*d6s-}8 zhh@Jelqw^r$gYy5oQLkWa-kB1Wa>T}!m+-wuYx0RBF)!_YC`tQ`3FRewy$wq6kUq6 zb3F&zVr_~zA+JhIY89ntr5ADQTG_bxp&n(w1mQP5hPuV!1q)LydBikUcK8F7CkMz; zd`rS!sJ}ZKVHSpfH4zE-_#ZeBS#zs2UMmXz%&t!2CN1^>-#43u1o=4FEfa%GXG`(q zPQ6l=@BA--ShUS2wy09zIb52Q5?`>c6#cO7e6H+WItd+(- z6{D5t$e~e$bYn$I3KFJ!{*}=jkPVt6_|j{E13Sa~Tfehp49q51wn*K_`?UW6n>}P9 z(_V|X)rhT{inSKmFS_#&V695@HRvpd25TKIi53aO&^dOkgtkqr;X&&@J{?T8{v(xT zV8+~_g?uc5l#~UoOJGF`xnIE)qBBVRs~PFYk(4Lb)W!MFr<{anxtpz2ML*Z5YRjis z^FD@@r!LUHn>19_4xZu$-NZ|f2NMBNkhkbOQ`f)_%aZ*`XfuWR`GNrQ)r%*}J==Yv z6v=^!KUhS#lF6=h%J|gk?|**}?=M!ellU^UfK@U#o1iPNgU1cvhMBMn-iNoBz-wm7 z+{E{N+{84ZkarbbJ4+ifRDD75P*IWBCjhi}mi(v3<7~*F-3-fjz)0(V1*;5=S@+AQ zgvwSXE8Gp8!6B4n@kb&8oS7|S^CM2Xu|}uOGq*-n_nlqA7IlaerL!3d;?5Xt9otZe zEezl)C5F#3oGDG#^`1_wQ_c@rasP;nUR?~Ok2eA=BRgBvKA$7_VfOK=U!+(VQTNH8 zzQ50xpthD+Y)dg%iLf4?MN!QMY@uEc{wo5jBv*j%axVorv6oS{qycZdv*dDJclu< zE$KA_dVsvW@bqp%>g&#cV{xrmKE9b8`1DnJ!(|uSF3kT+U$^62<$)*xU`$%^9P}Y_fxXql7q66u1zm1PWcr~Ej2&<4#!s{i z9VN|lR!P49(~F<7q1DYAo*fG8`Rm%8BZ{F@93UmIaTc@4R!~no*Ytb0)qDmZohd5a_bww4iqCZ>Ko`=cga#0UB57uXeh}nJRi87BVOFF9s186PP z`Y;zTR8`BT=l#Mw(bt0}5xY?%7_2xr`uDXN5s1zq}}^| zKf{l&LROJ6Gb+7tX?I|CtmZ+42P^i*Ez~9FXUt4a1eiM=e#zN|t~|+Tbl|2}|9zhL zi@pQhgc|^h)|BNOZ=D`tCi=|hsKtN_NXoIJ?^(IQeYdHA)G7pW?SbqP$#C4`YjQve zO*O=vU3-q9(T%hlly57+^hr9rh_=&j*wmQ9lTK^~T&OM{Gn##xxJk}mrtgTp`A8ZV z{}%5!UZ&(lryVvf3My-SZr&t25X;4|fRJhOqrn*$lDDC4CmH!|k|K^dj%8BnA9yxWb+ zAK?|4YoFJ?PTk)%eH1(SF<8NG>leq8dm0Hw_a-d?XZo1LFg4Ap1mg}Tgt9xqLT&_j zQzQIk5aBLb%ccApKiK*%r}%UUFp=R;x-S)QMzeZ~X@o^+H0YJQ1+5%NJOm8V>!G2$ z&Zqw~uUZk?B!sdDTbWFMdm`Dp_3qs;9*r4wkHF^h{hixqq_e4i)tt}Z<6DGG_rXC; z8Ncu3q$2|o(VRkePrcqHRM1_Rt!<``keUkt5v!EYBA+50^^FpOYWdHB%5H}rsyAHO zLZdAf57^1ocni_D`;=;_;736L7^Ijift?k`CN3Z7zjBiTZQ-uo{)klVrtYVp8-cY} zOxq3_mf;@eBg3>HDxpFN zVkj(6CHHwMHiqhHw4=xv8l&tJgTd^n-du|Yo0xHJwQ0}%HS%`CRE@bGt}~y5{)`gL zG$SlOkKInXc5`Oh;v-U+RYaTl=RYqA_foA+J1IP$BM!CU2}h8PRqy?*Tn86$^Sb0G=A2^oj*pfhmiyt&I%XJ}`s(Z{AM$wg^9hj*Ue zD6ZB;S=hU@*vJeE$aQ)GTJPq(rM&!UttVX4;M)?iZe(b=V4rakH#+aQ$coMW)@}RA zqBk#sM(M~u3kq`5WV-)6g?BF_SyX32M zR%bp}Y8k+P5;j!9kGuK4uif<2Qr=vuYGwx8z7hljcY?*sFk`n#k@qfKDUZKqAWG{s z2R7+I1oPIeFLIU9hkGz81daSI-4{zIBl|kjU^%%s^lS*X$l+BDQov3HLTpwnWBscI_)V(>u&dQDdP$tLrclBv^fa!zA;E`PbzIYt@+UDxp zLsFC=UvY)O5yS5&PnM8C)i(8;oIShNZfJjcRW`;nD>bEjLt8W>S-tKBu48Iagcmru zWv1PmFy8)MW%Hod#;I8Wwfuq-{vaG`lhz7N^B(2+(VX3m%QqRKyUmH&v5lgqcKl0M z`Ec3>$B$`)D|-Q%@)SR9d7x$KqU?KBY`<%IP!MXZcH`RJEwN}CDoYoaX7;L^?eO8* z@)xn<+ffTe8*dugrc-6@`iY_t>!m>-%4+=kWKxzxc%ULOt$M_l zHd=W|cxeDXAZaQ+X{h5Bui$nnOtneKIDB+s2q2>j(O&ih3`Ma((-ylI^<70@a9w*dblOOgU3;=87o;5DdYpQ=7=Dn7rdjz&9Cn| zOBaNw@%NP@5X|_iwbM^Nk7Uk7tz9*`T~yr!n`2C#&LKe~gF;#Z`|L2bOKu&gL1ipe zo5;)wx^BRwJR?CtZWuMypxcl1dP08~|l~Co{=8X$+K2 zU_j zh)Zk#5i>L3@ML)WvPQT9tIWNdEZole9^X)!8c!%UDov}sWG$Ge;G3u8u<{Z0Ex%|E z8?{Yv%bcu_@+r?5-+yH$&e)(_UBDsq>rx_JLUm%jFik-MW~u=@q8|wn`6}WHnWcT4 zodsBfLYaI=&V5neMQ2!Qh`G*a6uXhi4?eMbVA#lvKCo+%WsVyuM9;Xd-Ev?+(l`=h zjasaBm3XSwFF1vEeJkWu*UzfWeAc}Bd33g zn8VO_$@BaI8z^@BA(k&cjQWI&*Hno8_Y?4?`H5!_c%bc1)dfU(+C0`JJ31P09cl

FOI74UE6%p%4Iz51qPd>$36_if>esk14QNONj~ymK@{91 z$wN<*fq*4KWrjSXmzq6Vza0;8+|0cot#R|W2J5XWG1x#Y&^eZd_V0@wFP?>M#?jGR zHoXbk*KdsL16*Y#TNf%PLt80$3i(#ruqoEji~SS-MLI&<6IQm zhMmd#Go{Hn0*!L-;pKqUs$zgvTs-IsL0;rL>Y{x?m`DU#s^}Yg&pcroT5olmYZmwC z4%kD4X1?)Zx<=GAc9k@^6^0L8WJ1z2I1MBrs232OD}|WH-Kw(T|Nm8ePT*Pe9qu2? zw0g7Tmxru@otPPIhy-V!;l`+g z#R6FX9!_$i5M=9^p(`q>4y78rP}0%-!6!5vnW0-$ehHb~7P;c|xn#@eti#I~A zh}cMhP0Pg*_8Clx*d>l)0E%vtGfCI~ISu#OUAL1D z@4pY|OKN~7^7}<(fq&wUakZSd15}{8*DEJnW9qdyTEw#yAk8VzW$-Tu=D3S!dr`@~ z4+%;b5&|5s=sVyRsy2HGw;smp}vr_!wJE^jjgfCE~Z#P>lf# z8u8wa8n|n`CT}B260IA^O`G|K^A2cF#Z1QC_z0^E(tv-seyYz6p6r*DMlOlR@DWFx z)%&UH1Yn+P2RcrpeT2Jncz62~U z2r_W6>qKkg%WedgM=&vF(gFc%a)1lSxCJ%qbQ6h)T_&g2l9%%@At2e?v^z0}WK*S# z;K9wflRVbo%Tx68v(gs9lKL5u*40;A!)wvAm)UR0(o4wN7t%1WtQl?8{A?*zC%oo{ z>k-ZK{qd16Ou3Q+xz{(A!Q!0rKx`$Wp?#0CgBQ|_>iZ$iB&^nmGI#j8Hy`X-@P(oq zp{KNMYt#sC-QciDk}z~I2pzFb zc3)m9u98%mjN&a}lD(m!wBMPBO>R|7@8wsWL3!wk7ZLSSEuz-Ixuc{{Uwbp!JT|U{(yo=sC-lGx?A$CL zuIuR4g3e{|c>xoOi&~eJ+x=JxPa!!x%3Pn%C#|wo@N0g!EQ19)iSB#rvw*9Ezr6fa z78FQ13+f%cZmqWzddy&C)%(ORsv4bu;!Vf8vA8t~S#XXs3s>=+^$1mw>`1yR(T(ZC zq~VYdkHsb~Ti&zo#YO&lU8K~t9_p&>#C%mUXD}MrG*#>ECb3znB~1mO2m3^ocgQ2N zqu#m`&7nqx(~oEWMk3g$qn7G2%{_5ohYCgyFxx z+}~(wSjSmc+8CN_hTA8@nb*R>k+q}Br{m#;#Zi27Tu=~g_huNJ?8vBFH~G617}~Z( zEvf1#xC@UC|DYU}c9R2^>VJ0VYasXV5g08>~(3BQ+gujz6tMh++0Id-K9+ z-p#QO4Xd42jZ7Z}vz~kJLrYKgG`DPY=9|1ZEB#hxS+_Gp3)nTLhI5UHJ#}x_X|Qjr zUpdJJ2#g`FcGa!n(tOk5iD>ZgtVoRdO!hSjNq9DTD%o7K!agyTu53xTAOG4n%{?ZWUGc6z5ZvxMhmE>Ca8vpnbxzRhQHeS6yd{%?4aglOS~V84DMt(zSjS|29brGo>Asr-*tHon<)B2m z(@M|6VQUHy=1)lE+41WzOiBR#g)x4Y1C3H(L@)L_oeW&8eN^#*6e<^;U!c3*lruu9 za^OmclWE0}AQ&l3D)e?|HyEqt0~*Qe-s72I!WUB83K)%RTMkXx+9DCW`nEQ0HNW&BPx6j8ktW}--FQNGY z5@Zyq4aP(}j8mYY=E#81#35a0Yy&i1o*L$Q2G5hx`#qb@T+CsCUjziNgUo@FN{t}*}cct?N1-W4f87`=}FBZq8XqI23o{as`b<@($W z(zn~(*2c!Z`&w;Xtw3}M+xjln9x1QSJi9UuGDTMeO(~VAdj@9eviV)oNL(5VoW8`=%O8{_Ly5*Fv4RS^ROg##@*MOZAM?a`QRQt1_4!K~vg8aoM7` z>`C*XF_gqB8Ry%M8O|AEj6A}ZheFs~Ah=#;%6P-o{ z?n`IMx!vr&8!Y95gkqB~YrEqJBt3MhQ$s7Y;u~-x>-qH8s3)_W_Y2W$4ew+4z!AZ} zX38p$%DXtw6oMj7N(F$fw0Ely#X`4_W2n_TQ~NIEMo`JENxzNd-aNqx@l~^JGusbw zIKK0orpP*iq<@{hA8i##eI5INeG!QopT<5ASavz{p(M?0N#| zEzW8*Db3bhVpautp&pV5f>AW6Q#RV$47yG?7=Xuuf?7&xWm@*PCIi@w2-2*_XH^nz zkdshf$2~D%8I(1X0WgdL-+Ly_6-Zh}81gj*CE$xFa9OqsE-=J;bnCK|BmX`@z1~wC z3ijgBp9qfhdF?*vg=OCi%SIocqDlq9M#b)U9|dB09|Da}9{sEN2^V~!)Nee^xf{+S z{8oG*TD}e6!K`z@HtW7T-+@LH4@xJd+6CuwKbAREJpiglw36oUt~{x}2_5kU_wkbH zI7kS6`dFJZ%`@@_n8N~46+3yKD*)&~8M}&P#b^3?G(0B>hs-X(D z-5ObUwEvp<9ony``DL-tU73+Q#No%2vBTdkM0$jgI*%ZE-YP9&DGpgK5knuCa)mT$ zJH)QSpHC5p#-FC$G5gYdQma{7b2^^pcVkY&AnnU>*MY3)P9<8GwOg}5^MhG~R!>|* zCy+Stj#%yDX+jc+0G0ee>UDHe#D??)wyNB@&NJO> zO3qoJ9`Fc-Z{@!R|2>cL(G3ab!K}g2Rk1?E*_xsjr_(=Bp(Vh~>8q|;ZkgE6556vN znO%-{cAeM(fT<;FVuZv|IJe;DtE+CEvCN}4bfQibq&etqL|vQ>nOPs58*53*k)3GU zk4X%r32H8?IJGtQZ*=i{6168w3KrSSNH0jwm9IYBwVwc|V84uHZn5uS3kC)$WwtB; z5GL=X{1ak=E~q$lM>OixlH zAlB+={2$~KFMl{F0n|KBi@R?SrlY^feGh=y66Qs$Vb*vNlp(v7(yh1A%!At>M2}M5r&hI7jHIKOhU3)X<5#XI z9S5nOEng;5_nqJqh4IU$_lV;csz4;6X8?eyhz~oZ=2XdmrMOkNLX1h*vh}H94qRIh z(?dvihz>hW zbZJGb5|IV!m!R-vh%7vW;)R#w`y`~m7<{UDlt52>i1o9$ETBB6*xRZL*H}GusNyTwZFMsuCOj| zI5cXtnG+Z=@jMKIeXJMR9rqi;tX8M&Zznod$@j|GkxlM7zD^!7OV{ZwE=uH8$E))& zNP@;6g$3S*m^z&|2meF7)o#vU4>#t&6gL(oh_F~AdDd${7Mjt$9uJxGe>8sO9MRLm zC3yTr&QX+MeWF$H6*Ge6@rLJzU+}m+# zX~PBb@qnRxDgXF)fKR>9^FEe^2P{m+v@NJLt>{cj6!OzrhGi+fgt(F#&>Fvf~H+&+%i zg=Z#-r!qoK|LJWGo2Sw%~4Nq4uagZ)^Xf>dYR$!WOm5)~~3fVfSefyvI1OB-ZSptMIh zNT9U~wDUck6bn)^!I^B%w7@QT9lnJVIBDS=L1i51A634V1w*xzI6r(3VF~cIZkdMQ zaL71>NYQ|n3|Lq?-kg}u<7NpCL=Xm&D z$Gv8PO_shdcmH^$=bGqB2JeiTpfz9w35CA|grZqe2XK!$KS*j6*v#kk zZIdcegPtvmGcqQzdJh?#kU;R^ndF?`Ceqr8Y6Uoxa4phpXxxWe$VW#;r&Q6s-lMb$ zZuzJPyrhTciaq1izOU88x)Oty20d4 zkD*#`c-^8Pl|x>*$oN)ZH;?r1Vw~}0ZMaRqWy_iSW48XSUI2brM{b=@7Y;n<3wIN# z8ul?#{AYZ{z>|b;FdK`#+oR(}ecTFUZdW{KP|*l+UDDU*M(Ll_@8XOLXD7Z#%1z zvW(+&+T!OI`I@OlL0j_9hg=3mT}Hk5)`nLWxpG^KeuUVxcS5QaQxWt}0>>om^UU2c z)vW1c6Op7g69?v250Ii?I|(4h_iAvV9#FI5L&iAoIeJD6VI&zQfVX7G$nkqCV4=bR z(550wySi9TM`XcMKMoqYC-@w>(*lA}4;Ed&Ose7YZ%}8OLFgg|Qp#4~Yx-3T+5r6~ zzEt8Eh^4+UQ`65G&w*t&Lqjd5uqI`~+BZDZIZ)AJlS7_8EVFd6Q(K9Z);^8u1sB`_ zeb!$B%-}i)dh#ioSYFG>5HPn?RGbS;@Nv*E`HJpZYq=fxd^>uDHaLxB z(U$}n0qVsXk~j;cFJ6BU_e(dM`Wc(H6W0qs%aOl=bYBk9YMO)eG>Ws=hTyX+C6zwo z#RMk0j&@I_GXt~-71O4K#i;N80G*EAf759YQ(@bbWO=xR*~nYWTRBI>!bq)T3*nqS z=JIMdqRYoP$&#UTK9a$}PU#3v5IPYV4$KtnSLyZlXBUq-hF%Nz;2uoXAot4#ll)$C82JI&zE@JsRrnMr--h3Vmfw(#j{%$Ez~?0BL}$Fv3;RtEj73}@-NIw z{$TUBsyYNL7052~;^1$?dz!dlZe~Zw=L>A`4l*q1RnFu{bic1OxtUH4zZ`ydHDOgV zG;XU)Y9X{RtZ`kiV&5Y*d#?0AWfBSD{{rMbX(S(dG+Ac!#^2}UkI2Q=ew36+yV~!9 zd8e4e9(>6*@JcIxB zJsPgW{CW!{3z5UGcq(8RH)1m)Ur#G=R z?}B@}tCXnI*`apaHG{8l{FN%TECD&)EUPL$KUA_x08#EI0Mip)TJk^$G5^Pt*n9BS94i-9i zUd|Sr%dyH`^;0ZK`tGIDMbimDEP3ws+5`h&-f;t~0OG^+MNh?CkGzOWe+#K5(%CI6 z?f0n`|12qmgjTV^+KpC4u|s9YYFzT=kKFCc%}C($-4447?=;jZEr*t5;nPYk@NZBV zL+F3T%AA=hdc#%mpeO1g^~vnxE` zWO7<8a~>=UEB?UtYbd>M1^;n9k?rq1#_gj}Qq%0WQLfA1 zB|ZbchXoV-!?}KEA2ERq{xC^uVIOR(sm6yPm$YuSJ`3LZgbATB@IBG03KNI(B%Jh?9lEPPOqdz7d2RTLc?Ko!I?6z8 zXj%Mo80q zT$<0FnKJ`qWm?}btGjB|s>1G&_tY%xj;*S*Z2$0Jln}7rQzgDj{!RE#XX^wrCt;Nv z6XP)?s6oM7t09dMu}9~Hy)Ec{=U!c++SLpLhUtn-;x5?d9??^PK?2Tca&ot5bZvP7 z-s^9+H$|N!F#xS)4^BwU=8BzSjy7AxJnW^RjgI(@;2)pjautP45QVs0kCmk}pbKAe z@XBVsq)EPux%)D_2+5-Q z-GSqAi6hPrwZM0racg3AeM8YhGeKB3>_4^Aco>E@ILgan$7d6en7oGd!K$)tSVFz) zLI%>=C&slX(jL8Yy)k;xyHpit%b2dq+fY29`YNgWsPJR`ffEsB zYh)Yd;Q!0(6IFE!S0E#L~Ov5St~X&M)&e?E_F zEmKObgpM_UKbCEf?RHQw6;S=u#s7mM?~~gYHtLqOjy$qL1)KQy_jet|s4`7six1r8 z3jQu{T{5K6{rYoG-LeS&p-z^QyeZowzVR&X6 zuz|64P_Y6rf+O7}8C^R#{$pU{zO}r5%(>9D@2!Q{x&K${`@x|Oj_)aMJtgzjg8FN_ zPq_AR>aju?k%@679GW1Ev(A-sd6CR!=jL``oZ^LO%5JK3xQV*qD#iCKx2#0V-e;b; zTnHP~a@`>E*jz_3$K~rstpr&+V7&k4IaM|>Hnh^S}BhEf-dPzjooHQ^*eI38*MOVDmN7 zB!+1{f9U1O4lu?{38)f(WR-?WHOe|kKq|&3Qd5amfBd~w=nEEscpviO7G#A7)%z?M z#z(ks21Iqws>NxXjq89Y}B@tyZ2TGAMTsBK> z@J$y9kk>&zo`8*{Z(i!&J}`bk9~QlmAE$19q)mG@x_)C1Dhz}uz}RcM>W~dST?fFt zVa9*hMjLeN+NsD);c&0TmJ_s33h@Fel%wKzp!Xo@0Rn1#@-`w_yuacQ1)R=LG~2=qsA^Wjg{@cD7~|yeG|+q=?;%vh*pg#ArcP2Pkn!w2NXtHa%LDsn zNqFXoxM*gz8Vbt`tI@*zkHLJ=gY*`Gh}1V4wuIVYF1ekKA*T2@5-5DjK4R){H*NCz z>Eh8`<&~iJ<;!k$jooM_n42(|=Zyht$1@JOsq1R!LIZIs!ZY&t0^9r%H;~`UI%!<= z9W0C}+~^wK#TUuKuZMUdXKuhbz%|I}FH8umBkx+@6MBtTKbIXZL4Z5%GTJR9<&dcf zl=?*E#yD?lc5kmSrEAfoS-|JVfT)wLGj(!;=2|S>rEy~pCk$Ak@RylGRjC`enTdx2 z#V8ohp{ke!TasPh|7q7!r9?LOD=4e?o^H^TeE(fgG67|^abWKd#HH+BKY?ZBHyH&{}Qh&>XDuXnw zQRa#ts)|bs3%+1%(I1>ko~`(i_j8=5d2}s>;tx2O9tD&qb>EX{+3+@L$2UU6gsDlVB~>n;Ao=Qcx( z{ypw+$^+0crrpT_<8b6pz*wm|pJ$OL=K$WImtqrOzZ2lC1jb8T^=&oI>h=9T;5E`%srJ>pH({$rQ^sm@k5HQP?8w zF)t4U5f2jC@jf1p(*G*%6>&VaWgjiB$^Kd=g&2mqJhlzr=WyEVSnz5d zJYvTxI_tuV2;6(#+0LNK{>XHsHhy?FDbC13;e!toNlXo*st_!%!cX`k31QE}7c~Bv z!D3AARH|&TpnZPS62IubJ>K}H8pb?S5AlRBLYCtqW#X#?Ud_IDRa#;GqZQaDc1Q5B zoIXFG**W-;-7yB0p1>UK#Ook$TeJGd()7cFCX$L7%{CF*SkN!aAVG>I8(!D`Eb*at zJ57e_FgR781{AI&r9@`19es0j{))FJ)1$3-=xmlct4fhjGea28K0RjW;!bR<(kE%# zVB;6vsqLZd$ZxA!C~jFfJ+~Uji)cr^thk{hXKNaIw%Z@2U`tp8fd~5PH3q;KLkH4= ziT7s30Xp*!L*TF(X% z_-Q<%-wY>aU$_(s{Y#o>%_M#Ij@IS1h)!Yj^bVoy6>2%u885p&wfqMyTDh~Z05LCE z$u*L0FjlZdGS%%)5jSl$)>tj3OxSxe)3P8%YfxC{kprtF-@y-0XEsI~SPzsnwHmDG z+v-r}|HlSBo4z4Q5a~TqMt&=Rf(Z7NM{dq(4)C^X1|;Y3V?I@pYBs&B zsfh*hR90+?q$_JG5NV;U;P!oFjim&&A?U%ae|1+ zeP{AcX)e}LHoSz?N^1CB(AY*tl~a4B{f1sq^5T;^p^qB>@Jn9RtQTs(>5h|ckE1Q+ zm>P_3GR-mU;)hW|mYeKE&Q0edX~wS$VnwP3dxN%I)E4+n7AiO-lb&I9saJFOuT$@= zh;M24M@2%ko*-)Al=cH6!`38Yw?zVugEM|hNeLdGL-GA@1&aAJn9fX!w#X?M@b$EE$G4)4h|^Y1UsX>`;F3rj;Ny%G=cty!nU% zbYuppPhIHb@-iJK&QIF+SN7mstm?w`Jc)9yySMc9?H_l1V^6(V~cfAO8AjcJk2Yh{z%Dka^niO`|!ZvgnbO3(U;AOc?u%e{YN6b*wB!x=&SFm~( zFQUj#K+nOa(2(T0K`uAOo8%f$r=>QYastqkLC2S-0UWUuZ>4=9oh`h`>LqRG+g235 zI4IWbN~YH7kF!}3^GO=CT7yoia{qE;su8fkDTZ+NS8#Jms)?ftk!F=u%&5|jrdJRN zDNpL2D}V)_nH{&W)Qj5e1)D52q%jq(wk{k5z(;ePB(@%{3Ah6CWQ@@XM?uM5NMVRD zpo-{?QA`=xAnk9<*@pjD+o-0Oxc~QM_w5)t*^{8=yWPtw_%8jA&={=WM=1 zI4fg{M6=+Eg57IJ%lPCl73#U-{xS?6K^POTsjh*KGYbo`HNi)%tF9UXirZ;8aAa6+_;C>t z-K@!ns_ALEhq0P4bOi(F{JcJX{UmLeKt#nM|i%)mEb(JYvmccFKRmQlWyCYBi zDk~8)9Vw*AIn*?u;)TK87^bOL_aaA}c*oIeSwtrvlKOp*c5GFUu48b@O6T+~%7gi) zQ1l2Ya+YRX=#~WrIR0|K25m-pATS)XQqM9eeur?x1B3O^tr#1ZA?xc zJI`TYO?KIe9@CwUrjQUs&=t*411GkWY0De^GrftXL+gdeNH_nF@d2I;?n&?mdDGqH z@tIfervh-AkfI4jhlHhRrS3uQ=hKRPe}XZA9fs7;P82j1i?Y_JG~P;4y?u!KXEo=3IAWXG;-(2oS3YPjeXTTzu?X$;T&Na z*c`E~rMUNgwH9pT{EOK;hyGCkc3D6xFA&VwUYL0`aiSICnRbs*bOW({id>&>7D*dY zg$6NUA11W)%UYrpPwYk6q}W%k#u0JC@TiZFl9Dp#M1Y2P;zl9pf756&vocP~x!w9e z)6F5PXVHK7qQ$Rt&)5x-|BZ!I)|lQr%C)*8l%V{M?w^zg?PN}xFl`PiN3iK+t1tmd z*8*g!+s(acN23~z5f!6@IQh*5@K@FgZazPbta8nlP&>xjGc%mP>%>4GOr9HMA-;A? zo4}S6!hdb>c@C7SED%46tNFy{qew?IwgEswFlZ?jYa+ycc2GCM@GNV#wAq40tnEO?gmSihwp)66M`r z*n5ky$IiA`Z&nJ$4wJiN@So0!Rp>&x086q5Iqw00cZ#mE4;v91qy(lbl#atik>31v zl`+X7vJN#R0=9?-aF94m4D?;oH>7`r*0UfBiix|wC!y7=Js6oik@-A89JVE4{*O(U zMB*iGGj4r*Indt&h425s%Wo^+!G+rTc{38Z41-p@BmW(-y}MHD5UHMoOtfSK&;DfS zGV_f_Om4h&Y(8eaC4OQByLkAc9N8<{3@BF4hshJafQwQ1XPi#HLe#;skjLup1hJ}l~~SxHTj8{h8d z(j^fvL|$k3nQ@d}a(Gy|-{G>;yM479l}>$XiYD28!Jd2`=-v(BLKuK73380mj8>H? zHP>YmXN%OdZgLof0`@n|W?98wo8(aW+e@|t=aeypBsyBZX2yv>SHcw-ZMrAGJZ=PX zFqGde)+0``0wEa!$%ik_h`V%VbV6UoeSB^Q@8`vE}3z;BGTfK~nwz#HRL)rhjNm;z9EwJ7oY4YyC2w?duZ}*u= z8|{&KaYy;wZY<84p43Gf)|&5zOKL#V)hzIY(CbS{Um<_mabIcoLrzh=6*D*w%I7B9 zJW-Z)$Tp)3xfldm@o#U-CmO)!pm|RIYb_@?#LC(s zmGh9^+wEdBir-zYq#_A-4sXAAB7W*&NO&!U=G$oYJ^ld{J&wCJy3uq9xP<@dycK!n zSJNA~x}A@r=cGOVvL%3{BdqfC^UfYEp&b$O+(JWE1^}3s##nQqG0pQk9n3Zhbg@v< zDPi*jt^3fv>Bf7@We#r}bBi4n#NoQpSa10w&FT?{_5x|`&e0}C*Q74b3)C$PQi`Qv zehJm&pbhX0Om)rTp2?;hTq|s>1GM>8VdWEpOcL=h>j?lI&Vx1OuTm@(L7vpT0?y#* zA^BW}#i{P~uJfgRk&+3&dg}NZA6W^;QrT@Zco2XKo|*JlGDS_UG)1ww-{*@YDkLt4 zuqOyyEGfN>o1|0f2!gd-qq+s?wG!N~=sy{>qWQ+r;ebaFzmhYCwyF!Ycq+$C@D?5N z7>XKf2DM;$0pQ`jboT15Xk~_y44@TvHUG8C(NUUMw%sTFB=*?&K^T!_8ssz8i&kqy z{8!lNKXnOB5Ys@Wm9;1X6jelQX?WcHd8ks=-u)5p&G)r9L<`hiHFG8FcA4OH=lkwT$XcsW6wqUNl%zJG) zkbTA|%^FOd3V`BYw-KFsxvib58GURSR7>i)Ro0T*>d2myKuT9D-5ii*5%!@c^_LFr zVPAxD(7QAu2w3w0D0o=3O8mRUmqP%=GqGP{=~o}!nBhBUPA@pcrg_JF|2gW>AX^2M zK~#1=vD2-|>%hMHS2m|8e{y7_vJ_0v(!N@M^#R|O)6Kha39?vijBdCiHocWmuV2U? zNj$U~iqZk}U4n@;V7WwLSRnt>(vAR0T9UD@dHwvM3n;bFDd{czvYav8?8Cz+0o%`; z%K)YzfTdOWO_NJaKGIu`VQ>On=o^XpAZ%uKnpPF6_%M}iP9UFsEj05KuE@(06J0>| z&k?}}{sO_I;|e+&nc4|WZIM4cfhOsf9T2WpT^Fxyp`LU0-i_#GqV5$!fD{X66uzee zbF8k+{J?k{i!k3gb)-_cUuNqJnw;9M`dS_QU13Cs#mG7Z)cN2k(9)}xcnyp-$|8?Q zl^t!98x55|T4cv;dF&m9L+>^ivgShH_YYiu_@HkzGK>IL|0w{LNi71KT21A@n4_bY z+BS6b6w4V2HS&B#%b4i)Nd@^DdP{8hGsr9}L{AiObcV2*ZO1!eF<#+9(POOrvY2tJ zUMl(aPKQ_XxTVvBpldiev*%MKJbU4EUV7T|bDFyAny?4G@UnLZ%v7sozY^*UIIWn? z7OPAqb&HXh6sM-g$6XR?1%Z3Gk+O_Cyl;iSI63>vE0W@^Q+qDSK1&Wp z3vakvX#17qw~Id067!k|`+KP{nhDk$g7fK&b8qJCw*mbRFLFuBpA+u21ve=Om;i(@ zQg_rf+`C4~Fcxr!5zfr3eJrPSZ$-R~P(Bwg=EHLy>#BLk-L|8+ylm@>eADP%hFLv2 zCs+M9>lBs&+>fiVr9NWHKXDT>PWz9c<2%l%?2-qlr7WQUyW$77F1=~hpH`!NK8YK( zeFh=E(4K=G$*ro|CrUiSjNU*(@cJ^Ilo^^nsCUyzxRGjD!E!oM0>{bUdfRuqzp@7Z zV*K(5DO%M2%S+#Xem>}hUc9FS>{B4nM}t6ug* zF(wT()mwNWrH)pKEXDr?N5`z%6*>O)-U)uw_tp4L%~Q&=QhR0-McDE7LeVj{3im7% zBk2(_-Y@BuCI$sNMQ)H?o9Dr>6Gz1F8}aj?x*L7=JI;t7AwwXG=9!eN#o;85h1_x! z`!8U<*bN`#dM?J>)3}H}-u~D`T3|NxEiJCvxip!32Y6W8Z6DcGF5;-#XDA@}$tq?o zj??e&1<_4p-{PwdSYeG7n7mQxoo6x58d>4n6Kb)0A1CqWuZ$e8W5Ec=6;{#6x9 zlVxEU^q6QQ)X`uHs{Offj+`&F5EewhF2#HN7b6z0bBnWYlmzU})$oicA7^t)0f3Qk z(4(BLgd)hPzqGf?Jo3*>ElYYC7FnC@JQzU~#&<+P&gX&qm@&jz{OSm3ywnTAVXMLm zNQp;g4+l9)=>MYHlR|h|_Lo!FHX|k5PnL0rDk8wRY z7;8%vG4-c3>bW?UoH1HJz~;Adh?{|n`|~Gqpj*1zlmOBahhh4Z38&UhOgo{P)ZaN{ z6{DIK+24i)T=<<5AZZKbgY7T2-gITqE`TCp8a9D*{e0c*Y*Rtu9fd@wrW)N(0ba?r zXP@WTNik483;tqu{HmSD%bWI)F25WFu-p<-r(w>UqC@z;9M7LYWp^?e$F?(RfB*v@ z=r4bj*nm4^5HDe1Pd73NG}?!;RA$H*J1SSqQ1d8YGFQ&l#PqPqxriV?32v8Lj|lk? zB>03~Dk1eRE$+s3q`H!w^L{wVsQ%t3?^}}f2Y6G|KcLLBJSc0*X1)U>Hz97^ve)~` z4c;S{>O49186JMFdUH-wnGE~7e<3Z}n;v;&x!8mOFiFF9#y8`-!RjmKbMc&k7=9Do zj*F$x(6h9Cr9h+VVbL1-IB|aCDpsC7R!kzBE5Z`wR%=cVE0VXrI+S9kA7RX}NEK3d z*G6xS@$N30U&Z~jYhLG%er#0p#~)H_<&F<2Vl!=-^_BoJ5F@Zdk=m&c@k=ia2PwJE zZTEI20OBj;M_B8}O>`vZXF&F|_OqEtmy+JI>P{4BZ2G?kc=tSLq#mFf&%0^Pt>{(F zJUq7=ZIEC-{m;vG5t;vl;+*d$?^2>seb3eiSZL6X^Qk5IMg_U+Qn3TF)i{&ss>;

=p0@D|Hrgm*8PRhK1ZD?G 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�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 z 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

RCJ|9o!rf2=5fR!gT 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�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%0Dl9!q;0t- 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

5<}JDl+V9)ad~5I_1ZpJNDRt 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

+9Y83J=*IiH(4|Z%l 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

aHW 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%0DC8@?r2MeLV-L@nG6qG-B>Kk8~p??7C5mIVy% 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

n8; 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%0Dl>Z--H_sY# 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℞5GLpBa{|dO(Oa29W(p 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≤k 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ⅇ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%0AIE|_c!3<={c~Vw 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%0D!kR7(2|*=yeHt5_L1j`wFycPQR&oq+l(T z;rvaZi5)z?85_Ekg>~Arn`?wT47q*V63LKU@@p7gl_5A^5zlxE8X~|u^^nU$Tp@| z83nfX^qSIPnl>jVq$Lqhid-vIDd92j0vnED1U*V0aaFN&K>DvAWL}d;?!w~A9kq1u z9;NoOiBsasgu(5XF9`WbL(2E%JJ=&uPm?$b2_b;E{g2CJ0 zG;~0A{P0e7m$KRgT>&9yoY~%9+O12+&V@YSvNyR9_b=yU%0DhU*n4MfnA7?P!gIZL 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%0DOgH6uQa>ijNWcY57E3$e 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 z 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

`+800t^M_gogOUq!ihQ5Y=$Z>1K{%=$U58H=-EW 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%0DcLHt9ORtA(WzuJ1h}DbIh$xLc7zH1@5G{z>5p? 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%0A0P_IascyUB* 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

jn&}H$Sz>i@=?fU2sLCZ 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

2T&$^vvFQsM?4v-VOn%ZN+$F2(*%U; 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

yvcIuo&~x(Xt?XU0z@%Jg5Fux6WKANv#vxdmY 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

>a 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 sjz>%DLd@I6PFX$BXq{1RG!4Jab5o@0R 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

X6xGm?lD3h=*G3fvf3`<$TrI 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

o@ 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

X8n6^%#w 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

4e7|;*g66)R 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

xnX}hmIF) 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�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

V-;9A)w1>;*9l! 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

)e?$K9MS9ItM@|0APU3GIC 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ý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 z z10GljeFG9jSls7m8IqV+ra zsg?HT)-w|-(AVp;*T(~_aYnK!=mXw8Gob9uW)*D+!j-8+ z+_RYF8uluh_HqqxwFxq{M>wd7A&J6Uty!R<@x>HGyfURQvE@q)12|^47z|4c4hM90 zx9ET42Uizo!&+l&X`7`=tfv;ZHZpbp`5cF5{FlL$SJ0UGOObdEXBFwMOTA`xT?m6a z?Hi+;NG;(iKDbUNyy5R=oyF|zLm>JpL26x}{-5M1F&-zdel@Lx(j3LQHojG!XO3!of6GpH-at=KXwp^&JbLyb<2t|yiLAO6nTFL_=qtF4NpLMV zu3j26jWJ-2Ny`pWM*$qCsP5jY1~}e-VHZ66xe(w`3DRej&_lIz(zP3@P+Sfb|J_UX zH#=htS5O9m+Dj<~Iv{~=J#~1nln44^0C2&!YHU&cZF|01?$n&$>WI;D%H_uVZzA>h z_A^s0FM!OPDL$_f=M7!KZTi@#6un-?yBwQmhBR__E=){(f!^I{oFbAnIHO=cv#Q;h zhPiiNF5#Hd)S)4cdo1lHA_pa=4B(*k?03lEBiuJ3ds)6dyVvj4{4u-fwmrj*11Ig* zZ5LtZtp0@*q=I8aa`;$5@{374YDsR_dqrCidESfVNJqbj?)|t` zA9^`0#pC~-N09C&UXvC>op5lq67fkDmE|sA_$f{R?)rM=B6Y%dKx3q_v;dw7-2~Y;JNgJq9vT(z79{ORBR? z4VYKV6cKY1TVwO?pzA}BZ$V^mA zyI&xcp{bBZv0!kOoD}6UY*;GNLW4+51bL^g+EmJA8#}Du{8szV zQlcA)bx4jEP8Y=C_kCkgkrrsll}xR5p0P-;{13LRCIJ^K3Pb=_+L!1NJ1RUR=LuAr zRLnePw+i+XiadI4$?+{vf^y_&yo!$$Op9#{uQ=?a1QKp3kIP?Y+xNxa)}j1CLG(Q& zNHv$%H^p~P35(T}So}Htwjl|N8@EA(*^#ewV1MFAVmp3374>A|Vkf|pZ=k<5)v3R2 zEx@PdrllCSNR!tFh@(dq-wyw5`SFrD%j%DJawpXoe)lzCaf7+k(n;pDyD70h%d_>( z#jJVzL_00nC-c%^y50N|1fuih$$s~^vU!d6qO)Vh!bRTZ58U-EvS3Mh(ruzkLJ?5q z&EXDpoz?eOR`mRC@Z+v%meSNDKSyEAxJ^Lx5EzF!OR@03pOWV(Zi#}E$l`WUqH(?% zlGoe2{C!p!JYOAiVZ(Ewms=DQBmD#eJypwkc(w9`W)~_G<8>yjyE<3Y3gdo2gk;PG zWjdqw~|4$*KLQ*G1 zKC&xcyiVQM{A=*OMWNkJPhSZp_ShfWv)g~s!z0a9P89R|fAaY>AGs*wLiPpYDXi;i zbukmu?*mN?{^Qns{XamQOaZZmdSw9@)I&(-VT60HqhE)5tcpwJgl74No?`3iF9Ssk z(5UCn^jKhK4yRB(<$WPBRlv#lS%b^Q5+sw)X4&+^Had%YQ<4Ra5|frkP}F|bQfv5% zQtL<_e>KbKYC!7Pk7b8LzI*}ZFt-UNza@L7bG*Rgw77MrBG5>WC1;*VXr1v3IS^e9 z6i4er6EigbxAa{^#RT4?GG2nb3Qp9M+T>>$nyNm53d_}bV*QKwo5ayK_ka!EBr6V~ zUiX;-r%zuscJPxdtgcfYQm-;0q&nu&mGG@Ioiw)0Y#^v;L z{9XTFkn*O8aG^F`N3l55b~gd?N!;TivpeDZEzMw}s7p_uUNshIRl`8u5Hh_FV}i-e zxhYD~$m@LwS5Q-`Y!ht+N*z7*)avAtKy1Z0AZ8vV@>I?tu#i|&d}{md;D7#v?S$`D zc=h|Sr6cXJ)Unh%$zqa2_bE#Lw?ic=d6UI2H}a}>1A2D4MWov3&VaO98r_d2LwZZw z4dKV+0kR$0sPkr!6x=8 zk9>_lcP**x-{8w-&{?#aMyIxGM(1Y8>W_XFl^*vU1zy3oEV)$=ZN-quXdYx*ysiHp zerRldHx9U9o1?#dadQ*IC=f?(u94{wi>Pnta?{DFO!BJ7N(LqQfsEbT7Bi)jqLz3_ z9lt0+a|^4dw6X~t``ZHl(^h^I0yF5qZ`Hfi=WJOyt0OM_JDcqk?I1y-R7&Uy^v|^Q zf-AXla_pA9{$&eF!;ZATcPP9O&dsLx?+YZfbPq0#q}w|s&X+#FO8O2I>uV&aK7-W- zkp_<9I55s~YtQqRgjrC4vWQ+QKE}OGd)0)4|C<_Cw`l&I2K0kW%SCU{aV)Qh{RcpL zvU3Bo2KWS4E0l<}g%hW>s`(jw)KWr>fOsgsL2UN8Y?12-Kq`xZQ!e%8)C`0*n)EHJ z7swnH%g0&Ute3c@UmH&abEr@B1RhlVFEgi*(`c@7$0Yhf>=E$>Msv)iZtv`#@p5D0 z*Usdj=|H0)V`vTs^_B#HVbD*p1lO5TP{_W?rR$2$SjyA{0e|CMLt()d$(#*cB943S z{88B-T>ESS;PHpXfh&>+4yUMmc62;>@1b1maZWW1(U@@BD8Q0@J?oDT47}1j#=eDV zAJsS!b&Qz=8tQ#Uqizsc0+ivw<5J7cXUNwa_b3M%GI~Ma*H8w z922)p#*$L?n=4E`vtq!i{{`9+eHK2ra?|waHXJpQg{ycm`ZHIGE+u?Bk`Wy^GuzpJ z4+)omjfNF5aIo)xvu8mHwXtFRRby}y%EG{J?q??6HNm1?^Fx5SUYN*e6ybA9wPiNR z);}u}pxCJbd2H}BUjn#&{yipz#s&nzV3!5usI?}?%Cssd_-Z#-4A<3?z#$`+NooIG zMpsrp5|iA#BY8ZiKj{Tg0=-}Y>G>B%Bt0j?%55b>DyAs(Ha)$i3=;8hMzEj}v=GkT zQML?eFi&t7061JYgv${$#|qcu4l0L>L$q}+pORXfn;O;bejnNxaX-Jsx@}NJOH)6(PNo#?UHzrT29uBeA>~t>|L+);TPV&Fq86R3m_(gvge=n9)JFvl_L;q9eHmeeeP%g~TQ zgiWUXc3wXlvd_6QPwF!xrUQyu-PrmB&;GP5XLwe2p?ET=SR)HbJpc{s!_+-bWp&P% z39$W$)K*lF0d`9*QDnO>o_F@&+g-bg8L0#fz5%2h@$T}w*#HmHp2T7uRo&=#PkVJ< zN+m@LL`P=#5m%77Za$U!Me0UwKc>f@>xePXF)AeHr1<8Uz1k-ZK_sOG4n&@!Yf2V! zjM3v*km34T3w|p#ypKCtLaI!AW=@r>%KE}_nn)j%u)$k671;GqnrPe&N6Cb-rUsL8J7apOW`pa~y%C)#bEMWJNeyJtPbQil$S_R0XzMQ~CSb+)WH*P-8a zImAYi*|SjaplJIr02+f0ehA*&Sd!{JPlReJt?NQ@?~D`(d|bv=S4*L?;>TBM$bf$G z&p6m~e}Wq$y795Eyh{Ep-KZ5}+`+c7*zZ1HB4TJ- zbblYCKt-WKAVod9(;qpRR442{CW@tM$RV$}BLykK`<=~>rzu}eV&a_57rp}VHbD~N zFe+o-U1xduW=iOq#lA(NS++y20TWYplBU2!ROzp;#{N_U67(iwxugWvch;7Dr8 zu}lCe0$U^_da2B9uP1$5DeMa*DjM&%6|6)J!+#m7+>C$XWF`b?r=Iy-VcNm_Ovp*R z$XypeY=pQ}ElrkLEZcNp^uJQURP7pGHFu#;)n;_;9tR-p+W-C7V$GY1Xe#o$=yO)a`Ox&lHICm{? zU&aSo&h#XuOP-7RBi~Sc0#$Mffd*R>6_`oU6IF@>H<-=gVm=plU4D+Xu(8$vM|OR)~(S9_v8)g6+s* zV@-WIUg+T*Irnmp2vik1UQ)lZs3JC7Mu^|wq#O#wXj4algkkq20_UtvL|ze?cXT$Y zTq6MSuHUkcUGAeXSX4%7>*6sHYlFh!oI%*)vvGN&^o}tXko0M|OJj+7-d{EW*{f7> zrO~hKbXP$aYjiqFUHII?eX^d}=S&;z(w; zT|jbD46QAS=ULv?8c34GX&Mjw7|Cv$%$HIVpEbQZ=KEQSq)E?X*klLX;Bb@!skA`y7l-OG4P;VUWQJe$~?q*J4dk;ICx4^VJHfK0n6$x%Pxpx;U+n^8F~HC+wx5U@(@Jm z;+O%{BPFI!1eUlagi;TM!+4N~(nmbLQYmCxU5m5;IAvjr)Xlcvm-rxQds3@w6Sz<5 zgOUjlC)R*WvOs8wDfceDcf(6NS{t&yXMN_n;oJq+jQ_GviV$}dcb|u<*U>Z#b&>G= zE44dQqNg@1`UP$f9QKN%YzOv-n1-_=;|u2SQn@X0!)hO+avTP%=MT>zvfrvLq~KO- zz&^szz}vKMBEf7b8Szn+a{C!DV%%Cb6&>I}p z_4201XK^XgFglwyJc`gLmt4vk+J2oSBTr>U?oSzrqJV0uyJ6zFimCy{pEVSWr-LS7 z^nYixXSna%N(T%yclQD5mh#SDu#~9FNGGQMVQhp|3V^e483XakB>kV@yHCk%;JgOZ zgGQHqP@pYKb?1hDg^9;U8BWC^C1^;8D#WzhzV z^J`fN*?Xeo!1RkcOF`|=OW<=zHqEh9>w=pqk_kMaIeq%d4gUvxlw{QTnnO|jv#8%Br;D@U1ETD{NNUH_&#~F} zHIS8D**+l)Di}V+mj$NWgU^&==dl*R{uXZu6k*SU@Nxz5fx|%+KxH61XGVB(L6f)p z8=ODLN_AO{`N8^Qyh3`(_)Oh;C8HTJ;&X8>c zWqSIa>y%-xWM^W<{c z)cS*6FJ0ra_pzl9zHbX(6&kRCO>iinN!~vmkS9`WZpC4QyW{-DLGv9X3XbhHJ}-_- z$!eHv!dSFci{%egNjFVz)@pDt_YR8C0t^~#xM}_NN(xdpop;ns&-&{b$OB<%=&$X%l6&&V&*Of7{%|L2x5Z-t2rB*%4FquiKGr4~yb4?E1n*Xdr?QUGD8zm_S2LU*O$S?z zt;TW{&~yM*c%cDNuS3nUn3!l!v(5ydiR}Bzgx(%a%aJ)>03W9)b+#`D*LNOl^rsG` zAA6i6orip|!5IX-i8mj&)V&bqI?wB$3|+FSox3I&q@t3ZuDCSfzM3l$$81E>nyzp_ z_UC2By5R_`A2wj?OGjDpCAAq@{(79a1k!ZJCguMczPGXP+ZPN@0h)^UjU& z10x*SHkTQY!=Yl9{4Tnr3Hm*B1%&WYT(N*Sy|lPZDd#ywUDJWbYWGj< zPN~kRpA1@cMFRoTDc>_tBngT2f%l#p>1!)+v(mE{*kG=QhkLE}B_211s>0p$ zLya>JPjK4nx3!KHNym|Hp?R}TXq35X*Yq(dQaF%_|D%9tXS5F8=ByPpAy%S8Y^n8A zIA<_hd`zw&=^O?&&8U}eQ-Gg^)F}kXOQz2zX`q`l9<_n$(i(3Beby?u(TbC9I?-ja zPx@cpT)rCin9~vCeH$O^@w+Yt8RuI+5T{mjqF4;ryhy#Z-#RB-f8a1(^J!Im7FkDI zxT!-F94#?%C-uFxAOC7{BDK(Wr;m6;JF|~oSB~3&ZO1YRF|Q3`(QJ1YZ7vc?rTsW4_e z6C!Cpg)d5+JCtvN(h@6!wi6nrXS`1N(8d~ozVjE&Rc}Q_v2vNyIJ+ZbUrRU9Or?_Q z#JtTNj}k<(jlS(HXH(rx!nE(W=fxj4gZL0bUlWhh$?6=Q&u9w`7MjgcUW z%6eoX0a+8{_lrdz!Z)VW zwJKnEm|{M{=4)HU6$rN{qQ+66F2Pn*u@A>jTbdA4k3;Y5Uz8L-oHN8V-22*^gZ zjy)wjd_}f>9cB>uwEH_HDbAww`PdoARcC}V~(+83BXa97=RLY8>+>B zbbWRHG_7g$5;ikvgFL;>jT%ayiOCzjccr3D%2kTlD(%LauIMN#gDU=~flE0SL5p-> zT*qq!kAi4{E7-{fX2d|hzDoNy#-)&FV-Oqf!Fc|A#Yw*ETeN?_>7qC)NeNRHN)}UF zpWY0hXr#om0nO^7SFp|^3V^e8(4mennj(NY>;L91c0g5OT6n|J)>8Ee20oWhlB{=W z;Vg{P{OPpu2YBpy3UG;fJeo>)SgVsJK(9j-;TskG=72KR%IbS8%o&6&doz?P%?te@Qf$-QZf9s1$j}jd z52shy@}U|J%m1VxI~W2evrc(}?iYX^c*HSH5#sWz<+(Ob0iU2+T+@8hM-wM$1A=Jf zgB_gX=%(Lq%-eQn`oPU(KGp|}Ie|zCmB3CsS+xvFtV!5t?7}ingLUw(j~P2#rs-M= zO4a-k63?^54HWj7H`C*F&Yi)c+e>;k=05gVCXnsbH_|e23l#MRINak>{WIg=M@eCH zdcQup-mv;{m;(PT zILVm^-D)ANy0La%qFzF3+E1ME8H%FZ?fbj@(XgRZ@24G=W}ELl>fPjy^N(3Nudzu`S+yuvy zL^$T;XQT|C6*NK}yV6BEM)0s74EZJBWG6DCf30rWIxahW)C<$Yx>x|5&r+x5_#x-Z z(v52scVN$>8f?zlCg~ee$=V`rW|jx=?qb0iWgsDxY0bF;AK&Ogu}PBYn$Pn}H0MI; z0yP9K?jG}=MzGEgl0pNm5~VjaR`+ng-q4A;2$bTV_z#bVFV?zl1>uT8Z2_x^<431c zd)NZ<{VV{(6RVkg+Rt=c#TasgK~4T8OQm5Jvw6wpt1#pezXnLBuz9|T%IM(cK7a$hvbR|0n_*YvURlN?GGCnjl>v3-xDgqdbjzu#` z?f1yN*kA&aR&5|RNj8#`13DMaPpMHg3l#4 zeskE^@hhtYpc3kLaUS|XvnL7svOehR)fHHCmGMIYqcu%V4Lb5uD(~sOMH!Q=2D~5= zNQZvy3+i*RgFk9P&-an2Og;0?h){b#p#+*{;j`Au)PJp)^je^;@g(zcwmD6wqq`vKy3!c)?QQC2HHOeZfxLLV#~B`|rkTbX@--4?K+BTO9MRDwo|bXfY3`l+U&yUbnF%~h0_7Rg<{Kv+cl+7 z+xZ5Fd6{b_s9`Kzs~SQ#d|{8zz_j8;BHbOlXU%5L@=NGlL;GZi8==n|7bpl~N+>p< zbm$yPUSP{&=R;J9p(Xn&$NK5=6FE`+Jpivbd;+ZpKmBg8)~+>o6-~&uwq?4UpO3vs zkHGp8MIKvcI^{n5H?omIp~j3Z>VbbunKB#Cx-!YOIbYln-_9nETD(B-(B>AciiJA=j5`a&!PH=}7yP%B`4{zjafr8Q?%}j)o$q$*3dv=Mn<*mwMSb1_c-OT8U&6{7vb>H_`Xp@^rr~*xBf5CiO`oc;_oh9^G+Y8<@Rzxh zYAT)xpj>BSB~HQAPL`r5OoPyhcyss?nbrGa) z4xS{(7}|o|JK0S=CNo~31eKy{z}qiWkjZ|l7bVUI6Rw-8gKhCRA>_rRVP+Kxzh)S8 zT2Yj>E4{pa-U2Tdyo0T(%l&T!ZC<#pt34urAovIKsN3IPtGHdUb zQW);>I;2eInhl|(cD$*YVW3rtpK~VD``TM+6Qt6nZQHT@(yG(QcP99Z@S z$>Dq>F_lTxs0&Ur`z5lVjoVoJ!D`muoo+Y+! zkQqCPOR&VMwnvvRfPbZKvzgnB+tj0a;cV}icr#fwnn^k(L`7G=M9zFaBuHpx?R;_h z<~EW+FN6@sbEtDG>5!=U%WQ?lX;b3cQ;Q{`Xd0(f&Hv>5~PC zg6)KLhM;nSzU5qPed!vVM6d9w*M^rdQAd1}CSyCrNqYo)ajce-T?(sCQ7Tfeuzsc! z@EiFpI)^%cC6d*9dFpW?-P$2!{jd}{fK^`dWb7BuVhDi~i7#8Z&!p~4kFhksJ5#XO zg2?Z25)zZ0@_j_1h8CHYvN8^lwQd?*T?FabEig=LMX>?QAozk~7d zNW3bGCNL6_PTr=`=ZWa+nvE6#VYcgYLgE~zk@c0`ytsVNgwj(a7{O;B=pKtbjjbbA08OPId+1cTu$wUZTi7Ie{O6prpPW|9o?H0qj zTLgBh26Y*~l8O(!uj~I+{^=(y-o5p zkm}fuf92Z${|cuGQzOFwJ3z$05p^9>Lx%rB!w2_{lSyR;15?Vl=UfAhdY(byOg%=3 z${F5P)c>bDJNJO4s?9+QWX`PK+QozLpijE&?uO^$YTokOkSUPcxa9#%Z$G2@~>Ed?q`Wfm|+!uZfC z+BNd}rj%;7xCD{eTJ1<9BQ-&STXjHM+jJ`=sXwnbQB7~CqH6BgaD+|&)kt$VUPd_8 zf<3dSSJo@c`ZEiCbD}H4`#8J1o9w8g=r9vW}UBiMW8ANQFMk+2sAKU^_hUoxL|c z_ry~!qaO=y*mo{ta=0LUq`YuV7fzeDyzeE~-^ys}MS;{5 zR|E!hfARd<*XSYBUWn9p`rE@pGv9VsQU?|JKO0`t2>Z$`bHWs`^0`xF*%x@frH zbnx?ysgognuutou!+F>pXaKBby>d!JnVvU~2CL(y<+G%&X6o0CbeI^-0n)bPY3hE& zhkYyfbv3DKL-P#=R%1lMFE{>c#~qAcW5lK6#Q04QbE#4&&|zJ`H}0pjGU5>jk(?`w zbs6z@9-F@Pq$(R=iP-L(oG@`8dLOErq`y}C-#nx1Vcd}L?xnLN&PcUP7y!pu9*}oB zVG^bB=c>aST%~6Q#eFa2(XqIXVT|IZ$>YLjAjOaiYWY(NH#O&!A-|%%_#_P3^4w3! zj2Q{u1YRr7TC33BBds|DPrS};KdqN0s1M`TfjGE2>@icByc-?3jtmj^1>X|} zPV^MGrt<+nQi#<3*I*1^LYv!(dytWbyC2v0p$PIVotC!B9f^ZE29Avhd`{LtXV97dhD%R3yD=;$3 zqnZ?X`{N{mzi>LOl%(UAxpWQVYU=fo+*bEjs;=3tq4(%GoFG3;G_>10?3V_GF6+K^i>Mh6XS;z+^pR z!s>S^FE|$?`7na_Qi~giMI;ZoSf2jZHavu6B%&(PkYVzkm#%aq5*X_{#?##$%e|eb zr2sKn_Ny zC%P7-{^AeBY1wP05{c_&3bF&O9sbr0uENWT z6GH-t!|BTO=8U$tiN+pXCj^v&Z>o5u5(XHtQN5I#tNy7Z#3z(U;TKeD{FRWh(j_<1 zU(Z_{3W!bqoo$UrOv&Ni-WY*CN>%muTlu7Pvk`ciTt zgdvBkx8`c`emmvPf{CbnKdQdl1JbC3F3nt5`;V!YwKlsw6R-st+yxRDH=sULc%As( zP3*Y!caQ2EOfFe9j58$7*6KG3Dz2VTr25*Qv9q;R#AXBipD3I4~f zVvhjNV+wg^ZGEeYAZE)9Zi@RImjIreFj0LJZCS^Fi%U=HMx|HYfh+9y#M{xQ`^qIm#81u@155PYE zDP@xm`l2jd`B(Aa%21iH0v{5T^pd#j=zON5*Q?%b(R_V?`jVWNFF(#PX2TarlBc)s z!#_q#fpP=+N>8)tR|&40Y|i*psXUgQ;k;D@~YN zcC3G`kJ|c*Jiw|^8{O2Z@*B)bM3nOzGrSV63edi)nC+v0uW4^RVl=m?&ZmJ~3*1CF z2L~I?#kH^p)%x)!T&%MPUFl-|WOpaU0LoF0vT=IQMazE##|pKiA~=5To(D@; zv(2naGLkCn0MU#x`siQTk6>K!hCbOkND4)Sx-K<;@x^meer+iL_~((-s7PN#Dz=1&^`qekwR@oXX5N9I)MMX0 zU{D5?ky_vFFl=fcxWP1k2FinB8%+3wjlFzzxNsC~fuB&bOEI8ZL z>~uT3BN{<9L;o(sq7}F>UE0X}-v>_UVA*kJji##yi0eCubM_1u2eH9xe0#CyDibctS@!AEfNtlEu;Y#LtS-aeA$Ll{TdB&Ia z)@!)w+vKu%t!;h_p_Sm}SMWDB2(}p&dD6z=*C&IINRh48kp2uD!hxG~z|nzf+-(?z zKFrIwJH|hW!n$~rEw>UK<0hFm)V>vWreXBvc9&kYJu@h66^K(rD$pc(v@NKspY?^p zv=g*%3AJ>YtLYcRCSYVShyIJS-?k0Bv(kch2w1T+9Hhwk5_!GI!l*syZM(-G@Bs$4 z&O^Q(nEv6VaouG_5kF0sj8wdIgpX$x=60w<#7Z%k&wFotP%P_@ z-T-VS`xHV*X|0Yj%PBh47$A$^cux2%E2&73OWwmIF3>tT2{xL-V{`*hbEsFHL;Auk$!AR%kih}2@T z_5EB{fz(V6(aQ4PAdvhQ?cc?Eu8z!sikqP4QFg{VkIX)Yx!WvCvx3v^n7J#49L6~~ zx#5>Hsh7#Iv3q;o2=E%hjcR>RhBdf1qh=_GxSdTshz^z(azM(|1kU50(7Hoqog_t%mSEr{YJMSCH9Ac{k{Pp5{iE&!N@*wWX9T5$~yVM6oCvI0IV znE;u7Otigk;^XT}BEJ~#)*{a^;`ys{n8Eb~{$%inM$p|iVzyD$bq?Er@C&KF%72Ec zlvx36{gCNxn2Jl0N-imj8%rLb@L*BTgG+0T0MyVb{4@g3zJjROcqRr;vUj_o=iy`( zq2pi~nRG|=Qqi&;^*W?_RwJDao%MLw2mmH}HXO>PBUAPC`mndt1Yentzk(dI7V5o# z1r0}PQR(s(vbT*fL?Mo;JW8kag5<08F91J=(~g%P43HGA63HU|Um7o~>B;QxLUMJS zTW@}M(|iebXIU9h{7sGtLi@%o&@$hwuxarEU`s?Vivnai{oC^b6FE!deTuf+e?uM4 z!Q$&P1D5bn-8y|;*2Hk`^nx>}OOW(4UhWJGZB5?nlCkA=gQ&W^S`0_IUL)m}@%}%- z7*d|_E(RJSPl@=zQqs!=VjOXZbL)~Uer_o42)5RP+Hz=6nc%ibk6(kWe*#m$JAxBs z^7kg^69s-;BPUJX(2-){L9kCj7plD7BNIydd&sni zpy5Lbx^(?k#^#7}Dy40n7MM&M?jI{2-P?w{wQlyb!hMheE{{6p(^}Uk3aEJ?ogNDa7fQUc@6ikLh;=(lOmZ@I1GlxAi8ik1?U$b|Qy! zwA5lMsG!4YN?)`btm^jqHvW5eTiqTCkfW_cZ>@>tE8Z4eRGs3QGL^_$s=V|$+@L*I z-mYo(kDDQNHJD_}Ac~#%Fb5W+u#mWZ6s%2k0P4^lp()xtUI9#YsFk>4)0LgMNV$;< zp-Mf_Te$%t>8YD=Ahcspp9T3*?2NER*nr8EdY86_;;zP4s8?LR)JNNhj2A7FgRZUh+YU{iWVau-FRnY8~<~9_!fpm zOSx}9%IpoNQB?IxatvG3a~gn|uOa{(vmSy6e61khf2RPZ!=S2Ku85+TQKs_^`&#C| zL&oflnn#y}(N8c*nM8%z>9DD5N&JFJWGFEd?)wxGo6jgy!wej7h|s}E3F1DT*}`{2 z9}&P@L$u@QZGyP{Xow6q?Ivz@48*kbt`vE5B*=18e~0~jDQ^;5vvDR-6M=*n7fj3T*}<{1u(Up)=nmD*VtxCKl$xs(w=BpBQly-dXt^DfD7I#2U+g zT(|?0a``*pQXWNsr1v_^JhOLD8v%lD4Hv@dC!~zLQ{b`CfT{rH zz;8bXtWvmW)eir$`jsH71!(EZvpwZ@XScq$wN-&WgtCt5VU;{3Bh8IW3MVUqWsZVz zQWJ50SlS^>+*su9h{!kwO+hFZOR*Oq^dPchG4p4Un-7W;rM{4%_h6@~D-D&Lom)O7 zWz;;a7K=5OgQoA7QJtv9pDAeZ=#nP2Y|@t4v3984s@B9p5iXw$shHnD0xpNL(g2vg zYvWX9m}0AQ^~G(Q&Lvg3s_Ngx5NKbdg$03UHIZSMkx*9 zJ_&=rS~yMtRy|rQB8S>Mj()tG>G!SRhIgYCIKa4bG24OrwlqbW9dx8Ufc~z)ivyA; ze7{!Et!f_C7^=z|WNe-<8L#uThtsZ!ufn8t%Jbl8&%M+)s*15DuVdw_d0#z}luJ0R z;LQZRylhA!;SS8-ZY$Zs@*%*ZqPyT}VrOp;Q#ai(+##tdvdPZ%cySL#erAv8%Ni9W z{+-{mE0O{aYK@;z(Naz`V|s0k_triUJgqC=xHbJQN(RWon5YTYUhXj;4MyrkX<=9p z!hW@Q_Wz2!X~WMs0aV>*9H=w)^Dhf^apaqBU2!1O2k>^_;QAD4IwB<|V*bQeK>YZe zC!fliO_l7=P;+pu|7G72{Hl((@@6>lHPyvg7DXA3>>9lqUxDseGT^^EySR}n0YigS zg0D3XWPg@9{omp&-cGrh#J!=c?T5qSw#Y%g)+i}pR~%%cMd5udRE)&=^l6Mh0<)+N zn!x;XtyH1kF83)0>25xS_sh-1dMs}57tCN3qCaecu+^4mX;B{cY@141CV@Vm$5U{0 ztD)xI?8a|iw5Dbl`rFOHQ*M#BW$769IxG*jHmCqJLUfJ{ZE~>-x}j==Ae6`71bZJ1 z$r@aKlo7!ex|w#$~mg;HdZoC!yHpD3S1kirSzgz@PkVbo(|TwVcb*>97cR zWh)KB+EcXI;l~QXAHwZ5XPR`dKic*ILD4HnrN-^j>%IPy^D~vHq6mczwo!KgrJnY@ zuOFj>j*Y%3S z!Z!DB(z3zxf*rDHKq(G{G0^&dkkr|c#ll}C-s~F67*kU!mu2jjnOm6Z59{i_7C+TG z-64z<)L%MK=ELK2Nmp`eCn;S$uf(=j7uXxaixXxO^l(P2wYRN`t6uTu0(qg(SZ9e+r_}dP{_l!izye?EV zzINYbldEyt-J*9dHm~hrAhI?@^E|7Xx0yUpJWoUdKc!WNsOAXh=cHbgBq%l>G=$qW z!R${F#eZ=c5j(}P!QRZ{lyX+#wdKjZf`3ymaN8buTDJYU#)FF+ZU95OfC{zGgz_BB z3k`p6dsvz5zxep;*`>Zf`)k&inQk<;PttzytYHwFW1XgymaPX9#}cTr3M2N^rwFR6&Y2TKYb|C zun}ZAgXD()3WY9Nmz&SE>}%jk&d{sAdPtq09eoqCN$M;l=b z%?yJ*US2$I4o5)3Q4@}&WvthXkE3R%F)K0}e>{>1+c8;`hsFTeYN{ywth@ZYAxaLcRw1HhFl8pwSL z8z(SJ1=_PpL+xxs`81`KE1o>HS?v5Ks=*Wo&tdnu^cibuYN}NOGZ#}8f#+lP;y^%& zaKvE{QVQw;&MzLW)kC*J2p^;Ka6?+(;e;Nr#5~Hp|6gQGT(E^3a3(*vg%8YHP&w^|;f79hwBf}Rz$#C!dxWCC+w&<2DkLJ8l%T zu2YPJoq!rbZOhDi4&Z24LlPJE8O>QJ_z2pVBl?|f=cpsEnuuUBog$rL9-X#9Z-58s z1oDqfe^BJCv^NKx%tUEyyw#}H@rZl1Dl5Ba%VPb_H3@RMXrM_fFEuy0!aA8&yR8o#^sTb1)NwZ3 zL~ppRv)^P`OwdOI+A1ko^Ju7$9-xN+WZ=9XSq3O22a8p8b?U}resFXhEiY(aL*jU% z@3ym3X3(Y?NBi?XTQ|ms@w7-XLsyura=&&TT)_rR&mzD8Z|D5P&Cr|k2d1urouJsP z;@RZC#L0LX8~xbsAhG9x3uPM_MtHl2pND%rC*_rdLZT!W%zxQE|8#Qy*?WnGRtE#w zLK2xDt^PxnhGd#&hROzj(GhFmB41;Uc3FoAEjlb`^FVw0;@g%nNo+p4MF(mdMiGCFD zw>xX&x_PtaqznRcryw{oRp2HsI@u|-~X^RjPnu_d%R?x(M5Un`Dy<8$t zaC7M;BfWTz19UCh6RuPDg3%R@u6fPR-jC?ou4Gtz)@xP{x4sbFUg8hjt+#9)Qcc6Z zq4Dg44vah1X?3l>+qD(qK0K&}38J@7=SGi{R0YnjL;2_0L?tV|1%=N5xILrrjW)V+ zje)5#bmhfIposV$mFn&s_``HuBNjA2N*+#O29n#WM0={O)FGr*`zXeiL^x1$c?_Lh zjt8`}>@qDlWV|l%N3RxfO^3{;e=cf#48rT|;)s_f*>Vbt!I(IJ0F-zb+*=*FB6EaIj z&kniaa*Q%EIXx>s3)_|wEZ{|JP#!`%fdO~IdiFTh3ihhg+%~}!>@!)4u~d}CeBJK8^=4_{qX4a%B6CUio<8qM+SJv+WS8>E86AnbFjw68WJ&+Wik zKp}vv`V=r1o8NFB;`W?rhK@!UpT zbIt0I+6WLz;ZxN05(pdDG^bRT(iX_X1m13IZal}Y3D#1QTUMiV}O({0)mkoOZ+dW(kBle#0#R%0GW5WgvShd7cAIC~?({51 zp1Hjf>=B-xy zC|n+?yOHvLR3cUfu#c_`1gZ|0y=O%ruZRH~@qP&-Zxz)=A24LJ0g}a(W@YW8pdq(+ z+>Spj+YOX7yu9PB+PJVQ$it7tJ)aP_8?_tp9$h9nBFboo0-jdw zwAyjv+}Huju2=@*k;ciH0#A#j23j?2iksUf_WGbGG1Qis0j5%n#T$DosHozTL00NW5z4_|Bj!}G(0Urj zu(g-ELQFuX^8Q_QU%~XRI!pKu9^bO)lCB^7THdN0mU~c9m9%IrS^d<#Gi30k8YZc( z4bflLjb83Lfu09Q+voM$tGWrFhtnd*)2Irp^0ovEb1c zeH|EHUgO4gm_O$R%{{E+ZqHQB<8HT#2@Pod-=7y%<$wL?js3R;1Ig+=EtWBJ$3(zy zg&hHsx$I{0Dt(C-$2M6awavE^A103d$#;8};j%dfqJuOf#}oAKII|5Y=?EaPOp z6Oa}Xn#RpuO{9R&+7hYRcE1`~CYLdSdFEl8PJXTNOa#({-b=t98oOn`=^zkC=iH-^ zN%LCH1Z(MXt9PDbQ2}mHD9|~K_XtN3i4mX?BM*fX5q<|};&Yxpt+u|Nija^yzz!@% z?(EKCgfF$WJzrvT37!5I{V1X6@re~j%mGOQIBs<6U;Dc0n85%ROR6cvb|iM5;R59% zgu7Yene`MN#FJ9~;{E5dC$NRgXbgwCwDQr$+JRS-t?1Qk*$L+#2ca=H%olj$<5ttN zh-?rc$-pW~E@#RWJ~O8Yd6x5}4G_9CRmEks`- zEtN(bRlePZ8&iYIqi=O2{u3 z(LXtDu6U`RCzg{J7*=8ih1he>QbPXc@$J)a9PZ=crJ z+k$61XlvvF2?`lyX>B1u=AiZ%ph};In3gBrE`WbYd%+ zzJqdgM|U>U$#s{WEpzz9mqSU-1J-WO8BuwmeB~6J&ZJDHomMb=t$Or$pSG%A zvowU>kn7&#AU7s~cW2CpVC|p4!}#pjL3uOG1j}H7yt{YGueYTe-+*z2o+~#^vn+}4 zp@>RLhuZ5v;jpO*|HaaT+!7P0E2_L8i~-fI4r`|Wm##g0R{d7&a_W>3zJS;*G0s^n zEhWcYN^OzJhlEi`YmN{OlP^-B&1~=^*bKWaYk7K6C63CNvlX)f_|*?`{NQ_#DKA_O zG6*=5Y^TiAsc9?<)wU)I_f;T1KqaLN2KPkoA2B;jmVFs1>6P4t<^&pu-SKu2ea~Ki zy#~0$^1e^+bVpqXyCMGJ)|-&-)%V@w+#-?l?Vky%l$>pc)>^+f(sk!D)oT%ChAgnf zCamcGy@u58wBiwag{T{D%LVBzTY3M(XwK>Ssmz_=&nVK_^m;vVX2R?uP~gS4H{#bj z!5g9Y1yx3O4+Rlu9H12G$+r2vrq~iKL|zH1PkFQ3L&@hgD1TfcKy}nMMX*Z)ox(*; zOEv6&lIr9LLQ4AkNzqGi*3K%SUxpnRVNbGxwAiJb2O3St&dTXQa2bersgOfGio^&v ztLYksB$)sGlzQcr)hj7UMZF^PKOCvMdq;Xbm8FBK!j-f`aRpgc`dzNSo^~TzGTn*7 zn@&}FoAwD`mp7|aW-=r{s-ERBiF%4-iJ@MB3DoU%)kWv}^$2e*f@%XonBnU8@ zmrA6YthF0v956X}f#FI81m1^A@Bb8$8q=Y#XL2wli&*P&vKB^)EBz`CX+b7jLu@|)jNH^nEj5#*L7}wpF$$VMjZjuuj ztjcg3Clj^=M6AEdAI%e(`ce;>ZD;0EV%(kGx4m$+3f*`+xDg}5a2=c+Ix(`&eG#kp z@oTR>Y!6#9QWHodAObKfbmW1B>*Sfd$IfOnk+6Sp}>|s z-hv0x?A2LEv?H@EjFCz(raCnqZyvm@o!`dTyIsPIwzR1FGeh#p|252`u4eJ)BZjWy z5`-1RciFlbE#lWsNhvanL%+YlfRtDr;|VTxV&#D+3Y?+cVW3_;L?`6szS^KBngIYn z{%pUP154G)?~LvABq$qU2WVdY4sM2~0}Ak}G3xPmM=jj6<~wT(XOMqquJSBN(b@s! zeA(X>Ex=UN_}2Cgebi85n@}0=Om1IR!R+Dr#h}>!c#_m#>nP`U^-FDBDS*6Ho=v+y zbt`oPr;Vxt_m`iBl5mP$U&1TnR=u1o%7ruXCCo|Q!#}OE-eZ=b7?O$Ps#5+w0PJ6* zCJL#=DIfA$vBo5Qbx*l3=WQ0qNHd|tS^ZEv2`HGlplRn6?{i23SawbET=d4YIaf@w z9gJ|mM_@5=9F^l3{uIt|UW*Jx%Er1a1U=R2_r^)#blJV>cV7;MG{!%a=hTtX8Rd_4 zNP`jHpq3V9?8DmF(D^KE+=w>089aT8AD&gU?B>*B&aej7!Zeh;po;*g6B5R4K-HeM z1{Ss2r8}GWK^BRDR_`9Evw=9Zdit;awJ9B%Wpp5S+Kg4N$+FADFFzGn4H4OP6kf&J zJ$p=@GbQ<0LAMTGRo0Afjm<_|ni{OWv}YHwx%qUFp%^M8{RqncQrsPTEEiY<+r1{C z^06;N?=-twfUhYDe?V25&Md~IY-j!N0iYRZ!Xdq*IVP6XAfgc&Ui<8NckN199J8tF z1&Uq8pHUA+J9uo2pDZX#R@TwT)N`AAKCcC^XUN0~_}_U^L0D+eR?XI#kB+`rFsp-; z_)VOtc~lkeOrK&I$_P*As9G$7On&){d0wV%T0m&bP65~-`t@v6^>Uya^sU%NWyiAw z%#|<+=;A4bG^|sOhfkS2f*`*}_RW|^HSTqF-5gvfBA@WVCUI_QWP*Y~n}clbk-(MDuPT6ZgF4ITB5E`x$E!zewi73)9w6+zcZ1Z&&i^Ho~ z*lv#^Ku^A8X@e|`IJvuH-;~fSNrD{7-_#BK{(F=O|6vZORr$(q*P#q*JwHV*P6J$R zz^^Q0g82N3X8koOm^Q=>6Hta{kJs|S%QMT!qZcu*76?g%-Tn#fIxK!6iz7Q|y2Zdc zX}I;nFIXCKx60xJeJ!yhGZcrZqmtOAYaYO5VIJmf5o^?PiTKh1P~g4B^to|#m9fy_ z!1bem#i9pN5#bfY3(Y#@Aob@JjvJAC{iWA{EK#4|u~_AwY!>=R6_L@+yg;1qOzQVrvz2g2VH9PKjf=@_q6A%Bt8!Sfh7rVH!^@RL%kon;Sjv zXF1LDxI|)6SHgofRxLS0uzXbZW&gjn6o_OQcONAQ?bJP?tZjkv+cWZ-Wzk+*&xO3L zWjiMMQX)CMMEl_1!kJS-kwh7`eeOWx%)NC_*4$Gv_K6`ku1qiJlrtv`2Y3xo^7-Ma zA*?PBOEv>ExluCjDwgooYQfugK0+_@(P|xwI3i`Nd&I8(=Kfb8Ok3K&zL_z?NI1W6m@(EK@yBbucj?>L9=J9si?hB z`MV8x(SudTCf;nyo>ekV-Zsm4v$Hx~h0FNE(bT%@(=~^;(tR1x6)DK=vOr_2t(670 zRXf^*Usp{$DHmt8hVlb@2eN$TBJhm>o(1uBiGADAgkvy21N5OAAj#@=nYj+mq_lcl zNkI3Jb9{Ze>9NQQ<63FhB7xdSbgh|WB=X$Y>fI}hn*%j=GV7S?m+Rw zu7BoLSgS{|wk_|HV?&CxXq_-5OsJTz4LsJ+AP$PQm+7nIT7pf{OZSsY~Cnb^&a)Lgp~tLVz+V-@4M zY0YY%t4GMQCw$>YGP9?Q)X|#kJ(-uo^_hVb*`F+$=|%7LuD58@f@f;NEv3&0m>L%= zNt+E4#98V^u6XpaG=Ab(w~0?bCb+0WH2Lt9yHhVCjdYvwncBcO{rG#s)@w}~2_q|i z!vpv^{^x)FZ~UIcV;e#wrCiEpceoa9o*v3?N3c>XH7UzIiRz$zsPGLV7`phY^0M-V zvOK|-aD@R62y<=+wU+FW24dd0y0>d16BZX2MiL)7FIkl4lJ~71lsiyLDTW~2e$;vD zq;?oN;No9%=}3Yr4jVsAlYr88^$YWi z1>=GwST>fmf&6Qk7jp<%qo%!?jpw_kiqY9Dm6Mp}%iB6S!!q3A0+jU`js4~nwtuBc zi0+DAh8@Nqi(JwZo=(13a-X8JMu&_~Q$^(_E*V1$OB+~Zr(RZwz&%|eD;91aBHTOX z0!Ee#Bxe0=jRaz|@I-9V1*k;Pi z%7SKI`5AHE@ZE(G7;4cRFL!Zat|CJsJnt&63^l%IeFg;pR;%5R06R4^nQO^b;K>qw zTb{dKlAAS$P~-8%lo!zIG=z#Ex6$1dMyo0$*WS1BoT+(||Pw~jlJ~^lqH**;MH0Jbdj#Y2UITx^Tw_V`t zw^f)*x_4Tdb0IOtCAsFcf0~sek(hbh29&@AH;l5;S+nDm7xEckpz0L*U3Nz0evq)C zbZ6ooS5CW4s{(I-#{*R%K25U91BZadvIpknnPxDHn&QFGmH`NP@s(Y+*US<$enRbJwsxB}ErDc<> zljCIw7w7|2qjKl&6qE`%ER(c?1*ETdKQYu6zKob4{QBlEj9^as&*eN&Uj-t31ruvwyR^xkIojB17b@)j*X5!E!QCu9s1^#uA|XdHm51v z2QP~2WtyT<121s+w^OSE>$6&)w2~RM*ZOsGyW03R-RGb!;mWKW^TtjJJ>GwUrWPG! zAnQB(e=MU9t1Gu*B%+gMXk*E2T0I9@L&%!7FYC(2J{Xh)t3KES5EtPfMYc_;%wW0{ z18{ntz%&W(5(`nOE-u8m;Qe#Kr~<9s;F%U;4MXAto==DB*mygJ>g|}^P=e-`Hw2!U z#oo>uE`G%A>M;Vn-SlRxH3l5@%bDF>B-`FPlKJA3G{1DF)0}G4UzaE^@o~RE_O|0Y z7W`n@J1q%|WZR2pj||r2OXVLm1sg_>!lf;U=$L2xhBdpGN8>v$ydUsgqDRe5ubG#L z(OC9O2An>^gtwobvlK3Zz{!fazM^T*oZ0?L^yz%9woFiL^&iOg1$(>$%q1_gffYQ* z_OUWG+fxm~r%t$9^B)m%M6h+QKbEi;9r>O8?MGrmhXg^6AB`I$xIcdgkZRTMvysv9 z(N+=S>Xw-6P3U3V+L7M1Wz+%2_!QO{9uLpG^`acHAU?XS%hu5-4RW;@62}NSXJ#i} zXx5Y9h%Hk>b&z;n9Is>)Jn>9PeJDy8doSOxZ$l)^loX8fpyZDIb!rtRQzf4i^(`ka z@x?!%J{nW;U?6jhSQY5im_bSXFG!~Avhcy7ZjL-bp*f7Yz_s5t;@mcpF?mi87VUH8 zwrh}FFYg268h7IRnOKxQL5Wv$L*_a6ft(ZkQ@p6E+~v7WD%l2MNr$IhyvipAhfkOV zPE&4-FhoRkP^4Xk^awr@_ibk*k#>wj-(ZC^zXwk>-N_lCPoog-1;|faA(rAG!v0E} z&p}O!AD=#nX6$r-IY)$KPS$E+iZ+H%O-MgG)uRjp4R<@8(jReybf%Kb@;f>l)K;PK z8j0hrd$3q|@<1Unh>!V>5i`BY*O1CiJ_cLO5W_#eCrl?nab>hXfm&Jk#?s-meyuK< zz*1KpAzZKAv_7xf^vnRIdJg2Ue>ME6an&qVryD?#Ul4ON5HUczp(^ zxA~rYoYOY@9cZdxQG&&ZLnmps`=$RxL#k}3?ZXQQMKg#^dar_{OC3{)hg+1~r#oTqozA?(shp0NOyt{I9GrKcu*g9FhyzmQB zt|I>0NK~)iFI+MYQ`qBn^TEyNO9*}!H+q**>bbqf zG8MQ3*pbf0FX13624&y6`?hMe zC7cpth?6fjQ=NU9?6=<5kAoDhmdqp_AAdU$K~Q~5_*cVAt1FkpG=j&7%z-1|7xpFa z(6vN1I7|O0PHu5QO<$w$eNqD4Jarc(Fc9JVq&8qzM@pIzF;IwfS1Oiy#?3bb-(xfPHWk6`AVTNvDqfe|^ z380*tL*UlkMx5B&4rh}RqYKsV)eV8Cp?Q14@_|!8)gg6&9w(!0Ecq*HOQ`cge$$TM z^3Q9uv6HdaSO#w3A$@AyIfezJPsOAx88XvF0`0CpZ1&9Qo^RVjDsWuC_~A00C&IEJ z|G-Zk|v~vVN!vv^(Xd`Wd>8h32-l_(+ynhlZ>x} z4$_V+0MIGfPgsjvp6`T@kbrh4WFFOq9dowyGDq-{V(;|Kof2%Ma`5FMc4t!{*Ec8S zYiEdppcwJV_=N(U3Wg?4$nKu$o(I`xCGU9>^@7q+==4~;ZQpWF0$SW2pZgHIqF+A* zU-CH5jQLS*l`9ewVdW>8$>|+-fvytBjQR2Y!%Vu4C>3GI#&H2$gHOigSHT`9s(;l2 zLN+lXaa>W?2_BdkrU$Prvb*%9UA?T?Kw_+MEY|On zflO)4ek&>rBwDSJ;|{wdI5~6R%v|d+$p)kl$R8vxj_?2}gzle*nBOq%L9n13qoL?1 zm}r=G(%-i@FqHr*Q#t(h;29(|*z}p?p>w8uxwzylf&zu5SHFiAwee_qa?=hYdR^r@ zB1UKfiTBmm$ArfdCrj7IJ~AC7vY#c0v>9&1vrV}`DLv*E?8JspGgA1e!7 zPrLGiD_+vP>ZiLV7{{fzhPlj-ia7=480H2_5{AYYGi4beEPUW ztb8wJ4c>`3j^lFy9SsrkCV8fGWP8^#Dj1cHeyF{E6~rF!$j~+~ zmRrpJML*5=_5D2bwU7so&?2lEN+TR_SSomw{45_*gYFPpE3{T`EJ^GBxCyMg^fBq{`s^ww z1Pw1dFRo9kC&LVL)439vj)yiyM6ecBQQ&tMZY%$Lqu6Qw$nB>>SJQM$b1!D@r{;X5 zFSPzZ?Gk*yn9(Qqq@>WpwR=8c>2Yz8`9ncVcmo?q&)f7$4*9U7qCZG((j zHlHE4gH5)VumS_`Hi7bAArYVa>CDq)jTtA3 zhmHQiLkSM}rc1#L(=>ra$`OFo)JPZQc&V%K>GuqBrz@Jolm3Jo+Hg$5vgMgfssV-z zujy>=z6$~S`10Hs1UKpC(suc?_FdoU5!_C98ZcTvxZV{tx3Bd zc@Gpo{I=i%;snS0L5h{)ipFnn1*%PLq z$y2bZI4~A9rN_8(vq8xC15A9H3PMvV7Voef!Sjj%itew!(w%_Cm3%~26 zL}VqxA^35iF-OsqIqQ5op8yU1GnNUwXy-=3uFM#m0uIT*Ddp)JPJ94^k`dgv&}EdO zUY%HxL0O`U&zh3D&Qmz{^JBl}?NxEC$-vR#XvU$F?3cLT75u)8k`bFrw4wbVbQGc| zA)U|ZK;@$3sjKh|Z~0@%VC(1m?DXP5#b-eCZxZyKbEMi8b9?oCMDe{q)(r(0 zx~zMR*Ta(!P<>kSst*ks_wGN&tc#Dy7({A!e>=9G9T8Pe!Owiq^SMzI3)J3r^*(_+ zv9I^~_GYHc*!Hk@zJd}oRA+{Meu@YTp`JbSxSrQNn<+npn?=HYPHh_A6^*Jl^1^fMzdXfQmJQ6g)Ya${!w}Cquc|{pa1Zn= zqdH<(7K$ADai=*I= zKrG@9F%K-{-BrmU`zE`8kk8y?avNWR8Lj}^Tvl2cjIXF5fe+mh% z!vvIx4drEQenx>AcyWGZYHnw1*ZX?@dwCz82sm|(%stBaitFNzRQI7Nuc(RK14~kx zy3*(30?59@?zo`(sCQwhRI+i&efBWPA97mDeyKI5q()t&%}^FDZeKxAAgkGTp(!W>27d zgZjx0Fz!%xo}j=)7!VK`kin+!Pyt@|5epDL>+*_alx~ClP)^K@5sEn2Hz!7_sGu}N zxUz5Ep#tT8z2=Tzhgc2PDkGz6%9nt`=v`EI-S~BIyYe!6$nc`xg>Gz4;s$1UpJwFD z1lgNoRIWZ%$X--DJ#YmJmvlbTZ)>na&ED*55G@RV5d9%hj4!cLvHUh`293cZ4>{St zc7zfVRxyA*%NPeRhejv_M?MjWJfiR4 zjF7cg(wk|MVPN*Ju^K%|xiBn6EEnYtVDXDGWIgyj7NFyG!st*D_Np9iXmXR(EKcv` zID^N}f9WYhkp`K=&Rw44w5~uZC0XA>k6e_iv|bfe%GV-=Ri}HNtTQL!JcXNo%-AIf zjv+}~yF*DV``x~#Jyl~b2=^_*-^4KE>g_Tn(PD$>nT>sS%x<_VurU&Wd5??PB76DG zHL&aGD1FeAyR{49yO^DT$|$yK2GkaosTxWgv1gugV88=gt{W$#a}L(1v*~^y$S*ow z7nno`^p(Xb;k!D^->E($Mih`SOXf)EF+;6zf6fiBJ|Iwfp z)-4|2;}ii>O15#djxuO)BZq*@?m7cZ|Ia8TxXGJ^8MQLi z#lGO=UqaW<5&(XGzU`qBh=yqF!}~g48&Ax~-3ENdj)^x|kq-qhEYARiguDX|fI)aY z`}wt6a*wUu*p0yBaBGev_zbdMS{?mf`hTBZk9f*}x30V-n|d8<{}vrzleo{TMNej@ zV>y}eJk)@fy?gV4dgs~52d02RQ|gDsf+fc4iH!QZ2TFMu!Di4-xRjicyk={!xY(MG znM(ufHZycX>!=>YE2d*DI)CqI-WeJl6#S9dw}ay@@BDRBDt72Akmj491u z9kLnXo7-#u@ro~7)mG#tuSy_h&J9M^w%m8mW9P9?1L!3`L+@CFhs^8i&E0z&&s4&L zu)9$~;4#ODA3pF2OvKmfP>k8CrCf6WvAtXCUv2vd5JAh_51Q3Ij74kxN>Tv(UKAxi zmAFHSVLK@H*kUbhq}tJ#V=)6>Hf{G#K!zg`&nV*mOlu-2%km(XD4M24$rjVA?9en6 zuv?N#WjmO&ro$g_XS3i`P2~ zRIfww3UKiP#pUgx)+ms`_d9~2jM@r#I9C`DjNx_+#CLT~lue(K30WV$wxe=z6Vr@d z$gb6P7V00(-oXH)uZT$ZBltDI%G)yKISrO1MLlaa`81)<5*WG2Jmajt251Fa!O$O?YhC92BbWE6@Gh%b$ zIni8@=qVYo4UT$31~cQPKsE}>j=U~$!3kqQ7+3eHzHsTF2(#TU0|? zK?FR>>fA*pnXGmx8BXUVlPDyoq9N7eGRwJ5Ync6&LADE}&YiT6os^Yy+7dm&fucPJ zZE*Ce;ERki7jz=nN(CzLrU_zE+Bg@ggigybB4`Iv4^Nr|f}fce^|5560mdRl0mG&~ zxQoZste=#ki|E*;&(ThOuCQONB9J?GxLaCR13C`YUR)JS6luq%m~GM+ysMX4%XQDh z|ESBVya=@~Ah`Ct2TgzN#u`ks*9n}hW@`ITIh6Y?@!3~maHmdgVH;ZfD zK|rAV;4-Fq&sW*+Mi=AU@HtjOvQPQ=gU`-BK;feDgIGra}ctd98nD61&=#Sn12sql{F#8Y=OxW;)^ic@M!u z1u8_hItl-e<3~P3;qSnDT?F^=Zrl%%*zN`c%4V3(RC!Y=eP&TL6md^GpdG?SuHQgh ziC$_`jB+TPtzKTqVuLZ8&h1ZL8uXef3*s0TMa<;9P-W$_IpC9s1-j?zr!QE?6yTBF zzp@<>oXWlsrA*|mldIMG@GKvLb~4X>>Gg>Vu8nQi!E*A5 z6!G0-^M$*miMAoE_K+RDxQaMtRixNUs5Za0N_fcgeyNEGaO9gl`)$VYv8J>OH>Pvs za@U>Woq4<51LDwDn4C~Rp=_^DRNS35hbr47Wplve<|ad-LVkric|jRQ%tyy329p2a zawT_mT58+wn*~tzp}HgNP>rJjtyubTQ2axL^Z{}rAJYSEv-iKEi^1h}tL-vagwlnH zvoX1FW(-U#4)B0}ecY*>p0mRcT@?7QX`htCu>(Y2FHjown((-XOiZyxoGt$hJf$~( z18`Gpj~jH2B!%Lm4%H{Z-L2I}cRQY(&b}(iQ!Ukx9p80oGCKGj2E;@6l8FxZtf+}; z_ldq$MJ*`Ackb$iS`qi}3%Y-mcZv+cE!Tr1DyDLMhTVGDe7NqC&GCS+BF2b*VsKKU z|Mr!tcR2^zKGdv;=jGxq5TsAjavQ08Jw5L1xu#O*_ti5_v^E{Nx0Xg;>j{*<3 z6!x?)YW4MrB-3-W#`is`MaTO~(e|Ru0meirIINDBfpl_;2$$Ml)tMeDly8O~T1C<3 zs>zJJ&T%facxhyZZTv>}s_WRNH-zY5rdIkW@3DM~kn9RT&=%%lm}GfItq~W_&sxu; z*NJEbbxC(;)yK{|`NdVDs%0DM!WDxV1q9i7y1bf{|hXAn{UV1g-6h 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 FSz3Qo#Qy*Q literal 0 HcmV?d00001 diff --git a/kernel/tools/perf/files/patches/mageia/0001-Pull-device-0x0821-from-list-of-device-supported-by-.patch b/kernel/tools/perf/files/patches/mageia/0001-Pull-device-0x0821-from-list-of-device-supported-by-.patch new file mode 100644 index 0000000000..d519e9f8fb --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0001-Pull-device-0x0821-from-list-of-device-supported-by-.patch @@ -0,0 +1,28 @@ +From cfa62868adc134623104a759902a95bc71790614 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Sat, 16 Dec 2023 19:50:53 +0100 +Subject: [PATCH] Pull device 0x0821 from list of device supported by rtl8812au + drivers + +The Realtek device with ID 0x0821 seems better supported by upstream rtl8821ae +kernel module (see bug https://bugs.mageia.org/show_bug.cgi?id=31965). + +--- + drivers/staging/rtl8812au/os_dep/linux/usb_intf.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index be0f654f0..c019fa82b 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -185,7 +185,6 @@ static struct usb_device_id rtw_usb_id_tbl[] = { + #ifdef CONFIG_RTL8821A + /*=== Realtek demoboard ===*/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0811), .driver_info = RTL8821}, /* Default ID */ +- {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0821), .driver_info = RTL8821}, /* Default ID */ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8822), .driver_info = RTL8821}, /* Default ID */ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xA811) , .driver_info = RTL8821},/* Default ID */ + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0820, 0xff, 0xff, 0xff), .driver_info = RTL8821}, /* 8821AU */ +-- +2.41.0 + diff --git a/kernel/tools/perf/files/patches/mageia/0001-rtl8812au-add-missed-prototypes.patch b/kernel/tools/perf/files/patches/mageia/0001-rtl8812au-add-missed-prototypes.patch new file mode 100644 index 0000000000..40392f5135 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0001-rtl8812au-add-missed-prototypes.patch @@ -0,0 +1,6262 @@ +From 292797fe6f0fda6ab984e68d07eb97d85daa4837 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Wed, 20 Nov 2024 22:23:47 +0100 +Subject: [PATCH] rtl8812au: add missed prototypes + +--- + .../staging/rtl8812au/core/efuse/rtw_efuse.c | 12 ++ + drivers/staging/rtl8812au/core/rtw_ap.c | 4 + + drivers/staging/rtl8812au/core/rtw_br_ext.c | 4 + + drivers/staging/rtl8812au/core/rtw_chplan.c | 3 +- + drivers/staging/rtl8812au/core/rtw_cmd.c | 12 ++ + .../staging/rtl8812au/core/rtw_ieee80211.c | 4 + + drivers/staging/rtl8812au/core/rtw_mi.c | 2 + + drivers/staging/rtl8812au/core/rtw_mlme.c | 5 + + drivers/staging/rtl8812au/core/rtw_mlme_ext.c | 30 ++++- + drivers/staging/rtl8812au/core/rtw_mp.c | 4 + + drivers/staging/rtl8812au/core/rtw_odm.c | 3 + + drivers/staging/rtl8812au/core/rtw_p2p.c | 12 ++ + drivers/staging/rtl8812au/core/rtw_pwrctrl.c | 2 + + drivers/staging/rtl8812au/core/rtw_recv.c | 27 ++++ + drivers/staging/rtl8812au/core/rtw_rf.c | 2 + + drivers/staging/rtl8812au/core/rtw_sreset.c | 3 + + drivers/staging/rtl8812au/core/rtw_sta_mgt.c | 4 + + drivers/staging/rtl8812au/core/rtw_vht.c | 3 + + .../staging/rtl8812au/core/rtw_wlan_util.c | 7 ++ + drivers/staging/rtl8812au/core/rtw_xmit.c | 5 + + drivers/staging/rtl8812au/hal/hal_com.c | 14 +++ + .../staging/rtl8812au/hal/hal_com_phycfg.c | 83 +++++++++++++ + drivers/staging/rtl8812au/hal/hal_dm.c | 7 +- + drivers/staging/rtl8812au/hal/hal_intf.c | 2 + + drivers/staging/rtl8812au/hal/hal_mp.c | 15 +++ + .../staging/rtl8812au/hal/led/hal_usb_led.c | 109 +++++++++++++++++ + .../rtl8812au/hal/phydm/halrf/halphyrf_ce.c | 3 + + .../staging/rtl8812au/hal/phydm/halrf/halrf.c | 4 + + .../rtl8812au/hal/phydm/halrf/halrf_debug.c | 3 + + .../rtl8812au/hal/phydm/halrf/halrf_kfree.c | 26 ++++ + .../hal/phydm/halrf/halrf_powertracking_ce.c | 2 + + .../hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c | 23 ++++ + .../hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c | 9 ++ + .../phydm/halrf/rtl8814a/halrf_iqk_8814a.c | 67 +++++++++- + .../phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c | 69 +++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm.c | 15 +++ + .../rtl8812au/hal/phydm/phydm_adaptivity.c | 11 ++ + .../rtl8812au/hal/phydm/phydm_adc_sampling.c | 5 + + .../staging/rtl8812au/hal/phydm/phydm_api.c | 16 +++ + .../rtl8812au/hal/phydm/phydm_beamforming.c | 107 ++++++++++++++++ + .../rtl8812au/hal/phydm/phydm_cck_pd.c | 5 + + .../staging/rtl8812au/hal/phydm/phydm_ccx.c | 24 ++++ + .../rtl8812au/hal/phydm/phydm_cfotracking.c | 3 + + .../staging/rtl8812au/hal/phydm/phydm_debug.c | 41 +++++++ + .../staging/rtl8812au/hal/phydm/phydm_dig.c | 23 ++++ + .../rtl8812au/hal/phydm/phydm_interface.c | 1 + + .../rtl8812au/hal/phydm/phydm_noisemonitor.c | 5 + + .../rtl8812au/hal/phydm/phydm_phystatus.c | 29 +++++ + .../rtl8812au/hal/phydm/phydm_rainfo.c | 16 +++ + .../rtl8812au/hal/phydm/phydm_rssi_monitor.c | 2 + + .../hal/phydm/rtl8821a/phydm_rtl8821a.c | 8 ++ + .../rtl8812au/hal/phydm/txbf/halcomtxbf.c | 16 +++ + .../rtl8812au/hal/phydm/txbf/haltxbf8814a.c | 4 + + .../rtl8812au/hal/phydm/txbf/haltxbfjaguar.c | 8 ++ + .../rtl8812au/hal/rtl8812a/rtl8812a_cmd.c | 13 ++ + .../hal/rtl8812a/rtl8812a_hal_init.c | 89 ++++++++++++++ + .../rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c | 74 +++++++++++ + .../rtl8812au/hal/rtl8812a/usb/usb_halinit.c | 65 +++++++++- + .../hal/rtl8812a/usb/usb_ops_linux.c | 1 + + .../rtl8812au/hal/rtl8814a/rtl8814a_cmd.c | 15 +++ + .../hal/rtl8814a/rtl8814a_hal_init.c | 115 ++++++++++++++++++ + .../rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c | 67 +++++++++- + .../rtl8812au/hal/rtl8814a/usb/usb_halinit.c | 58 ++++++++- + .../hal/rtl8814a/usb/usb_ops_linux.c | 1 + + .../rtl8812au/os_dep/linux/ioctl_cfg80211.c | 12 ++ + .../rtl8812au/os_dep/linux/ioctl_linux.c | 2 + + .../staging/rtl8812au/os_dep/linux/os_intfs.c | 18 ++- + .../rtl8812au/os_dep/linux/rtw_android.c | 11 ++ + .../staging/rtl8812au/os_dep/linux/rtw_proc.c | 13 ++ + .../staging/rtl8812au/os_dep/linux/usb_intf.c | 1 + + .../rtl8812au/os_dep/linux/usb_ops_linux.c | 1 + + .../rtl8812au/os_dep/linux/xmit_linux.c | 1 + + .../staging/rtl8812au/os_dep/osdep_service.c | 1 + + .../staging/rtl8812au/platform/platform_ops.c | 2 + + 74 files changed, 1467 insertions(+), 16 deletions(-) + +diff --git a/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c b/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c +index cca02619e..6587eb7fe 100644 +--- a/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c ++++ b/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c +@@ -793,6 +793,9 @@ void rtw_efuse_analyze(PADAPTER padapter, u8 Type, u8 Fake) + rtw_mfree((u8 *)eFuseWord, EFUSE_MAX_SECTION_NUM * (EFUSE_MAX_WORD_UNIT * 2)); + } + ++VOID efuse_PreUpdateAction( ++ PADAPTER pAdapter, ++ pu4Byte BackupRegs); + VOID efuse_PreUpdateAction( + PADAPTER pAdapter, + pu4Byte BackupRegs) +@@ -822,6 +825,9 @@ VOID efuse_PreUpdateAction( + } + + ++VOID efuse_PostUpdateAction( ++ PADAPTER pAdapter, ++ pu4Byte BackupRegs); + VOID efuse_PostUpdateAction( + PADAPTER pAdapter, + pu4Byte BackupRegs) +@@ -2214,6 +2220,12 @@ Efuse_PgPacketWrite(IN PADAPTER pAdapter, + } + + ++int ++Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter, ++ IN u8 offset, ++ IN u8 word_en, ++ IN u8 *data, ++ IN BOOLEAN bPseudoTest); + int + Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter, + IN u8 offset, +diff --git a/drivers/staging/rtl8812au/core/rtw_ap.c b/drivers/staging/rtl8812au/core/rtw_ap.c +index 1912448ba..7c3cc03e8 100644 +--- a/drivers/staging/rtl8812au/core/rtw_ap.c ++++ b/drivers/staging/rtl8812au/core/rtw_ap.c +@@ -940,6 +940,7 @@ void rtw_update_bmc_sta_tx_rate(_adapter *adapter) + } + #endif + ++void rtw_init_bmc_sta_tx_rate(_adapter *padapter, struct sta_info *psta); + void rtw_init_bmc_sta_tx_rate(_adapter *padapter, struct sta_info *psta) + { + #ifdef CONFIG_BMC_TX_LOW_RATE +@@ -1027,6 +1028,7 @@ void update_bmc_sta(_adapter *padapter) + } + + #if defined(CONFIG_80211N_HT) && defined(CONFIG_BEAMFORMING) ++void update_sta_info_apmode_ht_bf_cap(_adapter *padapter, struct sta_info *psta); + void update_sta_info_apmode_ht_bf_cap(_adapter *padapter, struct sta_info *psta) + { + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); +@@ -2856,6 +2858,7 @@ int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set + return rtw_ap_set_key(padapter, key, alg, keyid, set_tx); + } + ++u8 rtw_ap_bmc_frames_hdl(_adapter *padapter); + u8 rtw_ap_bmc_frames_hdl(_adapter *padapter) + { + #define HIQ_XMIT_COUNTS (6) +@@ -4182,6 +4185,7 @@ void start_ap_mode(_adapter *padapter) + + } + ++void rtw_ap_bcmc_sta_flush(_adapter *padapter); + void rtw_ap_bcmc_sta_flush(_adapter *padapter) + { + #ifdef CONFIG_CONCURRENT_MODE +diff --git a/drivers/staging/rtl8812au/core/rtw_br_ext.c b/drivers/staging/rtl8812au/core/rtw_br_ext.c +index c80474e8b..955a50912 100644 +--- a/drivers/staging/rtl8812au/core/rtw_br_ext.c ++++ b/drivers/staging/rtl8812au/core/rtw_br_ext.c +@@ -668,6 +668,7 @@ void nat25_db_cleanup(_adapter *priv) + } + + ++void nat25_db_expire(_adapter *priv); + void nat25_db_expire(_adapter *priv) + { + int i; +@@ -784,6 +785,7 @@ static int checkIPMcAndReplace(_adapter *priv, struct sk_buff *skb, unsigned int + } + #endif + ++int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method); + int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method) + { + unsigned short protocol; +@@ -1193,6 +1195,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method) + } + + ++int nat25_handle_frame(_adapter *priv, struct sk_buff *skb); + int nat25_handle_frame(_adapter *priv, struct sk_buff *skb) + { + #ifdef BR_EXT_DEBUG +@@ -1324,6 +1327,7 @@ struct dhcpMessage { + u_int8_t options[308]; /* 312 - cookie */ + }; + ++void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb); + void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb) + { + if (skb == NULL) +diff --git a/drivers/staging/rtl8812au/core/rtw_chplan.c b/drivers/staging/rtl8812au/core/rtw_chplan.c +index 34263a5fd..afefe957a 100644 +--- a/drivers/staging/rtl8812au/core/rtw_chplan.c ++++ b/drivers/staging/rtl8812au/core/rtw_chplan.c +@@ -404,7 +404,8 @@ bool rtw_chplan_is_empty(u8 id) + return _FALSE; + } + +-bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch) ++bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch); ++bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch) + { + int i; + +diff --git a/drivers/staging/rtl8812au/core/rtw_cmd.c b/drivers/staging/rtl8812au/core/rtw_cmd.c +index ca4e35b9b..62bd059c6 100644 +--- a/drivers/staging/rtl8812au/core/rtw_cmd.c ++++ b/drivers/staging/rtl8812au/core/rtw_cmd.c +@@ -2018,6 +2018,7 @@ u8 rtw_reset_securitypriv_cmd(_adapter *padapter) + + } + ++void free_assoc_resources_hdl(_adapter *padapter, u8 lock_scanned_queue); + void free_assoc_resources_hdl(_adapter *padapter, u8 lock_scanned_queue) + { + rtw_free_assoc_resources(padapter, lock_scanned_queue); +@@ -2177,6 +2178,7 @@ u8 rtw_set_chbw_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 flags) + return res; + } + ++u8 _rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, const struct country_chplan *country_ent, u8 swconfig); + u8 _rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, const struct country_chplan *country_ent, u8 swconfig) + { + struct cmd_obj *cmdobj; +@@ -2444,6 +2446,7 @@ u8 rtw_periodic_tsf_update_end_cmd(_adapter *adapter) + exit: + return res; + } ++u8 rtw_ssmps_wk_hdl(_adapter *adapter, struct ssmps_cmd_parm *ssmp_param); + u8 rtw_ssmps_wk_hdl(_adapter *adapter, struct ssmps_cmd_parm *ssmp_param) + { + u8 res = _SUCCESS; +@@ -3232,6 +3235,7 @@ void rtw_iface_dynamic_chk_wk_hdl(_adapter *padapter) + #endif + + } ++void rtw_dynamic_chk_wk_hdl(_adapter *padapter); + void rtw_dynamic_chk_wk_hdl(_adapter *padapter) + { + rtw_mi_dynamic_chk_wk_hdl(padapter); +@@ -3609,6 +3613,7 @@ u8 rtw_antenna_select_cmd(_adapter *padapter, u8 antenna, u8 enqueue) + } + #endif + ++void rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta); + void rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta) + { + if (psta) +@@ -3651,12 +3656,14 @@ u8 rtw_dm_ra_mask_wk_cmd(_adapter *padapter, u8 *psta) + + } + ++void power_saving_wk_hdl(_adapter *padapter); + void power_saving_wk_hdl(_adapter *padapter) + { + rtw_ps_processor(padapter); + } + + /* add for CONFIG_IEEE80211W, none 11w can use it */ ++void reset_securitypriv_hdl(_adapter *padapter); + void reset_securitypriv_hdl(_adapter *padapter) + { + rtw_reset_securitypriv(padapter); +@@ -4903,6 +4910,7 @@ inline u8 rtw_customer_str_write_cmd(_adapter *adapter, const u8 *cstr) + } + #endif /* CONFIG_RTW_CUSTOMER_STR */ + ++u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length, u8 type); + u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length, u8 type) + { + struct cmd_obj *ph2c; +@@ -5021,6 +5029,7 @@ s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter) + } + #endif /* CONFIG_FW_C2H_REG */ + ++u8 session_tracker_cmd(_adapter *adapter, u8 cmd, struct sta_info *sta, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port); + u8 session_tracker_cmd(_adapter *adapter, u8 cmd, struct sta_info *sta, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) + { + struct cmd_priv *cmdpriv = &adapter->cmdpriv; +@@ -5087,6 +5096,7 @@ inline u8 session_tracker_del_cmd(_adapter *adapter, struct sta_info *sta, u8 *l + return session_tracker_cmd(adapter, ST_CMD_DEL, sta, local_naddr, local_port, remote_naddr, remote_port); + } + ++void session_tracker_chk_for_sta(_adapter *adapter, struct sta_info *sta); + void session_tracker_chk_for_sta(_adapter *adapter, struct sta_info *sta) + { + struct st_ctl_t *st_ctl = &sta->st_ctl; +@@ -5169,6 +5179,7 @@ void session_tracker_chk_for_sta(_adapter *adapter, struct sta_info *sta) + return; + } + ++void session_tracker_chk_for_adapter(_adapter *adapter); + void session_tracker_chk_for_adapter(_adapter *adapter) + { + struct sta_priv *stapriv = &adapter->stapriv; +@@ -5201,6 +5212,7 @@ void session_tracker_chk_for_adapter(_adapter *adapter) + #endif + } + ++void session_tracker_cmd_hdl(_adapter *adapter, struct st_cmd_parm *parm); + void session_tracker_cmd_hdl(_adapter *adapter, struct st_cmd_parm *parm) + { + u8 cmd = parm->cmd; +diff --git a/drivers/staging/rtl8812au/core/rtw_ieee80211.c b/drivers/staging/rtl8812au/core/rtw_ieee80211.c +index 01bf7ffb4..ddfe0b921 100644 +--- a/drivers/staging/rtl8812au/core/rtw_ieee80211.c ++++ b/drivers/staging/rtl8812au/core/rtw_ieee80211.c +@@ -672,6 +672,7 @@ int rtw_get_wpa2_cipher_suite(u8 *s) + return 0; + } + ++u32 rtw_get_akm_suite_bitmap(u8 *s); + u32 rtw_get_akm_suite_bitmap(u8 *s) + { + if (_rtw_memcmp(s, WLAN_AKM_8021X, RSN_SELECTOR_LEN) == _TRUE) +@@ -1666,6 +1667,7 @@ void dump_ht_cap_ie_content(void *sel, const u8 *buf, u32 buf_len) + , HT_SUP_MCS_SET_ARG(HT_CAP_ELE_SUP_MCS_SET(buf))); + } + ++void dump_ht_cap_ie(void *sel, const u8 *ie, u32 ie_len); + void dump_ht_cap_ie(void *sel, const u8 *ie, u32 ie_len) + { + const u8 *ht_cap_ie; +@@ -1685,6 +1687,7 @@ const char *const _ht_sc_offset_str[] = { + "SCB", + }; + ++void dump_ht_op_ie_content(void *sel, const u8 *buf, u32 buf_len); + void dump_ht_op_ie_content(void *sel, const u8 *buf, u32 buf_len) + { + if (buf_len != HT_OP_IE_LEN) { +@@ -1699,6 +1702,7 @@ void dump_ht_op_ie_content(void *sel, const u8 *buf, u32 buf_len) + ); + } + ++void dump_ht_op_ie(void *sel, const u8 *ie, u32 ie_len); + void dump_ht_op_ie(void *sel, const u8 *ie, u32 ie_len) + { + const u8 *ht_op_ie; +diff --git a/drivers/staging/rtl8812au/core/rtw_mi.c b/drivers/staging/rtl8812au/core/rtw_mi.c +index 2a9added7..409c9d2ca 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mi.c ++++ b/drivers/staging/rtl8812au/core/rtw_mi.c +@@ -883,6 +883,7 @@ void rtw_mi_buddy_xmit_tasklet_schedule(_adapter *padapter) + } + #endif + ++u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data); + u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data) + { + u32 passtime; +@@ -1342,6 +1343,7 @@ _adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port) + /*#define CONFIG_SKB_ALLOCATED*/ + #define DBG_SKB_PROCESS + #ifdef DBG_SKB_PROCESS ++void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe); + void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe) + { + _pkt *pkt_copy, *pkt_org; +diff --git a/drivers/staging/rtl8812au/core/rtw_mlme.c b/drivers/staging/rtl8812au/core/rtw_mlme.c +index 573358826..daeb92407 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mlme.c ++++ b/drivers/staging/rtl8812au/core/rtw_mlme.c +@@ -20,6 +20,7 @@ extern void indicate_wx_scan_complete_event(_adapter *padapter); + extern u8 rtw_do_join(_adapter *padapter); + + ++void rtw_init_mlme_timer(_adapter *padapter); + void rtw_init_mlme_timer(_adapter *padapter) + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +@@ -37,6 +38,7 @@ void rtw_init_mlme_timer(_adapter *padapter) + #endif + } + ++sint _rtw_init_mlme_priv(_adapter *padapter); + sint _rtw_init_mlme_priv(_adapter *padapter) + { + sint i; +@@ -295,6 +297,7 @@ int rtw_mlme_update_wfd_ie_data(struct mlme_priv *mlme, u8 type, u8 *ie, u32 ie_ + } + #endif /* defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) */ + ++void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); + void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) + { + _adapter *adapter = mlme_to_adapter(pmlmepriv); +@@ -314,6 +317,7 @@ void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) + return; + } + ++sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); + sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) + { + _irqL irqL; +@@ -1633,6 +1637,7 @@ static void free_scanqueue(struct mlme_priv *pmlmepriv) + + } + ++void rtw_reset_rx_info(_adapter *adapter); + void rtw_reset_rx_info(_adapter *adapter) + { + struct recv_priv *precvpriv = &adapter->recvpriv; +diff --git a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +index 527e06dd5..0d79cde59 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c ++++ b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +@@ -1106,6 +1106,7 @@ static void init_mlme_ext_priv_value(_adapter *padapter) + #endif /* ROKU_PRIVATE */ + } + ++void init_mlme_ext_timer(_adapter *padapter); + void init_mlme_ext_timer(_adapter *padapter) + { + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; +@@ -1380,6 +1381,7 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) + } + + #ifdef CONFIG_P2P ++u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da); + u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) + { + bool response = _TRUE; +@@ -3081,7 +3083,8 @@ unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame) + return _SUCCESS; + } + +-unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, u8 *ies, uint ies_len) ++unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, u8 *ies, uint ies_len); ++unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, u8 *ies, uint ies_len) + { + unsigned int ret = _FAIL; + struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv; +@@ -4134,6 +4137,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8 *raddr) + } + + ++void issue_p2p_GO_response(_adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result); + void issue_p2p_GO_response(_adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result) + { + struct p2p_channels *ch_list = &(adapter_to_rfctl(padapter)->channel_list); +@@ -4556,6 +4560,7 @@ void issue_p2p_GO_response(_adapter *padapter, u8 *raddr, u8 *frame_body, uint l + + } + ++void issue_p2p_GO_confirm(_adapter *padapter, u8 *raddr, u8 result); + void issue_p2p_GO_confirm(_adapter *padapter, u8 *raddr, u8 result) + { + +@@ -5434,6 +5439,7 @@ void issue_p2p_provision_request(_adapter *padapter, u8 *pssid, u8 ussidlen, u8 + } + + ++u8 is_matched_in_profilelist(u8 *peermacaddr, struct profile_info *profileinfo); + u8 is_matched_in_profilelist(u8 *peermacaddr, struct profile_info *profileinfo) + { + u8 i, match_result = 0; +@@ -5786,6 +5792,7 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) + + } + ++int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack); + int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) + { + int ret = _FAIL; +@@ -6163,6 +6170,7 @@ int issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms) + + #endif /* CONFIG_P2P */ + ++s32 rtw_action_public_decache(union recv_frame *rframe, u8 token_offset); + s32 rtw_action_public_decache(union recv_frame *rframe, u8 token_offset) + { + _adapter *adapter = rframe->u.hdr.adapter; +@@ -6188,7 +6196,8 @@ s32 rtw_action_public_decache(union recv_frame *rframe, u8 token_offset) + return _SUCCESS; + } + +-unsigned int on_action_public_p2p(union recv_frame *precv_frame) ++unsigned int on_action_public_p2p(union recv_frame *precv_frame); ++unsigned int on_action_public_p2p(union recv_frame *precv_frame) + { + _adapter *padapter = precv_frame->u.hdr.adapter; + u8 *pframe = precv_frame->u.hdr.rx_data; +@@ -6564,6 +6573,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) + return _SUCCESS; + } + ++unsigned int on_action_public_vendor(union recv_frame *precv_frame); + unsigned int on_action_public_vendor(union recv_frame *precv_frame) + { + unsigned int ret = _FAIL; +@@ -6594,6 +6604,7 @@ unsigned int on_action_public_vendor(union recv_frame *precv_frame) + return ret; + } + ++unsigned int on_action_public_default(union recv_frame *precv_frame, u8 action); + unsigned int on_action_public_default(union recv_frame *precv_frame, u8 action) + { + unsigned int ret = _FAIL; +@@ -7462,6 +7473,7 @@ unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame) + return _SUCCESS; + } + ++struct xmit_frame *_alloc_mgtxmitframe(struct xmit_priv *pxmitpriv, bool once); + struct xmit_frame *_alloc_mgtxmitframe(struct xmit_priv *pxmitpriv, bool once) + { + struct xmit_frame *pmgntframe; +@@ -7762,6 +7774,7 @@ s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntfram + } + + ++int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode); + int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode) + { + u8 *ssid_ie; +@@ -8399,6 +8412,7 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe + + } + ++int _issue_probereq(_adapter *padapter, const NDIS_802_11_SSID *pssid, const u8 *da, u8 ch, bool append_wps, int wait_ack); + int _issue_probereq(_adapter *padapter, const NDIS_802_11_SSID *pssid, const u8 *da, u8 ch, bool append_wps, int wait_ack) + { + int ret = _FAIL; +@@ -10560,6 +10574,7 @@ void issue_action_BSSCoexistPacket(_adapter *padapter) + } + + /* Spatial Multiplexing Powersave (SMPS) action frame */ ++int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoPsMode , u8 wait_ack); + int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoPsMode , u8 wait_ack) + { + +@@ -12591,6 +12606,7 @@ When station does not receive any packet in MAX_CONTINUAL_NORXPACKET_COUNT*2 sec + recipient station will teardown the block ack by issuing DELBA frame. + + *********************************************************************/ ++void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer); + void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer) + { + int i = 0; +@@ -12629,6 +12645,7 @@ void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer) + } + } + ++u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta); + u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta) + { + u8 ret = _FALSE; +@@ -12669,6 +12686,7 @@ u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta) + return ret; + } + ++u8 chk_adhoc_peer_is_alive(struct sta_info *psta); + u8 chk_adhoc_peer_is_alive(struct sta_info *psta) + { + u8 ret = _TRUE; +@@ -13210,6 +13228,7 @@ void addba_timer_hdl(void *ctx) + } + + #ifdef CONFIG_IEEE80211W ++void report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short reason); + void report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short reason) + { + struct cmd_obj *pcmd_obj; +@@ -13267,6 +13286,7 @@ void report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short re + return; + } + ++void clnt_sa_query_timeout(_adapter *padapter); + void clnt_sa_query_timeout(_adapter *padapter) + { + struct mlme_ext_priv *mlmeext = &(padapter->mlmeextpriv); +@@ -14253,6 +14273,7 @@ static bool scan_abort_hdl(_adapter *adapter) + return ret; + } + ++u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num); + u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num) + { + /* interval larger than this is treated as backgroud scan */ +@@ -14357,6 +14378,7 @@ u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_nu + } + + #ifdef CONFIG_SCAN_BACKOP ++u8 rtw_scan_backop_decision(_adapter *adapter); + u8 rtw_scan_backop_decision(_adapter *adapter) + { + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; +@@ -14772,6 +14794,7 @@ void site_survey(_adapter *padapter, u8 survey_channel, RT_SCAN_TYPE ScanType) + return; + } + ++void survey_done_set_ch_bw(_adapter *padapter); + void survey_done_set_ch_bw(_adapter *padapter) + { + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; +@@ -14842,6 +14865,7 @@ void survey_done_set_ch_bw(_adapter *padapter) + * + * Returns: 0: no ps announcement is doing. 1: ps announcement is doing + */ ++u8 rtw_ps_annc(_adapter *adapter, bool ps); + u8 rtw_ps_annc(_adapter *adapter, bool ps) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -14931,6 +14955,7 @@ void rtw_back_opch(_adapter *adapter) + _exit_critical_mutex(&rfctl->offch_mutex, NULL); + } + ++void sitesurvey_set_igi(_adapter *adapter); + void sitesurvey_set_igi(_adapter *adapter) + { + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; +@@ -14991,6 +15016,7 @@ void sitesurvey_set_igi(_adapter *adapter) + break; + } + } ++void sitesurvey_set_msr(_adapter *adapter, bool enter); + void sitesurvey_set_msr(_adapter *adapter, bool enter) + { + u8 network_type; +diff --git a/drivers/staging/rtl8812au/core/rtw_mp.c b/drivers/staging/rtl8812au/core/rtw_mp.c +index bb7f78a4c..8d4966e32 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mp.c ++++ b/drivers/staging/rtl8812au/core/rtw_mp.c +@@ -362,6 +362,7 @@ static VOID PHY_SetRFPathSwitch_default( + } + #endif + ++void mpt_InitHWConfig(PADAPTER Adapter); + void mpt_InitHWConfig(PADAPTER Adapter) + { + PHAL_DATA_TYPE hal; +@@ -1187,6 +1188,7 @@ int SetTxPower(PADAPTER pAdapter) + return _TRUE; + } + ++void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset); + void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) + { + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC; +@@ -1483,6 +1485,7 @@ void fill_tx_desc_8188e(PADAPTER padapter) + #endif + + #if defined(CONFIG_RTL8814A) ++void fill_tx_desc_8814a(PADAPTER padapter); + void fill_tx_desc_8814a(PADAPTER padapter) + { + struct mp_priv *pmp_priv = &padapter->mppriv; +@@ -1541,6 +1544,7 @@ void fill_tx_desc_8814a(PADAPTER padapter) + #endif + + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) ++void fill_tx_desc_8812a(PADAPTER padapter); + void fill_tx_desc_8812a(PADAPTER padapter) + { + struct mp_priv *pmp_priv = &padapter->mppriv; +diff --git a/drivers/staging/rtl8812au/core/rtw_odm.c b/drivers/staging/rtl8812au/core/rtw_odm.c +index 4e1151d51..336dd9236 100644 +--- a/drivers/staging/rtl8812au/core/rtw_odm.c ++++ b/drivers/staging/rtl8812au/core/rtw_odm.c +@@ -64,6 +64,7 @@ void rtw_odm_init_ic_type(_adapter *adapter) + odm_cmn_info_init(odm, ODM_CMNINFO_IC_TYPE, ic_type); + } + ++void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter); + void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter) + { + RTW_PRINT_SEL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n"); +@@ -72,6 +73,7 @@ void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter) + #define RTW_ADAPTIVITY_EN_DISABLE 0 + #define RTW_ADAPTIVITY_EN_ENABLE 1 + ++void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter); + void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter) + { + struct registry_priv *regsty = &adapter->registrypriv; +@@ -89,6 +91,7 @@ void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter) + #define RTW_ADAPTIVITY_MODE_NORMAL 0 + #define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1 + ++void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter); + void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter) + { + struct registry_priv *regsty = &adapter->registrypriv; +diff --git a/drivers/staging/rtl8812au/core/rtw_p2p.c b/drivers/staging/rtl8812au/core/rtw_p2p.c +index f66fa7155..167dd067f 100644 +--- a/drivers/staging/rtl8812au/core/rtw_p2p.c ++++ b/drivers/staging/rtl8812au/core/rtw_p2p.c +@@ -18,6 +18,7 @@ + + #ifdef CONFIG_P2P + ++int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8 *ch_list, u8 ch_cnt); + int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8 *ch_list, u8 ch_cnt) + { + int found = 0, i = 0; +@@ -31,6 +32,7 @@ int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8 *ch_list, u8 ch_cnt) + return found ; + } + ++int is_any_client_associated(_adapter *padapter); + int is_any_client_associated(_adapter *padapter) + { + return padapter->stapriv.asoc_list_cnt ? _TRUE : _FALSE; +@@ -2551,6 +2553,7 @@ u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) + return _TRUE; + } + ++u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list); + u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list) + { + u8 i = 0, j = 0; +@@ -2573,6 +2576,7 @@ u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 + return ch_no; + } + ++u8 rtw_p2p_ch_inclusion(_adapter *adapter, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned); + u8 rtw_p2p_ch_inclusion(_adapter *adapter, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned) + { + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); +@@ -3068,6 +3072,7 @@ u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le + return _TRUE; + } + ++void find_phase_handler(_adapter *padapter); + void find_phase_handler(_adapter *padapter) + { + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +@@ -3093,6 +3098,7 @@ void find_phase_handler(_adapter *padapter) + + void p2p_concurrent_handler(_adapter *padapter); + ++void restore_p2p_state_handler(_adapter *padapter); + void restore_p2p_state_handler(_adapter *padapter) + { + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +@@ -3126,6 +3132,7 @@ void restore_p2p_state_handler(_adapter *padapter) + } + } + ++void pre_tx_invitereq_handler(_adapter *padapter); + void pre_tx_invitereq_handler(_adapter *padapter) + { + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +@@ -3138,6 +3145,7 @@ void pre_tx_invitereq_handler(_adapter *padapter) + + } + ++void pre_tx_provdisc_handler(_adapter *padapter); + void pre_tx_provdisc_handler(_adapter *padapter) + { + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +@@ -3150,6 +3158,7 @@ void pre_tx_provdisc_handler(_adapter *padapter) + + } + ++void pre_tx_negoreq_handler(_adapter *padapter); + void pre_tx_negoreq_handler(_adapter *padapter) + { + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +@@ -3737,6 +3746,7 @@ static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *fram + #endif + + #ifdef CONFIG_WFD ++u32 rtw_xframe_build_wfd_ie(struct xmit_frame *xframe); + u32 rtw_xframe_build_wfd_ie(struct xmit_frame *xframe) + { + _adapter *adapter = xframe->padapter; +@@ -3815,6 +3825,7 @@ u32 rtw_xframe_build_wfd_ie(struct xmit_frame *xframe) + } + #endif /* CONFIG_WFD */ + ++bool rtw_xframe_del_wfd_ie(struct xmit_frame *xframe); + bool rtw_xframe_del_wfd_ie(struct xmit_frame *xframe) + { + #define DBG_XFRAME_DEL_WFD_IE 0 +@@ -3939,6 +3950,7 @@ u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) + /* + * return _TRUE if requester is GO, _FALSE if responder is GO + */ ++bool rtw_p2p_nego_intent_compare(u8 req, u8 resp); + bool rtw_p2p_nego_intent_compare(u8 req, u8 resp) + { + if (req >> 1 == resp >> 1) +diff --git a/drivers/staging/rtl8812au/core/rtw_pwrctrl.c b/drivers/staging/rtl8812au/core/rtw_pwrctrl.c +index 34e10dc0a..44d702868 100644 +--- a/drivers/staging/rtl8812au/core/rtw_pwrctrl.c ++++ b/drivers/staging/rtl8812au/core/rtw_pwrctrl.c +@@ -194,6 +194,7 @@ int ips_leave(_adapter *padapter) + int rtw_hw_resume(_adapter *padapter); + #endif + ++bool rtw_pwr_unassociated_idle(_adapter *adapter); + bool rtw_pwr_unassociated_idle(_adapter *adapter) + { + u8 i; +@@ -400,6 +401,7 @@ void rtw_ps_processor(_adapter *padapter) + return; + } + ++void pwr_state_check_handler(void *ctx); + void pwr_state_check_handler(void *ctx) + { + _adapter *padapter = (_adapter *)ctx; +diff --git a/drivers/staging/rtl8812au/core/rtw_recv.c b/drivers/staging/rtl8812au/core/rtw_recv.c +index 3c180740b..ed2bf605c 100644 +--- a/drivers/staging/rtl8812au/core/rtw_recv.c ++++ b/drivers/staging/rtl8812au/core/rtw_recv.c +@@ -851,6 +851,7 @@ sint recv_bcast_pn_decache(union recv_frame *precv_frame) + return _SUCCESS; + } + ++sint recv_decache(union recv_frame *precv_frame); + sint recv_decache(union recv_frame *precv_frame) + { + struct sta_info *psta = precv_frame->u.hdr.psta; +@@ -906,6 +907,7 @@ sint recv_decache(union recv_frame *precv_frame) + return _SUCCESS; + } + ++void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *psta); + void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *psta) + { + #ifdef CONFIG_AP_MODE +@@ -934,6 +936,7 @@ void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame, stru + #endif + } + ++void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *psta); + void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *psta) + { + #ifdef CONFIG_AP_MODE +@@ -1167,6 +1170,11 @@ void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_in + + } + ++sint sta2sta_data_frame( ++ _adapter *adapter, ++ union recv_frame *precv_frame, ++ struct sta_info **psta ++); + sint sta2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, +@@ -1346,6 +1354,10 @@ sint sta2sta_data_frame( + + } + ++sint ap2sta_data_frame( ++ _adapter *adapter, ++ union recv_frame *precv_frame, ++ struct sta_info **psta); + sint ap2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, +@@ -1486,6 +1498,10 @@ sint ap2sta_data_frame( + + } + ++sint sta2ap_data_frame( ++ _adapter *adapter, ++ union recv_frame *precv_frame, ++ struct sta_info **psta); + sint sta2ap_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, +@@ -1960,6 +1976,7 @@ static sint validate_mgmt_protect(_adapter *adapter, union recv_frame *precv_fra + + union recv_frame *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame); + ++sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame); + sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) + { + struct sta_info *psta = precv_frame->u.hdr.psta +@@ -2051,6 +2068,7 @@ sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) + + } + ++sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame); + sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame) + { + u8 bretry, a4_shift; +@@ -2408,6 +2426,7 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) + + /* remove the wlanhdr and add the eth_hdr */ + #if 1 ++sint wlanhdr_to_ethhdr(union recv_frame *precvframe); + sint wlanhdr_to_ethhdr(union recv_frame *precvframe) + { + sint rmv_len; +@@ -3013,6 +3032,7 @@ static void recv_fwd_pkt_hdl(_adapter *adapter, _pkt *pkt + } + #endif /* CONFIG_RTW_MESH */ + ++int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe); + int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) + { + struct rx_pkt_attrib *rattrib = &prframe->u.hdr.attrib; +@@ -3649,6 +3669,7 @@ static void recv_set_iseq_after_mpdu_process(union recv_frame *rframe, u16 seq_n + } + + #ifdef CONFIG_MP_INCLUDED ++int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame); + int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame) + { + int ret = _SUCCESS; +@@ -3785,6 +3806,7 @@ static sint MPwlanhdr_to_ethhdr(union recv_frame *precvframe) + } + + ++int mp_recv_frame(_adapter *padapter, union recv_frame *rframe); + int mp_recv_frame(_adapter *padapter, union recv_frame *rframe) + { + int ret = _SUCCESS; +@@ -4290,6 +4312,7 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, + + } + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)) ++int recv_frame_monitor(_adapter *padapter, union recv_frame *rframe); + int recv_frame_monitor(_adapter *padapter, union recv_frame *rframe) + { + int ret = _SUCCESS; +@@ -4336,6 +4359,7 @@ int recv_frame_monitor(_adapter *padapter, union recv_frame *rframe) + return ret; + } + #endif ++int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe); + int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) + { + int ret = _SUCCESS; +@@ -4373,6 +4397,7 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) + } + + /*#define DBG_RX_BMC_FRAME*/ ++int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe); + int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) + { + int ret = _SUCCESS; +@@ -4481,6 +4506,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) + return ret; + } + ++int recv_func(_adapter *padapter, union recv_frame *rframe); + int recv_func(_adapter *padapter, union recv_frame *rframe) + { + int ret; +@@ -4794,6 +4820,7 @@ static void rx_process_link_qual(_adapter *padapter, union recv_frame *prframe) + #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ + } + ++void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe); + void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe) + { + /* Check RSSI */ +diff --git a/drivers/staging/rtl8812au/core/rtw_rf.c b/drivers/staging/rtl8812au/core/rtw_rf.c +index 6d827c364..eb884c3ce 100644 +--- a/drivers/staging/rtl8812au/core/rtw_rf.c ++++ b/drivers/staging/rtl8812au/core/rtw_rf.c +@@ -588,6 +588,7 @@ const char *const _regd_str[] = { + }; + + #if CONFIG_TXPWR_LIMIT ++void _dump_regd_exc_list(void *sel, struct rf_ctl_t *rfctl); + void _dump_regd_exc_list(void *sel, struct rf_ctl_t *rfctl) + { + struct regd_exc_ent *ent; +@@ -1219,6 +1220,7 @@ int rtw_ch_to_bb_gain_sel(int ch) + return sel; + } + ++s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch); + s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) + { + s8 kfree_offset = 0; +diff --git a/drivers/staging/rtl8812au/core/rtw_sreset.c b/drivers/staging/rtl8812au/core/rtw_sreset.c +index 03dba20f3..d3d4447b3 100644 +--- a/drivers/staging/rtl8812au/core/rtw_sreset.c ++++ b/drivers/staging/rtl8812au/core/rtw_sreset.c +@@ -101,6 +101,7 @@ bool sreset_inprogress(_adapter *padapter) + #endif + } + ++void sreset_restore_security_station(_adapter *padapter); + void sreset_restore_security_station(_adapter *padapter) + { + struct mlme_priv *mlmepriv = &padapter->mlmepriv; +@@ -137,6 +138,7 @@ void sreset_restore_security_station(_adapter *padapter) + } + } + ++void sreset_restore_network_station(_adapter *padapter); + void sreset_restore_network_station(_adapter *padapter) + { + struct mlme_priv *mlmepriv = &padapter->mlmepriv; +@@ -195,6 +197,7 @@ void sreset_restore_network_station(_adapter *padapter) + } + + ++void sreset_restore_network_status(_adapter *padapter); + void sreset_restore_network_status(_adapter *padapter) + { + struct mlme_priv *mlmepriv = &padapter->mlmepriv; +diff --git a/drivers/staging/rtl8812au/core/rtw_sta_mgt.c b/drivers/staging/rtl8812au/core/rtw_sta_mgt.c +index ddcd1f70b..b42102142 100644 +--- a/drivers/staging/rtl8812au/core/rtw_sta_mgt.c ++++ b/drivers/staging/rtl8812au/core/rtw_sta_mgt.c +@@ -16,6 +16,7 @@ + + #include + ++bool test_st_match_rule(_adapter *adapter, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port); + bool test_st_match_rule(_adapter *adapter, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) + { + if (ntohs(*((u16 *)local_port)) == 5001 || ntohs(*((u16 *)remote_port)) == 5001) +@@ -365,6 +366,7 @@ static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv) + + } + ++void rtw_mfree_stainfo(struct sta_info *psta); + void rtw_mfree_stainfo(struct sta_info *psta) + { + +@@ -376,6 +378,7 @@ void rtw_mfree_stainfo(struct sta_info *psta) + } + + /* this function is used to free the memory of lock || sema for all stainfos */ ++void rtw_mfree_all_stainfo(struct sta_priv *pstapriv); + void rtw_mfree_all_stainfo(struct sta_priv *pstapriv) + { + _irqL irqL; +@@ -1044,6 +1047,7 @@ const char *const _acl_mode_str[RTW_ACL_MODE_MAX] = { + "DENY_UNLESS_LISTED", + }; + ++u8 _rtw_access_ctrl(_adapter *adapter, u8 period, const u8 *mac_addr); + u8 _rtw_access_ctrl(_adapter *adapter, u8 period, const u8 *mac_addr) + { + u8 res = _TRUE; +diff --git a/drivers/staging/rtl8812au/core/rtw_vht.c b/drivers/staging/rtl8812au/core/rtw_vht.c +index 9a7608c8e..382813830 100644 +--- a/drivers/staging/rtl8812au/core/rtw_vht.c ++++ b/drivers/staging/rtl8812au/core/rtw_vht.c +@@ -39,6 +39,7 @@ const char *const _vht_sup_ch_width_set_str[] = { + "BW-RSVD", + }; + ++void dump_vht_cap_ie_content(void *sel, const u8 *buf, u32 buf_len); + void dump_vht_cap_ie_content(void *sel, const u8 *buf, u32 buf_len) + { + if (buf_len != VHT_CAP_IE_LEN) { +@@ -79,6 +80,7 @@ const char *const _vht_op_ch_width_str[] = { + "BW-RSVD", + }; + ++void dump_vht_op_ie_content(void *sel, const u8 *buf, u32 buf_len); + void dump_vht_op_ie_content(void *sel, const u8 *buf, u32 buf_len) + { + if (buf_len != VHT_OP_IE_LEN) { +@@ -359,6 +361,7 @@ u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss) + } + + #ifdef CONFIG_BEAMFORMING ++void update_sta_vht_info_apmode_bf_cap(_adapter *padapter, struct sta_info *psta); + void update_sta_vht_info_apmode_bf_cap(_adapter *padapter, struct sta_info *psta) + { + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); +diff --git a/drivers/staging/rtl8812au/core/rtw_wlan_util.c b/drivers/staging/rtl8812au/core/rtw_wlan_util.c +index 817245957..a427c7c51 100644 +--- a/drivers/staging/rtl8812au/core/rtw_wlan_util.c ++++ b/drivers/staging/rtl8812au/core/rtw_wlan_util.c +@@ -1011,6 +1011,7 @@ inline bool rtw_sec_camid_is_drv_forbid(struct cam_ctl_t *cam_ctl, u8 id) + return 1; + } + ++bool _rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id); + bool _rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id) + { + bool ret = _FALSE; +@@ -1099,6 +1100,7 @@ inline bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id) + return ret; + } + ++bool cam_cache_chk(_adapter *adapter, u8 id, u8 *addr, s16 kid, s8 gk); + bool cam_cache_chk(_adapter *adapter, u8 id, u8 *addr, s16 kid, s8 gk) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -1117,6 +1119,7 @@ bool cam_cache_chk(_adapter *adapter, u8 id, u8 *addr, s16 kid, s8 gk) + return ret; + } + ++s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk); + s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -1157,6 +1160,7 @@ s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk) + return cam_id; + } + ++s16 rtw_get_camid(_adapter *adapter, u8 *addr, s16 kid, u8 gk); + s16 rtw_get_camid(_adapter *adapter, u8 *addr, s16 kid, u8 gk) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -1276,6 +1280,7 @@ s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, u8 gk, bool + return cam_id; + } + ++void rtw_camid_set(_adapter *adapter, u8 cam_id); + void rtw_camid_set(_adapter *adapter, u8 cam_id) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -1359,6 +1364,7 @@ inline void rtw_sec_cam_swap(_adapter *adapter, u8 cam_id_a, u8 cam_id_b) + } + } + ++s16 rtw_get_empty_cam_entry(_adapter *adapter, u8 start_camid); + s16 rtw_get_empty_cam_entry(_adapter *adapter, u8 start_camid) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -2232,6 +2238,7 @@ void update_ldpc_stbc_cap(struct sta_info *psta) + #endif /* CONFIG_80211N_HT */ + } + ++int check_ielen(u8 *start, uint len); + int check_ielen(u8 *start, uint len) + { + int left = len; +diff --git a/drivers/staging/rtl8812au/core/rtw_xmit.c b/drivers/staging/rtl8812au/core/rtw_xmit.c +index 8504dba09..0b97e5099 100644 +--- a/drivers/staging/rtl8812au/core/rtw_xmit.c ++++ b/drivers/staging/rtl8812au/core/rtw_xmit.c +@@ -56,6 +56,7 @@ void rtw_init_xmit_block(_adapter *padapter) + dvobj->xmit_block = XMIT_BLOCK_NONE; + + } ++void rtw_free_xmit_block(_adapter *padapter); + void rtw_free_xmit_block(_adapter *padapter) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); +@@ -505,6 +506,7 @@ void rtw_get_adapter_tx_rate_bmp_by_bw(_adapter *adapter, u8 bw, u16 *r_bmp_cck_ + *r_bmp_vht = bmp_vht; + } + ++void rtw_get_shared_macid_tx_rate_bmp_by_bw(struct dvobj_priv *dvobj, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht); + void rtw_get_shared_macid_tx_rate_bmp_by_bw(struct dvobj_priv *dvobj, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht) + { + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); +@@ -3476,6 +3478,7 @@ s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) + return _SUCCESS; + } + ++void rtw_init_xmitframe(struct xmit_frame *pxframe); + void rtw_init_xmitframe(struct xmit_frame *pxframe) + { + if (pxframe != NULL) { /* default value setting */ +@@ -4146,6 +4149,7 @@ void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry) + } + + #ifdef CONFIG_BR_EXT ++int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb); + int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb) + { + struct sk_buff *skb = *pskb; +@@ -6040,6 +6044,7 @@ int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg) + return ret; + } + ++bool rtw_sctx_chk_waring_status(int status); + bool rtw_sctx_chk_waring_status(int status) + { + switch (status) { +diff --git a/drivers/staging/rtl8812au/hal/hal_com.c b/drivers/staging/rtl8812au/hal/hal_com.c +index b3b1e16c8..a230ea6e5 100644 +--- a/drivers/staging/rtl8812au/hal/hal_com.c ++++ b/drivers/staging/rtl8812au/hal/hal_com.c +@@ -2021,6 +2021,7 @@ void rtw_hal_update_sta_wset(_adapter *adapter, struct sta_info *psta) + psta->cmn.support_wireless_set = w_set; + } + ++void rtw_hal_update_sta_mimo_type(_adapter *adapter, struct sta_info *psta); + void rtw_hal_update_sta_mimo_type(_adapter *adapter, struct sta_info *psta) + { + s8 tx_nss, rx_nss; +@@ -2054,6 +2055,7 @@ void rtw_hal_update_sta_mimo_type(_adapter *adapter, struct sta_info *psta) + psta->cmn.mac_id, tx_nss, rx_nss); + } + ++void rtw_hal_update_sta_smps_cap(_adapter *adapter, struct sta_info *psta); + void rtw_hal_update_sta_smps_cap(_adapter *adapter, struct sta_info *psta) + { + /*Spatial Multiplexing Power Save*/ +@@ -2092,6 +2094,7 @@ u8 rtw_get_mgntframe_raid(_adapter *adapter, unsigned char network_type) + return raid; + } + ++void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta); + void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta) + { + struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); +@@ -4392,6 +4395,7 @@ inline s32 rtw_hal_set_FwMediaStatusRpt_range_cmd(_adapter *adapter, bool opmode + return rtw_hal_set_FwMediaStatusRpt_cmd(adapter, opmode, miracast, miracast_sink, role, macid, 1, macid_end); + } + ++void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc); + void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) + { + struct hal_ops *pHalFunc = &padapter->hal_func; +@@ -4536,6 +4540,7 @@ void rtw_hal_set_input_gpio(_adapter *padapter, u8 index) + + #endif + ++void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc); + void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) + { + struct hal_ops *pHalFunc = &padapter->hal_func; +@@ -7669,6 +7674,8 @@ void rtw_hal_construct_NullFunctionData( + *pLength = pktlen; + } + ++void rtw_hal_construct_ProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, ++ BOOLEAN bHideSSID); + void rtw_hal_construct_ProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, + BOOLEAN bHideSSID) + { +@@ -11502,6 +11509,7 @@ s32 rtw_hal_set_wifi_btc_port_id_cmd(_adapter *adapter) + #endif + + #define LPS_ACTIVE_TIMEOUT 50 /*number of times*/ ++void rtw_lps_state_chk(_adapter *adapter, u8 ps_mode); + void rtw_lps_state_chk(_adapter *adapter, u8 ps_mode) + { + if (ps_mode == PS_MODE_ACTIVE) { +@@ -11973,6 +11981,7 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value) + } + + #ifdef CONFIG_BEAMFORMING ++u8 rtw_hal_query_txbfer_rf_num(_adapter *adapter); + u8 rtw_hal_query_txbfer_rf_num(_adapter *adapter) + { + struct registry_priv *pregistrypriv = &adapter->registrypriv; +@@ -11998,6 +12007,7 @@ u8 rtw_hal_query_txbfer_rf_num(_adapter *adapter) + return 1; + + } ++u8 rtw_hal_query_txbfee_rf_num(_adapter *adapter); + u8 rtw_hal_query_txbfee_rf_num(_adapter *adapter) + { + struct registry_priv *pregistrypriv = &adapter->registrypriv; +@@ -13001,6 +13011,7 @@ bool kfree_data_is_bb_gain_empty(struct kfree_data_t *data) + } + + #ifdef CONFIG_USB_RX_AGGREGATION ++void rtw_set_usb_agg_by_mode_normal(_adapter *padapter, u8 cur_wireless_mode); + void rtw_set_usb_agg_by_mode_normal(_adapter *padapter, u8 cur_wireless_mode) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +@@ -13069,6 +13080,7 @@ void rtw_set_usb_agg_by_mode_normal(_adapter *padapter, u8 cur_wireless_mode) + } + } + ++void rtw_set_usb_agg_by_mode_customer(_adapter *padapter, u8 cur_wireless_mode, u8 UsbDmaSize, u8 Legacy_UsbDmaSize); + void rtw_set_usb_agg_by_mode_customer(_adapter *padapter, u8 cur_wireless_mode, u8 UsbDmaSize, u8 Legacy_UsbDmaSize) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +@@ -13096,6 +13108,7 @@ void rtw_set_usb_agg_by_mode_customer(_adapter *padapter, u8 cur_wireless_mode, + } + } + ++void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode); + void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode) + { + #ifdef CONFIG_PLATFORM_NOVATEK_NT72668 +@@ -14391,6 +14404,7 @@ void rtw_dump_phy_cap_by_phydmapi(void *sel, _adapter *adapter) + #endif + } + #else ++void rtw_dump_phy_cap_by_hal(void *sel, _adapter *adapter); + void rtw_dump_phy_cap_by_hal(void *sel, _adapter *adapter) + { + u8 phy_cap = _FALSE; +diff --git a/drivers/staging/rtl8812au/hal/hal_com_phycfg.c b/drivers/staging/rtl8812au/hal/hal_com_phycfg.c +index ada38b221..5ca3b824e 100644 +--- a/drivers/staging/rtl8812au/hal/hal_com_phycfg.c ++++ b/drivers/staging/rtl8812au/hal/hal_com_phycfg.c +@@ -610,6 +610,13 @@ static inline void hal_init_pg_txpwr_info_5g(_adapter *adapter, TxPowerInfo5G *p + #define LOAD_PG_TXPWR_WARN_COND(_txpwr_src) (_txpwr_src > PG_TXPWR_SRC_PG_DATA) + #endif + ++u16 hal_load_pg_txpwr_info_path_2g( ++ _adapter *adapter, ++ TxPowerInfo24G *pwr_info, ++ u32 path, ++ u8 txpwr_src, ++ const struct map_t *txpwr_map, ++ u16 pg_offset); + u16 hal_load_pg_txpwr_info_path_2g( + _adapter *adapter, + TxPowerInfo24G *pwr_info, +@@ -738,6 +745,13 @@ u16 hal_load_pg_txpwr_info_path_2g( + return offset; + } + ++u16 hal_load_pg_txpwr_info_path_5g( ++ _adapter *adapter, ++ TxPowerInfo5G *pwr_info, ++ u32 path, ++ u8 txpwr_src, ++ const struct map_t *txpwr_map, ++ u16 pg_offset); + u16 hal_load_pg_txpwr_info_path_5g( + _adapter *adapter, + TxPowerInfo5G *pwr_info, +@@ -897,6 +911,13 @@ u16 hal_load_pg_txpwr_info_path_5g( + return offset; + } + ++void hal_load_pg_txpwr_info( ++ _adapter *adapter, ++ TxPowerInfo24G *pwr_info_2g, ++ TxPowerInfo5G *pwr_info_5g, ++ u8 *pg_data, ++ BOOLEAN AutoLoadFail ++); + void hal_load_pg_txpwr_info( + _adapter *adapter, + TxPowerInfo24G *pwr_info_2g, +@@ -1317,6 +1338,12 @@ void dump_hal_txpwr_info_5g(void *sel, _adapter *adapter, u8 rfpath_num, u8 max_ + * + * Return dBm or -1 for undefined + */ ++s8 rtw_regsty_get_target_tx_power( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN u8 RfPath, ++ IN RATE_SECTION RateSection ++); + s8 rtw_regsty_get_target_tx_power( + IN PADAPTER Adapter, + IN u8 Band, +@@ -1361,6 +1388,7 @@ s8 rtw_regsty_get_target_tx_power( + return value; + } + ++bool rtw_regsty_chk_target_tx_power_valid(_adapter *adapter); + bool rtw_regsty_chk_target_tx_power_valid(_adapter *adapter) + { + struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); +@@ -1441,6 +1469,14 @@ PHY_GetTxPowerByRateBase( + return value; + } + ++VOID ++phy_SetTxPowerByRateBase( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN u8 RfPath, ++ IN RATE_SECTION RateSection, ++ IN u8 Value ++); + VOID + phy_SetTxPowerByRateBase( + IN PADAPTER Adapter, +@@ -1558,6 +1594,10 @@ static void phy_txpwr_by_rate_chk_for_path_dup(_adapter *adapter) + } + } + ++VOID ++phy_StoreTxPowerByRateBase( ++ IN PADAPTER pAdapter ++); + VOID + phy_StoreTxPowerByRateBase( + IN PADAPTER pAdapter +@@ -1964,6 +2004,15 @@ PHY_GetRateValuesOfTxPowerByRate( + }; + } + ++void ++PHY_StoreTxPowerByRateNew( ++ IN PADAPTER pAdapter, ++ IN u32 Band, ++ IN u32 RfPath, ++ IN u32 RegAddr, ++ IN u32 BitMask, ++ IN u32 Data ++); + void + PHY_StoreTxPowerByRateNew( + IN PADAPTER pAdapter, +@@ -2032,6 +2081,10 @@ phy_store_tx_power_by_rate( + + } + ++VOID ++phy_ConvertTxPowerByRateInDbmToRelativeValues( ++ IN PADAPTER pAdapter ++); + VOID + phy_ConvertTxPowerByRateInDbmToRelativeValues( + IN PADAPTER pAdapter +@@ -2162,6 +2215,11 @@ phy_set_tx_power_index_by_rate_section( + return; + } + ++BOOLEAN ++phy_GetChnlIndex( ++ IN u8 Channel, ++ OUT u8 *ChannelIdx ++); + BOOLEAN + phy_GetChnlIndex( + IN u8 Channel, +@@ -3524,6 +3582,11 @@ static void phy_txpwr_lmt_post_hdl(_adapter *adapter) + _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); + } + ++BOOLEAN ++GetS1ByteIntegerFromStringInDecimal( ++ IN char *str, ++ IN OUT s8 *val ++); + BOOLEAN + GetS1ByteIntegerFromStringInDecimal( + IN char *str, +@@ -4243,6 +4306,11 @@ phy_ConfigBBWithParaFile( + return rtStatus; + } + ++VOID ++phy_DecryptBBPgParaFile( ++ PADAPTER Adapter, ++ char *buffer ++); + VOID + phy_DecryptBBPgParaFile( + PADAPTER Adapter, +@@ -4285,6 +4353,11 @@ phy_DecryptBBPgParaFile( + #define DBG_TXPWR_BY_RATE_FILE_PARSE 0 + #endif + ++int ++phy_ParseBBPgParaFile( ++ PADAPTER Adapter, ++ char *buffer ++); + int + phy_ParseBBPgParaFile( + PADAPTER Adapter, +@@ -4714,6 +4787,16 @@ PHY_ConfigRFWithParaFile( + return rtStatus; + } + ++VOID ++initDeltaSwingIndexTables( ++ PADAPTER Adapter, ++ char *Band, ++ char *Path, ++ char *Sign, ++ char *Channel, ++ char *Rate, ++ char *Data ++); + VOID + initDeltaSwingIndexTables( + PADAPTER Adapter, +diff --git a/drivers/staging/rtl8812au/hal/hal_dm.c b/drivers/staging/rtl8812au/hal/hal_dm.c +index 0df8f64eb..1236b51ad 100644 +--- a/drivers/staging/rtl8812au/hal/hal_dm.c ++++ b/drivers/staging/rtl8812au/hal/hal_dm.c +@@ -17,7 +17,8 @@ + #include + + /* A mapping from HalData to ODM. */ +-enum odm_board_type boardType(u8 InterfaceSel) ++enum odm_board_type boardType(u8 InterfaceSel); ++enum odm_board_type boardType(u8 InterfaceSel) + { + enum odm_board_type board = ODM_BOARD_DEFAULT; + +@@ -94,6 +95,7 @@ void rtw_phydm_iqk_trigger(_adapter *adapter) + } + #endif + ++void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment); + void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment) + { + struct dm_struct *p_dm_odm = adapter_to_phydm(adapter); +@@ -104,6 +106,7 @@ void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, boo + halrf_iqk_trigger(p_dm_odm, recovery); + #endif + } ++void rtw_phydm_lck_trigger(_adapter *adapter); + void rtw_phydm_lck_trigger(_adapter *adapter) + { + struct dm_struct *p_dm_odm = adapter_to_phydm(adapter); +@@ -162,6 +165,7 @@ void rtw_hal_update_param_init_fw_offload_cap(_adapter *adapter) + } + #endif + ++void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask); + void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask) + { + struct dm_struct *p_dm = (struct dm_struct *)p_dm_void; +@@ -285,6 +289,7 @@ void rtw_phydm_tdmadig(_adapter *adapter, u8 state) + } + } + #endif/*CONFIG_TDMADIG*/ ++void rtw_phydm_ops_func_init(struct dm_struct *p_phydm); + void rtw_phydm_ops_func_init(struct dm_struct *p_phydm) + { + struct ra_table *p_ra_t = &p_phydm->dm_ra_table; +diff --git a/drivers/staging/rtl8812au/hal/hal_intf.c b/drivers/staging/rtl8812au/hal/hal_intf.c +index 66a2954c5..de72c9612 100644 +--- a/drivers/staging/rtl8812au/hal/hal_intf.c ++++ b/drivers/staging/rtl8812au/hal/hal_intf.c +@@ -260,6 +260,7 @@ void rtw_hal_power_off(_adapter *padapter) + } + + ++void rtw_hal_init_opmode(_adapter *padapter); + void rtw_hal_init_opmode(_adapter *padapter) + { + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax; +@@ -639,6 +640,7 @@ void rtw_hal_free_recv_priv(_adapter *padapter) + padapter->hal_func.free_recv_priv(padapter); + } + ++void rtw_sta_ra_registed(_adapter *padapter, struct sta_info *psta); + void rtw_sta_ra_registed(_adapter *padapter, struct sta_info *psta) + { + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); +diff --git a/drivers/staging/rtl8812au/hal/hal_mp.c b/drivers/staging/rtl8812au/hal/hal_mp.c +index 7960556f2..2d2af16c8 100644 +--- a/drivers/staging/rtl8812au/hal/hal_mp.c ++++ b/drivers/staging/rtl8812au/hal/hal_mp.c +@@ -373,6 +373,7 @@ void hal_mpt_SetBandwidth(PADAPTER pAdapter) + + } + ++void mpt_SetTxPower_Old(PADAPTER pAdapter, MPT_TXPWR_DEF Rate, u8 *pTxPower); + void mpt_SetTxPower_Old(PADAPTER pAdapter, MPT_TXPWR_DEF Rate, u8 *pTxPower) + { + switch (Rate) { +@@ -431,6 +432,12 @@ void mpt_SetTxPower_Old(PADAPTER pAdapter, MPT_TXPWR_DEF Rate, u8 *pTxPower) + RTW_INFO("<===mpt_SetTxPower_Old()\n"); + } + ++void ++mpt_SetTxPower( ++ PADAPTER pAdapter, ++ MPT_TXPWR_DEF Rate, ++ pu1Byte pTxPower ++); + void + mpt_SetTxPower( + PADAPTER pAdapter, +@@ -603,6 +610,7 @@ void hal_mpt_SetDataRate(PADAPTER pAdapter) + #define RF_PATH_AB 22 + + #ifdef CONFIG_RTL8814A ++VOID mpt_ToggleIG_8814A(PADAPTER pAdapter); + VOID mpt_ToggleIG_8814A(PADAPTER pAdapter) + { + u1Byte Path = 0; +@@ -632,6 +640,7 @@ VOID mpt_ToggleIG_8814A(PADAPTER pAdapter) + + } + ++VOID mpt_SetRFPath_8814A(PADAPTER pAdapter); + VOID mpt_SetRFPath_8814A(PADAPTER pAdapter) + { + +@@ -866,6 +875,11 @@ VOID mpt_SetRFPath_8814A(PADAPTER pAdapter) + #endif /* CONFIG_RTL8814A */ + #if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8812A) + VOID ++mpt_SetSingleTone_8814A( ++ IN PADAPTER pAdapter, ++ IN BOOLEAN bSingleTone, ++ IN BOOLEAN bEnPMacTx); ++VOID + mpt_SetSingleTone_8814A( + IN PADAPTER pAdapter, + IN BOOLEAN bSingleTone, +@@ -1167,6 +1181,7 @@ void mpt_SetRFPath_8723D(PADAPTER pAdapter) + } + #endif + ++VOID mpt_SetRFPath_819X(PADAPTER pAdapter); + VOID mpt_SetRFPath_819X(PADAPTER pAdapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +diff --git a/drivers/staging/rtl8812au/hal/led/hal_usb_led.c b/drivers/staging/rtl8812au/hal/led/hal_usb_led.c +index 80f7a393c..16fd74bad 100644 +--- a/drivers/staging/rtl8812au/hal/led/hal_usb_led.c ++++ b/drivers/staging/rtl8812au/hal/led/hal_usb_led.c +@@ -23,6 +23,10 @@ + * It toggle off LED and schedule corresponding timer if necessary. + * */ + void ++SwLedBlink( ++ PLED_USB pLed ++); ++void + SwLedBlink( + PLED_USB pLed + ) +@@ -112,6 +116,10 @@ SwLedBlink( + } + } + ++void ++SwLedBlink1( ++ PLED_USB pLed ++); + void + SwLedBlink1( + PLED_USB pLed +@@ -289,6 +297,10 @@ SwLedBlink1( + + } + ++void ++SwLedBlink2( ++ PLED_USB pLed ++); + void + SwLedBlink2( + PLED_USB pLed +@@ -375,6 +387,10 @@ SwLedBlink2( + + } + ++void ++SwLedBlink3( ++ PLED_USB pLed ++); + void + SwLedBlink3( + PLED_USB pLed +@@ -501,6 +517,10 @@ SwLedBlink3( + } + + ++void ++SwLedBlink4( ++ PLED_USB pLed ++); + void + SwLedBlink4( + PLED_USB pLed +@@ -689,6 +709,10 @@ SwLedBlink4( + + } + ++void ++SwLedBlink5( ++ PLED_USB pLed ++); + void + SwLedBlink5( + PLED_USB pLed +@@ -779,6 +803,10 @@ SwLedBlink5( + + } + ++void ++SwLedBlink6( ++ PLED_USB pLed ++); + void + SwLedBlink6( + PLED_USB pLed +@@ -797,6 +825,10 @@ SwLedBlink6( + + } + ++void ++SwLedBlink7( ++ PLED_USB pLed ++); + void + SwLedBlink7( + PLED_USB pLed +@@ -886,6 +918,10 @@ SwLedBlink7( + + } + ++void ++SwLedBlink8( ++ PLED_USB pLed ++); + void + SwLedBlink8( + PLED_USB pLed +@@ -905,6 +941,10 @@ SwLedBlink8( + + /* page added for Belkin AC950. 20120813 */ + void ++SwLedBlink9( ++ PLED_USB pLed ++); ++void + SwLedBlink9( + PLED_USB pLed + ) +@@ -1141,6 +1181,10 @@ SwLedBlink9( + + /* page added for Netgear A6200V2. 20120827 */ + void ++SwLedBlink10( ++ PLED_USB pLed ++); ++void + SwLedBlink10( + PLED_USB pLed + ) +@@ -1340,6 +1384,10 @@ SwLedBlink10( + + } + ++void ++SwLedBlink11( ++ PLED_USB pLed ++); + void + SwLedBlink11( + PLED_USB pLed +@@ -1411,6 +1459,10 @@ SwLedBlink11( + + } + ++void ++SwLedBlink12( ++ PLED_USB pLed ++); + void + SwLedBlink12( + PLED_USB pLed +@@ -1479,6 +1531,10 @@ SwLedBlink12( + + } + ++VOID ++SwLedBlink13( ++ IN PLED_USB pLed ++); + VOID + SwLedBlink13( + IN PLED_USB pLed +@@ -1540,6 +1596,10 @@ SwLedBlink13( + + } + ++VOID ++SwLedBlink14( ++ IN PLED_USB pLed ++); + VOID + SwLedBlink14( + IN PLED_USB pLed +@@ -1597,6 +1657,10 @@ SwLedBlink14( + + } + ++VOID ++SwLedBlink15( ++ IN PLED_USB pLed ++); + VOID + SwLedBlink15( + IN PLED_USB pLed +@@ -2909,6 +2973,11 @@ SwLedControlMode6( + + /* Netgear, added by sinda, 2011/11/11 */ + void ++SwLedControlMode7( ++ PADAPTER Adapter, ++ LED_CTL_MODE LedAction ++); ++void + SwLedControlMode7( + PADAPTER Adapter, + LED_CTL_MODE LedAction +@@ -3047,6 +3116,11 @@ SwLedControlMode7( + + } + ++void ++SwLedControlMode8( ++ PADAPTER Adapter, ++ LED_CTL_MODE LedAction ++); + void + SwLedControlMode8( + PADAPTER Adapter, +@@ -3085,6 +3159,11 @@ SwLedControlMode8( + + /* page added for Belkin AC950, 20120813 */ + void ++SwLedControlMode9( ++ IN PADAPTER Adapter, ++ IN LED_CTL_MODE LedAction ++); ++void + SwLedControlMode9( + IN PADAPTER Adapter, + IN LED_CTL_MODE LedAction +@@ -3387,6 +3466,11 @@ SwLedControlMode9( + + /* page added for Netgear A6200V2, 20120827 */ + void ++SwLedControlMode10( ++ PADAPTER Adapter, ++ LED_CTL_MODE LedAction ++); ++void + SwLedControlMode10( + PADAPTER Adapter, + LED_CTL_MODE LedAction +@@ -3585,6 +3669,11 @@ SwLedControlMode10( + + /* Edimax-ASUS, added by Page, 20121221 */ + void ++SwLedControlMode11( ++ PADAPTER Adapter, ++ LED_CTL_MODE LedAction ++); ++void + SwLedControlMode11( + PADAPTER Adapter, + LED_CTL_MODE LedAction +@@ -3683,6 +3772,11 @@ SwLedControlMode11( + + /* page added for NEC */ + ++VOID ++SwLedControlMode12( ++ PADAPTER Adapter, ++ LED_CTL_MODE LedAction ++); + VOID + SwLedControlMode12( + PADAPTER Adapter, +@@ -3764,6 +3858,11 @@ SwLedControlMode12( + + /* Maddest add for NETGEAR R6100 */ + ++VOID ++SwLedControlMode13( ++ IN PADAPTER Adapter, ++ IN LED_CTL_MODE LedAction ++); + VOID + SwLedControlMode13( + IN PADAPTER Adapter, +@@ -3910,6 +4009,11 @@ SwLedControlMode13( + + /* Maddest add for DNI Buffalo */ + ++VOID ++SwLedControlMode14( ++ IN PADAPTER Adapter, ++ IN LED_CTL_MODE LedAction ++); + VOID + SwLedControlMode14( + IN PADAPTER Adapter, +@@ -3969,6 +4073,11 @@ SwLedControlMode14( + + /* Maddest add for Dlink */ + ++VOID ++SwLedControlMode15( ++ IN PADAPTER Adapter, ++ IN LED_CTL_MODE LedAction ++); + VOID + SwLedControlMode15( + IN PADAPTER Adapter, +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c +index c8753e500..4443c7289 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c +@@ -152,6 +152,7 @@ void odm_clear_txpowertracking_state(void *dm_void) + cali_info->modify_tx_agc_value_ofdm = 0; + } + ++void odm_get_tracking_table(void *dm_void, u8 thermal_value, u8 delta); + void odm_get_tracking_table(void *dm_void, u8 thermal_value, u8 delta) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -352,6 +353,7 @@ void odm_get_tracking_table(void *dm_void, u8 thermal_value, u8 delta) + } + } + ++void odm_pwrtrk_method(void *dm_void); + void odm_pwrtrk_method(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -858,6 +860,7 @@ u8 odm_get_right_chnl_place_for_iqk(u8 chnl) + } + #endif + ++void odm_iq_calibrate(struct dm_struct *dm); + void odm_iq_calibrate(struct dm_struct *dm) + { + void *adapter = dm->adapter; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c +index 32fd1f3db..09ab5bae9 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c +@@ -1135,6 +1135,7 @@ u64 halrf_cmn_info_get(void *dm_void, u32 cmn_info) + return return_value; + } + ++void halrf_supportability_init_mp(void *dm_void); + void halrf_supportability_init_mp(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1353,6 +1354,7 @@ halrf_iqk_init( + } + #endif + ++void halrf_dack_trigger(void *dm_void); + void halrf_dack_trigger(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1674,6 +1676,7 @@ void halrf_lck_trigger(void *dm_void) + } + } + ++void halrf_aac_check(struct dm_struct *dm); + void halrf_aac_check(struct dm_struct *dm) + { + switch (dm->support_ic_type) { +@@ -2052,6 +2055,7 @@ halrf_config_rfk_with_header_file(void *dm_void, u32 config_type) + return result; + } + ++void halrf_txgapk_trigger(void *dm_void); + void halrf_txgapk_trigger(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c +index 85a7cb22b..4d61870d8 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c +@@ -31,6 +31,7 @@ + #include "mp_precomp.h" + #include "phydm_precomp.h" + ++void halrf_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len); + void halrf_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len) + { + #ifdef CONFIG_PHYDM_DEBUG_FUNCTION +@@ -65,6 +66,8 @@ void halrf_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len) + #endif + } + ++void halrf_debug_trace(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void halrf_debug_trace(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +index cee13be26..773364310 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +@@ -32,6 +32,7 @@ + /*@ Add for KFree Feature Requested by RF David.*/ + /*@This is a phydm API*/ + ++void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data); + void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -124,6 +125,7 @@ void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data) + } + } + ++void phydm_get_thermal_trim_offset_8821c(void *dm_void); + void phydm_get_thermal_trim_offset_8821c(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -151,6 +153,7 @@ void phydm_get_thermal_trim_offset_8821c(void *dm_void) + power_trim_info->thermal); + } + ++void phydm_get_power_trim_offset_8821c(void *dm_void); + void phydm_get_power_trim_offset_8821c(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -188,6 +191,8 @@ void phydm_get_power_trim_offset_8821c(void *dm_void) + } + } + ++void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg, ++ u8 data); + void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg, + u8 data) + { +@@ -223,6 +228,7 @@ void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg, + odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask)); + } + ++void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data); + void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -252,6 +258,7 @@ void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data) + odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask)); + } + ++void phydm_get_thermal_trim_offset_8822b(void *dm_void); + void phydm_get_thermal_trim_offset_8822b(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -279,6 +286,7 @@ void phydm_get_thermal_trim_offset_8822b(void *dm_void) + power_trim_info->thermal); + } + ++void phydm_get_power_trim_offset_8822b(void *dm_void); + void phydm_get_power_trim_offset_8822b(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -346,6 +354,7 @@ void phydm_get_power_trim_offset_8822b(void *dm_void) + } + } + ++void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias); + void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -405,6 +414,7 @@ void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias) + e_rf_path); + } + ++void phydm_get_pa_bias_offset_8822b(void *dm_void); + void phydm_get_pa_bias_offset_8822b(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -450,6 +460,7 @@ void phydm_get_pa_bias_offset_8822b(void *dm_void) + } + } + ++void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data); + void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -470,6 +481,7 @@ void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) + BIT(15) | BIT(14))), e_rf_path); + } + ++void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data); + void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -497,6 +509,7 @@ void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) + BIT(15) | BIT(14))), e_rf_path); + } + ++void phydm_get_thermal_trim_offset_8710b(void *dm_void); + void phydm_get_thermal_trim_offset_8710b(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -524,6 +537,7 @@ void phydm_get_thermal_trim_offset_8710b(void *dm_void) + power_trim_info->thermal); + } + ++void phydm_get_power_trim_offset_8710b(void *dm_void); + void phydm_get_power_trim_offset_8710b(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -551,6 +565,7 @@ void phydm_get_power_trim_offset_8710b(void *dm_void) + power_trim_info->bb_gain[0][0]); + } + ++void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data); + void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -565,6 +580,7 @@ void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) + BIT(15) | BIT(14))), e_rf_path); + } + ++void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data); + void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -581,6 +597,7 @@ void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) + BIT(15) | BIT(14))), e_rf_path); + } + ++void phydm_get_thermal_trim_offset_8192f(void *dm_void); + void phydm_get_thermal_trim_offset_8192f(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -608,6 +625,7 @@ void phydm_get_thermal_trim_offset_8192f(void *dm_void) + power_trim_info->thermal); + } + ++void phydm_get_power_trim_offset_8192f(void *dm_void); + void phydm_get_power_trim_offset_8192f(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -677,6 +695,8 @@ void phydm_get_power_trim_offset_8192f(void *dm_void) + } + } + ++void phydm_set_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 channel_idx, ++ u8 data); + void phydm_set_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 channel_idx, + u8 data) + { +@@ -765,6 +785,7 @@ void phydm_clear_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 data) + */ + #endif + ++void phydm_get_thermal_trim_offset_8198f(void *dm_void); + void phydm_get_thermal_trim_offset_8198f(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -792,6 +813,7 @@ void phydm_get_thermal_trim_offset_8198f(void *dm_void) + power_trim_info->thermal); + } + ++void phydm_get_power_trim_offset_8198f(void *dm_void); + void phydm_get_power_trim_offset_8198f(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -843,6 +865,7 @@ void phydm_get_power_trim_offset_8198f(void *dm_void) + } + } + ++void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data); + void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -885,6 +908,7 @@ void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) + + } + ++void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data); + void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -930,6 +954,7 @@ void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) + } + + ++void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data); + void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1048,6 +1073,7 @@ s8 phydm_get_thermal_offset(void *dm_void) + return 0; + } + ++void phydm_do_kfree(void *dm_void, u8 channel_to_sw); + void phydm_do_kfree(void *dm_void, u8 channel_to_sw) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c +index 55ec7bf16..32671c854 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c +@@ -592,6 +592,7 @@ void odm_txpowertracking_init(void *dm_void) + odm_txpowertracking_thermal_meter_init(dm); + } + ++u8 get_swing_index(void *dm_void); + u8 get_swing_index(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -642,6 +643,7 @@ u8 get_swing_index(void *dm_void) + return i; + } + ++u8 get_cck_swing_index(void *dm_void); + u8 get_cck_swing_index(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +index cebb7265d..a66721465 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +@@ -428,6 +428,8 @@ void configure_txpower_track_8812a(struct txpwrtrack_cfg *config) + #define BW_40M 1 + #define BW_80M 2 + ++void _iqk_rx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, ++ unsigned int RX_X, unsigned int RX_Y); + void _iqk_rx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, + unsigned int RX_X, unsigned int RX_Y) + { +@@ -473,6 +475,8 @@ void _iqk_rx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, + }; + } + ++void _iqk_tx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, ++ unsigned int TX_X, unsigned int TX_Y); + void _iqk_tx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, + unsigned int TX_X, unsigned int TX_Y) + { +@@ -518,6 +522,8 @@ void _iqk_tx_fill_iqc_8812a(struct dm_struct *dm, enum rf_path path, + }; + } + ++void _iqk_backup_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, ++ u32 *backup_macbb_reg, u32 MACBB_NUM); + void _iqk_backup_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, + u32 *backup_macbb_reg, u32 MACBB_NUM) + { +@@ -529,6 +535,8 @@ void _iqk_backup_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, + + RF_DBG(dm, DBG_RF_IQK, "BackupMacBB Success!!!!\n"); + } ++void _iqk_backup_rf_8812a(struct dm_struct *dm, u32 *RFA_backup, ++ u32 *RFB_backup, u32 *backup_rf_reg, u32 RF_NUM); + void _iqk_backup_rf_8812a(struct dm_struct *dm, u32 *RFA_backup, + u32 *RFB_backup, u32 *backup_rf_reg, u32 RF_NUM) + { +@@ -541,6 +549,8 @@ void _iqk_backup_rf_8812a(struct dm_struct *dm, u32 *RFA_backup, + } + RF_DBG(dm, DBG_RF_IQK, "BackupRF Success!!!!\n"); + } ++void _iqk_backup_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, ++ u32 *backup_afe_reg, u32 AFE_NUM); + void _iqk_backup_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, + u32 *backup_afe_reg, u32 AFE_NUM) + { +@@ -551,6 +561,8 @@ void _iqk_backup_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, + AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); + RF_DBG(dm, DBG_RF_IQK, "BackupAFE Success!!!!\n"); + } ++void _iqk_restore_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, ++ u32 *backup_macbb_reg, u32 MACBB_NUM); + void _iqk_restore_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, + u32 *backup_macbb_reg, u32 MACBB_NUM) + { +@@ -561,6 +573,8 @@ void _iqk_restore_mac_bb_8812a(struct dm_struct *dm, u32 *MACBB_backup, + odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); + RF_DBG(dm, DBG_RF_IQK, "RestoreMacBB Success!!!!\n"); + } ++void _iqk_restore_rf_8812a(struct dm_struct *dm, enum rf_path path, ++ u32 *backup_rf_reg, u32 *RF_backup, u32 RF_REG_NUM); + void _iqk_restore_rf_8812a(struct dm_struct *dm, enum rf_path path, + u32 *backup_rf_reg, u32 *RF_backup, u32 RF_REG_NUM) + { +@@ -583,6 +597,8 @@ void _iqk_restore_rf_8812a(struct dm_struct *dm, enum rf_path path, + break; + } + } ++void _iqk_restore_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, ++ u32 *backup_afe_reg, u32 AFE_NUM); + void _iqk_restore_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, + u32 *backup_afe_reg, u32 AFE_NUM) + { +@@ -616,6 +632,7 @@ void _iqk_restore_afe_8812a(struct dm_struct *dm, u32 *AFE_backup, + RF_DBG(dm, DBG_RF_IQK, "RestoreAFE Success!!!!\n"); + } + ++void _iqk_configure_mac_8812a(struct dm_struct *dm); + void _iqk_configure_mac_8812a(struct dm_struct *dm) + { + /* ========MAC register setting======== */ +@@ -629,6 +646,7 @@ void _iqk_configure_mac_8812a(struct dm_struct *dm) + + #define cal_num 10 + ++void _iqk_tx_8812a(struct dm_struct *dm, u8 chnl_idx); + void _iqk_tx_8812a(struct dm_struct *dm, u8 chnl_idx) + { + u8 delay_count, cal = 0; +@@ -1122,6 +1140,7 @@ void _iqk_tx_8812a(struct dm_struct *dm, u8 chnl_idx) + #define RF_REG_NUM 3 + + /* Maintained by BB James. */ ++void _phy_iq_calibrate_8812a(struct dm_struct *dm, u8 channel); + void _phy_iq_calibrate_8812a(struct dm_struct *dm, u8 channel) + { + u32 MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM] = {0}, RFA_backup[RF_REG_NUM] = {0}, RFB_backup[RF_REG_NUM] = {0}; +@@ -1153,6 +1172,7 @@ void _phy_iq_calibrate_8812a(struct dm_struct *dm, u8 channel) + _iqk_restore_mac_bb_8812a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM); + } + ++void _phy_lc_calibrate_8812a(struct dm_struct *dm, boolean is2T); + void _phy_lc_calibrate_8812a(struct dm_struct *dm, boolean is2T) + { + u32 /*rf_amode=0, rf_bmode=0,*/ lc_cal = 0, tmp = 0; +@@ -1218,6 +1238,7 @@ void _phy_lc_calibrate_8812a(struct dm_struct *dm, boolean is2T) + */ + } + ++void phy_reload_iqk_setting_8812a(struct dm_struct *dm, u8 channel); + void phy_reload_iqk_setting_8812a(struct dm_struct *dm, u8 channel) + { + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); +@@ -1243,6 +1264,7 @@ void phy_reload_iqk_setting_8812a(struct dm_struct *dm, u8 channel) + odm_set_bb_reg(dm, R_0xe10, 0x03ff0000, (cali_info->iqk_matrix_reg_setting[chnl_idx].value[*dm->band_width][3] & 0x7ff) >> 1); + } + ++void phy_reset_iqk_result_8812a(struct dm_struct *dm); + void phy_reset_iqk_result_8812a(struct dm_struct *dm) + { + odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ +@@ -1257,6 +1279,7 @@ void phy_reset_iqk_result_8812a(struct dm_struct *dm) + odm_set_bb_reg(dm, R_0xe10, 0x000003ff, 0x100); + } + ++void _phy_iq_calibrate_by_fw_8812a(struct dm_struct *dm); + void _phy_iq_calibrate_by_fw_8812a(struct dm_struct *dm) + { + u8 iqk_cmd[3] = {*dm->channel, 0x0, 0x0}; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +index 09c65ed3f..41ce0a6dd 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +@@ -400,6 +400,11 @@ void configure_txpower_track_8814a( + pConfig->get_delta_swing_table8814only = GetDeltaSwingTable_8814A_PathCD; + } + ++VOID ++_phy_lc_calibrate_8814a( ++ IN struct dm_struct * pDM_Odm, ++ IN BOOLEAN is2T ++ ); + VOID + _phy_lc_calibrate_8814a( + IN struct dm_struct * pDM_Odm, +@@ -513,6 +518,10 @@ PHY_DPCalibrate_8814A( + } + + ++BOOLEAN ++phy_QueryRFPathSwitch_8814A( ++ IN PADAPTER pAdapter ++ ); + BOOLEAN + phy_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c +index e019df35a..f8a7a020d 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c +@@ -63,6 +63,14 @@ void DoIQK_8814A( + #endif + //1 7. IQK + ++VOID ++_IQK_BackupMacBB_8814A( ++ IN struct dm_struct * pDM_Odm, ++ u32* MAC_backup, ++ u32* BB_backup, ++ u32* Backup_MAC_REG, ++ u32* Backup_BB_REG ++ ); + VOID + _IQK_BackupMacBB_8814A( + IN struct dm_struct * pDM_Odm, +@@ -90,7 +98,13 @@ _IQK_BackupRF_8814A( + IN struct dm_struct * pDM_Odm, + u32 RF_backup[][4], + u32* Backup_RF_REG +- ) ++ ); ++VOID ++_IQK_BackupRF_8814A( ++ IN struct dm_struct * pDM_Odm, ++ u32 RF_backup[][4], ++ u32* Backup_RF_REG ++ ) + { + u32 i; + //Save RF Parameters +@@ -105,6 +119,11 @@ _IQK_BackupRF_8814A( + } + + ++VOID ++_IQK_AFESetting_8814A( ++ IN struct dm_struct * pDM_Odm, ++ IN boolean Do_IQK ++ ); + VOID + _IQK_AFESetting_8814A( + IN struct dm_struct * pDM_Odm, +@@ -155,7 +174,15 @@ _IQK_RestoreMacBB_8814A( + u32* BB_backup, + u32* Backup_MAC_REG, + u32* Backup_BB_REG +- ) ++ ); ++VOID ++_IQK_RestoreMacBB_8814A( ++ IN struct dm_struct * pDM_Odm, ++ u32* MAC_backup, ++ u32* BB_backup, ++ u32* Backup_MAC_REG, ++ u32* Backup_BB_REG ++ ) + { + u32 i; + //Reload MacBB Parameters +@@ -168,6 +195,12 @@ _IQK_RestoreMacBB_8814A( + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); + } + ++VOID ++_IQK_RestoreRF_8814A( ++ IN struct dm_struct * pDM_Odm, ++ u32* Backup_RF_REG, ++ u32 RF_backup[][4] ++ ); + VOID + _IQK_RestoreRF_8814A( + IN struct dm_struct * pDM_Odm, +@@ -193,6 +226,10 @@ _IQK_RestoreRF_8814A( + + } + ++VOID ++PHY_ResetIQKResult_8814A( ++ IN struct dm_struct * pDM_Odm ++); + VOID + PHY_ResetIQKResult_8814A( + IN struct dm_struct * pDM_Odm +@@ -212,6 +249,10 @@ PHY_ResetIQKResult_8814A( + odm_write_4byte(pDM_Odm, 0x1a10, 0x100); + } + ++VOID ++_IQK_ResetNCTL_8814A( ++ IN struct dm_struct * pDM_Odm ++); + VOID + _IQK_ResetNCTL_8814A( + IN struct dm_struct * pDM_Odm +@@ -224,6 +265,10 @@ _IQK_ResetNCTL_8814A( + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("ResetNCTL Success!!!!\n")); + } + ++VOID ++_IQK_ConfigureMAC_8814A( ++ IN struct dm_struct * pDM_Odm ++ ); + VOID + _IQK_ConfigureMAC_8814A( + IN struct dm_struct * pDM_Odm +@@ -244,6 +289,10 @@ _IQK_ConfigureMAC_8814A( + odm_set_bb_reg(pDM_Odm, 0xcbc, 0xf, 0x0); + } + ++VOID ++_LOK_One_Shot( ++ IN void* pDM_VOID ++); + VOID + _LOK_One_Shot( + IN void* pDM_VOID +@@ -314,6 +363,10 @@ _LOK_One_Shot( + pIQK_info->lok_fail[0], pIQK_info->lok_fail[1], pIQK_info->lok_fail[2], pIQK_info->lok_fail[3])); + } + ++VOID ++_IQK_One_Shot( ++ IN void* pDM_VOID ++); + VOID + _IQK_One_Shot( + IN void* pDM_VOID +@@ -434,6 +487,11 @@ _IQK_One_Shot( + } + } + ++VOID ++_IQK_Tx_8814A( ++ IN struct dm_struct * pDM_Odm, ++ IN u8 chnlIdx ++ ); + VOID + _IQK_Tx_8814A( + IN struct dm_struct * pDM_Odm, +@@ -469,6 +527,11 @@ _IQK_Tx_8814A( + + } + ++VOID ++_phy_iq_calibrate_8814a( ++ IN struct dm_struct * pDM_Odm, ++ IN u8 Channel ++ ); + VOID + _phy_iq_calibrate_8814a( + IN struct dm_struct * pDM_Odm, +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c +index b6491baf7..cc46c94e1 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c +@@ -37,6 +37,12 @@ void do_iqk_8821a( + halrf_iqk_trigger(dm, false); + } + #endif ++void _iqk_rx_fill_iqc_8821a( ++ struct dm_struct *dm, ++ enum rf_path path, ++ unsigned int RX_X, ++ unsigned int RX_Y ++); + void _iqk_rx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, +@@ -59,6 +65,12 @@ void _iqk_rx_fill_iqc_8821a( + }; + } + ++void _iqk_tx_fill_iqc_8821a( ++ struct dm_struct *dm, ++ enum rf_path path, ++ unsigned int TX_X, ++ unsigned int TX_Y ++); + void _iqk_tx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, +@@ -84,6 +96,12 @@ void _iqk_tx_fill_iqc_8821a( + }; + } + ++void _iqk_backup_mac_bb_8821a( ++ struct dm_struct *dm, ++ u32 *MACBB_backup, ++ u32 *backup_macbb_reg, ++ u32 MACBB_NUM ++); + void _iqk_backup_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, +@@ -100,6 +118,13 @@ void _iqk_backup_mac_bb_8821a( + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupMacBB Success!!!!\n"); + } + ++void _iqk_backup_rf_8821a( ++ struct dm_struct *dm, ++ u32 *RFA_backup, ++ u32 *RFB_backup, ++ u32 *backup_rf_reg, ++ u32 RF_NUM ++); + void _iqk_backup_rf_8821a( + struct dm_struct *dm, + u32 *RFA_backup, +@@ -117,6 +142,12 @@ void _iqk_backup_rf_8821a( + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupRF Success!!!!\n"); + } + ++void _iqk_backup_afe_8821a( ++ struct dm_struct *dm, ++ u32 *AFE_backup, ++ u32 *backup_afe_reg, ++ u32 AFE_NUM ++); + void _iqk_backup_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, +@@ -132,6 +163,12 @@ void _iqk_backup_afe_8821a( + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupAFE Success!!!!\n"); + } + ++void _iqk_restore_mac_bb_8821a( ++ struct dm_struct *dm, ++ u32 *MACBB_backup, ++ u32 *backup_macbb_reg, ++ u32 MACBB_NUM ++); + void _iqk_restore_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, +@@ -147,6 +184,13 @@ void _iqk_restore_mac_bb_8821a( + PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreMacBB Success!!!!\n"); + } + ++void _iqk_restore_rf_8821a( ++ struct dm_struct *dm, ++ enum rf_path path, ++ u32 *backup_rf_reg, ++ u32 *RF_backup, ++ u32 RF_REG_NUM ++); + void _iqk_restore_rf_8821a( + struct dm_struct *dm, + enum rf_path path, +@@ -172,6 +216,12 @@ void _iqk_restore_rf_8821a( + } + } + ++void _iqk_restore_afe_8821a( ++ struct dm_struct *dm, ++ u32 *AFE_backup, ++ u32 *backup_afe_reg, ++ u32 AFE_NUM ++); + void _iqk_restore_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, +@@ -197,6 +247,9 @@ void _iqk_restore_afe_8821a( + PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreAFE Success!!!!\n"); + } + ++void _iqk_configure_mac_8821a( ++ struct dm_struct *dm ++); + void _iqk_configure_mac_8821a( + struct dm_struct *dm + ) +@@ -210,6 +263,10 @@ void _iqk_configure_mac_8821a( + odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ + } + ++void _iqk_tx_8821a( ++ struct dm_struct *dm, ++ enum rf_path path ++); + void _iqk_tx_8821a( + struct dm_struct *dm, + enum rf_path path +@@ -680,6 +737,10 @@ void _iqk_tx_8821a( + + #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + void ++_phy_iq_calibrate_by_fw_8821a( ++ struct dm_struct *dm ++); ++void + _phy_iq_calibrate_by_fw_8821a( + struct dm_struct *dm + ) +@@ -714,6 +775,10 @@ _phy_iq_calibrate_by_fw_8821a( + } + #endif + ++void ++_phy_iq_calibrate_8821a( ++ struct dm_struct *dm ++); + void + _phy_iq_calibrate_8821a( + struct dm_struct *dm +@@ -736,6 +801,10 @@ _phy_iq_calibrate_8821a( + _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); + } + ++void ++phy_reset_iqk_result_8821a( ++ struct dm_struct *dm ++); + void + phy_reset_iqk_result_8821a( + struct dm_struct *dm +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm.c b/drivers/staging/rtl8812au/hal/phydm/phydm.c +index 1e980630e..867e8a073 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm.c +@@ -38,6 +38,7 @@ const u16 phy_rate_table[] = { + 13, 26, 39, 52, 78, 104, 117, 130 /*@MCS8~15*/ + }; + ++void phydm_traffic_load_decision(void *dm_void); + void phydm_traffic_load_decision(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -109,6 +110,7 @@ void phydm_traffic_load_decision(void *dm_void) + #endif + } + ++void phydm_cck_new_agc_chk(struct dm_struct *dm); + void phydm_cck_new_agc_chk(struct dm_struct *dm) + { + dm->cck_new_agc = 0; +@@ -132,6 +134,7 @@ void phydm_cck_new_agc_chk(struct dm_struct *dm) + } + + /*select 3 or 4 bit LNA */ ++void phydm_cck_lna_bit_num_chk(struct dm_struct *dm); + void phydm_cck_lna_bit_num_chk(struct dm_struct *dm) + { + boolean report_type = 0; +@@ -177,6 +180,7 @@ void phydm_cck_lna_bit_num_chk(struct dm_struct *dm) + dm->cck_agc_report_type); + } + ++void phydm_init_cck_setting(struct dm_struct *dm); + void phydm_init_cck_setting(struct dm_struct *dm) + { + u32 reg_tmp = 0; +@@ -200,6 +204,7 @@ void phydm_init_cck_setting(struct dm_struct *dm) + phydm_get_cck_rssi_table_from_reg(dm); + } + ++void phydm_init_hw_info_by_rfe(struct dm_struct *dm); + void phydm_init_hw_info_by_rfe(struct dm_struct *dm) + { + #if (RTL8822B_SUPPORT == 1) +@@ -216,6 +221,7 @@ void phydm_init_hw_info_by_rfe(struct dm_struct *dm) + #endif + } + ++void phydm_common_info_self_init(struct dm_struct *dm); + void phydm_common_info_self_init(struct dm_struct *dm) + { + u32 reg_tmp = 0; +@@ -298,6 +304,7 @@ void phydm_common_info_self_init(struct dm_struct *dm) + dm->pause_lv_table.lv_dig = PHYDM_PAUSE_RELEASE; + } + ++void phydm_cmn_sta_info_update(void *dm_void, u8 macid); + void phydm_cmn_sta_info_update(void *dm_void, u8 macid) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -326,6 +333,7 @@ void phydm_cmn_sta_info_update(void *dm_void, u8 macid) + ra->is_noisy = dm->noisy_decision; + } + ++void phydm_common_info_self_update(struct dm_struct *dm); + void phydm_common_info_self_update(struct dm_struct *dm) + { + u8 sta_cnt = 0, num_active_client = 0; +@@ -431,6 +439,7 @@ void phydm_common_info_self_update(struct dm_struct *dm) + dm->phy_dbg_info.show_phy_sts_cnt = 0; + } + ++void phydm_common_info_self_reset(struct dm_struct *dm); + void phydm_common_info_self_reset(struct dm_struct *dm) + { + struct odm_phy_dbg_info *dbg_t = &dm->phy_dbg_info; +@@ -474,6 +483,7 @@ phydm_get_structure(struct dm_struct *dm, u8 structure_type) + return structure; + } + ++void phydm_phy_info_update(struct dm_struct *dm); + void phydm_phy_info_update(struct dm_struct *dm) + { + #if (RTL8822B_SUPPORT == 1) +@@ -482,6 +492,7 @@ void phydm_phy_info_update(struct dm_struct *dm) + #endif + } + ++void phydm_hw_setting(struct dm_struct *dm); + void phydm_hw_setting(struct dm_struct *dm) + { + #if (RTL8821A_SUPPORT == 1) +@@ -783,6 +794,7 @@ u64 phydm_supportability_init_win( + #endif + + #if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) ++u64 phydm_supportability_init_ce(void *dm_void); + u64 phydm_supportability_init_ce(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1401,6 +1413,7 @@ void phydm_fwoffload_ability_clear(struct dm_struct *dm, + dm->fw_offload_ability); + } + ++void phydm_supportability_init(void *dm_void); + void phydm_supportability_init(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1440,6 +1453,7 @@ void phydm_supportability_init(void *dm_void) + dm->support_ic_type, *dm->mp_mode, dm->support_ability); + } + ++void phydm_rfe_init(void *dm_void); + void phydm_rfe_init(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1970,6 +1984,7 @@ void phydm_pause_func_console(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++u8 phydm_stop_dm_watchdog_check(void *dm_void); + u8 phydm_stop_dm_watchdog_check(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c b/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c +index 086903624..e72e9d41d 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c +@@ -111,6 +111,7 @@ phydm_soft_ap_special_set(void *dm_void) + } + #endif + ++void phydm_dig_up_bound_lmt_en(void *dm_void); + void phydm_dig_up_bound_lmt_en(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -140,6 +141,7 @@ void phydm_dig_up_bound_lmt_en(void *dm_void) + adapt->igi_up_bound_lmt_cnt); + } + ++void phydm_check_adaptivity(void *dm_void); + void phydm_check_adaptivity(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -174,6 +176,7 @@ void phydm_check_adaptivity(void *dm_void) + #endif + } + ++void phydm_set_edcca_threshold(void *dm_void, s8 H2L, s8 L2H); + void phydm_set_edcca_threshold(void *dm_void, s8 H2L, s8 L2H) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -190,6 +193,7 @@ void phydm_set_edcca_threshold(void *dm_void, s8 H2L, s8 L2H) + } + } + ++void phydm_mac_edcca_state(void *dm_void, enum phydm_mac_edcca_type state); + void phydm_mac_edcca_state(void *dm_void, enum phydm_mac_edcca_type state) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -208,6 +212,7 @@ void phydm_mac_edcca_state(void *dm_void, enum phydm_mac_edcca_type state) + PHYDM_DBG(dm, DBG_ADPTVTY, "EDCCA enable state = %d\n", state); + } + ++void phydm_search_pwdb_lower_bound(void *dm_void); + void phydm_search_pwdb_lower_bound(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -285,6 +290,8 @@ void phydm_search_pwdb_lower_bound(void *dm_void) + phydm_set_edcca_threshold(dm, 0x7f, 0x7f); /*resume to no link state*/ + } + ++boolean ++phydm_re_search_condition(void *dm_void); + boolean + phydm_re_search_condition(void *dm_void) + { +@@ -298,6 +305,7 @@ phydm_re_search_condition(void *dm_void) + return false; + } + ++void phydm_set_l2h_th_ini(void *dm_void); + void phydm_set_l2h_th_ini(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -317,6 +325,7 @@ void phydm_set_l2h_th_ini(void *dm_void) + } + } + ++void phydm_set_forgetting_factor(void *dm_void); + void phydm_set_forgetting_factor(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -327,6 +336,7 @@ void phydm_set_forgetting_factor(void *dm_void) + odm_set_bb_reg(dm, R_0x83c, BIT(31) | BIT(30) | BIT(29), 0x7); + } + ++void phydm_set_pwdb_mode(void *dm_void); + void phydm_set_pwdb_mode(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -445,6 +455,7 @@ void phydm_set_edcca_val(void *dm_void, u32 *val_buf, u8 val_len) + phydm_set_edcca_threshold(dm, (s8)val_buf[1], (s8)val_buf[0]); + } + ++boolean phydm_edcca_abort(void *dm_void); + boolean phydm_edcca_abort(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c b/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c +index d2278560e..903aa635b 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c +@@ -43,6 +43,8 @@ + + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_AP)) + boolean ++phydm_la_buffer_allocate(void *dm_void); ++boolean + phydm_la_buffer_allocate(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -77,6 +79,7 @@ phydm_la_buffer_allocate(void *dm_void) + } + #endif + ++void phydm_la_get_tx_pkt_buf(void *dm_void); + void phydm_la_get_tx_pkt_buf(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -260,6 +263,7 @@ void phydm_la_get_tx_pkt_buf(void *dm_void) + #endif + } + ++void phydm_la_mode_set_mac_iq_dump(void *dm_void, boolean en_fake_trig); + void phydm_la_mode_set_mac_iq_dump(void *dm_void, boolean en_fake_trig) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -327,6 +331,7 @@ void phydm_la_mode_set_mac_iq_dump(void *dm_void, boolean en_fake_trig) + #endif + } + ++void phydm_adc_smp_start(void *dm_void); + void phydm_adc_smp_start(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_api.c b/drivers/staging/rtl8812au/hal/phydm/phydm_api.c +index f84279c39..f16510291 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_api.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_api.c +@@ -105,6 +105,7 @@ void phydm_ant_weight_dbg(void *dm_void, char input[][16], u32 *_used, + } + #endif + ++void phydm_iq_gen_en(void *dm_void); + void phydm_iq_gen_en(void *dm_void) + { + #ifdef PHYDM_COMPILE_IC_2SS +@@ -160,6 +161,7 @@ void phydm_iq_gen_en(void *dm_void) + #endif + } + ++void phydm_dis_cdd(void *dm_void); + void phydm_dis_cdd(void *dm_void) + { + #ifdef PHYDM_COMPILE_IC_2SS +@@ -310,6 +312,7 @@ void phydm_trx_antenna_setting_init(void *dm_void, u8 num_rf_path) + __func__, dm->tx_ant_status, dm->rx_ant_status); + } + ++void phydm_config_ofdm_tx_path(void *dm_void, u32 path); + void phydm_config_ofdm_tx_path(void *dm_void, u32 path) + { + #if (RTL8192E_SUPPORT || RTL8812A_SUPPORT) +@@ -475,6 +478,7 @@ void phydm_config_cck_rx_path(void *dm_void, enum bb_path path) + #endif + } + ++void phydm_config_cck_tx_path(void *dm_void, enum bb_path path); + void phydm_config_cck_tx_path(void *dm_void, enum bb_path path) + { + #if (defined(PHYDM_COMPILE_ABOVE_2SS)) +@@ -489,6 +493,8 @@ void phydm_config_cck_tx_path(void *dm_void, enum bb_path path) + #endif + } + ++void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -542,6 +548,8 @@ void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used, + #endif + } + ++void phydm_config_trx_path_v1(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_config_trx_path_v1(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -895,6 +903,7 @@ void phydm_set_ext_switch(void *dm_void, u32 ext_ant_switch) + #endif + } + ++void phydm_csi_mask_enable(void *dm_void, u32 enable); + void phydm_csi_mask_enable(void *dm_void, u32 enable) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -919,6 +928,7 @@ void phydm_csi_mask_enable(void *dm_void, u32 enable) + } + } + ++void phydm_clean_all_csi_mask(void *dm_void); + void phydm_clean_all_csi_mask(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -957,6 +967,7 @@ void phydm_clean_all_csi_mask(void *dm_void) + } + } + ++void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction); + void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1016,6 +1027,7 @@ void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction) + (tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value); + } + ++void phydm_set_nbi_reg(void *dm_void, u32 tone_idx_tmp, u32 bw); + void phydm_set_nbi_reg(void *dm_void, u32 tone_idx_tmp, u32 bw) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1111,6 +1123,7 @@ void phydm_nbi_enable(void *dm_void, u32 enable) + } + } + ++u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in); + u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1186,6 +1199,8 @@ u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in) + return PHYDM_SET_SUCCESS; + } + ++u8 phydm_find_intf_distance(void *dm_void, u32 bw, u32 fc, u32 f_interference, ++ u32 *tone_idx_tmp_in); + u8 phydm_find_intf_distance(void *dm_void, u32 bw, u32 fc, u32 f_interference, + u32 *tone_idx_tmp_in) + { +@@ -2577,6 +2592,7 @@ phydm_api_trx_mode(void *dm_void, enum bb_path tx_path, enum bb_path rx_path, + return ret; + } + #else ++u8 config_phydm_read_txagc_n(void *dm_void, enum rf_path path, u8 hw_rate); + u8 config_phydm_read_txagc_n(void *dm_void, enum rf_path path, u8 hw_rate) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +index bc4855c15..be4246612 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +@@ -92,6 +92,8 @@ void phydm_get_txbf_device_num( + } + + struct _RT_BEAMFORM_STAINFO * ++phydm_sta_info_init(struct dm_struct *dm, u16 sta_idx, u8 *my_mac_addr); ++struct _RT_BEAMFORM_STAINFO * + phydm_sta_info_init(struct dm_struct *dm, u16 sta_idx, u8 *my_mac_addr) + { + struct _RT_BEAMFORMING_INFO *beam_info = &dm->beamforming_info; +@@ -158,6 +160,10 @@ phydm_sta_info_init(struct dm_struct *dm, u16 sta_idx, u8 *my_mac_addr) + entry->cur_beamform, entry->cur_beamform_vht); + return entry; + } ++void phydm_sta_info_update( ++ struct dm_struct *dm, ++ u16 sta_idx, ++ struct _RT_BEAMFORMEE_ENTRY *beamform_entry); + void phydm_sta_info_update( + struct dm_struct *dm, + u16 sta_idx, +@@ -213,6 +219,11 @@ phydm_beamforming_get_bfer_entry_by_addr( + } + + struct _RT_BEAMFORMEE_ENTRY * ++phydm_beamforming_get_entry_by_mac_id( ++ void *dm_void, ++ u8 mac_id, ++ u8 *idx); ++struct _RT_BEAMFORMEE_ENTRY * + phydm_beamforming_get_entry_by_mac_id( + void *dm_void, + u8 mac_id, +@@ -253,6 +264,10 @@ phydm_beamforming_get_entry_beam_cap_by_mac_id( + } + + struct _RT_BEAMFORMEE_ENTRY * ++phydm_beamforming_get_free_bfee_entry( ++ void *dm_void, ++ u8 *idx); ++struct _RT_BEAMFORMEE_ENTRY * + phydm_beamforming_get_free_bfee_entry( + void *dm_void, + u8 *idx) +@@ -271,6 +286,10 @@ phydm_beamforming_get_free_bfee_entry( + } + + struct _RT_BEAMFORMER_ENTRY * ++phydm_beamforming_get_free_bfer_entry( ++ void *dm_void, ++ u8 *idx); ++struct _RT_BEAMFORMER_ENTRY * + phydm_beamforming_get_free_bfer_entry( + void *dm_void, + u8 *idx) +@@ -298,6 +317,8 @@ phydm_beamforming_get_free_bfer_entry( + * 2015.05.25. Created by tynli. + * + */ ++u8 phydm_beamforming_get_first_mu_bfee_entry_idx( ++ void *dm_void); + u8 phydm_beamforming_get_first_mu_bfee_entry_idx( + void *dm_void) + { +@@ -323,6 +344,14 @@ u8 phydm_beamforming_get_first_mu_bfee_entry_idx( + + /*@Add SU BFee and MU BFee*/ + struct _RT_BEAMFORMEE_ENTRY * ++beamforming_add_bfee_entry( ++ void *dm_void, ++ struct _RT_BEAMFORM_STAINFO *sta, ++ enum beamforming_cap beamform_cap, ++ u8 num_of_sounding_dim, ++ u8 comp_steering_num_of_bfer, ++ u8 *idx); ++struct _RT_BEAMFORMEE_ENTRY * + beamforming_add_bfee_entry( + void *dm_void, + struct _RT_BEAMFORM_STAINFO *sta, +@@ -400,6 +429,13 @@ beamforming_add_bfee_entry( + + /*@Add SU BFee and MU BFer*/ + struct _RT_BEAMFORMER_ENTRY * ++beamforming_add_bfer_entry( ++ void *dm_void, ++ struct _RT_BEAMFORM_STAINFO *sta, ++ enum beamforming_cap beamform_cap, ++ u8 num_of_sounding_dim, ++ u8 *idx); ++struct _RT_BEAMFORMER_ENTRY * + beamforming_add_bfer_entry( + void *dm_void, + struct _RT_BEAMFORM_STAINFO *sta, +@@ -496,6 +532,10 @@ beamforming_remove_entry( + #endif + + /* Used for beamforming_start_v1 */ ++void phydm_beamforming_ndpa_rate( ++ void *dm_void, ++ enum channel_width BW, ++ u8 rate); + void phydm_beamforming_ndpa_rate( + void *dm_void, + enum channel_width BW, +@@ -521,6 +561,8 @@ void phydm_beamforming_ndpa_rate( + } + + /* Used for beamforming_start_sw and beamforming_start_fw */ ++void phydm_beamforming_dym_ndpa_rate( ++ void *dm_void); + void phydm_beamforming_dym_ndpa_rate( + void *dm_void) + { +@@ -541,6 +583,9 @@ void phydm_beamforming_dym_ndpa_rate( + * HW Timer unit (1/32000) s 32k is clock. + * FW Sounding : FW Timer unit 10ms + */ ++void beamforming_dym_period( ++ void *dm_void, ++ u8 status); + void beamforming_dym_period( + void *dm_void, + u8 status) +@@ -655,6 +700,11 @@ beamforming_send_vht_ndpa_packet( + } + + enum beamforming_notify_state ++phydm_beamfomring_is_sounding( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info, ++ u8 *idx); ++enum beamforming_notify_state + phydm_beamfomring_is_sounding( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info, +@@ -707,6 +757,9 @@ phydm_beamfomring_is_sounding( + } + + /* This function is unused */ ++u8 phydm_beamforming_sounding_idx( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info); + u8 phydm_beamforming_sounding_idx( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info) +@@ -734,6 +787,11 @@ u8 phydm_beamforming_sounding_idx( + } + + enum sounding_mode ++phydm_beamforming_sounding_mode( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info, ++ u8 idx); ++enum sounding_mode + phydm_beamforming_sounding_mode( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info, +@@ -775,6 +833,11 @@ phydm_beamforming_sounding_mode( + return mode; + } + ++u16 phydm_beamforming_sounding_time( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info, ++ enum sounding_mode mode, ++ u8 idx); + u16 phydm_beamforming_sounding_time( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info, +@@ -800,6 +863,12 @@ u16 phydm_beamforming_sounding_time( + } + + enum channel_width ++phydm_beamforming_sounding_bw( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info, ++ enum sounding_mode mode, ++ u8 idx); ++enum channel_width + phydm_beamforming_sounding_bw( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info, +@@ -825,6 +894,10 @@ phydm_beamforming_sounding_bw( + return sounding_bw; + } + ++boolean ++phydm_beamforming_select_beam_entry( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info); + boolean + phydm_beamforming_select_beam_entry( + void *dm_void, +@@ -857,6 +930,9 @@ phydm_beamforming_select_beam_entry( + + /*SU BFee Entry Only*/ + boolean ++phydm_beamforming_start_period( ++ void *dm_void); ++boolean + phydm_beamforming_start_period( + void *dm_void) + { +@@ -901,6 +977,8 @@ phydm_beamforming_start_period( + + /* Used after beamforming_leave, and will clear the setting of the "already deleted" entry + *SU BFee Entry Only*/ ++void phydm_beamforming_end_period_sw( ++ void *dm_void); + void phydm_beamforming_end_period_sw( + void *dm_void) + { +@@ -922,6 +1000,8 @@ void phydm_beamforming_end_period_sw( + /*odm_write_1byte(dm, 0x15F, 0);*/ + } + ++void phydm_beamforming_end_period_fw( ++ void *dm_void); + void phydm_beamforming_end_period_fw( + void *dm_void) + { +@@ -933,6 +1013,10 @@ void phydm_beamforming_end_period_fw( + } + + /*SU BFee Entry Only*/ ++void phydm_beamforming_clear_entry_sw( ++ void *dm_void, ++ boolean is_delete, ++ u8 delete_idx); + void phydm_beamforming_clear_entry_sw( + void *dm_void, + boolean is_delete, +@@ -998,6 +1082,10 @@ void phydm_beamforming_clear_entry_sw( + } + } + ++void phydm_beamforming_clear_entry_fw( ++ void *dm_void, ++ boolean is_delete, ++ u8 delete_idx); + void phydm_beamforming_clear_entry_fw( + void *dm_void, + boolean is_delete, +@@ -1143,6 +1231,9 @@ void phydm_beamforming_notify( + } + } + ++boolean ++beamforming_init_entry(void *dm_void, u16 sta_idx, u8 *bfer_bfee_idx, ++ u8 *my_mac_addr); + boolean + beamforming_init_entry(void *dm_void, u16 sta_idx, u8 *bfer_bfee_idx, + u8 *my_mac_addr) +@@ -1293,6 +1384,9 @@ beamforming_init_entry(void *dm_void, u16 sta_idx, u8 *bfer_bfee_idx, + return true; + } + ++void beamforming_deinit_entry( ++ void *dm_void, ++ u8 *RA); + void beamforming_deinit_entry( + void *dm_void, + u8 *RA) +@@ -1336,6 +1430,13 @@ void beamforming_deinit_entry( + PHYDM_DBG(dm, DBG_TXBF, "%s End, idx = 0x%X\n", __func__, idx); + } + ++boolean ++beamforming_start_v1( ++ void *dm_void, ++ u8 *RA, ++ boolean mode, ++ enum channel_width BW, ++ u8 rate); + boolean + beamforming_start_v1( + void *dm_void, +@@ -1402,6 +1503,12 @@ beamforming_start_v1( + return true; + } + ++boolean ++beamforming_start_sw( ++ void *dm_void, ++ u8 idx, ++ u8 mode, ++ enum channel_width BW); + boolean + beamforming_start_sw( + void *dm_void, +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c b/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c +index 8f5229abf..0be5ae0fc 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c +@@ -32,6 +32,7 @@ + + #ifdef PHYDM_SUPPORT_CCKPD + #ifdef PHYDM_COMPILE_CCKPD_TYPE1 ++void phydm_write_cck_pd_type1(void *dm_void, u8 cca_th); + void phydm_write_cck_pd_type1(void *dm_void, u8 cca_th) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -44,6 +45,7 @@ void phydm_write_cck_pd_type1(void *dm_void, u8 cca_th) + cckpd_t->cur_cck_cca_thres = cca_th; + } + ++void phydm_set_cckpd_lv_type1(void *dm_void, enum cckpd_lv lv); + void phydm_set_cckpd_lv_type1(void *dm_void, enum cckpd_lv lv) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -75,6 +77,7 @@ void phydm_set_cckpd_lv_type1(void *dm_void, enum cckpd_lv lv) + phydm_write_cck_pd_type1(dm, pd_th); + } + ++void phydm_cckpd_type1(void *dm_void); + void phydm_cckpd_type1(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -952,6 +955,8 @@ void phydm_set_cckpd_val(void *dm_void, u32 *val_buf, u8 val_len) + } + } + ++boolean ++phydm_stop_cck_pd_th(void *dm_void); + boolean + phydm_stop_cck_pd_th(void *dm_void) + { +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c b/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c +index f9ea9bb99..e0f42c0be 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c +@@ -328,6 +328,7 @@ void phydm_fahm_dbg(void *dm_void, char input[][16], u32 *_used, char *output, + + #ifdef NHM_SUPPORT + ++void phydm_nhm_racing_release(void *dm_void); + void phydm_nhm_racing_release(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -348,6 +349,7 @@ void phydm_nhm_racing_release(void *dm_void) + ccx->nhm_app = NHM_BACKGROUND; + } + ++u8 phydm_nhm_racing_ctrl(void *dm_void, enum phydm_nhm_level nhm_lv); + u8 phydm_nhm_racing_ctrl(void *dm_void, enum phydm_nhm_level nhm_lv) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -397,6 +399,8 @@ void phydm_nhm_trigger(void *dm_void) + ccx->nhm_ongoing = true; + } + ++boolean ++phydm_nhm_check_rdy(void *dm_void); + boolean + phydm_nhm_check_rdy(void *dm_void) + { +@@ -487,6 +491,7 @@ phydm_nhm_check_rdy(void *dm_void) + return is_ready; + } + ++void phydm_nhm_get_utility(void *dm_void); + void phydm_nhm_get_utility(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -504,6 +509,8 @@ void phydm_nhm_get_utility(void *dm_void) + PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_ratio=%d\n", ccx->nhm_ratio); + } + ++boolean ++phydm_nhm_get_result(void *dm_void); + boolean + phydm_nhm_get_result(void *dm_void) + { +@@ -629,6 +636,7 @@ phydm_nhm_get_result(void *dm_void) + return true; + } + ++void phydm_nhm_set_th_reg(void *dm_void); + void phydm_nhm_set_th_reg(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -679,6 +687,9 @@ void phydm_nhm_set_th_reg(void *dm_void) + ccx->nhm_th[1], ccx->nhm_th[0]); + } + ++boolean ++phydm_nhm_th_update_chk(void *dm_void, enum nhm_application nhm_app, u8 *nhm_th, ++ u32 *igi_new); + boolean + phydm_nhm_th_update_chk(void *dm_void, enum nhm_application nhm_app, u8 *nhm_th, + u32 *igi_new) +@@ -763,6 +774,10 @@ phydm_nhm_th_update_chk(void *dm_void, enum nhm_application nhm_app, u8 *nhm_th, + return is_update; + } + ++void phydm_nhm_set(void *dm_void, enum nhm_option_txon_all include_tx, ++ enum nhm_option_cca_all include_cca, ++ enum nhm_divider_opt_all divi_opt, ++ enum nhm_application nhm_app, u16 period); + void phydm_nhm_set(void *dm_void, enum nhm_option_txon_all include_tx, + enum nhm_option_cca_all include_cca, + enum nhm_divider_opt_all divi_opt, +@@ -854,6 +869,7 @@ void phydm_nhm_set(void *dm_void, enum nhm_option_txon_all include_tx, + } + } + ++u8 phydm_nhm_mntr_set(void *dm_void, struct nhm_para_info *nhm_para); + u8 phydm_nhm_mntr_set(void *dm_void, struct nhm_para_info *nhm_para) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -885,6 +901,8 @@ u8 phydm_nhm_mntr_set(void *dm_void, struct nhm_para_info *nhm_para) + + /*@Environment Monitor*/ + boolean ++phydm_nhm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/); ++boolean + phydm_nhm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1067,6 +1085,7 @@ void phydm_nhm_dbg(void *dm_void, char input[][16], u32 *_used, char *output, + + #ifdef CLM_SUPPORT + ++void phydm_clm_racing_release(void *dm_void); + void phydm_clm_racing_release(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1080,6 +1099,7 @@ void phydm_clm_racing_release(void *dm_void) + ccx->clm_app = CLM_BACKGROUND; + } + ++u8 phydm_clm_racing_ctrl(void *dm_void, enum phydm_nhm_level clm_lv); + u8 phydm_clm_racing_ctrl(void *dm_void, enum phydm_nhm_level clm_lv) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1318,6 +1338,7 @@ phydm_clm_get_result(void *dm_void) + return true; + } + ++void phydm_clm_mntr_fw(void *dm_void, u16 monitor_time /*unit ms*/); + void phydm_clm_mntr_fw(void *dm_void, u16 monitor_time /*unit ms*/) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1378,6 +1399,8 @@ u8 phydm_clm_mntr_set(void *dm_void, struct clm_para_info *clm_para) + return PHYDM_SET_SUCCESS; + } + ++boolean ++phydm_clm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/); + boolean + phydm_clm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/) + { +@@ -1441,6 +1464,7 @@ void phydm_set_clm_mntr_mode(void *dm_void, enum clm_monitor_mode mode) + } + } + ++void phydm_clm_init(void *dm_void); + void phydm_clm_init(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c b/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c +index 95d89e379..8aac6b094 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c +@@ -25,6 +25,7 @@ + #include "mp_precomp.h" + #include "phydm_precomp.h" + ++s32 phydm_get_cfo_hz(void *dm_void, u32 val, u8 bit_num, u8 frac_num); + s32 phydm_get_cfo_hz(void *dm_void, u32 val, u8 bit_num, u8 frac_num) + { + s32 val_s = 0; +@@ -42,6 +43,7 @@ s32 phydm_get_cfo_hz(void *dm_void, u32 val, u8 bit_num, u8 frac_num) + } + + #if (ODM_IC_11AC_SERIES_SUPPORT) ++void phydm_get_cfo_info_ac(void *dm_void, struct phydm_cfo_rpt *cfo); + void phydm_get_cfo_info_ac(void *dm_void, struct phydm_cfo_rpt *cfo) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -310,6 +312,7 @@ phydm_set_crystal_cap_reg(void *dm_void, u8 crystal_cap) + return true; + } + ++void phydm_cfo_tracking_reset(void *dm_void); + void phydm_cfo_tracking_reset(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c b/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c +index 57d24e0e6..bab92632e 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c +@@ -101,6 +101,7 @@ void phydm_bb_dbg_port_header_sel(void *dm_void, u32 header_idx) + } + } + ++void phydm_bb_dbg_port_clock_en(void *dm_void, u8 enable); + void phydm_bb_dbg_port_clock_en(void *dm_void, u8 enable) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -400,6 +401,8 @@ void phydm_bb_hw_dbg_info_8822b(void *dm_void, u32 *_used, char *output, + } + #endif + ++void phydm_bb_hw_dbg_info_ac(void *dm_void, u32 *_used, char *output, ++ u32 *_out_len); + void phydm_bb_hw_dbg_info_ac(void *dm_void, u32 *_used, char *output, + u32 *_out_len) + { +@@ -926,6 +929,8 @@ u8 phydm_get_l_sig_rate(void *dm_void, u8 rate_idx_l_sig) + return rate_idx; + } + ++void phydm_bb_hw_dbg_info(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_bb_hw_dbg_info(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -1656,6 +1661,8 @@ void phydm_rx_rate_distribution(void *dm_void) + #endif + } + ++void phydm_print_hist_2_buf(void *dm_void, u16 *val, u16 len, char *buf, ++ u16 buf_size); + void phydm_print_hist_2_buf(void *dm_void, u16 *val, u16 len, char *buf, + u16 buf_size) + { +@@ -1676,6 +1683,7 @@ void phydm_print_hist_2_buf(void *dm_void, u16 *val, u16 len, char *buf, + } + } + ++void phydm_nss_hitogram(void *dm_void, enum PDM_RATE_TYPE rate_type); + void phydm_nss_hitogram(void *dm_void, enum PDM_RATE_TYPE rate_type) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1935,6 +1943,7 @@ void phydm_get_phy_statistic(void *dm_void) + phydm_reset_phystatus_statistic(dm); + }; + ++void phydm_basic_dbg_msg_linked(void *dm_void); + void phydm_basic_dbg_msg_linked(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -2554,6 +2563,8 @@ void phydm_fw_trace_en_h2c(void *dm_void, boolean enable, + odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_TRACE_EN, cmd_length, h2c_parameter); + } + ++void phydm_get_per_path_txagc(void *dm_void, u8 path, u32 *_used, char *output, ++ u32 *_out_len); + void phydm_get_per_path_txagc(void *dm_void, u8 path, u32 *_used, char *output, + u32 *_out_len) + { +@@ -2628,6 +2639,7 @@ void phydm_get_per_path_txagc(void *dm_void, u8 path, u32 *_used, char *output, + *_out_len = out_len; + } + ++void phydm_get_txagc(void *dm_void, u32 *_used, char *output, u32 *_out_len); + void phydm_get_txagc(void *dm_void, u32 *_used, char *output, u32 *_out_len) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -2658,6 +2670,8 @@ void phydm_get_txagc(void *dm_void, u32 *_used, char *output, u32 *_out_len) + *_out_len = out_len; + } + ++void phydm_set_txagc(void *dm_void, u32 *const val, u32 *_used, ++ char *output, u32 *_out_len); + void phydm_set_txagc(void *dm_void, u32 *const val, u32 *_used, + char *output, u32 *_out_len) + { +@@ -2738,6 +2752,8 @@ void phydm_set_txagc(void *dm_void, u32 *const val, u32 *_used, + *_out_len = out_len; + } + ++void phydm_shift_txagc(void *dm_void, u32 *const val, u32 *_used, char *output, ++ u32 *_out_len); + void phydm_shift_txagc(void *dm_void, u32 *const val, u32 *_used, char *output, + u32 *_out_len) + { +@@ -2850,6 +2866,8 @@ void phydm_shift_txagc(void *dm_void, u32 *const val, u32 *_used, char *output, + *_out_len = out_len; + } + ++void phydm_set_txagc_dbg(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_set_txagc_dbg(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -2891,6 +2909,8 @@ void phydm_set_txagc_dbg(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++void phydm_debug_trace(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_debug_trace(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3047,6 +3067,8 @@ void phydm_debug_trace(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++void phydm_fw_debug_trace(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_fw_debug_trace(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3126,6 +3148,8 @@ void phydm_dump_bb_reg_n(void *dm_void, u32 *_used, char *output, u32 *_out_len) + #endif + + #if (ODM_IC_11AC_SERIES_SUPPORT) ++void phydm_dump_bb_reg_ac(void *dm_void, u32 *_used, char *output, ++ u32 *_out_len); + void phydm_dump_bb_reg_ac(void *dm_void, u32 *_used, char *output, + u32 *_out_len) + { +@@ -3247,6 +3271,7 @@ void phydm_dump_bb_reg2_jgr3(void *dm_void, u32 *_used, char *output, + } + #endif + ++void phydm_dump_bb_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len); + void phydm_dump_bb_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -3277,6 +3302,7 @@ void phydm_dump_bb_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + *_out_len = out_len; + } + ++void phydm_dump_rf_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len); + void phydm_dump_rf_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -3341,6 +3367,7 @@ void phydm_dump_rf_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + *_out_len = out_len; + } + ++void phydm_dump_mac_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len); + void phydm_dump_mac_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -3366,6 +3393,8 @@ void phydm_dump_mac_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len) + *_out_len = out_len; + } + ++void phydm_dump_reg(void *dm_void, char input[][16], u32 *_used, char *output, ++ u32 *_out_len); + void phydm_dump_reg(void *dm_void, char input[][16], u32 *_used, char *output, + u32 *_out_len) + { +@@ -3416,6 +3445,8 @@ void phydm_dump_reg(void *dm_void, char input[][16], u32 *_used, char *output, + *_out_len = out_len; + } + ++void phydm_enable_big_jump(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_enable_big_jump(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3453,6 +3484,8 @@ void phydm_enable_big_jump(void *dm_void, char input[][16], u32 *_used, + #endif + } + ++void phydm_show_rx_rate(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_show_rx_rate(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3541,6 +3574,8 @@ void phydm_show_rx_rate(void *dm_void, char input[][16], u32 *_used, + #endif + } + ++void phydm_per_tone_evm(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_per_tone_evm(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3754,6 +3789,8 @@ void phydm_per_tone_evm(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++void phydm_bw_ch_adjust(void *dm_void, char input[][16], ++ u32 *_used, char *output, u32 *_out_len); + void phydm_bw_ch_adjust(void *dm_void, char input[][16], + u32 *_used, char *output, u32 *_out_len) + { +@@ -3806,6 +3843,8 @@ void phydm_bw_ch_adjust(void *dm_void, char input[][16], + *_out_len = out_len; + } + ++void phydm_ext_rf_element_ctrl(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_ext_rf_element_ctrl(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +@@ -3828,6 +3867,8 @@ void phydm_ext_rf_element_ctrl(void *dm_void, char input[][16], u32 *_used, + } + } + ++void phydm_print_dbgport(void *dm_void, char input[][16], u32 *_used, ++ char *output, u32 *_out_len); + void phydm_print_dbgport(void *dm_void, char input[][16], u32 *_used, + char *output, u32 *_out_len) + { +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c b/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c +index eea6dcee4..b26e85515 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c +@@ -31,6 +31,7 @@ + #include "phydm_precomp.h" + + #ifdef CFG_DIG_DAMPING_CHK ++void phydm_dig_recorder_reset(void *dm_void); + void phydm_dig_recorder_reset(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -43,6 +44,8 @@ void phydm_dig_recorder_reset(void *dm_void) + sizeof(struct phydm_dig_recorder_strcut)); + } + ++void phydm_dig_recorder(void *dm_void, boolean first_connect, u8 igi_curr, ++ u32 fa_cnt); + void phydm_dig_recorder(void *dm_void, boolean first_connect, u8 igi_curr, + u32 fa_cnt) + { +@@ -95,6 +98,7 @@ void phydm_dig_recorder(void *dm_void, boolean first_connect, u8 igi_curr, + dig_rc->igi_bitmap); + } + ++void phydm_dig_damping_chk(void *dm_void); + void phydm_dig_damping_chk(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -195,6 +199,8 @@ void phydm_dig_damping_chk(void *dm_void) + } + #endif + ++boolean ++phydm_dig_go_up_check(void *dm_void); + boolean + phydm_dig_go_up_check(void *dm_void) + { +@@ -271,6 +277,7 @@ phydm_dig_go_up_check(void *dm_void) + return ret; + } + ++void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band); + void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -310,6 +317,7 @@ void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band) + dig_t->fa_th[1], dig_t->fa_th[2]); + } + ++void phydm_set_big_jump_step(void *dm_void, u8 curr_igi); + void phydm_set_big_jump_step(void *dm_void, u8 curr_igi) + { + #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT) +@@ -498,6 +506,7 @@ void phydm_fa_cnt_statistics_jgr3(void *dm_void) + + #endif + ++void phydm_write_dig_reg_c50(void *dm_void, u8 igi); + void phydm_write_dig_reg_c50(void *dm_void, u8 igi) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -598,6 +607,7 @@ void odm_write_dig(void *dm_void, u8 new_igi) + PHYDM_DBG(dm, DBG_DIG, "New_igi=((0x%x))\n\n", new_igi); + } + ++u8 phydm_get_igi_reg_val(void *dm_void, enum bb_path path); + u8 phydm_get_igi_reg_val(void *dm_void, enum bb_path path) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -689,6 +699,8 @@ void odm_pause_dig(void *dm_void, enum phydm_pause_type type, + PHYDM_DBG(dm, DBG_DIG, "pause_result=%d\n", rpt); + } + ++boolean ++phydm_dig_abort(void *dm_void); + boolean + phydm_dig_abort(void *dm_void) + { +@@ -787,6 +799,7 @@ void phydm_dig_init(void *dm_void) + #endif + } + ++void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band); + void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band) + { + struct phydm_dig_struct *dig_t = &dm->dm_dig_table; +@@ -839,6 +852,7 @@ void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band) + dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min); + } + ++void phydm_dig_dym_boundary_decision(struct dm_struct *dm); + void phydm_dig_dym_boundary_decision(struct dm_struct *dm) + { + struct phydm_dig_struct *dig_t = &dm->dm_dig_table; +@@ -918,6 +932,7 @@ void phydm_dig_dym_boundary_decision(struct dm_struct *dm) + dig_t->rx_gain_range_max, dig_t->rx_gain_range_min); + } + ++void phydm_dig_abnormal_case(struct dm_struct *dm); + void phydm_dig_abnormal_case(struct dm_struct *dm) + { + struct phydm_dig_struct *dig_t = &dm->dm_dig_table; +@@ -930,6 +945,7 @@ void phydm_dig_abnormal_case(struct dm_struct *dm) + dig_t->rx_gain_range_max, dig_t->rx_gain_range_min); + } + ++u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size); + u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size) + { + boolean dig_go_up_check = true; +@@ -949,6 +965,8 @@ u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size) + return igi; + } + ++u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt, ++ boolean is_dfs_band); + u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt, + boolean is_dfs_band) + { +@@ -1045,6 +1063,7 @@ u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt, + return igi; + } + ++boolean phydm_dig_dfs_mode_en(void *dm_void); + boolean phydm_dig_dfs_mode_en(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1203,6 +1222,7 @@ void phydm_dig_by_rssi_lps(void *dm_void) + * 3 FASLE ALARM CHECK + * 3============================================================ + */ ++void phydm_false_alarm_counter_reg_reset(void *dm_void); + void phydm_false_alarm_counter_reg_reset(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1299,6 +1319,7 @@ void phydm_false_alarm_counter_reg_reset(void *dm_void) + #endif /* @#if (ODM_IC_11AC_SERIES_SUPPORT) */ + } + ++void phydm_false_alarm_counter_reg_hold(void *dm_void); + void phydm_false_alarm_counter_reg_hold(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1418,6 +1439,7 @@ void phydm_fa_cnt_statistics_n(void *dm_void) + #endif + + #if (ODM_IC_11AC_SERIES_SUPPORT) ++void phydm_fa_cnt_statistics_ac(void *dm_void); + void phydm_fa_cnt_statistics_ac(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1510,6 +1532,7 @@ void phydm_fa_cnt_statistics_ac(void *dm_void) + } + #endif + ++void phydm_get_dbg_port_info(void *dm_void); + void phydm_get_dbg_port_info(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c b/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c +index fe0f5c220..ef2cac6d0 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c +@@ -749,6 +749,7 @@ void odm_release_timer(struct dm_struct *dm, struct phydm_timer_list *timer) + #endif + } + ++u8 phydm_trans_h2c_id(struct dm_struct *dm, u8 phydm_h2c_id); + u8 phydm_trans_h2c_id(struct dm_struct *dm, u8 phydm_h2c_id) + { + u8 platform_h2c_id = phydm_h2c_id; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c b/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c +index 77fe94e3f..6e76266d9 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c +@@ -39,6 +39,7 @@ + * + *************************************************/ + ++void phydm_set_noise_data_sum(struct noise_level *noise_data, u8 max_rf_path); + void phydm_set_noise_data_sum(struct noise_level *noise_data, u8 max_rf_path) + { + u8 i = 0; +@@ -152,6 +153,8 @@ s16 odm_inband_noise_monitor_n(struct dm_struct *dm, u8 is_pause_dig, u8 igi, + #endif + + #if (ODM_IC_11AC_SERIES_SUPPORT) ++s16 phydm_idle_noise_measure_ac(struct dm_struct *dm, u8 pause_dig, ++ u8 igi, u32 max_time); + s16 phydm_idle_noise_measure_ac(struct dm_struct *dm, u8 pause_dig, + u8 igi, u32 max_time) + { +@@ -251,6 +254,8 @@ s16 phydm_idle_noise_measure_ac(struct dm_struct *dm, u8 pause_dig, + return dm->noise_level.noise_all; + } + ++s16 odm_inband_noise_monitor_ac(struct dm_struct *dm, u8 pause_dig, u8 igi, ++ u32 max_time); + s16 odm_inband_noise_monitor_ac(struct dm_struct *dm, u8 pause_dig, u8 igi, + u32 max_time) + { +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c b/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c +index 060390b3c..627eb5074 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c +@@ -68,6 +68,10 @@ u8 phydm_get_gid(struct dm_struct *dm, u8 *phy_status_inf) + } + #endif + ++void phydm_rx_statistic_cal(struct dm_struct *dm, ++ struct phydm_phyinfo_struct *phy_info, ++ u8 *phy_status_inf, ++ struct phydm_perpkt_info_struct *pktinfo); + void phydm_rx_statistic_cal(struct dm_struct *dm, + struct phydm_phyinfo_struct *phy_info, + u8 *phy_status_inf, +@@ -186,6 +190,9 @@ void phydm_reset_phystatus_statistic(struct dm_struct *dm) + sizeof(struct phydm_phystatus_statistic)); + } + ++void phydm_avg_phystatus_index(void *dm_void, ++ struct phydm_phyinfo_struct *phy_info, ++ struct phydm_perpkt_info_struct *pktinfo); + void phydm_avg_phystatus_index(void *dm_void, + struct phydm_phyinfo_struct *phy_info, + struct phydm_perpkt_info_struct *pktinfo) +@@ -326,6 +333,7 @@ void phydm_avg_phystatus_index(void *dm_void, + } + } + ++void phydm_avg_phystatus_init(void *dm_void); + void phydm_avg_phystatus_init(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -340,6 +348,9 @@ void phydm_avg_phystatus_init(void *dm_void) + odm_move_memory(dm, dbg_i->evm_hist_th, evm_hist_th, size); + } + ++u8 phydm_get_signal_quality(struct phydm_phyinfo_struct *phy_info, ++ struct dm_struct *dm, ++ struct phy_status_rpt_8192cd *phy_sts); + u8 phydm_get_signal_quality(struct phydm_phyinfo_struct *phy_info, + struct dm_struct *dm, + struct phy_status_rpt_8192cd *phy_sts) +@@ -363,6 +374,7 @@ u8 phydm_get_signal_quality(struct phydm_phyinfo_struct *phy_info, + return result; + } + ++u8 phydm_pwr_2_percent(s8 ant_power); + u8 phydm_pwr_2_percent(s8 ant_power) + { + if ((ant_power <= -100) || ant_power >= 20) +@@ -750,6 +762,7 @@ phydm_cfo(s8 value) + return ret_val; + } + ++s8 phydm_cck_rssi_convert(struct dm_struct *dm, u16 lna_idx, u8 vga_idx); + s8 phydm_cck_rssi_convert(struct dm_struct *dm, u16 lna_idx, u8 vga_idx) + { + /*@phydm_get_cck_rssi_table_from_reg*/ +@@ -791,6 +804,7 @@ void phydm_get_cck_rssi_table_from_reg(struct dm_struct *dm) + dm->cck_lna_gain_table[6], dm->cck_lna_gain_table[7]); + } + ++s8 phydm_get_cck_rssi(void *dm_void, u8 lna_idx, u8 vga_idx); + s8 phydm_get_cck_rssi(void *dm_void, u8 lna_idx, u8 vga_idx) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1071,6 +1085,11 @@ void phydm_phy_sts_n_parsing(struct dm_struct *dm, + #endif + + #if ODM_IC_11AC_SERIES_SUPPORT ++void phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct *phy_info, ++ struct phydm_perpkt_info_struct * ++ pktinfo, ++ struct phy_status_rpt_8812 * ++ phy_sts); + void phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct *phy_info, + struct phydm_perpkt_info_struct * + pktinfo, +@@ -1104,6 +1123,8 @@ void phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct *phy_info, + } + } + ++void phydm_get_sq(struct dm_struct *dm, struct phydm_phyinfo_struct *phy_info, ++ u8 is_cck_rate); + void phydm_get_sq(struct dm_struct *dm, struct phydm_phyinfo_struct *phy_info, + u8 is_cck_rate) + { +@@ -1144,6 +1165,10 @@ void phydm_get_sq(struct dm_struct *dm, struct phydm_phyinfo_struct *phy_info, + phy_info->signal_quality = sq; + } + ++void phydm_rx_physts_1st_type(struct dm_struct *dm, ++ struct phydm_phyinfo_struct *phy_info, ++ u8 *phy_status_inf, ++ struct phydm_perpkt_info_struct *pktinfo); + void phydm_rx_physts_1st_type(struct dm_struct *dm, + struct phydm_phyinfo_struct *phy_info, + u8 *phy_status_inf, +@@ -1312,6 +1337,7 @@ void phydm_reset_rssi_for_dm(struct dm_struct *dm, u8 station_id) + + #if (ODM_IC_11N_SERIES_SUPPORT || ODM_IC_11AC_SERIES_SUPPORT) + ++s32 phydm_get_rssi_8814_ofdm(struct dm_struct *dm, u8 *rssi_in); + s32 phydm_get_rssi_8814_ofdm(struct dm_struct *dm, u8 *rssi_in) + { + s32 rssi_avg; +@@ -1358,6 +1384,9 @@ s32 phydm_get_rssi_8814_ofdm(struct dm_struct *dm, u8 *rssi_in) + return rssi_avg; + } + ++void phydm_process_rssi_for_dm(struct dm_struct *dm, ++ struct phydm_phyinfo_struct *phy_info, ++ struct phydm_perpkt_info_struct *pktinfo); + void phydm_process_rssi_for_dm(struct dm_struct *dm, + struct phydm_phyinfo_struct *phy_info, + struct phydm_perpkt_info_struct *pktinfo) +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c b/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c +index 077585dfc..2c24b9be9 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c +@@ -51,6 +51,7 @@ boolean phydm_is_cck_rate(void *dm_void, u8 rate) + return ((rate & 0x7f) <= ODM_RATE11M) ? true : false; + } + ++u8 phydm_rate_2_rate_digit(void *dm_void, u8 rate); + u8 phydm_rate_2_rate_digit(void *dm_void, u8 rate) + { + u8 legacy_table[12] = {1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54}; +@@ -151,6 +152,7 @@ void phydm_h2C_debug(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++void phydm_fw_fix_rate(void *dm_void, u8 en, u8 macid, u8 bw, u8 rate); + void phydm_fw_fix_rate(void *dm_void, u8 en, u8 macid, u8 bw, u8 rate) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -661,6 +663,7 @@ void phydm_update_hal_ra_mask( + + #endif + ++void phydm_rate_adaptive_mask_init(void *dm_void); + void phydm_rate_adaptive_mask_init(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -812,6 +815,7 @@ void phydm_show_sta_info(void *dm_void, char input[][16], u32 *_used, + *_out_len = out_len; + } + ++u8 phydm_get_tx_stream_num(void *dm_void, enum rf_type type); + u8 phydm_get_tx_stream_num(void *dm_void, enum rf_type type) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -831,6 +835,7 @@ u8 phydm_get_tx_stream_num(void *dm_void, enum rf_type type) + return tx_num; + } + ++u64 phydm_get_bb_mod_ra_mask(void *dm_void, u8 sta_idx); + u64 phydm_get_bb_mod_ra_mask(void *dm_void, u8 sta_idx) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1005,6 +1010,7 @@ u8 phydm_get_rate_from_rssi_lv(void *dm_void, u8 sta_idx) + return rate_idx; + } + ++u8 phydm_get_rate_id(void *dm_void, u8 sta_idx); + u8 phydm_get_rate_id(void *dm_void, u8 sta_idx) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -1109,6 +1115,8 @@ u8 phydm_get_rate_id(void *dm_void, u8 sta_idx) + return rate_id_idx; + } + ++void phydm_ra_h2c(void *dm_void, u8 sta_idx, u8 dis_ra, u8 dis_pt, ++ u8 no_update_bw, u8 init_ra_lv, u64 ra_mask); + void phydm_ra_h2c(void *dm_void, u8 sta_idx, u8 dis_ra, u8 dis_pt, + u8 no_update_bw, u8 init_ra_lv, u64 ra_mask) + { +@@ -1379,6 +1387,7 @@ u8 phydm_vht_en_mapping(void *dm_void, u32 wireless_mode) + return vht_en_out; + } + ++u8 phydm_rftype2rateid_2g_n20(void *dm_void, u8 rf_type); + u8 phydm_rftype2rateid_2g_n20(void *dm_void, u8 rf_type) + { + u8 rate_id_idx = 0; +@@ -1394,6 +1403,7 @@ u8 phydm_rftype2rateid_2g_n20(void *dm_void, u8 rf_type) + return rate_id_idx; + } + ++u8 phydm_rftype2rateid_2g_n40(void *dm_void, u8 rf_type); + u8 phydm_rftype2rateid_2g_n40(void *dm_void, u8 rf_type) + { + u8 rate_id_idx = 0; +@@ -1409,6 +1419,7 @@ u8 phydm_rftype2rateid_2g_n40(void *dm_void, u8 rf_type) + return rate_id_idx; + } + ++u8 phydm_rftype2rateid_5g_n(void *dm_void, u8 rf_type); + u8 phydm_rftype2rateid_5g_n(void *dm_void, u8 rf_type) + { + u8 rate_id_idx = 0; +@@ -1424,6 +1435,7 @@ u8 phydm_rftype2rateid_5g_n(void *dm_void, u8 rf_type) + return rate_id_idx; + } + ++u8 phydm_rftype2rateid_ac80(void *dm_void, u8 rf_type); + u8 phydm_rftype2rateid_ac80(void *dm_void, u8 rf_type) + { + u8 rate_id_idx = 0; +@@ -1439,6 +1451,7 @@ u8 phydm_rftype2rateid_ac80(void *dm_void, u8 rf_type) + return rate_id_idx; + } + ++u8 phydm_rftype2rateid_ac40(void *dm_void, u8 rf_type); + u8 phydm_rftype2rateid_ac40(void *dm_void, u8 rf_type) + { + u8 rate_id_idx = 0; +@@ -1566,6 +1579,7 @@ u8 phydm_rate_order_compute(void *dm_void, u8 rate_idx) + } + + #if (DM_ODM_SUPPORT_TYPE == ODM_CE) ++u8 phydm_rate2ss(void *dm_void, u8 rate_idx); + u8 phydm_rate2ss(void *dm_void, u8 rate_idx) + { + u8 ret = 0xff; +@@ -1591,6 +1605,7 @@ u8 phydm_rate2ss(void *dm_void, u8 rate_idx) + return ret; + } + ++u8 phydm_rate2plcp(void *dm_void, u8 rate_idx); + u8 phydm_rate2plcp(void *dm_void, u8 rate_idx) + { + u8 rate2ss = 0; +@@ -1635,6 +1650,7 @@ u8 phydm_get_plcp(void *dm_void, u16 macid) + } + #endif + ++void phydm_ra_common_info_update(void *dm_void); + void phydm_ra_common_info_update(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c b/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c +index 0d5e41766..8936cc31e 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c +@@ -32,6 +32,7 @@ + + #ifdef PHYDM_SUPPORT_RSSI_MONITOR + ++void phydm_rssi_monitor_h2c(void *dm_void, u8 macid); + void phydm_rssi_monitor_h2c(void *dm_void, u8 macid) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -95,6 +96,7 @@ void phydm_rssi_monitor_h2c(void *dm_void, u8 macid) + } + } + ++void phydm_calculate_rssi_min_max(void *dm_void); + void phydm_calculate_rssi_min_max(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +diff --git a/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c b/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c +index 5de0754da..ba3432e60 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c ++++ b/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c +@@ -86,6 +86,10 @@ phydm_set_ext_band_switch_8821A( + } + + ++void ++odm_dynamic_try_state_agg_8821a( ++ struct dm_struct *dm ++); + void + odm_dynamic_try_state_agg_8821a( + struct dm_struct *dm +@@ -99,6 +103,10 @@ odm_dynamic_try_state_agg_8821a( + } + } + ++void ++odm_dynamic_packet_detection_th_8821a( ++ struct dm_struct *dm ++); + void + odm_dynamic_packet_detection_th_8821a( + struct dm_struct *dm +diff --git a/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c b/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c +index ae45a5b1a..4329dcaee 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c ++++ b/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c +@@ -47,6 +47,8 @@ void hal_com_txbf_config_gtab( + hal_txbf_8822b_config_gtab(dm); + } + ++void phydm_beamform_set_sounding_enter( ++ void *dm_void); + void phydm_beamform_set_sounding_enter( + void *dm_void) + { +@@ -61,6 +63,8 @@ void phydm_beamform_set_sounding_enter( + #endif + } + ++void phydm_beamform_set_sounding_leave( ++ void *dm_void); + void phydm_beamform_set_sounding_leave( + void *dm_void) + { +@@ -75,6 +79,8 @@ void phydm_beamform_set_sounding_leave( + #endif + } + ++void phydm_beamform_set_sounding_rate( ++ void *dm_void); + void phydm_beamform_set_sounding_rate( + void *dm_void) + { +@@ -89,6 +95,8 @@ void phydm_beamform_set_sounding_rate( + #endif + } + ++void phydm_beamform_set_sounding_status( ++ void *dm_void); + void phydm_beamform_set_sounding_status( + void *dm_void) + { +@@ -103,6 +111,8 @@ void phydm_beamform_set_sounding_status( + #endif + } + ++void phydm_beamform_set_sounding_fw_ndpa( ++ void *dm_void); + void phydm_beamform_set_sounding_fw_ndpa( + void *dm_void) + { +@@ -119,6 +129,8 @@ void phydm_beamform_set_sounding_fw_ndpa( + #endif + } + ++void phydm_beamform_set_sounding_clk( ++ void *dm_void); + void phydm_beamform_set_sounding_clk( + void *dm_void) + { +@@ -135,6 +147,8 @@ void phydm_beamform_set_sounding_clk( + #endif + } + ++void phydm_beamform_set_reset_tx_path( ++ void *dm_void); + void phydm_beamform_set_reset_tx_path( + void *dm_void) + { +@@ -150,6 +164,8 @@ void phydm_beamform_set_reset_tx_path( + #endif + } + ++void phydm_beamform_set_get_tx_rate( ++ void *dm_void); + void phydm_beamform_set_get_tx_rate( + void *dm_void) + { +diff --git a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c +index 7ad6ca909..328a4b5d2 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c ++++ b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c +@@ -233,6 +233,7 @@ u8 hal_txbf_8814a_get_ntx(void *dm_void) + return ntx; + } + ++u8 hal_txbf_8814a_get_nrx(void *dm_void); + u8 hal_txbf_8814a_get_nrx(void *dm_void) + { + struct dm_struct *dm = (struct dm_struct *)dm_void; +@@ -259,6 +260,9 @@ u8 hal_txbf_8814a_get_nrx(void *dm_void) + return nrx; + } + ++void hal_txbf_8814a_rf_mode(void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beamforming_info, ++ u8 idx); + void hal_txbf_8814a_rf_mode(void *dm_void, + struct _RT_BEAMFORMING_INFO *beamforming_info, + u8 idx) +diff --git a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c +index 18a47d4a9..c42fa53a6 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c ++++ b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c +@@ -33,6 +33,9 @@ void hal_txbf_8812a_set_ndpa_rate( + odm_write_1byte(dm, REG_NDPA_OPT_CTRL_8812A, (rate << 2 | BW)); + } + ++void hal_txbf_jaguar_rf_mode( ++ void *dm_void, ++ struct _RT_BEAMFORMING_INFO *beam_info); + void hal_txbf_jaguar_rf_mode( + void *dm_void, + struct _RT_BEAMFORMING_INFO *beam_info) +@@ -76,6 +79,9 @@ void hal_txbf_jaguar_rf_mode( + odm_set_bb_reg(dm, R_0x80c, MASKBYTE1, 0x11); + } + ++void hal_txbf_jaguar_download_ndpa( ++ void *dm_void, ++ u8 idx); + void hal_txbf_jaguar_download_ndpa( + void *dm_void, + u8 idx) +@@ -165,6 +171,8 @@ void hal_txbf_jaguar_download_ndpa( + #endif + } + ++void hal_txbf_jaguar_fw_txbf_cmd( ++ void *dm_void); + void hal_txbf_jaguar_fw_txbf_cmd( + void *dm_void) + { +diff --git a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c +index ecbb397d5..75a0594ef 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c ++++ b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c +@@ -158,6 +158,11 @@ u8 rtl8812_set_rssi_cmd(_adapter *padapter, u8 *param) + return res; + } + ++u8 Get_VHT_ENI( ++ u32 IOTAction, ++ u32 WirelessMode, ++ u32 ratr_bitmap ++); + u8 Get_VHT_ENI( + u32 IOTAction, + u32 WirelessMode, +@@ -178,6 +183,13 @@ u8 Get_VHT_ENI( + return Ret << 4; + } + ++BOOLEAN ++Get_RA_ShortGI_8812( ++ PADAPTER Adapter, ++ struct sta_info *psta, ++ u8 shortGIrate, ++ u32 ratr_bitmap ++); + BOOLEAN + Get_RA_ShortGI_8812( + PADAPTER Adapter, +@@ -449,6 +461,7 @@ void rtl8812_set_p2p_ps_offload_cmd(_adapter *padapter, u8 p2p_ps_state) + } + #endif /* CONFIG_P2P */ + ++void rtl8812_download_rsvd_page(PADAPTER padapter, u8 mstatus); + void rtl8812_download_rsvd_page(PADAPTER padapter, u8 mstatus) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +diff --git a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c +index 4a21818b7..5e26efadb 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c ++++ b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c +@@ -685,6 +685,11 @@ void InitializeFirmwareVars8812(PADAPTER padapter) + * Porting from 8723B. 2013.04.01 + * */ + VOID ++SetFwBTFwPatchCmd_8821( ++ IN PADAPTER Adapter, ++ IN u2Byte FwSize ++); ++VOID + SetFwBTFwPatchCmd_8821( + IN PADAPTER Adapter, + IN u2Byte FwSize +@@ -705,6 +710,7 @@ SetFwBTFwPatchCmd_8821( + } + + #ifdef CONFIG_MP_INCLUDED ++int ReservedPage_Compare(PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware, u32 BTPatchSize); + int ReservedPage_Compare(PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware, u32 BTPatchSize) + { + u8 temp, ret, lastBTsz; +@@ -1119,6 +1125,12 @@ Hal_ReadAntennaDiversity8812A( + #endif + } + ++VOID ++hal_ReadPAType_8812A( ++ IN PADAPTER Adapter, ++ IN u8 *PROMContent, ++ IN BOOLEAN AutoloadFail ++); + VOID + hal_ReadPAType_8812A( + IN PADAPTER Adapter, +@@ -1976,6 +1988,13 @@ rtl8812_ReadEFuse( + + /* Do not support BT */ + VOID ++Hal_EFUSEGetEfuseDefinition8812A( ++ IN PADAPTER pAdapter, ++ IN u1Byte efuseType, ++ IN u1Byte type, ++ OUT PVOID pOut ++); ++VOID + Hal_EFUSEGetEfuseDefinition8812A( + IN PADAPTER pAdapter, + IN u1Byte efuseType, +@@ -2057,6 +2076,13 @@ Hal_EFUSEGetEfuseDefinition8812A( + } + } + VOID ++Hal_EFUSEGetEfuseDefinition_Pseudo8812A( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN u8 type, ++ OUT PVOID pOut ++); ++VOID + Hal_EFUSEGetEfuseDefinition_Pseudo8812A( + IN PADAPTER pAdapter, + IN u8 efuseType, +@@ -2486,6 +2512,14 @@ rtl8812_Efuse_PgPacketRead(IN PADAPTER pAdapter, + } + + ++BOOLEAN ++hal_EfuseFixHeaderProcess( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN PPGPKT_STRUCT pFixPkt, ++ IN u16 *pAddr, ++ IN BOOLEAN bPseudoTest ++); + BOOLEAN + hal_EfuseFixHeaderProcess( + IN PADAPTER pAdapter, +@@ -2687,6 +2721,11 @@ hal_EfusePgPacketWriteData( + return _TRUE; + } + ++BOOLEAN efuse_PgPacketCheck( ++ PADAPTER pAdapter, ++ u8 efuseType, ++ BOOLEAN bPseudoTest ++); + BOOLEAN efuse_PgPacketCheck( + PADAPTER pAdapter, + u8 efuseType, +@@ -2704,6 +2743,13 @@ BOOLEAN efuse_PgPacketCheck( + } + + ++VOID ++efuse_PgPacketConstruct( ++ IN u8 offset, ++ IN u8 word_en, ++ IN u8 *pData, ++ IN OUT PPGPKT_STRUCT pTargetPkt ++); + VOID + efuse_PgPacketConstruct( + IN u8 offset, +@@ -2721,6 +2767,11 @@ efuse_PgPacketConstruct( + RTW_INFO("efuse_PgPacketConstruct(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts); + } + ++u2Byte ++Hal_EfusePgPacketExceptionHandle_8812A( ++ PADAPTER pAdapter, ++ u2Byte ErrOffset ++ ); + u2Byte + Hal_EfusePgPacketExceptionHandle_8812A( + PADAPTER pAdapter, +@@ -2794,6 +2845,12 @@ Hal_EfusePgPacketExceptionHandle_8812A( + } + + ++BOOLEAN hal_EfuseCheckIfDatafollowed( ++ IN PADAPTER pAdapter, ++ IN u8 word_cnts, ++ IN u16 startAddr, ++ IN BOOLEAN bPseudoTest ++); + BOOLEAN hal_EfuseCheckIfDatafollowed( + IN PADAPTER pAdapter, + IN u8 word_cnts, +@@ -2813,6 +2870,12 @@ BOOLEAN hal_EfuseCheckIfDatafollowed( + } + + ++BOOLEAN ++hal_EfuseWordEnMatched( ++ IN PPGPKT_STRUCT pTargetPkt, ++ IN PPGPKT_STRUCT pCurPkt, ++ IN u8 *pWden ++); + BOOLEAN + hal_EfuseWordEnMatched( + IN PPGPKT_STRUCT pTargetPkt, +@@ -2849,6 +2912,14 @@ hal_EfuseWordEnMatched( + } + + ++BOOLEAN ++efuse_PgPacketPartialWrite( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN OUT u16 *pAddr, ++ IN PPGPKT_STRUCT pTargetPkt, ++ IN BOOLEAN bPseudoTest ++); + BOOLEAN + efuse_PgPacketPartialWrite( + IN PADAPTER pAdapter, +@@ -3004,6 +3075,12 @@ efuse_PgPacketPartialWrite( + return bRet; + } + ++BOOLEAN efuse_PgPacketWriteHeader( ++ PADAPTER pAdapter, ++ u8 efuseType, ++ u16 *pAddr, ++ PPGPKT_STRUCT pTargetPkt, ++ BOOLEAN bPseudoTest); + BOOLEAN efuse_PgPacketWriteHeader( + PADAPTER pAdapter, + u8 efuseType, +@@ -3021,6 +3098,12 @@ BOOLEAN efuse_PgPacketWriteHeader( + return bRet; + } + ++int ++hal_EfusePgPacketWrite_8812A(IN PADAPTER pAdapter, ++ u8 offset, ++ u8 word_en, ++ u8 *pData, ++ BOOLEAN bPseudoTest); + int + hal_EfusePgPacketWrite_8812A(IN PADAPTER pAdapter, + u8 offset, +@@ -3288,6 +3371,7 @@ void rtl8812_stop_thread(PADAPTER padapter) + { + } + ++void hal_notch_filter_8812(_adapter *adapter, bool enable); + void hal_notch_filter_8812(_adapter *adapter, bool enable) + { + if (enable) { +@@ -5194,6 +5278,7 @@ struct bcn_qinfo_8812a { + u16 pkt_num:8; + }; + ++void dump_qinfo_8812a(void *sel, struct qinfo_8812a *info, const char *tag); + void dump_qinfo_8812a(void *sel, struct qinfo_8812a *info, const char *tag) + { + /* if (info->pkt_num) */ +@@ -5202,6 +5287,7 @@ void dump_qinfo_8812a(void *sel, struct qinfo_8812a *info, const char *tag) + ); + } + ++void dump_bcn_qinfo_8812a(void *sel, struct bcn_qinfo_8812a *info, const char *tag); + void dump_bcn_qinfo_8812a(void *sel, struct bcn_qinfo_8812a *info, const char *tag) + { + /* if (info->pkt_num) */ +@@ -5210,6 +5296,7 @@ void dump_bcn_qinfo_8812a(void *sel, struct bcn_qinfo_8812a *info, const char *t + ); + } + ++void dump_mac_qinfo_8812a(void *sel, _adapter *adapter); + void dump_mac_qinfo_8812a(void *sel, _adapter *adapter) + { + u32 q0_info; +@@ -5277,6 +5364,7 @@ static void dump_mac_txfifo_8812a(void *sel, _adapter *adapter) + } + } + ++void rtl8812a_read_wmmedca_reg(PADAPTER adapter, u16 *vo_params, u16 *vi_params, u16 *be_params, u16 *bk_params); + void rtl8812a_read_wmmedca_reg(PADAPTER adapter, u16 *vo_params, u16 *vi_params, u16 *be_params, u16 *bk_params) + { + u8 vo_reg_params[4]; +@@ -5447,6 +5535,7 @@ u8 SetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) + return bResult; + } + ++void hal_ra_info_dump(_adapter *padapter , void *sel); + void hal_ra_info_dump(_adapter *padapter , void *sel) + { + int i; +diff --git a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c +index 464168823..f44fb3c3e 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c ++++ b/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c +@@ -446,6 +446,13 @@ PHY_RFConfig8812( + return rtStatus; + } + ++VOID ++PHY_TxPowerTrainingByPath_8812( ++ IN PADAPTER Adapter, ++ IN enum channel_width BandWidth, ++ IN u8 Channel, ++ IN u8 RfPath ++); + VOID + PHY_TxPowerTrainingByPath_8812( + IN PADAPTER Adapter, +@@ -1097,6 +1104,11 @@ u32 phy_get_tx_bb_swing_8812a( + return out; + } + ++VOID ++phy_SetRFEReg8812( ++ IN PADAPTER Adapter, ++ IN u8 Band ++); + VOID + phy_SetRFEReg8812( + IN PADAPTER Adapter, +@@ -1218,6 +1230,11 @@ phy_SetRFEReg8812( + } + } + ++void phy_SetBBSwingByBand_8812A( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN u1Byte PreviousBand ++); + void phy_SetBBSwingByBand_8812A( + IN PADAPTER Adapter, + IN u8 Band, +@@ -1260,6 +1277,11 @@ void phy_SetBBSwingByBand_8812A( + } + + ++VOID ++phy_SetRFEReg8821( ++ IN PADAPTER Adapter, ++ IN u1Byte Band ++); + VOID + phy_SetRFEReg8821( + IN PADAPTER Adapter, +@@ -1459,6 +1481,11 @@ PHY_SwitchWirelessBand8812( + return _SUCCESS; + } + ++BOOLEAN ++phy_SwBand8812( ++ IN PADAPTER pAdapter, ++ IN u8 channelToSW ++); + BOOLEAN + phy_SwBand8812( + IN PADAPTER pAdapter, +@@ -1489,6 +1516,10 @@ phy_SwBand8812( + + #pragma clang optimize off + u8 ++phy_GetSecondaryChnl_8812( ++ IN PADAPTER Adapter ++); ++u8 + phy_GetSecondaryChnl_8812( + IN PADAPTER Adapter + ) +@@ -1531,6 +1562,11 @@ phy_GetSecondaryChnl_8812( + } + #pragma clang optimize on + ++VOID ++phy_SetRegBW_8812( ++ IN PADAPTER Adapter, ++ enum channel_width CurrentBW ++); + VOID + phy_SetRegBW_8812( + IN PADAPTER Adapter, +@@ -1562,6 +1598,12 @@ phy_SetRegBW_8812( + + } + ++void ++phy_FixSpur_8812A( ++ IN PADAPTER pAdapter, ++ IN enum channel_width Bandwidth, ++ IN u1Byte Channel ++); + void + phy_FixSpur_8812A( + IN PADAPTER pAdapter, +@@ -1605,6 +1647,10 @@ phy_FixSpur_8812A( + + } + ++VOID ++phy_PostSetBwMode8812( ++ IN PADAPTER Adapter ++); + VOID + phy_PostSetBwMode8812( + IN PADAPTER Adapter +@@ -1699,6 +1745,9 @@ phy_PostSetBwMode8812( + } + + /* <20130207, Kordan> The variales initialized here are used in odm_LNAPowerControl(). */ ++VOID phy_InitRssiTRSW( ++ IN PADAPTER pAdapter ++); + VOID phy_InitRssiTRSW( + IN PADAPTER pAdapter + ) +@@ -1723,6 +1772,12 @@ VOID phy_InitRssiTRSW( + + /*Referenced from "WB-20130801-YN-RL6286 Settings for Spur Issues R02.xls"*/ + VOID ++phy_SpurCalibration_8812A( ++ IN PADAPTER pAdapter, ++ IN u8 Channel, ++ IN u8 Bandwidth ++); ++VOID + phy_SpurCalibration_8812A( + IN PADAPTER pAdapter, + IN u8 Channel, +@@ -1769,6 +1824,10 @@ phy_SpurCalibration_8812A( + + } + ++VOID ++phy_SwChnl8812( ++ IN PADAPTER pAdapter ++); + VOID + phy_SwChnl8812( + IN PADAPTER pAdapter +@@ -1861,6 +1920,10 @@ phy_SwChnl8812( + phy_SpurCalibration_8812A(pAdapter, channelToSW, bandwidthToSw); + } + ++VOID ++phy_SwChnlAndSetBwMode8812( ++ IN PADAPTER Adapter ++); + VOID + phy_SwChnlAndSetBwMode8812( + IN PADAPTER Adapter +@@ -1918,6 +1981,17 @@ phy_SwChnlAndSetBwMode8812( + } + } + ++VOID ++PHY_HandleSwChnlAndSetBW8812( ++ IN PADAPTER Adapter, ++ IN BOOLEAN bSwitchChannel, ++ IN BOOLEAN bSetBandWidth, ++ IN u8 ChannelNum, ++ IN enum channel_width ChnlWidth, ++ IN u8 ChnlOffsetOf40MHz, ++ IN u8 ChnlOffsetOf80MHz, ++ IN u8 CenterFrequencyIndex1 ++); + VOID + PHY_HandleSwChnlAndSetBW8812( + IN PADAPTER Adapter, +diff --git a/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c b/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c +index 37d6cec0a..d2b2b2c99 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c ++++ b/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c +@@ -145,6 +145,7 @@ static BOOLEAN HalUsbSetQueuePipeMapping8812AUsb( + + } + ++void rtl8812au_interface_configure(_adapter *padapter); + void rtl8812au_interface_configure(_adapter *padapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +@@ -1116,6 +1117,10 @@ init_UsbAggregationSetting_8812A( + * + *---------------------------------------------------------------------------*/ + VOID ++USB_AggModeSwitch( ++ IN PADAPTER Adapter ++); ++VOID + USB_AggModeSwitch( + IN PADAPTER Adapter + ) +@@ -1278,6 +1283,7 @@ HalDetectSelectiveSuspendMode( + #endif + } /* HalDetectSelectiveSuspendMode */ + ++rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter); + rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +@@ -1298,12 +1304,14 @@ rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter) + return rfpowerstate; + } /* HalDetectPwrDownMode */ + ++void _ps_open_RF(_adapter *padapter); + void _ps_open_RF(_adapter *padapter) + { + /* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */ + /* phy_SsPwrSwitch92CU(padapter, rf_on, 1); */ + } + ++void _ps_close_RF(_adapter *padapter); + void _ps_close_RF(_adapter *padapter) + { + /* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */ +@@ -1353,6 +1361,7 @@ static void rtl8812au_hw_reset(_adapter *Adapter) + } + } + ++u32 rtl8812au_hal_init(PADAPTER Adapter); + u32 rtl8812au_hal_init(PADAPTER Adapter) + { + u8 value8 = 0, u1bRegCR; +@@ -1804,6 +1813,10 @@ u32 rtl8812au_hal_init(PADAPTER Adapter) + return status; + } + ++VOID ++hal_poweroff_8812au( ++ IN PADAPTER Adapter ++); + VOID + hal_poweroff_8812au( + IN PADAPTER Adapter +@@ -1872,6 +1885,7 @@ static void rtl8812au_hw_power_down(_adapter *padapter) + rtw_write16(padapter, REG_APS_FSMCO, 0x8812); + } + ++u32 rtl8812au_hal_deinit(PADAPTER Adapter); + u32 rtl8812au_hal_deinit(PADAPTER Adapter) + { + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); +@@ -1922,7 +1936,8 @@ u32 rtl8812au_hal_deinit(PADAPTER Adapter) + } + + +-unsigned int rtl8812au_inirp_init(PADAPTER Adapter) ++unsigned int rtl8812au_inirp_init(PADAPTER Adapter); ++unsigned int rtl8812au_inirp_init(PADAPTER Adapter) + { + u8 i; + struct recv_buf *precvbuf; +@@ -1976,7 +1991,8 @@ unsigned int rtl8812au_inirp_init(PADAPTER Adapter) + + } + +-unsigned int rtl8812au_inirp_deinit(PADAPTER Adapter) ++unsigned int rtl8812au_inirp_deinit(PADAPTER Adapter); ++unsigned int rtl8812au_inirp_deinit(PADAPTER Adapter) + { + + rtw_read_port_cancel(Adapter); +@@ -1991,6 +2007,12 @@ unsigned int rtl8812au_inirp_deinit(PADAPTER Adapter) + * + * ------------------------------------------------------------------- */ + VOID ++hal_ReadIDs_8812AU( ++ IN PADAPTER Adapter, ++ IN pu1Byte PROMContent, ++ IN BOOLEAN AutoloadFail ++); ++VOID + hal_ReadIDs_8812AU( + IN PADAPTER Adapter, + IN pu1Byte PROMContent, +@@ -2049,6 +2071,11 @@ hal_ReadIDs_8812AU( + RTW_INFO("Customer ID: 0x%02X, SubCustomer ID: 0x%02X\n", pHalData->EEPROMCustomerID, pHalData->EEPROMSubCustomerID); + } + ++VOID ++hal_InitPGData_8812A( ++ IN PADAPTER padapter, ++ IN OUT u8 *PROMContent ++); + VOID + hal_InitPGData_8812A( + IN PADAPTER padapter, +@@ -2127,6 +2154,10 @@ hal_InitPGData_8812A( + + } + ++VOID ++hal_CustomizedBehavior_8812AU( ++ IN PADAPTER Adapter ++); + VOID + hal_CustomizedBehavior_8812AU( + IN PADAPTER Adapter +@@ -2266,6 +2297,12 @@ hal_CustomizeByCustomerID_8812AU( + hal_CustomizedBehavior_8812AU(pAdapter); + } + ++VOID ++hal_ReadUsbModeSwitch_8812AU( ++ IN PADAPTER Adapter, ++ IN u8 *PROMContent, ++ IN BOOLEAN AutoloadFail ++); + VOID + hal_ReadUsbModeSwitch_8812AU( + IN PADAPTER Adapter, +@@ -2302,6 +2339,10 @@ ReadLEDSetting_8812AU( + #endif + } + ++VOID ++InitAdapterVariablesByPROM_8812AU( ++ IN PADAPTER Adapter ++); + VOID + InitAdapterVariablesByPROM_8812AU( + IN PADAPTER Adapter +@@ -2372,6 +2413,10 @@ static void Hal_ReadPROMContent_8812A( + InitAdapterVariablesByPROM_8812AU(Adapter); + } + ++u8 ++ReadAdapterInfo8812AU( ++ IN PADAPTER Adapter ++); + u8 + ReadAdapterInfo8812AU( + IN PADAPTER Adapter +@@ -2386,6 +2431,7 @@ ReadAdapterInfo8812AU( + return _SUCCESS; + } + ++void UpdateInterruptMask8812AU(PADAPTER padapter, u8 bHIMR0 , u32 AddMSR, u32 RemoveMSR); + void UpdateInterruptMask8812AU(PADAPTER padapter, u8 bHIMR0 , u32 AddMSR, u32 RemoveMSR) + { + HAL_DATA_TYPE *pHalData; +@@ -2411,6 +2457,7 @@ void UpdateInterruptMask8812AU(PADAPTER padapter, u8 bHIMR0 , u32 AddMSR, u32 Re + + } + ++u8 SetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val); + u8 SetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +@@ -2500,6 +2547,7 @@ u8 SetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val) + return ret; + } + ++void GetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val); + void GetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +@@ -2531,6 +2579,12 @@ void GetHwReg8812AU(PADAPTER Adapter, u8 variable, u8 *val) + * Change default setting of specified variable. + * */ + u8 ++SetHalDefVar8812AUsb( ++ IN PADAPTER Adapter, ++ IN HAL_DEF_VARIABLE eVariable, ++ IN PVOID pValue ++); ++u8 + SetHalDefVar8812AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, +@@ -2554,6 +2608,12 @@ SetHalDefVar8812AUsb( + * Query setting of specified variable. + * */ + u8 ++GetHalDefVar8812AUsb( ++ IN PADAPTER Adapter, ++ IN HAL_DEF_VARIABLE eVariable, ++ IN PVOID pValue ++); ++u8 + GetHalDefVar8812AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, +@@ -2572,6 +2632,7 @@ GetHalDefVar8812AUsb( + return bResult; + } + ++void _update_response_rate(_adapter *padapter, unsigned int mask); + void _update_response_rate(_adapter *padapter, unsigned int mask) + { + u8 RateIndex = 0; +diff --git a/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c b/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c +index 22f8c42cf..db7f3b2c5 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c ++++ b/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c +@@ -101,6 +101,7 @@ void interrupt_handler_8812au(_adapter *padapter, u16 pkt_len, u8 *pbuf) + } + #endif + ++int recvbuf2recvframe(PADAPTER padapter, void *ptr); + int recvbuf2recvframe(PADAPTER padapter, void *ptr) + { + u8 *pbuf; +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c +index 6aa1fda17..76ed34e50 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c +@@ -151,6 +151,7 @@ s32 FillH2CCmd_8814(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) + return ret; + } + ++u8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param); + u8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param) + { + u8 res=_SUCCESS; +@@ -206,6 +207,13 @@ static u8 Get_VHT_ENI( + return (Ret << 4); + } + ++BOOLEAN ++Get_RA_ShortGI_8814( ++ PADAPTER Adapter, ++ struct sta_info *psta, ++ u8 shortGIrate, ++ u32 ratr_bitmap ++); + BOOLEAN + Get_RA_ShortGI_8814( + PADAPTER Adapter, +@@ -267,6 +275,10 @@ Set_RA_LDPC_8814( + } + + ++u8 ++Get_RA_LDPC_8814( ++ struct sta_info *psta ++); + u8 + Get_RA_LDPC_8814( + struct sta_info *psta +@@ -597,6 +609,7 @@ static void ConstructNullFunctionData( + *pLength = pktlen; + } + ++void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID); + void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) + { + struct rtw_ieee80211_hdr *pwlanhdr; +@@ -1152,6 +1165,7 @@ static void rtl8814_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvd + #endif + + ++int rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms); + int rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +@@ -1164,6 +1178,7 @@ int rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms) + return rtw_sctx_wait(iqk_sctx, __func__); + } + ++void rtl8814_iqk_done(_adapter* padapter); + void rtl8814_iqk_done(_adapter* padapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c +index f1a903d68..d203753b6 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c +@@ -119,6 +119,11 @@ void hal_DetectWoWMode(PADAPTER pAdapter) + #endif + + ++VOID ++_FWDownloadEnable_8814A( ++ IN PADAPTER Adapter, ++ IN BOOLEAN enable ++ ); + VOID + _FWDownloadEnable_8814A( + IN PADAPTER Adapter, +@@ -152,6 +157,12 @@ _FWDownloadEnable_8814A( + + #define MAX_REG_BOLCK_SIZE 196 + ++VOID ++_BlockWrite_8814A( ++ IN PADAPTER Adapter, ++ IN PVOID buffer, ++ IN u32 buffSize ++ ); + VOID + _BlockWrite_8814A( + IN PADAPTER Adapter, +@@ -212,6 +223,13 @@ _BlockWrite_8814A( + } + } + ++VOID ++_PageWrite_8814A( ++ IN PADAPTER Adapter, ++ IN u32 page, ++ IN PVOID buffer, ++ IN u32 size ++ ); + VOID + _PageWrite_8814A( + IN PADAPTER Adapter, +@@ -229,6 +247,11 @@ _PageWrite_8814A( + _BlockWrite_8814A(Adapter,buffer,size); + } + ++VOID ++_FillDummy_8814A( ++ u8* pFwBuf, ++ pu4Byte pFwLen ++ ); + VOID + _FillDummy_8814A( + u8* pFwBuf, +@@ -249,6 +272,12 @@ _FillDummy_8814A( + *pFwLen = FwLen; + } + ++VOID ++_WriteFW_8814A( ++ IN PADAPTER Adapter, ++ IN PVOID buffer, ++ IN u32 size ++ ); + VOID + _WriteFW_8814A( + IN PADAPTER Adapter, +@@ -284,6 +313,10 @@ _WriteFW_8814A( + } + } + ++VOID ++_3081Disable8814A( ++ IN PADAPTER Adapter ++ ); + VOID + _3081Disable8814A( + IN PADAPTER Adapter +@@ -296,6 +329,10 @@ _3081Disable8814A( + + } + ++VOID ++_3081Enable8814A( ++ IN PADAPTER Adapter ++ ); + VOID + _3081Enable8814A( + IN PADAPTER Adapter +@@ -453,6 +490,12 @@ WaitDownLoadRSVDPageOK_3081( + } + + ++VOID ++SetDownLoadFwRsvdPagePkt_8814A( ++ IN PADAPTER Adapter, ++ IN PVOID buffer, ++ IN u32 len ++ ); + VOID + SetDownLoadFwRsvdPagePkt_8814A( + IN PADAPTER Adapter, +@@ -535,6 +578,12 @@ static void SetBcnCtrlReg( + rtw_write8(padapter, REG_BCN_CTRL, RegBcnCtrlVal); + } + ++VOID ++HalROMDownloadFWRSVDPage8814A( ++ IN PADAPTER Adapter, ++ IN PVOID buffer, ++ IN u32 Len ++); + VOID + HalROMDownloadFWRSVDPage8814A( + IN PADAPTER Adapter, +@@ -726,6 +775,10 @@ HalROMDownloadFWRSVDPage8814A( + } + } + ++s32 ++_FWFreeToGo8814A( ++ IN PADAPTER Adapter ++ ); + s32 + _FWFreeToGo8814A( + IN PADAPTER Adapter +@@ -1444,6 +1497,11 @@ SetFwRelatedForWoWLAN8812( + // Efuse related code + //=========================================================== + BOOLEAN ++hal_GetChnlGroup8814A( ++ IN u8 Channel, ++ OUT u8* pGroup ++ ); ++BOOLEAN + hal_GetChnlGroup8814A( + IN u8 Channel, + OUT u8* pGroup +@@ -1774,6 +1832,10 @@ hal_ReadPowerValueFromPROM8814A( + } + #endif + ++VOID ++HALBT_InitHalVars( ++ IN PADAPTER Adapter ++ ); + VOID + HALBT_InitHalVars( + IN PADAPTER Adapter +@@ -1792,6 +1854,10 @@ HALBT_InitHalVars( + } + + ++VOID ++BT_InitHalVars( ++ IN PADAPTER Adapter ++ ); + VOID + BT_InitHalVars( + IN PADAPTER Adapter +@@ -2789,6 +2855,13 @@ rtl8814_ReadEFuse( + + //Do not support BT + VOID ++hal_EFUSEGetEfuseDefinition8814A( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN u8 type, ++ OUT PVOID pOut ++ ); ++VOID + hal_EFUSEGetEfuseDefinition8814A( + IN PADAPTER pAdapter, + IN u8 efuseType, +@@ -3231,6 +3304,11 @@ efuse_PgPacketConstruct( + } + + ++u16 ++efuse_PgPacketExceptionHandle( ++ IN PADAPTER pAdapter, ++ IN u16 ErrOffset ++ ); + u16 + efuse_PgPacketExceptionHandle( + IN PADAPTER pAdapter, +@@ -3528,6 +3606,13 @@ hal_EfuseFixHeaderProcess( + } + + ++BOOLEAN ++efuse_PgPacketWrite2ByteHeader( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN OUT u16* pAddr, ++ IN PPGPKT_STRUCT pTargetPkt, ++ IN BOOLEAN bPseudoTest); + BOOLEAN + efuse_PgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, +@@ -3631,6 +3716,13 @@ efuse_PgPacketWrite2ByteHeader( + } + + ++BOOLEAN ++efuse_PgPacketWrite1ByteHeader( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN OUT u16* pAddr, ++ IN PPGPKT_STRUCT pTargetPkt, ++ IN BOOLEAN bPseudoTest); + BOOLEAN + efuse_PgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, +@@ -3724,6 +3816,13 @@ efuse_PgPacketWriteHeader( + return bRet; + } + ++BOOLEAN ++efuse_PgPacketWriteData( ++ IN PADAPTER pAdapter, ++ IN u8 efuseType, ++ IN u16* pAddr, ++ IN PPGPKT_STRUCT pTargetPkt, ++ IN BOOLEAN bPseudoTest); + BOOLEAN + efuse_PgPacketWriteData( + IN PADAPTER pAdapter, +@@ -3760,6 +3859,12 @@ efuse_PgPacketWriteData( + } + + ++int ++hal_EfusePgPacketWrite_8814A(IN PADAPTER pAdapter, ++ IN u8 offset, ++ IN u8 word_en, ++ IN u8 *pData, ++ IN BOOLEAN bPseudoTest); + int + hal_EfusePgPacketWrite_8814A(IN PADAPTER pAdapter, + IN u8 offset, +@@ -3871,6 +3976,7 @@ void rtl8814_stop_thread(PADAPTER padapter) + { + } + ++void hal_notch_filter_8814(_adapter *adapter, bool enable); + void hal_notch_filter_8814(_adapter *adapter, bool enable) + { + if (enable) { +@@ -3918,6 +4024,7 @@ void CheckAutoloadState8812A(PADAPTER padapter) + } + */ + ++void InitPGData8814A(PADAPTER padapter); + void InitPGData8814A(PADAPTER padapter) + { + u32 i; +@@ -3997,6 +4104,11 @@ static void read_chip_version_8814a(PADAPTER Adapter) + + } + ++VOID ++hal_PatchwithJaguar_8814( ++ IN PADAPTER Adapter, ++ IN RT_MEDIA_STATUS MediaStatus ++ ); + VOID + hal_PatchwithJaguar_8814( + IN PADAPTER Adapter, +@@ -6300,6 +6412,7 @@ struct bcn_qinfo_8814a { + u16 pkt_num:8; + }; + ++void dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag); + void dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag) + { + //if (info->pkt_num) +@@ -6308,6 +6421,7 @@ void dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag) + ); + } + ++void dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *tag); + void dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *tag) + { + //if (info->pkt_num) +@@ -6316,6 +6430,7 @@ void dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *t + ); + } + ++void dump_mac_qinfo_8814a(void *sel, _adapter *adapter); + void dump_mac_qinfo_8814a(void *sel, _adapter *adapter) + { + u32 q0_info; +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c +index 1c212540c..675a0591b 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c +@@ -1102,6 +1102,10 @@ PHY_SetRFPowerState8814A( + todo */ + //1 5. Tx Power setting API + ++VOID ++phy_TxPwrAdjInPercentage( ++ IN PADAPTER Adapter, ++ OUT u8* pTxPwrIdx); + VOID + phy_TxPwrAdjInPercentage( + IN PADAPTER Adapter, +@@ -1455,7 +1459,13 @@ phy_SetBwRegAdc_8814A( + IN PADAPTER Adapter, + IN u8 Band, + IN enum channel_width CurrentBW +-) ++); ++VOID ++phy_SetBwRegAdc_8814A( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN enum channel_width CurrentBW ++) + { + switch(CurrentBW) + { +@@ -1497,7 +1507,13 @@ phy_SetBwRegAgc_8814A( + IN PADAPTER Adapter, + IN u8 Band, + IN enum channel_width CurrentBW +-) ++); ++VOID ++phy_SetBwRegAgc_8814A( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN enum channel_width CurrentBW ++) + { + u32 AgcValue = 7; + switch(CurrentBW) +@@ -1529,6 +1545,10 @@ phy_SetBwRegAgc_8814A( + } + + ++BOOLEAN ++phy_SwBand8814A( ++ IN PADAPTER pAdapter, ++ IN u8 channelToSW); + BOOLEAN + phy_SwBand8814A( + IN PADAPTER pAdapter, +@@ -1648,6 +1668,12 @@ PHY_SetRFEReg8814A( + } + } + ++VOID ++phy_SetBBSwingByBand_8814A( ++ IN PADAPTER Adapter, ++ IN u8 Band, ++ IN u8 PreviousBand ++ ); + VOID + phy_SetBBSwingByBand_8814A( + IN PADAPTER Adapter, +@@ -1766,6 +1792,10 @@ PHY_SwitchWirelessBand8814A( + } + + ++u8 ++phy_GetSecondaryChnl_8814A( ++ IN PADAPTER Adapter ++); + u8 + phy_GetSecondaryChnl_8814A( + IN PADAPTER Adapter +@@ -1823,7 +1853,12 @@ VOID + phy_SetBwRegMac_8814A( + IN PADAPTER Adapter, + enum channel_width CurrentBW +-) ++); ++VOID ++phy_SetBwRegMac_8814A( ++ IN PADAPTER Adapter, ++ enum channel_width CurrentBW ++) + { + u16 RegRfMod_BW, u2tmp = 0; + RegRfMod_BW = PlatformEFIORead2Byte(Adapter, REG_TRXPTCL_CTL_8814A); +@@ -1974,7 +2009,8 @@ void PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER pAdapter,u4Byte ulAntennaRx) + } + + +-VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum) ++VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum); ++VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum) + { + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + +@@ -2004,6 +2040,7 @@ VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum) + + + /* <20141230, James> A workaround to eliminate the 5280MHz & 5600MHz & 5760MHzspur of 8814A. (Asked by BBSD Neil.)*/ ++VOID phy_SpurCalibration_8814A(PADAPTER Adapter); + VOID phy_SpurCalibration_8814A(PADAPTER Adapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +@@ -2125,6 +2162,8 @@ VOID phy_SpurCalibration_8814A(PADAPTER Adapter) + } + + ++void phy_ModifyInitialGain_8814A( ++ PADAPTER Adapter); + void phy_ModifyInitialGain_8814A( + PADAPTER Adapter) + { +@@ -2179,6 +2218,7 @@ void phy_ModifyInitialGain_8814A( + } + + ++VOID phy_SetBwMode8814A(PADAPTER Adapter); + VOID phy_SetBwMode8814A(PADAPTER Adapter) + { + u8 SubChnlNum = 0; +@@ -2445,6 +2485,10 @@ phy_ConfigKFree8814A( + } + #endif + VOID ++phy_SwChnl8814A( ++ IN PADAPTER pAdapter ++ ); ++VOID + phy_SwChnl8814A( + IN PADAPTER pAdapter + ) +@@ -2658,6 +2702,10 @@ HAL_HandleSwChnl8814A( // Call after initialization + } + */ + ++VOID ++phy_SwChnlAndSetBwMode8814A( ++ IN PADAPTER Adapter ++); + VOID + phy_SwChnlAndSetBwMode8814A( + IN PADAPTER Adapter +@@ -2980,6 +3028,12 @@ SetAntennaConfig8814A( + return TRUE; + } + ++VOID ++PHY_SetBWMode8814( ++ IN PADAPTER Adapter, ++ IN enum channel_width Bandwidth, // 20M or 40M ++ IN u8 Offset // Upper, Lower, or Don't care ++); + VOID + PHY_SetBWMode8814( + IN PADAPTER Adapter, +@@ -2996,6 +3050,11 @@ PHY_SetBWMode8814( + //RTW_INFO("<==%s()\n",__FUNCTION__); + } + ++VOID ++PHY_SwChnl8814( ++ IN PADAPTER Adapter, ++ IN u8 channel ++ ); + VOID + PHY_SwChnl8814( + IN PADAPTER Adapter, +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +index 5c0bf0d03..f08839b93 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +@@ -102,6 +102,7 @@ static BOOLEAN HalUsbSetQueuePipeMapping8814AUsb( + + } + ++void rtl8814au_interface_configure(_adapter *padapter); + void rtl8814au_interface_configure(_adapter *padapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +@@ -229,6 +230,10 @@ _InitBurstPktLen(IN PADAPTER Adapter) + } + + ++VOID ++_InitQueueReservedPage_8814AUsb( ++ IN PADAPTER Adapter ++ ); + VOID + _InitQueueReservedPage_8814AUsb( + IN PADAPTER Adapter +@@ -1216,6 +1221,7 @@ static void rtl8814au_hw_reset(_adapter *Adapter) + #endif //0 + } + ++u32 rtl8814au_hal_init(PADAPTER Adapter); + u32 rtl8814au_hal_init(PADAPTER Adapter) + { + u8 value8 = 0, u1bRegCR; +@@ -1697,6 +1703,10 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END); + return status; + } + ++VOID ++hal_carddisable_8814( ++ IN PADAPTER Adapter ++); + VOID + hal_carddisable_8814( + IN PADAPTER Adapter +@@ -1726,8 +1736,9 @@ static void rtl8814au_hw_power_down(_adapter *padapter) + rtw_write16(padapter, REG_APS_FSMCO, 0x8812); + } + ++u32 rtl8814au_hal_deinit(PADAPTER Adapter); + u32 rtl8814au_hal_deinit(PADAPTER Adapter) +- { ++{ + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + RTW_INFO("==> %s \n",__FUNCTION__); +@@ -1781,7 +1792,8 @@ u32 rtl8814au_hal_deinit(PADAPTER Adapter) + } + + +-unsigned int rtl8814au_inirp_init(PADAPTER Adapter) ++unsigned int rtl8814au_inirp_init(PADAPTER Adapter); ++unsigned int rtl8814au_inirp_init(PADAPTER Adapter) + { + u8 i; + struct recv_buf *precvbuf; +@@ -1840,7 +1852,8 @@ unsigned int rtl8814au_inirp_init(PADAPTER Adapter) + + } + +-unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter) ++unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter); ++unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter) + { + RTW_INFO("\n ===> usb_rx_deinit \n"); + +@@ -1857,6 +1870,12 @@ unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter) + // + //------------------------------------------------------------------- + VOID ++hal_ReadIDs_8814AU( ++ IN PADAPTER Adapter, ++ IN pu1Byte PROMContent, ++ IN BOOLEAN AutoloadFail ++ ); ++VOID + hal_ReadIDs_8814AU( + IN PADAPTER Adapter, + IN pu1Byte PROMContent, +@@ -1923,6 +1942,10 @@ hal_InitPGData_8814A( + #endif + } + ++VOID ++hal_CustomizedBehavior_8814AU( ++ IN PADAPTER Adapter ++ ); + VOID + hal_CustomizedBehavior_8814AU( + IN PADAPTER Adapter +@@ -1999,6 +2022,12 @@ hal_CustomizeByCustomerID_8814AU( + hal_CustomizedBehavior_8814AU(pAdapter); + } + ++VOID ++hal_ReadUsbModeSwitch_8814AU( ++ IN PADAPTER Adapter, ++ IN u8* PROMContent, ++ IN BOOLEAN AutoloadFail ++ ); + VOID + hal_ReadUsbModeSwitch_8814AU( + IN PADAPTER Adapter, +@@ -2032,6 +2061,10 @@ ReadLEDSetting_8814AU( + #endif //CONFIG_RTW_LED + } + ++VOID ++InitAdapterVariablesByPROM_8814AU( ++ IN PADAPTER Adapter ++ ); + VOID + InitAdapterVariablesByPROM_8814AU( + IN PADAPTER Adapter +@@ -2091,6 +2124,10 @@ static void hal_ReadPROMContent_8814A( + InitAdapterVariablesByPROM_8814AU(Adapter); + } + ++u8 ++ReadAdapterInfo8814AU( ++ IN PADAPTER Adapter ++ ); + u8 + ReadAdapterInfo8814AU( + IN PADAPTER Adapter +@@ -2107,6 +2144,7 @@ ReadAdapterInfo8814AU( + return _SUCCESS; + } + ++void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 RemoveMSR); + void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 RemoveMSR) + { + HAL_DATA_TYPE *pHalData; +@@ -2132,6 +2170,7 @@ void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 Remo + + } + ++u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val); + u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +@@ -2221,6 +2260,7 @@ u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + return ret; + } + ++void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val); + void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +@@ -2239,6 +2279,12 @@ void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + // Change default setting of specified variable. + // + u8 ++SetHalDefVar8814AUsb( ++ IN PADAPTER Adapter, ++ IN HAL_DEF_VARIABLE eVariable, ++ IN PVOID pValue ++ ); ++u8 + SetHalDefVar8814AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, +@@ -2263,6 +2309,12 @@ SetHalDefVar8814AUsb( + // Query setting of specified variable. + // + u8 ++GetHalDefVar8814AUsb( ++ IN PADAPTER Adapter, ++ IN HAL_DEF_VARIABLE eVariable, ++ IN PVOID pValue ++ ); ++u8 + GetHalDefVar8814AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c +index 320024cae..1f0ca9682 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c +@@ -273,6 +273,7 @@ void rtl8814au_xmit_tasklet(void *priv) + + } + ++void rtl8814au_set_intf_ops(struct _io_ops *pops); + void rtl8814au_set_intf_ops(struct _io_ops *pops) + { + _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index 6f5d97a11..ae4202ad4 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -428,6 +428,7 @@ static void rtw_get_chbw_from_cfg80211_chan_def(struct cfg80211_chan_def *chdef, + #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) */ + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) ++bool rtw_cfg80211_allow_ch_switch_notify(_adapter *adapter); + bool rtw_cfg80211_allow_ch_switch_notify(_adapter *adapter) + { + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)) +@@ -505,16 +506,19 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, + } + #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) */ + ++void rtw_2g_channels_init(struct ieee80211_channel *channels); + void rtw_2g_channels_init(struct ieee80211_channel *channels) + { + _rtw_memcpy((void *)channels, (void *)rtw_2ghz_channels, sizeof(rtw_2ghz_channels)); + } + ++void rtw_5g_channels_init(struct ieee80211_channel *channels); + void rtw_5g_channels_init(struct ieee80211_channel *channels) + { + _rtw_memcpy((void *)channels, (void *)rtw_5ghz_a_channels, sizeof(rtw_5ghz_a_channels)); + } + ++void rtw_2g_rates_init(struct ieee80211_rate *rates); + void rtw_2g_rates_init(struct ieee80211_rate *rates) + { + _rtw_memcpy(rates, rtw_g_rates, +@@ -522,6 +526,7 @@ void rtw_2g_rates_init(struct ieee80211_rate *rates) + ); + } + ++void rtw_5g_rates_init(struct ieee80211_rate *rates); + void rtw_5g_rates_init(struct ieee80211_rate *rates) + { + _rtw_memcpy(rates, rtw_a_rates, +@@ -572,6 +577,7 @@ struct ieee80211_supported_band *rtw_spt_band_alloc(BAND_TYPE band) + return spt_band; + } + ++void rtw_spt_band_free(struct ieee80211_supported_band *spt_band); + void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) + { + u32 size = 0; +@@ -660,6 +666,7 @@ static const struct ieee80211_txrx_stypes + }; + #endif + ++NDIS_802_11_NETWORK_INFRASTRUCTURE nl80211_iftype_to_rtw_network_type(enum nl80211_iftype type); + NDIS_802_11_NETWORK_INFRASTRUCTURE nl80211_iftype_to_rtw_network_type(enum nl80211_iftype type) + { + switch (type) { +@@ -693,6 +700,7 @@ NDIS_802_11_NETWORK_INFRASTRUCTURE nl80211_iftype_to_rtw_network_type(enum nl802 + } + } + ++u32 nl80211_iftype_to_rtw_mlme_state(enum nl80211_iftype type); + u32 nl80211_iftype_to_rtw_mlme_state(enum nl80211_iftype type) + { + switch (type) { +@@ -2711,6 +2719,7 @@ void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork) + } + + /* if target wps scan ongoing, target_ssid is filled */ ++int rtw_cfg80211_is_target_wps_scan(struct cfg80211_scan_request *scan_req, struct cfg80211_ssid *target_ssid); + int rtw_cfg80211_is_target_wps_scan(struct cfg80211_scan_request *scan_req, struct cfg80211_ssid *target_ssid) + { + int ret = 0; +@@ -5420,6 +5429,7 @@ const char *_nl80211_mesh_power_mode_str[] = { + #define nl80211_mesh_power_mode_str(_p) ((_p <= NL80211_MESH_POWER_MAX) ? _nl80211_mesh_power_mode_str[_p] : _nl80211_mesh_power_mode_str[0]) + #endif + ++void dump_station_parameters(void *sel, struct wiphy *wiphy, const struct station_parameters *params); + void dump_station_parameters(void *sel, struct wiphy *wiphy, const struct station_parameters *params) + { + #if DBG_RTW_CFG80211_STA_PARAM +@@ -10093,6 +10103,8 @@ int rtw_hostapd_acs_dump_survey(struct wiphy *wiphy, struct net_device *netdev, + #endif /* defined(CONFIG_RTW_HOSTAPD_ACS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) */ + + #if (KERNEL_VERSION(4, 17, 0) <= LINUX_VERSION_CODE) ++int cfg80211_rtw_external_auth(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_external_auth_params *params); + int cfg80211_rtw_external_auth(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_external_auth_params *params) + { +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c +index c5776117f..27eb11239 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c +@@ -188,6 +188,7 @@ void indicate_wx_scan_complete_event(_adapter *padapter) + #endif + } + ++void rtw_indicate_wx_assoc_event(_adapter *padapter); + void rtw_indicate_wx_assoc_event(_adapter *padapter) + { + union iwreq_data wrqu; +@@ -211,6 +212,7 @@ void rtw_indicate_wx_assoc_event(_adapter *padapter) + #endif + } + ++void rtw_indicate_wx_disassoc_event(_adapter *padapter); + void rtw_indicate_wx_disassoc_event(_adapter *padapter) + { + union iwreq_data wrqu; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +index f4f2ef90e..0b95a14e5 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +@@ -836,6 +836,7 @@ uint rtw_suspend_type = RTW_SUSPEND_TYPE; + module_param(rtw_suspend_type, uint, 0644); + #endif + ++void rtw_regsty_load_target_tx_power(struct registry_priv *regsty); + void rtw_regsty_load_target_tx_power(struct registry_priv *regsty) + { + int path, rs; +@@ -1351,7 +1352,8 @@ static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) + static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 }; + + /* Given a data frame determine the 802.1p/1d tag to use. */ +-unsigned int rtw_classify8021d(struct sk_buff *skb) ++unsigned int rtw_classify8021d(struct sk_buff *skb); ++unsigned int rtw_classify8021d(struct sk_buff *skb) + { + unsigned int dscp; + +@@ -1499,6 +1501,7 @@ void rtw_ndev_notifier_unregister(void) + unregister_netdevice_notifier(&rtw_ndev_notifier); + } + ++int rtw_ndev_init(struct net_device *dev); + int rtw_ndev_init(struct net_device *dev) + { + _adapter *adapter = rtw_netdev_priv(dev); +@@ -1512,6 +1515,7 @@ int rtw_ndev_init(struct net_device *dev) + return 0; + } + ++void rtw_ndev_uninit(struct net_device *dev); + void rtw_ndev_uninit(struct net_device *dev) + { + _adapter *adapter = rtw_netdev_priv(dev); +@@ -1584,6 +1588,7 @@ int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) + return 0; + } + ++void rtw_hook_if_ops(struct net_device *ndev); + void rtw_hook_if_ops(struct net_device *ndev) + { + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) +@@ -1676,6 +1681,7 @@ struct net_device *rtw_init_netdev(_adapter *old_padapter) + return pnetdev; + } + ++int rtw_os_ndev_alloc(_adapter *adapter); + int rtw_os_ndev_alloc(_adapter *adapter) + { + int ret = _FAIL; +@@ -1730,6 +1736,7 @@ void rtw_os_ndev_free(_adapter *adapter) + } + } + ++int rtw_os_ndev_register(_adapter *adapter, const char *name); + int rtw_os_ndev_register(_adapter *adapter, const char *name) + { + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); +@@ -1872,6 +1879,7 @@ void rtw_os_ndev_deinit(_adapter *adapter) + rtw_os_ndev_free(adapter); + } + ++int rtw_os_ndevs_alloc(struct dvobj_priv *dvobj); + int rtw_os_ndevs_alloc(struct dvobj_priv *dvobj) + { + int i, status = _SUCCESS; +@@ -1925,6 +1933,7 @@ int rtw_os_ndevs_alloc(struct dvobj_priv *dvobj) + return status; + } + ++void rtw_os_ndevs_free(struct dvobj_priv *dvobj); + void rtw_os_ndevs_free(struct dvobj_priv *dvobj) + { + int i; +@@ -2056,6 +2065,7 @@ void rtw_stop_drv_threads(_adapter *padapter) + rtw_hal_stop_thread(padapter); + } + ++u8 rtw_init_default_value(_adapter *padapter); + u8 rtw_init_default_value(_adapter *padapter) + { + u8 ret = _SUCCESS; +@@ -3141,6 +3151,7 @@ void rtw_inetaddr_notifier_unregister(void) + #endif + } + ++int rtw_os_ndevs_register(struct dvobj_priv *dvobj); + int rtw_os_ndevs_register(struct dvobj_priv *dvobj) + { + int i, status = _SUCCESS; +@@ -3260,6 +3271,7 @@ void rtw_os_ndevs_deinit(struct dvobj_priv *dvobj) + } + + #ifdef CONFIG_BR_EXT ++void netdev_br_init(struct net_device *netdev); + void netdev_br_init(struct net_device *netdev) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev); +@@ -3899,6 +3911,7 @@ static int netdev_close(struct net_device *pnetdev) + + } + ++int pm_netdev_close(struct net_device *pnetdev, u8 bnormal); + int pm_netdev_close(struct net_device *pnetdev, u8 bnormal) + { + int status = 0; +@@ -4585,6 +4598,7 @@ int rtw_suspend_ap_wow(_adapter *padapter) + } + #endif /* #ifdef CONFIG_AP_WOWLAN */ + ++int rtw_suspend_normal(_adapter *padapter); + int rtw_suspend_normal(_adapter *padapter) + { + int ret = _SUCCESS; +@@ -4991,6 +5005,7 @@ int rtw_resume_process_ap_wow(_adapter *padapter) + } + #endif /* #ifdef CONFIG_APWOWLAN */ + ++void rtw_mi_resume_process_normal(_adapter *padapter); + void rtw_mi_resume_process_normal(_adapter *padapter) + { + int i; +@@ -5020,6 +5035,7 @@ void rtw_mi_resume_process_normal(_adapter *padapter) + } + } + ++int rtw_resume_process_normal(_adapter *padapter); + int rtw_resume_process_normal(_adapter *padapter) + { + struct net_device *pnetdev; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c b/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c +index 480ea83f9..bd599ecd3 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c +@@ -364,6 +364,7 @@ int rtw_android_cmdstr_to_num(char *cmdstr) + return cmd_num; + } + ++int rtw_android_get_rssi(struct net_device *net, char *command, int total_len); + int rtw_android_get_rssi(struct net_device *net, char *command, int total_len) + { + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); +@@ -379,6 +380,7 @@ int rtw_android_get_rssi(struct net_device *net, char *command, int total_len) + return bytes_written; + } + ++int rtw_android_get_link_speed(struct net_device *net, char *command, int total_len); + int rtw_android_get_link_speed(struct net_device *net, char *command, int total_len) + { + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); +@@ -391,6 +393,7 @@ int rtw_android_get_link_speed(struct net_device *net, char *command, int total_ + return bytes_written; + } + ++int rtw_android_get_macaddr(struct net_device *net, char *command, int total_len); + int rtw_android_get_macaddr(struct net_device *net, char *command, int total_len) + { + int bytes_written = 0; +@@ -399,6 +402,7 @@ int rtw_android_get_macaddr(struct net_device *net, char *command, int total_len + return bytes_written; + } + ++int rtw_android_set_country(struct net_device *net, char *command, int total_len); + int rtw_android_set_country(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -410,6 +414,7 @@ int rtw_android_set_country(struct net_device *net, char *command, int total_len + return (ret == _SUCCESS) ? 0 : -1; + } + ++int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int total_len); + int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int total_len) + { + int bytes_written = 0; +@@ -421,6 +426,7 @@ int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int tota + return bytes_written; + } + ++int rtw_android_set_block_scan(struct net_device *net, char *command, int total_len); + int rtw_android_set_block_scan(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -433,6 +439,7 @@ int rtw_android_set_block_scan(struct net_device *net, char *command, int total_ + return 0; + } + ++int rtw_android_set_block(struct net_device *net, char *command, int total_len); + int rtw_android_set_block(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -445,6 +452,7 @@ int rtw_android_set_block(struct net_device *net, char *command, int total_len) + return 0; + } + ++int rtw_android_setband(struct net_device *net, char *command, int total_len); + int rtw_android_setband(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -458,6 +466,7 @@ int rtw_android_setband(struct net_device *net, char *command, int total_len) + return (ret == _SUCCESS) ? 0 : -1; + } + ++int rtw_android_getband(struct net_device *net, char *command, int total_len); + int rtw_android_getband(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -469,6 +478,7 @@ int rtw_android_getband(struct net_device *net, char *command, int total_len) + } + + #ifdef CONFIG_WFD ++int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len); + int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len) + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); +@@ -505,6 +515,7 @@ int rtw_android_set_miracast_mode(struct net_device *net, char *command, int tot + } + #endif /* CONFIG_WFD */ + ++int get_int_from_command(char *pcmd); + int get_int_from_command(char *pcmd) + { + int i = 0; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c b/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c +index 840a675cc..db1177c3a 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c +@@ -483,6 +483,7 @@ static int proc_get_rf_reg_dump(struct seq_file *m, void *v) + } + + #ifdef CONFIG_RTW_LED ++int proc_get_led_config(struct seq_file *m, void *v); + int proc_get_led_config(struct seq_file *m, void *v) + { + struct net_device *dev = m->private; +@@ -493,6 +494,7 @@ int proc_get_led_config(struct seq_file *m, void *v) + return 0; + } + ++ssize_t proc_set_led_config(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_led_config(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *dev = data; +@@ -525,6 +527,7 @@ ssize_t proc_set_led_config(struct file *file, const char __user *buffer, size_t + #endif /* CONFIG_RTW_LED */ + + #ifdef CONFIG_AP_MODE ++int proc_get_aid_status(struct seq_file *m, void *v); + int proc_get_aid_status(struct seq_file *m, void *v) + { + struct net_device *dev = m->private; +@@ -535,6 +538,7 @@ int proc_get_aid_status(struct seq_file *m, void *v) + return 0; + } + ++ssize_t proc_set_aid_status(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_aid_status(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *dev = data; +@@ -1287,6 +1291,7 @@ static int proc_get_macaddr_acl(struct seq_file *m, void *v) + return 0; + } + ++ssize_t proc_set_macaddr_acl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_macaddr_acl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *dev = data; +@@ -1745,6 +1750,7 @@ static ssize_t proc_set_dfs_slave_with_rd(struct file *file, const char __user * + #endif /* CONFIG_DFS_MASTER */ + + #ifdef CONFIG_80211N_HT ++int proc_get_rx_ampdu_size_limit(struct seq_file *m, void *v); + int proc_get_rx_ampdu_size_limit(struct seq_file *m, void *v) + { + struct net_device *dev = m->private; +@@ -1755,6 +1761,7 @@ int proc_get_rx_ampdu_size_limit(struct seq_file *m, void *v) + return 0; + } + ++ssize_t proc_set_rx_ampdu_size_limit(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_rx_ampdu_size_limit(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *dev = data; +@@ -2765,6 +2772,7 @@ int proc_get_mbid_cam_cache(struct seq_file *m, void *v) + } + #endif /* CONFIG_MBSSID_CAM */ + ++int proc_get_mac_addr(struct seq_file *m, void *v); + int proc_get_mac_addr(struct seq_file *m, void *v) + { + struct net_device *dev = m->private; +@@ -3146,6 +3154,7 @@ static ssize_t proc_set_napi_th(struct file *file, const char __user *buffer, si + #endif /* CONFIG_RTW_NAPI_DYNAMIC */ + + ++ssize_t proc_set_dynamic_agg_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_dynamic_agg_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *dev = data; +@@ -3775,6 +3784,7 @@ static ssize_t proc_set_tpt_mode(struct file *file, const char __user *buffer, + } + #endif /* CONFIG_RTW_TPT_MODE */ + ++int proc_get_cur_beacon_keys(struct seq_file *m, void *v); + int proc_get_cur_beacon_keys(struct seq_file *m, void *v) + { + struct net_device *dev = m->private; +@@ -4281,6 +4291,7 @@ ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, si + static char *phydm_msg = NULL; + #define PHYDM_MSG_LEN 80*24 + ++int proc_get_phydm_cmd(struct seq_file *m, void *v); + int proc_get_phydm_cmd(struct seq_file *m, void *v) + { + struct net_device *netdev; +@@ -4308,6 +4319,7 @@ int proc_get_phydm_cmd(struct seq_file *m, void *v) + return 0; + } + ++ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) + { + struct net_device *netdev; +@@ -4477,6 +4489,7 @@ struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev) + return dir_odm; + } + ++void rtw_odm_proc_deinit(_adapter *adapter); + void rtw_odm_proc_deinit(_adapter *adapter) + { + struct proc_dir_entry *dir_odm = NULL; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index a285c011c..915ef6476 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -951,6 +951,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) + return ret; + } + ++int rtw_resume_process(_adapter *padapter); + int rtw_resume_process(_adapter *padapter) + { + int ret; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c b/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c +index fd03f8696..c7eb7ea40 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c +@@ -705,6 +705,7 @@ void usb_write_port_cancel(struct intf_hdl *pintfhdl) + } + } + ++void usb_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); + void usb_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf) + { + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c b/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c +index f08dd8e8c..c931a8014 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c +@@ -366,6 +366,7 @@ void rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed) + } + + #ifdef CONFIG_TX_MCAST2UNI ++int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb); + int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb) + { + struct sta_priv *pstapriv = &padapter->stapriv; +diff --git a/drivers/staging/rtl8812au/os_dep/osdep_service.c b/drivers/staging/rtl8812au/os_dep/osdep_service.c +index d24b3e1f0..5b2aa5d00 100644 +--- a/drivers/staging/rtl8812au/os_dep/osdep_service.c ++++ b/drivers/staging/rtl8812au/os_dep/osdep_service.c +@@ -2258,6 +2258,7 @@ void rtw_free_netdev(struct net_device *netdev) + return; + } + ++int rtw_change_ifname(_adapter *padapter, const char *ifname); + int rtw_change_ifname(_adapter *padapter, const char *ifname) + { + struct dvobj_priv *dvobj; +diff --git a/drivers/staging/rtl8812au/platform/platform_ops.c b/drivers/staging/rtl8812au/platform/platform_ops.c +index 10766aad8..eac273047 100644 +--- a/drivers/staging/rtl8812au/platform/platform_ops.c ++++ b/drivers/staging/rtl8812au/platform/platform_ops.c +@@ -18,6 +18,7 @@ + * 0: power on successfully + * others: power on failed + */ ++int platform_wifi_power_on(void); + int platform_wifi_power_on(void) + { + int ret = 0; +@@ -26,6 +27,7 @@ int platform_wifi_power_on(void) + return ret; + } + ++void platform_wifi_power_off(void); + void platform_wifi_power_off(void) + { + } +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0002-rtl8812au-fix-warnings.patch b/kernel/tools/perf/files/patches/mageia/0002-rtl8812au-fix-warnings.patch new file mode 100644 index 0000000000..25f5aacc2f --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0002-rtl8812au-fix-warnings.patch @@ -0,0 +1,22 @@ +diff -up linux-6.12/drivers/staging/rtl8812au/core/rtw_mlme_ext.c.fixwarning linux-6.12/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +--- linux-6.12/drivers/staging/rtl8812au/core/rtw_mlme_ext.c.fixwarning 2024-11-20 22:55:13.263847617 +0100 ++++ linux-6.12/drivers/staging/rtl8812au/core/rtw_mlme_ext.c 2024-11-20 22:56:20.104794574 +0100 +@@ -2152,13 +2152,15 @@ unsigned int OnAuth(_adapter *padapter, + if (rtw_is_list_empty(&pstat->asoc_list) == _FALSE) { + rtw_list_delete(&pstat->asoc_list); + pstapriv->asoc_list_cnt--; +- if (pstat->expire_to > 0) +- ;/* TODO: STA re_auth within expire_to */ ++ if (pstat->expire_to > 0) { ++ ; /* TODO: STA re_auth within expire_to */ ++ } + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + +- if (seq == 1) ++ if (seq == 1) { + ; /* TODO: STA re_auth and auth timeout */ ++ } + + } + } diff --git a/kernel/tools/perf/files/patches/mageia/0005-rtl8812au-add-missed-prototypes.patch b/kernel/tools/perf/files/patches/mageia/0005-rtl8812au-add-missed-prototypes.patch new file mode 100644 index 0000000000..c8b423799e --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0005-rtl8812au-add-missed-prototypes.patch @@ -0,0 +1,188 @@ +From 61116d468dd551124c1ae2c01fff5da99d787fad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Thu, 21 Nov 2024 15:47:58 +0100 +Subject: [PATCH] rtl8812au: add missed prototypes + +--- + drivers/staging/rtl8812au/core/rtw_br_ext.c | 2 ++ + drivers/staging/rtl8812au/core/rtw_p2p.c | 1 + + drivers/staging/rtl8812au/core/rtw_xmit.c | 1 + + .../hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c | 7 +++++++ + .../hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c | 21 ++++++++++++++++++- + .../staging/rtl8812au/hal/phydm/phydm_ccx.c | 1 + + .../rtl8812au/os_dep/linux/ioctl_cfg80211.c | 12 +++++++++++ + .../staging/rtl8812au/os_dep/linux/rtw_proc.c | 1 + + .../staging/rtl8812au/os_dep/linux/usb_intf.c | 2 ++ + 9 files changed, 47 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/core/rtw_br_ext.c b/drivers/staging/rtl8812au/core/rtw_br_ext.c +index 955a50912..283676d36 100644 +--- a/drivers/staging/rtl8812au/core/rtw_br_ext.c ++++ b/drivers/staging/rtl8812au/core/rtw_br_ext.c +@@ -1369,6 +1369,8 @@ void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb) + } + + ++void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, ++ unsigned char *ipAddr); + void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, + unsigned char *ipAddr) + { +diff --git a/drivers/staging/rtl8812au/core/rtw_p2p.c b/drivers/staging/rtl8812au/core/rtw_p2p.c +index 167dd067f..c560d1712 100644 +--- a/drivers/staging/rtl8812au/core/rtw_p2p.c ++++ b/drivers/staging/rtl8812au/core/rtw_p2p.c +@@ -3898,6 +3898,7 @@ void rtw_xframe_chk_wfd_ie(struct xmit_frame *xframe) + #endif + } + ++u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len); + u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) + { + uint attr_contentlen = 0; +diff --git a/drivers/staging/rtl8812au/core/rtw_xmit.c b/drivers/staging/rtl8812au/core/rtw_xmit.c +index 0b97e5099..e40c0aecc 100644 +--- a/drivers/staging/rtl8812au/core/rtw_xmit.c ++++ b/drivers/staging/rtl8812au/core/rtw_xmit.c +@@ -3766,6 +3766,7 @@ static struct xmit_frame *get_one_xmitframe(struct xmit_priv *pxmitpriv, struct + return pxmitframe; + } + ++struct xmit_frame *rtw_get_xframe(struct xmit_priv *pxmitpriv, int *num_frame); + struct xmit_frame *rtw_get_xframe(struct xmit_priv *pxmitpriv, int *num_frame) + { + _irqL irqL0; +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +index a66721465..e2113e37a 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +@@ -1334,6 +1334,13 @@ void phy_lc_calibrate_8812a(void *dm_void) + _phy_lc_calibrate_8812a(dm, true); + } + ++void _phy_set_rf_path_switch_8812a( ++#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) ++ struct dm_struct *dm, ++#else ++ void *adapter, ++#endif ++ boolean is_main, boolean is2T); + void _phy_set_rf_path_switch_8812a( + #if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) + struct dm_struct *dm, +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +index 41ce0a6dd..ae060a648 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +@@ -450,7 +450,17 @@ _phy_lc_calibrate_8814a( + + + VOID +-phy_APCalibrate_8814A( ++ phy_APCalibrate_8814A( ++#if (DM_ODM_SUPPORT_TYPE & ODM_AP) ++ IN struct dm_struct * pDM_Odm, ++#else ++ IN PADAPTER pAdapter, ++#endif ++ IN s1Byte delta, ++ IN BOOLEAN is2T ++ ); ++VOID ++ phy_APCalibrate_8814A( + #if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN struct dm_struct * pDM_Odm, + #else +@@ -545,6 +555,15 @@ BOOLEAN PHY_QueryRFPathSwitch_8814A( + } + + ++VOID _phy_SetRFPathSwitch_8814A( ++#if (DM_ODM_SUPPORT_TYPE & ODM_AP) ++ IN struct dm_struct * pDM_Odm, ++#else ++ IN PADAPTER pAdapter, ++#endif ++ IN BOOLEAN bMain, ++ IN BOOLEAN is2T ++ ); + VOID _phy_SetRFPathSwitch_8814A( + #if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN struct dm_struct * pDM_Odm, +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c b/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c +index e0f42c0be..fe69c19b2 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c +@@ -26,6 +26,7 @@ + #include "mp_precomp.h" + #include "phydm_precomp.h" + ++void phydm_ccx_hw_restart(void *dm_void); + void phydm_ccx_hw_restart(void *dm_void) + /*@Will Restart NHM/CLM/FAHM simultaneously*/ + { +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index ae4202ad4..c0f563430 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -534,6 +534,7 @@ void rtw_5g_rates_init(struct ieee80211_rate *rates) + ); + } + ++struct ieee80211_supported_band *rtw_spt_band_alloc(BAND_TYPE band); + struct ieee80211_supported_band *rtw_spt_band_alloc(BAND_TYPE band) + { + struct ieee80211_supported_band *spt_band = NULL; +@@ -2083,6 +2084,16 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, + return 0; + } + ++static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, ++ struct net_device *ndev, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ int link_id, ++#endif ++ u8 key_index ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) ++ , bool unicast, bool multicast ++ #endif ++); + static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, + struct net_device *ndev, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +@@ -5956,6 +5967,7 @@ static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *n + return ret; + } + ++struct sta_info *rtw_sta_info_get_by_idx(struct sta_priv *pstapriv, const int idx, u8 *asoc_list_num); + struct sta_info *rtw_sta_info_get_by_idx(struct sta_priv *pstapriv, const int idx, u8 *asoc_list_num) + { + _list *phead, *plist; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c b/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c +index db1177c3a..3b9246bc9 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c +@@ -4446,6 +4446,7 @@ static const struct file_operations rtw_odm_proc_sseq_ops = { + }; + #endif + ++struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev); + struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev) + { + struct proc_dir_entry *dir_odm = NULL; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index 915ef6476..ae2a5a0b9 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -1206,6 +1206,8 @@ extern void rtd2885_wlan_netlink_sendMsg(char *action_string, char *name); + + _adapter *rtw_sw_export = NULL; + ++_adapter *rtw_usb_primary_adapter_init(struct dvobj_priv *dvobj, ++ struct usb_interface *pusb_intf); + _adapter *rtw_usb_primary_adapter_init(struct dvobj_priv *dvobj, + struct usb_interface *pusb_intf) + { +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0006-rtl8812au-add-suggested-braces-around-empty-body-in-.patch b/kernel/tools/perf/files/patches/mageia/0006-rtl8812au-add-suggested-braces-around-empty-body-in-.patch new file mode 100644 index 0000000000..af28127e92 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0006-rtl8812au-add-suggested-braces-around-empty-body-in-.patch @@ -0,0 +1,33 @@ +From a9d9038b7a15077395013f1954665656959c81b8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +From: Your Name +Date: Thu, 21 Nov 2024 15:53:01 +0100 +Subject: [PATCH 6/8] rtl8812au: add suggested braces around empty body in an + else statement + +--- + drivers/staging/rtl8812au/os_dep/linux/recv_linux.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c b/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c +index 5637e9970..051abba70 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c +@@ -531,10 +531,12 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, union recv_frame *r + #endif /* CONFIG_RTW_NAPI */ + + ret = rtw_netif_rx(padapter->pnetdev, pkt); +- if (ret == NET_RX_SUCCESS) ++ if (ret == NET_RX_SUCCESS) { + DBG_COUNTER(padapter->rx_logs.os_netif_ok); +- else ++ } ++ else { + DBG_COUNTER(padapter->rx_logs.os_netif_err); ++ } + } + } + +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0007-rtl8812au-add-suggested-braces-around-empty-body-in-.patch b/kernel/tools/perf/files/patches/mageia/0007-rtl8812au-add-suggested-braces-around-empty-body-in-.patch new file mode 100644 index 0000000000..685574b53d --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0007-rtl8812au-add-suggested-braces-around-empty-body-in-.patch @@ -0,0 +1,45 @@ +From e7f5d03d8bde8f104ed06ad0946e2e40eaf51094 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Thu, 21 Nov 2024 16:06:25 +0100 +Subject: [PATCH 7/8] rtl8812au: add suggested braces around empty body in an + else statement + +--- + drivers/staging/rtl8812au/hal/phydm/phydm_debug.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c b/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c +index bab92632e..a3e8bc48e 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c +@@ -2222,10 +2222,12 @@ void phydm_basic_dbg_message(void *dm_void) + PHYDM_DBG(dm, DBG_CMN, "[%s] System up time: ((%d sec))---->\n", + __func__, dm->phydm_sys_up_time); + +- if (dm->is_linked) ++ if (dm->is_linked) { + phydm_basic_dbg_msg_linked(dm); +- else ++ } ++ else { + PHYDM_DBG(dm, DBG_CMN, "No Link !!!\n"); ++ } + + PHYDM_DBG(dm, DBG_CMN, "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n", + fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all); +@@ -4491,10 +4493,11 @@ void phydm_fw_trace_handler_code(void *dm_void, u8 *buffer, u8 cmd_len) + u16 content_3 = (((u16)buffer[9]) << 8) | ((u16)buffer[8]); + u16 content_4 = (((u16)buffer[11]) << 8) | ((u16)buffer[10]); + +- if (cmd_len > 12) ++ if (cmd_len > 12) { + PHYDM_DBG(dm, DBG_FW_TRACE, + "[FW Msg] Invalid cmd length (( %d )) >12\n", + cmd_len); ++ } + /*@--------------------------------------------*/ + #ifdef CONFIG_RA_FW_DBG_CODE + if (function == RATE_DECISION) { +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0008-rtl8812au-add-suggested-braces-around-empty-body-in-.patch b/kernel/tools/perf/files/patches/mageia/0008-rtl8812au-add-suggested-braces-around-empty-body-in-.patch new file mode 100644 index 0000000000..a99c5627d0 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0008-rtl8812au-add-suggested-braces-around-empty-body-in-.patch @@ -0,0 +1,311 @@ +From 22b4d5685d828b85d9fc80bfa3d8c5e97b289224 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Thu, 21 Nov 2024 16:27:10 +0100 +Subject: [PATCH 8/8] rtl8812au: add suggested braces around empty body in an + else statement + +--- + .../rtl8812au/hal/phydm/halrf/halphyrf_ce.c | 3 ++- + .../staging/rtl8812au/hal/phydm/halrf/halrf.c | 3 ++- + .../rtl8812au/hal/phydm/halrf/halrf_kfree.c | 18 ++++++++++++------ + .../hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c | 3 ++- + .../rtl8812au/hal/phydm/phydm_beamforming.c | 6 ++++-- + .../rtl8812au/hal/phydm/phydm_cfotracking.c | 6 ++++-- + .../staging/rtl8812au/hal/phydm/phydm_psd.c | 3 ++- + .../staging/rtl8812au/hal/phydm/phydm_rainfo.c | 6 ++++-- + .../rtl8812au/hal/phydm/txbf/halcomtxbf.c | 15 ++++++++++----- + .../rtl8812au/hal/phydm/txbf/haltxbfjaguar.c | 3 ++- + 10 files changed, 44 insertions(+), 22 deletions(-) + +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c +index 4443c7289..3b05d87c8 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c +@@ -478,9 +478,10 @@ void odm_txpowertracking_callback_thermal_meter(void *adapter) + + /*@4 3. Initialize ThermalValues of rf_calibrate_info*/ + +- if (cali_info->is_reloadtxpowerindex) ++ if (cali_info->is_reloadtxpowerindex) { + RF_DBG(dm, DBG_RF_TX_PWR_TRACK, + "reload ofdm index for band switch\n"); ++ } + + /*@4 4. Calculate average thermal meter*/ + +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c +index 09ab5bae9..609333db8 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c +@@ -2270,8 +2270,9 @@ boolean halrf_compare(void *dm_void, u32 value) + else if (value < 0x200 && value > 0x64) + fail = true; + +- if (fail) ++ if (fail) { + RF_DBG(dm, DBG_RF_DACK, "[DACK]overflow!!!!!!!!!!!!!!!"); ++ } + return fail; + } + +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +index 773364310..a4e3504a3 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +@@ -148,9 +148,10 @@ void phydm_get_thermal_trim_offset_8821c(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) ++ if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) { + RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal:%d\n", + power_trim_info->thermal); ++ } + } + + void phydm_get_power_trim_offset_8821c(void *dm_void); +@@ -281,9 +282,10 @@ void phydm_get_thermal_trim_offset_8822b(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) ++ if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) { + RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal:%d\n", + power_trim_info->thermal); ++ } + } + + void phydm_get_power_trim_offset_8822b(void *dm_void); +@@ -532,9 +534,10 @@ void phydm_get_thermal_trim_offset_8710b(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) ++ if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) { + RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal:%d\n", + power_trim_info->thermal); ++ } + } + + void phydm_get_power_trim_offset_8710b(void *dm_void); +@@ -559,10 +562,11 @@ void phydm_get_power_trim_offset_8710b(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b power trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_ON) ++ if (power_trim_info->flag & KFREE_FLAG_ON) { + RF_DBG(dm, DBG_RF_MP, + "[kfree] 8710b power_trim_data->bb_gain[0][0]=0x%X\n", + power_trim_info->bb_gain[0][0]); ++ } + } + + void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data); +@@ -620,9 +624,10 @@ void phydm_get_thermal_trim_offset_8192f(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) ++ if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) { + RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal:%d\n", + power_trim_info->thermal); ++ } + } + + void phydm_get_power_trim_offset_8192f(void *dm_void); +@@ -799,8 +804,9 @@ void phydm_get_thermal_trim_offset_8198f(void *dm_void) + pg_therm = pg_therm & 0x1f; + if ((pg_therm & BIT(0)) == 0) + power_trim_info->thermal = (-1 * (pg_therm >> 1)); +- else ++ else { + power_trim_info->thermal = (pg_therm >> 1); ++ } + + power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; + } +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +index e2113e37a..a006d7e74 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +@@ -1323,8 +1323,9 @@ void phy_iq_calibrate_8812a(void *dm_void, boolean is_recovery) + if (dm->rf_calibrate_info.is_iqk_in_progress) + RF_DBG(dm, DBG_RF_IQK, + "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); +- } else ++ } else { + _phy_iq_calibrate_8812a(dm, *dm->channel); ++ } + } + + void phy_lc_calibrate_8812a(void *dm_void) +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +index 4a770aa72..952b5600b 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +@@ -1337,10 +1337,11 @@ beamforming_init_entry(void *dm_void, u16 sta_idx, u8 *bfer_bfee_idx, + + if (beamformer_entry == NULL) { + beamformer_entry = beamforming_add_bfer_entry(dm, sta, beamform_cap, num_of_sounding_dim, &bfer_idx); +- if (beamformer_entry == NULL) ++ if (beamformer_entry == NULL) { + PHYDM_DBG(dm, DBG_TXBF, + "[%s]Not enough BFer entry!!!!!\n", + __func__); ++ } + } + } + +@@ -1781,10 +1782,11 @@ void beamforming_timer_callback( + #endif + if (ret) + ret = beamforming_start_sw(dm, sound_info->sound_idx, sound_info->sound_mode, sound_info->sound_bw); +- else ++ else { + PHYDM_DBG(dm, DBG_TXBF, + "%s, Error value return from BeamformingStart_V2\n", + __func__); ++ } + + if (beam_info->beamformee_su_cnt != 0 || beam_info->beamformee_mu_cnt > 1) { + if (sound_info->sound_mode == SOUNDING_SW_VHT_TIMER || sound_info->sound_mode == SOUNDING_SW_HT_TIMER) +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c b/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c +index 8aac6b094..d88d7a6c0 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c +@@ -213,11 +213,13 @@ void phydm_set_crystal_cap(void *dm_void, u8 crystal_cap) + if (cfo_track->crystal_cap == crystal_cap) + return; + +- if (phydm_set_crystal_cap_reg(dm, crystal_cap)) ++ if (phydm_set_crystal_cap_reg(dm, crystal_cap)) { + PHYDM_DBG(dm, DBG_CFO_TRK, "Set crystal_cap = 0x%x\n", + cfo_track->crystal_cap); +- else ++ } ++ else { + PHYDM_DBG(dm, DBG_CFO_TRK, "Set fail\n"); ++ } + } + + boolean +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c b/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c +index 458677b59..33f715bcc 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c +@@ -199,9 +199,10 @@ u8 phydm_psd(void *dm_void, u32 igi, u16 start_point, u16 stop_point) + if (dm->support_ic_type & ODM_IC_JGR3_SERIES) + PHYDM_DBG(dm, ODM_COMP_API, "0x1d70=((0x%x))\n", + odm_get_bb_reg(dm, R_0x1d70, MASKDWORD)); +- else ++ else { + PHYDM_DBG(dm, ODM_COMP_API, "0xc50=((0x%x))\n", + odm_get_bb_reg(dm, R_0xc50, MASKDWORD)); ++ } + + PHYDM_DBG(dm, ODM_COMP_API, "RF0x18=((0x%x))\n", + odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREG_MASK)); +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c b/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c +index 2c24b9be9..ca341c827 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c +@@ -443,8 +443,9 @@ void phydm_c2h_ra_report_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len) + PHYDM_DBG(dm, DBG_RA, "Rate Back\n"); + else if (cmd_buf[3] == 4) + PHYDM_DBG(dm, DBG_RA, "Start rate by RSSI\n"); +- else if (cmd_buf[3] == 5) ++ else if (cmd_buf[3] == 5) { + PHYDM_DBG(dm, DBG_RA, "Try rate\n"); ++ } + } + phydm_print_rate_2_buff(dm, rate, dbg_buf, PHYDM_SNPRINT_SIZE); + PHYDM_DBG(dm, DBG_RA, "Tx Rate=%s (%d)", dbg_buf, rate); +@@ -829,8 +830,9 @@ u8 phydm_get_tx_stream_num(void *dm_void, enum rf_type type) + tx_num = 3; + else if (type == RF_4T4R) + tx_num = 4; +- else ++ else { + PHYDM_DBG(dm, DBG_RA, "[Warrning] no mimo_type is found\n"); ++ } + + return tx_num; + } +diff --git a/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c b/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c +index 4329dcaee..286105ec0 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c ++++ b/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c +@@ -43,8 +43,9 @@ void hal_com_txbf_config_gtab( + { + struct dm_struct *dm = (struct dm_struct *)dm_void; + +- if (dm->support_ic_type & ODM_RTL8822B) ++ if (dm->support_ic_type & ODM_RTL8822B) { + hal_txbf_8822b_config_gtab(dm); ++ } + } + + void phydm_beamform_set_sounding_enter( +@@ -206,8 +207,9 @@ void hal_com_txbf_enter_work_item_callback( + hal_txbf_8192e_enter(dm, idx); + else if (dm->support_ic_type & ODM_RTL8814A) + hal_txbf_8814a_enter(dm, idx); +- else if (dm->support_ic_type & ODM_RTL8822B) ++ else if (dm->support_ic_type & ODM_RTL8822B) { + hal_txbf_8822b_enter(dm, idx); ++ } + } + + void hal_com_txbf_leave_work_item_callback( +@@ -236,8 +238,9 @@ void hal_com_txbf_leave_work_item_callback( + hal_txbf_8192e_leave(dm, idx); + else if (dm->support_ic_type & ODM_RTL8814A) + hal_txbf_8814a_leave(dm, idx); +- else if (dm->support_ic_type & ODM_RTL8822B) ++ else if (dm->support_ic_type & ODM_RTL8822B) { + hal_txbf_8822b_leave(dm, idx); ++ } + } + + void hal_com_txbf_fw_ndpa_work_item_callback( +@@ -265,8 +268,9 @@ void hal_com_txbf_fw_ndpa_work_item_callback( + hal_txbf_8192e_fw_tx_bf(dm, idx); + else if (dm->support_ic_type & ODM_RTL8814A) + hal_txbf_8814a_fw_txbf(dm, idx); +- else if (dm->support_ic_type & ODM_RTL8822B) ++ else if (dm->support_ic_type & ODM_RTL8822B) { + hal_txbf_8822b_fw_txbf(dm, idx); ++ } + } + + void hal_com_txbf_clk_work_item_callback( +@@ -363,8 +367,9 @@ void hal_com_txbf_status_work_item_callback( + hal_txbf_8192e_status(dm, idx); + else if (dm->support_ic_type & ODM_RTL8814A) + hal_txbf_8814a_status(dm, idx); +- else if (dm->support_ic_type & ODM_RTL8822B) ++ else if (dm->support_ic_type & ODM_RTL8822B) { + hal_txbf_8822b_status(dm, idx); ++ } + } + + void hal_com_txbf_reset_tx_path_work_item_callback( +diff --git a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c +index c42fa53a6..78bb399d9 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c ++++ b/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c +@@ -145,9 +145,10 @@ void hal_txbf_jaguar_download_ndpa( + dl_bcn_count++; + } while (!(bcn_valid_reg & BIT(0)) && dl_bcn_count < 5); + +- if (!(bcn_valid_reg & BIT(0))) ++ if (!(bcn_valid_reg & BIT(0))) { + PHYDM_DBG(dm, DBG_TXBF, "%s Download RSVD page failed!\n", + __func__); ++ } + + /*TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA*/ + odm_write_1byte(dm, REG_TDECTRL_8812A + 1, tx_page_bndy); +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0009-rtl8812au-add-suggested-braces-around-empty-body-in-.patch b/kernel/tools/perf/files/patches/mageia/0009-rtl8812au-add-suggested-braces-around-empty-body-in-.patch new file mode 100644 index 0000000000..3571454ea4 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0009-rtl8812au-add-suggested-braces-around-empty-body-in-.patch @@ -0,0 +1,96 @@ +From f9a18119d2a8f5bd4c35197c89c60305d58d3abd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Thu, 21 Nov 2024 17:03:25 +0100 +Subject: [PATCH 09/10] rtl8812au: add suggested braces around empty body in an + else statement + +--- + drivers/staging/rtl8812au/core/rtw_recv.c | 3 ++- + drivers/staging/rtl8812au/core/rtw_xmit.c | 3 ++- + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c | 3 ++- + .../rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c | 3 ++- + drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c | 3 ++- + 5 files changed, 10 insertions(+), 5 deletions(-) + +diff --git a/drivers/staging/rtl8812au/core/rtw_recv.c b/drivers/staging/rtl8812au/core/rtw_recv.c +index ed2bf605c..bdbc146ca 100644 +--- a/drivers/staging/rtl8812au/core/rtw_recv.c ++++ b/drivers/staging/rtl8812au/core/rtw_recv.c +@@ -2404,8 +2404,9 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) + dump_rx_packet(ptr); + } + #endif +- } else ++ } else { + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled); ++ } + break; + default: + DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown); +diff --git a/drivers/staging/rtl8812au/core/rtw_xmit.c b/drivers/staging/rtl8812au/core/rtw_xmit.c +index e40c0aecc..12a2d5d79 100644 +--- a/drivers/staging/rtl8812au/core/rtw_xmit.c ++++ b/drivers/staging/rtl8812au/core/rtw_xmit.c +@@ -1374,8 +1374,9 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap); +- } else ++ } else { + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown); ++ } + + get_sta_info: + bmcast = IS_MCAST(pattrib->ra); +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +index a4e3504a3..c31566d70 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +@@ -814,9 +814,10 @@ void phydm_get_thermal_trim_offset_8198f(void *dm_void) + RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal trim flag:0x%02x\n", + power_trim_info->flag); + +- if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) ++ if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) { + RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal:%d\n", + power_trim_info->thermal); ++ } + } + + void phydm_get_power_trim_offset_8198f(void *dm_void); +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +index a006d7e74..4f11b8223 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +@@ -1320,9 +1320,10 @@ void phy_iq_calibrate_8812a(void *dm_void, boolean is_recovery) + if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) { + _phy_iq_calibrate_by_fw_8812a(dm); + phydm_iqk_wait(dm, 500); +- if (dm->rf_calibrate_info.is_iqk_in_progress) ++ if (dm->rf_calibrate_info.is_iqk_in_progress) { + RF_DBG(dm, DBG_RF_IQK, + "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); ++ } + } else { + _phy_iq_calibrate_8812a(dm, *dm->channel); + } +diff --git a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +index 952b5600b..28ab2dd54 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c ++++ b/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +@@ -1196,10 +1196,11 @@ void phydm_beamforming_notify( + /*@if (sound_info->sound_mode == SOUNDING_SW_VHT_TIMER || sound_info->sound_mode == SOUNDING_SW_HT_TIMER) + odm_set_timer(dm, &beam_info->beamforming_timer, sound_info->sound_period);*/ + odm_set_timer(dm, &beam_info->beamforming_timer, 1000); /*@Do MU sounding every 1sec*/ +- } else ++ } else { + PHYDM_DBG(dm, DBG_TXBF, + "%s: Less or larger than 2 MU STAs, not to set timer\n", + __func__); ++ } + break; + + case BEAMFORMEE_NOTIFY_DELETE_MU: +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0010-rtl8812au-add-missed-prototypes.patch b/kernel/tools/perf/files/patches/mageia/0010-rtl8812au-add-missed-prototypes.patch new file mode 100644 index 0000000000..c6f47d7f07 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0010-rtl8812au-add-missed-prototypes.patch @@ -0,0 +1,42 @@ +From 18bb3090b6c0876842813ac10d1822412f51e97e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Giuseppe=20Ghib=C3=B2?= +Date: Thu, 21 Nov 2024 17:07:41 +0100 +Subject: [PATCH 10/10] rtl8812au: add missed prototypes + +--- + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 7 +++++++ + drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c | 1 + + 2 files changed, 8 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index c0f563430..72538365a 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -2151,6 +2151,12 @@ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + int link_id, + #endif ++ u8 key_index); ++int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, ++ struct net_device *ndev, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ int link_id, ++#endif + u8 key_index) + { + #define SET_DEF_KEY_PARAM_FMT " key_index=%d" +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c b/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c +index c7eb7ea40..9ced824fe 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c +@@ -898,6 +898,7 @@ void usb_recv_tasklet(unsigned long priv) + } + } + ++void usb_read_port_complete(struct urb *purb, struct pt_regs *regs); + void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) + { + struct recv_buf *precvbuf = (struct recv_buf *)purb->context; +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0122-Fix-change_beacon-for-kernel-6.7.patch b/kernel/tools/perf/files/patches/mageia/0122-Fix-change_beacon-for-kernel-6.7.patch new file mode 100644 index 0000000000..88ad49646b --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0122-Fix-change_beacon-for-kernel-6.7.patch @@ -0,0 +1,33 @@ +From c0d16813f5af3b464cdb6dd415c83d1f238e3548 Mon Sep 17 00:00:00 2001 +From: CamiKaseM7 +Date: Tue, 16 Jan 2024 03:44:34 -0300 +Subject: [PATCH 122/132] Fix change_beacon for kernel 6.7 + +--- + os_dep/linux/ioctl_cfg80211.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index 510fa45..a135804 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -5283,9 +5283,16 @@ exit: + return ret; + } + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)) ++static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_ap_update *params) ++{ ++ struct cfg80211_beacon_data *info = ¶ms->beacon; ++#else + static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_beacon_data *info) + { ++#endif + int ret = 0; + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0123-Update-os_intfs.c-for-kernel-6.8.patch b/kernel/tools/perf/files/patches/mageia/0123-Update-os_intfs.c-for-kernel-6.8.patch new file mode 100644 index 0000000000..c740ce5e50 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0123-Update-os_intfs.c-for-kernel-6.8.patch @@ -0,0 +1,27 @@ +From d3feb6ae9398834d7778c0e43ebd1fa757eaecd8 Mon Sep 17 00:00:00 2001 +From: alium +Date: Tue, 12 Mar 2024 07:11:35 +0100 +Subject: [PATCH 123/132] Update os_intfs.c for kernel 6.8 + +--- + os_dep/linux/os_intfs.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +index 2dadae0..f4f2ef9 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +@@ -17,6 +17,10 @@ + #include + #include + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0)) ++#define strlcpy strscpy ++#endif ++ + MODULE_LICENSE("GPL"); + MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); + MODULE_AUTHOR("Realtek Semiconductor Corp."); +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0124-Update-usb_intf.c-for-kernel-6.8.patch b/kernel/tools/perf/files/patches/mageia/0124-Update-usb_intf.c-for-kernel-6.8.patch new file mode 100644 index 0000000000..15e2203b64 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0124-Update-usb_intf.c-for-kernel-6.8.patch @@ -0,0 +1,25 @@ +From 88d0f5ca85cb8f6a7970ccca9d06a5aa424a18b2 Mon Sep 17 00:00:00 2001 +From: alium +Date: Tue, 12 Mar 2024 07:14:38 +0100 +Subject: [PATCH 124/132] Update usb_intf.c for kernel 6.8 + +--- + os_dep/linux/usb_intf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index be0f654..709e935 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -270,7 +270,7 @@ struct rtw_usb_drv usb_drv = { + .usbdrv.supports_autosuspend = 1, + #endif + +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0)) + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, + #else + .usbdrv.driver.shutdown = rtw_dev_shutdown, +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/0128-Update-ioctl_cfg80211.c-support-for-kernel-6.9.patch b/kernel/tools/perf/files/patches/mageia/0128-Update-ioctl_cfg80211.c-support-for-kernel-6.9.patch new file mode 100644 index 0000000000..78fce1824c --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/0128-Update-ioctl_cfg80211.c-support-for-kernel-6.9.patch @@ -0,0 +1,35 @@ +From 860ccf31655e160ec921190e443f0b532d8d3308 Mon Sep 17 00:00:00 2001 +From: alium +Date: Sat, 30 Mar 2024 09:50:44 +0100 +Subject: [PATCH 128/132] Update ioctl_cfg80211.c - support for kernel 6.9 + + support for kernel 6.9 +--- + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index a135804..c1f20e9 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -460,7 +460,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + if (started) { +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false, 0); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false); +@@ -476,7 +476,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, + if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) + goto exit; + +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 9, 0)) + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); +-- +2.41.1 + diff --git a/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-merge.patch b/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-merge.patch deleted file mode 100644 index 78d502ec1d..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-merge.patch +++ /dev/null @@ -1,57 +0,0 @@ - -Include 3rdparty directory into the main build-system. - -Original author is unknown. -(Was either Juan Quintela or Jeff Garzik) - -Signed-off-by: Luiz Fernando N. Capitulino -Signed-off-by: Herton Ronaldo Krzesinski -[Simplified for Mageia 7 / kernel 5.1.6 and up / tmb] -Signed-off-by: Thomas Backlund - ---- - Makefile | 2 +- - arch/arm/Kconfig | 2 ++ - arch/arm64/Kconfig | 2 ++ - arch/x86/Kconfig | 2 ++ - 4 files changed, 7 insertions(+), 1 deletion(-) - -diff -Nurp linux-5.12/arch/arm/Kconfig linux-5.12-3rd/arch/arm/Kconfig ---- linux-5.12/arch/arm/Kconfig 2021-04-25 23:49:08.000000000 +0300 -+++ linux-5.12-3rd/arch/arm/Kconfig 2021-04-26 18:10:06.513775304 +0300 -@@ -2016,3 +2016,5 @@ source "arch/arm/crypto/Kconfig" - endif - - source "arch/arm/Kconfig.assembler" -+ -+source "3rdparty/Kconfig" -diff -Nurp linux-5.12/arch/arm64/Kconfig linux-5.12-3rd/arch/arm64/Kconfig ---- linux-5.12/arch/arm64/Kconfig 2021-04-25 23:49:08.000000000 +0300 -+++ linux-5.12-3rd/arch/arm64/Kconfig 2021-04-26 18:10:06.512775257 +0300 -@@ -1959,3 +1959,5 @@ source "arch/arm64/kvm/Kconfig" - if CRYPTO - source "arch/arm64/crypto/Kconfig" - endif -+ -+source "3rdparty/Kconfig" -diff -Nurp linux-5.12/arch/x86/Kconfig linux-5.12-3rd/arch/x86/Kconfig ---- linux-5.12/arch/x86/Kconfig 2021-04-25 23:49:08.000000000 +0300 -+++ linux-5.12-3rd/arch/x86/Kconfig 2021-04-26 18:10:06.512775257 +0300 -@@ -2909,3 +2909,5 @@ source "drivers/firmware/Kconfig" - source "arch/x86/kvm/Kconfig" - - source "arch/x86/Kconfig.assembler" -+ -+source "3rdparty/Kconfig" -diff -Nurp linux-5.14/Makefile linux-5.14-3rd/Makefile ---- linux-5.14/Makefile -+++ linux-5.14-3rd/Makefile -@@ -670,7 +670,7 @@ endif - ifeq ($(KBUILD_EXTMOD),) - # Objects we will link into vmlinux / subdirs we need to visit - core-y := init/ usr/ arch/$(SRCARCH)/ --drivers-y := drivers/ sound/ -+drivers-y := drivers/ sound/ 3rdparty/ - drivers-$(CONFIG_SAMPLES) += samples/ - drivers-$(CONFIG_NET) += net/ - drivers-y += virt/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-tree.patch b/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-tree.patch deleted file mode 100644 index 483e4e5757..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-3rdparty-tree.patch +++ /dev/null @@ -1,21 +0,0 @@ - - 3rdparty/Kconfig | 5 +++++ - 3rdparty/Makefile | 3 +++ - 2 files changed, 8 insertions(+) - -diff -Nurp linux-5.1.6/3rdparty/Kconfig linux-5.1.6-3rd/3rdparty/Kconfig ---- linux-5.1.6/3rdparty/Kconfig 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.1.6-3rd/3rdparty/Kconfig 2019-05-31 23:02:53.380127780 +0300 -@@ -0,0 +1,5 @@ -+# -+ -+menu "External 3rdparty kernel additions" -+ -+endmenu -diff -Nurp linux-5.1.6/3rdparty/Makefile linux-5.1.6-3rd/3rdparty/Makefile ---- linux-5.1.6/3rdparty/Makefile 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.1.6-3rd/3rdparty/Makefile 2019-05-31 23:03:58.338529850 +0300 -@@ -0,0 +1,3 @@ -+# -+ -+obj- := 3rdparty.o # Dummy rule to force built-in.o to be made diff --git a/kernel/tools/perf/files/patches/mageia/3rd-fix-kconfig.patch b/kernel/tools/perf/files/patches/mageia/3rd-fix-kconfig.patch deleted file mode 100644 index 783807d71e..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-fix-kconfig.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff -up ./3rdparty/rtl8723de/Kconfig.tv ./3rdparty/rtl8723de/Kconfig ---- ./3rdparty/rtl8723de/Kconfig.tv 2020-10-13 21:02:42.452125426 +0200 -+++ ./3rdparty/rtl8723de/Kconfig 2020-10-13 20:59:14.012371730 +0200 -@@ -1,6 +1,6 @@ - config RTL8723DE - tristate "Realtek 8723DE PCI WiFi" - depends on PCI -- ---help--- -+ help - Help message of RTL8723DE - -diff -up ./3rdparty/rtl8821ce/Kconfig.tv ./3rdparty/rtl8821ce/Kconfig ---- ./3rdparty/rtl8821ce/Kconfig.tv 2020-10-13 16:09:11.157856145 +0200 -+++ ./3rdparty/rtl8821ce/Kconfig 2020-10-13 20:58:17.242118685 +0200 -@@ -1,6 +1,6 @@ - config RTL8821CE - tristate "Realtek 8821C PCI WiFi" - depends on PCI -- ---help--- -+ help - Help message of RTL8821CE - -diff -up ./3rdparty/viahss/Kconfig.tv ./3rdparty/viahss/Kconfig ---- ./3rdparty/viahss/Kconfig.tv 2020-10-13 21:02:44.844168369 +0200 -+++ ./3rdparty/viahss/Kconfig 2020-10-13 20:59:19.875488718 +0200 -@@ -1,7 +1,7 @@ - config VIAHSS - tristate "VIA High Speed Serial" - depends on SERIAL_CORE && m -- ---help--- -+ help - VIA High Speed Serial is a little kernel module (1 KB) which enables - high speed serial port modes of VIA VT82C686A or VT82C686B - southbridge-equipped motherboards. With this module, you can use the diff --git a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-1.63.patch b/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-1.63.patch deleted file mode 100644 index f513309396..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-1.63.patch +++ /dev/null @@ -1,26570 +0,0 @@ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/crt.c linux-5.6.11-ndis/3rdparty/ndiswrapper/crt.c ---- linux-5.6.11/3rdparty/ndiswrapper/crt.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/crt.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,589 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+#include "crt_exports.h" -+ -+#ifdef CONFIG_X86_64 -+/* Windows long is 32-bit, so strip single 'l' in integer formats */ -+static void strip_l_modifier(char *str) -+{ -+ char *ptr = str; -+ int in_format = 0; -+ char *lptr = NULL; -+ char last = 0; -+ char *end_ptr; -+ char *wptr; -+ -+ /* Replace single 'l' inside integer formats with '\0' */ -+ for (ptr = str; *ptr; ptr++) { -+ if (!in_format) { -+ if (*ptr == '%') -+ in_format = 1; -+ last = *ptr; -+ continue; -+ } -+ switch (*ptr) { -+ case 'd': -+ case 'i': -+ case 'o': -+ case 'u': -+ case 'x': -+ case 'X': -+ case 'p': -+ case 'n': -+ case 'm': -+ if (lptr) { -+ *lptr = '\0'; -+ lptr = NULL; -+ } -+ in_format = 0; -+ break; -+ case 'c': -+ case 'C': -+ case 's': -+ case 'S': -+ case 'f': -+ case 'e': -+ case 'E': -+ case 'g': -+ case 'G': -+ case 'a': -+ case 'A': -+ lptr = NULL; -+ in_format = 0; -+ break; -+ case '%': -+ lptr = NULL; -+ if (last == '%') -+ in_format = 0; -+ else -+ in_format = 1; /* ignore previous junk */ -+ break; -+ case 'l': -+ if (last == 'l') -+ lptr = NULL; -+ else -+ lptr = ptr; -+ break; -+ default: -+ break; -+ } -+ last = *ptr; -+ } -+ -+ /* Purge zeroes from the resulting string */ -+ end_ptr = ptr; -+ wptr = str; -+ for (ptr = str; ptr < end_ptr; ptr++) -+ if (*ptr != 0) -+ *(wptr++) = *ptr; -+ *wptr = 0; -+} -+ -+/* -+ * va_list on x86_64 Linux is designed to allow passing arguments in registers -+ * even to variadic functions. va_list is a structure holding pointers to the -+ * register save area, which holds the arguments passed in registers, and to -+ * the stack, which may have the arguments that did not fit the registers. -+ * va_list also holds offsets in the register save area for the next general -+ * purpose and floating point registers that the next va_arg() would fetch. -+ * -+ * Unlike Linux, the Windows va_list is just a pointer to the stack. No -+ * arguments are passed in the registers. That's why we construct the Linux -+ * va_list so that the register save area is never used. For that goal, we set -+ * the offsets to the maximal allowed values, meaning that the arguments passed -+ * in the registers have been exhausted. The values are 48 for general purpose -+ * registers (6 registers, 8 bytes each) and 304 for floating point registers -+ * (16 registers, 16 bytes each, on top of general purpose register). -+ */ -+ -+struct x86_64_va_list { -+ int gp_offset; -+ int fp_offset; -+ void *overflow_arg_area; -+ void *reg_save_area; -+}; -+ -+#define VA_LIST_DECL(_args) \ -+ va_list _args##new; \ -+ struct x86_64_va_list *_args##x; -+#define VA_LIST_PREP(_args) \ -+do { \ -+ _args##x = (struct x86_64_va_list *)&_args##new; \ -+ _args##x->gp_offset = 6 * 8; /* GP registers exhausted */ \ -+ _args##x->fp_offset = 6 * 8 + 16 * 16; /* FP registers exhausted */ \ -+ _args##x->overflow_arg_area = (void *)_args; \ -+ _args##x->reg_save_area = NULL; \ -+} while (0) -+#define VA_LIST_CONV(_args) (_args##new) -+#define VA_LIST_FREE(_args) -+#define FMT_DECL(_fmt) \ -+ char *_fmt##copy; \ -+ int _fmt##len; -+#define FMT_PREP(_fmt) \ -+do { \ -+ _fmt##len = strlen(format) + 1; \ -+ _fmt##copy = kmalloc(_fmt##len, irql_gfp()); \ -+ if (_fmt##copy) { \ -+ memcpy(_fmt##copy, format, _fmt##len); \ -+ strip_l_modifier(_fmt##copy); \ -+ } \ -+} while (0) -+#define FMT_CONV(_fmt) (_fmt##copy ? _fmt##copy : format) -+#define FMT_FREE(_fmt) kfree(_fmt##copy) -+ -+#else /* !CONFIG_X86_64 */ -+ -+#define VA_LIST_DECL(_args) -+#define VA_LIST_PREP(_args) -+#define VA_LIST_CONV(_args) (_args) -+#define VA_LIST_FREE(_args) -+#define FMT_DECL(_fmt) -+#define FMT_PREP(_fmt) -+#define FMT_CONV(_fmt) (format) -+#define FMT_FREE(_fmt) -+ -+#endif /* !CONFIG_X86_64 */ -+ -+__attribute__((format(printf, 2, 3))) -+noregparm INT WIN_FUNC(_win_sprintf,12) -+ (char *buf, const char *format, ...) -+{ -+ va_list args; -+ int res; -+ FMT_DECL(format) -+ -+ FMT_PREP(format); -+ va_start(args, format); -+ res = vsprintf(buf, FMT_CONV(format), args); -+ va_end(args); -+ FMT_FREE(format); -+ -+ TRACE2("buf: %p: %s", buf, buf); -+ return res; -+} -+ -+noregparm INT WIN_FUNC(swprintf,12) -+ (wchar_t *buf, const wchar_t *format, ...) -+{ -+ TODO(); -+ EXIT2(return 0); -+} -+ -+noregparm INT WIN_FUNC(_win_vsprintf,3) -+ (char *str, const char *format, va_list ap) -+{ -+ INT i; -+ VA_LIST_DECL(ap) -+ FMT_DECL(format) -+ -+ VA_LIST_PREP(ap); -+ FMT_PREP(format); -+ -+ i = vsprintf(str, FMT_CONV(format), VA_LIST_CONV(ap)); -+ TRACE2("str: %p: %s", str, str); -+ -+ FMT_FREE(format); -+ VA_LIST_FREE(ap); -+ EXIT2(return i); -+} -+ -+__attribute__((format(printf, 3, 4))) -+noregparm INT WIN_FUNC(_win_snprintf,12) -+ (char *buf, SIZE_T count, const char *format, ...) -+{ -+ va_list args; -+ int res; -+ FMT_DECL(format) -+ -+ FMT_PREP(format); -+ va_start(args, format); -+ res = vsnprintf(buf, count, FMT_CONV(format), args); -+ va_end(args); -+ TRACE2("buf: %p: %s", buf, buf); -+ -+ FMT_FREE(format); -+ return res; -+} -+ -+__attribute__((format(printf, 3, 4))) -+noregparm INT WIN_FUNC(_win__snprintf,12) -+ (char *buf, SIZE_T count, const char *format, ...) -+{ -+ va_list args; -+ int res; -+ FMT_DECL(format) -+ -+ FMT_PREP(format); -+ va_start(args, format); -+ res = vsnprintf(buf, count, FMT_CONV(format), args); -+ va_end(args); -+ TRACE2("buf: %p: %s", buf, buf); -+ -+ FMT_FREE(format); -+ return res; -+} -+ -+noregparm INT WIN_FUNC(_win_vsnprintf,4) -+ (char *str, SIZE_T size, const char *format, va_list ap) -+{ -+ INT i; -+ VA_LIST_DECL(ap) -+ FMT_DECL(format) -+ -+ VA_LIST_PREP(ap); -+ FMT_PREP(format); -+ -+ i = vsnprintf(str, size, FMT_CONV(format), VA_LIST_CONV(ap)); -+ TRACE2("str: %p: %s", str, str); -+ -+ FMT_FREE(format); -+ VA_LIST_FREE(ap); -+ EXIT2(return i); -+} -+ -+noregparm INT WIN_FUNC(_win__vsnprintf,4) -+ (char *str, SIZE_T size, const char *format, va_list ap) -+{ -+ INT i; -+ VA_LIST_DECL(ap) -+ FMT_DECL(format) -+ -+ VA_LIST_PREP(ap); -+ FMT_PREP(format); -+ -+ i = vsnprintf(str, size, FMT_CONV(format), VA_LIST_CONV(ap)); -+ TRACE2("str: %p: %s", str, str); -+ -+ FMT_FREE(format); -+ VA_LIST_FREE(ap); -+ EXIT2(return i); -+} -+ -+noregparm INT WIN_FUNC(_win__vsnwprintf,4) -+ (wchar_t *str, SIZE_T size, const wchar_t *format, va_list ap) -+{ -+ int ret; -+ -+ TODO(); /* format expansion not implemented */ -+ _win_wcsncpy(str, format, size); -+ ret = _win_wcslen(format); -+ if (ret >= size) -+ ret = -1; -+ return ret; -+} -+ -+noregparm char *WIN_FUNC(_win_strncpy,3) -+ (char *dst, char *src, SIZE_T n) -+{ -+ return strncpy(dst, src, n); -+} -+ -+noregparm SIZE_T WIN_FUNC(_win_strlen,1) -+ (const char *s) -+{ -+ return strlen(s); -+} -+ -+noregparm INT WIN_FUNC(_win_strncmp,3) -+ (const char *s1, const char *s2, SIZE_T n) -+{ -+ return strncmp(s1, s2, n); -+} -+ -+noregparm INT WIN_FUNC(_win_strcmp,2) -+ (const char *s1, const char *s2) -+{ -+ return strcmp(s1, s2); -+} -+ -+noregparm INT WIN_FUNC(_win_stricmp,2) -+ (const char *s1, const char *s2) -+{ -+ return stricmp(s1, s2); -+} -+ -+noregparm char *WIN_FUNC(_win_strncat,3) -+ (char *dest, const char *src, SIZE_T n) -+{ -+ return strncat(dest, src, n); -+} -+ -+noregparm INT WIN_FUNC(_win_wcscmp,2) -+ (const wchar_t *s1, const wchar_t *s2) -+{ -+ while (*s1 && *s1 == *s2) { -+ s1++; -+ s2++; -+ } -+ return *s1 - *s2; -+} -+ -+noregparm INT WIN_FUNC(_win_wcsicmp,2) -+ (const wchar_t *s1, const wchar_t *s2) -+{ -+ while (*s1 && tolower((char)*s1) == tolower((char)*s2)) { -+ s1++; -+ s2++; -+ } -+ return tolower((char)*s1) - tolower((char)*s2); -+} -+ -+noregparm SIZE_T WIN_FUNC(_win_wcslen,1) -+ (const wchar_t *s) -+{ -+ const wchar_t *t = s; -+ while (*t) -+ t++; -+ return t - s; -+} -+ -+noregparm wchar_t *WIN_FUNC(_win_wcsncpy,3) -+ (wchar_t *dest, const wchar_t *src, SIZE_T n) -+{ -+ const wchar_t *s; -+ wchar_t *d; -+ s = src + n; -+ d = dest; -+ while (src < s && (*d++ = *src++)) -+ ; -+ if (s > src) -+ memset(d, 0, (s - src) * sizeof(wchar_t)); -+ return dest; -+} -+ -+noregparm wchar_t *WIN_FUNC(_win_wcscpy,2) -+ (wchar_t *dest, const wchar_t *src) -+{ -+ wchar_t *d = dest; -+ while ((*d++ = *src++)) -+ ; -+ return dest; -+} -+ -+noregparm wchar_t *WIN_FUNC(_win_wcscat,2) -+ (wchar_t *dest, const wchar_t *src) -+{ -+ wchar_t *d; -+ d = dest; -+ while (*d) -+ d++; -+ while ((*d++ = *src++)) -+ ; -+ return dest; -+} -+ -+noregparm INT WIN_FUNC(_win_towupper,1) -+ (wchar_t c) -+{ -+ return toupper(c); -+} -+ -+noregparm INT WIN_FUNC(_win_towlower,1) -+ (wchar_t c) -+{ -+ return tolower(c); -+} -+ -+noregparm INT WIN_FUNC(_win_tolower,1) -+ (INT c) -+{ -+ return tolower(c); -+} -+ -+noregparm INT WIN_FUNC(_win_toupper,1) -+ (INT c) -+{ -+ return toupper(c); -+} -+ -+noregparm void *WIN_FUNC(_win_strcpy,2) -+ (void *to, const void *from) -+{ -+ return strcpy(to, from); -+} -+ -+noregparm char *WIN_FUNC(_win_strstr,2) -+ (const char *s1, const char *s2) -+{ -+ return strstr(s1, s2); -+} -+ -+noregparm char *WIN_FUNC(_win_strchr,2) -+ (const char *s, int c) -+{ -+ return strchr(s, c); -+} -+ -+noregparm char *WIN_FUNC(_win_strrchr,2) -+ (const char *s, int c) -+{ -+ return strrchr(s, c); -+} -+ -+noregparm void *WIN_FUNC(_win_memmove,3) -+ (void *to, void *from, SIZE_T count) -+{ -+ return memmove(to, from, count); -+} -+ -+noregparm void *WIN_FUNC(_win_memchr,3) -+ (const void *s, INT c, SIZE_T n) -+{ -+ return memchr(s, c, n); -+} -+ -+noregparm void *WIN_FUNC(_win_memcpy,3) -+ (void *to, const void *from, SIZE_T n) -+{ -+ return memcpy(to, from, n); -+} -+ -+noregparm void *WIN_FUNC(_win_memset,3) -+ (void *s, char c, SIZE_T count) -+{ -+ return memset(s, c, count); -+} -+ -+noregparm int WIN_FUNC(_win_memcmp,3) -+ (void *s1, void *s2, SIZE_T n) -+{ -+ return memcmp(s1, s2, n); -+} -+ -+noregparm void WIN_FUNC(_win_srand,1) -+ (UINT seed) -+{ -+ prandom_seed(seed); -+} -+ -+noregparm int WIN_FUNC(rand,0) -+ (void) -+{ -+ char buf[6]; -+ int i, n; -+ -+ get_random_bytes(buf, sizeof(buf)); -+ for (n = i = 0; i < sizeof(buf); i++) -+ n += buf[i]; -+ return n; -+} -+ -+noregparm int WIN_FUNC(_win_atoi,1) -+ (const char *ptr) -+{ -+ int i = simple_strtol(ptr, NULL, 10); -+ return i; -+} -+ -+noregparm int WIN_FUNC(_win_isdigit,1) -+ (int c) -+{ -+ return isdigit(c); -+} -+ -+noregparm int WIN_FUNC(_win_isprint,1) -+ (int c) -+{ -+ return isprint(c); -+} -+ -+wstdcall s64 WIN_FUNC(_alldiv,2) -+ (s64 a, s64 b) -+{ -+ return a / b; -+} -+ -+wstdcall u64 WIN_FUNC(_aulldiv,2) -+ (u64 a, u64 b) -+{ -+ return a / b; -+} -+ -+wstdcall s64 WIN_FUNC(_allmul,2) -+ (s64 a, s64 b) -+{ -+ return a * b; -+} -+ -+wstdcall u64 WIN_FUNC(_aullmul,2) -+ (u64 a, u64 b) -+{ -+ return a * b; -+} -+ -+wstdcall s64 WIN_FUNC(_allrem,2) -+ (s64 a, s64 b) -+{ -+ return a % b; -+} -+ -+wstdcall u64 WIN_FUNC(_aullrem,2) -+ (u64 a, u64 b) -+{ -+ return a % b; -+} -+ -+regparm3 s64 WIN_FUNC(_allshl,2) -+ (s64 a, u8 b) -+{ -+ return a << b; -+} -+ -+regparm3 u64 WIN_FUNC(_aullshl,2) -+ (u64 a, u8 b) -+{ -+ return a << b; -+} -+ -+regparm3 s64 WIN_FUNC(_allshr,2) -+ (s64 a, u8 b) -+{ -+ return a >> b; -+} -+ -+regparm3 u64 WIN_FUNC(_aullshr,2) -+ (u64 a, u8 b) -+{ -+ return a >> b; -+} -+ -+int stricmp(const char *s1, const char *s2) -+{ -+ while (*s1 && tolower(*s1) == tolower(*s2)) { -+ s1++; -+ s2++; -+ } -+ return *s1 - *s2; -+} -+ -+void dump_bytes(const char *ctx, const u8 *from, int len) -+{ -+ int i, j; -+ u8 *buf; -+ -+ buf = kmalloc(len * 3 + 1, irql_gfp()); -+ if (!buf) { -+ ERROR("couldn't allocate memory"); -+ return; -+ } -+ for (i = j = 0; i < len; i++, j += 3) { -+ sprintf(&buf[j], "%02x ", from[i]); -+ } -+ buf[j] = 0; -+ printk(KERN_DEBUG "%s: %p: %s\n", ctx, from, buf); -+ kfree(buf); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/divdi3.c linux-5.6.11-ndis/3rdparty/ndiswrapper/divdi3.c ---- linux-5.6.11/3rdparty/ndiswrapper/divdi3.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/divdi3.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,329 @@ -+/* 64-bit multiplication and division -+ Copyright (C) 1989, 1992-1999, 2000, 2001, 2002, 2003 -+ Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+#include -+ -+#if BITS_PER_LONG != 32 -+#error This is for 32-bit targets only -+#endif -+ -+typedef unsigned int UQItype __attribute__ ((mode (QI))); -+typedef int SItype __attribute__ ((mode (SI))); -+typedef unsigned int USItype __attribute__ ((mode (SI))); -+typedef int DItype __attribute__ ((mode (DI))); -+typedef unsigned int UDItype __attribute__ ((mode (DI))); -+#define Wtype SItype -+#define HWtype SItype -+#define DWtype DItype -+#define UWtype USItype -+#define UHWtype USItype -+#define UDWtype UDItype -+#define W_TYPE_SIZE 32 -+ -+#include "longlong.h" -+ -+#if defined(__BIG_ENDIAN) -+struct DWstruct { Wtype high, low;}; -+#elif defined(__LITTLE_ENDIAN) -+struct DWstruct { Wtype low, high;}; -+#else -+#error Unhandled endianity -+#endif -+typedef union { struct DWstruct s; DWtype ll; } DWunion; -+ -+/* Prototypes of exported functions. */ -+extern DWtype __divdi3 (DWtype u, DWtype v); -+extern DWtype __moddi3 (DWtype u, DWtype v); -+extern UDWtype __udivdi3 (UDWtype u, UDWtype v); -+extern UDWtype __umoddi3 (UDWtype u, UDWtype v); -+ -+static UDWtype -+__udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp) -+{ -+ DWunion ww; -+ DWunion nn, dd; -+ DWunion rr; -+ UWtype d0, d1, n0, n1, n2; -+ UWtype q0, q1; -+ UWtype b, bm; -+ -+ nn.ll = n; -+ dd.ll = d; -+ -+ d0 = dd.s.low; -+ d1 = dd.s.high; -+ n0 = nn.s.low; -+ n1 = nn.s.high; -+ -+#if !UDIV_NEEDS_NORMALIZATION -+ if (d1 == 0) -+ { -+ if (d0 > n1) -+ { -+ /* 0q = nn / 0D */ -+ -+ udiv_qrnnd (q0, n0, n1, n0, d0); -+ q1 = 0; -+ -+ /* Remainder in n0. */ -+ } -+ else -+ { -+ /* qq = NN / 0d */ -+ -+ if (d0 == 0) -+ d0 = 1 / d0; /* Divide intentionally by zero. */ -+ -+ udiv_qrnnd (q1, n1, 0, n1, d0); -+ udiv_qrnnd (q0, n0, n1, n0, d0); -+ -+ /* Remainder in n0. */ -+ } -+ -+ if (rp != NULL) -+ { -+ rr.s.low = n0; -+ rr.s.high = 0; -+ *rp = rr.ll; -+ } -+ } -+ -+#else /* UDIV_NEEDS_NORMALIZATION */ -+ -+ if (d1 == 0) -+ { -+ if (d0 > n1) -+ { -+ /* 0q = nn / 0D */ -+ -+ count_leading_zeros (bm, d0); -+ -+ if (bm != 0) -+ { -+ /* Normalize, i.e. make the most significant bit of the -+ denominator set. */ -+ -+ d0 = d0 << bm; -+ n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm)); -+ n0 = n0 << bm; -+ } -+ -+ udiv_qrnnd (q0, n0, n1, n0, d0); -+ q1 = 0; -+ -+ /* Remainder in n0 >> bm. */ -+ } -+ else -+ { -+ /* qq = NN / 0d */ -+ -+ if (d0 == 0) -+ d0 = 1 / d0; /* Divide intentionally by zero. */ -+ -+ count_leading_zeros (bm, d0); -+ -+ if (bm == 0) -+ { -+ /* From (n1 >= d0) /\ (the most significant bit of d0 is set), -+ conclude (the most significant bit of n1 is set) /\ (the -+ leading quotient digit q1 = 1). -+ -+ This special case is necessary, not an optimization. -+ (Shifts counts of W_TYPE_SIZE are undefined.) */ -+ -+ n1 -= d0; -+ q1 = 1; -+ } -+ else -+ { -+ /* Normalize. */ -+ -+ b = W_TYPE_SIZE - bm; -+ -+ d0 = d0 << bm; -+ n2 = n1 >> b; -+ n1 = (n1 << bm) | (n0 >> b); -+ n0 = n0 << bm; -+ -+ udiv_qrnnd (q1, n1, n2, n1, d0); -+ } -+ -+ /* n1 != d0... */ -+ -+ udiv_qrnnd (q0, n0, n1, n0, d0); -+ -+ /* Remainder in n0 >> bm. */ -+ } -+ -+ if (rp != NULL) -+ { -+ rr.s.low = n0 >> bm; -+ rr.s.high = 0; -+ *rp = rr.ll; -+ } -+ } -+#endif /* UDIV_NEEDS_NORMALIZATION */ -+ -+ else -+ { -+ if (d1 > n1) -+ { -+ /* 00 = nn / DD */ -+ -+ q0 = 0; -+ q1 = 0; -+ -+ /* Remainder in n1n0. */ -+ if (rp != NULL) -+ { -+ rr.s.low = n0; -+ rr.s.high = n1; -+ *rp = rr.ll; -+ } -+ } -+ else -+ { -+ /* 0q = NN / dd */ -+ -+ count_leading_zeros (bm, d1); -+ if (bm == 0) -+ { -+ /* From (n1 >= d1) /\ (the most significant bit of d1 is set), -+ conclude (the most significant bit of n1 is set) /\ (the -+ quotient digit q0 = 0 or 1). -+ -+ This special case is necessary, not an optimization. */ -+ -+ /* The condition on the next line takes advantage of that -+ n1 >= d1 (true due to program flow). */ -+ if (n1 > d1 || n0 >= d0) -+ { -+ q0 = 1; -+ sub_ddmmss (n1, n0, n1, n0, d1, d0); -+ } -+ else -+ q0 = 0; -+ -+ q1 = 0; -+ -+ if (rp != NULL) -+ { -+ rr.s.low = n0; -+ rr.s.high = n1; -+ *rp = rr.ll; -+ } -+ } -+ else -+ { -+ UWtype m1, m0; -+ /* Normalize. */ -+ -+ b = W_TYPE_SIZE - bm; -+ -+ d1 = (d1 << bm) | (d0 >> b); -+ d0 = d0 << bm; -+ n2 = n1 >> b; -+ n1 = (n1 << bm) | (n0 >> b); -+ n0 = n0 << bm; -+ -+ udiv_qrnnd (q0, n1, n2, n1, d1); -+ umul_ppmm (m1, m0, q0, d0); -+ -+ if (m1 > n1 || (m1 == n1 && m0 > n0)) -+ { -+ q0--; -+ sub_ddmmss (m1, m0, m1, m0, d1, d0); -+ } -+ -+ q1 = 0; -+ -+ /* Remainder in (n1n0 - m1m0) >> bm. */ -+ if (rp != NULL) -+ { -+ sub_ddmmss (n1, n0, n1, n0, m1, m0); -+ rr.s.low = (n1 << b) | (n0 >> bm); -+ rr.s.high = n1 >> bm; -+ *rp = rr.ll; -+ } -+ } -+ } -+ } -+ -+ ww.s.low = q0; -+ ww.s.high = q1; -+ return ww.ll; -+} -+ -+DWtype -+__divdi3 (DWtype u, DWtype v) -+{ -+ Wtype c = 0; -+ DWtype w; -+ -+ if (u < 0) -+ { -+ c = ~c; -+ u = -u; -+ } -+ if (v < 0) -+ { -+ c = ~c; -+ v = -v; -+ } -+ w = __udivmoddi4 (u, v, NULL); -+ if (c) -+ w = -w; -+ return w; -+} -+ -+DWtype -+__moddi3 (DWtype u, DWtype v) -+{ -+ Wtype c = 0; -+ DWtype w; -+ -+ if (u < 0) -+ { -+ c = ~c; -+ u = -u; -+ } -+ if (v < 0) -+ v = -v; -+ __udivmoddi4 (u, v, &w); -+ if (c) -+ w = -w; -+ return w; -+} -+ -+UDWtype -+__udivdi3 (UDWtype u, UDWtype v) -+{ -+ return __udivmoddi4 (u, v, NULL); -+} -+ -+UDWtype -+__umoddi3 (UDWtype u, UDWtype v) -+{ -+ UDWtype w; -+ -+ __udivmoddi4 (u, v, &w); -+ return w; -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/hal.c linux-5.6.11-ndis/3rdparty/ndiswrapper/hal.c ---- linux-5.6.11/3rdparty/ndiswrapper/hal.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/hal.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+#include "hal_exports.h" -+ -+wstdcall void WIN_FUNC(WRITE_PORT_ULONG,2) -+ (ULONG_PTR port, ULONG value) -+{ -+ outl(value, port); -+} -+ -+wstdcall ULONG WIN_FUNC(READ_PORT_ULONG,1) -+ (ULONG_PTR port) -+{ -+ return inl(port); -+} -+ -+wstdcall void WIN_FUNC(WRITE_PORT_USHORT,2) -+ (ULONG_PTR port, USHORT value) -+{ -+ outw(value, port); -+} -+ -+wstdcall USHORT WIN_FUNC(READ_PORT_USHORT,1) -+ (ULONG_PTR port) -+{ -+ return inw(port); -+} -+ -+wstdcall void WIN_FUNC(WRITE_PORT_UCHAR,2) -+ (ULONG_PTR port, UCHAR value) -+{ -+ outb(value, port); -+} -+ -+wstdcall UCHAR WIN_FUNC(READ_PORT_UCHAR,1) -+ (ULONG_PTR port) -+{ -+ return inb(port); -+} -+ -+wstdcall void WIN_FUNC(WRITE_PORT_BUFFER_USHORT,3) -+ (ULONG_PTR port, USHORT *buf, ULONG count) -+{ -+ outsw(port, buf, count); -+} -+ -+wstdcall void WIN_FUNC(READ_PORT_BUFFER_USHORT,3) -+ (ULONG_PTR port, USHORT *buf, ULONG count) -+{ -+ insw(port, buf, count); -+} -+ -+wstdcall void WIN_FUNC(WRITE_PORT_BUFFER_ULONG,3) -+ (ULONG_PTR port, ULONG *buf, ULONG count) -+{ -+ outsl(port, buf, count); -+} -+ -+wstdcall void WIN_FUNC(READ_PORT_BUFFER_ULONG,3) -+ (ULONG_PTR port, ULONG *buf, ULONG count) -+{ -+ insl(port, buf, count); -+} -+ -+wstdcall USHORT WIN_FUNC(READ_REGISTER_USHORT,1) -+ (void __iomem *reg) -+{ -+ return readw(reg); -+} -+ -+wstdcall void WIN_FUNC(WRITE_REGISTER_ULONG,2) -+ (void __iomem *reg, UINT val) -+{ -+ writel(val, reg); -+} -+ -+wstdcall void WIN_FUNC(WRITE_REGISTER_USHORT,2) -+ (void __iomem *reg, USHORT val) -+{ -+ writew(val, reg); -+} -+ -+wstdcall void WIN_FUNC(WRITE_REGISTER_UCHAR,2) -+ (void __iomem *reg, UCHAR val) -+{ -+ writeb(val, reg); -+} -+ -+wstdcall void WIN_FUNC(KeStallExecutionProcessor,1) -+ (ULONG usecs) -+{ -+ udelay(usecs); -+} -+ -+wstdcall KIRQL WIN_FUNC(KeGetCurrentIrql,0) -+ (void) -+{ -+ return current_irql(); -+} -+ -+wfastcall KIRQL WIN_FUNC(KfRaiseIrql,1) -+ (KIRQL newirql) -+{ -+ return raise_irql(newirql); -+} -+ -+wfastcall void WIN_FUNC(KfLowerIrql,1) -+ (KIRQL oldirql) -+{ -+ lower_irql(oldirql); -+} -+ -+wfastcall KIRQL WIN_FUNC(KfAcquireSpinLock,1) -+ (NT_SPIN_LOCK *lock) -+{ -+ return nt_spin_lock_irql(lock, DISPATCH_LEVEL); -+} -+ -+wfastcall void WIN_FUNC(KfReleaseSpinLock,2) -+ (NT_SPIN_LOCK *lock, KIRQL oldirql) -+{ -+ nt_spin_unlock_irql(lock, oldirql); -+} -+ -+wfastcall void WIN_FUNC(KefAcquireSpinLockAtDpcLevel,1) -+ (NT_SPIN_LOCK *lock) -+{ -+#ifdef DEBUG_IRQL -+ if (current_irql() != DISPATCH_LEVEL) -+ ERROR("irql != DISPATCH_LEVEL"); -+#endif -+ nt_spin_lock(lock); -+} -+ -+wfastcall void WIN_FUNC(KefReleaseSpinLockFromDpcLevel,1) -+ (NT_SPIN_LOCK *lock) -+{ -+#ifdef DEBUG_IRQL -+ if (current_irql() != DISPATCH_LEVEL) -+ ERROR("irql != DISPATCH_LEVEL"); -+#endif -+ nt_spin_unlock(lock); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/iw_ndis.c linux-5.6.11-ndis/3rdparty/ndiswrapper/iw_ndis.c ---- linux-5.6.11/3rdparty/ndiswrapper/iw_ndis.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/iw_ndis.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,2002 @@ -+ /* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "iw_ndis.h" -+#include "wrapndis.h" -+ -+#ifdef CONFIG_WIRELESS_EXT -+ -+static int freq_chan[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, -+ 2447, 2452, 2457, 2462, 2467, 2472, 2484 }; -+ -+static const char *network_names[] = {"IEEE 802.11FH", "IEEE 802.11b", -+ "IEEE 802.11a", "IEEE 802.11g", "Auto"}; -+ -+static int set_essid(struct ndis_device *wnd, const char *ssid, int ssid_len) -+{ -+ NDIS_STATUS res; -+ struct ndis_essid req; -+ -+ if (ssid_len > NDIS_ESSID_MAX_SIZE) -+ return -EINVAL; -+ -+ memset(&req, 0, sizeof(req)); -+ req.length = ssid_len; -+ if (ssid_len) -+ memcpy(&req.essid, ssid, ssid_len); -+ -+ res = mp_set(wnd, OID_802_11_SSID, &req, sizeof(req)); -+ if (res) { -+ WARNING("setting essid failed (%08X)", res); -+ EXIT2(return -EINVAL); -+ } -+ memcpy(&wnd->essid, &req, sizeof(req)); -+ EXIT2(return 0); -+} -+ -+static int set_iw_auth_mode(struct ndis_device *wnd, int wpa_version, -+ int auth_80211_alg) -+{ -+ NDIS_STATUS res; -+ ULONG auth_mode; -+ -+ ENTER2("%d, %d", wpa_version, auth_80211_alg); -+ if (wpa_version & IW_AUTH_WPA_VERSION_WPA2) { -+ if (wnd->iw_auth_key_mgmt & IW_AUTH_KEY_MGMT_802_1X) -+ auth_mode = Ndis802_11AuthModeWPA2; -+ else -+ auth_mode = Ndis802_11AuthModeWPA2PSK; -+ } else if (wpa_version & IW_AUTH_WPA_VERSION_WPA) { -+ if (wnd->iw_auth_key_mgmt & IW_AUTH_KEY_MGMT_802_1X) -+ auth_mode = Ndis802_11AuthModeWPA; -+ else if (wnd->iw_auth_key_mgmt & IW_AUTH_KEY_MGMT_PSK) -+ auth_mode = Ndis802_11AuthModeWPAPSK; -+ else -+ auth_mode = Ndis802_11AuthModeWPANone; -+ } else if (auth_80211_alg & IW_AUTH_ALG_SHARED_KEY) { -+ if (auth_80211_alg & IW_AUTH_ALG_OPEN_SYSTEM) -+ auth_mode = Ndis802_11AuthModeAutoSwitch; -+ else -+ auth_mode = Ndis802_11AuthModeShared; -+ } else -+ auth_mode = Ndis802_11AuthModeOpen; -+ -+ res = mp_set_int(wnd, OID_802_11_AUTHENTICATION_MODE, auth_mode); -+ if (res) { -+ WARNING("setting auth mode to %u failed (%08X)", -+ auth_mode, res); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ EXIT2(return -EINVAL); -+ return -EOPNOTSUPP; -+ } -+ wnd->iw_auth_wpa_version = wpa_version; -+ wnd->iw_auth_80211_alg = auth_80211_alg; -+ EXIT2(return 0); -+} -+ -+static int set_auth_mode(struct ndis_device *wnd) -+{ -+ return set_iw_auth_mode(wnd, wnd->iw_auth_wpa_version, -+ wnd->iw_auth_80211_alg); -+} -+ -+static enum ndis_priv_filter ndis_priv_mode(struct ndis_device *wnd) -+{ -+ if (wnd->iw_auth_wpa_version & IW_AUTH_WPA_VERSION_WPA2 || -+ wnd->iw_auth_wpa_version & IW_AUTH_WPA_VERSION_WPA) -+ return Ndis802_11PrivFilter8021xWEP; -+ else -+ return Ndis802_11PrivFilterAcceptAll; -+} -+ -+static int set_priv_filter(struct ndis_device *wnd) -+{ -+ NDIS_STATUS res; -+ ULONG flags; -+ -+ flags = ndis_priv_mode(wnd); -+ ENTER2("filter: %d", flags); -+ res = mp_set_int(wnd, OID_802_11_PRIVACY_FILTER, flags); -+ if (res) -+ TRACE2("setting privacy filter to %d failed (%08X)", -+ flags, res); -+ EXIT2(return 0); -+} -+ -+static int set_encr_mode(struct ndis_device *wnd) -+{ -+ return set_iw_encr_mode(wnd, wnd->iw_auth_cipher_pairwise, -+ wnd->iw_auth_cipher_group); -+} -+ -+static int set_assoc_params(struct ndis_device *wnd) -+{ -+ TRACE2("wpa_version=0x%x auth_alg=0x%x key_mgmt=0x%x " -+ "cipher_pairwise=0x%x cipher_group=0x%x", -+ wnd->iw_auth_wpa_version, wnd->iw_auth_80211_alg, -+ wnd->iw_auth_key_mgmt, wnd->iw_auth_cipher_pairwise, -+ wnd->iw_auth_cipher_group); -+ set_auth_mode(wnd); -+ set_priv_filter(wnd); -+ set_encr_mode(wnd); -+ return 0; -+} -+ -+static int iw_set_essid(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ int length; -+ -+ ENTER2(""); -+ /* there is no way to turn off essid other than to set to -+ * random bytes; instead, we use off to mean any */ -+ if (wrqu->essid.flags) { -+ length = wrqu->essid.length; -+ /* Strip '\0' appended by wireless extensions 19 and older */ -+ if (length > 0 && extra[length - 1] == '\0') -+ length--; -+ TRACE2("%d", length); -+ if (length <= 0 || length > NDIS_ESSID_MAX_SIZE) -+ EXIT2(return -EINVAL); -+ } else -+ length = 0; -+ -+ set_assoc_params(wnd); -+ -+ if (set_essid(wnd, extra, length)) -+ EXIT2(return -EINVAL); -+ -+ EXIT2(return 0); -+} -+ -+static int iw_get_essid(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ struct ndis_essid req; -+ -+ ENTER2(""); -+ memset(&req, 0, sizeof(req)); -+ res = mp_query(wnd, OID_802_11_SSID, &req, sizeof(req)); -+ if (res) { -+ WARNING("getting essid failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ memcpy(extra, req.essid, req.length); -+ if (req.length > 0) -+ wrqu->essid.flags = 1; -+ else -+ wrqu->essid.flags = 0; -+ wrqu->essid.length = req.length; -+ EXIT2(return 0); -+} -+ -+/* index must be 0 - N, as per NDIS */ -+static int add_wep_key(struct ndis_device *wnd, char *key, int key_len, -+ int index) -+{ -+ struct ndis_encr_key ndis_key; -+ NDIS_STATUS res; -+ -+ ENTER2("key index: %d, length: %d", index, key_len); -+ if (key_len <= 0 || key_len > NDIS_ENCODING_TOKEN_MAX) { -+ WARNING("invalid key length (%d)", key_len); -+ EXIT2(return -EINVAL); -+ } -+ if (index < 0 || index >= MAX_ENCR_KEYS) { -+ WARNING("invalid key index (%d)", index); -+ EXIT2(return -EINVAL); -+ } -+ ndis_key.struct_size = sizeof(ndis_key); -+ ndis_key.length = key_len; -+ memcpy(&ndis_key.key, key, key_len); -+ ndis_key.index = index; -+ -+ if (index == wnd->encr_info.tx_key_index) { -+ ndis_key.index |= (1 << 31); -+ res = set_iw_encr_mode(wnd, IW_AUTH_CIPHER_WEP104, -+ IW_AUTH_CIPHER_NONE); -+ if (res) -+ WARNING("encryption couldn't be enabled (%08X)", res); -+ } -+ TRACE2("key %d: " MACSTRSEP, index, MAC2STR(key)); -+ res = mp_set(wnd, OID_802_11_ADD_WEP, &ndis_key, sizeof(ndis_key)); -+ if (res) { -+ WARNING("adding encryption key %d failed (%08X)", -+ index+1, res); -+ EXIT2(return -EINVAL); -+ } -+ -+ /* Atheros driver messes up ndis_key during ADD_WEP, so -+ * don't rely on that; instead use info in key and key_len */ -+ wnd->encr_info.keys[index].length = key_len; -+ memcpy(&wnd->encr_info.keys[index].key, key, key_len); -+ -+ EXIT2(return 0); -+} -+ -+static int set_infra_mode(struct ndis_device *wnd, -+ enum ndis_infrastructure_mode mode) -+{ -+ NDIS_STATUS res; -+ unsigned int i; -+ -+ ENTER2("%d", mode); -+ res = mp_query_int(wnd, OID_802_11_INFRASTRUCTURE_MODE, -+ &wnd->infrastructure_mode); -+ if (res != NDIS_STATUS_SUCCESS) { -+ WARNING("getting operating mode failed (%08X)", res); -+ EXIT2(return -EINVAL); -+ } -+ if (wnd->infrastructure_mode == mode) -+ EXIT2(return 0); -+ res = mp_set_int(wnd, OID_802_11_INFRASTRUCTURE_MODE, mode); -+ if (res) { -+ WARNING("setting operating mode to %d failed (%08X)", -+ mode, res); -+ EXIT2(return -EINVAL); -+ } -+ /* NDIS drivers clear keys when infrastructure mode is -+ * changed. But Linux tools assume otherwise. So set the -+ * keys */ -+ if (wnd->iw_auth_key_mgmt == 0 || -+ wnd->iw_auth_key_mgmt == IW_AUTH_KEY_MGMT_802_1X) { -+ for (i = 0; i < MAX_ENCR_KEYS; i++) { -+ if (wnd->encr_info.keys[i].length > 0) -+ add_wep_key(wnd, wnd->encr_info.keys[i].key, -+ wnd->encr_info.keys[i].length, i); -+ } -+ } -+ wnd->infrastructure_mode = mode; -+ EXIT2(return 0); -+} -+ -+static int iw_set_infra_mode(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ enum ndis_infrastructure_mode ndis_mode; -+ -+ ENTER2("%d", wrqu->mode); -+ switch (wrqu->mode) { -+ case IW_MODE_ADHOC: -+ ndis_mode = Ndis802_11IBSS; -+ break; -+ case IW_MODE_INFRA: -+ ndis_mode = Ndis802_11Infrastructure; -+ break; -+ case IW_MODE_AUTO: -+ ndis_mode = Ndis802_11AutoUnknown; -+ break; -+ default: -+ EXIT2(return -EINVAL); -+ } -+ -+ if (set_infra_mode(wnd, ndis_mode)) -+ EXIT2(return -EINVAL); -+ -+ EXIT2(return 0); -+} -+ -+static int iw_get_infra_mode(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ int ndis_mode, iw_mode; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query_int(wnd, OID_802_11_INFRASTRUCTURE_MODE, &ndis_mode); -+ if (res) { -+ WARNING("getting operating mode failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ -+ switch (ndis_mode) { -+ case Ndis802_11IBSS: -+ iw_mode = IW_MODE_ADHOC; -+ break; -+ case Ndis802_11Infrastructure: -+ iw_mode = IW_MODE_INFRA; -+ break; -+ case Ndis802_11AutoUnknown: -+ iw_mode = IW_MODE_AUTO; -+ break; -+ default: -+ ERROR("invalid operating mode (%u)", ndis_mode); -+ EXIT2(return -EINVAL); -+ } -+ wrqu->mode = iw_mode; -+ EXIT2(return 0); -+} -+ -+static const char *network_type_to_name(int net_type) -+{ -+ if (net_type >= 0 && net_type < ARRAY_SIZE(network_names)) -+ return network_names[net_type]; -+ else -+ return network_names[ARRAY_SIZE(network_names) - 1]; -+} -+ -+static int iw_get_network_type(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ unsigned int network_type; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query_int(wnd, OID_802_11_NETWORK_TYPE_IN_USE, -+ &network_type); -+ if (res) { -+ WARNING("getting network type failed: %08X", res); -+ network_type = -1; -+ } -+ strncpy(wrqu->name, network_type_to_name(network_type), -+ sizeof(wrqu->name) - 1); -+ wrqu->name[sizeof(wrqu->name)-1] = 0; -+ return 0; -+} -+ -+static int iw_get_freq(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ struct ndis_configuration req; -+ -+ ENTER2(""); -+ memset(&req, 0, sizeof(req)); -+ res = mp_query(wnd, OID_802_11_CONFIGURATION, &req, sizeof(req)); -+ if (res) { -+ WARNING("getting configuration failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ -+ memset(&(wrqu->freq), 0, sizeof(struct iw_freq)); -+ -+ /* see comment in wireless.h above the "struct iw_freq" -+ definition for an explanation of this if -+ NOTE: 1000000 is due to the kHz -+ */ -+ if (req.ds_config > 1000000) { -+ wrqu->freq.m = req.ds_config / 10; -+ wrqu->freq.e = 1; -+ } -+ else -+ wrqu->freq.m = req.ds_config; -+ -+ /* convert from kHz to Hz */ -+ wrqu->freq.e += 3; -+ -+ return 0; -+} -+ -+static int iw_set_freq(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ struct ndis_configuration req; -+ -+ ENTER2(""); -+ /* this OID is valid only when not associated */ -+ if (netif_carrier_ok(wnd->net_dev)) -+ EXIT2(return 0); -+ memset(&req, 0, sizeof(req)); -+ res = mp_query(wnd, OID_802_11_CONFIGURATION, &req, sizeof(req)); -+ if (res) { -+ WARNING("getting configuration failed (%08X)", res); -+ EXIT2(return 0); -+ } -+ -+ if (wrqu->freq.m < 1000 && wrqu->freq.e == 0) { -+ if (wrqu->freq.m >= 1 && wrqu->freq.m <= ARRAY_SIZE(freq_chan)) -+ req.ds_config = freq_chan[wrqu->freq.m - 1] * 1000; -+ else -+ return -EINVAL; -+ } else { -+ int i; -+ req.ds_config = wrqu->freq.m; -+ for (i = wrqu->freq.e; i > 0; i--) -+ req.ds_config *= 10; -+ req.ds_config /= 1000; -+ } -+ res = mp_set(wnd, OID_802_11_CONFIGURATION, &req, sizeof(req)); -+ if (res) -+ WARNING("setting configuration failed (%08X)", res); -+ return 0; -+} -+ -+static int iw_get_tx_power(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_tx_power_level ndis_power; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_802_11_TX_POWER_LEVEL, -+ &ndis_power, sizeof(ndis_power)); -+ if (res) -+ return -EOPNOTSUPP; -+ wrqu->txpower.flags = IW_TXPOW_MWATT; -+ wrqu->txpower.disabled = 0; -+ wrqu->txpower.fixed = 0; -+ wrqu->txpower.value = ndis_power; -+ return 0; -+} -+ -+static int iw_set_tx_power(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_tx_power_level ndis_power; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ if (wrqu->txpower.disabled) -+ ndis_power = 0; -+ else { -+ if (wrqu->txpower.flags == IW_TXPOW_MWATT) -+ ndis_power = wrqu->txpower.value; -+ else { // wrqu->txpower.flags == IW_TXPOW_DBM -+ if (wrqu->txpower.value > 20) -+ ndis_power = 128; -+ else if (wrqu->txpower.value < -43) -+ ndis_power = 127; -+ else { -+ signed char tmp; -+ tmp = wrqu->txpower.value; -+ tmp = -12 - tmp; -+ tmp <<= 2; -+ ndis_power = (unsigned char)tmp; -+ } -+ } -+ } -+ TRACE2("%d", ndis_power); -+ res = mp_set(wnd, OID_802_11_TX_POWER_LEVEL, -+ &ndis_power, sizeof(ndis_power)); -+ if (res) -+ EXIT2(return -EOPNOTSUPP); -+ if (ndis_power == 0) -+ res = disassociate(wnd, 0); -+ EXIT2(return 0); -+} -+ -+static int iw_get_bitrate(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ULONG ndis_rate; -+ int res; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_GEN_LINK_SPEED, &ndis_rate, sizeof(ndis_rate)); -+ if (res) { -+ WARNING("getting bitrate failed (%08X)", res); -+ ndis_rate = 0; -+ } -+ -+ wrqu->bitrate.value = ndis_rate * 100; -+ return 0; -+} -+ -+static int iw_set_bitrate(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ int i, n; -+ NDIS_STATUS res; -+ UCHAR rates[NDIS_MAX_RATES_EX]; -+ -+ ENTER2(""); -+ if (wrqu->bitrate.fixed == 0) -+ EXIT2(return 0); -+ -+ res = mp_query_info(wnd, OID_802_11_SUPPORTED_RATES, &rates, -+ sizeof(rates), &n, NULL); -+ if (res) { -+ WARNING("getting bit rate failed (%08X)", res); -+ EXIT2(return 0); -+ } -+ for (i = 0; i < n; i++) { -+ if (rates[i] & 0x80) -+ continue; -+ if ((rates[i] & 0x7f) * 500000 > wrqu->bitrate.value) { -+ TRACE2("setting rate %d to 0", -+ (rates[i] & 0x7f) * 500000); -+ rates[i] = 0; -+ } -+ } -+ -+ res = mp_set(wnd, OID_802_11_DESIRED_RATES, &rates, n); -+ if (res) { -+ WARNING("setting bit rate failed (%08X)", res); -+ EXIT2(return 0); -+ } -+ -+ return 0; -+} -+ -+static int iw_set_dummy(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ /* Do nothing. Used for ioctls that are not implemented. */ -+ return 0; -+} -+ -+static int iw_get_rts_threshold(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_rts_threshold threshold; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_802_11_RTS_THRESHOLD, -+ &threshold, sizeof(threshold)); -+ if (res) -+ return -EOPNOTSUPP; -+ -+ wrqu->rts.value = threshold; -+ return 0; -+} -+ -+static int iw_set_rts_threshold(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_rts_threshold threshold; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ threshold = wrqu->rts.value; -+ res = mp_set(wnd, OID_802_11_RTS_THRESHOLD, -+ &threshold, sizeof(threshold)); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ return -EINVAL; -+ if (res) -+ return -EOPNOTSUPP; -+ -+ return 0; -+} -+ -+static int iw_get_frag_threshold(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_fragmentation_threshold frag_threshold; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_802_11_FRAGMENTATION_THRESHOLD, -+ &frag_threshold, sizeof(frag_threshold)); -+ if (res) -+ return -ENOTSUPP; -+ -+ wrqu->frag.value = frag_threshold; -+ return 0; -+} -+ -+static int iw_set_frag_threshold(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ ndis_rts_threshold threshold; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ threshold = wrqu->frag.value; -+ res = mp_set(wnd, OID_802_11_FRAGMENTATION_THRESHOLD, -+ &threshold, sizeof(threshold)); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ return -EINVAL; -+ if (res) -+ return -EOPNOTSUPP; -+ return 0; -+} -+ -+int get_ap_address(struct ndis_device *wnd, mac_address ap_addr) -+{ -+ NDIS_STATUS res; -+ -+ res = mp_query(wnd, OID_802_11_BSSID, ap_addr, ETH_ALEN); -+ TRACE2(MACSTRSEP, MAC2STR(ap_addr)); -+ if (res) { -+ TRACE2("res: %08X", res); -+ memset(ap_addr, 0x0, ETH_ALEN); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ EXIT2(return 0); -+} -+ -+static int iw_get_ap_address(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ mac_address ap_addr; -+ -+ ENTER2(""); -+ get_ap_address(wnd, ap_addr); -+ memcpy(wrqu->ap_addr.sa_data, ap_addr, ETH_ALEN); -+ wrqu->ap_addr.sa_family = ARPHRD_ETHER; -+ EXIT2(return 0); -+} -+ -+static int iw_set_ap_address(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ mac_address ap_addr; -+ -+ ENTER2(""); -+ memcpy(ap_addr, wrqu->ap_addr.sa_data, ETH_ALEN); -+ TRACE2(MACSTRSEP, MAC2STR(ap_addr)); -+ res = mp_set(wnd, OID_802_11_BSSID, ap_addr, ETH_ALEN); -+ /* user apps may set ap's mac address, which is not required; -+ * they may fail to work if this function fails, so return -+ * success */ -+ if (res) -+ WARNING("setting AP mac address failed (%08X)", res); -+ -+ EXIT2(return 0); -+} -+ -+int set_ndis_auth_mode(struct ndis_device *wnd, ULONG auth_mode) -+{ -+ NDIS_STATUS res; -+ -+ ENTER2("%d", auth_mode); -+ res = mp_set_int(wnd, OID_802_11_AUTHENTICATION_MODE, auth_mode); -+ if (res) { -+ WARNING("setting auth mode to %u failed (%08X)", -+ auth_mode, res); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ EXIT2(return -EINVAL); -+ return -EOPNOTSUPP; -+ } -+ switch (auth_mode) { -+ case Ndis802_11AuthModeWPA: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_WPA; -+ wnd->iw_auth_key_mgmt = IW_AUTH_KEY_MGMT_802_1X; -+ break; -+ case Ndis802_11AuthModeWPAPSK: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_WPA; -+ wnd->iw_auth_key_mgmt = IW_AUTH_KEY_MGMT_PSK; -+ break; -+ case Ndis802_11AuthModeWPANone: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_DISABLED; -+ wnd->iw_auth_key_mgmt = IW_AUTH_KEY_MGMT_PSK; -+ break; -+ case Ndis802_11AuthModeWPA2: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_WPA2; -+ wnd->iw_auth_key_mgmt = IW_AUTH_KEY_MGMT_802_1X; -+ break; -+ case Ndis802_11AuthModeWPA2PSK: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_WPA2; -+ wnd->iw_auth_key_mgmt = IW_AUTH_KEY_MGMT_PSK; -+ break; -+ case Ndis802_11AuthModeOpen: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_DISABLED; -+ wnd->iw_auth_80211_alg = IW_AUTH_ALG_OPEN_SYSTEM; -+ break; -+ case Ndis802_11AuthModeShared: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_DISABLED; -+ wnd->iw_auth_80211_alg = IW_AUTH_ALG_SHARED_KEY; -+ break; -+ case Ndis802_11AuthModeAutoSwitch: -+ wnd->iw_auth_wpa_version = IW_AUTH_WPA_VERSION_DISABLED; -+ wnd->iw_auth_80211_alg = IW_AUTH_ALG_SHARED_KEY; -+ wnd->iw_auth_80211_alg |= IW_AUTH_ALG_OPEN_SYSTEM; -+ break; -+ default: -+ WARNING("invalid authentication algorithm: %d", auth_mode); -+ break; -+ } -+ EXIT2(return 0); -+} -+ -+int get_ndis_auth_mode(struct ndis_device *wnd) -+{ -+ ULONG mode; -+ NDIS_STATUS res; -+ -+ res = mp_query_int(wnd, OID_802_11_AUTHENTICATION_MODE, &mode); -+ if (res) { -+ WARNING("getting authentication mode failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ TRACE2("%d", mode); -+ return mode; -+} -+ -+int set_iw_encr_mode(struct ndis_device *wnd, int cipher_pairwise, -+ int cipher_groupwise) -+{ -+ NDIS_STATUS res; -+ ULONG ndis_mode; -+ -+ ENTER2("%d, %d", cipher_pairwise, cipher_groupwise); -+ if (cipher_pairwise & IW_AUTH_CIPHER_CCMP) -+ ndis_mode = Ndis802_11Encryption3Enabled; -+ else if (cipher_pairwise & IW_AUTH_CIPHER_TKIP) -+ ndis_mode = Ndis802_11Encryption2Enabled; -+ else if (cipher_pairwise & -+ (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104)) -+ ndis_mode = Ndis802_11Encryption1Enabled; -+ else if (cipher_groupwise & IW_AUTH_CIPHER_CCMP) -+ ndis_mode = Ndis802_11Encryption3Enabled; -+ else if (cipher_groupwise & IW_AUTH_CIPHER_TKIP) -+ ndis_mode = Ndis802_11Encryption2Enabled; -+ else -+ ndis_mode = Ndis802_11EncryptionDisabled; -+ -+ res = mp_set_int(wnd, OID_802_11_ENCRYPTION_STATUS, ndis_mode); -+ if (res) { -+ WARNING("setting encryption mode to %u failed (%08X)", -+ ndis_mode, res); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ EXIT2(return -EINVAL); -+ return -EOPNOTSUPP; -+ } -+ wnd->iw_auth_cipher_pairwise = cipher_pairwise; -+ wnd->iw_auth_cipher_group = cipher_groupwise; -+ EXIT2(return 0); -+} -+ -+int get_ndis_encr_mode(struct ndis_device *wnd) -+{ -+ ULONG mode; -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_query_int(wnd, OID_802_11_ENCRYPTION_STATUS, &mode); -+ if (res) { -+ WARNING("getting encryption status failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } else -+ EXIT2(return mode); -+} -+ -+static int iw_get_encr(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ int index, mode; -+ struct encr_info *encr_info = &wnd->encr_info; -+ -+ ENTER2("wnd = %p", wnd); -+ wrqu->data.length = 0; -+ extra[0] = 0; -+ -+ index = (wrqu->encoding.flags & IW_ENCODE_INDEX); -+ TRACE2("index = %u", index); -+ if (index > 0) -+ index--; -+ else -+ index = encr_info->tx_key_index; -+ -+ if (index < 0 || index >= MAX_ENCR_KEYS) { -+ WARNING("encryption index out of range (%u)", index); -+ EXIT2(return -EINVAL); -+ } -+ -+ if (index != encr_info->tx_key_index) { -+ if (encr_info->keys[index].length > 0) { -+ wrqu->data.flags |= IW_ENCODE_ENABLED; -+ wrqu->data.length = encr_info->keys[index].length; -+ memcpy(extra, encr_info->keys[index].key, -+ encr_info->keys[index].length); -+ } -+ else -+ wrqu->data.flags |= IW_ENCODE_DISABLED; -+ -+ EXIT2(return 0); -+ } -+ -+ /* transmit key */ -+ mode = get_ndis_encr_mode(wnd); -+ if (mode < 0) -+ EXIT2(return -EOPNOTSUPP); -+ -+ if (mode == Ndis802_11EncryptionDisabled || -+ mode == Ndis802_11EncryptionNotSupported) -+ wrqu->data.flags |= IW_ENCODE_DISABLED; -+ else { -+ if (mode == Ndis802_11Encryption1KeyAbsent || -+ mode == Ndis802_11Encryption2KeyAbsent || -+ mode == Ndis802_11Encryption3KeyAbsent) -+ wrqu->data.flags |= IW_ENCODE_NOKEY; -+ else { -+ wrqu->data.flags |= IW_ENCODE_ENABLED; -+ wrqu->encoding.flags |= index+1; -+ wrqu->data.length = encr_info->keys[index].length; -+ memcpy(extra, encr_info->keys[index].key, -+ encr_info->keys[index].length); -+ } -+ } -+ mode = get_ndis_auth_mode(wnd); -+ if (mode < 0) -+ EXIT2(return -EOPNOTSUPP); -+ -+ if (mode == Ndis802_11AuthModeOpen) -+ wrqu->data.flags |= IW_ENCODE_OPEN; -+ else if (mode == Ndis802_11AuthModeAutoSwitch) -+ wrqu->data.flags |= IW_ENCODE_RESTRICTED; -+ else // Ndis802_11AuthModeAutoSwitch, Ndis802_11AuthModeWPA etc. -+ wrqu->data.flags |= IW_ENCODE_RESTRICTED; -+ -+ EXIT2(return 0); -+} -+ -+/* remove_key is for both wep and wpa */ -+static int remove_key(struct ndis_device *wnd, int index, -+ mac_address bssid) -+{ -+ NDIS_STATUS res; -+ if (wnd->encr_info.keys[index].length == 0) -+ EXIT2(return 0); -+ wnd->encr_info.keys[index].length = 0; -+ memset(&wnd->encr_info.keys[index].key, 0, -+ sizeof(wnd->encr_info.keys[index].length)); -+ if (wnd->iw_auth_cipher_pairwise == IW_AUTH_CIPHER_TKIP || -+ wnd->iw_auth_cipher_pairwise == IW_AUTH_CIPHER_CCMP || -+ wnd->iw_auth_cipher_group == IW_AUTH_CIPHER_TKIP || -+ wnd->iw_auth_cipher_group == IW_AUTH_CIPHER_CCMP) { -+ struct ndis_remove_key rmkey; -+ rmkey.struct_size = sizeof(rmkey); -+ rmkey.index = index; -+ if (bssid) { -+ /* pairwise key */ -+ if (memcmp(bssid, "\xff\xff\xff\xff\xff\xff", -+ ETH_ALEN) != 0) -+ rmkey.index |= (1 << 30); -+ memcpy(rmkey.bssid, bssid, sizeof(rmkey.bssid)); -+ } else -+ memset(rmkey.bssid, 0xff, sizeof(rmkey.bssid)); -+ if (mp_set(wnd, OID_802_11_REMOVE_KEY, &rmkey, sizeof(rmkey))) -+ EXIT2(return -EINVAL); -+ } else { -+ ndis_key_index keyindex = index; -+ res = mp_set_int(wnd, OID_802_11_REMOVE_WEP, keyindex); -+ if (res) { -+ WARNING("removing encryption key %d failed (%08X)", -+ keyindex, res); -+ EXIT2(return -EINVAL); -+ } -+ } -+ /* if it is transmit key, disable encryption */ -+ if (index == wnd->encr_info.tx_key_index) { -+ res = set_iw_encr_mode(wnd, IW_AUTH_CIPHER_NONE, -+ IW_AUTH_CIPHER_NONE); -+ if (res) -+ WARNING("changing encr status failed (%08X)", res); -+ } -+ TRACE2("key %d removed", index); -+ EXIT2(return 0); -+} -+ -+static int iw_set_wep(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ unsigned int index, key_len; -+ struct encr_info *encr_info = &wnd->encr_info; -+ unsigned char *key; -+ -+ ENTER2(""); -+ index = (wrqu->encoding.flags & IW_ENCODE_INDEX); -+ TRACE2("index = %u", index); -+ -+ /* iwconfig gives index as 1 - N */ -+ if (index > 0) -+ index--; -+ else -+ index = encr_info->tx_key_index; -+ -+ if (index >= MAX_ENCR_KEYS) { -+ WARNING("encryption index out of range (%u)", index); -+ EXIT2(return -EINVAL); -+ } -+ -+ /* remove key if disabled */ -+ if (wrqu->data.flags & IW_ENCODE_DISABLED) { -+ if (remove_key(wnd, index, NULL)) -+ EXIT2(return -EINVAL); -+ else -+ EXIT2(return 0); -+ } -+ -+ /* global encryption state (for all keys) */ -+ if (wrqu->data.flags & IW_ENCODE_OPEN) -+ res = set_ndis_auth_mode(wnd, Ndis802_11AuthModeOpen); -+ else // if (wrqu->data.flags & IW_ENCODE_RESTRICTED) -+ res = set_ndis_auth_mode(wnd, Ndis802_11AuthModeShared); -+ if (res) { -+ WARNING("setting authentication mode failed (%08X)", res); -+ EXIT2(return -EINVAL); -+ } -+ -+ TRACE2("key length: %d", wrqu->data.length); -+ -+ if (wrqu->data.length > 0) { -+ key_len = wrqu->data.length; -+ key = extra; -+ } else { // must be set as tx key -+ if (encr_info->keys[index].length == 0) { -+ WARNING("key %d is not set", index+1); -+ EXIT2(return -EINVAL); -+ } -+ key_len = encr_info->keys[index].length; -+ key = encr_info->keys[index].key; -+ encr_info->tx_key_index = index; -+ } -+ -+ if (add_wep_key(wnd, key, key_len, index)) -+ EXIT2(return -EINVAL); -+ -+ if (index == encr_info->tx_key_index) { -+ /* if transmit key is at index other than 0, some -+ * drivers, at least Atheros and TI, want another -+ * (global) non-transmit key to be set; don't know why */ -+ if (index != 0) { -+ int i; -+ for (i = 0; i < MAX_ENCR_KEYS; i++) -+ if (i != index && -+ encr_info->keys[i].length != 0) -+ break; -+ if (i == MAX_ENCR_KEYS) { -+ if (index == 0) -+ i = index + 1; -+ else -+ i = index - 1; -+ if (add_wep_key(wnd, key, key_len, i)) -+ WARNING("couldn't add broadcast key" -+ " at %d", i); -+ } -+ } -+ /* ndis drivers want essid to be set after setting encr */ -+ set_essid(wnd, wnd->essid.essid, wnd->essid.length); -+ } -+ EXIT2(return 0); -+} -+ -+static int iw_set_nick(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ if (wrqu->data.length >= sizeof(wnd->nick)) -+ return -EINVAL; -+ memcpy(wnd->nick, extra, wrqu->data.length); -+ wnd->nick[wrqu->data.length] = 0; -+ return 0; -+} -+ -+static int iw_get_nick(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ wrqu->data.length = strlen(wnd->nick); -+ memcpy(extra, wnd->nick, wrqu->data.length); -+ return 0; -+} -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27) && !defined(IW_REQUEST_FLAG_COMPAT) -+#define iwe_stream_add_event(a, b, c, d, e) iwe_stream_add_event(b, c, d, e) -+#define iwe_stream_add_point(a, b, c, d, e) iwe_stream_add_point(b, c, d, e) -+#define iwe_stream_add_value(a, b, c, d, e, f) \ -+ iwe_stream_add_value(b, c, d, e, f) -+#define iwe_stream_lcp_len(a) IW_EV_LCP_LEN -+#endif -+ -+static char *ndis_translate_scan(struct net_device *dev, -+ struct iw_request_info *info, char *event, -+ char *end_buf, void *item) -+{ -+ struct iw_event iwe; -+ char *current_val; -+ char *ret; -+ int i, nrates; -+ unsigned char custom_str[64]; -+ struct ndis_wlan_bssid *bssid; -+ struct ndis_wlan_bssid_ex *bssid_ex; -+ int extended; -+ -+ ENTER2("%p, %p", event, item); -+ bssid = item; -+ bssid_ex = item; -+ extended = (bssid->length > offsetof(struct ndis_wlan_bssid_ex, var)); -+ -+ /* add mac address */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWAP; -+ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; -+ iwe.len = IW_EV_ADDR_LEN; -+ memcpy(iwe.u.ap_addr.sa_data, bssid->mac, ETH_ALEN); -+ ret = iwe_stream_add_event(info, event, end_buf, &iwe, IW_EV_ADDR_LEN); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add essid */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWESSID; -+ iwe.u.data.length = bssid->ssid.length; -+ if (iwe.u.data.length > IW_ESSID_MAX_SIZE) -+ iwe.u.data.length = IW_ESSID_MAX_SIZE; -+ iwe.u.data.flags = 1; -+ iwe.len = IW_EV_POINT_LEN + iwe.u.data.length; -+ ret = iwe_stream_add_point(info, event, end_buf, &iwe, -+ bssid->ssid.essid); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add protocol name */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWNAME; -+ strncpy(iwe.u.name, network_type_to_name(bssid->net_type), IFNAMSIZ - 1); -+ ret = iwe_stream_add_event(info, event, end_buf, &iwe, IW_EV_CHAR_LEN); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add mode */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWMODE; -+ if (bssid->mode == Ndis802_11IBSS) -+ iwe.u.mode = IW_MODE_ADHOC; -+ else if (bssid->mode == Ndis802_11Infrastructure) -+ iwe.u.mode = IW_MODE_MASTER; -+ else // if (bssid->mode == Ndis802_11AutoUnknown) -+ iwe.u.mode = IW_MODE_AUTO; -+ ret = iwe_stream_add_event(info, event, end_buf, &iwe, IW_EV_UINT_LEN); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add freq */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWFREQ; -+ iwe.u.freq.m = bssid->config.ds_config; -+ if (bssid->config.ds_config > 1000000) { -+ iwe.u.freq.m = bssid->config.ds_config / 10; -+ iwe.u.freq.e = 1; -+ } -+ else -+ iwe.u.freq.m = bssid->config.ds_config; -+ /* convert from kHz to Hz */ -+ iwe.u.freq.e += 3; -+ iwe.len = IW_EV_FREQ_LEN; -+ ret = iwe_stream_add_event(info, event, end_buf, &iwe, IW_EV_FREQ_LEN); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add qual */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = IWEVQUAL; -+ i = 100 * (bssid->rssi - WL_NOISE) / (WL_SIGMAX - WL_NOISE); -+ if (i < 0) -+ i = 0; -+ else if (i > 100) -+ i = 100; -+ iwe.u.qual.level = bssid->rssi; -+ iwe.u.qual.noise = WL_NOISE; -+ iwe.u.qual.qual = i; -+ iwe.len = IW_EV_QUAL_LEN; -+ ret = iwe_stream_add_event(info, event, end_buf, &iwe, IW_EV_QUAL_LEN); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add key info */ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = SIOCGIWENCODE; -+ if (bssid->privacy == Ndis802_11PrivFilterAcceptAll) -+ iwe.u.data.flags = IW_ENCODE_DISABLED; -+ else -+ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; -+ iwe.u.data.length = 0; -+ iwe.len = IW_EV_POINT_LEN; -+ ret = iwe_stream_add_point(info, event, end_buf, &iwe, -+ bssid->ssid.essid); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ /* add rate */ -+ memset(&iwe, 0, sizeof(iwe)); -+ current_val = event + iwe_stream_lcp_len(info); -+ iwe.cmd = SIOCGIWRATE; -+ if (extended) -+ nrates = ARRAY_SIZE(bssid->rates); -+ else -+ nrates = ARRAY_SIZE(bssid_ex->rates_ex); -+ for (i = 0; i < nrates; i++) { -+ if (bssid_ex->rates_ex[i] & 0x7f) { -+ iwe.u.bitrate.value = ((bssid->rates[i] & 0x7f) * -+ 500000); -+ ret = iwe_stream_add_value(info, event, current_val, -+ end_buf, &iwe, -+ IW_EV_PARAM_LEN); -+ if (ret == current_val) -+ return NULL; -+ current_val = ret; -+ } -+ } -+ -+ if ((current_val - event) > iwe_stream_lcp_len(info)) -+ event = current_val; -+ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = IWEVCUSTOM; -+ sprintf(custom_str, "bcn_int=%d", bssid->config.beacon_period); -+ iwe.u.data.length = strlen(custom_str); -+ ret = iwe_stream_add_point(info, event, end_buf, &iwe, custom_str); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = IWEVCUSTOM; -+ sprintf(custom_str, "atim=%u", bssid->config.atim_window); -+ iwe.u.data.length = strlen(custom_str); -+ ret = iwe_stream_add_point(info, event, end_buf, &iwe, custom_str); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ -+ TRACE2("%d, %zu", bssid->length, sizeof(*bssid)); -+ if (extended) { -+ struct ndis_variable_ies *iep = bssid_ex->var; -+ unsigned char *end = (unsigned char *)&bssid_ex->fixed + -+ bssid_ex->ie_length; -+ -+ while (&iep->length < end && &iep->data[iep->length] <= end) { -+ unsigned char ielen = iep->length + 2; -+ -+ memset(&iwe, 0, sizeof(iwe)); -+ iwe.cmd = IWEVGENIE; -+ iwe.u.data.length = ielen; -+ ret = iwe_stream_add_point(info, event, end_buf, &iwe, -+ (char *)iep); -+ if (ret == event) -+ return NULL; -+ event = ret; -+ iep = (typeof(iep))&iep->data[iep->length]; -+ } -+ } -+ TRACE2("event = %p, current_val = %p", event, current_val); -+ EXIT2(return event); -+} -+ -+static int set_scan(struct ndis_device *wnd) -+{ -+ NDIS_STATUS res; -+ -+ ENTER2(""); -+ res = mp_set(wnd, OID_802_11_BSSID_LIST_SCAN, NULL, 0); -+ if (res) { -+ WARNING("scanning failed (%08X)", res); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ wnd->scan_timestamp = jiffies; -+ EXIT2(return 0); -+} -+ -+static int iw_set_scan(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ return set_scan(wnd); -+} -+ -+static int iw_get_scan(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ unsigned int i, buf_len, needed, data_len; -+ NDIS_STATUS res; -+ struct ndis_bssid_list *bssid_list = NULL; -+ char *event = extra; -+ struct ndis_wlan_bssid *cur_item; -+ -+ ENTER2(""); -+ if (time_before(jiffies, wnd->scan_timestamp + 3 * HZ)) -+ return -EAGAIN; -+ /* try with space for a few scan items */ -+ buf_len = sizeof(ULONG) + offsetof(struct ndis_wlan_bssid_ex, var) * 8; -+ -+ /* Try many times, as the needed space may grow between queries */ -+ for (i = 0; i < 10; i++) { -+ bssid_list = kzalloc(buf_len, GFP_KERNEL); -+ if (!bssid_list) { -+ ERROR("couldn't allocate %u bytes for scan results", -+ buf_len); -+ return -ENOMEM; -+ } -+ -+ needed = 0; -+ data_len = 0; -+ res = mp_query_info(wnd, OID_802_11_BSSID_LIST, bssid_list, -+ buf_len, &data_len, &needed); -+ TRACE2("try %d: given %d bytes, needed %d, written %d", -+ i, buf_len, needed, data_len); -+ if (needed <= buf_len) -+ break; -+ kfree(bssid_list); -+ buf_len = needed; -+ } -+ if (res) { -+ WARNING("getting BSSID list failed (%08X)", res); -+ kfree(bssid_list); -+ EXIT2(return -EOPNOTSUPP); -+ } -+ -+ /* some drivers don't set bssid_list->num_items to 0 if -+ OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */ -+ TRACE2("items: %d", bssid_list->num_items); -+ cur_item = &bssid_list->bssid[0]; -+ for (i = 0; i < bssid_list->num_items; i++) { -+ TRACE2("item %d: len %d, remaining data %d", -+ i, cur_item->length, data_len); -+ /* drop truncated items */ -+ if (cur_item->length > data_len) -+ break; -+ event = ndis_translate_scan(dev, info, event, -+ extra + wrqu->data.length, -+ cur_item); -+ if (!event) { -+ kfree(bssid_list); -+ return -E2BIG; -+ } -+ data_len -= cur_item->length; -+ cur_item = (struct ndis_wlan_bssid *)((char *)cur_item + -+ cur_item->length); -+ } -+ wrqu->data.length = event - extra; -+ wrqu->data.flags = 0; -+ kfree(bssid_list); -+ EXIT2(return 0); -+} -+ -+static int iw_set_power_mode(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ enum ndis_power power_mode; -+ -+ if (wrqu->power.disabled == 1) -+ power_mode = NDIS_POWER_OFF; -+ else if (wrqu->power.flags & IW_POWER_MIN) -+ power_mode = NDIS_POWER_MIN; -+ else // if (wrqu->power.flags & IW_POWER_MAX) -+ power_mode = NDIS_POWER_MAX; -+ -+ TRACE2("%d", power_mode); -+ res = mp_set(wnd, OID_802_11_POWER_MODE, -+ &power_mode, sizeof(power_mode)); -+ if (res) -+ WARNING("setting power mode failed (%08X)", res); -+ return 0; -+} -+ -+static int iw_get_power_mode(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ enum ndis_power power_mode; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_802_11_POWER_MODE, -+ &power_mode, sizeof(power_mode)); -+ if (res) -+ return -ENOTSUPP; -+ -+ if (power_mode == NDIS_POWER_OFF) -+ wrqu->power.disabled = 1; -+ else { -+ if (wrqu->power.flags != 0) -+ return 0; -+ wrqu->power.flags |= IW_POWER_ALL_R; -+ wrqu->power.flags |= IW_POWER_TIMEOUT; -+ wrqu->power.value = 0; -+ wrqu->power.disabled = 0; -+ -+ if (power_mode == NDIS_POWER_MIN) -+ wrqu->power.flags |= IW_POWER_MIN; -+ else // if (power_mode == NDIS_POWER_MAX) -+ wrqu->power.flags |= IW_POWER_MAX; -+ } -+ return 0; -+} -+ -+static int iw_get_sensitivity(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ ndis_rssi rssi_trigger; -+ -+ ENTER2(""); -+ res = mp_query(wnd, OID_802_11_RSSI_TRIGGER, -+ &rssi_trigger, sizeof(rssi_trigger)); -+ if (res) -+ return -EOPNOTSUPP; -+ wrqu->param.value = rssi_trigger; -+ wrqu->param.disabled = (rssi_trigger == 0); -+ wrqu->param.fixed = 1; -+ return 0; -+} -+ -+static int iw_set_sensitivity(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ ndis_rssi rssi_trigger; -+ -+ ENTER2(""); -+ if (wrqu->param.disabled) -+ rssi_trigger = 0; -+ else -+ rssi_trigger = wrqu->param.value; -+ res = mp_set(wnd, OID_802_11_RSSI_TRIGGER, -+ &rssi_trigger, sizeof(rssi_trigger)); -+ if (res == NDIS_STATUS_INVALID_DATA) -+ return -EINVAL; -+ if (res) -+ return -EOPNOTSUPP; -+ return 0; -+} -+ -+static int iw_get_ndis_stats(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct iw_statistics *stats = &wnd->iw_stats; -+ memcpy(&wrqu->qual, &stats->qual, sizeof(stats->qual)); -+ return 0; -+} -+ -+static int iw_get_range(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct iw_range *range = (struct iw_range *)extra; -+ struct iw_point *data = &wrqu->data; -+ struct ndis_device *wnd = netdev_priv(dev); -+ unsigned int i, n; -+ NDIS_STATUS res; -+ UCHAR rates[NDIS_MAX_RATES_EX]; -+ ndis_tx_power_level tx_power; -+ -+ ENTER2(""); -+ data->length = sizeof(struct iw_range); -+ memset(range, 0, sizeof(struct iw_range)); -+ -+ range->txpower_capa = IW_TXPOW_MWATT; -+ range->num_txpower = 0; -+ -+ res = mp_query(wnd, OID_802_11_TX_POWER_LEVEL, -+ &tx_power, sizeof(tx_power)); -+ if (!res) { -+ range->num_txpower = 1; -+ range->txpower[0] = tx_power; -+ } -+ -+ range->we_version_compiled = WIRELESS_EXT; -+ range->we_version_source = 19; -+ -+ range->retry_capa = IW_RETRY_LIMIT; -+ range->retry_flags = IW_RETRY_LIMIT; -+ range->min_retry = 0; -+ range->max_retry = 255; -+ -+ range->num_channels = 1; -+ -+ range->max_qual.qual = 100; -+ range->max_qual.level = 154; -+ range->max_qual.noise = 154; -+ range->sensitivity = 3; -+ -+ range->max_encoding_tokens = 4; -+ range->num_encoding_sizes = 2; -+ range->encoding_size[0] = 5; -+ range->encoding_size[1] = 13; -+ -+ range->num_bitrates = 0; -+ memset(&rates, 0, sizeof(rates)); -+ res = mp_query_info(wnd, OID_802_11_SUPPORTED_RATES, -+ &rates, sizeof(rates), &n, NULL); -+ if (res) -+ WARNING("getting bit rates failed: %08X", res); -+ else { -+ for (i = 0; i < n && range->num_bitrates < IW_MAX_BITRATES; i++) -+ if (rates[i] & 0x80) -+ continue; -+ else if (rates[i] & 0x7f) { -+ range->bitrate[range->num_bitrates] = -+ (rates[i] & 0x7f) * 500000; -+ range->num_bitrates++; -+ } -+ } -+ -+ range->num_channels = ARRAY_SIZE(freq_chan); -+ -+ for (i = 0; i < ARRAY_SIZE(freq_chan) && i < IW_MAX_FREQUENCIES; i++) { -+ range->freq[i].i = i + 1; -+ range->freq[i].m = freq_chan[i] * 100000; -+ range->freq[i].e = 1; -+ } -+ range->num_frequency = i; -+ -+ range->min_rts = 0; -+ range->max_rts = 2347; -+ range->min_frag = 256; -+ range->max_frag = 2346; -+ -+ /* Event capability (kernel + driver) */ -+ range->event_capa[0] = (IW_EVENT_CAPA_K_0 | -+ IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) | -+ IW_EVENT_CAPA_MASK(SIOCGIWAP) | -+ IW_EVENT_CAPA_MASK(SIOCGIWSCAN)); -+ range->event_capa[1] = IW_EVENT_CAPA_K_1; -+ range->event_capa[4] = (IW_EVENT_CAPA_MASK(IWEVTXDROP) | -+ IW_EVENT_CAPA_MASK(IWEVCUSTOM) | -+ IW_EVENT_CAPA_MASK(IWEVREGISTERED) | -+ IW_EVENT_CAPA_MASK(IWEVEXPIRED)); -+ -+ range->enc_capa = 0; -+ -+ if (test_bit(Ndis802_11Encryption2Enabled, &wnd->capa.encr)) -+ range->enc_capa |= IW_ENC_CAPA_CIPHER_TKIP; -+ if (test_bit(Ndis802_11Encryption3Enabled, &wnd->capa.encr)) -+ range->enc_capa |= IW_ENC_CAPA_CIPHER_CCMP; -+ -+ if (test_bit(Ndis802_11AuthModeWPA, &wnd->capa.auth) || -+ test_bit(Ndis802_11AuthModeWPAPSK, &wnd->capa.auth)) -+ range->enc_capa |= IW_ENC_CAPA_WPA; -+ if (test_bit(Ndis802_11AuthModeWPA2, &wnd->capa.auth) || -+ test_bit(Ndis802_11AuthModeWPA2PSK, &wnd->capa.auth)) -+ range->enc_capa |= IW_ENC_CAPA_WPA2; -+ -+ return 0; -+} -+ -+void set_default_iw_params(struct ndis_device *wnd) -+{ -+ wnd->iw_auth_key_mgmt = 0; -+ wnd->iw_auth_wpa_version = 0; -+ set_infra_mode(wnd, Ndis802_11Infrastructure); -+ set_ndis_auth_mode(wnd, Ndis802_11AuthModeOpen); -+ set_priv_filter(wnd); -+ set_iw_encr_mode(wnd, IW_AUTH_CIPHER_NONE, IW_AUTH_CIPHER_NONE); -+} -+ -+static int deauthenticate(struct ndis_device *wnd) -+{ -+ int ret; -+ -+ ENTER2(""); -+ ret = disassociate(wnd, 1); -+ set_default_iw_params(wnd); -+ EXIT2(return ret); -+} -+ -+NDIS_STATUS disassociate(struct ndis_device *wnd, int reset_ssid) -+{ -+ NDIS_STATUS res; -+ u8 buf[NDIS_ESSID_MAX_SIZE]; -+ int i; -+ -+ TRACE2(""); -+ res = mp_set(wnd, OID_802_11_DISASSOCIATE, NULL, 0); -+ /* disassociate causes radio to be turned off; if reset_ssid -+ * is given, set ssid to random to enable radio */ -+ if (reset_ssid) { -+ get_random_bytes(buf, sizeof(buf)); -+ for (i = 0; i < sizeof(buf); i++) -+ buf[i] = 'a' + (buf[i] % 26); -+ set_essid(wnd, buf, sizeof(buf)); -+ } -+ return res; -+} -+ -+static int iw_set_mlme(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct iw_mlme *mlme = (struct iw_mlme *)extra; -+ -+ ENTER2(""); -+ switch (mlme->cmd) { -+ case IW_MLME_DEAUTH: -+ return deauthenticate(wnd); -+ case IW_MLME_DISASSOC: -+ TRACE2("cmd=%d reason_code=%d", mlme->cmd, mlme->reason_code); -+ return disassociate(wnd, 1); -+ default: -+ return -EOPNOTSUPP; -+ } -+ -+ return 0; -+} -+ -+static int iw_set_genie(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ /* -+ * NDIS drivers do not allow IEs to be configured; this is -+ * done by the driver based on other configuration. Return 0 -+ * to avoid causing issues with user space programs that -+ * expect this function to succeed. -+ */ -+ return 0; -+} -+ -+static int iw_set_auth(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ TRACE2("index=%d value=%d", wrqu->param.flags & IW_AUTH_INDEX, -+ wrqu->param.value); -+ switch (wrqu->param.flags & IW_AUTH_INDEX) { -+ case IW_AUTH_WPA_VERSION: -+ wnd->iw_auth_wpa_version = wrqu->param.value; -+ break; -+ case IW_AUTH_CIPHER_PAIRWISE: -+ wnd->iw_auth_cipher_pairwise = wrqu->param.value; -+ break; -+ case IW_AUTH_CIPHER_GROUP: -+ wnd->iw_auth_cipher_group = wrqu->param.value; -+ break; -+ case IW_AUTH_KEY_MGMT: -+ wnd->iw_auth_key_mgmt = wrqu->param.value; -+ break; -+ case IW_AUTH_80211_AUTH_ALG: -+ wnd->iw_auth_80211_alg = wrqu->param.value; -+ break; -+ case IW_AUTH_WPA_ENABLED: -+ if (wrqu->param.value) -+ deauthenticate(wnd); -+ break; -+#ifdef IW_AUTH_MFP -+ case IW_AUTH_MFP: -+ if (wrqu->param.value == IW_AUTH_MFP_DISABLED || -+ wrqu->param.value == IW_AUTH_MFP_OPTIONAL) -+ break; -+ WARNING("MFP not implemented"); -+ return -EOPNOTSUPP; -+#endif -+ case IW_AUTH_TKIP_COUNTERMEASURES: -+ case IW_AUTH_DROP_UNENCRYPTED: -+ case IW_AUTH_RX_UNENCRYPTED_EAPOL: -+ case IW_AUTH_PRIVACY_INVOKED: -+ TRACE2("%d not implemented: %d", -+ wrqu->param.flags & IW_AUTH_INDEX, wrqu->param.value); -+ break; -+ default: -+ WARNING("invalid cmd %d", wrqu->param.flags & IW_AUTH_INDEX); -+ return -EOPNOTSUPP; -+ } -+ return 0; -+} -+ -+static int iw_get_auth(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ ENTER2("index=%d", wrqu->param.flags & IW_AUTH_INDEX); -+ switch (wrqu->param.flags & IW_AUTH_INDEX) { -+ case IW_AUTH_WPA_VERSION: -+ wrqu->param.value = wnd->iw_auth_wpa_version; -+ break; -+ case IW_AUTH_CIPHER_PAIRWISE: -+ wrqu->param.value = wnd->iw_auth_cipher_pairwise; -+ break; -+ case IW_AUTH_CIPHER_GROUP: -+ wrqu->param.value = wnd->iw_auth_cipher_group; -+ break; -+ case IW_AUTH_KEY_MGMT: -+ wrqu->param.value = wnd->iw_auth_key_mgmt; -+ break; -+ case IW_AUTH_80211_AUTH_ALG: -+ wrqu->param.value = wnd->iw_auth_80211_alg; -+ break; -+ default: -+ WARNING("invalid cmd %d", wrqu->param.flags & IW_AUTH_INDEX); -+ return -EOPNOTSUPP; -+ } -+ return 0; -+} -+ -+static int iw_set_encodeext(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct ndis_add_key ndis_key; -+ int i, keyidx; -+ NDIS_STATUS res; -+ u8 *addr; -+ -+ keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX; -+ ENTER2("%d", keyidx); -+ if (keyidx) -+ keyidx--; -+ else -+ keyidx = wnd->encr_info.tx_key_index; -+ -+ if (keyidx < 0 || keyidx >= MAX_ENCR_KEYS) -+ return -EINVAL; -+ -+ if (ext->alg == WPA_ALG_WEP) { -+ if (!test_bit(Ndis802_11Encryption1Enabled, &wnd->capa.encr)) -+ EXIT2(return -1); -+ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) -+ wnd->encr_info.tx_key_index = keyidx; -+ if (add_wep_key(wnd, ext->key, ext->key_len, keyidx)) -+ EXIT2(return -1); -+ else -+ EXIT2(return 0); -+ } -+ if ((wrqu->encoding.flags & IW_ENCODE_DISABLED) || -+ ext->alg == IW_ENCODE_ALG_NONE || ext->key_len == 0) -+ EXIT2(return remove_key(wnd, keyidx, ndis_key.bssid)); -+ -+ if (ext->key_len > sizeof(ndis_key.key)) { -+ TRACE2("incorrect key length (%u)", ext->key_len); -+ EXIT2(return -1); -+ } -+ -+ memset(&ndis_key, 0, sizeof(ndis_key)); -+ -+ ndis_key.struct_size = -+ sizeof(ndis_key) - sizeof(ndis_key.key) + ext->key_len; -+ ndis_key.length = ext->key_len; -+ ndis_key.index = keyidx; -+ -+ if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { -+ for (i = 0; i < 6; i++) -+ ndis_key.rsc |= (((u64)ext->rx_seq[i]) << (i * 8)); -+ TRACE2("0x%llx", ndis_key.rsc); -+ ndis_key.index |= 1 << 29; -+ } -+ -+ addr = ext->addr.sa_data; -+ if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) { -+ /* group key */ -+ if (wnd->infrastructure_mode == Ndis802_11IBSS) -+ memset(ndis_key.bssid, 0xff, ETH_ALEN); -+ else -+ get_ap_address(wnd, ndis_key.bssid); -+ } else { -+ /* pairwise key */ -+ ndis_key.index |= (1 << 30); -+ memcpy(ndis_key.bssid, addr, ETH_ALEN); -+ } -+ TRACE2(MACSTRSEP, MAC2STR(ndis_key.bssid)); -+ -+ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) -+ ndis_key.index |= (1 << 31); -+ -+ if (ext->alg == IW_ENCODE_ALG_TKIP && ext->key_len == 32) { -+ /* wpa_supplicant gives us the Michael MIC RX/TX keys in -+ * different order than NDIS spec, so swap the order here. */ -+ memcpy(ndis_key.key, ext->key, 16); -+ memcpy(ndis_key.key + 16, ext->key + 24, 8); -+ memcpy(ndis_key.key + 24, ext->key + 16, 8); -+ } else -+ memcpy(ndis_key.key, ext->key, ext->key_len); -+ -+ res = mp_set(wnd, OID_802_11_ADD_KEY, &ndis_key, ndis_key.struct_size); -+ if (res) { -+ TRACE2("adding key failed (%08X), %u", -+ res, ndis_key.struct_size); -+ EXIT2(return -1); -+ } -+ wnd->encr_info.keys[keyidx].length = ext->key_len; -+ memcpy(&wnd->encr_info.keys[keyidx].key, ndis_key.key, ext->key_len); -+ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) -+ wnd->encr_info.tx_key_index = keyidx; -+ TRACE2("key %d added", keyidx); -+ -+ EXIT2(return 0); -+} -+ -+static int iw_get_encodeext(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ /* struct iw_encode_ext *ext = (struct iw_encode_ext *) extra; */ -+ /* TODO */ -+ ENTER2(""); -+ return 0; -+} -+ -+static int iw_set_pmksa(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct iw_pmksa *pmksa = (struct iw_pmksa *)extra; -+ struct ndis_pmkid pmkid; -+ NDIS_STATUS res; -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ /* TODO: must keep local list of PMKIDs since NDIS drivers -+ * expect that all PMKID entries are included whenever a new -+ * one is added. */ -+ -+ ENTER2("%d", pmksa->cmd); -+ if ((pmksa->cmd == IW_PMKSA_ADD || pmksa->cmd == IW_PMKSA_REMOVE) && -+ (!(wnd->iw_auth_wpa_version & IW_AUTH_WPA_VERSION_WPA2))) -+ EXIT2(return -EOPNOTSUPP); -+ -+ memset(&pmkid, 0, sizeof(pmkid)); -+ if (pmksa->cmd == IW_PMKSA_ADD) { -+ pmkid.bssid_info_count = 1; -+ memcpy(pmkid.bssid_info[0].bssid, pmksa->bssid.sa_data, -+ ETH_ALEN); -+ memcpy(pmkid.bssid_info[0].pmkid, pmksa->pmkid, IW_PMKID_LEN); -+ } -+ pmkid.length = sizeof(pmkid); -+ -+ res = mp_set(wnd, OID_802_11_PMKID, &pmkid, pmkid.length); -+ if (res == NDIS_STATUS_FAILURE) -+ EXIT2(return -EOPNOTSUPP); -+ TRACE2("OID_802_11_PMKID -> %d", res); -+ if (res) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+#define WEXT(id) [id - SIOCIWFIRST] -+ -+static const iw_handler ndis_handler[] = { -+ WEXT(SIOCGIWNAME) = iw_get_network_type, -+ WEXT(SIOCSIWESSID) = iw_set_essid, -+ WEXT(SIOCGIWESSID) = iw_get_essid, -+ WEXT(SIOCSIWMODE) = iw_set_infra_mode, -+ WEXT(SIOCGIWMODE) = iw_get_infra_mode, -+ WEXT(SIOCGIWFREQ) = iw_get_freq, -+ WEXT(SIOCSIWFREQ) = iw_set_freq, -+ WEXT(SIOCGIWTXPOW) = iw_get_tx_power, -+ WEXT(SIOCSIWTXPOW) = iw_set_tx_power, -+ WEXT(SIOCGIWRATE) = iw_get_bitrate, -+ WEXT(SIOCSIWRATE) = iw_set_bitrate, -+ WEXT(SIOCGIWRTS) = iw_get_rts_threshold, -+ WEXT(SIOCSIWRTS) = iw_set_rts_threshold, -+ WEXT(SIOCGIWFRAG) = iw_get_frag_threshold, -+ WEXT(SIOCSIWFRAG) = iw_set_frag_threshold, -+ WEXT(SIOCGIWAP) = iw_get_ap_address, -+ WEXT(SIOCSIWAP) = iw_set_ap_address, -+ WEXT(SIOCSIWENCODE) = iw_set_wep, -+ WEXT(SIOCGIWENCODE) = iw_get_encr, -+ WEXT(SIOCSIWSCAN) = iw_set_scan, -+ WEXT(SIOCGIWSCAN) = iw_get_scan, -+ WEXT(SIOCGIWPOWER) = iw_get_power_mode, -+ WEXT(SIOCSIWPOWER) = iw_set_power_mode, -+ WEXT(SIOCGIWRANGE) = iw_get_range, -+ WEXT(SIOCGIWSTATS) = iw_get_ndis_stats, -+ WEXT(SIOCGIWSENS) = iw_get_sensitivity, -+ WEXT(SIOCSIWSENS) = iw_set_sensitivity, -+ WEXT(SIOCGIWNICKN) = iw_get_nick, -+ WEXT(SIOCSIWNICKN) = iw_set_nick, -+ WEXT(SIOCSIWCOMMIT) = iw_set_dummy, -+ WEXT(SIOCSIWMLME) = iw_set_mlme, -+ WEXT(SIOCSIWGENIE) = iw_set_genie, -+ WEXT(SIOCSIWAUTH) = iw_set_auth, -+ WEXT(SIOCGIWAUTH) = iw_get_auth, -+ WEXT(SIOCSIWENCODEEXT) = iw_set_encodeext, -+ WEXT(SIOCGIWENCODEEXT) = iw_get_encodeext, -+ WEXT(SIOCSIWPMKSA) = iw_set_pmksa, -+}; -+ -+/* private ioctl's */ -+ -+static int priv_reset(struct net_device *dev, struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ int res; -+ ENTER2(""); -+ res = mp_reset(netdev_priv(dev)); -+ if (res) { -+ WARNING("reset failed: %08X", res); -+ return -EOPNOTSUPP; -+ } -+ return 0; -+} -+ -+static int priv_deauthenticate(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ int res; -+ ENTER2(""); -+ res = deauthenticate(netdev_priv(dev)); -+ return res; -+} -+ -+static int priv_power_profile(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct miniport *mp; -+ ULONG profile_inf; -+ -+ ENTER2(""); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ if (!mp->pnp_event_notify) -+ EXIT2(return -EOPNOTSUPP); -+ -+ /* 1 for AC and 0 for Battery */ -+ if (wrqu->param.value) -+ profile_inf = NdisPowerProfileAcOnLine; -+ else -+ profile_inf = NdisPowerProfileBattery; -+ -+ LIN2WIN4(mp->pnp_event_notify, wnd->nmb->mp_ctx, -+ NdisDevicePnPEventPowerProfileChanged, -+ &profile_inf, sizeof(profile_inf)); -+ EXIT2(return 0); -+} -+ -+static int priv_network_type(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ enum network_type network_type; -+ NDIS_STATUS res; -+ char type; -+ -+ ENTER2(""); -+ type = wrqu->param.value; -+ if (type == 'f') -+ network_type = Ndis802_11FH; -+ else if (type == 'b') -+ network_type = Ndis802_11DS; -+ else if (type == 'a') -+ network_type = Ndis802_11OFDM5; -+ else if (type == 'g' || type == 'n') -+ network_type = Ndis802_11OFDM24; -+ else -+ network_type = Ndis802_11Automode; -+ -+ res = mp_set_int(wnd, OID_802_11_NETWORK_TYPE_IN_USE, network_type); -+ if (res) { -+ WARNING("setting network type to %d failed (%08X)", -+ network_type, res); -+ EXIT2(return -EINVAL); -+ } -+ -+ EXIT2(return 0); -+} -+ -+static int priv_media_stream_mode(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ NDIS_STATUS res; -+ int mode; -+ -+ ENTER2(""); -+ if (wrqu->param.value > 0) -+ mode = Ndis802_11MediaStreamOn; -+ else -+ mode = Ndis802_11MediaStreamOff; -+ res = mp_set_int(wnd, OID_802_11_MEDIA_STREAM_MODE, mode); -+ if (res) { -+ WARNING("oid failed (%08X)", res); -+ EXIT2(return -EINVAL); -+ } -+ EXIT2(return 0); -+} -+ -+static int priv_reload_defaults(struct net_device *dev, -+ struct iw_request_info *info, -+ union iwreq_data *wrqu, char *extra) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ int res; -+ ENTER2(""); -+ res = mp_set_int(wnd, OID_802_11_RELOAD_DEFAULTS, -+ Ndis802_11ReloadWEPKeys); -+ if (res) { -+ WARNING("reloading defaults failed: %08X", res); -+ return -EOPNOTSUPP; -+ } -+ return 0; -+} -+ -+static const struct iw_priv_args priv_args[] = { -+ {PRIV_RESET, 0, 0, "ndis_reset"}, -+ {PRIV_POWER_PROFILE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, -+ "power_profile"}, -+ {PRIV_DEAUTHENTICATE, 0, 0, "deauthenticate"}, -+ {PRIV_NETWORK_TYPE, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, -+ "network_type"}, -+ {PRIV_MEDIA_STREAM_MODE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, -+ "media_stream"}, -+ -+ {PRIV_RELOAD_DEFAULTS, 0, 0, "reload_defaults"}, -+}; -+ -+#define WEPRIV(id) [id - SIOCIWFIRSTPRIV] -+ -+static const iw_handler priv_handler[] = { -+ WEPRIV(PRIV_RESET) = priv_reset, -+ WEPRIV(PRIV_POWER_PROFILE) = priv_power_profile, -+ WEPRIV(PRIV_DEAUTHENTICATE) = priv_deauthenticate, -+ WEPRIV(PRIV_NETWORK_TYPE) = priv_network_type, -+ WEPRIV(PRIV_MEDIA_STREAM_MODE) = priv_media_stream_mode, -+ WEPRIV(PRIV_RELOAD_DEFAULTS) = priv_reload_defaults, -+}; -+ -+const struct iw_handler_def ndis_handler_def = { -+ .num_standard = ARRAY_SIZE(ndis_handler), -+ .num_private = ARRAY_SIZE(priv_handler), -+ .num_private_args = ARRAY_SIZE(priv_args), -+ -+ .standard = (iw_handler *)ndis_handler, -+ .private = (iw_handler *)priv_handler, -+ .private_args = (struct iw_priv_args *)priv_args, -+ .get_wireless_stats = get_iw_stats, -+}; -+ -+#endif -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/iw_ndis.h linux-5.6.11-ndis/3rdparty/ndiswrapper/iw_ndis.h ---- linux-5.6.11/3rdparty/ndiswrapper/iw_ndis.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/iw_ndis.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,194 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _IW_NDIS_H_ -+#define _IW_NDIS_H_ -+ -+#include "ndis.h" -+ -+#define WL_NOISE -96 /* typical noise level in dBm */ -+#define WL_SIGMAX -32 /* typical maximum signal level in dBm */ -+ -+struct ndis_encr_key { -+ ULONG struct_size; -+ ULONG index; -+ ULONG length; -+ UCHAR key[NDIS_ENCODING_TOKEN_MAX]; -+}; -+ -+struct ndis_add_key { -+ ULONG struct_size; -+ ndis_key_index index; -+ ULONG length; -+ mac_address bssid; -+ UCHAR pad[6]; -+ ndis_key_rsc rsc; -+ UCHAR key[NDIS_ENCODING_TOKEN_MAX]; -+}; -+ -+struct ndis_remove_key { -+ ULONG struct_size; -+ ndis_key_index index; -+ mac_address bssid; -+}; -+ -+struct ndis_fixed_ies { -+ UCHAR time_stamp[8]; -+ USHORT beacon_interval; -+ USHORT capa; -+}; -+ -+struct ndis_variable_ies { -+ UCHAR elem_id; -+ UCHAR length; -+ UCHAR data[]; -+}; -+ -+enum ndis_reload_defaults { Ndis802_11ReloadWEPKeys }; -+ -+struct ndis_assoc_info { -+ ULONG length; -+ USHORT req_ies; -+ struct req_ie { -+ USHORT capa; -+ USHORT listen_interval; -+ mac_address cur_ap_address; -+ } req_ie; -+ ULONG req_ie_length; -+ ULONG offset_req_ies; -+ USHORT resp_ies; -+ struct resp_ie { -+ USHORT capa; -+ USHORT status_code; -+ USHORT assoc_id; -+ } resp_ie; -+ ULONG resp_ie_length; -+ ULONG offset_resp_ies; -+}; -+ -+struct ndis_configuration_fh { -+ ULONG length; -+ ULONG hop_pattern; -+ ULONG hop_set; -+ ULONG dwell_time; -+}; -+ -+struct ndis_configuration { -+ ULONG length; -+ ULONG beacon_period; -+ ULONG atim_window; -+ ULONG ds_config; -+ struct ndis_configuration_fh fh_config; -+}; -+ -+struct ndis_wlan_bssid { -+ ULONG length; -+ mac_address mac; -+ UCHAR reserved[2]; -+ struct ndis_essid ssid; -+ ULONG privacy; -+ ndis_rssi rssi; -+ UINT net_type; -+ struct ndis_configuration config; -+ UINT mode; -+ UCHAR rates[NDIS_MAX_RATES]; -+}; -+ -+struct ndis_wlan_bssid_ex { -+ ULONG length; -+ mac_address mac; -+ UCHAR reserved[2]; -+ struct ndis_essid ssid; -+ ULONG privacy; -+ ndis_rssi rssi; -+ UINT net_type; -+ struct ndis_configuration config; -+ UINT mode; -+ UCHAR rates_ex[NDIS_MAX_RATES_EX]; -+ ULONG ie_length; -+ struct ndis_fixed_ies fixed; -+ struct ndis_variable_ies var[]; -+}; -+ -+/* we use bssid_list as bssid_list_ex also */ -+struct ndis_bssid_list { -+ ULONG num_items; -+ struct ndis_wlan_bssid bssid[1]; -+}; -+ -+enum ndis_priv_filter { -+ Ndis802_11PrivFilterAcceptAll, Ndis802_11PrivFilter8021xWEP -+}; -+ -+enum network_type { -+ Ndis802_11FH, Ndis802_11DS, Ndis802_11OFDM5, Ndis802_11OFDM24, -+ /* MSDN site uses Ndis802_11Automode, which is not mentioned -+ * in DDK, so add one and assign it to -+ * Ndis802_11NetworkTypeMax */ -+ Ndis802_11Automode, Ndis802_11NetworkTypeMax = Ndis802_11Automode -+}; -+ -+struct network_type_list { -+ ULONG num; -+ enum network_type types[1]; -+}; -+ -+enum ndis_power { -+ NDIS_POWER_OFF = 0, NDIS_POWER_MAX, NDIS_POWER_MIN, -+}; -+ -+struct ndis_auth_req { -+ ULONG length; -+ mac_address bssid; -+ ULONG flags; -+}; -+ -+struct ndis_bssid_info { -+ mac_address bssid; -+ UCHAR pmkid[IW_PMKID_LEN]; -+}; -+ -+struct ndis_pmkid { -+ ULONG length; -+ ULONG bssid_info_count; -+ struct ndis_bssid_info bssid_info[1]; -+}; -+ -+int get_ap_address(struct ndis_device *wnd, mac_address mac); -+int set_ndis_auth_mode(struct ndis_device *wnd, ULONG auth_mode); -+int get_ndis_encr_mode(struct ndis_device *wnd); -+int set_iw_encr_mode(struct ndis_device *wnd, int cipher_pairwise, -+ int cipher_groupwise); -+int get_ndis_auth_mode(struct ndis_device *wnd); -+NDIS_STATUS disassociate(struct ndis_device *wnd, int reset_ssid); -+void set_default_iw_params(struct ndis_device *wnd); -+extern const struct iw_handler_def ndis_handler_def; -+ -+#define PRIV_RESET SIOCIWFIRSTPRIV+16 -+#define PRIV_POWER_PROFILE SIOCIWFIRSTPRIV+17 -+#define PRIV_NETWORK_TYPE SIOCIWFIRSTPRIV+18 -+#define PRIV_DEAUTHENTICATE SIOCIWFIRSTPRIV+19 -+#define PRIV_MEDIA_STREAM_MODE SIOCIWFIRSTPRIV+20 -+#define PRIV_RELOAD_DEFAULTS SIOCIWFIRSTPRIV+23 -+ -+/* these have to match what is in wpa_supplicant */ -+ -+enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP }; -+enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, -+ CIPHER_WEP104 }; -+enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, -+ KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE }; -+ -+#endif // IW_NDIS_H -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/lin2win.h linux-5.6.11-ndis/3rdparty/ndiswrapper/lin2win.h ---- linux-5.6.11/3rdparty/ndiswrapper/lin2win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/lin2win.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,111 @@ -+/* -+ * Copyright (C) 2006 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifdef CONFIG_X86_64 -+ -+u64 lin2win0(void *func); -+u64 lin2win1(void *func, u64 arg1); -+u64 lin2win2(void *func, u64 arg1, u64 arg2); -+u64 lin2win3(void *func, u64 arg1, u64 arg2, u64 arg3); -+u64 lin2win4(void *func, u64 arg1, u64 arg2, u64 arg3, u64 arg4); -+u64 lin2win5(void *func, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5); -+u64 lin2win6(void *func, u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5, -+ u64 arg6); -+ -+#define LIN2WIN0(func) \ -+({ \ -+ if (0) \ -+ func(); \ -+ lin2win0(func); \ -+}) -+ -+#define LIN2WIN1(func, arg1) \ -+({ \ -+ if (0) \ -+ func(arg1); \ -+ lin2win1(func, (u64)arg1); \ -+}) -+ -+#define LIN2WIN2(func, arg1, arg2) \ -+({ \ -+ if (0) \ -+ func(arg1, arg2); \ -+ lin2win2(func, (u64)arg1, (u64)arg2); \ -+}) -+ -+#define LIN2WIN3(func, arg1, arg2, arg3) \ -+({ \ -+ if (0) \ -+ func(arg1, arg2, arg3); \ -+ lin2win3(func, (u64)arg1, (u64)arg2, (u64)arg3); \ -+}) -+ -+#define LIN2WIN4(func, arg1, arg2, arg3, arg4) \ -+({ \ -+ if (0) \ -+ func(arg1, arg2, arg3, arg4); \ -+ lin2win4(func, (u64)arg1, (u64)arg2, (u64)arg3, (u64)arg4); \ -+}) -+ -+#define LIN2WIN5(func, arg1, arg2, arg3, arg4, arg5) \ -+({ \ -+ if (0) \ -+ func(arg1, arg2, arg3, arg4, arg5); \ -+ lin2win5(func, (u64)arg1, (u64)arg2, (u64)arg3, (u64)arg4, \ -+ (u64)arg5); \ -+}) -+ -+#define LIN2WIN6(func, arg1, arg2, arg3, arg4, arg5, arg6) \ -+({ \ -+ if (0) \ -+ func(arg1, arg2, arg3, arg4, arg5, arg6); \ -+ lin2win6(func, (u64)arg1, (u64)arg2, (u64)arg3, (u64)arg4, \ -+ (u64)arg5, (u64)arg6); \ -+}) -+ -+#else // CONFIG_X86_64 -+ -+#define LIN2WIN1(func, arg1) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1); \ -+}) -+#define LIN2WIN2(func, arg1, arg2) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1, arg2); \ -+}) -+#define LIN2WIN3(func, arg1, arg2, arg3) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1, arg2, arg3); \ -+}) -+#define LIN2WIN4(func, arg1, arg2, arg3, arg4) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1, arg2, arg3, arg4); \ -+}) -+#define LIN2WIN5(func, arg1, arg2, arg3, arg4, arg5) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1, arg2, arg3, arg4, arg5); \ -+}) -+#define LIN2WIN6(func, arg1, arg2, arg3, arg4, arg5, arg6) \ -+({ \ -+ TRACE6("calling %p", func); \ -+ func(arg1, arg2, arg3, arg4, arg5, arg6); \ -+}) -+ -+#endif // CONFIG_X86_64 -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/lin2win.S linux-5.6.11-ndis/3rdparty/ndiswrapper/lin2win.S ---- linux-5.6.11/3rdparty/ndiswrapper/lin2win.S 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/lin2win.S 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,147 @@ -+/* -+ * Copyright (C) 2011 Pavel Roskin -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include -+#include -+ -+ .text -+ -+#define WORD_BYTES 8 -+#define LINUX_REG_ARGS 6 -+#define WINDOWS_REG_ARGS 4 -+ -+/* %rbp is saved to create a stack frame, which can help with debugging */ -+#define SAVED_REGS 1 -+ -+/* -+ * When calling a Windows function, stack space is allocated for at least 4 -+ * arguments even if the number of arguments is less than 4. The value of -+ * true is -1 in assembler, so we multiply it by another true value. -+ */ -+#define stack_args(argc) \ -+ (WINDOWS_REG_ARGS + \ -+ (0 < 1) * (argc > WINDOWS_REG_ARGS) * (argc - WINDOWS_REG_ARGS)) -+ -+/* Full required change of stack pointer, in words */ -+#define stack_words_raw(argc) (stack_args(argc) + SAVED_REGS + 1) -+ -+/* Full actual change of stack pointer, in words (must be even) */ -+#define stack_words_aligned(argc) ((stack_words_raw(argc) + 1) & ~1) -+ -+/* Space allocated for Linux arguments on stack */ -+#define stack_space(argc) \ -+ ((stack_words_aligned(argc) - SAVED_REGS - 1) * WORD_BYTES) -+ -+/* -+ * lin2win_win_arg(N) gives the address of the Nth Windows argument on our -+ * stack frame. %rsp points to the first argument. The Nth argument is -+ * therefore at ((N - 1) * 8)(%rsp). -+ * -+ * Don't call with N less than 5! -+ */ -+#define lin2win_win_arg(n) ((n - 1) * WORD_BYTES)(%rsp) -+ -+/* -+ * lin2win_lin_arg(N, ARGC) gives the address of the Nth Linux argument after -+ * the stack has been prepared for a Windows function call with ARGC arguments. -+ * -+ * When called from Linux, the Nth argument is at ((N - 6) * 8)(%rsp). We add -+ * the allocated stack space and saved registers to compensate for %rsp change. -+ * -+ * Don't call with N less than 7! -+ */ -+#define lin2win_lin_arg(n, argc) \ -+ (stack_space(argc) + \ -+ (SAVED_REGS + n - LINUX_REG_ARGS) * WORD_BYTES)(%rsp) -+ -+/* -+ * lin2win(func, winarg1, winarg2, ...) -+ * Call Windows FUNC function with ARGC arguments WINARG1, WINARG2, ... -+ * We get (ARGC + 1) arguments. -+ */ -+.macro lin2win name, argc -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) -+ SYM_FUNC_START(\name) -+#else -+ .type \name, @function -+ ENTRY(\name) -+#endif -+ -+ /* Create a call frame - it's optional, but good for debugging */ -+ .cfi_startproc -+ push %rbp -+ .cfi_def_cfa %rsp, 2 * WORD_BYTES -+ .cfi_offset %rbp, -2 * WORD_BYTES -+ mov %rsp, %rbp -+ .cfi_def_cfa %rbp, 2 * WORD_BYTES -+ -+ /* Allocate space for Windows arguments */ -+ sub $stack_space(\argc), %rsp -+ -+ /* arg7 to winarg6 */ -+ .if (\argc >= 6) -+ mov lin2win_lin_arg(7, \argc), %r11 -+ mov %r11, lin2win_win_arg(6) -+ .endif -+ -+ /* arg6 to winarg5 */ -+ .if (\argc >= 5) -+ mov %r9, lin2win_win_arg(5) -+ .endif -+ -+ /* arg5 to winarg4 */ -+ .if (\argc >= 4) -+ mov %r8, %r9 -+ .endif -+ -+ /* arg4 to winarg3 */ -+ .if (\argc >= 3) -+ mov %rcx, %r8 -+ .endif -+ -+ /* arg3 to winarg2 - nothing needed, both are in %rdx */ -+ -+ /* arg2 to winarg1 */ -+ .if (\argc >= 1) -+ mov %rsi, %rcx -+ .endif -+ -+ /* Call function (arg1) */ -+ call *%rdi -+ -+ /* Reclaim space for Windows arguments */ -+ add $stack_space(\argc), %rsp -+ -+ /* Return to the caller */ -+ leave -+ .cfi_def_cfa %rsp, WORD_BYTES -+ .cfi_restore %rbp -+ ret -+ .cfi_endproc -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) -+ SYM_FUNC_END(\name) -+#else -+ .size \name, (. - \name) -+#endif -+.endm -+ -+/* Define lin2winN functions */ -+lin2win lin2win0, 0 -+lin2win lin2win1, 1 -+lin2win lin2win2, 2 -+lin2win lin2win3, 3 -+lin2win lin2win4, 4 -+lin2win lin2win5, 5 -+lin2win lin2win6, 6 -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/loader.c linux-5.6.11-ndis/3rdparty/ndiswrapper/loader.c ---- linux-5.6.11/3rdparty/ndiswrapper/loader.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/loader.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,967 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ndis.h" -+#include "loader.h" -+#include "wrapndis.h" -+#include "pnp.h" -+ -+#include -+#include -+#include -+#include -+ -+/* -+ Network adapter: ClassGuid = {4d36e972-e325-11ce-bfc1-08002be10318} -+ Network client: ClassGuid = {4d36e973-e325-11ce-bfc1-08002be10318} -+ PCMCIA adapter: ClassGuid = {4d36e977-e325-11ce-bfc1-08002be10318} -+ USB: ClassGuid = {36fc9e60-c465-11cf-8056-444553540000} -+*/ -+ -+/* the indices used here must match macros WRAP_NDIS_DEVICE etc. */ -+static struct guid class_guids[] = { -+ /* Network */ -+ { .data1 = 0x4d36e972, .data2 = 0xe325, .data3 = 0x11ce }, -+ /* USB WDM */ -+ { .data1 = 0x36fc9e60, .data2 = 0xc465, .data3 = 0x11cf }, -+ /* Bluetooth */ -+ { .data1 = 0xe0cbf06c, .data2 = 0xcd8b, .data3 = 0x4647 }, -+ /* ivtcorporation.com's bluetooth device claims this is -+ * bluetooth guid */ -+ { .data1 = 0xf12d3cf8, .data2 = 0xb11d, .data3 = 0x457e}, -+}; -+ -+struct mutex loader_mutex; -+static struct completion loader_complete; -+ -+static struct nt_list wrap_devices; -+static struct nt_list wrap_drivers; -+ -+static int wrap_device_type(int data1) -+{ -+ int i; -+ for (i = 0; i < ARRAY_SIZE(class_guids); i++) -+ if (data1 == class_guids[i].data1) -+ return i; -+ ERROR("unknown device: 0x%x\n", data1); -+ return -1; -+} -+ -+/* load driver for given device, if not already loaded */ -+struct wrap_driver *load_wrap_driver(struct wrap_device *wd) -+{ -+ int ret; -+ struct nt_list *cur; -+ struct wrap_driver *wrap_driver; -+ -+ ENTER1("device: %04X:%04X:%04X:%04X", wd->vendor, wd->device, -+ wd->subvendor, wd->subdevice); -+ mutex_lock(&loader_mutex); -+ wrap_driver = NULL; -+ nt_list_for_each(cur, &wrap_drivers) { -+ wrap_driver = container_of(cur, struct wrap_driver, list); -+ if (!stricmp(wrap_driver->name, wd->driver_name)) { -+ TRACE1("driver %s already loaded", wrap_driver->name); -+ break; -+ } else -+ wrap_driver = NULL; -+ } -+ mutex_unlock(&loader_mutex); -+ -+ if (!wrap_driver) { -+ char *argv[] = {"loadndisdriver", WRAP_CMD_LOAD_DRIVER, -+#if DEBUG >= 1 -+ "1", -+#else -+ "0", -+#endif -+ UTILS_VERSION, wd->driver_name, -+ wd->conf_file_name, NULL}; -+ char *env[] = {NULL}; -+ -+ TRACE1("loading driver %s", wd->driver_name); -+ mutex_lock(&loader_mutex); -+ reinit_completion(&loader_complete); -+ ret = call_usermodehelper("/sbin/loadndisdriver", argv, env, -+ UMH_WAIT_PROC); -+ if (ret) { -+ mutex_unlock(&loader_mutex); -+ ERROR("couldn't load driver %s; check system log " -+ "for messages from 'loadndisdriver'", -+ wd->driver_name); -+ EXIT1(return NULL); -+ } -+ wait_for_completion(&loader_complete); -+ TRACE1("%s", wd->driver_name); -+ wrap_driver = NULL; -+ nt_list_for_each(cur, &wrap_drivers) { -+ wrap_driver = container_of(cur, struct wrap_driver, -+ list); -+ if (!stricmp(wrap_driver->name, wd->driver_name)) { -+ wd->driver = wrap_driver; -+ break; -+ } else -+ wrap_driver = NULL; -+ } -+ mutex_unlock(&loader_mutex); -+ if (wrap_driver) -+ TRACE1("driver %s is loaded", wrap_driver->name); -+ else -+ ERROR("couldn't load driver '%s'", wd->driver_name); -+ } -+ EXIT1(return wrap_driver); -+} -+ -+/* load the driver files from userspace. */ -+static int load_sys_files(struct wrap_driver *driver, -+ struct load_driver *load_driver) -+{ -+ int i, err; -+ -+ TRACE1("num_pe_images = %d", load_driver->num_sys_files); -+ TRACE1("loading driver: %s", load_driver->name); -+ strncpy(driver->name, load_driver->name, sizeof(driver->name)); -+ driver->name[sizeof(driver->name)-1] = 0; -+ TRACE1("driver: %s", driver->name); -+ err = 0; -+ driver->num_pe_images = 0; -+ for (i = 0; i < load_driver->num_sys_files; i++) { -+ struct pe_image *pe_image; -+ pe_image = &driver->pe_images[driver->num_pe_images]; -+ -+ strncpy(pe_image->name, load_driver->sys_files[i].name, -+ sizeof(pe_image->name)); -+ pe_image->name[sizeof(pe_image->name)-1] = 0; -+ TRACE1("image size: %zu bytes", load_driver->sys_files[i].size); -+ -+#ifdef CONFIG_X86_64 -+#ifdef PAGE_KERNEL_EXECUTABLE -+ pe_image->image = -+ __vmalloc(load_driver->sys_files[i].size, -+ GFP_KERNEL | __GFP_HIGHMEM -+ ); -+#elif defined PAGE_KERNEL_EXEC -+ pe_image->image = -+ __vmalloc(load_driver->sys_files[i].size, -+ GFP_KERNEL | __GFP_HIGHMEM -+ ); -+#else -+#error x86_64 should have either PAGE_KERNEL_EXECUTABLE or PAGE_KERNEL_EXEC -+#endif -+#else -+ /* hate to play with kernel macros, but PAGE_KERNEL_EXEC is -+ * not available to modules! */ -+#ifdef cpu_has_nx -+ if (cpu_has_nx) -+ pe_image->image = -+ __vmalloc(load_driver->sys_files[i].size, -+ GFP_KERNEL | __GFP_HIGHMEM -+ ); -+ else -+ pe_image->image = -+ vmalloc(load_driver->sys_files[i].size); -+#else -+ pe_image->image = -+ vmalloc(load_driver->sys_files[i].size); -+#endif -+#endif -+ if (!pe_image->image) { -+ ERROR("couldn't allocate memory"); -+ err = -ENOMEM; -+ break; -+ } -+ TRACE1("image is at %p", pe_image->image); -+ -+ if (copy_from_user(pe_image->image, -+ load_driver->sys_files[i].data, -+ load_driver->sys_files[i].size)) { -+ ERROR("couldn't load file %s", -+ load_driver->sys_files[i].name); -+ err = -EFAULT; -+ break; -+ } -+ pe_image->size = load_driver->sys_files[i].size; -+ driver->num_pe_images++; -+ } -+ -+ if (!err && link_pe_images(driver->pe_images, driver->num_pe_images)) { -+ ERROR("couldn't prepare driver '%s'", load_driver->name); -+ err = -EINVAL; -+ } -+ -+ if (driver->num_pe_images < load_driver->num_sys_files || err) { -+ for (i = 0; i < driver->num_pe_images; i++) -+ if (driver->pe_images[i].image) -+ vfree(driver->pe_images[i].image); -+ driver->num_pe_images = 0; -+ EXIT1(return err); -+ } else -+ EXIT1(return 0); -+} -+ -+struct wrap_bin_file *get_bin_file(char *bin_file_name) -+{ -+ int i = 0; -+ struct wrap_driver *driver, *cur; -+ -+ ENTER1("%s", bin_file_name); -+ mutex_lock(&loader_mutex); -+ driver = NULL; -+ nt_list_for_each_entry(cur, &wrap_drivers, list) { -+ for (i = 0; i < cur->num_bin_files; i++) -+ if (!stricmp(cur->bin_files[i].name, bin_file_name)) { -+ driver = cur; -+ break; -+ } -+ if (driver) -+ break; -+ } -+ mutex_unlock(&loader_mutex); -+ if (!driver) { -+ TRACE1("couldn't find bin file '%s'", bin_file_name); -+ return NULL; -+ } -+ -+ if (!driver->bin_files[i].data) { -+ char *argv[] = {"loadndisdriver", WRAP_CMD_LOAD_BIN_FILE, -+#if DEBUG >= 1 -+ "1", -+#else -+ "0", -+#endif -+ UTILS_VERSION, driver->name, -+ driver->bin_files[i].name, NULL}; -+ char *env[] = {NULL}; -+ int ret; -+ -+ TRACE1("loading bin file %s/%s", driver->name, -+ driver->bin_files[i].name); -+ mutex_lock(&loader_mutex); -+ reinit_completion(&loader_complete); -+ ret = call_usermodehelper("/sbin/loadndisdriver", argv, env, -+ UMH_WAIT_PROC); -+ if (ret) { -+ mutex_unlock(&loader_mutex); -+ ERROR("couldn't load file %s/%s; check system log " -+ "for messages from 'loadndisdriver' (%d)", -+ driver->name, driver->bin_files[i].name, ret); -+ EXIT1(return NULL); -+ } -+ wait_for_completion(&loader_complete); -+ mutex_unlock(&loader_mutex); -+ if (!driver->bin_files[i].data) { -+ WARNING("couldn't load binary file %s", -+ driver->bin_files[i].name); -+ EXIT1(return NULL); -+ } -+ } -+ EXIT2(return &(driver->bin_files[i])); -+} -+ -+/* called with loader_mutex down */ -+static int add_bin_file(struct load_driver_file *driver_file) -+{ -+ struct wrap_driver *driver, *cur; -+ struct wrap_bin_file *bin_file; -+ int i = 0; -+ -+ driver = NULL; -+ nt_list_for_each_entry(cur, &wrap_drivers, list) { -+ for (i = 0; i < cur->num_bin_files; i++) -+ if (!stricmp(cur->bin_files[i].name, -+ driver_file->name)) { -+ driver = cur; -+ break; -+ } -+ if (driver) -+ break; -+ } -+ if (!driver) { -+ ERROR("couldn't find %s", driver_file->name); -+ return -EINVAL; -+ } -+ bin_file = &driver->bin_files[i]; -+ strncpy(bin_file->name, driver_file->name, sizeof(bin_file->name)); -+ bin_file->name[sizeof(bin_file->name)-1] = 0; -+ bin_file->data = vmalloc(driver_file->size); -+ if (!bin_file->data) { -+ ERROR("couldn't allocate memory"); -+ return -ENOMEM; -+ } -+ bin_file->size = driver_file->size; -+ if (copy_from_user(bin_file->data, driver_file->data, bin_file->size)) { -+ ERROR("couldn't copy data"); -+ free_bin_file(bin_file); -+ return -EFAULT; -+ } -+ return 0; -+} -+ -+void free_bin_file(struct wrap_bin_file *bin_file) -+{ -+ TRACE2("unloading %s", bin_file->name); -+ if (bin_file->data) -+ vfree(bin_file->data); -+ bin_file->data = NULL; -+ bin_file->size = 0; -+ EXIT2(return); -+} -+ -+/* load firmware files from userspace */ -+static int load_bin_files_info(struct wrap_driver *driver, -+ struct load_driver *load_driver) -+{ -+ struct wrap_bin_file *bin_files; -+ int i; -+ -+ ENTER1("%s, %d", load_driver->name, load_driver->num_bin_files); -+ driver->num_bin_files = 0; -+ driver->bin_files = NULL; -+ if (load_driver->num_bin_files == 0) -+ EXIT1(return 0); -+ bin_files = kzalloc(load_driver->num_bin_files * sizeof(*bin_files), -+ GFP_KERNEL); -+ if (!bin_files) { -+ ERROR("couldn't allocate memory"); -+ EXIT1(return -ENOMEM); -+ } -+ -+ for (i = 0; i < load_driver->num_bin_files; i++) { -+ strncpy(bin_files[i].name, load_driver->bin_files[i].name, -+ sizeof(bin_files[i].name)); -+ bin_files[i].name[sizeof(bin_files[i].name)-1] = 0; -+ TRACE2("loaded bin file %s", bin_files[i].name); -+ } -+ driver->num_bin_files = load_driver->num_bin_files; -+ driver->bin_files = bin_files; -+ EXIT1(return 0); -+} -+ -+/* load settings for a device. called with loader_mutex down */ -+static int load_settings(struct wrap_driver *wrap_driver, -+ struct load_driver *load_driver) -+{ -+ int i, num_settings; -+ -+ ENTER1("%p, %p", wrap_driver, load_driver); -+ -+ num_settings = 0; -+ for (i = 0; i < load_driver->num_settings; i++) { -+ struct load_device_setting *load_setting = -+ &load_driver->settings[i]; -+ struct wrap_device_setting *setting; -+ ULONG data1; -+ -+ setting = kzalloc(sizeof(*setting), GFP_KERNEL); -+ if (!setting) { -+ ERROR("couldn't allocate memory"); -+ break; -+ } -+ strncpy(setting->name, load_setting->name, -+ sizeof(setting->name)); -+ setting->name[sizeof(setting->name)-1] = 0; -+ strncpy(setting->value, load_setting->value, -+ sizeof(setting->value)); -+ setting->value[sizeof(setting->value)-1] = 0; -+ TRACE2("%p: %s=%s", setting, setting->name, setting->value); -+ -+ if (strcmp(setting->name, "driver_version") == 0) { -+ strncpy(wrap_driver->version, setting->value, -+ sizeof(wrap_driver->version)); -+ wrap_driver->version[sizeof(wrap_driver->version)-1] = 0; -+ } else if (strcmp(setting->name, "class_guid") == 0 && -+ sscanf(setting->value, "%x", &data1) == 1) { -+ wrap_driver->dev_type = wrap_device_type(data1); -+ if (wrap_driver->dev_type < 0) { -+ WARNING("unknown guid: %x", data1); -+ wrap_driver->dev_type = 0; -+ } -+ } -+ InsertTailList(&wrap_driver->settings, &setting->list); -+ num_settings++; -+ } -+ /* it is not a fatal error if some settings couldn't be loaded */ -+ if (num_settings > 0) -+ EXIT1(return 0); -+ else -+ EXIT1(return -EINVAL); -+} -+ -+void unload_wrap_device(struct wrap_device *wd) -+{ -+ struct nt_list *cur; -+ ENTER1("unloading device %p (%04X:%04X:%04X:%04X), driver %s", wd, -+ wd->vendor, wd->device, wd->subvendor, wd->subdevice, -+ wd->driver_name); -+ mutex_lock(&loader_mutex); -+ while ((cur = RemoveHeadList(&wd->settings))) { -+ struct wrap_device_setting *setting; -+ setting = container_of(cur, struct wrap_device_setting, list); -+ kfree(setting); -+ } -+ RemoveEntryList(&wd->list); -+ mutex_unlock(&loader_mutex); -+ kfree(wd); -+ EXIT1(return); -+} -+ -+/* should be called with loader_mutex down */ -+void unload_wrap_driver(struct wrap_driver *driver) -+{ -+ int i; -+ struct driver_object *drv_obj; -+ struct nt_list *cur, *next; -+ -+ ENTER1("unloading driver: %s (%p)", driver->name, driver); -+ TRACE1("freeing %d images", driver->num_pe_images); -+ drv_obj = driver->drv_obj; -+ for (i = 0; i < driver->num_pe_images; i++) -+ if (driver->pe_images[i].image) { -+ TRACE1("freeing image at %p", -+ driver->pe_images[i].image); -+ vfree(driver->pe_images[i].image); -+ } -+ -+ TRACE1("freeing %d bin files", driver->num_bin_files); -+ for (i = 0; i < driver->num_bin_files; i++) { -+ TRACE1("freeing image at %p", driver->bin_files[i].data); -+ if (driver->bin_files[i].data) -+ vfree(driver->bin_files[i].data); -+ } -+ kfree(driver->bin_files); -+ RtlFreeUnicodeString(&drv_obj->name); -+ RemoveEntryList(&driver->list); -+ nt_list_for_each_safe(cur, next, &driver->settings) { -+ struct wrap_device_setting *setting; -+ struct ndis_configuration_parameter *param; -+ -+ setting = container_of(cur, struct wrap_device_setting, list); -+ TRACE2("%p", setting); -+ param = setting->encoded; -+ if (param) { -+ TRACE2("%p", param); -+ if (param->type == NdisParameterString) -+ RtlFreeUnicodeString(¶m->data.string); -+ ExFreePool(param); -+ } -+ kfree(setting); -+ } -+ /* this frees driver */ -+ free_custom_extensions(drv_obj->drv_ext); -+ kfree(drv_obj->drv_ext); -+ TRACE1("drv_obj: %p", drv_obj); -+ -+ EXIT1(return); -+} -+ -+/* call the entry point of the driver */ -+static int start_wrap_driver(struct wrap_driver *driver) -+{ -+ int i; -+ NTSTATUS ret, res; -+ struct driver_object *drv_obj; -+ typeof(driver->pe_images[0].entry) entry; -+ -+ ENTER1("%s", driver->name); -+ drv_obj = driver->drv_obj; -+ for (ret = res = 0, i = 0; i < driver->num_pe_images; i++) -+ /* dlls are already started by loader */ -+ if (driver->pe_images[i].type == IMAGE_FILE_EXECUTABLE_IMAGE) { -+ entry = driver->pe_images[i].entry; -+ drv_obj->start = driver->pe_images[i].entry; -+ drv_obj->driver_size = driver->pe_images[i].size; -+ TRACE1("entry: %p, %p, drv_obj: %p", -+ entry, *entry, drv_obj); -+ res = LIN2WIN2(entry, drv_obj, &drv_obj->name); -+ ret |= res; -+ TRACE1("entry returns %08X", res); -+ break; -+ } -+ if (ret) { -+ ERROR("driver initialization failed: %08X", ret); -+ RtlFreeUnicodeString(&drv_obj->name); -+ /* this frees ndis_driver */ -+ free_custom_extensions(drv_obj->drv_ext); -+ kfree(drv_obj->drv_ext); -+ TRACE1("drv_obj: %p", drv_obj); -+ ObDereferenceObject(drv_obj); -+ EXIT1(return -EINVAL); -+ } -+ EXIT1(return 0); -+} -+ -+/* -+ * add driver to list of loaded driver but make sure this driver is -+ * not loaded before. called with loader_mutex down -+ */ -+static int add_wrap_driver(struct wrap_driver *driver) -+{ -+ struct wrap_driver *tmp; -+ -+ ENTER1("name: %s", driver->name); -+ nt_list_for_each_entry(tmp, &wrap_drivers, list) { -+ if (stricmp(tmp->name, driver->name) == 0) { -+ ERROR("cannot add duplicate driver"); -+ EXIT1(return -EBUSY); -+ } -+ } -+ InsertHeadList(&wrap_drivers, &driver->list); -+ EXIT1(return 0); -+} -+ -+/* load a driver from userspace and initialize it. called with -+ * loader_mutex down */ -+static int load_user_space_driver(struct load_driver *load_driver) -+{ -+ struct driver_object *drv_obj; -+ struct ansi_string ansi_reg; -+ struct wrap_driver *wrap_driver = NULL; -+ -+ ENTER1("%p", load_driver); -+ drv_obj = allocate_object(sizeof(*drv_obj), OBJECT_TYPE_DRIVER, NULL); -+ if (!drv_obj) { -+ ERROR("couldn't allocate memory"); -+ EXIT1(return -ENOMEM); -+ } -+ TRACE1("drv_obj: %p", drv_obj); -+ drv_obj->drv_ext = kzalloc(sizeof(*(drv_obj->drv_ext)), GFP_KERNEL); -+ if (!drv_obj->drv_ext) { -+ ERROR("couldn't allocate memory"); -+ ObDereferenceObject(drv_obj); -+ EXIT1(return -ENOMEM); -+ } -+ InitializeListHead(&drv_obj->drv_ext->custom_ext); -+ if (IoAllocateDriverObjectExtension(drv_obj, -+ (void *)WRAP_DRIVER_CLIENT_ID, -+ sizeof(*wrap_driver), -+ (void **)&wrap_driver) != -+ STATUS_SUCCESS) -+ EXIT1(return -ENOMEM); -+ TRACE1("driver: %p", wrap_driver); -+ memset(wrap_driver, 0, sizeof(*wrap_driver)); -+ InitializeListHead(&wrap_driver->list); -+ InitializeListHead(&wrap_driver->settings); -+ wrap_driver->drv_obj = drv_obj; -+ RtlInitAnsiString(&ansi_reg, "/tmp"); -+ if (RtlAnsiStringToUnicodeString(&drv_obj->name, &ansi_reg, TRUE) != -+ STATUS_SUCCESS) { -+ ERROR("couldn't initialize registry path"); -+ free_custom_extensions(drv_obj->drv_ext); -+ kfree(drv_obj->drv_ext); -+ TRACE1("drv_obj: %p", drv_obj); -+ ObDereferenceObject(drv_obj); -+ EXIT1(return -EINVAL); -+ } -+ strncpy(wrap_driver->name, load_driver->name, sizeof(wrap_driver->name)); -+ wrap_driver->name[sizeof(wrap_driver->name)-1] = 0; -+ if (load_sys_files(wrap_driver, load_driver) || -+ load_bin_files_info(wrap_driver, load_driver) || -+ load_settings(wrap_driver, load_driver) || -+ start_wrap_driver(wrap_driver) || -+ add_wrap_driver(wrap_driver)) { -+ unload_wrap_driver(wrap_driver); -+ ObDereferenceObject(drv_obj); -+ EXIT1(return -EINVAL); -+ } else { -+ printk(KERN_INFO "%s: driver %s (%s) loaded\n", -+ DRIVER_NAME, wrap_driver->name, wrap_driver->version); -+ add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE); -+ EXIT1(return 0); -+ } -+} -+ -+static struct pci_device_id wrap_pci_id_table[] = { -+ { -+ .vendor = PCI_ANY_ID, -+ .device = PCI_ANY_ID, -+ .subvendor = PCI_ANY_ID, -+ .subdevice = PCI_ANY_ID, -+ .class = 0, -+ .class_mask = 0, -+ .driver_data = 0 -+ } -+}; -+ -+static struct pci_driver wrap_pci_driver = { -+ .name = DRIVER_NAME, -+ .id_table = wrap_pci_id_table, -+ .probe = wrap_pnp_start_pci_device, -+ .remove = wrap_pnp_remove_pci_device, -+ .suspend = wrap_pnp_suspend_pci_device, -+ .resume = wrap_pnp_resume_pci_device, -+}; -+ -+#ifdef ENABLE_USB -+static struct usb_device_id wrap_usb_id_table[] = { -+ { -+ .driver_info = 1 -+ }, -+}; -+ -+static struct usb_driver wrap_usb_driver = { -+ .name = DRIVER_NAME, -+ .id_table = wrap_usb_id_table, -+ .probe = wrap_pnp_start_usb_device, -+ .disconnect = wrap_pnp_remove_usb_device, -+ .suspend = wrap_pnp_suspend_usb_device, -+ .resume = wrap_pnp_resume_usb_device, -+}; -+#endif -+ -+/* register drivers for pci and usb */ -+static void register_devices(void) -+{ -+ int res; -+ -+ res = pci_register_driver(&wrap_pci_driver); -+ if (res < 0) { -+ ERROR("couldn't register pci driver: %d", res); -+ wrap_pci_driver.name = NULL; -+ } -+ -+#ifdef ENABLE_USB -+ res = usb_register(&wrap_usb_driver); -+ if (res < 0) { -+ ERROR("couldn't register usb driver: %d", res); -+ wrap_usb_driver.name = NULL; -+ } -+#endif -+ EXIT1(return); -+} -+ -+static void unregister_devices(void) -+{ -+ struct nt_list *cur, *next; -+ -+ mutex_lock(&loader_mutex); -+ nt_list_for_each_safe(cur, next, &wrap_devices) { -+ struct wrap_device *wd; -+ wd = container_of(cur, struct wrap_device, list); -+ set_bit(HW_DISABLED, &wd->hw_status); -+ } -+ mutex_unlock(&loader_mutex); -+ -+ if (wrap_pci_driver.name) -+ pci_unregister_driver(&wrap_pci_driver); -+#ifdef ENABLE_USB -+ if (wrap_usb_driver.name) -+ usb_deregister(&wrap_usb_driver); -+#endif -+} -+ -+struct wrap_device *load_wrap_device(struct load_device *load_device) -+{ -+ int ret; -+ struct nt_list *cur; -+ struct wrap_device *wd = NULL; -+ char vendor[5], device[5], subvendor[5], subdevice[5], bus[5]; -+ -+ ENTER1("%04x, %04x, %04x, %04x", load_device->vendor, -+ load_device->device, load_device->subvendor, -+ load_device->subdevice); -+ if (sprintf(vendor, "%04x", load_device->vendor) == 4 && -+ sprintf(device, "%04x", load_device->device) == 4 && -+ sprintf(subvendor, "%04x", load_device->subvendor) == 4 && -+ sprintf(subdevice, "%04x", load_device->subdevice) == 4 && -+ sprintf(bus, "%04x", load_device->bus) == 4) { -+ char *argv[] = {"loadndisdriver", WRAP_CMD_LOAD_DEVICE, -+#if DEBUG >= 1 -+ "1", -+#else -+ "0", -+#endif -+ UTILS_VERSION, vendor, device, -+ subvendor, subdevice, bus, NULL}; -+ char *env[] = {NULL}; -+ TRACE2("%s, %s, %s, %s, %s", vendor, device, -+ subvendor, subdevice, bus); -+ mutex_lock(&loader_mutex); -+ reinit_completion(&loader_complete); -+ ret = call_usermodehelper("/sbin/loadndisdriver", argv, env, -+ UMH_WAIT_PROC); -+ if (ret) { -+ mutex_unlock(&loader_mutex); -+ TRACE1("couldn't load device %04x:%04x; check system " -+ "log for messages from 'loadndisdriver'", -+ load_device->vendor, load_device->device); -+ EXIT1(return NULL); -+ } -+ wait_for_completion(&loader_complete); -+ wd = NULL; -+ nt_list_for_each(cur, &wrap_devices) { -+ wd = container_of(cur, struct wrap_device, list); -+ TRACE2("%p, %04x, %04x, %04x, %04x", wd, wd->vendor, -+ wd->device, wd->subvendor, wd->subdevice); -+ if (wd->vendor == load_device->vendor && -+ wd->device == load_device->device) -+ break; -+ else -+ wd = NULL; -+ } -+ mutex_unlock(&loader_mutex); -+ } else -+ wd = NULL; -+ EXIT1(return wd); -+} -+ -+struct wrap_device *get_wrap_device(void *dev, int bus) -+{ -+ struct nt_list *cur; -+ struct wrap_device *wd; -+ -+ mutex_lock(&loader_mutex); -+ wd = NULL; -+ nt_list_for_each(cur, &wrap_devices) { -+ wd = container_of(cur, struct wrap_device, list); -+ if (bus == WRAP_PCI_BUS && -+ wrap_is_pci_bus(wd->dev_bus) && wd->pci.pdev == dev) -+ break; -+ else if (bus == WRAP_USB_BUS && -+ wrap_is_usb_bus(wd->dev_bus) && wd->usb.udev == dev) -+ break; -+ else -+ wd = NULL; -+ } -+ mutex_unlock(&loader_mutex); -+ return wd; -+} -+ -+/* called with loader_mutex is down */ -+static long wrapper_ioctl(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ struct load_driver *load_driver; -+ struct load_device load_device; -+ struct load_driver_file load_bin_file; -+ int ret; -+ void __user *addr = (void __user *)arg; -+ -+ ENTER1("cmd: 0x%x", cmd); -+ -+ ret = 0; -+ switch (cmd) { -+ case WRAP_IOCTL_LOAD_DEVICE: -+ if (copy_from_user(&load_device, addr, sizeof(load_device))) { -+ ret = -EFAULT; -+ break; -+ } -+ TRACE2("%04x, %04x, %04x, %04x", load_device.vendor, -+ load_device.device, load_device.subvendor, -+ load_device.subdevice); -+ if (load_device.vendor) { -+ struct wrap_device *wd; -+ wd = kzalloc(sizeof(*wd), GFP_KERNEL); -+ if (!wd) { -+ ret = -ENOMEM; -+ break; -+ } -+ InitializeListHead(&wd->settings); -+ wd->dev_bus = WRAP_BUS(load_device.bus); -+ wd->vendor = load_device.vendor; -+ wd->device = load_device.device; -+ wd->subvendor = load_device.subvendor; -+ wd->subdevice = load_device.subdevice; -+ strncpy(wd->conf_file_name, load_device.conf_file_name, -+ sizeof(wd->conf_file_name)); -+ wd->conf_file_name[sizeof(wd->conf_file_name)-1] = 0; -+ strncpy(wd->driver_name, load_device.driver_name, -+ sizeof(wd->driver_name)); -+ wd->driver_name[sizeof(wd->driver_name)-1] = 0; -+ InsertHeadList(&wrap_devices, &wd->list); -+ ret = 0; -+ } else -+ ret = -EINVAL; -+ break; -+ case WRAP_IOCTL_LOAD_DRIVER: -+ TRACE1("loading driver at %p", addr); -+ load_driver = vmalloc(sizeof(*load_driver)); -+ if (!load_driver) { -+ ret = -ENOMEM; -+ break; -+ } -+ if (copy_from_user(load_driver, addr, sizeof(*load_driver))) -+ ret = -EFAULT; -+ else -+ ret = load_user_space_driver(load_driver); -+ vfree(load_driver); -+ break; -+ case WRAP_IOCTL_LOAD_BIN_FILE: -+ if (copy_from_user(&load_bin_file, addr, sizeof(load_bin_file))) -+ ret = -EFAULT; -+ else -+ ret = add_bin_file(&load_bin_file); -+ break; -+ default: -+ ERROR("unknown ioctl 0x%x", cmd); -+ ret = -EINVAL; -+ break; -+ } -+ complete(&loader_complete); -+ EXIT1(return ret); -+} -+ -+#ifdef CONFIG_COMPAT -+static int copy_load_driver_file32(struct load_driver_file *k, -+ struct load_driver_file32 __user *u) -+{ -+ u32 data; -+ -+ if (copy_from_user(&k->driver_name, &u->driver_name, -+ sizeof(u->driver_name) + sizeof(u->name))) -+ return -EFAULT; -+ -+ if (get_user(k->size, &u->size)) -+ return -EFAULT; -+ if (get_user(data, &u->data)) -+ return -EFAULT; -+ -+ k->data = (void __user *)(unsigned long)data; -+ return 0; -+} -+ -+static int copy_load_driver32(struct load_driver *k, -+ struct load_driver32 __user *u) -+{ -+ int i; -+ -+ if (copy_from_user(&k->name, &u->name, -+ sizeof(u->name) + sizeof(u->conf_file_name))) -+ return -EFAULT; -+ -+ if (get_user(k->num_sys_files, &u->num_sys_files)) -+ return -EFAULT; -+ -+ for (i = 0; i < k->num_sys_files; i++) -+ if (copy_load_driver_file32(&k->sys_files[i], &u->sys_files[i])) -+ return -EFAULT; -+ -+ if (get_user(k->num_settings, &u->num_settings)) -+ return -EFAULT; -+ -+ if (copy_from_user(&k->settings, &u->settings, -+ sizeof(u->settings[0]) * k->num_settings)) -+ return -EFAULT; -+ -+ if (get_user(k->num_bin_files, &u->num_bin_files)) -+ return -EFAULT; -+ -+ for (i = 0; i < k->num_bin_files; i++) -+ if (copy_load_driver_file32(&k->bin_files[i], &u->bin_files[i])) -+ return -EFAULT; -+ -+ return 0; -+} -+ -+static long wrapper_ioctl_compat(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ int ret = 0; -+ void __user *addr = (void __user *)arg; -+ struct load_driver *kdriver; -+ struct load_driver32 __user *udriver = addr; -+ struct load_driver_file kfile; -+ struct load_driver_file32 __user *ufile = addr; -+ -+ ENTER1("cmd: 0x%x", cmd); -+ -+ switch (cmd) { -+ case WRAP_IOCTL_LOAD_DEVICE32: -+ return wrapper_ioctl(file, WRAP_IOCTL_LOAD_DEVICE, arg); -+ case WRAP_IOCTL_LOAD_DRIVER32: -+ TRACE1("loading driver at %p", addr); -+ kdriver = vmalloc(sizeof(*kdriver)); -+ if (!kdriver) { -+ ret = -ENOMEM; -+ break; -+ } -+ -+ ret = copy_load_driver32(kdriver, udriver); -+ if (!ret) -+ ret = load_user_space_driver(kdriver); -+ -+ vfree(kdriver); -+ break; -+ case WRAP_IOCTL_LOAD_BIN_FILE32: -+ ret = copy_load_driver_file32(&kfile, ufile); -+ if (ret) -+ break; -+ -+ ret = add_bin_file(&kfile); -+ break; -+ default: -+ ERROR("unknown ioctl 0x%x", cmd); -+ ret = -EINVAL; -+ break; -+ } -+ complete(&loader_complete); -+ EXIT1(return ret); -+} -+#endif -+ -+static int wrapper_ioctl_release(struct inode *inode, struct file *file) -+{ -+ ENTER1(""); -+ complete(&loader_complete); -+ return 0; -+} -+ -+static struct file_operations wrapper_fops = { -+ .owner = THIS_MODULE, -+ .unlocked_ioctl = wrapper_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = wrapper_ioctl_compat, -+#endif -+ .release = wrapper_ioctl_release, -+}; -+ -+static struct miscdevice wrapper_misc = { -+ .name = DRIVER_NAME, -+ .minor = MISC_DYNAMIC_MINOR, -+ .fops = &wrapper_fops -+}; -+ -+int loader_init(void) -+{ -+ int err; -+ -+ InitializeListHead(&wrap_drivers); -+ InitializeListHead(&wrap_devices); -+ mutex_init(&loader_mutex); -+ init_completion(&loader_complete); -+ if ((err = misc_register(&wrapper_misc)) < 0) { -+ ERROR("couldn't register module (%d)", err); -+ unregister_devices(); -+ EXIT1(return err); -+ } -+ register_devices(); -+ EXIT1(return 0); -+} -+ -+void loader_exit(void) -+{ -+ struct nt_list *cur, *next; -+ -+ ENTER1(""); -+ misc_deregister(&wrapper_misc); -+ unregister_devices(); -+ mutex_lock(&loader_mutex); -+ nt_list_for_each_safe(cur, next, &wrap_drivers) { -+ struct wrap_driver *driver; -+ driver = container_of(cur, struct wrap_driver, list); -+ unload_wrap_driver(driver); -+ } -+ mutex_unlock(&loader_mutex); -+ EXIT1(return); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/loader.h linux-5.6.11-ndis/3rdparty/ndiswrapper/loader.h ---- linux-5.6.11/3rdparty/ndiswrapper/loader.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/loader.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,108 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _LOADER_H_ -+#define _LOADER_H_ -+ -+#include "ndiswrapper.h" -+ -+#ifndef __KERNEL__ -+#define __user -+#endif -+ -+struct load_driver_file { -+ char driver_name[MAX_DRIVER_NAME_LEN]; -+ char name[MAX_DRIVER_NAME_LEN]; -+ size_t size; -+ void __user *data; -+}; -+ -+struct load_device_setting { -+ char name[MAX_SETTING_NAME_LEN]; -+ char value[MAX_SETTING_VALUE_LEN]; -+}; -+ -+struct load_device { -+ int bus; -+ int vendor; -+ int device; -+ int subvendor; -+ int subdevice; -+ char conf_file_name[MAX_DRIVER_NAME_LEN]; -+ char driver_name[MAX_DRIVER_NAME_LEN]; -+}; -+ -+struct load_driver { -+ char name[MAX_DRIVER_NAME_LEN]; -+ char conf_file_name[MAX_DRIVER_NAME_LEN]; -+ unsigned int num_sys_files; -+ struct load_driver_file sys_files[MAX_DRIVER_PE_IMAGES]; -+ unsigned int num_settings; -+ struct load_device_setting settings[MAX_DEVICE_SETTINGS]; -+ unsigned int num_bin_files; -+ struct load_driver_file bin_files[MAX_DRIVER_BIN_FILES]; -+}; -+ -+#define WRAP_IOCTL_LOAD_DEVICE _IOW(('N' + 'd' + 'i' + 'S'), 0, \ -+ struct load_device *) -+#define WRAP_IOCTL_LOAD_DRIVER _IOW(('N' + 'd' + 'i' + 'S'), 1, \ -+ struct load_driver *) -+#define WRAP_IOCTL_LOAD_BIN_FILE _IOW(('N' + 'd' + 'i' + 'S'), 2, \ -+ struct load_driver_file *) -+ -+#ifdef CONFIG_COMPAT -+struct load_driver_file32 { -+ char driver_name[MAX_DRIVER_NAME_LEN]; -+ char name[MAX_DRIVER_NAME_LEN]; -+ u32 size; -+ u32 data; -+}; -+ -+struct load_driver32 { -+ char name[MAX_DRIVER_NAME_LEN]; -+ char conf_file_name[MAX_DRIVER_NAME_LEN]; -+ u32 num_sys_files; -+ struct load_driver_file32 sys_files[MAX_DRIVER_PE_IMAGES]; -+ u32 num_settings; -+ struct load_device_setting settings[MAX_DEVICE_SETTINGS]; -+ u32 num_bin_files; -+ struct load_driver_file32 bin_files[MAX_DRIVER_BIN_FILES]; -+} __packed; -+ -+#define WRAP_IOCTL_LOAD_DEVICE32 _IOW(('N' + 'd' + 'i' + 'S'), 0, u32) -+#define WRAP_IOCTL_LOAD_DRIVER32 _IOW(('N' + 'd' + 'i' + 'S'), 1, u32) -+#define WRAP_IOCTL_LOAD_BIN_FILE32 _IOW(('N' + 'd' + 'i' + 'S'), 2, u32) -+#endif -+ -+#define WRAP_CMD_LOAD_DEVICE "load_device" -+#define WRAP_CMD_LOAD_DRIVER "load_driver" -+#define WRAP_CMD_LOAD_BIN_FILE "load_bin_file" -+ -+int loader_init(void); -+void loader_exit(void); -+ -+#ifdef __KERNEL__ -+struct wrap_device *load_wrap_device(struct load_device *load_device); -+struct wrap_driver *load_wrap_driver(struct wrap_device *device); -+struct wrap_bin_file *get_bin_file(char *bin_file_name); -+void free_bin_file(struct wrap_bin_file *bin_file); -+void unload_wrap_driver(struct wrap_driver *driver); -+void unload_wrap_device(struct wrap_device *wd); -+struct wrap_device *get_wrap_device(void *dev, int bus_type); -+ -+extern struct mutex loader_mutex; -+#endif -+ -+#endif /* LOADER_H */ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/longlong.h linux-5.6.11-ndis/3rdparty/ndiswrapper/longlong.h ---- linux-5.6.11/3rdparty/ndiswrapper/longlong.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/longlong.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1333 @@ -+/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. -+ Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000 -+ Free Software Foundation, Inc. -+ -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* You have to define the following before including this file: -+ -+ UWtype -- An unsigned type, default type for operations (typically a "word") -+ UHWtype -- An unsigned type, at least half the size of UWtype. -+ UDWtype -- An unsigned type, at least twice as large a UWtype -+ W_TYPE_SIZE -- size in bits of UWtype -+ -+ UQItype -- Unsigned 8 bit type. -+ SItype, USItype -- Signed and unsigned 32 bit types. -+ DItype, UDItype -- Signed and unsigned 64 bit types. -+ -+ On a 32 bit machine UWtype should typically be USItype; -+ on a 64 bit machine, UWtype should typically be UDItype. -+*/ -+ -+#define __BITS4 (W_TYPE_SIZE / 4) -+#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) -+#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) -+#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) -+ -+#ifndef W_TYPE_SIZE -+#define W_TYPE_SIZE 32 -+#define UWtype USItype -+#define UHWtype USItype -+#define UDWtype UDItype -+#endif -+ -+/* Define auxiliary asm macros. -+ -+ 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two -+ UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype -+ word product in HIGH_PROD and LOW_PROD. -+ -+ 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a -+ UDWtype product. This is just a variant of umul_ppmm. -+ -+ 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, -+ denominator) divides a UDWtype, composed by the UWtype integers -+ HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient -+ in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less -+ than DENOMINATOR for correct operation. If, in addition, the most -+ significant bit of DENOMINATOR must be 1, then the pre-processor symbol -+ UDIV_NEEDS_NORMALIZATION is defined to 1. -+ -+ 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, -+ denominator). Like udiv_qrnnd but the numbers are signed. The quotient -+ is rounded towards 0. -+ -+ 5) count_leading_zeros(count, x) counts the number of zero-bits from the -+ msb to the first nonzero bit in the UWtype X. This is the number of -+ steps X needs to be shifted left to set the msb. Undefined for X == 0, -+ unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. -+ -+ 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts -+ from the least significant end. -+ -+ 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, -+ high_addend_2, low_addend_2) adds two UWtype integers, composed by -+ HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 -+ respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow -+ (i.e. carry out) is not stored anywhere, and is lost. -+ -+ 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, -+ high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, -+ composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and -+ LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE -+ and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, -+ and is lost. -+ -+ If any of these macros are left undefined for a particular CPU, -+ C macros are used. */ -+ -+/* The CPUs come in alphabetical order below. -+ -+ Please add support for more CPUs here, or improve the current support -+ for the CPUs below! -+ (E.g. WE32100, IBM360.) */ -+ -+#if defined (__GNUC__) && !defined (NO_ASM) -+ -+/* We sometimes need to clobber "cc" with gcc2, but that would not be -+ understood by gcc1. Use cpp to avoid major code duplication. */ -+#if __GNUC__ < 2 -+#define __CLOBBER_CC -+#define __AND_CLOBBER_CC -+#else /* __GNUC__ >= 2 */ -+#define __CLOBBER_CC : "cc" -+#define __AND_CLOBBER_CC , "cc" -+#endif /* __GNUC__ < 2 */ -+ -+#if defined (__alpha) && W_TYPE_SIZE == 64 -+#define umul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ UDItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("umulh %r1,%2,%0" \ -+ : "=r" ((UDItype) ph) \ -+ : "%rJ" (__m0), \ -+ "rI" (__m1)); \ -+ (pl) = __m0 * __m1; \ -+ } while (0) -+#define UMUL_TIME 46 -+#ifndef LONGLONG_STANDALONE -+#define udiv_qrnnd(q, r, n1, n0, d) \ -+ do { UDItype __r; \ -+ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ -+ (r) = __r; \ -+ } while (0) -+extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); -+#define UDIV_TIME 220 -+#endif /* LONGLONG_STANDALONE */ -+#ifdef __alpha_cix__ -+#define count_leading_zeros(COUNT,X) \ -+ __asm__("ctlz %1,%0" : "=r"(COUNT) : "r"(X)) -+#define count_trailing_zeros(COUNT,X) \ -+ __asm__("cttz %1,%0" : "=r"(COUNT) : "r"(X)) -+#define COUNT_LEADING_ZEROS_0 64 -+#else -+extern const UQItype __clz_tab[]; -+#define count_leading_zeros(COUNT,X) \ -+ do { \ -+ UDItype __xr = (X), __t, __a; \ -+ __asm__("cmpbge $31,%1,%0" : "=r"(__t) : "r"(__xr)); \ -+ __a = __clz_tab[__t ^ 0xff] - 1; \ -+ __asm__("extbl %1,%2,%0" : "=r"(__t) : "r"(__xr), "r"(__a)); \ -+ (COUNT) = 64 - (__clz_tab[__t] + __a*8); \ -+ } while (0) -+#define count_trailing_zeros(COUNT,X) \ -+ do { \ -+ UDItype __xr = (X), __t, __a; \ -+ __asm__("cmpbge $31,%1,%0" : "=r"(__t) : "r"(__xr)); \ -+ __t = ~__t & -~__t; \ -+ __a = ((__t & 0xCC) != 0) * 2; \ -+ __a += ((__t & 0xF0) != 0) * 4; \ -+ __a += ((__t & 0xAA) != 0); \ -+ __asm__("extbl %1,%2,%0" : "=r"(__t) : "r"(__xr), "r"(__a)); \ -+ __a <<= 3; \ -+ __t &= -__t; \ -+ __a += ((__t & 0xCC) != 0) * 2; \ -+ __a += ((__t & 0xF0) != 0) * 4; \ -+ __a += ((__t & 0xAA) != 0); \ -+ (COUNT) = __a; \ -+ } while (0) -+#endif /* __alpha_cix__ */ -+#endif /* __alpha */ -+ -+#if defined (__arc__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%r" ((USItype) (ah)), \ -+ "rIJ" ((USItype) (bh)), \ -+ "%r" ((USItype) (al)), \ -+ "rIJ" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "r" ((USItype) (ah)), \ -+ "rIJ" ((USItype) (bh)), \ -+ "r" ((USItype) (al)), \ -+ "rIJ" ((USItype) (bl))) -+/* Call libgcc routine. */ -+#define umul_ppmm(w1, w0, u, v) \ -+do { \ -+ DWunion __w; \ -+ __w.ll = __umulsidi3 (u, v); \ -+ w1 = __w.s.high; \ -+ w0 = __w.s.low; \ -+} while (0) -+#define __umulsidi3 __umulsidi3 -+UDItype __umulsidi3 (USItype, USItype); -+#endif -+ -+#if defined (__arm__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%r" ((USItype) (ah)), \ -+ "rI" ((USItype) (bh)), \ -+ "%r" ((USItype) (al)), \ -+ "rI" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "r" ((USItype) (ah)), \ -+ "rI" ((USItype) (bh)), \ -+ "r" ((USItype) (al)), \ -+ "rI" ((USItype) (bl))) -+#define umul_ppmm(xh, xl, a, b) \ -+{register USItype __t0, __t1, __t2; \ -+ __asm__ ("%@ Inlined umul_ppmm\n" \ -+ " mov %2, %5, lsr #16\n" \ -+ " mov %0, %6, lsr #16\n" \ -+ " bic %3, %5, %2, lsl #16\n" \ -+ " bic %4, %6, %0, lsl #16\n" \ -+ " mul %1, %3, %4\n" \ -+ " mul %4, %2, %4\n" \ -+ " mul %3, %0, %3\n" \ -+ " mul %0, %2, %0\n" \ -+ " adds %3, %4, %3\n" \ -+ " addcs %0, %0, #65536\n" \ -+ " adds %1, %1, %3, lsl #16\n" \ -+ " adc %0, %0, %3, lsr #16" \ -+ : "=&r" ((USItype) (xh)), \ -+ "=r" ((USItype) (xl)), \ -+ "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \ -+ : "r" ((USItype) (a)), \ -+ "r" ((USItype) (b)));} -+#define UMUL_TIME 20 -+#define UDIV_TIME 100 -+#endif /* __arm__ */ -+ -+#if defined (__hppa) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%rM" ((USItype) (ah)), \ -+ "rM" ((USItype) (bh)), \ -+ "%rM" ((USItype) (al)), \ -+ "rM" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "rM" ((USItype) (ah)), \ -+ "rM" ((USItype) (bh)), \ -+ "rM" ((USItype) (al)), \ -+ "rM" ((USItype) (bl))) -+#if defined (_PA_RISC1_1) -+#define umul_ppmm(w1, w0, u, v) \ -+ do { \ -+ union \ -+ { \ -+ UDItype __f; \ -+ struct {USItype __w1, __w0;} __w1w0; \ -+ } __t; \ -+ __asm__ ("xmpyu %1,%2,%0" \ -+ : "=x" (__t.__f) \ -+ : "x" ((USItype) (u)), \ -+ "x" ((USItype) (v))); \ -+ (w1) = __t.__w1w0.__w1; \ -+ (w0) = __t.__w1w0.__w0; \ -+ } while (0) -+#define UMUL_TIME 8 -+#else -+#define UMUL_TIME 30 -+#endif -+#define UDIV_TIME 40 -+#define count_leading_zeros(count, x) \ -+ do { \ -+ USItype __tmp; \ -+ __asm__ ( \ -+ "ldi 1,%0\n" \ -+" extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ -+" extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n"\ -+" ldo 16(%0),%0 ; Yes. Perform add.\n" \ -+" extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ -+" extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n"\ -+" ldo 8(%0),%0 ; Yes. Perform add.\n" \ -+" extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ -+" extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n"\ -+" ldo 4(%0),%0 ; Yes. Perform add.\n" \ -+" extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ -+" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\ -+" ldo 2(%0),%0 ; Yes. Perform add.\n" \ -+" extru %1,30,1,%1 ; Extract bit 1.\n" \ -+" sub %0,%1,%0 ; Subtract it.\n" \ -+ : "=r" (count), "=r" (__tmp) : "1" (x)); \ -+ } while (0) -+#endif -+ -+#if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32 -+#define umul_ppmm(xh, xl, m0, m1) \ -+ do { \ -+ union {UDItype __ll; \ -+ struct {USItype __h, __l;} __i; \ -+ } __xx; \ -+ USItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mr %0,%3" \ -+ : "=r" (__xx.__i.__h), \ -+ "=r" (__xx.__i.__l) \ -+ : "%1" (__m0), \ -+ "r" (__m1)); \ -+ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ -+ (xh) += ((((SItype) __m0 >> 31) & __m1) \ -+ + (((SItype) __m1 >> 31) & __m0)); \ -+ } while (0) -+#define smul_ppmm(xh, xl, m0, m1) \ -+ do { \ -+ union {DItype __ll; \ -+ struct {USItype __h, __l;} __i; \ -+ } __xx; \ -+ __asm__ ("mr %0,%3" \ -+ : "=r" (__xx.__i.__h), \ -+ "=r" (__xx.__i.__l) \ -+ : "%1" (m0), \ -+ "r" (m1)); \ -+ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ -+ } while (0) -+#define sdiv_qrnnd(q, r, n1, n0, d) \ -+ do { \ -+ union {DItype __ll; \ -+ struct {USItype __h, __l;} __i; \ -+ } __xx; \ -+ __xx.__i.__h = n1; __xx.__i.__l = n0; \ -+ __asm__ ("dr %0,%2" \ -+ : "=r" (__xx.__ll) \ -+ : "0" (__xx.__ll), "r" (d)); \ -+ (q) = __xx.__i.__l; (r) = __xx.__i.__h; \ -+ } while (0) -+#endif -+ -+#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("addl %5,%1\n\tadcl %3,%0" \ -+ : "=r" (sh), \ -+ "=&r" (sl) \ -+ : "%0" ((USItype) (ah)), \ -+ "g" ((USItype) (bh)), \ -+ "%1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subl %5,%1\n\tsbbl %3,%0" \ -+ : "=r" (sh), \ -+ "=&r" (sl) \ -+ : "0" ((USItype) (ah)), \ -+ "g" ((USItype) (bh)), \ -+ "1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("mull %3" \ -+ : "=a" (w0), \ -+ "=d" (w1) \ -+ : "%0" ((USItype) (u)), \ -+ "rm" ((USItype) (v))) -+#define udiv_qrnnd(q, r, n1, n0, dv) \ -+ __asm__ ("divl %4" \ -+ : "=a" (q), \ -+ "=d" (r) \ -+ : "0" ((USItype) (n0)), \ -+ "1" ((USItype) (n1)), \ -+ "rm" ((USItype) (dv))) -+#define count_leading_zeros(count, x) \ -+ do { \ -+ USItype __cbtmp; \ -+ __asm__ ("bsrl %1,%0" \ -+ : "=r" (__cbtmp) : "rm" ((USItype) (x))); \ -+ (count) = __cbtmp ^ 31; \ -+ } while (0) -+#define count_trailing_zeros(count, x) \ -+ __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x))) -+#define UMUL_TIME 40 -+#define UDIV_TIME 40 -+#endif /* 80x86 */ -+ -+#if defined (__i960__) && W_TYPE_SIZE == 32 -+#define umul_ppmm(w1, w0, u, v) \ -+ ({union {UDItype __ll; \ -+ struct {USItype __l, __h;} __i; \ -+ } __xx; \ -+ __asm__ ("emul %2,%1,%0" \ -+ : "=d" (__xx.__ll) \ -+ : "%dI" ((USItype) (u)), \ -+ "dI" ((USItype) (v))); \ -+ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) -+#define __umulsidi3(u, v) \ -+ ({UDItype __w; \ -+ __asm__ ("emul %2,%1,%0" \ -+ : "=d" (__w) \ -+ : "%dI" ((USItype) (u)), \ -+ "dI" ((USItype) (v))); \ -+ __w; }) -+#endif /* __i960__ */ -+ -+#if defined (__M32R__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ /* The cmp clears the condition bit. */ \ -+ __asm__ ("cmp %0,%0\n\taddx %%5,%1\n\taddx %%3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%0" ((USItype) (ah)), \ -+ "r" ((USItype) (bh)), \ -+ "%1" ((USItype) (al)), \ -+ "r" ((USItype) (bl)) \ -+ : "cbit") -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ /* The cmp clears the condition bit. */ \ -+ __asm__ ("cmp %0,%0\n\tsubx %5,%1\n\tsubx %3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "0" ((USItype) (ah)), \ -+ "r" ((USItype) (bh)), \ -+ "1" ((USItype) (al)), \ -+ "r" ((USItype) (bl)) \ -+ : "cbit") -+#endif /* __M32R__ */ -+ -+#if defined (__mc68000__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \ -+ : "=d" ((USItype) (sh)), \ -+ "=&d" ((USItype) (sl)) \ -+ : "%0" ((USItype) (ah)), \ -+ "d" ((USItype) (bh)), \ -+ "%1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \ -+ : "=d" ((USItype) (sh)), \ -+ "=&d" ((USItype) (sl)) \ -+ : "0" ((USItype) (ah)), \ -+ "d" ((USItype) (bh)), \ -+ "1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+ -+/* The '020, '030, '040 and CPU32 have 32x32->64 and 64/32->32q-32r. */ -+#if defined (__mc68020__) || defined(mc68020) \ -+ || defined(__mc68030__) || defined(mc68030) \ -+ || defined(__mc68040__) || defined(mc68040) \ -+ || defined(__mcpu32__) || defined(mcpu32) -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("mulu%.l %3,%1:%0" \ -+ : "=d" ((USItype) (w0)), \ -+ "=d" ((USItype) (w1)) \ -+ : "%0" ((USItype) (u)), \ -+ "dmi" ((USItype) (v))) -+#define UMUL_TIME 45 -+#define udiv_qrnnd(q, r, n1, n0, d) \ -+ __asm__ ("divu%.l %4,%1:%0" \ -+ : "=d" ((USItype) (q)), \ -+ "=d" ((USItype) (r)) \ -+ : "0" ((USItype) (n0)), \ -+ "1" ((USItype) (n1)), \ -+ "dmi" ((USItype) (d))) -+#define UDIV_TIME 90 -+#define sdiv_qrnnd(q, r, n1, n0, d) \ -+ __asm__ ("divs%.l %4,%1:%0" \ -+ : "=d" ((USItype) (q)), \ -+ "=d" ((USItype) (r)) \ -+ : "0" ((USItype) (n0)), \ -+ "1" ((USItype) (n1)), \ -+ "dmi" ((USItype) (d))) -+ -+#else /* not mc68020 */ -+#if !defined(__mcf5200__) -+/* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */ -+#define umul_ppmm(xh, xl, a, b) \ -+ __asm__ ("| Inlined umul_ppmm\n" \ -+ " move%.l %2,%/d0\n" \ -+ " move%.l %3,%/d1\n" \ -+ " move%.l %/d0,%/d2\n" \ -+ " swap %/d0\n" \ -+ " move%.l %/d1,%/d3\n" \ -+ " swap %/d1\n" \ -+ " move%.w %/d2,%/d4\n" \ -+ " mulu %/d3,%/d4\n" \ -+ " mulu %/d1,%/d2\n" \ -+ " mulu %/d0,%/d3\n" \ -+ " mulu %/d0,%/d1\n" \ -+ " move%.l %/d4,%/d0\n" \ -+ " eor%.w %/d0,%/d0\n" \ -+ " swap %/d0\n" \ -+ " add%.l %/d0,%/d2\n" \ -+ " add%.l %/d3,%/d2\n" \ -+ " jcc 1f\n" \ -+ " add%.l %#65536,%/d1\n" \ -+ "1: swap %/d2\n" \ -+ " moveq %#0,%/d0\n" \ -+ " move%.w %/d2,%/d0\n" \ -+ " move%.w %/d4,%/d2\n" \ -+ " move%.l %/d2,%1\n" \ -+ " add%.l %/d1,%/d0\n" \ -+ " move%.l %/d0,%0" \ -+ : "=g" ((USItype) (xh)), \ -+ "=g" ((USItype) (xl)) \ -+ : "g" ((USItype) (a)), \ -+ "g" ((USItype) (b)) \ -+ : "d0", "d1", "d2", "d3", "d4") -+#define UMUL_TIME 100 -+#define UDIV_TIME 400 -+#endif /* not mcf5200 */ -+#endif /* not mc68020 */ -+ -+/* The '020, '030, '040 and '060 have bitfield insns. */ -+#if defined (__mc68020__) || defined(mc68020) \ -+ || defined(__mc68030__) || defined(mc68030) \ -+ || defined(__mc68040__) || defined(mc68040) \ -+ || defined(__mc68060__) || defined(mc68060) -+#define count_leading_zeros(count, x) \ -+ __asm__ ("bfffo %1{%b2:%b2},%0" \ -+ : "=d" ((USItype) (count)) \ -+ : "od" ((USItype) (x)), "n" (0)) -+#endif -+#endif /* mc68000 */ -+ -+#if defined (__m88000__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%rJ" ((USItype) (ah)), \ -+ "rJ" ((USItype) (bh)), \ -+ "%rJ" ((USItype) (al)), \ -+ "rJ" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "rJ" ((USItype) (ah)), \ -+ "rJ" ((USItype) (bh)), \ -+ "rJ" ((USItype) (al)), \ -+ "rJ" ((USItype) (bl))) -+#define count_leading_zeros(count, x) \ -+ do { \ -+ USItype __cbtmp; \ -+ __asm__ ("ff1 %0,%1" \ -+ : "=r" (__cbtmp) \ -+ : "r" ((USItype) (x))); \ -+ (count) = __cbtmp ^ 31; \ -+ } while (0) -+#define COUNT_LEADING_ZEROS_0 63 /* sic */ -+#if defined (__mc88110__) -+#define umul_ppmm(wh, wl, u, v) \ -+ do { \ -+ union {UDItype __ll; \ -+ struct {USItype __h, __l;} __i; \ -+ } __xx; \ -+ __asm__ ("mulu.d %0,%1,%2" \ -+ : "=r" (__xx.__ll) \ -+ : "r" ((USItype) (u)), \ -+ "r" ((USItype) (v))); \ -+ (wh) = __xx.__i.__h; \ -+ (wl) = __xx.__i.__l; \ -+ } while (0) -+#define udiv_qrnnd(q, r, n1, n0, d) \ -+ ({union {UDItype __ll; \ -+ struct {USItype __h, __l;} __i; \ -+ } __xx; \ -+ USItype __q; \ -+ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ -+ __asm__ ("divu.d %0,%1,%2" \ -+ : "=r" (__q) \ -+ : "r" (__xx.__ll), \ -+ "r" ((USItype) (d))); \ -+ (r) = (n0) - __q * (d); (q) = __q; }) -+#define UMUL_TIME 5 -+#define UDIV_TIME 25 -+#else -+#define UMUL_TIME 17 -+#define UDIV_TIME 150 -+#endif /* __mc88110__ */ -+#endif /* __m88000__ */ -+ -+#if defined (__mips__) && W_TYPE_SIZE == 32 -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("multu %2,%3" \ -+ : "=l" ((USItype) (w0)), \ -+ "=h" ((USItype) (w1)) \ -+ : "d" ((USItype) (u)), \ -+ "d" ((USItype) (v))) -+#define UMUL_TIME 10 -+#define UDIV_TIME 100 -+#endif /* __mips__ */ -+ -+#if defined (__ns32000__) && W_TYPE_SIZE == 32 -+#define umul_ppmm(w1, w0, u, v) \ -+ ({union {UDItype __ll; \ -+ struct {USItype __l, __h;} __i; \ -+ } __xx; \ -+ __asm__ ("meid %2,%0" \ -+ : "=g" (__xx.__ll) \ -+ : "%0" ((USItype) (u)), \ -+ "g" ((USItype) (v))); \ -+ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) -+#define __umulsidi3(u, v) \ -+ ({UDItype __w; \ -+ __asm__ ("meid %2,%0" \ -+ : "=g" (__w) \ -+ : "%0" ((USItype) (u)), \ -+ "g" ((USItype) (v))); \ -+ __w; }) -+#define udiv_qrnnd(q, r, n1, n0, d) \ -+ ({union {UDItype __ll; \ -+ struct {USItype __l, __h;} __i; \ -+ } __xx; \ -+ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ -+ __asm__ ("deid %2,%0" \ -+ : "=g" (__xx.__ll) \ -+ : "0" (__xx.__ll), \ -+ "g" ((USItype) (d))); \ -+ (r) = __xx.__i.__l; (q) = __xx.__i.__h; }) -+#define count_trailing_zeros(count,x) \ -+ do { \ -+ __asm__ ("ffsd %2,%0" \ -+ : "=r" ((USItype) (count)) \ -+ : "0" ((USItype) 0), \ -+ "r" ((USItype) (x))); \ -+ } while (0) -+#endif /* __ns32000__ */ -+ -+/* FIXME: We should test _IBMR2 here when we add assembly support for the -+ system vendor compilers. -+ FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good -+ enough, since that hits ARM and m68k too. */ -+#if (defined (_ARCH_PPC) /* AIX */ \ -+ || defined (_ARCH_PWR) /* AIX */ \ -+ || defined (_ARCH_COM) /* AIX */ \ -+ || defined (__powerpc__) /* gcc */ \ -+ || defined (__POWERPC__) /* BEOS */ \ -+ || defined (__ppc__) /* Darwin */ \ -+ || defined (PPC) /* GNU/Linux, SysV */ \ -+ ) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ if (__builtin_constant_p (bh) && (bh) == 0) \ -+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ -+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ -+ else \ -+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ -+ : "=r" (sh), "=&r" (sl) \ -+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ -+ } while (0) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ if (__builtin_constant_p (ah) && (ah) == 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ -+ else \ -+ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ -+ : "=r" (sh), "=&r" (sl) \ -+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ -+ } while (0) -+#define count_leading_zeros(count, x) \ -+ __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x)) -+#define COUNT_LEADING_ZEROS_0 32 -+#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \ -+ || defined (__ppc__) || defined (PPC) || defined (__vxworks__) -+#define umul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ USItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ -+ (pl) = __m0 * __m1; \ -+ } while (0) -+#define UMUL_TIME 15 -+#define smul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ SItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ -+ (pl) = __m0 * __m1; \ -+ } while (0) -+#define SMUL_TIME 14 -+#define UDIV_TIME 120 -+#elif defined (_ARCH_PWR) -+#define UMUL_TIME 8 -+#define smul_ppmm(xh, xl, m0, m1) \ -+ __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1)) -+#define SMUL_TIME 4 -+#define sdiv_qrnnd(q, r, nh, nl, d) \ -+ __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d)) -+#define UDIV_TIME 100 -+#endif -+#endif /* 32-bit POWER architecture variants. */ -+ -+/* We should test _IBMR2 here when we add assembly support for the system -+ vendor compilers. */ -+#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ if (__builtin_constant_p (bh) && (bh) == 0) \ -+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ -+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ -+ else \ -+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ -+ : "=r" (sh), "=&r" (sl) \ -+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ -+ } while (0) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ if (__builtin_constant_p (ah) && (ah) == 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ -+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ -+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ -+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ -+ else \ -+ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ -+ : "=r" (sh), "=&r" (sl) \ -+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ -+ } while (0) -+#define count_leading_zeros(count, x) \ -+ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x)) -+#define COUNT_LEADING_ZEROS_0 64 -+#define umul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ UDItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ -+ (pl) = __m0 * __m1; \ -+ } while (0) -+#define UMUL_TIME 15 -+#define smul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ DItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ -+ (pl) = __m0 * __m1; \ -+ } while (0) -+#define SMUL_TIME 14 /* ??? */ -+#define UDIV_TIME 120 /* ??? */ -+#endif /* 64-bit PowerPC. */ -+ -+#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("a %1,%5\n\tae %0,%3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%0" ((USItype) (ah)), \ -+ "r" ((USItype) (bh)), \ -+ "%1" ((USItype) (al)), \ -+ "r" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("s %1,%5\n\tse %0,%3" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "0" ((USItype) (ah)), \ -+ "r" ((USItype) (bh)), \ -+ "1" ((USItype) (al)), \ -+ "r" ((USItype) (bl))) -+#define umul_ppmm(ph, pl, m0, m1) \ -+ do { \ -+ USItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ( \ -+ "s r2,r2\n" \ -+" mts r10,%2\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" m r2,%3\n" \ -+" cas %0,r2,r0\n" \ -+" mfs r10,%1" \ -+ : "=r" ((USItype) (ph)), \ -+ "=r" ((USItype) (pl)) \ -+ : "%r" (__m0), \ -+ "r" (__m1) \ -+ : "r2"); \ -+ (ph) += ((((SItype) __m0 >> 31) & __m1) \ -+ + (((SItype) __m1 >> 31) & __m0)); \ -+ } while (0) -+#define UMUL_TIME 20 -+#define UDIV_TIME 200 -+#define count_leading_zeros(count, x) \ -+ do { \ -+ if ((x) >= 0x10000) \ -+ __asm__ ("clz %0,%1" \ -+ : "=r" ((USItype) (count)) \ -+ : "r" ((USItype) (x) >> 16)); \ -+ else \ -+ { \ -+ __asm__ ("clz %0,%1" \ -+ : "=r" ((USItype) (count)) \ -+ : "r" ((USItype) (x))); \ -+ (count) += 16; \ -+ } \ -+ } while (0) -+#endif -+ -+#if defined (__sh2__) && W_TYPE_SIZE == 32 -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ( \ -+ "dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \ -+ : "=r" ((USItype)(w1)), \ -+ "=r" ((USItype)(w0)) \ -+ : "r" ((USItype)(u)), \ -+ "r" ((USItype)(v)) \ -+ : "macl", "mach") -+#define UMUL_TIME 5 -+#endif -+ -+#if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32 -+#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) -+#define count_leading_zeros(count, x) \ -+ do \ -+ { \ -+ UDItype x_ = (USItype)(x); \ -+ SItype c_; \ -+ \ -+ __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \ -+ (count) = c_ - 31; \ -+ } \ -+ while (0) -+#define COUNT_LEADING_ZEROS_0 32 -+#endif -+ -+#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \ -+ && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "%rJ" ((USItype) (ah)), \ -+ "rI" ((USItype) (bh)), \ -+ "%rJ" ((USItype) (al)), \ -+ "rI" ((USItype) (bl)) \ -+ __CLOBBER_CC) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \ -+ : "=r" ((USItype) (sh)), \ -+ "=&r" ((USItype) (sl)) \ -+ : "rJ" ((USItype) (ah)), \ -+ "rI" ((USItype) (bh)), \ -+ "rJ" ((USItype) (al)), \ -+ "rI" ((USItype) (bl)) \ -+ __CLOBBER_CC) -+#if defined (__sparc_v8__) -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ -+ : "=r" ((USItype) (w1)), \ -+ "=r" ((USItype) (w0)) \ -+ : "r" ((USItype) (u)), \ -+ "r" ((USItype) (v))) -+#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ -+ __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ -+ : "=&r" ((USItype) (__q)), \ -+ "=&r" ((USItype) (__r)) \ -+ : "r" ((USItype) (__n1)), \ -+ "r" ((USItype) (__n0)), \ -+ "r" ((USItype) (__d))) -+#else -+#if defined (__sparclite__) -+/* This has hardware multiply but not divide. It also has two additional -+ instructions scan (ffs from high bit) and divscc. */ -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ -+ : "=r" ((USItype) (w1)), \ -+ "=r" ((USItype) (w0)) \ -+ : "r" ((USItype) (u)), \ -+ "r" ((USItype) (v))) -+#define udiv_qrnnd(q, r, n1, n0, d) \ -+ __asm__ ("! Inlined udiv_qrnnd\n" \ -+" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ -+" tst %%g0\n" \ -+" divscc %3,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%%g1\n" \ -+" divscc %%g1,%4,%0\n" \ -+" rd %%y,%1\n" \ -+" bl,a 1f\n" \ -+" add %1,%4,%1\n" \ -+"1: ! End of inline udiv_qrnnd" \ -+ : "=r" ((USItype) (q)), \ -+ "=r" ((USItype) (r)) \ -+ : "r" ((USItype) (n1)), \ -+ "r" ((USItype) (n0)), \ -+ "rI" ((USItype) (d)) \ -+ : "g1" __AND_CLOBBER_CC) -+#define UDIV_TIME 37 -+#define count_leading_zeros(count, x) \ -+ do { \ -+ __asm__ ("scan %1,1,%0" \ -+ : "=r" ((USItype) (count)) \ -+ : "r" ((USItype) (x))); \ -+ } while (0) -+/* Early sparclites return 63 for an argument of 0, but they warn that future -+ implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 -+ undefined. */ -+#else -+/* SPARC without integer multiplication and divide instructions. -+ (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */ -+#define umul_ppmm(w1, w0, u, v) \ -+ __asm__ ("! Inlined umul_ppmm\n" \ -+" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\ -+" sra %3,31,%%o5 ! Don't move this insn\n" \ -+" and %2,%%o5,%%o5 ! Don't move this insn\n" \ -+" andcc %%g0,0,%%g1 ! Don't move this insn\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,%3,%%g1\n" \ -+" mulscc %%g1,0,%%g1\n" \ -+" add %%g1,%%o5,%0\n" \ -+" rd %%y,%1" \ -+ : "=r" ((USItype) (w1)), \ -+ "=r" ((USItype) (w0)) \ -+ : "%rI" ((USItype) (u)), \ -+ "r" ((USItype) (v)) \ -+ : "g1", "o5" __AND_CLOBBER_CC) -+#define UMUL_TIME 39 /* 39 instructions */ -+/* It's quite necessary to add this much assembler for the sparc. -+ The default udiv_qrnnd (in C) is more than 10 times slower! */ -+#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ -+ __asm__ ("! Inlined udiv_qrnnd\n" \ -+" mov 32,%%g1\n" \ -+" subcc %1,%2,%%g0\n" \ -+"1: bcs 5f\n" \ -+" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ -+" sub %1,%2,%1 ! this kills msb of n\n" \ -+" addx %1,%1,%1 ! so this can't give carry\n" \ -+" subcc %%g1,1,%%g1\n" \ -+"2: bne 1b\n" \ -+" subcc %1,%2,%%g0\n" \ -+" bcs 3f\n" \ -+" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ -+" b 3f\n" \ -+" sub %1,%2,%1 ! this kills msb of n\n" \ -+"4: sub %1,%2,%1\n" \ -+"5: addxcc %1,%1,%1\n" \ -+" bcc 2b\n" \ -+" subcc %%g1,1,%%g1\n" \ -+"! Got carry from n. Subtract next step to cancel this carry.\n" \ -+" bne 4b\n" \ -+" addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \ -+" sub %1,%2,%1\n" \ -+"3: xnor %0,0,%0\n" \ -+" ! End of inline udiv_qrnnd" \ -+ : "=&r" ((USItype) (__q)), \ -+ "=&r" ((USItype) (__r)) \ -+ : "r" ((USItype) (__d)), \ -+ "1" ((USItype) (__n1)), \ -+ "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC) -+#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ -+#endif /* __sparclite__ */ -+#endif /* __sparc_v8__ */ -+#endif /* sparc32 */ -+ -+#if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \ -+ && W_TYPE_SIZE == 64 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("addcc %r4,%5,%1\n\t" \ -+ "add %r2,%3,%0\n\t" \ -+ "bcs,a,pn %%xcc, 1f\n\t" \ -+ "add %0, 1, %0\n" \ -+ "1:" \ -+ : "=r" ((UDItype)(sh)), \ -+ "=&r" ((UDItype)(sl)) \ -+ : "%rJ" ((UDItype)(ah)), \ -+ "rI" ((UDItype)(bh)), \ -+ "%rJ" ((UDItype)(al)), \ -+ "rI" ((UDItype)(bl)) \ -+ __CLOBBER_CC) -+ -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subcc %r4,%5,%1\n\t" \ -+ "sub %r2,%3,%0\n\t" \ -+ "bcs,a,pn %%xcc, 1f\n\t" \ -+ "sub %0, 1, %0\n\t" \ -+ "1:" \ -+ : "=r" ((UDItype)(sh)), \ -+ "=&r" ((UDItype)(sl)) \ -+ : "rJ" ((UDItype)(ah)), \ -+ "rI" ((UDItype)(bh)), \ -+ "rJ" ((UDItype)(al)), \ -+ "rI" ((UDItype)(bl)) \ -+ __CLOBBER_CC) -+ -+#define umul_ppmm(wh, wl, u, v) \ -+ do { \ -+ UDItype tmp1, tmp2, tmp3, tmp4; \ -+ __asm__ __volatile__ ( \ -+ "srl %7,0,%3\n\t" \ -+ "mulx %3,%6,%1\n\t" \ -+ "srlx %6,32,%2\n\t" \ -+ "mulx %2,%3,%4\n\t" \ -+ "sllx %4,32,%5\n\t" \ -+ "srl %6,0,%3\n\t" \ -+ "sub %1,%5,%5\n\t" \ -+ "srlx %5,32,%5\n\t" \ -+ "addcc %4,%5,%4\n\t" \ -+ "srlx %7,32,%5\n\t" \ -+ "mulx %3,%5,%3\n\t" \ -+ "mulx %2,%5,%5\n\t" \ -+ "sethi %%hi(0x80000000),%2\n\t" \ -+ "addcc %4,%3,%4\n\t" \ -+ "srlx %4,32,%4\n\t" \ -+ "add %2,%2,%2\n\t" \ -+ "movcc %%xcc,%%g0,%2\n\t" \ -+ "addcc %5,%4,%5\n\t" \ -+ "sllx %3,32,%3\n\t" \ -+ "add %1,%3,%1\n\t" \ -+ "add %5,%2,%0" \ -+ : "=r" ((UDItype)(wh)), \ -+ "=&r" ((UDItype)(wl)), \ -+ "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ -+ : "r" ((UDItype)(u)), \ -+ "r" ((UDItype)(v)) \ -+ __CLOBBER_CC); \ -+ } while (0) -+#define UMUL_TIME 96 -+#define UDIV_TIME 230 -+#endif /* sparc64 */ -+ -+#if defined (__vax__) && W_TYPE_SIZE == 32 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \ -+ : "=g" ((USItype) (sh)), \ -+ "=&g" ((USItype) (sl)) \ -+ : "%0" ((USItype) (ah)), \ -+ "g" ((USItype) (bh)), \ -+ "%1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \ -+ : "=g" ((USItype) (sh)), \ -+ "=&g" ((USItype) (sl)) \ -+ : "0" ((USItype) (ah)), \ -+ "g" ((USItype) (bh)), \ -+ "1" ((USItype) (al)), \ -+ "g" ((USItype) (bl))) -+#define umul_ppmm(xh, xl, m0, m1) \ -+ do { \ -+ union { \ -+ UDItype __ll; \ -+ struct {USItype __l, __h;} __i; \ -+ } __xx; \ -+ USItype __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("emul %1,%2,$0,%0" \ -+ : "=r" (__xx.__ll) \ -+ : "g" (__m0), \ -+ "g" (__m1)); \ -+ (xh) = __xx.__i.__h; \ -+ (xl) = __xx.__i.__l; \ -+ (xh) += ((((SItype) __m0 >> 31) & __m1) \ -+ + (((SItype) __m1 >> 31) & __m0)); \ -+ } while (0) -+#define sdiv_qrnnd(q, r, n1, n0, d) \ -+ do { \ -+ union {DItype __ll; \ -+ struct {SItype __l, __h;} __i; \ -+ } __xx; \ -+ __xx.__i.__h = n1; __xx.__i.__l = n0; \ -+ __asm__ ("ediv %3,%2,%0,%1" \ -+ : "=g" (q), "=g" (r) \ -+ : "g" (__xx.__ll), "g" (d)); \ -+ } while (0) -+#endif /* __vax__ */ -+ -+#if defined (__z8000__) && W_TYPE_SIZE == 16 -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \ -+ : "=r" ((unsigned int)(sh)), \ -+ "=&r" ((unsigned int)(sl)) \ -+ : "%0" ((unsigned int)(ah)), \ -+ "r" ((unsigned int)(bh)), \ -+ "%1" ((unsigned int)(al)), \ -+ "rQR" ((unsigned int)(bl))) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \ -+ : "=r" ((unsigned int)(sh)), \ -+ "=&r" ((unsigned int)(sl)) \ -+ : "0" ((unsigned int)(ah)), \ -+ "r" ((unsigned int)(bh)), \ -+ "1" ((unsigned int)(al)), \ -+ "rQR" ((unsigned int)(bl))) -+#define umul_ppmm(xh, xl, m0, m1) \ -+ do { \ -+ union {long int __ll; \ -+ struct {unsigned int __h, __l;} __i; \ -+ } __xx; \ -+ unsigned int __m0 = (m0), __m1 = (m1); \ -+ __asm__ ("mult %S0,%H3" \ -+ : "=r" (__xx.__i.__h), \ -+ "=r" (__xx.__i.__l) \ -+ : "%1" (__m0), \ -+ "rQR" (__m1)); \ -+ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ -+ (xh) += ((((signed int) __m0 >> 15) & __m1) \ -+ + (((signed int) __m1 >> 15) & __m0)); \ -+ } while (0) -+#endif /* __z8000__ */ -+ -+#endif /* __GNUC__ */ -+ -+/* If this machine has no inline assembler, use C macros. */ -+ -+#if !defined (add_ssaaaa) -+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ UWtype __x; \ -+ __x = (al) + (bl); \ -+ (sh) = (ah) + (bh) + (__x < (al)); \ -+ (sl) = __x; \ -+ } while (0) -+#endif -+ -+#if !defined (sub_ddmmss) -+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ -+ do { \ -+ UWtype __x; \ -+ __x = (al) - (bl); \ -+ (sh) = (ah) - (bh) - (__x > (al)); \ -+ (sl) = __x; \ -+ } while (0) -+#endif -+ -+#if !defined (umul_ppmm) -+#define umul_ppmm(w1, w0, u, v) \ -+ do { \ -+ UWtype __x0, __x1, __x2, __x3; \ -+ UHWtype __ul, __vl, __uh, __vh; \ -+ \ -+ __ul = __ll_lowpart (u); \ -+ __uh = __ll_highpart (u); \ -+ __vl = __ll_lowpart (v); \ -+ __vh = __ll_highpart (v); \ -+ \ -+ __x0 = (UWtype) __ul * __vl; \ -+ __x1 = (UWtype) __ul * __vh; \ -+ __x2 = (UWtype) __uh * __vl; \ -+ __x3 = (UWtype) __uh * __vh; \ -+ \ -+ __x1 += __ll_highpart (__x0);/* this can't give carry */ \ -+ __x1 += __x2; /* but this indeed can */ \ -+ if (__x1 < __x2) /* did we get it? */ \ -+ __x3 += __ll_B; /* yes, add it in the proper pos. */ \ -+ \ -+ (w1) = __x3 + __ll_highpart (__x1); \ -+ (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \ -+ } while (0) -+#endif -+ -+#if !defined (__umulsidi3) -+#define __umulsidi3(u, v) \ -+ ({DWunion __w; \ -+ umul_ppmm (__w.s.high, __w.s.low, u, v); \ -+ __w.ll; }) -+#endif -+ -+/* Define this unconditionally, so it can be used for debugging. */ -+#define __udiv_qrnnd_c(q, r, n1, n0, d) \ -+ do { \ -+ UWtype __d1, __d0, __q1, __q0; \ -+ UWtype __r1, __r0, __m; \ -+ __d1 = __ll_highpart (d); \ -+ __d0 = __ll_lowpart (d); \ -+ \ -+ __r1 = (n1) % __d1; \ -+ __q1 = (n1) / __d1; \ -+ __m = (UWtype) __q1 * __d0; \ -+ __r1 = __r1 * __ll_B | __ll_highpart (n0); \ -+ if (__r1 < __m) \ -+ { \ -+ __q1--, __r1 += (d); \ -+ if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ -+ if (__r1 < __m) \ -+ __q1--, __r1 += (d); \ -+ } \ -+ __r1 -= __m; \ -+ \ -+ __r0 = __r1 % __d1; \ -+ __q0 = __r1 / __d1; \ -+ __m = (UWtype) __q0 * __d0; \ -+ __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ -+ if (__r0 < __m) \ -+ { \ -+ __q0--, __r0 += (d); \ -+ if (__r0 >= (d)) \ -+ if (__r0 < __m) \ -+ __q0--, __r0 += (d); \ -+ } \ -+ __r0 -= __m; \ -+ \ -+ (q) = (UWtype) __q1 * __ll_B | __q0; \ -+ (r) = __r0; \ -+ } while (0) -+ -+/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through -+ __udiv_w_sdiv (defined in libgcc or elsewhere). */ -+#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) -+#define udiv_qrnnd(q, r, nh, nl, d) \ -+ do { \ -+ USItype __r; \ -+ (q) = __udiv_w_sdiv (&__r, nh, nl, d); \ -+ (r) = __r; \ -+ } while (0) -+#endif -+ -+/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ -+#if !defined (udiv_qrnnd) -+#define UDIV_NEEDS_NORMALIZATION 1 -+#define udiv_qrnnd __udiv_qrnnd_c -+#endif -+ -+#if !defined (count_leading_zeros) -+extern const UQItype __clz_tab[]; -+#define count_leading_zeros(count, x) \ -+ do { \ -+ UWtype __xr = (x); \ -+ UWtype __a; \ -+ \ -+ if (W_TYPE_SIZE <= 32) \ -+ { \ -+ __a = __xr < ((UWtype)1<<2*__BITS4) \ -+ ? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \ -+ : (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \ -+ } \ -+ else \ -+ { \ -+ for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \ -+ if (((__xr >> __a) & 0xff) != 0) \ -+ break; \ -+ } \ -+ \ -+ (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ -+ } while (0) -+#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE -+#endif -+ -+#if !defined (count_trailing_zeros) -+/* Define count_trailing_zeros using count_leading_zeros. The latter might be -+ defined in asm, but if it is not, the C version above is good enough. */ -+#define count_trailing_zeros(count, x) \ -+ do { \ -+ UWtype __ctz_x = (x); \ -+ UWtype __ctz_c; \ -+ count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \ -+ (count) = W_TYPE_SIZE - 1 - __ctz_c; \ -+ } while (0) -+#endif -+ -+#ifndef UDIV_NEEDS_NORMALIZATION -+#define UDIV_NEEDS_NORMALIZATION 0 -+#endif -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/Makefile linux-5.6.11-ndis/3rdparty/ndiswrapper/Makefile ---- linux-5.6.11/3rdparty/ndiswrapper/Makefile 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/Makefile 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,213 @@ -+# Name of the module -+MODNAME = ndiswrapper -+ -+DISTFILES = \ -+ Makefile crt.c divdi3.c hal.c iw_ndis.c iw_ndis.h lin2win.S lin2win.h \ -+ loader.c loader.h longlong.h mkexport.sh mkstubs.sh ndis.c ndis.h \ -+ ndiswrapper.h ntoskernel.c ntoskernel.h ntoskernel_io.c pe_linker.c \ -+ pe_linker.h pnp.c pnp.h proc.c rtl.c usb.c usb.h win2lin_stubs.S \ -+ winnt_types.h workqueue.c wrapmem.c wrapmem.h wrapndis.c wrapndis.h \ -+ wrapper.c wrapper.h -+ -+# By default, we try to compile the modules for the currently running -+# kernel. But it's the first approximation, as we will re-read the -+# version from the kernel sources. -+KVERS_UNAME ?= $(shell uname -r) -+ -+# KBUILD is the path to the Linux kernel build tree. It is usually the -+# same as the kernel source tree, except when the kernel was compiled in -+# a separate directory. -+KBUILD ?= $(shell readlink -f /lib/modules/$(KVERS_UNAME)/build) -+ -+ifeq (,$(KBUILD)) -+$(error Kernel build tree not found - please set KBUILD to configured kernel) -+endif -+ -+KCONFIG := $(KBUILD)/.config -+ifeq (,$(wildcard $(KCONFIG))) -+$(error No .config found in $(KBUILD), please set KBUILD to configured kernel) -+endif -+ -+ifneq (,$(wildcard $(KBUILD)/include/linux/version.h)) -+ifneq (,$(wildcard $(KBUILD)/include/generated/uapi/linux/version.h)) -+$(error Multiple copies of version.h found, please clean your build tree) -+endif -+endif -+ -+# Kernel Makefile doesn't always know the exact kernel version, so we -+# get it from the kernel headers instead and pass it to make. -+VERSION_H := $(KBUILD)/include/generated/utsrelease.h -+ifeq (,$(wildcard $(VERSION_H))) -+VERSION_H := $(KBUILD)/include/linux/utsrelease.h -+endif -+ifeq (,$(wildcard $(VERSION_H))) -+VERSION_H := $(KBUILD)/include/linux/version.h -+endif -+ifeq (,$(wildcard $(VERSION_H))) -+$(error Please run 'make modules_prepare' in $(KBUILD)) -+endif -+ -+KVERS := $(shell sed -ne 's/"//g;s/^\#define UTS_RELEASE //p' $(VERSION_H)) -+ -+ifeq (,$(KVERS)) -+$(error Cannot find UTS_RELEASE in $(VERSION_H), please report) -+endif -+ -+INST_DIR = /lib/modules/$(KVERS)/misc -+ -+SRC_DIR=$(shell pwd) -+ -+include $(KCONFIG) -+ -+# returns of structs and unions in registers when possible, like Windows -+EXTRA_CFLAGS += -freg-struct-return -+ -+# to produce debug trace, add option "DEBUG=" where is 1 to 6 -+ifdef DEBUG -+EXTRA_CFLAGS += -DDEBUG=$(DEBUG) -g -+endif -+ -+# to debug timers, add option "TIMER_DEBUG=1" -+ifdef TIMER_DEBUG -+EXTRA_CFLAGS += -DTIMER_DEBUG -+endif -+ -+# to debug event layer, add option "EVENT_DEBUG=1" -+ifdef EVENT_DEBUG -+EXTRA_CFLAGS += -DEVENT_DEBUG -+endif -+ -+# to debug USB layer, add option "USB_DEBUG=1" -+ifdef USB_DEBUG -+EXTRA_CFLAGS += -DUSB_DEBUG -+endif -+ -+# to debug I/O layer, add option "IO_DEBUG=1" -+ifdef IO_DEBUG -+EXTRA_CFLAGS += -DIO_DEBUG -+endif -+ -+# to debug worker threads, add option "WORK_DEBUG=1" -+ifdef WORK_DEBUG -+EXTRA_CFLAGS += -DWORK_DEBUG -+endif -+ -+# to debug memory allocation, add option "ALLOC_DEBUG=" where is 1 or 2 -+ifdef ALLOC_DEBUG -+EXTRA_CFLAGS += -DALLOC_DEBUG=$(ALLOC_DEBUG) -+endif -+ -+OBJS = crt.o hal.o iw_ndis.o loader.o ndis.o ntoskernel.o ntoskernel_io.o \ -+ pe_linker.o pnp.o proc.o rtl.o wrapmem.o wrapndis.o wrapper.o -+ -+EXPORT_SRCS = crt.c hal.c ndis.c ntoskernel.c ntoskernel_io.c rtl.c -+ -+STUB_SRCS = crt.c hal.c ndis.c ntoskernel.c ntoskernel_io.c \ -+ pnp.c rtl.c wrapndis.c -+ -+ -+# By default, USB layer is compiled in if USB support is in kernel; -+# to disable USB support in ndiswrapper even if USB support is in kernel, -+# add option "DISABLE_USB=1" -+ifndef DISABLE_USB -+ifeq ($(CONFIG_USB),y) -+ENABLE_USB = 1 -+endif -+ifeq ($(CONFIG_USB),m) -+ENABLE_USB = 1 -+endif -+endif -+ -+ifdef ENABLE_USB -+EXPORT_SRCS += usb.c -+STUB_SRCS += usb.c -+OBJS += usb.o -+EXTRA_CFLAGS += -DENABLE_USB -+endif -+ -+ifdef WRAP_WQ -+EXTRA_CFLAGS += -DWRAP_WQ -+OBJS += workqueue.o -+endif -+ -+ -+all: config_check modules -+ -+# generate exports symbol table from C files -+quiet_cmd_mkexport = MKEXPORT $@ -+cmd_mkexport = $(SHELL) $(obj)/mkexport.sh $< $@ -+ -+extra-y += $(EXPORT_SRCS:.c=_exports.h) -+%_exports.h: %.c $(obj)/mkexport.sh FORCE -+ $(call if_changed,mkexport) -+ -+$(addprefix $(obj)/,$(EXPORT_SRCS:.c=.o)): %.o: %_exports.h -+ -+ifeq ($(CONFIG_X86_64),y) -+quiet_cmd_mkstubs = MKSTUBS $@ -+cmd_mkstubs = $(SHELL) $(obj)/mkstubs.sh $(addprefix $(src)/,$(STUB_SRCS)) >$@ -+ -+extra-y += win2lin_stubs.h -+$(obj)/win2lin_stubs.h: $(addprefix $(src)/,$(STUB_SRCS)) FORCE -+ $(call if_changed,mkstubs) -+ -+$(obj)/win2lin_stubs.o: $(obj)/win2lin_stubs.h -+OBJS += win2lin_stubs.o lin2win.o -+else -+OBJS += divdi3.o -+endif -+ -+MODULE := $(MODNAME).ko -+obj-m := $(MODNAME).o -+ -+$(MODNAME)-objs := $(OBJS) -+ -+ -+config_check: -+ @if [ -z "$(CONFIG_WIRELESS_EXT)$(CONFIG_NET_RADIO)" ]; then \ -+ echo; echo; \ -+ echo "*** WARNING: This kernel lacks wireless extensions."; \ -+ echo "Wireless drivers will not work properly."; \ -+ echo; echo; \ -+ fi -+ @if [ -z "$(CONFIG_X86_64)" ] && [ -n "$(CONFIG_4KSTACKS)" ]; then \ -+ echo; echo; \ -+ echo "*** WARNING: This kernel uses 4K stack size option"; \ -+ echo "(CONFIG_4KSTACKS); many Windows drivers will not work"; \ -+ echo "with this option enabled. Disable CONFIG_4KSTACKS"; \ -+ echo "in kernel's .config file, recompile and install kernel"; \ -+ echo; echo; \ -+ fi -+ -+modules: -+ $(MAKE) -C $(KBUILD) M=$(SRC_DIR) -+ -+$(MODULE): -+ $(MAKE) modules -+ -+clean: -+ rm -f *.o *.ko .*.cmd *.mod.c *.symvers modules.order *~ .\#* -+ rm -f *_exports.h win2lin_stubs.h -+ rm -rf .tmp_versions -+ -+install: config_check $(MODULE) -+ @/sbin/modinfo $(MODULE) | grep -q "^vermagic: *$(KVERS) " || \ -+ { echo "$(MODULE)" is not for Linux $(KVERS); exit 1; } -+ mkdir -p -m 755 $(DESTDIR)$(INST_DIR) -+ install -m 0644 $(MODULE) $(DESTDIR)$(INST_DIR) -+ifndef DESTDIR -+ -/sbin/depmod -a $(KVERS) -+endif -+ -+uninstall: -+ rm -f $(DESTDIR)$(INST_DIR)/$(MODULE) -+ifndef DESTDIR -+ -/sbin/depmod -a $(KVERS) -+endif -+ -+dist: -+ @for file in $(DISTFILES); do \ -+ cp $$file $(distdir)/$$file || exit 1; \ -+ done -+ -+.PHONY: all modules clean install config_check dist -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/mkexport.sh linux-5.6.11-ndis/3rdparty/ndiswrapper/mkexport.sh ---- linux-5.6.11/3rdparty/ndiswrapper/mkexport.sh 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/mkexport.sh 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,42 @@ -+#! /bin/sh -+ -+# Generate exports symbol table from C files -+ -+input="$1" -+output="$2" -+exports=$(basename "$output" .h) -+exec >"$output" -+ -+echo "/* automatically generated from src */"; -+ -+sed -n -e '/^\(wstdcall\|wfastcall\|noregparm\|regparm3\|__attribute__\)/{ -+:more -+N -+s/\([^{]\)$/\1/ -+t more -+s/\n{$/;/ -+p -+}' $input -+ -+echo "#ifdef CONFIG_X86_64"; -+ -+sed -n \ -+ -e 's/.*WIN_FUNC(\([^\,]\+\) *\, *\([0-9]\+\)).*/'\ -+'WIN_FUNC_DECL(\1, \2)/p' \ -+ -e 's/.*WIN_FUNC_PTR(\([^\,]\+\) *\, *\([0-9]\+\)).*/'\ -+'WIN_FUNC_DECL(\1, \2)/p' $input | sort -u -+ -+echo "#endif" -+echo "extern struct wrap_export $exports[];" -+echo "struct wrap_export $exports[] = {" -+ -+sed -n \ -+ -e 's/.*WIN_FUNC(_win_\([^\,]\+\) *\, *\([0-9]\+\)).*/'\ -+' WIN_WIN_SYMBOL(\1, \2),/p' \ -+ -e 's/.*WIN_FUNC(\([^\,]\+\) *\, *\([0-9]\+\)).*/'\ -+' WIN_SYMBOL(\1, \2),/p' \ -+ -e 's/.*WIN_SYMBOL_MAP(\("[^"]\+"\)[ ,\n]\+\([^)]\+\)).*/'\ -+' {\1, (generic_func)\2},/p' $input | sort -u -+ -+echo " {NULL, NULL}" -+echo "};" -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/mkstubs.sh linux-5.6.11-ndis/3rdparty/ndiswrapper/mkstubs.sh ---- linux-5.6.11/3rdparty/ndiswrapper/mkstubs.sh 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/mkstubs.sh 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,12 @@ -+#! /bin/sh -+ -+for file in "$@"; do -+ echo -+ echo "# automatically generated from $file" -+ sed -n \ -+ -e 's/.*WIN_FUNC(\([^\,]\+\) *\, *\([0-9]\+\)).*/\ -+ win2lin(\1, \2)/p' \ -+ -e 's/.*WIN_FUNC_PTR(\([^\,]\+\) *\, *\([0-9]\+\)).*/\ -+ win2lin(\1, \2)/p' \ -+ $file | sed -e 's/[ \t ]\+//' | sort -u; \ -+done -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ndis.c linux-5.6.11-ndis/3rdparty/ndiswrapper/ndis.c ---- linux-5.6.11/3rdparty/ndiswrapper/ndis.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ndis.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,3031 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ndis.h" -+#include "iw_ndis.h" -+#include "wrapndis.h" -+#include "pnp.h" -+#include "loader.h" -+#include -+#include -+#include "ndis_exports.h" -+ -+#define MAX_ALLOCATED_NDIS_PACKETS TX_RING_SIZE -+#define MAX_ALLOCATED_NDIS_BUFFERS TX_RING_SIZE -+ -+static struct work_struct ndis_work; -+static struct nt_list ndis_work_list; -+static spinlock_t ndis_work_list_lock; -+ -+struct workqueue_struct *ndis_wq; -+ -+static void *ndis_get_routine_address(char *name); -+ -+wstdcall void WIN_FUNC(NdisInitializeWrapper,4) -+ (void **driver_handle, struct driver_object *driver, -+ struct unicode_string *reg_path, void *unused) -+{ -+ ENTER1("handle: %p, driver: %p", driver_handle, driver); -+ *driver_handle = driver; -+ EXIT1(return); -+} -+ -+wstdcall void WIN_FUNC(NdisTerminateWrapper,2) -+ (struct device_object *dev_obj, void *system_specific) -+{ -+ EXIT1(return); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMRegisterMiniport,3) -+ (struct driver_object *drv_obj, struct miniport *mp, UINT length) -+{ -+ int min_length; -+ struct wrap_driver *wrap_driver; -+ struct ndis_driver *ndis_driver; -+ -+ min_length = ((char *)&mp->co_create_vc) - ((char *)mp); -+ -+ ENTER1("%p %p %d", drv_obj, mp, length); -+ -+ if (mp->major_version < 4) { -+ ERROR("Driver is using ndis version %d which is too old.", -+ mp->major_version); -+ EXIT1(return NDIS_STATUS_BAD_VERSION); -+ } -+ -+ if (length < min_length) { -+ ERROR("Characteristics length %d is too small", length); -+ EXIT1(return NDIS_STATUS_BAD_CHARACTERISTICS); -+ } -+ -+ TRACE1("%d.%d, %d, %u", mp->major_version, mp->minor_version, length, -+ (u32)sizeof(struct miniport)); -+ wrap_driver = IoGetDriverObjectExtension(drv_obj, -+ (void *)WRAP_DRIVER_CLIENT_ID); -+ if (!wrap_driver) { -+ ERROR("couldn't get wrap_driver"); -+ EXIT1(return NDIS_STATUS_RESOURCES); -+ } -+ if (IoAllocateDriverObjectExtension( -+ drv_obj, (void *)NDIS_DRIVER_CLIENT_ID, -+ sizeof(*ndis_driver), (void **)&ndis_driver) != -+ STATUS_SUCCESS) -+ EXIT1(return NDIS_STATUS_RESOURCES); -+ wrap_driver->ndis_driver = ndis_driver; -+ TRACE1("driver: %p", ndis_driver); -+ memcpy(&ndis_driver->mp, mp, min_t(int, sizeof(*mp), length)); -+ -+ DBG_BLOCK(2) { -+ int i; -+ void **func; -+ char *mp_funcs[] = { -+ "queryinfo", "reconfig", "reset", "send", "setinfo", -+ "tx_data", "return_packet", "send_packets", -+ "alloc_complete", "co_create_vc", "co_delete_vc", -+ "co_activate_vc", "co_deactivate_vc", -+ "co_send_packets", "co_request", "cancel_send_packets", -+ "pnp_event_notify", "shutdown", -+ }; -+ func = (void **)&ndis_driver->mp.queryinfo; -+ for (i = 0; i < ARRAY_SIZE(mp_funcs); i++) -+ TRACE0("function '%s' is at %p", mp_funcs[i], func[i]); -+ } -+ EXIT1(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMRegisterDevice,6) -+ (struct driver_object *drv_obj, struct unicode_string *dev_name, -+ struct unicode_string *link, void **funcs, -+ struct device_object **dev_obj, void **dev_obj_handle) -+{ -+ NTSTATUS status; -+ struct device_object *tmp; -+ int i; -+ -+ ENTER1("%p, %p, %p", drv_obj, dev_name, link); -+ status = IoCreateDevice(drv_obj, 0, dev_name, FILE_DEVICE_NETWORK, 0, -+ FALSE, &tmp); -+ -+ if (status != STATUS_SUCCESS) -+ EXIT1(return NDIS_STATUS_RESOURCES); -+ if (link) -+ status = IoCreateSymbolicLink(link, dev_name); -+ if (status != STATUS_SUCCESS) { -+ IoDeleteDevice(tmp); -+ EXIT1(return NDIS_STATUS_RESOURCES); -+ } -+ -+ *dev_obj = tmp; -+ *dev_obj_handle = *dev_obj; -+ for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) -+ if (funcs[i] && i != IRP_MJ_PNP && i != IRP_MJ_POWER) { -+ drv_obj->major_func[i] = funcs[i]; -+ TRACE1("mj_fn for 0x%x is at %p", i, funcs[i]); -+ } -+ EXIT1(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMDeregisterDevice,1) -+ (struct device_object *dev_obj) -+{ -+ ENTER2("%p", dev_obj); -+ IoDeleteDevice(dev_obj); -+ return NDIS_STATUS_SUCCESS; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisAllocateMemoryWithTag,3) -+ (void **dest, UINT length, ULONG tag) -+{ -+ void *addr; -+ -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ addr = ExAllocatePoolWithTag(NonPagedPool, length, tag); -+ TRACE4("%p", addr); -+ if (addr) { -+ *dest = addr; -+ EXIT4(return NDIS_STATUS_SUCCESS); -+ } else -+ EXIT4(return NDIS_STATUS_FAILURE); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisAllocateMemory,4) -+ (void **dest, UINT length, UINT flags, NDIS_PHY_ADDRESS highest_address) -+{ -+ return NdisAllocateMemoryWithTag(dest, length, 0); -+} -+ -+/* length_tag is either length or tag, depending on if -+ * NdisAllocateMemory or NdisAllocateMemoryTag is used to allocate -+ * memory */ -+wstdcall void WIN_FUNC(NdisFreeMemory,3) -+ (void *addr, UINT length_tag, UINT flags) -+{ -+ TRACE4("%p", addr); -+ ExFreePool(addr); -+} -+ -+noregparm void WIN_FUNC(NdisWriteErrorLogEntry,12) -+ (struct driver_object *drv_obj, ULONG error, ULONG count, ...) -+{ -+ va_list args; -+ int i; -+ ULONG code; -+ -+ va_start(args, count); -+ ERROR("log: %08X, count: %d, return_address: %p", -+ error, count, __builtin_return_address(0)); -+ for (i = 0; i < count; i++) { -+ code = va_arg(args, ULONG); -+ ERROR("code: 0x%x", code); -+ } -+ va_end(args); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisOpenConfiguration,3) -+ (NDIS_STATUS *status, struct ndis_mp_block **conf_handle, -+ struct ndis_mp_block *handle) -+{ -+ ENTER2("%p", conf_handle); -+ *conf_handle = handle; -+ *status = NDIS_STATUS_SUCCESS; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisOpenProtocolConfiguration,3) -+ (NDIS_STATUS *status, void **confhandle, -+ struct unicode_string *section) -+{ -+ ENTER2("%p", confhandle); -+ *status = NDIS_STATUS_SUCCESS; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisOpenConfigurationKeyByName,4) -+ (NDIS_STATUS *status, void *handle, -+ struct unicode_string *key, void **subkeyhandle) -+{ -+ struct ansi_string ansi; -+ ENTER2(""); -+ if (RtlUnicodeStringToAnsiString(&ansi, key, TRUE) == STATUS_SUCCESS) { -+ TRACE2("%s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ *subkeyhandle = handle; -+ *status = NDIS_STATUS_SUCCESS; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisOpenConfigurationKeyByIndex,5) -+ (NDIS_STATUS *status, void *handle, ULONG index, -+ struct unicode_string *key, void **subkeyhandle) -+{ -+ ENTER2("%u", index); -+// *subkeyhandle = handle; -+ *status = NDIS_STATUS_FAILURE; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisCloseConfiguration,1) -+ (void *handle) -+{ -+ /* instead of freeing all configuration parameters as we are -+ * supposed to do here, we free them when the device is -+ * removed */ -+ ENTER2("%p", handle); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisOpenFile,5) -+ (NDIS_STATUS *status, struct wrap_bin_file **file, -+ UINT *filelength, struct unicode_string *filename, -+ NDIS_PHY_ADDRESS highest_address) -+{ -+ struct ansi_string ansi; -+ struct wrap_bin_file *bin_file; -+ -+ ENTER2("%p, %d, %llx, %p", status, *filelength, highest_address, *file); -+ if (RtlUnicodeStringToAnsiString(&ansi, filename, TRUE) != -+ STATUS_SUCCESS) { -+ *status = NDIS_STATUS_RESOURCES; -+ EXIT2(return); -+ } -+ TRACE2("%s", ansi.buf); -+ bin_file = get_bin_file(ansi.buf); -+ if (bin_file) { -+ *file = bin_file; -+ *filelength = bin_file->size; -+ *status = NDIS_STATUS_SUCCESS; -+ } else -+ *status = NDIS_STATUS_FILE_NOT_FOUND; -+ -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMapFile,3) -+ (NDIS_STATUS *status, void **mappedbuffer, struct wrap_bin_file *file) -+{ -+ ENTER2("%p", file); -+ -+ if (!file) { -+ *status = NDIS_STATUS_ALREADY_MAPPED; -+ EXIT2(return); -+ } -+ -+ *status = NDIS_STATUS_SUCCESS; -+ *mappedbuffer = file->data; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisUnmapFile,1) -+ (struct wrap_bin_file *file) -+{ -+ ENTER2("%p", file); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisCloseFile,1) -+ (struct wrap_bin_file *file) -+{ -+ ENTER2("%p", file); -+ free_bin_file(file); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisGetSystemUpTime,1) -+ (ULONG *ms) -+{ -+ *ms = 1000 * jiffies / HZ; -+ EXIT5(return); -+} -+ -+wstdcall ULONG WIN_FUNC(NDIS_BUFFER_TO_SPAN_PAGES,1) -+ (ndis_buffer *buffer) -+{ -+ ULONG n, length; -+ -+ if (buffer == NULL) -+ EXIT2(return 0); -+ if (MmGetMdlByteCount(buffer) == 0) -+ EXIT2(return 1); -+ -+ length = MmGetMdlByteCount(buffer); -+ n = SPAN_PAGES(MmGetMdlVirtualAddress(buffer), length); -+ TRACE4("%p, %p, %d, %d", buffer->startva, buffer->mappedsystemva, -+ length, n); -+ EXIT3(return n); -+} -+ -+wstdcall void WIN_FUNC(NdisGetBufferPhysicalArraySize,2) -+ (ndis_buffer *buffer, UINT *arraysize) -+{ -+ ENTER3("%p", buffer); -+ *arraysize = NDIS_BUFFER_TO_SPAN_PAGES(buffer); -+ EXIT3(return); -+} -+ -+static struct ndis_configuration_parameter * -+ndis_encode_setting(struct wrap_device_setting *setting, -+ enum ndis_parameter_type type) -+{ -+ struct ansi_string ansi; -+ struct ndis_configuration_parameter *param; -+ -+ param = setting->encoded; -+ if (param) { -+ if (param->type == type) -+ EXIT2(return param); -+ if (param->type == NdisParameterString) -+ RtlFreeUnicodeString(¶m->data.string); -+ setting->encoded = NULL; -+ } else -+ param = ExAllocatePoolWithTag(NonPagedPool, sizeof(*param), 0); -+ if (!param) { -+ ERROR("couldn't allocate memory"); -+ return NULL; -+ } -+ switch (type) { -+ case NdisParameterInteger: -+ param->data.integer = simple_strtol(setting->value, NULL, 0); -+ TRACE2("0x%x", param->data.integer); -+ break; -+ case NdisParameterHexInteger: -+ param->data.integer = simple_strtol(setting->value, NULL, 16); -+ TRACE2("0x%x", param->data.integer); -+ break; -+ case NdisParameterString: -+ RtlInitAnsiString(&ansi, setting->value); -+ TRACE2("'%s'", ansi.buf); -+ if (RtlAnsiStringToUnicodeString(¶m->data.string, -+ &ansi, TRUE)) { -+ ExFreePool(param); -+ EXIT2(return NULL); -+ } -+ break; -+ case NdisParameterBinary: -+ param->data.integer = simple_strtol(setting->value, NULL, 2); -+ TRACE2("0x%x", param->data.integer); -+ break; -+ default: -+ ERROR("unknown type: %d", type); -+ ExFreePool(param); -+ return NULL; -+ } -+ param->type = type; -+ setting->encoded = param; -+ EXIT2(return param); -+} -+ -+static int ndis_decode_setting(struct wrap_device_setting *setting, -+ struct ndis_configuration_parameter *param) -+{ -+ struct ansi_string ansi; -+ struct ndis_configuration_parameter *prev; -+ -+ ENTER2("%p, %p", setting, param); -+ prev = setting->encoded; -+ if (prev && prev->type == NdisParameterString) { -+ RtlFreeUnicodeString(&prev->data.string); -+ setting->encoded = NULL; -+ } -+ switch (param->type) { -+ case NdisParameterInteger: -+ snprintf(setting->value, MAX_SETTING_VALUE_LEN, "%u", -+ param->data.integer); -+ break; -+ case NdisParameterHexInteger: -+ snprintf(setting->value, MAX_SETTING_VALUE_LEN, "%x", -+ param->data.integer); -+ break; -+ case NdisParameterString: -+ ansi.buf = setting->value; -+ ansi.max_length = MAX_SETTING_VALUE_LEN; -+ if ((RtlUnicodeStringToAnsiString(&ansi, ¶m->data.string, -+ FALSE) != STATUS_SUCCESS) -+ || ansi.length >= MAX_SETTING_VALUE_LEN) { -+ EXIT1(return -1); -+ } -+ if (ansi.length == ansi.max_length) -+ ansi.length--; -+ setting->value[ansi.length] = 0; -+ break; -+ default: -+ TRACE2("unknown setting type: %d", param->type); -+ return -1; -+ } -+ TRACE2("setting changed %s='%s', %d", setting->name, setting->value, -+ ansi.length); -+ return 0; -+} -+ -+static int read_setting(struct nt_list *setting_list, char *keyname, int length, -+ struct ndis_configuration_parameter **param, -+ enum ndis_parameter_type type) -+{ -+ struct wrap_device_setting *setting; -+ mutex_lock(&loader_mutex); -+ nt_list_for_each_entry(setting, setting_list, list) { -+ if (strncasecmp(keyname, setting->name, length) == 0) { -+ TRACE2("setting %s='%s'", keyname, setting->value); -+ mutex_unlock(&loader_mutex); -+ *param = ndis_encode_setting(setting, type); -+ if (*param) -+ EXIT2(return 0); -+ else -+ EXIT2(return -1); -+ } -+ } -+ mutex_unlock(&loader_mutex); -+ EXIT2(return -1); -+} -+ -+wstdcall void WIN_FUNC(NdisReadConfiguration,5) -+ (NDIS_STATUS *status, struct ndis_configuration_parameter **param, -+ struct ndis_mp_block *nmb, struct unicode_string *key, -+ enum ndis_parameter_type type) -+{ -+ struct ansi_string ansi; -+ int ret; -+ -+ ENTER2("nmb: %p", nmb); -+ ret = RtlUnicodeStringToAnsiString(&ansi, key, TRUE); -+ if (ret != STATUS_SUCCESS || ansi.buf == NULL) { -+ *param = NULL; -+ *status = NDIS_STATUS_FAILURE; -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return); -+ } -+ TRACE2("%d, %s", type, ansi.buf); -+ -+ if (read_setting(&nmb->wnd->wd->settings, ansi.buf, -+ ansi.length, param, type) == 0 || -+ read_setting(&nmb->wnd->wd->driver->settings, ansi.buf, -+ ansi.length, param, type) == 0) -+ *status = NDIS_STATUS_SUCCESS; -+ else { -+ TRACE2("setting %s not found (type:%d)", ansi.buf, type); -+ *status = NDIS_STATUS_FAILURE; -+ } -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return); -+ -+} -+ -+wstdcall void WIN_FUNC(NdisWriteConfiguration,4) -+ (NDIS_STATUS *status, struct ndis_mp_block *nmb, -+ struct unicode_string *key, struct ndis_configuration_parameter *param) -+{ -+ struct ansi_string ansi; -+ char *keyname; -+ struct wrap_device_setting *setting; -+ -+ ENTER2("nmb: %p", nmb); -+ if (RtlUnicodeStringToAnsiString(&ansi, key, TRUE)) { -+ *status = NDIS_STATUS_FAILURE; -+ EXIT2(return); -+ } -+ keyname = ansi.buf; -+ TRACE2("%s", keyname); -+ -+ mutex_lock(&loader_mutex); -+ nt_list_for_each_entry(setting, &nmb->wnd->wd->settings, list) { -+ if (strncasecmp(keyname, setting->name, ansi.length) == 0) { -+ mutex_unlock(&loader_mutex); -+ if (ndis_decode_setting(setting, param)) -+ *status = NDIS_STATUS_FAILURE; -+ else -+ *status = NDIS_STATUS_SUCCESS; -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return); -+ } -+ } -+ mutex_unlock(&loader_mutex); -+ setting = kzalloc(sizeof(*setting), GFP_KERNEL); -+ if (setting) { -+ if (ansi.length == ansi.max_length) -+ ansi.length--; -+ memcpy(setting->name, keyname, ansi.length); -+ setting->name[ansi.length] = 0; -+ if (ndis_decode_setting(setting, param)) -+ *status = NDIS_STATUS_FAILURE; -+ else { -+ *status = NDIS_STATUS_SUCCESS; -+ mutex_lock(&loader_mutex); -+ InsertTailList(&nmb->wnd->wd->settings, &setting->list); -+ mutex_unlock(&loader_mutex); -+ } -+ } else -+ *status = NDIS_STATUS_RESOURCES; -+ -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisReadNetworkAddress,4) -+ (NDIS_STATUS *status, void **addr, UINT *len, -+ struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct ndis_configuration_parameter *param; -+ struct unicode_string key; -+ struct ansi_string ansi; -+ typeof(wnd->mac) mac; -+ int i, ret; -+ -+ ENTER2("%p", nmb); -+ RtlInitAnsiString(&ansi, "NetworkAddress"); -+ *status = NDIS_STATUS_FAILURE; -+ if (RtlAnsiStringToUnicodeString(&key, &ansi, TRUE) != STATUS_SUCCESS) -+ EXIT1(return); -+ -+ NdisReadConfiguration(&ret, ¶m, nmb, &key, NdisParameterString); -+ RtlFreeUnicodeString(&key); -+ if (ret != NDIS_STATUS_SUCCESS) -+ EXIT1(return); -+ ret = RtlUnicodeStringToAnsiString(&ansi, ¶m->data.string, TRUE); -+ if (ret != STATUS_SUCCESS) -+ EXIT1(return); -+ -+ i = 0; -+ if (ansi.length >= 2 * sizeof(mac)) { -+ for (i = 0; i < sizeof(mac); i++) { -+ char c[3]; -+ int x; -+ c[0] = ansi.buf[i*2]; -+ c[1] = ansi.buf[i*2+1]; -+ c[2] = 0; -+ ret = sscanf(c, "%x", &x); -+ if (ret != 1) -+ break; -+ mac[i] = x; -+ } -+ } -+ TRACE2("%s, %d, " MACSTR, ansi.buf, i, MAC2STR(mac)); -+ RtlFreeAnsiString(&ansi); -+ if (i == sizeof(mac)) { -+ memcpy(wnd->mac, mac, sizeof(wnd->mac)); -+ *len = sizeof(mac); -+ *addr = wnd->mac; -+ *status = NDIS_STATUS_SUCCESS; -+ } -+ EXIT1(return); -+} -+ -+wstdcall void WIN_FUNC(NdisInitializeString,2) -+ (struct unicode_string *dest, UCHAR *src) -+{ -+ struct ansi_string ansi; -+ -+ ENTER2(""); -+ if (src == NULL) { -+ dest->length = dest->max_length = 0; -+ dest->buf = NULL; -+ } else { -+ RtlInitAnsiString(&ansi, src); -+ /* the string is freed with NdisFreeMemory */ -+ RtlAnsiStringToUnicodeString(dest, &ansi, TRUE); -+ } -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisInitAnsiString,2) -+ (struct ansi_string *dst, CHAR *src) -+{ -+ RtlInitAnsiString(dst, src); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisInitUnicodeString,2) -+ (struct unicode_string *dest, const wchar_t *src) -+{ -+ RtlInitUnicodeString(dest, src); -+ return; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisAnsiStringToUnicodeString,2) -+ (struct unicode_string *dst, struct ansi_string *src) -+{ -+ ENTER2(""); -+ if (dst == NULL || src == NULL) -+ EXIT2(return NDIS_STATUS_FAILURE); -+ if (RtlAnsiStringToUnicodeString(dst, src, FALSE) == STATUS_SUCCESS) -+ return NDIS_STATUS_SUCCESS; -+ else -+ return NDIS_STATUS_FAILURE; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisUnicodeStringToAnsiString,2) -+ (struct ansi_string *dst, struct unicode_string *src) -+{ -+ ENTER2(""); -+ if (dst == NULL || src == NULL) -+ EXIT2(return NDIS_STATUS_FAILURE); -+ if (RtlUnicodeStringToAnsiString(dst, src, FALSE) == STATUS_SUCCESS) -+ return NDIS_STATUS_SUCCESS; -+ else -+ return NDIS_STATUS_FAILURE; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(NdisUpcaseUnicodeString,2) -+ (struct unicode_string *dst, struct unicode_string *src) -+{ -+ EXIT2(return RtlUpcaseUnicodeString(dst, src, FALSE)); -+} -+ -+wstdcall void WIN_FUNC(NdisMSetAttributesEx,5) -+ (struct ndis_mp_block *nmb, void *mp_ctx, -+ UINT hangcheck_interval, UINT attributes, ULONG adaptertype) -+{ -+ struct ndis_device *wnd; -+ -+ ENTER1("%p, %p, %d, %08x, %d", nmb, mp_ctx, hangcheck_interval, -+ attributes, adaptertype); -+ wnd = nmb->wnd; -+ nmb->mp_ctx = mp_ctx; -+ wnd->attributes = attributes; -+ -+ if ((attributes & NDIS_ATTRIBUTE_BUS_MASTER) && -+ wrap_is_pci_bus(wnd->wd->dev_bus)) -+ pci_set_master(wnd->wd->pci.pdev); -+ -+ if (hangcheck_interval > 0) -+ wnd->hangcheck_interval = 2 * hangcheck_interval * HZ; -+ else -+ wnd->hangcheck_interval = 2 * HZ; -+ -+ EXIT1(return); -+} -+ -+wstdcall ULONG WIN_FUNC(NdisReadPciSlotInformation,5) -+ (struct ndis_mp_block *nmb, ULONG slot, -+ ULONG offset, char *buf, ULONG len) -+{ -+ struct wrap_device *wd = nmb->wnd->wd; -+ ULONG i; -+ if (!wrap_is_pci_bus(wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return 0; -+ } -+ for (i = 0; i < len; i++) -+ if (pci_read_config_byte(wd->pci.pdev, offset + i, &buf[i]) != -+ PCIBIOS_SUCCESSFUL) -+ break; -+ DBG_BLOCK(2) { -+ if (i != len) -+ WARNING("%u, %u", i, len); -+ } -+ return i; -+} -+ -+wstdcall ULONG WIN_FUNC(NdisImmediateReadPciSlotInformation,5) -+ (struct ndis_mp_block *nmb, ULONG slot, -+ ULONG offset, char *buf, ULONG len) -+{ -+ return NdisReadPciSlotInformation(nmb, slot, offset, buf, len); -+} -+ -+wstdcall ULONG WIN_FUNC(NdisWritePciSlotInformation,5) -+ (struct ndis_mp_block *nmb, ULONG slot, -+ ULONG offset, char *buf, ULONG len) -+{ -+ struct wrap_device *wd = nmb->wnd->wd; -+ ULONG i; -+ if (!wrap_is_pci_bus(wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return 0; -+ } -+ for (i = 0; i < len; i++) -+ if (pci_write_config_byte(wd->pci.pdev, offset + i, buf[i]) != -+ PCIBIOS_SUCCESSFUL) -+ break; -+ DBG_BLOCK(2) { -+ if (i != len) -+ WARNING("%u, %u", i, len); -+ } -+ return i; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMRegisterIoPortRange,4) -+ (void **virt, struct ndis_mp_block *nmb, UINT start, UINT len) -+{ -+ ENTER3("%08x %08x", start, len); -+ *virt = (void *)(ULONG_PTR)start; -+ return NDIS_STATUS_SUCCESS; -+} -+ -+wstdcall void WIN_FUNC(NdisMDeregisterIoPortRange,4) -+ (struct ndis_mp_block *nmb, UINT start, UINT len, void* virt) -+{ -+ ENTER1("%08x %08x", start, len); -+} -+ -+wstdcall void WIN_FUNC(NdisReadPortUchar,3) -+ (struct ndis_mp_block *nmb, ULONG port, char *data) -+{ -+ *data = inb(port); -+} -+ -+wstdcall void WIN_FUNC(NdisImmediateReadPortUchar,3) -+ (struct ndis_mp_block *nmb, ULONG port, char *data) -+{ -+ *data = inb(port); -+} -+ -+wstdcall void WIN_FUNC(NdisWritePortUchar,3) -+ (struct ndis_mp_block *nmb, ULONG port, char data) -+{ -+ outb(data, port); -+} -+ -+wstdcall void WIN_FUNC(NdisImmediateWritePortUchar,3) -+ (struct ndis_mp_block *nmb, ULONG port, char data) -+{ -+ outb(data, port); -+} -+ -+wstdcall void WIN_FUNC(NdisMQueryAdapterResources,4) -+ (NDIS_STATUS *status, struct ndis_mp_block *nmb, -+ NDIS_RESOURCE_LIST *resource_list, UINT *size) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ NDIS_RESOURCE_LIST *list; -+ UINT resource_length; -+ -+ list = &wnd->wd->resource_list->list->partial_resource_list; -+ resource_length = sizeof(struct cm_partial_resource_list) + -+ sizeof(struct cm_partial_resource_descriptor) * -+ (list->count - 1); -+ TRACE2("%p, %p,%d (%d), %p %d %d", wnd, resource_list, *size, -+ resource_length, &list->partial_descriptors[list->count-1], -+ list->partial_descriptors[list->count-1].u.interrupt.level, -+ list->partial_descriptors[list->count-1].u.interrupt.vector); -+ if (*size < sizeof(*list)) { -+ *size = resource_length; -+ *status = NDIS_STATUS_BUFFER_TOO_SHORT; -+ } else { -+ ULONG count; -+ if (*size >= resource_length) { -+ *size = resource_length; -+ count = list->count; -+ } else { -+ UINT n = sizeof(*list); -+ count = 1; -+ while (count++ < list->count && n < *size) -+ n += sizeof(list->partial_descriptors); -+ *size = n; -+ } -+ memcpy(resource_list, list, *size); -+ resource_list->count = count; -+ *status = NDIS_STATUS_SUCCESS; -+ } -+ EXIT2(return); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMPciAssignResources,3) -+ (struct ndis_mp_block *nmb, ULONG slot_number, -+ NDIS_RESOURCE_LIST **resources) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ -+ ENTER2("%p, %p", wnd, wnd->wd->resource_list); -+ *resources = &wnd->wd->resource_list->list->partial_resource_list; -+ EXIT2(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMMapIoSpace,4) -+ (void __iomem **virt, struct ndis_mp_block *nmb, -+ NDIS_PHY_ADDRESS phy_addr, UINT len) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ -+ ENTER2("%llx, %d", phy_addr, len); -+ *virt = MmMapIoSpace(phy_addr, len, MmCached); -+ if (*virt == NULL) { -+ ERROR("ioremap failed"); -+ EXIT2(return NDIS_STATUS_FAILURE); -+ } -+ wnd->mem_start = phy_addr; -+ wnd->mem_end = phy_addr + len; -+ TRACE2("%p", *virt); -+ EXIT2(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisMUnmapIoSpace,3) -+ (struct ndis_mp_block *nmb, void __iomem *virt, UINT len) -+{ -+ ENTER2("%p, %d", virt, len); -+ MmUnmapIoSpace(virt, len); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisAllocateSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ TRACE4("lock %p, %p", lock, &lock->klock); -+ KeInitializeSpinLock(&lock->klock); -+ lock->irql = PASSIVE_LEVEL; -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisFreeSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ TRACE4("lock %p, %p", lock, &lock->klock); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisAcquireSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ ENTER6("lock %p, %p", lock, &lock->klock); -+// assert_irql(_irql_ <= DISPATCH_LEVEL); -+ lock->irql = nt_spin_lock_irql(&lock->klock, DISPATCH_LEVEL); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisReleaseSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ ENTER6("lock %p, %p", lock, &lock->klock); -+// assert_irql(_irql_ == DISPATCH_LEVEL); -+ nt_spin_unlock_irql(&lock->klock, lock->irql); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisDprAcquireSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ ENTER6("lock %p", &lock->klock); -+// assert_irql(_irql_ == DISPATCH_LEVEL); -+ nt_spin_lock(&lock->klock); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisDprReleaseSpinLock,1) -+ (struct ndis_spinlock *lock) -+{ -+ ENTER6("lock %p", &lock->klock); -+// assert_irql(_irql_ == DISPATCH_LEVEL); -+ nt_spin_unlock(&lock->klock); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisInitializeReadWriteLock,1) -+ (struct ndis_rw_lock *rw_lock) -+{ -+ ENTER3("%p", rw_lock); -+ memset(rw_lock, 0, sizeof(*rw_lock)); -+ KeInitializeSpinLock(&rw_lock->klock); -+ return; -+} -+ -+/* read/write locks are implemented in a rather simplistic way - we -+ * should probably use Linux's rw_lock implementation */ -+ -+wstdcall void WIN_FUNC(NdisAcquireReadWriteLock,3) -+ (struct ndis_rw_lock *rw_lock, BOOLEAN write, -+ struct lock_state *lock_state) -+{ -+ if (write) { -+ while (1) { -+ if (cmpxchg(&rw_lock->count, 0, -1) == 0) -+ return; -+ while (rw_lock->count) -+ cpu_relax(); -+ } -+ return; -+ } -+ while (1) { -+ typeof(rw_lock->count) count; -+ while ((count = rw_lock->count) < 0) -+ cpu_relax(); -+ if (cmpxchg(&rw_lock->count, count, count + 1) == count) -+ return; -+ } -+} -+ -+wstdcall void WIN_FUNC(NdisReleaseReadWriteLock,2) -+ (struct ndis_rw_lock *rw_lock, struct lock_state *lock_state) -+{ -+ if (rw_lock->count > 0) -+ pre_atomic_add(rw_lock->count, -1); -+ else if (rw_lock->count == -1) -+ rw_lock->count = 0; -+ else -+ WARNING("invalid state: %d", rw_lock->count); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMAllocateMapRegisters,5) -+ (struct ndis_mp_block *nmb, UINT dmachan, -+ NDIS_DMA_SIZE dmasize, ULONG basemap, ULONG max_buf_size) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ -+ ENTER2("%p, %d %d %d %d", wnd, dmachan, dmasize, basemap, max_buf_size); -+ if (!wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return NDIS_STATUS_NOT_SUPPORTED; -+ } -+ if (wnd->dma_map_count > 0) { -+ WARNING("%s: map registers already allocated: %u", -+ wnd->net_dev->name, wnd->dma_map_count); -+ EXIT2(return NDIS_STATUS_RESOURCES); -+ } -+ if (dmasize == NDIS_DMA_24BITS) { -+ if (pci_set_dma_mask(wnd->wd->pci.pdev, DMA_BIT_MASK(24)) || -+ pci_set_consistent_dma_mask(wnd->wd->pci.pdev, -+ DMA_BIT_MASK(24))) -+ WARNING("setting dma mask failed"); -+ } else if (dmasize == NDIS_DMA_32BITS) { -+ /* consistent dma is in low 32-bits by default */ -+ if (pci_set_dma_mask(wnd->wd->pci.pdev, DMA_BIT_MASK(32))) -+ WARNING("setting dma mask failed"); -+#ifdef CONFIG_X86_64 -+ } else if (dmasize == NDIS_DMA_64BITS) { -+ if (pci_set_dma_mask(wnd->wd->pci.pdev, DMA_BIT_MASK(64)) || -+ pci_set_consistent_dma_mask(wnd->wd->pci.pdev, -+ DMA_BIT_MASK(64))) -+ WARNING("setting dma mask failed"); -+ else -+ wnd->net_dev->features |= NETIF_F_HIGHDMA; -+#endif -+ } else { -+ ERROR("dmasize %d not supported", dmasize); -+ EXIT2(return NDIS_STATUS_NOT_SUPPORTED); -+ } -+ /* since memory for buffer is allocated with kmalloc, buffer -+ * is physically contiguous, so entire map will fit in one -+ * register */ -+ if (basemap > 64) { -+ WARNING("Windows driver %s requesting too many (%u) " -+ "map registers", wnd->wd->driver->name, basemap); -+ /* As per NDIS, NDIS_STATUS_RESOURCES should be -+ * returned, but with that Atheros PCI driver fails - -+ * for now tolerate it */ -+// EXIT2(return NDIS_STATUS_RESOURCES); -+ } -+ -+ wnd->dma_map_addr = kzalloc(basemap * sizeof(*(wnd->dma_map_addr)), -+ GFP_KERNEL); -+ if (!wnd->dma_map_addr) -+ EXIT2(return NDIS_STATUS_RESOURCES); -+ wnd->dma_map_count = basemap; -+ TRACE2("%u", wnd->dma_map_count); -+ EXIT2(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisMFreeMapRegisters,1) -+ (struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ int i; -+ -+ ENTER2("wnd: %p", wnd); -+ if (wnd->dma_map_addr) { -+ for (i = 0; i < wnd->dma_map_count; i++) { -+ if (wnd->dma_map_addr[i]) -+ WARNING("%s: dma addr 0x%llx not freed by " -+ "Windows driver", wnd->net_dev->name, -+ (unsigned long long)wnd->dma_map_addr[i]); -+ } -+ kfree(wnd->dma_map_addr); -+ wnd->dma_map_addr = NULL; -+ } else -+ WARNING("map registers already freed?"); -+ wnd->dma_map_count = 0; -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMStartBufferPhysicalMapping,6) -+ (struct ndis_mp_block *nmb, ndis_buffer *buf, -+ ULONG index, BOOLEAN write_to_dev, -+ struct ndis_phy_addr_unit *phy_addr_array, UINT *array_size) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ -+ ENTER3("%p, %p, %u, %u", wnd, buf, index, wnd->dma_map_count); -+ if (!wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return; -+ } -+ if (unlikely(wnd->sg_dma_size || !write_to_dev || -+ index >= wnd->dma_map_count)) { -+ WARNING("invalid request: %d, %d, %d, %d", wnd->sg_dma_size, -+ write_to_dev, index, wnd->dma_map_count); -+ phy_addr_array[0].phy_addr = 0; -+ phy_addr_array[0].length = 0; -+ *array_size = 0; -+ return; -+ } -+ if (wnd->dma_map_addr[index]) { -+ TRACE2("buffer %p at %d is already mapped: %llx", buf, index, -+ (unsigned long long)wnd->dma_map_addr[index]); -+// *array_size = 1; -+ return; -+ } -+ TRACE3("%p, %p, %u", buf, MmGetSystemAddressForMdl(buf), -+ MmGetMdlByteCount(buf)); -+ DBG_BLOCK(4) { -+ dump_bytes(__func__, MmGetSystemAddressForMdl(buf), -+ MmGetMdlByteCount(buf)); -+ } -+ wnd->dma_map_addr[index] = -+ PCI_DMA_MAP_SINGLE(wnd->wd->pci.pdev, -+ MmGetSystemAddressForMdl(buf), -+ MmGetMdlByteCount(buf), PCI_DMA_TODEVICE); -+ phy_addr_array[0].phy_addr = wnd->dma_map_addr[index]; -+ phy_addr_array[0].length = MmGetMdlByteCount(buf); -+ TRACE4("%llx, %d, %d", phy_addr_array[0].phy_addr, -+ phy_addr_array[0].length, index); -+ *array_size = 1; -+} -+ -+wstdcall void WIN_FUNC(NdisMCompleteBufferPhysicalMapping,3) -+ (struct ndis_mp_block *nmb, ndis_buffer *buf, ULONG index) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ -+ ENTER3("%p, %p %u (%u)", wnd, buf, index, wnd->dma_map_count); -+ -+ if (!wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return; -+ } -+ if (unlikely(wnd->sg_dma_size)) -+ WARNING("buffer %p may have been unmapped already", buf); -+ if (index >= wnd->dma_map_count) { -+ ERROR("invalid map register (%u >= %u)", -+ index, wnd->dma_map_count); -+ return; -+ } -+ TRACE4("%llx", (unsigned long long)wnd->dma_map_addr[index]); -+ if (wnd->dma_map_addr[index]) { -+ PCI_DMA_UNMAP_SINGLE(wnd->wd->pci.pdev, wnd->dma_map_addr[index], -+ MmGetMdlByteCount(buf), PCI_DMA_TODEVICE); -+ wnd->dma_map_addr[index] = 0; -+ } else -+ WARNING("map registers at %u not used", index); -+} -+ -+wstdcall void WIN_FUNC(NdisMAllocateSharedMemory,5) -+ (struct ndis_mp_block *nmb, ULONG size, -+ BOOLEAN cached, void **virt, NDIS_PHY_ADDRESS *phys) -+{ -+ dma_addr_t dma_addr; -+ struct wrap_device *wd = nmb->wnd->wd; -+ -+ ENTER3("size: %u, cached: %d", size, cached); -+ if (!wrap_is_pci_bus(wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return; -+ } -+ *virt = PCI_DMA_ALLOC_COHERENT(wd->pci.pdev, size, &dma_addr); -+ if (*virt) -+ *phys = dma_addr; -+ else -+ WARNING("couldn't allocate %d bytes of %scached DMA memory", -+ size, cached ? "" : "un-"); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMFreeSharedMemory,5) -+ (struct ndis_mp_block *nmb, ULONG size, BOOLEAN cached, -+ void *virt, NDIS_PHY_ADDRESS addr) -+{ -+ struct wrap_device *wd = nmb->wnd->wd; -+ ENTER3("%p, %llx, %u", virt, addr, size); -+ if (!wrap_is_pci_bus(wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return; -+ } -+ PCI_DMA_FREE_COHERENT(wd->pci.pdev, size, virt, addr); -+ EXIT3(return); -+} -+ -+wstdcall void alloc_shared_memory_async(void *arg1, void *arg2) -+{ -+ struct ndis_device *wnd; -+ struct alloc_shared_mem *alloc_shared_mem; -+ struct miniport *mp; -+ void *virt; -+ NDIS_PHY_ADDRESS phys; -+ KIRQL irql; -+ -+ wnd = arg1; -+ alloc_shared_mem = arg2; -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ NdisMAllocateSharedMemory(wnd->nmb, alloc_shared_mem->size, -+ alloc_shared_mem->cached, &virt, &phys); -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ LIN2WIN5(mp->alloc_complete, wnd->nmb, virt, -+ &phys, alloc_shared_mem->size, alloc_shared_mem->ctx); -+ serialize_unlock_irql(wnd, irql); -+ kfree(alloc_shared_mem); -+} -+WIN_FUNC_DECL(alloc_shared_memory_async,2) -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMAllocateSharedMemoryAsync,4) -+ (struct ndis_mp_block *nmb, ULONG size, BOOLEAN cached, void *ctx) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct alloc_shared_mem *alloc_shared_mem; -+ -+ ENTER3("wnd: %p", wnd); -+ alloc_shared_mem = kmalloc(sizeof(*alloc_shared_mem), irql_gfp()); -+ if (!alloc_shared_mem) { -+ WARNING("couldn't allocate memory"); -+ return NDIS_STATUS_FAILURE; -+ } -+ -+ alloc_shared_mem->size = size; -+ alloc_shared_mem->cached = cached; -+ alloc_shared_mem->ctx = ctx; -+ if (schedule_ntos_work_item(WIN_FUNC_PTR(alloc_shared_memory_async,2), -+ wnd, alloc_shared_mem)) -+ EXIT3(return NDIS_STATUS_FAILURE); -+ EXIT3(return NDIS_STATUS_PENDING); -+} -+ -+/* Some drivers allocate NDIS_BUFFER (aka MDL) very often; instead of -+ * allocating and freeing with kernel functions, we chain them into -+ * ndis_buffer_pool. When an MDL is freed, it is added to the list of -+ * free MDLs. When allocated, we first check if there is one in free -+ * list and if so just return it; otherwise, we allocate a new one and -+ * return that. This reduces memory fragmentation. Windows DDK says -+ * that the driver itself shouldn't check what is returned in -+ * pool_handle, presumably because buffer pools are not used in -+ * XP. However, as long as driver follows rest of the semantics - that -+ * it should indicate maximum number of MDLs used with num_descr and -+ * pass the same pool_handle in other buffer functions, this should -+ * work. Sadly, though, NdisFreeBuffer doesn't pass the pool_handle, -+ * so we use 'process' field of MDL to store pool_handle. */ -+ -+wstdcall void WIN_FUNC(NdisAllocateBufferPool,3) -+ (NDIS_STATUS *status, struct ndis_buffer_pool **pool_handle, -+ UINT num_descr) -+{ -+ struct ndis_buffer_pool *pool; -+ -+ ENTER1("buffers: %d", num_descr); -+ pool = kmalloc(sizeof(*pool), irql_gfp()); -+ if (!pool) { -+ *status = NDIS_STATUS_RESOURCES; -+ EXIT3(return); -+ } -+ spin_lock_init(&pool->lock); -+ pool->max_descr = num_descr; -+ pool->num_allocated_descr = 0; -+ pool->free_descr = NULL; -+ *pool_handle = pool; -+ *status = NDIS_STATUS_SUCCESS; -+ TRACE1("pool: %p, num_descr: %d", pool, num_descr); -+ EXIT1(return); -+} -+ -+wstdcall void WIN_FUNC(NdisAllocateBuffer,5) -+ (NDIS_STATUS *status, ndis_buffer **buffer, -+ struct ndis_buffer_pool *pool, void *virt, UINT length) -+{ -+ ndis_buffer *descr; -+ -+ ENTER4("pool: %p (%d)", pool, pool->num_allocated_descr); -+ /* NDIS drivers should call this at DISPATCH_LEVEL, but -+ * alloc_tx_packet calls at SOFT_IRQL */ -+ assert_irql(_irql_ <= SOFT_LEVEL); -+ if (!pool) { -+ *status = NDIS_STATUS_FAILURE; -+ *buffer = NULL; -+ EXIT4(return); -+ } -+ spin_lock_bh(&pool->lock); -+ if ((descr = pool->free_descr)) -+ pool->free_descr = descr->next; -+ spin_unlock_bh(&pool->lock); -+ if (descr) { -+ typeof(descr->flags) flags; -+ flags = descr->flags; -+ memset(descr, 0, sizeof(*descr)); -+ MmInitializeMdl(descr, virt, length); -+ if (flags & MDL_CACHE_ALLOCATED) -+ descr->flags |= MDL_CACHE_ALLOCATED; -+ } else { -+ if (pool->num_allocated_descr > pool->max_descr) { -+ TRACE2("pool %p is full: %d(%d)", pool, -+ pool->num_allocated_descr, pool->max_descr); -+#ifndef ALLOW_POOL_OVERFLOW -+ *status = NDIS_STATUS_FAILURE; -+ *buffer = NULL; -+ return; -+#endif -+ } -+ descr = allocate_init_mdl(virt, length); -+ if (!descr) { -+ WARNING("couldn't allocate buffer"); -+ *status = NDIS_STATUS_FAILURE; -+ *buffer = NULL; -+ EXIT4(return); -+ } -+ TRACE4("buffer %p for %p, %d", descr, virt, length); -+ atomic_inc_var(pool->num_allocated_descr); -+ } -+ /* TODO: make sure this mdl can map given buffer */ -+ MmBuildMdlForNonPagedPool(descr); -+// descr->flags |= MDL_ALLOCATED_FIXED_SIZE | -+// MDL_MAPPED_TO_SYSTEM_VA | MDL_PAGES_LOCKED; -+ descr->pool = pool; -+ *buffer = descr; -+ *status = NDIS_STATUS_SUCCESS; -+ TRACE4("buffer: %p", descr); -+ EXIT4(return); -+} -+ -+wstdcall void WIN_FUNC(NdisFreeBuffer,1) -+ (ndis_buffer *buffer) -+{ -+ struct ndis_buffer_pool *pool; -+ -+ ENTER4("%p", buffer); -+ if (!buffer || !buffer->pool) { -+ ERROR("invalid buffer"); -+ EXIT4(return); -+ } -+ pool = buffer->pool; -+ if (pool->num_allocated_descr > MAX_ALLOCATED_NDIS_BUFFERS) { -+ /* NB NB NB: set mdl's 'pool' field to NULL before -+ * calling free_mdl; otherwise free_mdl calls -+ * NdisFreeBuffer back */ -+ atomic_dec_var(pool->num_allocated_descr); -+ buffer->pool = NULL; -+ free_mdl(buffer); -+ } else { -+ spin_lock_bh(&pool->lock); -+ buffer->next = pool->free_descr; -+ pool->free_descr = buffer; -+ spin_unlock_bh(&pool->lock); -+ } -+ EXIT4(return); -+} -+ -+wstdcall void WIN_FUNC(NdisFreeBufferPool,1) -+ (struct ndis_buffer_pool *pool) -+{ -+ ndis_buffer *cur, *next; -+ -+ TRACE3("pool: %p", pool); -+ if (!pool) { -+ WARNING("invalid pool"); -+ EXIT3(return); -+ } -+ spin_lock_bh(&pool->lock); -+ cur = pool->free_descr; -+ while (cur) { -+ next = cur->next; -+ cur->pool = NULL; -+ free_mdl(cur); -+ cur = next; -+ } -+ spin_unlock_bh(&pool->lock); -+ kfree(pool); -+ pool = NULL; -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisAdjustBufferLength,2) -+ (ndis_buffer *buffer, UINT length) -+{ -+ ENTER4("%p, %d", buffer, length); -+ buffer->bytecount = length; -+} -+ -+wstdcall void WIN_FUNC(NdisQueryBuffer,3) -+ (ndis_buffer *buffer, void **virt, UINT *length) -+{ -+ ENTER4("buffer: %p", buffer); -+ if (virt) -+ *virt = MmGetSystemAddressForMdl(buffer); -+ *length = MmGetMdlByteCount(buffer); -+ TRACE4("%p, %u", virt ? *virt : NULL, *length); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisQueryBufferSafe,4) -+ (ndis_buffer *buffer, void **virt, UINT *length, -+ enum mm_page_priority priority) -+{ -+ ENTER4("%p, %p, %p, %d", buffer, virt, length, priority); -+ if (virt) -+ *virt = MmGetSystemAddressForMdlSafe(buffer, priority); -+ *length = MmGetMdlByteCount(buffer); -+ TRACE4("%p, %u", virt ? *virt : NULL, *length); -+} -+ -+wstdcall void *WIN_FUNC(NdisBufferVirtualAddress,1) -+ (ndis_buffer *buffer) -+{ -+ ENTER3("%p", buffer); -+ return MmGetSystemAddressForMdl(buffer); -+} -+ -+wstdcall ULONG WIN_FUNC(NdisBufferLength,1) -+ (ndis_buffer *buffer) -+{ -+ ENTER3("%p", buffer); -+ return MmGetMdlByteCount(buffer); -+} -+ -+wstdcall void WIN_FUNC(NdisQueryBufferOffset,3) -+ (ndis_buffer *buffer, UINT *offset, UINT *length) -+{ -+ ENTER3("%p", buffer); -+ *offset = MmGetMdlByteOffset(buffer); -+ *length = MmGetMdlByteCount(buffer); -+ TRACE3("%d, %d", *offset, *length); -+} -+ -+wstdcall void WIN_FUNC(NdisUnchainBufferAtBack,2) -+ (struct ndis_packet *packet, ndis_buffer **buffer) -+{ -+ ndis_buffer *b, *btail; -+ -+ ENTER3("%p", packet); -+ b = packet->private.buffer_head; -+ if (!b) { -+ /* no buffer in packet */ -+ *buffer = NULL; -+ EXIT3(return); -+ } -+ btail = packet->private.buffer_tail; -+ *buffer = btail; -+ if (b == btail) { -+ /* one buffer in packet */ -+ packet->private.buffer_head = NULL; -+ packet->private.buffer_tail = NULL; -+ } else { -+ while (b->next != btail) -+ b = b->next; -+ packet->private.buffer_tail = b; -+ b->next = NULL; -+ } -+ packet->private.valid_counts = FALSE; -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisUnchainBufferAtFront,2) -+ (struct ndis_packet *packet, ndis_buffer **buffer) -+{ -+ ENTER3("%p", packet); -+ if (packet->private.buffer_head == NULL) { -+ /* no buffer in packet */ -+ *buffer = NULL; -+ EXIT3(return); -+ } -+ -+ *buffer = packet->private.buffer_head; -+ if (packet->private.buffer_head == packet->private.buffer_tail) { -+ /* one buffer in packet */ -+ packet->private.buffer_head = NULL; -+ packet->private.buffer_tail = NULL; -+ } else -+ packet->private.buffer_head = (*buffer)->next; -+ -+ packet->private.valid_counts = FALSE; -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisGetFirstBufferFromPacketSafe,6) -+ (struct ndis_packet *packet, ndis_buffer **first_buffer, -+ void **first_buffer_va, UINT *first_buffer_length, -+ UINT *total_buffer_length, enum mm_page_priority priority) -+{ -+ ndis_buffer *b = packet->private.buffer_head; -+ -+ ENTER3("%p(%p)", packet, b); -+ *first_buffer = b; -+ if (b) { -+ *first_buffer_va = MmGetSystemAddressForMdlSafe(b, priority); -+ *first_buffer_length = *total_buffer_length = -+ MmGetMdlByteCount(b); -+ for (b = b->next; b; b = b->next) -+ *total_buffer_length += MmGetMdlByteCount(b); -+ } else { -+ *first_buffer_va = NULL; -+ *first_buffer_length = 0; -+ *total_buffer_length = 0; -+ } -+ TRACE3("%p, %d, %d", *first_buffer_va, *first_buffer_length, -+ *total_buffer_length); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisGetFirstBufferFromPacket,6) -+ (struct ndis_packet *packet, ndis_buffer **first_buffer, -+ void **first_buffer_va, UINT *first_buffer_length, -+ UINT *total_buffer_length, enum mm_page_priority priority) -+{ -+ NdisGetFirstBufferFromPacketSafe(packet, first_buffer, -+ first_buffer_va, first_buffer_length, -+ total_buffer_length, -+ NormalPagePriority); -+} -+ -+wstdcall void WIN_FUNC(NdisAllocatePacketPoolEx,5) -+ (NDIS_STATUS *status, struct ndis_packet_pool **pool_handle, -+ UINT num_descr, UINT overflowsize, UINT proto_rsvd_length) -+{ -+ struct ndis_packet_pool *pool; -+ -+ ENTER3("buffers: %d, length: %d", num_descr, proto_rsvd_length); -+ pool = kzalloc(sizeof(*pool), irql_gfp()); -+ if (!pool) { -+ *status = NDIS_STATUS_RESOURCES; -+ EXIT3(return); -+ } -+ spin_lock_init(&pool->lock); -+ pool->max_descr = num_descr; -+ pool->num_allocated_descr = 0; -+ pool->num_used_descr = 0; -+ pool->free_descr = NULL; -+ pool->proto_rsvd_length = proto_rsvd_length; -+ *pool_handle = pool; -+ *status = NDIS_STATUS_SUCCESS; -+ TRACE3("pool: %p", pool); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisAllocatePacketPool,4) -+ (NDIS_STATUS *status, struct ndis_packet_pool **pool_handle, -+ UINT num_descr, UINT proto_rsvd_length) -+{ -+ NdisAllocatePacketPoolEx(status, pool_handle, num_descr, 0, -+ proto_rsvd_length); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisFreePacketPool,1) -+ (struct ndis_packet_pool *pool) -+{ -+ struct ndis_packet *packet, *next; -+ -+ ENTER3("pool: %p", pool); -+ if (!pool) { -+ WARNING("invalid pool"); -+ EXIT3(return); -+ } -+ spin_lock_bh(&pool->lock); -+ packet = pool->free_descr; -+ while (packet) { -+ next = (struct ndis_packet *)packet->reserved[0]; -+ kfree(packet); -+ packet = next; -+ } -+ pool->num_allocated_descr = 0; -+ pool->num_used_descr = 0; -+ pool->free_descr = NULL; -+ spin_unlock_bh(&pool->lock); -+ kfree(pool); -+ EXIT3(return); -+} -+ -+wstdcall UINT WIN_FUNC(NdisPacketPoolUsage,1) -+ (struct ndis_packet_pool *pool) -+{ -+ EXIT4(return pool->num_used_descr); -+} -+ -+wstdcall void WIN_FUNC(NdisAllocatePacket,3) -+ (NDIS_STATUS *status, struct ndis_packet **ndis_packet, -+ struct ndis_packet_pool *pool) -+{ -+ struct ndis_packet *packet; -+ int packet_length; -+ -+ ENTER4("pool: %p", pool); -+ if (!pool) { -+ *status = NDIS_STATUS_RESOURCES; -+ *ndis_packet = NULL; -+ EXIT4(return); -+ } -+ assert_irql(_irql_ <= SOFT_LEVEL); -+ if (pool->num_used_descr > pool->max_descr) { -+ TRACE3("pool %p is full: %d(%d)", pool, -+ pool->num_used_descr, pool->max_descr); -+#ifndef ALLOW_POOL_OVERFLOW -+ *status = NDIS_STATUS_RESOURCES; -+ *ndis_packet = NULL; -+ return; -+#endif -+ } -+ /* packet has space for 1 byte in protocol_reserved field */ -+ packet_length = sizeof(*packet) - 1 + pool->proto_rsvd_length + -+ sizeof(struct ndis_packet_oob_data); -+ spin_lock_bh(&pool->lock); -+ if ((packet = pool->free_descr)) -+ pool->free_descr = (void *)packet->reserved[0]; -+ spin_unlock_bh(&pool->lock); -+ if (!packet) { -+ packet = kmalloc(packet_length, irql_gfp()); -+ if (!packet) { -+ WARNING("couldn't allocate packet"); -+ *status = NDIS_STATUS_RESOURCES; -+ *ndis_packet = NULL; -+ return; -+ } -+ atomic_inc_var(pool->num_allocated_descr); -+ } -+ TRACE4("%p, %p", pool, packet); -+ atomic_inc_var(pool->num_used_descr); -+ memset(packet, 0, packet_length); -+ packet->private.oob_offset = -+ packet_length - sizeof(struct ndis_packet_oob_data); -+ packet->private.packet_flags = fPACKET_ALLOCATED_BY_NDIS; -+ packet->private.pool = pool; -+ *ndis_packet = packet; -+ *status = NDIS_STATUS_SUCCESS; -+ EXIT4(return); -+} -+ -+wstdcall void WIN_FUNC(NdisDprAllocatePacket,3) -+ (NDIS_STATUS *status, struct ndis_packet **packet, -+ struct ndis_packet_pool *pool) -+{ -+ NdisAllocatePacket(status, packet, pool); -+} -+ -+wstdcall void WIN_FUNC(NdisFreePacket,1) -+ (struct ndis_packet *packet) -+{ -+ struct ndis_packet_pool *pool; -+ -+ ENTER4("%p, %p", packet, packet->private.pool); -+ pool = packet->private.pool; -+ if (!pool) { -+ ERROR("invalid pool %p", packet); -+ EXIT4(return); -+ } -+ assert((int)pool->num_used_descr > 0); -+ atomic_dec_var(pool->num_used_descr); -+ if (packet->reserved[1]) { -+ TRACE3("%p, %p", packet, (void *)packet->reserved[1]); -+ kfree((void *)packet->reserved[1]); -+ packet->reserved[1] = 0; -+ } -+ if (pool->num_allocated_descr > MAX_ALLOCATED_NDIS_PACKETS) { -+ TRACE3("%p", pool); -+ atomic_dec_var(pool->num_allocated_descr); -+ kfree(packet); -+ } else { -+ TRACE4("%p, %p, %p", pool, packet, pool->free_descr); -+ spin_lock_bh(&pool->lock); -+ packet->reserved[0] = -+ (typeof(packet->reserved[0]))pool->free_descr; -+ pool->free_descr = packet; -+ spin_unlock_bh(&pool->lock); -+ } -+ EXIT4(return); -+} -+ -+wstdcall struct ndis_packet_stack *WIN_FUNC(NdisIMGetCurrentPacketStack,2) -+ (struct ndis_packet *packet, BOOLEAN *stacks_remain) -+{ -+ struct ndis_packet_stack *stack; -+ -+ if (!packet->reserved[1]) { -+ stack = kzalloc(2 * sizeof(*stack), irql_gfp()); -+ TRACE3("%p, %p", packet, stack); -+ packet->reserved[1] = (typeof(packet->reserved[1]))stack; -+ } else { -+ stack = (void *)packet->reserved[1];; -+ if (xchg(&stack->ndis_reserved[0], 1)) { -+ stack++; -+ if (xchg(&stack->ndis_reserved[0], 1)) -+ stack = NULL; -+ } -+ TRACE3("%p", stack); -+ } -+ if (stack) -+ *stacks_remain = TRUE; -+ else -+ *stacks_remain = FALSE; -+ -+ EXIT3(return stack); -+} -+ -+wstdcall void WIN_FUNC(NdisCopyFromPacketToPacketSafe,7) -+ (struct ndis_packet *dst, UINT dst_offset, UINT num_to_copy, -+ struct ndis_packet *src, UINT src_offset, UINT *num_copied, -+ enum mm_page_priority priority) -+{ -+ UINT dst_n, src_n, n, left; -+ ndis_buffer *dst_buf; -+ ndis_buffer *src_buf; -+ -+ ENTER4(""); -+ if (!dst || !src) { -+ *num_copied = 0; -+ EXIT4(return); -+ } -+ -+ dst_buf = dst->private.buffer_head; -+ src_buf = src->private.buffer_head; -+ -+ if (!dst_buf || !src_buf) { -+ *num_copied = 0; -+ EXIT4(return); -+ } -+ dst_n = MmGetMdlByteCount(dst_buf) - dst_offset; -+ src_n = MmGetMdlByteCount(src_buf) - src_offset; -+ -+ n = min(src_n, dst_n); -+ n = min(n, num_to_copy); -+ memcpy(MmGetSystemAddressForMdl(dst_buf) + dst_offset, -+ MmGetSystemAddressForMdl(src_buf) + src_offset, n); -+ -+ left = num_to_copy - n; -+ while (left > 0) { -+ src_offset += n; -+ dst_offset += n; -+ dst_n -= n; -+ src_n -= n; -+ if (dst_n == 0) { -+ dst_buf = dst_buf->next; -+ if (!dst_buf) -+ break; -+ dst_n = MmGetMdlByteCount(dst_buf); -+ dst_offset = 0; -+ } -+ if (src_n == 0) { -+ src_buf = src_buf->next; -+ if (!src_buf) -+ break; -+ src_n = MmGetMdlByteCount(src_buf); -+ src_offset = 0; -+ } -+ -+ n = min(src_n, dst_n); -+ n = min(n, left); -+ memcpy(MmGetSystemAddressForMdl(dst_buf) + dst_offset, -+ MmGetSystemAddressForMdl(src_buf) + src_offset, n); -+ left -= n; -+ } -+ *num_copied = num_to_copy - left; -+ EXIT4(return); -+} -+ -+wstdcall void WIN_FUNC(NdisCopyFromPacketToPacket,6) -+ (struct ndis_packet *dst, UINT dst_offset, UINT num_to_copy, -+ struct ndis_packet *src, UINT src_offset, UINT *num_copied) -+{ -+ NdisCopyFromPacketToPacketSafe(dst, dst_offset, num_to_copy, -+ src, src_offset, num_copied, -+ NormalPagePriority); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisIMCopySendPerPacketInfo,2) -+ (struct ndis_packet *dst, struct ndis_packet *src) -+{ -+ struct ndis_packet_oob_data *dst_oob, *src_oob; -+ dst_oob = NDIS_PACKET_OOB_DATA(dst); -+ src_oob = NDIS_PACKET_OOB_DATA(src); -+ memcpy(&dst_oob->ext, &src_oob->ext, sizeof(dst_oob->ext)); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisSend,3) -+ (NDIS_STATUS *status, struct ndis_mp_block *nmb, -+ struct ndis_packet *packet) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct miniport *mp; -+ KIRQL irql; -+ -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ if (mp->send_packets) { -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ LIN2WIN3(mp->send_packets, wnd->nmb->mp_ctx, &packet, 1); -+ serialize_unlock_irql(wnd, irql); -+ if (deserialized_driver(wnd)) -+ *status = NDIS_STATUS_PENDING; -+ else { -+ struct ndis_packet_oob_data *oob_data; -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ *status = oob_data->status; -+ switch (*status) { -+ case NDIS_STATUS_SUCCESS: -+ free_tx_packet(wnd, packet, *status); -+ break; -+ case NDIS_STATUS_PENDING: -+ break; -+ case NDIS_STATUS_RESOURCES: -+ wnd->tx_ok = 0; -+ break; -+ case NDIS_STATUS_FAILURE: -+ default: -+ free_tx_packet(wnd, packet, *status); -+ break; -+ } -+ } -+ } else { -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ *status = LIN2WIN3(mp->send, wnd->nmb->mp_ctx, packet, 0); -+ serialize_unlock_irql(wnd, irql); -+ switch (*status) { -+ case NDIS_STATUS_SUCCESS: -+ free_tx_packet(wnd, packet, *status); -+ break; -+ case NDIS_STATUS_PENDING: -+ break; -+ case NDIS_STATUS_RESOURCES: -+ wnd->tx_ok = 0; -+ break; -+ case NDIS_STATUS_FAILURE: -+ default: -+ free_tx_packet(wnd, packet, *status); -+ break; -+ } -+ } -+ EXIT3(return); -+} -+ -+/* called for serialized drivers only */ -+wstdcall void mp_timer_dpc(struct kdpc *kdpc, void *ctx, void *arg1, void *arg2) -+{ -+ struct ndis_mp_timer *timer; -+ struct ndis_mp_block *nmb; -+ -+ timer = ctx; -+ TIMERENTER("%p, %p, %p, %p", timer, timer->func, timer->ctx, timer->nmb); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ nmb = timer->nmb; -+ serialize_lock(nmb->wnd); -+ LIN2WIN4(timer->func, NULL, timer->ctx, NULL, NULL); -+ serialize_unlock(nmb->wnd); -+ TIMEREXIT(return); -+} -+WIN_FUNC_DECL(mp_timer_dpc,4) -+ -+wstdcall void WIN_FUNC(NdisMInitializeTimer,4) -+ (struct ndis_mp_timer *timer, struct ndis_mp_block *nmb, -+ DPC func, void *ctx) -+{ -+ TIMERENTER("%p, %p, %p, %p", timer, func, ctx, nmb); -+ assert_irql(_irql_ == PASSIVE_LEVEL); -+ timer->func = func; -+ timer->ctx = ctx; -+ timer->nmb = nmb; -+ if (deserialized_driver(nmb->wnd)) -+ KeInitializeDpc(&timer->kdpc, func, ctx); -+ else -+ KeInitializeDpc(&timer->kdpc, WIN_FUNC_PTR(mp_timer_dpc,4), -+ timer); -+ wrap_init_timer(&timer->nt_timer, NotificationTimer, nmb); -+ TIMEREXIT(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMSetPeriodicTimer,2) -+ (struct ndis_mp_timer *timer, UINT period_ms) -+{ -+ unsigned long expires = MSEC_TO_HZ(period_ms); -+ -+ TIMERENTER("%p, %u, %ld", timer, period_ms, expires); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ wrap_set_timer(&timer->nt_timer, expires, expires, &timer->kdpc); -+ TIMEREXIT(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMCancelTimer,2) -+ (struct ndis_mp_timer *timer, BOOLEAN *canceled) -+{ -+ TIMERENTER("%p", timer); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ *canceled = KeCancelTimer(&timer->nt_timer); -+ TIMERTRACE("%d", *canceled); -+ return; -+} -+ -+wstdcall void WIN_FUNC(NdisInitializeTimer,3) -+ (struct ndis_timer *timer, void *func, void *ctx) -+{ -+ TIMERENTER("%p, %p, %p", timer, func, ctx); -+ assert_irql(_irql_ == PASSIVE_LEVEL); -+ KeInitializeDpc(&timer->kdpc, func, ctx); -+ wrap_init_timer(&timer->nt_timer, NotificationTimer, NULL); -+ TIMEREXIT(return); -+} -+ -+/* NdisMSetTimer is a macro that calls NdisSetTimer with -+ * ndis_mp_timer typecast to ndis_timer */ -+ -+wstdcall void WIN_FUNC(NdisSetTimer,2) -+ (struct ndis_timer *timer, UINT duetime_ms) -+{ -+ unsigned long expires = MSEC_TO_HZ(duetime_ms); -+ -+ TIMERENTER("%p, %p, %u, %ld", timer, timer->nt_timer.wrap_timer, -+ duetime_ms, expires); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ wrap_set_timer(&timer->nt_timer, expires, 0, &timer->kdpc); -+ TIMEREXIT(return); -+} -+ -+wstdcall void WIN_FUNC(NdisCancelTimer,2) -+ (struct ndis_timer *timer, BOOLEAN *canceled) -+{ -+ TIMERENTER("%p", timer); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ *canceled = KeCancelTimer(&timer->nt_timer); -+ TIMEREXIT(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMRegisterAdapterShutdownHandler,3) -+ (struct ndis_mp_block *nmb, void *ctx, void *func) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ ENTER1("%p", func); -+ wnd->wd->driver->ndis_driver->mp.shutdown = func; -+ wnd->shutdown_ctx = ctx; -+} -+ -+wstdcall void WIN_FUNC(NdisMDeregisterAdapterShutdownHandler,1) -+ (struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ wnd->wd->driver->ndis_driver->mp.shutdown = NULL; -+ wnd->shutdown_ctx = NULL; -+} -+ -+/* TODO: rt61 (serialized) driver doesn't want MiniportEnableInterrupt -+ * to be called in irq handler, but mrv800c (deserialized) driver -+ * wants. NDIS is confusing about when to call MiniportEnableInterrupt -+ * For now, handle these cases with two separate irq handlers based on -+ * observation of these two drivers. However, it is likely not -+ * correct. */ -+wstdcall void deserialized_irq_handler(struct kdpc *kdpc, void *ctx, -+ void *arg1, void *arg2) -+{ -+ struct ndis_device *wnd = ctx; -+ ndis_interrupt_handler irq_handler = arg1; -+ struct miniport *mp = arg2; -+ -+ TRACE6("%p", irq_handler); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ LIN2WIN1(irq_handler, wnd->nmb->mp_ctx); -+ if (mp->enable_interrupt) -+ LIN2WIN1(mp->enable_interrupt, wnd->nmb->mp_ctx); -+ EXIT6(return); -+} -+WIN_FUNC_DECL(deserialized_irq_handler,4) -+ -+wstdcall void serialized_irq_handler(struct kdpc *kdpc, void *ctx, -+ void *arg1, void *arg2) -+{ -+ struct ndis_device *wnd = ctx; -+ ndis_interrupt_handler irq_handler = arg1; -+ -+ TRACE6("%p, %p, %p", wnd, irq_handler, arg2); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ serialize_lock(wnd); -+ LIN2WIN1(irq_handler, arg2); -+ serialize_unlock(wnd); -+ EXIT6(return); -+} -+WIN_FUNC_DECL(serialized_irq_handler,4) -+ -+wstdcall BOOLEAN ndis_isr(struct kinterrupt *kinterrupt, void *ctx) -+{ -+ struct ndis_mp_interrupt *mp_interrupt = ctx; -+ struct ndis_device *wnd = mp_interrupt->nmb->wnd; -+ BOOLEAN recognized = TRUE, queue_handler = TRUE; -+ -+ TRACE6("%p", wnd); -+ /* kernel may call ISR when registering interrupt, in -+ * the same context if DEBUG_SHIRQ is enabled */ -+ assert_irql(_irql_ == DIRQL || _irql_ == PASSIVE_LEVEL); -+ if (mp_interrupt->shared) -+ LIN2WIN3(mp_interrupt->isr, &recognized, &queue_handler, -+ wnd->nmb->mp_ctx); -+ else { -+ struct miniport *mp; -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ LIN2WIN1(mp->disable_interrupt, wnd->nmb->mp_ctx); -+ /* it is not shared interrupt, so handler must be called */ -+ recognized = queue_handler = TRUE; -+ } -+ if (recognized) { -+ if (queue_handler) { -+ TRACE5("%p", &wnd->irq_kdpc); -+ queue_kdpc(&wnd->irq_kdpc); -+ } -+ EXIT6(return TRUE); -+ } -+ EXIT6(return FALSE); -+} -+WIN_FUNC_DECL(ndis_isr,2) -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMRegisterInterrupt,7) -+ (struct ndis_mp_interrupt *mp_interrupt, -+ struct ndis_mp_block *nmb, UINT vector, UINT level, -+ BOOLEAN req_isr, BOOLEAN shared, enum kinterrupt_mode mode) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct miniport *mp; -+ -+ ENTER1("%p, vector:%d, level:%d, req_isr:%d, shared:%d, mode:%d", -+ mp_interrupt, vector, level, req_isr, shared, mode); -+ -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ nt_spin_lock_init(&mp_interrupt->lock); -+ mp_interrupt->irq = vector; -+ mp_interrupt->isr = mp->isr; -+ mp_interrupt->mp_dpc = mp->handle_interrupt; -+ mp_interrupt->nmb = nmb; -+ mp_interrupt->req_isr = req_isr; -+ if (shared && !req_isr) -+ WARNING("shared but dynamic interrupt!"); -+ mp_interrupt->shared = shared; -+ wnd->mp_interrupt = mp_interrupt; -+ if (mp->enable_interrupt) -+ mp_interrupt->enable = TRUE; -+ else -+ mp_interrupt->enable = FALSE; -+ -+ if (deserialized_driver(wnd)) { -+ KeInitializeDpc(&wnd->irq_kdpc, -+ WIN_FUNC_PTR(deserialized_irq_handler,4), -+ nmb->wnd); -+ wnd->irq_kdpc.arg1 = mp->handle_interrupt; -+ wnd->irq_kdpc.arg2 = mp; -+ TRACE2("%p, %p, %p, %p", wnd->irq_kdpc.arg1, wnd->irq_kdpc.arg2, -+ nmb->wnd, nmb->mp_ctx); -+ } else { -+ KeInitializeDpc(&wnd->irq_kdpc, -+ WIN_FUNC_PTR(serialized_irq_handler,4), -+ nmb->wnd); -+ wnd->irq_kdpc.arg1 = mp->handle_interrupt; -+ wnd->irq_kdpc.arg2 = nmb->mp_ctx; -+ TRACE2("%p, %p, %p", wnd->irq_kdpc.arg1, wnd->irq_kdpc.arg2, -+ nmb->wnd); -+ } -+ -+ if (IoConnectInterrupt(&mp_interrupt->kinterrupt, -+ WIN_FUNC_PTR(ndis_isr,2), mp_interrupt, NULL, -+ vector, DIRQL, DIRQL, mode, shared, 0, FALSE) != -+ STATUS_SUCCESS) { -+ printk(KERN_WARNING "%s: request for IRQ %d failed\n", -+ DRIVER_NAME, vector); -+ return NDIS_STATUS_RESOURCES; -+ } -+ printk(KERN_INFO "%s: using IRQ %d\n", DRIVER_NAME, vector); -+ EXIT1(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisMDeregisterInterrupt,1) -+ (struct ndis_mp_interrupt *mp_interrupt) -+{ -+ struct ndis_mp_block *nmb; -+ -+ ENTER1("%p", mp_interrupt); -+ nmb = xchg(&mp_interrupt->nmb, NULL); -+ TRACE1("%p", nmb); -+ if (!nmb) { -+ WARNING("interrupt already freed?"); -+ return; -+ } -+ nmb->wnd->mp_interrupt = NULL; -+ if (dequeue_kdpc(&nmb->wnd->irq_kdpc)) -+ TRACE2("interrupt kdpc was pending"); -+ flush_workqueue(wrapndis_wq); -+ IoDisconnectInterrupt(mp_interrupt->kinterrupt); -+ EXIT1(return); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(NdisMSynchronizeWithInterrupt,3) -+ (struct ndis_mp_interrupt *mp_interrupt, -+ PKSYNCHRONIZE_ROUTINE sync_func, void *ctx) -+{ -+ return KeSynchronizeExecution(mp_interrupt->kinterrupt, sync_func, ctx); -+} -+ -+/* called via function pointer; but 64-bit RNDIS driver calls directly */ -+wstdcall void WIN_FUNC(NdisMIndicateStatus,4) -+ (struct ndis_mp_block *nmb, NDIS_STATUS status, void *buf, UINT len) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct ndis_status_indication *si; -+ -+ ENTER2("status=0x%x len=%d", status, len); -+ switch (status) { -+ case NDIS_STATUS_MEDIA_CONNECT: -+ set_media_state(wnd, NdisMediaStateConnected); -+ break; -+ case NDIS_STATUS_MEDIA_DISCONNECT: -+ set_media_state(wnd, NdisMediaStateDisconnected); -+ break; -+ case NDIS_STATUS_MEDIA_SPECIFIC_INDICATION: -+ if (!buf) -+ break; -+ si = buf; -+ TRACE2("status_type=%d", si->status_type); -+ switch (si->status_type) { -+ case Ndis802_11StatusType_MediaStreamMode: -+ break; -+#ifdef CONFIG_WIRELESS_EXT -+ case Ndis802_11StatusType_Authentication: -+ buf = (char *)buf + sizeof(*si); -+ len -= sizeof(*si); -+ while (len > 0) { -+ int pairwise_error = 0, group_error = 0; -+ struct ndis_auth_req *auth_req = -+ (struct ndis_auth_req *)buf; -+ TRACE1(MACSTRSEP, MAC2STR(auth_req->bssid)); -+ if (auth_req->flags & 0x01) -+ TRACE2("reauth request"); -+ if (auth_req->flags & 0x02) -+ TRACE2("key update request"); -+ if (auth_req->flags & 0x06) { -+ pairwise_error = 1; -+ TRACE2("pairwise_error"); -+ } -+ if (auth_req->flags & 0x0E) { -+ group_error = 1; -+ TRACE2("group_error"); -+ } -+ if (pairwise_error || group_error) { -+ union iwreq_data wrqu; -+ struct iw_michaelmicfailure micfailure; -+ -+ memset(&micfailure, 0, sizeof(micfailure)); -+ if (pairwise_error) -+ micfailure.flags |= -+ IW_MICFAILURE_PAIRWISE; -+ if (group_error) -+ micfailure.flags |= -+ IW_MICFAILURE_GROUP; -+ memcpy(micfailure.src_addr.sa_data, -+ auth_req->bssid, ETH_ALEN); -+ memset(&wrqu, 0, sizeof(wrqu)); -+ wrqu.data.length = sizeof(micfailure); -+ wireless_send_event(wnd->net_dev, -+ IWEVMICHAELMICFAILURE, -+ &wrqu, (u8 *)&micfailure); -+ } -+ len -= auth_req->length; -+ buf = (char *)buf + auth_req->length; -+ } -+ break; -+ case Ndis802_11StatusType_PMKID_CandidateList: -+ { -+ u8 *end; -+ unsigned long i; -+ struct ndis_pmkid_candidate_list *cand; -+ -+ cand = buf + sizeof(struct ndis_status_indication); -+ if (len < sizeof(struct ndis_status_indication) + -+ sizeof(struct ndis_pmkid_candidate_list) || -+ cand->version != 1) { -+ WARNING("unrecognized PMKID ignored"); -+ EXIT1(return); -+ } -+ -+ end = (u8 *)buf + len; -+ TRACE2("PMKID ver %d num_cand %d", -+ cand->version, cand->num_candidates); -+ for (i = 0; i < cand->num_candidates; i++) { -+ struct iw_pmkid_cand pcand; -+ union iwreq_data wrqu; -+ struct ndis_pmkid_candidate *c = -+ &cand->candidates[i]; -+ if ((u8 *)(c + 1) > end) { -+ TRACE2("truncated PMKID"); -+ break; -+ } -+ TRACE2("%ld: " MACSTRSEP " 0x%x", -+ i, MAC2STR(c->bssid), c->flags); -+ memset(&pcand, 0, sizeof(pcand)); -+ if (c->flags & 0x01) -+ pcand.flags |= IW_PMKID_CAND_PREAUTH; -+ pcand.index = i; -+ memcpy(pcand.bssid.sa_data, c->bssid, ETH_ALEN); -+ -+ memset(&wrqu, 0, sizeof(wrqu)); -+ wrqu.data.length = sizeof(pcand); -+ wireless_send_event(wnd->net_dev, IWEVPMKIDCAND, -+ &wrqu, (u8 *)&pcand); -+ } -+ break; -+ } -+ case Ndis802_11StatusType_RadioState: -+ { -+ struct ndis_radio_status_indication *radio_status = buf; -+ if (radio_status->radio_state == -+ Ndis802_11RadioStatusOn) -+ INFO("radio is turned on"); -+ else if (radio_status->radio_state == -+ Ndis802_11RadioStatusHardwareOff) -+ INFO("radio is turned off by hardware"); -+ else if (radio_status->radio_state == -+ Ndis802_11RadioStatusSoftwareOff) -+ INFO("radio is turned off by software"); -+ break; -+ } -+#endif -+ default: -+ /* is this RSSI indication? */ -+ TRACE2("unknown indication: %x", si->status_type); -+ break; -+ } -+ break; -+ default: -+ TRACE2("unknown status: %08X", status); -+ break; -+ } -+ -+ EXIT2(return); -+} -+ -+/* called via function pointer; but 64-bit RNDIS driver calls directly */ -+wstdcall void WIN_FUNC(NdisMIndicateStatusComplete,1) -+ (struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ ENTER2("%p", wnd); -+ if (wnd->tx_ok) -+ queue_work(wrapndis_wq, &wnd->tx_work); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMSendComplete(struct ndis_mp_block *nmb, -+ struct ndis_packet *packet, NDIS_STATUS status) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ ENTER4("%p, %08X", packet, status); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ if (deserialized_driver(wnd)) -+ free_tx_packet(wnd, packet, status); -+ else { -+ struct ndis_packet_oob_data *oob_data; -+ NDIS_STATUS pkt_status; -+ TRACE3("%p, %08x", packet, status); -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ switch ((pkt_status = xchg(&oob_data->status, status))) { -+ case NDIS_STATUS_NOT_RECOGNIZED: -+ free_tx_packet(wnd, packet, status); -+ break; -+ case NDIS_STATUS_PENDING: -+ case 0: -+ break; -+ default: -+ WARNING("%p: invalid status: %08X", packet, pkt_status); -+ break; -+ } -+ /* In case a serialized driver has earlier requested a -+ * pause by returning NDIS_STATUS_RESOURCES during -+ * MiniportSend(Packets), wakeup tx worker now. -+ */ -+ if (xchg(&wnd->tx_ok, 1) == 0) { -+ TRACE3("%d, %d", wnd->tx_ring_start, wnd->tx_ring_end); -+ queue_work(wrapndis_wq, &wnd->tx_work); -+ } -+ } -+ EXIT3(return); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMSendResourcesAvailable(struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ ENTER3("%d, %d", wnd->tx_ring_start, wnd->tx_ring_end); -+ wnd->tx_ok = 1; -+ queue_work(wrapndis_wq, &wnd->tx_work); -+ EXIT3(return); -+} -+ -+wstdcall void return_packet(void *arg1, void *arg2) -+{ -+ struct ndis_device *wnd; -+ struct ndis_packet *packet; -+ struct miniport *mp; -+ KIRQL irql; -+ -+ wnd = arg1; -+ packet = arg2; -+ ENTER4("%p, %p", wnd, packet); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ LIN2WIN2(mp->return_packet, wnd->nmb->mp_ctx, packet); -+ serialize_unlock_irql(wnd, irql); -+ EXIT4(return); -+} -+WIN_FUNC_DECL(return_packet,2) -+ -+/* called via function pointer */ -+wstdcall void NdisMIndicateReceivePacket(struct ndis_mp_block *nmb, -+ struct ndis_packet **packets, -+ UINT nr_packets) -+{ -+ struct ndis_device *wnd; -+ ndis_buffer *buffer; -+ struct ndis_packet *packet; -+ struct sk_buff *skb; -+ ULONG i, length, total_length; -+ struct ndis_packet_oob_data *oob_data; -+ void *virt; -+ struct ndis_tcp_ip_checksum_packet_info csum; -+ -+ ENTER3("%p, %d", nmb, nr_packets); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ wnd = nmb->wnd; -+ for (i = 0; i < nr_packets; i++) { -+ packet = packets[i]; -+ if (!packet) { -+ WARNING("empty packet ignored"); -+ continue; -+ } -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,11,0) -+ wnd->net_dev->last_rx = jiffies; -+#endif -+ /* get total number of bytes in packet */ -+ NdisGetFirstBufferFromPacketSafe(packet, &buffer, &virt, -+ &length, &total_length, -+ NormalPagePriority); -+ TRACE3("%d, %d", length, total_length); -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ TRACE3("0x%x, 0x%x, %llu", packet->private.flags, -+ packet->private.packet_flags, oob_data->time_rxed); -+ skb = dev_alloc_skb(total_length); -+ if (skb) { -+ while (buffer) { -+ memcpy_skb(skb, MmGetSystemAddressForMdl(buffer), -+ MmGetMdlByteCount(buffer)); -+ buffer = buffer->next; -+ } -+ skb->dev = wnd->net_dev; -+ skb->protocol = eth_type_trans(skb, wnd->net_dev); -+ pre_atomic_add(wnd->net_stats.rx_bytes, total_length); -+ atomic_inc_var(wnd->net_stats.rx_packets); -+ csum.value = (typeof(csum.value))(ULONG_PTR) -+ oob_data->ext.info[TcpIpChecksumPacketInfo]; -+ TRACE3("0x%05x", csum.value); -+ if (wnd->rx_csum.value && -+ (csum.rx.tcp_succeeded || csum.rx.udp_succeeded || -+ csum.rx.ip_succeeded)) -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ else -+ skb->ip_summed = CHECKSUM_NONE; -+ -+ if (in_interrupt()) -+ netif_rx(skb); -+ else -+ netif_rx_ni(skb); -+ } else { -+ WARNING("couldn't allocate skb; packet dropped"); -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ } -+ -+ /* serialized drivers check the status upon return -+ * from this function */ -+ if (!deserialized_driver(wnd)) { -+ oob_data->status = NDIS_STATUS_SUCCESS; -+ continue; -+ } -+ -+ /* if a deserialized driver sets -+ * NDIS_STATUS_RESOURCES, then it reclaims the packet -+ * upon return from this function */ -+ if (oob_data->status == NDIS_STATUS_RESOURCES) -+ continue; -+ -+ assert(oob_data->status == NDIS_STATUS_SUCCESS); -+ /* deserialized driver doesn't check the status upon -+ * return from this function; we need to call -+ * MiniportReturnPacket later for this packet. Calling -+ * MiniportReturnPacket from here is not correct - the -+ * driver doesn't expect it (at least Centrino driver -+ * crashes) */ -+ schedule_ntos_work_item(WIN_FUNC_PTR(return_packet,2), -+ wnd, packet); -+ } -+ EXIT3(return); -+} -+ -+/* called via function pointer (by NdisMEthIndicateReceive macro); the -+ * first argument is nmb->eth_db */ -+wstdcall void EthRxIndicateHandler(struct ndis_mp_block *nmb, void *rx_ctx, -+ char *header1, char *header, UINT header_size, -+ void *look_ahead, UINT look_ahead_size, -+ UINT packet_size) -+{ -+ struct sk_buff *skb = NULL; -+ struct ndis_device *wnd; -+ unsigned int skb_size = 0; -+ KIRQL irql; -+ struct ndis_packet_oob_data *oob_data; -+ -+ ENTER3("nmb = %p, rx_ctx = %p, buf = %p, size = %d, buf = %p, " -+ "size = %d, packet = %d", nmb, rx_ctx, header, header_size, -+ look_ahead, look_ahead_size, packet_size); -+ -+ wnd = nmb->wnd; -+ TRACE3("wnd = %p", wnd); -+ if (!wnd) { -+ ERROR("nmb is NULL"); -+ EXIT3(return); -+ } -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,11,0) -+ wnd->net_dev->last_rx = jiffies; -+#endif -+ -+ if (look_ahead_size < packet_size) { -+ struct ndis_packet *packet; -+ struct miniport *mp; -+ unsigned int bytes_txed; -+ NDIS_STATUS res; -+ -+ NdisAllocatePacket(&res, &packet, wnd->tx_packet_pool); -+ if (res != NDIS_STATUS_SUCCESS) { -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ EXIT3(return); -+ } -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ res = LIN2WIN6(mp->tx_data, packet, &bytes_txed, nmb, -+ rx_ctx, look_ahead_size, packet_size); -+ serialize_unlock_irql(wnd, irql); -+ TRACE3("%d, %d, %d", header_size, look_ahead_size, bytes_txed); -+ if (res == NDIS_STATUS_SUCCESS) { -+ ndis_buffer *buffer; -+ struct ndis_tcp_ip_checksum_packet_info csum; -+ skb = dev_alloc_skb(header_size + look_ahead_size + -+ bytes_txed); -+ if (!skb) { -+ ERROR("couldn't allocate skb; packet dropped"); -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ NdisFreePacket(packet); -+ return; -+ } -+ memcpy_skb(skb, header, header_size); -+ memcpy_skb(skb, look_ahead, look_ahead_size); -+ buffer = packet->private.buffer_head; -+ while (buffer) { -+ memcpy_skb(skb, -+ MmGetSystemAddressForMdl(buffer), -+ MmGetMdlByteCount(buffer)); -+ buffer = buffer->next; -+ } -+ skb_size = header_size + look_ahead_size + bytes_txed; -+ csum.value = (typeof(csum.value))(ULONG_PTR) -+ oob_data->ext.info[TcpIpChecksumPacketInfo]; -+ TRACE3("0x%05x", csum.value); -+ if (wnd->rx_csum.value && -+ (csum.rx.tcp_succeeded || csum.rx.udp_succeeded)) -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ else -+ skb->ip_summed = CHECKSUM_NONE; -+ NdisFreePacket(packet); -+ } else if (res == NDIS_STATUS_PENDING) { -+ /* driver will call td_complete */ -+ oob_data->look_ahead = kmalloc(look_ahead_size, -+ GFP_ATOMIC); -+ if (!oob_data->look_ahead) { -+ NdisFreePacket(packet); -+ ERROR("packet dropped"); -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ EXIT3(return); -+ } -+ assert(sizeof(oob_data->header) == header_size); -+ memcpy(oob_data->header, header, -+ sizeof(oob_data->header)); -+ memcpy(oob_data->look_ahead, look_ahead, -+ look_ahead_size); -+ oob_data->look_ahead_size = look_ahead_size; -+ EXIT3(return); -+ } else { -+ WARNING("packet dropped: %08X", res); -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ NdisFreePacket(packet); -+ EXIT3(return); -+ } -+ } else { -+ skb_size = header_size + packet_size; -+ skb = dev_alloc_skb(skb_size); -+ if (skb) { -+ memcpy_skb(skb, header, header_size); -+ memcpy_skb(skb, look_ahead, packet_size); -+ } -+ } -+ -+ if (skb) { -+ skb->dev = wnd->net_dev; -+ skb->protocol = eth_type_trans(skb, wnd->net_dev); -+ pre_atomic_add(wnd->net_stats.rx_bytes, skb_size); -+ atomic_inc_var(wnd->net_stats.rx_packets); -+ if (in_interrupt()) -+ netif_rx(skb); -+ else -+ netif_rx_ni(skb); -+ } -+ -+ EXIT3(return); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMTransferDataComplete(struct ndis_mp_block *nmb, -+ struct ndis_packet *packet, -+ NDIS_STATUS status, UINT bytes_txed) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct sk_buff *skb; -+ unsigned int skb_size; -+ struct ndis_packet_oob_data *oob_data; -+ ndis_buffer *buffer; -+ struct ndis_tcp_ip_checksum_packet_info csum; -+ -+ ENTER3("wnd = %p, packet = %p, bytes_txed = %d", -+ wnd, packet, bytes_txed); -+ if (!packet) { -+ WARNING("illegal packet"); -+ EXIT3(return); -+ } -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,11,0) -+ wnd->net_dev->last_rx = jiffies; -+#endif -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ skb_size = sizeof(oob_data->header) + oob_data->look_ahead_size + -+ bytes_txed; -+ skb = dev_alloc_skb(skb_size); -+ if (!skb) { -+ kfree(oob_data->look_ahead); -+ NdisFreePacket(packet); -+ ERROR("couldn't allocate skb; packet dropped"); -+ atomic_inc_var(wnd->net_stats.rx_dropped); -+ EXIT3(return); -+ } -+ memcpy_skb(skb, oob_data->header, sizeof(oob_data->header)); -+ memcpy_skb(skb, oob_data->look_ahead, oob_data->look_ahead_size); -+ buffer = packet->private.buffer_head; -+ while (buffer) { -+ memcpy_skb(skb, MmGetSystemAddressForMdl(buffer), -+ MmGetMdlByteCount(buffer)); -+ buffer = buffer->next; -+ } -+ kfree(oob_data->look_ahead); -+ NdisFreePacket(packet); -+ skb->dev = wnd->net_dev; -+ skb->protocol = eth_type_trans(skb, wnd->net_dev); -+ pre_atomic_add(wnd->net_stats.rx_bytes, skb_size); -+ atomic_inc_var(wnd->net_stats.rx_packets); -+ -+ csum.value = (typeof(csum.value))(ULONG_PTR) -+ oob_data->ext.info[TcpIpChecksumPacketInfo]; -+ TRACE3("0x%05x", csum.value); -+ if (wnd->rx_csum.value && -+ (csum.rx.tcp_succeeded || csum.rx.udp_succeeded)) -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ else -+ skb->ip_summed = CHECKSUM_NONE; -+ -+ if (in_interrupt()) -+ netif_rx(skb); -+ else -+ netif_rx_ni(skb); -+} -+ -+/* called via function pointer */ -+wstdcall void EthRxComplete(struct ndis_mp_block *nmb) -+{ -+ TRACE3(""); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMQueryInformationComplete(struct ndis_mp_block *nmb, -+ NDIS_STATUS status) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ typeof(wnd->ndis_req_task) task; -+ -+ ENTER2("nmb: %p, wnd: %p, %08X", nmb, wnd, status); -+ wnd->ndis_req_status = status; -+ wnd->ndis_req_done = 1; -+ if ((task = xchg(&wnd->ndis_req_task, NULL))) -+ wake_up_process(task); -+ else -+ WARNING("invalid task"); -+ EXIT2(return); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMSetInformationComplete(struct ndis_mp_block *nmb, -+ NDIS_STATUS status) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ typeof(wnd->ndis_req_task) task; -+ -+ ENTER2("status = %08X", status); -+ wnd->ndis_req_status = status; -+ wnd->ndis_req_done = 1; -+ if ((task = xchg(&wnd->ndis_req_task, NULL))) -+ wake_up_process(task); -+ else -+ WARNING("invalid task"); -+ EXIT2(return); -+} -+ -+/* called via function pointer */ -+wstdcall void NdisMResetComplete(struct ndis_mp_block *nmb, -+ NDIS_STATUS status, BOOLEAN address_reset) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ typeof(wnd->ndis_req_task) task; -+ -+ ENTER2("status: %08X, %u", status, address_reset); -+ wnd->ndis_req_status = status; -+ wnd->ndis_req_done = address_reset + 1; -+ if ((task = xchg(&wnd->ndis_req_task, NULL))) -+ wake_up_process(task); -+ else -+ WARNING("invalid task"); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMSleep,1) -+ (ULONG us) -+{ -+ unsigned long delay; -+ -+ ENTER4("%p: us: %u", current, us); -+ delay = USEC_TO_HZ(us); -+ sleep_hz(delay); -+ TRACE4("%p: done", current); -+} -+ -+wstdcall void WIN_FUNC(NdisGetCurrentSystemTime,1) -+ (LARGE_INTEGER *time) -+{ -+ *time = ticks_1601(); -+ TRACE5("%llu, %lu", *time, jiffies); -+} -+ -+wstdcall LONG WIN_FUNC(NdisInterlockedDecrement,1) -+ (LONG *val) -+{ -+ return InterlockedDecrement(val); -+} -+ -+wstdcall LONG WIN_FUNC(NdisInterlockedIncrement,1) -+ (LONG *val) -+{ -+ return InterlockedIncrement(val); -+} -+ -+wstdcall struct nt_list *WIN_FUNC(NdisInterlockedInsertHeadList,3) -+ (struct nt_list *head, struct nt_list *entry, -+ struct ndis_spinlock *lock) -+{ -+ return ExInterlockedInsertHeadList(head, entry, &lock->klock); -+} -+ -+wstdcall struct nt_list *WIN_FUNC(NdisInterlockedInsertTailList,3) -+ (struct nt_list *head, struct nt_list *entry, -+ struct ndis_spinlock *lock) -+{ -+ return ExInterlockedInsertTailList(head, entry, &lock->klock); -+} -+ -+wstdcall struct nt_list *WIN_FUNC(NdisInterlockedRemoveHeadList,2) -+ (struct nt_list *head, struct ndis_spinlock *lock) -+{ -+ return ExInterlockedRemoveHeadList(head, &lock->klock); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMInitializeScatterGatherDma,3) -+ (struct ndis_mp_block *nmb, BOOLEAN dma64_supported, ULONG max_phy_map) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ ENTER2("dma64_supported=%d, maxtransfer=%u", dma64_supported, -+ max_phy_map); -+ if (!wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ ERROR("used on a non-PCI device"); -+ return NDIS_STATUS_NOT_SUPPORTED; -+ } -+#ifdef CONFIG_X86_64 -+ if (!dma64_supported) { -+ TRACE1("64-bit DMA size is not supported"); -+ if (pci_set_dma_mask(wnd->wd->pci.pdev, DMA_BIT_MASK(32)) || -+ pci_set_consistent_dma_mask(wnd->wd->pci.pdev, -+ DMA_BIT_MASK(32))) -+ WARNING("setting dma mask failed"); -+ } -+#endif -+ if ((wnd->attributes & NDIS_ATTRIBUTE_BUS_MASTER) && -+ wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ wnd->sg_dma_size = max_phy_map; -+ return NDIS_STATUS_SUCCESS; -+ } else -+ EXIT1(return NDIS_STATUS_NOT_SUPPORTED); -+} -+ -+wstdcall ULONG WIN_FUNC(NdisMGetDmaAlignment,1) -+ (struct ndis_mp_block *nmb) -+{ -+ ENTER3(""); -+ return dma_get_cache_alignment(); -+} -+ -+wstdcall CHAR WIN_FUNC(NdisSystemProcessorCount,0) -+ (void) -+{ -+ return num_online_cpus(); -+} -+ -+wstdcall void WIN_FUNC(NdisGetCurrentProcessorCounts,3) -+ (ULONG *idle, ULONG *kernel_user, ULONG *index) -+{ -+ int cpu = smp_processor_id(); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0) -+ *idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; -+ *kernel_user = kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM] + -+ kcpustat_cpu(cpu).cpustat[CPUTIME_USER]; -+#else -+ *idle = kstat_cpu(cpu).cpustat.idle; -+ *kernel_user = kstat_cpu(cpu).cpustat.system + -+ kstat_cpu(cpu).cpustat.user; -+#endif -+ *index = cpu; -+} -+ -+wstdcall void WIN_FUNC(NdisInitializeEvent,1) -+ (struct ndis_event *ndis_event) -+{ -+ EVENTENTER("%p", ndis_event); -+ KeInitializeEvent(&ndis_event->nt_event, NotificationEvent, 0); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(NdisWaitEvent,2) -+ (struct ndis_event *ndis_event, UINT ms) -+{ -+ LARGE_INTEGER ticks; -+ NTSTATUS res; -+ -+ EVENTENTER("%p %u", ndis_event, ms); -+ ticks = -((LARGE_INTEGER)ms * TICKSPERMSEC); -+ res = KeWaitForSingleObject(&ndis_event->nt_event, 0, 0, TRUE, -+ ms == 0 ? NULL : &ticks); -+ if (res == STATUS_SUCCESS) -+ EXIT3(return TRUE); -+ else -+ EXIT3(return FALSE); -+} -+ -+wstdcall void WIN_FUNC(NdisSetEvent,1) -+ (struct ndis_event *ndis_event) -+{ -+ EVENTENTER("%p", ndis_event); -+ KeSetEvent(&ndis_event->nt_event, 0, 0); -+} -+ -+wstdcall void WIN_FUNC(NdisResetEvent,1) -+ (struct ndis_event *ndis_event) -+{ -+ EVENTENTER("%p", ndis_event); -+ KeResetEvent(&ndis_event->nt_event); -+} -+ -+static void ndis_worker(struct work_struct *dummy) -+{ -+ struct nt_list *ent; -+ struct ndis_work_item *ndis_work_item; -+ -+ WORKENTER(""); -+ while (1) { -+ spin_lock_bh(&ndis_work_list_lock); -+ ent = RemoveHeadList(&ndis_work_list); -+ spin_unlock_bh(&ndis_work_list_lock); -+ if (!ent) -+ break; -+ ndis_work_item = container_of(ent, struct ndis_work_item, list); -+ WORKTRACE("%p: %p, %p", ndis_work_item, -+ ndis_work_item->func, ndis_work_item->ctx); -+ LIN2WIN2(ndis_work_item->func, ndis_work_item, -+ ndis_work_item->ctx); -+ WORKTRACE("%p done", ndis_work_item); -+ } -+ WORKEXIT(return); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisScheduleWorkItem,1) -+ (struct ndis_work_item *ndis_work_item) -+{ -+ ENTER3("%p", ndis_work_item); -+ spin_lock_bh(&ndis_work_list_lock); -+ InsertTailList(&ndis_work_list, &ndis_work_item->list); -+ spin_unlock_bh(&ndis_work_list_lock); -+ WORKTRACE("scheduling %p", ndis_work_item); -+ queue_work(ndis_wq, &ndis_work); -+ EXIT3(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisMGetDeviceProperty,6) -+ (struct ndis_mp_block *nmb, void **phy_dev, void **func_dev, -+ void **next_dev, void **alloc_res, void**trans_res) -+{ -+ ENTER2("nmb: %p, phy_dev = %p, func_dev = %p, next_dev = %p, " -+ "alloc_res = %p, trans_res = %p", nmb, phy_dev, func_dev, -+ next_dev, alloc_res, trans_res); -+ if (phy_dev) -+ *phy_dev = nmb->pdo; -+ if (func_dev) -+ *func_dev = nmb->fdo; -+ if (next_dev) -+ *next_dev = nmb->next_device; -+} -+ -+wstdcall void WIN_FUNC(NdisMRegisterUnloadHandler,2) -+ (struct driver_object *drv_obj, void *unload) -+{ -+ if (drv_obj) -+ drv_obj->unload = unload; -+ return; -+} -+ -+wstdcall UINT WIN_FUNC(NdisGetVersion,0) -+ (void) -+{ -+ return 0x00050001; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMQueryAdapterInstanceName,2) -+ (struct unicode_string *name, struct ndis_mp_block *nmb) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ struct ansi_string ansi; -+ -+ if (wrap_is_pci_bus(wnd->wd->dev_bus)) -+ RtlInitAnsiString(&ansi, "PCI Ethernet Adapter"); -+ else -+ RtlInitAnsiString(&ansi, "USB Ethernet Adapter"); -+ -+ if (RtlAnsiStringToUnicodeString(name, &ansi, TRUE)) -+ EXIT2(return NDIS_STATUS_RESOURCES); -+ else -+ EXIT2(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisWriteEventLogEntry,7) -+ (void *handle, NDIS_STATUS code, ULONG value, USHORT n, -+ void *strings, ULONG datasize, void *data) -+{ -+ TRACE1("0x%x, 0x%x, %u, %u", code, value, n, datasize); -+ return NDIS_STATUS_SUCCESS; -+} -+ -+wstdcall void *WIN_FUNC(NdisGetRoutineAddress,1) -+ (struct unicode_string *unicode_string) -+{ -+ struct ansi_string ansi_string; -+ void *address; -+ -+ if (RtlUnicodeStringToAnsiString(&ansi_string, unicode_string, TRUE) != -+ STATUS_SUCCESS) -+ EXIT1(return NULL); -+ INFO("%s", ansi_string.buf); -+ address = ndis_get_routine_address(ansi_string.buf); -+ RtlFreeAnsiString(&ansi_string); -+ return address; -+} -+ -+wstdcall ULONG WIN_FUNC(NdisReadPcmciaAttributeMemory,4) -+ (struct ndis_mp_block *nmb, ULONG offset, void *buffer, -+ ULONG length) -+{ -+ TODO(); -+ return 0; -+} -+ -+wstdcall ULONG WIN_FUNC(NdisWritePcmciaAttributeMemory,4) -+ (struct ndis_mp_block *nmb, ULONG offset, void *buffer, -+ ULONG length) -+{ -+ TODO(); -+ return 0; -+} -+ -+wstdcall void WIN_FUNC(NdisMCoIndicateReceivePacket,3) -+ (struct ndis_mp_block *nmb, struct ndis_packet **packets, -+ UINT nr_packets) -+{ -+ ENTER3("nmb = %p", nmb); -+ NdisMIndicateReceivePacket(nmb, packets, nr_packets); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMCoSendComplete,3) -+ (NDIS_STATUS status, struct ndis_mp_block *nmb, -+ struct ndis_packet *packet) -+{ -+ ENTER3("%08x", status); -+ NdisMSendComplete(nmb, packet, status); -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(NdisMCoRequestComplete,3) -+ (NDIS_STATUS status, struct ndis_mp_block *nmb, -+ struct ndis_request *ndis_request) -+{ -+ struct ndis_device *wnd = nmb->wnd; -+ typeof(wnd->ndis_req_task) task; -+ -+ ENTER3("%08X", status); -+ wnd->ndis_req_status = status; -+ wnd->ndis_req_done = 1; -+ if ((task = xchg(&wnd->ndis_req_task, NULL))) -+ wake_up_process(task); -+ else -+ WARNING("invalid task"); -+ EXIT3(return); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisIMNotifiyPnPEvent,2) -+ (struct ndis_mp_block *nmb, struct net_pnp_event *event) -+{ -+ ENTER2("%p, %d", nmb, event->code); -+ /* NdisWrapper never calls protocol's pnp event notifier, so -+ * nothing to do here */ -+ EXIT2(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisCompletePnPEvent,3) -+ (NDIS_STATUS status, void *handle, struct net_pnp_event *event) -+{ -+ ENTER2("%d, %p, %d", status, handle, event->code); -+ /* NdisWrapper never calls protocol's pnp event notifier, so -+ * nothing to do here */ -+ EXIT2(return); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMSetMiniportSecondary,2) -+ (struct ndis_mp_block *nmb2, struct ndis_mp_block *nmb1) -+{ -+ ENTER3("%p, %p", nmb1, nmb2); -+ TODO(); -+ EXIT3(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMPromoteMiniport,1) -+ (struct ndis_mp_block *nmb) -+{ -+ ENTER3("%p", nmb); -+ TODO(); -+ EXIT3(return NDIS_STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(NdisMCoActivateVcComplete,3) -+ (NDIS_STATUS status, void *handle, void *params) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(NdisMCoDeactivateVcComplete,2) -+ (NDIS_STATUS status, void *handle) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(NdisMRemoveMiniport,1) -+ (void *handle) -+{ -+ TODO(); -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMOpenLog,3) -+ (struct ndis_device *wnd, UINT size, void *handle) -+{ -+ if (size >= sizeof(int)) -+ *((int *)handle) = 42; -+ return NDIS_STATUS_SUCCESS; -+} -+ -+wstdcall NDIS_STATUS WIN_FUNC(NdisMWriteLogData,3) -+ (void *handle, char *buffer, UINT buffer_size) -+{ -+ TODO(); -+ return NDIS_STATUS_SUCCESS; -+} -+ -+wstdcall void WIN_FUNC(NdisMFlushLog,1) -+ (void *handle) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(NdisMCloseLog,1) -+ (void *handle) -+{ -+ TODO(); -+} -+ -+static void *ndis_get_routine_address(char *name) -+{ -+ int i; -+ ENTER2("%p", name); -+ for (i = 0; i < ARRAY_SIZE(ndis_exports); i++) { -+ if (strcmp(name, ndis_exports[i].name) == 0) { -+ TRACE2("%p", ndis_exports[i].func); -+ return ndis_exports[i].func; -+ } -+ } -+ EXIT2(return NULL); -+} -+ -+/* ndis_init_device is called for each device */ -+int ndis_init_device(struct ndis_device *wnd) -+{ -+ struct ndis_mp_block *nmb = wnd->nmb; -+ -+ KeInitializeSpinLock(&nmb->lock); -+ wnd->mp_interrupt = NULL; -+ wnd->wrap_timer_slist.next = NULL; -+ if (wnd->wd->driver->ndis_driver) -+ wnd->wd->driver->ndis_driver->mp.shutdown = NULL; -+ -+ nmb->filterdbs.eth_db = nmb; -+ nmb->filterdbs.tr_db = nmb; -+ nmb->filterdbs.fddi_db = nmb; -+ nmb->filterdbs.arc_db = nmb; -+ -+ nmb->rx_packet = WIN_FUNC_PTR(NdisMIndicateReceivePacket,3); -+ nmb->send_complete = WIN_FUNC_PTR(NdisMSendComplete,3); -+ nmb->send_resource_avail = WIN_FUNC_PTR(NdisMSendResourcesAvailable,1); -+ nmb->status = WIN_FUNC_PTR(NdisMIndicateStatus,4); -+ nmb->status_complete = WIN_FUNC_PTR(NdisMIndicateStatusComplete,1); -+ nmb->queryinfo_complete = WIN_FUNC_PTR(NdisMQueryInformationComplete,2); -+ nmb->setinfo_complete = WIN_FUNC_PTR(NdisMSetInformationComplete,2); -+ nmb->reset_complete = WIN_FUNC_PTR(NdisMResetComplete,3); -+ nmb->eth_rx_indicate = WIN_FUNC_PTR(EthRxIndicateHandler,8); -+ nmb->eth_rx_complete = WIN_FUNC_PTR(EthRxComplete,1); -+ nmb->td_complete = WIN_FUNC_PTR(NdisMTransferDataComplete,4); -+ return 0; -+} -+ -+/* ndis_exit_device is called for each device */ -+void ndis_exit_device(struct ndis_device *wnd) -+{ -+ struct wrap_device_setting *setting; -+ ENTER2("%p", wnd); -+ mutex_lock(&loader_mutex); -+ nt_list_for_each_entry(setting, &wnd->wd->settings, list) { -+ struct ndis_configuration_parameter *param; -+ param = setting->encoded; -+ if (param) { -+ if (param->type == NdisParameterString) -+ RtlFreeUnicodeString(¶m->data.string); -+ ExFreePool(param); -+ setting->encoded = NULL; -+ } -+ } -+ mutex_unlock(&loader_mutex); -+} -+ -+/* ndis_init is called once when module is loaded */ -+int ndis_init(void) -+{ -+ InitializeListHead(&ndis_work_list); -+ spin_lock_init(&ndis_work_list_lock); -+ INIT_WORK(&ndis_work, ndis_worker); -+ -+ ndis_wq = create_singlethread_workqueue("ndis_wq"); -+ if (!ndis_wq) { -+ WARNING("couldn't create worker thread"); -+ EXIT1(return -ENOMEM); -+ } -+ -+ TRACE1("ndis_wq: %p", ndis_wq); -+ return 0; -+} -+ -+/* ndis_exit is called once when module is removed */ -+void ndis_exit(void) -+{ -+ ENTER1(""); -+ if (ndis_wq) -+ destroy_workqueue(ndis_wq); -+ EXIT1(return); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ndis.h linux-5.6.11-ndis/3rdparty/ndiswrapper/ndis.h ---- linux-5.6.11/3rdparty/ndiswrapper/ndis.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ndis.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1309 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _NDIS_H_ -+#define _NDIS_H_ -+ -+#include "ntoskernel.h" -+ -+//#define ALLOW_POOL_OVERFLOW 1 -+ -+#define NDIS_DMA_24BITS 0 -+#define NDIS_DMA_32BITS 1 -+#define NDIS_DMA_64BITS 2 -+ -+#ifdef CONFIG_X86_64 -+#define MAXIMUM_PROCESSORS 64 -+#else -+#define MAXIMUM_PROCESSORS 32 -+#endif -+ -+typedef UINT NDIS_STATUS; -+typedef UCHAR NDIS_DMA_SIZE; -+typedef LONG ndis_rssi; -+typedef ULONG ndis_key_index; -+typedef ULONG ndis_tx_power_level; -+typedef ULONGULONG ndis_key_rsc; -+typedef UCHAR mac_address[ETH_ALEN]; -+typedef ULONG ndis_fragmentation_threshold; -+typedef ULONG ndis_rts_threshold; -+typedef ULONG ndis_antenna; -+typedef ULONG ndis_oid; -+ -+typedef uint64_t NDIS_PHY_ADDRESS; -+ -+struct ndis_sg_element { -+ PHYSICAL_ADDRESS address; -+ ULONG length; -+ ULONG_PTR reserved; -+}; -+ -+struct ndis_sg_list { -+ ULONG nent; -+ ULONG_PTR reserved; -+ struct ndis_sg_element elements[]; -+}; -+ -+/* when sending packets, ndiswrapper associates exactly one sg element -+ * in sg list */ -+struct wrap_tx_sg_list { -+ ULONG nent; -+ ULONG_PTR reserved; -+ struct ndis_sg_element elements[1]; -+}; -+ -+struct ndis_phy_addr_unit { -+ NDIS_PHY_ADDRESS phy_addr; -+ UINT length; -+}; -+ -+typedef struct mdl ndis_buffer; -+ -+struct ndis_buffer_pool { -+ ndis_buffer *free_descr; -+// NT_SPIN_LOCK lock; -+ spinlock_t lock; -+ UINT max_descr; -+ UINT num_allocated_descr; -+}; -+ -+#define NDIS_PROTOCOL_ID_DEFAULT 0x00 -+#define NDIS_PROTOCOL_ID_TCP_IP 0x02 -+#define NDIS_PROTOCOL_ID_IPX 0x06 -+#define NDIS_PROTOCOL_ID_NBF 0x07 -+#define NDIS_PROTOCOL_ID_MAX 0x0F -+#define NDIS_PROTOCOL_ID_MASK 0x0F -+ -+#define fPACKET_WRAPPER_RESERVED 0x3F -+#define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40 -+#define fPACKET_ALLOCATED_BY_NDIS 0x80 -+ -+#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(void *)) -+ -+struct transport_header_offset { -+ USHORT protocol_type; -+ USHORT header_offset; -+}; -+ -+struct ndis_network_address { -+ USHORT length; -+ USHORT type; -+ UCHAR address[1]; -+}; -+ -+struct ndis_network_address_list { -+ LONG count; -+ USHORT type; -+ struct ndis_network_address address[1]; -+}; -+ -+struct ndis_tcp_ip_checksum_packet_info { -+ union { -+ struct { -+ ULONG v4:1; -+ ULONG v6:1; -+ ULONG tcp:1; -+ ULONG udp:1; -+ ULONG ip:1; -+ } tx; -+ struct { -+ ULONG tcp_failed:1; -+ ULONG udp_failed:1; -+ ULONG ip_failed:1; -+ ULONG tcp_succeeded:1; -+ ULONG udp_succeeded:1; -+ ULONG ip_succeeded:1; -+ ULONG loopback:1; -+ } rx; -+ ULONG value; -+ }; -+}; -+ -+enum ndis_task { -+ TcpIpChecksumNdisTask, IpSecNdisTask, TcpLargeSendNdisTask, MaxNdisTask -+}; -+ -+enum ndis_encapsulation { -+ UNSPECIFIED_Encapsulation, NULL_Encapsulation, -+ IEEE_802_3_Encapsulation, IEEE_802_5_Encapsulation, -+ LLC_SNAP_ROUTED_Encapsulation, LLC_SNAP_BRIDGED_Encapsulation -+}; -+ -+#define NDIS_TASK_OFFLOAD_VERSION 1 -+ -+struct ndis_encapsulation_format { -+ enum ndis_encapsulation encap; -+ struct { -+ ULONG fixed_header_size:1; -+ ULONG reserved:31; -+ } flags; -+ ULONG header_size; -+}; -+ -+struct ndis_task_offload_header { -+ ULONG version; -+ ULONG size; -+ ULONG reserved; -+ ULONG offset_first_task; -+ struct ndis_encapsulation_format encap_format; -+}; -+ -+struct ndis_task_offload { -+ ULONG version; -+ ULONG size; -+ enum ndis_task task; -+ ULONG offset_next_task; -+ ULONG task_buf_length; -+ UCHAR task_buf[1]; -+}; -+ -+struct v4_checksum { -+ union { -+ struct { -+ ULONG ip_opts:1; -+ ULONG tcp_opts:1; -+ ULONG tcp_csum:1; -+ ULONG udp_csum:1; -+ ULONG ip_csum:1; -+ }; -+ ULONG value; -+ }; -+}; -+ -+struct v6_checksum { -+ ULONG ip_supported:1; -+ ULONG tcp_supported:1; -+ ULONG tcp_csum:1; -+ ULONG udp_csum:1; -+}; -+ -+struct ndis_task_tcp_ip_checksum { -+ struct v4_checksum v4_tx; -+ struct v4_checksum v4_rx; -+ struct v6_checksum v6_tx; -+ struct v6_checksum v6_rx; -+}; -+ -+struct ndis_task_tcp_large_send { -+ ULONG version; -+ ULONG max_size; -+ ULONG min_seg_count; -+ BOOLEAN tcp_opts; -+ BOOLEAN ip_opts; -+}; -+ -+struct ndis_packet; -+ -+struct ndis_packet_pool { -+ struct ndis_packet *free_descr; -+// NT_SPIN_LOCK lock; -+ spinlock_t lock; -+ UINT max_descr; -+ UINT num_allocated_descr; -+ UINT num_used_descr; -+ UINT proto_rsvd_length; -+}; -+ -+struct ndis_packet_stack { -+ ULONG_PTR IM_reserved[2]; -+ ULONG_PTR ndis_reserved[4]; -+}; -+ -+enum ndis_per_packet_info { -+ TcpIpChecksumPacketInfo, IpSecPacketInfo, TcpLargeSendPacketInfo, -+ ClassificationHandlePacketInfo, NdisReserved, -+ ScatterGatherListPacketInfo, Ieee8021QInfo, OriginalPacketInfo, -+ PacketCancelId, MaxPerPacketInfo -+}; -+ -+struct ndis_packet_extension { -+ void *info[MaxPerPacketInfo]; -+}; -+ -+struct ndis_packet_private { -+ UINT nr_pages; -+ UINT len; -+ ndis_buffer *buffer_head; -+ ndis_buffer *buffer_tail; -+ struct ndis_packet_pool *pool; -+ UINT count; -+ ULONG flags; -+ BOOLEAN valid_counts; -+ UCHAR packet_flags; -+ USHORT oob_offset; -+}; -+ -+struct ndis_packet { -+ struct ndis_packet_private private; -+ /* for use by miniport */ -+ union { -+ /* for connectionless mininports */ -+ struct { -+ UCHAR miniport_reserved[2 * sizeof(void *)]; -+ UCHAR wrapper_reserved[2 * sizeof(void *)]; -+ } cl_reserved; -+ /* for deserialized miniports */ -+ struct { -+ UCHAR miniport_reserved_ex[3 * sizeof(void *)]; -+ UCHAR wrapper_reserved_ex[sizeof(void *)]; -+ } deserialized_reserved; -+ struct { -+ UCHAR mac_reserved[4 * sizeof(void *)]; -+ } mac_reserved; -+ }; -+ ULONG_PTR reserved[2]; -+ UCHAR protocol_reserved[1]; -+}; -+ -+/* OOB data */ -+struct ndis_packet_oob_data { -+ union { -+ ULONGLONG time_to_tx; -+ ULONGLONG time_txed; -+ }; -+ ULONGLONG time_rxed; -+ UINT header_size; -+ UINT media_size; -+ void *media; -+ NDIS_STATUS status; -+ -+ /* ndiswrapper specific info; extension should be right after -+ * ndis's oob_data */ -+ struct ndis_packet_extension ext; -+ union { -+ /* used for tx only */ -+ struct { -+ struct sk_buff *tx_skb; -+ union { -+ struct wrap_tx_sg_list wrap_tx_sg_list; -+ struct ndis_sg_list *tx_sg_list; -+ }; -+ }; -+ /* used for rx only */ -+ struct { -+ unsigned char header[ETH_HLEN]; -+ unsigned char *look_ahead; -+ UINT look_ahead_size; -+ }; -+ }; -+}; -+ -+#define NDIS_PACKET_OOB_DATA(packet) \ -+ (struct ndis_packet_oob_data *)(((void *)(packet)) + \ -+ (packet)->private.oob_offset) -+ -+enum ndis_device_pnp_event { -+ NdisDevicePnPEventQueryRemoved, NdisDevicePnPEventRemoved, -+ NdisDevicePnPEventSurpriseRemoved, NdisDevicePnPEventQueryStopped, -+ NdisDevicePnPEventStopped, NdisDevicePnPEventPowerProfileChanged, -+ NdisDevicePnPEventMaximum -+}; -+ -+enum ndis_request_type { -+ NdisRequestQueryInformation, NdisRequestSetInformation, -+ NdisRequestQueryStatistics, NdisRequestOpen, NdisRequestClose, -+ NdisRequestSend, NdisRequestTransferData, NdisRequestReset, -+ NdisRequestGeneric1, NdisRequestGeneric2, NdisRequestGeneric3, -+ NdisRequestGeneric4 -+}; -+ -+struct ndis_request { -+ mac_address mac; -+ enum ndis_request_type request_type; -+ union data { -+ struct query_info { -+ UINT oid; -+ void *buf; -+ UINT buf_len; -+ UINT written; -+ UINT needed; -+ } query_info; -+ struct set_info { -+ UINT oid; -+ void *buf; -+ UINT buf_len; -+ UINT written; -+ UINT needed; -+ } set_info; -+ } data; -+}; -+ -+enum ndis_medium { -+ NdisMedium802_3, NdisMedium802_5, NdisMediumFddi, NdisMediumWan, -+ NdisMediumLocalTalk, NdisMediumDix, NdisMediumArcnetRaw, -+ NdisMediumArcnet878_2, NdisMediumAtm, NdisMediumWirelessWan, -+ NdisMediumIrda, NdisMediumBpc, NdisMediumCoWan, -+ NdisMedium1394, NdisMediumMax -+}; -+ -+enum ndis_physical_medium { -+ NdisPhysicalMediumUnspecified, NdisPhysicalMediumWirelessLan, -+ NdisPhysicalMediumCableModem, NdisPhysicalMediumPhoneLine, -+ NdisPhysicalMediumPowerLine, NdisPhysicalMediumDSL, -+ NdisPhysicalMediumFibreChannel, NdisPhysicalMedium1394, -+ NdisPhysicalMediumWirelessWan, NdisPhysicalMediumMax -+}; -+ -+enum ndis_power_state { -+ NdisDeviceStateUnspecified = 0, -+ NdisDeviceStateD0, NdisDeviceStateD1, NdisDeviceStateD2, -+ NdisDeviceStateD3, NdisDeviceStateMaximum -+}; -+ -+enum ndis_power_profile { -+ NdisPowerProfileBattery, NdisPowerProfileAcOnLine -+}; -+ -+struct ndis_pm_wakeup_capabilities { -+ enum ndis_power_state min_magic_packet_wakeup; -+ enum ndis_power_state min_pattern_wakeup; -+ enum ndis_power_state min_link_change_wakeup; -+}; -+ -+#define NDIS_PNP_WAKE_UP_MAGIC_PACKET 0x00000001 -+#define NDIS_PNP_WAKE_UP_PATTERN_MATCH 0x00000002 -+#define NDIS_PNP_WAKE_UP_LINK_CHANGE 0x00000004 -+ -+enum net_pnp_event_code { -+ NetEventSetPower, NetEventQueryPower, NetEventQueryRemoveDevice, -+ NetEventCancelRemoveDevice, NetEventReconfigure, NetEventBindList, -+ NetEventBindsComplete, NetEventPnPCapabilities, NetEventMaximum -+}; -+ -+struct net_pnp_event { -+ enum net_pnp_event_code code; -+ void *buf; -+ ULONG buf_length; -+ ULONG_PTR ndis_reserved[4]; -+ ULONG_PTR transport_reserved[4]; -+ ULONG_PTR tdi_reserved[4]; -+ ULONG_PTR tdi_client_reserved[4]; -+}; -+ -+struct ndis_pnp_capabilities { -+ ULONG flags; -+ struct ndis_pm_wakeup_capabilities wakeup; -+}; -+ -+typedef void (*ndis_isr_handler)(BOOLEAN *recognized, BOOLEAN *queue_handler, -+ void *handle) wstdcall; -+typedef void (*ndis_interrupt_handler)(void *ctx) wstdcall; -+ -+struct miniport { -+ /* NDIS 3.0 */ -+ UCHAR major_version; -+ UCHAR minor_version; -+ USHORT filler; -+ UINT reserved; -+ BOOLEAN (*hangcheck)(void *ctx) wstdcall; -+ void (*disable_interrupt)(void *ctx) wstdcall; -+ void (*enable_interrupt)(void *ctx) wstdcall; -+ void (*mp_halt)(void *ctx) wstdcall; -+ ndis_interrupt_handler handle_interrupt; -+ NDIS_STATUS (*init)(NDIS_STATUS *error_status, UINT *medium_index, -+ enum ndis_medium medium[], UINT medium_array_size, -+ void *handle, void *conf_handle) wstdcall; -+ ndis_isr_handler isr; -+ NDIS_STATUS (*queryinfo)(void *ctx, ndis_oid oid, void *buffer, -+ ULONG buflen, ULONG *written, -+ ULONG *needed) wstdcall; -+ void *reconfig; -+ NDIS_STATUS (*reset)(BOOLEAN *reset_address, void *ctx) wstdcall; -+ NDIS_STATUS (*send)(void *ctx, struct ndis_packet *packet, -+ UINT flags) wstdcall; -+ NDIS_STATUS (*setinfo)(void *ctx, ndis_oid oid, void *buffer, -+ ULONG buflen, ULONG *written, -+ ULONG *needed) wstdcall; -+ NDIS_STATUS (*tx_data)(struct ndis_packet *ndis_packet, -+ UINT *bytes_txed, void *mp_ctx, void *rx_ctx, -+ UINT offset, UINT bytes_to_tx) wstdcall; -+ /* NDIS 4.0 extensions */ -+ void (*return_packet)(void *ctx, void *packet) wstdcall; -+ void (*send_packets)(void *ctx, struct ndis_packet **packets, -+ INT nr_of_packets) wstdcall; -+ void (*alloc_complete)(void *handle, void *virt, -+ NDIS_PHY_ADDRESS *phys, -+ ULONG size, void *ctx) wstdcall; -+ /* NDIS 5.0 extensions */ -+ NDIS_STATUS (*co_create_vc)(void *ctx, void *vc_handle, -+ void *vc_ctx) wstdcall; -+ NDIS_STATUS (*co_delete_vc)(void *vc_ctx) wstdcall; -+ NDIS_STATUS (*co_activate_vc)(void *vc_ctx, void *call_params) wstdcall; -+ NDIS_STATUS (*co_deactivate_vc)(void *vc_ctx) wstdcall; -+ NDIS_STATUS (*co_send_packets)(void *vc_ctx, void **packets, -+ UINT nr_of_packets) wstdcall; -+ NDIS_STATUS (*co_request)(void *ctx, void *vc_ctx, UINT *req) wstdcall; -+ /* NDIS 5.1 extensions */ -+ void (*cancel_send_packets)(void *ctx, void *id) wstdcall; -+ void (*pnp_event_notify)(void *ctx, enum ndis_device_pnp_event event, -+ void *inf_buf, ULONG inf_buf_len) wstdcall; -+ void (*shutdown)(void *ctx) wstdcall; -+ void *reserved1; -+ void *reserved2; -+ void *reserved3; -+ void *reserved4; -+}; -+ -+struct ndis_spinlock { -+ NT_SPIN_LOCK klock; -+ KIRQL irql; -+}; -+ -+union ndis_rw_lock_refcount { -+ UCHAR cache_line[16]; -+}; -+ -+struct ndis_rw_lock { -+ union { -+ struct { -+ NT_SPIN_LOCK klock; -+ void *context; -+ }; -+ UCHAR reserved[16]; -+ }; -+ union { -+ union ndis_rw_lock_refcount ref_count[MAXIMUM_PROCESSORS]; -+ /* ndiswrapper specific */ -+ volatile int count; -+ }; -+}; -+ -+struct lock_state { -+ USHORT state; -+ KIRQL irql; -+}; -+ -+struct ndis_work_item; -+typedef void (*NDIS_PROC)(struct ndis_work_item *, void *) wstdcall; -+ -+struct ndis_work_item { -+ void *ctx; -+ NDIS_PROC func; -+ union { -+ UCHAR reserved[8 * sizeof(void *)]; -+ /* ndiswrapper specific */ -+ struct nt_list list; -+ }; -+}; -+ -+struct alloc_shared_mem { -+ void *ctx; -+ ULONG size; -+ BOOLEAN cached; -+}; -+ -+struct ndis_mp_block; -+ -+/* this is opaque to drivers, so we can use it as we please */ -+struct ndis_mp_interrupt { -+ struct kinterrupt *kinterrupt; -+ NT_SPIN_LOCK lock; -+ union { -+ void *reserved; -+ unsigned int irq; -+ }; -+ ndis_isr_handler isr; -+ ndis_interrupt_handler mp_dpc; -+ struct kdpc intr_dpc; -+ struct ndis_mp_block *nmb; -+ UCHAR dpc_count; -+ BOOLEAN enable; -+ struct nt_event dpc_completed_event; -+ BOOLEAN shared; -+ BOOLEAN req_isr; -+}; -+ -+struct ndis_binary_data { -+ USHORT len; -+ void *buf; -+}; -+ -+enum ndis_parameter_type { -+ NdisParameterInteger, NdisParameterHexInteger, -+ NdisParameterString, NdisParameterMultiString, NdisParameterBinary, -+}; -+ -+typedef struct unicode_string NDIS_STRING; -+ -+struct ndis_configuration_parameter { -+ enum ndis_parameter_type type; -+ union { -+ ULONG integer; -+ NDIS_STRING string; -+ } data; -+}; -+ -+struct ndis_driver { -+ struct miniport mp; -+}; -+ -+/* IDs used to store extensions in driver_object's custom extension */ -+#define NDIS_DRIVER_CLIENT_ID 10 -+ -+struct ndis_wireless_stats { -+ ULONG length; -+ LARGE_INTEGER tx_frag; -+ LARGE_INTEGER tx_multi_frag; -+ LARGE_INTEGER failed; -+ LARGE_INTEGER retry; -+ LARGE_INTEGER multi_retry; -+ LARGE_INTEGER rtss_succ; -+ LARGE_INTEGER rtss_fail; -+ LARGE_INTEGER ack_fail; -+ LARGE_INTEGER frame_dup; -+ LARGE_INTEGER rx_frag; -+ LARGE_INTEGER rx_multi_frag; -+ LARGE_INTEGER fcs_err; -+ LARGE_INTEGER tkip_local_mic_failures; -+ LARGE_INTEGER tkip_icv_errors; -+ LARGE_INTEGER tkip_counter_measures_invoked; -+ LARGE_INTEGER tkip_replays; -+ LARGE_INTEGER ccmp_format_errors; -+ LARGE_INTEGER ccmp_replays; -+ LARGE_INTEGER ccmp_decrypt_errors; -+ LARGE_INTEGER fourway_handshake_failures; -+ LARGE_INTEGER wep_undecryptable_count; -+ LARGE_INTEGER wep_icv_errorcount; -+ LARGE_INTEGER decrypt_success_count; -+ LARGE_INTEGER decrypt_failure_count; -+}; -+ -+enum ndis_status_type { -+ Ndis802_11StatusType_Authentication, -+ Ndis802_11StatusType_MediaStreamMode, -+ Ndis802_11StatusType_PMKID_CandidateList, -+ Ndis802_11StatusType_RadioState, -+}; -+ -+struct ndis_status_indication { -+ enum ndis_status_type status_type; -+}; -+ -+enum ndis_radio_status { -+ Ndis802_11RadioStatusOn, Ndis802_11RadioStatusHardwareOff, -+ Ndis802_11RadioStatusSoftwareOff, -+}; -+ -+struct ndis_radio_status_indication -+{ -+ enum ndis_status_type status_type; -+ enum ndis_radio_status radio_state; -+}; -+ -+enum ndis_media_state { -+ NdisMediaStateConnected, -+ NdisMediaStateDisconnected, -+}; -+ -+enum ndis_media_stream_mode { -+ Ndis802_11MediaStreamOff, Ndis802_11MediaStreamOn -+}; -+ -+enum wrapper_work { -+ LINK_STATUS_OFF, LINK_STATUS_ON, SET_MULTICAST_LIST, COLLECT_IW_STATS, -+ HANGCHECK, NETIF_WAKEQ, -+}; -+ -+struct encr_info { -+ struct encr_key { -+ ULONG length; -+ UCHAR key[NDIS_ENCODING_TOKEN_MAX]; -+ } keys[MAX_ENCR_KEYS]; -+ unsigned short tx_key_index; -+}; -+ -+struct ndis_essid { -+ ULONG length; -+ UCHAR essid[NDIS_ESSID_MAX_SIZE]; -+}; -+ -+enum ndis_infrastructure_mode { -+ Ndis802_11IBSS, Ndis802_11Infrastructure, Ndis802_11AutoUnknown, -+ Ndis802_11InfrastructureMax -+}; -+ -+enum authentication_mode { -+ Ndis802_11AuthModeOpen, Ndis802_11AuthModeShared, -+ Ndis802_11AuthModeAutoSwitch, Ndis802_11AuthModeWPA, -+ Ndis802_11AuthModeWPAPSK, Ndis802_11AuthModeWPANone, -+ Ndis802_11AuthModeWPA2, Ndis802_11AuthModeWPA2PSK, -+ Ndis802_11AuthModeMax -+}; -+ -+enum encryption_status { -+ Ndis802_11WEPEnabled, -+ Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, -+ Ndis802_11WEPDisabled, -+ Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, -+ Ndis802_11WEPKeyAbsent, -+ Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, -+ Ndis802_11WEPNotSupported, -+ Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, -+ Ndis802_11Encryption2Enabled, Ndis802_11Encryption2KeyAbsent, -+ Ndis802_11Encryption3Enabled, Ndis802_11Encryption3KeyAbsent -+}; -+ -+struct ndis_auth_encr_pair { -+ enum authentication_mode auth_mode; -+ enum encryption_status encr_mode; -+}; -+ -+struct ndis_capability { -+ ULONG length; -+ ULONG version; -+ ULONG num_PMKIDs; -+ ULONG num_auth_encr_pair; -+ struct ndis_auth_encr_pair auth_encr_pair[1]; -+}; -+ -+struct ndis_guid { -+ struct guid guid; -+ union { -+ ndis_oid oid; -+ NDIS_STATUS status; -+ }; -+ ULONG size; -+ ULONG flags; -+}; -+ -+struct ndis_timer { -+ struct nt_timer nt_timer; -+ struct kdpc kdpc; -+}; -+ -+struct ndis_mp_timer { -+ struct nt_timer nt_timer; -+ struct kdpc kdpc; -+ DPC func; -+ void *ctx; -+ struct ndis_mp_block *nmb; -+ struct ndis_mp_timer *next; -+}; -+ -+typedef struct cm_partial_resource_list NDIS_RESOURCE_LIST; -+ -+struct ndis_event { -+ struct nt_event nt_event; -+}; -+ -+struct ndis_bind_paths { -+ UINT number; -+ struct unicode_string paths[1]; -+}; -+ -+struct ndis_reference { -+ NT_SPIN_LOCK lock; -+ USHORT ref_count; -+ BOOLEAN closing; -+}; -+ -+struct ndis_filterdbs { -+ union { -+ void *eth_db; -+ void *null_db; -+ }; -+ void *tr_db; -+ void *fddi_db; -+ void *arc_db; -+}; -+ -+enum ndis_interface_type { -+ NdisInterfaceInternal, NdisInterfaceIsa, NdisInterfaceEisa, -+ NdisInterfaceMca, NdisInterfaceTurboChannel, NdisInterfacePci, -+ NdisInterfacePcMcia, -+}; -+ -+struct auth_encr_capa { -+ unsigned long auth; -+ unsigned long encr; -+}; -+ -+struct ndis_pmkid_candidate { -+ mac_address bssid; -+ DWORD flags; -+}; -+ -+struct ndis_pmkid_candidate_list { -+ ULONG version; -+ ULONG num_candidates; -+ struct ndis_pmkid_candidate candidates[1]; -+}; -+ -+/* -+ * This struct contains function pointers that the drivers references -+ * directly via macros, so it's important that they are at the correct -+ * position. -+ */ -+struct ndis_mp_block { -+ void *signature; -+ struct ndis_mp_block *next; -+ struct driver_object *drv_obj; -+ void *mp_ctx; -+ struct unicode_string name; -+ struct ndis_bind_paths *bindpaths; -+ void *openqueue; -+ struct ndis_reference reference; -+ void *device_ctx; -+ UCHAR padding; -+ UCHAR lock_acquired; -+ UCHAR pmode_opens; -+ UCHAR assigned_cpu; -+ NT_SPIN_LOCK lock; -+ enum ndis_request_type *mediarequest; -+ struct ndis_mp_interrupt *interrupt; -+ ULONG flags; -+ ULONG pnp_flags; -+ struct nt_list packet_list; -+ struct ndis_packet *first_pending_tx_packet; -+ struct ndis_packet *return_packet_queue; -+ ULONG request_buffer; -+ void *set_mcast_buffer; -+ struct ndis_mp_block *primary_mp; -+ void *wrapper_ctx; -+ void *bus_data_ctx; -+ ULONG pnp_capa; -+ void *resources; -+ struct ndis_timer wakeup_dpc_timer; -+ struct unicode_string basename; -+ struct unicode_string symlink_name; -+ ULONG ndis_hangcheck_interval; -+ USHORT hangcheck_ticks; -+ USHORT hangcheck_tick; -+ NDIS_STATUS ndis_reset_status; -+ void *resetopen; -+ struct ndis_filterdbs filterdbs; -+ void *rx_packet; -+ void *send_complete; -+ void *send_resource_avail; -+ void *reset_complete; -+ -+ enum ndis_medium media_type; -+ ULONG bus_number; -+ enum ndis_interface_type bus_type; -+ enum ndis_interface_type adapter_type; -+ struct device_object *fdo; -+ struct device_object *pdo; -+ struct device_object *next_device; -+ void *mapreg; -+ void *call_mgraflist; -+ void *mp_thread; -+ void *setinfobuf; -+ USHORT setinfo_buf_len; -+ USHORT max_send_pkts; -+ NDIS_STATUS fake_status; -+ void *lock_handler; -+ struct unicode_string *adapter_instance_name; -+ void *timer_queue; -+ UINT mac_options; -+ void *pending_req; -+ UINT max_long_addrs; -+ UINT max_short_addrs; -+ UINT cur_lookahead; -+ UINT max_lookahead; -+ -+ ndis_interrupt_handler irq_bh; -+ void *disable_intr; -+ void *enable_intr; -+ void *send_pkts; -+ void *deferred_send; -+ void *eth_rx_indicate; -+ void *tr_rx_indicate; -+ void *fddi_rx_indicate; -+ void *eth_rx_complete; -+ void *tr_rx_complete; -+ void *fddi_rx_complete; -+ -+ void *status; -+ void *status_complete; -+ void *td_complete; -+ -+ void *queryinfo_complete; -+ void *setinfo_complete; -+ void *wan_tx_complete; -+ void *wan_rx; -+ void *wan_rx_complete; -+ /* ndiswrapper specific */ -+ struct ndis_device *wnd; -+}; -+ -+struct ndis_device { -+ struct ndis_mp_block *nmb; -+ struct wrap_device *wd; -+ struct net_device *net_dev; -+ void *shutdown_ctx; -+ struct ndis_mp_interrupt *mp_interrupt; -+ struct kdpc irq_kdpc; -+ unsigned long mem_start; -+ unsigned long mem_end; -+ -+ struct net_device_stats net_stats; -+ struct iw_statistics iw_stats; -+ BOOLEAN iw_stats_enabled; -+ struct ndis_wireless_stats ndis_stats; -+ -+ struct work_struct tx_work; -+ struct ndis_packet *tx_ring[TX_RING_SIZE]; -+ u8 tx_ring_start; -+ u8 tx_ring_end; -+ u8 is_tx_ring_full; -+ u8 tx_ok; -+ spinlock_t tx_ring_lock; -+ struct mutex tx_ring_mutex; -+ unsigned int max_tx_packets; -+ struct mutex ndis_req_mutex; -+ struct task_struct *ndis_req_task; -+ int ndis_req_done; -+ NDIS_STATUS ndis_req_status; -+ ULONG packet_filter; -+ -+ ULONG sg_dma_size; -+ ULONG dma_map_count; -+ dma_addr_t *dma_map_addr; -+ -+ int hangcheck_interval; -+ struct timer_list hangcheck_timer; -+ int iw_stats_interval; -+ struct timer_list iw_stats_timer; -+ unsigned long scan_timestamp; -+ struct encr_info encr_info; -+ char nick[IW_ESSID_MAX_SIZE + 1]; -+ struct ndis_essid essid; -+ struct auth_encr_capa capa; -+ enum ndis_infrastructure_mode infrastructure_mode; -+ int max_pmkids; -+ int num_pmkids; -+ struct ndis_pmkid *pmkids; -+ mac_address mac; -+ struct proc_dir_entry *procfs_iface; -+ -+ struct work_struct ndis_work; -+ unsigned long ndis_pending_work; -+ UINT attributes; -+ int iw_auth_wpa_version; -+ int iw_auth_cipher_pairwise; -+ int iw_auth_cipher_group; -+ int iw_auth_key_mgmt; -+ int iw_auth_80211_alg; -+ struct ndis_packet_pool *tx_packet_pool; -+ struct ndis_buffer_pool *tx_buffer_pool; -+ int multicast_size; -+ struct v4_checksum rx_csum; -+ struct v4_checksum tx_csum; -+ enum ndis_physical_medium physical_medium; -+ ULONG ndis_wolopts; -+ struct nt_slist wrap_timer_slist; -+ int drv_ndis_version; -+ struct ndis_pnp_capabilities pnp_capa; -+}; -+ -+BOOLEAN ndis_isr(struct kinterrupt *kinterrupt, void *ctx) wstdcall; -+ -+int ndis_init(void); -+void ndis_exit(void); -+int ndis_init_device(struct ndis_device *wnd); -+void ndis_exit_device(struct ndis_device *wnd); -+ -+int wrap_procfs_add_ndis_device(struct ndis_device *wnd); -+void wrap_procfs_remove_ndis_device(struct ndis_device *wnd); -+ -+void NdisAllocatePacketPoolEx(NDIS_STATUS *status, -+ struct ndis_packet_pool **pool_handle, -+ UINT num_descr, UINT overflowsize, -+ UINT proto_rsvd_length) wstdcall; -+void NdisFreePacketPool(struct ndis_packet_pool *pool) wstdcall; -+void NdisAllocatePacket(NDIS_STATUS *status, struct ndis_packet **packet, -+ struct ndis_packet_pool *pool) wstdcall; -+void NdisFreePacket(struct ndis_packet *descr) wstdcall; -+void NdisAllocateBufferPool(NDIS_STATUS *status, -+ struct ndis_buffer_pool **pool_handle, -+ UINT num_descr) wstdcall; -+void NdisFreeBufferPool(struct ndis_buffer_pool *pool) wstdcall; -+void NdisAllocateBuffer(NDIS_STATUS *status, ndis_buffer **buffer, -+ struct ndis_buffer_pool *pool, void *virt, -+ UINT length) wstdcall; -+void NdisFreeBuffer(ndis_buffer *descr) wstdcall; -+void NdisMIndicateReceivePacket(struct ndis_mp_block *nmb, -+ struct ndis_packet **packets, -+ UINT nr_packets) wstdcall; -+void NdisMSendComplete(struct ndis_mp_block *nmb, struct ndis_packet *packet, -+ NDIS_STATUS status) wstdcall; -+void NdisMSendResourcesAvailable(struct ndis_mp_block *nmb) wstdcall; -+void NdisMIndicateStatus(struct ndis_mp_block *nmb, -+ NDIS_STATUS status, void *buf, UINT len) wstdcall; -+void NdisMIndicateStatusComplete(struct ndis_mp_block *nmb) wstdcall; -+void NdisMQueryInformationComplete(struct ndis_mp_block *nmb, -+ NDIS_STATUS status) wstdcall; -+void NdisMSetInformationComplete(struct ndis_mp_block *nmb, -+ NDIS_STATUS status) wstdcall; -+void NdisMResetComplete(struct ndis_mp_block *nmb, NDIS_STATUS status, -+ BOOLEAN address_reset) wstdcall; -+ULONG NDIS_BUFFER_TO_SPAN_PAGES(ndis_buffer *buffer) wstdcall; -+BOOLEAN NdisWaitEvent(struct ndis_event *event, UINT timeout) wstdcall; -+void NdisSetEvent(struct ndis_event *event) wstdcall; -+void NdisMDeregisterInterrupt(struct ndis_mp_interrupt *mp_interrupt) wstdcall; -+void EthRxIndicateHandler(struct ndis_mp_block *nmb, void *rx_ctx, -+ char *header1, char *header, UINT header_size, -+ void *look_ahead, UINT look_ahead_size, -+ UINT packet_size) wstdcall; -+void EthRxComplete(struct ndis_mp_block *nmb) wstdcall; -+void NdisMTransferDataComplete(struct ndis_mp_block *nmb, -+ struct ndis_packet *packet, NDIS_STATUS status, -+ UINT bytes_txed) wstdcall; -+void NdisWriteConfiguration(NDIS_STATUS *status, struct ndis_mp_block *nmb, -+ struct unicode_string *key, -+ struct ndis_configuration_parameter *param) wstdcall; -+void NdisReadConfiguration(NDIS_STATUS *status, -+ struct ndis_configuration_parameter **param, -+ struct ndis_mp_block *nmb, -+ struct unicode_string *key, -+ enum ndis_parameter_type type) wstdcall; -+ -+/* Required OIDs */ -+#define OID_GEN_SUPPORTED_LIST 0x00010101 -+#define OID_GEN_HARDWARE_STATUS 0x00010102 -+#define OID_GEN_MEDIA_SUPPORTED 0x00010103 -+#define OID_GEN_MEDIA_IN_USE 0x00010104 -+#define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 -+#define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 -+#define OID_GEN_LINK_SPEED 0x00010107 -+#define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 -+#define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 -+#define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A -+#define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B -+#define OID_GEN_VENDOR_ID 0x0001010C -+#define OID_GEN_VENDOR_DESCRIPTION 0x0001010D -+#define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E -+#define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F -+#define OID_GEN_DRIVER_VERSION 0x00010110 -+#define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 -+#define OID_GEN_PROTOCOL_OPTIONS 0x00010112 -+#define OID_GEN_MAC_OPTIONS 0x00010113 -+#define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 -+#define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 -+#define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 -+#define OID_GEN_SUPPORTED_GUIDS 0x00010117 -+#define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 /* Set only */ -+#define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 /* Set only */ -+#define OID_GEN_MACHINE_NAME 0x0001021A -+#define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B /* Set only */ -+#define OID_GEN_VLAN_ID 0x0001021C -+ -+/* Optional OIDs. */ -+#define OID_GEN_MEDIA_CAPABILITIES 0x00010201 -+#define OID_GEN_PHYSICAL_MEDIUM 0x00010202 -+ -+/* Required statistics OIDs. */ -+#define OID_GEN_XMIT_OK 0x00020101 -+#define OID_GEN_RCV_OK 0x00020102 -+#define OID_GEN_XMIT_ERROR 0x00020103 -+#define OID_GEN_RCV_ERROR 0x00020104 -+#define OID_GEN_RCV_NO_BUFFER 0x00020105 -+ -+/* Optional OID statistics */ -+#define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 -+#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 -+#define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 -+#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 -+#define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 -+#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 -+#define OID_GEN_DIRECTED_BYTES_RCV 0x00020207 -+#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 -+#define OID_GEN_MULTICAST_BYTES_RCV 0x00020209 -+#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A -+#define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B -+#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C -+#define OID_GEN_RCV_CRC_ERROR 0x0002020D -+#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E -+#define OID_GEN_GET_TIME_CAPS 0x0002020F -+#define OID_GEN_GET_NETCARD_TIME 0x00020210 -+#define OID_GEN_NETCARD_LOAD 0x00020211 -+#define OID_GEN_DEVICE_PROFILE 0x00020212 -+ -+/* 802.3 (ethernet) OIDs */ -+#define OID_802_3_PERMANENT_ADDRESS 0x01010101 -+#define OID_802_3_CURRENT_ADDRESS 0x01010102 -+#define OID_802_3_MULTICAST_LIST 0x01010103 -+#define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 -+#define OID_802_3_MAC_OPTIONS 0x01010105 -+#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 -+#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 -+#define OID_802_3_XMIT_ONE_COLLISION 0x01020102 -+#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 -+#define OID_802_3_XMIT_DEFERRED 0x01020201 -+#define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 -+#define OID_802_3_RCV_OVERRUN 0x01020203 -+#define OID_802_3_XMIT_UNDERRUN 0x01020204 -+#define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 -+#define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 -+#define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 -+ -+/* PnP and power management OIDs */ -+#define OID_PNP_CAPABILITIES 0xFD010100 -+#define OID_PNP_SET_POWER 0xFD010101 -+#define OID_PNP_QUERY_POWER 0xFD010102 -+#define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 -+#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 -+#define OID_PNP_WAKE_UP_PATTERN_LIST 0xFD010105 -+#define OID_PNP_ENABLE_WAKE_UP 0xFD010106 -+ -+/* PnP/PM Statistics (Optional). */ -+#define OID_PNP_WAKE_UP_OK 0xFD020200 -+#define OID_PNP_WAKE_UP_ERROR 0xFD020201 -+ -+/* The following bits are defined for OID_PNP_ENABLE_WAKE_UP */ -+#define NDIS_PNP_WAKE_UP_MAGIC_PACKET 0x00000001 -+#define NDIS_PNP_WAKE_UP_PATTERN_MATCH 0x00000002 -+#define NDIS_PNP_WAKE_UP_LINK_CHANGE 0x00000004 -+ -+/* 802.11 OIDs */ -+#define OID_802_11_BSSID 0x0D010101 -+#define OID_802_11_SSID 0x0D010102 -+#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203 -+#define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204 -+#define OID_802_11_TX_POWER_LEVEL 0x0D010205 -+#define OID_802_11_RSSI 0x0D010206 -+#define OID_802_11_RSSI_TRIGGER 0x0D010207 -+#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108 -+#define OID_802_11_FRAGMENTATION_THRESHOLD 0x0D010209 -+#define OID_802_11_RTS_THRESHOLD 0x0D01020A -+#define OID_802_11_NUMBER_OF_ANTENNAS 0x0D01020B -+#define OID_802_11_RX_ANTENNA_SELECTED 0x0D01020C -+#define OID_802_11_TX_ANTENNA_SELECTED 0x0D01020D -+#define OID_802_11_SUPPORTED_RATES 0x0D01020E -+#define OID_802_11_DESIRED_RATES 0x0D010210 -+#define OID_802_11_CONFIGURATION 0x0D010211 -+#define OID_802_11_STATISTICS 0x0D020212 -+#define OID_802_11_ADD_WEP 0x0D010113 -+#define OID_802_11_REMOVE_WEP 0x0D010114 -+#define OID_802_11_DISASSOCIATE 0x0D010115 -+#define OID_802_11_POWER_MODE 0x0D010216 -+#define OID_802_11_BSSID_LIST 0x0D010217 -+#define OID_802_11_AUTHENTICATION_MODE 0x0D010118 -+#define OID_802_11_PRIVACY_FILTER 0x0D010119 -+#define OID_802_11_BSSID_LIST_SCAN 0x0D01011A -+#define OID_802_11_WEP_STATUS 0x0D01011B -+#define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS -+#define OID_802_11_RELOAD_DEFAULTS 0x0D01011C -+#define OID_802_11_ADD_KEY 0x0D01011D -+#define OID_802_11_REMOVE_KEY 0x0D01011E -+#define OID_802_11_ASSOCIATION_INFORMATION 0x0D01011F -+#define OID_802_11_TEST 0x0D010120 -+#define OID_802_11_MEDIA_STREAM_MODE 0x0D010121 -+#define OID_802_11_CAPABILITY 0x0D010122 -+#define OID_802_11_PMKID 0x0D010123 -+ -+#define NDIS_STATUS_SUCCESS 0 -+#define NDIS_STATUS_PENDING 0x00000103 -+#define NDIS_STATUS_NOT_RECOGNIZED 0x00010001 -+#define NDIS_STATUS_NOT_COPIED 0x00010002 -+#define NDIS_STATUS_NOT_ACCEPTED 0x00010003 -+#define NDIS_STATUS_CALL_ACTIVE 0x00010007 -+#define NDIS_STATUS_ONLINE 0x40010003 -+#define NDIS_STATUS_RESET_START 0x40010004 -+#define NDIS_STATUS_RESET_END 0x40010005 -+#define NDIS_STATUS_RING_STATUS 0x40010006 -+#define NDIS_STATUS_CLOSED 0x40010007 -+#define NDIS_STATUS_WAN_LINE_UP 0x40010008 -+#define NDIS_STATUS_WAN_LINE_DOWN 0x40010009 -+#define NDIS_STATUS_WAN_FRAGMENT 0x4001000A -+#define NDIS_STATUS_MEDIA_CONNECT 0x4001000B -+#define NDIS_STATUS_MEDIA_DISCONNECT 0x4001000C -+#define NDIS_STATUS_HARDWARE_LINE_UP 0x4001000D -+#define NDIS_STATUS_HARDWARE_LINE_DOWN 0x4001000E -+#define NDIS_STATUS_INTERFACE_UP 0x4001000F -+#define NDIS_STATUS_INTERFACE_DOWN 0x40010010 -+#define NDIS_STATUS_MEDIA_BUSY 0x40010011 -+#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION 0x40010012 -+#define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION -+#define NDIS_STATUS_LINK_SPEED_CHANGE 0x40010013 -+#define NDIS_STATUS_WAN_GET_STATS 0x40010014 -+#define NDIS_STATUS_WAN_CO_FRAGMENT 0x40010015 -+#define NDIS_STATUS_WAN_CO_LINKPARAMS 0x40010016 -+#define NDIS_STATUS_NOT_RESETTABLE 0x80010001 -+#define NDIS_STATUS_SOFT_ERRORS 0x80010003 -+#define NDIS_STATUS_HARD_ERRORS 0x80010004 -+#define NDIS_STATUS_BUFFER_OVERFLOW 0x80000005 -+#define NDIS_STATUS_FAILURE 0xC0000001 -+#define NDIS_STATUS_INVALID_PARAMETER 0xC000000D -+#define NDIS_STATUS_RESOURCES 0xC000009A -+#define NDIS_STATUS_CLOSING 0xC0010002 -+#define NDIS_STATUS_BAD_VERSION 0xC0010004 -+#define NDIS_STATUS_BAD_CHARACTERISTICS 0xC0010005 -+#define NDIS_STATUS_ADAPTER_NOT_FOUND 0xC0010006 -+#define NDIS_STATUS_OPEN_FAILED 0xC0010007 -+#define NDIS_STATUS_DEVICE_FAILED 0xC0010008 -+#define NDIS_STATUS_MULTICAST_FULL 0xC0010009 -+#define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A -+#define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B -+#define NDIS_STATUS_REQUEST_ABORTED 0xC001000C -+#define NDIS_STATUS_RESET_IN_PROGRESS 0xC001000D -+#define NDIS_STATUS_CLOSING_INDICATING 0xC001000E -+#define NDIS_STATUS_BAD_VERSION 0xC0010004 -+#define NDIS_STATUS_NOT_SUPPORTED 0xC00000BB -+#define NDIS_STATUS_INVALID_PACKET 0xC001000F -+#define NDIS_STATUS_OPEN_LIST_FULL 0xC0010010 -+#define NDIS_STATUS_ADAPTER_NOT_READY 0xC0010011 -+#define NDIS_STATUS_ADAPTER_NOT_OPEN 0xC0010012 -+#define NDIS_STATUS_NOT_INDICATING 0xC0010013 -+#define NDIS_STATUS_INVALID_LENGTH 0xC0010014 -+#define NDIS_STATUS_INVALID_DATA 0xC0010015 -+#define NDIS_STATUS_BUFFER_TOO_SHORT 0xC0010016 -+#define NDIS_STATUS_INVALID_OID 0xC0010017 -+#define NDIS_STATUS_ADAPTER_REMOVED 0xC0010018 -+#define NDIS_STATUS_UNSUPPORTED_MEDIA 0xC0010019 -+#define NDIS_STATUS_GROUP_ADDRESS_IN_USE 0xC001001A -+#define NDIS_STATUS_FILE_NOT_FOUND 0xC001001B -+#define NDIS_STATUS_ERROR_READING_FILE 0xC001001C -+#define NDIS_STATUS_ALREADY_MAPPED 0xC001001D -+#define NDIS_STATUS_RESOURCE_CONFLICT 0xC001001E -+#define NDIS_STATUS_NO_CABLE 0xC001001F -+#define NDIS_STATUS_INVALID_SAP 0xC0010020 -+#define NDIS_STATUS_SAP_IN_USE 0xC0010021 -+#define NDIS_STATUS_INVALID_ADDRESS 0xC0010022 -+#define NDIS_STATUS_VC_NOT_ACTIVATED 0xC0010023 -+#define NDIS_STATUS_DEST_OUT_OF_ORDER 0xC0010024 -+#define NDIS_STATUS_VC_NOT_AVAILABLE 0xC0010025 -+#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE 0xC0010026 -+#define NDIS_STATUS_INCOMPATABLE_QOS 0xC0010027 -+#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED 0xC0010028 -+#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION 0xC0010029 -+#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR 0xC0011000 -+#define NDIS_STATUS_INVALID_DEVICE_REQUEST 0xC0000010 -+#define NDIS_STATUS_NETWORK_UNREACHABLE 0xC000023C -+ -+/* Event codes */ -+ -+#define EVENT_NDIS_RESOURCE_CONFLICT 0xC0001388 -+#define EVENT_NDIS_OUT_OF_RESOURCE 0xC0001389 -+#define EVENT_NDIS_HARDWARE_FAILURE 0xC000138A -+#define EVENT_NDIS_ADAPTER_NOT_FOUND 0xC000138B -+#define EVENT_NDIS_INTERRUPT_CONNECT 0xC000138C -+#define EVENT_NDIS_DRIVER_FAILURE 0xC000138D -+#define EVENT_NDIS_BAD_VERSION 0xC000138E -+#define EVENT_NDIS_TIMEOUT 0x8000138F -+#define EVENT_NDIS_NETWORK_ADDRESS 0xC0001390 -+#define EVENT_NDIS_UNSUPPORTED_CONFIGURATION 0xC0001391 -+#define EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER 0xC0001392 -+#define EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER 0xC0001393 -+#define EVENT_NDIS_BAD_IO_BASE_ADDRESS 0xC0001394 -+#define EVENT_NDIS_RECEIVE_SPACE_SMALL 0x40001395 -+#define EVENT_NDIS_ADAPTER_DISABLED 0x80001396 -+#define EVENT_NDIS_IO_PORT_CONFLICT 0x80001397 -+#define EVENT_NDIS_PORT_OR_DMA_CONFLICT 0x80001398 -+#define EVENT_NDIS_MEMORY_CONFLICT 0x80001399 -+#define EVENT_NDIS_INTERRUPT_CONFLICT 0x8000139A -+#define EVENT_NDIS_DMA_CONFLICT 0x8000139B -+#define EVENT_NDIS_INVALID_DOWNLOAD_FILE_ERROR 0xC000139C -+#define EVENT_NDIS_MAXRECEIVES_ERROR 0x8000139D -+#define EVENT_NDIS_MAXTRANSMITS_ERROR 0x8000139E -+#define EVENT_NDIS_MAXFRAMESIZE_ERROR 0x8000139F -+#define EVENT_NDIS_MAXINTERNALBUFS_ERROR 0x800013A0 -+#define EVENT_NDIS_MAXMULTICAST_ERROR 0x800013A1 -+#define EVENT_NDIS_PRODUCTID_ERROR 0x800013A2 -+#define EVENT_NDIS_LOBE_FAILUE_ERROR 0x800013A3 -+#define EVENT_NDIS_SIGNAL_LOSS_ERROR 0x800013A4 -+#define EVENT_NDIS_REMOVE_RECEIVED_ERROR 0x800013A5 -+#define EVENT_NDIS_TOKEN_RING_CORRECTION 0x400013A6 -+#define EVENT_NDIS_ADAPTER_CHECK_ERROR 0xC00013A7 -+#define EVENT_NDIS_RESET_FAILURE_ERROR 0x800013A8 -+#define EVENT_NDIS_CABLE_DISCONNECTED_ERROR 0x800013A9 -+#define EVENT_NDIS_RESET_FAILURE_CORRECTION 0x800013AA -+ -+/* packet filter bits used by NDIS_OID_PACKET_FILTER */ -+#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 -+#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 -+#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 -+#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 -+#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 -+#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 -+#define NDIS_PACKET_TYPE_SMT 0x00000040 -+#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 -+#define NDIS_PACKET_TYPE_GROUP 0x00001000 -+#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 -+#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 -+#define NDIS_PACKET_TYPE_MAC_FRAME 0x00008000 -+ -+/* memory allocation flags */ -+#define NDIS_MEMORY_CONTIGUOUS 0x00000001 -+#define NDIS_MEMORY_NONCACHED 0x00000002 -+ -+/* Attribute flags to NdisMSetAtrributesEx */ -+#define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001 -+#define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT 0x00000002 -+#define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004 -+#define NDIS_ATTRIBUTE_BUS_MASTER 0x00000008 -+#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER 0x00000010 -+#define NDIS_ATTRIBUTE_DESERIALIZE 0x00000020 -+#define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND 0x00000040 -+#define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK 0x00000080 -+#define NDIS_ATTRIBUTE_NOT_CO_NDIS 0x00000100 -+#define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS 0x00000200 -+ -+#define OID_TCP_TASK_OFFLOAD 0xFC010201 -+ -+#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001 -+#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002 -+#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004 -+#define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008 -+#define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010 -+#define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020 -+#define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040 -+#define NDIS_MAC_OPTION_SUPPORTS_MAC_ADDRESS_OVERWRITE 0x00000080 -+#define NDIS_MAC_OPTION_RECEIVE_AT_DPC 0x00000100 -+#define NDIS_MAC_OPTION_8021Q_VLAN 0x00000200 -+#define NDIS_MAC_OPTION_RESERVED 0x80000000 -+ -+#define deserialized_driver(wnd) (wnd->attributes & NDIS_ATTRIBUTE_DESERIALIZE) -+ -+static inline void serialize_lock(struct ndis_device *wnd) -+{ -+ nt_spin_lock(&wnd->nmb->lock); -+} -+ -+static inline void serialize_unlock(struct ndis_device *wnd) -+{ -+ nt_spin_unlock(&wnd->nmb->lock); -+} -+ -+static inline KIRQL serialize_lock_irql(struct ndis_device *wnd) -+{ -+ if (deserialized_driver(wnd)) -+ return raise_irql(DISPATCH_LEVEL); -+ else -+ return nt_spin_lock_irql(&wnd->nmb->lock, DISPATCH_LEVEL); -+} -+ -+static inline void serialize_unlock_irql(struct ndis_device *wnd, -+ KIRQL irql) -+{ -+ if (deserialized_driver(wnd)) -+ lower_irql(irql); -+ else -+ nt_spin_unlock_irql(&wnd->nmb->lock, irql); -+} -+ -+static inline void if_serialize_lock(struct ndis_device *wnd) -+{ -+ if (!deserialized_driver(wnd)) -+ nt_spin_lock(&wnd->nmb->lock); -+} -+ -+static inline void if_serialize_unlock(struct ndis_device *wnd) -+{ -+ if (!deserialized_driver(wnd)) -+ nt_spin_unlock(&wnd->nmb->lock); -+} -+ -+#endif /* NDIS_H */ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ndiswrapper.h linux-5.6.11-ndis/3rdparty/ndiswrapper/ndiswrapper.h ---- linux-5.6.11/3rdparty/ndiswrapper/ndiswrapper.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ndiswrapper.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,219 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _NDISWRAPPER_H_ -+#define _NDISWRAPPER_H_ -+ -+#define DRIVER_VERSION "1.63" -+#define UTILS_VERSION "1.9" -+ -+#define DRIVER_NAME "ndiswrapper" -+#define DRIVER_CONFIG_DIR "/etc/ndiswrapper" -+ -+#define NDIS_ESSID_MAX_SIZE 32 -+#define NDIS_ENCODING_TOKEN_MAX 32 -+#define MAX_ENCR_KEYS 4 -+#define TX_RING_SIZE 16 -+#define NDIS_MAX_RATES 8 -+#define NDIS_MAX_RATES_EX 16 -+ -+#define WRAP_PCI_BUS 5 -+#define WRAP_PCMCIA_BUS 8 -+/* some USB devices, e.g., DWL-G120 have BusType as 0 */ -+#define WRAP_INTERNAL_BUS 0 -+/* documentation at msdn says 15 is PNP bus, but inf files from all -+ * vendors say 15 is USB; which is correct? */ -+#define WRAP_USB_BUS 15 -+ -+/* NDIS device must be 0, for compatibility with old versions of -+ * ndiswrapper where device type for NDIS drivers is 0 */ -+#define WRAP_NDIS_DEVICE 0 -+#define WRAP_USB_DEVICE 1 -+#define WRAP_BLUETOOTH_DEVICE1 2 -+#define WRAP_BLUETOOTH_DEVICE2 3 -+ -+#define WRAP_DEVICE_BUS(dev, bus) ((dev) << 8 | (bus)) -+#define WRAP_BUS(dev_bus) ((dev_bus) & 0x000FF) -+#define WRAP_DEVICE(dev_bus) ((dev_bus) >> 8) -+ -+#define MAX_DRIVER_NAME_LEN 32 -+#define MAX_VERSION_STRING_LEN 64 -+#define MAX_SETTING_NAME_LEN 128 -+#define MAX_SETTING_VALUE_LEN 256 -+ -+#define MAX_DRIVER_PE_IMAGES 4 -+#define MAX_DRIVER_BIN_FILES 5 -+#define MAX_DEVICE_SETTINGS 512 -+ -+#define MAX_ALLOCATED_URBS 15 -+ -+#define DEV_ANY_ID -1 -+ -+#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] -+#define MACSTRSEP "%02x:%02x:%02x:%02x:%02x:%02x" -+#define MACSTR "%02x%02x%02x%02x%02x%02x" -+#define MACINTADR(a) (int*)&((a)[0]), (int*)&((a)[1]), (int*)&((a)[2]), \ -+ (int*)&((a)[3]), (int*)&((a)[4]), (int*)&((a)[5]) -+ -+#ifdef __KERNEL__ -+/* DEBUG macros */ -+ -+#define MSG(level, fmt, ...) \ -+ printk(level DRIVER_NAME " (%s:%d): " fmt "\n", \ -+ __func__, __LINE__ , ## __VA_ARGS__) -+ -+#define WARNING(fmt, ...) MSG(KERN_WARNING, fmt, ## __VA_ARGS__) -+#define ERROR(fmt, ...) MSG(KERN_ERR, fmt , ## __VA_ARGS__) -+#define INFO(fmt, ...) MSG(KERN_INFO, fmt , ## __VA_ARGS__) -+#define TODO() WARNING("not fully implemented (yet)") -+ -+#define TRACE(level, fmt, ...) \ -+do { \ -+ if (debug >= level) \ -+ printk(KERN_INFO "%s (%s:%d): " fmt "\n", DRIVER_NAME, \ -+ __func__, __LINE__ , ## __VA_ARGS__); \ -+} while (0) -+#define TRACE0(fmt, ...) TRACE(0, fmt , ## __VA_ARGS__) -+ -+extern int debug; -+ -+#ifndef DEBUG -+#define DEBUG 0 -+#endif -+ -+/* for a block of code */ -+#if DEBUG >= 1 -+#define DBG_BLOCK(level) if (debug >= level) -+#else -+#define DBG_BLOCK(level) while (0) -+#endif -+ -+#if DEBUG >= 1 -+#define TRACE1(fmt, ...) TRACE(1, fmt , ## __VA_ARGS__) -+#else -+#define TRACE1(fmt, ...) do { } while (0) -+#endif -+ -+#if DEBUG >= 2 -+#define TRACE2(fmt, ...) TRACE(2, fmt , ## __VA_ARGS__) -+#else -+#define TRACE2(fmt, ...) do { } while (0) -+#endif -+ -+#if DEBUG >= 3 -+#define TRACE3(fmt, ...) TRACE(3, fmt , ## __VA_ARGS__) -+#else -+#define TRACE3(fmt, ...) do { } while (0) -+#endif -+ -+#if DEBUG >= 4 -+#define TRACE4(fmt, ...) TRACE(4, fmt , ## __VA_ARGS__) -+#else -+#define TRACE4(fmt, ...) do { } while (0) -+#endif -+ -+#if DEBUG >= 5 -+#define TRACE5(fmt, ...) TRACE(5, fmt , ## __VA_ARGS__) -+#else -+#define TRACE5(fmt, ...) do { } while (0) -+#endif -+ -+#if DEBUG >= 6 -+#define TRACE6(fmt, ...) TRACE(6, fmt , ## __VA_ARGS__) -+#else -+#define TRACE6(fmt, ...) do { } while (0) -+#endif -+ -+#define ENTER0(fmt, ...) TRACE0("Enter " fmt , ## __VA_ARGS__) -+#define ENTER1(fmt, ...) TRACE1("Enter " fmt , ## __VA_ARGS__) -+#define ENTER2(fmt, ...) TRACE2("Enter " fmt , ## __VA_ARGS__) -+#define ENTER3(fmt, ...) TRACE3("Enter " fmt , ## __VA_ARGS__) -+#define ENTER4(fmt, ...) TRACE4("Enter " fmt , ## __VA_ARGS__) -+#define ENTER5(fmt, ...) TRACE5("Enter " fmt , ## __VA_ARGS__) -+#define ENTER6(fmt, ...) TRACE6("Enter " fmt , ## __VA_ARGS__) -+ -+#define EXIT0(stmt) do { TRACE0("Exit"); stmt; } while (0) -+#define EXIT1(stmt) do { TRACE1("Exit"); stmt; } while (0) -+#define EXIT2(stmt) do { TRACE2("Exit"); stmt; } while (0) -+#define EXIT3(stmt) do { TRACE3("Exit"); stmt; } while (0) -+#define EXIT4(stmt) do { TRACE4("Exit"); stmt; } while (0) -+#define EXIT5(stmt) do { TRACE5("Exit"); stmt; } while (0) -+#define EXIT6(stmt) do { TRACE6("Exit"); stmt; } while (0) -+ -+#if defined(USB_DEBUG) -+#define USBTRACE TRACE0 -+#define USBENTER ENTER0 -+#define USBEXIT EXIT0 -+#else -+#define USBTRACE(fmt, ...) do { } while (0) -+#define USBENTER(fmt, ...) -+#define USBEXIT(stmt) stmt -+#endif -+ -+#if defined(EVENT_DEBUG) -+#define EVENTTRACE TRACE0 -+#define EVENTENTER ENTER0 -+#define EVENTEXIT EXIT0 -+#else -+#define EVENTTRACE(fmt, ...) do { } while (0) -+#define EVENTENTER(fmt, ...) -+#define EVENTEXIT(stmt) stmt -+#endif -+ -+#if defined(TIMER_DEBUG) -+#define TIMERTRACE TRACE0 -+#define TIMERENTER ENTER0 -+#define TIMEREXIT EXIT0 -+#else -+#define TIMERTRACE(fmt, ...) do { } while (0) -+#define TIMERENTER(fmt, ...) -+#define TIMEREXIT(stmt) stmt -+#endif -+ -+#if defined(IO_DEBUG) -+#define IOTRACE TRACE0 -+#define IOENTER ENTER0 -+#define IOEXIT EXIT0 -+#else -+#define IOTRACE(fmt, ...) do { } while (0) -+#define IOENTER(fmt, ...) -+#define IOEXIT(stmt) stmt -+#endif -+ -+#if defined(WORK_DEBUG) -+#define WORKTRACE TRACE0 -+#define WORKENTER ENTER0 -+#define WORKEXIT EXIT0 -+#else -+#define WORKTRACE(fmt, ...) do { } while (0) -+#define WORKENTER(fmt, ...) -+#define WORKEXIT(stmt) stmt -+#endif -+ -+#if DEBUG >= 1 -+#define assert(expr) \ -+do { \ -+ if (!(expr)) { \ -+ ERROR("assertion '%s' failed", #expr); \ -+ dump_stack(); \ -+ } \ -+} while (0) -+#else -+#define assert(expr) do { } while (0) -+#endif -+ -+#endif // __KERNEL__ -+ -+#endif // NDISWRAPPER_H -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ntoskernel.c linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel.c ---- linux-5.6.11/3rdparty/ndiswrapper/ntoskernel.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,2716 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+#include "ndis.h" -+#include "usb.h" -+#include "pnp.h" -+#include "loader.h" -+#include "ntoskernel_exports.h" -+ -+/* MDLs describe a range of virtual address with an array of physical -+ * pages right after the header. For different ranges of virtual -+ * addresses, the number of entries of physical pages may be different -+ * (depending on number of entries required). If we want to allocate -+ * MDLs from a pool, the size has to be constant. So we assume that -+ * maximum range used by a driver is MDL_CACHE_PAGES; if a driver -+ * requests an MDL for a bigger region, we allocate it with kmalloc; -+ * otherwise, we allocate from the pool */ -+ -+#define MDL_CACHE_PAGES 3 -+#define MDL_CACHE_SIZE (sizeof(struct mdl) + \ -+ (sizeof(PFN_NUMBER) * MDL_CACHE_PAGES)) -+struct wrap_mdl { -+ struct nt_list list; -+ struct mdl mdl[0]; -+}; -+ -+/* everything here is for all drivers/devices - not per driver/device */ -+static spinlock_t dispatcher_lock; -+spinlock_t ntoskernel_lock; -+static void *mdl_cache; -+static struct nt_list wrap_mdl_list; -+ -+static struct work_struct kdpc_work; -+static void kdpc_worker(struct work_struct *dummy); -+ -+static struct nt_list kdpc_list; -+static spinlock_t kdpc_list_lock; -+ -+static struct nt_list callback_objects; -+ -+struct nt_list object_list; -+ -+struct bus_driver { -+ struct nt_list list; -+ char name[MAX_DRIVER_NAME_LEN]; -+ struct driver_object drv_obj; -+}; -+ -+static struct nt_list bus_driver_list; -+ -+static struct work_struct ntos_work; -+static struct nt_list ntos_work_list; -+static spinlock_t ntos_work_lock; -+static void ntos_work_worker(struct work_struct *dummy); -+spinlock_t irp_cancel_lock; -+static NT_SPIN_LOCK nt_list_lock; -+static struct nt_slist wrap_timer_slist; -+CCHAR cpu_count; -+ -+/* compute ticks (100ns) since 1601 until when system booted into -+ * wrap_ticks_to_boot */ -+u64 wrap_ticks_to_boot; -+ -+#if defined(CONFIG_X86_64) -+static struct timer_list shared_data_timer; -+struct kuser_shared_data kuser_shared_data; -+#endif -+ -+WIN_SYMBOL_MAP("KeTickCount", &jiffies) -+WIN_SYMBOL_MAP("KeNumberProcessors", &cpu_count) -+WIN_SYMBOL_MAP("NlsMbCodePageTag", FALSE) -+ -+struct workqueue_struct *ntos_wq; -+ -+#ifdef WRAP_PREEMPT -+DEFINE_PER_CPU(struct irql_info, irql_info); -+#endif -+ -+#if defined(CONFIG_X86_64) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+static void update_user_shared_data_proc(struct timer_list *tl) -+#else -+static void update_user_shared_data_proc(unsigned long data) -+#endif -+{ -+ /* timer is supposed to be scheduled every 10ms, but bigger -+ * intervals seem to work (tried up to 50ms) */ -+ *((ULONG64 *)&kuser_shared_data.system_time) = ticks_1601(); -+ *((ULONG64 *)&kuser_shared_data.interrupt_time) = -+ jiffies * TICKSPERSEC / HZ; -+ *((ULONG64 *)&kuser_shared_data.tick) = jiffies; -+ -+ mod_timer(&shared_data_timer, jiffies + MSEC_TO_HZ(30)); -+} -+#endif -+ -+void *allocate_object(ULONG size, enum common_object_type type, -+ struct unicode_string *name) -+{ -+ struct common_object_header *hdr; -+ void *body; -+ -+ /* we pad header as prefix to body */ -+ hdr = ExAllocatePoolWithTag(NonPagedPool, OBJECT_SIZE(size), 0); -+ if (!hdr) { -+ WARNING("couldn't allocate memory"); -+ return NULL; -+ } -+ memset(hdr, 0, OBJECT_SIZE(size)); -+ if (name) { -+ hdr->name.buf = ExAllocatePoolWithTag(NonPagedPool, -+ name->max_length, 0); -+ if (!hdr->name.buf) { -+ ExFreePool(hdr); -+ return NULL; -+ } -+ memcpy(hdr->name.buf, name->buf, name->max_length); -+ hdr->name.length = name->length; -+ hdr->name.max_length = name->max_length; -+ } -+ hdr->type = type; -+ hdr->ref_count = 1; -+ spin_lock_bh(&ntoskernel_lock); -+ /* threads are looked up often (in KeWaitForXXX), so optimize -+ * for fast lookups of threads */ -+ if (type == OBJECT_TYPE_NT_THREAD) -+ InsertHeadList(&object_list, &hdr->list); -+ else -+ InsertTailList(&object_list, &hdr->list); -+ spin_unlock_bh(&ntoskernel_lock); -+ body = HEADER_TO_OBJECT(hdr); -+ TRACE3("allocated hdr: %p, body: %p", hdr, body); -+ return body; -+} -+ -+static void free_object(void *object) -+{ -+ struct common_object_header *hdr; -+ -+ hdr = OBJECT_TO_HEADER(object); -+ spin_lock_bh(&ntoskernel_lock); -+ RemoveEntryList(&hdr->list); -+ spin_unlock_bh(&ntoskernel_lock); -+ TRACE3("freed hdr: %p, body: %p", hdr, object); -+ if (hdr->name.buf) -+ ExFreePool(hdr->name.buf); -+ ExFreePool(hdr); -+} -+ -+static int add_bus_driver(const char *name) -+{ -+ struct bus_driver *bus_driver; -+ -+ bus_driver = kzalloc(sizeof(*bus_driver), GFP_KERNEL); -+ if (!bus_driver) { -+ ERROR("couldn't allocate memory"); -+ return -ENOMEM; -+ } -+ strncpy(bus_driver->name, name, sizeof(bus_driver->name)); -+ bus_driver->name[sizeof(bus_driver->name)-1] = 0; -+ spin_lock_bh(&ntoskernel_lock); -+ InsertTailList(&bus_driver_list, &bus_driver->list); -+ spin_unlock_bh(&ntoskernel_lock); -+ TRACE1("bus driver %s is at %p", name, &bus_driver->drv_obj); -+ return STATUS_SUCCESS; -+} -+ -+struct driver_object *find_bus_driver(const char *name) -+{ -+ struct bus_driver *bus_driver; -+ struct driver_object *drv_obj; -+ -+ spin_lock_bh(&ntoskernel_lock); -+ drv_obj = NULL; -+ nt_list_for_each_entry(bus_driver, &bus_driver_list, list) { -+ if (strcmp(bus_driver->name, name) == 0) { -+ drv_obj = &bus_driver->drv_obj; -+ break; -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ return drv_obj; -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExfInterlockedInsertHeadList,3) -+ (struct nt_list *head, struct nt_list *entry, NT_SPIN_LOCK *lock) -+{ -+ struct nt_list *first; -+ unsigned long flags; -+ -+ ENTER5("head = %p, entry = %p", head, entry); -+ nt_spin_lock_irqsave(lock, flags); -+ first = InsertHeadList(head, entry); -+ nt_spin_unlock_irqrestore(lock, flags); -+ TRACE5("head = %p, old = %p", head, first); -+ return first; -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExInterlockedInsertHeadList,3) -+ (struct nt_list *head, struct nt_list *entry, NT_SPIN_LOCK *lock) -+{ -+ ENTER5("%p", head); -+ return ExfInterlockedInsertHeadList(head, entry, lock); -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExfInterlockedInsertTailList,3) -+ (struct nt_list *head, struct nt_list *entry, NT_SPIN_LOCK *lock) -+{ -+ struct nt_list *last; -+ unsigned long flags; -+ -+ ENTER5("head = %p, entry = %p", head, entry); -+ nt_spin_lock_irqsave(lock, flags); -+ last = InsertTailList(head, entry); -+ nt_spin_unlock_irqrestore(lock, flags); -+ TRACE5("head = %p, old = %p", head, last); -+ return last; -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExInterlockedInsertTailList,3) -+ (struct nt_list *head, struct nt_list *entry, NT_SPIN_LOCK *lock) -+{ -+ ENTER5("%p", head); -+ return ExfInterlockedInsertTailList(head, entry, lock); -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExfInterlockedRemoveHeadList,2) -+ (struct nt_list *head, NT_SPIN_LOCK *lock) -+{ -+ struct nt_list *ret; -+ unsigned long flags; -+ -+ ENTER5("head = %p", head); -+ nt_spin_lock_irqsave(lock, flags); -+ ret = RemoveHeadList(head); -+ nt_spin_unlock_irqrestore(lock, flags); -+ TRACE5("head = %p, ret = %p", head, ret); -+ return ret; -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExInterlockedRemoveHeadList,2) -+ (struct nt_list *head, NT_SPIN_LOCK *lock) -+{ -+ ENTER5("%p", head); -+ return ExfInterlockedRemoveHeadList(head, lock); -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExfInterlockedRemoveTailList,2) -+ (struct nt_list *head, NT_SPIN_LOCK *lock) -+{ -+ struct nt_list *ret; -+ unsigned long flags; -+ -+ ENTER5("head = %p", head); -+ nt_spin_lock_irqsave(lock, flags); -+ ret = RemoveTailList(head); -+ nt_spin_unlock_irqrestore(lock, flags); -+ TRACE5("head = %p, ret = %p", head, ret); -+ return ret; -+} -+ -+wfastcall struct nt_list *WIN_FUNC(ExInterlockedRemoveTailList,2) -+ (struct nt_list *head, NT_SPIN_LOCK *lock) -+{ -+ ENTER5("%p", head); -+ return ExfInterlockedRemoveTailList(head, lock); -+} -+ -+wfastcall void WIN_FUNC(InitializeSListHead,1) -+ (nt_slist_header *head) -+{ -+ memset(head, 0, sizeof(*head)); -+} -+ -+wfastcall struct nt_slist *WIN_FUNC(ExInterlockedPushEntrySList,3) -+ (nt_slist_header *head, struct nt_slist *entry, NT_SPIN_LOCK *lock) -+{ -+ struct nt_slist *ret; -+ -+ ret = PushEntrySList(head, entry, lock); -+ return ret; -+} -+ -+wstdcall struct nt_slist *WIN_FUNC(ExpInterlockedPushEntrySList,2) -+ (nt_slist_header *head, struct nt_slist *entry) -+{ -+ struct nt_slist *ret; -+ -+ ret = PushEntrySList(head, entry, &nt_list_lock); -+ return ret; -+} -+ -+wfastcall struct nt_slist *WIN_FUNC(InterlockedPushEntrySList,2) -+ (nt_slist_header *head, struct nt_slist *entry) -+{ -+ struct nt_slist *ret; -+ -+ ret = PushEntrySList(head, entry, &nt_list_lock); -+ return ret; -+} -+ -+wfastcall struct nt_slist *WIN_FUNC(ExInterlockedPopEntrySList,2) -+ (nt_slist_header *head, NT_SPIN_LOCK *lock) -+{ -+ struct nt_slist *ret; -+ -+ ret = PopEntrySList(head, lock); -+ return ret; -+} -+ -+wstdcall struct nt_slist *WIN_FUNC(ExpInterlockedPopEntrySList,1) -+ (nt_slist_header *head) -+{ -+ struct nt_slist *ret; -+ -+ ret = PopEntrySList(head, &nt_list_lock); -+ return ret; -+} -+ -+wfastcall struct nt_slist *WIN_FUNC(InterlockedPopEntrySList,1) -+ (nt_slist_header *head) -+{ -+ struct nt_slist *ret; -+ -+ ret = PopEntrySList(head, &nt_list_lock); -+ return ret; -+} -+ -+wstdcall USHORT WIN_FUNC(ExQueryDepthSList,1) -+ (nt_slist_header *head) -+{ -+ USHORT depth; -+ ENTER5("%p", head); -+ depth = head->depth; -+ TRACE5("%d, %p", depth, head->next); -+ return depth; -+} -+ -+wfastcall LONG WIN_FUNC(InterlockedIncrement,1) -+ (LONG volatile *val) -+{ -+ return post_atomic_add(*val, 1); -+} -+ -+wfastcall LONG WIN_FUNC(InterlockedDecrement,1) -+ (LONG volatile *val) -+{ -+ return post_atomic_add(*val, -1); -+} -+ -+wfastcall LONG WIN_FUNC(InterlockedExchange,2) -+ (LONG volatile *target, LONG val) -+{ -+ return xchg(target, val); -+} -+ -+wfastcall LONG WIN_FUNC(InterlockedCompareExchange,3) -+ (LONG volatile *dest, LONG new, LONG old) -+{ -+ return cmpxchg(dest, old, new); -+} -+ -+wfastcall void WIN_FUNC(ExInterlockedAddLargeStatistic,2) -+ (LARGE_INTEGER volatile *plint, ULONG n) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+#ifdef CONFIG_X86_64 -+ __asm__ __volatile__( -+ "\n" -+ LOCK_PREFIX "add %1, %0\n\t" -+ : "+m" (*plint) -+ : "r" (n)); -+#else -+ __asm__ __volatile__( -+ "1:\t" -+ " movl %1, %%ebx\n\t" -+ " movl %%edx, %%ecx\n\t" -+ " addl %%eax, %%ebx\n\t" -+ " adcl $0, %%ecx\n\t" -+ LOCK_PREFIX "cmpxchg8b %0\n\t" -+ " jnz 1b\n\t" -+ : "+m" (*plint) -+ : "m" (n), "A" (*plint) -+ : "ebx", "ecx"); -+#endif -+ local_irq_restore(flags); -+} -+ -+static void initialize_object(struct dispatcher_header *dh, enum dh_type type, -+ int state) -+{ -+ memset(dh, 0, sizeof(*dh)); -+ set_object_type(dh, type); -+ dh->signal_state = state; -+ InitializeListHead(&dh->wait_blocks); -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+static void timer_proc(struct timer_list *tl) -+#else -+static void timer_proc(unsigned long data) -+#endif -+{ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ struct wrap_timer *wrap_timer = from_timer(wrap_timer, tl, timer); -+#else -+ struct wrap_timer *wrap_timer = (struct wrap_timer *)data; -+#endif -+ struct nt_timer *nt_timer; -+ struct kdpc *kdpc; -+ -+ nt_timer = wrap_timer->nt_timer; -+ TIMERENTER("%p(%p), %lu", wrap_timer, nt_timer, jiffies); -+#ifdef TIMER_DEBUG -+ BUG_ON(wrap_timer->wrap_timer_magic != WRAP_TIMER_MAGIC); -+ BUG_ON(nt_timer->wrap_timer_magic != WRAP_TIMER_MAGIC); -+#endif -+ KeSetEvent((struct nt_event *)nt_timer, 0, FALSE); -+ if (wrap_timer->repeat) -+ mod_timer(&wrap_timer->timer, jiffies + wrap_timer->repeat); -+ kdpc = nt_timer->kdpc; -+ if (kdpc) -+ queue_kdpc(kdpc); -+ TIMEREXIT(return); -+} -+ -+void wrap_init_timer(struct nt_timer *nt_timer, enum timer_type type, -+ struct ndis_mp_block *nmb) -+{ -+ struct wrap_timer *wrap_timer; -+ -+ /* TODO: if a timer is initialized more than once, we allocate -+ * memory for wrap_timer more than once for the same nt_timer, -+ * wasting memory. We can check if nt_timer->wrap_timer_magic is -+ * set and not allocate, but it is not guaranteed always to be -+ * safe */ -+ TIMERENTER("%p", nt_timer); -+ /* we allocate memory for wrap_timer behind driver's back and -+ * there is no NDIS/DDK function where this memory can be -+ * freed, so we use slack_kmalloc so it gets freed when driver -+ * is unloaded */ -+ if (nmb) -+ wrap_timer = kzalloc(sizeof(*wrap_timer), irql_gfp()); -+ else -+ wrap_timer = slack_kzalloc(sizeof(*wrap_timer)); -+ if (!wrap_timer) { -+ ERROR("couldn't allocate memory for timer"); -+ return; -+ } -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) -+ init_timer(&wrap_timer->timer); -+ wrap_timer->timer.function = timer_proc; -+ wrap_timer->timer.data = (unsigned long)wrap_timer; -+#else -+ timer_setup(&wrap_timer->timer, timer_proc, 0); -+#endif -+ wrap_timer->nt_timer = nt_timer; -+#ifdef TIMER_DEBUG -+ wrap_timer->wrap_timer_magic = WRAP_TIMER_MAGIC; -+#endif -+ nt_timer->wrap_timer = wrap_timer; -+ nt_timer->kdpc = NULL; -+ initialize_object(&nt_timer->dh, (enum dh_type)type, 0); -+ nt_timer->wrap_timer_magic = WRAP_TIMER_MAGIC; -+ TIMERTRACE("timer %p (%p)", wrap_timer, nt_timer); -+ spin_lock_bh(&ntoskernel_lock); -+ if (nmb) { -+ wrap_timer->slist.next = nmb->wnd->wrap_timer_slist.next; -+ nmb->wnd->wrap_timer_slist.next = &wrap_timer->slist; -+ } else { -+ wrap_timer->slist.next = wrap_timer_slist.next; -+ wrap_timer_slist.next = &wrap_timer->slist; -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ TIMEREXIT(return); -+} -+ -+wstdcall void WIN_FUNC(KeInitializeTimerEx,2) -+ (struct nt_timer *nt_timer, enum timer_type type) -+{ -+ TIMERENTER("%p", nt_timer); -+ wrap_init_timer(nt_timer, type, NULL); -+} -+ -+wstdcall void WIN_FUNC(KeInitializeTimer,1) -+ (struct nt_timer *nt_timer) -+{ -+ TIMERENTER("%p", nt_timer); -+ wrap_init_timer(nt_timer, NotificationTimer, NULL); -+} -+ -+/* expires and repeat are in HZ */ -+BOOLEAN wrap_set_timer(struct nt_timer *nt_timer, unsigned long expires_hz, -+ unsigned long repeat_hz, struct kdpc *kdpc) -+{ -+ struct wrap_timer *wrap_timer; -+ -+ TIMERENTER("%p, %lu, %lu, %p, %lu", -+ nt_timer, expires_hz, repeat_hz, kdpc, jiffies); -+ -+ wrap_timer = nt_timer->wrap_timer; -+ TIMERTRACE("%p", wrap_timer); -+#ifdef TIMER_DEBUG -+ if (wrap_timer->nt_timer != nt_timer) -+ WARNING("bad timers: %p, %p, %p", wrap_timer, nt_timer, -+ wrap_timer->nt_timer); -+ if (nt_timer->wrap_timer_magic != WRAP_TIMER_MAGIC) { -+ WARNING("buggy Windows timer didn't initialize timer %p", -+ nt_timer); -+ return FALSE; -+ } -+ if (wrap_timer->wrap_timer_magic != WRAP_TIMER_MAGIC) { -+ WARNING("timer %p is not initialized (%lx)?", -+ wrap_timer, wrap_timer->wrap_timer_magic); -+ wrap_timer->wrap_timer_magic = WRAP_TIMER_MAGIC; -+ } -+#endif -+ KeClearEvent((struct nt_event *)nt_timer); -+ nt_timer->kdpc = kdpc; -+ wrap_timer->repeat = repeat_hz; -+ if (mod_timer(&wrap_timer->timer, jiffies + expires_hz)) -+ TIMEREXIT(return TRUE); -+ else -+ TIMEREXIT(return FALSE); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeSetTimerEx,4) -+ (struct nt_timer *nt_timer, LARGE_INTEGER duetime_ticks, -+ LONG period_ms, struct kdpc *kdpc) -+{ -+ unsigned long expires_hz, repeat_hz; -+ -+ TIMERENTER("%p, %lld, %d", nt_timer, duetime_ticks, period_ms); -+ expires_hz = SYSTEM_TIME_TO_HZ(duetime_ticks); -+ repeat_hz = MSEC_TO_HZ(period_ms); -+ return wrap_set_timer(nt_timer, expires_hz, repeat_hz, kdpc); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeSetTimer,3) -+ (struct nt_timer *nt_timer, LARGE_INTEGER duetime_ticks, -+ struct kdpc *kdpc) -+{ -+ TIMERENTER("%p, %lld, %p", nt_timer, duetime_ticks, kdpc); -+ return KeSetTimerEx(nt_timer, duetime_ticks, 0, kdpc); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeCancelTimer,1) -+ (struct nt_timer *nt_timer) -+{ -+ struct wrap_timer *wrap_timer; -+ int ret; -+ -+ TIMERENTER("%p", nt_timer); -+ wrap_timer = nt_timer->wrap_timer; -+ if (!wrap_timer) { -+ ERROR("invalid wrap_timer"); -+ return TRUE; -+ } -+#ifdef TIMER_DEBUG -+ BUG_ON(wrap_timer->wrap_timer_magic != WRAP_TIMER_MAGIC); -+#endif -+ /* disable timer before deleting so if it is periodic timer, it -+ * won't be re-armed after deleting */ -+ wrap_timer->repeat = 0; -+ ret = del_timer_sync(&wrap_timer->timer); -+ /* the documentation for KeCancelTimer suggests the DPC is -+ * deqeued, but actually DPC is left to run */ -+ if (ret) -+ TIMEREXIT(return TRUE); -+ else -+ TIMEREXIT(return FALSE); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeReadStateTimer,1) -+ (struct nt_timer *nt_timer) -+{ -+ if (nt_timer->dh.signal_state) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+wstdcall void WIN_FUNC(KeInitializeDpc,3) -+ (struct kdpc *kdpc, void *func, void *ctx) -+{ -+ ENTER3("%p, %p, %p", kdpc, func, ctx); -+ memset(kdpc, 0, sizeof(*kdpc)); -+ kdpc->func = func; -+ kdpc->ctx = ctx; -+ InitializeListHead(&kdpc->list); -+} -+ -+static void kdpc_worker(struct work_struct *dummy) -+{ -+ struct nt_list *entry; -+ struct kdpc *kdpc; -+ unsigned long flags; -+ KIRQL irql; -+ -+ WORKENTER(""); -+ irql = raise_irql(DISPATCH_LEVEL); -+ while (1) { -+ spin_lock_irqsave(&kdpc_list_lock, flags); -+ entry = RemoveHeadList(&kdpc_list); -+ if (entry) { -+ kdpc = container_of(entry, struct kdpc, list); -+ assert(kdpc->queued); -+ kdpc->queued = 0; -+ } else -+ kdpc = NULL; -+ spin_unlock_irqrestore(&kdpc_list_lock, flags); -+ if (!kdpc) -+ break; -+ WORKTRACE("%p, %p, %p, %p, %p", kdpc, kdpc->func, kdpc->ctx, -+ kdpc->arg1, kdpc->arg2); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ LIN2WIN4(kdpc->func, kdpc, kdpc->ctx, kdpc->arg1, kdpc->arg2); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ } -+ lower_irql(irql); -+ WORKEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(KeFlushQueuedDpcs,0) -+ (void) -+{ -+ kdpc_worker(NULL); -+} -+ -+BOOLEAN queue_kdpc(struct kdpc *kdpc) -+{ -+ BOOLEAN ret; -+ unsigned long flags; -+ -+ WORKENTER("%p", kdpc); -+ spin_lock_irqsave(&kdpc_list_lock, flags); -+ if (kdpc->queued) -+ ret = FALSE; -+ else { -+ if (unlikely(kdpc->importance == HighImportance)) -+ InsertHeadList(&kdpc_list, &kdpc->list); -+ else -+ InsertTailList(&kdpc_list, &kdpc->list); -+ kdpc->queued = 1; -+ ret = TRUE; -+ } -+ spin_unlock_irqrestore(&kdpc_list_lock, flags); -+ if (ret == TRUE) -+ queue_work(ntos_wq, &kdpc_work); -+ WORKTRACE("%d", ret); -+ return ret; -+} -+ -+BOOLEAN dequeue_kdpc(struct kdpc *kdpc) -+{ -+ BOOLEAN ret; -+ unsigned long flags; -+ -+ WORKENTER("%p", kdpc); -+ spin_lock_irqsave(&kdpc_list_lock, flags); -+ if (kdpc->queued) { -+ RemoveEntryList(&kdpc->list); -+ kdpc->queued = 0; -+ ret = TRUE; -+ } else -+ ret = FALSE; -+ spin_unlock_irqrestore(&kdpc_list_lock, flags); -+ WORKTRACE("%d", ret); -+ return ret; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeInsertQueueDpc,3) -+ (struct kdpc *kdpc, void *arg1, void *arg2) -+{ -+ WORKENTER("%p, %p, %p", kdpc, arg1, arg2); -+ kdpc->arg1 = arg1; -+ kdpc->arg2 = arg2; -+ return queue_kdpc(kdpc); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeRemoveQueueDpc,1) -+ (struct kdpc *kdpc) -+{ -+ return dequeue_kdpc(kdpc); -+} -+ -+wstdcall void WIN_FUNC(KeSetImportanceDpc,2) -+ (struct kdpc *kdpc, enum kdpc_importance importance) -+{ -+ kdpc->importance = importance; -+} -+ -+static void ntos_work_worker(struct work_struct *dummy) -+{ -+ struct ntos_work_item *ntos_work_item; -+ struct nt_list *cur; -+ -+ while (1) { -+ spin_lock_bh(&ntos_work_lock); -+ cur = RemoveHeadList(&ntos_work_list); -+ spin_unlock_bh(&ntos_work_lock); -+ if (!cur) -+ break; -+ ntos_work_item = container_of(cur, struct ntos_work_item, list); -+ WORKTRACE("%p: executing %p, %p, %p", current, -+ ntos_work_item->func, ntos_work_item->arg1, -+ ntos_work_item->arg2); -+ LIN2WIN2(ntos_work_item->func, ntos_work_item->arg1, -+ ntos_work_item->arg2); -+ kfree(ntos_work_item); -+ } -+ WORKEXIT(return); -+} -+ -+int schedule_ntos_work_item(NTOS_WORK_FUNC func, void *arg1, void *arg2) -+{ -+ struct ntos_work_item *ntos_work_item; -+ -+ WORKENTER("adding work: %p, %p, %p", func, arg1, arg2); -+ ntos_work_item = kmalloc(sizeof(*ntos_work_item), irql_gfp()); -+ if (!ntos_work_item) { -+ ERROR("couldn't allocate memory"); -+ return -ENOMEM; -+ } -+ ntos_work_item->func = func; -+ ntos_work_item->arg1 = arg1; -+ ntos_work_item->arg2 = arg2; -+ spin_lock_bh(&ntos_work_lock); -+ InsertTailList(&ntos_work_list, &ntos_work_item->list); -+ spin_unlock_bh(&ntos_work_lock); -+ queue_work(ntos_wq, &ntos_work); -+ WORKEXIT(return 0); -+} -+ -+wstdcall void WIN_FUNC(KeInitializeSpinLock,1) -+ (NT_SPIN_LOCK *lock) -+{ -+ ENTER6("%p", lock); -+ nt_spin_lock_init(lock); -+} -+ -+wstdcall void WIN_FUNC(KeAcquireSpinLock,2) -+ (NT_SPIN_LOCK *lock, KIRQL *irql) -+{ -+ ENTER6("%p", lock); -+ *irql = nt_spin_lock_irql(lock, DISPATCH_LEVEL); -+} -+ -+wstdcall void WIN_FUNC(KeReleaseSpinLock,2) -+ (NT_SPIN_LOCK *lock, KIRQL oldirql) -+{ -+ ENTER6("%p", lock); -+ nt_spin_unlock_irql(lock, oldirql); -+} -+ -+wstdcall void WIN_FUNC(KeAcquireSpinLockAtDpcLevel,1) -+ (NT_SPIN_LOCK *lock) -+{ -+ ENTER6("%p", lock); -+ nt_spin_lock(lock); -+} -+ -+wstdcall void WIN_FUNC(KeReleaseSpinLockFromDpcLevel,1) -+ (NT_SPIN_LOCK *lock) -+{ -+ ENTER6("%p", lock); -+ nt_spin_unlock(lock); -+} -+ -+wstdcall void WIN_FUNC(KeRaiseIrql,2) -+ (KIRQL newirql, KIRQL *oldirql) -+{ -+ ENTER6("%d", newirql); -+ *oldirql = raise_irql(newirql); -+} -+ -+wstdcall KIRQL WIN_FUNC(KeRaiseIrqlToDpcLevel,0) -+ (void) -+{ -+ return raise_irql(DISPATCH_LEVEL); -+} -+ -+wstdcall void WIN_FUNC(KeLowerIrql,1) -+ (KIRQL irql) -+{ -+ ENTER6("%d", irql); -+ lower_irql(irql); -+} -+ -+wstdcall KIRQL WIN_FUNC(KeAcquireSpinLockRaiseToDpc,1) -+ (NT_SPIN_LOCK *lock) -+{ -+ ENTER6("%p", lock); -+ return nt_spin_lock_irql(lock, DISPATCH_LEVEL); -+} -+ -+wstdcall void *WIN_FUNC(ExAllocatePoolWithTag,3) -+ (enum pool_type pool_type, SIZE_T size, ULONG tag) -+{ -+ void *addr; -+ -+ ENTER4("pool_type: %d, size: %zu, tag: 0x%x", pool_type, size, tag); -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ if (size < PAGE_SIZE) -+ addr = kmalloc(size, irql_gfp()); -+ else { -+ if (irql_gfp() & GFP_ATOMIC) { -+ addr = __vmalloc(size, GFP_ATOMIC | __GFP_HIGHMEM -+ ); -+ TRACE1("%p, %zu", addr, size); -+ } else { -+ addr = vmalloc(size); -+ TRACE1("%p, %zu", addr, size); -+ } -+ } -+ DBG_BLOCK(1) { -+ if (addr) -+ TRACE4("addr: %p, %zu", addr, size); -+ else -+ TRACE1("failed: %zu", size); -+ } -+ return addr; -+} -+WIN_FUNC_DECL(ExAllocatePoolWithTag,3) -+ -+wstdcall void WIN_FUNC(ExFreePoolWithTag,2) -+ (void *addr, ULONG tag) -+{ -+ TRACE4("%p", addr); -+ if ((unsigned long)addr < VMALLOC_START || -+ (unsigned long)addr >= VMALLOC_END) -+ kfree(addr); -+ else -+ vfree(addr); -+ -+ EXIT4(return); -+} -+ -+wstdcall void WIN_FUNC(ExFreePool,1) -+ (void *addr) -+{ -+ ExFreePoolWithTag(addr, 0); -+} -+WIN_FUNC_DECL(ExFreePool,1) -+ -+wstdcall void WIN_FUNC(ExInitializeNPagedLookasideList,7) -+ (struct npaged_lookaside_list *lookaside, -+ LOOKASIDE_ALLOC_FUNC *alloc_func, LOOKASIDE_FREE_FUNC *free_func, -+ ULONG flags, SIZE_T size, ULONG tag, USHORT depth) -+{ -+ ENTER3("lookaside: %p, size: %zu, flags: %u, head: %p, " -+ "alloc: %p, free: %p", lookaside, size, flags, -+ lookaside, alloc_func, free_func); -+ -+ memset(lookaside, 0, sizeof(*lookaside)); -+ -+ lookaside->size = size; -+ lookaside->tag = tag; -+ lookaside->depth = 4; -+ lookaside->maxdepth = 256; -+ lookaside->pool_type = NonPagedPool; -+ -+ if (alloc_func) -+ lookaside->alloc_func = alloc_func; -+ else -+ lookaside->alloc_func = WIN_FUNC_PTR(ExAllocatePoolWithTag,3); -+ if (free_func) -+ lookaside->free_func = free_func; -+ else -+ lookaside->free_func = WIN_FUNC_PTR(ExFreePool,1); -+ -+#ifndef CONFIG_X86_64 -+ nt_spin_lock_init(&lookaside->obsolete); -+#endif -+ EXIT3(return); -+} -+ -+wstdcall void WIN_FUNC(ExDeleteNPagedLookasideList,1) -+ (struct npaged_lookaside_list *lookaside) -+{ -+ struct nt_slist *entry; -+ -+ ENTER3("lookaside = %p", lookaside); -+ while ((entry = ExpInterlockedPopEntrySList(&lookaside->head))) -+ LIN2WIN1(lookaside->free_func, entry); -+ EXIT3(return); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ExCreateCallback,4) -+ (struct callback_object **object, struct object_attributes *attributes, -+ BOOLEAN create, BOOLEAN allow_multiple_callbacks) -+{ -+ struct callback_object *obj; -+ -+ ENTER2(""); -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(obj, &callback_objects, callback_funcs) { -+ if (obj->attributes == attributes) { -+ spin_unlock_bh(&ntoskernel_lock); -+ *object = obj; -+ return STATUS_SUCCESS; -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ obj = allocate_object(sizeof(struct callback_object), -+ OBJECT_TYPE_CALLBACK, NULL); -+ if (!obj) -+ EXIT2(return STATUS_INSUFFICIENT_RESOURCES); -+ InitializeListHead(&obj->callback_funcs); -+ nt_spin_lock_init(&obj->lock); -+ obj->allow_multiple_callbacks = allow_multiple_callbacks; -+ obj->attributes = attributes; -+ *object = obj; -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall void *WIN_FUNC(ExRegisterCallback,3) -+ (struct callback_object *object, PCALLBACK_FUNCTION func, void *context) -+{ -+ struct callback_func *callback; -+ KIRQL irql; -+ -+ ENTER2(""); -+ irql = nt_spin_lock_irql(&object->lock, DISPATCH_LEVEL); -+ if (object->allow_multiple_callbacks == FALSE && -+ !IsListEmpty(&object->callback_funcs)) { -+ nt_spin_unlock_irql(&object->lock, irql); -+ EXIT2(return NULL); -+ } -+ nt_spin_unlock_irql(&object->lock, irql); -+ callback = kmalloc(sizeof(*callback), GFP_KERNEL); -+ if (!callback) { -+ ERROR("couldn't allocate memory"); -+ return NULL; -+ } -+ callback->func = func; -+ callback->context = context; -+ callback->object = object; -+ irql = nt_spin_lock_irql(&object->lock, DISPATCH_LEVEL); -+ InsertTailList(&object->callback_funcs, &callback->list); -+ nt_spin_unlock_irql(&object->lock, irql); -+ EXIT2(return callback); -+} -+ -+wstdcall void WIN_FUNC(ExUnregisterCallback,1) -+ (struct callback_func *callback) -+{ -+ struct callback_object *object; -+ KIRQL irql; -+ -+ ENTER3("%p", callback); -+ if (!callback) -+ return; -+ object = callback->object; -+ irql = nt_spin_lock_irql(&object->lock, DISPATCH_LEVEL); -+ RemoveEntryList(&callback->list); -+ nt_spin_unlock_irql(&object->lock, irql); -+ kfree(callback); -+ return; -+} -+ -+wstdcall void WIN_FUNC(ExNotifyCallback,3) -+ (struct callback_object *object, void *arg1, void *arg2) -+{ -+ struct callback_func *callback; -+ KIRQL irql; -+ -+ ENTER3("%p", object); -+ irql = nt_spin_lock_irql(&object->lock, DISPATCH_LEVEL); -+ nt_list_for_each_entry(callback, &object->callback_funcs, list) { -+ LIN2WIN3(callback->func, callback->context, arg1, arg2); -+ } -+ nt_spin_unlock_irql(&object->lock, irql); -+ return; -+} -+ -+/* check and set signaled state; should be called with dispatcher_lock held */ -+/* @grab indicates if the event should be grabbed or checked -+ * - note that a semaphore may stay in signaled state for multiple -+ * 'grabs' if the count is > 1 */ -+static int grab_object(struct dispatcher_header *dh, -+ struct task_struct *thread, int grab) -+{ -+ EVENTTRACE("%p, %p, %d, %d", dh, thread, grab, dh->signal_state); -+ if (unlikely(is_mutex_object(dh))) { -+ struct nt_mutex *nt_mutex; -+ nt_mutex = container_of(dh, struct nt_mutex, dh); -+ EVENTTRACE("%p, %p, %d, %p, %d", nt_mutex, -+ nt_mutex->owner_thread, dh->signal_state, -+ thread, grab); -+ /* either no thread owns the mutex or this thread owns -+ * it */ -+ assert(dh->signal_state == 1 && nt_mutex->owner_thread == NULL); -+ assert(dh->signal_state < 1 && nt_mutex->owner_thread != NULL); -+ if ((dh->signal_state == 1 && nt_mutex->owner_thread == NULL) || -+ nt_mutex->owner_thread == thread) { -+ if (grab) { -+ dh->signal_state--; -+ nt_mutex->owner_thread = thread; -+ } -+ EVENTEXIT(return 1); -+ } -+ } else if (dh->signal_state > 0) { -+ /* to grab, decrement signal_state for synchronization -+ * or semaphore objects */ -+ if (grab && (is_synch_object(dh) || is_semaphore_object(dh))) -+ dh->signal_state--; -+ EVENTEXIT(return 1); -+ } -+ EVENTEXIT(return 0); -+} -+ -+/* this function should be called holding dispatcher_lock */ -+static void object_signaled(struct dispatcher_header *dh) -+{ -+ struct nt_list *cur, *next; -+ struct wait_block *wb; -+ -+ EVENTENTER("%p", dh); -+ nt_list_for_each_safe(cur, next, &dh->wait_blocks) { -+ wb = container_of(cur, struct wait_block, list); -+ assert(wb->thread != NULL); -+ assert(wb->object == NULL); -+ if (!grab_object(dh, wb->thread, 1)) -+ continue; -+ EVENTTRACE("%p (%p): waking %p", dh, wb, wb->thread); -+ RemoveEntryList(cur); -+ wb->object = dh; -+ *(wb->wait_done) = 1; -+ wake_up_process(wb->thread); -+ } -+ EVENTEXIT(return); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(KeWaitForMultipleObjects,8) -+ (ULONG count, void *object[], enum wait_type wait_type, -+ KWAIT_REASON wait_reason, KPROCESSOR_MODE wait_mode, -+ BOOLEAN alertable, LARGE_INTEGER *timeout, -+ struct wait_block *wait_block_array) -+{ -+ int i, res = 0, wait_count, wait_done; -+ typeof(jiffies) wait_hz = 0; -+ struct wait_block *wb, wb_array[THREAD_WAIT_OBJECTS]; -+ struct dispatcher_header *dh; -+ KIRQL irql = current_irql(); -+ -+ EVENTENTER("%p, %d, %u, %p", current, count, wait_type, timeout); -+ -+ if (count > MAX_WAIT_OBJECTS || -+ (count > THREAD_WAIT_OBJECTS && wait_block_array == NULL)) -+ EVENTEXIT(return STATUS_INVALID_PARAMETER); -+ -+ if (wait_block_array == NULL) -+ wb = wb_array; -+ else -+ wb = wait_block_array; -+ -+ /* If *timeout == 0: In the case of WaitAny, if an object can -+ * be grabbed (object is in signaled state), grab and -+ * return. In the case of WaitAll, we have to first make sure -+ * all objects can be grabbed. If any/some of them can't be -+ * grabbed, either we return STATUS_TIMEOUT or wait for them, -+ * depending on how to satisfy wait. If all of them can be -+ * grabbed, we will grab them in the next loop below */ -+ -+ spin_lock_bh(&dispatcher_lock); -+ for (i = wait_count = 0; i < count; i++) { -+ dh = object[i]; -+ EVENTTRACE("%p: event %p (%d)", current, dh, dh->signal_state); -+ /* wait_type == 1 for WaitAny, 0 for WaitAll */ -+ if (grab_object(dh, current, wait_type)) { -+ if (wait_type == WaitAny) { -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return STATUS_WAIT_0 + i); -+ } -+ } else { -+ EVENTTRACE("%p: wait for %p", current, dh); -+ wait_count++; -+ } -+ } -+ -+ if (timeout && *timeout == 0 && wait_count) { -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return STATUS_TIMEOUT); -+ } -+ -+ /* get the list of objects the thread needs to wait on and add -+ * the thread on the wait list for each such object */ -+ /* if *timeout == 0, this step will grab all the objects */ -+ wait_done = 0; -+ for (i = 0; i < count; i++) { -+ dh = object[i]; -+ EVENTTRACE("%p: event %p (%d)", current, dh, dh->signal_state); -+ wb[i].object = NULL; -+ if (grab_object(dh, current, 1)) { -+ EVENTTRACE("%p: no wait for %p (%d)", -+ current, dh, dh->signal_state); -+ /* mark that we are not waiting on this object */ -+ wb[i].thread = NULL; -+ } else { -+ wb[i].wait_done = &wait_done; -+ wb[i].thread = current; -+ EVENTTRACE("%p: wait for %p", current, dh); -+ InsertTailList(&dh->wait_blocks, &wb[i].list); -+ } -+ } -+ spin_unlock_bh(&dispatcher_lock); -+ if (wait_count == 0) -+ EVENTEXIT(return STATUS_SUCCESS); -+ -+ assert(timeout == NULL || *timeout != 0); -+ if (timeout == NULL) -+ wait_hz = 0; -+ else -+ wait_hz = SYSTEM_TIME_TO_HZ(*timeout); -+ -+ if (irql >= DISPATCH_LEVEL) { -+ WARNING("attempt to wait with irql %d", irql); -+ EVENTEXIT(return STATUS_INVALID_PARAMETER); -+ } -+ EVENTTRACE("%p: sleep for %ld on %p", current, wait_hz, &wait_done); -+ /* we don't honor 'alertable' - according to description for -+ * this, even if waiting in non-alertable state, thread may be -+ * alerted in some circumstances */ -+ while (wait_count) { -+ res = wait_condition(wait_done, wait_hz, TASK_INTERRUPTIBLE); -+ spin_lock_bh(&dispatcher_lock); -+ EVENTTRACE("%p woke up: %d, %d", current, res, wait_done); -+ /* the event may have been set by the time -+ * wrap_wait_event returned and spinlock obtained, so -+ * don't rely on value of 'res' - check event status */ -+ if (!wait_done) { -+ assert(res <= 0); -+ /* timed out or interrupted; remove from wait list */ -+ for (i = 0; i < count; i++) { -+ if (!wb[i].thread) -+ continue; -+ EVENTTRACE("%p: timedout, dequeue %p (%p)", -+ current, object[i], wb[i].object); -+ assert(wb[i].object == NULL); -+ RemoveEntryList(&wb[i].list); -+ } -+ spin_unlock_bh(&dispatcher_lock); -+ if (res < 0) -+ EVENTEXIT(return STATUS_ALERTED); -+ else -+ EVENTEXIT(return STATUS_TIMEOUT); -+ } -+ assert(res > 0); -+ /* woken because object(s) signaled */ -+ for (i = 0; wait_count && i < count; i++) { -+ if (!wb[i].thread || !wb[i].object) -+ continue; -+ DBG_BLOCK(1) { -+ if (wb[i].object != object[i]) { -+ EVENTTRACE("oops %p != %p", -+ wb[i].object, object[i]); -+ continue; -+ } -+ } -+ wait_count--; -+ if (wait_type == WaitAny) { -+ int j; -+ /* done; remove from rest of wait list */ -+ for (j = i + 1; j < count; j++) { -+ if (wb[j].thread && !wb[j].object) -+ RemoveEntryList(&wb[j].list); -+ } -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return STATUS_WAIT_0 + i); -+ } -+ } -+ wait_done = 0; -+ spin_unlock_bh(&dispatcher_lock); -+ if (wait_count == 0) -+ EVENTEXIT(return STATUS_SUCCESS); -+ -+ /* this thread is still waiting for more objects, so -+ * let it wait for remaining time and those objects */ -+ if (timeout) -+ wait_hz = res; -+ else -+ wait_hz = 0; -+ } -+ /* should never reach here, but compiler wants return value */ -+ ERROR("%p: wait_hz: %ld", current, wait_hz); -+ EVENTEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(KeWaitForSingleObject,5) -+ (void *object, KWAIT_REASON wait_reason, KPROCESSOR_MODE wait_mode, -+ BOOLEAN alertable, LARGE_INTEGER *timeout) -+{ -+ return KeWaitForMultipleObjects(1, &object, WaitAny, wait_reason, -+ wait_mode, alertable, timeout, NULL); -+} -+ -+wstdcall void WIN_FUNC(KeInitializeEvent,3) -+ (struct nt_event *nt_event, enum event_type type, BOOLEAN state) -+{ -+ EVENTENTER("event = %p, type = %d, state = %d", nt_event, type, state); -+ initialize_object(&nt_event->dh, (enum dh_type)type, state); -+ EVENTEXIT(return); -+} -+ -+wstdcall LONG WIN_FUNC(KeSetEvent,3) -+ (struct nt_event *nt_event, KPRIORITY incr, BOOLEAN wait) -+{ -+ LONG old_state; -+ -+ EVENTENTER("%p, %d", nt_event, nt_event->dh.type); -+ if (wait == TRUE) -+ WARNING("wait = %d, not yet implemented", wait); -+ spin_lock_bh(&dispatcher_lock); -+ old_state = nt_event->dh.signal_state; -+ nt_event->dh.signal_state = 1; -+ if (old_state == 0) -+ object_signaled(&nt_event->dh); -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return old_state); -+} -+ -+wstdcall void WIN_FUNC(KeClearEvent,1) -+ (struct nt_event *nt_event) -+{ -+ EVENTENTER("%p", nt_event); -+ nt_event->dh.signal_state = 0; -+ EVENTEXIT(return); -+} -+ -+wstdcall LONG WIN_FUNC(KeResetEvent,1) -+ (struct nt_event *nt_event) -+{ -+ LONG old_state; -+ -+ EVENTENTER("%p", nt_event); -+ old_state = xchg(&nt_event->dh.signal_state, 0); -+ EVENTEXIT(return old_state); -+} -+ -+wstdcall LONG WIN_FUNC(KeReadStateEvent,1) -+ (struct nt_event *nt_event) -+{ -+ LONG state; -+ -+ state = nt_event->dh.signal_state; -+ EVENTTRACE("%d", state); -+ return state; -+} -+ -+wstdcall void WIN_FUNC(KeInitializeMutex,2) -+ (struct nt_mutex *mutex, ULONG level) -+{ -+ EVENTENTER("%p", mutex); -+ initialize_object(&mutex->dh, MutexObject, 1); -+ mutex->dh.size = sizeof(*mutex); -+ InitializeListHead(&mutex->list); -+ mutex->abandoned = FALSE; -+ mutex->apc_disable = 1; -+ mutex->owner_thread = NULL; -+ EVENTEXIT(return); -+} -+ -+wstdcall LONG WIN_FUNC(KeReleaseMutex,2) -+ (struct nt_mutex *mutex, BOOLEAN wait) -+{ -+ LONG ret; -+ struct task_struct *thread; -+ -+ EVENTENTER("%p, %d, %p", mutex, wait, current); -+ if (wait == TRUE) -+ WARNING("wait: %d", wait); -+ thread = current; -+ spin_lock_bh(&dispatcher_lock); -+ EVENTTRACE("%p, %p, %p, %d", mutex, thread, mutex->owner_thread, -+ mutex->dh.signal_state); -+ if ((mutex->owner_thread == thread) && (mutex->dh.signal_state <= 0)) { -+ ret = mutex->dh.signal_state++; -+ if (ret == 0) { -+ mutex->owner_thread = NULL; -+ object_signaled(&mutex->dh); -+ } -+ } else { -+ ret = STATUS_MUTANT_NOT_OWNED; -+ WARNING("invalid mutex: %p, %p, %p", mutex, mutex->owner_thread, -+ thread); -+ } -+ EVENTTRACE("%p, %p, %p, %d", mutex, thread, mutex->owner_thread, -+ mutex->dh.signal_state); -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return ret); -+} -+ -+wstdcall void WIN_FUNC(KeInitializeSemaphore,3) -+ (struct nt_semaphore *semaphore, LONG count, LONG limit) -+{ -+ EVENTENTER("%p: %d", semaphore, count); -+ /* if limit > 1, we need to satisfy as many waits (until count -+ * becomes 0); so we keep decrementing count every time a wait -+ * is satisfied */ -+ initialize_object(&semaphore->dh, SemaphoreObject, count); -+ semaphore->dh.size = sizeof(*semaphore); -+ semaphore->limit = limit; -+ EVENTEXIT(return); -+} -+ -+wstdcall LONG WIN_FUNC(KeReleaseSemaphore,4) -+ (struct nt_semaphore *semaphore, KPRIORITY incr, LONG adjustment, -+ BOOLEAN wait) -+{ -+ LONG ret; -+ -+ EVENTENTER("%p", semaphore); -+ spin_lock_bh(&dispatcher_lock); -+ ret = semaphore->dh.signal_state; -+ assert(ret >= 0); -+ if (semaphore->dh.signal_state + adjustment <= semaphore->limit) -+ semaphore->dh.signal_state += adjustment; -+ else { -+ WARNING("releasing %d over limit %d", adjustment, -+ semaphore->limit); -+ semaphore->dh.signal_state = semaphore->limit; -+ } -+ if (semaphore->dh.signal_state > 0) -+ object_signaled(&semaphore->dh); -+ spin_unlock_bh(&dispatcher_lock); -+ EVENTEXIT(return ret); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(KeDelayExecutionThread,3) -+ (KPROCESSOR_MODE wait_mode, BOOLEAN alertable, LARGE_INTEGER *interval) -+{ -+ int res; -+ long timeout; -+ -+ if (wait_mode != 0) -+ ERROR("invalid wait_mode %d", wait_mode); -+ -+ timeout = SYSTEM_TIME_TO_HZ(*interval); -+ EVENTTRACE("%p, %lld, %ld", current, *interval, timeout); -+ if (timeout <= 0) -+ EVENTEXIT(return STATUS_SUCCESS); -+ -+ if (alertable) -+ set_current_state(TASK_INTERRUPTIBLE); -+ else -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ -+ res = schedule_timeout(timeout); -+ EVENTTRACE("%p, %d", current, res); -+ if (res == 0) -+ EVENTEXIT(return STATUS_SUCCESS); -+ else -+ EVENTEXIT(return STATUS_ALERTED); -+} -+ -+wstdcall ULONGLONG WIN_FUNC(KeQueryInterruptTime,0) -+ (void) -+{ -+ EXIT5(return jiffies * TICKSPERJIFFY); -+} -+ -+wstdcall ULONG WIN_FUNC(KeQueryTimeIncrement,0) -+ (void) -+{ -+ EXIT5(return TICKSPERSEC / HZ); -+} -+ -+wstdcall void WIN_FUNC(KeQuerySystemTime,1) -+ (LARGE_INTEGER *time) -+{ -+ *time = ticks_1601(); -+ TRACE5("%llu, %lu", *time, jiffies); -+} -+ -+wstdcall void WIN_FUNC(KeQueryTickCount,1) -+ (LARGE_INTEGER *count) -+{ -+ *count = jiffies; -+} -+ -+wstdcall LARGE_INTEGER WIN_FUNC(KeQueryPerformanceCounter,1) -+ (LARGE_INTEGER *counter) -+{ -+ if (counter) -+ *counter = HZ; -+ return jiffies; -+} -+ -+wstdcall KAFFINITY WIN_FUNC(KeQueryActiveProcessors,0) -+ (void) -+{ -+ int i, n; -+ KAFFINITY bits = 0; -+ n = num_online_cpus(); -+ for (i = 0; i < n; i++) -+ bits = (bits << 1) | 1; -+ return bits; -+} -+ -+struct nt_thread *get_current_nt_thread(void) -+{ -+ struct task_struct *task = current; -+ struct nt_thread *thread; -+ struct common_object_header *header; -+ -+ TRACE6("task: %p", task); -+ thread = NULL; -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(header, &object_list, list) { -+ TRACE6("%p, %d", header, header->type); -+ if (header->type != OBJECT_TYPE_NT_THREAD) -+ break; -+ thread = HEADER_TO_OBJECT(header); -+ TRACE6("%p, %p", thread, thread->task); -+ if (thread->task == task) -+ break; -+ else -+ thread = NULL; -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ if (thread == NULL) -+ TRACE4("couldn't find thread for task %p, %d", task, task->pid); -+ TRACE6("%p", thread); -+ return thread; -+} -+ -+static struct task_struct *get_nt_thread_task(struct nt_thread *thread) -+{ -+ struct task_struct *task; -+ struct common_object_header *header; -+ -+ TRACE6("%p", thread); -+ task = NULL; -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(header, &object_list, list) { -+ TRACE6("%p, %d", header, header->type); -+ if (header->type != OBJECT_TYPE_NT_THREAD) -+ break; -+ if (thread == HEADER_TO_OBJECT(header)) { -+ task = thread->task; -+ break; -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ if (task == NULL) -+ TRACE2("%p: couldn't find task for %p", current, thread); -+ return task; -+} -+ -+static struct nt_thread *create_nt_thread(struct task_struct *task) -+{ -+ struct nt_thread *thread; -+ thread = allocate_object(sizeof(*thread), OBJECT_TYPE_NT_THREAD, NULL); -+ if (!thread) { -+ ERROR("couldn't allocate thread object"); -+ EXIT2(return NULL); -+ } -+ thread->task = task; -+ if (task) -+ thread->pid = task->pid; -+ else -+ thread->pid = 0; -+ nt_spin_lock_init(&thread->lock); -+ InitializeListHead(&thread->irps); -+ initialize_object(&thread->dh, ThreadObject, 0); -+ thread->dh.size = sizeof(*thread); -+ thread->prio = LOW_PRIORITY; -+ return thread; -+} -+ -+wstdcall struct nt_thread *WIN_FUNC(KeGetCurrentThread,0) -+ (void) -+{ -+ struct nt_thread *thread = get_current_nt_thread(); -+ TRACE2("%p, %p", thread, current); -+ return thread; -+} -+ -+wstdcall KPRIORITY WIN_FUNC(KeQueryPriorityThread,1) -+ (struct nt_thread *thread) -+{ -+ KPRIORITY prio; -+ struct task_struct *task; -+ -+ TRACE2("%p", thread); -+#ifdef CONFIG_X86_64 -+ /* sis163u driver for amd64 passes 0x1f from thread created by -+ * PsCreateSystemThread - no idea what is 0x1f */ -+ if (thread == (void *)0x1f) -+ thread = get_current_nt_thread(); -+#endif -+ if (!thread) { -+ TRACE2("invalid thread"); -+ EXIT2(return LOW_REALTIME_PRIORITY); -+ } -+ task = get_nt_thread_task(thread); -+ if (!task) { -+ TRACE2("couldn't find task for thread: %p", thread); -+ EXIT2(return LOW_REALTIME_PRIORITY); -+ } -+ -+ prio = thread->prio; -+ -+ TRACE2("%d", prio); -+ return prio; -+} -+ -+wstdcall KPRIORITY WIN_FUNC(KeSetPriorityThread,2) -+ (struct nt_thread *thread, KPRIORITY prio) -+{ -+ KPRIORITY old_prio; -+ struct task_struct *task; -+ -+ TRACE2("thread: %p, priority = %u", thread, prio); -+#ifdef CONFIG_X86_64 -+ if (thread == (void *)0x1f) -+ thread = get_current_nt_thread(); -+#endif -+ if (!thread) { -+ TRACE2("invalid thread"); -+ EXIT2(return LOW_REALTIME_PRIORITY); -+ } -+ task = get_nt_thread_task(thread); -+ if (!task) { -+ TRACE2("couldn't find task for thread: %p", thread); -+ EXIT2(return LOW_REALTIME_PRIORITY); -+ } -+ -+ old_prio = thread->prio; -+ thread->prio = prio; -+ -+ TRACE2("%d, %d", old_prio, thread->prio); -+ return old_prio; -+} -+ -+struct thread_trampoline { -+ void (*func)(void *) wstdcall; -+ void *ctx; -+ struct nt_thread *thread; -+ struct completion started; -+}; -+ -+static int ntdriver_thread(void *data) -+{ -+ struct thread_trampoline *thread_tramp = data; -+ /* yes, a tramp! */ -+ typeof(thread_tramp->func) func = thread_tramp->func; -+ typeof(thread_tramp->ctx) ctx = thread_tramp->ctx; -+ -+ thread_tramp->thread->task = current; -+ thread_tramp->thread->pid = current->pid; -+ TRACE2("thread: %p, task: %p (%d)", thread_tramp->thread, -+ current, current->pid); -+ complete(&thread_tramp->started); -+ -+#ifdef PF_NOFREEZE -+ current->flags |= PF_NOFREEZE; -+#endif -+ strncpy(current->comm, "ntdriver", sizeof(current->comm)); -+ current->comm[sizeof(current->comm)-1] = 0; -+ LIN2WIN1(func, ctx); -+ ERROR("task: %p", current); -+ return 0; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(PsCreateSystemThread,7) -+ (void **handle, ULONG access, void *obj_attr, void *process, -+ void *client_id, void (*func)(void *) wstdcall, void *ctx) -+{ -+ struct thread_trampoline thread_tramp; -+ -+ ENTER2("handle = %p, access = %u, obj_attr = %p, process = %p, " -+ "client_id = %p, func = %p, context = %p", handle, access, -+ obj_attr, process, client_id, func, ctx); -+ -+ thread_tramp.thread = create_nt_thread(NULL); -+ if (!thread_tramp.thread) { -+ ERROR("couldn't allocate thread object"); -+ EXIT2(return STATUS_RESOURCES); -+ } -+ TRACE2("thread: %p", thread_tramp.thread); -+ thread_tramp.func = func; -+ thread_tramp.ctx = ctx; -+ init_completion(&thread_tramp.started); -+ -+ thread_tramp.thread->task = kthread_run(ntdriver_thread, -+ &thread_tramp, "ntdriver"); -+ if (IS_ERR(thread_tramp.thread->task)) { -+ free_object(thread_tramp.thread); -+ EXIT2(return STATUS_FAILURE); -+ } -+ TRACE2("created task: %p", thread_tramp.thread->task); -+ -+ wait_for_completion(&thread_tramp.started); -+ *handle = OBJECT_TO_HEADER(thread_tramp.thread); -+ TRACE2("created thread: %p, %p", thread_tramp.thread, *handle); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(PsTerminateSystemThread,1) -+ (NTSTATUS status) -+{ -+ struct nt_thread *thread; -+ -+ TRACE2("%p, %08X", current, status); -+ thread = get_current_nt_thread(); -+ TRACE2("%p", thread); -+ if (thread) { -+ KeSetEvent((struct nt_event *)&thread->dh, 0, FALSE); -+ while (1) { -+ struct nt_list *ent; -+ struct irp *irp; -+ KIRQL irql; -+ irql = nt_spin_lock_irql(&thread->lock, DISPATCH_LEVEL); -+ ent = RemoveHeadList(&thread->irps); -+ nt_spin_unlock_irql(&thread->lock, irql); -+ if (!ent) -+ break; -+ irp = container_of(ent, struct irp, thread_list); -+ IOTRACE("%p", irp); -+ IoCancelIrp(irp); -+ } -+ /* the driver may later query this status with -+ * ZwQueryInformationThread */ -+ thread->status = status; -+ } else -+ ERROR("couldn't find thread for task: %p", current); -+ -+ complete_and_exit(NULL, status); -+ ERROR("oops: %p, %d", thread->task, thread->pid); -+ return STATUS_FAILURE; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeRemoveEntryDeviceQueue,2) -+ (struct kdevice_queue *dev_queue, struct kdevice_queue_entry *entry) -+{ -+ struct kdevice_queue_entry *e; -+ KIRQL irql; -+ -+ irql = nt_spin_lock_irql(&dev_queue->lock, DISPATCH_LEVEL); -+ nt_list_for_each_entry(e, &dev_queue->list, list) { -+ if (e == entry) { -+ RemoveEntryList(&e->list); -+ nt_spin_unlock_irql(&dev_queue->lock, irql); -+ return TRUE; -+ } -+ } -+ nt_spin_unlock_irql(&dev_queue->lock, irql); -+ return FALSE; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeSynchronizeExecution,3) -+ (struct kinterrupt *interrupt, PKSYNCHRONIZE_ROUTINE synch_routine, -+ void *ctx) -+{ -+ BOOLEAN ret; -+ unsigned long flags; -+ -+ nt_spin_lock_irqsave(interrupt->actual_lock, flags); -+ ret = LIN2WIN1(synch_routine, ctx); -+ nt_spin_unlock_irqrestore(interrupt->actual_lock, flags); -+ TRACE6("%d", ret); -+ return ret; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeRegisterBugCheckReasonCallback,4) -+ (void *callback_record, void *callback_routine, UINT reason, -+ char *component) -+{ -+ TRACE1("callback_record: %p, callback_routine: %p, reason: %d, " -+ "component: %s", callback_record, callback_routine, reason, -+ component); -+ TODO(); -+ return FALSE; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(KeDeregisterBugCheckReasonCallback,1) -+ (void *callback_record) -+{ -+ TRACE1("callback_record: %p", callback_record); -+ TODO(); -+ return TRUE; -+} -+ -+wstdcall void *WIN_FUNC(MmAllocateContiguousMemorySpecifyCache,5) -+ (SIZE_T size, PHYSICAL_ADDRESS lowest, PHYSICAL_ADDRESS highest, -+ PHYSICAL_ADDRESS boundary, enum memory_caching_type cache_type) -+{ -+ void *addr; -+ gfp_t flags; -+ -+ ENTER2("%zu, 0x%llx, 0x%llx, 0x%llx, %d", size, lowest, -+ highest, boundary, cache_type); -+ flags = irql_gfp(); -+ addr = wrap_get_free_pages(flags, size); -+ TRACE2("%p, %zu, 0x%x", addr, size, flags); -+ if (addr && ((virt_to_phys(addr) + size) <= highest)) -+ EXIT2(return addr); -+#ifdef CONFIG_X86_64 -+ /* GFP_DMA is really only 16MB even on x86-64, but there is no -+ * other zone available */ -+ if (highest <= DMA_BIT_MASK(31)) -+ flags |= __GFP_DMA; -+ else if (highest <= DMA_BIT_MASK(32)) -+ flags |= __GFP_DMA32; -+#else -+ if (highest <= DMA_BIT_MASK(24)) -+ flags |= __GFP_DMA; -+ else if (highest > DMA_BIT_MASK(30)) -+ flags |= __GFP_HIGHMEM; -+#endif -+ if (addr) -+ free_pages((unsigned long)addr, get_order(size)); -+ addr = wrap_get_free_pages(flags, size); -+ TRACE2("%p, %zu, 0x%x", addr, size, flags); -+ return addr; -+} -+ -+wstdcall void WIN_FUNC(MmFreeContiguousMemorySpecifyCache,3) -+ (void *base, SIZE_T size, enum memory_caching_type cache_type) -+{ -+ TRACE2("%p, %zu", base, size); -+ free_pages((unsigned long)base, get_order(size)); -+} -+ -+wstdcall PHYSICAL_ADDRESS WIN_FUNC(MmGetPhysicalAddress,1) -+ (void *base) -+{ -+ unsigned long phy = virt_to_phys(base); -+ TRACE2("%p, %p", base, (void *)phy); -+ return phy; -+} -+ -+/* Atheros card with pciid 168C:0014 calls this function with 0xf0000 -+ * and 0xf6ef0 address, and then check for things that seem to be -+ * related to ACPI: "_SM_" and "_DMI_". This may be the hack they do -+ * to check if this card is installed in IBM thinkpads; we can -+ * probably get this device to work if we create a buffer with the -+ * strings as required by the driver and return virtual address for -+ * that address instead */ -+wstdcall void __iomem *WIN_FUNC(MmMapIoSpace,3) -+ (PHYSICAL_ADDRESS phys_addr, SIZE_T size, -+ enum memory_caching_type cache) -+{ -+ void __iomem *virt; -+ ENTER1("cache type: %d", cache); -+ if (cache == MmCached) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -+ virt = ioremap_cache(phys_addr, size); -+#else -+ virt = ioremap(phys_addr, size); -+#endif -+ } else { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -+ virt = ioremap(phys_addr, size); -+#else -+ virt = ioremap_nocache(phys_addr, size); -+#endif -+ } -+ TRACE1("%llx, %zu, %p", phys_addr, size, virt); -+ return virt; -+} -+ -+wstdcall void WIN_FUNC(MmUnmapIoSpace,2) -+ (void __iomem *addr, SIZE_T size) -+{ -+ ENTER1("%p, %zu", addr, size); -+ iounmap(addr); -+ return; -+} -+ -+wstdcall ULONG WIN_FUNC(MmSizeOfMdl,2) -+ (void *base, ULONG length) -+{ -+ return sizeof(struct mdl) + -+ (sizeof(PFN_NUMBER) * SPAN_PAGES(base, length)); -+} -+ -+struct mdl *allocate_init_mdl(void *virt, ULONG length) -+{ -+ struct wrap_mdl *wrap_mdl; -+ struct mdl *mdl; -+ int mdl_size = MmSizeOfMdl(virt, length); -+ -+ if (mdl_size <= MDL_CACHE_SIZE) { -+ wrap_mdl = kmem_cache_alloc(mdl_cache, irql_gfp()); -+ if (!wrap_mdl) -+ return NULL; -+ spin_lock_bh(&dispatcher_lock); -+ InsertHeadList(&wrap_mdl_list, &wrap_mdl->list); -+ spin_unlock_bh(&dispatcher_lock); -+ mdl = wrap_mdl->mdl; -+ TRACE3("allocated mdl from cache: %p(%p), %p(%d)", -+ wrap_mdl, mdl, virt, length); -+ memset(mdl, 0, MDL_CACHE_SIZE); -+ MmInitializeMdl(mdl, virt, length); -+ /* mark the MDL as allocated from cache pool so when -+ * it is freed, we free it back to the pool */ -+ mdl->flags = MDL_ALLOCATED_FIXED_SIZE | MDL_CACHE_ALLOCATED; -+ } else { -+ wrap_mdl = -+ kmalloc(sizeof(*wrap_mdl) + mdl_size, irql_gfp()); -+ if (!wrap_mdl) -+ return NULL; -+ mdl = wrap_mdl->mdl; -+ TRACE3("allocated mdl from memory: %p(%p), %p(%d)", -+ wrap_mdl, mdl, virt, length); -+ spin_lock_bh(&dispatcher_lock); -+ InsertHeadList(&wrap_mdl_list, &wrap_mdl->list); -+ spin_unlock_bh(&dispatcher_lock); -+ memset(mdl, 0, mdl_size); -+ MmInitializeMdl(mdl, virt, length); -+ mdl->flags = MDL_ALLOCATED_FIXED_SIZE; -+ } -+ return mdl; -+} -+ -+void free_mdl(struct mdl *mdl) -+{ -+ /* A driver may allocate Mdl with NdisAllocateBuffer and free -+ * with IoFreeMdl (e.g., 64-bit Broadcom). Since we need to -+ * treat buffers allocated with Ndis calls differently, we -+ * must call NdisFreeBuffer if it is allocated with Ndis -+ * function. We set 'pool' field in Ndis functions. */ -+ if (!mdl) -+ return; -+ if (mdl->pool) -+ NdisFreeBuffer(mdl); -+ else { -+ struct wrap_mdl *wrap_mdl = (struct wrap_mdl *) -+ ((char *)mdl - offsetof(struct wrap_mdl, mdl)); -+ spin_lock_bh(&dispatcher_lock); -+ RemoveEntryList(&wrap_mdl->list); -+ spin_unlock_bh(&dispatcher_lock); -+ -+ if (mdl->flags & MDL_CACHE_ALLOCATED) { -+ TRACE3("freeing mdl cache: %p, %p, %p", -+ wrap_mdl, mdl, mdl->mappedsystemva); -+ kmem_cache_free(mdl_cache, wrap_mdl); -+ } else { -+ TRACE3("freeing mdl: %p, %p, %p", -+ wrap_mdl, mdl, mdl->mappedsystemva); -+ kfree(wrap_mdl); -+ } -+ } -+ return; -+} -+ -+wstdcall void WIN_FUNC(IoBuildPartialMdl,4) -+ (struct mdl *source, struct mdl *target, void *virt, ULONG length) -+{ -+ MmInitializeMdl(target, virt, length); -+ target->flags |= MDL_PARTIAL; -+} -+ -+wstdcall void WIN_FUNC(MmBuildMdlForNonPagedPool,1) -+ (struct mdl *mdl) -+{ -+ PFN_NUMBER *mdl_pages; -+ int i, n; -+ -+ ENTER4("%p", mdl); -+ /* already mapped */ -+// mdl->mappedsystemva = MmGetMdlVirtualAddress(mdl); -+ mdl->flags |= MDL_SOURCE_IS_NONPAGED_POOL; -+ TRACE4("%p, %p, %p, %d, %d", mdl, mdl->mappedsystemva, mdl->startva, -+ mdl->byteoffset, mdl->bytecount); -+ n = SPAN_PAGES(MmGetSystemAddressForMdl(mdl), MmGetMdlByteCount(mdl)); -+ if (n > MDL_CACHE_PAGES) -+ WARNING("%p, %d, %d", MmGetSystemAddressForMdl(mdl), -+ MmGetMdlByteCount(mdl), n); -+ mdl_pages = MmGetMdlPfnArray(mdl); -+ for (i = 0; i < n; i++) -+ mdl_pages[i] = (ULONG_PTR)mdl->startva + (i * PAGE_SIZE); -+ EXIT4(return); -+} -+ -+wstdcall void *WIN_FUNC(MmMapLockedPages,2) -+ (struct mdl *mdl, KPROCESSOR_MODE access_mode) -+{ -+ /* already mapped */ -+// mdl->mappedsystemva = MmGetMdlVirtualAddress(mdl); -+ mdl->flags |= MDL_MAPPED_TO_SYSTEM_VA; -+ /* what is the need for MDL_PARTIAL_HAS_BEEN_MAPPED? */ -+ if (mdl->flags & MDL_PARTIAL) -+ mdl->flags |= MDL_PARTIAL_HAS_BEEN_MAPPED; -+ return mdl->mappedsystemva; -+} -+ -+wstdcall void *WIN_FUNC(MmMapLockedPagesSpecifyCache,6) -+ (struct mdl *mdl, KPROCESSOR_MODE access_mode, -+ enum memory_caching_type cache_type, void *base_address, -+ ULONG bug_check, enum mm_page_priority priority) -+{ -+ return MmMapLockedPages(mdl, access_mode); -+} -+ -+wstdcall void WIN_FUNC(MmUnmapLockedPages,2) -+ (void *base, struct mdl *mdl) -+{ -+ mdl->flags &= ~MDL_MAPPED_TO_SYSTEM_VA; -+ return; -+} -+ -+wstdcall void WIN_FUNC(MmProbeAndLockPages,3) -+ (struct mdl *mdl, KPROCESSOR_MODE access_mode, -+ enum lock_operation operation) -+{ -+ /* already locked */ -+ mdl->flags |= MDL_PAGES_LOCKED; -+ return; -+} -+ -+wstdcall void WIN_FUNC(MmUnlockPages,1) -+ (struct mdl *mdl) -+{ -+ mdl->flags &= ~MDL_PAGES_LOCKED; -+ return; -+} -+ -+wstdcall BOOLEAN WIN_FUNC(MmIsAddressValid,1) -+ (void *virt_addr) -+{ -+ if (virt_addr_valid(virt_addr)) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+wstdcall void *WIN_FUNC(MmLockPagableDataSection,1) -+ (void *address) -+{ -+ return address; -+} -+ -+wstdcall void WIN_FUNC(MmUnlockPagableImageSection,1) -+ (void *handle) -+{ -+ return; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ObReferenceObjectByHandle,6) -+ (void *handle, ACCESS_MASK desired_access, void *obj_type, -+ KPROCESSOR_MODE access_mode, void **object, void *handle_info) -+{ -+ struct common_object_header *hdr; -+ -+ TRACE2("%p", handle); -+ hdr = HANDLE_TO_HEADER(handle); -+ atomic_inc_var(hdr->ref_count); -+ *object = HEADER_TO_OBJECT(hdr); -+ TRACE2("%p, %p, %d, %p", hdr, object, hdr->ref_count, *object); -+ return STATUS_SUCCESS; -+} -+ -+/* DDK doesn't say if return value should be before incrementing or -+ * after incrementing reference count, but according to #reactos -+ * developers, it should be return value after incrementing */ -+wfastcall LONG WIN_FUNC(ObfReferenceObject,1) -+ (void *object) -+{ -+ struct common_object_header *hdr; -+ LONG ret; -+ -+ hdr = OBJECT_TO_HEADER(object); -+ ret = post_atomic_add(hdr->ref_count, 1); -+ TRACE2("%p, %d, %p", hdr, hdr->ref_count, object); -+ return ret; -+} -+ -+static int dereference_object(void *object) -+{ -+ struct common_object_header *hdr; -+ int ref_count; -+ -+ ENTER2("object: %p", object); -+ hdr = OBJECT_TO_HEADER(object); -+ TRACE2("hdr: %p", hdr); -+ ref_count = post_atomic_add(hdr->ref_count, -1); -+ TRACE2("object: %p, %d", object, ref_count); -+ if (ref_count < 0) -+ ERROR("invalid object: %p (%d)", object, ref_count); -+ if (ref_count <= 0) { -+ free_object(object); -+ return 1; -+ } else -+ return 0; -+} -+ -+wfastcall void WIN_FUNC(ObfDereferenceObject,1) -+ (void *object) -+{ -+ TRACE2("%p", object); -+ dereference_object(object); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwCreateFile,11) -+ (void **handle, ACCESS_MASK access_mask, -+ struct object_attributes *obj_attr, struct io_status_block *iosb, -+ LARGE_INTEGER *size, ULONG file_attr, ULONG share_access, -+ ULONG create_disposition, ULONG create_options, void *ea_buffer, -+ ULONG ea_length) -+{ -+ struct common_object_header *coh; -+ struct file_object *fo; -+ struct ansi_string ansi; -+ struct wrap_bin_file *bin_file; -+ char *file_basename; -+ NTSTATUS status; -+ -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(coh, &object_list, list) { -+ if (coh->type != OBJECT_TYPE_FILE) -+ continue; -+ /* TODO: check if file is opened in shared mode */ -+ if (!RtlCompareUnicodeString(&coh->name, obj_attr->name, TRUE)) { -+ fo = HEADER_TO_OBJECT(coh); -+ bin_file = fo->wrap_bin_file; -+ *handle = coh; -+ spin_unlock_bh(&ntoskernel_lock); -+ ObReferenceObject(fo); -+ iosb->status = FILE_OPENED; -+ iosb->info = bin_file->size; -+ EXIT2(return STATUS_SUCCESS); -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ -+ if (RtlUnicodeStringToAnsiString(&ansi, obj_attr->name, TRUE) != -+ STATUS_SUCCESS) -+ EXIT2(return STATUS_INSUFFICIENT_RESOURCES); -+ -+ file_basename = strrchr(ansi.buf, '\\'); -+ if (file_basename) -+ file_basename++; -+ else -+ file_basename = ansi.buf; -+ TRACE2("file: '%s', '%s'", ansi.buf, file_basename); -+ -+ fo = allocate_object(sizeof(struct file_object), OBJECT_TYPE_FILE, -+ obj_attr->name); -+ if (!fo) { -+ RtlFreeAnsiString(&ansi); -+ iosb->status = STATUS_INSUFFICIENT_RESOURCES; -+ iosb->info = 0; -+ EXIT2(return STATUS_FAILURE); -+ } -+ coh = OBJECT_TO_HEADER(fo); -+ bin_file = get_bin_file(file_basename); -+ if (bin_file) { -+ TRACE2("%s, %s", bin_file->name, file_basename); -+ fo->flags = FILE_OPENED; -+ } else if (access_mask & FILE_WRITE_DATA) { -+ bin_file = kzalloc(sizeof(*bin_file), GFP_KERNEL); -+ if (bin_file) { -+ strncpy(bin_file->name, file_basename, -+ sizeof(bin_file->name)); -+ bin_file->name[sizeof(bin_file->name)-1] = 0; -+ bin_file->data = vmalloc(*size); -+ if (bin_file->data) { -+ memset(bin_file->data, 0, *size); -+ bin_file->size = *size; -+ fo->flags = FILE_CREATED; -+ } else { -+ kfree(bin_file); -+ bin_file = NULL; -+ } -+ } -+ } else -+ bin_file = NULL; -+ -+ RtlFreeAnsiString(&ansi); -+ if (!bin_file) { -+ iosb->status = FILE_DOES_NOT_EXIST; -+ iosb->info = 0; -+ free_object(fo); -+ EXIT2(return STATUS_FAILURE); -+ } -+ -+ fo->wrap_bin_file = bin_file; -+ fo->current_byte_offset = 0; -+ if (access_mask & FILE_READ_DATA) -+ fo->read_access = TRUE; -+ if (access_mask & FILE_WRITE_DATA) -+ fo->write_access = TRUE; -+ iosb->status = FILE_OPENED; -+ iosb->info = bin_file->size; -+ *handle = coh; -+ TRACE2("handle: %p", *handle); -+ status = STATUS_SUCCESS; -+ EXIT2(return status); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwOpenFile,6) -+ (void **handle, ACCESS_MASK access_mask, -+ struct object_attributes *obj_attr, struct io_status_block *iosb, -+ ULONG share_access, ULONG open_options) -+{ -+ LARGE_INTEGER size; -+ return ZwCreateFile(handle, access_mask, obj_attr, iosb, &size, 0, -+ share_access, 0, open_options, NULL, 0); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwReadFile,9) -+ (void *handle, struct nt_event *event, void *apc_routine, -+ void *apc_context, struct io_status_block *iosb, void *buffer, -+ ULONG length, LARGE_INTEGER *byte_offset, ULONG *key) -+{ -+ struct file_object *fo; -+ struct common_object_header *coh; -+ ULONG count; -+ size_t offset; -+ struct wrap_bin_file *file; -+ -+ TRACE2("%p", handle); -+ coh = handle; -+ if (coh->type != OBJECT_TYPE_FILE) { -+ ERROR("handle %p is invalid: %d", handle, coh->type); -+ EXIT2(return STATUS_FAILURE); -+ } -+ fo = HANDLE_TO_OBJECT(coh); -+ file = fo->wrap_bin_file; -+ TRACE2("file: %s (%zu)", file->name, file->size); -+ spin_lock_bh(&ntoskernel_lock); -+ if (byte_offset) -+ offset = *byte_offset; -+ else -+ offset = fo->current_byte_offset; -+ count = min((size_t)length, file->size - offset); -+ TRACE2("count: %u, offset: %zu, length: %u", count, offset, length); -+ memcpy(buffer, ((void *)file->data) + offset, count); -+ fo->current_byte_offset = offset + count; -+ spin_unlock_bh(&ntoskernel_lock); -+ iosb->status = STATUS_SUCCESS; -+ iosb->info = count; -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwWriteFile,9) -+ (void *handle, struct nt_event *event, void *apc_routine, -+ void *apc_context, struct io_status_block *iosb, void *buffer, -+ ULONG length, LARGE_INTEGER *byte_offset, ULONG *key) -+{ -+ struct file_object *fo; -+ struct common_object_header *coh; -+ struct wrap_bin_file *file; -+ unsigned long offset; -+ -+ TRACE2("%p", handle); -+ coh = handle; -+ if (coh->type != OBJECT_TYPE_FILE) { -+ ERROR("handle %p is invalid: %d", handle, coh->type); -+ EXIT2(return STATUS_FAILURE); -+ } -+ fo = HANDLE_TO_OBJECT(coh); -+ file = fo->wrap_bin_file; -+ TRACE2("file: %zu, %u", file->size, length); -+ spin_lock_bh(&ntoskernel_lock); -+ if (byte_offset) -+ offset = *byte_offset; -+ else -+ offset = fo->current_byte_offset; -+ if (length + offset > file->size) { -+ WARNING("%lu, %zu", length + offset, file->size); -+ /* TODO: implement writing past end of current size */ -+ iosb->status = STATUS_FAILURE; -+ iosb->info = 0; -+ } else { -+ memcpy(file->data + offset, buffer, length); -+ iosb->status = STATUS_SUCCESS; -+ iosb->info = length; -+ fo->current_byte_offset = offset + length; -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ EXIT2(return iosb->status); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwClose,1) -+ (void *handle) -+{ -+ struct common_object_header *coh; -+ -+ TRACE2("%p", handle); -+ if (handle == NULL) { -+ TRACE1(""); -+ EXIT2(return STATUS_SUCCESS); -+ } -+ coh = handle; -+ if (coh->type == OBJECT_TYPE_FILE) { -+ struct file_object *fo; -+ struct wrap_bin_file *bin_file; -+ typeof(fo->flags) flags; -+ -+ fo = HANDLE_TO_OBJECT(handle); -+ flags = fo->flags; -+ bin_file = fo->wrap_bin_file; -+ if (dereference_object(fo)) { -+ if (flags == FILE_CREATED) { -+ vfree(bin_file->data); -+ kfree(bin_file); -+ } else -+ free_bin_file(bin_file); -+ } -+ } else if (coh->type == OBJECT_TYPE_NT_THREAD) { -+ struct nt_thread *thread = HANDLE_TO_OBJECT(handle); -+ TRACE2("thread: %p (%p)", thread, handle); -+ ObDereferenceObject(thread); -+ } else { -+ /* TODO: can we just dereference object here? */ -+ WARNING("closing handle 0x%x not implemented", coh->type); -+ } -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwQueryInformationFile,5) -+ (void *handle, struct io_status_block *iosb, void *info, -+ ULONG length, enum file_info_class class) -+{ -+ struct file_object *fo; -+ struct file_name_info *fni; -+ struct file_std_info *fsi; -+ struct wrap_bin_file *file; -+ struct common_object_header *coh; -+ -+ ENTER2("%p", handle); -+ coh = handle; -+ if (coh->type != OBJECT_TYPE_FILE) { -+ ERROR("handle %p is invalid: %d", coh, coh->type); -+ EXIT2(return STATUS_FAILURE); -+ } -+ fo = HANDLE_TO_OBJECT(handle); -+ TRACE2("fo: %p, %d", fo, class); -+ switch (class) { -+ case FileNameInformation: -+ fni = info; -+ fni->length = min(length, (typeof(length))coh->name.length); -+ memcpy(fni->name, coh->name.buf, fni->length); -+ iosb->status = STATUS_SUCCESS; -+ iosb->info = fni->length; -+ break; -+ case FileStandardInformation: -+ fsi = info; -+ file = fo->wrap_bin_file; -+ fsi->alloc_size = file->size; -+ fsi->eof = file->size; -+ fsi->num_links = 1; -+ fsi->delete_pending = FALSE; -+ fsi->dir = FALSE; -+ iosb->status = STATUS_SUCCESS; -+ iosb->info = 0; -+ break; -+ default: -+ WARNING("type %d not implemented yet", class); -+ iosb->status = STATUS_FAILURE; -+ iosb->info = 0; -+ break; -+ } -+ EXIT2(return iosb->status); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwOpenSection,3) -+ (void **handle, ACCESS_MASK access, struct object_attributes *obj_attrs) -+{ -+ INFO("%p, 0x%x, %d", obj_attrs, obj_attrs->attributes, access); -+ TODO(); -+ *handle = obj_attrs; -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwMapViewOfSection,10) -+ (void *secn_handle, void *process_handle, void **base_address, -+ ULONG zero_bits, SIZE_T commit_size, LARGE_INTEGER *secn_offset, -+ SIZE_T *view_size, enum section_inherit inherit, ULONG alloc_type, -+ ULONG protect) -+{ -+ INFO("%p, %p, %p", secn_handle, process_handle, base_address); -+ TODO(); -+ *base_address = (void *)0xdeadbeef; -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwUnmapViewOfSection,2) -+ (void *process_handle, void *base_address) -+{ -+ INFO("%p, %p", process_handle, base_address); -+ TODO(); -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwCreateKey,7) -+ (void **handle, ACCESS_MASK desired_access, -+ struct object_attributes *attr, ULONG title_index, -+ struct unicode_string *class, ULONG create_options, -+ ULONG *disposition) -+{ -+ struct ansi_string ansi; -+ if (RtlUnicodeStringToAnsiString(&ansi, attr->name, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE1("key: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ *handle = NULL; -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwOpenKey,3) -+ (void **handle, ACCESS_MASK desired_access, -+ struct object_attributes *attr) -+{ -+ struct ansi_string ansi; -+ if (RtlUnicodeStringToAnsiString(&ansi, attr->name, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE1("key: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ *handle = NULL; -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwSetValueKey,6) -+ (void *handle, struct unicode_string *name, ULONG title_index, -+ ULONG type, void *data, ULONG data_size) -+{ -+ struct ansi_string ansi; -+ if (RtlUnicodeStringToAnsiString(&ansi, name, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE1("key: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwQueryValueKey,6) -+ (void *handle, struct unicode_string *name, -+ enum key_value_information_class class, void *info, -+ ULONG length, ULONG *res_length) -+{ -+ struct ansi_string ansi; -+ if (RtlUnicodeStringToAnsiString(&ansi, name, TRUE) == STATUS_SUCCESS) { -+ TRACE1("key: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ TODO(); -+ return STATUS_INVALID_PARAMETER; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwDeleteKey,1) -+ (void *handle) -+{ -+ ENTER2("%p", handle); -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(ZwPowerInformation,5) -+ (INT info_level, void *in_buf, ULONG in_buf_len, void *out_buf, -+ ULONG out_buf_len) -+{ -+ INFO("%d, %u, %u", info_level, in_buf_len, out_buf_len); -+ TODO(); -+ return STATUS_ACCESS_DENIED; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(WmiSystemControl,4) -+ (struct wmilib_context *info, struct device_object *dev_obj, -+ struct irp *irp, void *irp_disposition) -+{ -+ TODO(); -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(WmiCompleteRequest,5) -+ (struct device_object *dev_obj, struct irp *irp, NTSTATUS status, -+ ULONG buffer_used, CCHAR priority_boost) -+{ -+ TODO(); -+ return STATUS_SUCCESS; -+} -+ -+noregparm NTSTATUS WIN_FUNC(WmiTraceMessage,12) -+ (void *tracehandle, ULONG message_flags, -+ void *message_guid, USHORT message_no, ...) -+{ -+ TODO(); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(WmiQueryTraceInformation,4) -+ (enum trace_information_class trace_info_class, void *trace_info, -+ ULONG *req_length, void *buf) -+{ -+ TODO(); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+/* this function can't be wstdcall as it takes variable number of args */ -+__attribute__((format(printf, 1, 2))) -+noregparm ULONG WIN_FUNC(DbgPrint,12) -+ (char *format, ...) -+{ -+#if DEBUG >= 1 -+ va_list args; -+ static char buf[100]; -+ -+ va_start(args, format); -+ vsnprintf(buf, sizeof(buf), format, args); -+ printk(KERN_DEBUG "%s (%s): %s", DRIVER_NAME, __func__, buf); -+ va_end(args); -+#endif -+ return STATUS_SUCCESS; -+} -+ -+__attribute__((format(printf, 3, 4))) -+noregparm ULONG WIN_FUNC(DbgPrintEx,12) -+ (ULONG component_id, ULONG severity, char *format, ...) -+{ -+#if DEBUG >= 1 -+ va_list args; -+ static char buf[100]; -+ -+ va_start(args, format); -+ vsnprintf(buf, sizeof(buf), format, args); -+ TRACE1("component_id: %d, severity: %d\n", component_id, severity); -+ printk(KERN_DEBUG "%s (%s): %s", DRIVER_NAME, __func__, buf); -+ va_end(args); -+#endif -+ return STATUS_SUCCESS; -+} -+ -+wstdcall void WIN_FUNC(KeBugCheck,1) -+ (ULONG code) -+{ -+ ERROR("Unrecoverable error reported by the driver"); -+ ERROR("code: 0x%x\n", code); -+ dump_stack(); -+ return; -+} -+ -+wstdcall void WIN_FUNC(KeBugCheckEx,5) -+ (ULONG code, ULONG_PTR param1, ULONG_PTR param2, -+ ULONG_PTR param3, ULONG_PTR param4) -+{ -+ ERROR("Unrecoverable error reported by the driver"); -+ ERROR("code: 0x%x, params: 0x%lx 0x%lx 0x%lx 0x%lx\n", code, param1, -+ param2, param3, param4); -+ dump_stack(); -+ return; -+} -+ -+wstdcall void WIN_FUNC(ExSystemTimeToLocalTime,2) -+ (LARGE_INTEGER *system_time, LARGE_INTEGER *local_time) -+{ -+ *local_time = *system_time; -+} -+ -+wstdcall ULONG WIN_FUNC(ExSetTimerResolution,2) -+ (ULONG time, BOOLEAN set) -+{ -+ /* why a driver should change system wide timer resolution is -+ * beyond me */ -+ return time; -+} -+ -+wstdcall void WIN_FUNC(DbgBreakPoint,0) -+ (void) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(_except_handler3,0) -+ (void) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(__C_specific_handler,0) -+ (void) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(_purecall,0) -+ (void) -+{ -+ TODO(); -+} -+ -+struct worker_init_struct { -+ struct work_struct work; -+ struct completion completion; -+ struct nt_thread *nt_thread; -+}; -+ -+int ntoskernel_init(void) -+{ -+ spin_lock_init(&dispatcher_lock); -+ spin_lock_init(&ntoskernel_lock); -+ spin_lock_init(&ntos_work_lock); -+ spin_lock_init(&kdpc_list_lock); -+ spin_lock_init(&irp_cancel_lock); -+ InitializeListHead(&wrap_mdl_list); -+ InitializeListHead(&kdpc_list); -+ InitializeListHead(&callback_objects); -+ InitializeListHead(&bus_driver_list); -+ InitializeListHead(&object_list); -+ InitializeListHead(&ntos_work_list); -+ -+ nt_spin_lock_init(&nt_list_lock); -+ -+ INIT_WORK(&kdpc_work, kdpc_worker); -+ INIT_WORK(&ntos_work, ntos_work_worker); -+ wrap_timer_slist.next = NULL; -+ -+ wrap_ticks_to_boot = TICKS_1601_TO_1970; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) -+ do { -+ u64 now; -+ now = ktime_get_real_ns(); -+ wrap_ticks_to_boot += now * 10; -+ } while (0); -+#else -+ do { -+ struct timeval now; -+ -+ do_gettimeofday(&now); -+ wrap_ticks_to_boot += (u64)now.tv_sec * TICKSPERSEC; -+ wrap_ticks_to_boot += now.tv_usec * 10; -+ } while (0); -+#endif -+ TRACE2("%llu", wrap_ticks_to_boot); -+ wrap_ticks_to_boot -= jiffies * TICKSPERJIFFY; -+ TRACE2("%llu", wrap_ticks_to_boot); -+ -+ cpu_count = num_online_cpus(); -+ -+#ifdef WRAP_PREEMPT -+ do { -+ int cpu; -+ for_each_possible_cpu(cpu) { -+ struct irql_info *info; -+ info = &per_cpu(irql_info, cpu); -+ mutex_init(&(info->lock)); -+ info->task = NULL; -+ info->count = 0; -+#ifdef CONFIG_SMP -+ cpumask_setall(tsk_cpus_allowed(info)); -+#endif -+ } -+ } while (0); -+#endif -+ -+ ntos_wq = create_singlethread_workqueue("ntos_wq"); -+ if (!ntos_wq) { -+ WARNING("couldn't create ntos_wq thread"); -+ return -ENOMEM; -+ } -+ TRACE1("ntos_wq: %p", ntos_wq); -+ -+ if (add_bus_driver("PCI") -+#ifdef ENABLE_USB -+ || add_bus_driver("USB") -+#endif -+ ) { -+ ntoskernel_exit(); -+ return -ENOMEM; -+ } -+ mdl_cache = -+ wrap_kmem_cache_create(DRIVER_NAME "_mdl", -+ sizeof(struct wrap_mdl) + MDL_CACHE_SIZE, -+ 0, 0); -+ TRACE2("%p", mdl_cache); -+ if (!mdl_cache) { -+ ERROR("couldn't allocate MDL cache"); -+ ntoskernel_exit(); -+ return -ENOMEM; -+ } -+ -+#if defined(CONFIG_X86_64) -+ memset(&kuser_shared_data, 0, sizeof(kuser_shared_data)); -+ *((ULONG64 *)&kuser_shared_data.system_time) = ticks_1601(); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) -+ init_timer(&shared_data_timer); -+ shared_data_timer.function = update_user_shared_data_proc; -+ shared_data_timer.data = 0; -+#else -+ timer_setup(&shared_data_timer, update_user_shared_data_proc, 0); -+#endif -+#endif -+ return 0; -+} -+ -+int ntoskernel_init_device(struct wrap_device *wd) -+{ -+#if defined(CONFIG_X86_64) -+ if (kuser_shared_data.reserved1) -+ mod_timer(&shared_data_timer, jiffies + MSEC_TO_HZ(30)); -+#endif -+ return 0; -+} -+ -+void ntoskernel_exit_device(struct wrap_device *wd) -+{ -+ ENTER2(""); -+ -+ KeFlushQueuedDpcs(); -+ EXIT2(return); -+} -+ -+void ntoskernel_exit(void) -+{ -+ struct nt_list *cur; -+ -+ ENTER2(""); -+ -+ /* free kernel (Ke) timers */ -+ TRACE2("freeing timers"); -+ while (1) { -+ struct wrap_timer *wrap_timer; -+ struct nt_slist *slist; -+ -+ spin_lock_bh(&ntoskernel_lock); -+ if ((slist = wrap_timer_slist.next)) -+ wrap_timer_slist.next = slist->next; -+ spin_unlock_bh(&ntoskernel_lock); -+ TIMERTRACE("%p", slist); -+ if (!slist) -+ break; -+ wrap_timer = container_of(slist, struct wrap_timer, slist); -+ if (del_timer_sync(&wrap_timer->timer)) -+ WARNING("Buggy Windows driver left timer %p running", -+ wrap_timer->nt_timer); -+ memset(wrap_timer, 0, sizeof(*wrap_timer)); -+ slack_kfree(wrap_timer); -+ } -+ -+ TRACE2("freeing MDLs"); -+ if (mdl_cache) { -+ spin_lock_bh(&ntoskernel_lock); -+ if (!IsListEmpty(&wrap_mdl_list)) -+ ERROR("Windows driver didn't free all MDLs; " -+ "freeing them now"); -+ while ((cur = RemoveHeadList(&wrap_mdl_list))) { -+ struct wrap_mdl *wrap_mdl; -+ wrap_mdl = container_of(cur, struct wrap_mdl, list); -+ if (wrap_mdl->mdl->flags & MDL_CACHE_ALLOCATED) -+ kmem_cache_free(mdl_cache, wrap_mdl); -+ else -+ kfree(wrap_mdl); -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ kmem_cache_destroy(mdl_cache); -+ mdl_cache = NULL; -+ } -+ -+ TRACE2("freeing callbacks"); -+ spin_lock_bh(&ntoskernel_lock); -+ while ((cur = RemoveHeadList(&callback_objects))) { -+ struct callback_object *object; -+ struct nt_list *ent; -+ object = container_of(cur, struct callback_object, list); -+ while ((ent = RemoveHeadList(&object->callback_funcs))) { -+ struct callback_func *f; -+ f = container_of(ent, struct callback_func, list); -+ kfree(f); -+ } -+ kfree(object); -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ -+ spin_lock_bh(&ntoskernel_lock); -+ while ((cur = RemoveHeadList(&bus_driver_list))) { -+ struct bus_driver *bus_driver; -+ bus_driver = container_of(cur, struct bus_driver, list); -+ /* TODO: make sure all all drivers are shutdown/removed */ -+ kfree(bus_driver); -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ -+#if defined(CONFIG_X86_64) -+ del_timer_sync(&shared_data_timer); -+#endif -+ if (ntos_wq) -+ destroy_workqueue(ntos_wq); -+ ENTER2("freeing objects"); -+ spin_lock_bh(&ntoskernel_lock); -+ while ((cur = RemoveHeadList(&object_list))) { -+ struct common_object_header *hdr; -+ hdr = container_of(cur, struct common_object_header, list); -+ if (hdr->type == OBJECT_TYPE_NT_THREAD) -+ TRACE1("object %p(%d) was not freed, freeing it now", -+ HEADER_TO_OBJECT(hdr), hdr->type); -+ else -+ WARNING("object %p(%d) was not freed, freeing it now", -+ HEADER_TO_OBJECT(hdr), hdr->type); -+ ExFreePool(hdr); -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ -+ EXIT2(return); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ntoskernel.h linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel.h ---- linux-5.6.11/3rdparty/ndiswrapper/ntoskernel.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1117 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _NTOSKERNEL_H_ -+#define _NTOSKERNEL_H_ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if LINUX_VERSION_CODE > KERNEL_VERSION(4,11,0) -+#include -+#endif -+ -+#if !defined(CONFIG_X86) && !defined(CONFIG_X86_64) -+#error "this module is for x86 or x86_64 architectures only" -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) -+#define gfp_t unsigned int __nocast -+ -+static inline void *_kzalloc(size_t size, gfp_t flags) -+{ -+ void *p = kmalloc(size, flags); -+ if (likely(p != NULL)) -+ memset(p, 0, size); -+ return p; -+} -+ -+#define kzalloc(size, flags) _kzalloc(size, flags) -+#endif -+ -+/* Interrupt backwards compatibility stuff */ -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) -+#ifndef IRQ_HANDLED -+#define IRQ_HANDLED -+#define IRQ_NONE -+#define irqreturn_t void -+#endif -+#endif /* Linux < 2.6.29 */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) -+#ifndef mutex_init -+#define mutex semaphore -+#define mutex_init(m) sema_init(m, 1) -+#define mutex_lock(m) down(m) -+#define mutex_trylock(m) (!down_trylock(m)) -+#define mutex_unlock(m) up(m) -+#define mutex_is_locked(m) (atomic_read(m.count) == 0) -+#endif -+#endif /* Linux < 2.6.16 */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) -+#define set_cpus_allowed_ptr(task, mask) set_cpus_allowed(task, *mask) -+#endif /* Linux < 2.6.26 */ -+ -+#ifdef CONFIG_SMP -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) -+#define cpumask_copy(dst, src) do { *dst = *src; } while (0) -+#define cpumask_equal(mask1, mask2) cpus_equal(*mask1, *mask2) -+#define cpumask_setall(mask) cpus_setall(*mask) -+static cpumask_t cpumasks[NR_CPUS]; -+#define cpumask_of(cpu) \ -+({ \ -+ cpumasks[cpu] = cpumask_of_cpu(cpu); \ -+ &cpumasks[cpu]; \ -+}) -+#endif /* Linux < 2.6.28 */ -+#endif /* CONFIG_SMP */ -+ -+#ifndef tsk_cpus_allowed -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+#define tsk_cpus_allowed(tsk) (&(tsk)->cpus_mask) -+#else -+#define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) -+#endif -+#endif -+ -+#ifndef __packed -+#define __packed __attribute__((packed)) -+#endif -+ -+/* pci functions in 2.6 kernels have problems allocating dma buffers, -+ * but seem to work fine with dma functions -+ */ -+#include -+ -+#ifndef ___GFP_RETRY_MAYFAIL -+#define ___GFP_RETRY_MAYFAIL __GFP_REPEAT -+#endif -+ -+#define PCI_DMA_ALLOC_COHERENT(pci_dev,size,dma_handle) \ -+ dma_alloc_coherent(&pci_dev->dev,size,dma_handle, \ -+ GFP_KERNEL | ___GFP_RETRY_MAYFAIL) -+#define PCI_DMA_FREE_COHERENT(pci_dev,size,cpu_addr,dma_handle) \ -+ dma_free_coherent(&pci_dev->dev,size,cpu_addr,dma_handle) -+#define PCI_DMA_MAP_SINGLE(pci_dev,addr,size,direction) \ -+ dma_map_single(&pci_dev->dev,addr,size,direction) -+#define PCI_DMA_UNMAP_SINGLE(pci_dev,dma_handle,size,direction) \ -+ dma_unmap_single(&pci_dev->dev,dma_handle,size,direction) -+#define MAP_SG(pci_dev, sglist, nents, direction) \ -+ dma_map_sg(&pci_dev->dev, sglist, nents, direction) -+#define UNMAP_SG(pci_dev, sglist, nents, direction) \ -+ dma_unmap_sg(&pci_dev->dev, sglist, nents, direction) -+#define PCI_DMA_MAP_ERROR(dma_addr) dma_mapping_error(dma_addr) -+ -+ -+#if defined(CONFIG_NET_RADIO) && !defined(CONFIG_WIRELESS_EXT) -+#define CONFIG_WIRELESS_EXT -+#endif -+ -+#define prepare_wait_condition(task, var, value) \ -+do { \ -+ var = value; \ -+ task = current; \ -+ barrier(); \ -+} while (0) -+ -+/* Wait in wait_state (e.g., TASK_INTERRUPTIBLE) for condition to -+ * become true; timeout is either jiffies (> 0) to wait or 0 to wait -+ * forever. -+ * When timeout == 0, return value is -+ * > 0 if condition becomes true, or -+ * < 0 if signal is pending on the thread. -+ * When timeout > 0, return value is -+ * > 0 if condition becomes true before timeout, -+ * < 0 if signal is pending on the thread before timeout, or -+ * 0 if timedout (condition may have become true at the same time) -+ */ -+ -+#define wait_condition(condition, timeout, wait_state) \ -+({ \ -+ long ret = timeout ? timeout : 1; \ -+ while (1) { \ -+ if (signal_pending(current)) { \ -+ ret = -ERESTARTSYS; \ -+ break; \ -+ } \ -+ set_current_state(wait_state); \ -+ if (condition) { \ -+ __set_current_state(TASK_RUNNING); \ -+ break; \ -+ } \ -+ if (timeout) { \ -+ ret = schedule_timeout(ret); \ -+ if (!ret) \ -+ break; \ -+ } else \ -+ schedule(); \ -+ } \ -+ ret; \ -+}) -+ -+#ifdef WRAP_WQ -+ -+struct wrap_workqueue_struct; -+ -+struct wrap_work_struct { -+ struct list_head list; -+ void (*func)(struct wrap_work_struct *data); -+ void *data; -+ /* whether/on which thread scheduled */ -+ struct workqueue_thread *thread; -+}; -+ -+#define work_struct wrap_work_struct -+#define workqueue_struct wrap_workqueue_struct -+ -+#undef INIT_WORK -+#define INIT_WORK(work, pfunc) \ -+ do { \ -+ (work)->func = (pfunc); \ -+ (work)->data = (work); \ -+ (work)->thread = NULL; \ -+ } while (0) -+ -+#undef create_singlethread_workqueue -+#define create_singlethread_workqueue(wq) wrap_create_wq(wq, 1, 0) -+#undef create_workqueue -+#define create_workqueue(wq) wrap_create_wq(wq, 0, 0) -+#undef destroy_workqueue -+#define destroy_workqueue(wq) wrap_destroy_wq(wq) -+#undef queue_work -+#define queue_work(wq, work) wrap_queue_work(wq, work) -+#undef flush_workqueue -+#define flush_workqueue(wq) wrap_flush_wq(wq) -+ -+struct workqueue_struct *wrap_create_wq(const char *name, u8 singlethread, -+ u8 freeze); -+void wrap_destroy_wq(struct workqueue_struct *workq); -+int wrap_queue_work(struct workqueue_struct *workq, struct work_struct *work); -+void wrap_cancel_work(struct work_struct *work); -+void wrap_flush_wq(struct workqueue_struct *workq); -+ -+#else // WRAP_WQ -+ -+/* Compatibility for Linux before 2.6.20 where INIT_WORK takes 3 arguments */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) && \ -+ !defined(INIT_WORK_NAR) && \ -+ !defined(INIT_DELAYED_WORK_DEFERRABLE) -+typedef void (*compat_work_func_t)(void *work); -+typedef void (*work_func_t)(struct work_struct *work); -+static inline void (INIT_WORK)(struct work_struct *work, work_func_t func) -+{ -+ INIT_WORK(work, (compat_work_func_t)func, work); -+} -+#undef INIT_WORK -+#endif -+ -+#endif // WRAP_WQ -+ -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) -+#define ISR_PT_REGS_PARAM_DECL -+#else -+#define ISR_PT_REGS_PARAM_DECL , struct pt_regs *regs -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16) -+#define for_each_possible_cpu(_cpu) for_each_cpu(_cpu) -+#endif -+ -+#ifndef CHECKSUM_PARTIAL -+#define CHECKSUM_PARTIAL CHECKSUM_HW -+#endif -+ -+#ifndef IRQF_SHARED -+#define IRQF_SHARED SA_SHIRQ -+#endif -+ -+#ifndef UMH_WAIT_PROC -+#define UMH_WAIT_PROC 1 -+#endif -+ -+#define memcpy_skb(skb, from, length) \ -+ memcpy(skb_put(skb, length), from, length) -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -+#ifndef DMA_BIT_MASK -+#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) -+#endif -+#endif -+ -+#ifndef __GFP_DMA32 -+#define __GFP_DMA32 GFP_DMA -+#endif -+ -+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22) -+#define wrap_kmem_cache_create(name, size, align, flags) \ -+ kmem_cache_create(name, size, align, flags, NULL, NULL) -+#else -+#define wrap_kmem_cache_create(name, size, align, flags) \ -+ kmem_cache_create(name, size, align, flags, NULL) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34) -+#define netdev_mc_count(dev) ((dev)->mc_count) -+#define usb_alloc_coherent(dev, size, mem_flags, dma) (usb_buffer_alloc((dev), (size), (mem_flags), (dma))) -+#define usb_free_coherent(dev, size, addr, dma) (usb_buffer_free((dev), (size), (addr), (dma))) -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0) -+#define daemonize(name, ...) do {} while (0) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) -+#define add_taint(flag, lockdep_ok) add_taint(flag) -+#endif -+ -+#include "winnt_types.h" -+#include "ndiswrapper.h" -+#include "pe_linker.h" -+#include "wrapmem.h" -+#include "lin2win.h" -+#include "loader.h" -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) -+static inline void netif_tx_lock(struct net_device *dev) -+{ -+ spin_lock(&dev->xmit_lock); -+} -+static inline void netif_tx_unlock(struct net_device *dev) -+{ -+ spin_unlock(&dev->xmit_lock); -+} -+static inline void netif_tx_lock_bh(struct net_device *dev) -+{ -+ spin_lock_bh(&dev->xmit_lock); -+} -+static inline void netif_tx_unlock_bh(struct net_device *dev) -+{ -+ spin_unlock_bh(&dev->xmit_lock); -+} -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) -+static inline void netif_poll_enable(struct net_device *dev) -+{ -+} -+static inline void netif_poll_disable(struct net_device *dev) -+{ -+} -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) -+#define proc_net_root init_net.proc_net -+#else -+#define proc_net_root proc_net -+#endif -+ -+#if ((LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) && \ -+ (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))) || \ -+ (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,42)) -+#ifndef skb_frag_page -+#define skb_frag_page(frag) ((frag)->page) -+#endif -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) -+#define netdev_notifier_info_to_dev(x) ((struct net_device *)(x)) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0) -+static inline void reinit_completion(struct completion *x) -+{ -+ INIT_COMPLETION(*x); -+} -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) -+#define prandom_seed(seed) net_srandom(seed) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) -+static int strncasecmp(const char *s1, const char *s2, size_t n) -+{ -+ strnicmp(s1, s2, n); -+} -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -+static inline void netif_trans_update(struct net_device *dev) -+{ -+ dev->trans_start = jiffies; -+} -+#endif -+ -+/* TICK is 100ns */ -+#define TICKSPERSEC 10000000 -+#define TICKSPERMSEC 10000 -+#define SECSPERDAY 86400 -+#define TICKSPERJIFFY ((TICKSPERSEC + HZ - 1) / HZ) -+ -+#define int_div_round(x, y) (((x) + (y - 1)) / (y)) -+ -+/* 1601 to 1970 is 369 years plus 89 leap days */ -+#define SECS_1601_TO_1970 ((369 * 365 + 89) * (u64)SECSPERDAY) -+#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) -+ -+/* 100ns units to HZ; if sys_time is negative, relative to current -+ * clock, otherwise from year 1601 */ -+#define SYSTEM_TIME_TO_HZ(sys_time) \ -+ (((sys_time) <= 0) ? \ -+ int_div_round(((u64)HZ * (-(sys_time))), TICKSPERSEC) : \ -+ int_div_round(((s64)HZ * ((sys_time) - ticks_1601())), TICKSPERSEC)) -+ -+#define MSEC_TO_HZ(ms) int_div_round((ms * HZ), 1000) -+#define USEC_TO_HZ(us) int_div_round((us * HZ), 1000000) -+ -+extern u64 wrap_ticks_to_boot; -+ -+static inline u64 ticks_1601(void) -+{ -+ return wrap_ticks_to_boot + (u64)jiffies * TICKSPERJIFFY; -+} -+ -+typedef void (*generic_func)(void); -+ -+struct wrap_export { -+ const char *name; -+ generic_func func; -+}; -+ -+#ifdef CONFIG_X86_64 -+ -+#define WIN_SYMBOL(name, argc) \ -+ {#name, (generic_func) win2lin_ ## name ## _ ## argc} -+#define WIN_WIN_SYMBOL(name, argc) \ -+ {#name, (generic_func) win2lin__win_ ## name ## _ ## argc} -+#define WIN_FUNC_DECL(name, argc) \ -+ extern typeof(name) win2lin_ ## name ## _ ## argc; -+#define WIN_FUNC_PTR(name, argc) win2lin_ ## name ## _ ## argc -+ -+#else -+ -+#define WIN_SYMBOL(name, argc) {#name, (generic_func)name} -+#define WIN_WIN_SYMBOL(name, argc) {#name, (generic_func)_win_ ## name} -+#define WIN_FUNC_DECL(name, argc) -+#define WIN_FUNC_PTR(name, argc) name -+ -+#endif -+ -+#define WIN_FUNC(name, argc) (name) -+/* map name s to f - if f is different from s */ -+#define WIN_SYMBOL_MAP(s, f) -+ -+#define POOL_TAG(A, B, C, D) \ -+ ((ULONG)((A) + ((B) << 8) + ((C) << 16) + ((D) << 24))) -+ -+struct pe_image { -+ char name[MAX_DRIVER_NAME_LEN]; -+ UINT (*entry)(struct driver_object *, struct unicode_string *) wstdcall; -+ void *image; -+ int size; -+ int type; -+ -+ IMAGE_NT_HEADERS *nt_hdr; -+ IMAGE_OPTIONAL_HEADER *opt_hdr; -+}; -+ -+struct ndis_mp_block; -+ -+struct wrap_timer { -+ struct nt_slist slist; -+ struct timer_list timer; -+ struct nt_timer *nt_timer; -+ long repeat; -+#ifdef TIMER_DEBUG -+ unsigned long wrap_timer_magic; -+#endif -+}; -+ -+struct ntos_work_item { -+ struct nt_list list; -+ void *arg1; -+ void *arg2; -+ NTOS_WORK_FUNC func; -+}; -+ -+struct wrap_device_setting { -+ struct nt_list list; -+ char name[MAX_SETTING_NAME_LEN]; -+ char value[MAX_SETTING_VALUE_LEN]; -+ void *encoded; -+}; -+ -+struct wrap_bin_file { -+ char name[MAX_DRIVER_NAME_LEN]; -+ size_t size; -+ void *data; -+}; -+ -+#define WRAP_DRIVER_CLIENT_ID 1 -+ -+struct wrap_driver { -+ struct nt_list list; -+ struct driver_object *drv_obj; -+ char name[MAX_DRIVER_NAME_LEN]; -+ char version[MAX_SETTING_VALUE_LEN]; -+ unsigned short num_pe_images; -+ struct pe_image pe_images[MAX_DRIVER_PE_IMAGES]; -+ unsigned short num_bin_files; -+ struct wrap_bin_file *bin_files; -+ struct nt_list settings; -+ int dev_type; -+ struct ndis_driver *ndis_driver; -+}; -+ -+enum hw_status { -+ HW_INITIALIZED = 1, HW_SUSPENDED, HW_HALTED, HW_DISABLED, -+}; -+ -+struct wrap_device { -+ /* first part is (de)initialized once by loader */ -+ struct nt_list list; -+ int dev_bus; -+ int vendor; -+ int device; -+ int subvendor; -+ int subdevice; -+ char conf_file_name[MAX_DRIVER_NAME_LEN]; -+ char driver_name[MAX_DRIVER_NAME_LEN]; -+ struct wrap_driver *driver; -+ struct nt_list settings; -+ -+ /* rest should be (de)initialized when a device is -+ * (un)plugged */ -+ struct cm_resource_list *resource_list; -+ unsigned long hw_status; -+ struct device_object *pdo; -+ union { -+ struct { -+ struct pci_dev *pdev; -+ enum device_power_state wake_state; -+ } pci; -+ struct { -+ struct usb_device *udev; -+ struct usb_interface *intf; -+ int num_alloc_urbs; -+ struct nt_list wrap_urb_list; -+ } usb; -+ }; -+}; -+ -+#define wrap_is_pci_bus(dev_bus) \ -+ (WRAP_BUS(dev_bus) == WRAP_PCI_BUS || \ -+ WRAP_BUS(dev_bus) == WRAP_PCMCIA_BUS) -+#ifdef ENABLE_USB -+/* earlier versions of ndiswrapper used 0 as USB_BUS */ -+#define wrap_is_usb_bus(dev_bus) \ -+ (WRAP_BUS(dev_bus) == WRAP_USB_BUS || \ -+ WRAP_BUS(dev_bus) == WRAP_INTERNAL_BUS) -+#else -+#define wrap_is_usb_bus(dev_bus) 0 -+#endif -+#define wrap_is_bluetooth_device(dev_bus) \ -+ (WRAP_DEVICE(dev_bus) == WRAP_BLUETOOTH_DEVICE1 || \ -+ WRAP_DEVICE(dev_bus) == WRAP_BLUETOOTH_DEVICE2) -+ -+extern struct workqueue_struct *ntos_wq; -+extern struct workqueue_struct *ndis_wq; -+extern struct workqueue_struct *wrapndis_wq; -+ -+#define atomic_unary_op(var, size, oper) \ -+do { \ -+ if (size == 1) \ -+ __asm__ __volatile__( \ -+ LOCK_PREFIX oper "b %b0\n\t" : "+m" (var)); \ -+ else if (size == 2) \ -+ __asm__ __volatile__( \ -+ LOCK_PREFIX oper "w %w0\n\t" : "+m" (var)); \ -+ else if (size == 4) \ -+ __asm__ __volatile__( \ -+ LOCK_PREFIX oper "l %0\n\t" : "+m" (var)); \ -+ else if (size == 8) \ -+ __asm__ __volatile__( \ -+ LOCK_PREFIX oper "q %q0\n\t" : "+m" (var)); \ -+ else { \ -+ extern void _invalid_op_size_(void); \ -+ _invalid_op_size_(); \ -+ } \ -+} while (0) -+ -+#define atomic_inc_var_size(var, size) atomic_unary_op(var, size, "inc") -+ -+#define atomic_inc_var(var) atomic_inc_var_size(var, sizeof(var)) -+ -+#define atomic_dec_var_size(var, size) atomic_unary_op(var, size, "dec") -+ -+#define atomic_dec_var(var) atomic_dec_var_size(var, sizeof(var)) -+ -+#define pre_atomic_add(var, i) \ -+({ \ -+ typeof(var) pre; \ -+ __asm__ __volatile__( \ -+ LOCK_PREFIX "xadd %0, %1\n\t" \ -+ : "=r"(pre), "+m"(var) \ -+ : "0"(i)); \ -+ pre; \ -+}) -+ -+#define post_atomic_add(var, i) (pre_atomic_add(var, i) + i) -+ -+//#define DEBUG_IRQL 1 -+ -+#ifdef DEBUG_IRQL -+#define assert_irql(cond) \ -+do { \ -+ KIRQL _irql_ = current_irql(); \ -+ if (!(cond)) { \ -+ WARNING("assertion '%s' failed: %d", #cond, _irql_); \ -+ DBG_BLOCK(4) { \ -+ dump_stack(); \ -+ } \ -+ } \ -+} while (0) -+#else -+#define assert_irql(cond) do { } while (0) -+#endif -+ -+/* When preempt is enabled, we should preempt_disable to raise IRQL to -+ * DISPATCH_LEVEL, to be consistent with the semantics. However, using -+ * a mutex instead, so that only ndiswrapper threads run one at a time -+ * on a processor when at DISPATCH_LEVEL seems to be enough. So that -+ * is what we will use until we learn otherwise. If -+ * preempt_(en|dis)able is required for some reason, comment out -+ * following #define. */ -+ -+#define WRAP_PREEMPT 1 -+ -+#if !defined(CONFIG_PREEMPT) || defined(CONFIG_PREEMPT_RT) -+#ifndef WRAP_PREEMPT -+#define WRAP_PREEMPT 1 -+#endif -+#endif -+ -+//#undef WRAP_PREEMPT -+ -+#ifdef WRAP_PREEMPT -+ -+struct irql_info { -+ int count; -+ struct mutex lock; -+#ifdef CONFIG_SMP -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0) -+ cpumask_t cpus_mask; -+#else -+ cpumask_t cpus_allowed; -+#endif -+#endif -+ struct task_struct *task; -+}; -+ -+DECLARE_PER_CPU(struct irql_info, irql_info); -+ -+static inline KIRQL raise_irql(KIRQL newirql) -+{ -+ struct irql_info *info; -+ -+ assert(newirql == DISPATCH_LEVEL); -+ info = &get_cpu_var(irql_info); -+ if (info->task == current) { -+ assert(info->count > 0); -+ assert(mutex_is_locked(&info->lock)); -+#if defined(CONFIG_SMP) && DEBUG >= 1 -+ assert(cpumask_equal(tsk_cpus_allowed(current), -+ cpumask_of(smp_processor_id()))); -+#endif -+ info->count++; -+ put_cpu_var(irql_info); -+ return DISPATCH_LEVEL; -+ } -+ /* TODO: is this enough to pin down to current cpu? */ -+#ifdef CONFIG_SMP -+ assert(task_cpu(current) == smp_processor_id()); -+ cpumask_copy(tsk_cpus_allowed(info), tsk_cpus_allowed(current)); -+ set_cpus_allowed_ptr(current, cpumask_of(smp_processor_id())); -+#endif -+ put_cpu_var(irql_info); -+ mutex_lock(&info->lock); -+ assert(info->count == 0); -+ assert(info->task == NULL); -+ info->count = 1; -+ info->task = current; -+ return PASSIVE_LEVEL; -+} -+ -+static inline void lower_irql(KIRQL oldirql) -+{ -+ struct irql_info *info; -+ -+ assert(oldirql <= DISPATCH_LEVEL); -+ info = &get_cpu_var(irql_info); -+ assert(info->task == current); -+ assert(mutex_is_locked(&info->lock)); -+ assert(info->count > 0); -+ if (--info->count == 0) { -+ info->task = NULL; -+#ifdef CONFIG_SMP -+ set_cpus_allowed_ptr(current, tsk_cpus_allowed(info)); -+#endif -+ mutex_unlock(&info->lock); -+ } -+ put_cpu_var(irql_info); -+} -+ -+static inline KIRQL current_irql(void) -+{ -+ int count; -+ if (in_irq() || irqs_disabled()) -+ EXIT4(return DIRQL); -+ if (in_atomic() || in_interrupt()) -+ EXIT4(return SOFT_IRQL); -+ count = get_cpu_var(irql_info).count; -+ put_cpu_var(irql_info); -+ if (count) -+ EXIT6(return DISPATCH_LEVEL); -+ else -+ EXIT6(return PASSIVE_LEVEL); -+} -+ -+#else -+ -+static inline KIRQL current_irql(void) -+{ -+ if (in_irq() || irqs_disabled()) -+ EXIT4(return DIRQL); -+ if (in_interrupt()) -+ EXIT4(return SOFT_IRQL); -+ if (in_atomic()) -+ EXIT6(return DISPATCH_LEVEL); -+ else -+ EXIT6(return PASSIVE_LEVEL); -+} -+ -+static inline KIRQL raise_irql(KIRQL newirql) -+{ -+ KIRQL ret = in_atomic() ? DISPATCH_LEVEL : PASSIVE_LEVEL; -+ assert(newirql == DISPATCH_LEVEL); -+ assert(current_irql() <= DISPATCH_LEVEL); -+ preempt_disable(); -+ return ret; -+} -+ -+static inline void lower_irql(KIRQL oldirql) -+{ -+ assert(current_irql() == DISPATCH_LEVEL); -+ preempt_enable(); -+} -+ -+#endif -+ -+#define irql_gfp() (in_atomic() ? GFP_ATOMIC : GFP_KERNEL) -+ -+/* Windows spinlocks are of type ULONG_PTR which is not big enough to -+ * store Linux spinlocks; so we implement Windows spinlocks using -+ * ULONG_PTR space with our own functions/macros */ -+ -+/* Windows seems to use 0 for unlocked state of spinlock - if Linux -+ * convention of 1 for unlocked state is used, at least prism54 driver -+ * crashes */ -+ -+#define NT_SPIN_LOCK_UNLOCKED 0 -+#define NT_SPIN_LOCK_LOCKED 1 -+ -+static inline void nt_spin_lock_init(NT_SPIN_LOCK *lock) -+{ -+ *lock = NT_SPIN_LOCK_UNLOCKED; -+} -+ -+#ifdef CONFIG_SMP -+ -+static inline void nt_spin_lock(NT_SPIN_LOCK *lock) -+{ -+ while (1) { -+ unsigned long lockval = xchg(lock, NT_SPIN_LOCK_LOCKED); -+ -+ if (likely(lockval == NT_SPIN_LOCK_UNLOCKED)) -+ break; -+ if (unlikely(lockval > NT_SPIN_LOCK_LOCKED)) { -+ ERROR("bad spinlock: 0x%lx at %p", lockval, lock); -+ return; -+ } -+ /* "rep; nop" doesn't change cx register, it's a "pause" */ -+ __asm__ __volatile__("rep; nop"); -+ } -+} -+ -+static inline void nt_spin_unlock(NT_SPIN_LOCK *lock) -+{ -+ unsigned long lockval = xchg(lock, NT_SPIN_LOCK_UNLOCKED); -+ -+ if (likely(lockval == NT_SPIN_LOCK_LOCKED)) -+ return; -+ WARNING("unlocking unlocked spinlock: 0x%lx at %p", lockval, lock); -+} -+ -+#else // CONFIG_SMP -+ -+#define nt_spin_lock(lock) do { } while (0) -+ -+#define nt_spin_unlock(lock) do { } while (0) -+ -+#endif // CONFIG_SMP -+ -+/* When kernel would've disabled preempt (e.g., in interrupt -+ * handlers), we need to fake preempt so driver thinks it is running -+ * at right IRQL */ -+ -+/* raise IRQL to given (higher) IRQL if necessary before locking */ -+static inline KIRQL nt_spin_lock_irql(NT_SPIN_LOCK *lock, KIRQL newirql) -+{ -+ KIRQL oldirql = raise_irql(newirql); -+ nt_spin_lock(lock); -+ return oldirql; -+} -+ -+/* lower IRQL to given (lower) IRQL if necessary after unlocking */ -+static inline void nt_spin_unlock_irql(NT_SPIN_LOCK *lock, KIRQL oldirql) -+{ -+ nt_spin_unlock(lock); -+ lower_irql(oldirql); -+} -+ -+#define nt_spin_lock_irqsave(lock, flags) \ -+do { \ -+ local_irq_save(flags); \ -+ preempt_disable(); \ -+ nt_spin_lock(lock); \ -+} while (0) -+ -+#define nt_spin_unlock_irqrestore(lock, flags) \ -+do { \ -+ nt_spin_unlock(lock); \ -+ preempt_enable(); \ -+ local_irq_restore(flags); \ -+} while (0) -+ -+static inline ULONG SPAN_PAGES(void *ptr, SIZE_T length) -+{ -+ return PAGE_ALIGN(((unsigned long)ptr & (PAGE_SIZE - 1)) + length) -+ >> PAGE_SHIFT; -+} -+ -+#ifdef CONFIG_X86_64 -+ -+/* TODO: can these be implemented without using spinlock? */ -+ -+static inline struct nt_slist *PushEntrySList(nt_slist_header *head, -+ struct nt_slist *entry, -+ NT_SPIN_LOCK *lock) -+{ -+ KIRQL irql = nt_spin_lock_irql(lock, DISPATCH_LEVEL); -+ entry->next = head->next; -+ head->next = entry; -+ head->depth++; -+ nt_spin_unlock_irql(lock, irql); -+ TRACE4("%p, %p, %p", head, entry, entry->next); -+ return entry->next; -+} -+ -+static inline struct nt_slist *PopEntrySList(nt_slist_header *head, -+ NT_SPIN_LOCK *lock) -+{ -+ struct nt_slist *entry; -+ KIRQL irql = nt_spin_lock_irql(lock, DISPATCH_LEVEL); -+ entry = head->next; -+ if (entry) { -+ head->next = entry->next; -+ head->depth--; -+ } -+ nt_spin_unlock_irql(lock, irql); -+ TRACE4("%p, %p", head, entry); -+ return entry; -+} -+ -+#else -+ -+#define u64_low_32(x) ((u32)x) -+#define u64_high_32(x) ((u32)(x >> 32)) -+ -+static inline u64 nt_cmpxchg8b(volatile u64 *ptr, u64 old, u64 new) -+{ -+ u64 prev; -+ -+ __asm__ __volatile__( -+ "\n" -+ LOCK_PREFIX "cmpxchg8b %0\n" -+ : "+m" (*ptr), "=A" (prev) -+ : "A" (old), "b" (u64_low_32(new)), "c" (u64_high_32(new))); -+ return prev; -+} -+ -+/* slist routines below update slist atomically - no need for -+ * spinlocks */ -+ -+static inline struct nt_slist *PushEntrySList(nt_slist_header *head, -+ struct nt_slist *entry, -+ NT_SPIN_LOCK *lock) -+{ -+ nt_slist_header old, new; -+ do { -+ old.align = head->align; -+ entry->next = old.next; -+ new.next = entry; -+ new.depth = old.depth + 1; -+ } while (nt_cmpxchg8b(&head->align, old.align, new.align) != old.align); -+ TRACE4("%p, %p, %p", head, entry, old.next); -+ return old.next; -+} -+ -+static inline struct nt_slist *PopEntrySList(nt_slist_header *head, -+ NT_SPIN_LOCK *lock) -+{ -+ struct nt_slist *entry; -+ nt_slist_header old, new; -+ do { -+ old.align = head->align; -+ entry = old.next; -+ if (!entry) -+ break; -+ new.next = entry->next; -+ new.depth = old.depth - 1; -+ } while (nt_cmpxchg8b(&head->align, old.align, new.align) != old.align); -+ TRACE4("%p, %p", head, entry); -+ return entry; -+} -+ -+#endif -+ -+#define sleep_hz(n) \ -+do { \ -+ set_current_state(TASK_INTERRUPTIBLE); \ -+ schedule_timeout(n); \ -+} while (0) -+ -+int ntoskernel_init(void); -+void ntoskernel_exit(void); -+int ntoskernel_init_device(struct wrap_device *wd); -+void ntoskernel_exit_device(struct wrap_device *wd); -+void *allocate_object(ULONG size, enum common_object_type type, -+ struct unicode_string *name); -+ -+#ifdef ENABLE_USB -+int usb_init(void); -+void usb_exit(void); -+#else -+static inline int usb_init(void) { return 0; } -+static inline void usb_exit(void) {} -+#endif -+int usb_init_device(struct wrap_device *wd); -+void usb_exit_device(struct wrap_device *wd); -+ -+int wrap_procfs_init(void); -+void wrap_procfs_remove(void); -+ -+int link_pe_images(struct pe_image *pe_image, unsigned short n); -+ -+int stricmp(const char *s1, const char *s2); -+void dump_bytes(const char *name, const u8 *from, int len); -+struct mdl *allocate_init_mdl(void *virt, ULONG length); -+void free_mdl(struct mdl *mdl); -+struct driver_object *find_bus_driver(const char *name); -+void free_custom_extensions(struct driver_extension *drv_obj_ext); -+struct nt_thread *get_current_nt_thread(void); -+u64 ticks_1601(void); -+int schedule_ntos_work_item(NTOS_WORK_FUNC func, void *arg1, void *arg2); -+void wrap_init_timer(struct nt_timer *nt_timer, enum timer_type type, -+ struct ndis_mp_block *nmb); -+BOOLEAN wrap_set_timer(struct nt_timer *nt_timer, unsigned long expires_hz, -+ unsigned long repeat_hz, struct kdpc *kdpc); -+ -+LONG InterlockedDecrement(LONG volatile *val) wfastcall; -+LONG InterlockedIncrement(LONG volatile *val) wfastcall; -+struct nt_list *ExInterlockedInsertHeadList -+ (struct nt_list *head, struct nt_list *entry, -+ NT_SPIN_LOCK *lock) wfastcall; -+struct nt_list *ExInterlockedInsertTailList -+ (struct nt_list *head, struct nt_list *entry, -+ NT_SPIN_LOCK *lock) wfastcall; -+struct nt_list *ExInterlockedRemoveHeadList -+ (struct nt_list *head, NT_SPIN_LOCK *lock) wfastcall; -+NTSTATUS IofCallDriver(struct device_object *dev_obj, struct irp *irp) wfastcall; -+KIRQL KfRaiseIrql(KIRQL newirql) wfastcall; -+void KfLowerIrql(KIRQL oldirql) wfastcall; -+KIRQL KfAcquireSpinLock(NT_SPIN_LOCK *lock) wfastcall; -+void KfReleaseSpinLock(NT_SPIN_LOCK *lock, KIRQL oldirql) wfastcall; -+void IofCompleteRequest(struct irp *irp, CHAR prio_boost) wfastcall; -+void KefReleaseSpinLockFromDpcLevel(NT_SPIN_LOCK *lock) wfastcall; -+ -+LONG ObfReferenceObject(void *object) wfastcall; -+void ObfDereferenceObject(void *object) wfastcall; -+ -+#define ObReferenceObject(object) ObfReferenceObject(object) -+#define ObDereferenceObject(object) ObfDereferenceObject(object) -+ -+/* prevent expansion of ExAllocatePoolWithTag macro */ -+void *(ExAllocatePoolWithTag)(enum pool_type pool_type, SIZE_T size, -+ ULONG tag) wstdcall; -+ -+void ExFreePool(void *p) wstdcall; -+ULONG MmSizeOfMdl(void *base, ULONG length) wstdcall; -+void __iomem *MmMapIoSpace(PHYSICAL_ADDRESS phys_addr, SIZE_T size, -+ enum memory_caching_type cache) wstdcall; -+void MmUnmapIoSpace(void __iomem *addr, SIZE_T size) wstdcall; -+void MmProbeAndLockPages(struct mdl *mdl, KPROCESSOR_MODE access_mode, -+ enum lock_operation operation) wstdcall; -+void MmUnlockPages(struct mdl *mdl) wstdcall; -+void KeInitializeEvent(struct nt_event *nt_event, -+ enum event_type type, BOOLEAN state) wstdcall; -+LONG KeSetEvent(struct nt_event *nt_event, KPRIORITY incr, -+ BOOLEAN wait) wstdcall; -+LONG KeResetEvent(struct nt_event *nt_event) wstdcall; -+BOOLEAN queue_kdpc(struct kdpc *kdpc); -+BOOLEAN dequeue_kdpc(struct kdpc *kdpc); -+ -+NTSTATUS IoConnectInterrupt(struct kinterrupt **kinterrupt, -+ PKSERVICE_ROUTINE service_routine, -+ void *service_context, NT_SPIN_LOCK *lock, -+ ULONG vector, KIRQL irql, KIRQL synch_irql, -+ enum kinterrupt_mode interrupt_mode, -+ BOOLEAN shareable, KAFFINITY processor_enable_mask, -+ BOOLEAN floating_save) wstdcall; -+void IoDisconnectInterrupt(struct kinterrupt *interrupt) wstdcall; -+BOOLEAN KeSynchronizeExecution(struct kinterrupt *interrupt, -+ PKSYNCHRONIZE_ROUTINE synch_routine, -+ void *ctx) wstdcall; -+ -+NTSTATUS KeWaitForSingleObject(void *object, KWAIT_REASON reason, -+ KPROCESSOR_MODE waitmode, BOOLEAN alertable, -+ LARGE_INTEGER *timeout) wstdcall; -+void MmBuildMdlForNonPagedPool(struct mdl *mdl) wstdcall; -+NTSTATUS IoCreateDevice(struct driver_object *driver, ULONG dev_ext_length, -+ struct unicode_string *dev_name, DEVICE_TYPE dev_type, -+ ULONG dev_chars, BOOLEAN exclusive, -+ struct device_object **dev_obj) wstdcall; -+NTSTATUS IoCreateSymbolicLink(struct unicode_string *link, -+ struct unicode_string *dev_name) wstdcall; -+void IoDeleteDevice(struct device_object *dev) wstdcall; -+void IoDetachDevice(struct device_object *topdev) wstdcall; -+struct device_object *IoGetAttachedDevice(struct device_object *dev) wstdcall; -+struct device_object *IoGetAttachedDeviceReference -+ (struct device_object *dev) wstdcall; -+NTSTATUS IoAllocateDriverObjectExtension -+ (struct driver_object *drv_obj, void *client_id, ULONG extlen, -+ void **ext) wstdcall; -+void *IoGetDriverObjectExtension(struct driver_object *drv, -+ void *client_id) wstdcall; -+struct device_object *IoAttachDeviceToDeviceStack -+ (struct device_object *src, struct device_object *dst) wstdcall; -+BOOLEAN IoCancelIrp(struct irp *irp) wstdcall; -+struct irp *IoBuildSynchronousFsdRequest -+ (ULONG major_func, struct device_object *dev_obj, void *buf, -+ ULONG length, LARGE_INTEGER *offset, struct nt_event *event, -+ struct io_status_block *status) wstdcall; -+ -+NTSTATUS IoPassIrpDown(struct device_object *dev_obj, struct irp *irp) wstdcall; -+WIN_FUNC_DECL(IoPassIrpDown,2); -+NTSTATUS IoSyncForwardIrp(struct device_object *dev_obj, -+ struct irp *irp) wstdcall; -+NTSTATUS IoAsyncForwardIrp(struct device_object *dev_obj, -+ struct irp *irp) wstdcall; -+NTSTATUS IoInvalidDeviceRequest(struct device_object *dev_obj, -+ struct irp *irp) wstdcall; -+ -+void KeInitializeSpinLock(NT_SPIN_LOCK *lock) wstdcall; -+void IoAcquireCancelSpinLock(KIRQL *irql) wstdcall; -+void IoReleaseCancelSpinLock(KIRQL irql) wstdcall; -+ -+NTSTATUS RtlUnicodeStringToAnsiString -+ (struct ansi_string *dst, const struct unicode_string *src, -+ BOOLEAN dup) wstdcall; -+NTSTATUS RtlAnsiStringToUnicodeString -+ (struct unicode_string *dst, const struct ansi_string *src, -+ BOOLEAN dup) wstdcall; -+void RtlInitAnsiString(struct ansi_string *dst, const char *src) wstdcall; -+void RtlInitUnicodeString(struct unicode_string *dest, -+ const wchar_t *src) wstdcall; -+void RtlFreeUnicodeString(struct unicode_string *string) wstdcall; -+void RtlFreeAnsiString(struct ansi_string *string) wstdcall; -+LONG RtlCompareUnicodeString(const struct unicode_string *s1, -+ const struct unicode_string *s2, -+ BOOLEAN case_insensitive) wstdcall; -+NTSTATUS RtlUpcaseUnicodeString(struct unicode_string *dst, -+ struct unicode_string *src, -+ BOOLEAN alloc) wstdcall; -+BOOLEAN KeCancelTimer(struct nt_timer *nt_timer) wstdcall; -+void KeInitializeDpc(struct kdpc *kdpc, void *func, void *ctx) wstdcall; -+ -+extern spinlock_t ntoskernel_lock; -+extern spinlock_t irp_cancel_lock; -+extern struct nt_list object_list; -+extern CCHAR cpu_count; -+#ifdef CONFIG_X86_64 -+extern struct kuser_shared_data kuser_shared_data; -+#endif -+ -+#define IoCompleteRequest(irp, prio) IofCompleteRequest(irp, prio) -+#define IoCallDriver(dev, irp) IofCallDriver(dev, irp) -+ -+#if defined(IO_DEBUG) -+#define DUMP_IRP(_irp) \ -+do { \ -+ struct io_stack_location *_irp_sl; \ -+ _irp_sl = IoGetCurrentIrpStackLocation(_irp); \ -+ IOTRACE("irp: %p, stack size: %d, cl: %d, sl: %p, dev_obj: %p, " \ -+ "mj_fn: %d, minor_fn: %d, nt_urb: %p, event: %p", \ -+ _irp, _irp->stack_count, (_irp)->current_location, \ -+ _irp_sl, _irp_sl->dev_obj, _irp_sl->major_fn, \ -+ _irp_sl->minor_fn, IRP_URB(_irp), \ -+ (_irp)->user_event); \ -+} while (0) -+#else -+#define DUMP_IRP(_irp) do { } while (0) -+#endif -+ -+#endif // _NTOSKERNEL_H_ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/ntoskernel_io.c linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel_io.c ---- linux-5.6.11/3rdparty/ndiswrapper/ntoskernel_io.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/ntoskernel_io.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1161 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+#include "ndis.h" -+#include "wrapndis.h" -+#include "usb.h" -+#include "loader.h" -+#include "ntoskernel_io_exports.h" -+ -+wstdcall void WIN_FUNC(IoAcquireCancelSpinLock,1) -+ (KIRQL *irql) __acquires(irql) -+{ -+ spin_lock_bh(&irp_cancel_lock); -+ *irql = 0; -+} -+ -+wstdcall void WIN_FUNC(IoReleaseCancelSpinLock,1) -+ (KIRQL irql) __releases(irql) -+{ -+ spin_unlock_bh(&irp_cancel_lock); -+} -+ -+wstdcall int WIN_FUNC(IoIsWdmVersionAvailable,2) -+ (UCHAR major, UCHAR minor) -+{ -+ IOENTER("%d, %x", major, minor); -+ if (major == 1 && -+ (minor == 0x30 || // Windows 2003 -+ minor == 0x20 || // Windows XP -+ minor == 0x10)) // Windows 2000 -+ IOEXIT(return TRUE); -+ IOEXIT(return FALSE); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(IoIs32bitProcess,1) -+ (struct irp *irp) -+{ -+#ifdef CONFIG_X86_64 -+ return FALSE; -+#else -+ return TRUE; -+#endif -+} -+ -+wstdcall void WIN_FUNC(IoInitializeIrp,3) -+ (struct irp *irp, USHORT size, CCHAR stack_count) -+{ -+ IOENTER("irp: %p, %d, %d", irp, size, stack_count); -+ -+ memset(irp, 0, size); -+ irp->size = size; -+ irp->stack_count = stack_count; -+ irp->current_location = stack_count; -+ IoGetCurrentIrpStackLocation(irp) = IRP_SL(irp, stack_count); -+ IOEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(IoReuseIrp,2) -+ (struct irp *irp, NTSTATUS status) -+{ -+ IOENTER("%p, %d", irp, status); -+ if (irp) { -+ UCHAR alloc_flags; -+ -+ alloc_flags = irp->alloc_flags; -+ IoInitializeIrp(irp, irp->size, irp->stack_count); -+ irp->alloc_flags = alloc_flags; -+ irp->io_status.status = status; -+ } -+ IOEXIT(return); -+} -+ -+wstdcall struct irp *WIN_FUNC(IoAllocateIrp,2) -+ (char stack_count, BOOLEAN charge_quota) -+{ -+ struct irp *irp; -+ int irp_size; -+ -+ IOENTER("count: %d", stack_count); -+ stack_count++; -+ irp_size = IoSizeOfIrp(stack_count); -+ irp = kmalloc(irp_size, irql_gfp()); -+ if (irp) -+ IoInitializeIrp(irp, irp_size, stack_count); -+ IOTRACE("irp %p", irp); -+ IOEXIT(return irp); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(IoCancelIrp,1) -+ (struct irp *irp) -+{ -+ typeof(irp->cancel_routine) cancel_routine; -+ -+ /* NB: this function may be called at DISPATCH_LEVEL */ -+ IOTRACE("irp: %p", irp); -+ if (!irp) -+ return FALSE; -+ DUMP_IRP(irp); -+ IoAcquireCancelSpinLock(&irp->cancel_irql); -+ cancel_routine = xchg(&irp->cancel_routine, NULL); -+ IOTRACE("%p", cancel_routine); -+ irp->cancel = TRUE; -+ if (cancel_routine) { -+ struct device_object *dev_obj; -+ -+ if (irp->current_location >= 0 && -+ irp->current_location < irp->stack_count) -+ dev_obj = IoGetCurrentIrpStackLocation(irp)->dev_obj; -+ else -+ dev_obj = NULL; -+ IOTRACE("current_location: %d, dev_obj: %p", -+ irp->current_location, dev_obj); -+ /* cancel_routine will release the spin lock */ -+ __release(irp->cancel_irql); -+ LIN2WIN2(cancel_routine, dev_obj, irp); -+ /* in usb's cancel, irp->cancel is set to indicate -+ * status of cancel */ -+ IOEXIT(return xchg(&irp->cancel, TRUE)); -+ } else { -+ IOTRACE("irp %p already canceled", irp); -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ IOEXIT(return FALSE); -+ } -+} -+ -+wstdcall void IoQueueThreadIrp(struct irp *irp) -+{ -+ struct nt_thread *thread; -+ KIRQL irql; -+ -+ thread = get_current_nt_thread(); -+ if (thread) { -+ IOTRACE("thread: %p, task: %p", thread, thread->task); -+ irp->flags |= IRP_SYNCHRONOUS_API; -+ irql = nt_spin_lock_irql(&thread->lock, DISPATCH_LEVEL); -+ InsertTailList(&thread->irps, &irp->thread_list); -+ IoIrpThread(irp) = thread; -+ nt_spin_unlock_irql(&thread->lock, irql); -+ } else -+ IoIrpThread(irp) = NULL; -+} -+ -+wstdcall void IoDequeueThreadIrp(struct irp *irp) -+{ -+ struct nt_thread *thread; -+ KIRQL irql; -+ -+ thread = IoIrpThread(irp); -+ if (thread) { -+ irql = nt_spin_lock_irql(&thread->lock, DISPATCH_LEVEL); -+ RemoveEntryList(&irp->thread_list); -+ nt_spin_unlock_irql(&thread->lock, irql); -+ } -+} -+ -+wstdcall void WIN_FUNC(IoFreeIrp,1) -+ (struct irp *irp) -+{ -+ IOENTER("irp = %p", irp); -+ if (!irp) { -+ WARNING("irp is NULL"); -+ return; -+ } -+ -+ if (irp->flags & IRP_SYNCHRONOUS_API) -+ IoDequeueThreadIrp(irp); -+ IoCancelIrp(irp); -+ kfree(irp); -+ -+ IOEXIT(return); -+} -+ -+wstdcall struct irp *WIN_FUNC(IoBuildAsynchronousFsdRequest,6) -+ (ULONG major_fn, struct device_object *dev_obj, void *buffer, -+ ULONG length, LARGE_INTEGER *offset, -+ struct io_status_block *user_status) -+{ -+ struct irp *irp; -+ struct io_stack_location *irp_sl; -+ -+ IOENTER("%p", dev_obj); -+ if (!dev_obj) -+ IOEXIT(return NULL); -+ irp = IoAllocateIrp(dev_obj->stack_count, FALSE); -+ if (irp == NULL) { -+ WARNING("couldn't allocate irp"); -+ IOEXIT(return NULL); -+ } -+ -+ irp_sl = IoGetNextIrpStackLocation(irp); -+ irp_sl->major_fn = major_fn; -+ IOTRACE("major_fn: %d", major_fn); -+ irp_sl->minor_fn = 0; -+ irp_sl->flags = 0; -+ irp_sl->control = 0; -+ irp_sl->dev_obj = dev_obj; -+ irp_sl->file_obj = NULL; -+ irp_sl->completion_routine = NULL; -+ -+ if (dev_obj->flags & DO_DIRECT_IO) { -+ irp->mdl = IoAllocateMdl(buffer, length, FALSE, FALSE, irp); -+ if (irp->mdl == NULL) { -+ IoFreeIrp(irp); -+ return NULL; -+ } -+ MmProbeAndLockPages(irp->mdl, KernelMode, -+ major_fn == IRP_MJ_WRITE ? -+ IoReadAccess : IoWriteAccess); -+ IOTRACE("mdl: %p", irp->mdl); -+ } else if (dev_obj->flags & DO_BUFFERED_IO) { -+ irp->associated_irp.system_buffer = buffer; -+ irp->flags = IRP_BUFFERED_IO; -+ irp->mdl = NULL; -+ IOTRACE("buffer: %p", buffer); -+ } -+ if (major_fn == IRP_MJ_READ) { -+ irp_sl->params.read.length = length; -+ irp_sl->params.read.byte_offset = *offset; -+ } else if (major_fn == IRP_MJ_WRITE) { -+ irp_sl->params.write.length = length; -+ irp_sl->params.write.byte_offset = *offset; -+ } -+ irp->user_status = user_status; -+ IOTRACE("irp: %p", irp); -+ return irp; -+} -+ -+wstdcall struct irp *WIN_FUNC(IoBuildSynchronousFsdRequest,7) -+ (ULONG major_fn, struct device_object *dev_obj, void *buf, -+ ULONG length, LARGE_INTEGER *offset, struct nt_event *event, -+ struct io_status_block *user_status) -+{ -+ struct irp *irp; -+ -+ irp = IoBuildAsynchronousFsdRequest(major_fn, dev_obj, buf, length, -+ offset, user_status); -+ if (irp == NULL) -+ return NULL; -+ irp->user_event = event; -+ IoQueueThreadIrp(irp); -+ return irp; -+} -+ -+wstdcall struct irp *WIN_FUNC(IoBuildDeviceIoControlRequest,9) -+ (ULONG ioctl, struct device_object *dev_obj, -+ void *input_buf, ULONG input_buf_len, void *output_buf, -+ ULONG output_buf_len, BOOLEAN internal_ioctl, -+ struct nt_event *event, struct io_status_block *io_status) -+{ -+ struct irp *irp; -+ struct io_stack_location *irp_sl; -+ ULONG buf_len; -+ -+ IOENTER("%p, 0x%08x, %d", dev_obj, ioctl, internal_ioctl); -+ if (!dev_obj) -+ IOEXIT(return NULL); -+ irp = IoAllocateIrp(dev_obj->stack_count, FALSE); -+ if (irp == NULL) { -+ WARNING("couldn't allocate irp"); -+ return NULL; -+ } -+ irp_sl = IoGetNextIrpStackLocation(irp); -+ irp_sl->params.dev_ioctl.code = ioctl; -+ irp_sl->params.dev_ioctl.input_buf_len = input_buf_len; -+ irp_sl->params.dev_ioctl.output_buf_len = output_buf_len; -+ irp_sl->major_fn = (internal_ioctl) ? -+ IRP_MJ_INTERNAL_DEVICE_CONTROL : IRP_MJ_DEVICE_CONTROL; -+ IOTRACE("%d", IO_METHOD_FROM_CTL_CODE(ioctl)); -+ -+ switch (IO_METHOD_FROM_CTL_CODE(ioctl)) { -+ case METHOD_BUFFERED: -+ buf_len = max(input_buf_len, output_buf_len); -+ if (buf_len) { -+ irp->associated_irp.system_buffer = -+ ExAllocatePoolWithTag(NonPagedPool, buf_len, 0); -+ if (!irp->associated_irp.system_buffer) { -+ IoFreeIrp(irp); -+ IOEXIT(return NULL); -+ } -+ irp->associated_irp.system_buffer = input_buf; -+ if (input_buf) -+ memcpy(irp->associated_irp.system_buffer, -+ input_buf, input_buf_len); -+ irp->flags = IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER; -+ if (output_buf) -+ irp->flags = IRP_INPUT_OPERATION; -+ irp->user_buf = output_buf; -+ } else -+ irp->user_buf = NULL; -+ break; -+ case METHOD_IN_DIRECT: -+ case METHOD_OUT_DIRECT: -+ if (input_buf) { -+ irp->associated_irp.system_buffer = -+ ExAllocatePoolWithTag(NonPagedPool, -+ input_buf_len, 0); -+ if (!irp->associated_irp.system_buffer) { -+ IoFreeIrp(irp); -+ IOEXIT(return NULL); -+ } -+ memcpy(irp->associated_irp.system_buffer, -+ input_buf, input_buf_len); -+ irp->flags = IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER; -+ } -+ /* TODO: we are supposed to setup MDL, but USB layer -+ * doesn't use MDLs. Moreover, USB layer mirrors -+ * non-DMAable buffers, so no need to allocate -+ * DMAable buffer here */ -+ if (output_buf) { -+ irp->associated_irp.system_buffer = -+ ExAllocatePoolWithTag(NonPagedPool, -+ output_buf_len, 0); -+ if (!irp->associated_irp.system_buffer) { -+ IoFreeIrp(irp); -+ IOEXIT(return NULL); -+ } -+ irp->flags = IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER; -+ } -+ break; -+ case METHOD_NEITHER: -+ irp->user_buf = output_buf; -+ irp_sl->params.dev_ioctl.type3_input_buf = input_buf; -+ break; -+ } -+ -+ irp->user_status = io_status; -+ irp->user_event = event; -+ IoQueueThreadIrp(irp); -+ -+ IOTRACE("irp: %p", irp); -+ IOEXIT(return irp); -+} -+ -+wfastcall NTSTATUS WIN_FUNC(IofCallDriver,2) -+ (struct device_object *dev_obj, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ NTSTATUS status; -+ driver_dispatch_t *major_func; -+ struct driver_object *drv_obj; -+ -+ if (irp->current_location <= 0) { -+ ERROR("invalid irp: %p, %d", irp, irp->current_location); -+ return STATUS_INVALID_PARAMETER; -+ } -+ IOTRACE("%p, %p, %p, %d, %d, %p", dev_obj, irp, dev_obj->drv_obj, -+ irp->current_location, irp->stack_count, -+ IoGetCurrentIrpStackLocation(irp)); -+ IoSetNextIrpStackLocation(irp); -+ DUMP_IRP(irp); -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ drv_obj = dev_obj->drv_obj; -+ irp_sl->dev_obj = dev_obj; -+ major_func = drv_obj->major_func[irp_sl->major_fn]; -+ IOTRACE("major_func: %p, dev_obj: %p", major_func, dev_obj); -+ if (major_func) -+ status = LIN2WIN2(major_func, dev_obj, irp); -+ else { -+ ERROR("major_function %d is not implemented", -+ irp_sl->major_fn); -+ status = STATUS_NOT_SUPPORTED; -+ } -+ IOEXIT(return status); -+} -+ -+wfastcall void WIN_FUNC(IofCompleteRequest,2) -+ (struct irp *irp, CHAR prio_boost) -+{ -+ struct io_stack_location *irp_sl; -+ -+#ifdef IO_DEBUG -+ DUMP_IRP(irp); -+ if (irp->io_status.status == STATUS_PENDING) { -+ ERROR("invalid irp: %p, STATUS_PENDING", irp); -+ return; -+ } -+ if (irp->current_location < 0 || -+ irp->current_location >= irp->stack_count) { -+ ERROR("invalid irp: %p, %d", irp, irp->current_location); -+ return; -+ } -+#endif -+ for (irp_sl = IoGetCurrentIrpStackLocation(irp); -+ irp->current_location < irp->stack_count; irp_sl++) { -+ struct device_object *dev_obj; -+ NTSTATUS status; -+ -+ DUMP_IRP(irp); -+ if (irp_sl->control & SL_PENDING_RETURNED) -+ irp->pending_returned = TRUE; -+ -+ /* current_location and dev_obj must be same as when -+ * driver called IoSetCompletionRoutine, which sets -+ * completion routine at next (lower) location, which -+ * is what we are going to call below; so we set -+ * current_location and dev_obj for the previous -+ * (higher) location */ -+ IoSkipCurrentIrpStackLocation(irp); -+ if (irp->current_location < irp->stack_count) -+ dev_obj = IoGetCurrentIrpStackLocation(irp)->dev_obj; -+ else -+ dev_obj = NULL; -+ -+ IOTRACE("%d, %d, %p", irp->current_location, irp->stack_count, -+ dev_obj); -+ if (irp_sl->completion_routine && -+ ((irp->io_status.status == STATUS_SUCCESS && -+ irp_sl->control & SL_INVOKE_ON_SUCCESS) || -+ (irp->io_status.status != STATUS_SUCCESS && -+ irp_sl->control & SL_INVOKE_ON_ERROR) || -+ (irp->cancel == TRUE && -+ irp_sl->control & SL_INVOKE_ON_CANCEL))) { -+ IOTRACE("calling completion_routine at: %p, %p", -+ irp_sl->completion_routine, irp_sl->context); -+ status = LIN2WIN3(irp_sl->completion_routine, -+ dev_obj, irp, irp_sl->context); -+ IOTRACE("status: %08X", status); -+ if (status == STATUS_MORE_PROCESSING_REQUIRED) -+ IOEXIT(return); -+ } else { -+ /* propagate pending status to next irp_sl */ -+ if (irp->pending_returned && -+ irp->current_location < irp->stack_count) -+ IoMarkIrpPending(irp); -+ } -+ } -+ -+ if (irp->user_status) { -+ irp->user_status->status = irp->io_status.status; -+ irp->user_status->info = irp->io_status.info; -+ } -+ -+ if (irp->user_event) { -+ IOTRACE("setting event %p", irp->user_event); -+ KeSetEvent(irp->user_event, prio_boost, FALSE); -+ } -+ -+ if (irp->associated_irp.system_buffer && -+ (irp->flags & IRP_DEALLOCATE_BUFFER)) -+ ExFreePool(irp->associated_irp.system_buffer); -+ else { -+ struct mdl *mdl; -+ while ((mdl = irp->mdl)) { -+ irp->mdl = mdl->next; -+ MmUnlockPages(mdl); -+ IoFreeMdl(mdl); -+ } -+ } -+ IOTRACE("freeing irp %p", irp); -+ IoFreeIrp(irp); -+ IOEXIT(return); -+} -+ -+wstdcall NTSTATUS IoPassIrpDown(struct device_object *dev_obj, struct irp *irp) -+{ -+ IoSkipCurrentIrpStackLocation(irp); -+ IOEXIT(return IoCallDriver(dev_obj, irp)); -+} -+ -+wstdcall NTSTATUS IoIrpSyncComplete(struct device_object *dev_obj, -+ struct irp *irp, void *context) -+{ -+ if (irp->pending_returned == TRUE) -+ KeSetEvent(context, IO_NO_INCREMENT, FALSE); -+ IOEXIT(return STATUS_MORE_PROCESSING_REQUIRED); -+} -+WIN_FUNC_DECL(IoIrpSyncComplete,3) -+ -+wstdcall NTSTATUS IoSyncForwardIrp(struct device_object *dev_obj, -+ struct irp *irp) -+{ -+ struct nt_event event; -+ NTSTATUS status; -+ -+ IoCopyCurrentIrpStackLocationToNext(irp); -+ KeInitializeEvent(&event, SynchronizationEvent, FALSE); -+ /* completion function is called as Windows function */ -+ IoSetCompletionRoutine(irp, WIN_FUNC_PTR(IoIrpSyncComplete,3), &event, -+ TRUE, TRUE, TRUE); -+ status = IoCallDriver(dev_obj, irp); -+ IOTRACE("%08X", status); -+ if (status == STATUS_PENDING) { -+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, -+ NULL); -+ status = irp->io_status.status; -+ } -+ IOTRACE("%08X", status); -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(IoSyncForwardIrp,2) -+ -+wstdcall NTSTATUS IoAsyncForwardIrp(struct device_object *dev_obj, -+ struct irp *irp) -+{ -+ NTSTATUS status; -+ -+ IoCopyCurrentIrpStackLocationToNext(irp); -+ status = IoCallDriver(dev_obj, irp); -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(IoAsyncForwardIrp,2) -+ -+wstdcall NTSTATUS IoInvalidDeviceRequest(struct device_object *dev_obj, -+ struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ NTSTATUS status; -+ -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ WARNING("%d:%d not implemented", irp_sl->major_fn, irp_sl->minor_fn); -+ irp->io_status.status = STATUS_SUCCESS; -+ irp->io_status.info = 0; -+ status = irp->io_status.status; -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(IoInvalidDeviceRequest,2) -+ -+static irqreturn_t io_irq_isr(int irq, void *data ISR_PT_REGS_PARAM_DECL) -+{ -+ struct kinterrupt *interrupt = data; -+ BOOLEAN ret; -+ -+#ifdef CONFIG_DEBUG_SHIRQ -+ if (!interrupt->u.enabled) -+ EXIT1(return IRQ_NONE); -+#endif -+ TRACE6("%p", interrupt); -+ nt_spin_lock(interrupt->actual_lock); -+ ret = LIN2WIN2(interrupt->isr, interrupt, interrupt->isr_ctx); -+ nt_spin_unlock(interrupt->actual_lock); -+ if (ret == TRUE) -+ EXIT6(return IRQ_HANDLED); -+ else -+ EXIT6(return IRQ_NONE); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoConnectInterrupt,11) -+ (struct kinterrupt **kinterrupt, PKSERVICE_ROUTINE isr, void *isr_ctx, -+ NT_SPIN_LOCK *lock, ULONG vector, KIRQL irql, KIRQL synch_irql, -+ enum kinterrupt_mode mode, BOOLEAN shared, KAFFINITY cpu_mask, -+ BOOLEAN save_fp) -+{ -+ struct kinterrupt *interrupt; -+ IOENTER(""); -+ interrupt = kzalloc(sizeof(*interrupt), GFP_KERNEL); -+ if (!interrupt) -+ IOEXIT(return STATUS_INSUFFICIENT_RESOURCES); -+ interrupt->vector = vector; -+ interrupt->cpu_mask = cpu_mask; -+ nt_spin_lock_init(&interrupt->lock); -+ if (lock) -+ interrupt->actual_lock = lock; -+ else -+ interrupt->actual_lock = &interrupt->lock; -+ interrupt->shared = shared; -+ interrupt->save_fp = save_fp; -+ interrupt->isr = isr; -+ interrupt->isr_ctx = isr_ctx; -+ InitializeListHead(&interrupt->list); -+ interrupt->irql = irql; -+ interrupt->synch_irql = synch_irql; -+ interrupt->mode = mode; -+ if (request_irq(vector, io_irq_isr, shared ? IRQF_SHARED : 0, -+ DRIVER_NAME, interrupt)) { -+ WARNING("request for irq %d failed", vector); -+ kfree(interrupt); -+ IOEXIT(return STATUS_INSUFFICIENT_RESOURCES); -+ } -+ *kinterrupt = interrupt; -+#ifdef CONFIG_DEBUG_SHIRQ -+ interrupt->u.enabled = 1; -+#endif -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(IoDisconnectInterrupt,1) -+ (struct kinterrupt *interrupt) -+{ -+#ifdef CONFIG_DEBUG_SHIRQ -+ interrupt->u.enabled = 0; -+#endif -+ free_irq(interrupt->vector, interrupt); -+ kfree(interrupt); -+} -+ -+wstdcall struct mdl *WIN_FUNC(IoAllocateMdl,5) -+ (void *virt, ULONG length, BOOLEAN second_buf, BOOLEAN charge_quota, -+ struct irp *irp) -+{ -+ struct mdl *mdl; -+ mdl = allocate_init_mdl(virt, length); -+ if (!mdl) -+ return NULL; -+ if (irp) { -+ if (second_buf == TRUE) { -+ struct mdl *last; -+ -+ last = irp->mdl; -+ while (last->next) -+ last = last->next; -+ last->next = mdl; -+ } else -+ irp->mdl = mdl; -+ } -+ IOTRACE("%p", mdl); -+ return mdl; -+} -+ -+wstdcall void WIN_FUNC(IoFreeMdl,1) -+ (struct mdl *mdl) -+{ -+ IOTRACE("%p", mdl); -+ free_mdl(mdl); -+} -+ -+wstdcall struct io_workitem *WIN_FUNC(IoAllocateWorkItem,1) -+ (struct device_object *dev_obj) -+{ -+ struct io_workitem *io_workitem; -+ -+ IOENTER("%p", dev_obj); -+ io_workitem = kmalloc(sizeof(*io_workitem), irql_gfp()); -+ if (!io_workitem) -+ IOEXIT(return NULL); -+ io_workitem->dev_obj = dev_obj; -+ IOEXIT(return io_workitem); -+} -+ -+wstdcall void WIN_FUNC(IoFreeWorkItem,1) -+ (struct io_workitem *io_workitem) -+{ -+ kfree(io_workitem); -+ IOEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(IoQueueWorkItem,4) -+ (struct io_workitem *io_workitem, void *func, -+ enum work_queue_type queue_type, void *context) -+{ -+ IOENTER("%p, %p", io_workitem, io_workitem->dev_obj); -+ io_workitem->worker_routine = func; -+ io_workitem->context = context; -+ schedule_ntos_work_item(func, io_workitem->dev_obj, context); -+ IOEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(ExQueueWorkItem,2) -+ (struct io_workitem *io_workitem, enum work_queue_type queue_type) -+{ -+ IOENTER("%p", io_workitem); -+ schedule_ntos_work_item(io_workitem->worker_routine, -+ io_workitem->dev_obj, io_workitem->context); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoAllocateDriverObjectExtension,4) -+ (struct driver_object *drv_obj, void *client_id, ULONG extlen, -+ void **ext) -+{ -+ struct custom_ext *ce; -+ -+ IOENTER("%p, %p", drv_obj, client_id); -+ ce = kmalloc(sizeof(*ce) + extlen, irql_gfp()); -+ if (ce == NULL) -+ return STATUS_INSUFFICIENT_RESOURCES; -+ -+ IOTRACE("custom_ext: %p", ce); -+ ce->client_id = client_id; -+ spin_lock_bh(&ntoskernel_lock); -+ InsertTailList(&drv_obj->drv_ext->custom_ext, &ce->list); -+ spin_unlock_bh(&ntoskernel_lock); -+ -+ *ext = (void *)ce + sizeof(*ce); -+ IOTRACE("ext: %p", *ext); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall void *WIN_FUNC(IoGetDriverObjectExtension,2) -+ (struct driver_object *drv_obj, void *client_id) -+{ -+ struct custom_ext *ce; -+ void *ret; -+ -+ IOENTER("drv_obj: %p, client_id: %p", drv_obj, client_id); -+ ret = NULL; -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(ce, &drv_obj->drv_ext->custom_ext, list) { -+ if (ce->client_id == client_id) { -+ ret = (void *)ce + sizeof(*ce); -+ break; -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ IOTRACE("ret: %p", ret); -+ return ret; -+} -+ -+void free_custom_extensions(struct driver_extension *drv_ext) -+{ -+ struct nt_list *ent; -+ -+ IOENTER("%p", drv_ext); -+ spin_lock_bh(&ntoskernel_lock); -+ while ((ent = RemoveHeadList(&drv_ext->custom_ext))) -+ kfree(ent); -+ spin_unlock_bh(&ntoskernel_lock); -+ IOEXIT(return); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoCreateDevice,7) -+ (struct driver_object *drv_obj, ULONG dev_ext_length, -+ struct unicode_string *dev_name, DEVICE_TYPE dev_type, -+ ULONG dev_chars, BOOLEAN exclusive, struct device_object **newdev) -+{ -+ struct device_object *dev; -+ struct dev_obj_ext *dev_obj_ext; -+ int size; -+ -+ IOENTER("%p, %u, %p", drv_obj, dev_ext_length, dev_name); -+ -+ size = sizeof(*dev) + dev_ext_length + sizeof(*dev_obj_ext); -+ dev = allocate_object(size, OBJECT_TYPE_DEVICE, dev_name); -+ if (!dev) -+ IOEXIT(return STATUS_INSUFFICIENT_RESOURCES); -+ if (dev_ext_length) -+ dev->dev_ext = dev + 1; -+ else -+ dev->dev_ext = NULL; -+ -+ dev_obj_ext = ((void *)(dev + 1)) + dev_ext_length; -+ dev_obj_ext->dev_obj = dev; -+ dev_obj_ext->size = 0; -+ dev_obj_ext->type = IO_TYPE_DEVICE; -+ dev->dev_obj_ext = dev_obj_ext; -+ -+ dev->type = dev_type; -+ dev->flags = 0; -+ dev->size = sizeof(*dev) + dev_ext_length; -+ dev->ref_count = 1; -+ dev->attached = NULL; -+ dev->stack_count = 1; -+ -+ dev->drv_obj = drv_obj; -+ dev->next = drv_obj->dev_obj; -+ drv_obj->dev_obj = dev; -+ -+ dev->align_req = 1; -+ dev->characteristics = dev_chars; -+ dev->io_timer = NULL; -+ KeInitializeEvent(&dev->lock, SynchronizationEvent, TRUE); -+ dev->vpb = NULL; -+ -+ IOTRACE("dev: %p, ext: %p", dev, dev->dev_ext); -+ *newdev = dev; -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoCreateUnprotectedSymbolicLink,2) -+ (struct unicode_string *link, struct unicode_string *dev_name) -+{ -+ struct ansi_string ansi; -+ -+ IOENTER("%p, %p", dev_name, link); -+ if (dev_name && (RtlUnicodeStringToAnsiString(&ansi, dev_name, TRUE) == -+ STATUS_SUCCESS)) { -+ IOTRACE("dev_name: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ if (link && (RtlUnicodeStringToAnsiString(&ansi, link, TRUE) == -+ STATUS_SUCCESS)) { -+ IOTRACE("link: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+// TODO(); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoCreateSymbolicLink,2) -+ (struct unicode_string *link, struct unicode_string *dev_name) -+{ -+ IOEXIT(return IoCreateUnprotectedSymbolicLink(link, dev_name)); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoDeleteSymbolicLink,1) -+ (struct unicode_string *link) -+{ -+ struct ansi_string ansi; -+ -+ IOENTER("%p", link); -+ if (link && (RtlUnicodeStringToAnsiString(&ansi, link, TRUE) == -+ STATUS_SUCCESS)) { -+ IOTRACE("dev_name: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(IoDeleteDevice,1) -+ (struct device_object *dev) -+{ -+ IOENTER("%p", dev); -+ if (dev == NULL) -+ IOEXIT(return); -+ IOTRACE("drv_obj: %p", dev->drv_obj); -+ if (dev->drv_obj) { -+ struct device_object *prev; -+ -+ prev = dev->drv_obj->dev_obj; -+ IOTRACE("dev_obj: %p", prev); -+ if (prev == dev) -+ dev->drv_obj->dev_obj = dev->next; -+ else if (prev) { -+ while (prev->next != dev) -+ prev = prev->next; -+ prev->next = dev->next; -+ } -+ } -+ ObDereferenceObject(dev); -+ IOEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(IoDetachDevice,1) -+ (struct device_object *tgt) -+{ -+ struct device_object *tail; -+ -+ IOENTER("%p", tgt); -+ if (!tgt) -+ IOEXIT(return); -+ tail = tgt->attached; -+ if (!tail) -+ IOEXIT(return); -+ IOTRACE("tail: %p", tail); -+ -+ spin_lock_bh(&ntoskernel_lock); -+ tgt->attached = tail->attached; -+ IOTRACE("attached:%p", tgt->attached); -+ for ( ; tail; tail = tail->attached) { -+ IOTRACE("tail:%p", tail); -+ tail->stack_count--; -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ IOEXIT(return); -+} -+ -+wstdcall struct device_object *WIN_FUNC(IoGetAttachedDevice,1) -+ (struct device_object *dev) -+{ -+ IOENTER("%p", dev); -+ if (!dev) -+ IOEXIT(return NULL); -+ spin_lock_bh(&ntoskernel_lock); -+ while (dev->attached) -+ dev = dev->attached; -+ spin_unlock_bh(&ntoskernel_lock); -+ IOEXIT(return dev); -+} -+ -+wstdcall struct device_object *WIN_FUNC(IoGetAttachedDeviceReference,1) -+ (struct device_object *dev) -+{ -+ IOENTER("%p", dev); -+ if (!dev) -+ IOEXIT(return NULL); -+ dev = IoGetAttachedDevice(dev); -+ ObReferenceObject(dev); -+ IOEXIT(return dev); -+} -+ -+wstdcall struct device_object *WIN_FUNC(IoAttachDeviceToDeviceStack,2) -+ (struct device_object *src, struct device_object *tgt) -+{ -+ struct device_object *attached; -+ struct dev_obj_ext *src_dev_ext; -+ -+ IOENTER("%p, %p", src, tgt); -+ attached = IoGetAttachedDevice(tgt); -+ IOTRACE("%p", attached); -+ src_dev_ext = src->dev_obj_ext; -+ spin_lock_bh(&ntoskernel_lock); -+ if (attached) -+ attached->attached = src; -+ src->attached = NULL; -+ src->stack_count = attached->stack_count + 1; -+ src_dev_ext->attached_to = attached; -+ spin_unlock_bh(&ntoskernel_lock); -+ IOTRACE("stack_count: %d -> %d", attached->stack_count, -+ src->stack_count); -+ IOEXIT(return attached); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoGetDeviceProperty,5) -+ (struct device_object *pdo, enum device_registry_property dev_property, -+ ULONG buffer_len, void *buffer, ULONG *result_len) -+{ -+ struct ansi_string ansi; -+ struct unicode_string unicode; -+ struct wrap_device *wd; -+ ULONG need; -+ -+ IOENTER("dev_obj = %p, dev_property = %d, buffer_len = %u, " -+ "buffer = %p, result_len = %p", pdo, dev_property, -+ buffer_len, buffer, result_len); -+ -+ wd = pdo->reserved; -+ switch (dev_property) { -+ case DevicePropertyDeviceDescription: -+ case DevicePropertyFriendlyName: -+ case DevicePropertyDriverKeyName: -+ if (wrap_is_pci_bus(wd->dev_bus)) -+ RtlInitAnsiString(&ansi, "PCI"); -+ else // if (wrap_is_usb_bus(wd->dev_bus)) -+ RtlInitAnsiString(&ansi, "USB"); -+ need = sizeof(wchar_t) * (ansi.max_length + 1); -+ if (buffer_len < need) { -+ *result_len = need; -+ IOEXIT(return STATUS_BUFFER_TOO_SMALL); -+ } -+ unicode.max_length = buffer_len; -+ unicode.buf = buffer; -+ if (RtlAnsiStringToUnicodeString(&unicode, &ansi, -+ FALSE) != STATUS_SUCCESS) { -+ *result_len = unicode.length; -+ IOEXIT(return STATUS_BUFFER_TOO_SMALL); -+ } -+ IOEXIT(return STATUS_SUCCESS); -+ default: -+ WARNING("%d not implemented", dev_property); -+ IOEXIT(return STATUS_INVALID_PARAMETER_2); -+ } -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoGetDeviceObjectPointer,4) -+ (struct unicode_string *name, ACCESS_MASK desired_access, -+ struct file_object *file_obj, struct device_object *dev_obj) -+{ -+ struct common_object_header *coh; -+ -+ dev_obj = NULL; -+ /* TODO: access is not checked and file_obj is filled with zeroes */ -+ spin_lock_bh(&ntoskernel_lock); -+ nt_list_for_each_entry(coh, &object_list, list) { -+ TRACE5("header: %p, type: %d", coh, coh->type); -+ if (coh->type != OBJECT_TYPE_DEVICE) -+ continue; -+ if (!RtlCompareUnicodeString(&coh->name, name, TRUE)) { -+ dev_obj = HEADER_TO_OBJECT(coh); -+ TRACE5("dev_obj: %p", dev_obj); -+ break; -+ } -+ } -+ spin_unlock_bh(&ntoskernel_lock); -+ if (dev_obj) { -+ memset(file_obj, 0, sizeof(*file_obj)); -+ WARNING("file_obj filled with zeroes"); -+ IOEXIT(return STATUS_SUCCESS); -+ } else -+ IOEXIT(return STATUS_OBJECT_NAME_INVALID); -+} -+ -+/* NOTE: Make sure to compile with -freg-struct-return, so gcc will -+ * return union in register, like Windows */ -+wstdcall union power_state WIN_FUNC(PoSetPowerState,3) -+ (struct device_object *dev_obj, enum power_state_type type, -+ union power_state state) -+{ -+ IOEXIT(return state); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(PoCallDriver,2) -+ (struct device_object *dev_obj, struct irp *irp) -+{ -+ return IoCallDriver(dev_obj, irp); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(PoRequestPowerIrp,6) -+ (struct device_object *dev_obj, UCHAR minor_fn, -+ union power_state power_state, void *completion_func, -+ void *context, struct irp **pirp) -+{ -+ struct irp *irp; -+ struct io_stack_location *irp_sl; -+ -+ TRACE1("%p, %d, %p", dev_obj, dev_obj->stack_count, dev_obj->drv_obj); -+ irp = IoAllocateIrp(dev_obj->stack_count, FALSE); -+ if (!irp) -+ return STATUS_INSUFFICIENT_RESOURCES; -+ irp_sl = IoGetNextIrpStackLocation(irp); -+ irp_sl->major_fn = IRP_MJ_POWER; -+ irp_sl->minor_fn = minor_fn; -+ if (minor_fn == IRP_MN_WAIT_WAKE) -+ irp_sl->params.power.type = SystemPowerState; -+ else -+ irp_sl->params.power.type = DevicePowerState; -+ irp_sl->params.power.state = power_state; -+ irp_sl->completion_routine = completion_func; -+ irp->io_status.status = STATUS_NOT_SUPPORTED; -+ *pirp = irp; -+ return PoCallDriver(dev_obj, irp); -+} -+ -+wstdcall void WIN_FUNC(PoStartNextPowerIrp,1) -+ (struct irp *irp) -+{ -+ IOENTER("irp = %p", irp); -+ IOEXIT(return); -+} -+ -+wstdcall void WIN_FUNC(IoInitializeRemoveLockEx,5) -+ (struct io_remove_lock *lock, ULONG alloc_tag, ULONG max_locked_min, -+ ULONG high_mark, ULONG lock_size) -+{ -+ TODO(); -+} -+ -+wstdcall void *WIN_FUNC(IoAllocateErrorLogEntry,2) -+ (void *io_object, UCHAR entry_size) -+{ -+ /* not implemented fully */ -+ void *ret = kmalloc(sizeof(struct io_error_log_packet) + entry_size, -+ irql_gfp()); -+ TRACE2("%p", ret); -+ if (ret) -+ return ret + sizeof(struct io_error_log_packet); -+ else -+ return NULL; -+} -+ -+wstdcall void WIN_FUNC(IoWriteErrorLogEntry,1) -+ (void *entry) -+{ -+ /* TODO: log error with codes and message */ -+ ERROR(""); -+} -+ -+wstdcall void WIN_FUNC(IoFreeErrorLogEntry,1) -+ (void *entry) -+{ -+ TRACE2("%p", entry); -+ kfree(entry - sizeof(struct io_error_log_packet)); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoAcquireRemoveLockEx,5) -+ (struct io_remove_lock *lock, void *tag, char *file, ULONG line, -+ ULONG lock_size) -+{ -+ TODO(); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoReleaseRemoveLockEx,3) -+ (struct io_remove_lock *lock, void *tag, ULONG lock_size) -+{ -+ TODO(); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoRegisterDeviceInterface,4) -+ (struct device_object *pdo, struct guid *guid_class, -+ struct unicode_string *reference, struct unicode_string *link) -+{ -+ struct ansi_string ansi; -+ -+ /* TODO: check if pdo is valid */ -+ RtlInitAnsiString(&ansi, "ndis"); -+ ENTER1("pdo: %p, ref: %p, link: %p, %x, %x, %x", pdo, reference, link, -+ guid_class->data1, guid_class->data2, guid_class->data3); -+ return RtlAnsiStringToUnicodeString(link, &ansi, TRUE); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoSetDeviceInterfaceState,2) -+ (struct unicode_string *link, BOOLEAN enable) -+{ -+ ENTER1("link: %p, enable: %d", link, enable); -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoOpenDeviceRegistryKey,4) -+ (struct device_object *dev_obj, ULONG type, ACCESS_MASK mask, -+ void **handle) -+{ -+ ENTER1("dev_obj: %p", dev_obj); -+ *handle = dev_obj; -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoWMIRegistrationControl,2) -+ (struct device_object *dev_obj, ULONG action) -+{ -+ ENTER2("%p, %d", dev_obj, action); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(IoInvalidateDeviceRelations,2) -+ (struct device_object *dev_obj, enum device_relation_type type) -+{ -+ INFO("%p, %d", dev_obj, type); -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(IoInvalidateDeviceState,1) -+ (struct device_object *pdo) -+{ -+ INFO("%p", pdo); -+ TODO(); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoRegisterPlugPlayNotification,7) -+ (UINT category, ULONG flags, void *data, struct driver_object *object, -+ void *callback, void *context, void **notification_entry) -+{ -+ TRACE2("category: %d, flags 0x%x, data: %p, object: %p, callback: %p, " -+ "context: %p, notification_entry: %p", category, flags, data, -+ object, callback, context, notification_entry); -+ TODO(); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoUnregisterPlugPlayNotification,1) -+ (void *notification_entry) -+{ -+ TRACE2("%p", notification_entry); -+ TODO(); -+ IOEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoWMIOpenBlock,3) -+ (struct guid *guid, ULONG access, void *object) -+{ -+ TODO(); -+ IOEXIT(return STATUS_NOT_IMPLEMENTED); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(IoWMIQueryAllData,3) -+ (void *data_block_object, UINT *buffer_size, void *buffer) -+{ -+ TODO(); -+ IOEXIT(return STATUS_NOT_IMPLEMENTED); -+} -+ -+wstdcall void WIN_FUNC(IoGetStackLimits,2) -+ (ULONG_PTR *LowLimit, ULONG_PTR *HighLimit) -+{ -+ *LowLimit = (ULONG_PTR)&LowLimit & ~(THREAD_SIZE - 1); -+ *HighLimit = *LowLimit + THREAD_SIZE; -+ IOTRACE("LowLimit: 0x%lx, HighLimit: 0x%lx", *LowLimit, *HighLimit); -+ IOEXIT(return); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/pe_linker.c linux-5.6.11-ndis/3rdparty/ndiswrapper/pe_linker.c ---- linux-5.6.11/3rdparty/ndiswrapper/pe_linker.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/pe_linker.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,600 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifdef TEST_LOADER -+ -+#include "usr_linker.h" -+ -+#else -+ -+#include -+#include -+ -+//#define DEBUGLINKER 2 -+ -+#include "ntoskernel.h" -+ -+#endif -+ -+struct pe_exports { -+ char *dll; -+ char *name; -+ generic_func addr; -+}; -+ -+static struct pe_exports pe_exports[40]; -+static int num_pe_exports; -+ -+#define RVA2VA(image, rva, type) (type)(ULONG_PTR)((void *)image + rva) -+#define CHECK_SZ(a,b) { if (sizeof(a) != b) { \ -+ ERROR("%s is bad, got %zd, expected %d", \ -+ #a , sizeof(a), (b)); return -EINVAL; } } -+ -+#if defined(DEBUGLINKER) && DEBUGLINKER > 0 -+#define DBGLINKER(fmt, ...) printk(KERN_INFO "%s (%s:%d): " fmt "\n", \ -+ DRIVER_NAME, __func__, \ -+ __LINE__ , ## __VA_ARGS__); -+static const char *image_directory_name[] = { -+ "EXPORT", -+ "IMPORT", -+ "RESOURCE", -+ "EXCEPTION", -+ "SECURITY", -+ "BASERELOC", -+ "DEBUG", -+ "COPYRIGHT", -+ "GLOBALPTR", -+ "TLS", -+ "LOAD_CONFIG", -+ "BOUND_IMPORT", -+ "IAT", -+ "DELAY_IMPORT", -+ "COM_DESCRIPTOR" }; -+#else -+#define DBGLINKER(fmt, ...) do { } while (0) -+#endif -+ -+#ifndef TEST_LOADER -+extern struct wrap_export ntoskernel_exports[], ntoskernel_io_exports[], -+ ndis_exports[], crt_exports[], hal_exports[], rtl_exports[]; -+#ifdef ENABLE_USB -+extern struct wrap_export usb_exports[]; -+#endif -+ -+static int get_export(char *name, generic_func *func) -+{ -+ int i, j; -+ -+ struct wrap_export *exports[] = { -+ ntoskernel_exports, -+ ntoskernel_io_exports, -+ ndis_exports, -+ crt_exports, -+ hal_exports, -+ rtl_exports, -+#ifdef ENABLE_USB -+ usb_exports, -+#endif -+ }; -+ -+ for (j = 0; j < ARRAY_SIZE(exports); j++) -+ for (i = 0; exports[j][i].name != NULL; i++) -+ if (strcmp(exports[j][i].name, name) == 0) { -+ *func = exports[j][i].func; -+ return 0; -+ } -+ -+ for (i = 0; i < num_pe_exports; i++) -+ if (strcmp(pe_exports[i].name, name) == 0) { -+ *func = pe_exports[i].addr; -+ return 0; -+ } -+ -+ return -1; -+} -+#endif // TEST_LOADER -+ -+static void *get_dll_init(char *name) -+{ -+ int i; -+ for (i = 0; i < num_pe_exports; i++) -+ if ((strcmp(pe_exports[i].dll, name) == 0) && -+ (strcmp(pe_exports[i].name, "DllInitialize") == 0)) -+ return (void *)pe_exports[i].addr; -+ return NULL; -+} -+ -+/* -+ * Find and validate the coff header -+ * -+ */ -+static int check_nt_hdr(IMAGE_NT_HEADERS *nt_hdr) -+{ -+ int i; -+ WORD attr; -+ PIMAGE_OPTIONAL_HEADER opt_hdr; -+ -+ /* Validate the "PE\0\0" signature */ -+ if (nt_hdr->Signature != IMAGE_NT_SIGNATURE) { -+ ERROR("is this driver file? bad signature %08x", -+ nt_hdr->Signature); -+ return -EINVAL; -+ } -+ -+ opt_hdr = &nt_hdr->OptionalHeader; -+ /* Make sure Image is PE32 or PE32+ */ -+#ifdef CONFIG_X86_64 -+ if (opt_hdr->Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) { -+ ERROR("kernel is 64-bit, but Windows driver is not 64-bit;" -+ "bad magic: %04X", opt_hdr->Magic); -+ return -EINVAL; -+ } -+#else -+ if (opt_hdr->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) { -+ ERROR("kernel is 32-bit, but Windows driver is not 32-bit;" -+ "bad magic: %04X", opt_hdr->Magic); -+ return -EINVAL; -+ } -+#endif -+ -+ /* Validate the image for the current architecture. */ -+#ifdef CONFIG_X86_64 -+ if (nt_hdr->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64) { -+ ERROR("kernel is 64-bit, but Windows driver is not 64-bit;" -+ " (PE signature is %04X)", nt_hdr->FileHeader.Machine); -+ return -EINVAL; -+ } -+#else -+ if (nt_hdr->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) { -+ ERROR("kernel is 32-bit, but Windows driver is not 32-bit;" -+ " (PE signature is %04X)", nt_hdr->FileHeader.Machine); -+ return -EINVAL; -+ } -+#endif -+ -+ /* Must have attributes */ -+#ifdef CONFIG_X86_64 -+ attr = IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LARGE_ADDRESS_AWARE; -+#else -+ attr = IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_32BIT_MACHINE; -+#endif -+ if ((nt_hdr->FileHeader.Characteristics & attr) != attr) -+ return -EINVAL; -+ -+ /* Must be relocatable */ -+ attr = IMAGE_FILE_RELOCS_STRIPPED; -+ if ((nt_hdr->FileHeader.Characteristics & attr)) -+ return -EINVAL; -+ -+ /* Make sure we have at least one section */ -+ if (nt_hdr->FileHeader.NumberOfSections == 0) -+ return -EINVAL; -+ -+ if (opt_hdr->SectionAlignment < opt_hdr->FileAlignment) { -+ ERROR("alignment mismatch: section: 0x%x, file: 0x%x", -+ opt_hdr->SectionAlignment, opt_hdr->FileAlignment); -+ return -EINVAL; -+ } -+ -+ DBGLINKER("number of datadictionary entries %d", -+ opt_hdr->NumberOfRvaAndSizes); -+ for (i = 0; i < opt_hdr->NumberOfRvaAndSizes; i++) { -+ DBGLINKER("datadirectory %s RVA:%X Size:%d", -+ (i <= IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR) ? -+ image_directory_name[i] : "unknown", -+ opt_hdr->DataDirectory[i].VirtualAddress, -+ opt_hdr->DataDirectory[i].Size); -+ } -+ -+ if ((nt_hdr->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)) -+ return IMAGE_FILE_EXECUTABLE_IMAGE; -+ if ((nt_hdr->FileHeader.Characteristics & IMAGE_FILE_DLL)) -+ return IMAGE_FILE_DLL; -+ return -EINVAL; -+} -+ -+static int import(void *image, IMAGE_IMPORT_DESCRIPTOR *dirent, char *dll) -+{ -+ ULONG_PTR *lookup_tbl, *address_tbl; -+ char *symname = NULL; -+ int i; -+ int ret = 0; -+ generic_func adr; -+ -+ lookup_tbl = RVA2VA(image, dirent->u.OriginalFirstThunk, ULONG_PTR *); -+ address_tbl = RVA2VA(image, dirent->FirstThunk, ULONG_PTR *); -+ -+ for (i = 0; lookup_tbl[i]; i++) { -+ if (IMAGE_SNAP_BY_ORDINAL(lookup_tbl[i])) { -+ ERROR("ordinal import not supported: %llu", -+ (uint64_t)lookup_tbl[i]); -+ return -1; -+ } -+ else { -+ symname = RVA2VA(image, -+ ((lookup_tbl[i] & -+ ~IMAGE_ORDINAL_FLAG) + 2), char *); -+ } -+ -+ if (get_export(symname, &adr) < 0) { -+ ERROR("unknown symbol: %s:'%s'", dll, symname); -+ ret = -1; -+ } else { -+ DBGLINKER("found symbol: %s:%s: addr: %p, rva = %llu", -+ dll, symname, adr, (uint64_t)address_tbl[i]); -+ address_tbl[i] = (ULONG_PTR)adr; -+ } -+ } -+ return ret; -+} -+ -+static int read_exports(struct pe_image *pe) -+{ -+ IMAGE_EXPORT_DIRECTORY *export_dir_table; -+ uint32_t *export_addr_table; -+ int i; -+ uint32_t *name_table; -+ PIMAGE_OPTIONAL_HEADER opt_hdr; -+ IMAGE_DATA_DIRECTORY *export_data_dir; -+ -+ opt_hdr = &pe->nt_hdr->OptionalHeader; -+ export_data_dir = -+ &opt_hdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; -+ -+ if (export_data_dir->Size == 0) { -+ DBGLINKER("no exports"); -+ return 0; -+ } -+ -+ export_dir_table = -+ RVA2VA(pe->image, export_data_dir->VirtualAddress, -+ IMAGE_EXPORT_DIRECTORY *); -+ -+ name_table = (unsigned int *)(pe->image + -+ export_dir_table->AddressOfNames); -+ export_addr_table = (uint32_t *) -+ (pe->image + export_dir_table->AddressOfFunctions); -+ -+ for (i = 0; i < export_dir_table->NumberOfNames; i++) { -+ -+ if (export_data_dir->VirtualAddress <= *export_addr_table || -+ *export_addr_table >= (export_data_dir->VirtualAddress + -+ export_data_dir->Size)) -+ DBGLINKER("forwarder rva"); -+ -+ DBGLINKER("export symbol: %s, at %p", -+ (char *)(pe->image + *name_table), -+ pe->image + *export_addr_table); -+ -+ pe_exports[num_pe_exports].dll = pe->name; -+ pe_exports[num_pe_exports].name = pe->image + *name_table; -+ pe_exports[num_pe_exports].addr = -+ pe->image + *export_addr_table; -+ -+ num_pe_exports++; -+ name_table++; -+ export_addr_table++; -+ } -+ return 0; -+} -+ -+static int fixup_imports(void *image, IMAGE_NT_HEADERS *nt_hdr) -+{ -+ int i; -+ char *name; -+ int ret = 0; -+ IMAGE_IMPORT_DESCRIPTOR *dirent; -+ IMAGE_DATA_DIRECTORY *import_data_dir; -+ PIMAGE_OPTIONAL_HEADER opt_hdr; -+ -+ opt_hdr = &nt_hdr->OptionalHeader; -+ import_data_dir = -+ &opt_hdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; -+ dirent = RVA2VA(image, import_data_dir->VirtualAddress, -+ IMAGE_IMPORT_DESCRIPTOR *); -+ -+ for (i = 0; dirent[i].Name; i++) { -+ name = RVA2VA(image, dirent[i].Name, char*); -+ -+ DBGLINKER("imports from dll: %s", name); -+ ret += import(image, &dirent[i], name); -+ } -+ return ret; -+} -+ -+static int fixup_reloc(void *image, IMAGE_NT_HEADERS *nt_hdr) -+{ -+ ULONG_PTR base; -+ ULONG_PTR size; -+ IMAGE_BASE_RELOCATION *fixup_block; -+ IMAGE_DATA_DIRECTORY *base_reloc_data_dir; -+ PIMAGE_OPTIONAL_HEADER opt_hdr; -+ -+ opt_hdr = &nt_hdr->OptionalHeader; -+ base = opt_hdr->ImageBase; -+ base_reloc_data_dir = -+ &opt_hdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; -+ if (base_reloc_data_dir->Size == 0) -+ return 0; -+ -+ fixup_block = RVA2VA(image, base_reloc_data_dir->VirtualAddress, -+ IMAGE_BASE_RELOCATION *); -+ DBGLINKER("fixup_block=%p, image=%p", fixup_block, image); -+ DBGLINKER("fixup_block info: %x %d", -+ fixup_block->VirtualAddress, fixup_block->SizeOfBlock); -+ -+ while (fixup_block->SizeOfBlock) { -+ int i; -+ WORD fixup, offset; -+ -+ size = (fixup_block->SizeOfBlock - -+ sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD); -+ DBGLINKER("found %llu relocations in this block", -+ (uint64_t)size); -+ -+ for (i = 0; i < size; i++) { -+ fixup = fixup_block->TypeOffset[i]; -+ offset = fixup & 0xfff; -+ switch ((fixup >> 12) & 0x0f) { -+ case IMAGE_REL_BASED_ABSOLUTE: -+ break; -+ -+ case IMAGE_REL_BASED_HIGHLOW: { -+ uint32_t addr; -+ uint32_t *loc = -+ RVA2VA(image, -+ fixup_block->VirtualAddress + -+ offset, uint32_t *); -+ addr = RVA2VA(image, (*loc - base), uint32_t); -+ DBGLINKER("relocation: *%p (Val:%X)= %X", -+ loc, *loc, addr); -+ *loc = addr; -+ } -+ break; -+ -+ case IMAGE_REL_BASED_DIR64: { -+ uint64_t addr; -+ uint64_t *loc = -+ RVA2VA(image, -+ fixup_block->VirtualAddress + -+ offset, uint64_t *); -+ addr = RVA2VA(image, (*loc - base), uint64_t); -+ DBGLINKER("relocation: *%p (Val:%llX)= %llx", -+ loc, *loc, addr); -+ *loc = addr; -+ } -+ break; -+ -+ default: -+ ERROR("unknown fixup: %08X", -+ (fixup >> 12) & 0x0f); -+ return -EOPNOTSUPP; -+ break; -+ } -+ } -+ DBGLINKER("finished relocating block"); -+ -+ fixup_block = (IMAGE_BASE_RELOCATION *) -+ ((void *)fixup_block + fixup_block->SizeOfBlock); -+ }; -+ DBGLINKER("done relocating all"); -+ -+ return 0; -+} -+ -+/* Expand the image in memory if necessary. The image on disk does not -+ * necessarily maps the image of the driver in memory, so we have to -+ * re-write it in order to fulfill the sections alignments. The -+ * advantage to do that is that rva_to_va becomes a simple -+ * addition. */ -+static int fix_pe_image(struct pe_image *pe) -+{ -+ void *image; -+ IMAGE_SECTION_HEADER *sect_hdr; -+ int i, sections; -+ int image_size; -+ -+ if (pe->size == pe->opt_hdr->SizeOfImage) { -+ /* Nothing to do */ -+ return 0; -+ } -+ -+ image_size = pe->opt_hdr->SizeOfImage; -+#ifdef CONFIG_X86_64 -+#ifdef PAGE_KERNEL_EXECUTABLE -+ image = __vmalloc(image_size, GFP_KERNEL | __GFP_HIGHMEM -+ ); -+#elif defined PAGE_KERNEL_EXEC -+ image = __vmalloc(image_size, GFP_KERNEL | __GFP_HIGHMEM -+ ); -+#else -+#error x86_64 should have either PAGE_KERNEL_EXECUTABLE or PAGE_KERNEL_EXEC -+#endif -+#else -+#ifdef cpu_has_nx -+ /* hate to play with kernel macros, but PAGE_KERNEL_EXEC is -+ * not available to modules! */ -+ if (cpu_has_nx) -+ image = __vmalloc(image_size, GFP_KERNEL | __GFP_HIGHMEM -+ ); -+ else -+ image = vmalloc(image_size); -+#else -+ image = vmalloc(image_size); -+#endif -+#endif -+ if (image == NULL) { -+ ERROR("failed to allocate enough space for new image:" -+ " %d bytes", image_size); -+ return -ENOMEM; -+ } -+ memset(image, 0, image_size); -+ -+ /* Copy all the headers, ie everything before the first section. */ -+ -+ sections = pe->nt_hdr->FileHeader.NumberOfSections; -+ sect_hdr = IMAGE_FIRST_SECTION(pe->nt_hdr); -+ -+ DBGLINKER("copying headers: %u bytes", sect_hdr->PointerToRawData); -+ -+ memcpy(image, pe->image, sect_hdr->PointerToRawData); -+ -+ /* Copy all the sections */ -+ for (i = 0; i < sections; i++) { -+ DBGLINKER("Copy section %s from %x to %x", -+ sect_hdr->Name, sect_hdr->PointerToRawData, -+ sect_hdr->VirtualAddress); -+ if (sect_hdr->VirtualAddress+sect_hdr->SizeOfRawData > -+ image_size) { -+ ERROR("Invalid section %s in driver", sect_hdr->Name); -+ vfree(image); -+ return -EINVAL; -+ } -+ -+ memcpy(image+sect_hdr->VirtualAddress, -+ pe->image + sect_hdr->PointerToRawData, -+ sect_hdr->SizeOfRawData); -+ sect_hdr++; -+ } -+ -+ vfree(pe->image); -+ pe->image = image; -+ pe->size = image_size; -+ -+ /* Update our internal pointers */ -+ pe->nt_hdr = (IMAGE_NT_HEADERS *) -+ (pe->image + ((IMAGE_DOS_HEADER *)pe->image)->e_lfanew); -+ pe->opt_hdr = &pe->nt_hdr->OptionalHeader; -+ -+ DBGLINKER("set nt headers: nt_hdr=%p, opt_hdr=%p, image=%p", -+ pe->nt_hdr, pe->opt_hdr, pe->image); -+ -+ return 0; -+} -+ -+#if defined(CONFIG_X86_64) -+static void fix_user_shared_data_addr(char *driver, unsigned long length) -+{ -+ unsigned long i, n, max_addr, *addr; -+ -+ TRACE1("fixing KI_USER_SHARED_DATA address in the driver"); -+ n = length - sizeof(unsigned long); -+ max_addr = KI_USER_SHARED_DATA + sizeof(kuser_shared_data); -+ for (i = 0; i < n; i++) { -+ addr = (unsigned long *)(driver + i); -+ if (*addr >= KI_USER_SHARED_DATA && *addr < max_addr) { -+ *addr -= KI_USER_SHARED_DATA; -+ *addr += (unsigned long)&kuser_shared_data; -+ kuser_shared_data.reserved1 = 1; -+ } -+ } -+} -+#endif -+ -+int link_pe_images(struct pe_image *pe_image, unsigned short n) -+{ -+ int i; -+ struct pe_image *pe; -+ -+#if DEBUG >= 1 -+ /* Sanity checks */ -+ CHECK_SZ(IMAGE_SECTION_HEADER, IMAGE_SIZEOF_SECTION_HEADER); -+ CHECK_SZ(IMAGE_FILE_HEADER, IMAGE_SIZEOF_FILE_HEADER); -+ CHECK_SZ(IMAGE_OPTIONAL_HEADER, IMAGE_SIZEOF_NT_OPTIONAL_HEADER); -+ CHECK_SZ(IMAGE_NT_HEADERS, 4 + IMAGE_SIZEOF_FILE_HEADER + -+ IMAGE_SIZEOF_NT_OPTIONAL_HEADER); -+ CHECK_SZ(IMAGE_DOS_HEADER, 0x40); -+ CHECK_SZ(IMAGE_EXPORT_DIRECTORY, 40); -+ CHECK_SZ(IMAGE_BASE_RELOCATION, 8); -+ CHECK_SZ(IMAGE_IMPORT_DESCRIPTOR, 20); -+#endif -+ -+ for (i = 0; i < n; i++) { -+ IMAGE_DOS_HEADER *dos_hdr; -+ pe = &pe_image[i]; -+ dos_hdr = pe->image; -+ -+ if (pe->size < sizeof(IMAGE_DOS_HEADER)) { -+ TRACE1("image too small: %d", pe->size); -+ return -EINVAL; -+ } -+ -+ pe->nt_hdr = -+ (IMAGE_NT_HEADERS *)(pe->image + dos_hdr->e_lfanew); -+ pe->opt_hdr = &pe->nt_hdr->OptionalHeader; -+ -+ pe->type = check_nt_hdr(pe->nt_hdr); -+ if (pe->type <= 0) { -+ TRACE1("type <= 0"); -+ return -EINVAL; -+ } -+ -+ if (fix_pe_image(pe)) { -+ TRACE1("bad PE image"); -+ return -EINVAL; -+ } -+ -+ if (read_exports(pe)) { -+ TRACE1("read exports failed"); -+ return -EINVAL; -+ } -+ } -+ -+ for (i = 0; i < n; i++) { -+ pe = &pe_image[i]; -+ -+ if (fixup_reloc(pe->image, pe->nt_hdr)) { -+ TRACE1("fixup reloc failed"); -+ return -EINVAL; -+ } -+ if (fixup_imports(pe->image, pe->nt_hdr)) { -+ TRACE1("fixup imports failed"); -+ return -EINVAL; -+ } -+#if defined(CONFIG_X86_64) -+ fix_user_shared_data_addr(pe_image[i].image, pe_image[i].size); -+#endif -+ flush_icache_range((unsigned long)pe->image, pe->size); -+ -+ pe->entry = -+ RVA2VA(pe->image, -+ pe->opt_hdr->AddressOfEntryPoint, void *); -+ TRACE1("entry is at %p, rva at %08X", pe->entry, -+ pe->opt_hdr->AddressOfEntryPoint); -+ } -+ -+ for (i = 0; i < n; i++) { -+ pe = &pe_image[i]; -+ -+ if (pe->type == IMAGE_FILE_DLL) { -+ struct unicode_string ustring; -+ char *buf = "0/0t0m0p00"; -+ int (*dll_entry)(struct unicode_string *ustring) -+ wstdcall; -+ -+ memset(&ustring, 0, sizeof(ustring)); -+ ustring.buf = (wchar_t *)buf; -+ dll_entry = (void *)get_dll_init(pe->name); -+ -+ TRACE1("calling dll_init at %p", dll_entry); -+ if (!dll_entry || dll_entry(&ustring)) -+ ERROR("DLL initialize failed for %s", -+ pe->name); -+ } -+ else if (pe->type != IMAGE_FILE_EXECUTABLE_IMAGE) -+ ERROR("illegal image type: %d", pe->type); -+ } -+ return 0; -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/pe_linker.h linux-5.6.11-ndis/3rdparty/ndiswrapper/pe_linker.h ---- linux-5.6.11/3rdparty/ndiswrapper/pe_linker.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/pe_linker.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,992 @@ -+/* -+ * This file is an excerpt of winnt.h from WINE, which bears the -+ * following copyright: -+ * -+ * Win32 definitions for Windows NT -+ * -+ * Copyright 1996 Alexandre Julliard -+ * -+ * This library is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * This library is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with this library; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+/* -+ * File formats definitions -+ */ -+typedef struct _IMAGE_DOS_HEADER { -+ WORD e_magic; /* 00: MZ Header signature */ -+ WORD e_cblp; /* 02: Bytes on last page of file */ -+ WORD e_cp; /* 04: Pages in file */ -+ WORD e_crlc; /* 06: Relocations */ -+ WORD e_cparhdr; /* 08: Size of header in paragraphs */ -+ WORD e_minalloc; /* 0a: Minimum extra paragraphs needed */ -+ WORD e_maxalloc; /* 0c: Maximum extra paragraphs needed */ -+ WORD e_ss; /* 0e: Initial (relative) SS value */ -+ WORD e_sp; /* 10: Initial SP value */ -+ WORD e_csum; /* 12: Checksum */ -+ WORD e_ip; /* 14: Initial IP value */ -+ WORD e_cs; /* 16: Initial (relative) CS value */ -+ WORD e_lfarlc; /* 18: File address of relocation table */ -+ WORD e_ovno; /* 1a: Overlay number */ -+ WORD e_res[4]; /* 1c: Reserved words */ -+ WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */ -+ WORD e_oeminfo; /* 26: OEM information; e_oemid specific */ -+ WORD e_res2[10]; /* 28: Reserved words */ -+ DWORD e_lfanew; /* 3c: Offset to extended header */ -+} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; -+ -+#define IMAGE_DOS_SIGNATURE 0x5A4D /* MZ */ -+#define IMAGE_OS2_SIGNATURE 0x454E /* NE */ -+#define IMAGE_OS2_SIGNATURE_LE 0x454C /* LE */ -+#define IMAGE_OS2_SIGNATURE_LX 0x584C /* LX */ -+#define IMAGE_VXD_SIGNATURE 0x454C /* LE */ -+#define IMAGE_NT_SIGNATURE 0x00004550 /* PE00 */ -+ -+/* -+ * This is the Windows executable (NE) header. -+ * the name IMAGE_OS2_HEADER is misleading, but in the SDK this way. -+ */ -+typedef struct -+{ -+ WORD ne_magic; /* 00 NE signature 'NE' */ -+ BYTE ne_ver; /* 02 Linker version number */ -+ BYTE ne_rev; /* 03 Linker revision number */ -+ WORD ne_enttab; /* 04 Offset to entry table relative to NE */ -+ WORD ne_cbenttab; /* 06 Length of entry table in bytes */ -+ LONG ne_crc; /* 08 Checksum */ -+ WORD ne_flags; /* 0c Flags about segments in this file */ -+ WORD ne_autodata; /* 0e Automatic data segment number */ -+ WORD ne_heap; /* 10 Initial size of local heap */ -+ WORD ne_stack; /* 12 Initial size of stack */ -+ DWORD ne_csip; /* 14 Initial CS:IP */ -+ DWORD ne_sssp; /* 18 Initial SS:SP */ -+ WORD ne_cseg; /* 1c # of entries in segment table */ -+ WORD ne_cmod; /* 1e # of entries in module reference tab. */ -+ WORD ne_cbnrestab; /* 20 Length of nonresident-name table */ -+ WORD ne_segtab; /* 22 Offset to segment table */ -+ WORD ne_rsrctab; /* 24 Offset to resource table */ -+ WORD ne_restab; /* 26 Offset to resident-name table */ -+ WORD ne_modtab; /* 28 Offset to module reference table */ -+ WORD ne_imptab; /* 2a Offset to imported name table */ -+ DWORD ne_nrestab; /* 2c Offset to nonresident-name table */ -+ WORD ne_cmovent; /* 30 # of movable entry points */ -+ WORD ne_align; /* 32 Logical sector alignment shift count */ -+ WORD ne_cres; /* 34 # of resource segments */ -+ BYTE ne_exetyp; /* 36 Flags indicating target OS */ -+ BYTE ne_flagsothers; /* 37 Additional information flags */ -+ WORD ne_pretthunks; /* 38 Offset to return thunks */ -+ WORD ne_psegrefbytes; /* 3a Offset to segment ref. bytes */ -+ WORD ne_swaparea; /* 3c Reserved by Microsoft */ -+ WORD ne_expver; /* 3e Expected Windows version number */ -+} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; -+ -+typedef struct _IMAGE_VXD_HEADER { -+ WORD e32_magic; -+ BYTE e32_border; -+ BYTE e32_worder; -+ DWORD e32_level; -+ WORD e32_cpu; -+ WORD e32_os; -+ DWORD e32_ver; -+ DWORD e32_mflags; -+ DWORD e32_mpages; -+ DWORD e32_startobj; -+ DWORD e32_eip; -+ DWORD e32_stackobj; -+ DWORD e32_esp; -+ DWORD e32_pagesize; -+ DWORD e32_lastpagesize; -+ DWORD e32_fixupsize; -+ DWORD e32_fixupsum; -+ DWORD e32_ldrsize; -+ DWORD e32_ldrsum; -+ DWORD e32_objtab; -+ DWORD e32_objcnt; -+ DWORD e32_objmap; -+ DWORD e32_itermap; -+ DWORD e32_rsrctab; -+ DWORD e32_rsrccnt; -+ DWORD e32_restab; -+ DWORD e32_enttab; -+ DWORD e32_dirtab; -+ DWORD e32_dircnt; -+ DWORD e32_fpagetab; -+ DWORD e32_frectab; -+ DWORD e32_impmod; -+ DWORD e32_impmodcnt; -+ DWORD e32_impproc; -+ DWORD e32_pagesum; -+ DWORD e32_datapage; -+ DWORD e32_preload; -+ DWORD e32_nrestab; -+ DWORD e32_cbnrestab; -+ DWORD e32_nressum; -+ DWORD e32_autodata; -+ DWORD e32_debuginfo; -+ DWORD e32_debuglen; -+ DWORD e32_instpreload; -+ DWORD e32_instdemand; -+ DWORD e32_heapsize; -+ BYTE e32_res3[12]; -+ DWORD e32_winresoff; -+ DWORD e32_winreslen; -+ WORD e32_devid; -+ WORD e32_ddkver; -+} IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER; -+ -+/* These defines describe the meanings of the bits in the -+ Characteristics field */ -+ -+#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */ -+#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 -+#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -+#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 -+#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 -+#define IMAGE_FILE_16BIT_MACHINE 0x0040 -+#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 -+#define IMAGE_FILE_32BIT_MACHINE 0x0100 -+#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 -+#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 -+#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 -+#define IMAGE_FILE_SYSTEM 0x1000 -+#define IMAGE_FILE_DLL 0x2000 -+#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 -+#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 -+ -+/* These are the settings of the Machine field. */ -+#define IMAGE_FILE_MACHINE_UNKNOWN 0 -+#define IMAGE_FILE_MACHINE_I860 0x014d -+#define IMAGE_FILE_MACHINE_I386 0x014c -+#define IMAGE_FILE_MACHINE_R3000 0x0162 -+#define IMAGE_FILE_MACHINE_R4000 0x0166 -+#define IMAGE_FILE_MACHINE_R10000 0x0168 -+#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 -+#define IMAGE_FILE_MACHINE_ALPHA 0x0184 -+#define IMAGE_FILE_MACHINE_SH3 0x01a2 -+#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3 -+#define IMAGE_FILE_MACHINE_SH3E 0x01a4 -+#define IMAGE_FILE_MACHINE_SH4 0x01a6 -+#define IMAGE_FILE_MACHINE_SH5 0x01a8 -+#define IMAGE_FILE_MACHINE_ARM 0x01c0 -+#define IMAGE_FILE_MACHINE_THUMB 0x01c2 -+#define IMAGE_FILE_MACHINE_AM33 0x01d3 -+#define IMAGE_FILE_MACHINE_POWERPC 0x01f0 -+#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1 -+#define IMAGE_FILE_MACHINE_IA64 0x0200 -+#define IMAGE_FILE_MACHINE_MIPS16 0x0266 -+#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 -+#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 -+#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 -+#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64 -+#define IMAGE_FILE_MACHINE_TRICORE 0x0520 -+#define IMAGE_FILE_MACHINE_CEF 0x0cef -+#define IMAGE_FILE_MACHINE_EBC 0x0ebc -+#define IMAGE_FILE_MACHINE_AMD64 0x8664 -+#define IMAGE_FILE_MACHINE_M32R 0x9041 -+#define IMAGE_FILE_MACHINE_CEE 0xc0ee -+ -+#define IMAGE_SIZEOF_FILE_HEADER 20 -+#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 -+#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 -+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER32 224 -+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER64 240 -+#define IMAGE_SIZEOF_SHORT_NAME 8 -+#define IMAGE_SIZEOF_SECTION_HEADER 40 -+#define IMAGE_SIZEOF_SYMBOL 18 -+#define IMAGE_SIZEOF_AUX_SYMBOL 18 -+#define IMAGE_SIZEOF_RELOCATION 10 -+#define IMAGE_SIZEOF_BASE_RELOCATION 8 -+#define IMAGE_SIZEOF_LINENUMBER 6 -+#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 -+ -+/* Possible Magic values */ -+#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b -+#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b -+#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x0107 -+ -+#ifdef CONFIG_X86_64 -+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL_HEADER64 -+#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC -+#else -+#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL_HEADER32 -+#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC -+#endif -+ -+/* These are indexes into the DataDirectory array */ -+#define IMAGE_FILE_EXPORT_DIRECTORY 0 -+#define IMAGE_FILE_IMPORT_DIRECTORY 1 -+#define IMAGE_FILE_RESOURCE_DIRECTORY 2 -+#define IMAGE_FILE_EXCEPTION_DIRECTORY 3 -+#define IMAGE_FILE_SECURITY_DIRECTORY 4 -+#define IMAGE_FILE_BASE_RELOCATION_TABLE 5 -+#define IMAGE_FILE_DEBUG_DIRECTORY 6 -+#define IMAGE_FILE_DESCRIPTION_STRING 7 -+#define IMAGE_FILE_MACHINE_VALUE 8 /* Mips */ -+#define IMAGE_FILE_THREAD_LOCAL_STORAGE 9 -+#define IMAGE_FILE_CALLBACK_DIRECTORY 10 -+ -+/* Directory Entries, indices into the DataDirectory array */ -+ -+#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 -+#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 -+#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 -+#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 -+#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 -+#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 -+#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 -+#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 -+#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 /* (MIPS GP) */ -+#define IMAGE_DIRECTORY_ENTRY_TLS 9 -+#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 -+#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 -+#define IMAGE_DIRECTORY_ENTRY_IAT 12 /* Import Address Table */ -+#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 -+#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 -+ -+/* Subsystem Values */ -+ -+#define IMAGE_SUBSYSTEM_UNKNOWN 0 -+#define IMAGE_SUBSYSTEM_NATIVE 1 -+#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 /* Windows GUI subsystem */ -+#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 /* Windows character subsystem */ -+#define IMAGE_SUBSYSTEM_OS2_CUI 5 -+#define IMAGE_SUBSYSTEM_POSIX_CUI 7 -+#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 /* native Win9x driver */ -+#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 /* Windows CE subsystem */ -+#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 -+#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 -+#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 -+#define IMAGE_SUBSYSTEM_EFI_ROM 13 -+#define IMAGE_SUBSYSTEM_XBOX 14 -+ -+typedef struct _IMAGE_FILE_HEADER { -+ WORD Machine; -+ WORD NumberOfSections; -+ DWORD TimeDateStamp; -+ DWORD PointerToSymbolTable; -+ DWORD NumberOfSymbols; -+ WORD SizeOfOptionalHeader; -+ WORD Characteristics; -+} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; -+ -+typedef struct _IMAGE_DATA_DIRECTORY { -+ DWORD VirtualAddress; -+ DWORD Size; -+} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; -+ -+#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 -+ -+typedef struct _IMAGE_OPTIONAL_HEADER32 { -+ -+ /* Standard fields */ -+ -+ WORD Magic; -+ BYTE MajorLinkerVersion; -+ BYTE MinorLinkerVersion; -+ DWORD SizeOfCode; -+ DWORD SizeOfInitializedData; -+ DWORD SizeOfUninitializedData; -+ DWORD AddressOfEntryPoint; -+ DWORD BaseOfCode; -+ DWORD BaseOfData; -+ -+ /* NT additional fields */ -+ DWORD ImageBase; -+ DWORD SectionAlignment; -+ DWORD FileAlignment; -+ WORD MajorOperatingSystemVersion; -+ WORD MinorOperatingSystemVersion; -+ WORD MajorImageVersion; -+ WORD MinorImageVersion; -+ WORD MajorSubsystemVersion; -+ WORD MinorSubsystemVersion; -+ DWORD Win32VersionValue; -+ DWORD SizeOfImage; -+ DWORD SizeOfHeaders; -+ DWORD CheckSum; -+ WORD Subsystem; -+ WORD DllCharacteristics; -+ DWORD SizeOfStackReserve; -+ DWORD SizeOfStackCommit; -+ DWORD SizeOfHeapReserve; -+ DWORD SizeOfHeapCommit; -+ DWORD LoaderFlags; -+ DWORD NumberOfRvaAndSizes; -+ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -+} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; -+ -+typedef struct _IMAGE_OPTIONAL_HEADER64 { -+ -+ /* Standard fields */ -+ -+ WORD Magic; -+ BYTE MajorLinkerVersion; -+ BYTE MinorLinkerVersion; -+ DWORD SizeOfCode; -+ DWORD SizeOfInitializedData; -+ DWORD SizeOfUninitializedData; -+ DWORD AddressOfEntryPoint; -+ DWORD BaseOfCode; -+ -+ /* NT additional fields */ -+ ULONGLONG ImageBase; -+ DWORD SectionAlignment; -+ DWORD FileAlignment; -+ WORD MajorOperatingSystemVersion; -+ WORD MinorOperatingSystemVersion; -+ WORD MajorImageVersion; -+ WORD MinorImageVersion; -+ WORD MajorSubsystemVersion; -+ WORD MinorSubsystemVersion; -+ DWORD Win32VersionValue; -+ DWORD SizeOfImage; -+ DWORD SizeOfHeaders; -+ DWORD CheckSum; -+ WORD Subsystem; -+ WORD DllCharacteristics; -+ ULONGLONG SizeOfStackReserve; -+ ULONGLONG SizeOfStackCommit; -+ ULONGLONG SizeOfHeapReserve; -+ ULONGLONG SizeOfHeapCommit; -+ DWORD LoaderFlags; -+ DWORD NumberOfRvaAndSizes; -+ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -+} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; -+ -+#ifdef CONFIG_X86_64 -+typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER; -+typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; -+#else -+typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER; -+typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; -+#endif -+ -+typedef struct _IMAGE_NT_HEADERS32 { -+ DWORD Signature; /* "PE"\0\0 */ /* 0x00 */ -+ IMAGE_FILE_HEADER FileHeader; /* 0x04 */ -+ IMAGE_OPTIONAL_HEADER32 OptionalHeader; /* 0x18 */ -+} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; -+ -+typedef struct _IMAGE_NT_HEADERS64 { -+ DWORD Signature; /* "PE"\0\0 */ /* 0x00 */ -+ IMAGE_FILE_HEADER FileHeader; /* 0x04 */ -+ IMAGE_OPTIONAL_HEADER64 OptionalHeader; /* 0x18 */ -+} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; -+ -+#ifdef CONFIG_X86_64 -+typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -+typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; -+#else -+typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; -+typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; -+#endif -+ -+#define IMAGE_SIZEOF_SHORT_NAME 8 -+ -+typedef struct _IMAGE_SECTION_HEADER { -+ BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; -+ union { -+ DWORD PhysicalAddress; -+ DWORD VirtualSize; -+ } Misc; -+ DWORD VirtualAddress; -+ DWORD SizeOfRawData; -+ DWORD PointerToRawData; -+ DWORD PointerToRelocations; -+ DWORD PointerToLinenumbers; -+ WORD NumberOfRelocations; -+ WORD NumberOfLinenumbers; -+ DWORD Characteristics; -+} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; -+ -+#define IMAGE_SIZEOF_SECTION_HEADER 40 -+ -+#define IMAGE_FIRST_SECTION(ntheader) \ -+((PIMAGE_SECTION_HEADER)((LPBYTE)&((PIMAGE_NT_HEADERS)(ntheader))->OptionalHeader + \ -+((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader)) -+ -+/* These defines are for the Characteristics bitfield. */ -+/* #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved */ -+/* #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved */ -+/* #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved */ -+/* #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved */ -+#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved */ -+/* #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved */ -+ -+#define IMAGE_SCN_CNT_CODE 0x00000020 -+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 -+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 -+ -+#define IMAGE_SCN_LNK_OTHER 0x00000100 -+#define IMAGE_SCN_LNK_INFO 0x00000200 -+/* #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved */ -+#define IMAGE_SCN_LNK_REMOVE 0x00000800 -+#define IMAGE_SCN_LNK_COMDAT 0x00001000 -+ -+/* 0x00002000 - Reserved */ -+/* #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete */ -+#define IMAGE_SCN_MEM_FARDATA 0x00008000 -+ -+/* #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete */ -+#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 -+#define IMAGE_SCN_MEM_16BIT 0x00020000 -+#define IMAGE_SCN_MEM_LOCKED 0x00040000 -+#define IMAGE_SCN_MEM_PRELOAD 0x00080000 -+ -+#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 -+#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 -+#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 -+#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 -+#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default */ -+#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 -+#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 -+#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 -+#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 -+#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 -+#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 -+#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 -+#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 -+#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 -+/* 0x00F00000 - Unused */ -+#define IMAGE_SCN_ALIGN_MASK 0x00F00000 -+ -+#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 -+ -+ -+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -+#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 -+#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 -+#define IMAGE_SCN_MEM_SHARED 0x10000000 -+#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -+#define IMAGE_SCN_MEM_READ 0x40000000 -+#define IMAGE_SCN_MEM_WRITE 0x80000000 -+ -+typedef struct _IMAGE_SYMBOL { -+ union { -+ BYTE ShortName[8]; -+ struct { -+ DWORD Short; -+ DWORD Long; -+ } Name; -+ DWORD LongName[2]; -+ } N; -+ DWORD Value; -+ SHORT SectionNumber; -+ WORD Type; -+ BYTE StorageClass; -+ BYTE NumberOfAuxSymbols; -+} IMAGE_SYMBOL; -+typedef IMAGE_SYMBOL *PIMAGE_SYMBOL; -+ -+#define IMAGE_SIZEOF_SYMBOL 18 -+ -+typedef struct _IMAGE_LINENUMBER { -+ union { -+ DWORD SymbolTableIndex; -+ DWORD VirtualAddress; -+ } Type; -+ WORD Linenumber; -+} IMAGE_LINENUMBER; -+typedef IMAGE_LINENUMBER *PIMAGE_LINENUMBER; -+ -+#define IMAGE_SIZEOF_LINENUMBER 6 -+ -+typedef union _IMAGE_AUX_SYMBOL { -+ struct { -+ DWORD TagIndex; -+ union { -+ struct { -+ WORD Linenumber; -+ WORD Size; -+ } LnSz; -+ DWORD TotalSize; -+ } Misc; -+ union { -+ struct { -+ DWORD PointerToLinenumber; -+ DWORD PointerToNextFunction; -+ } Function; -+ struct { -+ WORD Dimension[4]; -+ } Array; -+ } FcnAry; -+ WORD TvIndex; -+ } Sym; -+ struct { -+ BYTE Name[IMAGE_SIZEOF_SYMBOL]; -+ } File; -+ struct { -+ DWORD Length; -+ WORD NumberOfRelocations; -+ WORD NumberOfLinenumbers; -+ DWORD CheckSum; -+ SHORT Number; -+ BYTE Selection; -+ } Section; -+} IMAGE_AUX_SYMBOL; -+typedef IMAGE_AUX_SYMBOL *PIMAGE_AUX_SYMBOL; -+ -+#define IMAGE_SIZEOF_AUX_SYMBOL 18 -+ -+#define IMAGE_SYM_UNDEFINED (SHORT)0 -+#define IMAGE_SYM_ABSOLUTE (SHORT)-1 -+#define IMAGE_SYM_DEBUG (SHORT)-2 -+ -+#define IMAGE_SYM_TYPE_NULL 0x0000 -+#define IMAGE_SYM_TYPE_VOID 0x0001 -+#define IMAGE_SYM_TYPE_CHAR 0x0002 -+#define IMAGE_SYM_TYPE_SHORT 0x0003 -+#define IMAGE_SYM_TYPE_INT 0x0004 -+#define IMAGE_SYM_TYPE_LONG 0x0005 -+#define IMAGE_SYM_TYPE_FLOAT 0x0006 -+#define IMAGE_SYM_TYPE_DOUBLE 0x0007 -+#define IMAGE_SYM_TYPE_STRUCT 0x0008 -+#define IMAGE_SYM_TYPE_UNION 0x0009 -+#define IMAGE_SYM_TYPE_ENUM 0x000A -+#define IMAGE_SYM_TYPE_MOE 0x000B -+#define IMAGE_SYM_TYPE_BYTE 0x000C -+#define IMAGE_SYM_TYPE_WORD 0x000D -+#define IMAGE_SYM_TYPE_UINT 0x000E -+#define IMAGE_SYM_TYPE_DWORD 0x000F -+#define IMAGE_SYM_TYPE_PCODE 0x8000 -+ -+#define IMAGE_SYM_DTYPE_NULL 0 -+#define IMAGE_SYM_DTYPE_POINTER 1 -+#define IMAGE_SYM_DTYPE_FUNCTION 2 -+#define IMAGE_SYM_DTYPE_ARRAY 3 -+ -+#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 -+#define IMAGE_SYM_CLASS_NULL 0x0000 -+#define IMAGE_SYM_CLASS_AUTOMATIC 0x0001 -+#define IMAGE_SYM_CLASS_EXTERNAL 0x0002 -+#define IMAGE_SYM_CLASS_STATIC 0x0003 -+#define IMAGE_SYM_CLASS_REGISTER 0x0004 -+#define IMAGE_SYM_CLASS_EXTERNAL_DEF 0x0005 -+#define IMAGE_SYM_CLASS_LABEL 0x0006 -+#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 0x0007 -+#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 0x0008 -+#define IMAGE_SYM_CLASS_ARGUMENT 0x0009 -+#define IMAGE_SYM_CLASS_STRUCT_TAG 0x000A -+#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 0x000B -+#define IMAGE_SYM_CLASS_UNION_TAG 0x000C -+#define IMAGE_SYM_CLASS_TYPE_DEFINITION 0x000D -+#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 0x000E -+#define IMAGE_SYM_CLASS_ENUM_TAG 0x000F -+#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 0x0010 -+#define IMAGE_SYM_CLASS_REGISTER_PARAM 0x0011 -+#define IMAGE_SYM_CLASS_BIT_FIELD 0x0012 -+ -+#define IMAGE_SYM_CLASS_FAR_EXTERNAL 0x0044 -+#define IMAGE_SYM_CLASS_BLOCK 0x0064 -+#define IMAGE_SYM_CLASS_FUNCTION 0x0065 -+#define IMAGE_SYM_CLASS_END_OF_STRUCT 0x0066 -+#define IMAGE_SYM_CLASS_FILE 0x0067 -+#define IMAGE_SYM_CLASS_SECTION 0x0068 -+#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069 -+ -+#define N_BTMASK 0x000F -+#define N_TMASK 0x0030 -+#define N_TMASK1 0x00C0 -+#define N_TMASK2 0x00F0 -+#define N_BTSHFT 4 -+#define N_TSHIFT 2 -+ -+#define BTYPE(x) ((x) & N_BTMASK) -+ -+#ifndef ISPTR -+#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)) -+#endif -+ -+#ifndef ISFCN -+#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT)) -+#endif -+ -+#ifndef ISARY -+#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT)) -+#endif -+ -+#ifndef ISTAG -+#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG) -+#endif -+ -+#ifndef INCREF -+#define INCREF(x) ((((x)&~N_BTMASK)<>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK)) -+#endif -+ -+#define IMAGE_COMDAT_SELECT_NODUPLICATES 1 -+#define IMAGE_COMDAT_SELECT_ANY 2 -+#define IMAGE_COMDAT_SELECT_SAME_SIZE 3 -+#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 -+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 -+#define IMAGE_COMDAT_SELECT_LARGEST 6 -+#define IMAGE_COMDAT_SELECT_NEWEST 7 -+ -+#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 -+#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 -+#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 -+ -+/* Export module directory */ -+ -+typedef struct _IMAGE_EXPORT_DIRECTORY { -+ DWORD Characteristics; -+ DWORD TimeDateStamp; -+ WORD MajorVersion; -+ WORD MinorVersion; -+ DWORD Name; -+ DWORD Base; -+ DWORD NumberOfFunctions; -+ DWORD NumberOfNames; -+ DWORD AddressOfFunctions; -+ DWORD AddressOfNames; -+ DWORD AddressOfNameOrdinals; -+} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; -+ -+/* Import name entry */ -+typedef struct _IMAGE_IMPORT_BY_NAME { -+ WORD Hint; -+ BYTE Name[1]; -+} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; -+ -+/* Import thunk */ -+typedef struct _IMAGE_THUNK_DATA32 { -+ union { -+ DWORD ForwarderString; -+ DWORD Function; -+ DWORD Ordinal; -+ DWORD AddressOfData; -+ } u1; -+} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32; -+ -+typedef struct _IMAGE_THUNK_DATA64 { -+ union { -+ ULONGLONG ForwarderString; -+ ULONGLONG Function; -+ ULONGLONG Ordinal; -+ ULONGLONG AddressOfData; -+ } u1; -+} IMAGE_THUNK_DATA64,*PIMAGE_THUNK_DATA64; -+ -+#ifdef CONFIG_X86_64 -+typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA; -+typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA; -+#else -+typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA; -+typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA; -+#endif -+ -+/* Import module directory */ -+ -+typedef struct __packed _IMAGE_IMPORT_DESCRIPTOR { -+ union { -+ DWORD Characteristics; /* 0 for terminating null -+ * import descriptor */ -+ DWORD OriginalFirstThunk; /* RVA to original unbound -+ * IAT */ -+ } u; -+ DWORD TimeDateStamp; /* 0 if not bound, -+ * -1 if bound, and real date\time stamp -+ * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT -+ * (new BIND) -+ * otherwise date/time stamp of DLL bound to -+ * (Old BIND) -+ */ -+ DWORD ForwarderChain; /* -1 if no forwarders */ -+ DWORD Name; -+ /* RVA to IAT (if bound this IAT has actual addresses) */ -+ DWORD FirstThunk; -+} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; -+ -+#define IMAGE_ORDINAL_FLAG32 0x80000000 -+#define IMAGE_ORDINAL_FLAG64 0x8000000000000000UL -+#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0) -+#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0) -+#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) -+ -+#ifdef CONFIG_X86_64 -+#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64 -+#define IMAGE_SNAP_BY_ORDINAL IMAGE_SNAP_BY_ORDINAL64 -+#else -+#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32 -+#define IMAGE_SNAP_BY_ORDINAL IMAGE_SNAP_BY_ORDINAL32 -+#endif -+ -+typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR -+{ -+ DWORD TimeDateStamp; -+ WORD OffsetModuleName; -+ WORD NumberOfModuleForwarderRefs; -+/* Array of zero or more IMAGE_BOUND_FORWARDER_REF follows */ -+} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR; -+ -+typedef struct _IMAGE_BOUND_FORWARDER_REF -+{ -+ DWORD TimeDateStamp; -+ WORD OffsetModuleName; -+ WORD Reserved; -+} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF; -+ -+typedef struct _IMAGE_BASE_RELOCATION -+{ -+ DWORD VirtualAddress; -+ DWORD SizeOfBlock; -+ WORD TypeOffset[0]; -+} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; -+ -+typedef struct _IMAGE_RELOCATION -+{ -+ union { -+ DWORD VirtualAddress; -+ DWORD RelocCount; -+ } DUMMYUNIONNAME; -+ DWORD SymbolTableIndex; -+ WORD Type; -+} IMAGE_RELOCATION, *PIMAGE_RELOCATION; -+ -+#define IMAGE_SIZEOF_RELOCATION 10 -+ -+/* generic relocation types */ -+#define IMAGE_REL_BASED_ABSOLUTE 0 -+#define IMAGE_REL_BASED_HIGH 1 -+#define IMAGE_REL_BASED_LOW 2 -+#define IMAGE_REL_BASED_HIGHLOW 3 -+#define IMAGE_REL_BASED_HIGHADJ 4 -+#define IMAGE_REL_BASED_MIPS_JMPADDR 5 -+#define IMAGE_REL_BASED_SECTION 6 -+#define IMAGE_REL_BASED_REL 7 -+#define IMAGE_REL_BASED_MIPS_JMPADDR16 9 -+#define IMAGE_REL_BASED_IA64_IMM64 9 /* yes, 9 too */ -+#define IMAGE_REL_BASED_DIR64 10 -+#define IMAGE_REL_BASED_HIGH3ADJ 11 -+ -+/* I386 relocation types */ -+#define IMAGE_REL_I386_ABSOLUTE 0 -+#define IMAGE_REL_I386_DIR16 1 -+#define IMAGE_REL_I386_REL16 2 -+#define IMAGE_REL_I386_DIR32 6 -+#define IMAGE_REL_I386_DIR32NB 7 -+#define IMAGE_REL_I386_SEG12 9 -+#define IMAGE_REL_I386_SECTION 10 -+#define IMAGE_REL_I386_SECREL 11 -+#define IMAGE_REL_I386_REL32 20 -+ -+/* MIPS relocation types */ -+#define IMAGE_REL_MIPS_ABSOLUTE 0x0000 -+#define IMAGE_REL_MIPS_REFHALF 0x0001 -+#define IMAGE_REL_MIPS_REFWORD 0x0002 -+#define IMAGE_REL_MIPS_JMPADDR 0x0003 -+#define IMAGE_REL_MIPS_REFHI 0x0004 -+#define IMAGE_REL_MIPS_REFLO 0x0005 -+#define IMAGE_REL_MIPS_GPREL 0x0006 -+#define IMAGE_REL_MIPS_LITERAL 0x0007 -+#define IMAGE_REL_MIPS_SECTION 0x000A -+#define IMAGE_REL_MIPS_SECREL 0x000B -+#define IMAGE_REL_MIPS_SECRELLO 0x000C -+#define IMAGE_REL_MIPS_SECRELHI 0x000D -+#define IMAGE_REL_MIPS_JMPADDR16 0x0010 -+#define IMAGE_REL_MIPS_REFWORDNB 0x0022 -+#define IMAGE_REL_MIPS_PAIR 0x0025 -+ -+/* ALPHA relocation types */ -+#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000 -+#define IMAGE_REL_ALPHA_REFLONG 0x0001 -+#define IMAGE_REL_ALPHA_REFQUAD 0x0002 -+#define IMAGE_REL_ALPHA_GPREL 0x0003 -+#define IMAGE_REL_ALPHA_LITERAL 0x0004 -+#define IMAGE_REL_ALPHA_LITUSE 0x0005 -+#define IMAGE_REL_ALPHA_GPDISP 0x0006 -+#define IMAGE_REL_ALPHA_BRADDR 0x0007 -+#define IMAGE_REL_ALPHA_HINT 0x0008 -+#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009 -+#define IMAGE_REL_ALPHA_REFHI 0x000A -+#define IMAGE_REL_ALPHA_REFLO 0x000B -+#define IMAGE_REL_ALPHA_PAIR 0x000C -+#define IMAGE_REL_ALPHA_MATCH 0x000D -+#define IMAGE_REL_ALPHA_SECTION 0x000E -+#define IMAGE_REL_ALPHA_SECREL 0x000F -+#define IMAGE_REL_ALPHA_REFLONGNB 0x0010 -+#define IMAGE_REL_ALPHA_SECRELLO 0x0011 -+#define IMAGE_REL_ALPHA_SECRELHI 0x0012 -+#define IMAGE_REL_ALPHA_REFQ3 0x0013 -+#define IMAGE_REL_ALPHA_REFQ2 0x0014 -+#define IMAGE_REL_ALPHA_REFQ1 0x0015 -+#define IMAGE_REL_ALPHA_GPRELLO 0x0016 -+#define IMAGE_REL_ALPHA_GPRELHI 0x0017 -+ -+/* PowerPC relocation types */ -+#define IMAGE_REL_PPC_ABSOLUTE 0x0000 -+#define IMAGE_REL_PPC_ADDR64 0x0001 -+#define IMAGE_REL_PPC_ADDR 0x0002 -+#define IMAGE_REL_PPC_ADDR24 0x0003 -+#define IMAGE_REL_PPC_ADDR16 0x0004 -+#define IMAGE_REL_PPC_ADDR14 0x0005 -+#define IMAGE_REL_PPC_REL24 0x0006 -+#define IMAGE_REL_PPC_REL14 0x0007 -+#define IMAGE_REL_PPC_TOCREL16 0x0008 -+#define IMAGE_REL_PPC_TOCREL14 0x0009 -+#define IMAGE_REL_PPC_ADDR32NB 0x000A -+#define IMAGE_REL_PPC_SECREL 0x000B -+#define IMAGE_REL_PPC_SECTION 0x000C -+#define IMAGE_REL_PPC_IFGLUE 0x000D -+#define IMAGE_REL_PPC_IMGLUE 0x000E -+#define IMAGE_REL_PPC_SECREL16 0x000F -+#define IMAGE_REL_PPC_REFHI 0x0010 -+#define IMAGE_REL_PPC_REFLO 0x0011 -+#define IMAGE_REL_PPC_PAIR 0x0012 -+#define IMAGE_REL_PPC_SECRELLO 0x0013 -+#define IMAGE_REL_PPC_SECRELHI 0x0014 -+#define IMAGE_REL_PPC_GPREL 0x0015 -+#define IMAGE_REL_PPC_TYPEMASK 0x00FF -+/* modifier bits */ -+#define IMAGE_REL_PPC_NEG 0x0100 -+#define IMAGE_REL_PPC_BRTAKEN 0x0200 -+#define IMAGE_REL_PPC_BRNTAKEN 0x0400 -+#define IMAGE_REL_PPC_TOCDEFN 0x0800 -+ -+/* SH3 ? relocation type */ -+#define IMAGE_REL_SH3_ABSOLUTE 0x0000 -+#define IMAGE_REL_SH3_DIRECT16 0x0001 -+#define IMAGE_REL_SH3_DIRECT 0x0002 -+#define IMAGE_REL_SH3_DIRECT8 0x0003 -+#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004 -+#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005 -+#define IMAGE_REL_SH3_DIRECT4 0x0006 -+#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007 -+#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008 -+#define IMAGE_REL_SH3_PCREL8_WORD 0x0009 -+#define IMAGE_REL_SH3_PCREL8_LONG 0x000A -+#define IMAGE_REL_SH3_PCREL12_WORD 0x000B -+#define IMAGE_REL_SH3_STARTOF_SECTION 0x000C -+#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D -+#define IMAGE_REL_SH3_SECTION 0x000E -+#define IMAGE_REL_SH3_SECREL 0x000F -+#define IMAGE_REL_SH3_DIRECT32_NB 0x0010 -+ -+/* ARM (Archimedes?) relocation types */ -+#define IMAGE_REL_ARM_ABSOLUTE 0x0000 -+#define IMAGE_REL_ARM_ADDR 0x0001 -+#define IMAGE_REL_ARM_ADDR32NB 0x0002 -+#define IMAGE_REL_ARM_BRANCH24 0x0003 -+#define IMAGE_REL_ARM_BRANCH11 0x0004 -+#define IMAGE_REL_ARM_SECTION 0x000E -+#define IMAGE_REL_ARM_SECREL 0x000F -+ -+/* IA64 relocation types */ -+#define IMAGE_REL_IA64_ABSOLUTE 0x0000 -+#define IMAGE_REL_IA64_IMM14 0x0001 -+#define IMAGE_REL_IA64_IMM22 0x0002 -+#define IMAGE_REL_IA64_IMM64 0x0003 -+#define IMAGE_REL_IA64_DIR 0x0004 -+#define IMAGE_REL_IA64_DIR64 0x0005 -+#define IMAGE_REL_IA64_PCREL21B 0x0006 -+#define IMAGE_REL_IA64_PCREL21M 0x0007 -+#define IMAGE_REL_IA64_PCREL21F 0x0008 -+#define IMAGE_REL_IA64_GPREL22 0x0009 -+#define IMAGE_REL_IA64_LTOFF22 0x000A -+#define IMAGE_REL_IA64_SECTION 0x000B -+#define IMAGE_REL_IA64_SECREL22 0x000C -+#define IMAGE_REL_IA64_SECREL64I 0x000D -+#define IMAGE_REL_IA64_SECREL 0x000E -+#define IMAGE_REL_IA64_LTOFF64 0x000F -+#define IMAGE_REL_IA64_DIR32NB 0x0010 -+#define IMAGE_REL_IA64_RESERVED_11 0x0011 -+#define IMAGE_REL_IA64_RESERVED_12 0x0012 -+#define IMAGE_REL_IA64_RESERVED_13 0x0013 -+#define IMAGE_REL_IA64_RESERVED_14 0x0014 -+#define IMAGE_REL_IA64_RESERVED_15 0x0015 -+#define IMAGE_REL_IA64_RESERVED_16 0x0016 -+#define IMAGE_REL_IA64_ADDEND 0x001F -+ -+/* archive format */ -+ -+#define IMAGE_ARCHIVE_START_SIZE 8 -+#define IMAGE_ARCHIVE_START "!\n" -+#define IMAGE_ARCHIVE_END "`\n" -+#define IMAGE_ARCHIVE_PAD "\n" -+#define IMAGE_ARCHIVE_LINKER_MEMBER "/ " -+#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " -+ -+typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER -+{ -+ BYTE Name[16]; -+ BYTE Date[12]; -+ BYTE UserID[6]; -+ BYTE GroupID[6]; -+ BYTE Mode[8]; -+ BYTE Size[10]; -+ BYTE EndHeader[2]; -+} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; -+ -+#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 -+ -+/* -+ * Resource directory stuff -+ */ -+typedef struct _IMAGE_RESOURCE_DIRECTORY { -+ DWORD Characteristics; -+ DWORD TimeDateStamp; -+ WORD MajorVersion; -+ WORD MinorVersion; -+ WORD NumberOfNamedEntries; -+ WORD NumberOfIdEntries; -+ /* IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */ -+} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY; -+ -+#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000 -+#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000 -+ -+typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY { -+ union { -+ struct { -+#ifdef BITFIELDS_BIGENDIAN -+ unsigned NameIsString:1; -+ unsigned NameOffset:31; -+#else -+ unsigned NameOffset:31; -+ unsigned NameIsString:1; -+#endif -+ } DUMMYSTRUCTNAME1; -+ DWORD Name; -+ struct { -+#ifdef WORDS_BIGENDIAN -+ WORD __pad; -+ WORD Id; -+#else -+ WORD Id; -+ WORD __pad; -+#endif -+ } DUMMYSTRUCTNAME2; -+ } DUMMYUNIONNAME1; -+ union { -+ DWORD OffsetToData; -+ struct { -+#ifdef BITFIELDS_BIGENDIAN -+ unsigned DataIsDirectory:1; -+ unsigned OffsetToDirectory:31; -+#else -+ unsigned OffsetToDirectory:31; -+ unsigned DataIsDirectory:1; -+#endif -+ } DUMMYSTRUCTNAME3; -+ } DUMMYUNIONNAME2; -+} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY; -+ -+ -+typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING { -+ WORD Length; -+ CHAR NameString[ 1 ]; -+} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING; -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/pnp.c linux-5.6.11-ndis/3rdparty/ndiswrapper/pnp.c ---- linux-5.6.11/3rdparty/ndiswrapper/pnp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/pnp.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,697 @@ -+/* -+ * Copyright (C) 2005 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "usb.h" -+#include "pnp.h" -+#include "wrapndis.h" -+#include "loader.h" -+ -+/* Functions callable from the NDIS driver */ -+wstdcall NTSTATUS pdoDispatchDeviceControl(struct device_object *pdo, -+ struct irp *irp); -+wstdcall NTSTATUS pdoDispatchPnp(struct device_object *pdo, struct irp *irp); -+wstdcall NTSTATUS pdoDispatchPower(struct device_object *pdo, struct irp *irp); -+ -+static NTSTATUS start_pdo(struct device_object *pdo) -+{ -+ int i, ret, count, resources_size; -+ struct wrap_device *wd; -+ struct pci_dev *pdev; -+ struct cm_partial_resource_descriptor *entry; -+ struct cm_partial_resource_list *partial_resource_list; -+ -+ ENTER1("%p, %p", pdo, pdo->reserved); -+ wd = pdo->reserved; -+ if (ntoskernel_init_device(wd)) -+ EXIT1(return STATUS_FAILURE); -+ if (wrap_is_usb_bus(wd->dev_bus)) { -+ if (usb_init_device(wd)) { -+ ntoskernel_exit_device(wd); -+ EXIT1(return STATUS_FAILURE); -+ } -+ EXIT1(return STATUS_SUCCESS); -+ } -+ if (!wrap_is_pci_bus(wd->dev_bus)) -+ EXIT1(return STATUS_SUCCESS); -+ pdev = wd->pci.pdev; -+ ret = pci_enable_device(pdev); -+ if (ret) { -+ ERROR("couldn't enable PCI device: %x", ret); -+ return STATUS_FAILURE; -+ } -+ ret = pci_request_regions(pdev, DRIVER_NAME); -+ if (ret) { -+ ERROR("couldn't request PCI regions: %x", ret); -+ goto err_enable; -+ } -+ pci_set_power_state(pdev, PCI_D0); -+#ifdef CONFIG_X86_64 -+ /* 64-bit broadcom driver doesn't work if DMA is allocated -+ * from over 1GB */ -+ if (wd->vendor == 0x14e4) { -+ if (pci_set_dma_mask(pdev, DMA_BIT_MASK(30)) || -+ pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(30))) -+ WARNING("couldn't set DMA mask; this driver " -+ "may not work with more than 1GB RAM"); -+ } -+#endif -+ /* IRQ resource entry is filled in from pdev, instead of -+ * pci_resource macros */ -+ for (i = count = 0; pci_resource_start(pdev, i); i++) -+ if ((pci_resource_flags(pdev, i) & IORESOURCE_MEM) || -+ (pci_resource_flags(pdev, i) & IORESOURCE_IO)) -+ count++; -+ /* space for entry for IRQ is already in -+ * cm_partial_resource_list */ -+ resources_size = sizeof(struct cm_resource_list) + -+ sizeof(struct cm_partial_resource_descriptor) * count; -+ TRACE2("resources: %d, %d", count, resources_size); -+ wd->resource_list = kzalloc(resources_size, GFP_KERNEL); -+ if (!wd->resource_list) { -+ WARNING("couldn't allocate memory"); -+ goto err_regions; -+ } -+ wd->resource_list->count = 1; -+ wd->resource_list->list[0].interface_type = PCIBus; -+ /* bus_number is not used by WDM drivers */ -+ wd->resource_list->list[0].bus_number = pdev->bus->number; -+ -+ partial_resource_list = -+ &wd->resource_list->list->partial_resource_list; -+ partial_resource_list->version = 1; -+ partial_resource_list->revision = 1; -+ partial_resource_list->count = count + 1; -+ -+ for (i = count = 0; pci_resource_start(pdev, i); i++) { -+ entry = &partial_resource_list->partial_descriptors[count]; -+ TRACE2("%d", count); -+ if (pci_resource_flags(pdev, i) & IORESOURCE_MEM) { -+ entry->type = CmResourceTypeMemory; -+ entry->flags = CM_RESOURCE_MEMORY_READ_WRITE; -+ entry->share = CmResourceShareDeviceExclusive; -+ } else if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { -+ entry->type = CmResourceTypePort; -+ entry->flags = CM_RESOURCE_PORT_IO; -+ entry->share = CmResourceShareDeviceExclusive; -+#if 0 -+ } else if (pci_resource_flags(pdev, i) & IORESOURCE_DMA) { -+ /* it looks like no driver uses this resource */ -+ typeof(pci_resource_flags(pdev, 0)) flags; -+ entry->type = CmResourceTypeDma; -+ flags = pci_resource_flags(pdev, i); -+ if (flags & IORESOURCE_DMA_TYPEA) -+ entry->flags |= CM_RESOURCE_DMA_TYPE_A; -+ else if (flags & IORESOURCE_DMA_TYPEB) -+ entry->flags |= CM_RESOURCE_DMA_TYPE_B; -+ else if (flags & IORESOURCE_DMA_TYPEF) -+ entry->flags |= CM_RESOURCE_DMA_TYPE_F; -+ if (flags & IORESOURCE_DMA_8BIT) -+ entry->flags |= CM_RESOURCE_DMA_8; -+ else if (flags & IORESOURCE_DMA_16BIT) -+ entry->flags |= CM_RESOURCE_DMA_16; -+ /* what about 32bit DMA? */ -+ else if (flags & IORESOURCE_DMA_8AND16BIT) -+ entry->flags |= CM_RESOURCE_DMA_8_AND_16; -+ if (flags & IORESOURCE_DMA_MASTER) -+ entry->flags |= CM_RESOURCE_DMA_BUS_MASTER; -+ entry->u.dma.channel = pci_resource_start(pdev, i); -+ /* what should this be? */ -+ entry->u.dma.port = 1; -+#endif -+ } else -+ continue; -+ /* TODO: Add other resource types? */ -+ entry->u.generic.start = -+ (ULONG_PTR)pci_resource_start(pdev, i); -+ entry->u.generic.length = pci_resource_len(pdev, i); -+ count++; -+ } -+ -+ /* put IRQ resource at the end */ -+ entry = &partial_resource_list->partial_descriptors[count++]; -+ entry->type = CmResourceTypeInterrupt; -+ entry->flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE; -+ /* we assume all devices use shared IRQ */ -+ entry->share = CmResourceShareShared; -+ /* as per documentation, interrupt level should be DIRQL, but -+ * examples from DDK as well some drivers, such as AR5211, -+ * RT8180L use interrupt level as interrupt vector also in -+ * NdisMRegisterInterrupt */ -+ entry->u.interrupt.level = pdev->irq; -+ entry->u.interrupt.vector = pdev->irq; -+ entry->u.interrupt.affinity = -1; -+ -+ TRACE2("resource list count %d, irq: %d", -+ partial_resource_list->count, pdev->irq); -+ pci_set_drvdata(pdev, wd); -+ EXIT1(return STATUS_SUCCESS); -+err_regions: -+ pci_release_regions(pdev); -+err_enable: -+ pci_disable_device(pdev); -+ wd->pci.pdev = NULL; -+ wd->pdo = NULL; -+ EXIT1(return STATUS_FAILURE); -+} -+ -+static void remove_pdo(struct device_object *pdo) -+{ -+ struct wrap_device *wd = pdo->reserved; -+ -+ ntoskernel_exit_device(wd); -+ if (wrap_is_pci_bus(wd->dev_bus)) { -+ struct pci_dev *pdev = wd->pci.pdev; -+ pci_release_regions(pdev); -+ pci_disable_device(pdev); -+ wd->pci.pdev = NULL; -+ pci_set_drvdata(pdev, NULL); -+ } else if (wrap_is_usb_bus(wd->dev_bus)) { -+ usb_exit_device(wd); -+ } -+ kfree(wd->resource_list); -+ wd->resource_list = NULL; -+ return; -+} -+ -+static NTSTATUS IoSendIrpTopDev(struct device_object *dev_obj, ULONG major_fn, -+ ULONG minor_fn, struct io_stack_location *sl) -+{ -+ NTSTATUS status; -+ struct nt_event event; -+ struct irp *irp; -+ struct io_stack_location *irp_sl; -+ struct device_object *top_dev = IoGetAttachedDeviceReference(dev_obj); -+ -+ KeInitializeEvent(&event, NotificationEvent, FALSE); -+ irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, top_dev, NULL, 0, NULL, -+ &event, NULL); -+ irp->io_status.status = STATUS_NOT_IMPLEMENTED; -+ irp->io_status.info = 0; -+ irp_sl = IoGetNextIrpStackLocation(irp); -+ if (sl) -+ memcpy(irp_sl, sl, sizeof(*irp_sl)); -+ irp_sl->major_fn = major_fn; -+ irp_sl->minor_fn = minor_fn; -+ status = IoCallDriver(top_dev, irp); -+ if (status == STATUS_PENDING) { -+ KeWaitForSingleObject(&event, Executive, KernelMode, -+ FALSE, NULL); -+ status = irp->io_status.status; -+ } -+ ObDereferenceObject(top_dev); -+ return status; -+} -+ -+wstdcall NTSTATUS pdoDispatchDeviceControl(struct device_object *pdo, -+ struct irp *irp) -+{ -+ NTSTATUS status; -+ struct wrap_device *wd = pdo->reserved; -+ -+ DUMP_IRP(irp); -+ (void)wd; -+ if (wrap_is_usb_bus(wd->dev_bus)) { -+ status = wrap_submit_irp(pdo, irp); -+ IOTRACE("status: %08X", status); -+ if (status != STATUS_PENDING) -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ } else { -+ status = irp->io_status.status = STATUS_NOT_IMPLEMENTED; -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ } -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(pdoDispatchDeviceControl,2) -+ -+wstdcall NTSTATUS pdoDispatchPnp(struct device_object *pdo, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ NTSTATUS status; -+ struct wrap_device *wd = pdo->reserved; -+ -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ TRACE2("%p %d:%d", pdo, irp_sl->major_fn, irp_sl->minor_fn); -+ switch (irp_sl->minor_fn) { -+ case IRP_MN_START_DEVICE: -+ status = start_pdo(pdo); -+ break; -+ case IRP_MN_QUERY_STOP_DEVICE: -+ case IRP_MN_STOP_DEVICE: -+ case IRP_MN_QUERY_REMOVE_DEVICE: -+ status = STATUS_SUCCESS; -+ break; -+ case IRP_MN_REMOVE_DEVICE: -+ remove_pdo(pdo); -+ status = STATUS_SUCCESS; -+ break; -+ case IRP_MN_QUERY_INTERFACE: -+ if (wrap_is_usb_bus(wd->dev_bus)) -+ status = usb_query_interface(wd, irp_sl); -+ else -+ status = STATUS_NOT_IMPLEMENTED; -+ break; -+ default: -+ TRACE2("fn %d not implemented", irp_sl->minor_fn); -+ status = STATUS_SUCCESS; -+ break; -+ } -+ irp->io_status.status = status; -+ TRACE2("status: %08X", status); -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(pdoDispatchPnp,2) -+ -+wstdcall NTSTATUS pdoDispatchPower(struct device_object *pdo, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ struct wrap_device *wd; -+ union power_state power_state; -+ struct pci_dev *pdev; -+ NTSTATUS status; -+ -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ wd = pdo->reserved; -+ TRACE2("pdo: %p, fn: %d:%d, wd: %p", -+ pdo, irp_sl->major_fn, irp_sl->minor_fn, wd); -+ switch (irp_sl->minor_fn) { -+ case IRP_MN_WAIT_WAKE: -+ /* TODO: this is not complete/correct */ -+ TRACE2("state: %d, completion: %p", -+ irp_sl->params.power.state.system_state, -+ irp_sl->completion_routine); -+ IoMarkIrpPending(irp); -+ status = STATUS_PENDING; -+ break; -+ case IRP_MN_SET_POWER: -+ power_state = irp_sl->params.power.state; -+ if (power_state.device_state == PowerDeviceD0) { -+ TRACE2("resuming %p", wd); -+ if (wrap_is_pci_bus(wd->dev_bus)) { -+ pdev = wd->pci.pdev; -+ pci_restore_state(pdev); -+ if (wd->pci.wake_state == PowerDeviceD3) { -+ pci_enable_wake(wd->pci.pdev, -+ PCI_D3hot, 0); -+ pci_enable_wake(wd->pci.pdev, -+ PCI_D3cold, 0); -+ } -+ pci_set_power_state(pdev, PCI_D0); -+ } else if (wrap_is_usb_bus(wd->dev_bus)) { -+ wrap_resume_urbs(wd); -+ } -+ } else { -+ TRACE2("suspending device %p", wd); -+ if (wrap_is_pci_bus(wd->dev_bus)) { -+ pdev = wd->pci.pdev; -+ pci_save_state(pdev); -+ TRACE2("%d", wd->pci.wake_state); -+ if (wd->pci.wake_state == PowerDeviceD3) { -+ pci_enable_wake(wd->pci.pdev, -+ PCI_D3hot, 1); -+ pci_enable_wake(wd->pci.pdev, -+ PCI_D3cold, 1); -+ } -+ pci_set_power_state(pdev, PCI_D3hot); -+ } else if (wrap_is_usb_bus(wd->dev_bus)) { -+ wrap_suspend_urbs(wd); -+ } -+ } -+ status = STATUS_SUCCESS; -+ break; -+ case IRP_MN_QUERY_POWER: -+ status = STATUS_SUCCESS; -+ break; -+ default: -+ TRACE2("fn %d not implemented", irp_sl->minor_fn); -+ status = STATUS_SUCCESS; -+ break; -+ } -+ irp->io_status.status = status; -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ return status; -+} -+WIN_FUNC_DECL(pdoDispatchPower,2) -+ -+static NTSTATUS pnp_set_device_power_state(struct wrap_device *wd, -+ enum device_power_state state) -+{ -+ NTSTATUS status; -+ struct device_object *pdo; -+ struct io_stack_location irp_sl; -+ -+ pdo = wd->pdo; -+ IOTRACE("%p, %p", pdo, IoGetAttachedDevice(pdo)); -+ memset(&irp_sl, 0, sizeof(irp_sl)); -+ irp_sl.params.power.state.device_state = state; -+ irp_sl.params.power.type = DevicePowerState; -+ if (state > PowerDeviceD0) { -+ status = IoSendIrpTopDev(pdo, IRP_MJ_POWER, IRP_MN_QUERY_POWER, -+ &irp_sl); -+ if (status != STATUS_SUCCESS) { -+ TRACE1("query of power to %d returns %08X", -+ state, status); -+ EXIT1(return status); -+ } -+ } -+ status = IoSendIrpTopDev(pdo, IRP_MJ_POWER, IRP_MN_SET_POWER, &irp_sl); -+ if (status != STATUS_SUCCESS) -+ WARNING("setting power to %d failed: %08X", state, status); -+ EXIT1(return status); -+} -+ -+static NTSTATUS pnp_start_device(struct wrap_device *wd) -+{ -+ struct device_object *fdo; -+ struct device_object *pdo; -+ struct io_stack_location irp_sl; -+ NTSTATUS status; -+ -+ pdo = wd->pdo; -+ /* TODO: for now we use same resources for both translated -+ * resources and raw resources */ -+ memset(&irp_sl, 0, sizeof(irp_sl)); -+ irp_sl.params.start_device.allocated_resources = -+ wd->resource_list; -+ irp_sl.params.start_device.allocated_resources_translated = -+ wd->resource_list; -+ status = IoSendIrpTopDev(pdo, IRP_MJ_PNP, IRP_MN_START_DEVICE, &irp_sl); -+ fdo = IoGetAttachedDevice(pdo); -+ fdo->drv_obj->drv_ext->count++; -+ if (status != STATUS_SUCCESS) -+ WARNING("Windows driver couldn't initialize the device (%08X)", -+ status); -+ EXIT1(return status); -+} -+ -+#if 0 -+static NTSTATUS pnp_stop_device(struct wrap_device *wd) -+{ -+ struct device_object *pdo; -+ NTSTATUS status; -+ -+ pdo = wd->pdo; -+ status = IoSendIrpTopDev(pdo, IRP_MJ_PNP, IRP_MN_QUERY_STOP_DEVICE, -+ NULL); -+ if (status != STATUS_SUCCESS) -+ WARNING("status: %08X", status); -+ /* for now we ignore query status */ -+ status = IoSendIrpTopDev(pdo, IRP_MJ_PNP, IRP_MN_STOP_DEVICE, NULL); -+ if (status != STATUS_SUCCESS) -+ WARNING("status: %08X", status); -+ if (status != STATUS_SUCCESS) -+ WARNING("status: %08X", status); -+ EXIT2(return status); -+} -+#endif -+ -+static NTSTATUS pnp_remove_device(struct wrap_device *wd) -+{ -+ struct device_object *pdo, *fdo; -+ struct driver_object *fdo_drv_obj; -+ NTSTATUS status; -+ -+ pdo = wd->pdo; -+ fdo = IoGetAttachedDevice(pdo); -+ fdo_drv_obj = fdo->drv_obj; -+ TRACE2("%p, %p, %p", pdo, fdo, fdo_drv_obj); -+ status = IoSendIrpTopDev(pdo, IRP_MJ_PNP, IRP_MN_QUERY_REMOVE_DEVICE, -+ NULL); -+ if (status != STATUS_SUCCESS) -+ WARNING("status: %08X", status); -+ -+ status = IoSendIrpTopDev(pdo, IRP_MJ_PNP, IRP_MN_REMOVE_DEVICE, NULL); -+ if (status != STATUS_SUCCESS) -+ WARNING("status: %08X", status); -+ /* TODO: should we use count in drv_ext or driver's Object -+ * header reference count to keep count of devices associated -+ * with a driver? */ -+ if (status == STATUS_SUCCESS) -+ fdo_drv_obj->drv_ext->count--; -+ TRACE1("count: %d", fdo_drv_obj->drv_ext->count); -+ if ((LONG)fdo_drv_obj->drv_ext->count < 0) -+ WARNING("wrong count: %d", fdo_drv_obj->drv_ext->count); -+ if (fdo_drv_obj->drv_ext->count == 0) { -+ struct wrap_driver *wrap_driver; -+ TRACE1("unloading driver: %p", fdo_drv_obj); -+ wrap_driver = -+ IoGetDriverObjectExtension(fdo_drv_obj, -+ (void *)WRAP_DRIVER_CLIENT_ID); -+ if (fdo_drv_obj->unload) -+ LIN2WIN1(fdo_drv_obj->unload, fdo_drv_obj); -+ if (wrap_driver) { -+ mutex_lock(&loader_mutex); -+ unload_wrap_driver(wrap_driver); -+ mutex_unlock(&loader_mutex); -+ } else -+ ERROR("couldn't get wrap_driver"); -+ ObDereferenceObject(fdo_drv_obj); -+ } -+ IoDeleteDevice(pdo); -+ unload_wrap_device(wd); -+ EXIT1(return status); -+} -+ -+WIN_FUNC_DECL(IoInvalidDeviceRequest,2) -+ -+static struct device_object *alloc_pdo(struct driver_object *drv_obj) -+{ -+ struct device_object *pdo; -+ NTSTATUS status; -+ int i; -+ struct ansi_string ansi_name; -+ struct unicode_string unicode_name; -+ -+ RtlInitAnsiString(&ansi_name, "NDISpdo"); -+ if (RtlAnsiStringToUnicodeString(&unicode_name, &ansi_name, TRUE) == -+ STATUS_SUCCESS) { -+ status = IoCreateDevice(drv_obj, 0, &unicode_name, -+ FILE_DEVICE_UNKNOWN, -+ FILE_AUTOGENERATED_DEVICE_NAME, -+ FALSE, &pdo); -+ RtlFreeUnicodeString(&unicode_name); -+ } else { -+ status = IoCreateDevice(drv_obj, 0, NULL, -+ FILE_DEVICE_UNKNOWN, -+ FILE_AUTOGENERATED_DEVICE_NAME, -+ FALSE, &pdo); -+ } -+ TRACE1("%p, %d, %p", drv_obj, status, pdo); -+ if (status != STATUS_SUCCESS) -+ return NULL; -+ /* dispatch routines are called as Windows functions */ -+ for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) -+ drv_obj->major_func[i] = WIN_FUNC_PTR(IoInvalidDeviceRequest,2); -+ drv_obj->major_func[IRP_MJ_INTERNAL_DEVICE_CONTROL] = -+ WIN_FUNC_PTR(pdoDispatchDeviceControl,2); -+ drv_obj->major_func[IRP_MJ_DEVICE_CONTROL] = -+ WIN_FUNC_PTR(pdoDispatchDeviceControl,2); -+ drv_obj->major_func[IRP_MJ_POWER] = WIN_FUNC_PTR(pdoDispatchPower,2); -+ drv_obj->major_func[IRP_MJ_PNP] = WIN_FUNC_PTR(pdoDispatchPnp,2); -+ return pdo; -+} -+ -+static int wrap_pnp_start_device(struct wrap_device *wd) -+{ -+ struct wrap_driver *driver; -+ struct device_object *pdo; -+ struct driver_object *pdo_drv_obj; -+ -+ ENTER1("wd: %p", wd); -+ -+ if (!((wrap_is_pci_bus(wd->dev_bus)) || -+ (wrap_is_usb_bus(wd->dev_bus)))) { -+ ERROR("bus type %d (%d) not supported", -+ WRAP_BUS(wd->dev_bus), wd->dev_bus); -+ EXIT1(return -EINVAL); -+ } -+ driver = load_wrap_driver(wd); -+ if (!driver) -+ return -ENODEV; -+ -+ wd->driver = driver; -+ wd->dev_bus = WRAP_DEVICE_BUS(driver->dev_type, WRAP_BUS(wd->dev_bus)); -+ TRACE1("dev type: %d, bus type: %d, %d", WRAP_DEVICE(wd->dev_bus), -+ WRAP_BUS(wd->dev_bus), wd->dev_bus); -+ TRACE1("%d, %d", driver->dev_type, wrap_is_usb_bus(wd->dev_bus)); -+ /* first create pdo */ -+ if (wrap_is_pci_bus(wd->dev_bus)) -+ pdo_drv_obj = find_bus_driver("PCI"); -+ else // if (wrap_is_usb_bus(wd->dev_bus)) -+ pdo_drv_obj = find_bus_driver("USB"); -+ if (!pdo_drv_obj) -+ return -EINVAL; -+ pdo = alloc_pdo(pdo_drv_obj); -+ if (!pdo) -+ return -ENOMEM; -+ wd->pdo = pdo; -+ pdo->reserved = wd; -+ if (WRAP_DEVICE(wd->dev_bus) == WRAP_NDIS_DEVICE) { -+ if (init_ndis_driver(driver->drv_obj)) { -+ IoDeleteDevice(pdo); -+ return -EINVAL; -+ } -+ } -+ TRACE1("%p", driver->drv_obj->drv_ext->add_device); -+ if (driver->drv_obj->drv_ext->add_device(driver->drv_obj, pdo) != -+ STATUS_SUCCESS) { -+ IoDeleteDevice(pdo); -+ return -ENOMEM; -+ } -+ if (pnp_start_device(wd) != STATUS_SUCCESS) { -+ /* TODO: we need proper cleanup, to deallocate memory, -+ * for example */ -+ pnp_remove_device(wd); -+ return -EINVAL; -+ } -+ return 0; -+} -+ -+int wrap_pnp_start_pci_device(struct pci_dev *pdev, -+ const struct pci_device_id *ent) -+{ -+ struct load_device load_device; -+ struct wrap_device *wd; -+ -+ ENTER1("called for %04x:%04x:%04x:%04x", pdev->vendor, pdev->device, -+ pdev->subsystem_vendor, pdev->subsystem_device); -+ -+ load_device.bus = WRAP_PCI_BUS; -+ load_device.vendor = pdev->vendor; -+ load_device.device = pdev->device; -+ load_device.subvendor = pdev->subsystem_vendor; -+ load_device.subdevice = pdev->subsystem_device; -+ wd = load_wrap_device(&load_device); -+ if (!wd) -+ EXIT1(return -ENODEV); -+ wd->pci.pdev = pdev; -+ return wrap_pnp_start_device(wd); -+} -+ -+void wrap_pnp_remove_pci_device(struct pci_dev *pdev) -+{ -+ struct wrap_device *wd; -+ -+ wd = (struct wrap_device *)pci_get_drvdata(pdev); -+ ENTER1("%p, %p", pdev, wd); -+ if (!wd) -+ EXIT1(return); -+ pnp_remove_device(wd); -+} -+ -+int wrap_pnp_suspend_pci_device(struct pci_dev *pdev, pm_message_t state) -+{ -+ struct wrap_device *wd; -+ -+ wd = (struct wrap_device *)pci_get_drvdata(pdev); -+ return pnp_set_device_power_state(wd, PowerDeviceD3); -+} -+ -+int wrap_pnp_resume_pci_device(struct pci_dev *pdev) -+{ -+ struct wrap_device *wd; -+ -+ wd = (struct wrap_device *)pci_get_drvdata(pdev); -+ return pnp_set_device_power_state(wd, PowerDeviceD0); -+} -+ -+#ifdef ENABLE_USB -+int wrap_pnp_start_usb_device(struct usb_interface *intf, -+ const struct usb_device_id *usb_id) -+{ -+ struct wrap_device *wd; -+ int ret; -+ struct usb_device *udev = interface_to_usbdev(intf); -+ ENTER1("%04x, %04x, %04x", udev->descriptor.idVendor, -+ udev->descriptor.idProduct, udev->descriptor.bDeviceClass); -+ -+ /* USB device (e.g., RNDIS) may have multiple interfaces; -+ initialize one interface only (is there a way to know which -+ of these interfaces is for network?) */ -+ -+ if ((wd = get_wrap_device(udev, WRAP_USB_BUS))) { -+ TRACE1("device already initialized: %p", wd); -+ usb_set_intfdata(intf, NULL); -+ ret = 0; -+ } else { -+ struct load_device load_device; -+ -+ load_device.bus = WRAP_USB_BUS; -+ load_device.vendor = le16_to_cpu(udev->descriptor.idVendor); -+ load_device.device = le16_to_cpu(udev->descriptor.idProduct); -+ load_device.subvendor = 0; -+ load_device.subdevice = 0; -+ wd = load_wrap_device(&load_device); -+ TRACE2("%p", wd); -+ if (wd) { -+ /* some devices (e.g., TI 4150, RNDIS) need -+ * full reset */ -+ ret = usb_reset_device(udev); -+ if (ret) -+ WARNING("reset failed: %d", ret); -+ usb_set_intfdata(intf, wd); -+ wd->usb.intf = intf; -+ wd->usb.udev = udev; -+ ret = wrap_pnp_start_device(wd); -+ } else -+ ret = -ENODEV; -+ } -+ -+ TRACE2("ret: %d", ret); -+ if (ret) -+ EXIT1(return ret); -+ else -+ return 0; -+} -+ -+void wrap_pnp_remove_usb_device(struct usb_interface *intf) -+{ -+ struct wrap_device *wd; -+ -+ wd = (struct wrap_device *)usb_get_intfdata(intf); -+ TRACE1("%p, %p", intf, wd); -+ if (wd == NULL) -+ EXIT1(return); -+ usb_set_intfdata(intf, NULL); -+ wd->usb.intf = NULL; -+ pnp_remove_device(wd); -+} -+ -+int wrap_pnp_suspend_usb_device(struct usb_interface *intf, pm_message_t state) -+{ -+ struct wrap_device *wd; -+ -+ wd = usb_get_intfdata(intf); -+ ENTER1("%p, %p", intf, wd); -+ if (!wd) -+ EXIT1(return 0); -+ if (pnp_set_device_power_state(wd, PowerDeviceD3)) -+ return -1; -+ return 0; -+} -+ -+int wrap_pnp_resume_usb_device(struct usb_interface *intf) -+{ -+ struct wrap_device *wd; -+ wd = usb_get_intfdata(intf); -+ ENTER1("%p, %p", intf, wd); -+ if (!wd) -+ EXIT1(return 0); -+ if (pnp_set_device_power_state(wd, PowerDeviceD0)) -+ return -1; -+ return 0; -+} -+ -+#endif // USB -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/pnp.h linux-5.6.11-ndis/3rdparty/ndiswrapper/pnp.h ---- linux-5.6.11/3rdparty/ndiswrapper/pnp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/pnp.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,36 @@ -+/* -+ * Copyright (C) 2005 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _PNP_H_ -+#define _PNP_H_ -+ -+#include "ntoskernel.h" -+#include "ndis.h" -+#include "wrapndis.h" -+ -+int wrap_pnp_start_pci_device(struct pci_dev *pdev, -+ const struct pci_device_id *ent); -+void wrap_pnp_remove_pci_device(struct pci_dev *pdev); -+int wrap_pnp_suspend_pci_device(struct pci_dev *pdev, pm_message_t state); -+int wrap_pnp_resume_pci_device(struct pci_dev *pdev); -+ -+int wrap_pnp_start_usb_device(struct usb_interface *intf, -+ const struct usb_device_id *usb_id); -+void wrap_pnp_remove_usb_device(struct usb_interface *intf); -+int wrap_pnp_suspend_usb_device(struct usb_interface *intf, -+ pm_message_t state); -+int wrap_pnp_resume_usb_device(struct usb_interface *intf); -+ -+#endif -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/proc.c linux-5.6.11-ndis/3rdparty/ndiswrapper/proc.c ---- linux-5.6.11/3rdparty/ndiswrapper/proc.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/proc.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,619 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+#include -+#include -+#include -+#include -+ -+#include "ndis.h" -+#include "iw_ndis.h" -+#include "wrapndis.h" -+#include "pnp.h" -+#include "wrapper.h" -+ -+#define MAX_PROC_STR_LEN 32 -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) -+static kuid_t proc_kuid; -+static kgid_t proc_kgid; -+#else -+#define proc_kuid proc_uid -+#define proc_kgid proc_gid -+#define kuid_t uid_t -+#define kgid_t gid_t -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -+static inline struct inode *file_inode(struct file *f) -+{ -+ return f->f_dentry->d_inode; -+} -+#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) -+static inline struct inode *file_inode(struct file *f) -+{ -+ return f->f_path.dentry->d_inode; -+} -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) -+static inline void proc_set_user(struct proc_dir_entry *de, kuid_t uid, -+ kgid_t gid) -+{ -+ de->uid = uid; -+ de->gid = gid; -+} -+ -+static inline void proc_remove(struct proc_dir_entry *de) -+{ -+ if (de) -+ remove_proc_entry(de->name, de->parent); -+} -+ -+static inline void *PDE_DATA(const struct inode *inode) -+{ -+ return PDE(inode)->data; -+} -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) -+static inline struct proc_dir_entry *proc_create_data(const char *name, -+ umode_t mode, struct proc_dir_entry *parent, -+ struct file_operations *fops, void *data) -+{ -+ struct proc_dir_entry *de; -+ -+ de = create_proc_entry(name, mode, parent); -+ if (de) { -+ de->data = data; -+ de->proc_fops = fops; -+ } -+ -+ return de; -+} -+#endif -+ -+static int do_proc_make_entry(const char *name, umode_t mode, -+ struct proc_dir_entry *parent, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -+ const struct proc_ops *fops, -+#else -+ struct file_operations *fops, -+#endif -+ kuid_t uid, kgid_t gid, struct ndis_device *wnd) -+{ -+ struct proc_dir_entry *de; -+ -+ de = proc_create_data(name, mode, parent, fops, wnd); -+ if (de == NULL) { -+ ERROR("couldn't create proc entry for '%s'", name); -+ return -ENOMEM; -+ } -+ proc_set_user(de, uid, gid); -+ return 0; -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -+#define PROC_DECLARE_RO(name) \ -+ static int proc_##name##_open(struct inode *inode, struct file *file) \ -+ { \ -+ return single_open(file, proc_##name##_read, PDE_DATA(inode)); \ -+ } \ -+ static const struct proc_ops name##_fops = { \ -+ .proc_open = proc_##name##_open, \ -+ .proc_read = seq_read, \ -+ .proc_lseek = seq_lseek, \ -+ .proc_release = single_release, \ -+ }; -+ -+#define PROC_DECLARE_RW(name) \ -+ static int proc_##name##_open(struct inode *inode, struct file *file) \ -+ { \ -+ return single_open(file, proc_##name##_read, PDE_DATA(inode)); \ -+ } \ -+ static const struct proc_ops name##_fops = { \ -+ .proc_open = proc_##name##_open, \ -+ .proc_read = seq_read, \ -+ .proc_lseek = seq_lseek, \ -+ .proc_release = single_release, \ -+ .proc_write = proc_##name##_write, \ -+ }; -+#else -+#define PROC_DECLARE_RO(name) \ -+ static int proc_##name##_open(struct inode *inode, struct file *file) \ -+ { \ -+ return single_open(file, proc_##name##_read, PDE_DATA(inode)); \ -+ } \ -+ static struct file_operations name##_fops = { \ -+ .owner = THIS_MODULE, \ -+ .open = proc_##name##_open, \ -+ .read = seq_read, \ -+ .llseek = seq_lseek, \ -+ .release = single_release, \ -+ }; -+ -+#define PROC_DECLARE_RW(name) \ -+ static int proc_##name##_open(struct inode *inode, struct file *file) \ -+ { \ -+ return single_open(file, proc_##name##_read, PDE_DATA(inode)); \ -+ } \ -+ static struct file_operations name##_fops = { \ -+ .owner = THIS_MODULE, \ -+ .open = proc_##name##_open, \ -+ .read = seq_read, \ -+ .llseek = seq_lseek, \ -+ .release = single_release, \ -+ .write = proc_##name##_write, \ -+ }; -+#endif -+ -+#define proc_make_entry_ro(name, parent, wnd) \ -+ do_proc_make_entry(#name, S_IFREG | S_IRUSR | S_IRGRP, parent, \ -+ &name##_fops, proc_kuid, proc_kgid, wnd) -+#define proc_make_entry_rw(name, parent, wnd) \ -+ do_proc_make_entry(#name, \ -+ S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP, \ -+ parent, &name##_fops, proc_kuid, proc_kgid, wnd) -+ -+#define add_text(fmt, ...) seq_printf(sf, fmt, ##__VA_ARGS__) -+ -+static struct proc_dir_entry *wrap_procfs_entry; -+ -+static int proc_stats_read(struct seq_file *sf, void *v) -+{ -+ struct ndis_device *wnd = (struct ndis_device *)sf->private; -+ struct ndis_wireless_stats stats; -+ NDIS_STATUS res; -+ ndis_rssi rssi; -+ -+ res = mp_query(wnd, OID_802_11_RSSI, &rssi, sizeof(rssi)); -+ if (!res) -+ add_text("signal_level=%d dBm\n", (s32)rssi); -+ -+ res = mp_query(wnd, OID_802_11_STATISTICS, &stats, sizeof(stats)); -+ if (!res) { -+ add_text("tx_frames=%llu\n", stats.tx_frag); -+ add_text("tx_multicast_frames=%llu\n", stats.tx_multi_frag); -+ add_text("tx_failed=%llu\n", stats.failed); -+ add_text("tx_retry=%llu\n", stats.retry); -+ add_text("tx_multi_retry=%llu\n", stats.multi_retry); -+ add_text("tx_rtss_success=%llu\n", stats.rtss_succ); -+ add_text("tx_rtss_fail=%llu\n", stats.rtss_fail); -+ add_text("ack_fail=%llu\n", stats.ack_fail); -+ add_text("frame_duplicates=%llu\n", stats.frame_dup); -+ add_text("rx_frames=%llu\n", stats.rx_frag); -+ add_text("rx_multicast_frames=%llu\n", stats.rx_multi_frag); -+ add_text("fcs_errors=%llu\n", stats.fcs_err); -+ } -+ -+ return 0; -+} -+ -+PROC_DECLARE_RO(stats) -+ -+static int proc_encr_read(struct seq_file *sf, void *v) -+{ -+ struct ndis_device *wnd = (struct ndis_device *)sf->private; -+ int i, encr_status, auth_mode, infra_mode; -+ NDIS_STATUS res; -+ struct ndis_essid essid; -+ mac_address ap_address; -+ -+ res = mp_query(wnd, OID_802_11_BSSID, -+ &ap_address, sizeof(ap_address)); -+ if (res) -+ memset(ap_address, 0, ETH_ALEN); -+ add_text("ap_address=" MACSTRSEP "\n", MAC2STR(ap_address)); -+ -+ res = mp_query(wnd, OID_802_11_SSID, &essid, sizeof(essid)); -+ if (!res) -+ add_text("essid=%.*s\n", essid.length, essid.essid); -+ -+ res = mp_query_int(wnd, OID_802_11_ENCRYPTION_STATUS, &encr_status); -+ if (!res) { -+ typeof(&wnd->encr_info.keys[0]) tx_key; -+ add_text("tx_key=%u\n", wnd->encr_info.tx_key_index); -+ add_text("key="); -+ tx_key = &wnd->encr_info.keys[wnd->encr_info.tx_key_index]; -+ if (tx_key->length > 0) -+ for (i = 0; i < tx_key->length; i++) -+ add_text("%2.2X", tx_key->key[i]); -+ else -+ add_text("off"); -+ add_text("\n"); -+ add_text("encr_mode=%d\n", encr_status); -+ } -+ res = mp_query_int(wnd, OID_802_11_AUTHENTICATION_MODE, &auth_mode); -+ if (!res) -+ add_text("auth_mode=%d\n", auth_mode); -+ res = mp_query_int(wnd, OID_802_11_INFRASTRUCTURE_MODE, &infra_mode); -+ add_text("mode=%s\n", (infra_mode == Ndis802_11IBSS) ? "adhoc" : -+ (infra_mode == Ndis802_11Infrastructure) ? "managed" : "auto"); -+ -+ return 0; -+} -+ -+PROC_DECLARE_RO(encr) -+ -+static int proc_hw_read(struct seq_file *sf, void *v) -+{ -+ struct ndis_device *wnd = (struct ndis_device *)sf->private; -+ struct ndis_configuration config; -+ enum ndis_power power_mode; -+ NDIS_STATUS res; -+ ndis_tx_power_level tx_power; -+ ULONG bit_rate; -+ ndis_rts_threshold rts_threshold; -+ ndis_fragmentation_threshold frag_threshold; -+ ndis_antenna antenna; -+ ULONG packet_filter; -+ int n; -+ mac_address mac; -+ char *hw_status[] = {"ready", "initializing", "resetting", "closing", -+ "not ready"}; -+ -+ res = mp_query_int(wnd, OID_GEN_HARDWARE_STATUS, &n); -+ if (res == NDIS_STATUS_SUCCESS && n >= 0 && n < ARRAY_SIZE(hw_status)) -+ add_text("status=%s\n", hw_status[n]); -+ -+ res = mp_query(wnd, OID_802_3_CURRENT_ADDRESS, mac, sizeof(mac)); -+ if (!res) -+ add_text("mac: " MACSTRSEP "\n", MAC2STR(mac)); -+ res = mp_query(wnd, OID_802_11_CONFIGURATION, &config, sizeof(config)); -+ if (!res) { -+ add_text("beacon_period=%u msec\n", config.beacon_period); -+ add_text("atim_window=%u msec\n", config.atim_window); -+ add_text("frequency=%u kHz\n", config.ds_config); -+ add_text("hop_pattern=%u\n", config.fh_config.hop_pattern); -+ add_text("hop_set=%u\n", config.fh_config.hop_set); -+ add_text("dwell_time=%u msec\n", config.fh_config.dwell_time); -+ } -+ -+ res = mp_query(wnd, OID_802_11_TX_POWER_LEVEL, -+ &tx_power, sizeof(tx_power)); -+ if (!res) -+ add_text("tx_power=%u mW\n", tx_power); -+ -+ res = mp_query(wnd, OID_GEN_LINK_SPEED, &bit_rate, sizeof(bit_rate)); -+ if (!res) -+ add_text("bit_rate=%u kBps\n", (u32)bit_rate / 10); -+ -+ res = mp_query(wnd, OID_802_11_RTS_THRESHOLD, -+ &rts_threshold, sizeof(rts_threshold)); -+ if (!res) -+ add_text("rts_threshold=%u bytes\n", rts_threshold); -+ -+ res = mp_query(wnd, OID_802_11_FRAGMENTATION_THRESHOLD, -+ &frag_threshold, sizeof(frag_threshold)); -+ if (!res) -+ add_text("frag_threshold=%u bytes\n", frag_threshold); -+ -+ res = mp_query_int(wnd, OID_802_11_POWER_MODE, &power_mode); -+ if (!res) -+ add_text("power_mode=%s\n", -+ (power_mode == NDIS_POWER_OFF) ? "always_on" : -+ (power_mode == NDIS_POWER_MAX) ? "max_savings" : -+ "min_savings"); -+ -+ res = mp_query(wnd, OID_802_11_NUMBER_OF_ANTENNAS, -+ &antenna, sizeof(antenna)); -+ if (!res) -+ add_text("num_antennas=%u\n", antenna); -+ -+ res = mp_query(wnd, OID_802_11_TX_ANTENNA_SELECTED, -+ &antenna, sizeof(antenna)); -+ if (!res) -+ add_text("tx_antenna=%u\n", antenna); -+ -+ res = mp_query(wnd, OID_802_11_RX_ANTENNA_SELECTED, -+ &antenna, sizeof(antenna)); -+ if (!res) -+ add_text("rx_antenna=%u\n", antenna); -+ -+ add_text("encryption_modes=%s%s%s%s%s%s%s\n", -+ test_bit(Ndis802_11Encryption1Enabled, &wnd->capa.encr) ? -+ "WEP" : "none", -+ test_bit(Ndis802_11Encryption2Enabled, &wnd->capa.encr) ? -+ "; TKIP with WPA" : "", -+ test_bit(Ndis802_11AuthModeWPA2, &wnd->capa.auth) ? -+ ", WPA2" : "", -+ test_bit(Ndis802_11AuthModeWPA2PSK, &wnd->capa.auth) ? -+ ", WPA2PSK" : "", -+ test_bit(Ndis802_11Encryption3Enabled, &wnd->capa.encr) ? -+ "; AES/CCMP with WPA" : "", -+ test_bit(Ndis802_11AuthModeWPA2, &wnd->capa.auth) ? -+ ", WPA2" : "", -+ test_bit(Ndis802_11AuthModeWPA2PSK, &wnd->capa.auth) ? -+ ", WPA2PSK" : ""); -+ -+ res = mp_query_int(wnd, OID_GEN_CURRENT_PACKET_FILTER, &packet_filter); -+ if (!res) { -+ if (packet_filter != wnd->packet_filter) -+ WARNING("wrong packet_filter? 0x%08x, 0x%08x\n", -+ packet_filter, wnd->packet_filter); -+ add_text("packet_filter: 0x%08x\n", packet_filter); -+ } -+ -+ return 0; -+} -+ -+PROC_DECLARE_RO(hw) -+ -+static int proc_settings_read(struct seq_file *sf, void *v) -+{ -+ struct ndis_device *wnd = (struct ndis_device *)sf->private; -+ struct wrap_device_setting *setting; -+ -+ add_text("hangcheck_interval=%d\n", (hangcheck_interval == 0) ? -+ (wnd->hangcheck_interval / HZ) : -1); -+ -+ list_for_each_entry(setting, &wnd->wd->settings, list) { -+ add_text("%s=%s\n", setting->name, setting->value); -+ } -+ -+ list_for_each_entry(setting, &wnd->wd->driver->settings, list) { -+ add_text("%s=%s\n", setting->name, setting->value); -+ } -+ -+ return 0; -+} -+ -+static ssize_t proc_settings_write(struct file *file, const char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ndis_device *wnd = PDE_DATA(file_inode(file)); -+ char setting[MAX_PROC_STR_LEN], *p; -+ unsigned int i; -+ NDIS_STATUS res; -+ -+ if (count > MAX_PROC_STR_LEN) -+ return -EINVAL; -+ -+ memset(setting, 0, sizeof(setting)); -+ if (copy_from_user(setting, buf, count)) -+ return -EFAULT; -+ -+ if ((p = strchr(setting, '\n'))) -+ *p = 0; -+ -+ if ((p = strchr(setting, '='))) -+ *p = 0; -+ -+ if (!strcmp(setting, "hangcheck_interval")) { -+ if (!p) -+ return -EINVAL; -+ p++; -+ i = simple_strtol(p, NULL, 10); -+ hangcheck_del(wnd); -+ if (i > 0) { -+ wnd->hangcheck_interval = i * HZ; -+ hangcheck_add(wnd); -+ } -+ } else if (!strcmp(setting, "suspend")) { -+ if (!p) -+ return -EINVAL; -+ p++; -+ i = simple_strtol(p, NULL, 10); -+ if (i <= 0 || i > 3) -+ return -EINVAL; -+ i = -1; -+ if (wrap_is_pci_bus(wnd->wd->dev_bus)) -+ i = wrap_pnp_suspend_pci_device(wnd->wd->pci.pdev, -+ PMSG_SUSPEND); -+ else if (wrap_is_usb_bus(wnd->wd->dev_bus)) -+ i = wrap_pnp_suspend_usb_device(wnd->wd->usb.intf, -+ PMSG_SUSPEND); -+ if (i) -+ return -EINVAL; -+ } else if (!strcmp(setting, "resume")) { -+ i = -1; -+ if (wrap_is_pci_bus(wnd->wd->dev_bus)) -+ i = wrap_pnp_resume_pci_device(wnd->wd->pci.pdev); -+ else if (wrap_is_usb_bus(wnd->wd->dev_bus)) -+ i = wrap_pnp_resume_usb_device(wnd->wd->usb.intf); -+ if (i) -+ return -EINVAL; -+ } else if (!strcmp(setting, "stats_enabled")) { -+ if (!p) -+ return -EINVAL; -+ p++; -+ i = simple_strtol(p, NULL, 10); -+ if (i > 0) -+ wnd->iw_stats_enabled = TRUE; -+ else -+ wnd->iw_stats_enabled = FALSE; -+ } else if (!strcmp(setting, "packet_filter")) { -+ if (!p) -+ return -EINVAL; -+ p++; -+ i = simple_strtol(p, NULL, 10); -+ res = mp_set_int(wnd, OID_GEN_CURRENT_PACKET_FILTER, i); -+ if (res) -+ WARNING("setting packet_filter failed: %08X", res); -+ } else if (!strcmp(setting, "reinit")) { -+ if (ndis_reinit(wnd) != NDIS_STATUS_SUCCESS) -+ return -EFAULT; -+ } else { -+ struct ndis_configuration_parameter param; -+ struct unicode_string key; -+ struct ansi_string ansi; -+ -+ if (!p) -+ return -EINVAL; -+ p++; -+ RtlInitAnsiString(&ansi, p); -+ if (RtlAnsiStringToUnicodeString(¶m.data.string, &ansi, -+ TRUE) != STATUS_SUCCESS) -+ EXIT1(return -EFAULT); -+ param.type = NdisParameterString; -+ RtlInitAnsiString(&ansi, setting); -+ if (RtlAnsiStringToUnicodeString(&key, &ansi, -+ TRUE) != STATUS_SUCCESS) { -+ RtlFreeUnicodeString(¶m.data.string); -+ EXIT1(return -EINVAL); -+ } -+ NdisWriteConfiguration(&res, wnd->nmb, &key, ¶m); -+ RtlFreeUnicodeString(&key); -+ RtlFreeUnicodeString(¶m.data.string); -+ if (res != NDIS_STATUS_SUCCESS) -+ return -EFAULT; -+ } -+ return count; -+} -+ -+PROC_DECLARE_RW(settings) -+ -+int wrap_procfs_add_ndis_device(struct ndis_device *wnd) -+{ -+ int ret; -+ -+ if (wrap_procfs_entry == NULL) -+ return -ENOMEM; -+ -+ if (wnd->procfs_iface) { -+ ERROR("%s already registered?", wnd->net_dev->name); -+ return -EINVAL; -+ } -+ wnd->procfs_iface = proc_mkdir(wnd->net_dev->name, wrap_procfs_entry); -+ if (wnd->procfs_iface == NULL) { -+ ERROR("couldn't create proc directory"); -+ return -ENOMEM; -+ } -+ proc_set_user(wnd->procfs_iface, proc_kuid, proc_kgid); -+ -+ ret = proc_make_entry_ro(hw, wnd->procfs_iface, wnd); -+ if (ret) -+ goto err_hw; -+ -+ ret = proc_make_entry_ro(stats, wnd->procfs_iface, wnd); -+ if (ret) -+ goto err_stats; -+ -+ ret = proc_make_entry_ro(encr, wnd->procfs_iface, wnd); -+ if (ret) -+ goto err_encr; -+ -+ ret = proc_make_entry_rw(settings, wnd->procfs_iface, wnd); -+ if (ret) -+ goto err_settings; -+ -+ return 0; -+ -+err_settings: -+ remove_proc_entry("encr", wnd->procfs_iface); -+err_encr: -+ remove_proc_entry("stats", wnd->procfs_iface); -+err_stats: -+ remove_proc_entry("hw", wnd->procfs_iface); -+err_hw: -+ proc_remove(wnd->procfs_iface); -+ wnd->procfs_iface = NULL; -+ return -ENOMEM; -+} -+ -+void wrap_procfs_remove_ndis_device(struct ndis_device *wnd) -+{ -+ struct proc_dir_entry *procfs_iface = xchg(&wnd->procfs_iface, NULL); -+ -+ if (procfs_iface == NULL) -+ return; -+ remove_proc_entry("hw", procfs_iface); -+ remove_proc_entry("stats", procfs_iface); -+ remove_proc_entry("encr", procfs_iface); -+ remove_proc_entry("settings", procfs_iface); -+ if (wrap_procfs_entry) -+ proc_remove(procfs_iface); -+} -+ -+static int proc_debug_read(struct seq_file *sf, void *v) -+{ -+#if ALLOC_DEBUG -+ enum alloc_type type; -+#endif -+ -+ add_text("%d\n", debug); -+#if ALLOC_DEBUG -+ for (type = 0; type < ALLOC_TYPE_MAX; type++) -+ add_text("total size of allocations in %s: %d\n", -+ alloc_type_name[type], alloc_size(type)); -+#endif -+ return 0; -+} -+ -+static ssize_t proc_debug_write(struct file *file, const char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ int i; -+ char setting[MAX_PROC_STR_LEN], *p; -+ -+ if (count > MAX_PROC_STR_LEN) -+ return -EINVAL; -+ -+ memset(setting, 0, sizeof(setting)); -+ if (copy_from_user(setting, buf, count)) -+ return -EFAULT; -+ -+ if ((p = strchr(setting, '\n'))) -+ *p = 0; -+ -+ if ((p = strchr(setting, '='))) -+ *p = 0; -+ -+ i = simple_strtol(setting, NULL, 10); -+ if (i >= 0 && i < 10) -+ debug = i; -+ else -+ return -EINVAL; -+ return count; -+} -+ -+PROC_DECLARE_RW(debug) -+ -+int wrap_procfs_init(void) -+{ -+ int ret; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) -+ struct user_namespace *ns = current_user_ns(); -+ proc_kuid = make_kuid(ns, proc_uid); -+ if (!uid_valid(proc_kuid)) { -+ ERROR("invalid UID\n"); -+ return -EINVAL; -+ } -+ proc_kgid = make_kgid(ns, proc_gid); -+ if (!gid_valid(proc_kgid)) { -+ ERROR("invalid GID\n"); -+ return -EINVAL; -+ } -+#endif -+ -+ wrap_procfs_entry = proc_mkdir(DRIVER_NAME, proc_net_root); -+ if (wrap_procfs_entry == NULL) { -+ ERROR("couldn't create procfs directory"); -+ return -ENOMEM; -+ } -+ proc_set_user(wrap_procfs_entry, proc_kuid, proc_kgid); -+ -+ ret = proc_make_entry_rw(debug, wrap_procfs_entry, NULL); -+ -+ return ret; -+} -+ -+void wrap_procfs_remove(void) -+{ -+ if (wrap_procfs_entry == NULL) -+ return; -+ remove_proc_entry("debug", wrap_procfs_entry); -+ proc_remove(wrap_procfs_entry); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/rtl.c linux-5.6.11-ndis/3rdparty/ndiswrapper/rtl.c ---- linux-5.6.11/3rdparty/ndiswrapper/rtl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/rtl.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,715 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * Copyright (C) 2006-2007 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+#include "rtl_exports.h" -+ -+wstdcall SIZE_T WIN_FUNC(RtlCompareMemory,3) -+ (const void *a, const void *b, SIZE_T len) -+{ -+ size_t i; -+ char *x, *y; -+ -+ ENTER1("%p %p %zd", a, b, len); -+ x = (char *)a; -+ y = (char *)b; -+ /* MSDN says this should return number of bytes that compare as -+ * equal. This can be interpreted as either all bytes that are -+ * equal in 'len' bytes or that only until the bytes compare as -+ * not equal. Initially we had it the former way, but Realtek driver -+ * doesn't like it that way - it takes many attempts to associate -+ * with WPA. ReactOS returns the number of bytes that are equal -+ * before the first differing byte. -+ * According to lords at #reactos, that is the way it should be -+ * and that msdn is wrong about it! -+ */ -+ for (i = 0; i < len && x[i] == y[i]; i++) -+ ; -+ return i; -+} -+ -+wstdcall void WIN_FUNC(RtlCopyMemory,3) -+ (void *dst, const void *src, SIZE_T length) -+{ -+ memcpy(dst, src, length); -+} -+ -+wstdcall void WIN_FUNC(RtlZeroMemory,2) -+ (void *dst, SIZE_T length) -+{ -+ memset(dst, 0, length); -+} -+ -+wstdcall void WIN_FUNC(RtlSecureZeroMemory,2) -+ (void *dst, SIZE_T length) -+{ -+ memset(dst, 0, length); -+} -+ -+wstdcall void WIN_FUNC(RtlFillMemory,3) -+ (void *dest, SIZE_T length, UCHAR fill) -+{ -+ memset(dest, fill, length); -+} -+ -+wstdcall void WIN_FUNC(RtlMoveMemory,3) -+ (void *dest, const void *src, SIZE_T length) -+{ -+ memmove(dest, src, length); -+} -+ -+wstdcall LONG WIN_FUNC(RtlCompareString,3) -+ (const struct ansi_string *s1, const struct ansi_string *s2, -+ BOOLEAN case_insensitive) -+{ -+ unsigned int len; -+ LONG ret = 0; -+ const char *p1, *p2; -+ -+ ENTER2(""); -+ len = min(s1->length, s2->length); -+ p1 = s1->buf; -+ p2 = s2->buf; -+ if (case_insensitive) -+ while (!ret && len--) -+ ret = toupper(*p1++) - toupper(*p2++); -+ else -+ while (!ret && len--) -+ ret = *p1++ - *p2++; -+ if (!ret) -+ ret = s1->length - s2->length; -+ EXIT2(return ret); -+} -+ -+wstdcall LONG WIN_FUNC(RtlCompareUnicodeString,3) -+ (const struct unicode_string *s1, const struct unicode_string *s2, -+ BOOLEAN case_insensitive) -+{ -+ unsigned int len; -+ LONG ret = 0; -+ const wchar_t *p1, *p2; -+ -+ ENTER2(""); -+ -+ len = min(s1->length, s2->length) / sizeof(wchar_t); -+ p1 = s1->buf; -+ p2 = s2->buf; -+ if (case_insensitive) -+ while (!ret && len--) -+ ret = toupper((u8)*p1++) - toupper((u8)*p2++); -+ else -+ while (!ret && len--) -+ ret = (u8)*p1++ - (u8)*p2++; -+ if (!ret) -+ ret = s1->length - s2->length; -+ TRACE2("len: %d, ret: %d", len, ret); -+ EXIT2(return ret); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(RtlEqualString,3) -+ (const struct ansi_string *s1, const struct ansi_string *s2, -+ BOOLEAN case_insensitive) -+{ -+ ENTER1(""); -+ if (s1->length != s2->length) -+ return FALSE; -+ return !RtlCompareString(s1, s2, case_insensitive); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(RtlEqualUnicodeString,3) -+ (const struct unicode_string *s1, const struct unicode_string *s2, -+ BOOLEAN case_insensitive) -+{ -+ if (s1->length != s2->length) -+ return FALSE; -+ return !RtlCompareUnicodeString(s1, s2, case_insensitive); -+} -+ -+wstdcall void WIN_FUNC(RtlCopyUnicodeString,2) -+ (struct unicode_string *dst, struct unicode_string *src) -+{ -+ ENTER1("%p, %p", dst, src); -+ if (src && src->buf && dst->buf) { -+ dst->length = min(src->length, dst->max_length); -+ memcpy(dst->buf, src->buf, dst->length); -+ if (dst->length < dst->max_length) -+ dst->buf[dst->length / sizeof(dst->buf[0])] = 0; -+ } else -+ dst->length = 0; -+ EXIT1(return); -+} -+ -+wstdcall void WIN_FUNC(RtlCopyString,2) -+ (struct ansi_string *dst, struct ansi_string *src) -+{ -+ ENTER1("%p, %p", dst, src); -+ if (src && src->buf && dst->buf) { -+ dst->length = min(src->length, dst->max_length); -+ memcpy(dst->buf, src->buf, dst->length); -+ if (dst->length < dst->max_length) -+ dst->buf[dst->length] = 0; -+ } else -+ dst->length = 0; -+ EXIT1(return); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlAppendUnicodeToString,2) -+ (struct unicode_string *dst, wchar_t *src) -+{ -+ if (src) { -+ int len; -+ for (len = 0; src[len]; len++) -+ ; -+ if (dst->length + (len * sizeof(dst->buf[0])) > dst->max_length) -+ return STATUS_BUFFER_TOO_SMALL; -+ memcpy(&dst->buf[dst->length], src, len * sizeof(dst->buf[0])); -+ dst->length += len * sizeof(dst->buf[0]); -+ if (dst->max_length > dst->length) -+ dst->buf[dst->length / sizeof(dst->buf[0])] = 0; -+ } -+ return STATUS_SUCCESS; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlAppendUnicodeStringToString,2) -+ (struct unicode_string *dst, struct unicode_string *src) -+{ -+ if (dst->max_length < src->length + dst->length) -+ return STATUS_BUFFER_TOO_SMALL; -+ if (src->length) { -+ memcpy(&dst->buf[dst->length], src->buf, src->length); -+ dst->length += src->length; -+ if (dst->max_length > dst->length) -+ dst->buf[dst->length / sizeof(dst->buf[0])] = 0; -+ } -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall ULONG WIN_FUNC(RtlxAnsiStringToUnicodeSize,1) -+ (const struct ansi_string *string) -+{ -+ int i; -+ -+ for (i = 0; i < string->max_length && string->buf[i]; i++) -+ ; -+ return i * sizeof(wchar_t); -+} -+ -+wstdcall ULONG WIN_FUNC(RtlxUnicodeStringToAnsiSize,1) -+ (const struct unicode_string *string) -+{ -+ int i; -+ -+ for (i = 0; i < string->max_length && string->buf[i]; i++) -+ ; -+ return i; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlAnsiStringToUnicodeString,3) -+ (struct unicode_string *dst, const struct ansi_string *src, -+ BOOLEAN alloc) -+{ -+ int i, n; -+ -+ n = RtlxAnsiStringToUnicodeSize(src); -+ TRACE2("%d, %d, %d, %d, %p", n, dst->max_length, src->length, -+ src->max_length, src->buf); -+ if (alloc == TRUE) { -+#if 0 -+ if (n == 0) { -+ dst->length = dst->max_length = 0; -+ dst->buf = NULL; -+ EXIT2(return STATUS_SUCCESS); -+ } -+#endif -+ dst->max_length = n + sizeof(dst->buf[0]); -+ dst->buf = ExAllocatePoolWithTag(NonPagedPool, -+ dst->max_length, 0); -+ if (!dst->buf) { -+ dst->max_length = dst->length = 0; -+ EXIT2(return STATUS_NO_MEMORY); -+ } -+ } else if (dst->max_length < n) -+ EXIT2(return STATUS_BUFFER_TOO_SMALL); -+ -+ dst->length = n; -+ n /= sizeof(dst->buf[0]); -+ for (i = 0; i < n; i++) -+ dst->buf[i] = src->buf[i]; -+ if (i * sizeof(dst->buf[0]) < dst->max_length) -+ dst->buf[i] = 0; -+ TRACE2("dst: length: %d, max_length: %d, string: %p", -+ dst->length, dst->max_length, src->buf); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlUnicodeStringToAnsiString,3) -+ (struct ansi_string *dst, const struct unicode_string *src, -+ BOOLEAN alloc) -+{ -+ int i, n; -+ -+ n = RtlxUnicodeStringToAnsiSize(src); -+ TRACE2("%d, %d, %d, %d, %p", n, dst->max_length, src->length, -+ src->max_length, src->buf); -+ if (alloc == TRUE) { -+#if 0 -+ if (n == 0) { -+ dst->length = dst->max_length = 0; -+ dst->buf = NULL; -+ EXIT2(return STATUS_SUCCESS); -+ } -+#endif -+ dst->max_length = n + sizeof(dst->buf[0]); -+ dst->buf = ExAllocatePoolWithTag(NonPagedPool, -+ dst->max_length, 0); -+ if (!dst->buf) { -+ dst->max_length = dst->length = 0; -+ EXIT1(return STATUS_NO_MEMORY); -+ } -+ } else if (dst->max_length < n) -+ EXIT2(return STATUS_BUFFER_TOO_SMALL); -+ -+ dst->length = n; -+ for (i = 0; i < n; i++) -+ dst->buf[i] = src->buf[i]; -+ if (i < dst->max_length) -+ dst->buf[i] = 0; -+ TRACE2("string: %p, len: %d(%d)", dst->buf, dst->length, -+ dst->max_length); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlUnicodeStringToInteger,3) -+ (struct unicode_string *ustring, ULONG base, ULONG *value) -+{ -+ int i, sign = 1; -+ ULONG res; -+ typeof(ustring->buf) string; -+ -+ if (ustring->length == 0) { -+ *value = 0; -+ return STATUS_SUCCESS; -+ } -+ -+ string = ustring->buf; -+ i = 0; -+ while (i < (ustring->length / sizeof(*string)) && string[i] == ' ') -+ i++; -+ if (string[i] == '+') -+ i++; -+ else if (string[i] == '-') { -+ i++; -+ sign = -1; -+ } -+ if (base == 0) { -+ base = 10; -+ if (i <= ((ustring->length / sizeof(*string)) - 2) && -+ string[i] == '0') { -+ i++; -+ if (string[i] == 'b') { -+ base = 2; -+ i++; -+ } else if (string[i] == 'o') { -+ base = 8; -+ i++; -+ } else if (string[i] == 'x') { -+ base = 16; -+ i++; -+ } -+ } -+ } -+ if (!(base == 2 || base == 8 || base == 10 || base == 16)) -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ -+ for (res = 0; i < (ustring->length / sizeof(*string)); i++) { -+ int v; -+ if (isdigit((char)string[i])) -+ v = string[i] - '0'; -+ else if (isxdigit((char)string[i])) -+ v = tolower((char)string[i]) - 'a' + 10; -+ else -+ v = base; -+ if (v >= base) -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ res = res * base + v; -+ } -+ *value = sign * res; -+ EXIT3(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlCharToInteger,3) -+ (const char *string, ULONG base, ULONG *value) -+{ -+ int sign = 1; -+ ULONG res; -+ -+ if (!string || !value) -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ while (*string == ' ') -+ string++; -+ if (*string == '+') -+ string++; -+ else if (*string == '-') { -+ string++; -+ sign = -1; -+ } -+ if (base == 0) { -+ base = 10; -+ if (*string == '0') { -+ string++; -+ if (*string == 'b') { -+ base = 2; -+ string++; -+ } else if (*string == 'o') { -+ base = 8; -+ string++; -+ } else if (*string == 'x') { -+ base = 16; -+ string++; -+ } -+ } -+ } -+ if (!(base == 2 || base == 8 || base == 10 || base == 16)) -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ -+ for (res = 0; *string; string++) { -+ int v; -+ if (isdigit(*string)) -+ v = *string - '0'; -+ else if (isxdigit(*string)) -+ v = tolower(*string) - 'a' + 10; -+ else -+ v = base; -+ if (v >= base) -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ res = res * base + v; -+ } -+ *value = sign * res; -+ EXIT3(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlIntegerToUnicodeString,3) -+ (ULONG value, ULONG base, struct unicode_string *ustring) -+{ -+ typeof(ustring->buf) buf = ustring->buf; -+ int i; -+ -+ if (base == 0) -+ base = 10; -+ if (!(base == 2 || base == 8 || base == 10 || base == 16)) -+ return STATUS_INVALID_PARAMETER; -+ for (i = 0; value && i < ustring->max_length / sizeof(*buf); i++) { -+ int r; -+ r = value % base; -+ value /= base; -+ if (r < 10) -+ buf[i] = r + '0'; -+ else -+ buf[i] = r + 'a' - 10; -+ } -+ if (value) -+ return STATUS_BUFFER_OVERFLOW; -+ ustring->length = i * sizeof(*buf); -+ return STATUS_SUCCESS; -+} -+ -+wstdcall LARGE_INTEGER WIN_FUNC(RtlConvertUlongToLargeInteger,1) -+ (ULONG ul) -+{ -+ LARGE_INTEGER li = ul; -+ return li; -+} -+ -+wfastcall USHORT WIN_FUNC(RtlUshortByteSwap,1) -+ (USHORT src) -+{ -+ return __swab16(src); -+} -+ -+wfastcall ULONG WIN_FUNC(RtlUlongByteSwap,1) -+ (ULONG src) -+{ -+ /* ULONG is 32 bits for both 32-bit and 64-bit architectures */ -+ return __swab32(src); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlUpcaseUnicodeString,3) -+ (struct unicode_string *dst, struct unicode_string *src, BOOLEAN alloc) -+{ -+ USHORT i, n; -+ -+ if (alloc) { -+ dst->buf = ExAllocatePoolWithTag(NonPagedPool, src->length, 0); -+ if (dst->buf) -+ dst->max_length = src->length; -+ else -+ EXIT2(return STATUS_NO_MEMORY); -+ } else { -+ if (dst->max_length < src->length) -+ EXIT2(return STATUS_BUFFER_OVERFLOW); -+ } -+ -+ n = src->length / sizeof(src->buf[0]); -+ for (i = 0; i < n; i++) -+ dst->buf[i] = toupper(src->buf[i]); -+ -+ dst->length = src->length; -+ EXIT3(return STATUS_SUCCESS); -+} -+ -+wstdcall void WIN_FUNC(RtlInitUnicodeString,2) -+ (struct unicode_string *dst, const wchar_t *src) -+{ -+ ENTER2("%p", dst); -+ if (dst == NULL) -+ EXIT1(return); -+ if (src == NULL) { -+ dst->max_length = dst->length = 0; -+ dst->buf = NULL; -+ } else { -+ int i; -+ for (i = 0; (char)src[i]; i++) -+ ; -+ dst->buf = (typeof(dst->buf))src; -+ dst->length = i * sizeof(dst->buf[0]); -+ dst->max_length = (i + 1) * sizeof(dst->buf[0]); -+ } -+ EXIT1(return); -+} -+ -+wstdcall void WIN_FUNC(RtlInitAnsiString,2) -+ (struct ansi_string *dst, const char *src) -+{ -+ ENTER2("%p", dst); -+ if (dst == NULL) -+ EXIT2(return); -+ if (src == NULL) { -+ dst->max_length = dst->length = 0; -+ dst->buf = NULL; -+ } else { -+ int i; -+ for (i = 0; src[i]; i++) -+ ; -+ dst->buf = (typeof(dst->buf))src; -+ dst->length = i; -+ dst->max_length = i + 1; -+ } -+ TRACE2("%p", dst->buf); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(RtlInitString,2) -+ (struct ansi_string *dst, const char *src) -+{ -+ ENTER2("%p", dst); -+ RtlInitAnsiString(dst, src); -+ EXIT2(return); -+} -+ -+wstdcall void WIN_FUNC(RtlFreeUnicodeString,1) -+ (struct unicode_string *string) -+{ -+ ENTER2("%p", string); -+ if (string == NULL) -+ return; -+ if (string->buf) -+ ExFreePool(string->buf); -+ string->length = string->max_length = 0; -+ string->buf = NULL; -+ return; -+} -+ -+wstdcall void WIN_FUNC(RtlFreeAnsiString,1) -+ (struct ansi_string *string) -+{ -+ ENTER2("%p", string); -+ if (string == NULL) -+ return; -+ if (string->buf) -+ ExFreePool(string->buf); -+ string->length = string->max_length = 0; -+ string->buf = NULL; -+ return; -+} -+ -+/* guid string is of the form: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ -+wstdcall NTSTATUS WIN_FUNC(RtlGUIDFromString,2) -+ (struct unicode_string *guid_string, struct guid *guid) -+{ -+ struct ansi_string ansi; -+ NTSTATUS ret; -+ int i, j, k, l, m; -+ -+ ret = RtlUnicodeStringToAnsiString(&ansi, guid_string, TRUE); -+ if (ret != STATUS_SUCCESS) -+ return ret; -+ if (ansi.length != 37 || ansi.buf[0] != '{' || -+ ansi.buf[36] != '}' || ansi.buf[9] != '-' || -+ ansi.buf[14] != '-' || ansi.buf[19] != '-' || -+ ansi.buf[24] != '-') { -+ RtlFreeAnsiString(&ansi); -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ } -+ memcpy(&guid->data4, &ansi.buf[29], sizeof(guid->data3)); -+ /* set end of data3 for scanf */ -+ ansi.buf[29] = 0; -+ if (sscanf(&ansi.buf[1], "%x", &i) == 1 && -+ sscanf(&ansi.buf[10], "%x", &j) == 1 && -+ sscanf(&ansi.buf[15], "%x", &k) == 1 && -+ sscanf(&ansi.buf[20], "%x", &l) == 1 && -+ sscanf(&ansi.buf[25], "%x", &m) == 1) { -+ guid->data1 = (i << 16) | (j < 8) | k; -+ guid->data2 = l; -+ guid->data3 = m; -+ ret = STATUS_SUCCESS; -+ } else -+ ret = STATUS_INVALID_PARAMETER; -+ RtlFreeAnsiString(&ansi); -+ return ret; -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlQueryRegistryValues,5) -+ (ULONG relative, wchar_t *path, struct rtl_query_registry_table *tbl, -+ void *context, void *env) -+{ -+ struct ansi_string ansi; -+ struct unicode_string unicode; -+ NTSTATUS status, ret; -+ static int i = 0; -+ -+ ENTER3("%x, %p", relative, tbl); -+// TODO(); -+ -+ RtlInitUnicodeString(&unicode, path); -+ if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE2("%s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ ret = STATUS_SUCCESS; -+ for (; tbl->name; tbl++) { -+ RtlInitUnicodeString(&unicode, tbl->name); -+ if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE2("name: %s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ TRACE2("flags: %08X", tbl->flags); -+ if (tbl->flags == RTL_QUERY_REGISTRY_DIRECT) { -+ TRACE2("type: %08X", tbl->def_type); -+ if (tbl->def_type == REG_DWORD) { -+ /* Atheros USB driver needs this, but -+ * don't know where and how to get its -+ * value */ -+ if (tbl->def_data) { -+ TRACE2("def_data: %x", -+ *(int *)tbl->def_data); -+ *(DWORD *)tbl->context = 0x5f292a + i++; -+// *(DWORD *)tbl->def_data; -+ } else -+ *(DWORD *)tbl->context = 0x2345dbe; -+ } -+ } else { -+ void *data; -+ ULONG type, length; -+ -+ if (!tbl->query_func) { -+ ERROR("oops: no query_func"); -+ ret = STATUS_INVALID_PARAMETER; -+ break; -+ } -+ if (tbl->flags & RTL_QUERY_REGISTRY_NOVALUE) { -+ data = NULL; -+ type = REG_NONE; -+ length = 0; -+ } else { -+ data = tbl->def_data; -+ type = tbl->def_type; -+ length = tbl->def_length;; -+ } -+ TRACE2("calling query_func: %p", tbl->query_func); -+ status = LIN2WIN6(tbl->query_func, tbl->name, type, -+ data, length, context, env); -+ TRACE2("status: %08X", status); -+ if (status) { -+ if (status == STATUS_BUFFER_TOO_SMALL) -+ ret = STATUS_BUFFER_TOO_SMALL; -+ else -+ EXIT2(return STATUS_INVALID_PARAMETER); -+ } -+ } -+ } -+ EXIT3(return ret); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlWriteRegistryValue,6) -+ (ULONG relative, wchar_t *path, wchar_t *name, ULONG type, -+ void *data, ULONG length) -+{ -+ struct ansi_string ansi; -+ struct unicode_string unicode; -+ -+ ENTER3("%d", relative); -+ TODO(); -+ -+ RtlInitUnicodeString(&unicode, path); -+ if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE2("%s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ RtlInitUnicodeString(&unicode, name); -+ if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) == -+ STATUS_SUCCESS) { -+ TRACE2("%s", ansi.buf); -+ RtlFreeAnsiString(&ansi); -+ } -+ EXIT5(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS WIN_FUNC(RtlDeleteRegistryValue,3) -+ (ULONG relative, wchar_t *path, wchar_t *name) -+{ -+ return STATUS_SUCCESS; -+} -+ -+wstdcall void WIN_FUNC(RtlAssert,4) -+ (char *failed_assertion, char *file_name, ULONG line_num, char *message) -+{ -+ ERROR("assertion '%s' failed at %s line %d%s", -+ failed_assertion, file_name, line_num, message ? message : ""); -+ return; -+} -+ -+wstdcall void WIN_FUNC(RtlUnwind,0) -+ (void) -+{ -+ TODO(); -+} -+ -+wstdcall void WIN_FUNC(RtlRaiseException,1) -+ (void *exception_record) -+{ -+ TODO(); -+} -+ -+wstdcall BOOLEAN WIN_FUNC(RtlIsServicePackVersionInstalled,1) -+ (ULONG version) -+{ -+ /* Assume we have all service packs */ -+ TRACE1("version: %d", version); -+ return TRUE; -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/usb.c linux-5.6.11-ndis/3rdparty/ndiswrapper/usb.c ---- linux-5.6.11/3rdparty/ndiswrapper/usb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/usb.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1501 @@ -+/* -+ * Copyright (C) 2004 Jan Kiszka -+ * Copyright (C) 2005 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ndis.h" -+#include "usb.h" -+#include "usb_exports.h" -+ -+#ifdef USB_DEBUG -+static unsigned int urb_id = 0; -+ -+#define DUMP_WRAP_URB(wrap_urb, dir) \ -+ USBTRACE("urb %p (%d) %s: buf: %p, len: %d, pipe: 0x%x, %d", \ -+ (wrap_urb)->urb, (wrap_urb)->id, \ -+ (dir == USB_DIR_OUT) ? "going down" : "coming back", \ -+ (wrap_urb)->urb->transfer_buffer, \ -+ (wrap_urb)->urb->transfer_buffer_length, \ -+ (wrap_urb)->urb->pipe, (wrap_urb)->urb->status) -+ -+#define DUMP_URB_BUFFER(urb, dir) \ -+ while (debug >= 2) { \ -+ int i; \ -+ char msg[20], *t; \ -+ if (!urb->transfer_buffer) \ -+ break; \ -+ if (!((usb_pipein(urb->pipe) && dir == USB_DIR_IN) || \ -+ (usb_pipeout(urb->pipe) && dir == USB_DIR_OUT))) \ -+ break; \ -+ t = msg; \ -+ t += sprintf(t, "%d: ", (urb)->actual_length); \ -+ for (i = 0; i < urb->actual_length && \ -+ t < &msg[sizeof(msg) - 4]; i++) \ -+ t += sprintf(t, "%02X ", \ -+ ((char *)urb->transfer_buffer)[i]); \ -+ *t = 0; \ -+ USBTRACE("%s", msg); \ -+ break; \ -+ } -+ -+#else -+ -+#define DUMP_WRAP_URB(wrap_urb, dir) (void)0 -+#define DUMP_URB_BUFFER(urb, dir) (void)0 -+ -+#endif -+ -+#define CUR_ALT_SETTING(intf) (intf)->cur_altsetting -+ -+#ifndef USB_CTRL_SET_TIMEOUT -+#define USB_CTRL_SET_TIMEOUT 5000 -+#endif -+ -+#ifndef USB_CTRL_GET_TIMEOUT -+#define USB_CTRL_GET_TIMEOUT 5000 -+#endif -+ -+#ifndef URB_NO_TRANSFER_DMA_MAP -+#define URB_NO_TRANSFER_DMA_MAP 0 -+#endif -+ -+/* wrap_urb->flags */ -+/* transfer_buffer for urb is allocated; free it in wrap_free_urb */ -+#define WRAP_URB_COPY_BUFFER 0x01 -+ -+static inline int wrap_cancel_urb(struct wrap_urb *wrap_urb) -+{ -+ int ret; -+ USBTRACE("%p, %p, %d", wrap_urb, wrap_urb->urb, wrap_urb->state); -+ if (wrap_urb->state != URB_SUBMITTED) -+ USBEXIT(return -1); -+ ret = usb_unlink_urb(wrap_urb->urb); -+ USBTRACE("ret: %d", ret); -+ if (ret == -EINPROGRESS) -+ return 0; -+ else { -+ WARNING("unlink failed: %d", ret); -+ return ret; -+ } -+} -+ -+#define URB_STATUS(wrap_urb) (wrap_urb->urb->status) -+ -+static struct nt_list wrap_urb_complete_list; -+static spinlock_t wrap_urb_complete_list_lock; -+ -+static struct work_struct wrap_urb_complete_work; -+static void wrap_urb_complete_worker(struct work_struct *dummy); -+ -+static void kill_all_urbs(struct wrap_device *wd, int complete) -+{ -+ struct nt_list *ent; -+ struct wrap_urb *wrap_urb; -+ KIRQL irql; -+ -+ USBTRACE("%d", wd->usb.num_alloc_urbs); -+ while (1) { -+ IoAcquireCancelSpinLock(&irql); -+ ent = RemoveHeadList(&wd->usb.wrap_urb_list); -+ IoReleaseCancelSpinLock(irql); -+ if (!ent) -+ break; -+ wrap_urb = container_of(ent, struct wrap_urb, list); -+ if (wrap_urb->state == URB_SUBMITTED) { -+ WARNING("Windows driver %s didn't free urb: %p", -+ wd->driver->name, wrap_urb->urb); -+ if (!complete) -+ wrap_urb->urb->complete = NULL; -+ usb_kill_urb(wrap_urb->urb); -+ } -+ USBTRACE("%p, %p", wrap_urb, wrap_urb->urb); -+ usb_free_urb(wrap_urb->urb); -+ kfree(wrap_urb); -+ } -+ wd->usb.num_alloc_urbs = 0; -+} -+ -+/* for a given Linux urb status code, return corresponding NT urb status */ -+static USBD_STATUS wrap_urb_status(int urb_status) -+{ -+ switch (urb_status) { -+ case 0: -+ return USBD_STATUS_SUCCESS; -+ case -EPROTO: -+ return USBD_STATUS_TIMEOUT; -+ case -EILSEQ: -+ return USBD_STATUS_CRC; -+ case -EPIPE: -+ return USBD_STATUS_INVALID_PIPE_HANDLE; -+ case -ECOMM: -+ return USBD_STATUS_DATA_OVERRUN; -+ case -ENOSR: -+ return USBD_STATUS_DATA_UNDERRUN; -+ case -EOVERFLOW: -+ return USBD_STATUS_BABBLE_DETECTED; -+ case -EREMOTEIO: -+ return USBD_STATUS_ERROR_SHORT_TRANSFER;; -+ case -ENODEV: -+ case -ESHUTDOWN: -+ case -ENOENT: -+ return USBD_STATUS_DEVICE_GONE; -+ case -ENOMEM: -+ return USBD_STATUS_NO_MEMORY; -+ case -EINVAL: -+ return USBD_STATUS_REQUEST_FAILED; -+ default: -+ return USBD_STATUS_NOT_SUPPORTED; -+ } -+} -+ -+/* for a given USBD_STATUS, return its corresponding NTSTATUS (for irp) */ -+static NTSTATUS nt_urb_irp_status(USBD_STATUS nt_urb_status) -+{ -+ switch (nt_urb_status) { -+ case USBD_STATUS_SUCCESS: -+ return STATUS_SUCCESS; -+ case USBD_STATUS_DEVICE_GONE: -+ return STATUS_DEVICE_REMOVED; -+ case USBD_STATUS_PENDING: -+ return STATUS_PENDING; -+ case USBD_STATUS_NOT_SUPPORTED: -+ return STATUS_NOT_IMPLEMENTED; -+ case USBD_STATUS_NO_MEMORY: -+ return STATUS_NO_MEMORY; -+ case USBD_STATUS_REQUEST_FAILED: -+ return STATUS_NOT_SUPPORTED; -+ default: -+ return STATUS_FAILURE; -+ } -+} -+ -+static void wrap_free_urb(struct urb *urb) -+{ -+ struct wrap_urb *wrap_urb = urb->context; -+ struct irp *irp = wrap_urb->irp; -+ struct wrap_device *wd = IRP_WRAP_DEVICE(irp); -+ -+ USBTRACE("freeing urb: %p", urb); -+ irp->cancel_routine = NULL; -+ IRP_WRAP_URB(irp) = NULL; -+ if (wrap_urb->flags & WRAP_URB_COPY_BUFFER) { -+ USBTRACE("freeing DMA buffer for URB: %p %p", -+ urb, urb->transfer_buffer); -+ usb_free_coherent(wd->usb.udev, urb->transfer_buffer_length, -+ urb->transfer_buffer, urb->transfer_dma); -+ } -+ kfree(urb->setup_packet); -+ if (wd->usb.num_alloc_urbs > MAX_ALLOCATED_URBS) { -+ IoAcquireCancelSpinLock(&irp->cancel_irql); -+ RemoveEntryList(&wrap_urb->list); -+ wd->usb.num_alloc_urbs--; -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ usb_free_urb(urb); -+ kfree(wrap_urb); -+ } else { -+ wrap_urb->state = URB_FREE; -+ wrap_urb->flags = 0; -+ wrap_urb->irp = NULL; -+ } -+ return; -+} -+ -+void wrap_suspend_urbs(struct wrap_device *wd) -+{ -+ /* TODO: do we need to cancel urbs? */ -+ USBTRACE("%p, %d", wd, wd->usb.num_alloc_urbs); -+} -+ -+void wrap_resume_urbs(struct wrap_device *wd) -+{ -+ /* TODO: do we need to resubmit urbs? */ -+ USBTRACE("%p, %d", wd, wd->usb.num_alloc_urbs); -+} -+ -+wstdcall void wrap_cancel_irp(struct device_object *dev_obj, struct irp *irp) -+{ -+ struct urb *urb; -+ struct wrap_urb *wrap_urb = IRP_WRAP_URB(irp); -+ -+ /* NB: this function is called holding Cancel spinlock */ -+ USBENTER("irp: %p", irp); -+ urb = wrap_urb->urb; -+ USBTRACE("canceling urb %p", urb); -+ if (wrap_cancel_urb(IRP_WRAP_URB(irp))) { -+ irp->cancel = FALSE; -+ ERROR("urb %p can't be canceled: %d", urb, wrap_urb->state); -+ } else -+ USBTRACE("urb %p canceled", urb); -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ return; -+} -+WIN_FUNC_DECL(wrap_cancel_irp,2) -+ -+static struct urb *wrap_alloc_urb(struct irp *irp, unsigned int pipe, -+ void *buf, unsigned int buf_len) -+{ -+ struct urb *urb; -+ gfp_t alloc_flags; -+ struct wrap_urb *wrap_urb; -+ struct wrap_device *wd; -+ -+ USBENTER("irp: %p", irp); -+ wd = IRP_WRAP_DEVICE(irp); -+ -+ /* Don't interfere with URB cleanup by the kernel */ -+ if (test_bit(HW_DISABLED, &wd->hw_status)) -+ return NULL; -+ -+ alloc_flags = irql_gfp(); -+ IoAcquireCancelSpinLock(&irp->cancel_irql); -+ urb = NULL; -+ nt_list_for_each_entry(wrap_urb, &wd->usb.wrap_urb_list, list) { -+ if (cmpxchg(&wrap_urb->state, URB_FREE, -+ URB_ALLOCATED) == URB_FREE) { -+ urb = wrap_urb->urb; -+ /* Clean URB but keep the refcount */ -+ memset((char *)urb + sizeof(urb->kref), 0, -+ sizeof(*urb) - sizeof(urb->kref)); -+ break; -+ } -+ } -+ if (!urb) { -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ wrap_urb = kzalloc(sizeof(*wrap_urb), alloc_flags); -+ if (!wrap_urb) { -+ WARNING("couldn't allocate memory"); -+ return NULL; -+ } -+ urb = usb_alloc_urb(0, alloc_flags); -+ if (!urb) { -+ WARNING("couldn't allocate urb"); -+ kfree(wrap_urb); -+ return NULL; -+ } -+ IoAcquireCancelSpinLock(&irp->cancel_irql); -+ wrap_urb->urb = urb; -+ wrap_urb->state = URB_ALLOCATED; -+ InsertTailList(&wd->usb.wrap_urb_list, &wrap_urb->list); -+ wd->usb.num_alloc_urbs++; -+ } -+ -+#ifdef URB_ASYNC_UNLINK -+ urb->transfer_flags |= URB_ASYNC_UNLINK; -+#elif defined(USB_ASYNC_UNLINK) -+ urb->transfer_flags |= USB_ASYNC_UNLINK; -+#endif -+ urb->context = wrap_urb; -+ wrap_urb->irp = irp; -+ IRP_WRAP_URB(irp) = wrap_urb; -+ /* called as Windows function */ -+ irp->cancel_routine = WIN_FUNC_PTR(wrap_cancel_irp,2); -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ USBTRACE("urb: %p", urb); -+ -+ urb->transfer_buffer_length = buf_len; -+ if (buf_len && buf && (!virt_addr_valid(buf) -+#if defined(CONFIG_HIGHMEM) || defined(CONFIG_HIGHMEM4G) -+ || PageHighMem(virt_to_page(buf)) -+#endif -+ )) { -+ urb->transfer_buffer = -+ usb_alloc_coherent(wd->usb.udev, buf_len, alloc_flags, -+ &urb->transfer_dma); -+ if (!urb->transfer_buffer) { -+ WARNING("couldn't allocate dma buf"); -+ IoAcquireCancelSpinLock(&irp->cancel_irql); -+ irp->cancel_routine = NULL; -+ wrap_urb->state = URB_FREE; -+ wrap_urb->irp = NULL; -+ IRP_WRAP_URB(irp) = NULL; -+ IoReleaseCancelSpinLock(irp->cancel_irql); -+ return NULL; -+ } -+ if (urb->transfer_dma) -+ urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; -+ wrap_urb->flags |= WRAP_URB_COPY_BUFFER; -+ if (usb_pipeout(pipe)) -+ memcpy(urb->transfer_buffer, buf, buf_len); -+ USBTRACE("DMA buf for urb %p: %p", urb, urb->transfer_buffer); -+ } else -+ urb->transfer_buffer = buf; -+ return urb; -+} -+ -+static USBD_STATUS wrap_submit_urb(struct irp *irp) -+{ -+ int ret; -+ struct wrap_urb *wrap_urb = IRP_WRAP_URB(irp); -+ struct urb *urb = wrap_urb->urb; -+ union nt_urb *nt_urb = IRP_URB(irp); -+ -+#ifdef USB_DEBUG -+ if (wrap_urb->state != URB_ALLOCATED) { -+ ERROR("urb %p is in wrong state: %d", -+ urb, wrap_urb->state); -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_REQUEST_FAILED; -+ return NT_URB_STATUS(nt_urb); -+ } -+ wrap_urb->id = pre_atomic_add(urb_id, 1); -+#endif -+ DUMP_WRAP_URB(IRP_WRAP_URB(irp), USB_DIR_OUT); -+ irp->io_status.status = STATUS_PENDING; -+ irp->io_status.info = 0; -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_PENDING; -+ IoMarkIrpPending(irp); -+ DUMP_URB_BUFFER(urb, USB_DIR_OUT); -+ USBTRACE("%p", urb); -+ wrap_urb->state = URB_SUBMITTED; -+ ret = usb_submit_urb(urb, irql_gfp()); -+ if (ret) { -+ USBTRACE("ret: %d", ret); -+ wrap_free_urb(urb); -+ /* we assume that IRP was not in pending state before */ -+ IoUnmarkIrpPending(irp); -+ NT_URB_STATUS(nt_urb) = wrap_urb_status(ret); -+ USBEXIT(return NT_URB_STATUS(nt_urb)); -+ } else -+ USBEXIT(return USBD_STATUS_PENDING); -+} -+ -+static void wrap_urb_complete(struct urb *urb ISR_PT_REGS_PARAM_DECL) -+{ -+ struct irp *irp; -+ struct wrap_urb *wrap_urb; -+ -+ wrap_urb = urb->context; -+ USBTRACE("%p (%p) completed", wrap_urb, urb); -+ irp = wrap_urb->irp; -+ DUMP_WRAP_URB(wrap_urb, USB_DIR_IN); -+ irp->cancel_routine = NULL; -+#ifdef USB_DEBUG -+ if (wrap_urb->state != URB_SUBMITTED) { -+ WARNING("urb %p in wrong state: %d (%d)", urb, wrap_urb->state, -+ urb->status); -+ return; -+ } -+#endif -+ wrap_urb->state = URB_COMPLETED; -+ spin_lock(&wrap_urb_complete_list_lock); -+ InsertTailList(&wrap_urb_complete_list, &wrap_urb->complete_list); -+ spin_unlock(&wrap_urb_complete_list_lock); -+ queue_work(ntos_wq, &wrap_urb_complete_work); -+} -+ -+/* one worker for all devices */ -+static void wrap_urb_complete_worker(struct work_struct *dummy) -+{ -+ struct irp *irp; -+ struct urb *urb; -+ struct usbd_bulk_or_intr_transfer *bulk_int_tx; -+ struct usbd_vendor_or_class_request *vc_req; -+ union nt_urb *nt_urb; -+ struct wrap_urb *wrap_urb; -+ struct nt_list *ent; -+ unsigned long flags; -+ -+ USBENTER(""); -+ while (1) { -+ spin_lock_irqsave(&wrap_urb_complete_list_lock, flags); -+ ent = RemoveHeadList(&wrap_urb_complete_list); -+ spin_unlock_irqrestore(&wrap_urb_complete_list_lock, flags); -+ if (!ent) -+ break; -+ wrap_urb = container_of(ent, struct wrap_urb, complete_list); -+ urb = wrap_urb->urb; -+#ifdef USB_DEBUG -+ if (wrap_urb->state != URB_COMPLETED && -+ wrap_urb->state != URB_INT_UNLINKED) -+ WARNING("urb %p in wrong state: %d", -+ urb, wrap_urb->state); -+#endif -+ irp = wrap_urb->irp; -+ DUMP_IRP(irp); -+ nt_urb = IRP_URB(irp); -+ USBTRACE("urb: %p, nt_urb: %p, status: %d", -+ urb, nt_urb, urb->status); -+ switch (urb->status) { -+ case 0: -+ /* successfully transferred */ -+ irp->io_status.info = urb->actual_length; -+ if (nt_urb->header.function == -+ URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) { -+ bulk_int_tx = &nt_urb->bulk_int_transfer; -+ bulk_int_tx->transfer_buffer_length = -+ urb->actual_length; -+ DUMP_URB_BUFFER(urb, USB_DIR_IN); -+ if ((wrap_urb->flags & WRAP_URB_COPY_BUFFER) && -+ usb_pipein(urb->pipe)) -+ memcpy(bulk_int_tx->transfer_buffer, -+ urb->transfer_buffer, -+ urb->actual_length); -+ } else { // vendor or class request -+ vc_req = &nt_urb->vendor_class_request; -+ vc_req->transfer_buffer_length = -+ urb->actual_length; -+ DUMP_URB_BUFFER(urb, USB_DIR_IN); -+ if ((wrap_urb->flags & WRAP_URB_COPY_BUFFER) && -+ usb_pipein(urb->pipe)) -+ memcpy(vc_req->transfer_buffer, -+ urb->transfer_buffer, -+ urb->actual_length); -+ } -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_SUCCESS; -+ irp->io_status.status = STATUS_SUCCESS; -+ break; -+ case -ENOENT: -+ case -ECONNRESET: -+ /* urb canceled */ -+ irp->io_status.info = 0; -+ TRACE2("urb %p canceled", urb); -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_SUCCESS; -+ irp->io_status.status = STATUS_CANCELLED; -+ break; -+ default: -+ TRACE2("irp: %p, urb: %p, status: %d/%d", -+ irp, urb, urb->status, wrap_urb->state); -+ irp->io_status.info = 0; -+ NT_URB_STATUS(nt_urb) = wrap_urb_status(urb->status); -+ irp->io_status.status = -+ nt_urb_irp_status(NT_URB_STATUS(nt_urb)); -+ break; -+ } -+ wrap_free_urb(urb); -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ } -+ USBEXIT(return); -+} -+ -+static USBD_STATUS wrap_bulk_or_intr_trans(struct irp *irp) -+{ -+ struct usb_endpoint_descriptor *pipe_handle; -+ struct urb *urb; -+ unsigned int pipe; -+ struct usbd_bulk_or_intr_transfer *bulk_int_tx; -+ USBD_STATUS status; -+ struct wrap_device *wd = IRP_WRAP_DEVICE(irp); -+ struct usb_device *udev = wd->usb.udev; -+ union nt_urb *nt_urb = IRP_URB(irp); -+ -+ bulk_int_tx = &nt_urb->bulk_int_transfer; -+ pipe_handle = bulk_int_tx->pipe_handle; -+ USBTRACE("flags: 0x%x, length: %u, buffer: %p, handle: %p", -+ bulk_int_tx->transfer_flags, -+ bulk_int_tx->transfer_buffer_length, -+ bulk_int_tx->transfer_buffer, pipe_handle); -+ -+ if (USBD_IS_BULK_PIPE(pipe_handle)) { -+ if (bulk_int_tx->transfer_flags & USBD_TRANSFER_DIRECTION_IN) -+ pipe = usb_rcvbulkpipe(udev, -+ pipe_handle->bEndpointAddress); -+ else -+ pipe = usb_sndbulkpipe(udev, -+ pipe_handle->bEndpointAddress); -+ } else { -+ if (bulk_int_tx->transfer_flags & USBD_TRANSFER_DIRECTION_IN) -+ pipe = usb_rcvintpipe(udev, -+ pipe_handle->bEndpointAddress); -+ else -+ pipe = usb_sndintpipe(udev, -+ pipe_handle->bEndpointAddress); -+ } -+ -+ DUMP_IRP(irp); -+ urb = wrap_alloc_urb(irp, pipe, bulk_int_tx->transfer_buffer, -+ bulk_int_tx->transfer_buffer_length); -+ if (!urb) { -+ ERROR("couldn't allocate urb"); -+ return USBD_STATUS_NO_MEMORY; -+ } -+ if (usb_pipein(pipe) && -+ (!(bulk_int_tx->transfer_flags & USBD_SHORT_TRANSFER_OK))) { -+ USBTRACE("short not ok"); -+ urb->transfer_flags |= URB_SHORT_NOT_OK; -+ } -+ if (usb_pipebulk(pipe)) { -+ usb_fill_bulk_urb(urb, udev, pipe, urb->transfer_buffer, -+ bulk_int_tx->transfer_buffer_length, -+ wrap_urb_complete, urb->context); -+ USBTRACE("submitting bulk urb %p on pipe 0x%x (ep 0x%x)", -+ urb, urb->pipe, pipe_handle->bEndpointAddress); -+ } else { -+ usb_fill_int_urb(urb, udev, pipe, urb->transfer_buffer, -+ bulk_int_tx->transfer_buffer_length, -+ wrap_urb_complete, urb->context, -+ pipe_handle->bInterval); -+ USBTRACE("submitting interrupt urb %p on pipe 0x%x (ep 0x%x), " -+ "intvl: %d", urb, urb->pipe, -+ pipe_handle->bEndpointAddress, pipe_handle->bInterval); -+ } -+ status = wrap_submit_urb(irp); -+ USBTRACE("status: %08X", status); -+ USBEXIT(return status); -+} -+ -+static USBD_STATUS wrap_vendor_or_class_req(struct irp *irp) -+{ -+ u8 req_type; -+ unsigned int pipe; -+ struct usbd_vendor_or_class_request *vc_req; -+ USBD_STATUS status; -+ struct urb *urb; -+ struct usb_ctrlrequest *dr; -+ struct wrap_device *wd = IRP_WRAP_DEVICE(irp); -+ struct usb_device *udev = wd->usb.udev; -+ union nt_urb *nt_urb = IRP_URB(irp); -+ -+ vc_req = &nt_urb->vendor_class_request; -+ USBTRACE("bits: %x, req: %x, val: %08x, index: %08x, flags: %x," -+ "buf: %p, len: %d", vc_req->reserved_bits, vc_req->request, -+ vc_req->value, vc_req->index, vc_req->transfer_flags, -+ vc_req->transfer_buffer, vc_req->transfer_buffer_length); -+ -+ USBTRACE("%x", nt_urb->header.function); -+ switch (nt_urb->header.function) { -+ case URB_FUNCTION_VENDOR_DEVICE: -+ req_type = USB_TYPE_VENDOR | USB_RECIP_DEVICE; -+ break; -+ case URB_FUNCTION_VENDOR_INTERFACE: -+ req_type = USB_TYPE_VENDOR | USB_RECIP_INTERFACE; -+ break; -+ case URB_FUNCTION_VENDOR_ENDPOINT: -+ req_type = USB_TYPE_VENDOR | USB_RECIP_ENDPOINT; -+ break; -+ case URB_FUNCTION_VENDOR_OTHER: -+ req_type = USB_TYPE_VENDOR | USB_RECIP_OTHER; -+ break; -+ case URB_FUNCTION_CLASS_DEVICE: -+ req_type = USB_TYPE_CLASS | USB_RECIP_DEVICE; -+ break; -+ case URB_FUNCTION_CLASS_INTERFACE: -+ req_type = USB_TYPE_CLASS | USB_RECIP_INTERFACE; -+ break; -+ case URB_FUNCTION_CLASS_ENDPOINT: -+ req_type = USB_TYPE_CLASS | USB_RECIP_ENDPOINT; -+ break; -+ case URB_FUNCTION_CLASS_OTHER: -+ req_type = USB_TYPE_CLASS | USB_RECIP_OTHER; -+ break; -+ default: -+ ERROR("unknown request type: %x", nt_urb->header.function); -+ req_type = 0; -+ break; -+ } -+ -+ req_type |= vc_req->reserved_bits; -+ USBTRACE("req type: %08x", req_type); -+ -+ if (vc_req->transfer_flags & USBD_TRANSFER_DIRECTION_IN) { -+ pipe = usb_rcvctrlpipe(udev, 0); -+ req_type |= USB_DIR_IN; -+ USBTRACE("pipe: %x, dir in", pipe); -+ } else { -+ pipe = usb_sndctrlpipe(udev, 0); -+ req_type |= USB_DIR_OUT; -+ USBTRACE("pipe: %x, dir out", pipe); -+ } -+ urb = wrap_alloc_urb(irp, pipe, vc_req->transfer_buffer, -+ vc_req->transfer_buffer_length); -+ if (!urb) { -+ ERROR("couldn't allocate urb"); -+ return USBD_STATUS_NO_MEMORY; -+ } -+ -+ if (usb_pipein(pipe) && -+ (!(vc_req->transfer_flags & USBD_SHORT_TRANSFER_OK))) { -+ USBTRACE("short not ok"); -+ urb->transfer_flags |= URB_SHORT_NOT_OK; -+ } -+ -+ dr = kzalloc(sizeof(*dr), irql_gfp()); -+ if (!dr) { -+ ERROR("couldn't allocate memory"); -+ wrap_free_urb(urb); -+ return USBD_STATUS_NO_MEMORY; -+ } -+ dr->bRequestType = req_type; -+ dr->bRequest = vc_req->request; -+ dr->wValue = cpu_to_le16(vc_req->value); -+ dr->wIndex = cpu_to_le16((u16)vc_req->index); -+ dr->wLength = cpu_to_le16((u16)urb->transfer_buffer_length); -+ -+ usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, -+ urb->transfer_buffer, urb->transfer_buffer_length, -+ wrap_urb_complete, urb->context); -+ status = wrap_submit_urb(irp); -+ USBTRACE("status: %08X", status); -+ USBEXIT(return status); -+} -+ -+static USBD_STATUS wrap_reset_pipe(struct usb_device *udev, struct irp *irp) -+{ -+ int ret; -+ union nt_urb *nt_urb; -+ struct usb_endpoint_descriptor *pipe_handle; -+ unsigned int pipe1, pipe2; -+ -+ nt_urb = IRP_URB(irp); -+ pipe_handle = nt_urb->pipe_req.pipe_handle; -+ /* TODO: not clear if both directions should be cleared? */ -+ if (USBD_IS_BULK_PIPE(pipe_handle)) { -+ pipe1 = usb_rcvbulkpipe(udev, pipe_handle->bEndpointAddress); -+ pipe2 = usb_sndbulkpipe(udev, pipe_handle->bEndpointAddress); -+ } else if (USBD_IS_INT_PIPE(pipe_handle)) { -+ pipe1 = usb_rcvintpipe(udev, pipe_handle->bEndpointAddress); -+ pipe2 = pipe1; -+ } else { -+ WARNING("invalid pipe %d", pipe_handle->bEndpointAddress); -+ return USBD_STATUS_INVALID_PIPE_HANDLE; -+ } -+ USBTRACE("ep: %d, pipe: 0x%x", pipe_handle->bEndpointAddress, pipe1); -+ ret = usb_clear_halt(udev, pipe1); -+ if (ret) -+ USBTRACE("resetting pipe %d failed: %d", pipe1, ret); -+ if (pipe2 != pipe1) { -+ ret = usb_clear_halt(udev, pipe2); -+ if (ret) -+ USBTRACE("resetting pipe %d failed: %d", pipe2, ret); -+ } -+// return wrap_urb_status(ret); -+ return USBD_STATUS_SUCCESS; -+} -+ -+static USBD_STATUS wrap_abort_pipe(struct usb_device *udev, struct irp *irp) -+{ -+ union nt_urb *nt_urb; -+ struct usb_endpoint_descriptor *pipe_handle; -+ struct wrap_urb *wrap_urb; -+ struct wrap_device *wd; -+ KIRQL irql; -+ -+ wd = IRP_WRAP_DEVICE(irp); -+ nt_urb = IRP_URB(irp); -+ pipe_handle = nt_urb->pipe_req.pipe_handle; -+ USBENTER("%p, %x", irp, pipe_handle->bEndpointAddress); -+ IoAcquireCancelSpinLock(&irql); -+ nt_list_for_each_entry(wrap_urb, &wd->usb.wrap_urb_list, list) { -+ USBTRACE("%p, %p, %d, %x, %x", wrap_urb, wrap_urb->urb, -+ wrap_urb->state, wrap_urb->urb->pipe, -+ usb_pipeendpoint(wrap_urb->urb->pipe)); -+ /* for WG111T driver, urbs for endpoint 0 should also -+ * be canceled */ -+ if ((usb_pipeendpoint(wrap_urb->urb->pipe) == -+ pipe_handle->bEndpointAddress) || -+ (usb_pipeendpoint(wrap_urb->urb->pipe) == 0)) { -+ if (wrap_cancel_urb(wrap_urb) == 0) -+ USBTRACE("canceled wrap_urb: %p", wrap_urb); -+ } -+ } -+ IoReleaseCancelSpinLock(irql); -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_CANCELED; -+ USBEXIT(return USBD_STATUS_SUCCESS); -+} -+ -+static USBD_STATUS wrap_set_clear_feature(struct usb_device *udev, -+ struct irp *irp) -+{ -+ union nt_urb *nt_urb; -+ struct urb_control_feature_request *feat_req; -+ int ret = 0; -+ __u8 request, type; -+ __u16 feature; -+ -+ nt_urb = IRP_URB(irp); -+ feat_req = &nt_urb->feat_req; -+ feature = feat_req->feature_selector; -+ switch (nt_urb->header.function) { -+ case URB_FUNCTION_SET_FEATURE_TO_DEVICE: -+ request = USB_REQ_SET_FEATURE; -+ type = USB_DT_DEVICE; -+ break; -+ case URB_FUNCTION_SET_FEATURE_TO_INTERFACE: -+ request = USB_REQ_SET_FEATURE; -+ type = USB_DT_INTERFACE; -+ break; -+ case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT: -+ request = USB_REQ_SET_FEATURE; -+ type = USB_DT_ENDPOINT; -+ break; -+ case URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE: -+ request = USB_REQ_CLEAR_FEATURE; -+ type = USB_DT_DEVICE; -+ break; -+ case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE: -+ request = USB_REQ_CLEAR_FEATURE; -+ type = USB_DT_INTERFACE; -+ break; -+ case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT: -+ request = USB_REQ_CLEAR_FEATURE; -+ type = USB_DT_ENDPOINT; -+ break; -+ default: -+ WARNING("invalid function: %x", nt_urb->header.function); -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_NOT_SUPPORTED; -+ return NT_URB_STATUS(nt_urb); -+ } -+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), request, type, -+ feature, feat_req->index, NULL, 0, 1000); -+ NT_URB_STATUS(nt_urb) = wrap_urb_status(ret); -+ USBEXIT(return NT_URB_STATUS(nt_urb)); -+} -+ -+static USBD_STATUS wrap_get_status_request(struct usb_device *udev, -+ struct irp *irp) -+{ -+ union nt_urb *nt_urb; -+ struct urb_control_get_status_request *status_req; -+ int ret = 0; -+ __u8 type; -+ -+ nt_urb = IRP_URB(irp); -+ status_req = &nt_urb->status_req; -+ switch (nt_urb->header.function) { -+ case URB_FUNCTION_GET_STATUS_FROM_DEVICE: -+ type = USB_RECIP_DEVICE; -+ break; -+ case URB_FUNCTION_GET_STATUS_FROM_INTERFACE: -+ type = USB_RECIP_INTERFACE; -+ break; -+ case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT: -+ type = USB_RECIP_ENDPOINT; -+ break; -+ default: -+ WARNING("invalid function: %x", nt_urb->header.function); -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_NOT_SUPPORTED; -+ return NT_URB_STATUS(nt_urb); -+ } -+ assert(status_req->transfer_buffer_length == sizeof(u16)); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ ret = usb_get_std_status(udev, type, status_req->index, -+ status_req->transfer_buffer); -+#else -+ ret = usb_get_status(udev, type, status_req->index, -+ status_req->transfer_buffer); -+#endif -+ if (ret >= 0) { -+ assert(ret <= status_req->transfer_buffer_length); -+ status_req->transfer_buffer_length = ret; -+ NT_URB_STATUS(nt_urb) = USBD_STATUS_SUCCESS; -+ } else -+ NT_URB_STATUS(nt_urb) = wrap_urb_status(ret); -+ USBEXIT(return NT_URB_STATUS(nt_urb)); -+} -+ -+static void set_intf_pipe_info(struct wrap_device *wd, -+ struct usb_interface *usb_intf, -+ struct usbd_interface_information *intf) -+{ -+ int i; -+ struct usb_endpoint_descriptor *ep; -+ struct usbd_pipe_information *pipe; -+ -+ for (i = 0; i < CUR_ALT_SETTING(usb_intf)->desc.bNumEndpoints; i++) { -+ ep = &(CUR_ALT_SETTING(usb_intf)->endpoint[i]).desc; -+ if (i >= intf->bNumEndpoints) { -+ ERROR("intf %p has only %d endpoints, " -+ "ignoring endpoints above %d", -+ intf, intf->bNumEndpoints, i); -+ break; -+ } -+ pipe = &intf->pipes[i]; -+ -+ if (pipe->flags & USBD_PF_CHANGE_MAX_PACKET) -+ USBTRACE("pkt_sz: %d: %d", pipe->wMaxPacketSize, -+ pipe->max_tx_size); -+ USBTRACE("driver wants max_tx_size to %d", -+ pipe->max_tx_size); -+ -+ pipe->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize); -+ pipe->bEndpointAddress = ep->bEndpointAddress; -+ pipe->type = ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; -+ if (pipe->type == UsbdPipeTypeInterrupt) { -+ /* Windows and Linux differ in how the -+ * bInterval is interpreted */ -+ /* for low speed: -+ interval (Windows) -> frames per ms (Linux) -+ 0 to 15 -> 8 -+ 16 to 35 -> 16 -+ 36 to 255 -> 32 -+ -+ for full speed: interval -> frames per ms -+ 1 -> 1 -+ 2 to 3 -> 2 -+ 4 to 7 -> 4 -+ 8 to 15 -> 8 -+ 16 to 31 -> 16 -+ 32 to 255 -> 32 -+ -+ for high speed: interval -> microframes -+ 1 -> 1 -+ 2 -> 2 -+ 3 -> 4 -+ 4 -> 8 -+ 5 -> 16 -+ 6 -> 32 -+ 7 to 255 -> 32 -+ */ -+ if (wd->usb.udev->speed == USB_SPEED_LOW) -+ pipe->bInterval = ep->bInterval + 5; -+ else if (wd->usb.udev->speed == USB_SPEED_FULL) -+ pipe->bInterval = ep->bInterval; -+ else { -+ int j, k; -+ for (j = k = 1; j < ep->bInterval; k++) -+ j *= 2; -+ pipe->bInterval = k; -+ } -+ } -+ pipe->handle = ep; -+ USBTRACE("%d: ep 0x%x, type %d, pkt_sz %d, intv %d (%d)," -+ "type: %d, handle %p", i, ep->bEndpointAddress, -+ ep->bmAttributes, pipe->wMaxPacketSize, ep->bInterval, -+ pipe->bInterval, pipe->type, pipe->handle); -+ } -+} -+ -+static USBD_STATUS wrap_select_configuration(struct wrap_device *wd, -+ union nt_urb *nt_urb, -+ struct irp *irp) -+{ -+ int i, ret; -+ struct usbd_select_configuration *sel_conf; -+ struct usb_device *udev; -+ struct usbd_interface_information *intf; -+ struct usb_config_descriptor *config; -+ struct usb_interface *usb_intf; -+ -+ udev = wd->usb.udev; -+ sel_conf = &nt_urb->select_conf; -+ config = sel_conf->config; -+ USBTRACE("%p", config); -+ if (config == NULL) { -+ kill_all_urbs(wd, 1); -+ ret = usb_reset_configuration(udev); -+ return wrap_urb_status(ret); -+ } -+ -+ USBTRACE("conf: %d, type: %d, length: %d, numif: %d, attr: %08x", -+ config->bConfigurationValue, config->bDescriptorType, -+ config->wTotalLength, config->bNumInterfaces, -+ config->bmAttributes); -+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), -+ USB_REQ_SET_CONFIGURATION, 0, -+ config->bConfigurationValue, 0, -+ NULL, 0, USB_CTRL_SET_TIMEOUT); -+ if (ret < 0) { -+ ERROR("ret: %d", ret); -+ return wrap_urb_status(ret); -+ } -+ sel_conf->handle = udev->actconfig; -+ intf = &sel_conf->intf; -+ for (i = 0; i < config->bNumInterfaces && intf->bLength > 0; -+ i++, intf = (((void *)intf) + intf->bLength)) { -+ -+ USBTRACE("intf: %d, alt setting: %d", -+ intf->bInterfaceNumber, intf->bAlternateSetting); -+ ret = usb_set_interface(udev, intf->bInterfaceNumber, -+ intf->bAlternateSetting); -+ if (ret < 0) { -+ ERROR("failed with %d", ret); -+ return wrap_urb_status(ret); -+ } -+ usb_intf = usb_ifnum_to_if(udev, intf->bInterfaceNumber); -+ if (!usb_intf) { -+ ERROR("couldn't obtain ifnum"); -+ return USBD_STATUS_REQUEST_FAILED; -+ } -+ USBTRACE("intf: %p, num ep: %d", intf, intf->bNumEndpoints); -+ set_intf_pipe_info(wd, usb_intf, intf); -+ } -+ return USBD_STATUS_SUCCESS; -+} -+ -+static USBD_STATUS wrap_select_interface(struct wrap_device *wd, -+ union nt_urb *nt_urb, -+ struct irp *irp) -+{ -+ int ret; -+ struct usbd_select_interface *sel_intf; -+ struct usb_device *udev; -+ struct usbd_interface_information *intf; -+ struct usb_interface *usb_intf; -+ -+ udev = wd->usb.udev; -+ sel_intf = &nt_urb->select_intf; -+ intf = &sel_intf->intf; -+ -+ ret = usb_set_interface(udev, intf->bInterfaceNumber, -+ intf->bAlternateSetting); -+ if (ret < 0) { -+ ERROR("failed with %d", ret); -+ return wrap_urb_status(ret); -+ } -+ usb_intf = usb_ifnum_to_if(udev, intf->bInterfaceNumber); -+ if (!usb_intf) { -+ ERROR("couldn't get interface information"); -+ return USBD_STATUS_REQUEST_FAILED; -+ } -+ USBTRACE("intf: %p, num ep: %d", usb_intf, intf->bNumEndpoints); -+ set_intf_pipe_info(wd, usb_intf, intf); -+ return USBD_STATUS_SUCCESS; -+} -+ -+static int wrap_usb_get_string(struct usb_device *udev, unsigned short langid, -+ unsigned char index, void *buf, int size) -+{ -+ int i, ret; -+ /* if langid is 0, return array of languages supported in -+ * buf */ -+ for (i = 0; i < 3; i++) { -+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), -+ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, -+ (USB_DT_STRING << 8) + index, langid, -+ buf, size, USB_CTRL_GET_TIMEOUT); -+ if (ret > 0 || ret == -EPIPE) -+ break; -+ } -+ return ret; -+} -+ -+static USBD_STATUS wrap_get_descriptor(struct wrap_device *wd, -+ union nt_urb *nt_urb, struct irp *irp) -+{ -+ struct usbd_control_descriptor_request *control_desc; -+ int ret = 0; -+ struct usb_device *udev; -+ -+ udev = wd->usb.udev; -+ control_desc = &nt_urb->control_desc; -+ USBTRACE("desctype = %d, descindex = %d, transfer_buffer = %p," -+ "transfer_buffer_length = %d", control_desc->desc_type, -+ control_desc->index, control_desc->transfer_buffer, -+ control_desc->transfer_buffer_length); -+ -+ if (control_desc->desc_type == USB_DT_STRING) { -+ USBTRACE("langid: %x", control_desc->language_id); -+ ret = wrap_usb_get_string(udev, control_desc->language_id, -+ control_desc->index, -+ control_desc->transfer_buffer, -+ control_desc->transfer_buffer_length); -+ } else { -+ ret = usb_get_descriptor(udev, control_desc->desc_type, -+ control_desc->index, -+ control_desc->transfer_buffer, -+ control_desc->transfer_buffer_length); -+ } -+ if (ret < 0) { -+ USBTRACE("request %d failed: %d", control_desc->desc_type, ret); -+ control_desc->transfer_buffer_length = 0; -+ return wrap_urb_status(ret); -+ } else { -+ USBTRACE("ret: %08x", ret); -+ control_desc->transfer_buffer_length = ret; -+ irp->io_status.info = ret; -+ return USBD_STATUS_SUCCESS; -+ } -+} -+ -+static USBD_STATUS wrap_process_nt_urb(struct irp *irp) -+{ -+ USBD_STATUS status; -+ struct wrap_device *wd = IRP_WRAP_DEVICE(irp); -+ struct usb_device *udev = wd->usb.udev; -+ union nt_urb *nt_urb = IRP_URB(irp); -+ -+ USBENTER("nt_urb = %p, irp = %p, length = %d, function = %x", -+ nt_urb, irp, nt_urb->header.length, nt_urb->header.function); -+ -+ if (test_bit(HW_DISABLED, &wd->hw_status)) { -+ status = USBD_STATUS_DEVICE_GONE; -+ NT_URB_STATUS(nt_urb) = status; -+ return status; -+ } -+ -+ DUMP_IRP(irp); -+ switch (nt_urb->header.function) { -+ /* bulk/int and vendor/class urbs are submitted to -+ * Linux USB core; if the call is successful, urb's -+ * completion worker will return IRP later */ -+ case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: -+ USBTRACE("submitting bulk/int irp: %p", irp); -+ status = wrap_bulk_or_intr_trans(irp); -+ break; -+ -+ case URB_FUNCTION_VENDOR_DEVICE: -+ case URB_FUNCTION_VENDOR_INTERFACE: -+ case URB_FUNCTION_VENDOR_ENDPOINT: -+ case URB_FUNCTION_VENDOR_OTHER: -+ case URB_FUNCTION_CLASS_DEVICE: -+ case URB_FUNCTION_CLASS_INTERFACE: -+ case URB_FUNCTION_CLASS_ENDPOINT: -+ case URB_FUNCTION_CLASS_OTHER: -+ USBTRACE("submitting vendor/class irp: %p", irp); -+ status = wrap_vendor_or_class_req(irp); -+ break; -+ -+ /* rest are synchronous */ -+ case URB_FUNCTION_SELECT_CONFIGURATION: -+ status = wrap_select_configuration(wd, nt_urb, irp); -+ NT_URB_STATUS(nt_urb) = status; -+ break; -+ -+ case URB_FUNCTION_SELECT_INTERFACE: -+ status = wrap_select_interface(wd, nt_urb, irp); -+ NT_URB_STATUS(nt_urb) = status; -+ break; -+ -+ case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: -+ status = wrap_get_descriptor(wd, nt_urb, irp); -+ NT_URB_STATUS(nt_urb) = status; -+ break; -+ -+ case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL: -+ status = wrap_reset_pipe(udev, irp); -+ NT_URB_STATUS(nt_urb) = status; -+ break; -+ -+ case URB_FUNCTION_ABORT_PIPE: -+ status = wrap_abort_pipe(udev, irp); -+ break; -+ -+ case URB_FUNCTION_SET_FEATURE_TO_DEVICE: -+ case URB_FUNCTION_SET_FEATURE_TO_INTERFACE: -+ case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT: -+ case URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE: -+ case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE: -+ case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT: -+ status = wrap_set_clear_feature(udev, irp); -+ break; -+ -+ case URB_FUNCTION_GET_STATUS_FROM_DEVICE: -+ case URB_FUNCTION_GET_STATUS_FROM_INTERFACE: -+ case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT: -+ status = wrap_get_status_request(udev, irp); -+ break; -+ -+ default: -+ ERROR("function %x not implemented", nt_urb->header.function); -+ status = NT_URB_STATUS(nt_urb) = USBD_STATUS_NOT_SUPPORTED; -+ break; -+ } -+ USBTRACE("status: %08X", status); -+ return status; -+} -+ -+static USBD_STATUS wrap_reset_port(struct irp *irp) -+{ -+ int ret, lock = 0; -+ struct wrap_device *wd; -+ -+ wd = IRP_WRAP_DEVICE(irp); -+ USBENTER("%p, %p", wd, wd->usb.udev); -+ lock = usb_lock_device_for_reset(wd->usb.udev, wd->usb.intf); -+ if (lock < 0) { -+ WARNING("locking failed: %d", lock); -+// return wrap_urb_status(lock); -+ return USBD_STATUS_SUCCESS; -+ } -+ ret = usb_reset_device(wd->usb.udev); -+ if (ret < 0) -+ USBTRACE("reset failed: %d", ret); -+ /* TODO: should reconfigure? */ -+ if (lock) -+ usb_unlock_device(wd->usb.udev); -+// return wrap_urb_status(ret); -+ return USBD_STATUS_SUCCESS; -+} -+ -+static USBD_STATUS wrap_get_port_status(struct irp *irp) -+{ -+ struct wrap_device *wd; -+ ULONG *status; -+ enum usb_device_state state; -+ -+ wd = IRP_WRAP_DEVICE(irp); -+ USBENTER("%p, %p", wd, wd->usb.udev); -+ status = IoGetCurrentIrpStackLocation(irp)->params.others.arg1; -+ state = wd->usb.udev->state; -+ if (state != USB_STATE_NOTATTACHED && -+ state != USB_STATE_SUSPENDED) { -+ *status |= USBD_PORT_CONNECTED; -+ if (state == USB_STATE_CONFIGURED) -+ *status |= USBD_PORT_ENABLED; -+ } -+ USBTRACE("state: %d, *status: %08X", state, *status); -+ return USBD_STATUS_SUCCESS; -+} -+ -+NTSTATUS wrap_submit_irp(struct device_object *pdo, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ struct wrap_device *wd; -+ USBD_STATUS status; -+ struct usbd_idle_callback *idle_callback; -+ -+ USBENTER("%p, %p", pdo, irp); -+ wd = pdo->reserved; -+ if (wd->usb.intf == NULL) { -+ USBTRACE("%p", irp); -+ irp->io_status.status = STATUS_DEVICE_REMOVED; -+ irp->io_status.info = 0; -+ USBEXIT(return STATUS_DEVICE_REMOVED); -+ } -+ IRP_WRAP_DEVICE(irp) = wd; -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ switch (irp_sl->params.dev_ioctl.code) { -+ case IOCTL_INTERNAL_USB_SUBMIT_URB: -+ status = wrap_process_nt_urb(irp); -+ break; -+ case IOCTL_INTERNAL_USB_RESET_PORT: -+ status = wrap_reset_port(irp); -+ break; -+ case IOCTL_INTERNAL_USB_GET_PORT_STATUS: -+ status = wrap_get_port_status(irp); -+ break; -+ case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: -+ idle_callback = irp_sl->params.dev_ioctl.type3_input_buf; -+ (void)idle_callback; -+ USBTRACE("suspend function: %p", idle_callback->callback); -+ status = USBD_STATUS_NOT_SUPPORTED; -+ break; -+ default: -+ ERROR("ioctl %08X NOT IMPLEMENTED", -+ irp_sl->params.dev_ioctl.code); -+ status = USBD_STATUS_NOT_SUPPORTED; -+ break; -+ } -+ -+ USBTRACE("status: %08X", status); -+ if (status == USBD_STATUS_PENDING) { -+ /* don't touch this IRP - it may have been already -+ * completed/returned */ -+ return STATUS_PENDING; -+ } else { -+ irp->io_status.status = nt_urb_irp_status(status); -+ if (status != USBD_STATUS_SUCCESS) -+ irp->io_status.info = 0; -+ USBEXIT(return irp->io_status.status); -+ } -+} -+ -+/* TODO: The example on msdn in reference section suggests that second -+ * argument should be an array of usbd_interface_information, but -+ * description and examples elsewhere suggest that it should be -+ * usbd_interface_list_entry structre. Which is correct? */ -+ -+wstdcall union nt_urb *WIN_FUNC(USBD_CreateConfigurationRequestEx,2) -+ (struct usb_config_descriptor *config, -+ struct usbd_interface_list_entry *intf_list) -+{ -+ int size, i, n; -+ struct usbd_interface_information *intf; -+ struct usbd_pipe_information *pipe; -+ struct usb_interface_descriptor *intf_desc; -+ struct usbd_select_configuration *select_conf; -+ -+ USBENTER("config = %p, intf_list = %p", config, intf_list); -+ -+ /* calculate size required; select_conf already has space for -+ * one intf structure */ -+ size = sizeof(*select_conf) - sizeof(*intf); -+ for (n = 0; n < config->bNumInterfaces; n++) { -+ i = intf_list[n].intf_desc->bNumEndpoints; -+ /* intf already has space for one pipe */ -+ size += sizeof(*intf) + (i - 1) * sizeof(*pipe); -+ } -+ /* don't use kmalloc - driver frees it with ExFreePool */ -+ select_conf = ExAllocatePoolWithTag(NonPagedPool, size, -+ POOL_TAG('L', 'U', 'S', 'B')); -+ if (!select_conf) { -+ WARNING("couldn't allocate memory"); -+ return NULL; -+ } -+ memset(select_conf, 0, size); -+ intf = &select_conf->intf; -+ select_conf->handle = config; -+ for (n = 0; n < config->bNumInterfaces && intf_list[n].intf_desc; n++) { -+ /* initialize 'intf' fields in intf_list so they point -+ * to appropriate entry; these may be read/written by -+ * driver after this function returns */ -+ intf_list[n].intf = intf; -+ intf_desc = intf_list[n].intf_desc; -+ -+ i = intf_desc->bNumEndpoints; -+ intf->bLength = sizeof(*intf) + (i - 1) * sizeof(*pipe); -+ -+ intf->bInterfaceNumber = intf_desc->bInterfaceNumber; -+ intf->bAlternateSetting = intf_desc->bAlternateSetting; -+ intf->bInterfaceClass = intf_desc->bInterfaceClass; -+ intf->bInterfaceSubClass = intf_desc->bInterfaceSubClass; -+ intf->bInterfaceProtocol = intf_desc->bInterfaceProtocol; -+ intf->bNumEndpoints = intf_desc->bNumEndpoints; -+ -+ pipe = &intf->pipes[0]; -+ for (i = 0; i < intf->bNumEndpoints; i++) { -+ memset(&pipe[i], 0, sizeof(*pipe)); -+ pipe[i].max_tx_size = -+ USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE; -+ } -+ intf->handle = intf_desc; -+ intf = (((void *)intf) + intf->bLength); -+ } -+ select_conf->header.function = URB_FUNCTION_SELECT_CONFIGURATION; -+ select_conf->header.length = size; -+ select_conf->config = config; -+ USBEXIT(return (union nt_urb *)select_conf); -+} -+ -+WIN_SYMBOL_MAP("_USBD_CreateConfigurationRequestEx@8", USBD_CreateConfigurationRequestEx) -+ -+wstdcall struct usb_interface_descriptor * -+WIN_FUNC(USBD_ParseConfigurationDescriptorEx,7) -+ (struct usb_config_descriptor *config, void *start, -+ LONG bInterfaceNumber, LONG bAlternateSetting, LONG bInterfaceClass, -+ LONG bInterfaceSubClass, LONG bInterfaceProtocol) -+{ -+ void *pos; -+ struct usb_interface_descriptor *intf; -+ -+ USBENTER("config = %p, start = %p, ifnum = %d, alt_setting = %d," -+ " class = %d, subclass = %d, proto = %d", config, start, -+ bInterfaceNumber, bAlternateSetting, bInterfaceClass, -+ bInterfaceSubClass, bInterfaceProtocol); -+ -+ for (pos = start; -+ pos < ((void *)config + le16_to_cpu(config->wTotalLength)); -+ pos += intf->bLength) { -+ -+ intf = pos; -+ -+ if ((intf->bDescriptorType == USB_DT_INTERFACE) && -+ ((bInterfaceNumber == -1) || -+ (intf->bInterfaceNumber == bInterfaceNumber)) && -+ ((bAlternateSetting == -1) || -+ (intf->bAlternateSetting == bAlternateSetting)) && -+ ((bInterfaceClass == -1) || -+ (intf->bInterfaceClass == bInterfaceClass)) && -+ ((bInterfaceSubClass == -1) || -+ (intf->bInterfaceSubClass == bInterfaceSubClass)) && -+ ((bInterfaceProtocol == -1) || -+ (intf->bInterfaceProtocol == bInterfaceProtocol))) { -+ USBTRACE("selected interface = %p", intf); -+ USBEXIT(return intf); -+ } -+ } -+ USBEXIT(return NULL); -+} -+ -+WIN_SYMBOL_MAP("_USBD_ParseConfigurationDescriptorEx@28", USBD_ParseConfigurationDescriptorEx) -+ -+wstdcall union nt_urb *WIN_FUNC(USBD_CreateConfigurationRequest,2) -+ (struct usb_config_descriptor *config, USHORT *size) -+{ -+ union nt_urb *nt_urb; -+ struct usbd_interface_list_entry intf_list[2]; -+ struct usb_interface_descriptor *intf_desc; -+ -+ USBENTER("config = %p, urb_size = %p", config, size); -+ -+ intf_desc = USBD_ParseConfigurationDescriptorEx(config, config, -1, -1, -+ -1, -1, -1); -+ intf_list[0].intf_desc = intf_desc; -+ intf_list[0].intf = NULL; -+ intf_list[1].intf_desc = NULL; -+ intf_list[1].intf = NULL; -+ nt_urb = USBD_CreateConfigurationRequestEx(config, intf_list); -+ if (!nt_urb) -+ return NULL; -+ -+ *size = nt_urb->select_conf.header.length; -+ USBEXIT(return nt_urb); -+} -+ -+wstdcall struct usb_interface_descriptor * -+WIN_FUNC(USBD_ParseConfigurationDescriptor,3) -+ (struct usb_config_descriptor *config, UCHAR bInterfaceNumber, -+ UCHAR bAlternateSetting) -+{ -+ return USBD_ParseConfigurationDescriptorEx(config, config, -+ bInterfaceNumber, -+ bAlternateSetting, -+ -1, -1, -1); -+} -+ -+wstdcall struct usb_descriptor_header *WIN_FUNC(USBD_ParseDescriptors,4) -+ (void *buf, ULONG length, struct usb_descriptor_header *descr, -+ LONG type) -+{ -+ while ((void *)descr < buf + length) { -+ if (descr->bDescriptorType == type) -+ return descr; -+ if (descr->bLength == 0) -+ break; -+ descr = (void *)descr + descr->bLength; -+ } -+ USBEXIT(return NULL); -+} -+ -+WIN_SYMBOL_MAP("_USBD_ParseDescriptors@16", USBD_ParseDescriptors) -+ -+wstdcall void WIN_FUNC(USBD_GetUSBDIVersion,1) -+ (struct usbd_version_info *version_info) -+{ -+ /* this function is obsolete in Windows XP */ -+ if (version_info) { -+ version_info->usbdi_version = USBDI_VERSION_XP; -+ /* TODO: how do we get this correctly? */ -+ version_info->supported_usb_version = 0x110; -+ } -+ USBEXIT(return); -+} -+ -+wstdcall void -+USBD_InterfaceGetUSBDIVersion(void *context, -+ struct usbd_version_info *version_info, -+ ULONG *hcd_capa) -+{ -+ struct wrap_device *wd = context; -+ -+ if (version_info) { -+ version_info->usbdi_version = USBDI_VERSION_XP; -+ if (wd->usb.udev->speed == USB_SPEED_HIGH) -+ version_info->supported_usb_version = 0x200; -+ else -+ version_info->supported_usb_version = 0x110; -+ } -+ *hcd_capa = USB_HCD_CAPS_SUPPORTS_RT_THREADS; -+ USBEXIT(return); -+} -+ -+wstdcall BOOLEAN USBD_InterfaceIsDeviceHighSpeed(void *context) -+{ -+ struct wrap_device *wd = context; -+ -+ USBTRACE("wd: %p", wd); -+ if (wd->usb.udev->speed == USB_SPEED_HIGH) -+ USBEXIT(return TRUE); -+ else -+ USBEXIT(return FALSE); -+} -+ -+wstdcall void USBD_InterfaceReference(void *context) -+{ -+ USBTRACE("%p", context); -+ TODO(); -+} -+ -+wstdcall void USBD_InterfaceDereference(void *context) -+{ -+ USBTRACE("%p", context); -+ TODO(); -+} -+ -+wstdcall NTSTATUS USBD_InterfaceQueryBusTime(void *context, ULONG *frame) -+{ -+ struct wrap_device *wd = context; -+ -+ *frame = usb_get_current_frame_number(wd->usb.udev); -+ USBEXIT(return STATUS_SUCCESS); -+} -+ -+wstdcall NTSTATUS USBD_InterfaceSubmitIsoOutUrb(void *context, -+ union nt_urb *nt_urb) -+{ -+ /* TODO: implement this */ -+ TODO(); -+ USBEXIT(return STATUS_NOT_IMPLEMENTED); -+} -+ -+wstdcall NTSTATUS -+USBD_InterfaceQueryBusInformation(void *context, ULONG level, void *buf, -+ ULONG *buf_length, ULONG *buf_actual_length) -+{ -+#if 0 -+ struct wrap_device *wd = context; -+ struct usb_bus *bus = wd->usb.udev->bus; -+ struct usb_bus_information_level *bus_info = buf; -+#endif -+ -+ TODO(); -+ USBEXIT(return STATUS_NOT_IMPLEMENTED); -+} -+ -+wstdcall NTSTATUS -+USBD_InterfaceLogEntry(void *context, ULONG driver_tag, ULONG enum_tag, -+ ULONG p1, ULONG p2) -+{ -+ ERROR("%p, %x, %x, %x, %x", context, driver_tag, enum_tag, p1, p2); -+ USBEXIT(return STATUS_SUCCESS); -+} -+ -+NTSTATUS -+usb_query_interface(struct wrap_device *wd, struct io_stack_location *irp_sl) -+{ -+ struct usbd_bus_interface_usbdi *intf = -+ (struct usbd_bus_interface_usbdi *) -+ irp_sl->params.query_intf.intf; -+ -+ TRACE2("type: %x, size: %d, version: %d", -+ irp_sl->params.query_intf.type->data1, -+ irp_sl->params.query_intf.size, -+ irp_sl->params.query_intf.version); -+ intf->Context = wd; -+ intf->InterfaceReference = -+ WIN_FUNC_PTR(USBD_InterfaceReference, 1); -+ intf->InterfaceDereference = -+ WIN_FUNC_PTR(USBD_InterfaceDereference, 1); -+ intf->GetUSBDIVersion = -+ WIN_FUNC_PTR(USBD_InterfaceGetUSBDIVersion, 3); -+ intf->QueryBusTime = -+ WIN_FUNC_PTR(USBD_InterfaceQueryBusTime, 2); -+ intf->SubmitIsoOutUrb = -+ WIN_FUNC_PTR(USBD_InterfaceSubmitIsoOutUrb, 2); -+ intf->QueryBusInformation = -+ WIN_FUNC_PTR(USBD_InterfaceQueryBusInformation, 5); -+ if (irp_sl->params.query_intf.version >= USB_BUSIF_USBDI_VERSION_1) -+ intf->IsDeviceHighSpeed = -+ WIN_FUNC_PTR(USBD_InterfaceIsDeviceHighSpeed, 1); -+ if (irp_sl->params.query_intf.version >= USB_BUSIF_USBDI_VERSION_2) -+ intf->LogEntry = WIN_FUNC_PTR(USBD_InterfaceLogEntry, 5); -+ return STATUS_SUCCESS; -+} -+ -+int usb_init(void) -+{ -+ InitializeListHead(&wrap_urb_complete_list); -+ spin_lock_init(&wrap_urb_complete_list_lock); -+ INIT_WORK(&wrap_urb_complete_work, wrap_urb_complete_worker); -+#ifdef USB_DEBUG -+ urb_id = 0; -+#endif -+ return 0; -+} -+ -+void usb_exit(void) -+{ -+ USBEXIT(return); -+} -+ -+int usb_init_device(struct wrap_device *wd) -+{ -+ InitializeListHead(&wd->usb.wrap_urb_list); -+ wd->usb.num_alloc_urbs = 0; -+ USBEXIT(return 0); -+} -+ -+void usb_exit_device(struct wrap_device *wd) -+{ -+ kill_all_urbs(wd, 0); -+ USBEXIT(return); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/usb.h linux-5.6.11-ndis/3rdparty/ndiswrapper/usb.h ---- linux-5.6.11/3rdparty/ndiswrapper/usb.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/usb.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,360 @@ -+/* -+ * Copyright (C) 2004 Jan Kiszka -+ * Copyright (C) 2005 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _USB_H_ -+#define _USB_H_ -+ -+#include "ntoskernel.h" -+ -+#define IOCTL_INTERNAL_USB_SUBMIT_URB 0x00220003 -+#define IOCTL_INTERNAL_USB_RESET_PORT 0x00220007 -+#define IOCTL_INTERNAL_USB_GET_PORT_STATUS 0x00220013 -+#define IOCTL_INTERNAL_USB_CYCLE_PORT 0x0022001F -+#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION 0x00220027 -+ -+#define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 -+#define URB_FUNCTION_SELECT_INTERFACE 0x0001 -+#define URB_FUNCTION_ABORT_PIPE 0x0002 -+#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003 -+#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004 -+#define URB_FUNCTION_GET_FRAME_LENGTH 0x0005 -+#define URB_FUNCTION_SET_FRAME_LENGTH 0x0006 -+#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007 -+#define URB_FUNCTION_CONTROL_TRANSFER 0x0008 -+#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 -+#define URB_FUNCTION_ISOCH_TRANSFER 0x000A -+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B -+#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C -+#define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D -+#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E -+#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F -+#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010 -+#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011 -+#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012 -+#define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013 -+#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014 -+#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015 -+#define URB_FUNCTION_RESERVED_0X0016 0x0016 -+#define URB_FUNCTION_VENDOR_DEVICE 0x0017 -+#define URB_FUNCTION_VENDOR_INTERFACE 0x0018 -+#define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 -+#define URB_FUNCTION_CLASS_DEVICE 0x001A -+#define URB_FUNCTION_CLASS_INTERFACE 0x001B -+#define URB_FUNCTION_CLASS_ENDPOINT 0x001C -+#define URB_FUNCTION_RESERVE_0X001D 0x001D -+#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL 0x001E -+#define URB_FUNCTION_CLASS_OTHER 0x001F -+#define URB_FUNCTION_VENDOR_OTHER 0x0020 -+#define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021 -+#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022 -+#define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023 -+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024 -+#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025 -+#define URB_FUNCTION_GET_CONFIGURATION 0x0026 -+#define URB_FUNCTION_GET_INTERFACE 0x0027 -+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 -+#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 -+#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR 0x002A -+#define URB_FUNCTION_RESERVE_0X002B 0x002B -+#define URB_FUNCTION_RESERVE_0X002C 0x002C -+#define URB_FUNCTION_RESERVE_0X002D 0x002D -+#define URB_FUNCTION_RESERVE_0X002E 0x002E -+#define URB_FUNCTION_RESERVE_0X002F 0x002F -+// USB 2.0 calls start at 0x0030 -+#define URB_FUNCTION_SYNC_RESET_PIPE 0x0030 -+#define URB_FUNCTION_SYNC_CLEAR_STALL 0x0031 -+#define URB_FUNCTION_CONTROL_TRANSFER_EX 0x0032 -+ -+#define USBD_PF_CHANGE_MAX_PACKET 0x00000001 -+ -+#define USBD_TRANSFER_DIRECTION_OUT 0 -+#define USBD_TRANSFER_DIRECTION_IN 1 -+ -+#define USBD_SHORT_TRANSFER_OK 0x00000002 -+#define USBD_START_ISO_TRANSFER_ASAP 0x00000004 -+#define USBD_DEFAULT_PIPE_TRANSFER 0x00000008 -+ -+#define USBD_TRANSFER_DIRECTION(flags) \ -+ ((flags) & USBD_TRANSFER_DIRECTION_IN) -+ -+enum pipe_type {UsbdPipeTypeControl = USB_ENDPOINT_XFER_CONTROL, -+ UsbdPipeTypeIsochronous = USB_ENDPOINT_XFER_ISOC, -+ UsbdPipeTypeBulk = USB_ENDPOINT_XFER_BULK, -+ UsbdPipeTypeInterrupt = USB_ENDPOINT_XFER_INT}; -+ -+#define USBD_IS_BULK_PIPE(pipe_handle) \ -+ (((pipe_handle)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) \ -+ == USB_ENDPOINT_XFER_BULK) -+ -+#define USBD_IS_INT_PIPE(pipe_handle) \ -+ (((pipe_handle)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) \ -+ == USB_ENDPOINT_XFER_INT) -+ -+#define USBD_PORT_ENABLED 0x00000001 -+#define USBD_PORT_CONNECTED 0x00000002 -+ -+typedef LONG USBD_STATUS; -+ -+#define USBD_STATUS_SUCCESS 0x0 -+#define USBD_STATUS_PENDING 0x40000000 -+#define USBD_STATUS_CANCELED 0x00010000 -+ -+#define USBD_STATUS_CRC 0xC0000001 -+#define USBD_STATUS_BTSTUFF 0xC0000002 -+#define USBD_STATUS_DATA_TOGGLE_MISMATCH 0xC0000003 -+#define USBD_STATUS_STALL_PID 0xC0000004 -+#define USBD_STATUS_DEV_NOT_RESPONDING 0xC0000005 -+#define USBD_STATUS_PID_CHECK_FAILURE 0xC0000006 -+#define USBD_STATUS_UNEXPECTED_PID 0xC0000007 -+#define USBD_STATUS_DATA_OVERRUN 0xC0000008 -+#define USBD_STATUS_DATA_UNDERRUN 0xC0000009 -+#define USBD_STATUS_RESERVED1 0xC000000A -+#define USBD_STATUS_RESERVED2 0xC000000B -+#define USBD_STATUS_BUFFER_OVERRUN 0xC000000C -+#define USBD_STATUS_BUFFER_UNDERRUN 0xC000000D -+#define USBD_STATUS_NOT_ACCESSED 0xC000000F -+#define USBD_STATUS_FIFO 0xC0000010 -+#define USBD_STATUS_XACT_ERROR 0xC0000011 -+#define USBD_STATUS_BABBLE_DETECTED 0xC0000012 -+#define USBD_STATUS_DATA_BUFFER_ERROR 0xC0000013 -+ -+#define USBD_STATUS_NOT_SUPPORTED 0xC0000E00 -+#define USBD_STATUS_BUFFER_TOO_SMALL 0xC0003000 -+#define USBD_STATUS_TIMEOUT 0xC0006000 -+#define USBD_STATUS_DEVICE_GONE 0xC0007000 -+ -+#define USBD_STATUS_NO_MEMORY 0x80000100 -+#define USBD_STATUS_INVALID_URB_FUNCTION 0x80000200 -+#define USBD_STATUS_INVALID_PARAMETER 0x80000300 -+#define USBD_STATUS_REQUEST_FAILED 0x80000500 -+#define USBD_STATUS_INVALID_PIPE_HANDLE 0x80000600 -+#define USBD_STATUS_ERROR_SHORT_TRANSFER 0x80000900 -+ -+#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE PAGE_SIZE -+ -+struct urb_hcd_area { -+ void *reserved8[8]; -+}; -+ -+struct usbd_pipe_information { -+ USHORT wMaxPacketSize; -+ UCHAR bEndpointAddress; -+ UCHAR bInterval; -+ enum pipe_type type; -+ struct usb_endpoint_descriptor *handle; -+ ULONG max_tx_size; -+ ULONG flags; -+}; -+ -+struct usbd_interface_information { -+ USHORT bLength; -+ UCHAR bInterfaceNumber; -+ UCHAR bAlternateSetting; -+ UCHAR bInterfaceClass; -+ UCHAR bInterfaceSubClass; -+ UCHAR bInterfaceProtocol; -+ UCHAR reserved; -+ void *handle; -+ ULONG bNumEndpoints; -+ struct usbd_pipe_information pipes[1]; -+}; -+ -+struct usbd_interface_list_entry { -+ struct usb_interface_descriptor *intf_desc; -+ struct usbd_interface_information *intf; -+}; -+ -+struct nt_urb_header { -+ USHORT length; -+ USHORT function; -+ USBD_STATUS status; -+ void *usbd_dev_handle; -+ ULONG usbd_flags; -+}; -+ -+struct usbd_select_interface { -+ struct nt_urb_header header; -+ void *handle; -+ struct usbd_interface_information intf; -+}; -+ -+struct usbd_select_configuration { -+ struct nt_urb_header header; -+ struct usb_config_descriptor *config; -+ void *handle; -+ struct usbd_interface_information intf; -+}; -+ -+struct usbd_control_descriptor_request { -+ struct nt_urb_header header; -+ void *reserved; -+ ULONG reserved0; -+ ULONG transfer_buffer_length; -+ void *transfer_buffer; -+ struct mdl *mdl; -+ union nt_urb *urb_link; -+ struct urb_hcd_area hca; -+ USHORT reserved1; -+ UCHAR index; -+ UCHAR desc_type; -+ USHORT language_id; -+ USHORT reserved2; -+}; -+ -+struct usbd_bulk_or_intr_transfer { -+ struct nt_urb_header header; -+ struct usb_endpoint_descriptor *pipe_handle; -+ ULONG transfer_flags; -+ ULONG transfer_buffer_length; -+ void *transfer_buffer; -+ struct mdl *mdl; -+ union nt_urb *urb_link; -+ struct urb_hcd_area hca; -+}; -+ -+struct usbd_pipe_request { -+ struct nt_urb_header header; -+ struct usb_endpoint_descriptor *pipe_handle; -+}; -+ -+struct usbd_vendor_or_class_request { -+ struct nt_urb_header header; -+ void *reserved; -+ ULONG transfer_flags; -+ ULONG transfer_buffer_length; -+ void *transfer_buffer; -+ struct mdl *mdl; -+ union nt_urb *link; -+ struct urb_hcd_area hca; -+ UCHAR reserved_bits; -+ UCHAR request; -+ USHORT value; -+ USHORT index; -+ USHORT reserved1; -+}; -+ -+struct urb_control_feature_request { -+ struct nt_urb_header header; -+ void *reserved; -+ ULONG reserved2; -+ ULONG reserved3; -+ void *reserved4; -+ struct mdl *reserved5; -+ union nt_urb *link; -+ struct urb_hcd_area hca; -+ USHORT reserved0; -+ USHORT feature_selector; -+ USHORT index; -+ USHORT reserved1; -+}; -+ -+struct urb_control_get_status_request { -+ struct nt_urb_header header; -+ void *reserved; -+ ULONG reserved0; -+ ULONG transfer_buffer_length; -+ void *transfer_buffer; -+ struct mdl *mdl; -+ union nt_urb *link; -+ struct urb_hcd_area hca; -+ UCHAR reserved1[4]; -+ USHORT index; -+ USHORT reserved2; -+}; -+ -+struct usbd_iso_packet_desc { -+ ULONG offset; -+ ULONG length; -+ USBD_STATUS status; -+}; -+ -+struct usbd_isochronous_transfer { -+ struct nt_urb_header header; -+ struct usb_endpoint_descriptor *pipe_handle; -+ ULONG transfer_flags; -+ ULONG transfer_buffer_length; -+ void *transfer_buffer; -+ struct mdl *mdl; -+ union nt_urb *urb_link; -+ struct urb_hcd_area hca; -+ ULONG start_frame; -+ ULONG number_of_packets; -+ ULONG error_count; -+ struct usbd_iso_packet_desc iso_packet[1]; -+}; -+ -+union nt_urb { -+ struct nt_urb_header header; -+ struct usbd_select_interface select_intf; -+ struct usbd_select_configuration select_conf; -+ struct usbd_bulk_or_intr_transfer bulk_int_transfer; -+ struct usbd_control_descriptor_request control_desc; -+ struct usbd_vendor_or_class_request vendor_class_request; -+ struct usbd_isochronous_transfer isochronous; -+ struct usbd_pipe_request pipe_req; -+ struct urb_control_feature_request feat_req; -+ struct urb_control_get_status_request status_req; -+}; -+ -+struct usbd_bus_interface_usbdi { -+ USHORT Size; -+ USHORT Version; -+ void *Context; -+ void *InterfaceReference; -+ void *InterfaceDereference; -+ void *GetUSBDIVersion; -+ void *QueryBusTime; -+ void *SubmitIsoOutUrb; -+ void *QueryBusInformation; -+ /* version 1 and above have following field */ -+ void *IsDeviceHighSpeed; -+ /* version 2 (and above) have following field */ -+ void *LogEntry; -+}; -+ -+struct usbd_bus_information_level { -+ ULONG TotalBandwidth; -+ ULONG ConsumedBandwidth; -+ /* level 1 and above have following fields */ -+ ULONG ControllerNameLength; -+ wchar_t ControllerName[1]; -+}; -+ -+#define USBDI_VERSION_XP 0x00000500 // Windows XP -+#define USB_HCD_CAPS_SUPPORTS_RT_THREADS 0x00000001 -+#define USB_BUSIF_USBDI_VERSION_0 0x0000 -+#define USB_BUSIF_USBDI_VERSION_1 0x0001 -+#define USB_BUSIF_USBDI_VERSION_2 0x0002 -+ -+struct usbd_version_info { -+ ULONG usbdi_version; -+ ULONG supported_usb_version; -+}; -+ -+struct usbd_idle_callback { -+ void *callback; -+ void *context; -+}; -+ -+#define NT_URB_STATUS(nt_urb) ((nt_urb)->header.status) -+ -+NTSTATUS wrap_submit_irp(struct device_object *pdo, struct irp *irp); -+void wrap_suspend_urbs(struct wrap_device *wd); -+void wrap_resume_urbs(struct wrap_device *wd); -+NTSTATUS usb_query_interface(struct wrap_device *wd, -+ struct io_stack_location *irp_sl); -+ -+#endif /* USB_H */ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/win2lin_stubs.S linux-5.6.11-ndis/3rdparty/ndiswrapper/win2lin_stubs.S ---- linux-5.6.11/3rdparty/ndiswrapper/win2lin_stubs.S 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/win2lin_stubs.S 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,262 @@ -+/* -+ * Copyright (C) 2005 Karl Vogel, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include -+#include -+ -+#ifdef CONFIG_X86_64 -+ -+/* -+# Windows <---> Linux register usage conversion when calling functions -+# V = Volatile -+# NV = Non Volatile (needs to be saved) -+# -+# Win Lin -+# --------------------------------------- -+# Rax Return V Return V -+# Rbx NV NV -+# Rcx Arg1 V Arg4 V -+# Rdx Arg2 V Arg3 V -+# Rsi NV Arg2 V -+# Rdi NV Arg1 V -+# Rsp NV NV -+# Rbp NV NV -+# R8 Arg3 V Arg5 V -+# R9 Arg4 V Arg6 V -+# R10 V V -+# R11 V V -+# R12 NV NV -+# R13 NV NV -+# R14 NV NV -+# R15 NV NV -+# -+# In addition, Linux uses %rax to indicate number of SSE registers used -+# when variadic functions are called. Since there is no way to obtain this -+# from Windows, for now, we just assume this is 0 (hence %rax is cleared). -+# -+# Windows pushes arguments 5 and higher onto stack in case of integer -+# variables and 4 and higher in case of floating point variables (passed -+# in SSE registers). -+ -+In a windows function, the stackframe/registers look like this: -+ -+# 0x0048 .... -+# 0x0040 arg8 -+# 0x0038 arg7 -+# 0x0030 arg6 -+# 0x0028 arg5 -+# 0x0020 shadow/spill space for arg4 -+# 0x0018 shadow/spill space for arg3 -+# 0x0010 shadow/spill space for arg2 -+# 0x0008 shadow/spill space for arg1 -+# 0x0000 ret -+ -+# register spill space is same irrespective of number of arguments - even -+# if Windows function takes less than 4 arguments, 32 bytes above return -+# address is reserved for the function -+ -+In Linux it should look like: -+ -+# 0x0018 .... -+# 0x0010 arg8 -+# 0x0008 arg7 -+# 0x0000 ret -+ -+*/ -+ -+ .text -+ -+#define LINUX_REG_ARGS 6 -+#define LOOP_THRESHOLD 9 -+#define WORD_BYTES 8 -+ -+/* -+ * %rsi and %rdi must be saved because they are not saved by Linux calls, but -+ * Windows callers expect them to be saved. %rbp is saved to create a stack -+ * frame, which can help with debugging. We need to reserve space for an odd -+ * number of registers anyway to keep 16-bit alignment of the stack (one more -+ * position is used by the return address). -+ */ -+#define SAVED_REGS 3 -+ -+/* -+ * When calling the Linux function, several registers are saved on the stack. -+ * When passing more than 6 arguments, arguments starting with argument 7 are -+ * pushed to the stack as well. -+ * -+ * We also need to allocate an additional word on the stack to keep it aligned -+ * to the 16-bit boundary if the number of saved arguments plus one (for the -+ * return address) is odd. -+ */ -+ -+/* -+ * Number of arguments we pass on stack to the Linux function. -+ * The value of true is -1 in assembler, so we multiply it by another true -+ * value. -+ */ -+#define stack_args(argc) \ -+ ((0 < 1) * (argc > LINUX_REG_ARGS) * (argc - LINUX_REG_ARGS)) -+ -+/* Full required change of stack pointer, in words */ -+#define stack_words_raw(argc) (stack_args(argc) + SAVED_REGS + 1) -+ -+/* Full actual change of stack pointer, in words (must be even) */ -+#define stack_words_aligned(argc) ((stack_words_raw(argc) + 1) & ~1) -+ -+/* Space allocated for Linux arguments on stack */ -+#define stack_space(argc) \ -+ ((stack_words_aligned(argc) - SAVED_REGS - 1) * WORD_BYTES) -+ -+/* -+ * win2lin_win_arg(N, ARGC) gives the address of the Windows argument N out of -+ * total ARGC after the stack has been prepared for the Linux function call. -+ * -+ * When called from Windows, the Nth argument is at (N * 8)(%rsp). We add the -+ * stack space allocated by the Linux function to compensate for %rsp change. -+ * -+ * Don't call with N less than 5! -+ */ -+#define win2lin_win_arg(n, argc) \ -+ ((n + SAVED_REGS) * WORD_BYTES + stack_space(argc))(%rsp) -+ -+/* -+ * win2lin_lin_arg(N) gives the address of the Nth Linux argument on the extra -+ * Linux stack frame. When more than 6 arguments are used, %rsp points to the -+ * 7th argument. The Nth argument is therefore at ((N - 7) * 8)(%rsp). -+ * -+ * Don't call with N less than 7! -+ */ -+#define win2lin_lin_arg(n) ((n - 1 - LINUX_REG_ARGS) * WORD_BYTES)(%rsp) -+ -+/* Declare function LONGNAME, call function SHORTNAME with ARGC arguments */ -+.macro win2linm longname, shortname, argc -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) -+ SYM_FUNC_START(\longname) -+#else -+ .type \longname, @function -+ ENTRY(\longname) -+#endif -+ -+ /* Create a call frame - it's optional, but good for debugging */ -+ .cfi_startproc -+ push %rbp -+ .cfi_def_cfa %rsp, 2 * WORD_BYTES -+ .cfi_offset %rbp, -2 * WORD_BYTES -+ mov %rsp, %rbp -+ .cfi_def_cfa %rbp, 2 * WORD_BYTES -+ -+ /* -+ * Registers %rdi and %rsi are volatile on Linux, but not on Windows, -+ * so save them on the stack. -+ */ -+ push %rsi -+ push %rdi -+ -+ /* Allocate extra stack space for arguments 7 and up */ -+ sub $stack_space(\argc), %rsp -+ -+ /* -+ * Copy arguments 7 and up. We do it early, before %rdi and %rsi -+ * are used for arguments 1 and 2, so we don't have to save them. -+ * We still need to save %rcx if using a string copy. -+ */ -+ .if (\argc < LOOP_THRESHOLD) -+ /* If a few arguments, copy them individually through %r11 */ -+ .if (\argc >= 7) -+ mov win2lin_win_arg(7, \argc), %r11 -+ mov %r11, win2lin_lin_arg(7) -+ .endif -+ .if (\argc >= 8) -+ mov win2lin_win_arg(8, \argc), %r11 -+ mov %r11, win2lin_lin_arg(8) -+ .endif -+ .else -+ /* If there are many arguments, copy them in a loop */ -+ /* Save arg1 to %r11 */ -+ mov %rcx, %r11 -+ /* Source and destination */ -+ lea win2lin_win_arg(LINUX_REG_ARGS + 1, \argc), %rsi -+ lea win2lin_lin_arg(LINUX_REG_ARGS + 1), %rdi -+ /* Number of arguments to copy (%ecx zero-extends to %rcx) */ -+ mov $(\argc - LINUX_REG_ARGS), %ecx -+ rep movsq -+ /* Restore arg1 directly to %rdi */ -+ mov %r11, %rdi -+ .endif -+ -+ /* -+ * Argument 1 - %rcx on Windows, %rdi on Linux -+ * Micro-optimization - if we used loop, arg1 is already in %rdi -+ */ -+ .if (\argc >= 1) && (\argc < LOOP_THRESHOLD) -+ mov %rcx, %rdi -+ .endif -+ -+ /* Argument 2 - %rdx on Windows, %rsi on Linux */ -+ .if (\argc >= 2) -+ mov %rdx, %rsi -+ .endif -+ -+ /* Argument 3 - %r8 on Windows, %rdx on Linux */ -+ .if (\argc >= 3) -+ mov %r8, %rdx -+ .endif -+ -+ /* Argument 4 - %r9 on Windows, %rcx on Linux */ -+ .if (\argc >= 4) -+ mov %r9, %rcx -+ .endif -+ -+ /* Argument 5 - first argument on stack on Windows, %r8 Linux */ -+ .if (\argc >= 5) -+ mov win2lin_win_arg(5, \argc), %r8 -+ .endif -+ -+ /* Argument 6 - second argument on stack on Windows, %r9 Linux */ -+ .if (\argc >= 6) -+ mov win2lin_win_arg(6, \argc), %r9 -+ .endif -+ -+ /* %rax on Linux is the number of arguments in SSE registers (zero) */ -+ xor %rax, %rax -+ -+ /* Call the function */ -+ call \shortname -+ -+ /* Free stack space for arguments 7 and up */ -+ add $stack_space(\argc), %rsp -+ -+ /* Restore saved registers */ -+ pop %rdi -+ pop %rsi -+ -+ /* Return to Windows code */ -+ leave -+ .cfi_def_cfa %rsp, WORD_BYTES -+ .cfi_restore %rbp -+ ret -+ .cfi_endproc -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) -+ SYM_FUNC_END(\longname) -+#else -+ .size \longname, (. - \longname) -+#endif -+.endm -+ -+#define win2lin(name, argc) win2linm win2lin_ ## name ## _ ## argc, name, argc -+ -+#include "win2lin_stubs.h" -+ -+#endif /* CONFIG_X86_64 */ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/winnt_types.h linux-5.6.11-ndis/3rdparty/ndiswrapper/winnt_types.h ---- linux-5.6.11/3rdparty/ndiswrapper/winnt_types.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/winnt_types.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,1701 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _WINNT_TYPES_H_ -+#define _WINNT_TYPES_H_ -+ -+#define TRUE 1 -+#define FALSE 0 -+ -+#define PASSIVE_LEVEL 0 -+#define APC_LEVEL 1 -+#define DISPATCH_LEVEL 2 -+#define DEVICE_LEVEL_BASE 4 -+ -+/* soft interrupts / bottom-half's are disabled at SOFT_IRQL */ -+#define SOFT_IRQL (DEVICE_LEVEL_BASE + 1) -+#define DIRQL (DEVICE_LEVEL_BASE + 2) -+ -+#define STATUS_WAIT_0 0 -+#define STATUS_SUCCESS 0 -+#define STATUS_ALERTED 0x00000101 -+#define STATUS_TIMEOUT 0x00000102 -+#define STATUS_PENDING 0x00000103 -+#define STATUS_FAILURE 0xC0000001 -+#define STATUS_NOT_IMPLEMENTED 0xC0000002 -+#define STATUS_INVALID_PARAMETER 0xC000000D -+#define STATUS_INVALID_DEVICE_REQUEST 0xC0000010 -+#define STATUS_MORE_PROCESSING_REQUIRED 0xC0000016 -+#define STATUS_ACCESS_DENIED 0xC0000022 -+#define STATUS_BUFFER_TOO_SMALL 0xC0000023 -+#define STATUS_OBJECT_NAME_INVALID 0xC0000023 -+#define STATUS_MUTANT_NOT_OWNED 0xC0000046 -+#define STATUS_RESOURCES 0xC000009A -+#define STATUS_DELETE_PENDING 0xC0000056 -+#define STATUS_INSUFFICIENT_RESOURCES 0xC000009A -+#define STATUS_NOT_SUPPORTED 0xC00000BB -+#define STATUS_INVALID_PARAMETER_2 0xC00000F0 -+#define STATUS_NO_MEMORY 0xC0000017 -+#define STATUS_CANCELLED 0xC0000120 -+#define STATUS_DEVICE_REMOVED 0xC00002B6 -+#define STATUS_DEVICE_NOT_CONNECTED 0xC000009D -+ -+#define STATUS_BUFFER_OVERFLOW 0x80000005 -+ -+#define SL_PENDING_RETURNED 0x01 -+#define SL_INVOKE_ON_CANCEL 0x20 -+#define SL_INVOKE_ON_SUCCESS 0x40 -+#define SL_INVOKE_ON_ERROR 0x80 -+ -+#define IRP_MJ_CREATE 0x00 -+#define IRP_MJ_CREATE_NAMED_PIPE 0x01 -+#define IRP_MJ_CLOSE 0x02 -+#define IRP_MJ_READ 0x03 -+#define IRP_MJ_WRITE 0x04 -+ -+#define IRP_MJ_DEVICE_CONTROL 0x0E -+#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0F -+#define IRP_MJ_POWER 0x16 -+#define IRP_MJ_SYSTEM_CONTROL 0x0E -+#define IRP_MJ_PNP 0x1b -+#define IRP_MJ_MAXIMUM_FUNCTION 0x1b -+ -+#define IRP_MN_WAIT_WAKE 0x00 -+#define IRP_MN_POWER_SEQUENCE 0x01 -+#define IRP_MN_SET_POWER 0x02 -+#define IRP_MN_QUERY_POWER 0x03 -+ -+#define IRP_MN_REGINFO 0x08 -+#define IRP_MN_REGINFO_EX 0x0b -+ -+#define IRP_MN_START_DEVICE 0x00 -+#define IRP_MN_QUERY_REMOVE_DEVICE 0x01 -+#define IRP_MN_REMOVE_DEVICE 0x02 -+#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03 -+#define IRP_MN_STOP_DEVICE 0x04 -+#define IRP_MN_QUERY_STOP_DEVICE 0x05 -+#define IRP_MN_CANCEL_STOP_DEVICE 0x06 -+#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07 -+#define IRP_MN_QUERY_INTERFACE 0x08 -+ -+#define IRP_BUFFERED_IO 0x00000010 -+#define IRP_DEALLOCATE_BUFFER 0x00000020 -+#define IRP_INPUT_OPERATION 0x00000040 -+ -+#define IRP_DEFFER_IO_COMPLETION 0x00000800 -+ -+#define THREAD_WAIT_OBJECTS 3 -+#define MAX_WAIT_OBJECTS 64 -+ -+#define LOW_PRIORITY 0 -+#define LOW_REALTIME_PRIORITY 16 -+#define HIGH_PRIORITY 31 -+#define MAXIMUM_PRIORITY 32 -+ -+#define PROCESSOR_FEATURE_MAX 64 -+ -+#define IO_NO_INCREMENT 0 -+ -+#define WMIREG_ACTION_REGISTER 1 -+#define WMIREG_ACTION_DEREGISTER 2 -+#define WMIREG_ACTION_REREGISTER 3 -+#define WMIREG_ACTION_UPDATE_GUIDS 4 -+ -+#define WMIREGISTER 0 -+#define WMIUPDATE 1 -+ -+#ifdef CONFIG_X86_64 -+#define wstdcall -+#define wfastcall -+#define noregparm -+#define regparm3 -+ -+#define KI_USER_SHARED_DATA 0xfffff78000000000UL -+ -+#else -+ -+#define noregparm __attribute__((regparm(0))) -+#define regparm3 __attribute__((regparm(3))) -+#define wstdcall __attribute__((__stdcall__, regparm(0))) -+#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ > 3) || __GNUC__ > 3) -+#undef fastcall -+#define wfastcall __attribute__((fastcall)) -+#else -+#error "gcc 3.4 or newer should be used for compiling this module" -+#endif -+ -+#define KI_USER_SHARED_DATA 0xffdf0000 -+ -+#endif -+ -+typedef u8 BOOLEAN; -+typedef u8 BYTE; -+typedef u8 *LPBYTE; -+typedef s8 CHAR; -+typedef u8 UCHAR; -+typedef s16 SHORT; -+typedef u16 USHORT; -+typedef u16 WORD; -+typedef s32 INT; -+typedef u32 UINT; -+typedef u32 DWORD; -+typedef s32 LONG; -+typedef u32 ULONG; -+typedef s64 LONGLONG; -+typedef u64 ULONGLONG; -+typedef u64 ULONGULONG; -+typedef u64 ULONG64; -+ -+typedef CHAR CCHAR; -+typedef USHORT wchar_t; -+typedef SHORT CSHORT; -+typedef LONGLONG LARGE_INTEGER; -+ -+typedef LONG NTSTATUS; -+ -+typedef LONG KPRIORITY; -+typedef LARGE_INTEGER PHYSICAL_ADDRESS; -+typedef UCHAR KIRQL; -+typedef CHAR KPROCESSOR_MODE; -+ -+/* ULONG_PTR is 32 bits on 32-bit platforms and 64 bits on 64-bit -+ * platform, which is same as 'unsigned long' in Linux */ -+typedef unsigned long ULONG_PTR; -+ -+typedef size_t SIZE_T; -+typedef ULONG_PTR KAFFINITY; -+typedef ULONG ACCESS_MASK; -+ -+typedef ULONG_PTR PFN_NUMBER; -+typedef ULONG SECURITY_INFORMATION; -+ -+/* non-negative numbers indicate success */ -+#define NT_SUCCESS(status) ((NTSTATUS)(status) >= 0) -+ -+struct ansi_string { -+ USHORT length; -+ USHORT max_length; -+ char *buf; -+}; -+ -+struct unicode_string { -+ USHORT length; -+ USHORT max_length; -+ wchar_t *buf; -+}; -+ -+struct nt_slist { -+ struct nt_slist *next; -+}; -+ -+#ifdef CONFIG_X86_64 -+/* it is not clear how nt_slist_head is used to store pointer to -+ * slists and depth; here we assume 'align' field is used to store -+ * depth and 'region' field is used to store slist pointers */ -+struct nt_slist_head { -+ union { -+ USHORT depth; -+ ULONGLONG align; -+ }; -+ union { -+ ULONGLONG region; -+ struct nt_slist *next; -+ }; -+} __attribute__((aligned(16))); -+typedef struct nt_slist_head nt_slist_header; -+#else -+union nt_slist_head { -+ ULONGLONG align; -+ struct { -+ struct nt_slist *next; -+ USHORT depth; -+ USHORT sequence; -+ }; -+}; -+typedef union nt_slist_head nt_slist_header; -+#endif -+ -+struct nt_list { -+ struct nt_list *next; -+ struct nt_list *prev; -+}; -+ -+typedef ULONG_PTR NT_SPIN_LOCK; -+ -+enum kdpc_importance {LowImportance, MediumImportance, HighImportance}; -+ -+struct kdpc; -+typedef void (*DPC)(struct kdpc *kdpc, void *ctx, void *arg1, -+ void *arg2) wstdcall; -+struct kdpc { -+ SHORT type; -+ UCHAR nr_cpu; -+ UCHAR importance; -+ struct nt_list list; -+ DPC func; -+ void *ctx; -+ void *arg1; -+ void *arg2; -+ union { -+ NT_SPIN_LOCK *lock; -+ /* 'lock' is not used; 'queued' represents whether -+ * kdpc is queued or not */ -+ int queued; -+ }; -+}; -+ -+enum pool_type { -+ NonPagedPool, PagedPool, NonPagedPoolMustSucceed, DontUseThisType, -+ NonPagedPoolCacheAligned, PagedPoolCacheAligned, -+ NonPagedPoolCacheAlignedMustS, MaxPoolType, -+ NonPagedPoolSession = 32, -+ PagedPoolSession = NonPagedPoolSession + 1, -+ NonPagedPoolMustSucceedSession = PagedPoolSession + 1, -+ DontUseThisTypeSession = NonPagedPoolMustSucceedSession + 1, -+ NonPagedPoolCacheAlignedSession = DontUseThisTypeSession + 1, -+ PagedPoolCacheAlignedSession = NonPagedPoolCacheAlignedSession + 1, -+ NonPagedPoolCacheAlignedMustSSession = PagedPoolCacheAlignedSession + 1 -+}; -+ -+enum memory_caching_type_orig { -+ MmFrameBufferCached = 2 -+}; -+ -+enum memory_caching_type { -+ MmNonCached = FALSE, MmCached = TRUE, -+ MmWriteCombined = MmFrameBufferCached, MmHardwareCoherentCached, -+ MmNonCachedUnordered, MmUSWCCached, MmMaximumCacheType -+}; -+ -+enum lock_operation { -+ IoReadAccess, IoWriteAccess, IoModifyAccess -+}; -+ -+enum mode { -+ KernelMode, UserMode, MaximumMode -+}; -+ -+struct mdl { -+ struct mdl *next; -+ CSHORT size; -+ CSHORT flags; -+ /* NdisFreeBuffer doesn't pass pool, so we store pool in -+ * unused field 'process' */ -+ union { -+ void *process; -+ void *pool; -+ }; -+ void *mappedsystemva; -+ void *startva; -+ ULONG bytecount; -+ ULONG byteoffset; -+}; -+ -+#define MDL_MAPPED_TO_SYSTEM_VA 0x0001 -+#define MDL_PAGES_LOCKED 0x0002 -+#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 -+#define MDL_ALLOCATED_FIXED_SIZE 0x0008 -+#define MDL_PARTIAL 0x0010 -+#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 -+#define MDL_IO_PAGE_READ 0x0040 -+#define MDL_WRITE_OPERATION 0x0080 -+#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 -+#define MDL_FREE_EXTRA_PTES 0x0200 -+#define MDL_IO_SPACE 0x0800 -+#define MDL_NETWORK_HEADER 0x1000 -+#define MDL_MAPPING_CAN_FAIL 0x2000 -+#define MDL_ALLOCATED_MUST_SUCCEED 0x4000 -+ -+#define MDL_POOL_ALLOCATED 0x0400 -+#define MDL_CACHE_ALLOCATED 0x8000 -+ -+#define PAGE_START(ptr) ((void *)((ULONG_PTR)(ptr) & ~(PAGE_SIZE - 1))) -+#define BYTE_OFFSET(ptr) ((ULONG)((ULONG_PTR)(ptr) & (PAGE_SIZE - 1))) -+ -+#define MmGetMdlByteCount(mdl) ((mdl)->bytecount) -+#define MmGetMdlVirtualAddress(mdl) ((mdl)->startva + (mdl)->byteoffset) -+#define MmGetMdlByteOffset(mdl) ((mdl)->byteoffset) -+#define MmGetSystemAddressForMdl(mdl) ((mdl)->mappedsystemva) -+#define MmGetSystemAddressForMdlSafe(mdl, priority) ((mdl)->mappedsystemva) -+#define MmGetMdlPfnArray(mdl) ((PFN_NUMBER *)(mdl + 1)) -+#define MmInitializeMdl(mdl, baseva, length) \ -+do { \ -+ (mdl)->next = NULL; \ -+ (mdl)->size = MmSizeOfMdl(baseva, length); \ -+ (mdl)->flags = 0; \ -+ (mdl)->startva = PAGE_START(baseva); \ -+ (mdl)->byteoffset = BYTE_OFFSET(baseva); \ -+ (mdl)->bytecount = length; \ -+ (mdl)->mappedsystemva = baseva; \ -+ TRACE4("%p %p %p %d %d", (mdl), baseva, (mdl)->startva, \ -+ (mdl)->byteoffset, length); \ -+} while (0) -+ -+struct kdevice_queue_entry { -+ struct nt_list list; -+ ULONG sort_key; -+ BOOLEAN inserted; -+}; -+ -+struct kdevice_queue { -+ USHORT type; -+ USHORT size; -+ struct nt_list list; -+ NT_SPIN_LOCK lock; -+ BOOLEAN busy; -+}; -+ -+struct wait_context_block { -+ struct kdevice_queue_entry wait_queue_entry; -+ void *device_routine; -+ void *device_context; -+ ULONG num_regs; -+ void *device_object; -+ void *current_irp; -+ void *buffer_chaining_dpc; -+}; -+ -+struct wait_block { -+ struct nt_list list; -+ struct task_struct *thread; -+ void *object; -+ int *wait_done; -+ USHORT wait_key; -+ USHORT wait_type; -+}; -+ -+struct dispatcher_header { -+ UCHAR type; -+ UCHAR absolute; -+ UCHAR size; -+ UCHAR inserted; -+ LONG signal_state; -+ struct nt_list wait_blocks; -+}; -+ -+enum event_type { -+ NotificationEvent, -+ SynchronizationEvent, -+}; -+ -+enum timer_type { -+ NotificationTimer = NotificationEvent, -+ SynchronizationTimer = SynchronizationEvent, -+}; -+ -+enum dh_type { -+ NotificationObject = NotificationEvent, -+ SynchronizationObject = SynchronizationEvent, -+ MutexObject, -+ SemaphoreObject, -+ ThreadObject, -+}; -+ -+enum wait_type { -+ WaitAll, WaitAny -+}; -+ -+/* objects that use dispatcher_header have it as the first field, so -+ * whenever we need to initialize dispatcher_header, we can convert -+ * that object into a nt_event and access dispatcher_header */ -+struct nt_event { -+ struct dispatcher_header dh; -+}; -+ -+struct wrap_timer; -+ -+#define WRAP_TIMER_MAGIC 47697249 -+ -+struct nt_timer { -+ struct dispatcher_header dh; -+ /* We can't fit Linux timer in this structure. Instead of -+ * padding the nt_timer structure, we replace due_time field -+ * with *wrap_timer and allocate memory for it when nt_timer is -+ * initialized */ -+ union { -+ ULONGLONG due_time; -+ struct wrap_timer *wrap_timer; -+ }; -+ struct nt_list nt_timer_list; -+ struct kdpc *kdpc; -+ union { -+ LONG period; -+ LONG wrap_timer_magic; -+ }; -+}; -+ -+struct nt_mutex { -+ struct dispatcher_header dh; -+ struct nt_list list; -+ struct task_struct *owner_thread; -+ BOOLEAN abandoned; -+ BOOLEAN apc_disable; -+}; -+ -+struct nt_semaphore { -+ struct dispatcher_header dh; -+ LONG limit; -+}; -+ -+struct nt_thread { -+ struct dispatcher_header dh; -+ /* the rest in Windows is a long structure; since this -+ * structure is opaque to drivers, we just define what we -+ * need */ -+ int pid; -+ NTSTATUS status; -+ struct task_struct *task; -+ struct nt_list irps; -+ NT_SPIN_LOCK lock; -+ KPRIORITY prio; -+}; -+ -+#define set_object_type(dh, type) ((dh)->type = (type)) -+#define is_notify_object(dh) ((dh)->type == NotificationObject) -+#define is_synch_object(dh) ((dh)->type == SynchronizationObject) -+#define is_mutex_object(dh) ((dh)->type == MutexObject) -+#define is_semaphore_object(dh) ((dh)->type == SemaphoreObject) -+#define is_nt_thread_object(dh) ((dh)->type == ThreadObject) -+ -+#define IO_TYPE_ADAPTER 1 -+#define IO_TYPE_CONTROLLER 2 -+#define IO_TYPE_DEVICE 3 -+#define IO_TYPE_DRIVER 4 -+#define IO_TYPE_FILE 5 -+#define IO_TYPE_IRP 6 -+#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13 -+ -+struct irp; -+struct dev_obj_ext; -+struct driver_object; -+ -+struct device_object { -+ CSHORT type; -+ USHORT size; -+ LONG ref_count; -+ struct driver_object *drv_obj; -+ struct device_object *next; -+ struct device_object *attached; -+ struct irp *current_irp; -+ void *io_timer; -+ ULONG flags; -+ ULONG characteristics; -+ void *vpb; -+ void *dev_ext; -+ CCHAR stack_count; -+ union { -+ struct nt_list queue_list; -+ struct wait_context_block wcb; -+ } queue; -+ ULONG align_req; -+ struct kdevice_queue dev_queue; -+ struct kdpc dpc; -+ ULONG active_threads; -+ void *security_desc; -+ struct nt_event lock; -+ USHORT sector_size; -+ USHORT spare1; -+ struct dev_obj_ext *dev_obj_ext; -+ void *reserved; -+}; -+ -+struct dev_obj_ext { -+ CSHORT type; -+ CSHORT size; -+ struct device_object *dev_obj; -+ struct device_object *attached_to; -+}; -+ -+struct io_status_block { -+ union { -+ NTSTATUS status; -+ void *pointer; -+ }; -+ ULONG_PTR info; -+}; -+ -+#ifdef CONFIG_X86_64 -+struct io_status_block32 { -+ NTSTATUS status; -+ ULONG info; -+}; -+#endif -+ -+#define DEVICE_TYPE ULONG -+ -+struct driver_extension; -+ -+typedef NTSTATUS driver_dispatch_t(struct device_object *dev_obj, -+ struct irp *irp) wstdcall; -+ -+struct driver_object { -+ CSHORT type; -+ CSHORT size; -+ struct device_object *dev_obj; -+ ULONG flags; -+ void *start; -+ ULONG driver_size; -+ void *section; -+ struct driver_extension *drv_ext; -+ struct unicode_string name; -+ struct unicode_string *hardware_database; -+ void *fast_io_dispatch; -+ void *init; -+ void *start_io; -+ void (*unload)(struct driver_object *driver) wstdcall; -+ driver_dispatch_t *major_func[IRP_MJ_MAXIMUM_FUNCTION + 1]; -+}; -+ -+struct driver_extension { -+ struct driver_object *drv_obj; -+ NTSTATUS (*add_device)(struct driver_object *drv_obj, -+ struct device_object *dev_obj); -+ ULONG count; -+ struct unicode_string service_key_name; -+ struct nt_list custom_ext; -+}; -+ -+struct custom_ext { -+ struct nt_list list; -+ void *client_id; -+}; -+ -+struct wrap_bin_file; -+ -+struct file_object { -+ CSHORT type; -+ CSHORT size; -+ struct device_object *dev_obj; -+ void *volume_parameter_block; -+ void *fs_context; -+ void *fs_context2; -+ void *section_object_pointer; -+ void *private_cache_map; -+ NTSTATUS final_status; -+ union { -+ struct file_object *related_file_object; -+ struct wrap_bin_file *wrap_bin_file; -+ }; -+ BOOLEAN lock_operation; -+ BOOLEAN delete_pending; -+ BOOLEAN read_access; -+ BOOLEAN write_access; -+ BOOLEAN delete_access; -+ BOOLEAN shared_read; -+ BOOLEAN shared_write; -+ BOOLEAN shared_delete; -+ ULONG flags; -+ struct unicode_string _name_; -+ LARGE_INTEGER current_byte_offset; -+ ULONG waiters; -+ ULONG busy; -+ void *last_lock; -+ struct nt_event lock; -+ struct nt_event event; -+ void *completion_context; -+}; -+ -+#ifdef CONFIG_X86_64 -+#define POINTER_ALIGN __attribute__((aligned(8))) -+#else -+#define POINTER_ALIGN -+#endif -+ -+#define CACHE_ALIGN __attribute__((aligned(128))) -+ -+enum system_power_state { -+ PowerSystemUnspecified = 0, -+ PowerSystemWorking, PowerSystemSleeping1, PowerSystemSleeping2, -+ PowerSystemSleeping3, PowerSystemHibernate, PowerSystemShutdown, -+ PowerSystemMaximum, -+}; -+ -+enum device_power_state { -+ PowerDeviceUnspecified = 0, -+ PowerDeviceD0, PowerDeviceD1, PowerDeviceD2, PowerDeviceD3, -+ PowerDeviceMaximum, -+}; -+ -+union power_state { -+ enum system_power_state system_state; -+ enum device_power_state device_state; -+}; -+ -+enum power_state_type { -+ SystemPowerState = 0, DevicePowerState, -+}; -+ -+enum power_action { -+ PowerActionNone = 0, -+ PowerActionReserved, PowerActionSleep, PowerActionHibernate, -+ PowerActionShutdown, PowerActionShutdownReset, PowerActionShutdownOff, -+ PowerActionWarmEject, -+}; -+ -+struct guid { -+ ULONG data1; -+ USHORT data2; -+ USHORT data3; -+ UCHAR data4[8]; -+}; -+ -+struct nt_interface { -+ USHORT size; -+ USHORT version; -+ void *context; -+ void (*reference)(void *context) wstdcall; -+ void (*dereference)(void *context) wstdcall; -+}; -+ -+enum interface_type { -+ InterfaceTypeUndefined = -1, Internal, Isa, Eisa, MicroChannel, -+ TurboChannel, PCIBus, VMEBus, NuBus, PCMCIABus, CBus, MPIBus, -+ MPSABus, ProcessorInternal, InternalPowerBus, PNPISABus, -+ PNPBus, MaximumInterfaceType, -+}; -+ -+#define CmResourceTypeNull 0 -+#define CmResourceTypePort 1 -+#define CmResourceTypeInterrupt 2 -+#define CmResourceTypeMemory 3 -+#define CmResourceTypeDma 4 -+#define CmResourceTypeDeviceSpecific 5 -+#define CmResourceTypeBusNumber 6 -+#define CmResourceTypeMaximum 7 -+ -+#define CmResourceTypeNonArbitrated 128 -+#define CmResourceTypeConfigData 128 -+#define CmResourceTypeDevicePrivate 129 -+#define CmResourceTypePcCardConfig 130 -+#define CmResourceTypeMfCardConfig 131 -+ -+enum cm_share_disposition { -+ CmResourceShareUndetermined = 0, CmResourceShareDeviceExclusive, -+ CmResourceShareDriverExclusive, CmResourceShareShared -+}; -+ -+#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0 -+#define CM_RESOURCE_INTERRUPT_LATCHED 1 -+#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000 -+#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001 -+#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002 -+#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004 -+ -+#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008 -+#define CM_RESOURCE_MEMORY_24 0x0010 -+#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020 -+ -+#define CM_RESOURCE_PORT_MEMORY 0x0000 -+#define CM_RESOURCE_PORT_IO 0x0001 -+#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004 -+#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008 -+#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010 -+#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020 -+#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040 -+#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080 -+ -+#define CM_RESOURCE_DMA_8 0x0000 -+#define CM_RESOURCE_DMA_16 0x0001 -+#define CM_RESOURCE_DMA_32 0x0002 -+#define CM_RESOURCE_DMA_8_AND_16 0x0004 -+#define CM_RESOURCE_DMA_BUS_MASTER 0x0008 -+#define CM_RESOURCE_DMA_TYPE_A 0x0010 -+#define CM_RESOURCE_DMA_TYPE_B 0x0020 -+#define CM_RESOURCE_DMA_TYPE_F 0x0040 -+ -+#define MAX_RESOURCES 20 -+ -+#pragma pack(push,4) -+struct cm_partial_resource_descriptor { -+ UCHAR type; -+ UCHAR share; -+ USHORT flags; -+ union { -+ struct { -+ PHYSICAL_ADDRESS start; -+ ULONG length; -+ } generic; -+ struct { -+ PHYSICAL_ADDRESS start; -+ ULONG length; -+ } port; -+ struct { -+ ULONG level; -+ ULONG vector; -+ KAFFINITY affinity; -+ } interrupt; -+ struct { -+ PHYSICAL_ADDRESS start; -+ ULONG length; -+ } memory; -+ struct { -+ ULONG channel; -+ ULONG port; -+ ULONG reserved1; -+ } dma; -+ struct { -+ ULONG data[3]; -+ } device_private; -+ struct { -+ ULONG start; -+ ULONG length; -+ ULONG reserved; -+ } bus_number; -+ struct { -+ ULONG data_size; -+ ULONG reserved1; -+ ULONG reserved2; -+ } device_specific_data; -+ } u; -+}; -+#pragma pack(pop) -+ -+struct cm_partial_resource_list { -+ USHORT version; -+ USHORT revision; -+ ULONG count; -+ struct cm_partial_resource_descriptor partial_descriptors[1]; -+}; -+ -+struct cm_full_resource_descriptor { -+ enum interface_type interface_type; -+ ULONG bus_number; -+ struct cm_partial_resource_list partial_resource_list; -+}; -+ -+struct cm_resource_list { -+ ULONG count; -+ struct cm_full_resource_descriptor list[1]; -+}; -+ -+enum file_info_class { -+ FileDirectoryInformation = 1, -+ FileBasicInformation = 4, -+ FileStandardInformation = 5, -+ FileNameInformation = 9, -+ FilePositionInformation = 14, -+ FileAlignmentInformation = 17, -+ FileNetworkOpenInformation = 34, -+ FileAttributeTagInformation = 35, -+ FileMaximumInformation = 41, -+}; -+ -+enum fs_info_class { -+ FileFsVolumeInformation = 1, -+ /* ... */ -+ FileFsMaximumInformation = 9, -+}; -+ -+enum device_relation_type { -+ BusRelations, EjectionRelations, PowerRelations, RemovalRelations, -+ TargetDeviceRelation, SingleBusRelations, -+}; -+ -+enum bus_query_id_type { -+ BusQueryDeviceID = 0, BusQueryHardwareIDs = 1, -+ BusQueryCompatibleIDs = 2, BusQueryInstanceID = 3, -+ BusQueryDeviceSerialNumber = 4, -+}; -+ -+enum device_text_type { -+ DeviceTextDescription = 0, DeviceTextLocationInformation = 1, -+}; -+ -+enum device_usage_notification_type { -+ DeviceUsageTypeUndefined, DeviceUsageTypePaging, -+ DeviceUsageTypeHibernation, DevbiceUsageTypeDumpFile, -+}; -+ -+#define METHOD_BUFFERED 0 -+#define METHOD_IN_DIRECT 1 -+#define METHOD_OUT_DIRECT 2 -+#define METHOD_NEITHER 3 -+ -+#define CTL_CODE(dev_type, func, method, access) \ -+ (((dev_type) << 16) | ((access) << 14) | ((func) << 2) | (method)) -+ -+#define IO_METHOD_FROM_CTL_CODE(code) (code & 0x3) -+ -+#ifndef CONFIG_X86_64 -+#pragma pack(push,4) -+#endif -+struct io_stack_location { -+ UCHAR major_fn; -+ UCHAR minor_fn; -+ UCHAR flags; -+ UCHAR control; -+ union { -+ struct { -+ void *security_context; -+ ULONG options; -+ USHORT POINTER_ALIGN file_attributes; -+ USHORT share_access; -+ ULONG POINTER_ALIGN ea_length; -+ } create; -+ struct { -+ ULONG length; -+ ULONG POINTER_ALIGN key; -+ LARGE_INTEGER byte_offset; -+ } read; -+ struct { -+ ULONG length; -+ ULONG POINTER_ALIGN key; -+ LARGE_INTEGER byte_offset; -+ } write; -+ struct { -+ ULONG length; -+ enum file_info_class POINTER_ALIGN file_info_class; -+ } query_file; -+ struct { -+ ULONG length; -+ enum file_info_class POINTER_ALIGN file_info_class; -+ struct file_object *file_object; -+ union { -+ struct { -+ BOOLEAN replace_if_exists; -+ BOOLEAN advance_only; -+ }; -+ ULONG cluster_count; -+ void *delete_handle; -+ }; -+ } set_file; -+ struct { -+ ULONG length; -+ enum fs_info_class POINTER_ALIGN fs_info_class; -+ } query_volume; -+ struct { -+ ULONG output_buf_len; -+ ULONG POINTER_ALIGN input_buf_len; -+ ULONG POINTER_ALIGN code; -+ void *type3_input_buf; -+ } dev_ioctl; -+ struct { -+ SECURITY_INFORMATION security_info; -+ ULONG POINTER_ALIGN length; -+ } query_security; -+ struct { -+ SECURITY_INFORMATION security_info; -+ void *security_descriptor; -+ } set_security; -+ struct { -+ void *vpb; -+ struct device_object *device_object; -+ } mount_volume; -+ struct { -+ void *vpb; -+ struct device_object *device_object; -+ } verify_volume; -+ struct { -+ void *srb; -+ } scsi; -+ struct { -+ enum device_relation_type type; -+ } query_device_relations; -+ struct { -+ const struct guid *type; -+ USHORT size; -+ USHORT version; -+ struct nt_interface *intf; -+ void *intf_data; -+ } query_intf; -+ struct { -+ void *capabilities; -+ } device_capabilities; -+ struct { -+ void *io_resource_requirement_list; -+ } filter_resource_requirements; -+ struct { -+ ULONG which_space; -+ void *buffer; -+ ULONG offset; -+ ULONG POINTER_ALIGN length; -+ } read_write_config; -+ struct { -+ BOOLEAN lock; -+ } set_lock; -+ struct { -+ enum bus_query_id_type id_type; -+ } query_id; -+ struct { -+ enum device_text_type device_text_type; -+ ULONG POINTER_ALIGN locale_id; -+ } query_device_text; -+ struct { -+ BOOLEAN in_path; -+ BOOLEAN reserved[3]; -+ enum device_usage_notification_type POINTER_ALIGN type; -+ } usage_notification; -+ struct { -+ enum system_power_state power_state; -+ } wait_wake; -+ struct { -+ void *power_sequence; -+ } power_sequence; -+ struct { -+ ULONG sys_context; -+ enum power_state_type POINTER_ALIGN type; -+ union power_state POINTER_ALIGN state; -+ enum power_action POINTER_ALIGN shutdown_type; -+ } power; -+ struct { -+ struct cm_resource_list *allocated_resources; -+ struct cm_resource_list *allocated_resources_translated; -+ } start_device; -+ struct { -+ ULONG_PTR provider_id; -+ void *data_path; -+ ULONG buf_len; -+ void *buf; -+ } wmi; -+ struct { -+ void *arg1; -+ void *arg2; -+ void *arg3; -+ void *arg4; -+ } others; -+ } params; -+ struct device_object *dev_obj; -+ struct file_object *file_obj; -+ NTSTATUS (*completion_routine)(struct device_object *, -+ struct irp *, void *) wstdcall; -+ void *context; -+}; -+#ifndef CONFIG_X86_64 -+#pragma pack(pop) -+#endif -+ -+struct kapc { -+ CSHORT type; -+ CSHORT size; -+ ULONG spare0; -+ struct nt_thread *thread; -+ struct nt_list list; -+ void *kernele_routine; -+ void *rundown_routine; -+ void *normal_routine; -+ void *normal_context; -+ void *sys_arg1; -+ void *sys_arg2; -+ CCHAR apc_state_index; -+ KPROCESSOR_MODE apc_mode; -+ BOOLEAN inserted; -+}; -+ -+#define IRP_NOCACHE 0x00000001 -+#define IRP_SYNCHRONOUS_API 0x00000004 -+#define IRP_ASSOCIATED_IRP 0x00000008 -+ -+enum urb_state { -+ URB_INVALID = 1, URB_ALLOCATED, URB_SUBMITTED, -+ URB_COMPLETED, URB_FREE, URB_SUSPEND, URB_INT_UNLINKED }; -+ -+struct wrap_urb { -+ struct nt_list list; -+ enum urb_state state; -+ struct nt_list complete_list; -+ unsigned int flags; -+ struct urb *urb; -+ struct irp *irp; -+#ifdef USB_DEBUG -+ unsigned int id; -+#endif -+}; -+ -+struct irp { -+ SHORT type; -+ USHORT size; -+ struct mdl *mdl; -+ ULONG flags; -+ union { -+ struct irp *master_irp; -+ LONG irp_count; -+ void *system_buffer; -+ } associated_irp; -+ struct nt_list thread_list; -+ struct io_status_block io_status; -+ KPROCESSOR_MODE requestor_mode; -+ BOOLEAN pending_returned; -+ CHAR stack_count; -+ CHAR current_location; -+ BOOLEAN cancel; -+ KIRQL cancel_irql; -+ CCHAR apc_env; -+ UCHAR alloc_flags; -+ struct io_status_block *user_status; -+ struct nt_event *user_event; -+ union { -+ struct { -+ void *user_apc_routine; -+ void *user_apc_context; -+ } async_params; -+ LARGE_INTEGER alloc_size; -+ } overlay; -+ void (*cancel_routine)(struct device_object *, struct irp *) wstdcall; -+ void *user_buf; -+ union { -+ struct { -+ union { -+ struct kdevice_queue_entry dev_q_entry; -+ struct { -+ void *driver_context[4]; -+ }; -+ }; -+ void *thread; -+ char *aux_buf; -+ struct { -+ struct nt_list list; -+ union { -+ struct io_stack_location *csl; -+ ULONG packet_type; -+ }; -+ }; -+ struct file_object *file_object; -+ } overlay; -+ union { -+ struct kapc apc; -+ /* space for apc is used for ndiswrapper -+ * specific fields */ -+ struct { -+ struct wrap_urb *wrap_urb; -+ struct wrap_device *wrap_device; -+ }; -+ }; -+ void *completion_key; -+ } tail; -+}; -+ -+#define IoSizeOfIrp(stack_count) \ -+ ((USHORT)(sizeof(struct irp) + \ -+ ((stack_count) * sizeof(struct io_stack_location)))) -+#define IoGetCurrentIrpStackLocation(irp) \ -+ (irp)->tail.overlay.csl -+#define IoGetNextIrpStackLocation(irp) \ -+ (IoGetCurrentIrpStackLocation(irp) - 1) -+#define IoGetPreviousIrpStackLocation(irp) \ -+ (IoGetCurrentIrpStackLocation(irp) + 1) -+ -+#define IoSetNextIrpStackLocation(irp) \ -+do { \ -+ KIRQL _irql_; \ -+ IoAcquireCancelSpinLock(&_irql_); \ -+ (irp)->current_location--; \ -+ IoGetCurrentIrpStackLocation(irp)--; \ -+ IoReleaseCancelSpinLock(_irql_); \ -+} while (0) -+ -+#define IoSkipCurrentIrpStackLocation(irp) \ -+do { \ -+ KIRQL _irql_; \ -+ IoAcquireCancelSpinLock(&_irql_); \ -+ (irp)->current_location++; \ -+ IoGetCurrentIrpStackLocation(irp)++; \ -+ IoReleaseCancelSpinLock(_irql_); \ -+} while (0) -+ -+static inline void -+IoCopyCurrentIrpStackLocationToNext(struct irp *irp) -+{ -+ struct io_stack_location *next; -+ next = IoGetNextIrpStackLocation(irp); -+ memcpy(next, IoGetCurrentIrpStackLocation(irp), -+ offsetof(struct io_stack_location, completion_routine)); -+ next->control = 0; -+} -+ -+static inline void -+IoSetCompletionRoutine(struct irp *irp, void *routine, void *context, -+ BOOLEAN success, BOOLEAN error, BOOLEAN cancel) -+{ -+ struct io_stack_location *irp_sl = IoGetNextIrpStackLocation(irp); -+ irp_sl->completion_routine = routine; -+ irp_sl->context = context; -+ irp_sl->control = 0; -+ if (success) -+ irp_sl->control |= SL_INVOKE_ON_SUCCESS; -+ if (error) -+ irp_sl->control |= SL_INVOKE_ON_ERROR; -+ if (cancel) -+ irp_sl->control |= SL_INVOKE_ON_CANCEL; -+} -+ -+#define IoMarkIrpPending(irp) \ -+ (IoGetCurrentIrpStackLocation((irp))->control |= SL_PENDING_RETURNED) -+#define IoUnmarkIrpPending(irp) \ -+ (IoGetCurrentIrpStackLocation((irp))->control &= ~SL_PENDING_RETURNED) -+ -+#define IRP_SL(irp, n) (((struct io_stack_location *)((irp) + 1)) + (n)) -+#define IRP_DRIVER_CONTEXT(irp) (irp)->tail.overlay.driver_context -+#define IoIrpThread(irp) ((irp)->tail.overlay.thread) -+ -+#define IRP_URB(irp) \ -+ (union nt_urb *)(IoGetCurrentIrpStackLocation(irp)->params.others.arg1) -+ -+#define IRP_WRAP_DEVICE(irp) (irp)->tail.wrap_device -+#define IRP_WRAP_URB(irp) (irp)->tail.wrap_urb -+ -+struct wmi_guid_reg_info { -+ struct guid *guid; -+ ULONG instance_count; -+ ULONG flags; -+}; -+ -+struct wmilib_context { -+ ULONG guid_count; -+ struct wmi_guid_reg_info *guid_list; -+ void *query_wmi_reg_info; -+ void *query_wmi_data_block; -+ void *set_wmi_data_block; -+ void *set_wmi_data_item; -+ void *execute_wmi_method; -+ void *wmi_function_control; -+}; -+ -+enum key_value_information_class { -+ KeyValueBasicInformation, KeyValueFullInformation, -+ KeyValuePartialInformation, KeyValueFullInformationAlign64, -+ KeyValuePartialInformationAlign64 -+}; -+ -+struct file_name_info { -+ ULONG length; -+ wchar_t *name; -+}; -+ -+struct file_std_info { -+ LARGE_INTEGER alloc_size; -+ LARGE_INTEGER eof; -+ ULONG num_links; -+ BOOLEAN delete_pending; -+ BOOLEAN dir; -+}; -+ -+enum nt_obj_type { -+ NT_OBJ_EVENT = 10, NT_OBJ_MUTEX, NT_OBJ_THREAD, NT_OBJ_TIMER, -+ NT_OBJ_SEMAPHORE, -+}; -+ -+enum common_object_type { -+ OBJECT_TYPE_NONE, OBJECT_TYPE_DEVICE, OBJECT_TYPE_DRIVER, -+ OBJECT_TYPE_NT_THREAD, OBJECT_TYPE_FILE, OBJECT_TYPE_CALLBACK, -+}; -+ -+struct common_object_header { -+ struct nt_list list; -+ enum common_object_type type; -+ UINT size; -+ UINT ref_count; -+ BOOLEAN close_in_process; -+ BOOLEAN permanent; -+ struct unicode_string name; -+}; -+ -+#define OBJECT_TO_HEADER(object) \ -+ (struct common_object_header *)((void *)(object) - \ -+ sizeof(struct common_object_header)) -+#define OBJECT_SIZE(size) \ -+ ((size) + sizeof(struct common_object_header)) -+#define HEADER_TO_OBJECT(hdr) \ -+ ((void *)(hdr) + sizeof(struct common_object_header)) -+#define HANDLE_TO_OBJECT(handle) HEADER_TO_OBJECT(handle) -+#define HANDLE_TO_HEADER(handle) (handle) -+ -+enum work_queue_type { -+ CriticalWorkQueue, DelayedWorkQueue, HyperCriticalWorkQueue, -+ MaximumWorkQueue -+}; -+ -+typedef void (*NTOS_WORK_FUNC)(void *arg1, void *arg2) wstdcall; -+ -+struct io_workitem { -+ enum work_queue_type type; -+ struct device_object *dev_obj; -+ NTOS_WORK_FUNC worker_routine; -+ void *context; -+}; -+ -+struct io_workitem_entry { -+ struct nt_list list; -+ struct io_workitem *io_workitem; -+}; -+ -+enum mm_page_priority { -+ LowPagePriority, NormalPagePriority = 16, HighPagePriority = 32 -+}; -+ -+enum kinterrupt_mode { -+ LevelSensitive, Latched -+}; -+ -+enum ntos_wait_reason { -+ Executive, FreePage, PageIn, PoolAllocation, DelayExecution, -+ Suspended, UserRequest, WrExecutive, WrFreePage, WrPageIn, -+ WrPoolAllocation, WrDelayExecution, WrSuspended, WrUserRequest, -+ WrEventPair, WrQueue, WrLpcReceive, WrLpcReply, WrVirtualMemory, -+ WrPageOut, WrRendezvous, Spare2, Spare3, Spare4, Spare5, Spare6, -+ WrKernel, MaximumWaitReason -+}; -+ -+typedef enum ntos_wait_reason KWAIT_REASON; -+ -+typedef void *LOOKASIDE_ALLOC_FUNC(enum pool_type pool_type, -+ SIZE_T size, ULONG tag) wstdcall; -+typedef void LOOKASIDE_FREE_FUNC(void *) wstdcall; -+ -+struct npaged_lookaside_list { -+ nt_slist_header head; -+ USHORT depth; -+ USHORT maxdepth; -+ ULONG totalallocs; -+ union { -+ ULONG allocmisses; -+ ULONG allochits; -+ } u1; -+ ULONG totalfrees; -+ union { -+ ULONG freemisses; -+ ULONG freehits; -+ } u2; -+ enum pool_type pool_type; -+ ULONG tag; -+ ULONG size; -+ LOOKASIDE_ALLOC_FUNC *alloc_func; -+ LOOKASIDE_FREE_FUNC *free_func; -+ struct nt_list list; -+ ULONG lasttotallocs; -+ union { -+ ULONG lastallocmisses; -+ ULONG lastallochits; -+ } u3; -+ ULONG pad[2]; -+#ifndef CONFIG_X86_64 -+ NT_SPIN_LOCK obsolete; -+#endif -+} -+#ifdef CONFIG_X86_64 -+CACHE_ALIGN -+#endif -+; -+ -+enum device_registry_property { -+ DevicePropertyDeviceDescription, DevicePropertyHardwareID, -+ DevicePropertyCompatibleIDs, DevicePropertyBootConfiguration, -+ DevicePropertyBootConfigurationTranslated, -+ DevicePropertyClassName, DevicePropertyClassGuid, -+ DevicePropertyDriverKeyName, DevicePropertyManufacturer, -+ DevicePropertyFriendlyName, DevicePropertyLocationInformation, -+ DevicePropertyPhysicalDeviceObjectName, DevicePropertyBusTypeGuid, -+ DevicePropertyLegacyBusType, DevicePropertyBusNumber, -+ DevicePropertyEnumeratorName, DevicePropertyAddress, -+ DevicePropertyUINumber, DevicePropertyInstallState, -+ DevicePropertyRemovalPolicy -+}; -+ -+enum trace_information_class { -+ TraceIdClass, TraceHandleClass, TraceEnableFlagsClass, -+ TraceEnableLevelClass, GlobalLoggerHandleClass, EventLoggerHandleClass, -+ AllLoggerHandlesClass, TraceHandleByNameClass -+}; -+ -+struct kinterrupt; -+typedef BOOLEAN (*PKSERVICE_ROUTINE)(struct kinterrupt *interrupt, -+ void *context) wstdcall; -+typedef BOOLEAN (*PKSYNCHRONIZE_ROUTINE)(void *context) wstdcall; -+ -+struct kinterrupt { -+ ULONG vector; -+ KAFFINITY cpu_mask; -+ NT_SPIN_LOCK lock; -+ NT_SPIN_LOCK *actual_lock; -+ BOOLEAN shared; -+ BOOLEAN save_fp; -+ union { -+ CHAR processor_number; -+#ifdef CONFIG_DEBUG_SHIRQ -+ CHAR enabled; -+#endif -+ } u; -+ PKSERVICE_ROUTINE isr; -+ void *isr_ctx; -+ struct nt_list list; -+ KIRQL irql; -+ KIRQL synch_irql; -+ enum kinterrupt_mode mode; -+}; -+ -+struct time_fields { -+ CSHORT year; -+ CSHORT month; -+ CSHORT day; -+ CSHORT hour; -+ CSHORT minute; -+ CSHORT second; -+ CSHORT milliseconds; -+ CSHORT weekday; -+}; -+ -+struct object_attributes { -+ ULONG length; -+ void *root_dir; -+ struct unicode_string *name; -+ ULONG attributes; -+ void *security_descr; -+ void *security_qos; -+}; -+ -+typedef void (*PCALLBACK_FUNCTION)(void *context, void *arg1, -+ void *arg2) wstdcall; -+ -+struct callback_object; -+struct callback_func { -+ PCALLBACK_FUNCTION func; -+ void *context; -+ struct nt_list list; -+ struct callback_object *object; -+}; -+ -+struct callback_object { -+ NT_SPIN_LOCK lock; -+ struct nt_list list; -+ struct nt_list callback_funcs; -+ BOOLEAN allow_multiple_callbacks; -+ struct object_attributes *attributes; -+}; -+ -+enum section_inherit { -+ ViewShare = 1, ViewUnmap = 2 -+}; -+ -+struct ksystem_time { -+ ULONG low_part; -+ LONG high1_time; -+ LONG high2_time; -+}; -+ -+enum nt_product_type { -+ nt_product_win_nt = 1, nt_product_lan_man_nt, nt_product_server -+}; -+ -+enum alt_arch_type { -+ arch_type_standard, arch_type_nex98x86, end_alternatives -+}; -+ -+struct kuser_shared_data { -+ ULONG tick_count; -+ ULONG tick_count_multiplier; -+ volatile struct ksystem_time interrupt_time; -+ volatile struct ksystem_time system_time; -+ volatile struct ksystem_time time_zone_bias; -+ USHORT image_number_low; -+ USHORT image_number_high; -+ wchar_t nt_system_root[260]; -+ ULONG max_stack_trace_depth; -+ ULONG crypto_exponent; -+ ULONG time_zone_id; -+ ULONG large_page_min; -+ ULONG reserved2[7]; -+ enum nt_product_type nt_product_type; -+ BOOLEAN product_type_is_valid; -+ ULONG nt_major_version; -+ ULONG nt_minor_version; -+ BOOLEAN processor_features[PROCESSOR_FEATURE_MAX]; -+ ULONG reserved1; -+ ULONG reserved3; -+ volatile LONG time_slip; -+ enum alt_arch_type alt_arch_type; -+ LARGE_INTEGER system_expiration_date; -+ ULONG suite_mask; -+ BOOLEAN kdbg_enabled; -+ volatile ULONG active_console; -+ volatile ULONG dismount_count; -+ ULONG com_plus_package; -+ ULONG last_system_rite_event_tick_count; -+ ULONG num_phys_pages; -+ BOOLEAN safe_boot_mode; -+ ULONG trace_log; -+ ULONGLONG fill0; -+ ULONGLONG sys_call[4]; -+ union { -+ volatile struct ksystem_time tick_count; -+ volatile ULONG64 tick_count_quad; -+ } tick; -+}; -+ -+#define REG_NONE (0) -+#define REG_SZ (1) -+#define REG_EXPAND_SZ (2) -+#define REG_BINARY (3) -+#define REG_DWORD (4) -+ -+#define RTL_REGISTRY_ABSOLUTE 0 -+#define RTL_REGISTRY_SERVICES 1 -+#define RTL_REGISTRY_CONTROL 2 -+#define RTL_REGISTRY_WINDOWS_NT 3 -+#define RTL_REGISTRY_DEVICEMAP 4 -+#define RTL_REGISTRY_USER 5 -+#define RTL_REGISTRY_MAXIMUM 6 -+#define RTL_REGISTRY_HANDLE 0x40000000 -+#define RTL_REGISTRY_OPTIONAL 0x80000000 -+ -+#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 -+#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 -+#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 -+#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 -+#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 -+#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 -+#define RTL_QUERY_REGISTRY_DELETE 0x00000040 -+ -+typedef NTSTATUS (*PRTL_QUERY_REGISTRY_ROUTINE)(wchar_t *name, ULONG type, -+ void *data, ULONG length, -+ void *context, -+ void *entry) wstdcall; -+ -+struct rtl_query_registry_table { -+ PRTL_QUERY_REGISTRY_ROUTINE query_func; -+ ULONG flags; -+ wchar_t *name; -+ void *context; -+ ULONG def_type; -+ void *def_data; -+ ULONG def_length; -+}; -+ -+struct io_remove_lock { -+ BOOLEAN removed; -+ BOOLEAN reserved[3]; -+ LONG io_count; -+ struct nt_event remove_event; -+}; -+ -+struct io_error_log_packet { -+ UCHAR major_fn_code; -+ UCHAR retry_count; -+ USHORT dump_data_size; -+ USHORT nr_of_strings; -+ USHORT string_offset; -+ USHORT event_category; -+ NTSTATUS error_code; -+ ULONG unique_error_value; -+ NTSTATUS final_status; -+ ULONG sequence_number; -+ ULONG io_control_code; -+ LARGE_INTEGER device_offset; -+ ULONG dump_data[1]; -+}; -+ -+/* some of the functions below are slightly different from DDK's -+ * implementation; e.g., Insert functions return appropriate -+ * pointer */ -+ -+/* instead of using Linux's lists, we implement list manipulation -+ * functions because nt_list is used by drivers and we don't want to -+ * worry about Linux's list being different from nt_list (right now -+ * they are same, but in future they could be different) */ -+ -+static inline void InitializeListHead(struct nt_list *head) -+{ -+ head->next = head->prev = head; -+} -+ -+static inline BOOLEAN IsListEmpty(struct nt_list *head) -+{ -+ if (head == head->next) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+static inline void RemoveEntryList(struct nt_list *entry) -+{ -+ entry->prev->next = entry->next; -+ entry->next->prev = entry->prev; -+} -+ -+static inline struct nt_list *RemoveHeadList(struct nt_list *head) -+{ -+ struct nt_list *entry; -+ -+ entry = head->next; -+ if (entry == head) -+ return NULL; -+ else { -+ RemoveEntryList(entry); -+ return entry; -+ } -+} -+ -+static inline struct nt_list *RemoveTailList(struct nt_list *head) -+{ -+ struct nt_list *entry; -+ -+ entry = head->prev; -+ if (entry == head) -+ return NULL; -+ else { -+ RemoveEntryList(entry); -+ return entry; -+ } -+} -+ -+static inline void InsertListEntry(struct nt_list *entry, struct nt_list *prev, -+ struct nt_list *next) -+{ -+ next->prev = entry; -+ entry->next = next; -+ entry->prev = prev; -+ prev->next = entry; -+} -+ -+static inline struct nt_list *InsertHeadList(struct nt_list *head, -+ struct nt_list *entry) -+{ -+ struct nt_list *ret; -+ -+ if (IsListEmpty(head)) -+ ret = NULL; -+ else -+ ret = head->next; -+ -+ InsertListEntry(entry, head, head->next); -+ return ret; -+} -+ -+static inline struct nt_list *InsertTailList(struct nt_list *head, -+ struct nt_list *entry) -+{ -+ struct nt_list *ret; -+ -+ if (IsListEmpty(head)) -+ ret = NULL; -+ else -+ ret = head->prev; -+ -+ InsertListEntry(entry, head->prev, head); -+ return ret; -+} -+ -+#define nt_list_for_each(pos, head) \ -+ for (pos = (head)->next; pos != (head); pos = pos->next) -+ -+#define nt_list_for_each_entry(pos, head, member) \ -+ for (pos = container_of((head)->next, typeof(*pos), member); \ -+ &pos->member != (head); \ -+ pos = container_of(pos->member.next, typeof(*pos), member)) -+ -+#define nt_list_for_each_safe(pos, n, head) \ -+ for (pos = (head)->next, n = pos->next; pos != (head); \ -+ pos = n, n = pos->next) -+ -+/* device object flags */ -+#define DO_VERIFY_VOLUME 0x00000002 -+#define DO_BUFFERED_IO 0x00000004 -+#define DO_EXCLUSIVE 0x00000008 -+#define DO_DIRECT_IO 0x00000010 -+#define DO_MAP_IO_BUFFER 0x00000020 -+#define DO_DEVICE_HAS_NAME 0x00000040 -+#define DO_DEVICE_INITIALIZING 0x00000080 -+#define DO_SYSTEM_BOOT_PARTITION 0x00000100 -+#define DO_LONG_TERM_REQUESTS 0x00000200 -+#define DO_NEVER_LAST_DEVICE 0x00000400 -+#define DO_SHUTDOWN_REGISTERED 0x00000800 -+#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -+#define DO_POWER_PAGABLE 0x00002000 -+#define DO_POWER_INRUSH 0x00004000 -+#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 -+ -+/* Various supported device types (used with IoCreateDevice()) */ -+ -+#define FILE_DEVICE_BEEP 0x00000001 -+#define FILE_DEVICE_CD_ROM 0x00000002 -+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -+#define FILE_DEVICE_CONTROLLER 0x00000004 -+#define FILE_DEVICE_DATALINK 0x00000005 -+#define FILE_DEVICE_DFS 0x00000006 -+#define FILE_DEVICE_DISK 0x00000007 -+#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -+#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -+#define FILE_DEVICE_INPORT_PORT 0x0000000A -+#define FILE_DEVICE_KEYBOARD 0x0000000B -+#define FILE_DEVICE_MAILSLOT 0x0000000C -+#define FILE_DEVICE_MIDI_IN 0x0000000D -+#define FILE_DEVICE_MIDI_OUT 0x0000000E -+#define FILE_DEVICE_MOUSE 0x0000000F -+#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -+#define FILE_DEVICE_NAMED_PIPE 0x00000011 -+#define FILE_DEVICE_NETWORK 0x00000012 -+#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 -+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -+#define FILE_DEVICE_NULL 0x00000015 -+#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -+#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -+#define FILE_DEVICE_PRINTER 0x00000018 -+#define FILE_DEVICE_SCANNER 0x00000019 -+#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001A -+#define FILE_DEVICE_SERIAL_PORT 0x0000001B -+#define FILE_DEVICE_SCREEN 0x0000001C -+#define FILE_DEVICE_SOUND 0x0000001D -+#define FILE_DEVICE_STREAMS 0x0000001E -+#define FILE_DEVICE_TAPE 0x0000001F -+#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -+#define FILE_DEVICE_TRANSPORT 0x00000021 -+#define FILE_DEVICE_UNKNOWN 0x00000022 -+#define FILE_DEVICE_VIDEO 0x00000023 -+#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -+#define FILE_DEVICE_WAVE_IN 0x00000025 -+#define FILE_DEVICE_WAVE_OUT 0x00000026 -+#define FILE_DEVICE_8042_PORT 0x00000027 -+#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -+#define FILE_DEVICE_BATTERY 0x00000029 -+#define FILE_DEVICE_BUS_EXTENDER 0x0000002A -+#define FILE_DEVICE_MODEM 0x0000002B -+#define FILE_DEVICE_VDM 0x0000002C -+#define FILE_DEVICE_MASS_STORAGE 0x0000002D -+#define FILE_DEVICE_SMB 0x0000002E -+#define FILE_DEVICE_KS 0x0000002F -+#define FILE_DEVICE_CHANGER 0x00000030 -+#define FILE_DEVICE_SMARTCARD 0x00000031 -+#define FILE_DEVICE_ACPI 0x00000032 -+#define FILE_DEVICE_DVD 0x00000033 -+#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 -+#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 -+#define FILE_DEVICE_DFS_VOLUME 0x00000036 -+#define FILE_DEVICE_SERENUM 0x00000037 -+#define FILE_DEVICE_TERMSRV 0x00000038 -+#define FILE_DEVICE_KSEC 0x00000039 -+#define FILE_DEVICE_FIPS 0x0000003A -+ -+/* Device characteristics */ -+ -+#define FILE_REMOVABLE_MEDIA 0x00000001 -+#define FILE_READ_ONLY_DEVICE 0x00000002 -+#define FILE_FLOPPY_DISKETTE 0x00000004 -+#define FILE_WRITE_ONCE_MEDIA 0x00000008 -+#define FILE_REMOTE_DEVICE 0x00000010 -+#define FILE_DEVICE_IS_MOUNTED 0x00000020 -+#define FILE_VIRTUAL_VOLUME 0x00000040 -+#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -+#define FILE_DEVICE_SECURE_OPEN 0x00000100 -+ -+#define FILE_READ_DATA 0x0001 -+#define FILE_WRITE_DATA 0x0002 -+ -+#define FILE_SUPERSEDED 0x00000000 -+#define FILE_OPENED 0x00000001 -+#define FILE_CREATED 0x00000002 -+#define FILE_OVERWRITTEN 0x00000003 -+#define FILE_EXISTS 0x00000004 -+#define FILE_DOES_NOT_EXIST 0x00000005 -+ -+ -+#endif /* WINNT_TYPES_H */ -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/workqueue.c linux-5.6.11-ndis/3rdparty/ndiswrapper/workqueue.c ---- linux-5.6.11/3rdparty/ndiswrapper/workqueue.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/workqueue.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,279 @@ -+/* -+ * Copyright (C) 2006 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ntoskernel.h" -+ -+struct workqueue_thread { -+ spinlock_t lock; -+ struct task_struct *task; -+ struct completion *completion; -+ char name[16]; -+ int pid; -+ /* whether any work_structs pending? <0 implies quit */ -+ s8 pending; -+ /* list of work_structs pending */ -+ struct list_head work_list; -+}; -+ -+struct workq_thread_data { -+ struct workqueue_struct *workq; -+ int index; -+}; -+ -+struct wrap_workqueue_struct { -+ u8 singlethread; -+ u8 qon; -+ int num_cpus; -+ struct workqueue_thread threads[0]; -+}; -+ -+static void wrap_destroy_wq_on(struct workqueue_struct *workq, int cpu); -+ -+static int workq_thread(void *data) -+{ -+ struct workq_thread_data *thread_data = data; -+ struct workqueue_thread *thread; -+ struct workqueue_struct *workq; -+ struct work_struct *work; -+ -+ workq = thread_data->workq; -+ thread = &workq->threads[thread_data->index]; -+ WORKTRACE("%p, %d, %p", workq, thread_data->index, thread); -+ strncpy(thread->name, current->comm, sizeof(thread->name)); -+ -+ daemonize(thread->name); -+ set_user_nice(current, -5); -+ -+ if (thread->task != current) { -+ WARNING("invalid task: %p, %p", thread->task, current); -+ thread->task = current; -+ } -+ thread->pid = current->pid; -+ complete(xchg(&thread->completion, NULL)); -+ WORKTRACE("%s (%d) started", thread->name, thread->pid); -+ while (1) { -+ if (wait_condition(thread->pending, 0, TASK_INTERRUPTIBLE) < 0) { -+ /* TODO: deal with signal */ -+ WARNING("signal not blocked?"); -+ flush_signals(current); -+ continue; -+ } -+ while (1) { -+ struct list_head *entry; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&thread->lock, flags); -+ if (list_empty(&thread->work_list)) { -+ struct completion *completion; -+ if (thread->pending < 0) { -+ spin_unlock_irqrestore(&thread->lock, -+ flags); -+ goto out; -+ } -+ thread->pending = 0; -+ completion = thread->completion; -+ thread->completion = NULL; -+ spin_unlock_irqrestore(&thread->lock, flags); -+ if (completion) -+ complete(completion); -+ break; -+ } -+ entry = thread->work_list.next; -+ work = list_entry(entry, struct work_struct, list); -+ if (xchg(&work->thread, NULL)) -+ list_del(entry); -+ else -+ work = NULL; -+ spin_unlock_irqrestore(&thread->lock, flags); -+ DBG_BLOCK(4) { -+ WORKTRACE("%p, %p", work, thread); -+ } -+ if (work) -+ work->func(work->data); -+ } -+ } -+ -+out: -+ WORKTRACE("%s exiting", thread->name); -+ thread->pid = 0; -+ return 0; -+} -+ -+static int wrap_queue_work_on(struct workqueue_struct *workq, -+ struct work_struct *work, int cpu) -+{ -+ struct workqueue_thread *thread = &workq->threads[cpu]; -+ unsigned long flags; -+ int ret; -+ -+ assert(thread->pid > 0); -+ DBG_BLOCK(4) { -+ WORKTRACE("%p, %d", workq, cpu); -+ } -+ spin_lock_irqsave(&thread->lock, flags); -+ if (work->thread) -+ ret = 0; -+ else { -+ work->thread = thread; -+ list_add_tail(&work->list, &thread->work_list); -+ thread->pending = 1; -+ wake_up_process(thread->task); -+ ret = 1; -+ } -+ spin_unlock_irqrestore(&thread->lock, flags); -+ return ret; -+} -+ -+int wrap_queue_work(struct workqueue_struct *workq, struct work_struct *work) -+{ -+ if (num_online_cpus() == 1 || workq->singlethread) -+ return wrap_queue_work_on(workq, work, 0); -+ else { -+ typeof(workq->qon) qon; -+ /* work is queued on threads in a round-robin fashion */ -+ do { -+ qon = workq->qon % workq->num_cpus; -+ atomic_inc_var(workq->qon); -+ } while (!workq->threads[qon].pid); -+ return wrap_queue_work_on(workq, work, qon); -+ } -+} -+ -+void wrap_cancel_work(struct work_struct *work) -+{ -+ struct workqueue_thread *thread; -+ unsigned long flags; -+ -+ WORKTRACE("%p", work); -+ if ((thread = xchg(&work->thread, NULL))) { -+ WORKTRACE("%p", thread); -+ spin_lock_irqsave(&thread->lock, flags); -+ list_del(&work->list); -+ spin_unlock_irqrestore(&thread->lock, flags); -+ } -+} -+ -+struct workqueue_struct *wrap_create_wq(const char *name, u8 singlethread, -+ u8 freeze) -+{ -+ struct completion started; -+ struct workqueue_struct *workq; -+ int i, n; -+ -+ if (singlethread) -+ n = 1; -+ else -+ n = num_online_cpus(); -+ workq = kzalloc(sizeof(*workq) + n * sizeof(workq->threads[0]), -+ GFP_KERNEL); -+ if (!workq) { -+ WARNING("couldn't allocate memory"); -+ return NULL; -+ } -+ WORKTRACE("%p", workq); -+ workq->singlethread = singlethread; -+ init_completion(&started); -+ for_each_online_cpu(i) { -+ struct workq_thread_data thread_data; -+ spin_lock_init(&workq->threads[i].lock); -+ INIT_LIST_HEAD(&workq->threads[i].work_list); -+ reinit_completion(&started); -+ workq->threads[i].completion = &started; -+ thread_data.workq = workq; -+ thread_data.index = i; -+ WORKTRACE("%p, %d, %p", workq, i, &workq->threads[i]); -+ workq->threads[i].task = -+ kthread_create(workq_thread, &thread_data, -+ "%s/%d", name, i); -+ if (IS_ERR(workq->threads[i].task)) { -+ int j; -+ for (j = 0; j < i; j++) -+ wrap_destroy_wq_on(workq, j); -+ kfree(workq); -+ WARNING("couldn't start thread %s", name); -+ return NULL; -+ } -+#ifdef PF_NOFREEZE -+ if (!freeze) -+ workq->threads[i].task->flags |= PF_NOFREEZE; -+#endif -+ kthread_bind(workq->threads[i].task, i); -+ workq->num_cpus = max(workq->num_cpus, i); -+ wake_up_process(workq->threads[i].task); -+ wait_for_completion(&started); -+ WORKTRACE("%s, %d: %p, %d", name, i, -+ workq, workq->threads[i].pid); -+ if (singlethread) -+ break; -+ } -+ workq->num_cpus++; -+ return workq; -+} -+ -+static void wrap_flush_wq_on(struct workqueue_struct *workq, int cpu) -+{ -+ struct workqueue_thread *thread = &workq->threads[cpu]; -+ struct completion done; -+ -+ WORKTRACE("%p: %d, %s", workq, cpu, thread->name); -+ init_completion(&done); -+ thread->completion = &done; -+ thread->pending = 1; -+ wake_up_process(thread->task); -+ wait_for_completion(&done); -+ return; -+} -+ -+void wrap_flush_wq(struct workqueue_struct *workq) -+{ -+ int i, n; -+ -+ WORKTRACE("%p", workq); -+ if (workq->singlethread) -+ n = 1; -+ else -+ n = num_online_cpus(); -+ for (i = 0; i < n; i++) -+ wrap_flush_wq_on(workq, i); -+} -+ -+static void wrap_destroy_wq_on(struct workqueue_struct *workq, int cpu) -+{ -+ struct workqueue_thread *thread = &workq->threads[cpu]; -+ -+ WORKTRACE("%p: %d, %s", workq, cpu, thread->name); -+ if (!thread->pid) -+ return; -+ thread->pending = -1; -+ wake_up_process(thread->task); -+ while (thread->pid) { -+ WORKTRACE("%d", thread->pid); -+ schedule(); -+ } -+} -+ -+void wrap_destroy_wq(struct workqueue_struct *workq) -+{ -+ int i, n; -+ -+ WORKTRACE("%p", workq); -+ if (workq->singlethread) -+ n = 1; -+ else -+ n = num_online_cpus(); -+ for (i = 0; i < n; i++) -+ wrap_destroy_wq_on(workq, i); -+ kfree(workq); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapmem.c linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapmem.c ---- linux-5.6.11/3rdparty/ndiswrapper/wrapmem.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapmem.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,366 @@ -+/* -+ * Copyright (C) 2006 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#define _WRAPMEM_C_ -+ -+#include "ntoskernel.h" -+#include "wrapmem.h" -+ -+struct slack_alloc_info { -+ struct nt_list list; -+ size_t size; -+}; -+ -+#if ALLOC_DEBUG > 1 -+static struct nt_list allocs; -+#endif -+ -+static struct nt_list slack_allocs; -+static spinlock_t alloc_lock; -+ -+#if ALLOC_DEBUG -+const char *alloc_type_name[ALLOC_TYPE_MAX] = { -+ "kmalloc_atomic", -+ "kmalloc_nonatomic", -+ "vmalloc_atomic", -+ "vmalloc_nonatomic", -+ "kmalloc_slack", -+ "pages" -+}; -+ -+struct alloc_info { -+ enum alloc_type type; -+ size_t size; -+#if ALLOC_DEBUG > 1 -+ struct nt_list list; -+ const char *file; -+ int line; -+ ULONG tag; -+#endif -+}; -+ -+static atomic_t alloc_sizes[ALLOC_TYPE_MAX]; -+#endif -+ -+/* allocate memory and add it to list of allocated pointers; if a -+ * driver doesn't free this memory for any reason (buggy driver or we -+ * allocate space behind driver's back since we need more space than -+ * corresponding Windows structure provides etc.), this gets freed -+ * automatically when module is unloaded -+ */ -+void *slack_kmalloc(size_t size) -+{ -+ struct slack_alloc_info *info; -+ -+ ENTER4("size = %zu", size); -+ info = kmalloc(size + sizeof(*info), irql_gfp()); -+ if (!info) -+ return NULL; -+ info->size = size; -+ spin_lock_bh(&alloc_lock); -+ InsertTailList(&slack_allocs, &info->list); -+ spin_unlock_bh(&alloc_lock); -+#if ALLOC_DEBUG -+ atomic_add(size, &alloc_sizes[ALLOC_TYPE_SLACK]); -+#endif -+ TRACE4("%p, %p", info, info + 1); -+ EXIT4(return info + 1); -+} -+ -+/* free pointer and remove from list of allocated pointers */ -+void slack_kfree(void *ptr) -+{ -+ struct slack_alloc_info *info; -+ -+ ENTER4("%p", ptr); -+ info = ptr - sizeof(*info); -+ spin_lock_bh(&alloc_lock); -+ RemoveEntryList(&info->list); -+ spin_unlock_bh(&alloc_lock); -+#if ALLOC_DEBUG -+ atomic_sub(info->size, &alloc_sizes[ALLOC_TYPE_SLACK]); -+#endif -+ kfree(info); -+ EXIT4(return); -+} -+ -+void *slack_kzalloc(size_t size) -+{ -+ void *ptr = slack_kmalloc(size); -+ if (ptr) -+ memset(ptr, 0, size); -+ return ptr; -+} -+ -+#if ALLOC_DEBUG -+void *wrap_kmalloc(size_t size, gfp_t flags, const char *file, int line) -+{ -+ struct alloc_info *info; -+ -+ info = kmalloc(size + sizeof(*info), flags); -+ if (!info) -+ return NULL; -+ if (flags & GFP_ATOMIC) -+ info->type = ALLOC_TYPE_KMALLOC_ATOMIC; -+ else -+ info->type = ALLOC_TYPE_KMALLOC_NON_ATOMIC; -+ info->size = size; -+ atomic_add(size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ info->file = file; -+ info->line = line; -+ info->tag = 0; -+ spin_lock_bh(&alloc_lock); -+ InsertTailList(&allocs, &info->list); -+ spin_unlock_bh(&alloc_lock); -+#endif -+ TRACE4("%p", info + 1); -+ return info + 1; -+} -+ -+void *wrap_kzalloc(size_t size, gfp_t flags, const char *file, int line) -+{ -+ void *ptr = wrap_kmalloc(size, flags, file, line); -+ if (ptr) -+ memset(ptr, 0, size); -+ return ptr; -+} -+ -+void wrap_kfree(void *ptr) -+{ -+ struct alloc_info *info; -+ -+ TRACE4("%p", ptr); -+ if (!ptr) -+ return; -+ info = ptr - sizeof(*info); -+ atomic_sub(info->size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ spin_lock_bh(&alloc_lock); -+ RemoveEntryList(&info->list); -+ spin_unlock_bh(&alloc_lock); -+ if (!(info->type == ALLOC_TYPE_KMALLOC_ATOMIC || -+ info->type == ALLOC_TYPE_KMALLOC_NON_ATOMIC)) { -+ WARNING("invalid type: %d", info->type); -+ return; -+ } -+#endif -+ kfree(info); -+} -+ -+void *wrap_vmalloc(unsigned long size, const char *file, int line) -+{ -+ struct alloc_info *info; -+ -+ info = vmalloc(size + sizeof(*info)); -+ if (!info) -+ return NULL; -+ info->type = ALLOC_TYPE_VMALLOC_NON_ATOMIC; -+ info->size = size; -+ atomic_add(size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ info->file = file; -+ info->line = line; -+ info->tag = 0; -+ spin_lock_bh(&alloc_lock); -+ InsertTailList(&allocs, &info->list); -+ spin_unlock_bh(&alloc_lock); -+#endif -+ return info + 1; -+} -+ -+void *wrap__vmalloc(unsigned long size, gfp_t gfp_mask, -+ const char *file, int line) -+{ -+ struct alloc_info *info; -+ -+ info = __vmalloc(size + sizeof(*info), gfp_mask); -+ if (!info) -+ return NULL; -+ if (gfp_mask & GFP_ATOMIC) -+ info->type = ALLOC_TYPE_VMALLOC_ATOMIC; -+ else -+ info->type = ALLOC_TYPE_VMALLOC_NON_ATOMIC; -+ info->size = size; -+ atomic_add(size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ info->file = file; -+ info->line = line; -+ info->tag = 0; -+ spin_lock_bh(&alloc_lock); -+ InsertTailList(&allocs, &info->list); -+ spin_unlock_bh(&alloc_lock); -+#endif -+ return info + 1; -+} -+ -+void wrap_vfree(void *ptr) -+{ -+ struct alloc_info *info; -+ -+ info = ptr - sizeof(*info); -+ atomic_sub(info->size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ spin_lock_bh(&alloc_lock); -+ RemoveEntryList(&info->list); -+ spin_unlock_bh(&alloc_lock); -+ if (!(info->type == ALLOC_TYPE_VMALLOC_ATOMIC || -+ info->type == ALLOC_TYPE_VMALLOC_NON_ATOMIC)) { -+ WARNING("invalid type: %d", info->type); -+ return; -+ } -+#endif -+ vfree(info); -+} -+ -+void *wrap_alloc_pages(gfp_t flags, unsigned int size, -+ const char *file, int line) -+{ -+ struct alloc_info *info; -+ -+ size += sizeof(*info); -+ info = (struct alloc_info *)__get_free_pages(flags, get_order(size)); -+ if (!info) -+ return NULL; -+ info->type = ALLOC_TYPE_PAGES; -+ info->size = size; -+ atomic_add(size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ info->file = file; -+ info->line = line; -+ info->tag = 0; -+ spin_lock_bh(&alloc_lock); -+ InsertTailList(&allocs, &info->list); -+ spin_unlock_bh(&alloc_lock); -+#endif -+ return info + 1; -+} -+ -+void wrap_free_pages(unsigned long ptr, int order) -+{ -+ struct alloc_info *info; -+ -+ info = (void *)ptr - sizeof(*info); -+ atomic_sub(info->size, &alloc_sizes[info->type]); -+#if ALLOC_DEBUG > 1 -+ spin_lock_bh(&alloc_lock); -+ RemoveEntryList(&info->list); -+ spin_unlock_bh(&alloc_lock); -+ if (info->type != ALLOC_TYPE_PAGES) { -+ WARNING("invalid type: %d", info->type); -+ return; -+ } -+#endif -+ free_pages((unsigned long)info, get_order(info->size)); -+} -+ -+#if ALLOC_DEBUG > 1 -+void *wrap_ExAllocatePoolWithTag(enum pool_type pool_type, SIZE_T size, -+ ULONG tag, const char *file, int line) -+{ -+ void *addr; -+ struct alloc_info *info; -+ -+ ENTER4("pool_type: %d, size: %zu, tag: %u", pool_type, size, tag); -+ addr = (ExAllocatePoolWithTag)(pool_type, size, tag); -+ if (!addr) -+ return NULL; -+ info = addr - sizeof(*info); -+ info->file = file; -+ info->line = line; -+ info->tag = tag; -+ EXIT4(return addr); -+} -+#endif -+ -+int alloc_size(enum alloc_type type) -+{ -+ if ((int)type >= 0 && type < ALLOC_TYPE_MAX) -+ return atomic_read(&alloc_sizes[type]); -+ else -+ return -EINVAL; -+} -+ -+#endif // ALLOC_DEBUG -+ -+int wrapmem_init(void) -+{ -+#if ALLOC_DEBUG > 1 -+ InitializeListHead(&allocs); -+#endif -+ InitializeListHead(&slack_allocs); -+ spin_lock_init(&alloc_lock); -+ return 0; -+} -+ -+void wrapmem_exit(void) -+{ -+#if ALLOC_DEBUG -+ enum alloc_type type; -+#endif -+ struct nt_list *ent; -+ -+ /* free all pointers on the slack list */ -+ while (1) { -+ struct slack_alloc_info *info; -+ spin_lock_bh(&alloc_lock); -+ ent = RemoveHeadList(&slack_allocs); -+ spin_unlock_bh(&alloc_lock); -+ if (!ent) -+ break; -+ info = container_of(ent, struct slack_alloc_info, list); -+#if ALLOC_DEBUG -+ atomic_sub(info->size, &alloc_sizes[ALLOC_TYPE_SLACK]); -+#endif -+ kfree(info); -+ } -+#if ALLOC_DEBUG -+ for (type = 0; type < ALLOC_TYPE_MAX; type++) { -+ int n = atomic_read(&alloc_sizes[type]); -+ if (n) -+ WARNING("%d bytes of memory in %s leaking", n, -+ alloc_type_name[type]); -+ } -+ -+#if ALLOC_DEBUG > 1 -+ while (1) { -+ struct alloc_info *info; -+ -+ spin_lock_bh(&alloc_lock); -+ ent = RemoveHeadList(&allocs); -+ spin_unlock_bh(&alloc_lock); -+ if (!ent) -+ break; -+ info = container_of(ent, struct alloc_info, list); -+ atomic_sub(info->size, &alloc_sizes[ALLOC_TYPE_SLACK]); -+ printk(KERN_DEBUG DRIVER_NAME -+ ": %s:%d leaked %zd bytes at %p (%s, tag 0x%08X)\n", -+ info->file, info->line, info->size, info + 1, -+ alloc_type_name[info->type], info->tag); -+ if (info->type == ALLOC_TYPE_KMALLOC_ATOMIC || -+ info->type == ALLOC_TYPE_KMALLOC_NON_ATOMIC) -+ kfree(info); -+ else if (info->type == ALLOC_TYPE_VMALLOC_ATOMIC || -+ info->type == ALLOC_TYPE_VMALLOC_NON_ATOMIC) -+ vfree(info); -+ else if (info->type == ALLOC_TYPE_PAGES) -+ free_pages((unsigned long)info, get_order(info->size)); -+ else -+ WARNING("invalid type: %d; not freed", info->type); -+ } -+#endif -+#endif -+ return; -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapmem.h linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapmem.h ---- linux-5.6.11/3rdparty/ndiswrapper/wrapmem.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapmem.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,97 @@ -+/* -+ * Copyright (C) 2006 Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _WRAPMEM_H_ -+#define _WRAPMEM_H_ -+ -+/* -+ * Set ALLOC_DEBUG to 1 to show information about memory used by both -+ * ndiswrapper and Windows driver in /proc/net/ndiswrapper/debug -+ * This will also show memory leaks (memory allocated but not freed) when -+ * ndiswrapper module is unloaded. -+ * -+ * Set ALLOC_DEBUG to 2 to see details about every leaking allocation. -+*/ -+ -+#ifndef ALLOC_DEBUG -+#define ALLOC_DEBUG 0 -+#endif -+ -+int wrapmem_init(void); -+void wrapmem_exit(void); -+void *slack_kmalloc(size_t size); -+void *slack_kzalloc(size_t size); -+void slack_kfree(void *ptr); -+ -+#if ALLOC_DEBUG -+enum alloc_type { ALLOC_TYPE_KMALLOC_ATOMIC, -+ ALLOC_TYPE_KMALLOC_NON_ATOMIC, -+ ALLOC_TYPE_VMALLOC_ATOMIC, ALLOC_TYPE_VMALLOC_NON_ATOMIC, -+ ALLOC_TYPE_SLACK, ALLOC_TYPE_PAGES, ALLOC_TYPE_MAX }; -+ -+extern const char *alloc_type_name[ALLOC_TYPE_MAX]; -+ -+void *wrap_kmalloc(size_t size, gfp_t flags, const char *file, int line); -+void *wrap_kzalloc(size_t size, gfp_t flags, const char *file, int line); -+void wrap_kfree(void *ptr); -+void *wrap_vmalloc(unsigned long size, const char *file, int line); -+void *wrap__vmalloc(unsigned long size, gfp_t flags, -+ const char *file, int line); -+void wrap_vfree(void *ptr); -+void *wrap_alloc_pages(gfp_t flags, unsigned int size, -+ const char *file, int line); -+void wrap_free_pages(unsigned long ptr, int order); -+int alloc_size(enum alloc_type type); -+ -+#if ALLOC_DEBUG > 1 -+void *wrap_ExAllocatePoolWithTag(enum pool_type pool_type, SIZE_T size, -+ ULONG tag, const char *file, int line); -+#define ExAllocatePoolWithTag(pool_type, size, tag) \ -+ wrap_ExAllocatePoolWithTag(pool_type, size, tag, __FILE__, __LINE__) -+#endif -+ -+#ifndef _WRAPMEM_C_ -+#undef kmalloc -+#undef kzalloc -+#undef kfree -+#undef vmalloc -+#undef __vmalloc -+#undef vfree -+#define kmalloc(size, flags) \ -+ wrap_kmalloc(size, flags, __FILE__, __LINE__) -+#define kzalloc(size, flags) \ -+ wrap_kzalloc(size, flags, __FILE__, __LINE__) -+#define vmalloc(size) \ -+ wrap_vmalloc(size, __FILE__, __LINE__) -+#define __vmalloc(size, flags) \ -+ wrap__vmalloc(size, flags, __FILE__, __LINE__) -+#define kfree(ptr) wrap_kfree(ptr) -+#define vfree(ptr) wrap_vfree(ptr) -+ -+#define wrap_get_free_pages(flags, size) \ -+ wrap_alloc_pages(flags, size, __FILE__, __LINE__) -+#undef free_pages -+#define free_pages(ptr, order) wrap_free_pages(ptr, order) -+ -+#endif // _WRAPMEM_C_ -+ -+#else -+ -+#define wrap_get_free_pages(flags, size) \ -+ (void *)__get_free_pages(flags, get_order(size)) -+ -+#endif // ALLOC_DEBUG -+ -+#endif -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapndis.c linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapndis.c ---- linux-5.6.11/3rdparty/ndiswrapper/wrapndis.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapndis.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,2223 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include "ndis.h" -+#include "iw_ndis.h" -+#include "pnp.h" -+#include "loader.h" -+#include "wrapndis.h" -+#include "wrapper.h" -+ -+/* Functions callable from the NDIS driver */ -+wstdcall NTSTATUS NdisDispatchDeviceControl(struct device_object *fdo, -+ struct irp *irp); -+wstdcall NTSTATUS NdisDispatchPnp(struct device_object *fdo, struct irp *irp); -+wstdcall NTSTATUS NdisDispatchPower(struct device_object *fdo, struct irp *irp); -+ -+struct workqueue_struct *wrapndis_wq; -+ -+static int set_packet_filter(struct ndis_device *wnd, -+ ULONG packet_filter); -+static void add_iw_stats_timer(struct ndis_device *wnd); -+static void del_iw_stats_timer(struct ndis_device *wnd); -+static NDIS_STATUS ndis_start_device(struct ndis_device *wnd); -+static int ndis_remove_device(struct ndis_device *wnd); -+static void set_multicast_list(struct ndis_device *wnd); -+static int ndis_net_dev_open(struct net_device *net_dev); -+static int ndis_net_dev_close(struct net_device *net_dev); -+ -+/* MiniportReset */ -+NDIS_STATUS mp_reset(struct ndis_device *wnd) -+{ -+ NDIS_STATUS res; -+ struct miniport *mp; -+ BOOLEAN reset_address; -+ KIRQL irql; -+ -+ ENTER2("wnd: %p", wnd); -+ mutex_lock(&wnd->tx_ring_mutex); -+ mutex_lock(&wnd->ndis_req_mutex); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ prepare_wait_condition(wnd->ndis_req_task, wnd->ndis_req_done, 0); -+ WARNING("%s is being reset", wnd->net_dev->name); -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ res = LIN2WIN2(mp->reset, &reset_address, wnd->nmb->mp_ctx); -+ serialize_unlock_irql(wnd, irql); -+ -+ TRACE2("%08X, %08X", res, reset_address); -+ if (res == NDIS_STATUS_PENDING) { -+ /* wait for NdisMResetComplete */ -+ if (wait_condition((wnd->ndis_req_done > 0), 0, -+ TASK_INTERRUPTIBLE) < 0) -+ res = NDIS_STATUS_FAILURE; -+ else { -+ res = wnd->ndis_req_status; -+ reset_address = wnd->ndis_req_done - 1; -+ } -+ TRACE2("%08X, %08X", res, reset_address); -+ } -+ mutex_unlock(&wnd->ndis_req_mutex); -+ if (res == NDIS_STATUS_SUCCESS && reset_address) { -+ set_packet_filter(wnd, wnd->packet_filter); -+ set_multicast_list(wnd); -+ } -+ mutex_unlock(&wnd->tx_ring_mutex); -+ EXIT3(return res); -+} -+ -+/* MiniportRequest(Query/Set)Information */ -+NDIS_STATUS mp_request(enum ndis_request_type request, -+ struct ndis_device *wnd, ndis_oid oid, -+ void *buf, ULONG buflen, ULONG *written, ULONG *needed) -+{ -+ NDIS_STATUS res; -+ ULONG w, n; -+ struct miniport *mp; -+ KIRQL irql; -+ -+ mutex_lock(&wnd->ndis_req_mutex); -+ if (!written) -+ written = &w; -+ if (!needed) -+ needed = &n; -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ prepare_wait_condition(wnd->ndis_req_task, wnd->ndis_req_done, 0); -+ irql = serialize_lock_irql(wnd); -+ assert_irql(_irql_ == DISPATCH_LEVEL); -+ switch (request) { -+ case NdisRequestQueryInformation: -+ TRACE2("%p, %08X, %p", mp->queryinfo, oid, wnd->nmb->mp_ctx); -+ res = LIN2WIN6(mp->queryinfo, wnd->nmb->mp_ctx, oid, buf, -+ buflen, written, needed); -+ break; -+ case NdisRequestSetInformation: -+ TRACE2("%p, %08X, %p", mp->setinfo, oid, wnd->nmb->mp_ctx); -+ res = LIN2WIN6(mp->setinfo, wnd->nmb->mp_ctx, oid, buf, -+ buflen, written, needed); -+ break; -+ default: -+ WARNING("invalid request %d, %08X", request, oid); -+ res = NDIS_STATUS_NOT_SUPPORTED; -+ break; -+ } -+ serialize_unlock_irql(wnd, irql); -+ TRACE2("%08X, %08X", res, oid); -+ if (res == NDIS_STATUS_PENDING) { -+ /* wait for NdisMQueryInformationComplete */ -+ if (wait_condition((wnd->ndis_req_done > 0), 0, -+ TASK_INTERRUPTIBLE) < 0) -+ res = NDIS_STATUS_FAILURE; -+ else -+ res = wnd->ndis_req_status; -+ TRACE2("%08X, %08X", res, oid); -+ } -+ mutex_unlock(&wnd->ndis_req_mutex); -+ DBG_BLOCK(2) { -+ if (res || needed) -+ TRACE2("%08X, %d, %d, %d", res, buflen, *written, -+ *needed); -+ } -+ EXIT3(return res); -+} -+ -+/* MiniportPnPEventNotify */ -+static NDIS_STATUS mp_pnp_event(struct ndis_device *wnd, -+ enum ndis_device_pnp_event event, -+ ULONG power_profile) -+{ -+ struct miniport *mp; -+ -+ ENTER1("%p, %d", wnd, event); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ if (!mp->pnp_event_notify) { -+ TRACE1("Windows driver %s doesn't support " -+ "MiniportPnpEventNotify", wnd->wd->driver->name); -+ return NDIS_STATUS_FAILURE; -+ } -+ /* RNDIS driver doesn't like to be notified if device is -+ * already halted */ -+ if (!test_bit(HW_INITIALIZED, &wnd->wd->hw_status)) -+ EXIT1(return NDIS_STATUS_SUCCESS); -+ switch (event) { -+ case NdisDevicePnPEventSurpriseRemoved: -+ TRACE1("%u, %p", -+ (wnd->attributes & NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK), -+ mp->pnp_event_notify); -+ if ((wnd->attributes & NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK) && -+ !test_bit(HW_DISABLED, &wnd->wd->hw_status) && -+ mp->pnp_event_notify) { -+ TRACE1("calling surprise_removed"); -+ LIN2WIN4(mp->pnp_event_notify, wnd->nmb->mp_ctx, -+ NdisDevicePnPEventSurpriseRemoved, NULL, 0); -+ } else -+ TRACE1("Windows driver %s doesn't support " -+ "MiniportPnpEventNotify for safe unplugging", -+ wnd->wd->driver->name); -+ return NDIS_STATUS_SUCCESS; -+ case NdisDevicePnPEventPowerProfileChanged: -+ if (power_profile) -+ power_profile = NdisPowerProfileAcOnLine; -+ LIN2WIN4(mp->pnp_event_notify, wnd->nmb->mp_ctx, -+ NdisDevicePnPEventPowerProfileChanged, -+ &power_profile, sizeof(power_profile)); -+ return NDIS_STATUS_SUCCESS; -+ default: -+ WARNING("event %d not yet implemented", event); -+ return NDIS_STATUS_SUCCESS; -+ } -+} -+ -+/* MiniportInitialize */ -+static NDIS_STATUS mp_init(struct ndis_device *wnd) -+{ -+ NDIS_STATUS error_status, status; -+ UINT medium_index; -+ enum ndis_medium medium_array[] = {NdisMedium802_3}; -+ struct miniport *mp; -+ -+ ENTER1("irql: %d", current_irql()); -+ if (test_bit(HW_INITIALIZED, &wnd->wd->hw_status)) { -+ WARNING("device %p already initialized!", wnd); -+ return NDIS_STATUS_FAILURE; -+ } -+ -+ if (!wnd->wd->driver->ndis_driver || -+ !wnd->wd->driver->ndis_driver->mp.init) { -+ WARNING("assuming WDM (non-NDIS) driver"); -+ EXIT1(return NDIS_STATUS_NOT_RECOGNIZED); -+ } -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ status = LIN2WIN6(mp->init, &error_status, &medium_index, medium_array, -+ ARRAY_SIZE(medium_array), wnd->nmb, wnd->nmb); -+ TRACE1("init returns: %08X, irql: %d", status, current_irql()); -+ if (status != NDIS_STATUS_SUCCESS) { -+ WARNING("couldn't initialize device: %08X", status); -+ EXIT1(return NDIS_STATUS_FAILURE); -+ } -+ -+ /* Wait a little to let card power up otherwise ifup might -+ * fail after boot */ -+ sleep_hz(HZ / 5); -+ status = mp_pnp_event(wnd, NdisDevicePnPEventPowerProfileChanged, -+ NdisPowerProfileAcOnLine); -+ if (status != NDIS_STATUS_SUCCESS) -+ TRACE1("setting power failed: %08X", status); -+ set_bit(HW_INITIALIZED, &wnd->wd->hw_status); -+ /* the description about NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND is -+ * misleading/confusing */ -+ status = mp_query(wnd, OID_PNP_CAPABILITIES, -+ &wnd->pnp_capa, sizeof(wnd->pnp_capa)); -+ if (status == NDIS_STATUS_SUCCESS) { -+ TRACE1("%d, %d", wnd->pnp_capa.wakeup.min_magic_packet_wakeup, -+ wnd->pnp_capa.wakeup.min_pattern_wakeup); -+ wnd->attributes |= NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND; -+ status = mp_query_int(wnd, OID_PNP_ENABLE_WAKE_UP, -+ &wnd->ndis_wolopts); -+ TRACE1("%08X, %x", status, wnd->ndis_wolopts); -+ } else if (status == NDIS_STATUS_NOT_SUPPORTED) -+ wnd->attributes &= ~NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND; -+ TRACE1("%d", wnd->pnp_capa.wakeup.min_magic_packet_wakeup); -+ /* although some NDIS drivers support suspend, Linux kernel -+ * has issues with suspending USB devices */ -+ if (wrap_is_usb_bus(wnd->wd->dev_bus)) { -+ wnd->attributes &= ~NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND; -+ wnd->ndis_wolopts = 0; -+ } -+ mp_set_int(wnd, OID_802_11_POWER_MODE, NDIS_POWER_OFF); -+ EXIT1(return NDIS_STATUS_SUCCESS); -+} -+ -+/* MiniportHalt */ -+static void mp_halt(struct ndis_device *wnd) -+{ -+ struct miniport *mp; -+ -+ ENTER1("%p", wnd); -+ if (!test_and_clear_bit(HW_INITIALIZED, &wnd->wd->hw_status)) { -+ WARNING("device %p is not initialized - not halting", wnd); -+ return; -+ } -+ hangcheck_del(wnd); -+ del_iw_stats_timer(wnd); -+#ifdef CONFIG_WIRELESS_EXT -+ if (wnd->physical_medium == NdisPhysicalMediumWirelessLan && -+ wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ mutex_unlock(&wnd->ndis_req_mutex); -+ disassociate(wnd, 0); -+ mutex_lock(&wnd->ndis_req_mutex); -+ } -+#endif -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ TRACE1("halt: %p", mp->mp_halt); -+ LIN2WIN1(mp->mp_halt, wnd->nmb->mp_ctx); -+ /* if a driver doesn't call NdisMDeregisterInterrupt during -+ * halt, deregister it now */ -+ if (wnd->mp_interrupt) -+ NdisMDeregisterInterrupt(wnd->mp_interrupt); -+ /* cancel any timers left by buggy windows driver; also free -+ * the memory for timers */ -+ while (1) { -+ struct nt_slist *slist; -+ struct wrap_timer *wrap_timer; -+ -+ spin_lock_bh(&ntoskernel_lock); -+ if ((slist = wnd->wrap_timer_slist.next)) -+ wnd->wrap_timer_slist.next = slist->next; -+ spin_unlock_bh(&ntoskernel_lock); -+ TIMERTRACE("%p", slist); -+ if (!slist) -+ break; -+ wrap_timer = container_of(slist, struct wrap_timer, slist); -+ wrap_timer->repeat = 0; -+ /* ktimer that this wrap_timer is associated to can't -+ * be touched, as it may have been freed by the driver -+ * already */ -+ if (del_timer_sync(&wrap_timer->timer)) -+ WARNING("Buggy Windows driver left timer %p " -+ "running", wrap_timer->nt_timer); -+ memset(wrap_timer, 0, sizeof(*wrap_timer)); -+ kfree(wrap_timer); -+ } -+ EXIT1(return); -+} -+ -+static NDIS_STATUS mp_set_power_state(struct ndis_device *wnd, -+ enum ndis_power_state state) -+{ -+ NDIS_STATUS status; -+ -+ TRACE1("%d", state); -+ if (state == NdisDeviceStateD0) { -+ status = NDIS_STATUS_SUCCESS; -+ mutex_unlock(&wnd->ndis_req_mutex); -+ if (test_and_clear_bit(HW_HALTED, &wnd->wd->hw_status)) { -+ status = mp_init(wnd); -+ if (status == NDIS_STATUS_SUCCESS) { -+ set_packet_filter(wnd, wnd->packet_filter); -+ set_multicast_list(wnd); -+ } -+ } else if (test_and_clear_bit(HW_SUSPENDED, -+ &wnd->wd->hw_status)) { -+ status = mp_set_int(wnd, OID_PNP_SET_POWER, state); -+ if (status != NDIS_STATUS_SUCCESS) -+ WARNING("%s: setting power to state %d failed? " -+ "%08X", wnd->net_dev->name, state, -+ status); -+ } else -+ return NDIS_STATUS_FAILURE; -+ -+ if (wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ pci_enable_wake(wnd->wd->pci.pdev, PCI_D3hot, 0); -+ pci_enable_wake(wnd->wd->pci.pdev, PCI_D3cold, 0); -+ } -+ if (status == NDIS_STATUS_SUCCESS) { -+ mutex_unlock(&wnd->tx_ring_mutex); -+ netif_device_attach(wnd->net_dev); -+ hangcheck_add(wnd); -+ add_iw_stats_timer(wnd); -+ } else -+ WARNING("%s: couldn't set power to state %d; device not" -+ " resumed", wnd->net_dev->name, state); -+ EXIT1(return status); -+ } else { -+ mutex_lock(&wnd->tx_ring_mutex); -+ netif_device_detach(wnd->net_dev); -+ hangcheck_del(wnd); -+ del_iw_stats_timer(wnd); -+ status = NDIS_STATUS_NOT_SUPPORTED; -+ if (wnd->attributes & NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND) { -+ status = mp_set_int(wnd, OID_PNP_ENABLE_WAKE_UP, -+ wnd->ndis_wolopts); -+ TRACE2("0x%x, 0x%x", status, wnd->ndis_wolopts); -+ if (status == NDIS_STATUS_SUCCESS && -+ wrap_is_pci_bus(wnd->wd->dev_bus)) { -+ if (wnd->ndis_wolopts) -+ wnd->wd->pci.wake_state = -+ PowerDeviceD3; -+ else -+ wnd->wd->pci.wake_state = -+ PowerDeviceUnspecified; -+ } else -+ WARNING("couldn't set wake-on-lan options: " -+ "0x%x, %08X", wnd->ndis_wolopts, status); -+ status = mp_set_int(wnd, OID_PNP_SET_POWER, state); -+ if (status == NDIS_STATUS_SUCCESS) -+ set_bit(HW_SUSPENDED, &wnd->wd->hw_status); -+ else -+ WARNING("suspend failed: %08X", status); -+ } -+ if (status != NDIS_STATUS_SUCCESS) { -+ WARNING("%s does not support power management; " -+ "halting the device", wnd->net_dev->name); -+ mp_halt(wnd); -+ set_bit(HW_HALTED, &wnd->wd->hw_status); -+ status = STATUS_SUCCESS; -+ } -+ mutex_lock(&wnd->ndis_req_mutex); -+ EXIT1(return status); -+ } -+} -+ -+static int ndis_set_mac_address(struct net_device *dev, void *p) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct sockaddr *addr = p; -+ struct ndis_configuration_parameter param; -+ struct unicode_string key; -+ struct ansi_string ansi; -+ NDIS_STATUS res; -+ unsigned char mac_string[2 * ETH_ALEN + 1]; -+ mac_address mac; -+ -+ memcpy(mac, addr->sa_data, sizeof(mac)); -+ memset(mac_string, 0, sizeof(mac_string)); -+ res = snprintf(mac_string, sizeof(mac_string), MACSTR, MAC2STR(mac)); -+ if (res != (sizeof(mac_string) - 1)) -+ EXIT1(return -EINVAL); -+ TRACE1("new mac: %s", mac_string); -+ -+ RtlInitAnsiString(&ansi, mac_string); -+ if (RtlAnsiStringToUnicodeString(¶m.data.string, &ansi, -+ TRUE) != STATUS_SUCCESS) -+ EXIT1(return -EINVAL); -+ -+ param.type = NdisParameterString; -+ RtlInitAnsiString(&ansi, "NetworkAddress"); -+ if (RtlAnsiStringToUnicodeString(&key, &ansi, TRUE) != STATUS_SUCCESS) { -+ RtlFreeUnicodeString(¶m.data.string); -+ EXIT1(return -EINVAL); -+ } -+ NdisWriteConfiguration(&res, wnd->nmb, &key, ¶m); -+ RtlFreeUnicodeString(&key); -+ RtlFreeUnicodeString(¶m.data.string); -+ -+ if (res != NDIS_STATUS_SUCCESS) -+ EXIT1(return -EFAULT); -+ if (ndis_reinit(wnd) == NDIS_STATUS_SUCCESS) { -+ res = mp_query(wnd, OID_802_3_CURRENT_ADDRESS, -+ mac, sizeof(mac)); -+ if (res == NDIS_STATUS_SUCCESS) { -+ TRACE1("mac:" MACSTRSEP, MAC2STR(mac)); -+ memcpy(dev->dev_addr, mac, sizeof(mac)); -+ } else -+ ERROR("couldn't get mac address: %08X", res); -+ } -+ EXIT1(return 0); -+} -+ -+static int setup_tx_sg_list(struct ndis_device *wnd, struct sk_buff *skb, -+ struct ndis_packet_oob_data *oob_data) -+{ -+ struct ndis_sg_element *sg_element; -+ struct ndis_sg_list *sg_list; -+ int i; -+ -+ ENTER3("%p, %d", skb, skb_shinfo(skb)->nr_frags); -+ if (skb_shinfo(skb)->nr_frags <= 1) { -+ sg_element = &oob_data->wrap_tx_sg_list.elements[0]; -+ sg_element->address = -+ PCI_DMA_MAP_SINGLE(wnd->wd->pci.pdev, skb->data, -+ skb->len, PCI_DMA_TODEVICE); -+ sg_element->length = skb->len; -+ oob_data->wrap_tx_sg_list.nent = 1; -+ oob_data->ext.info[ScatterGatherListPacketInfo] = -+ &oob_data->wrap_tx_sg_list; -+ TRACE3("%llx, %u", sg_element->address, sg_element->length); -+ return 0; -+ } -+ sg_list = kmalloc(sizeof(*sg_list) + -+ (skb_shinfo(skb)->nr_frags + 1) * sizeof(*sg_element), -+ GFP_ATOMIC); -+ if (!sg_list) -+ return -ENOMEM; -+ sg_list->nent = skb_shinfo(skb)->nr_frags + 1; -+ TRACE3("%p, %d", sg_list, sg_list->nent); -+ sg_element = sg_list->elements; -+ sg_element->length = skb_headlen(skb); -+ sg_element->address = -+ PCI_DMA_MAP_SINGLE(wnd->wd->pci.pdev, skb->data, -+ skb_headlen(skb), PCI_DMA_TODEVICE); -+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -+ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; -+ sg_element++; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) -+ sg_element->length = skb_frag_size(frag); -+#else -+ sg_element->length = frag->size; -+#endif -+ sg_element->address = -+ pci_map_page(wnd->wd->pci.pdev, skb_frag_page(frag), -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) -+ skb_frag_off(frag), skb_frag_size(frag), -+#else -+ frag->page_offset, frag->size, -+#endif -+ PCI_DMA_TODEVICE); -+ TRACE3("%llx, %u", sg_element->address, sg_element->length); -+ } -+ oob_data->ext.info[ScatterGatherListPacketInfo] = sg_list; -+ return 0; -+} -+ -+static void free_tx_sg_list(struct ndis_device *wnd, -+ struct ndis_packet_oob_data *oob_data) -+{ -+ int i; -+ struct ndis_sg_element *sg_element; -+ struct ndis_sg_list *sg_list = -+ oob_data->ext.info[ScatterGatherListPacketInfo]; -+ sg_element = sg_list->elements; -+ TRACE3("%p, %d", sg_list, sg_list->nent); -+ PCI_DMA_UNMAP_SINGLE(wnd->wd->pci.pdev, sg_element->address, -+ sg_element->length, PCI_DMA_TODEVICE); -+ if (sg_list->nent == 1) -+ EXIT3(return); -+ for (i = 1; i < sg_list->nent; i++, sg_element++) { -+ TRACE3("%llx, %u", sg_element->address, sg_element->length); -+ pci_unmap_page(wnd->wd->pci.pdev, sg_element->address, -+ sg_element->length, PCI_DMA_TODEVICE); -+ } -+ TRACE3("%p", sg_list); -+ kfree(sg_list); -+} -+ -+static struct ndis_packet *alloc_tx_packet(struct ndis_device *wnd, -+ struct sk_buff *skb) -+{ -+ struct ndis_packet *packet; -+ ndis_buffer *buffer; -+ struct ndis_packet_oob_data *oob_data; -+ NDIS_STATUS status; -+ -+ NdisAllocatePacket(&status, &packet, wnd->tx_packet_pool); -+ if (status != NDIS_STATUS_SUCCESS) -+ return NULL; -+ NdisAllocateBuffer(&status, &buffer, wnd->tx_buffer_pool, -+ skb->data, skb->len); -+ if (status != NDIS_STATUS_SUCCESS) { -+ NdisFreePacket(packet); -+ return NULL; -+ } -+ packet->private.buffer_head = buffer; -+ packet->private.buffer_tail = buffer; -+ -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ oob_data->tx_skb = skb; -+ if (wnd->sg_dma_size) { -+ if (setup_tx_sg_list(wnd, skb, oob_data)) { -+ NdisFreeBuffer(buffer); -+ NdisFreePacket(packet); -+ return NULL; -+ } -+ } -+ if (skb->ip_summed == CHECKSUM_PARTIAL) { -+ struct ndis_tcp_ip_checksum_packet_info csum; -+ int protocol; -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21) -+ protocol = ntohs(skb->protocol); -+#else -+ protocol = skb->nh.iph->protocol; -+#endif -+ csum.value = 0; -+ csum.tx.v4 = 1; -+ if (protocol == IPPROTO_TCP) -+ csum.tx.tcp = 1; -+ else if (protocol == IPPROTO_UDP) -+ csum.tx.udp = 1; -+// csum->tx.ip = 1; -+ packet->private.flags |= NDIS_PROTOCOL_ID_TCP_IP; -+ oob_data->ext.info[TcpIpChecksumPacketInfo] = -+ (void *)(ULONG_PTR)csum.value; -+ } -+ DBG_BLOCK(4) { -+ dump_bytes(__func__, skb->data, skb->len); -+ } -+ TRACE4("%p, %p, %p", packet, buffer, skb); -+ return packet; -+} -+ -+void free_tx_packet(struct ndis_device *wnd, struct ndis_packet *packet, -+ NDIS_STATUS status) -+{ -+ ndis_buffer *buffer; -+ struct ndis_packet_oob_data *oob_data; -+ struct sk_buff *skb; -+ struct ndis_packet_pool *pool; -+ -+ assert_irql(_irql_ <= DISPATCH_LEVEL); -+ assert(packet->private.packet_flags); -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ skb = oob_data->tx_skb; -+ buffer = packet->private.buffer_head; -+ TRACE4("%p, %p, %p, %08X", packet, buffer, skb, status); -+ if (status == NDIS_STATUS_SUCCESS) { -+ pre_atomic_add(wnd->net_stats.tx_bytes, packet->private.len); -+ atomic_inc_var(wnd->net_stats.tx_packets); -+ } else { -+ TRACE1("packet dropped: %08X", status); -+ atomic_inc_var(wnd->net_stats.tx_dropped); -+ } -+ if (wnd->sg_dma_size) -+ free_tx_sg_list(wnd, oob_data); -+ NdisFreeBuffer(buffer); -+ dev_kfree_skb_any(skb); -+ pool = packet->private.pool; -+ NdisFreePacket(packet); -+ if (netif_queue_stopped(wnd->net_dev) && -+ ((pool->max_descr - pool->num_used_descr) >= -+ (wnd->max_tx_packets / 4))) { -+ set_bit(NETIF_WAKEQ, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+ } -+ EXIT4(return); -+} -+ -+/* MiniportSend and MiniportSendPackets */ -+/* this function is called holding tx_ring_mutex. start and n are such -+ * that start + n < TX_RING_SIZE; i.e., packets don't wrap around -+ * ring */ -+static u8 mp_tx_packets(struct ndis_device *wnd, u8 start, u8 n) -+{ -+ NDIS_STATUS res; -+ struct miniport *mp; -+ struct ndis_packet *packet; -+ u8 sent; -+ KIRQL irql; -+ -+ ENTER3("%d, %d", start, n); -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ if (mp->send_packets) { -+ if (deserialized_driver(wnd)) { -+ LIN2WIN3(mp->send_packets, wnd->nmb->mp_ctx, -+ &wnd->tx_ring[start], n); -+ sent = n; -+ } else { -+ irql = serialize_lock_irql(wnd); -+ LIN2WIN3(mp->send_packets, wnd->nmb->mp_ctx, -+ &wnd->tx_ring[start], n); -+ serialize_unlock_irql(wnd, irql); -+ for (sent = 0; sent < n && wnd->tx_ok; sent++) { -+ struct ndis_packet_oob_data *oob_data; -+ packet = wnd->tx_ring[start + sent]; -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ switch ((res = -+ xchg(&oob_data->status, -+ NDIS_STATUS_NOT_RECOGNIZED))) { -+ case NDIS_STATUS_SUCCESS: -+ free_tx_packet(wnd, packet, -+ NDIS_STATUS_SUCCESS); -+ break; -+ case NDIS_STATUS_PENDING: -+ break; -+ case NDIS_STATUS_RESOURCES: -+ wnd->tx_ok = 0; -+ /* resubmit this packet and -+ * the rest when resources -+ * become available */ -+ sent--; -+ break; -+ case NDIS_STATUS_FAILURE: -+ free_tx_packet(wnd, packet, -+ NDIS_STATUS_FAILURE); -+ break; -+ default: -+ ERROR("%p: invalid status: %08X", -+ packet, res); -+ free_tx_packet(wnd, packet, -+ oob_data->status); -+ break; -+ } -+ TRACE3("%p, %d", packet, res); -+ } -+ } -+ TRACE3("sent: %d(%d)", sent, n); -+ } else { -+ for (sent = 0; sent < n && wnd->tx_ok; sent++) { -+ struct ndis_packet_oob_data *oob_data; -+ packet = wnd->tx_ring[start + sent]; -+ oob_data = NDIS_PACKET_OOB_DATA(packet); -+ oob_data->status = NDIS_STATUS_NOT_RECOGNIZED; -+ irql = serialize_lock_irql(wnd); -+ res = LIN2WIN3(mp->send, wnd->nmb->mp_ctx, -+ packet, packet->private.flags); -+ serialize_unlock_irql(wnd, irql); -+ switch (res) { -+ case NDIS_STATUS_SUCCESS: -+ free_tx_packet(wnd, packet, res); -+ break; -+ case NDIS_STATUS_PENDING: -+ break; -+ case NDIS_STATUS_RESOURCES: -+ wnd->tx_ok = 0; -+ /* resend this packet when resources -+ * become available */ -+ sent--; -+ break; -+ case NDIS_STATUS_FAILURE: -+ free_tx_packet(wnd, packet, res); -+ break; -+ default: -+ ERROR("packet %p: invalid status: %08X", -+ packet, res); -+ break; -+ } -+ } -+ } -+ EXIT3(return sent); -+} -+ -+static void tx_worker(struct work_struct *work) -+{ -+ struct ndis_device *wnd; -+ s8 n; -+ -+ wnd = container_of(work, struct ndis_device, tx_work); -+ ENTER3("tx_ok %d", wnd->tx_ok); -+ while (wnd->tx_ok) { -+ mutex_lock(&wnd->tx_ring_mutex); -+ spin_lock_bh(&wnd->tx_ring_lock); -+ n = wnd->tx_ring_end - wnd->tx_ring_start; -+ TRACE3("%d, %d, %d", wnd->tx_ring_start, wnd->tx_ring_end, n); -+ /* end == start if either ring is empty or full; in -+ * the latter case is_tx_ring_full is set */ -+ if (n == 0) { -+ if (wnd->is_tx_ring_full) -+ n = TX_RING_SIZE - wnd->tx_ring_start; -+ else { -+ spin_unlock_bh(&wnd->tx_ring_lock); -+ mutex_unlock(&wnd->tx_ring_mutex); -+ break; -+ } -+ } else if (n < 0) -+ n = TX_RING_SIZE - wnd->tx_ring_start; -+ spin_unlock_bh(&wnd->tx_ring_lock); -+ if (unlikely(n > wnd->max_tx_packets)) -+ n = wnd->max_tx_packets; -+ n = mp_tx_packets(wnd, wnd->tx_ring_start, n); -+ if (n) { -+ netif_trans_update(wnd->net_dev); -+ wnd->tx_ring_start = -+ (wnd->tx_ring_start + n) % TX_RING_SIZE; -+ wnd->is_tx_ring_full = 0; -+ } -+ mutex_unlock(&wnd->tx_ring_mutex); -+ TRACE3("%d, %d, %d", wnd->tx_ring_start, wnd->tx_ring_end, n); -+ } -+ EXIT3(return); -+} -+ -+static int tx_skbuff(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ struct ndis_packet *packet; -+ -+ packet = alloc_tx_packet(wnd, skb); -+ if (!packet) { -+ TRACE2("couldn't allocate packet"); -+ netif_tx_lock(dev); -+ netif_stop_queue(dev); -+ netif_tx_unlock(dev); -+ return NETDEV_TX_BUSY; -+ } -+ spin_lock(&wnd->tx_ring_lock); -+ wnd->tx_ring[wnd->tx_ring_end++] = packet; -+ if (wnd->tx_ring_end == TX_RING_SIZE) -+ wnd->tx_ring_end = 0; -+ if (wnd->tx_ring_end == wnd->tx_ring_start) { -+ netif_tx_lock(dev); -+ wnd->is_tx_ring_full = 1; -+ netif_stop_queue(dev); -+ netif_tx_unlock(dev); -+ } -+ spin_unlock(&wnd->tx_ring_lock); -+ TRACE4("ring: %d, %d", wnd->tx_ring_start, wnd->tx_ring_end); -+ queue_work(wrapndis_wq, &wnd->tx_work); -+ return NETDEV_TX_OK; -+} -+ -+static int set_packet_filter(struct ndis_device *wnd, ULONG packet_filter) -+{ -+ NDIS_STATUS res; -+ -+ while (1) { -+ res = mp_set_int(wnd, OID_GEN_CURRENT_PACKET_FILTER, -+ packet_filter); -+ if (res == NDIS_STATUS_SUCCESS) -+ break; -+ TRACE2("couldn't set filter 0x%08x", packet_filter); -+ /* NDIS_PACKET_TYPE_PROMISCUOUS may not work with 802.11 */ -+ if (packet_filter & NDIS_PACKET_TYPE_PROMISCUOUS) { -+ packet_filter &= ~NDIS_PACKET_TYPE_PROMISCUOUS; -+ continue; -+ } -+ if (packet_filter & NDIS_PACKET_TYPE_ALL_LOCAL) { -+ packet_filter &= ~NDIS_PACKET_TYPE_ALL_LOCAL; -+ continue; -+ } -+ if (packet_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL) { -+ packet_filter &= ~NDIS_PACKET_TYPE_ALL_FUNCTIONAL; -+ continue; -+ } -+ if (packet_filter & NDIS_PACKET_TYPE_MULTICAST) { -+ packet_filter &= ~NDIS_PACKET_TYPE_MULTICAST; -+ packet_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; -+ continue; -+ } -+ if (packet_filter & NDIS_PACKET_TYPE_ALL_MULTICAST) { -+ packet_filter &= ~NDIS_PACKET_TYPE_ALL_MULTICAST; -+ continue; -+ } -+ break; -+ } -+ -+ wnd->packet_filter = packet_filter; -+ res = mp_query_int(wnd, OID_GEN_CURRENT_PACKET_FILTER, &packet_filter); -+ if (packet_filter != wnd->packet_filter) { -+ WARNING("filter not set: 0x%08x, 0x%08x", -+ packet_filter, wnd->packet_filter); -+ wnd->packet_filter = packet_filter; -+ } -+ if (wnd->packet_filter) -+ EXIT3(return 0); -+ else -+ EXIT3(return -1); -+} -+ -+void set_media_state(struct ndis_device *wnd, enum ndis_media_state state) -+{ -+ struct net_device *net_dev = wnd->net_dev; -+ -+ ENTER2("state: 0x%x, carrier %d", state, netif_carrier_ok(net_dev)); -+ switch (state) { -+ case NdisMediaStateConnected: -+ if (netif_carrier_ok(net_dev)) -+ return; -+ netif_carrier_on(net_dev); -+ wnd->tx_ok = 1; -+ if (netif_queue_stopped(net_dev)) -+ netif_wake_queue(net_dev); -+ if (wnd->physical_medium == NdisPhysicalMediumWirelessLan) { -+ set_bit(LINK_STATUS_ON, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+ } -+ break; -+ case NdisMediaStateDisconnected: -+ if (!netif_carrier_ok(net_dev)) -+ return; -+ netif_carrier_off(net_dev); -+ netif_stop_queue(net_dev); -+ wnd->tx_ok = 0; -+ if (wnd->physical_medium == NdisPhysicalMediumWirelessLan) { -+ memset(&wnd->essid, 0, sizeof(wnd->essid)); -+ set_bit(LINK_STATUS_OFF, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+ } -+ break; -+ default: -+ WARNING("invalid media state: 0x%x", state); -+ break; -+ } -+} -+ -+static int ndis_net_dev_init(struct net_device *net_dev) -+{ -+ struct ndis_device *wnd = netdev_priv(net_dev); -+ -+ ENTER1("%p", wnd); -+ wrap_procfs_add_ndis_device(wnd); -+ EXIT1(return 0); -+} -+ -+static void ndis_net_dev_uninit(struct net_device *net_dev) -+{ -+ struct ndis_device *wnd = netdev_priv(net_dev); -+ -+ ENTER1("%p", wnd); -+ wrap_procfs_remove_ndis_device(wnd); -+ EXIT1(return); -+} -+ -+static int ndis_net_dev_open(struct net_device *net_dev) -+{ -+ int status, res; -+ struct ndis_device *wnd = netdev_priv(net_dev); -+ -+ ENTER1("%p", wnd); -+ res = mp_query_int(wnd, OID_GEN_MEDIA_CONNECT_STATUS, &status); -+ if (res == NDIS_STATUS_SUCCESS && status >= NdisMediaStateConnected && -+ status <= NdisMediaStateDisconnected) -+ set_media_state(wnd, status); -+ netif_start_queue(net_dev); -+ netif_poll_enable(net_dev); -+ EXIT1(return 0); -+} -+ -+static int ndis_net_dev_close(struct net_device *net_dev) -+{ -+ ENTER1("%p", netdev_priv(net_dev)); -+ netif_poll_disable(net_dev); -+ netif_tx_disable(net_dev); -+ EXIT1(return 0); -+} -+ -+static int ndis_change_mtu(struct net_device *net_dev, int mtu) -+{ -+ struct ndis_device *wnd = netdev_priv(net_dev); -+ int max; -+ -+ if (mtu < ETH_ZLEN) -+ return -EINVAL; -+ if (mp_query_int(wnd, OID_GEN_MAXIMUM_TOTAL_SIZE, &max) != -+ NDIS_STATUS_SUCCESS) -+ return -EOPNOTSUPP; -+ TRACE1("%d", max); -+ max -= ETH_HLEN; -+ if (max <= ETH_ZLEN) -+ return -EINVAL; -+ if (mtu + ETH_HLEN > max) -+ return -EINVAL; -+ net_dev->mtu = mtu; -+ return 0; -+} -+ -+#ifdef CONFIG_NET_POLL_CONTROLLER -+static void ndis_poll_controller(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ disable_irq(dev->irq); -+ ndis_isr(wnd->mp_interrupt->kinterrupt, wnd->mp_interrupt); -+ enable_irq(dev->irq); -+} -+#endif -+ -+/* called from BH context */ -+static struct net_device_stats *ndis_get_stats(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ return &wnd->net_stats; -+} -+ -+/* called from BH context */ -+static void ndis_set_multicast_list(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ set_bit(SET_MULTICAST_LIST, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+} -+ -+/* called from BH context */ -+struct iw_statistics *get_iw_stats(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ return &wnd->iw_stats; -+} -+ -+static void update_iw_stats(struct ndis_device *wnd) -+{ -+ struct iw_statistics *iw_stats = &wnd->iw_stats; -+ struct ndis_wireless_stats ndis_stats; -+ NDIS_STATUS res; -+ ndis_rssi rssi; -+ int qual; -+ -+ ENTER2("%p", wnd); -+ if (wnd->iw_stats_enabled == FALSE || !netif_carrier_ok(wnd->net_dev)) { -+ memset(iw_stats, 0, sizeof(*iw_stats)); -+ EXIT2(return); -+ } -+ res = mp_query(wnd, OID_802_11_RSSI, &rssi, sizeof(rssi)); -+ if (res == NDIS_STATUS_SUCCESS) -+ iw_stats->qual.level = rssi; -+ -+ qual = 100 * (rssi - WL_NOISE) / (WL_SIGMAX - WL_NOISE); -+ if (qual < 0) -+ qual = 0; -+ else if (qual > 100) -+ qual = 100; -+ -+ iw_stats->qual.noise = WL_NOISE; -+ iw_stats->qual.qual = qual; -+ -+ res = mp_query(wnd, OID_802_11_STATISTICS, -+ &ndis_stats, sizeof(ndis_stats)); -+ if (res != NDIS_STATUS_SUCCESS) -+ EXIT2(return); -+ iw_stats->discard.retries = (unsigned long)ndis_stats.retry + -+ (unsigned long)ndis_stats.multi_retry; -+ iw_stats->discard.misc = (unsigned long)ndis_stats.fcs_err + -+ (unsigned long)ndis_stats.rtss_fail + -+ (unsigned long)ndis_stats.ack_fail + -+ (unsigned long)ndis_stats.frame_dup; -+ -+ EXIT2(return); -+} -+ -+static void set_multicast_list(struct ndis_device *wnd) -+{ -+ struct net_device *net_dev; -+ ULONG packet_filter; -+ NDIS_STATUS res; -+ -+ net_dev = wnd->net_dev; -+ packet_filter = wnd->packet_filter; -+ -+ TRACE2("0x%08x", packet_filter); -+ if (net_dev->flags & IFF_PROMISC) { -+ packet_filter |= NDIS_PACKET_TYPE_PROMISCUOUS | -+ NDIS_PACKET_TYPE_ALL_LOCAL; -+ } else if (net_dev->flags & IFF_ALLMULTI || -+ netdev_mc_count(net_dev) > wnd->multicast_size) { -+ packet_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; -+ TRACE2("0x%08x", packet_filter); -+ } else if (netdev_mc_count(net_dev) > 0) { -+ int i, size; -+ char *buf; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) -+ struct netdev_hw_addr *ha; -+#else -+ struct dev_mc_list *mclist; -+#endif -+ size = min(wnd->multicast_size, netdev_mc_count(net_dev)); -+ TRACE2("%d, %d", wnd->multicast_size, netdev_mc_count(net_dev)); -+ buf = kmalloc(size * ETH_ALEN, GFP_KERNEL); -+ if (!buf) { -+ WARNING("couldn't allocate memory"); -+ EXIT2(return); -+ } -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35) -+ i = 0; -+ netdev_for_each_mc_addr(ha, net_dev) { -+ if (i >= size) -+ break; -+ memcpy(buf + i * ETH_ALEN, ha->addr, ETH_ALEN); -+ TRACE2(MACSTRSEP, MAC2STR(ha->addr)); -+ i++; -+ } -+#else -+ mclist = net_dev->mc_list; -+ for (i = 0; i < size && mclist; mclist = mclist->next) { -+ if (mclist->dmi_addrlen != ETH_ALEN) -+ continue; -+ memcpy(buf + i * ETH_ALEN, mclist->dmi_addr, ETH_ALEN); -+ TRACE2(MACSTRSEP, MAC2STR(mclist->dmi_addr)); -+ i++; -+ } -+#endif -+ res = mp_set(wnd, OID_802_3_MULTICAST_LIST, buf, i * ETH_ALEN); -+ if (res == NDIS_STATUS_SUCCESS && i > 0) -+ packet_filter |= NDIS_PACKET_TYPE_MULTICAST; -+ else -+ packet_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; -+ kfree(buf); -+ } -+ TRACE2("0x%08x", packet_filter); -+ res = set_packet_filter(wnd, packet_filter); -+ if (res) -+ TRACE1("couldn't set packet filter (%08X)", res); -+ EXIT2(return); -+} -+ -+static void link_status_off(struct ndis_device *wnd) -+{ -+#ifdef CONFIG_WIRELESS_EXT -+ union iwreq_data wrqu; -+ -+ memset(&wrqu, 0, sizeof(wrqu)); -+ wrqu.ap_addr.sa_family = ARPHRD_ETHER; -+ wireless_send_event(wnd->net_dev, SIOCGIWAP, &wrqu, NULL); -+#endif -+ EXIT2(return); -+} -+ -+static void link_status_on(struct ndis_device *wnd) -+{ -+#ifdef CONFIG_WIRELESS_EXT -+ struct ndis_assoc_info *ndis_assoc_info; -+ union iwreq_data wrqu; -+ NDIS_STATUS res; -+ const int assoc_size = sizeof(*ndis_assoc_info) + IW_CUSTOM_MAX + 32; -+#endif -+ -+ ENTER2(""); -+#ifdef CONFIG_WIRELESS_EXT -+ memset(&wrqu, 0, sizeof(wrqu)); -+ ndis_assoc_info = kzalloc(assoc_size, GFP_KERNEL); -+ if (!ndis_assoc_info) { -+ ERROR("couldn't allocate memory"); -+ goto send_assoc_event; -+ } -+ res = mp_query(wnd, OID_802_11_ASSOCIATION_INFORMATION, -+ ndis_assoc_info, assoc_size); -+ if (res) { -+ TRACE2("query assoc_info failed (%08X)", res); -+ kfree(ndis_assoc_info); -+ goto send_assoc_event; -+ } -+ TRACE2("%u, 0x%x, %u, 0x%x, %u", ndis_assoc_info->length, -+ ndis_assoc_info->req_ies, ndis_assoc_info->req_ie_length, -+ ndis_assoc_info->resp_ies, ndis_assoc_info->resp_ie_length); -+ if (ndis_assoc_info->req_ie_length > 0) { -+ wrqu.data.length = ndis_assoc_info->req_ie_length; -+ wireless_send_event(wnd->net_dev, IWEVASSOCREQIE, &wrqu, -+ ((char *)ndis_assoc_info) + -+ ndis_assoc_info->offset_req_ies); -+ } -+ if (ndis_assoc_info->resp_ie_length > 0) { -+ wrqu.data.length = ndis_assoc_info->resp_ie_length; -+ wireless_send_event(wnd->net_dev, IWEVASSOCRESPIE, &wrqu, -+ ((char *)ndis_assoc_info) + -+ ndis_assoc_info->offset_resp_ies); -+ } -+ kfree(ndis_assoc_info); -+ -+send_assoc_event: -+ get_ap_address(wnd, wrqu.ap_addr.sa_data); -+ wrqu.ap_addr.sa_family = ARPHRD_ETHER; -+ TRACE2(MACSTRSEP, MAC2STR(wrqu.ap_addr.sa_data)); -+ wireless_send_event(wnd->net_dev, SIOCGIWAP, &wrqu, NULL); -+#endif -+ EXIT2(return); -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+static void iw_stats_timer_proc(struct timer_list *tl) -+#else -+static void iw_stats_timer_proc(unsigned long data) -+#endif -+{ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ struct ndis_device *wnd = from_timer(wnd, tl, iw_stats_timer); -+#else -+ struct ndis_device *wnd = (struct ndis_device *)data; -+#endif -+ -+ ENTER2("%d", wnd->iw_stats_interval); -+ if (wnd->iw_stats_interval > 0) { -+ set_bit(COLLECT_IW_STATS, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+ } -+ mod_timer(&wnd->iw_stats_timer, jiffies + wnd->iw_stats_interval); -+} -+ -+static void add_iw_stats_timer(struct ndis_device *wnd) -+{ -+ if (wnd->physical_medium != NdisPhysicalMediumWirelessLan) -+ return; -+ if (wnd->iw_stats_interval < 0) -+ wnd->iw_stats_interval *= -1; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ timer_setup(&wnd->iw_stats_timer, iw_stats_timer_proc, 0); -+#else -+ wnd->iw_stats_timer.data = (unsigned long)wnd; -+ wnd->iw_stats_timer.function = iw_stats_timer_proc; -+#endif -+ mod_timer(&wnd->iw_stats_timer, jiffies + wnd->iw_stats_interval); -+} -+ -+static void del_iw_stats_timer(struct ndis_device *wnd) -+{ -+ ENTER2("%d", wnd->iw_stats_interval); -+ wnd->iw_stats_interval *= -1; -+ del_timer_sync(&wnd->iw_stats_timer); -+ EXIT2(return); -+} -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+static void hangcheck_proc(struct timer_list *tl) -+#else -+static void hangcheck_proc(unsigned long data) -+#endif -+{ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ struct ndis_device *wnd = from_timer(wnd, tl, hangcheck_timer); -+#else -+ struct ndis_device *wnd = (struct ndis_device *)data; -+#endif -+ -+ ENTER3("%d", wnd->hangcheck_interval); -+ if (wnd->hangcheck_interval > 0) { -+ set_bit(HANGCHECK, &wnd->ndis_pending_work); -+ queue_work(wrapndis_wq, &wnd->ndis_work); -+ } -+ mod_timer(&wnd->hangcheck_timer, jiffies + wnd->hangcheck_interval); -+ EXIT3(return); -+} -+ -+void hangcheck_add(struct ndis_device *wnd) -+{ -+ if (!wnd->wd->driver->ndis_driver->mp.hangcheck || -+ hangcheck_interval < 0) -+ EXIT2(return); -+ -+ if (hangcheck_interval > 0) -+ wnd->hangcheck_interval = hangcheck_interval * HZ; -+ if (wnd->hangcheck_interval < 0) -+ wnd->hangcheck_interval *= -1; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ timer_setup(&wnd->hangcheck_timer, hangcheck_proc, 0); -+#else -+ wnd->hangcheck_timer.data = (unsigned long)wnd; -+ wnd->hangcheck_timer.function = hangcheck_proc; -+#endif -+ mod_timer(&wnd->hangcheck_timer, jiffies + wnd->hangcheck_interval); -+ EXIT2(return); -+} -+ -+void hangcheck_del(struct ndis_device *wnd) -+{ -+ ENTER2("%d", wnd->hangcheck_interval); -+ if (wnd->hangcheck_interval > 0) -+ wnd->hangcheck_interval *= -1; -+ del_timer_sync(&wnd->hangcheck_timer); -+ EXIT2(return); -+} -+ -+/* worker procedure to take care of setting/checking various states */ -+static void wrapndis_worker(struct work_struct *work) -+{ -+ struct ndis_device *wnd; -+ -+ wnd = container_of(work, struct ndis_device, ndis_work); -+ WORKTRACE("0x%lx", wnd->ndis_pending_work); -+ -+ if (test_and_clear_bit(NETIF_WAKEQ, &wnd->ndis_pending_work)) { -+ netif_tx_lock_bh(wnd->net_dev); -+ netif_wake_queue(wnd->net_dev); -+ netif_tx_unlock_bh(wnd->net_dev); -+ } -+ -+ if (test_and_clear_bit(LINK_STATUS_OFF, &wnd->ndis_pending_work)) -+ link_status_off(wnd); -+ -+ if (test_and_clear_bit(LINK_STATUS_ON, &wnd->ndis_pending_work)) -+ link_status_on(wnd); -+ -+ if (test_and_clear_bit(COLLECT_IW_STATS, &wnd->ndis_pending_work)) -+ update_iw_stats(wnd); -+ -+ if (test_and_clear_bit(SET_MULTICAST_LIST, -+ &wnd->ndis_pending_work)) -+ set_multicast_list(wnd); -+ -+ if (test_and_clear_bit(HANGCHECK, &wnd->ndis_pending_work)) { -+ struct miniport *mp; -+ BOOLEAN reset; -+ KIRQL irql; -+ -+ mp = &wnd->wd->driver->ndis_driver->mp; -+ irql = serialize_lock_irql(wnd); -+ reset = LIN2WIN1(mp->hangcheck, wnd->nmb->mp_ctx); -+ serialize_unlock_irql(wnd, irql); -+ if (reset) { -+ TRACE2("%s needs reset", wnd->net_dev->name); -+ mp_reset(wnd); -+ } -+ } -+ WORKEXIT(return); -+} -+ -+NDIS_STATUS ndis_reinit(struct ndis_device *wnd) -+{ -+ NDIS_STATUS status; -+ -+ wnd->attributes &= ~NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND; -+ status = mp_set_power_state(wnd, NdisDeviceStateD3); -+ if (status != NDIS_STATUS_SUCCESS) { -+ ERROR("halting device %s failed: %08X", wnd->net_dev->name, -+ status); -+ return status; -+ } -+ status = mp_set_power_state(wnd, NdisDeviceStateD0); -+ if (status != NDIS_STATUS_SUCCESS) -+ ERROR("starting device %s failed: %08X", wnd->net_dev->name, -+ status); -+ return status; -+} -+ -+#ifdef CONFIG_WIRELESS_EXT -+static void get_encryption_capa(struct ndis_device *wnd, char *buf, -+ const int buf_len) -+{ -+ int i, mode; -+ NDIS_STATUS res; -+ struct ndis_assoc_info ndis_assoc_info; -+ struct ndis_add_key ndis_key; -+ struct ndis_capability *c; -+ -+ ENTER1("%p", wnd); -+ /* set network type to g, b, or a, in that order */ -+ res = mp_query(wnd, OID_802_11_NETWORK_TYPES_SUPPORTED, buf, buf_len); -+ if (res == NDIS_STATUS_SUCCESS) { -+ struct network_type_list *net_types; -+ unsigned long types = 0; -+ net_types = (typeof(net_types))buf; -+ for (i = 0; i < net_types->num; i++) { -+ TRACE2("%d", net_types->types[i]); -+ set_bit(net_types->types[i], &types); -+ } -+ if (test_bit(Ndis802_11OFDM24, &types)) -+ mode = Ndis802_11OFDM24; -+ else if (test_bit(Ndis802_11DS, &types)) -+ mode = Ndis802_11DS; -+ else if (test_bit(Ndis802_11OFDM5, &types)) -+ mode = Ndis802_11OFDM5; -+ else -+ mode = Ndis802_11DS; -+ mp_set_int(wnd, OID_802_11_NETWORK_TYPE_IN_USE, mode); -+ } -+ /* check if WEP is supported */ -+ if (set_iw_encr_mode(wnd, IW_AUTH_CIPHER_WEP104, -+ IW_AUTH_CIPHER_NONE) == 0 && -+ get_ndis_encr_mode(wnd) == Ndis802_11Encryption1KeyAbsent) -+ set_bit(Ndis802_11Encryption1Enabled, &wnd->capa.encr); -+ -+ /* check if WPA is supported */ -+ if (set_ndis_auth_mode(wnd, Ndis802_11AuthModeWPA) == 0 && -+ get_ndis_auth_mode(wnd) == Ndis802_11AuthModeWPA) -+ set_bit(Ndis802_11AuthModeWPA, &wnd->capa.encr); -+ else -+ EXIT1(return); -+ -+ if (set_ndis_auth_mode(wnd, Ndis802_11AuthModeWPAPSK) == 0 && -+ get_ndis_auth_mode(wnd) == Ndis802_11AuthModeWPAPSK) -+ set_bit(Ndis802_11AuthModeWPAPSK, &wnd->capa.encr); -+ -+ /* check for highest encryption */ -+ mode = 0; -+ if (set_iw_encr_mode(wnd, IW_AUTH_CIPHER_CCMP, -+ IW_AUTH_CIPHER_NONE) == 0 && -+ (i = get_ndis_encr_mode(wnd)) > 0 && -+ (i == Ndis802_11Encryption3KeyAbsent || -+ i == Ndis802_11Encryption3Enabled)) -+ mode = Ndis802_11Encryption3Enabled; -+ else if (set_iw_encr_mode(wnd, IW_AUTH_CIPHER_TKIP, -+ IW_AUTH_CIPHER_NONE) == 0 && -+ (i = get_ndis_encr_mode(wnd)) > 0 && -+ (i == Ndis802_11Encryption2KeyAbsent || -+ i == Ndis802_11Encryption2Enabled)) -+ mode = Ndis802_11Encryption2Enabled; -+ else if (set_iw_encr_mode(wnd, IW_AUTH_CIPHER_WEP104, -+ IW_AUTH_CIPHER_NONE) == 0 && -+ (i = get_ndis_encr_mode(wnd)) > 0 && -+ (i == Ndis802_11Encryption1KeyAbsent || -+ i == Ndis802_11Encryption1Enabled)) -+ mode = Ndis802_11Encryption1Enabled; -+ -+ TRACE1("mode: %d", mode); -+ if (mode == 0) -+ EXIT1(return); -+ set_bit(Ndis802_11Encryption1Enabled, &wnd->capa.encr); -+ if (mode == Ndis802_11Encryption1Enabled) -+ EXIT1(return); -+ -+ ndis_key.length = 32; -+ ndis_key.index = 0xC0000001; -+ ndis_key.struct_size = sizeof(ndis_key); -+ res = mp_set(wnd, OID_802_11_ADD_KEY, &ndis_key, ndis_key.struct_size); -+ TRACE2("%08X, %zu", res, sizeof(ndis_key)); -+ if (res && res != NDIS_STATUS_INVALID_DATA) -+ EXIT1(return); -+ res = mp_query(wnd, OID_802_11_ASSOCIATION_INFORMATION, -+ &ndis_assoc_info, sizeof(ndis_assoc_info)); -+ TRACE1("%08X", res); -+ if (res == NDIS_STATUS_NOT_SUPPORTED) -+ EXIT1(return); -+ -+ set_bit(Ndis802_11Encryption2Enabled, &wnd->capa.encr); -+ if (mode == Ndis802_11Encryption3Enabled) -+ set_bit(Ndis802_11Encryption3Enabled, &wnd->capa.encr); -+ /* not all drivers support OID_802_11_CAPABILITY, so we don't -+ * know for sure if driver support WPA or WPAPSK; assume -+ * WPAPSK */ -+ set_bit(Ndis802_11AuthModeWPAPSK, &wnd->capa.auth); -+ wnd->max_pmkids = 1; -+ -+ memset(buf, 0, buf_len); -+ c = (struct ndis_capability *)buf; -+ res = mp_query(wnd, OID_802_11_CAPABILITY, buf, buf_len); -+ if (!(res == NDIS_STATUS_SUCCESS && c->version == 2)) -+ EXIT1(return); -+ wnd->max_pmkids = c->num_PMKIDs; -+ -+ for (i = 0; i < c->num_auth_encr_pair; i++) { -+ struct ndis_auth_encr_pair *ae; -+ -+ ae = &c->auth_encr_pair[i]; -+ if ((char *)(ae + 1) > buf + buf_len) -+ break; -+ switch (ae->auth_mode) { -+ case Ndis802_11AuthModeOpen: -+ case Ndis802_11AuthModeShared: -+ case Ndis802_11AuthModeWPA: -+ case Ndis802_11AuthModeWPAPSK: -+ case Ndis802_11AuthModeWPANone: -+ case Ndis802_11AuthModeWPA2: -+ case Ndis802_11AuthModeWPA2PSK: -+ set_bit(ae->auth_mode, &wnd->capa.auth); -+ break; -+ default: -+ WARNING("unknown auth_mode: %d", ae->auth_mode); -+ break; -+ } -+ switch (ae->encr_mode) { -+ case Ndis802_11EncryptionDisabled: -+ case Ndis802_11Encryption1Enabled: -+ case Ndis802_11Encryption2Enabled: -+ case Ndis802_11Encryption3Enabled: -+ set_bit(ae->encr_mode, &wnd->capa.encr); -+ break; -+ default: -+ WARNING("unknown encr_mode: %d", ae->encr_mode); -+ break; -+ } -+ } -+ EXIT1(return); -+} -+#endif -+ -+wstdcall NTSTATUS NdisDispatchDeviceControl(struct device_object *fdo, -+ struct irp *irp) -+{ -+ struct ndis_device *wnd; -+ -+ TRACE3("fdo: %p", fdo); -+ /* for now, we don't have anything interesting here, so pass it -+ * down to bus driver */ -+ wnd = fdo->reserved; -+ return IoPassIrpDown(wnd->nmb->pdo, irp); -+} -+WIN_FUNC_DECL(NdisDispatchDeviceControl,2) -+ -+wstdcall NTSTATUS NdisDispatchPower(struct device_object *fdo, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ struct ndis_device *wnd; -+ enum ndis_power_state state; -+ NTSTATUS status; -+ NDIS_STATUS ndis_status; -+ -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ wnd = fdo->reserved; -+ IOTRACE("fdo: %p, fn: %d:%d, wnd: %p", fdo, irp_sl->major_fn, -+ irp_sl->minor_fn, wnd); -+ if ((irp_sl->params.power.type == SystemPowerState && -+ irp_sl->params.power.state.system_state > PowerSystemWorking) || -+ (irp_sl->params.power.type == DevicePowerState && -+ irp_sl->params.power.state.device_state > PowerDeviceD0)) -+ state = NdisDeviceStateD3; -+ else -+ state = NdisDeviceStateD0; -+ switch (irp_sl->minor_fn) { -+ case IRP_MN_SET_POWER: -+ if (state == NdisDeviceStateD0) { -+ status = IoSyncForwardIrp(wnd->nmb->pdo, irp); -+ if (status != STATUS_SUCCESS) -+ break; -+ ndis_status = mp_set_power_state(wnd, state); -+ if (ndis_status != NDIS_STATUS_SUCCESS) -+ WARNING("couldn't set power to %d: %08X", -+ state, ndis_status); -+ TRACE2("%s: device resumed", wnd->net_dev->name); -+ irp->io_status.status = status = STATUS_SUCCESS; -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ break; -+ } else { -+ ndis_status = mp_set_power_state(wnd, state); -+ /* TODO: handle error case */ -+ if (ndis_status != NDIS_STATUS_SUCCESS) -+ WARNING("setting power to %d failed: %08X", -+ state, ndis_status); -+ status = IoAsyncForwardIrp(wnd->nmb->pdo, irp); -+ } -+ break; -+ case IRP_MN_QUERY_POWER: -+ if (wnd->attributes & NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND) { -+ ndis_status = mp_query(wnd, OID_PNP_QUERY_POWER, -+ &state, sizeof(state)); -+ TRACE2("%d, %08X", state, ndis_status); -+ /* this OID must always succeed */ -+ if (ndis_status != NDIS_STATUS_SUCCESS) -+ TRACE1("query power returns %08X", ndis_status); -+ irp->io_status.status = STATUS_SUCCESS; -+ } else -+ irp->io_status.status = STATUS_SUCCESS; -+ status = IoPassIrpDown(wnd->nmb->pdo, irp); -+ break; -+ case IRP_MN_WAIT_WAKE: -+ case IRP_MN_POWER_SEQUENCE: -+ /* TODO: implement WAIT_WAKE */ -+ status = IoPassIrpDown(wnd->nmb->pdo, irp); -+ break; -+ default: -+ status = IoPassIrpDown(wnd->nmb->pdo, irp); -+ break; -+ } -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(NdisDispatchPower,2) -+ -+wstdcall NTSTATUS NdisDispatchPnp(struct device_object *fdo, struct irp *irp) -+{ -+ struct io_stack_location *irp_sl; -+ struct ndis_device *wnd; -+ struct device_object *pdo; -+ NTSTATUS status; -+ -+ IOTRACE("fdo: %p, irp: %p", fdo, irp); -+ irp_sl = IoGetCurrentIrpStackLocation(irp); -+ wnd = fdo->reserved; -+ pdo = wnd->nmb->pdo; -+ switch (irp_sl->minor_fn) { -+ case IRP_MN_START_DEVICE: -+ status = IoSyncForwardIrp(pdo, irp); -+ if (status != STATUS_SUCCESS) -+ break; -+ if (ndis_start_device(wnd) == NDIS_STATUS_SUCCESS) -+ status = STATUS_SUCCESS; -+ else -+ status = STATUS_FAILURE; -+ irp->io_status.status = status; -+ IoCompleteRequest(irp, IO_NO_INCREMENT); -+ break; -+ case IRP_MN_QUERY_STOP_DEVICE: -+ /* TODO: implement in NDIS */ -+ status = IoPassIrpDown(wnd->nmb->pdo, irp); -+ break; -+ case IRP_MN_STOP_DEVICE: -+ mp_halt(wnd); -+ irp->io_status.status = STATUS_SUCCESS; -+ status = IoAsyncForwardIrp(pdo, irp); -+ break; -+ case IRP_MN_REMOVE_DEVICE: -+ TRACE1("%s", wnd->net_dev->name); -+ mp_pnp_event(wnd, NdisDevicePnPEventSurpriseRemoved, 0); -+ if (ndis_remove_device(wnd)) { -+ status = STATUS_FAILURE; -+ break; -+ } -+ /* wnd is already freed */ -+ status = IoAsyncForwardIrp(pdo, irp); -+ IoDetachDevice(fdo); -+ IoDeleteDevice(fdo); -+ break; -+ default: -+ status = IoAsyncForwardIrp(pdo, irp); -+ break; -+ } -+ IOTRACE("status: %08X", status); -+ IOEXIT(return status); -+} -+WIN_FUNC_DECL(NdisDispatchPnp,2) -+ -+static void set_task_offload(struct ndis_device *wnd, void *buf, -+ const int buf_size) -+{ -+ struct ndis_task_offload_header *task_offload_header; -+ struct ndis_task_offload *task_offload; -+ struct ndis_task_tcp_ip_checksum *csum = NULL; -+ struct ndis_task_tcp_large_send *tso = NULL; -+ NDIS_STATUS status; -+ -+ memset(buf, 0, buf_size); -+ task_offload_header = buf; -+ task_offload_header->version = NDIS_TASK_OFFLOAD_VERSION; -+ task_offload_header->size = sizeof(*task_offload_header); -+ task_offload_header->encap_format.flags.fixed_header_size = 1; -+ task_offload_header->encap_format.header_size = sizeof(struct ethhdr); -+ task_offload_header->encap_format.encap = IEEE_802_3_Encapsulation; -+ status = mp_query(wnd, OID_TCP_TASK_OFFLOAD, buf, buf_size); -+ TRACE1("%08X", status); -+ if (status != NDIS_STATUS_SUCCESS) -+ EXIT1(return); -+ if (task_offload_header->offset_first_task == 0) -+ EXIT1(return); -+ task_offload = ((void *)task_offload_header + -+ task_offload_header->offset_first_task); -+ while (1) { -+ TRACE1("%d, %d", task_offload->version, task_offload->task); -+ switch (task_offload->task) { -+ case TcpIpChecksumNdisTask: -+ csum = (void *)task_offload->task_buf; -+ break; -+ case TcpLargeSendNdisTask: -+ tso = (void *)task_offload->task_buf; -+ break; -+ default: -+ TRACE1("%d", task_offload->task); -+ break; -+ } -+ if (task_offload->offset_next_task == 0) -+ break; -+ task_offload = (void *)task_offload + -+ task_offload->offset_next_task; -+ } -+ if (tso) -+ TRACE1("%u, %u, %d, %d", tso->max_size, tso->min_seg_count, -+ tso->tcp_opts, tso->ip_opts); -+ if (!csum) -+ EXIT1(return); -+ TRACE1("%08x, %08x", csum->v4_tx.value, csum->v4_rx.value); -+ task_offload_header->encap_format.flags.fixed_header_size = 1; -+ task_offload_header->encap_format.header_size = sizeof(struct ethhdr); -+ task_offload_header->offset_first_task = sizeof(*task_offload_header); -+ task_offload = ((void *)task_offload_header + -+ task_offload_header->offset_first_task); -+ task_offload->offset_next_task = 0; -+ task_offload->size = sizeof(*task_offload); -+ task_offload->task = TcpIpChecksumNdisTask; -+ memcpy(task_offload->task_buf, csum, sizeof(*csum)); -+ task_offload->task_buf_length = sizeof(*csum); -+ status = mp_set(wnd, OID_TCP_TASK_OFFLOAD, task_offload_header, -+ sizeof(*task_offload_header) + -+ sizeof(*task_offload) + sizeof(*csum)); -+ TRACE1("%08X", status); -+ if (status != NDIS_STATUS_SUCCESS) -+ EXIT2(return); -+ wnd->tx_csum = csum->v4_tx; -+ if (csum->v4_tx.tcp_csum && csum->v4_tx.udp_csum) { -+ if (csum->v4_tx.ip_csum) { -+ wnd->net_dev->features |= NETIF_F_HW_CSUM; -+ TRACE1("hw checksum enabled"); -+ } else { -+ wnd->net_dev->features |= NETIF_F_IP_CSUM; -+ TRACE1("IP checksum enabled"); -+ } -+ if (wnd->sg_dma_size) -+ wnd->net_dev->features |= NETIF_F_SG; -+ } -+ wnd->rx_csum = csum->v4_rx; -+ EXIT1(return); -+} -+ -+static void get_supported_oids(struct ndis_device *wnd) -+{ -+ NDIS_STATUS res; -+ int i, n, needed; -+ ndis_oid *oids; -+ -+ res = mp_query_info(wnd, OID_GEN_SUPPORTED_LIST, NULL, 0, NULL, -+ &needed); -+ if (!(res == NDIS_STATUS_BUFFER_TOO_SHORT || -+ res == NDIS_STATUS_INVALID_LENGTH)) -+ EXIT1(return); -+ oids = kmalloc(needed, GFP_KERNEL); -+ if (!oids) { -+ TRACE1("couldn't allocate memory"); -+ EXIT1(return); -+ } -+ res = mp_query(wnd, OID_GEN_SUPPORTED_LIST, oids, needed); -+ if (res) { -+ TRACE1("failed: %08X", res); -+ kfree(oids); -+ EXIT1(return); -+ } -+ for (i = 0, n = needed / sizeof(*oids); i < n; i++) { -+ TRACE1("oid: %08X", oids[i]); -+ /* if a wireless device didn't say so for -+ * OID_GEN_PHYSICAL_MEDIUM (they should, but in case) */ -+ if (wnd->physical_medium != NdisPhysicalMediumWirelessLan && -+ oids[i] == OID_802_11_SSID) -+ wnd->physical_medium = NdisPhysicalMediumWirelessLan; -+ } -+ kfree(oids); -+ EXIT1(return); -+} -+ -+static void ndis_get_drvinfo(struct net_device *dev, -+ struct ethtool_drvinfo *info) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ strncpy(info->driver, DRIVER_NAME, sizeof(info->driver) - 2); -+ strcat(info->driver, "+"); -+ strncat(info->driver, wnd->wd->driver->name, -+ sizeof(info->driver) - strlen(DRIVER_NAME) - 1); -+ strncpy(info->version, DRIVER_VERSION, sizeof(info->version) - 2); -+ strcat(info->version, "+"); -+ strncat(info->version, wnd->wd->driver->version, -+ sizeof(info->version) - strlen(DRIVER_VERSION) - 1); -+ if (wrap_is_pci_bus(wnd->wd->dev_bus)) -+ strncpy(info->bus_info, pci_name(wnd->wd->pci.pdev), -+ sizeof(info->bus_info) - 1); -+#ifdef ENABLE_USB -+ else -+ usb_make_path(wnd->wd->usb.udev, info->bus_info, -+ sizeof(info->bus_info) - 1); -+#endif -+ return; -+} -+ -+static u32 ndis_get_link(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ return netif_carrier_ok(wnd->net_dev); -+} -+ -+static void ndis_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ wol->supported = 0; -+ wol->wolopts = 0; -+ if (!(wnd->attributes & NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND)) -+ EXIT2(return); -+ if (!wrap_is_pci_bus(wnd->wd->dev_bus)) -+ EXIT2(return); -+ /* we always suspend to D3 */ -+ if (wnd->pnp_capa.wakeup.min_magic_packet_wakeup < NdisDeviceStateD3) -+ return; -+ wol->supported |= WAKE_MAGIC; -+ if (wnd->ndis_wolopts & NDIS_PNP_WAKE_UP_MAGIC_PACKET) -+ wol->wolopts |= WAKE_MAGIC; -+ return; -+} -+ -+static int ndis_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ if (!(wnd->attributes & NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND)) -+ return -EOPNOTSUPP; -+ if (wnd->pnp_capa.wakeup.min_magic_packet_wakeup < NdisDeviceStateD3) -+ EXIT2(return -EOPNOTSUPP); -+ TRACE2("0x%x", wol->wolopts); -+ if (wol->wolopts & WAKE_MAGIC) { -+ wnd->ndis_wolopts |= NDIS_PNP_WAKE_UP_MAGIC_PACKET; -+ if (wol->wolopts != WAKE_MAGIC) -+ WARNING("ignored wake-on-lan options: 0x%x", -+ wol->wolopts & ~WAKE_MAGIC); -+ } else if (!wol->wolopts) -+ wnd->ndis_wolopts = 0; -+ else -+ return -EOPNOTSUPP; -+ TRACE2("0x%x", wnd->ndis_wolopts); -+ return 0; -+} -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) -+static u32 ndis_get_tx_csum(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ if (wnd->tx_csum.tcp_csum && wnd->tx_csum.udp_csum) -+ return 1; -+ else -+ return 0; -+} -+ -+static u32 ndis_get_rx_csum(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ if (wnd->rx_csum.value) -+ return 1; -+ else -+ return 0; -+} -+ -+static int ndis_set_tx_csum(struct net_device *dev, u32 data) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ if (data && (wnd->tx_csum.value == 0)) -+ return -EOPNOTSUPP; -+ -+ if (wnd->tx_csum.ip_csum) -+ ethtool_op_set_tx_hw_csum(dev, data); -+ else -+ ethtool_op_set_tx_csum(dev, data); -+ return 0; -+} -+ -+static int ndis_set_rx_csum(struct net_device *dev, u32 data) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ -+ if (data && (wnd->tx_csum.value == 0)) -+ return -EOPNOTSUPP; -+ -+ /* TODO: enable/disable rx csum through NDIS */ -+ return 0; -+} -+ -+static u32 ndis_get_sg(struct net_device *dev) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ if (wnd->sg_dma_size) -+ return ethtool_op_get_sg(dev); -+ else -+ return 0; -+} -+ -+static int ndis_set_sg(struct net_device *dev, u32 data) -+{ -+ struct ndis_device *wnd = netdev_priv(dev); -+ if (wnd->sg_dma_size) -+ return ethtool_op_set_sg(dev, data); -+ else -+ return -EOPNOTSUPP; -+} -+#endif -+ -+static struct ethtool_ops ndis_ethtool_ops = { -+ .get_drvinfo = ndis_get_drvinfo, -+ .get_link = ndis_get_link, -+ .get_wol = ndis_get_wol, -+ .set_wol = ndis_set_wol, -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) -+ .get_tx_csum = ndis_get_tx_csum, -+ .get_rx_csum = ndis_get_rx_csum, -+ .set_tx_csum = ndis_set_tx_csum, -+ .set_rx_csum = ndis_set_rx_csum, -+ .get_sg = ndis_get_sg, -+ .set_sg = ndis_set_sg, -+#endif -+}; -+ -+static int notifier_event(struct notifier_block *notifier, unsigned long event, -+ void *ptr) -+{ -+ struct net_device *net_dev = netdev_notifier_info_to_dev(ptr); -+ -+ ENTER2("0x%lx", event); -+ if (net_dev->ethtool_ops == &ndis_ethtool_ops -+ && event == NETDEV_CHANGENAME) { -+ struct ndis_device *wnd = netdev_priv(net_dev); -+ -+ /* called with rtnl lock held, so no need to lock */ -+ if (likely(wnd->procfs_iface)) { -+ printk(KERN_INFO "%s: interface renamed to '%s'\n", -+ DRIVER_NAME, net_dev->name); -+ wrap_procfs_remove_ndis_device(wnd); -+ wrap_procfs_add_ndis_device(wnd); -+ } -+ } -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block netdev_notifier = { -+ .notifier_call = notifier_event, -+}; -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) -+static const struct net_device_ops ndis_netdev_ops = { -+ .ndo_init = ndis_net_dev_init, -+ .ndo_uninit = ndis_net_dev_uninit, -+ .ndo_open = ndis_net_dev_open, -+ .ndo_stop = ndis_net_dev_close, -+ .ndo_start_xmit = tx_skbuff, -+ .ndo_change_mtu = ndis_change_mtu, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) -+ .ndo_set_rx_mode = ndis_set_multicast_list, -+#else -+ .ndo_set_multicast_list = ndis_set_multicast_list, -+#endif -+ .ndo_set_mac_address = ndis_set_mac_address, -+ .ndo_get_stats = ndis_get_stats, -+#ifdef CONFIG_NET_POLL_CONTROLLER -+ .ndo_poll_controller = ndis_poll_controller, -+#endif -+}; -+#endif -+ -+static NDIS_STATUS ndis_start_device(struct ndis_device *wnd) -+{ -+ struct wrap_device *wd; -+ struct net_device *net_dev; -+ NDIS_STATUS status; -+ char *buf; -+ const int buf_len = 256; -+ mac_address mac; -+ struct transport_header_offset *tx_header_offset; -+ int n; -+ -+ ENTER2("%d", in_atomic()); -+ status = mp_init(wnd); -+ if (status == NDIS_STATUS_NOT_RECOGNIZED) -+ EXIT1(return NDIS_STATUS_SUCCESS); -+ if (status != NDIS_STATUS_SUCCESS) -+ EXIT1(return status); -+ wd = wnd->wd; -+ net_dev = wnd->net_dev; -+ -+ get_supported_oids(wnd); -+ memset(mac, 0, sizeof(mac)); -+ status = mp_query(wnd, OID_802_3_CURRENT_ADDRESS, mac, sizeof(mac)); -+ if (memcmp(mac, "\x00\x00\x00\x00\x00\x00", sizeof(mac)) == 0) { -+ status = mp_query(wnd, OID_802_3_PERMANENT_ADDRESS, mac, -+ sizeof(mac)); -+ if (status != NDIS_STATUS_SUCCESS) { -+ ERROR("couldn't get mac address: %08X", status); -+ goto err_start; -+ } -+ } -+ TRACE1("mac:" MACSTRSEP, MAC2STR(mac)); -+ memcpy(net_dev->dev_addr, mac, ETH_ALEN); -+ -+ strncpy(net_dev->name, if_name, IFNAMSIZ - 1); -+ net_dev->name[IFNAMSIZ - 1] = 0; -+ -+ wnd->packet_filter = NDIS_PACKET_TYPE_DIRECTED | -+ NDIS_PACKET_TYPE_BROADCAST | NDIS_PACKET_TYPE_MULTICAST; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) -+ net_dev->netdev_ops = &ndis_netdev_ops; -+#else -+ net_dev->init = ndis_net_dev_init; -+ net_dev->uninit = ndis_net_dev_uninit; -+ net_dev->open = ndis_net_dev_open; -+ net_dev->hard_start_xmit = tx_skbuff; -+ net_dev->stop = ndis_net_dev_close; -+ net_dev->get_stats = ndis_get_stats; -+ net_dev->change_mtu = ndis_change_mtu; -+ net_dev->set_multicast_list = ndis_set_multicast_list; -+ net_dev->set_mac_address = ndis_set_mac_address; -+#ifdef CONFIG_NET_POLL_CONTROLLER -+ net_dev->poll_controller = ndis_poll_controller; -+#endif -+#endif -+#ifdef CONFIG_WIRELESS_EXT -+ if (wnd->physical_medium == NdisPhysicalMediumWirelessLan) { -+ net_dev->wireless_handlers = &ndis_handler_def; -+ } -+#endif -+ net_dev->ethtool_ops = &ndis_ethtool_ops; -+ if (wnd->mp_interrupt) -+ net_dev->irq = wnd->mp_interrupt->irq; -+ net_dev->mem_start = wnd->mem_start; -+ net_dev->mem_end = wnd->mem_end; -+ status = mp_query_int(wnd, OID_802_3_MAXIMUM_LIST_SIZE, -+ &wnd->multicast_size); -+ if (status != NDIS_STATUS_SUCCESS || wnd->multicast_size < 0) -+ wnd->multicast_size = 0; -+ if (wnd->multicast_size > 0) -+ net_dev->flags |= IFF_MULTICAST; -+ else -+ net_dev->flags &= ~IFF_MULTICAST; -+ -+ buf = kmalloc(buf_len, GFP_KERNEL); -+ if (!buf) { -+ WARNING("couldn't allocate memory"); -+ goto err_start; -+ } -+ -+ set_task_offload(wnd, buf, buf_len); -+#ifdef NETIF_F_LLTX -+ net_dev->features |= NETIF_F_LLTX; -+#endif -+ -+ if (register_netdev(net_dev)) { -+ ERROR("cannot register net device %s", net_dev->name); -+ goto err_register; -+ } -+ memset(buf, 0, buf_len); -+ status = mp_query(wnd, OID_GEN_VENDOR_DESCRIPTION, buf, buf_len); -+ if (status != NDIS_STATUS_SUCCESS) { -+ WARNING("couldn't get vendor information: 0x%x", status); -+ buf[0] = 0; -+ } -+ wnd->drv_ndis_version = n = 0; -+ mp_query_int(wnd, OID_GEN_DRIVER_VERSION, &wnd->drv_ndis_version); -+ mp_query_int(wnd, OID_GEN_VENDOR_DRIVER_VERSION, &n); -+ -+ printk(KERN_INFO "%s: ethernet device " MACSTRSEP " using %sNDIS " -+ "driver: %s, version: 0x%x, NDIS version: 0x%x, vendor: '%s', " -+ "%s\n", net_dev->name, MAC2STR(net_dev->dev_addr), -+ deserialized_driver(wnd) ? "" : "serialized ", -+ wd->driver->name, n, wnd->drv_ndis_version, buf, -+ wd->conf_file_name); -+ -+ if (deserialized_driver(wnd)) { -+ /* deserialized drivers don't have a limit, but we -+ * keep max at TX_RING_SIZE */ -+ wnd->max_tx_packets = TX_RING_SIZE; -+ } else { -+ status = mp_query_int(wnd, OID_GEN_MAXIMUM_SEND_PACKETS, -+ &wnd->max_tx_packets); -+ if (status != NDIS_STATUS_SUCCESS) -+ wnd->max_tx_packets = 1; -+ if (wnd->max_tx_packets > TX_RING_SIZE) -+ wnd->max_tx_packets = TX_RING_SIZE; -+ } -+ TRACE2("maximum send packets: %d", wnd->max_tx_packets); -+ NdisAllocatePacketPoolEx(&status, &wnd->tx_packet_pool, -+ wnd->max_tx_packets, 0, -+ PROTOCOL_RESERVED_SIZE_IN_PACKET); -+ if (status != NDIS_STATUS_SUCCESS) { -+ ERROR("couldn't allocate packet pool"); -+ goto packet_pool_err; -+ } -+ NdisAllocateBufferPool(&status, &wnd->tx_buffer_pool, -+ wnd->max_tx_packets + 4); -+ if (status != NDIS_STATUS_SUCCESS) { -+ ERROR("couldn't allocate buffer pool"); -+ goto buffer_pool_err; -+ } -+ TRACE1("pool: %p", wnd->tx_buffer_pool); -+ -+ if (mp_query_int(wnd, OID_GEN_MAXIMUM_TOTAL_SIZE, &n) == -+ NDIS_STATUS_SUCCESS && n > ETH_HLEN) -+ ndis_change_mtu(wnd->net_dev, n - ETH_HLEN); -+ -+ if (mp_query_int(wnd, OID_GEN_MAC_OPTIONS, &n) == NDIS_STATUS_SUCCESS) -+ TRACE2("mac options supported: 0x%x", n); -+ -+ tx_header_offset = (typeof(tx_header_offset))buf; -+ tx_header_offset->protocol_type = NDIS_PROTOCOL_ID_TCP_IP; -+ tx_header_offset->header_offset = sizeof(ETH_HLEN); -+ status = mp_set(wnd, OID_GEN_TRANSPORT_HEADER_OFFSET, -+ tx_header_offset, sizeof(*tx_header_offset)); -+ TRACE2("%08X", status); -+ -+ status = mp_query_int(wnd, OID_GEN_PHYSICAL_MEDIUM, -+ &wnd->physical_medium); -+ if (status != NDIS_STATUS_SUCCESS) -+ wnd->physical_medium = NdisPhysicalMediumUnspecified; -+ -+#ifdef CONFIG_WIRELESS_EXT -+ if (wnd->physical_medium == NdisPhysicalMediumWirelessLan) { -+ mp_set_int(wnd, OID_802_11_POWER_MODE, NDIS_POWER_OFF); -+ get_encryption_capa(wnd, buf, buf_len); -+ TRACE1("capabilities = %ld", wnd->capa.encr); -+ printk(KERN_INFO "%s: encryption modes supported: " -+ "%s%s%s%s%s%s%s\n", net_dev->name, -+ test_bit(Ndis802_11Encryption1Enabled, &wnd->capa.encr) ? -+ "WEP" : "none", -+ -+ test_bit(Ndis802_11Encryption2Enabled, &wnd->capa.encr) ? -+ "; TKIP with WPA" : "", -+ test_bit(Ndis802_11AuthModeWPA2, &wnd->capa.auth) ? -+ ", WPA2" : "", -+ test_bit(Ndis802_11AuthModeWPA2PSK, &wnd->capa.auth) ? -+ ", WPA2-PSK" : "", -+ -+ test_bit(Ndis802_11Encryption3Enabled, &wnd->capa.encr) ? -+ "; AES/CCMP with WPA" : "", -+ test_bit(Ndis802_11AuthModeWPA2, &wnd->capa.auth) ? -+ ", WPA2" : "", -+ test_bit(Ndis802_11AuthModeWPA2PSK, &wnd->capa.auth) ? -+ ", WPA2-PSK" : ""); -+ -+ set_default_iw_params(wnd); -+ } -+#endif -+ kfree(buf); -+ hangcheck_add(wnd); -+ add_iw_stats_timer(wnd); -+ EXIT1(return NDIS_STATUS_SUCCESS); -+ -+buffer_pool_err: -+ wnd->tx_buffer_pool = NULL; -+ if (wnd->tx_packet_pool) { -+ NdisFreePacketPool(wnd->tx_packet_pool); -+ wnd->tx_packet_pool = NULL; -+ } -+packet_pool_err: -+ unregister_netdev(net_dev); -+ wnd->max_tx_packets = 0; -+err_register: -+ kfree(buf); -+err_start: -+ mp_halt(wnd); -+ EXIT1(return NDIS_STATUS_FAILURE); -+} -+ -+static int ndis_remove_device(struct ndis_device *wnd) -+{ -+ s8 tx_pending; -+ int our_mutex; -+ -+ /* prevent setting essid during disassociation */ -+ memset(&wnd->essid, 0, sizeof(wnd->essid)); -+ wnd->tx_ok = 0; -+ netif_carrier_off(wnd->net_dev); -+ if (wnd->max_tx_packets) -+ unregister_netdev(wnd->net_dev); -+ /* if device is suspended, but resume failed, tx_ring_mutex -+ * may already be locked */ -+ our_mutex = mutex_trylock(&wnd->tx_ring_mutex); -+ if (!our_mutex) -+ WARNING("couldn't obtain tx_ring_mutex"); -+ spin_lock_bh(&wnd->tx_ring_lock); -+ tx_pending = wnd->tx_ring_end - wnd->tx_ring_start; -+ if (tx_pending < 0) -+ tx_pending += TX_RING_SIZE; -+ else if (tx_pending == 0 && wnd->is_tx_ring_full) -+ tx_pending = TX_RING_SIZE - 1; -+ wnd->is_tx_ring_full = 0; -+ /* throw away pending packets */ -+ while (tx_pending-- > 0) { -+ struct ndis_packet *packet; -+ -+ packet = wnd->tx_ring[wnd->tx_ring_start]; -+ free_tx_packet(wnd, packet, NDIS_STATUS_CLOSING); -+ wnd->tx_ring_start = (wnd->tx_ring_start + 1) % TX_RING_SIZE; -+ } -+ spin_unlock_bh(&wnd->tx_ring_lock); -+ if (our_mutex) -+ mutex_unlock(&wnd->tx_ring_mutex); -+ mp_halt(wnd); -+ ndis_exit_device(wnd); -+ -+ if (wnd->tx_packet_pool) { -+ NdisFreePacketPool(wnd->tx_packet_pool); -+ wnd->tx_packet_pool = NULL; -+ } -+ if (wnd->tx_buffer_pool) { -+ NdisFreeBufferPool(wnd->tx_buffer_pool); -+ wnd->tx_buffer_pool = NULL; -+ } -+ kfree(wnd->pmkids); -+ printk(KERN_INFO "%s: device %s removed\n", DRIVER_NAME, -+ wnd->net_dev->name); -+ kfree(wnd->nmb); -+ free_netdev(wnd->net_dev); -+ EXIT2(return 0); -+} -+ -+static NTSTATUS ndis_add_device(struct driver_object *drv_obj, -+ struct device_object *pdo) -+{ -+ struct device_object *fdo; -+ struct ndis_mp_block *nmb; -+ NTSTATUS status; -+ struct ndis_device *wnd; -+ struct net_device *net_dev; -+ struct wrap_device *wd; -+ unsigned long i; -+ -+ ENTER2("%p, %p", drv_obj, pdo); -+ if (strlen(if_name) >= IFNAMSIZ) { -+ ERROR("interface name '%s' is too long", if_name); -+ return STATUS_INVALID_PARAMETER; -+ } -+ net_dev = alloc_etherdev(sizeof(*wnd)); -+ if (!net_dev) { -+ ERROR("couldn't allocate device"); -+ return STATUS_RESOURCES; -+ } -+ wd = pdo->reserved; -+ if (wrap_is_pci_bus(wd->dev_bus)) -+ SET_NETDEV_DEV(net_dev, &wd->pci.pdev->dev); -+ if (wrap_is_usb_bus(wd->dev_bus)) -+ SET_NETDEV_DEV(net_dev, &wd->usb.intf->dev); -+ status = IoCreateDevice(drv_obj, 0, NULL, FILE_DEVICE_UNKNOWN, 0, -+ FALSE, &fdo); -+ if (status != STATUS_SUCCESS) { -+ free_netdev(net_dev); -+ EXIT2(return status); -+ } -+ wnd = netdev_priv(net_dev); -+ TRACE1("wnd: %p", wnd); -+ -+ nmb = kmalloc(sizeof(*nmb), GFP_KERNEL); -+ if (!nmb) { -+ WARNING("couldn't allocate memory"); -+ IoDeleteDevice(fdo); -+ free_netdev(net_dev); -+ return STATUS_RESOURCES; -+ } -+#if DEBUG >= 6 -+ /* poison nmb so if a driver accesses uninitialized pointers, we -+ * know what it is */ -+ for (i = 0; i < sizeof(*nmb) / sizeof(unsigned long); i++) -+ ((unsigned long *)nmb)[i] = i + 0x8a3fc1; -+#endif -+ -+ wnd->nmb = nmb; -+ nmb->wnd = wnd; -+ nmb->pdo = pdo; -+ wnd->wd = wd; -+ wnd->net_dev = net_dev; -+ fdo->reserved = wnd; -+ nmb->fdo = fdo; -+ if (ndis_init_device(wnd)) { -+ IoDeleteDevice(fdo); -+ kfree(nmb); -+ free_netdev(net_dev); -+ EXIT1(return STATUS_RESOURCES); -+ } -+ nmb->next_device = IoAttachDeviceToDeviceStack(fdo, pdo); -+ spin_lock_init(&wnd->tx_ring_lock); -+ mutex_init(&wnd->tx_ring_mutex); -+ mutex_init(&wnd->ndis_req_mutex); -+ wnd->ndis_req_done = 0; -+ INIT_WORK(&wnd->tx_work, tx_worker); -+ wnd->tx_ring_start = 0; -+ wnd->tx_ring_end = 0; -+ wnd->is_tx_ring_full = 0; -+ wnd->capa.encr = 0; -+ wnd->capa.auth = 0; -+ wnd->attributes = 0; -+ wnd->dma_map_count = 0; -+ wnd->dma_map_addr = NULL; -+ wnd->nick[0] = 0; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) -+ timer_setup(&wnd->hangcheck_timer, hangcheck_proc, 0); -+ timer_setup(&wnd->iw_stats_timer, hangcheck_proc, 0); -+#else -+ init_timer(&wnd->hangcheck_timer); -+ init_timer(&wnd->iw_stats_timer); -+#endif -+ wnd->scan_timestamp = 0; -+ wnd->iw_stats_interval = 10 * HZ; -+ wnd->ndis_pending_work = 0; -+ memset(&wnd->essid, 0, sizeof(wnd->essid)); -+ memset(&wnd->encr_info, 0, sizeof(wnd->encr_info)); -+ wnd->infrastructure_mode = Ndis802_11Infrastructure; -+ INIT_WORK(&wnd->ndis_work, wrapndis_worker); -+ wnd->iw_stats_enabled = TRUE; -+ -+ TRACE1("nmb: %p, pdo: %p, fdo: %p, attached: %p, next: %p", -+ nmb, pdo, fdo, fdo->attached, nmb->next_device); -+ -+ /* dispatch routines are called as Windows functions */ -+ for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) -+ drv_obj->major_func[i] = WIN_FUNC_PTR(IoPassIrpDown,2); -+ -+ drv_obj->major_func[IRP_MJ_PNP] = WIN_FUNC_PTR(NdisDispatchPnp,2); -+ drv_obj->major_func[IRP_MJ_POWER] = WIN_FUNC_PTR(NdisDispatchPower,2); -+ drv_obj->major_func[IRP_MJ_INTERNAL_DEVICE_CONTROL] = -+ WIN_FUNC_PTR(NdisDispatchDeviceControl,2); -+// drv_obj->major_func[IRP_MJ_DEVICE_CONTROL] = -+// WIN_FUNC_PTR(NdisDispatchDeviceControl,2); -+ EXIT2(return STATUS_SUCCESS); -+} -+ -+int init_ndis_driver(struct driver_object *drv_obj) -+{ -+ ENTER1("%p", drv_obj); -+ drv_obj->drv_ext->add_device = ndis_add_device; -+ return 0; -+} -+ -+int wrapndis_init(void) -+{ -+ wrapndis_wq = create_singlethread_workqueue("wrapndis_wq"); -+ if (!wrapndis_wq) -+ EXIT1(return -ENOMEM); -+ TRACE1("wrapndis_wq: %p", wrapndis_wq); -+ register_netdevice_notifier(&netdev_notifier); -+ return 0; -+} -+ -+void wrapndis_exit(void) -+{ -+ unregister_netdevice_notifier(&netdev_notifier); -+ if (wrapndis_wq) -+ destroy_workqueue(wrapndis_wq); -+} -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapndis.h linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapndis.h ---- linux-5.6.11/3rdparty/ndiswrapper/wrapndis.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapndis.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,86 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _WRAPNDIS_H_ -+#define _WRAPNDIS_H_ -+ -+#include "ndis.h" -+#include "pnp.h" -+ -+int wrapndis_init(void); -+void wrapndis_exit(void); -+ -+NDIS_STATUS mp_reset(struct ndis_device *wnd); -+ -+NDIS_STATUS mp_request(enum ndis_request_type request, -+ struct ndis_device *wnd, ndis_oid oid, -+ void *buf, ULONG buflen, ULONG *written, ULONG *needed); -+ -+static inline NDIS_STATUS mp_query_info(struct ndis_device *wnd, -+ ndis_oid oid, void *buf, ULONG buflen, -+ ULONG *written, ULONG *needed) -+{ -+ return mp_request(NdisRequestQueryInformation, wnd, oid, -+ buf, buflen, written, needed); -+} -+ -+static inline NDIS_STATUS mp_set_info(struct ndis_device *wnd, -+ ndis_oid oid, void *buf, ULONG buflen, -+ ULONG *written, ULONG *needed) -+{ -+ return mp_request(NdisRequestSetInformation, wnd, oid, -+ buf, buflen, written, needed); -+} -+ -+static inline NDIS_STATUS mp_query(struct ndis_device *wnd, ndis_oid oid, -+ void *buf, ULONG buflen) -+{ -+ return mp_request(NdisRequestQueryInformation, wnd, oid, -+ buf, buflen, NULL, NULL); -+} -+ -+static inline NDIS_STATUS mp_query_int(struct ndis_device *wnd, -+ ndis_oid oid, ULONG *data) -+{ -+ return mp_request(NdisRequestQueryInformation, wnd, oid, -+ data, sizeof(ULONG), NULL, NULL); -+} -+ -+static inline NDIS_STATUS mp_set(struct ndis_device *wnd, ndis_oid oid, -+ void *buf, ULONG buflen) -+{ -+ return mp_request(NdisRequestSetInformation, wnd, oid, -+ buf, buflen, NULL, NULL); -+} -+ -+static inline NDIS_STATUS mp_set_int(struct ndis_device *wnd, -+ ndis_oid oid, ULONG data) -+{ -+ return mp_request(NdisRequestSetInformation, wnd, oid, -+ &data, sizeof(ULONG), NULL, NULL); -+} -+ -+void free_tx_packet(struct ndis_device *wnd, struct ndis_packet *packet, -+ NDIS_STATUS status); -+int init_ndis_driver(struct driver_object *drv_obj); -+NDIS_STATUS ndis_reinit(struct ndis_device *wnd); -+void set_media_state(struct ndis_device *wnd, enum ndis_media_state state); -+ -+void hangcheck_add(struct ndis_device *wnd); -+void hangcheck_del(struct ndis_device *wnd); -+ -+struct iw_statistics *get_iw_stats(struct net_device *dev); -+ -+#endif -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapper.c linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapper.c ---- linux-5.6.11/3rdparty/ndiswrapper/wrapper.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapper.c 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,111 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include "ndis.h" -+#include "iw_ndis.h" -+#include "loader.h" -+#include "pnp.h" -+#include "wrapper.h" -+ -+char *if_name = "wlan%d"; -+int proc_uid, proc_gid; -+int hangcheck_interval; -+static char *utils_version = UTILS_VERSION; -+int debug = DEBUG; -+ -+module_param(if_name, charp, 0400); -+MODULE_PARM_DESC(if_name, "Network interface name or template " -+ "(default: wlan%d)"); -+module_param(proc_uid, int, 0600); -+MODULE_PARM_DESC(proc_uid, "The uid of the files created in /proc " -+ "(default: 0)."); -+module_param(proc_gid, int, 0600); -+MODULE_PARM_DESC(proc_gid, "The gid of the files created in /proc " -+ "(default: 0)."); -+module_param(debug, int, 0600); -+MODULE_PARM_DESC(debug, "debug level"); -+ -+/* 0 - default value provided by NDIS driver, -+ * positive value - force hangcheck interval to that many seconds -+ * negative value - disable hangcheck -+ */ -+module_param(hangcheck_interval, int, 0600); -+MODULE_PARM_DESC(hangcheck_interval, "The interval, in seconds, for checking" -+ " if driver is hung. (default: 0)"); -+ -+module_param(utils_version, charp, 0400); -+MODULE_PARM_DESC(utils_version, "Compatible version of utils " -+ "(read only: " UTILS_VERSION ")"); -+ -+MODULE_AUTHOR("ndiswrapper team "); -+#ifdef MODULE_DESCRIPTION -+MODULE_DESCRIPTION("NDIS wrapper driver"); -+#endif -+#ifdef MODULE_VERSION -+MODULE_VERSION(DRIVER_VERSION); -+#endif -+MODULE_LICENSE("GPL"); -+ -+static void module_cleanup(void) -+{ -+ loader_exit(); -+ usb_exit(); -+ wrap_procfs_remove(); -+ wrapndis_exit(); -+ ndis_exit(); -+ ntoskernel_exit(); -+ wrapmem_exit(); -+} -+ -+static int __init wrapper_init(void) -+{ -+#ifdef TAINT_OOT_MODULE -+ add_taint(TAINT_OOT_MODULE, LOCKDEP_NOW_UNRELIABLE); -+#endif -+ printk(KERN_INFO "%s version %s loaded (smp=%s, preempt=%s)\n", -+ DRIVER_NAME, DRIVER_VERSION, -+#ifdef CONFIG_SMP -+ "yes" -+#else -+ "no" -+#endif -+ , -+#ifdef CONFIG_PREEMPT_RT -+ "rt" -+#elif defined(CONFIG_PREEMPT) -+ "yes" -+#else -+ "no" -+#endif -+ ); -+ -+ if (wrapmem_init() || ntoskernel_init() || ndis_init() || -+ wrapndis_init() || usb_init() || wrap_procfs_init() || -+ loader_init()) { -+ module_cleanup(); -+ ERROR("%s: initialization failed", DRIVER_NAME); -+ return -EINVAL; -+ } -+ EXIT1(return 0); -+} -+ -+static void __exit wrapper_exit(void) -+{ -+ ENTER1(""); -+ module_cleanup(); -+} -+ -+module_init(wrapper_init); -+module_exit(wrapper_exit); -diff -Nurp linux-5.6.11/3rdparty/ndiswrapper/wrapper.h linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapper.h ---- linux-5.6.11/3rdparty/ndiswrapper/wrapper.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.6.11-ndis/3rdparty/ndiswrapper/wrapper.h 2020-05-03 15:18:33.000000000 +0300 -@@ -0,0 +1,24 @@ -+/* -+ * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef WRAPPER_H -+#define WRAPPER_H -+ -+extern char *if_name; -+extern int proc_uid; -+extern int proc_gid; -+extern int hangcheck_interval; -+ -+#endif /* WRAPPER_H */ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Kconfig.patch b/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Kconfig.patch deleted file mode 100644 index f7d26e620b..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Kconfig.patch +++ /dev/null @@ -1,7 +0,0 @@ ---- linux-2.6.24.orig/3rdparty/ndiswrapper/Kconfig 1969-12-31 21:00:00.000000000 -0300 -+++ linux-2.6.24/3rdparty/ndiswrapper/Kconfig 2007-11-26 15:11:31.000000000 -0200 -@@ -0,0 +1,4 @@ -+ -+config NDISWRAPPER -+ tristate "NDIS driver wrapper support" -+ depends on PCI && USB && !X86_64_XEN diff --git a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Makefile-build-fix.patch b/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Makefile-build-fix.patch deleted file mode 100644 index b44f4b2938..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-ndiswrapper-Makefile-build-fix.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- linux-3.12.2-ndiswrapper-1.59/3rdparty/ndiswrapper/Makefile.orig 2013-11-28 21:42:10.000000000 +0200 -+++ linux-3.12.2-ndiswrapper-1.59/3rdparty/ndiswrapper/Makefile 2013-11-30 21:41:19.550504380 +0200 -@@ -9,24 +9,10 @@ DISTFILES = \ - winnt_types.h workqueue.c wrapmem.c wrapmem.h wrapndis.c wrapndis.h \ - wrapper.c wrapper.h - --# By default, we try to compile the modules for the currently running --# kernel. But it's the first approximation, as we will re-read the --# version from the kernel sources. --KVERS_UNAME ?= $(shell uname -r) -- - # KBUILD is the path to the Linux kernel build tree. It is usually the - # same as the kernel source tree, except when the kernel was compiled in - # a separate directory. --KBUILD ?= $(shell readlink -f /lib/modules/$(KVERS_UNAME)/build) -- --ifeq (,$(KBUILD)) --$(error Kernel build tree not found - please set KBUILD to configured kernel) --endif -- --KCONFIG := $(KBUILD)/.config --ifeq (,$(wildcard $(KCONFIG))) --$(error No .config found in $(KBUILD), please set KBUILD to configured kernel) --endif -+KBUILD ?= $(srctree) - - ifneq (,$(wildcard $(KBUILD)/include/linux/version.h)) - ifneq (,$(wildcard $(KBUILD)/include/generated/uapi/linux/version.h)) -@@ -43,16 +29,9 @@ endif - ifeq (,$(wildcard $(VERSION_H))) - VERSION_H := $(KBUILD)/include/linux/version.h - endif --ifeq (,$(wildcard $(VERSION_H))) --$(error Please run 'make modules_prepare' in $(KBUILD)) --endif - - KVERS := $(shell sed -ne 's/"//g;s/^\#define UTS_RELEASE //p' $(VERSION_H)) - --ifeq (,$(KVERS)) --$(error Cannot find UTS_RELEASE in $(VERSION_H), please report) --endif -- - INST_DIR = /lib/modules/$(KVERS)/misc - - SRC_DIR=$(shell pwd) diff --git a/kernel/tools/perf/files/patches/mageia/3rd-niswrapper-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/3rd-niswrapper-Kconfig-Makefile.patch deleted file mode 100644 index a8c40d16f9..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-niswrapper-Kconfig-Makefile.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- linux/3rdparty/Kconfig.orig 2019-05-31 23:02:53.380127780 +0300 -+++ linux/3rdparty/Kconfig 2019-05-31 23:26:48.844304457 +0300 -@@ -2,4 +2,6 @@ - - menu "External 3rdparty kernel additions" - -+source "3rdparty/ndiswrapper/Kconfig" -+ - endmenu ---- linux/3rdparty/Makefile.orig 2019-05-31 23:03:58.338529850 +0300 -+++ linux/3rdparty/Makefile 2019-05-31 23:27:35.405319287 +0300 -@@ -1,3 +1,4 @@ - # - - obj- := 3rdparty.o # Dummy rule to force built-in.o to be made -+obj-$(CONFIG_NDISWRAPPER) += ndiswrapper/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8223de-kernel-5.6.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8223de-kernel-5.6.patch deleted file mode 100644 index e79e34d64d..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8223de-kernel-5.6.patch +++ /dev/null @@ -1,244 +0,0 @@ -diff -urp linux-5.6.3/3rdparty/rtl8723de.orig/os_dep/linux/rtw_proc.c linux-5.6.3/3rdparty/rtl8723de/os_dep/linux/rtw_proc.c ---- linux-5.6.3/3rdparty/rtl8723de.orig/os_dep/linux/rtw_proc.c 2020-04-10 17:12:12.495541693 +0300 -+++ linux-5.6.3/3rdparty/rtl8723de/os_dep/linux/rtw_proc.c 2020-04-10 17:22:51.328340275 +0300 -@@ -68,12 +68,19 @@ inline struct proc_dir_entry *rtw_proc_c - return entry; - } - -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent, -+ const struct proc_ops *pops, void * data) -+#else - inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent, - const struct file_operations *fops, void * data) -+#endif - { - struct proc_dir_entry *entry; - --#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)) -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+ entry = proc_create_data(name, S_IFREG | S_IRUGO | S_IWUGO, parent, pops, data); -+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)) - entry = proc_create_data(name, S_IFREG | S_IRUGO | S_IWUGO, parent, fops, data); - #else - entry = create_proc_entry(name, S_IFREG | S_IRUGO | S_IWUGO, parent); -@@ -219,7 +226,24 @@ static ssize_t rtw_drv_proc_write(struct - return -EROFS; - } - --static const struct file_operations rtw_drv_proc_seq_fops = { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+static const struct proc_ops rtw_drv_proc_seq_ops = { -+ .proc_open = rtw_drv_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = seq_release, -+ .proc_write = rtw_drv_proc_write, -+}; -+ -+static const struct proc_ops rtw_drv_proc_sseq_ops = { -+ .proc_open = rtw_drv_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = single_release, -+ .proc_write = rtw_drv_proc_write, -+}; -+#else -+static const struct file_operations rtw_drv_proc_seq_ops = { - .owner = THIS_MODULE, - .open = rtw_drv_proc_open, - .read = seq_read, -@@ -228,7 +252,7 @@ static const struct file_operations rtw_ - .write = rtw_drv_proc_write, - }; - --static const struct file_operations rtw_drv_proc_sseq_fops = { -+static const struct file_operations rtw_drv_proc_sseq_ops = { - .owner = THIS_MODULE, - .open = rtw_drv_proc_open, - .read = seq_read, -@@ -236,6 +260,7 @@ static const struct file_operations rtw_ - .release = single_release, - .write = rtw_drv_proc_write, - }; -+#endif - - int rtw_drv_proc_init(void) - { -@@ -257,9 +282,9 @@ int rtw_drv_proc_init(void) - - for (i = 0; i < drv_proc_hdls_num; i++) { - if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ) -- entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_seq_fops, (void *)i); -+ entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_seq_ops, (void *)i); - else if (drv_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ) -- entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_sseq_fops, (void *)i); -+ entry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_sseq_ops, (void *)i); - else - entry = NULL; - -@@ -2335,7 +2360,24 @@ static ssize_t rtw_adapter_proc_write(st - return -EROFS; - } - --static const struct file_operations rtw_adapter_proc_seq_fops = { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+static const struct proc_ops rtw_adapter_proc_seq_ops = { -+ .proc_open = rtw_adapter_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = seq_release, -+ .proc_write = rtw_adapter_proc_write, -+}; -+ -+static const struct proc_ops rtw_adapter_proc_sseq_ops = { -+ .proc_open = rtw_adapter_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = single_release, -+ .proc_write = rtw_adapter_proc_write, -+}; -+#else -+static const struct file_operations rtw_adapter_proc_seq_ops = { - .owner = THIS_MODULE, - .open = rtw_adapter_proc_open, - .read = seq_read, -@@ -2344,7 +2386,7 @@ static const struct file_operations rtw_ - .write = rtw_adapter_proc_write, - }; - --static const struct file_operations rtw_adapter_proc_sseq_fops = { -+static const struct file_operations rtw_adapter_proc_sseq_ops = { - .owner = THIS_MODULE, - .open = rtw_adapter_proc_open, - .read = seq_read, -@@ -2352,6 +2394,7 @@ static const struct file_operations rtw_ - .release = single_release, - .write = rtw_adapter_proc_write, - }; -+#endif - - int proc_get_odm_dbg_comp(struct seq_file *m, void *v) - { -@@ -2670,7 +2713,24 @@ static ssize_t rtw_odm_proc_write(struct - return -EROFS; - } - --static const struct file_operations rtw_odm_proc_seq_fops = { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+static const struct proc_ops rtw_odm_proc_seq_ops = { -+ .proc_open = rtw_odm_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = seq_release, -+ .proc_write = rtw_odm_proc_write, -+}; -+ -+static const struct proc_ops rtw_odm_proc_sseq_ops = { -+ .proc_open = rtw_odm_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = single_release, -+ .proc_write = rtw_odm_proc_write, -+}; -+#else -+static const struct file_operations rtw_odm_proc_seq_ops = { - .owner = THIS_MODULE, - .open = rtw_odm_proc_open, - .read = seq_read, -@@ -2679,7 +2739,7 @@ static const struct file_operations rtw_ - .write = rtw_odm_proc_write, - }; - --static const struct file_operations rtw_odm_proc_sseq_fops = { -+static const struct file_operations rtw_odm_proc_sseq_ops = { - .owner = THIS_MODULE, - .open = rtw_odm_proc_open, - .read = seq_read, -@@ -2687,6 +2747,7 @@ static const struct file_operations rtw_ - .release = single_release, - .write = rtw_odm_proc_write, - }; -+#endif - - struct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev) - { -@@ -2715,9 +2776,9 @@ struct proc_dir_entry *rtw_odm_proc_init - - for (i = 0; i < odm_proc_hdls_num; i++) { - if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ) -- entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_seq_fops, (void *)i); -+ entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_seq_ops, (void *)i); - else if (odm_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ) -- entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_sseq_fops, (void *)i); -+ entry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_sseq_ops, (void *)i); - else - entry = NULL; - -@@ -2809,7 +2870,24 @@ static ssize_t rtw_mcc_proc_write(struct - return -EROFS; - } - --static const struct file_operations rtw_mcc_proc_seq_fops = { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) -+static const struct proc_ops rtw_mcc_proc_seq_ops = { -+ .proc_open = rtw_mcc_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = seq_release, -+ .proc_write = rtw_mcc_proc_write, -+}; -+ -+static const struct file_operations rtw_mcc_proc_sseq_ops = { -+ .proc_open = rtw_mcc_proc_open, -+ .proc_read = seq_read, -+ .proc_lseek = seq_lseek, -+ .proc_release = single_release, -+ .proc_write = rtw_mcc_proc_write, -+}; -+#else -+static const struct file_operations rtw_mcc_proc_seq_ops = { - .owner = THIS_MODULE, - .open = rtw_mcc_proc_open, - .read = seq_read, -@@ -2818,7 +2896,7 @@ static const struct file_operations rtw_ - .write = rtw_mcc_proc_write, - }; - --static const struct file_operations rtw_mcc_proc_sseq_fops = { -+static const struct file_operations rtw_mcc_proc_sseq_ops = { - .owner = THIS_MODULE, - .open = rtw_mcc_proc_open, - .read = seq_read, -@@ -2826,6 +2904,7 @@ static const struct file_operations rtw_ - .release = single_release, - .write = rtw_mcc_proc_write, - }; -+#endif - - struct proc_dir_entry *rtw_mcc_proc_init(struct net_device *dev) - { -@@ -2854,9 +2933,9 @@ struct proc_dir_entry *rtw_mcc_proc_init - - for (i = 0; i < mcc_proc_hdls_num; i++) { - if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ) -- entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_seq_fops, (void *)i); -+ entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_seq_ops, (void *)i); - else if (mcc_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ) -- entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_sseq_fops, (void *)i); -+ entry = rtw_proc_create_entry(mcc_proc_hdls[i].name, dir_mcc, &rtw_mcc_proc_sseq_ops, (void *)i); - else - entry = NULL; - -@@ -2920,9 +2999,9 @@ struct proc_dir_entry *rtw_adapter_proc_ - - for (i = 0; i < adapter_proc_hdls_num; i++) { - if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SEQ) -- entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_seq_fops, (void *)i); -+ entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_seq_ops, (void *)i); - else if (adapter_proc_hdls[i].type == RTW_PROC_HDL_TYPE_SSEQ) -- entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_sseq_fops, (void *)i); -+ entry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_sseq_ops, (void *)i); - else - entry = NULL; - diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-Kconfig-Makefile.patch deleted file mode 100644 index 8aa95703b1..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-Kconfig-Makefile.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- linux/3rdparty/Kconfig.orig 2019-05-31 23:30:41.568375751 +0300 -+++ linux/3rdparty/Kconfig 2019-05-31 23:33:39.796256889 +0300 -@@ -4,5 +4,6 @@ menu "External 3rdparty kernel additions" - - source "3rdparty/ndiswrapper/Kconfig" - source "3rdparty/rtl8812au/Kconfig" -+source "3rdparty/rtl8723de/Kconfig" - - endmenu ---- linux/3rdparty/Makefile.orig 2019-05-31 23:33:17.610773901 +0300 -+++ linux/3rdparty/Makefile 2019-05-31 23:33:57.608644657 +0300 -@@ -3,3 +3,4 @@ - obj- := 3rdparty.o # Dummy rule to force built-in.o to be made - obj-$(CONFIG_NDISWRAPPER) += ndiswrapper/ - obj-$(CONFIG_RTL8812AU) += rtl8812au/ -+obj-$(CONFIG_RTL8723DE) += rtl8723de/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-add-kernel-5.8-support.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-add-kernel-5.8-support.patch deleted file mode 100644 index 6786d4bd49..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-add-kernel-5.8-support.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- linux-5.8/3rdparty/rtl8723de/core/rtw_security.c -+++ linux-5.8/3rdparty/rtl8723de/core/rtw_security.c -@@ -33,6 +33,14 @@ static const char *_security_type_str[] = { - "BIP", - }; - -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+struct sha256_state { -+ u64 length; -+ u32 state[8], curlen; -+ u8 buf[64]; -+}; -+#endif -+ - const char *security_type_str(u8 value) - { - #ifdef CONFIG_IEEE80211W ---- linux-5.8/3rdparty/rtl8723de/include/rtw_security.h -+++ linux-5.8/3rdparty/rtl8723de/include/rtw_security.h -@@ -246,11 +246,13 @@ struct security_priv { - #endif /* DBG_SW_SEC_CNT */ - }; - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)) - struct sha256_state { - u64 length; - u32 state[8], curlen; - u8 buf[64]; - }; -+#endif - - #define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ - do {\ ---- linux-5.8/3rdparty/rtl8723de/os_dep/linux/ioctl_cfg80211.c -+++ linux-5.8/3rdparty/rtl8723de/os_dep/linux/ioctl_cfg80211.c -@@ -5857,10 +5857,18 @@ static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, - #else - struct net_device *ndev, - #endif -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ struct mgmt_frame_regs *upd) -+#else - u16 frame_type, bool reg) -+#endif - { - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - struct net_device *ndev = wdev_to_ndev(wdev); -+#endif -+/* hardcoded always true, to make it pass compilation */ -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ bool reg = true; - #endif - _adapter *adapter; - -@@ -5880,7 +5888,11 @@ static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, - /* Wait QC Verify */ - return; - -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ switch (upd->interface_stypes) { -+#else - switch (frame_type) { -+#endif - case IEEE80211_STYPE_PROBE_REQ: /* 0x0040 */ - SET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_PROBE_REQ, reg); - break; -@@ -6846,7 +6858,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = { - - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) - .mgmt_tx = cfg80211_rtw_mgmt_tx, -- .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ .update_mgmt_frame_registrations = cfg80211_rtw_mgmt_frame_register, -+#else -+ .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -+#endif - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) - .action = cfg80211_rtw_mgmt_tx, - #endif diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-fix-redefine.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-fix-redefine.patch deleted file mode 100644 index 5b80ce8bd4..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-fix-redefine.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- linux/3rdparty/rtl8723de/include/wifi.h.orig 2019-01-19 16:29:26.302342688 +0200 -+++ linux/3rdparty/rtl8723de/include/wifi.h 2019-01-19 16:32:25.543905828 +0200 -@@ -1003,8 +1003,9 @@ typedef enum _HT_CAP_AMPDU_DENSITY { - * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) - */ - #define IEEE80211_MIN_AMPDU_BUF 0x8 -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)) - #define IEEE80211_MAX_AMPDU_BUF 0x40 -- -+#endif - - /* Spatial Multiplexing Power Save Modes */ - #define WLAN_HT_CAP_SM_PS_STATIC 0 diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-nodebug.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-nodebug.patch deleted file mode 100644 index 2f543ee4bc..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8723de-nodebug.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./3rdparty/rtl8723de/Makefile.orig 2019-10-08 13:51:56.729205790 +0300 -+++ ./3rdparty/rtl8723de/Makefile 2019-10-08 14:03:32.894164296 +0300 -@@ -74,7 +74,7 @@ CONFIG_APPEND_VENDOR_IE_ENABLE = n - CONFIG_RTW_NAPI = y - CONFIG_RTW_GRO = y - ########################## Debug ########################### --CONFIG_RTW_DEBUG = y -+CONFIG_RTW_DEBUG = n - # default log level is _DRV_INFO_ = 4, - # please refer to "How_to_set_driver_debug_log_level.doc" to set the available level. - CONFIG_RTW_LOG_LEVEL = 4 diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-Kconfig-Makefile.patch deleted file mode 100644 index 697c6958ca..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-Kconfig-Makefile.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- linux/3rdparty/Kconfig.orig 2019-05-31 23:26:48.844304457 +0300 -+++ linux/3rdparty/Kconfig 2019-05-31 23:30:41.568375751 +0300 -@@ -3,5 +3,6 @@ - menu "External 3rdparty kernel additions" - - source "3rdparty/ndiswrapper/Kconfig" -+source "3rdparty/rtl8812au/Kconfig" - - endmenu ---- linux/3rdparty/Makefile.orig 2019-05-31 23:27:35.405319287 +0300 -+++ linux/3rdparty/Makefile 2019-05-31 23:30:56.855708733 +0300 -@@ -2,3 +2,4 @@ - - obj- := 3rdparty.o # Dummy rule to force built-in.o to be made - obj-$(CONFIG_NDISWRAPPER) += ndiswrapper/ -+obj-$(CONFIG_RTL8812AU) += rtl8812au/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.10.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.10.patch deleted file mode 100644 index da51233889..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.10.patch +++ /dev/null @@ -1,281 +0,0 @@ -From ee9619ba0c8840db6d59d11989c31e24a8f0d806 Mon Sep 17 00:00:00 2001 -From: Carlos -Date: Sun, 8 Nov 2020 12:25:43 +0000 -Subject: [PATCH] Fix kernel 5.10-rc1 - ---- - 3rdparty/rtl8812au/core/rtw_btcoex.c | 7 ++++++- - 3rdparty/rtl8812au/core/rtw_wlan_util.c | 10 ++++++---- - 3rdparty/rtl8812au/os_dep/linux/os_intfs.c | 19 +++++++++++++----- - 3rdparty/rtl8812au/os_dep/osdep_service.c | 43 +++++++++++++++++++++++++++-------------- - 4 files changed, 54 insertions(+), 25 deletions(-) - -diff --git a/3rdparty/rtl8812au/core/rtw_btcoex.c b/3rdparty/rtl8812au/core/rtw_btcoex.c -index d5b89bdc..f5e0f567 100644 ---- a/3rdparty/rtl8812au/core/rtw_btcoex.c -+++ b/3rdparty/rtl8812au/core/rtw_btcoex.c -@@ -1443,7 +1443,9 @@ u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool for - { - u8 error; - struct msghdr udpmsg; -+#ifdef set_fs - mm_segment_t oldfs; -+#endif - struct iovec iov; - struct bt_coex_info *pcoex_info = &padapter->coex_info; - -@@ -1473,15 +1475,18 @@ u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool for - udpmsg.msg_control = NULL; - udpmsg.msg_controllen = 0; - udpmsg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL; -+#ifdef set_fs - oldfs = get_fs(); - set_fs(KERNEL_DS); -- -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - error = sock_sendmsg(pcoex_info->udpsock, &udpmsg); - #else - error = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size); - #endif -+#ifdef set_fs - set_fs(oldfs); -+#endif - if (error < 0) { - RTW_INFO("Error when sendimg msg, error:%d\n", error); - return _FAIL; -diff --git a/3rdparty/rtl8812au/core/rtw_wlan_util.c b/3rdparty/rtl8812au/core/rtw_wlan_util.c -index b4cecd11..e465e9b5 100644 ---- a/3rdparty/rtl8812au/core/rtw_wlan_util.c -+++ b/3rdparty/rtl8812au/core/rtw_wlan_util.c -@@ -4744,7 +4744,9 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t *ssid, - - int i = 0; - struct file *fp; -+#ifdef set_fs - mm_segment_t fs; -+#endif - loff_t pos = 0; - u8 *source = NULL; - long len = 0; -@@ -4780,10 +4782,10 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t *ssid, - RTW_INFO("Error, cipher array using default value.\n"); - return 0; - } -- -+#ifdef set_fs - fs = get_fs(); - set_fs(KERNEL_DS); -- -+#endif - source = rtw_zmalloc(2048); - - if (source != NULL) { -@@ -4791,10 +4793,10 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t *ssid, - rtw_parse_cipher_list(nlo_info, source); - rtw_mfree(source, 2048); - } -- -+#ifdef set_fs - set_fs(fs); - filp_close(fp, NULL); -- -+#endif - RTW_INFO("-%s-\n", __func__); - return 0; - } -diff --git a/3rdparty/rtl8812au/os_dep/linux/os_intfs.c b/3rdparty/rtl8812au/os_dep/linux/os_intfs.c -index 1085d6cd..a37e488b 100644 ---- a/3rdparty/rtl8812au/os_dep/linux/os_intfs.c -+++ b/3rdparty/rtl8812au/os_dep/linux/os_intfs.c -@@ -4029,7 +4029,9 @@ static int route_dump(u32 *gw_addr , int *gw_index) - struct msghdr msg; - struct iovec iov; - struct sockaddr_nl nladdr; -+#ifdef set_fs - mm_segment_t oldfs; -+#endif - char *pg; - int size = 0; - -@@ -4067,16 +4069,18 @@ static int route_dump(u32 *gw_addr , int *gw_index) - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = MSG_DONTWAIT; -- -+#ifdef set_fs - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - err = sock_sendmsg(sock, &msg); - #else - err = sock_sendmsg(sock, &msg, sizeof(req)); - #endif -+#ifdef set_fs - set_fs(oldfs); -- -+#endif - if (err < 0) - goto out_sock; - -@@ -4099,16 +4103,18 @@ static int route_dump(u32 *gw_addr , int *gw_index) - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE); - #endif -- -+#ifdef set_fs - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) - err = sock_recvmsg(sock, &msg, MSG_DONTWAIT); - #else - err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT); - #endif -+#ifdef set_fs - set_fs(oldfs); -- -+#endif - if (err < 0) - goto out_sock_pg; - -@@ -4178,15 +4184,18 @@ static int route_dump(u32 *gw_addr , int *gw_index) - msg.msg_controllen = 0; - msg.msg_flags = MSG_DONTWAIT; - -+#ifdef set_fs - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - err = sock_sendmsg(sock, &msg); - #else - err = sock_sendmsg(sock, &msg, sizeof(req)); - #endif -+#ifdef set_fs - set_fs(oldfs); -- -+#endif - if (err > 0) - goto restart; - } -diff --git a/3rdparty/rtl8812au/os_dep/osdep_service.c b/3rdparty/rtl8812au/os_dep/osdep_service.c -index 7c6d1208..0769b49d 100644 ---- a/3rdparty/rtl8812au/os_dep/osdep_service.c -+++ b/3rdparty/rtl8812au/os_dep/osdep_service.c -@@ -2164,11 +2164,21 @@ static int writeFile(struct file *fp, char *buf, int len) - { - int wlen = 0, sum = 0; - -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) -+ if (!(fp->f_mode & FMODE_CAN_WRITE)) -+#else - if (!fp->f_op || !fp->f_op->write) -+#endif - return -EPERM; - - while (sum < len) { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)) -+ wlen = kernel_write(fp, buf + sum, len - sum, &fp->f_pos); -+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) -+ wlen = __vfs_write(fp, buf + sum, len - sum, &fp->f_pos); -+#else - wlen = fp->f_op->write(fp, buf + sum, len - sum, &fp->f_pos); -+#endif - if (wlen > 0) - sum += wlen; - else if (0 != wlen) -@@ -2191,19 +2201,19 @@ static int isFileReadable(const char *path, u32 *sz) - { - struct file *fp; - int ret = 0; -+#ifdef set_fs - mm_segment_t oldfs; -+#endif - char buf; - - fp = filp_open(path, O_RDONLY, 0); - if (IS_ERR(fp)) - ret = PTR_ERR(fp); - else { -+#ifdef set_fs - oldfs = get_fs(); -- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)) - set_fs(KERNEL_DS); -- #else -- set_fs(get_ds()); -- #endif -+#endif - - if (1 != readFile(fp, &buf, 1)) - ret = PTR_ERR(fp); -@@ -2215,8 +2225,9 @@ static int isFileReadable(const char *path, u32 *sz) - *sz = i_size_read(fp->f_dentry->d_inode); - #endif - } -- -+#ifdef set_fs - set_fs(oldfs); -+#endif - filp_close(fp, NULL); - } - return ret; -@@ -2232,22 +2243,23 @@ static int isFileReadable(const char *path, u32 *sz) - static int retriveFromFile(const char *path, u8 *buf, u32 sz) - { - int ret = -1; -+#ifdef set_fs - mm_segment_t oldfs; -+#endif - struct file *fp; - - if (path && buf) { - ret = openFile(&fp, path, O_RDONLY, 0); - if (0 == ret) { - RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp); -- -+#ifdef set_fs - oldfs = get_fs(); -- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)) - set_fs(KERNEL_DS); -- #else -- set_fs(get_ds()); -- #endif - ret = readFile(fp, buf, sz); - set_fs(oldfs); -+#else -+ ret = readFile(fp, buf, sz); -+#endif - closeFile(fp); - - RTW_INFO("%s readFile, ret:%d\n", __FUNCTION__, ret); -@@ -2271,22 +2283,23 @@ static int retriveFromFile(const char *path, u8 *buf, u32 sz) - static int storeToFile(const char *path, u8 *buf, u32 sz) - { - int ret = 0; -+#ifdef set_fs - mm_segment_t oldfs; -+#endif - struct file *fp; - - if (path && buf) { - ret = openFile(&fp, path, O_CREAT | O_WRONLY, 0666); - if (0 == ret) { - RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp); -- -+#ifdef set_fs - oldfs = get_fs(); -- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)) - set_fs(KERNEL_DS); -- #else -- set_fs(get_ds()); -- #endif - ret = writeFile(fp, buf, sz); - set_fs(oldfs); -+#else -+ ret = writeFile(fp, buf, sz); -+#endif - closeFile(fp); - - RTW_INFO("%s writeFile, ret:%d\n", __FUNCTION__, ret); diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.12.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.12.patch deleted file mode 100644 index c53561cf98..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.12.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -urp linux/3rdparty/rtl8812au.orig/os_dep/linux/recv_linux.c linux/3rdparty/rtl8812au/os_dep/linux/recv_linux.c ---- linux/3rdparty/rtl8812au.orig/os_dep/linux/recv_linux.c 2021-04-26 18:35:37.411027594 +0300 -+++ linux/3rdparty/rtl8812au/os_dep/linux/recv_linux.c 2021-04-26 18:53:13.502814526 +0300 -@@ -353,7 +353,7 @@ static int napi_recv(_adapter *padapter, - - rx_ok = _FALSE; - --#ifdef CONFIG_RTW_GRO -+#if defined(CONFIG_RTW_GRO) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) - if (pregistrypriv->en_gro) { - if (rtw_napi_gro_receive(&padapter->napi, pskb) != GRO_DROP) - rx_ok = _TRUE; diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.15.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.15.patch deleted file mode 100644 index 86a002fe3b..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-kernel-5.15.patch +++ /dev/null @@ -1,66 +0,0 @@ - -From: -https://github.com/aircrack-ng/rtl8812au/commit/47a38b7c736dd9e9baac9eb07a6dceb83429fb49 - -diff -Nurp linux-5.15/3rdparty/rtl8812au.orig/core/rtw_br_ext.c linux-5.15/3rdparty/rtl8812au/core/rtw_br_ext.c ---- linux-5.15/3rdparty/rtl8812au.orig/core/rtw_br_ext.c 2021-11-08 23:40:48.236272741 +0200 -+++ linux-5.15/3rdparty/rtl8812au/core/rtw_br_ext.c 2021-11-08 23:49:12.118046953 +0200 -@@ -17,7 +17,10 @@ - #ifdef __KERNEL__ - #include - #include -+ #include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0) - #include -+#endif - #include - #include - #include -@@ -169,6 +172,7 @@ static __inline__ void __nat25_generate_ - } - - -+#ifdef _NET_INET_IPX_H_ - static __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr, - unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr) - { -@@ -189,6 +193,7 @@ static __inline__ void __nat25_generate_ - memcpy(networkAddr + 1, (unsigned char *)ipxNetAddr, 4); - memcpy(networkAddr + 5, (unsigned char *)ipxSocketAddr, 2); - } -+#endif - - - static __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr, -@@ -330,6 +335,7 @@ static __inline__ int __nat25_network_ha - x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; - - return x & (NAT25_HASH_SIZE - 1); -+#ifdef _NET_INET_IPX_H_ - } else if (networkAddr[0] == NAT25_IPX) { - unsigned long x; - -@@ -337,6 +343,7 @@ static __inline__ int __nat25_network_ha - networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; - - return x & (NAT25_HASH_SIZE - 1); -+#endif - } else if (networkAddr[0] == NAT25_APPLE) { - unsigned long x; - -@@ -889,6 +896,7 @@ int nat25_db_handle(_adapter *priv, stru - } - } - -+#ifdef _NET_INET_IPX_H_ - /*---------------------------------------------------*/ - /* Handle IPX and Apple Talk frame */ - /*---------------------------------------------------*/ -@@ -1109,6 +1117,7 @@ int nat25_db_handle(_adapter *priv, stru - - return -1; - } -+#endif - - /*---------------------------------------------------*/ - /* Handle PPPoE frame */ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-rename.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-rename.patch deleted file mode 100644 index bcf02987c2..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au-rename.patch +++ /dev/null @@ -1,78 +0,0 @@ - -Adjust driver bits so it keeps the name of the replaced driver - -Signed-off-by: Thomas Backlund - ---- - 3rdparty/rtl8812au/Kconfig | 7 +++---- - 3rdparty/rtl8812au/Makefile | 8 ++++---- - 3rdparty/rtl8812au/hal/hal_com.c | 2 +- - 3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 2 +- - 4 files changed, 9 insertions(+), 10 deletions(-) - -diff -Nurp linux-5.11/3rdparty/rtl8812au.orig/hal/hal_com.c linux-5.11/3rdparty/rtl8812au/hal/hal_com.c ---- linux-5.11/3rdparty/rtl8812au.orig/hal/hal_com.c 2021-03-07 18:43:20.313672664 +0200 -+++ linux-5.11/3rdparty/rtl8812au/hal/hal_com.c 2021-03-07 18:43:51.392141299 +0200 -@@ -12879,7 +12879,7 @@ bypass_hw_pg: - _rtw_memset(hal_data->EEPROMMACAddr, 0, ETH_ALEN); - ret = _FAIL; - exit: -- dev_info(&udev->dev, "88XXau %pM hw_info[%02x]", hw_addr, addr_offset); -+ dev_info(&udev->dev, "8812au %pM hw_info[%02x]", hw_addr, addr_offset); - return ret; - } - -diff -Nurp linux-5.11/3rdparty/rtl8812au.orig/Kconfig linux-5.11/3rdparty/rtl8812au/Kconfig ---- linux-5.11/3rdparty/rtl8812au.orig/Kconfig 2021-03-07 18:43:20.369675309 +0200 -+++ linux-5.11/3rdparty/rtl8812au/Kconfig 2021-03-07 18:45:22.910465892 +0200 -@@ -1,6 +1,5 @@ --config 88XXAU -- tristate "Realtek 88XXau USB WiFi" -+config RTL8812AU -+ tristate "Realtek 8812au USB WiFi" - depends on USB - help -- Help message of 88XXau -- -+ Help message of 8812au -diff -Nurp linux-5.11/3rdparty/rtl8812au.orig/Makefile linux-5.11/3rdparty/rtl8812au/Makefile ---- linux-5.11/3rdparty/rtl8812au.orig/Makefile 2021-03-07 18:43:20.370675357 +0200 -+++ linux-5.11/3rdparty/rtl8812au/Makefile 2021-03-07 18:43:51.401141725 +0200 -@@ -180,9 +180,9 @@ endif - - ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_y_n) - --EXTRA_CFLAGS += -DDRV_NAME=\"rtl88XXau\" -+EXTRA_CFLAGS += -DDRV_NAME=\"rtl8812au\" - ifeq ($(CONFIG_USB_HCI), y) --USER_MODULE_NAME = 88XXau -+USER_MODULE_NAME = 8812au - endif - else - EXTRA_CFLAGS += -DDRV_NAME=\"rtl8812au\" -@@ -2232,11 +2232,11 @@ $(MODULE_NAME)-y += $(_PLATFORM_FILES) - - $(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o - --obj-$(CONFIG_88XXAU) := $(MODULE_NAME).o -+obj-$(CONFIG_RTL8812AU) := $(MODULE_NAME).o - - else - --export CONFIG_88XXAU = m -+export CONFIG_RTL8812AU = m - - all: modules - -diff -Nurp linux-5.11/3rdparty/rtl8812au.orig/os_dep/linux/ioctl_cfg80211.c linux-5.11/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c ---- linux-5.11/3rdparty/rtl8812au.orig/os_dep/linux/ioctl_cfg80211.c 2021-03-07 18:43:20.371675404 +0200 -+++ linux-5.11/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c 2021-03-07 18:43:51.402141772 +0200 -@@ -2646,7 +2646,7 @@ void rtw_cfg80211_unlink_bss(_adapter *p - #endif - - if (!wiphy) { -- pr_info("88XXAU: rtw_cfg80211_unlink_bss: wiphy is NULL\n"); -+ pr_info("8812AU: rtw_cfg80211_unlink_bss: wiphy is NULL\n"); - return; - } - diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-5.8-fix.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-5.8-fix.patch deleted file mode 100644 index 707d15de8a..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-5.8-fix.patch +++ /dev/null @@ -1,301 +0,0 @@ -diff -up linux-5.8/3rdparty/rtl8821ce/core/rtw_security.c.kernel58 linux-5.8/3rdparty/rtl8821ce/core/rtw_security.c ---- linux-5.8/3rdparty/rtl8821ce/core/rtw_security.c.kernel58 2020-08-12 18:12:12.492276511 +0200 -+++ linux-5.8/3rdparty/rtl8821ce/core/rtw_security.c 2020-08-12 18:13:07.202678858 +0200 -@@ -2133,7 +2133,7 @@ BIP_exit: - #ifndef PLATFORM_FREEBSD - #if defined(CONFIG_TDLS) - /* compress 512-bits */ --static int sha256_compress(struct _sha256_state *md, unsigned char *buf) -+static int sha256_compress(struct sha256_state *md, unsigned char *buf) - { - u32 S[8], W[64], t0, t1; - u32 t; -@@ -2181,7 +2181,7 @@ static int sha256_compress(struct _sha25 - } - - /* Initialize the hash state */ --static void sha256_init(struct _sha256_state *md) -+static void sha256_init(struct sha256_state *md) - { - md->curlen = 0; - md->length = 0; -@@ -2202,7 +2202,7 @@ static void sha256_init(struct _sha256_s - @param inlen The length of the data (octets) - @return CRYPT_OK if successful - */ --static int sha256_process(struct _sha256_state *md, unsigned char *in, -+static int sha256_process(struct sha256_state *md, unsigned char *in, - unsigned long inlen) - { - unsigned long n; -@@ -2243,7 +2243,7 @@ static int sha256_process(struct _sha256 - @param out [out] The destination of the hash (32 bytes) - @return CRYPT_OK if successful - */ --static int sha256_done(struct _sha256_state *md, unsigned char *out) -+static int sha256_done(struct sha256_state *md, unsigned char *out) - { - int i; - -@@ -2293,7 +2293,7 @@ static int sha256_done(struct _sha256_st - static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len, - u8 *mac) - { -- struct _sha256_state ctx; -+ struct sha256_state ctx; - size_t i; - - sha256_init(&ctx); -diff -up linux-5.8/3rdparty/rtl8821ce/include/rtw_security.h.kernel58 linux-5.8/3rdparty/rtl8821ce/include/rtw_security.h ---- linux-5.8/3rdparty/rtl8821ce/include/rtw_security.h.kernel58 2020-08-12 18:12:12.860279218 +0200 -+++ linux-5.8/3rdparty/rtl8821ce/include/rtw_security.h 2020-08-12 18:13:07.202678858 +0200 -@@ -249,11 +249,13 @@ struct security_priv { - #define SEC_IS_BIP_KEY_INSTALLED(sec) _FALSE - #endif - --struct _sha256_state { -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)) -+struct sha256_state { - u64 length; - u32 state[8], curlen; - u8 buf[64]; - }; -+#endif - - #define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ - do {\ -diff -up linux-5.8/3rdparty/rtl8821ce/os_dep/linux/ioctl_cfg80211.c.kernel58 linux-5.8/3rdparty/rtl8821ce/os_dep/linux/ioctl_cfg80211.c ---- linux-5.8/3rdparty/rtl8821ce/os_dep/linux/ioctl_cfg80211.c.kernel58 2020-08-12 18:12:12.867279269 +0200 -+++ linux-5.8/3rdparty/rtl8821ce/os_dep/linux/ioctl_cfg80211.c 2020-08-12 18:13:07.204678873 +0200 -@@ -80,7 +80,7 @@ - #endif - - /* -- * In the current design of Wi-Fi driver, it will return success to the system (e.g. supplicant) -+ * In the current design of Wi-Fi driver, it will return success to the system (e.g. supplicant) - * when Wi-Fi driver decides to abort the scan request in the scan flow by default. - * Defining this flag makes Wi-Fi driver to return -EBUSY to the system if Wi-Fi driver is too busy to do the scan. - */ -@@ -321,7 +321,7 @@ static u8 rtw_chbw_to_cfg80211_chan_def( - if (!chan) - goto exit; - -- if (bw == CHANNEL_WIDTH_20) -+ if (bw == CHANNEL_WIDTH_20) - chdef->width = ht ? NL80211_CHAN_WIDTH_20 : NL80211_CHAN_WIDTH_20_NOHT; - else if (bw == CHANNEL_WIDTH_40) - chdef->width = NL80211_CHAN_WIDTH_40; -@@ -355,7 +355,7 @@ static void rtw_get_chbw_from_cfg80211_c - rtw_warn_on(1); - *ch = 0; - return; -- } -+ } - - switch (chdef->width) { - case NL80211_CHAN_WIDTH_20_NOHT: -@@ -1577,8 +1577,8 @@ static int rtw_cfg80211_set_encryption(s - _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - padapter->securitypriv.binstallGrpkey = _TRUE; -- if (param->u.crypt.idx < 4) -- _rtw_memcpy(padapter->securitypriv.iv_seq[param->u.crypt.idx], param->u.crypt.seq, 8); -+ if (param->u.crypt.idx < 4) -+ _rtw_memcpy(padapter->securitypriv.iv_seq[param->u.crypt.idx], param->u.crypt.seq, 8); - padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; - rtw_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx, 1, _TRUE); - -@@ -1826,7 +1826,7 @@ static int cfg80211_rtw_get_key(struct w - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) - || (MLME_IS_STA(adapter) && !pairwise) - #endif -- ) { -+ ) { - /* WEP key, TX GTK/IGTK, RX GTK/IGTK(for STA mode) */ - if (is_wep_enc(sec->dot118021XGrpPrivacy)) { - if (keyid >= WEP_KEYS) -@@ -1915,7 +1915,7 @@ static int cfg80211_rtw_get_key(struct w - } - - ret = 0; -- -+ - exit: - RTW_INFO(FUNC_NDEV_FMT - GET_KEY_PARAM_FMT_S -@@ -5565,7 +5565,7 @@ release_plink_ctl: - if (del_sta) { - u8 sta_addr[ETH_ALEN]; - u8 updated = _FALSE; -- -+ - _rtw_memcpy(sta_addr, del_sta->cmn.mac_addr, ETH_ALEN); - updated = ap_free_sta(adapter, del_sta, 0, 0, 1); - rtw_mesh_expire_peer(stapriv->padapter, sta_addr); -@@ -5650,7 +5650,7 @@ static int cfg80211_rtw_dump_station(str - else - _rtw_memcpy(mac, plink->addr, ETH_ALEN); - #endif -- -+ - sinfo->filled = 0; - - if (psta) { -@@ -7307,11 +7307,22 @@ static void cfg80211_rtw_mgmt_frame_regi - #else - struct net_device *ndev, - #endif -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ struct mgmt_frame_regs *upd) -+#else - u16 frame_type, bool reg) -+#endif -+ - { - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - struct net_device *ndev = wdev_to_ndev(wdev); - #endif -+ -+/* hardcoded always true, to make it pass compilation */ -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ bool reg = true; -+#endif -+ - _adapter *adapter; - - struct rtw_wdev_priv *pwdev_priv; -@@ -7330,7 +7341,12 @@ static void cfg80211_rtw_mgmt_frame_regi - /* Wait QC Verify */ - return; - -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ switch (upd->interface_stypes) { -+#else - switch (frame_type) { -+#endif -+ - case IEEE80211_STYPE_PROBE_REQ: /* 0x0040 */ - SET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_PROBE_REQ, reg); - break; -@@ -7682,7 +7698,7 @@ void dump_mesh_config(void *sel, const s - RTW_PRINT_SEL(sel, "path_refresh_time:%u\n", conf->path_refresh_time); - RTW_PRINT_SEL(sel, "min_discovery_timeout:%u\n", conf->min_discovery_timeout); - RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathTimeout:%u\n", conf->dot11MeshHWMPactivePathTimeout); -- RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); -+ RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) - RTW_PRINT_SEL(sel, "dot11MeshHWMPperrMinInterval:%u\n", conf->dot11MeshHWMPperrMinInterval); - #endif -@@ -7697,11 +7713,11 @@ void dump_mesh_config(void *sel, const s - RTW_PRINT_SEL(sel, "dot11MeshForwarding:%d\n", conf->dot11MeshForwarding); - RTW_PRINT_SEL(sel, "rssi_threshold:%d\n", conf->rssi_threshold); - #endif -- -+ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) - RTW_PRINT_SEL(sel, "ht_opmode:0x%04x\n", conf->ht_opmode); - #endif -- -+ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathToRootTimeout:%u\n", conf->dot11MeshHWMPactivePathToRootTimeout); - RTW_PRINT_SEL(sel, "dot11MeshHWMProotInterval:%u\n", conf->dot11MeshHWMProotInterval); -@@ -7712,7 +7728,7 @@ void dump_mesh_config(void *sel, const s - RTW_PRINT_SEL(sel, "power_mode:%s\n", nl80211_mesh_power_mode_str(conf->power_mode)); - RTW_PRINT_SEL(sel, "dot11MeshAwakeWindowDuration:%u\n", conf->dot11MeshAwakeWindowDuration); - #endif -- -+ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) - RTW_PRINT_SEL(sel, "plink_timeout:%u\n", conf->plink_timeout); - #endif -@@ -7848,14 +7864,14 @@ static void rtw_cfg80211_mesh_cfg_set(_a - if (chk_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)); - #endif - #endif -- -+ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - if (chk_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask)) - mcfg->dot11MeshHWMPactivePathToRootTimeout = conf->dot11MeshHWMPactivePathToRootTimeout; - if (chk_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask)) - mcfg->dot11MeshHWMProotInterval = conf->dot11MeshHWMProotInterval; - if (chk_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask)) -- mcfg->dot11MeshHWMPconfirmationInterval = conf->dot11MeshHWMPconfirmationInterval; -+ mcfg->dot11MeshHWMPconfirmationInterval = conf->dot11MeshHWMPconfirmationInterval; - #endif - - #if 0 /* TBD */ -@@ -7913,7 +7929,7 @@ u8 *rtw_cfg80211_construct_mesh_beacon_i - #endif - if (!ch) - goto exit; -- -+ - #if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - vht = ht && ch > 14 && bw >= CHANNEL_WIDTH_80; /* VHT40/VHT20? */ - #endif -@@ -8244,7 +8260,7 @@ static int cfg80211_rtw_join_mesh(struct - ret = -EINVAL; - goto exit; - } -- -+ - rtw_mesh_work(&adapter->mesh_work); - - exit: -@@ -8325,7 +8341,7 @@ static int cfg80211_rtw_del_mpath(struct - } - } else { - rtw_mesh_path_flush_by_iface(adapter); -- } -+ } - - exit: - return ret; -@@ -8626,13 +8642,13 @@ int cfg80211_rtw_resume(struct wiphy *wi - //rtw_sitesurvey_cmd(padapter, NULL); - rtw_sitesurvey_cmd(padapter, &parm); - _exit_critical_bh(&pmlmepriv->lock, &irqL); -- -+ - for (PNOWakeupScanWaitCnt = 0; PNOWakeupScanWaitCnt < 10; PNOWakeupScanWaitCnt++) { - if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _FALSE) - break; - rtw_msleep_os(1000); - } -- -+ - _enter_critical_bh(&pmlmepriv->lock, &irqL); - cfg80211_sched_scan_results(padapter->rtw_wdev->wiphy); - _exit_critical_bh(&pmlmepriv->lock, &irqL); -@@ -8640,7 +8656,7 @@ int cfg80211_rtw_resume(struct wiphy *wi - } - RTW_DBG("<== %s\n",__func__); - return 0; -- -+ - } - #endif /* CONFIG_PNO_SUPPORT */ - -@@ -9530,7 +9546,7 @@ int rtw_hostapd_acs_dump_survey(struct w - #elif defined(CONFIG_RTW_ACS) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) - rtw_cfg80211_set_survey_info_with_clm(padapter, idx, info); - #else -- RTW_ERR("%s: unknown acs operation!\n", __func__); -+ RTW_ERR("%s: unknown acs operation!\n", __func__); - #endif - - return ret; -@@ -9631,7 +9647,11 @@ static struct cfg80211_ops rtw_cfg80211_ - - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) - .mgmt_tx = cfg80211_rtw_mgmt_tx, -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) -+ .update_mgmt_frame_registrations = cfg80211_rtw_mgmt_frame_register, -+#else - .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -+#endif - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) - .action = cfg80211_rtw_mgmt_tx, - #endif diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-Kconfig-Makefile.patch deleted file mode 100644 index 223599b6f3..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-Kconfig-Makefile.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- linux-5.3.orig/3rdparty/Kconfig -+++ linux-5.3/3rdparty/Kconfig -@@ -3,6 +3,7 @@ - menu "External 3rdparty kernel additions" - - source "3rdparty/ndiswrapper/Kconfig" -+source "3rdparty/rtl8821ce/Kconfig" - source "3rdparty/rtl8812au/Kconfig" - source "3rdparty/rtl8723de/Kconfig" - source "3rdparty/viahss/Kconfig" ---- linux-5.3.orig/3rdparty/Makefile -+++ linux-5.3/3rdparty/Makefile -@@ -2,6 +2,7 @@ - - obj- := 3rdparty.o # Dummy rule to force built-in.o to be made - obj-$(CONFIG_NDISWRAPPER) += ndiswrapper/ -+obj-$(CONFIG_RTL8821CE) += rtl8821ce/ - obj-$(CONFIG_RTL8812AU) += rtl8812au/ - obj-$(CONFIG_RTL8723DE) += rtl8723de/ - obj-$(CONFIG_VIAHSS) += viahss/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.10.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.10.patch deleted file mode 100644 index 080058400c..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.10.patch +++ /dev/null @@ -1,162 +0,0 @@ -diff -urp linux-5.10/3rdparty/rtl8821ce.orig/core/rtw_btcoex.c linux-5.10/3rdparty/rtl8821ce/core/rtw_btcoex.c ---- linux-5.10/3rdparty/rtl8821ce.orig/core/rtw_btcoex.c 2021-01-19 22:18:00.924067581 +0200 -+++ linux-5.10/3rdparty/rtl8821ce/core/rtw_btcoex.c 2021-01-19 22:22:20.057518961 +0200 -@@ -1474,15 +1474,20 @@ u8 rtw_btcoex_sendmsgbysocket(_adapter * - udpmsg.msg_control = NULL; - udpmsg.msg_controllen = 0; - udpmsg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL; -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - error = sock_sendmsg(pcoex_info->udpsock, &udpmsg); - #else - error = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size); - #endif -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+#endif - if (error < 0) { - RTW_INFO("Error when sendimg msg, error:%d\n", error); - return _FAIL; -diff -urp linux-5.10/3rdparty/rtl8821ce.orig/core/rtw_wlan_util.c linux-5.10/3rdparty/rtl8821ce/core/rtw_wlan_util.c ---- linux-5.10/3rdparty/rtl8821ce.orig/core/rtw_wlan_util.c 2021-01-19 22:18:00.937068206 +0200 -+++ linux-5.10/3rdparty/rtl8821ce/core/rtw_wlan_util.c 2021-01-19 22:22:20.067519442 +0200 -@@ -4751,8 +4751,10 @@ int rtw_dev_nlo_info_set(struct pno_nlo_ - return 0; - } - -+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)) - fs = get_fs(); - set_fs(KERNEL_DS); -+#endif - - source = rtw_zmalloc(2048); - -@@ -4762,7 +4764,9 @@ int rtw_dev_nlo_info_set(struct pno_nlo_ - rtw_mfree(source, 2048); - } - -+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(5, 10, 0)) - set_fs(fs); -+#endif - filp_close(fp, NULL); - - RTW_INFO("-%s-\n", __func__); -diff -urp linux-5.10/3rdparty/rtl8821ce.orig/os_dep/linux/os_intfs.c linux-5.10/3rdparty/rtl8821ce/os_dep/linux/os_intfs.c ---- linux-5.10/3rdparty/rtl8821ce.orig/os_dep/linux/os_intfs.c 2021-01-19 22:18:01.078074981 +0200 -+++ linux-5.10/3rdparty/rtl8821ce/os_dep/linux/os_intfs.c 2021-01-19 22:22:20.068519490 +0200 -@@ -4008,14 +4008,18 @@ static int route_dump(u32 *gw_addr , int - msg.msg_controllen = 0; - msg.msg_flags = MSG_DONTWAIT; - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - err = sock_sendmsg(sock, &msg); - #else - err = sock_sendmsg(sock, &msg, sizeof(req)); - #endif -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+#endif - - if (err < 0) - goto out_sock; -@@ -4040,14 +4044,18 @@ restart: - iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE); - #endif - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) - err = sock_recvmsg(sock, &msg, MSG_DONTWAIT); - #else - err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT); - #endif -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+#endif - - if (err < 0) - goto out_sock_pg; -@@ -4118,14 +4126,18 @@ done: - msg.msg_controllen = 0; - msg.msg_flags = MSG_DONTWAIT; - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - err = sock_sendmsg(sock, &msg); - #else - err = sock_sendmsg(sock, &msg, sizeof(req)); - #endif -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+#endif - - if (err > 0) - goto restart; -diff -urp linux-5.10/3rdparty/rtl8821ce.orig/os_dep/osdep_service.c linux-5.10/3rdparty/rtl8821ce/os_dep/osdep_service.c ---- linux-5.10/3rdparty/rtl8821ce.orig/os_dep/osdep_service.c 2021-01-19 22:18:01.081075125 +0200 -+++ linux-5.10/3rdparty/rtl8821ce/os_dep/osdep_service.c 2021-01-19 22:22:20.068519490 +0200 -@@ -2200,8 +2200,10 @@ static int isFileReadable(const char *pa - if (IS_ERR(fp)) - ret = PTR_ERR(fp); - else { -+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+ #endif - - if (1 != readFile(fp, &buf, 1)) - ret = PTR_ERR(fp); -@@ -2214,7 +2216,9 @@ static int isFileReadable(const char *pa - #endif - } - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+#endif - filp_close(fp, NULL); - } - return ret; -@@ -2238,10 +2242,14 @@ static int retriveFromFile(const char *p - if (0 == ret) { - RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp); - -+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+ #endif - ret = readFile(fp, buf, sz); -+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+ #endif - closeFile(fp); - - RTW_INFO("%s readFile, ret:%d\n", __FUNCTION__, ret); -@@ -2273,10 +2281,14 @@ static int storeToFile(const char *path, - if (0 == ret) { - RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp); - -+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - oldfs = get_fs(); - set_fs(KERNEL_DS); -+ #endif - ret = writeFile(fp, buf, sz); -+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) - set_fs(oldfs); -+ #endif - closeFile(fp); - - RTW_INFO("%s writeFile, ret:%d\n", __FUNCTION__, ret); diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.12.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.12.patch deleted file mode 100644 index f23766d9f9..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.12.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -urp linux/3rdparty/rtl8821ce.orig/os_dep/linux/recv_linux.c linux/3rdparty/rtl8821ce/os_dep/linux/recv_linux.c ---- linux/3rdparty/rtl8821ce.orig/os_dep/linux/recv_linux.c 2021-04-26 18:35:37.690041052 +0300 -+++ linux/3rdparty/rtl8821ce/os_dep/linux/recv_linux.c 2021-04-26 18:53:23.534295732 +0300 -@@ -353,7 +353,7 @@ static int napi_recv(_adapter *padapter, - - rx_ok = _FALSE; - --#ifdef CONFIG_RTW_GRO -+#if defined(CONFIG_RTW_GRO) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) - if (pregistrypriv->en_gro) { - if (rtw_napi_gro_receive(&padapter->napi, pskb) != GRO_DROP) - rx_ok = _TRUE; diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.15.patch b/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.15.patch deleted file mode 100644 index 2acf771951..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8821ce-kernel-5.15.patch +++ /dev/null @@ -1,66 +0,0 @@ - -From: -https://github.com/aircrack-ng/rtl8812au/commit/47a38b7c736dd9e9baac9eb07a6dceb83429fb49 - -diff -Nurp linux-5.15/3rdparty/rtl8821ce.orig/core/rtw_br_ext.c linux-5.15/3rdparty/rtl8821ce/core/rtw_br_ext.c ---- linux-5.15/3rdparty/rtl8821ce.orig/core/rtw_br_ext.c 2021-11-08 23:40:48.236272741 +0200 -+++ linux-5.15/3rdparty/rtl8821ce/core/rtw_br_ext.c 2021-11-08 23:49:12.118046953 +0200 -@@ -17,7 +17,10 @@ - #ifdef __KERNEL__ - #include - #include -+ #include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0) - #include -+#endif - #include - #include - #include -@@ -169,6 +172,7 @@ static __inline__ void __nat25_generate_ - } - - -+#ifdef _NET_INET_IPX_H_ - static __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr, - unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr) - { -@@ -189,6 +193,7 @@ static __inline__ void __nat25_generate_ - memcpy(networkAddr + 1, (unsigned char *)ipxNetAddr, 4); - memcpy(networkAddr + 5, (unsigned char *)ipxSocketAddr, 2); - } -+#endif - - - static __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr, -@@ -330,6 +335,7 @@ static __inline__ int __nat25_network_ha - x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; - - return x & (NAT25_HASH_SIZE - 1); -+#ifdef _NET_INET_IPX_H_ - } else if (networkAddr[0] == NAT25_IPX) { - unsigned long x; - -@@ -337,6 +343,7 @@ static __inline__ int __nat25_network_ha - networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; - - return x & (NAT25_HASH_SIZE - 1); -+#endif - } else if (networkAddr[0] == NAT25_APPLE) { - unsigned long x; - -@@ -889,6 +896,7 @@ int nat25_db_handle(_adapter *priv, stru - } - } - -+#ifdef _NET_INET_IPX_H_ - /*---------------------------------------------------*/ - /* Handle IPX and Apple Talk frame */ - /*---------------------------------------------------*/ -@@ -1109,6 +1117,7 @@ int nat25_db_handle(_adapter *priv, stru - - return -1; - } -+#endif - - /*---------------------------------------------------*/ - /* Handle PPPoE frame */ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-0.92.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-0.92.patch deleted file mode 100644 index bc9a567817..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-0.92.patch +++ /dev/null @@ -1,189 +0,0 @@ - 3rdparty/viahss/Kconfig | 14 +++++++ - 3rdparty/viahss/Makefile | 3 + - 3rdparty/viahss/README.html | 68 ++++++++++++++++++++++++++++++++++++ - 3rdparty/viahss/viahss.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 168 insertions(+) -diff -Nurp linux-2.6.37/3rdparty/viahss/Kconfig linux-2.6.37.3rdparty/3rdparty/viahss/Kconfig ---- linux-2.6.37/3rdparty/viahss/Kconfig 1970-01-01 02:00:00.000000000 +0200 -+++ linux-2.6.37.3rdparty/3rdparty/viahss/Kconfig 2003-12-01 01:53:51.000000000 +0200 -@@ -0,0 +1,14 @@ -+config VIAHSS -+ tristate "VIA High Speed Serial" -+ depends on SERIAL_CORE && m -+ ---help--- -+ VIA High Speed Serial is a little kernel module (1 KB) which enables -+ high speed serial port modes of VIA VT82C686A or VT82C686B -+ southbridge-equipped motherboards. With this module, you can use the -+ serial port at 230400 bit/s so that you can get the full 128000 bit/s -+ from ISDN-TA. The module has been tested with both 686A and 686B -+ chipsets. -+ -+ To compile this driver as a module, choose M here: the -+ module will be called viahss. -+ -diff -Nurp linux-2.6.37/3rdparty/viahss/Makefile linux-2.6.37.3rdparty/3rdparty/viahss/Makefile ---- linux-2.6.37/3rdparty/viahss/Makefile 1970-01-01 02:00:00.000000000 +0200 -+++ linux-2.6.37.3rdparty/3rdparty/viahss/Makefile 2003-12-01 01:43:23.000000000 +0200 -@@ -0,0 +1,3 @@ -+ -+obj-$(CONFIG_VIAHSS) += viahss.o -+ -diff -Nurp linux-2.6.37/3rdparty/viahss/README.html linux-2.6.37.3rdparty/3rdparty/viahss/README.html ---- linux-2.6.37/3rdparty/viahss/README.html 1970-01-01 02:00:00.000000000 +0200 -+++ linux-2.6.37.3rdparty/3rdparty/viahss/README.html 2003-12-01 01:58:23.000000000 +0200 -@@ -0,0 +1,68 @@ -+ -+ -+ -+ -+ High speed serial port for VIA VT82C686 chipsets for linux -+ -+ -+

Setting the serial port speed over 115,200bps

-+
-+If you have motherboard which has VIA VT82C686A or VT82C686B chipset -+you can set serial ports in high speed mode with this kernel module. -+I use module with external ISDN-TA and haven't had any problems -+so far but I cannot guarantee that you won't have buffer overflows if -+you use full 230K or 460K speed all the time (FIFO's are still 16550A size). -+ISDN with two channels maxes out at 128 Kb which means that it doesn't -+really stress serial ports at 230400. Unlike SHSMOD-patches you don't have -+to patch serial driver and module takes only 1KB of memory when it's -+loaded which should leave enough room for other programs. It should -+be also possible to make this work from userspace but accessing -+pci devices is so much easier from kernel. -+ -+

How to use module

-+Get the
package -+and compile it using included makefiles. -+

For 2.4

-+If you have kernel in some other location than /usr/src/linux edit Makefile -+before compiling. You can also install module with "make install". After -+you have loaded module in kernel (use modprobe or insmod) you can set serial -+ports to use high speed modes with setserial.
-+

For 2.5/2.6

-+Copy Makefile-2.6 on top of Makefile and do make. After loading module set -+serial speed with setserial. (NOTE: This gives a warning on depracated -+method). -+ -+
-+# setserial /dev/ttyS0 spd_cust divisor 0x8002 -+

-+which sets COM1: speed to 230400. With 0x8001 you should get 460800 -+but I haven't tested it. If you want to use COM2: use ttyS1 instead of ttyS0. -+ -+After this you should set program which you are using to use 38400 bps -+speed which is now actually 230K or 460K. For more information check -+setserial man page (spd_cust). -+ -+You can use serial port work as normal if you do
-+
-+# setserial /dev/ttyS0 spd_normal

-+After this you can also remove viahss module with rmmod if you need to. Module doesn't intefere with normal serial port usage so you can leave -+it loaded if you don't need that extra 1KB which module uses. -+

Download

-+viahss-0.92.tar.gz -+ -+

Acknowledgments

-+ -+Thanks to Kimmo Rintala for help with divisor settings.
-+I also like to thank Jeff Garzik for help with VIA datasheets.
-+Port to 2.5/2.6 by Kingsly John with the help of LWN -+ -+

Version History

-+0.90 First release
-+0.91 Fixed Makefile
-+0.92 Fixed for 2.5/2.6
-+ -+

Contact

-+ -+You can reach me by email: jrauti@iki.fi -+ -+ -diff -Nurp linux-2.6.37/3rdparty/viahss/viahss.c linux-2.6.37.3rdparty/3rdparty/viahss/viahss.c ---- linux-2.6.37/3rdparty/viahss/viahss.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-2.6.37.3rdparty/3rdparty/viahss/viahss.c 2003-07-17 09:49:59.000000000 +0300 -@@ -0,0 +1,83 @@ -+/* -+ * VIA VT 82c686[AB] high speed serial port enabler -+ * Version 0.92 -+ * Copyright (c) 2000-2001 Juhani Rautiainen -+ * -+ * 0.92: -+ * Ported to 2.5/2.6 by Kingsly John -+ * - Corrected locking (no more cli() and sti()) -+ * - New makefile -+ * -+ * Can be freely distributed and used under the terms of the GNU GPL. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+ -+const unsigned short confindex=0x3F0,confdata=0x3F1; -+const unsigned char spcidx=0xEE; -+ -+spinlock_t driver_lock = SPIN_LOCK_UNLOCKED; -+ -+static int __init viahss_init(void) -+{ -+ struct pci_dev *pcidev = NULL; -+ unsigned char confval,val; -+ pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); -+ if (pcidev) { -+ spin_lock_irq(&driver_lock); -+ /* start config */ -+ pci_read_config_byte(pcidev,0x85,&confval); -+ confval |= 0x2; -+ pci_write_config_byte (pcidev, 0x85,confval); -+ /* activate high speed bits */ -+ outb(spcidx,confindex); /* set index */ -+ val = (unsigned char) inb(confdata); -+ val |= 0xC0; /* both ports on high speed*/ -+ outb (spcidx,confindex); -+ outb (val,confdata); -+ /*stop config*/ -+ confval &= ~0x2; -+ pci_write_config_byte(pcidev, 0x85, confval); -+ spin_unlock_irq(&driver_lock); -+ printk (KERN_INFO "VIA VT82C686[AB] serial port high speed enabled\n"); -+ } -+ else { -+ printk (KERN_INFO "Couldn't locate VIA chipset\n"); -+ return -ENODEV; -+ } -+ return 0; -+} -+ -+static void __exit viahss_exit(void) -+{ -+ struct pci_dev *pcidev = NULL; -+ unsigned char confval,val; -+ pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); -+ if (pcidev) { -+ spin_lock_irq(&driver_lock); -+ /* start config */ -+ pci_read_config_byte(pcidev,0x85,&confval); -+ confval |= 0x2; -+ pci_write_config_byte (pcidev, 0x85,confval); -+ /* activate high speed bits */ -+ outb(spcidx,confindex); /* set index */ -+ val = (unsigned char) inb(confdata); -+ val &= ~0xC0; /* both ports off high speed*/ -+ outb (spcidx,confindex); -+ outb (val,confdata); -+ /*stop config*/ -+ confval &= ~0x2; -+ pci_write_config_byte(pcidev, 0x85, confval); -+ spin_unlock_irq(&driver_lock); -+ printk (KERN_INFO "VIA VT82C686[AB] serial port high speed disabled\n"); -+ } -+} -+ -+module_init(viahss_init); -+module_exit(viahss_exit); -+MODULE_DESCRIPTION("VIA VT82C686[AB] high speed serial port enabler"); -+MODULE_AUTHOR("Juhani Rautiainen "); diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-2.6.35-buildfix.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-2.6.35-buildfix.patch deleted file mode 100644 index 5ae42e926d..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-2.6.35-buildfix.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- linux-2.6.35-rc6-git-mnb0.1/3rdparty/viahss/viahss.c.orig 2010-07-30 21:17:30.000000000 +0300 -+++ linux-2.6.35-rc6-git-mnb0.1/3rdparty/viahss/viahss.c 2010-07-30 23:10:21.324978822 +0300 -@@ -25,7 +25,7 @@ static int __init viahss_init(void) - { - struct pci_dev *pcidev = NULL; - unsigned char confval,val; -- pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); -+ pcidev = pci_get_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); - if (pcidev) { - spin_lock_irq(&driver_lock); - /* start config */ -@@ -55,7 +55,7 @@ static void __exit viahss_exit(void) - { - struct pci_dev *pcidev = NULL; - unsigned char confval,val; -- pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); -+ pcidev = pci_get_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL); - if (pcidev) { - spin_lock_irq(&driver_lock); - /* start config */ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-3.0-buildfix.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-3.0-buildfix.patch deleted file mode 100644 index 7db738810a..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-3.0-buildfix.patch +++ /dev/null @@ -1,19 +0,0 @@ - -fix build with 3.0 - -Signed-off-by: Thomas Backlund - - 3rdparty/viahss/viahss.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/3rdparty/viahss/viahss.c.orig 2011-07-15 02:37:27.000000000 +0300 -+++ a/3rdparty/viahss/viahss.c 2011-07-15 13:48:13.204291256 +0300 -@@ -19,7 +19,7 @@ - const unsigned short confindex=0x3F0,confdata=0x3F1; - const unsigned char spcidx=0xEE; - --spinlock_t driver_lock = SPIN_LOCK_UNLOCKED; -+DEFINE_SPINLOCK(driver_lock); - - static int __init viahss_init(void) - { diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-Kconfig-Makefile.patch deleted file mode 100644 index 348b2cd400..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-Kconfig-Makefile.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- linux/3rdparty/Kconfig.orig 2019-05-31 23:33:39.796256889 +0300 -+++ linux/3rdparty/Kconfig 2019-05-31 23:37:16.378970236 +0300 -@@ -5,5 +5,6 @@ menu "External 3rdparty kernel additions" - source "3rdparty/ndiswrapper/Kconfig" - source "3rdparty/rtl8812au/Kconfig" - source "3rdparty/rtl8723de/Kconfig" -+source "3rdparty/viahss/Kconfig" - - endmenu ---- linux/3rdparty/Makefile.orig 2019-05-31 23:33:57.608644657 +0300 -+++ linux/3rdparty/Makefile 2019-05-31 23:37:39.711477814 +0300 -@@ -4,3 +4,4 @@ obj- := 3rdparty.o # Dummy rule to forc - obj-$(CONFIG_NDISWRAPPER) += ndiswrapper/ - obj-$(CONFIG_RTL8812AU) += rtl8812au/ - obj-$(CONFIG_RTL8723DE) += rtl8723de/ -+obj-$(CONFIG_VIAHSS) += viahss/ diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-config.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-config.patch deleted file mode 100644 index 0d1bdbd3a0..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-config.patch +++ /dev/null @@ -1,18 +0,0 @@ -linux/config.h is gone in 2.6.21 - ---- - 3rdparty/viahss/viahss.c | 1 0 + 1 - 0 ! - 1 files changed, 1 deletion(-) - -Index: linux-2.6.21/3rdparty/viahss/viahss.c -=================================================================== ---- linux-2.6.21.orig/3rdparty/viahss/viahss.c 2003-07-17 08:49:59.000000000 +0200 -+++ linux-2.6.21/3rdparty/viahss/viahss.c 2007-05-14 17:06:56.000000000 +0200 -@@ -12,7 +12,6 @@ - */ - - #include --#include - #include - #include - #include diff --git a/kernel/tools/perf/files/patches/mageia/3rd-viahss-module-license.patch b/kernel/tools/perf/files/patches/mageia/3rd-viahss-module-license.patch deleted file mode 100644 index 540538f2f8..0000000000 --- a/kernel/tools/perf/files/patches/mageia/3rd-viahss-module-license.patch +++ /dev/null @@ -1,7 +0,0 @@ ---- linux-2.6.25/3rdparty/viahss/viahss.c.orig 2008-06-28 22:50:05.000000000 +0300 -+++ linux-2.6.25/3rdparty/viahss/viahss.c 2008-06-29 14:26:55.000000000 +0300 -@@ -80,3 +80,4 @@ module_init(viahss_init); - module_exit(viahss_exit); - MODULE_DESCRIPTION("VIA VT82C686[AB] high speed serial port enabler"); - MODULE_AUTHOR("Juhani Rautiainen "); -+MODULE_LICENSE("GPL"); diff --git a/kernel/tools/perf/files/patches/mageia/CVE-2019-12379.patch b/kernel/tools/perf/files/patches/mageia/CVE-2019-12379.patch deleted file mode 100644 index 04d16049ac..0000000000 --- a/kernel/tools/perf/files/patches/mageia/CVE-2019-12379.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 84ecc2f6eb1cb12e6d44818f94fa49b50f06e6ac Mon Sep 17 00:00:00 2001 -From: Gen Zhang -Date: Thu, 23 May 2019 08:34:52 +0800 -Subject: consolemap: Fix a memory leaking bug in drivers/tty/vt/consolemap.c - -In function con_insert_unipair(), when allocation for p2 and p1[n] -fails, ENOMEM is returned, but previously allocated p1 is not freed, -remains as leaking memory. Thus we should free p1 as well when this -allocation fails. - -Signed-off-by: Gen Zhang -Reviewed-by: Kees Cook -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/vt/consolemap.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c -index b28aa0d289f8..79fcc96cc7c0 100644 ---- a/drivers/tty/vt/consolemap.c -+++ b/drivers/tty/vt/consolemap.c -@@ -489,7 +489,11 @@ con_insert_unipair(struct uni_pagedir *p, u_short unicode, u_short fontpos) - p2 = p1[n = (unicode >> 6) & 0x1f]; - if (!p2) { - p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); -- if (!p2) return -ENOMEM; -+ if (!p2) { -+ kfree(p1); -+ p->uni_pgdir[n] = NULL; -+ return -ENOMEM; -+ } - memset(p2, 0xff, 64*sizeof(u16)); /* No glyphs for the characters (yet) */ - } - --- -cgit 1.2-0.3.lf.el7 - diff --git a/kernel/tools/perf/files/patches/mageia/CVE-2020-16119-DCCP-CCID-structure-use-after-free.patch b/kernel/tools/perf/files/patches/mageia/CVE-2020-16119-DCCP-CCID-structure-use-after-free.patch deleted file mode 100644 index 7eb981e458..0000000000 --- a/kernel/tools/perf/files/patches/mageia/CVE-2020-16119-DCCP-CCID-structure-use-after-free.patch +++ /dev/null @@ -1,305 +0,0 @@ -From MAILER-DAEMON Wed Oct 14 16:34:37 2020 -From: Kleber Sacilotto de Souza -To: netdev@vger.kernel.org -Cc: Gerrit Renker , "David S. Miller" , Jakub Kicinski , Thadeu Lima de Souza Cascardo , "Gustavo A. R. Silva" , "Alexander A. Klimov" , Kees Cook , Eric Dumazet , Alexey Kodanev , dccp@vger.kernel.org, linux-kernel@vger.kernel.org -Subject: [PATCH 1/2] dccp: ccid: move timers to struct dccp_sock -Date: Tue, 13 Oct 2020 19:18:48 +0200 -Message-Id: <20201013171849.236025-2-kleber.souza@canonical.com> -In-Reply-To: <20201013171849.236025-1-kleber.souza@canonical.com> -References: <20201013171849.236025-1-kleber.souza@canonical.com> -List-ID: -X-Mailing-List: linux-kernel@vger.kernel.org -MIME-Version: 1.0 -Content-Type: text/plain; charset="utf-8" -Content-Transfer-Encoding: 7bit - -From: Thadeu Lima de Souza Cascardo - -When dccps_hc_tx_ccid is freed, ccid timers may still trigger. The reason -del_timer_sync can't be used is because this relies on keeping a reference -to struct sock. But as we keep a pointer to dccps_hc_tx_ccid and free that -during disconnect, the timer should really belong to struct dccp_sock. - -This addresses CVE-2020-16119. - -Fixes: 839a6094140a (net: dccp: Convert timers to use timer_setup()) -Signed-off-by: Kleber Sacilotto de Souza -Signed-off-by: Thadeu Lima de Souza Cascardo -Acked-bd: Richard Sailer ---- - include/linux/dccp.h | 2 ++ - net/dccp/ccids/ccid2.c | 32 +++++++++++++++++++------------- - net/dccp/ccids/ccid3.c | 30 ++++++++++++++++++++---------- - 3 files changed, 41 insertions(+), 23 deletions(-) - -diff --git a/include/linux/dccp.h b/include/linux/dccp.h -index 07e547c02fd8..504afa1a4be6 100644 ---- a/include/linux/dccp.h -+++ b/include/linux/dccp.h -@@ -259,6 +259,7 @@ struct dccp_ackvec; - * @dccps_sync_scheduled - flag which signals "send out-of-band message soon" - * @dccps_xmitlet - tasklet scheduled by the TX CCID to dequeue data packets - * @dccps_xmit_timer - used by the TX CCID to delay sending (rate-based pacing) -+ * @dccps_ccid_timer - used by the CCIDs - * @dccps_syn_rtt - RTT sample from Request/Response exchange (in usecs) - */ - struct dccp_sock { -@@ -303,6 +304,7 @@ struct dccp_sock { - __u8 dccps_sync_scheduled:1; - struct tasklet_struct dccps_xmitlet; - struct timer_list dccps_xmit_timer; -+ struct timer_list dccps_ccid_timer; - }; - - static inline struct dccp_sock *dccp_sk(const struct sock *sk) -diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c -index 3da1f77bd039..dbca1f1e2449 100644 ---- a/net/dccp/ccids/ccid2.c -+++ b/net/dccp/ccids/ccid2.c -@@ -126,21 +126,26 @@ static void dccp_tasklet_schedule(struct sock *sk) - - static void ccid2_hc_tx_rto_expire(struct timer_list *t) - { -- struct ccid2_hc_tx_sock *hc = from_timer(hc, t, tx_rtotimer); -- struct sock *sk = hc->sk; -- const bool sender_was_blocked = ccid2_cwnd_network_limited(hc); -+ struct dccp_sock *dp = from_timer(dp, t, dccps_ccid_timer); -+ struct sock *sk = (struct sock *)dp; -+ struct ccid2_hc_tx_sock *hc; -+ bool sender_was_blocked; - - bh_lock_sock(sk); -+ -+ if (inet_sk_state_load(sk) == DCCP_CLOSED) -+ goto out; -+ -+ hc = ccid_priv(dp->dccps_hc_tx_ccid); -+ sender_was_blocked = ccid2_cwnd_network_limited(hc); -+ - if (sock_owned_by_user(sk)) { -- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + HZ / 5); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + HZ / 5); - goto out; - } - - ccid2_pr_debug("RTO_EXPIRE\n"); - -- if (sk->sk_state == DCCP_CLOSED) -- goto out; -- - /* back-off timer */ - hc->tx_rto <<= 1; - if (hc->tx_rto > DCCP_RTO_MAX) -@@ -166,7 +171,7 @@ static void ccid2_hc_tx_rto_expire(struct timer_list *t) - if (sender_was_blocked) - dccp_tasklet_schedule(sk); - /* restart backed-off timer */ -- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto); - out: - bh_unlock_sock(sk); - sock_put(sk); -@@ -330,7 +335,7 @@ static void ccid2_hc_tx_packet_sent(struct sock *sk, unsigned int len) - } - #endif - -- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto); - - #ifdef CONFIG_IP_DCCP_CCID2_DEBUG - do { -@@ -700,9 +705,9 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) - - /* restart RTO timer if not all outstanding data has been acked */ - if (hc->tx_pipe == 0) -- sk_stop_timer(sk, &hc->tx_rtotimer); -+ sk_stop_timer(sk, &dp->dccps_ccid_timer); - else -- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto); - done: - /* check if incoming Acks allow pending packets to be sent */ - if (sender_was_blocked && !ccid2_cwnd_network_limited(hc)) -@@ -737,17 +742,18 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk) - hc->tx_last_cong = hc->tx_lsndtime = hc->tx_cwnd_stamp = ccid2_jiffies32; - hc->tx_cwnd_used = 0; - hc->sk = sk; -- timer_setup(&hc->tx_rtotimer, ccid2_hc_tx_rto_expire, 0); -+ timer_setup(&dp->dccps_ccid_timer, ccid2_hc_tx_rto_expire, 0); - INIT_LIST_HEAD(&hc->tx_av_chunks); - return 0; - } - - static void ccid2_hc_tx_exit(struct sock *sk) - { -+ struct dccp_sock *dp = dccp_sk(sk); - struct ccid2_hc_tx_sock *hc = ccid2_hc_tx_sk(sk); - int i; - -- sk_stop_timer(sk, &hc->tx_rtotimer); -+ sk_stop_timer(sk, &dp->dccps_ccid_timer); - - for (i = 0; i < hc->tx_seqbufc; i++) - kfree(hc->tx_seqbuf[i]); -diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c -index b9ee1a4a8955..685f4d046c0d 100644 ---- a/net/dccp/ccids/ccid3.c -+++ b/net/dccp/ccids/ccid3.c -@@ -184,17 +184,24 @@ static inline void ccid3_hc_tx_update_win_count(struct ccid3_hc_tx_sock *hc, - - static void ccid3_hc_tx_no_feedback_timer(struct timer_list *t) - { -- struct ccid3_hc_tx_sock *hc = from_timer(hc, t, tx_no_feedback_timer); -- struct sock *sk = hc->sk; -+ struct dccp_sock *dp = from_timer(dp, t, dccps_ccid_timer); -+ struct ccid3_hc_tx_sock *hc; -+ struct sock *sk = (struct sock *)dp; - unsigned long t_nfb = USEC_PER_SEC / 5; - - bh_lock_sock(sk); -+ -+ if (inet_sk_state_load(sk) == DCCP_CLOSED) -+ goto out; -+ - if (sock_owned_by_user(sk)) { - /* Try again later. */ - /* XXX: set some sensible MIB */ - goto restart_timer; - } - -+ hc = ccid_priv(dp->dccps_hc_tx_ccid); -+ - ccid3_pr_debug("%s(%p, state=%s) - entry\n", dccp_role(sk), sk, - ccid3_tx_state_name(hc->tx_state)); - -@@ -250,8 +257,8 @@ static void ccid3_hc_tx_no_feedback_timer(struct timer_list *t) - t_nfb = max(hc->tx_t_rto, 2 * hc->tx_t_ipi); - - restart_timer: -- sk_reset_timer(sk, &hc->tx_no_feedback_timer, -- jiffies + usecs_to_jiffies(t_nfb)); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, -+ jiffies + usecs_to_jiffies(t_nfb)); - out: - bh_unlock_sock(sk); - sock_put(sk); -@@ -280,7 +287,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb) - return -EBADMSG; - - if (hc->tx_state == TFRC_SSTATE_NO_SENT) { -- sk_reset_timer(sk, &hc->tx_no_feedback_timer, (jiffies + -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, (jiffies + - usecs_to_jiffies(TFRC_INITIAL_TIMEOUT))); - hc->tx_last_win_count = 0; - hc->tx_t_last_win_count = now; -@@ -354,6 +361,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, unsigned int len) - static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) - { - struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); -+ struct dccp_sock *dp = dccp_sk(sk); - struct tfrc_tx_hist_entry *acked; - ktime_t now; - unsigned long t_nfb; -@@ -420,7 +428,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) - (unsigned int)(hc->tx_x >> 6)); - - /* unschedule no feedback timer */ -- sk_stop_timer(sk, &hc->tx_no_feedback_timer); -+ sk_stop_timer(sk, &dp->dccps_ccid_timer); - - /* - * As we have calculated new ipi, delta, t_nom it is possible -@@ -445,8 +453,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) - "expire in %lu jiffies (%luus)\n", - dccp_role(sk), sk, usecs_to_jiffies(t_nfb), t_nfb); - -- sk_reset_timer(sk, &hc->tx_no_feedback_timer, -- jiffies + usecs_to_jiffies(t_nfb)); -+ sk_reset_timer(sk, &dp->dccps_ccid_timer, -+ jiffies + usecs_to_jiffies(t_nfb)); - } - - static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type, -@@ -488,21 +496,23 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type, - - static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk) - { -+ struct dccp_sock *dp = dccp_sk(sk); - struct ccid3_hc_tx_sock *hc = ccid_priv(ccid); - - hc->tx_state = TFRC_SSTATE_NO_SENT; - hc->tx_hist = NULL; - hc->sk = sk; -- timer_setup(&hc->tx_no_feedback_timer, -+ timer_setup(&dp->dccps_ccid_timer, - ccid3_hc_tx_no_feedback_timer, 0); - return 0; - } - - static void ccid3_hc_tx_exit(struct sock *sk) - { -+ struct dccp_sock *dp = dccp_sk(sk); - struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); - -- sk_stop_timer(sk, &hc->tx_no_feedback_timer); -+ sk_stop_timer(sk, &dp->dccps_ccid_timer); - tfrc_tx_hist_purge(&hc->tx_hist); - } - --- -2.25.1 - - -From MAILER-DAEMON Wed Oct 14 16:34:37 2020 -From: Kleber Sacilotto de Souza -To: netdev@vger.kernel.org -Cc: Gerrit Renker , "David S. Miller" , Jakub Kicinski , Thadeu Lima de Souza Cascardo , "Gustavo A. R. Silva" , "Alexander A. Klimov" , Kees Cook , Eric Dumazet , Alexey Kodanev , dccp@vger.kernel.org, linux-kernel@vger.kernel.org -Subject: [PATCH 2/2] Revert "dccp: don't free ccid2_hc_tx_sock struct in dccp_disconnect()" -Date: Tue, 13 Oct 2020 19:18:49 +0200 -Message-Id: <20201013171849.236025-3-kleber.souza@canonical.com> -In-Reply-To: <20201013171849.236025-1-kleber.souza@canonical.com> -References: <20201013171849.236025-1-kleber.souza@canonical.com> -List-ID: -X-Mailing-List: linux-kernel@vger.kernel.org -MIME-Version: 1.0 -Content-Type: text/plain; charset="utf-8" -Content-Transfer-Encoding: 7bit - -From: Thadeu Lima de Souza Cascardo - -This reverts commit 2677d20677314101293e6da0094ede7b5526d2b1. - -This fixes an issue that after disconnect, dccps_hc_tx_ccid will still be -kept, allowing the socket to be reused as a listener socket, and the cloned -socket will free its dccps_hc_tx_ccid, leading to a later use after free, -when the listener socket is closed. - -This addresses CVE-2020-16119. - -Fixes: 2677d2067731 (dccp: don't free ccid2_hc_tx_sock struct in dccp_disconnect()) -Reported-by: Hadar Manor -Signed-off-by: Kleber Sacilotto de Souza -Signed-off-by: Thadeu Lima de Souza Cascardo -Acked-by: Richard Sailer ---- - net/dccp/proto.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/dccp/proto.c b/net/dccp/proto.c -index 6d705d90c614..359e848dba6c 100644 ---- a/net/dccp/proto.c -+++ b/net/dccp/proto.c -@@ -279,7 +279,9 @@ int dccp_disconnect(struct sock *sk, int flags) - - dccp_clear_xmit_timers(sk); - ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk); -+ ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk); - dp->dccps_hc_rx_ccid = NULL; -+ dp->dccps_hc_tx_ccid = NULL; - - __skb_queue_purge(&sk->sk_receive_queue); - __skb_queue_purge(&sk->sk_write_queue); --- -2.25.1 - - diff --git a/kernel/tools/perf/files/patches/mageia/MAINTAINERS-git-github-https-github.com-for-terrelln.patch b/kernel/tools/perf/files/patches/mageia/MAINTAINERS-git-github-https-github.com-for-terrelln.patch new file mode 100644 index 0000000000..0a13fff425 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/MAINTAINERS-git-github-https-github.com-for-terrelln.patch @@ -0,0 +1,33 @@ +From 894c792e3e24c2c15d8aac15aa89ec144468e1b0 Mon Sep 17 00:00:00 2001 +From: Palmer Dabbelt +Date: Thu, 13 Oct 2022 14:46:36 -0700 +Subject: [PATCH 2/6] MAINTAINERS: git://github -> https://github.com for + terrelln + +Github deprecated the git:// links about a year ago, so let's move to +the https:// URLs instead. + +Reported-by: Conor Dooley +Link: https://github.blog/2021-09-01-improving-git-protocol-security-github/ +Signed-off-by: Palmer Dabbelt +Signed-off-by: Nick Terrell +--- + MAINTAINERS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/MAINTAINERS b/MAINTAINERS +index e04d944005ba..4a2b7a9325dc 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -22800,7 +22800,7 @@ ZSTD + M: Nick Terrell + S: Maintained + B: https://github.com/facebook/zstd/issues +-T: git git://github.com/terrelln/linux.git ++T: git https://github.com/terrelln/linux.git + F: include/linux/zstd* + F: lib/zstd/ + F: lib/decompress_unzstd.c +-- +2.30.6 + diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-symbol-exports.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-symbol-exports.patch deleted file mode 100644 index 49e6ec396b..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-symbol-exports.patch +++ /dev/null @@ -1,284 +0,0 @@ -SPDX-License-Identifier: GPL-2.0 -aufs5.x-rcN standalone patch - -diff --git a/fs/dcache.c b/fs/dcache.c -index ddca6240e0db4..30dec552278dc 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -1390,6 +1390,7 @@ void d_walk(struct dentry *parent, void *data, - seq = 1; - goto again; - } -+EXPORT_SYMBOL_GPL(d_walk); - - struct check_mount { - struct vfsmount *mnt; -@@ -2935,6 +2936,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2) - - write_sequnlock(&rename_lock); - } -+EXPORT_SYMBOL_GPL(d_exchange); - - /** - * d_ancestor - search for an ancestor -diff --git a/fs/exec.c b/fs/exec.c -index 547a2390baf54..18d51d0face68 100644 ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -113,6 +113,7 @@ bool path_noexec(const struct path *path) - return (path->mnt->mnt_flags & MNT_NOEXEC) || - (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC); - } -+EXPORT_SYMBOL_GPL(path_noexec); - - #ifdef CONFIG_USELIB - /* -diff --git a/fs/fcntl.c b/fs/fcntl.c -index 073ca6af500f3..b18afdf81e762 100644 ---- a/fs/fcntl.c -+++ b/fs/fcntl.c -@@ -85,6 +85,7 @@ int setfl(int fd, struct file *filp, unsigned long arg) - out: - return error; - } -+EXPORT_SYMBOL_GPL(setfl); - - static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, - int force) -diff --git a/fs/file_table.c b/fs/file_table.c -index 709ada3151da5..27a3e3c9f2a82 100644 ---- a/fs/file_table.c -+++ b/fs/file_table.c -@@ -162,6 +162,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) - } - return ERR_PTR(-ENFILE); - } -+EXPORT_SYMBOL_GPL(alloc_empty_file); - - /* - * Variant of alloc_empty_file() that doesn't check and modify nr_files. -@@ -376,6 +377,7 @@ void __fput_sync(struct file *file) - } - - EXPORT_SYMBOL(fput); -+EXPORT_SYMBOL_GPL(__fput_sync); - - void __init files_init(void) - { -diff --git a/fs/inode.c b/fs/inode.c -index e7f0c614a58f3..6fe0a92a4c93c 100644 ---- a/fs/inode.c -+++ b/fs/inode.c -@@ -1776,6 +1776,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); - - /** - * touch_atime - update the access time -diff --git a/fs/namespace.c b/fs/namespace.c -index 451dee24a546a..38078cbede431 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -431,6 +431,7 @@ void __mnt_drop_write(struct vfsmount *mnt) - mnt_dec_writers(real_mount(mnt)); - preempt_enable(); - } -+EXPORT_SYMBOL_GPL(__mnt_drop_write); - - /** - * mnt_drop_write - give up write access to a mount -@@ -797,6 +798,7 @@ int is_current_mnt_ns(struct vfsmount *mnt) - { - return check_mnt(real_mount(mnt)); - } -+EXPORT_SYMBOL_GPL(is_current_mnt_ns); - - /* - * vfsmount lock must be held for write -@@ -1961,6 +1963,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, - } - return 0; - } -+EXPORT_SYMBOL_GPL(iterate_mounts); - - static void lock_mnt_tree(struct mount *mnt) - { -diff --git a/fs/notify/group.c b/fs/notify/group.c -index a4a4b1c64d32a..86dc2efb1850c 100644 ---- a/fs/notify/group.c -+++ b/fs/notify/group.c -@@ -100,6 +100,7 @@ void fsnotify_get_group(struct fsnotify_group *group) - { - refcount_inc(&group->refcnt); - } -+EXPORT_SYMBOL_GPL(fsnotify_get_group); - - /* - * Drop a reference to a group. Free it if it's through. -diff --git a/fs/open.c b/fs/open.c -index 9af548fb841b0..2ff09b709f7bf 100644 ---- a/fs/open.c -+++ b/fs/open.c -@@ -65,6 +65,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, - inode_unlock(dentry->d_inode); - return ret; - } -+EXPORT_SYMBOL_GPL(do_truncate); - - long vfs_truncate(const struct path *path, loff_t length) - { -diff --git a/fs/read_write.c b/fs/read_write.c -index 75f764b434184..7582bb3fb634b 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) - inc_syscr(current); - return ret; - } -+EXPORT_SYMBOL_GPL(vfs_read); - - 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_ - file_end_write(file); - return ret; - } -+EXPORT_SYMBOL_GPL(vfs_write); - - /* file_ppos returns &file->f_pos or NULL if file is stream */ - static inline loff_t *file_ppos(struct file *file) -diff --git a/fs/splice.c b/fs/splice.c -index 55b5356262085..c13ac0fbac318 100644 ---- a/fs/splice.c -+++ b/fs/splice.c -@@ -763,6 +763,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out, - return warn_unsupported(out, "write"); - return out->f_op->splice_write(pipe, out, ppos, len, flags); - } -+EXPORT_SYMBOL_GPL(do_splice_from); - - /* - * Attempt to initiate a splice from a file to a pipe. -@@ -787,6 +788,7 @@ long do_splice_to(struct file *in, loff_t *ppos, - return warn_unsupported(in, "read"); - return in->f_op->splice_read(in, ppos, pipe, len, flags); - } -+EXPORT_SYMBOL_GPL(do_splice_to); - - /** - * splice_direct_to_actor - splices data directly between two non-pipes -diff --git a/fs/sync.c b/fs/sync.c -index b7b5a0a0df6ff..fa5c7fba7f1ba 100644 ---- a/fs/sync.c -+++ b/fs/sync.c -@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block *sb, int wait) - sb->s_op->sync_fs(sb, wait); - return __sync_blockdev(sb->s_bdev, wait); - } -+EXPORT_SYMBOL_GPL(__sync_filesystem); - - /* - * Write out and wait upon all dirty data associated with this -diff --git a/fs/xattr.c b/fs/xattr.c -index cd7a563e8bcd4..7d989d57b0f0d 100644 ---- a/fs/xattr.c -+++ b/fs/xattr.c -@@ -360,6 +360,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value, - *xattr_value = value; - return error; - } -+EXPORT_SYMBOL_GPL(vfs_getxattr_alloc); - - 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 7f006a47790cf..be002c3a30833 100644 ---- a/kernel/locking/lockdep.c -+++ b/kernel/locking/lockdep.c -@@ -209,6 +209,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) - */ - return lock_classes + class_idx; - } -+EXPORT_SYMBOL_GPL(lockdep_hlock_class); - #define hlock_class(hlock) lockdep_hlock_class(hlock) - - #ifdef CONFIG_LOCK_STAT -diff --git a/kernel/task_work.c b/kernel/task_work.c -index 8d6e1217c451c..0e73637adda86 100644 ---- a/kernel/task_work.c -+++ b/kernel/task_work.c -@@ -154,3 +154,4 @@ void task_work_run(void) - } while (work); - } - } -+EXPORT_SYMBOL_GPL(task_work_run); -diff --git a/security/security.c b/security/security.c -index a28045dc9e7f6..310cf38efeec7 100644 ---- a/security/security.c -+++ b/security/security.c -@@ -1093,6 +1093,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) - return 0; - return call_int_hook(path_rmdir, 0, dir, dentry); - } -+EXPORT_SYMBOL_GPL(security_path_rmdir); - - int security_path_unlink(const struct path *dir, struct dentry *dentry) - { -@@ -1109,6 +1110,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, - return 0; - return call_int_hook(path_symlink, 0, dir, dentry, old_name); - } -+EXPORT_SYMBOL_GPL(security_path_symlink); - - int security_path_link(struct dentry *old_dentry, const struct path *new_dir, - struct dentry *new_dentry) -@@ -1117,6 +1119,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, - return 0; - return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry); - } -+EXPORT_SYMBOL_GPL(security_path_link); - - int security_path_rename(const struct path *old_dir, struct dentry *old_dentry, - const struct path *new_dir, struct dentry *new_dentry, -@@ -1144,6 +1147,7 @@ int security_path_truncate(const struct path *path) - return 0; - return call_int_hook(path_truncate, 0, path); - } -+EXPORT_SYMBOL_GPL(security_path_truncate); - - int security_path_chmod(const struct path *path, umode_t mode) - { -@@ -1151,6 +1155,7 @@ int security_path_chmod(const struct path *path, umode_t mode) - return 0; - return call_int_hook(path_chmod, 0, path, mode); - } -+EXPORT_SYMBOL_GPL(security_path_chmod); - - int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) - { -@@ -1158,6 +1163,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) - return 0; - return call_int_hook(path_chown, 0, path, uid, gid); - } -+EXPORT_SYMBOL_GPL(security_path_chown); - - int security_path_chroot(const struct path *path) - { -@@ -1258,6 +1264,7 @@ int security_inode_permission(struct inode *inode, int mask) - return 0; - return call_int_hook(inode_permission, 0, inode, mask); - } -+EXPORT_SYMBOL_GPL(security_inode_permission); - - int security_inode_setattr(struct dentry *dentry, struct iattr *attr) - { -@@ -1450,6 +1457,7 @@ int security_file_permission(struct file *file, int mask) - - return fsnotify_perm(file, mask); - } -+EXPORT_SYMBOL_GPL(security_file_permission); - - int security_file_alloc(struct file *file) - { diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-tristate.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-tristate.patch deleted file mode 100644 index f95f4ab698..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10-tristate.patch +++ /dev/null @@ -1,24 +0,0 @@ - -Allow aufs to be built as module. - -Signed-off-by: Thomas Backlund - ---- a/fs/aufs/Kconfig -+++ b/fs/aufs/Kconfig -@@ -1,6 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0 - config AUFS_FS -- bool "Aufs (Advanced multi layered unification filesystem) support" -+ tristate "Aufs (Advanced multi layered unification filesystem) support" - help - Aufs is a stackable unification filesystem such as Unionfs, - which unifies several directories and provides a merged single -@@ -72,7 +72,7 @@ endchoice - - config AUFS_EXPORT - bool "NFS-exportable aufs" -- depends on EXPORTFS = y -+ depends on EXPORTFS - help - If you want to export your mounted aufs via NFS, then enable this - option. There are several requirements for this configuration. diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.10.patch deleted file mode 100644 index 34eab23c6a..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.10.patch +++ /dev/null @@ -1,37866 +0,0 @@ - Documentation/ABI/testing/debugfs-aufs | 55 + - Documentation/ABI/testing/sysfs-aufs | 31 + - Documentation/filesystems/aufs/README | 401 ++++ - Documentation/filesystems/aufs/design/01intro.txt | 158 ++ - Documentation/filesystems/aufs/design/02struct.txt | 245 +++ - .../filesystems/aufs/design/03atomic_open.txt | 72 + - Documentation/filesystems/aufs/design/03lookup.txt | 100 + - Documentation/filesystems/aufs/design/04branch.txt | 61 + - .../filesystems/aufs/design/05wbr_policy.txt | 51 + - Documentation/filesystems/aufs/design/06dirren.dot | 31 + - Documentation/filesystems/aufs/design/06dirren.txt | 89 + - Documentation/filesystems/aufs/design/06fhsm.txt | 105 ++ - Documentation/filesystems/aufs/design/06mmap.txt | 59 + - Documentation/filesystems/aufs/design/06xattr.txt | 81 + - Documentation/filesystems/aufs/design/07export.txt | 45 + - Documentation/filesystems/aufs/design/08shwh.txt | 39 + - Documentation/filesystems/aufs/design/10dynop.txt | 34 + - MAINTAINERS | 13 + - drivers/block/loop.c | 18 + - fs/Kconfig | 1 + - fs/Makefile | 1 + - fs/aufs/Kconfig | 199 ++ - fs/aufs/Makefile | 39 + - fs/aufs/aufs.h | 49 + - fs/aufs/branch.c | 1414 +++++++++++++++ - fs/aufs/branch.h | 351 ++++ - fs/aufs/cpup.c | 1432 +++++++++++++++ - fs/aufs/cpup.h | 87 + - fs/aufs/dbgaufs.c | 513 ++++++ - fs/aufs/dbgaufs.h | 40 + - fs/aufs/dcsub.c | 212 +++ - fs/aufs/dcsub.h | 124 ++ - fs/aufs/debug.c | 428 +++++ - fs/aufs/debug.h | 213 +++ - fs/aufs/dentry.c | 1141 ++++++++++++ - fs/aufs/dentry.h | 255 +++ - fs/aufs/dinfo.c | 541 ++++++ - fs/aufs/dir.c | 750 ++++++++ - fs/aufs/dir.h | 121 ++ - fs/aufs/dirren.c | 1303 +++++++++++++ - fs/aufs/dirren.h | 127 ++ - fs/aufs/dynop.c | 355 ++++ - fs/aufs/dynop.h | 64 + - fs/aufs/export.c | 824 +++++++++ - fs/aufs/f_op.c | 749 ++++++++ - fs/aufs/fhsm.c | 413 +++++ - fs/aufs/file.c | 850 +++++++++ - fs/aufs/file.h | 329 ++++ - fs/aufs/finfo.c | 136 ++ - fs/aufs/fstype.h | 388 ++++ - fs/aufs/hbl.h | 52 + - fs/aufs/hfsnotify.c | 275 +++ - fs/aufs/hfsplus.c | 47 + - fs/aufs/hnotify.c | 702 +++++++ - fs/aufs/i_op.c | 1489 +++++++++++++++ - fs/aufs/i_op_add.c | 923 ++++++++++ - fs/aufs/i_op_del.c | 500 +++++ - fs/aufs/i_op_ren.c | 1237 +++++++++++++ - fs/aufs/iinfo.c | 273 +++ - fs/aufs/inode.c | 516 ++++++ - fs/aufs/inode.h | 685 +++++++ - fs/aufs/ioctl.c | 207 +++ - fs/aufs/lcnt.h | 173 ++ - fs/aufs/loop.c | 135 ++ - fs/aufs/loop.h | 42 + - fs/aufs/magic.mk | 31 + - fs/aufs/module.c | 259 +++ - fs/aufs/module.h | 153 ++ - fs/aufs/mvdown.c | 693 +++++++ - fs/aufs/opts.c | 1867 +++++++++++++++++++ - fs/aufs/opts.h | 212 +++ - fs/aufs/plink.c | 503 +++++ - fs/aufs/poll.c | 38 + - fs/aufs/posix_acl.c | 92 + - fs/aufs/procfs.c | 157 ++ - fs/aufs/rdu.c | 371 ++++ - fs/aufs/rwsem.h | 60 + - fs/aufs/sbinfo.c | 301 +++ - fs/aufs/super.c | 1034 +++++++++++ - fs/aufs/super.h | 574 ++++++ - fs/aufs/sysaufs.c | 80 + - fs/aufs/sysaufs.h | 89 + - fs/aufs/sysfs.c | 338 ++++ - fs/aufs/sysrq.c | 136 ++ - fs/aufs/vdir.c | 883 +++++++++ - fs/aufs/vfsub.c | 872 +++++++++ - fs/aufs/vfsub.h | 341 ++++ - fs/aufs/wbr_policy.c | 817 +++++++++ - fs/aufs/whout.c | 1049 +++++++++++ - fs/aufs/whout.h | 73 + - fs/aufs/wkq.c | 359 ++++ - fs/aufs/wkq.h | 76 + - fs/aufs/xattr.c | 343 ++++ - fs/aufs/xino.c | 1912 ++++++++++++++++++++ - fs/dcache.c | 2 +- - fs/fcntl.c | 4 +- - fs/inode.c | 2 +- - fs/namespace.c | 6 + - fs/proc/base.c | 2 +- - fs/proc/nommu.c | 5 +- - fs/proc/task_mmu.c | 7 +- - fs/proc/task_nommu.c | 5 +- - fs/splice.c | 10 +- - fs/sync.c | 2 +- - include/linux/fs.h | 4 + - include/linux/lockdep.h | 3 + - include/linux/mm.h | 22 + - include/linux/mm_types.h | 2 + - include/linux/mnt_namespace.h | 3 + - include/linux/splice.h | 6 + - include/uapi/linux/aufs_type.h | 439 +++++ - kernel/fork.c | 2 +- - kernel/locking/lockdep.c | 3 +- - mm/Makefile | 2 +- - mm/filemap.c | 2 +- - mm/mmap.c | 33 +- - mm/nommu.c | 10 +- - mm/prfile.c | 86 + - 118 files changed, 36737 insertions(+), 31 deletions(-) - -diff --git a/Documentation/ABI/testing/debugfs-aufs b/Documentation/ABI/testing/debugfs-aufs -new file mode 100644 -index 000000000000..4a6694194ba6 ---- /dev/null -+++ b/Documentation/ABI/testing/debugfs-aufs -@@ -0,0 +1,55 @@ -+What: /debug/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /debug/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /debug/aufs/si_/plink -+Date: Apr 2013 -+Contact: J. R. Okajima -+Description: -+ It has three lines and shows the information about the -+ pseudo-link. The first line is a single number -+ representing a number of buckets. The second line is a -+ number of pseudo-links per buckets (separated by a -+ blank). The last line is a single number representing a -+ total number of psedo-links. -+ When the aufs mount option 'noplink' is specified, it -+ will show "1\n0\n0\n". -+ -+What: /debug/aufs/si_/xib -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xib (External Inode Number -+ Bitmap), its block size and file size. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -+ -+What: /debug/aufs/si_/xi0, xi1 ... xiN and xiN-N -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xino (External Inode Number -+ Translation Table), its link count, block size and file -+ size. -+ Due to the file size limit, there may exist multiple -+ xino files per branch. In this case, "-N" is added to -+ the filename and it corresponds to the index of the -+ internal xino array. "-0" is omitted. -+ When the aufs mount option 'noxino' is specified, Those -+ entries won't exist. About XINO files, see the aufs -+ manual. -+ -+What: /debug/aufs/si_/xigen -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xigen (External Inode -+ Generation Table), its block size and file size. -+ If CONFIG_AUFS_EXPORT is disabled, this entry will not -+ be created. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -diff --git a/Documentation/ABI/testing/sysfs-aufs b/Documentation/ABI/testing/sysfs-aufs -new file mode 100644 -index 000000000000..82f9518495ea ---- /dev/null -+++ b/Documentation/ABI/testing/sysfs-aufs -@@ -0,0 +1,31 @@ -+What: /sys/fs/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /sys/fs/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /sys/fs/aufs/si_/br0, br1 ... brN -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of a member directory (which -+ is called branch) in aufs, and its permission. -+ -+What: /sys/fs/aufs/si_/brid0, brid1 ... bridN -+Date: July 2013 -+Contact: J. R. Okajima -+Description: -+ It shows the id of a member directory (which is called -+ branch) in aufs. -+ -+What: /sys/fs/aufs/si_/xi_path -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of XINO (External Inode Number -+ Bitmap, Translation Table and Generation Table) file -+ even if it is the default path. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -diff --git a/Documentation/filesystems/aufs/README b/Documentation/filesystems/aufs/README -new file mode 100644 -index 000000000000..3e655d357134 ---- /dev/null -+++ b/Documentation/filesystems/aufs/README -@@ -0,0 +1,401 @@ -+ -+Aufs5 -- advanced multi layered unification filesystem version 5.x -+http://aufs.sf.net -+Junjiro R. Okajima -+ -+ -+0. Introduction -+---------------------------------------- -+In the early days, aufs was entirely re-designed and re-implemented -+Unionfs Version 1.x series. Adding many original ideas, approaches, -+improvements and implementations, it became totally different from -+Unionfs while keeping the basic features. -+Later, Unionfs Version 2.x series began taking some of the same -+approaches to aufs1's. -+Unionfs was being developed by Professor Erez Zadok at Stony Brook -+University and his team. -+ -+Aufs5 supports linux-v5.0 and later, If you want older kernel version -+support, -+- for linux-v4.x series, try aufs4-linux.git or aufs4-standalone.git -+- for linux-v3.x series, try aufs3-linux.git or aufs3-standalone.git -+- for linux-v2.6.16 and later, try aufs2-2.6.git, aufs2-standalone.git -+ or aufs1 from CVS on SourceForge. -+ -+Note: it becomes clear that "Aufs was rejected. Let's give it up." -+ According to Christoph Hellwig, linux rejects all union-type -+ filesystems but UnionMount. -+ -+ -+PS. Al Viro seems have a plan to merge aufs as well as overlayfs and -+ UnionMount, and he pointed out an issue around a directory mutex -+ lock and aufs addressed it. But it is still unsure whether aufs will -+ be merged (or any other union solution). -+ -+ -+ -+1. Features -+---------------------------------------- -+- unite several directories into a single virtual filesystem. The member -+ directory is called as a branch. -+- you can specify the permission flags to the branch, which are 'readonly', -+ 'readwrite' and 'whiteout-able.' -+- by upper writable branch, internal copyup and whiteout, files/dirs on -+ readonly branch are modifiable logically. -+- dynamic branch manipulation, add, del. -+- etc... -+ -+Also there are many enhancements in aufs, such as: -+- test only the highest one for the directory permission (dirperm1) -+- copyup on open (coo=) -+- 'move' policy for copy-up between two writable branches, after -+ checking free space. -+- xattr, acl -+- readdir(3) in userspace. -+- keep inode number by external inode number table -+- keep the timestamps of file/dir in internal copyup operation -+- seekable directory, supporting NFS readdir. -+- whiteout is hardlinked in order to reduce the consumption of inodes -+ on branch -+- do not copyup, nor create a whiteout when it is unnecessary -+- revert a single systemcall when an error occurs in aufs -+- remount interface instead of ioctl -+- maintain /etc/mtab by an external command, /sbin/mount.aufs. -+- loopback mounted filesystem as a branch -+- kernel thread for removing the dir who has a plenty of whiteouts -+- support copyup sparse file (a file which has a 'hole' in it) -+- default permission flags for branches -+- selectable permission flags for ro branch, whether whiteout can -+ exist or not -+- export via NFS. -+- support /fs/aufs and /aufs. -+- support multiple writable branches, some policies to select one -+ among multiple writable branches. -+- a new semantics for link(2) and rename(2) to support multiple -+ writable branches. -+- no glibc changes are required. -+- pseudo hardlink (hardlink over branches) -+- allow a direct access manually to a file on branch, e.g. bypassing aufs. -+ including NFS or remote filesystem branch. -+- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. -+- and more... -+ -+Currently these features are dropped temporary from aufs5. -+See design/08plan.txt in detail. -+- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs -+ (robr) -+- statistics of aufs thread (/sys/fs/aufs/stat) -+ -+Features or just an idea in the future (see also design/*.txt), -+- reorder the branch index without del/re-add. -+- permanent xino files for NFSD -+- an option for refreshing the opened files after add/del branches -+- light version, without branch manipulation. (unnecessary?) -+- copyup in userspace -+- inotify in userspace -+- readv/writev -+ -+ -+2. Download -+---------------------------------------- -+There are three GIT trees for aufs5, aufs5-linux.git, -+aufs5-standalone.git, and aufs-util.git. Note that there is no "5" in -+"aufs-util.git." -+While the aufs-util is always necessary, you need either of aufs5-linux -+or aufs5-standalone. -+ -+The aufs5-linux tree includes the whole linux mainline GIT tree, -+git://git.kernel.org/.../torvalds/linux.git. -+And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot -+build aufs5 as an external kernel module. -+Several extra patches are not included in this tree. Only -+aufs5-standalone tree contains them. They are described in the later -+section "Configuration and Compilation." -+ -+On the other hand, the aufs5-standalone tree has only aufs source files -+and necessary patches, and you can select CONFIG_AUFS_FS=m. -+But you need to apply all aufs patches manually. -+ -+You will find GIT branches whose name is in form of "aufs5.x" where "x" -+represents the linux kernel version, "linux-5.x". For instance, -+"aufs5.0" is for linux-5.0. For latest "linux-5.x-rcN", use -+"aufs5.x-rcN" branch. -+ -+o aufs5-linux tree -+$ git clone --reference /your/linux/git/tree \ -+ git://github.com/sfjro/aufs5-linux.git aufs5-linux.git -+- if you don't have linux GIT tree, then remove "--reference ..." -+$ cd aufs5-linux.git -+$ git checkout origin/aufs5.0 -+ -+Or You may want to directly git-pull aufs into your linux GIT tree, and -+leave the patch-work to GIT. -+$ cd /your/linux/git/tree -+$ git remote add aufs5 git://github.com/sfjro/aufs5-linux.git -+$ git fetch aufs5 -+$ git checkout -b my5.0 v5.0 -+$ (add your local change...) -+$ git pull aufs5 aufs5.0 -+- now you have v5.0 + your_changes + aufs5.0 in you my5.0 branch. -+- you may need to solve some conflicts between your_changes and -+ aufs5.0. in this case, git-rerere is recommended so that you can -+ solve the similar conflicts automatically when you upgrade to 5.1 or -+ later in the future. -+ -+o aufs5-standalone tree -+$ git clone git://github.com/sfjro/aufs5-standalone.git aufs5-standalone.git -+$ cd aufs5-standalone.git -+$ git checkout origin/aufs5.0 -+ -+o aufs-util tree -+$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git -+- note that the public aufs-util.git is on SourceForge instead of -+ GitHUB. -+$ cd aufs-util.git -+$ git checkout origin/aufs5.0 -+ -+Note: The 5.x-rcN branch is to be used with `rc' kernel versions ONLY. -+The minor version number, 'x' in '5.x', of aufs may not always -+follow the minor version number of the kernel. -+Because changes in the kernel that cause the use of a new -+minor version number do not always require changes to aufs-util. -+ -+Since aufs-util has its own minor version number, you may not be -+able to find a GIT branch in aufs-util for your kernel's -+exact minor version number. -+In this case, you should git-checkout the branch for the -+nearest lower number. -+ -+For (an unreleased) example: -+If you are using "linux-5.10" and the "aufs5.10" branch -+does not exist in aufs-util repository, then "aufs5.9", "aufs5.8" -+or something numerically smaller is the branch for your kernel. -+ -+Also you can view all branches by -+ $ git branch -a -+ -+ -+3. Configuration and Compilation -+---------------------------------------- -+Make sure you have git-checkout'ed the correct branch. -+ -+For aufs5-linux tree, -+- enable CONFIG_AUFS_FS. -+- set other aufs configurations if necessary. -+ -+For aufs5-standalone tree, -+There are several ways to build. -+ -+1. -+- apply ./aufs5-kbuild.patch to your kernel source files. -+- apply ./aufs5-base.patch too. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too, if you have a plan to set -+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs5-standalone.patch. -+- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your -+ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. -+- enable CONFIG_AUFS_FS, you can select either -+ =m or =y. -+- and build your kernel as usual. -+- install the built kernel. -+- install the header files too by "make headers_install" to the -+ directory where you specify. By default, it is $PWD/usr. -+ "make help" shows a brief note for headers_install. -+- and reboot your system. -+ -+2. -+- module only (CONFIG_AUFS_FS=m). -+- apply ./aufs5-base.patch to your kernel source files. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too. -+- build your kernel, don't forget "make headers_install", and reboot. -+- edit ./config.mk and set other aufs configurations if necessary. -+ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes -+ every aufs configurations. -+- build the module by simple "make". -+- you can specify ${KDIR} make variable which points to your kernel -+ source tree. -+- install the files -+ + run "make install" to install the aufs module, or copy the built -+ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply). -+ + run "make install_headers" (instead of headers_install) to install -+ the modified aufs header file (you can specify DESTDIR which is -+ available in aufs standalone version's Makefile only), or copy -+ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever -+ you like manually. By default, the target directory is $PWD/usr. -+- no need to apply aufs5-kbuild.patch, nor copying source files to your -+ kernel source tree. -+ -+Note: The header file aufs_type.h is necessary to build aufs-util -+ as well as "make headers_install" in the kernel source tree. -+ headers_install is subject to be forgotten, but it is essentially -+ necessary, not only for building aufs-util. -+ You may not meet problems without headers_install in some older -+ version though. -+ -+And then, -+- read README in aufs-util, build and install it -+- note that your distribution may contain an obsoleted version of -+ aufs_type.h in /usr/include/linux or something. When you build aufs -+ utilities, make sure that your compiler refers the correct aufs header -+ file which is built by "make headers_install." -+- if you want to use readdir(3) in userspace or pathconf(3) wrapper, -+ then run "make install_ulib" too. And refer to the aufs manual in -+ detail. -+ -+There several other patches in aufs5-standalone.git. They are all -+optional. When you meet some problems, they will help you. -+- aufs5-loopback.patch -+ Supports a nested loopback mount in a branch-fs. This patch is -+ unnecessary until aufs produces a message like "you may want to try -+ another patch for loopback file". -+- proc_mounts.patch -+ When there are many mountpoints and many mount(2)/umount(2) are -+ running, then /proc/mounts may not show the all mountpoints. This -+ patch makes /proc/mounts always show the full mountpoints list. -+ If you don't want to apply this patch and meet such problem, then you -+ need to increase the value of 'ProcMounts_Times' make-variable in -+ aufs-util.git as a second best solution. -+- vfs-ino.patch -+ Modifies a system global kernel internal function get_next_ino() in -+ order to stop assigning 0 for an inode-number. Not directly related to -+ aufs, but recommended generally. -+- tmpfs-idr.patch -+ Keeps the tmpfs inode number as the lowest value. Effective to reduce -+ the size of aufs XINO files for tmpfs branch. Also it prevents the -+ duplication of inode number, which is important for backup tools and -+ other utilities. When you find aufs XINO files for tmpfs branch -+ growing too much, try this patch. -+- lockdep-debug.patch -+ Because aufs is not only an ordinary filesystem (callee of VFS), but -+ also a caller of VFS functions for branch filesystems, subclassing of -+ the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging -+ feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will -+ need to apply this debug patch to expand several constant values. -+ If you don't know what LOCKDEP is, then you don't have apply this -+ patch. -+ -+ -+4. Usage -+---------------------------------------- -+At first, make sure aufs-util are installed, and please read the aufs -+manual, aufs.5 in aufs-util.git tree. -+$ man -l aufs.5 -+ -+And then, -+$ mkdir /tmp/rw /tmp/aufs -+# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs -+ -+Here is another example. The result is equivalent. -+# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs -+ Or -+# mount -t aufs -o br:/tmp/rw none /tmp/aufs -+# mount -o remount,append:${HOME} /tmp/aufs -+ -+Then, you can see whole tree of your home dir through /tmp/aufs. If -+you modify a file under /tmp/aufs, the one on your home directory is -+not affected, instead the same named file will be newly created under -+/tmp/rw. And all of your modification to a file will be applied to -+the one under /tmp/rw. This is called the file based Copy on Write -+(COW) method. -+Aufs mount options are described in aufs.5. -+If you run chroot or something and make your aufs as a root directory, -+then you need to customize the shutdown script. See the aufs manual in -+detail. -+ -+Additionally, there are some sample usages of aufs which are a -+diskless system with network booting, and LiveCD over NFS. -+See sample dir in CVS tree on SourceForge. -+ -+ -+5. Contact -+---------------------------------------- -+When you have any problems or strange behaviour in aufs, please let me -+know with: -+- /proc/mounts (instead of the output of mount(8)) -+- /sys/module/aufs/* -+- /sys/fs/aufs/* (if you have them) -+- /debug/aufs/* (if you have them) -+- linux kernel version -+ if your kernel is not plain, for example modified by distributor, -+ the url where i can download its source is necessary too. -+- aufs version which was printed at loading the module or booting the -+ system, instead of the date you downloaded. -+- configuration (define/undefine CONFIG_AUFS_xxx) -+- kernel configuration or /proc/config.gz (if you have it) -+- LSM (linux security module, if you are using) -+- behaviour which you think to be incorrect -+- actual operation, reproducible one is better -+- mailto: aufs-users at lists.sourceforge.net -+ -+Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches, -+and Feature Requests) on SourceForge. Please join and write to -+aufs-users ML. -+ -+ -+6. Acknowledgements -+---------------------------------------- -+Thanks to everyone who have tried and are using aufs, whoever -+have reported a bug or any feedback. -+ -+Especially donators: -+Tomas Matejicek(slax.org) made a donation (much more than once). -+ Since Apr 2010, Tomas M (the author of Slax and Linux Live -+ scripts) is making "doubling" donations. -+ Unfortunately I cannot list all of the donators, but I really -+ appreciate. -+ It ends Aug 2010, but the ordinary donation URL is still available. -+ -+Dai Itasaka made a donation (2007/8). -+Chuck Smith made a donation (2008/4, 10 and 12). -+Henk Schoneveld made a donation (2008/9). -+Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10). -+Francois Dupoux made a donation (2008/11). -+Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public -+ aufs2 GIT tree (2009/2). -+William Grant made a donation (2009/3). -+Patrick Lane made a donation (2009/4). -+The Mail Archive (mail-archive.com) made donations (2009/5). -+Nippy Networks (Ed Wildgoose) made a donation (2009/7). -+New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11). -+Pavel Pronskiy made a donation (2011/2). -+Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy -+ Networks (Ed Wildgoose) made a donation for hardware (2011/3). -+Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and -+11). -+Sam Liddicott made a donation (2011/9). -+Era Scarecrow made a donation (2013/4). -+Bor Ratajc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+POIRETTE Marc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+lauri kasvandik made a donation (2013/5). -+"pemasu from Finland" made a donation (2013/7). -+The Parted Magic Project made a donation (2013/9 and 11). -+Pavel Barta made a donation (2013/10). -+Nikolay Pertsev made a donation (2014/5). -+James B made a donation (2014/7 and 2015/7). -+Stefano Di Biase made a donation (2014/8). -+Daniel Epellei made a donation (2015/1). -+OmegaPhil made a donation (2016/1, 2018/4). -+Tomasz Szewczyk made a donation (2016/4). -+James Burry made a donation (2016/12). -+Carsten Rose made a donation (2018/9). -+Porteus Kiosk made a donation (2018/10). -+ -+Thank you very much. -+Donations are always, including future donations, very important and -+helpful for me to keep on developing aufs. -+ -+ -+7. -+---------------------------------------- -+If you are an experienced user, no explanation is needed. Aufs is -+just a linux filesystem. -+ -+ -+Enjoy! -+ -+# Local variables: ; -+# mode: text; -+# End: ; -diff --git a/Documentation/filesystems/aufs/design/01intro.txt b/Documentation/filesystems/aufs/design/01intro.txt -new file mode 100644 -index 000000000000..7f75ee4a784c ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/01intro.txt -@@ -0,0 +1,158 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Introduction -+---------------------------------------- -+ -+aufs [ei ju: ef es] | /ey-yoo-ef-es/ | [a u f s] -+1. abbrev. for "advanced multi-layered unification filesystem". -+2. abbrev. for "another unionfs". -+3. abbrev. for "auf das" in German which means "on the" in English. -+ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E). -+ But "Filesystem aufs Filesystem" is hard to understand. -+4. abbrev. for "African Urban Fashion Show". -+ -+AUFS is a filesystem with features: -+- multi layered stackable unification filesystem, the member directory -+ is called as a branch. -+- branch permission and attribute, 'readonly', 'real-readonly', -+ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their -+ combination. -+- internal "file copy-on-write". -+- logical deletion, whiteout. -+- dynamic branch manipulation, adding, deleting and changing permission. -+- allow bypassing aufs, user's direct branch access. -+- external inode number translation table and bitmap which maintains the -+ persistent aufs inode number. -+- seekable directory, including NFS readdir. -+- file mapping, mmap and sharing pages. -+- pseudo-link, hardlink over branches. -+- loopback mounted filesystem as a branch. -+- several policies to select one among multiple writable branches. -+- revert a single systemcall when an error occurs in aufs. -+- and more... -+ -+ -+Multi Layered Stackable Unification Filesystem -+---------------------------------------------------------------------- -+Most people already knows what it is. -+It is a filesystem which unifies several directories and provides a -+merged single directory. When users access a file, the access will be -+passed/re-directed/converted (sorry, I am not sure which English word is -+correct) to the real file on the member filesystem. The member -+filesystem is called 'lower filesystem' or 'branch' and has a mode -+'readonly' and 'readwrite.' And the deletion for a file on the lower -+readonly branch is handled by creating 'whiteout' on the upper writable -+branch. -+ -+On LKML, there have been discussions about UnionMount (Jan Blunck, -+Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took -+different approaches to implement the merged-view. -+The former tries putting it into VFS, and the latter implements as a -+separate filesystem. -+(If I misunderstand about these implementations, please let me know and -+I shall correct it. Because it is a long time ago when I read their -+source files last time). -+ -+UnionMount's approach will be able to small, but may be hard to share -+branches between several UnionMount since the whiteout in it is -+implemented in the inode on branch filesystem and always -+shared. According to Bharata's post, readdir does not seems to be -+finished yet. -+There are several missing features known in this implementations such as -+- for users, the inode number may change silently. eg. copy-up. -+- link(2) may break by copy-up. -+- read(2) may get an obsoleted filedata (fstat(2) too). -+- fcntl(F_SETLK) may be broken by copy-up. -+- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after -+ open(O_RDWR). -+ -+In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was -+merged into mainline. This is another implementation of UnionMount as a -+separated filesystem. All the limitations and known problems which -+UnionMount are equally inherited to "overlay" filesystem. -+ -+Unionfs has a longer history. When I started implementing a stackable -+filesystem (Aug 2005), it already existed. It has virtual super_block, -+inode, dentry and file objects and they have an array pointing lower -+same kind objects. After contributing many patches for Unionfs, I -+re-started my project AUFS (Jun 2006). -+ -+In AUFS, the structure of filesystem resembles to Unionfs, but I -+implemented my own ideas, approaches and enhancements and it became -+totally different one. -+ -+Comparing DM snapshot and fs based implementation -+- the number of bytes to be copied between devices is much smaller. -+- the type of filesystem must be one and only. -+- the fs must be writable, no readonly fs, even for the lower original -+ device. so the compression fs will not be usable. but if we use -+ loopback mount, we may address this issue. -+ for instance, -+ mount /cdrom/squashfs.img /sq -+ losetup /sq/ext2.img -+ losetup /somewhere/cow -+ dmsetup "snapshot /dev/loop0 /dev/loop1 ..." -+- it will be difficult (or needs more operations) to extract the -+ difference between the original device and COW. -+- DM snapshot-merge may help a lot when users try merging. in the -+ fs-layer union, users will use rsync(1). -+ -+You may want to read my old paper "Filesystems in LiveCD" -+(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf). -+ -+ -+Several characters/aspects/persona of aufs -+---------------------------------------------------------------------- -+ -+Aufs has several characters, aspects or persona. -+1. a filesystem, callee of VFS helper -+2. sub-VFS, caller of VFS helper for branches -+3. a virtual filesystem which maintains persistent inode number -+4. reader/writer of files on branches such like an application -+ -+1. Callee of VFS Helper -+As an ordinary linux filesystem, aufs is a callee of VFS. For instance, -+unlink(2) from an application reaches sys_unlink() kernel function and -+then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it -+calls filesystem specific unlink operation. Actually aufs implements the -+unlink operation but it behaves like a redirector. -+ -+2. Caller of VFS Helper for Branches -+aufs_unlink() passes the unlink request to the branch filesystem as if -+it were called from VFS. So the called unlink operation of the branch -+filesystem acts as usual. As a caller of VFS helper, aufs should handle -+every necessary pre/post operation for the branch filesystem. -+- acquire the lock for the parent dir on a branch -+- lookup in a branch -+- revalidate dentry on a branch -+- mnt_want_write() for a branch -+- vfs_unlink() for a branch -+- mnt_drop_write() for a branch -+- release the lock on a branch -+ -+3. Persistent Inode Number -+One of the most important issue for a filesystem is to maintain inode -+numbers. This is particularly important to support exporting a -+filesystem via NFS. Aufs is a virtual filesystem which doesn't have a -+backend block device for its own. But some storage is necessary to -+keep and maintain the inode numbers. It may be a large space and may not -+suit to keep in memory. Aufs rents some space from its first writable -+branch filesystem (by default) and creates file(s) on it. These files -+are created by aufs internally and removed soon (currently) keeping -+opened. -+Note: Because these files are removed, they are totally gone after -+ unmounting aufs. It means the inode numbers are not persistent -+ across unmount or reboot. I have a plan to make them really -+ persistent which will be important for aufs on NFS server. -+ -+4. Read/Write Files Internally (copy-on-write) -+Because a branch can be readonly, when you write a file on it, aufs will -+"copy-up" it to the upper writable branch internally. And then write the -+originally requested thing to the file. Generally kernel doesn't -+open/read/write file actively. In aufs, even a single write may cause a -+internal "file copy". This behaviour is very similar to cp(1) command. -+ -+Some people may think it is better to pass such work to user space -+helper, instead of doing in kernel space. Actually I am still thinking -+about it. But currently I have implemented it in kernel space. -diff --git a/Documentation/filesystems/aufs/design/02struct.txt b/Documentation/filesystems/aufs/design/02struct.txt -new file mode 100644 -index 000000000000..0a948e812796 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/02struct.txt -@@ -0,0 +1,245 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Basic Aufs Internal Structure -+ -+Superblock/Inode/Dentry/File Objects -+---------------------------------------------------------------------- -+As like an ordinary filesystem, aufs has its own -+superblock/inode/dentry/file objects. All these objects have a -+dynamically allocated array and store the same kind of pointers to the -+lower filesystem, branch. -+For example, when you build a union with one readwrite branch and one -+readonly, mounted /au, /rw and /ro respectively. -+- /au = /rw + /ro -+- /ro/fileA exists but /rw/fileA -+ -+Aufs lookup operation finds /ro/fileA and gets dentry for that. These -+pointers are stored in a aufs dentry. The array in aufs dentry will be, -+- [0] = NULL (because /rw/fileA doesn't exist) -+- [1] = /ro/fileA -+ -+This style of an array is essentially same to the aufs -+superblock/inode/dentry/file objects. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+branches dynamically, these objects has its own generation. When -+branches are changed, the generation in aufs superblock is -+incremented. And a generation in other object are compared when it is -+accessed. When a generation in other objects are obsoleted, aufs -+refreshes the internal array. -+ -+ -+Superblock -+---------------------------------------------------------------------- -+Additionally aufs superblock has some data for policies to select one -+among multiple writable branches, XIB files, pseudo-links and kobject. -+See below in detail. -+About the policies which supports copy-down a directory, see -+wbr_policy.txt too. -+ -+ -+Branch and XINO(External Inode Number Translation Table) -+---------------------------------------------------------------------- -+Every branch has its own xino (external inode number translation table) -+file. The xino file is created and unlinked by aufs internally. When two -+members of a union exist on the same filesystem, they share the single -+xino file. -+The struct of a xino file is simple, just a sequence of aufs inode -+numbers which is indexed by the lower inode number. -+In the above sample, assume the inode number of /ro/fileA is i111 and -+aufs assigns the inode number i999 for fileA. Then aufs writes 999 as -+4(8) bytes at 111 * 4(8) bytes offset in the xino file. -+ -+When the inode numbers are not contiguous, the xino file will be sparse -+which has a hole in it and doesn't consume as much disk space as it -+might appear. If your branch filesystem consumes disk space for such -+holes, then you should specify 'xino=' option at mounting aufs. -+ -+Aufs has a mount option to free the disk blocks for such holes in XINO -+files on tmpfs or ramdisk. But it is not so effective actually. If you -+meet a problem of disk shortage due to XINO files, then you should try -+"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git. -+The patch localizes the assignment inumbers per tmpfs-mount and avoid -+the holes in XINO files. -+ -+Also a writable branch has three kinds of "whiteout bases". All these -+are existed when the branch is joined to aufs, and their names are -+whiteout-ed doubly, so that users will never see their names in aufs -+hierarchy. -+1. a regular file which will be hardlinked to all whiteouts. -+2. a directory to store a pseudo-link. -+3. a directory to store an "orphan"-ed file temporary. -+ -+1. Whiteout Base -+ When you remove a file on a readonly branch, aufs handles it as a -+ logical deletion and creates a whiteout on the upper writable branch -+ as a hardlink of this file in order not to consume inode on the -+ writable branch. -+2. Pseudo-link Dir -+ See below, Pseudo-link. -+3. Step-Parent Dir -+ When "fileC" exists on the lower readonly branch only and it is -+ opened and removed with its parent dir, and then user writes -+ something into it, then aufs copies-up fileC to this -+ directory. Because there is no other dir to store fileC. After -+ creating a file under this dir, the file is unlinked. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+dynamically, a branch has its own id. When the branch order changes, -+aufs finds the new index by searching the branch id. -+ -+ -+Pseudo-link -+---------------------------------------------------------------------- -+Assume "fileA" exists on the lower readonly branch only and it is -+hardlinked to "fileB" on the branch. When you write something to fileA, -+aufs copies-up it to the upper writable branch. Additionally aufs -+creates a hardlink under the Pseudo-link Directory of the writable -+branch. The inode of a pseudo-link is kept in aufs super_block as a -+simple list. If fileB is read after unlinking fileA, aufs returns -+filedata from the pseudo-link instead of the lower readonly -+branch. Because the pseudo-link is based upon the inode, to keep the -+inode number by xino (see above) is essentially necessary. -+ -+All the hardlinks under the Pseudo-link Directory of the writable branch -+should be restored in a proper location later. Aufs provides a utility -+to do this. The userspace helpers executed at remounting and unmounting -+aufs by default. -+During this utility is running, it puts aufs into the pseudo-link -+maintenance mode. In this mode, only the process which began the -+maintenance mode (and its child processes) is allowed to operate in -+aufs. Some other processes which are not related to the pseudo-link will -+be allowed to run too, but the rest have to return an error or wait -+until the maintenance mode ends. If a process already acquires an inode -+mutex (in VFS), it has to return an error. -+ -+ -+XIB(external inode number bitmap) -+---------------------------------------------------------------------- -+Addition to the xino file per a branch, aufs has an external inode number -+bitmap in a superblock object. It is also an internal file such like a -+xino file. -+It is a simple bitmap to mark whether the aufs inode number is in-use or -+not. -+To reduce the file I/O, aufs prepares a single memory page to cache xib. -+ -+As well as XINO files, aufs has a feature to truncate/refresh XIB to -+reduce the number of consumed disk blocks for these files. -+ -+ -+Virtual or Vertical Dir, and Readdir in Userspace -+---------------------------------------------------------------------- -+In order to support multiple layers (branches), aufs readdir operation -+constructs a virtual dir block on memory. For readdir, aufs calls -+vfs_readdir() internally for each dir on branches, merges their entries -+with eliminating the whiteout-ed ones, and sets it to file (dir) -+object. So the file object has its entry list until it is closed. The -+entry list will be updated when the file position is zero and becomes -+obsoleted. This decision is made in aufs automatically. -+ -+The dynamically allocated memory block for the name of entries has a -+unit of 512 bytes (by default) and stores the names contiguously (no -+padding). Another block for each entry is handled by kmem_cache too. -+During building dir blocks, aufs creates hash list and judging whether -+the entry is whiteouted by its upper branch or already listed. -+The merged result is cached in the corresponding inode object and -+maintained by a customizable life-time option. -+ -+Some people may call it can be a security hole or invite DoS attack -+since the opened and once readdir-ed dir (file object) holds its entry -+list and becomes a pressure for system memory. But I'd say it is similar -+to files under /proc or /sys. The virtual files in them also holds a -+memory page (generally) while they are opened. When an idea to reduce -+memory for them is introduced, it will be applied to aufs too. -+For those who really hate this situation, I've developed readdir(3) -+library which operates this merging in userspace. You just need to set -+LD_PRELOAD environment variable, and aufs will not consume no memory in -+kernel space for readdir(3). -+ -+ -+Workqueue -+---------------------------------------------------------------------- -+Aufs sometimes requires privilege access to a branch. For instance, -+in copy-up/down operation. When a user process is going to make changes -+to a file which exists in the lower readonly branch only, and the mode -+of one of ancestor directories may not be writable by a user -+process. Here aufs copy-up the file with its ancestors and they may -+require privilege to set its owner/group/mode/etc. -+This is a typical case of a application character of aufs (see -+Introduction). -+ -+Aufs uses workqueue synchronously for this case. It creates its own -+workqueue. The workqueue is a kernel thread and has privilege. Aufs -+passes the request to call mkdir or write (for example), and wait for -+its completion. This approach solves a problem of a signal handler -+simply. -+If aufs didn't adopt the workqueue and changed the privilege of the -+process, then the process may receive the unexpected SIGXFSZ or other -+signals. -+ -+Also aufs uses the system global workqueue ("events" kernel thread) too -+for asynchronous tasks, such like handling inotify/fsnotify, re-creating a -+whiteout base and etc. This is unrelated to a privilege. -+Most of aufs operation tries acquiring a rw_semaphore for aufs -+superblock at the beginning, at the same time waits for the completion -+of all queued asynchronous tasks. -+ -+ -+Whiteout -+---------------------------------------------------------------------- -+The whiteout in aufs is very similar to Unionfs's. That is represented -+by its filename. UnionMount takes an approach of a file mode, but I am -+afraid several utilities (find(1) or something) will have to support it. -+ -+Basically the whiteout represents "logical deletion" which stops aufs to -+lookup further, but also it represents "dir is opaque" which also stop -+further lookup. -+ -+In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively. -+In order to make several functions in a single systemcall to be -+revertible, aufs adopts an approach to rename a directory to a temporary -+unique whiteouted name. -+For example, in rename(2) dir where the target dir already existed, aufs -+renames the target dir to a temporary unique whiteouted name before the -+actual rename on a branch, and then handles other actions (make it opaque, -+update the attributes, etc). If an error happens in these actions, aufs -+simply renames the whiteouted name back and returns an error. If all are -+succeeded, aufs registers a function to remove the whiteouted unique -+temporary name completely and asynchronously to the system global -+workqueue. -+ -+ -+Copy-up -+---------------------------------------------------------------------- -+It is a well-known feature or concept. -+When user modifies a file on a readonly branch, aufs operate "copy-up" -+internally and makes change to the new file on the upper writable branch. -+When the trigger systemcall does not update the timestamps of the parent -+dir, aufs reverts it after copy-up. -+ -+ -+Move-down (aufs3.9 and later) -+---------------------------------------------------------------------- -+"Copy-up" is one of the essential feature in aufs. It copies a file from -+the lower readonly branch to the upper writable branch when a user -+changes something about the file. -+"Move-down" is an opposite action of copy-up. Basically this action is -+ran manually instead of automatically and internally. -+For desgin and implementation, aufs has to consider these issues. -+- whiteout for the file may exist on the lower branch. -+- ancestor directories may not exist on the lower branch. -+- diropq for the ancestor directories may exist on the upper branch. -+- free space on the lower branch will reduce. -+- another access to the file may happen during moving-down, including -+ UDBA (see "Revalidate Dentry and UDBA"). -+- the file should not be hard-linked nor pseudo-linked. they should be -+ handled by auplink utility later. -+ -+Sometimes users want to move-down a file from the upper writable branch -+to the lower readonly or writable branch. For instance, -+- the free space of the upper writable branch is going to run out. -+- create a new intermediate branch between the upper and lower branch. -+- etc. -+ -+For this purpose, use "aumvdown" command in aufs-util.git. -diff --git a/Documentation/filesystems/aufs/design/03atomic_open.txt b/Documentation/filesystems/aufs/design/03atomic_open.txt -new file mode 100644 -index 000000000000..415205649c4c ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/03atomic_open.txt -@@ -0,0 +1,72 @@ -+ -+# Copyright (C) 2015-2020 Junjiro R. Okajima -+ -+Support for a branch who has its ->atomic_open() -+---------------------------------------------------------------------- -+The filesystems who implement its ->atomic_open() are not majority. For -+example NFSv4 does, and aufs should call NFSv4 ->atomic_open, -+particularly for open(O_CREAT|O_EXCL, 0400) case. Other than -+->atomic_open(), NFSv4 returns an error for this open(2). While I am not -+sure whether all filesystems who have ->atomic_open() behave like this, -+but NFSv4 surely returns the error. -+ -+In order to support ->atomic_open() for aufs, there are a few -+approaches. -+ -+A. Introduce aufs_atomic_open() -+ - calls one of VFS:do_last(), lookup_open() or atomic_open() for -+ branch fs. -+B. Introduce aufs_atomic_open() calling create, open and chmod. this is -+ an aufs user Pip Cet's approach -+ - calls aufs_create(), VFS finish_open() and notify_change(). -+ - pass fake-mode to finish_open(), and then correct the mode by -+ notify_change(). -+C. Extend aufs_open() to call branch fs's ->atomic_open() -+ - no aufs_atomic_open(). -+ - aufs_lookup() registers the TID to an aufs internal object. -+ - aufs_create() does nothing when the matching TID is registered, but -+ registers the mode. -+ - aufs_open() calls branch fs's ->atomic_open() when the matching -+ TID is registered. -+D. Extend aufs_open() to re-try branch fs's ->open() with superuser's -+ credential -+ - no aufs_atomic_open(). -+ - aufs_create() registers the TID to an internal object. this info -+ represents "this process created this file just now." -+ - when aufs gets EACCES from branch fs's ->open(), then confirm the -+ registered TID and re-try open() with superuser's credential. -+ -+Pros and cons for each approach. -+ -+A. -+ - straightforward but highly depends upon VFS internal. -+ - the atomic behavaiour is kept. -+ - some of parameters such as nameidata are hard to reproduce for -+ branch fs. -+ - large overhead. -+B. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+C. -+ - the atomic behavaiour is kept. -+ - dirty and tricky. -+ - VFS checks whether the file is created correctly after calling -+ ->create(), which means this approach doesn't work. -+D. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+ - to open a file with superuser's credential and give it to a user -+ process is a bad idea, since the file object keeps the credential -+ in it. It may affect LSM or something. This approach doesn't work -+ either. -+ -+The approach A is ideal, but it hard to implement. So here is a -+variation of A, which is to be implemented. -+ -+A-1. Introduce aufs_atomic_open() -+ - calls branch fs ->atomic_open() if exists. otherwise calls -+ vfs_create() and finish_open(). -+ - the demerit is that the several checks after branch fs -+ ->atomic_open() are lost. in the ordinary case, the checks are -+ done by VFS:do_last(), lookup_open() and atomic_open(). some can -+ be implemented in aufs, but not all I am afraid. -diff --git a/Documentation/filesystems/aufs/design/03lookup.txt b/Documentation/filesystems/aufs/design/03lookup.txt -new file mode 100644 -index 000000000000..0b3b22bc999f ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/03lookup.txt -@@ -0,0 +1,100 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Lookup in a Branch -+---------------------------------------------------------------------- -+Since aufs has a character of sub-VFS (see Introduction), it operates -+lookup for branches as VFS does. It may be a heavy work. But almost all -+lookup operation in aufs is the simplest case, ie. lookup only an entry -+directly connected to its parent. Digging down the directory hierarchy -+is unnecessary. VFS has a function lookup_one_len() for that use, and -+aufs calls it. -+ -+When a branch is a remote filesystem, aufs basically relies upon its -+->d_revalidate(), also aufs forces the hardest revalidate tests for -+them. -+For d_revalidate, aufs implements three levels of revalidate tests. See -+"Revalidate Dentry and UDBA" in detail. -+ -+ -+Test Only the Highest One for the Directory Permission (dirperm1 option) -+---------------------------------------------------------------------- -+Let's try case study. -+- aufs has two branches, upper readwrite and lower readonly. -+ /au = /rw + /ro -+- "dirA" exists under /ro, but /rw. and its mode is 0700. -+- user invoked "chmod a+rx /au/dirA" -+- the internal copy-up is activated and "/rw/dirA" is created and its -+ permission bits are set to world readable. -+- then "/au/dirA" becomes world readable? -+ -+In this case, /ro/dirA is still 0700 since it exists in readonly branch, -+or it may be a natively readonly filesystem. If aufs respects the lower -+branch, it should not respond readdir request from other users. But user -+allowed it by chmod. Should really aufs rejects showing the entries -+under /ro/dirA? -+ -+To be honest, I don't have a good solution for this case. So aufs -+implements 'dirperm1' and 'nodirperm1' mount options, and leave it to -+users. -+When dirperm1 is specified, aufs checks only the highest one for the -+directory permission, and shows the entries. Otherwise, as usual, checks -+every dir existing on all branches and rejects the request. -+ -+As a side effect, dirperm1 option improves the performance of aufs -+because the number of permission check is reduced when the number of -+branch is many. -+ -+ -+Revalidate Dentry and UDBA (User's Direct Branch Access) -+---------------------------------------------------------------------- -+Generally VFS helpers re-validate a dentry as a part of lookup. -+0. digging down the directory hierarchy. -+1. lock the parent dir by its i_mutex. -+2. lookup the final (child) entry. -+3. revalidate it. -+4. call the actual operation (create, unlink, etc.) -+5. unlock the parent dir -+ -+If the filesystem implements its ->d_revalidate() (step 3), then it is -+called. Actually aufs implements it and checks the dentry on a branch is -+still valid. -+But it is not enough. Because aufs has to release the lock for the -+parent dir on a branch at the end of ->lookup() (step 2) and -+->d_revalidate() (step 3) while the i_mutex of the aufs dir is still -+held by VFS. -+If the file on a branch is changed directly, eg. bypassing aufs, after -+aufs released the lock, then the subsequent operation may cause -+something unpleasant result. -+ -+This situation is a result of VFS architecture, ->lookup() and -+->d_revalidate() is separated. But I never say it is wrong. It is a good -+design from VFS's point of view. It is just not suitable for sub-VFS -+character in aufs. -+ -+Aufs supports such case by three level of revalidation which is -+selectable by user. -+1. Simple Revalidate -+ Addition to the native flow in VFS's, confirm the child-parent -+ relationship on the branch just after locking the parent dir on the -+ branch in the "actual operation" (step 4). When this validation -+ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still -+ checks the validation of the dentry on branches. -+2. Monitor Changes Internally by Inotify/Fsnotify -+ Addition to above, in the "actual operation" (step 4) aufs re-lookup -+ the dentry on the branch, and returns EBUSY if it finds different -+ dentry. -+ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches -+ during it is in cache. When the event is notified, aufs registers a -+ function to kernel 'events' thread by schedule_work(). And the -+ function sets some special status to the cached aufs dentry and inode -+ private data. If they are not cached, then aufs has nothing to -+ do. When the same file is accessed through aufs (step 0-3) later, -+ aufs will detect the status and refresh all necessary data. -+ In this mode, aufs has to ignore the event which is fired by aufs -+ itself. -+3. No Extra Validation -+ This is the simplest test and doesn't add any additional revalidation -+ test, and skip the revalidation in step 4. It is useful and improves -+ aufs performance when system surely hide the aufs branches from user, -+ by over-mounting something (or another method). -diff --git a/Documentation/filesystems/aufs/design/04branch.txt b/Documentation/filesystems/aufs/design/04branch.txt -new file mode 100644 -index 000000000000..0e7bc1075f37 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/04branch.txt -@@ -0,0 +1,61 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Branch Manipulation -+ -+Since aufs supports dynamic branch manipulation, ie. add/remove a branch -+and changing its permission/attribute, there are a lot of works to do. -+ -+ -+Add a Branch -+---------------------------------------------------------------------- -+o Confirm the adding dir exists outside of aufs, including loopback -+ mount, and its various attributes. -+o Initialize the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o Check the owner/group/mode of the directory -+ When the owner/group/mode of the adding directory differs from the -+ existing branch, aufs issues a warning because it may impose a -+ security risk. -+ For example, when a upper writable branch has a world writable empty -+ top directory, a malicious user can create any files on the writable -+ branch directly, like copy-up and modify manually. If something like -+ /etc/{passwd,shadow} exists on the lower readonly branch but the upper -+ writable branch, and the writable branch is world-writable, then a -+ malicious guy may create /etc/passwd on the writable branch directly -+ and the infected file will be valid in aufs. -+ I am afraid it can be a security issue, but aufs can do nothing except -+ producing a warning. -+ -+ -+Delete a Branch -+---------------------------------------------------------------------- -+o Confirm the deleting branch is not busy -+ To be general, there is one merit to adopt "remount" interface to -+ manipulate branches. It is to discard caches. At deleting a branch, -+ aufs checks the still cached (and connected) dentries and inodes. If -+ there are any, then they are all in-use. An inode without its -+ corresponding dentry can be alive alone (for example, inotify/fsnotify case). -+ -+ For the cached one, aufs checks whether the same named entry exists on -+ other branches. -+ If the cached one is a directory, because aufs provides a merged view -+ to users, as long as one dir is left on any branch aufs can show the -+ dir to users. In this case, the branch can be removed from aufs. -+ Otherwise aufs rejects deleting the branch. -+ -+ If any file on the deleting branch is opened by aufs, then aufs -+ rejects deleting. -+ -+ -+Modify the Permission of a Branch -+---------------------------------------------------------------------- -+o Re-initialize or remove the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o rw --> ro: Confirm the modifying branch is not busy -+ Aufs rejects the request if any of these conditions are true. -+ - a file on the branch is mmap-ed. -+ - a regular file on the branch is opened for write and there is no -+ same named entry on the upper branch. -diff --git a/Documentation/filesystems/aufs/design/05wbr_policy.txt b/Documentation/filesystems/aufs/design/05wbr_policy.txt -new file mode 100644 -index 000000000000..f9741c32cbf2 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/05wbr_policy.txt -@@ -0,0 +1,51 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Policies to Select One among Multiple Writable Branches -+---------------------------------------------------------------------- -+When the number of writable branch is more than one, aufs has to decide -+the target branch for file creation or copy-up. By default, the highest -+writable branch which has the parent (or ancestor) dir of the target -+file is chosen (top-down-parent policy). -+By user's request, aufs implements some other policies to select the -+writable branch, for file creation several policies, round-robin, -+most-free-space, and other policies. For copy-up, top-down-parent, -+bottom-up-parent, bottom-up and others. -+ -+As expected, the round-robin policy selects the branch in circular. When -+you have two writable branches and creates 10 new files, 5 files will be -+created for each branch. mkdir(2) systemcall is an exception. When you -+create 10 new directories, all will be created on the same branch. -+And the most-free-space policy selects the one which has most free -+space among the writable branches. The amount of free space will be -+checked by aufs internally, and users can specify its time interval. -+ -+The policies for copy-up is more simple, -+top-down-parent is equivalent to the same named on in create policy, -+bottom-up-parent selects the writable branch where the parent dir -+exists and the nearest upper one from the copyup-source, -+bottom-up selects the nearest upper writable branch from the -+copyup-source, regardless the existence of the parent dir. -+ -+There are some rules or exceptions to apply these policies. -+- If there is a readonly branch above the policy-selected branch and -+ the parent dir is marked as opaque (a variation of whiteout), or the -+ target (creating) file is whiteout-ed on the upper readonly branch, -+ then the result of the policy is ignored and the target file will be -+ created on the nearest upper writable branch than the readonly branch. -+- If there is a writable branch above the policy-selected branch and -+ the parent dir is marked as opaque or the target file is whiteouted -+ on the branch, then the result of the policy is ignored and the target -+ file will be created on the highest one among the upper writable -+ branches who has diropq or whiteout. In case of whiteout, aufs removes -+ it as usual. -+- link(2) and rename(2) systemcalls are exceptions in every policy. -+ They try selecting the branch where the source exists as possible -+ since copyup a large file will take long time. If it can't be, -+ ie. the branch where the source exists is readonly, then they will -+ follow the copyup policy. -+- There is an exception for rename(2) when the target exists. -+ If the rename target exists, aufs compares the index of the branches -+ where the source and the target exists and selects the higher -+ one. If the selected branch is readonly, then aufs follows the -+ copyup policy. -diff --git a/Documentation/filesystems/aufs/design/06dirren.dot b/Documentation/filesystems/aufs/design/06dirren.dot -new file mode 100644 -index 000000000000..2d62bb6dd55f ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/06dirren.dot -@@ -0,0 +1,31 @@ -+ -+// to view this graph, run dot(1) command in GRAPHVIZ. -+ -+digraph G { -+node [shape=box]; -+whinfo [label="detailed info file\n(lower_brid_root-hinum, h_inum, namelen, old name)"]; -+ -+node [shape=oval]; -+ -+aufs_rename -> whinfo [label="store/remove"]; -+ -+node [shape=oval]; -+inode_list [label="h_inum list in branch\ncache"]; -+ -+node [shape=box]; -+whinode [label="h_inum list file"]; -+ -+node [shape=oval]; -+brmgmt [label="br_add/del/mod/umount"]; -+ -+brmgmt -> inode_list [label="create/remove"]; -+brmgmt -> whinode [label="load/store"]; -+ -+inode_list -> whinode [style=dashed,dir=both]; -+ -+aufs_rename -> inode_list [label="add/del"]; -+ -+aufs_lookup -> inode_list [label="search"]; -+ -+aufs_lookup -> whinfo [label="load/remove"]; -+} -diff --git a/Documentation/filesystems/aufs/design/06dirren.txt b/Documentation/filesystems/aufs/design/06dirren.txt -new file mode 100644 -index 000000000000..e23459758504 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/06dirren.txt -@@ -0,0 +1,89 @@ -+ -+# Copyright (C) 2017-2020 Junjiro R. Okajima -+ -+Special handling for renaming a directory (DIRREN) -+---------------------------------------------------------------------- -+First, let's assume we have a simple usecase. -+ -+- /u = /rw + /ro -+- /rw/dirA exists -+- /ro/dirA and /ro/dirA/file exist too -+- there is no dirB on both branches -+- a user issues rename("dirA", "dirB") -+ -+Now, what should aufs behave against this rename(2)? -+There are a few possible cases. -+ -+A. returns EROFS. -+ since dirA exists on a readonly branch which cannot be renamed. -+B. returns EXDEV. -+ it is possible to copy-up dirA (only the dir itself), but the child -+ entries ("file" in this case) should not be. it must be a bad -+ approach to copy-up recursively. -+C. returns a success. -+ even the branch /ro is readonly, aufs tries renaming it. Obviously it -+ is a violation of aufs' policy. -+D. construct an extra information which indicates that /ro/dirA should -+ be handled as the name of dirB. -+ overlayfs has a similar feature called REDIRECT. -+ -+Until now, aufs implements the case B only which returns EXDEV, and -+expects the userspace application behaves like mv(1) which tries -+issueing rename(2) recursively. -+ -+A new aufs feature called DIRREN is introduced which implements the case -+D. There are several "extra information" added. -+ -+1. detailed info per renamed directory -+ path: /rw/dirB/$AUFS_WH_DR_INFO_PFX. -+2. the inode-number list of directories on a branch -+ path: /rw/dirB/$AUFS_WH_DR_BRHINO -+ -+The filename of "detailed info per directory" represents the lower -+branch, and its format is -+- a type of the branch id -+ one of these. -+ + uuid (not implemented yet) -+ + fsid -+ + dev -+- the inode-number of the branch root dir -+ -+And it contains these info in a single regular file. -+- magic number -+- branch's inode-number of the logically renamed dir -+- the name of the before-renamed dir -+ -+The "detailed info per directory" file is created in aufs rename(2), and -+loaded in any lookup. -+The info is considered in lookup for the matching case only. Here -+"matching" means that the root of branch (in the info filename) is same -+to the current looking-up branch. After looking-up the before-renamed -+name, the inode-number is compared. And the matched dentry is used. -+ -+The "inode-number list of directories" is a regular file which contains -+simply the inode-numbers on the branch. The file is created or updated -+in removing the branch, and loaded in adding the branch. Its lifetime is -+equal to the branch. -+The list is refered in lookup, and when the current target inode is -+found in the list, the aufs tries loading the "detailed info per -+directory" and get the changed and valid name of the dir. -+ -+Theoretically these "extra informaiton" may be able to be put into XATTR -+in the dir inode. But aufs doesn't choose this way because -+1. XATTR may not be supported by the branch (or its configuration) -+2. XATTR may have its size limit. -+3. XATTR may be less easy to convert than a regular file, when the -+ format of the info is changed in the future. -+At the same time, I agree that the regular file approach is much slower -+than XATTR approach. So, in the future, aufs may take the XATTR or other -+better approach. -+ -+This DIRREN feature is enabled by aufs configuration, and is activated -+by a new mount option. -+ -+For the more complicated case, there is a work with UDBA option, which -+is to dected the direct access to the branches (by-passing aufs) and to -+maintain the cashes in aufs. Since a single cached aufs dentry may -+contains two names, before- and after-rename, the name comparision in -+UDBA handler may not work correctly. In this case, the behaviour will be -+equivalen to udba=reval case. -diff --git a/Documentation/filesystems/aufs/design/06fhsm.txt b/Documentation/filesystems/aufs/design/06fhsm.txt -new file mode 100644 -index 000000000000..5322ca3b7151 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/06fhsm.txt -@@ -0,0 +1,105 @@ -+ -+# Copyright (C) 2011-2020 Junjiro R. Okajima -+ -+File-based Hierarchical Storage Management (FHSM) -+---------------------------------------------------------------------- -+Hierarchical Storage Management (or HSM) is a well-known feature in the -+storage world. Aufs provides this feature as file-based with multiple -+writable branches, based upon the principle of "Colder, the Lower". -+Here the word "colder" means that the less used files, and "lower" means -+that the position in the order of the stacked branches vertically. -+These multiple writable branches are prioritized, ie. the topmost one -+should be the fastest drive and be used heavily. -+ -+o Characters in aufs FHSM story -+- aufs itself and a new branch attribute. -+- a new ioctl interface to move-down and to establish a connection with -+ the daemon ("move-down" is a converse of "copy-up"). -+- userspace tool and daemon. -+ -+The userspace daemon establishes a connection with aufs and waits for -+the notification. The notified information is very similar to struct -+statfs containing the number of consumed blocks and inodes. -+When the consumed blocks/inodes of a branch exceeds the user-specified -+upper watermark, the daemon activates its move-down process until the -+consumed blocks/inodes reaches the user-specified lower watermark. -+ -+The actual move-down is done by aufs based upon the request from -+user-space since we need to maintain the inode number and the internal -+pointer arrays in aufs. -+ -+Currently aufs FHSM handles the regular files only. Additionally they -+must not be hard-linked nor pseudo-linked. -+ -+ -+o Cowork of aufs and the user-space daemon -+ During the userspace daemon established the connection, aufs sends a -+ small notification to it whenever aufs writes something into the -+ writable branch. But it may cost high since aufs issues statfs(2) -+ internally. So user can specify a new option to cache the -+ info. Actually the notification is controlled by these factors. -+ + the specified cache time. -+ + classified as "force" by aufs internally. -+ Until the specified time expires, aufs doesn't send the info -+ except the forced cases. When aufs decide forcing, the info is always -+ notified to userspace. -+ For example, the number of free inodes is generally large enough and -+ the shortage of it happens rarely. So aufs doesn't force the -+ notification when creating a new file, directory and others. This is -+ the typical case which aufs doesn't force. -+ When aufs writes the actual filedata and the files consumes any of new -+ blocks, the aufs forces notifying. -+ -+ -+o Interfaces in aufs -+- New branch attribute. -+ + fhsm -+ Specifies that the branch is managed by FHSM feature. In other word, -+ participant in the FHSM. -+ When nofhsm is set to the branch, it will not be the source/target -+ branch of the move-down operation. This attribute is set -+ independently from coo and moo attributes, and if you want full -+ FHSM, you should specify them as well. -+- New mount option. -+ + fhsm_sec -+ Specifies a second to suppress many less important info to be -+ notified. -+- New ioctl. -+ + AUFS_CTL_FHSM_FD -+ create a new file descriptor which userspace can read the notification -+ (a subset of struct statfs) from aufs. -+- Module parameter 'brs' -+ It has to be set to 1. Otherwise the new mount option 'fhsm' will not -+ be set. -+- mount helpers /sbin/mount.aufs and /sbin/umount.aufs -+ When there are two or more branches with fhsm attributes, -+ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs -+ terminates it. As a result of remounting and branch-manipulation, the -+ number of branches with fhsm attribute can be one. In this case, -+ /sbin/mount.aufs will terminate the user-space daemon. -+ -+ -+Finally the operation is done as these steps in kernel-space. -+- make sure that, -+ + no one else is using the file. -+ + the file is not hard-linked. -+ + the file is not pseudo-linked. -+ + the file is a regular file. -+ + the parent dir is not opaqued. -+- find the target writable branch. -+- make sure the file is not whiteout-ed by the upper (than the target) -+ branch. -+- make the parent dir on the target branch. -+- mutex lock the inode on the branch. -+- unlink the whiteout on the target branch (if exists). -+- lookup and create the whiteout-ed temporary name on the target branch. -+- copy the file as the whiteout-ed temporary name on the target branch. -+- rename the whiteout-ed temporary name to the original name. -+- unlink the file on the source branch. -+- maintain the internal pointer array and the external inode number -+ table (XINO). -+- maintain the timestamps and other attributes of the parent dir and the -+ file. -+ -+And of course, in every step, an error may happen. So the operation -+should restore the original file state after an error happens. -diff --git a/Documentation/filesystems/aufs/design/06mmap.txt b/Documentation/filesystems/aufs/design/06mmap.txt -new file mode 100644 -index 000000000000..03b71096d508 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/06mmap.txt -@@ -0,0 +1,59 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+mmap(2) -- File Memory Mapping -+---------------------------------------------------------------------- -+In aufs, the file-mapped pages are handled by a branch fs directly, no -+interaction with aufs. It means aufs_mmap() calls the branch fs's -+->mmap(). -+This approach is simple and good, but there is one problem. -+Under /proc, several entries show the mmapped files by its path (with -+device and inode number), and the printed path will be the path on the -+branch fs's instead of virtual aufs's. -+This is not a problem in most cases, but some utilities lsof(1) (and its -+user) may expect the path on aufs. -+ -+To address this issue, aufs adds a new member called vm_prfile in struct -+vm_area_struct (and struct vm_region). The original vm_file points to -+the file on the branch fs in order to handle everything correctly as -+usual. The new vm_prfile points to a virtual file in aufs, and the -+show-functions in procfs refers to vm_prfile if it is set. -+Also we need to maintain several other places where touching vm_file -+such like -+- fork()/clone() copies vma and the reference count of vm_file is -+ incremented. -+- merging vma maintains the ref count too. -+ -+This is not a good approach. It just fakes the printed path. But it -+leaves all behaviour around f_mapping unchanged. This is surely an -+advantage. -+Actually aufs had adopted another complicated approach which calls -+generic_file_mmap() and handles struct vm_operations_struct. In this -+approach, aufs met a hard problem and I could not solve it without -+switching the approach. -+ -+There may be one more another approach which is -+- bind-mount the branch-root onto the aufs-root internally -+- grab the new vfsmount (ie. struct mount) -+- lazy-umount the branch-root internally -+- in open(2) the aufs-file, open the branch-file with the hidden -+ vfsmount (instead of the original branch's vfsmount) -+- ideally this "bind-mount and lazy-umount" should be done atomically, -+ but it may be possible from userspace by the mount helper. -+ -+Adding the internal hidden vfsmount and using it in opening a file, the -+file path under /proc will be printed correctly. This approach looks -+smarter, but is not possible I am afraid. -+- aufs-root may be bind-mount later. when it happens, another hidden -+ vfsmount will be required. -+- it is hard to get the chance to bind-mount and lazy-umount -+ + in kernel-space, FS can have vfsmount in open(2) via -+ file->f_path, and aufs can know its vfsmount. But several locks are -+ already acquired, and if aufs tries to bind-mount and lazy-umount -+ here, then it may cause a deadlock. -+ + in user-space, bind-mount doesn't invoke the mount helper. -+- since /proc shows dev and ino, aufs has to give vma these info. it -+ means a new member vm_prinode will be necessary. this is essentially -+ equivalent to vm_prfile described above. -+ -+I have to give up this "looks-smater" approach. -diff --git a/Documentation/filesystems/aufs/design/06xattr.txt b/Documentation/filesystems/aufs/design/06xattr.txt -new file mode 100644 -index 000000000000..f4076a04a335 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/06xattr.txt -@@ -0,0 +1,81 @@ -+ -+# Copyright (C) 2014-2020 Junjiro R. Okajima -+ -+Listing XATTR/EA and getting the value -+---------------------------------------------------------------------- -+For the inode standard attributes (owner, group, timestamps, etc.), aufs -+shows the values from the topmost existing file. This behaviour is good -+for the non-dir entries since the bahaviour exactly matches the shown -+information. But for the directories, aufs considers all the same named -+entries on the lower branches. Which means, if one of the lower entry -+rejects readdir call, then aufs returns an error even if the topmost -+entry allows it. This behaviour is necessary to respect the branch fs's -+security, but can make users confused since the user-visible standard -+attributes don't match the behaviour. -+To address this issue, aufs has a mount option called dirperm1 which -+checks the permission for the topmost entry only, and ignores the lower -+entry's permission. -+ -+A similar issue can happen around XATTR. -+getxattr(2) and listxattr(2) families behave as if dirperm1 option is -+always set. Otherwise these very unpleasant situation would happen. -+- listxattr(2) may return the duplicated entries. -+- users may not be able to remove or reset the XATTR forever, -+ -+ -+XATTR/EA support in the internal (copy,move)-(up,down) -+---------------------------------------------------------------------- -+Generally the extended attributes of inode are categorized as these. -+- "security" for LSM and capability. -+- "system" for posix ACL, 'acl' mount option is required for the branch -+ fs generally. -+- "trusted" for userspace, CAP_SYS_ADMIN is required. -+- "user" for userspace, 'user_xattr' mount option is required for the -+ branch fs generally. -+ -+Moreover there are some other categories. Aufs handles these rather -+unpopular categories as the ordinary ones, ie. there is no special -+condition nor exception. -+ -+In copy-up, the support for XATTR on the dst branch may differ from the -+src branch. In this case, the copy-up operation will get an error and -+the original user operation which triggered the copy-up will fail. It -+can happen that even all copy-up will fail. -+When both of src and dst branches support XATTR and if an error occurs -+during copying XATTR, then the copy-up should fail obviously. That is a -+good reason and aufs should return an error to userspace. But when only -+the src branch support that XATTR, aufs should not return an error. -+For example, the src branch supports ACL but the dst branch doesn't -+because the dst branch may natively un-support it or temporary -+un-support it due to "noacl" mount option. Of course, the dst branch fs -+may NOT return an error even if the XATTR is not supported. It is -+totally up to the branch fs. -+ -+Anyway when the aufs internal copy-up gets an error from the dst branch -+fs, then aufs tries removing the just copied entry and returns the error -+to the userspace. The worst case of this situation will be all copy-up -+will fail. -+ -+For the copy-up operation, there two basic approaches. -+- copy the specified XATTR only (by category above), and return the -+ error unconditionally if it happens. -+- copy all XATTR, and ignore the error on the specified category only. -+ -+In order to support XATTR and to implement the correct behaviour, aufs -+chooses the latter approach and introduces some new branch attributes, -+"icexsec", "icexsys", "icextr", "icexusr", and "icexoth". -+They correspond to the XATTR namespaces (see above). Additionally, to be -+convenient, "icex" is also provided which means all "icex*" attributes -+are set (here the word "icex" stands for "ignore copy-error on XATTR"). -+ -+The meaning of these attributes is to ignore the error from setting -+XATTR on that branch. -+Note that aufs tries copying all XATTR unconditionally, and ignores the -+error from the dst branch according to the specified attributes. -+ -+Some XATTR may have its default value. The default value may come from -+the parent dir or the environment. If the default value is set at the -+file creating-time, it will be overwritten by copy-up. -+Some contradiction may happen I am afraid. -+Do we need another attribute to stop copying XATTR? I am unsure. For -+now, aufs implements the branch attributes to ignore the error. -diff --git a/Documentation/filesystems/aufs/design/07export.txt b/Documentation/filesystems/aufs/design/07export.txt -new file mode 100644 -index 000000000000..fcd3a3489bf8 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/07export.txt -@@ -0,0 +1,45 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Export Aufs via NFS -+---------------------------------------------------------------------- -+Here is an approach. -+- like xino/xib, add a new file 'xigen' which stores aufs inode -+ generation. -+- iget_locked(): initialize aufs inode generation for a new inode, and -+ store it in xigen file. -+- destroy_inode(): increment aufs inode generation and store it in xigen -+ file. it is necessary even if it is not unlinked, because any data of -+ inode may be changed by UDBA. -+- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise -+ build file handle by -+ + branch id (4 bytes) -+ + superblock generation (4 bytes) -+ + inode number (4 or 8 bytes) -+ + parent dir inode number (4 or 8 bytes) -+ + inode generation (4 bytes)) -+ + return value of exportfs_encode_fh() for the parent on a branch (4 -+ bytes) -+ + file handle for a branch (by exportfs_encode_fh()) -+- fh_to_dentry(): -+ + find the index of a branch from its id in handle, and check it is -+ still exist in aufs. -+ + 1st level: get the inode number from handle and search it in cache. -+ + 2nd level: if not found in cache, get the parent inode number from -+ the handle and search it in cache. and then open the found parent -+ dir, find the matching inode number by vfs_readdir() and get its -+ name, and call lookup_one_len() for the target dentry. -+ + 3rd level: if the parent dir is not cached, call -+ exportfs_decode_fh() for a branch and get the parent on a branch, -+ build a pathname of it, convert it a pathname in aufs, call -+ path_lookup(). now aufs gets a parent dir dentry, then handle it as -+ the 2nd level. -+ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount -+ for every branch, but not itself. to get this, (currently) aufs -+ searches in current->nsproxy->mnt_ns list. it may not be a good -+ idea, but I didn't get other approach. -+ + test the generation of the gotten inode. -+- every inode operation: they may get EBUSY due to UDBA. in this case, -+ convert it into ESTALE for NFSD. -+- readdir(): call lockdep_on/off() because filldir in NFSD calls -+ lookup_one_len(), vfs_getattr(), encode_fh() and others. -diff --git a/Documentation/filesystems/aufs/design/08shwh.txt b/Documentation/filesystems/aufs/design/08shwh.txt -new file mode 100644 -index 000000000000..f252e17154b1 ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/08shwh.txt -@@ -0,0 +1,39 @@ -+ -+# Copyright (C) 2005-2020 Junjiro R. Okajima -+ -+Show Whiteout Mode (shwh) -+---------------------------------------------------------------------- -+Generally aufs hides the name of whiteouts. But in some cases, to show -+them is very useful for users. For instance, creating a new middle layer -+(branch) by merging existing layers. -+ -+(borrowing aufs1 HOW-TO from a user, Michael Towers) -+When you have three branches, -+- Bottom: 'system', squashfs (underlying base system), read-only -+- Middle: 'mods', squashfs, read-only -+- Top: 'overlay', ram (tmpfs), read-write -+ -+The top layer is loaded at boot time and saved at shutdown, to preserve -+the changes made to the system during the session. -+When larger changes have been made, or smaller changes have accumulated, -+the size of the saved top layer data grows. At this point, it would be -+nice to be able to merge the two overlay branches ('mods' and 'overlay') -+and rewrite the 'mods' squashfs, clearing the top layer and thus -+restoring save and load speed. -+ -+This merging is simplified by the use of another aufs mount, of just the -+two overlay branches using the 'shwh' option. -+# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \ -+ aufs /livesys/merge_union -+ -+A merged view of these two branches is then available at -+/livesys/merge_union, and the new feature is that the whiteouts are -+visible! -+Note that in 'shwh' mode the aufs mount must be 'ro', which will disable -+writing to all branches. Also the default mode for all branches is 'ro'. -+It is now possible to save the combined contents of the two overlay -+branches to a new squashfs, e.g.: -+# mksquashfs /livesys/merge_union /path/to/newmods.squash -+ -+This new squashfs archive can be stored on the boot device and the -+initramfs will use it to replace the old one at the next boot. -diff --git a/Documentation/filesystems/aufs/design/10dynop.txt b/Documentation/filesystems/aufs/design/10dynop.txt -new file mode 100644 -index 000000000000..2b90eecb267d ---- /dev/null -+++ b/Documentation/filesystems/aufs/design/10dynop.txt -@@ -0,0 +1,34 @@ -+ -+# Copyright (C) 2010-2020 Junjiro R. Okajima -+ -+Dynamically customizable FS operations -+---------------------------------------------------------------------- -+Generally FS operations (struct inode_operations, struct -+address_space_operations, struct file_operations, etc.) are defined as -+"static const", but it never means that FS have only one set of -+operation. Some FS have multiple sets of them. For instance, ext2 has -+three sets, one for XIP, for NOBH, and for normal. -+Since aufs overrides and redirects these operations, sometimes aufs has -+to change its behaviour according to the branch FS type. More importantly -+VFS acts differently if a function (member in the struct) is set or -+not. It means aufs should have several sets of operations and select one -+among them according to the branch FS definition. -+ -+In order to solve this problem and not to affect the behaviour of VFS, -+aufs defines these operations dynamically. For instance, aufs defines -+dummy direct_IO function for struct address_space_operations, but it may -+not be set to the address_space_operations actually. When the branch FS -+doesn't have it, aufs doesn't set it to its address_space_operations -+while the function definition itself is still alive. So the behaviour -+itself will not change, and it will return an error when direct_IO is -+not set. -+ -+The lifetime of these dynamically generated operation object is -+maintained by aufs branch object. When the branch is removed from aufs, -+the reference counter of the object is decremented. When it reaches -+zero, the dynamically generated operation object will be freed. -+ -+This approach is designed to support AIO (io_submit), Direct I/O and -+XIP (DAX) mainly. -+Currently this approach is applied to address_space_operations for -+regular files only. -diff --git a/MAINTAINERS b/MAINTAINERS -index 281de213ef47..ffc3c1c539ea 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -3009,6 +3009,19 @@ F: include/linux/audit.h - F: include/uapi/linux/audit.h - F: kernel/audit* - -+AUFS (advanced multi layered unification filesystem) FILESYSTEM -+M: "J. R. Okajima" -+L: aufs-users@lists.sourceforge.net (members only) -+L: linux-unionfs@vger.kernel.org -+S: Supported -+W: http://aufs.sourceforge.net -+T: git://github.com/sfjro/aufs4-linux.git -+F: Documentation/ABI/testing/debugfs-aufs -+F: Documentation/ABI/testing/sysfs-aufs -+F: Documentation/filesystems/aufs/ -+F: fs/aufs/ -+F: include/uapi/linux/aufs_type.h -+ - AUXILIARY DISPLAY DRIVERS - M: Miguel Ojeda Sandonis - S: Maintained -diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index a58084c2ed7c..7be7ca3f5454 100644 ---- a/drivers/block/loop.c -+++ b/drivers/block/loop.c -@@ -765,6 +765,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, - return error; - } - -+/* -+ * for AUFS -+ * no get/put for file. -+ */ -+struct file *loop_backing_file(struct super_block *sb) -+{ -+ struct file *ret; -+ struct loop_device *l; -+ -+ ret = NULL; -+ if (MAJOR(sb->s_dev) == LOOP_MAJOR) { -+ l = sb->s_bdev->bd_disk->private_data; -+ ret = l->lo_backing_file; -+ } -+ return ret; -+} -+EXPORT_SYMBOL_GPL(loop_backing_file); -+ - /* loop sysfs attributes */ - - static ssize_t loop_attr_show(struct device *dev, char *page, -diff --git a/fs/Kconfig b/fs/Kconfig -index aa4c12282301..b29bad13b249 100644 ---- a/fs/Kconfig -+++ b/fs/Kconfig -@@ -288,6 +288,7 @@ source "fs/sysv/Kconfig" - source "fs/ufs/Kconfig" - source "fs/erofs/Kconfig" - source "fs/vboxsf/Kconfig" -+source "fs/aufs/Kconfig" - - endif # MISC_FILESYSTEMS - -diff --git a/fs/Makefile b/fs/Makefile -index 999d1a23f036..0cd76857ca76 100644 ---- a/fs/Makefile -+++ b/fs/Makefile -@@ -136,3 +136,4 @@ obj-$(CONFIG_EFIVAR_FS) += efivarfs/ - obj-$(CONFIG_EROFS_FS) += erofs/ - obj-$(CONFIG_VBOXSF_FS) += vboxsf/ - obj-$(CONFIG_ZONEFS_FS) += zonefs/ -+obj-$(CONFIG_AUFS_FS) += aufs/ -diff --git a/fs/aufs/Kconfig b/fs/aufs/Kconfig -new file mode 100644 -index 000000000000..0b442aeb7b45 ---- /dev/null -+++ b/fs/aufs/Kconfig -@@ -0,0 +1,199 @@ -+# SPDX-License-Identifier: GPL-2.0 -+config AUFS_FS -+ bool "Aufs (Advanced multi layered unification filesystem) support" -+ help -+ Aufs is a stackable unification filesystem such as Unionfs, -+ which unifies several directories and provides a merged single -+ directory. -+ In the early days, aufs was entirely re-designed and -+ re-implemented Unionfs Version 1.x series. Introducing many -+ original ideas, approaches and improvements, it becomes totally -+ different from Unionfs while keeping the basic features. -+ -+if AUFS_FS -+choice -+ prompt "Maximum number of branches" -+ default AUFS_BRANCH_MAX_127 -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_127 -+ bool "127" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_511 -+ bool "511" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_1023 -+ bool "1023" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_32767 -+ bool "32767" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+endchoice -+ -+config AUFS_SBILIST -+ bool -+ depends on AUFS_MAGIC_SYSRQ || PROC_FS -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq or /proc, enabled automatically. -+ -+config AUFS_HNOTIFY -+ bool "Detect direct branch access (bypassing aufs)" -+ help -+ If you want to modify files on branches directly, eg. bypassing aufs, -+ and want aufs to detect the changes of them fully, then enable this -+ option and use 'udba=notify' mount option. -+ Currently there is only one available configuration, "fsnotify". -+ It will have a negative impact to the performance. -+ See detail in aufs.5. -+ -+choice -+ prompt "method" if AUFS_HNOTIFY -+ default AUFS_HFSNOTIFY -+config AUFS_HFSNOTIFY -+ bool "fsnotify" -+ select FSNOTIFY -+endchoice -+ -+config AUFS_EXPORT -+ bool "NFS-exportable aufs" -+ depends on EXPORTFS = y -+ help -+ If you want to export your mounted aufs via NFS, then enable this -+ option. There are several requirements for this configuration. -+ See detail in aufs.5. -+ -+config AUFS_INO_T_64 -+ bool -+ depends on AUFS_EXPORT -+ depends on 64BIT && !(ALPHA || S390) -+ default y -+ help -+ Automatic configuration for internal use. -+ /* typedef unsigned long/int __kernel_ino_t */ -+ /* alpha and s390x are int */ -+ -+config AUFS_XATTR -+ bool "support for XATTR/EA (including Security Labels)" -+ help -+ If your branch fs supports XATTR/EA and you want to make them -+ available in aufs too, then enable this opsion and specify the -+ branch attributes for EA. -+ See detail in aufs.5. -+ -+config AUFS_FHSM -+ bool "File-based Hierarchical Storage Management" -+ help -+ Hierarchical Storage Management (or HSM) is a well-known feature -+ in the storage world. Aufs provides this feature as file-based. -+ with multiple branches. -+ These multiple branches are prioritized, ie. the topmost one -+ should be the fastest drive and be used heavily. -+ -+config AUFS_RDU -+ bool "Readdir in userspace" -+ help -+ Aufs has two methods to provide a merged view for a directory, -+ by a user-space library and by kernel-space natively. The latter -+ is always enabled but sometimes large and slow. -+ If you enable this option, install the library in aufs2-util -+ package, and set some environment variables for your readdir(3), -+ then the work will be handled in user-space which generally -+ shows better performance in most cases. -+ See detail in aufs.5. -+ -+config AUFS_DIRREN -+ bool "Workaround for rename(2)-ing a directory" -+ help -+ By default, aufs returns EXDEV error in renameing a dir who has -+ his child on the lower branch, since it is a bad idea to issue -+ rename(2) internally for every lower branch. But user may not -+ accept this behaviour. So here is a workaround to allow such -+ rename(2) and store some extra infromation on the writable -+ branch. Obviously this costs high (and I don't like it). -+ To use this feature, you need to enable this configuration AND -+ to specify the mount option `dirren.' -+ See details in aufs.5 and the design documents. -+ -+config AUFS_SHWH -+ bool "Show whiteouts" -+ help -+ If you want to make the whiteouts in aufs visible, then enable -+ this option and specify 'shwh' mount option. Although it may -+ sounds like philosophy or something, but in technically it -+ simply shows the name of whiteout with keeping its behaviour. -+ -+config AUFS_BR_RAMFS -+ bool "Ramfs (initramfs/rootfs) as an aufs branch" -+ help -+ If you want to use ramfs as an aufs branch fs, then enable this -+ option. Generally tmpfs is recommended. -+ Aufs prohibited them to be a branch fs by default, because -+ initramfs becomes unusable after switch_root or something -+ generally. If you sets initramfs as an aufs branch and boot your -+ system by switch_root, you will meet a problem easily since the -+ files in initramfs may be inaccessible. -+ Unless you are going to use ramfs as an aufs branch fs without -+ switch_root or something, leave it N. -+ -+config AUFS_BR_FUSE -+ bool "Fuse fs as an aufs branch" -+ depends on FUSE_FS -+ select AUFS_POLL -+ help -+ If you want to use fuse-based userspace filesystem as an aufs -+ branch fs, then enable this option. -+ It implements the internal poll(2) operation which is -+ implemented by fuse only (curretnly). -+ -+config AUFS_POLL -+ bool -+ help -+ Automatic configuration for internal use. -+ -+config AUFS_BR_HFSPLUS -+ bool "Hfsplus as an aufs branch" -+ depends on HFSPLUS_FS -+ default y -+ help -+ If you want to use hfsplus fs as an aufs branch fs, then enable -+ this option. This option introduces a small overhead at -+ copying-up a file on hfsplus. -+ -+config AUFS_BDEV_LOOP -+ bool -+ depends on BLK_DEV_LOOP -+ default y -+ help -+ Automatic configuration for internal use. -+ Convert =[ym] into =y. -+ -+config AUFS_DEBUG -+ bool "Debug aufs" -+ help -+ Enable this to compile aufs internal debug code. -+ It will have a negative impact to the performance. -+ -+config AUFS_MAGIC_SYSRQ -+ bool -+ depends on AUFS_DEBUG && MAGIC_SYSRQ -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq, enabled automatically. -+endif -diff --git a/fs/aufs/Makefile b/fs/aufs/Makefile -new file mode 100644 -index 000000000000..9de70de0f337 ---- /dev/null -+++ b/fs/aufs/Makefile -@@ -0,0 +1,39 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+include ${srctree}/${src}/magic.mk -+-include ${srctree}/${src}/priv_def.mk -+ -+# cf. include/linux/kernel.h -+# enable pr_debug -+ccflags-y += -DDEBUG -+# sparse requires the full pathname -+ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h -+ -+obj-$(CONFIG_AUFS_FS) += aufs.o -+aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o \ -+ wkq.o vfsub.o dcsub.o \ -+ cpup.o whout.o wbr_policy.o \ -+ dinfo.o dentry.o \ -+ dynop.o \ -+ finfo.o file.o f_op.o \ -+ dir.o vdir.o \ -+ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ -+ mvdown.o ioctl.o -+ -+# all are boolean -+aufs-$(CONFIG_PROC_FS) += procfs.o plink.o -+aufs-$(CONFIG_SYSFS) += sysfs.o -+aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o -+aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o -+aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o -+aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o -+aufs-$(CONFIG_AUFS_EXPORT) += export.o -+aufs-$(CONFIG_AUFS_XATTR) += xattr.o -+aufs-$(CONFIG_FS_POSIX_ACL) += posix_acl.o -+aufs-$(CONFIG_AUFS_DIRREN) += dirren.o -+aufs-$(CONFIG_AUFS_FHSM) += fhsm.o -+aufs-$(CONFIG_AUFS_POLL) += poll.o -+aufs-$(CONFIG_AUFS_RDU) += rdu.o -+aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o -+aufs-$(CONFIG_AUFS_DEBUG) += debug.o -+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff --git a/fs/aufs/aufs.h b/fs/aufs/aufs.h -new file mode 100644 -index 000000000000..c50f959844e8 ---- /dev/null -+++ b/fs/aufs/aufs.h -@@ -0,0 +1,49 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * all header files -+ */ -+ -+#ifndef __AUFS_H__ -+#define __AUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#define AuStub(type, name, body, ...) \ -+ static inline type name(__VA_ARGS__) { body; } -+ -+#define AuStubVoid(name, ...) \ -+ AuStub(void, name, , __VA_ARGS__) -+#define AuStubInt0(name, ...) \ -+ AuStub(int, name, return 0, __VA_ARGS__) -+ -+#include "debug.h" -+ -+#include "branch.h" -+#include "cpup.h" -+#include "dcsub.h" -+#include "dbgaufs.h" -+#include "dentry.h" -+#include "dir.h" -+#include "dirren.h" -+#include "dynop.h" -+#include "file.h" -+#include "fstype.h" -+#include "hbl.h" -+#include "inode.h" -+#include "lcnt.h" -+#include "loop.h" -+#include "module.h" -+#include "opts.h" -+#include "rwsem.h" -+#include "super.h" -+#include "sysaufs.h" -+#include "vfsub.h" -+#include "whout.h" -+#include "wkq.h" -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_H__ */ -diff --git a/fs/aufs/branch.c b/fs/aufs/branch.c -new file mode 100644 -index 000000000000..3319245c0361 ---- /dev/null -+++ b/fs/aufs/branch.c -@@ -0,0 +1,1414 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * branch management -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * free a single branch -+ */ -+static void au_br_do_free(struct au_branch *br) -+{ -+ int i; -+ struct au_wbr *wbr; -+ struct au_dykey **key; -+ -+ au_hnotify_fin_br(br); -+ /* always, regardless the mount option */ -+ au_dr_hino_free(&br->br_dirren); -+ au_xino_put(br); -+ -+ AuLCntZero(au_lcnt_read(&br->br_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_nfiles, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&br->br_count, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_count, /*do_sync*/0); -+ -+ wbr = br->br_wbr; -+ if (wbr) { -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(wbr->wbr_wh[i]); -+ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); -+ AuRwDestroy(&wbr->wbr_wh_rwsem); -+ } -+ -+ if (br->br_fhsm) { -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_try_rcu(br->br_fhsm); -+ } -+ -+ key = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++, key++) -+ if (*key) -+ au_dy_put(*key); -+ else -+ break; -+ -+ /* recursive lock, s_umount of branch's */ -+ /* synchronize_rcu(); */ /* why? */ -+ lockdep_off(); -+ path_put(&br->br_path); -+ lockdep_on(); -+ au_kfree_rcu(wbr); -+ au_lcnt_wait_for_fin(&br->br_nfiles); -+ au_lcnt_wait_for_fin(&br->br_count); -+ /* I don't know why, but percpu_refcount requires this */ -+ /* synchronize_rcu(); */ -+ au_kfree_rcu(br); -+} -+ -+/* -+ * frees all branches -+ */ -+void au_br_free(struct au_sbinfo *sbinfo) -+{ -+ aufs_bindex_t bmax; -+ struct au_branch **br; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ bmax = sbinfo->si_bbot + 1; -+ br = sbinfo->si_branch; -+ while (bmax--) -+ au_br_do_free(*br++); -+} -+ -+/* -+ * find the index of a branch which is specified by @br_id. -+ */ -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_sbr_id(sb, bindex) == br_id) -+ return bindex; -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * add a branch -+ */ -+ -+static int test_overlap(struct super_block *sb, struct dentry *h_adding, -+ struct dentry *h_root) -+{ -+ if (unlikely(h_adding == h_root -+ || au_test_loopback_overlap(sb, h_adding))) -+ return 1; -+ if (h_adding->d_sb != h_root->d_sb) -+ return 0; -+ return au_test_subdir(h_adding, h_root) -+ || au_test_subdir(h_root, h_adding); -+} -+ -+/* -+ * returns a newly allocated branch. @new_nbranch is a number of branches -+ * after adding a branch. -+ */ -+static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, -+ int perm) -+{ -+ struct au_branch *add_branch; -+ struct dentry *root; -+ struct inode *inode; -+ int err; -+ -+ err = -ENOMEM; -+ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS); -+ if (unlikely(!add_branch)) -+ goto out; -+ add_branch->br_xino = au_xino_alloc(/*nfile*/1); -+ if (unlikely(!add_branch->br_xino)) -+ goto out_br; -+ err = au_hnotify_init_br(add_branch, perm); -+ if (unlikely(err)) -+ goto out_xino; -+ -+ if (au_br_writable(perm)) { -+ /* may be freed separately at changing the branch permission */ -+ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr), -+ GFP_NOFS); -+ if (unlikely(!add_branch->br_wbr)) -+ goto out_hnotify; -+ } -+ -+ if (au_br_fhsm(perm)) { -+ err = au_fhsm_br_alloc(add_branch); -+ if (unlikely(err)) -+ goto out_wbr; -+ } -+ -+ root = sb->s_root; -+ err = au_sbr_realloc(au_sbi(sb), new_nbranch, /*may_shrink*/0); -+ if (!err) -+ err = au_di_realloc(au_di(root), new_nbranch, /*may_shrink*/0); -+ if (!err) { -+ inode = d_inode(root); -+ err = au_hinode_realloc(au_ii(inode), new_nbranch, -+ /*may_shrink*/0); -+ } -+ if (!err) -+ return add_branch; /* success */ -+ -+out_wbr: -+ au_kfree_rcu(add_branch->br_wbr); -+out_hnotify: -+ au_hnotify_fin_br(add_branch); -+out_xino: -+ au_xino_put(add_branch); -+out_br: -+ au_kfree_rcu(add_branch); -+out: -+ return ERR_PTR(err); -+} -+ -+/* -+ * test if the branch permission is legal or not. -+ */ -+static int test_br(struct inode *inode, int brperm, char *path) -+{ -+ int err; -+ -+ err = (au_br_writable(brperm) && IS_RDONLY(inode)); -+ if (!err) -+ goto out; -+ -+ err = -EINVAL; -+ pr_err("write permission for readonly mount or inode, %s\n", path); -+ -+out: -+ return err; -+} -+ -+/* -+ * returns: -+ * 0: success, the caller will add it -+ * plus: success, it is already unified, the caller should ignore it -+ * minus: error -+ */ -+static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ root = sb->s_root; -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot >= 0 -+ && au_find_dbindex(root, add->path.dentry) >= 0)) { -+ err = 1; -+ if (!remount) { -+ err = -EINVAL; -+ pr_err("%s duplicated\n", add->pathname); -+ } -+ goto out; -+ } -+ -+ err = -ENOSPC; /* -E2BIG; */ -+ if (unlikely(AUFS_BRANCH_MAX <= add->bindex -+ || AUFS_BRANCH_MAX - 1 <= bbot)) { -+ pr_err("number of branches exceeded %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EDOM; -+ if (unlikely(add->bindex < 0 || bbot + 1 < add->bindex)) { -+ pr_err("bad index %d\n", add->bindex); -+ goto out; -+ } -+ -+ inode = d_inode(add->path.dentry); -+ err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { -+ pr_err("no existence %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(inode->i_sb == sb)) { -+ pr_err("%s must be outside\n", add->pathname); -+ goto out; -+ } -+ -+ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { -+ pr_err("unsupported filesystem, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ if (unlikely(inode->i_sb->s_stack_depth)) { -+ pr_err("already stacked, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bbot < 0) -+ return 0; /* success */ -+ -+ err = -EINVAL; -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (unlikely(test_overlap(sb, add->path.dentry, -+ au_h_dptr(root, bindex)))) { -+ pr_err("%s is overlapped\n", add->pathname); -+ goto out; -+ } -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { -+ h_dentry = au_h_dptr(root, 0); -+ h_inode = d_inode(h_dentry); -+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) -+ || !uid_eq(h_inode->i_uid, inode->i_uid) -+ || !gid_eq(h_inode->i_gid, inode->i_gid)) -+ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", -+ add->pathname, -+ i_uid_read(inode), i_gid_read(inode), -+ (inode->i_mode & S_IALLUGO), -+ i_uid_read(h_inode), i_gid_read(h_inode), -+ (h_inode->i_mode & S_IALLUGO)); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize or clean the whiteouts for an adding branch -+ */ -+static int au_br_init_wh(struct super_block *sb, struct au_branch *br, -+ int new_perm) -+{ -+ int err, old_perm; -+ aufs_bindex_t bindex; -+ struct inode *h_inode; -+ struct au_wbr *wbr; -+ struct au_hinode *hdir; -+ struct dentry *h_dentry; -+ -+ err = vfsub_mnt_want_write(au_br_mnt(br)); -+ if (unlikely(err)) -+ goto out; -+ -+ wbr = br->br_wbr; -+ old_perm = br->br_perm; -+ br->br_perm = new_perm; -+ hdir = NULL; -+ h_inode = NULL; -+ bindex = au_br_index(sb, br->br_id); -+ if (0 <= bindex) { -+ hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ } else { -+ h_dentry = au_br_dentry(br); -+ h_inode = d_inode(h_dentry); -+ inode_lock_nested(h_inode, AuLsc_I_PARENT); -+ } -+ if (!wbr) -+ err = au_wh_init(br, sb); -+ else { -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ wbr_wh_write_unlock(wbr); -+ } -+ if (hdir) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(h_inode); -+ vfsub_mnt_drop_write(au_br_mnt(br)); -+ br->br_perm = old_perm; -+ -+ if (!err && wbr && !au_br_writable(new_perm)) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ -+out: -+ return err; -+} -+ -+static int au_wbr_init(struct au_branch *br, struct super_block *sb, -+ int perm) -+{ -+ int err; -+ struct kstatfs kst; -+ struct au_wbr *wbr; -+ -+ wbr = br->br_wbr; -+ au_rw_init(&wbr->wbr_wh_rwsem); -+ atomic_set(&wbr->wbr_wh_running, 0); -+ -+ /* -+ * a limit for rmdir/rename a dir -+ * cf. AUFS_MAX_NAMELEN in include/uapi/linux/aufs_type.h -+ */ -+ err = vfs_statfs(&br->br_path, &kst); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (kst.f_namelen >= NAME_MAX) -+ err = au_br_init_wh(sb, br, perm); -+ else -+ pr_err("%pd(%s), unsupported namelen %ld\n", -+ au_br_dentry(br), -+ au_sbtype(au_br_dentry(br)->d_sb), kst.f_namelen); -+ -+out: -+ return err; -+} -+ -+/* initialize a new branch */ -+static int au_br_init(struct au_branch *br, struct super_block *sb, -+ struct au_opt_add *add) -+{ -+ int err; -+ struct au_branch *brbase; -+ struct file *xf; -+ struct inode *h_inode; -+ -+ err = 0; -+ br->br_perm = add->perm; -+ br->br_path = add->path; /* set first, path_get() later */ -+ spin_lock_init(&br->br_dykey_lock); -+ au_lcnt_init(&br->br_nfiles, /*release*/NULL); -+ au_lcnt_init(&br->br_count, /*release*/NULL); -+ br->br_id = au_new_br_id(sb); -+ AuDebugOn(br->br_id < 0); -+ -+ /* always, regardless the given option */ -+ err = au_dr_br_init(sb, br, &add->path); -+ if (unlikely(err)) -+ goto out_err; -+ -+ if (au_br_writable(add->perm)) { -+ err = au_wbr_init(br, sb, add->perm); -+ if (unlikely(err)) -+ goto out_err; -+ } -+ -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ brbase = au_sbr(sb, 0); -+ xf = au_xino_file(brbase->br_xino, /*idx*/-1); -+ AuDebugOn(!xf); -+ h_inode = d_inode(add->path.dentry); -+ err = au_xino_init_br(sb, br, h_inode->i_ino, &xf->f_path); -+ if (unlikely(err)) { -+ AuDebugOn(au_xino_file(br->br_xino, /*idx*/-1)); -+ goto out_err; -+ } -+ } -+ -+ sysaufs_br_init(br); -+ path_get(&br->br_path); -+ goto out; /* success */ -+ -+out_err: -+ memset(&br->br_path, 0, sizeof(br->br_path)); -+out: -+ return err; -+} -+ -+static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, -+ struct au_branch *br, aufs_bindex_t bbot, -+ aufs_bindex_t amount) -+{ -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ memmove(brp + 1, brp, sizeof(*brp) * amount); -+ *brp = br; -+ sbinfo->si_bbot++; -+ if (unlikely(bbot < 0)) -+ sbinfo->si_bbot = 0; -+} -+ -+static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); -+ au_h_dentry_init(hdp); -+ dinfo->di_bbot++; -+ if (unlikely(bbot < 0)) -+ dinfo->di_btop = 0; -+} -+ -+static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ memmove(hip + 1, hip, sizeof(*hip) * amount); -+ au_hinode_init(hip); -+ iinfo->ii_bbot++; -+ if (unlikely(bbot < 0)) -+ iinfo->ii_btop = 0; -+} -+ -+static void au_br_do_add(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bindex) -+{ -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode, *h_inode; -+ aufs_bindex_t bbot, amount; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ bbot = au_sbbot(sb); -+ amount = bbot + 1 - bindex; -+ h_dentry = au_br_dentry(br); -+ au_sbilist_lock(); -+ au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); -+ au_br_do_add_hdp(au_di(root), bindex, bbot, amount); -+ au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); -+ au_set_h_dptr(root, bindex, dget(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); -+ au_sbilist_unlock(); -+} -+ -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, add_bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode; -+ struct au_branch *add_branch; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ IMustLock(root_inode); -+ IiMustWriteLock(root_inode); -+ err = test_add(sb, add, remount); -+ if (unlikely(err < 0)) -+ goto out; -+ if (err) { -+ err = 0; -+ goto out; /* success */ -+ } -+ -+ bbot = au_sbbot(sb); -+ add_branch = au_br_alloc(sb, bbot + 2, add->perm); -+ err = PTR_ERR(add_branch); -+ if (IS_ERR(add_branch)) -+ goto out; -+ -+ err = au_br_init(add_branch, sb, add); -+ if (unlikely(err)) { -+ au_br_do_free(add_branch); -+ goto out; -+ } -+ -+ add_bindex = add->bindex; -+ sysaufs_brs_del(sb, add_bindex); /* remove successors */ -+ au_br_do_add(sb, add_branch, add_bindex); -+ sysaufs_brs_add(sb, add_bindex); /* append successors */ -+ dbgaufs_brs_add(sb, add_bindex, /*topdown*/0); /* rename successors */ -+ -+ h_dentry = add->path.dentry; -+ if (!add_bindex) { -+ au_cpup_attr_all(root_inode, /*force*/1); -+ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; -+ } else -+ au_add_nlink(root_inode, d_inode(h_dentry)); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static unsigned long long au_farray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct file **p, *f; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ -+ n = 0; -+ p = a; -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ f = finfo->fi_file; -+ if (file_count(f) -+ && !special_file(file_inode(f)->i_mode)) { -+ get_file(f); -+ *p++ = f; -+ n++; -+ AuDebugOn(n > max); -+ } -+ } -+ hlist_bl_unlock(files); -+ -+ return n; -+} -+ -+static struct file **au_farray_alloc(struct super_block *sb, -+ unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_nfiles, /*do_rev*/1); -+ return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL); -+} -+ -+static void au_farray_free(struct file **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ if (a[ull]) -+ fput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * delete a branch -+ */ -+ -+/* to show the line number, do not make it inlined function */ -+#define AuVerbose(do_info, fmt, ...) do { \ -+ if (do_info) \ -+ pr_info(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+static int au_test_ibusy(struct inode *inode, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return (inode && !S_ISDIR(inode->i_mode)) || btop == bbot; -+} -+ -+static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return au_test_ibusy(d_inode(dentry), btop, bbot); -+} -+ -+/* -+ * test if the branch is deletable or not. -+ */ -+static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t btop, bbot; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; !err && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; !err && j < ndentry; j++) { -+ d = dpage->dentries[j]; -+ AuDebugOn(au_dcount(d) <= 0); -+ if (!au_digen_test(d, sigen)) { -+ di_read_lock_child(d, AuLock_IR); -+ if (unlikely(au_dbrange_test(d))) { -+ di_read_unlock(d, AuLock_IR); -+ continue; -+ } -+ } else { -+ di_write_lock_child(d); -+ if (unlikely(au_dbrange_test(d))) { -+ di_write_unlock(d); -+ continue; -+ } -+ err = au_reval_dpath(d, sigen); -+ if (!err) -+ di_downgrade_lock(d, AuLock_IR); -+ else { -+ di_write_unlock(d); -+ break; -+ } -+ } -+ -+ /* AuDbgDentry(d); */ -+ btop = au_dbtop(d); -+ bbot = au_dbbot(d); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_dptr(d, bindex) -+ && au_test_dbusy(d, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy %pd\n", d); -+ AuDbgDentry(d); -+ } -+ di_read_unlock(d, AuLock_IR); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err; -+ unsigned long long max, ull; -+ struct inode *i, **array; -+ aufs_bindex_t btop, bbot; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ AuDbg("b%d\n", bindex); -+ for (ull = 0; !err && ull < max; ull++) { -+ i = array[ull]; -+ if (unlikely(!i)) -+ break; -+ if (i->i_ino == AUFS_ROOT_INO) -+ continue; -+ -+ /* AuDbgInode(i); */ -+ if (au_iigen(i, NULL) == sigen) -+ ii_read_lock_child(i); -+ else { -+ ii_write_lock_child(i); -+ err = au_refresh_hinode_self(i); -+ au_iigen_dec(i); -+ if (!err) -+ ii_downgrade_lock(i); -+ else { -+ ii_write_unlock(i); -+ break; -+ } -+ } -+ -+ btop = au_ibtop(i); -+ bbot = au_ibbot(i); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_iptr(i, bindex) -+ && au_test_ibusy(i, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy i%lu\n", i->i_ino); -+ AuDbgInode(i); -+ } -+ ii_read_unlock(i); -+ } -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+static int test_children_busy(struct dentry *root, aufs_bindex_t bindex, -+ const unsigned int verbose) -+{ -+ int err; -+ unsigned int sigen; -+ -+ sigen = au_sigen(root->d_sb); -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = test_dentry_busy(root, bindex, sigen, verbose); -+ if (!err) -+ err = test_inode_busy(root->d_sb, bindex, sigen, verbose); -+ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ -+ -+ return err; -+} -+ -+static int test_dir_busy(struct file *file, aufs_bindex_t br_id, -+ struct file **to_free, int *idx) -+{ -+ int err; -+ unsigned char matched, root; -+ aufs_bindex_t bindex, bbot; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ err = 0; -+ root = IS_ROOT(file->f_path.dentry); -+ if (root) { -+ get_file(file); -+ to_free[*idx] = file; -+ (*idx)++; -+ goto out; -+ } -+ -+ matched = 0; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ matched = 1; -+ break; -+ } -+ } -+ if (matched) -+ err = -EBUSY; -+ -+out: -+ return err; -+} -+ -+static int test_file_busy(struct super_block *sb, aufs_bindex_t br_id, -+ struct file **to_free, int opened) -+{ -+ int err, idx; -+ unsigned long long ull, max; -+ aufs_bindex_t btop; -+ struct file *file, **array; -+ struct dentry *root; -+ struct au_hfile *hfile; -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ idx = 0; -+ root = sb->s_root; -+ di_write_unlock(root); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ btop = au_fbtop(file); -+ if (!d_is_dir(file->f_path.dentry)) { -+ hfile = &au_fi(file)->fi_htop; -+ if (hfile->hf_br->br_id == br_id) -+ err = -EBUSY; -+ } else -+ err = test_dir_busy(file, br_id, to_free, &idx); -+ fi_read_unlock(file); -+ if (unlikely(err)) -+ break; -+ } -+ di_write_lock_child(root); -+ au_farray_free(array, max); -+ AuDebugOn(idx > opened); -+ -+out: -+ return err; -+} -+ -+static void br_del_file(struct file **to_free, unsigned long long opened, -+ aufs_bindex_t br_id) -+{ -+ unsigned long long ull; -+ aufs_bindex_t bindex, btop, bbot, bfound; -+ struct file *file; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ for (ull = 0; ull < opened; ull++) { -+ file = to_free[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ bfound = -1; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ fi_write_lock(file); -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ bfound = bindex; -+ break; -+ } -+ } -+ AuDebugOn(bfound < 0); -+ au_set_h_fptr(file, bfound, NULL); -+ if (bfound == btop) { -+ for (btop++; btop <= bbot; btop++) -+ if (au_hf_dir(file, btop)) { -+ au_set_fbtop(file, btop); -+ break; -+ } -+ } -+ fi_write_unlock(file); -+ } -+} -+ -+static void au_br_do_del_brp(struct au_sbinfo *sbinfo, -+ const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_branch **brp, **p; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ if (bindex < bbot) -+ memmove(brp, brp + 1, sizeof(*brp) * (bbot - bindex)); -+ sbinfo->si_branch[0 + bbot] = NULL; -+ sbinfo->si_bbot--; -+ -+ p = au_krealloc(sbinfo->si_branch, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ sbinfo->si_branch = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hdentry *hdp, *p; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ if (bindex < bbot) -+ memmove(hdp, hdp + 1, sizeof(*hdp) * (bbot - bindex)); -+ /* au_h_dentry_init(au_hdentry(dinfo, bbot); */ -+ dinfo->di_bbot--; -+ -+ p = au_krealloc(dinfo->di_hdentry, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ dinfo->di_hdentry = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hinode *hip, *p; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ if (bindex < bbot) -+ memmove(hip, hip + 1, sizeof(*hip) * (bbot - bindex)); -+ /* au_hinode_init(au_hinode(iinfo, bbot)); */ -+ iinfo->ii_bbot--; -+ -+ p = au_krealloc(iinfo->ii_hinode, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ iinfo->ii_hinode = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root, *h_root; -+ struct inode *inode, *h_inode; -+ struct au_hinode *hinode; -+ -+ SiMustWriteLock(sb); -+ -+ root = sb->s_root; -+ inode = d_inode(root); -+ sbinfo = au_sbi(sb); -+ bbot = sbinfo->si_bbot; -+ -+ h_root = au_h_dptr(root, bindex); -+ hinode = au_hi(inode, bindex); -+ h_inode = au_igrab(hinode->hi_inode); -+ au_hiput(hinode); -+ -+ au_sbilist_lock(); -+ au_br_do_del_brp(sbinfo, bindex, bbot); -+ au_br_do_del_hdp(au_di(root), bindex, bbot); -+ au_br_do_del_hip(au_ii(inode), bindex, bbot); -+ au_sbilist_unlock(); -+ -+ /* ignore an error */ -+ au_dr_br_fin(sb, br); /* always, regardless the mount option */ -+ -+ dput(h_root); -+ iput(h_inode); -+ au_br_do_free(br); -+} -+ -+static unsigned long long empty_cb(struct super_block *sb, void *array, -+ unsigned long long max, void *arg) -+{ -+ return max; -+} -+ -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) -+{ -+ int err, rerr, i; -+ unsigned long long opened; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, br_id; -+ unsigned char do_wh, verbose; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root; -+ struct file **to_free; -+ -+ err = 0; -+ opened = 0; -+ to_free = NULL; -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, del->h_path.dentry); -+ if (bindex < 0) { -+ if (remount) -+ goto out; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", del->pathname); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = -EBUSY; -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ bbot = au_sbbot(sb); -+ if (unlikely(!bbot)) { -+ AuVerbose(verbose, "no more branches left\n"); -+ goto out; -+ } -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!path_equal(&br->br_path, &del->h_path)); -+ if (unlikely(au_lcnt_read(&br->br_count, /*do_rev*/1))) { -+ AuVerbose(verbose, "br %pd2 is busy now\n", del->h_path.dentry); -+ goto out; -+ } -+ -+ br_id = br->br_id; -+ opened = au_lcnt_read(&br->br_nfiles, /*do_rev*/1); -+ if (unlikely(opened)) { -+ to_free = au_array_alloc(&opened, empty_cb, sb, NULL); -+ err = PTR_ERR(to_free); -+ if (IS_ERR(to_free)) -+ goto out; -+ -+ err = test_file_busy(sb, br_id, to_free, opened); -+ if (unlikely(err)) { -+ AuVerbose(verbose, "%llu file(s) opened\n", opened); -+ goto out; -+ } -+ } -+ -+ wbr = br->br_wbr; -+ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); -+ if (do_wh) { -+ /* instead of WbrWhMustWriteLock(wbr) */ -+ SiMustWriteLock(sb); -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ } -+ -+ err = test_children_busy(root, bindex, verbose); -+ if (unlikely(err)) { -+ if (do_wh) -+ goto out_wh; -+ goto out; -+ } -+ -+ err = 0; -+ if (to_free) { -+ /* -+ * now we confirmed the branch is deletable. -+ * let's free the remaining opened dirs on the branch. -+ */ -+ di_write_unlock(root); -+ br_del_file(to_free, opened, br_id); -+ di_write_lock_child(root); -+ } -+ -+ sysaufs_brs_del(sb, bindex); /* remove successors */ -+ dbgaufs_xino_del(br); /* remove one */ -+ au_br_do_del(sb, bindex, br); -+ sysaufs_brs_add(sb, bindex); /* append successors */ -+ dbgaufs_brs_add(sb, bindex, /*topdown*/1); /* rename successors */ -+ -+ if (!bindex) { -+ au_cpup_attr_all(d_inode(root), /*force*/1); -+ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; -+ } else -+ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry)); -+ if (au_opt_test(mnt_flags, PLINK)) -+ au_plink_half_refresh(sb, br_id); -+ -+ goto out; /* success */ -+ -+out_wh: -+ /* revert */ -+ rerr = au_br_init_wh(sb, br, br->br_perm); -+ if (rerr) -+ pr_warn("failed re-creating base whiteout, %s. (%d)\n", -+ del->pathname, rerr); -+out: -+ if (to_free) -+ au_farray_free(to_free, opened); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_ibusy(struct super_block *sb, struct aufs_ibusy __user *arg) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ struct aufs_ibusy ibusy; -+ struct inode *inode, *h_inode; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = copy_from_user(&ibusy, arg, sizeof(ibusy)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&arg->h_ino, sizeof(arg->h_ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(ibusy.bindex < 0 || ibusy.bindex > au_sbbot(sb))) -+ goto out_unlock; -+ -+ err = 0; -+ ibusy.h_ino = 0; /* invalid */ -+ inode = ilookup(sb, ibusy.ino); -+ if (!inode -+ || inode->i_ino == AUFS_ROOT_INO -+ || au_is_bad_inode(inode)) -+ goto out_unlock; -+ -+ ii_read_lock_child(inode); -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop <= ibusy.bindex && ibusy.bindex <= bbot) { -+ h_inode = au_h_iptr(inode, ibusy.bindex); -+ if (h_inode && au_test_ibusy(inode, btop, bbot)) -+ ibusy.h_ino = h_inode->i_ino; -+ } -+ ii_read_unlock(inode); -+ iput(inode); -+ -+out_unlock: -+ si_read_unlock(sb); -+ if (!err) { -+ err = __put_user(ibusy.h_ino, &arg->h_ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ } -+out: -+ return err; -+} -+ -+long au_ibusy_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * change a branch permission -+ */ -+ -+static void au_warn_ima(void) -+{ -+#ifdef CONFIG_IMA -+ /* since it doesn't support mark_files_ro() */ -+ AuWarn1("RW -> RO makes IMA to produce wrong message\n"); -+#endif -+} -+ -+static int do_need_sigen_inc(int a, int b) -+{ -+ return au_br_whable(a) && !au_br_whable(b); -+} -+ -+static int need_sigen_inc(int old, int new) -+{ -+ return do_need_sigen_inc(old, new) -+ || do_need_sigen_inc(new, old); -+} -+ -+static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, do_warn; -+ unsigned int mnt_flags; -+ unsigned long long ull, max; -+ aufs_bindex_t br_id; -+ unsigned char verbose, writer; -+ struct file *file, *hf, **array; -+ struct au_hfile *hfile; -+ struct inode *h_inode; -+ -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ do_warn = 0; -+ br_id = au_sbr_id(sb, bindex); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ if (unlikely(au_test_mmapped(file))) { -+ err = -EBUSY; -+ AuVerbose(verbose, "mmapped %pD\n", file); -+ AuDbgFile(file); -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ goto out_array; -+ } -+ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ if (!d_is_reg(file->f_path.dentry) -+ || !(file->f_mode & FMODE_WRITE) -+ || hfile->hf_br->br_id != br_id -+ || !(hf->f_mode & FMODE_WRITE)) -+ array[ull] = NULL; -+ else { -+ do_warn = 1; -+ get_file(file); -+ } -+ -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ fput(file); -+ } -+ -+ err = 0; -+ if (do_warn) -+ au_warn_ima(); -+ -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (!file) -+ continue; -+ -+ /* todo: already flushed? */ -+ /* -+ * fs/super.c:mark_files_ro() is gone, but aufs keeps its -+ * approach which resets f_mode and calls mnt_drop_write() and -+ * file_release_write() for each file, because the branch -+ * attribute in aufs world is totally different from the native -+ * fs rw/ro mode. -+ */ -+ /* fi_read_lock(file); */ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ /* fi_read_unlock(file); */ -+ spin_lock(&hf->f_lock); -+ writer = !!(hf->f_mode & FMODE_WRITER); -+ hf->f_mode &= ~(FMODE_WRITE | FMODE_WRITER); -+ spin_unlock(&hf->f_lock); -+ if (writer) { -+ h_inode = file_inode(hf); -+ if (hf->f_mode & FMODE_READ) -+ i_readcount_inc(h_inode); -+ put_write_access(h_inode); -+ __mnt_drop_write(hf->f_path.mnt); -+ } -+ } -+ -+out_array: -+ au_farray_free(array, max); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ struct dentry *root; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, mod->h_root); -+ if (bindex < 0) { -+ if (remount) -+ return 0; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", mod->path); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = test_br(d_inode(mod->h_root), mod->perm, mod->path); -+ if (unlikely(err)) -+ goto out; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(mod->h_root != au_br_dentry(br)); -+ if (br->br_perm == mod->perm) -+ return 0; /* success */ -+ -+ /* pre-allocate for non-fhsm --> fhsm */ -+ bf = NULL; -+ if (!au_br_fhsm(br->br_perm) && au_br_fhsm(mod->perm)) { -+ err = au_fhsm_br_alloc(br); -+ if (unlikely(err)) -+ goto out; -+ bf = br->br_fhsm; -+ br->br_fhsm = NULL; -+ } -+ -+ if (au_br_writable(br->br_perm)) { -+ /* remove whiteout base */ -+ err = au_br_init_wh(sb, br, mod->perm); -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (!au_br_writable(mod->perm)) { -+ /* rw --> ro, file might be mmapped */ -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = au_br_mod_files_ro(sb, bindex); -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ if (unlikely(err)) { -+ rerr = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), -+ GFP_NOFS); -+ if (br->br_wbr) -+ rerr = au_wbr_init(br, sb, br->br_perm); -+ if (unlikely(rerr)) { -+ AuIOErr("nested error %d (%d)\n", -+ rerr, err); -+ br->br_perm = mod->perm; -+ } -+ } -+ } -+ } else if (au_br_writable(mod->perm)) { -+ /* ro --> rw */ -+ err = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS); -+ if (br->br_wbr) { -+ err = au_wbr_init(br, sb, mod->perm); -+ if (unlikely(err)) { -+ au_kfree_rcu(br->br_wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (au_br_fhsm(br->br_perm)) { -+ if (!au_br_fhsm(mod->perm)) { -+ /* fhsm --> non-fhsm */ -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_rcu(br->br_fhsm); -+ br->br_fhsm = NULL; -+ } -+ } else if (au_br_fhsm(mod->perm)) -+ /* non-fhsm --> fhsm */ -+ br->br_fhsm = bf; -+ -+ *do_refresh |= need_sigen_inc(br->br_perm, mod->perm); -+ br->br_perm = mod->perm; -+ goto out; /* success */ -+ -+out_bf: -+ au_kfree_try_rcu(bf); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs) -+{ -+ int err; -+ struct kstatfs kstfs; -+ -+ err = vfs_statfs(&br->br_path, &kstfs); -+ if (!err) { -+ stfs->f_blocks = kstfs.f_blocks; -+ stfs->f_bavail = kstfs.f_bavail; -+ stfs->f_files = kstfs.f_files; -+ stfs->f_ffree = kstfs.f_ffree; -+ } -+ -+ return err; -+} -diff --git a/fs/aufs/branch.h b/fs/aufs/branch.h -new file mode 100644 -index 000000000000..5632781b7bcc ---- /dev/null -+++ b/fs/aufs/branch.h -@@ -0,0 +1,351 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * branch filesystems and xino for them -+ */ -+ -+#ifndef __AUFS_BRANCH_H__ -+#define __AUFS_BRANCH_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "dynop.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "super.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* a xino file */ -+struct au_xino { -+ struct file **xi_file; -+ unsigned int xi_nfile; -+ -+ struct { -+ spinlock_t spin; -+ ino_t *array; -+ int total; -+ /* reserved for future use */ -+ /* unsigned long *bitmap; */ -+ wait_queue_head_t wqh; -+ } xi_nondir; -+ -+ struct mutex xi_mtx; /* protects xi_file array */ -+ struct hlist_bl_head xi_writing; -+ -+ atomic_t xi_truncating; -+ -+ struct kref xi_kref; -+}; -+ -+/* File-based Hierarchical Storage Management */ -+struct au_br_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ struct mutex bf_lock; -+ unsigned long bf_jiffy; -+ struct aufs_stfs bf_stfs; -+ int bf_readable; -+#endif -+}; -+ -+/* members for writable branch only */ -+enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; -+struct au_wbr { -+ struct au_rwsem wbr_wh_rwsem; -+ struct dentry *wbr_wh[AuBrWh_Last]; -+ atomic_t wbr_wh_running; -+#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ -+#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ -+#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ -+ -+ /* mfs mode */ -+ unsigned long long wbr_bytes; -+}; -+ -+/* ext2 has 3 types of operations at least, ext3 has 4 */ -+#define AuBrDynOp (AuDyLast * 4) -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+/* support for asynchronous destruction */ -+struct au_br_hfsnotify { -+ struct fsnotify_group *hfsn_group; -+}; -+#endif -+ -+/* sysfs entries */ -+struct au_brsysfs { -+ char name[16]; -+ struct attribute attr; -+}; -+ -+enum { -+ AuBrSysfs_BR, -+ AuBrSysfs_BRID, -+ AuBrSysfs_Last -+}; -+ -+/* protected by superblock rwsem */ -+struct au_branch { -+ struct au_xino *br_xino; -+ -+ aufs_bindex_t br_id; -+ -+ int br_perm; -+ struct path br_path; -+ spinlock_t br_dykey_lock; -+ struct au_dykey *br_dykey[AuBrDynOp]; -+ au_lcnt_t br_nfiles; /* opened files */ -+ au_lcnt_t br_count; /* in-use for other */ -+ -+ struct au_wbr *br_wbr; -+ struct au_br_fhsm *br_fhsm; -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ struct au_br_hfsnotify *br_hfsn; -+#endif -+ -+#ifdef CONFIG_SYSFS -+ /* entries under sysfs per mount-point */ -+ struct au_brsysfs br_sysfs[AuBrSysfs_Last]; -+#endif -+ -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *br_dbgaufs; /* xino */ -+#endif -+ -+ struct au_dr_br br_dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct vfsmount *au_br_mnt(struct au_branch *br) -+{ -+ return br->br_path.mnt; -+} -+ -+static inline struct dentry *au_br_dentry(struct au_branch *br) -+{ -+ return br->br_path.dentry; -+} -+ -+static inline struct super_block *au_br_sb(struct au_branch *br) -+{ -+ return au_br_mnt(br)->mnt_sb; -+} -+ -+static inline int au_br_rdonly(struct au_branch *br) -+{ -+ return (sb_rdonly(au_br_sb(br)) -+ || !au_br_writable(br->br_perm)) -+ ? -EROFS : 0; -+} -+ -+static inline int au_br_hnotifyable(int brperm __maybe_unused) -+{ -+#ifdef CONFIG_AUFS_HNOTIFY -+ return !(brperm & AuBrPerm_RR); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_br_test_oflag(int oflag, struct au_branch *br) -+{ -+ int err, exec_flag; -+ -+ err = 0; -+ exec_flag = oflag & __FMODE_EXEC; -+ if (unlikely(exec_flag && path_noexec(&br->br_path))) -+ err = -EACCES; -+ -+ return err; -+} -+ -+static inline void au_xino_get(struct au_branch *br) -+{ -+ struct au_xino *xi; -+ -+ xi = br->br_xino; -+ if (xi) -+ kref_get(&xi->xi_kref); -+} -+ -+static inline int au_xino_count(struct au_branch *br) -+{ -+ int v; -+ struct au_xino *xi; -+ -+ v = 0; -+ xi = br->br_xino; -+ if (xi) -+ v = kref_read(&xi->xi_kref); -+ -+ return v; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* branch.c */ -+struct au_sbinfo; -+void au_br_free(struct au_sbinfo *sinfo); -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id); -+struct au_opt_add; -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); -+struct au_opt_del; -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); -+long au_ibusy_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+struct au_opt_mod; -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh); -+struct aufs_stfs; -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs); -+ -+/* xino.c */ -+static const loff_t au_loff_max = LLONG_MAX; -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry); -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop); -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src); -+struct au_xi_new { -+ struct au_xino *xi; /* switch between xino and xigen */ -+ int idx; -+ struct path *base; -+ struct file *copy_src; -+}; -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew); -+ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino); -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino); -+ssize_t xino_fread(struct file *file, void *buf, size_t size, loff_t *pos); -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos); -+ -+int au_xib_trunc(struct super_block *sb); -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin); -+ -+struct au_xino *au_xino_alloc(unsigned int nfile); -+int au_xino_put(struct au_branch *br); -+struct file *au_xino_file1(struct au_xino *xi); -+ -+struct au_opt_xino; -+void au_xino_clr(struct super_block *sb); -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount); -+struct file *au_xino_def(struct super_block *sb); -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t hino, -+ struct path *base); -+ -+ino_t au_xino_new_ino(struct super_block *sb); -+void au_xino_delete_inode(struct inode *inode, const int unlinked); -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx); -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx); -+ -+int au_xino_path(struct seq_file *seq, struct file *file); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* @idx is signed to accept -1 meaning the first file */ -+static inline struct file *au_xino_file(struct au_xino *xi, int idx) -+{ -+ struct file *file; -+ -+ file = NULL; -+ if (!xi) -+ goto out; -+ -+ if (idx >= 0) { -+ if (idx < xi->xi_nfile) -+ file = xi->xi_file[idx]; -+ } else -+ file = au_xino_file1(xi); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Superblock to branch */ -+static inline -+aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_id; -+} -+ -+static inline -+struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_mnt(au_sbr(sb, bindex)); -+} -+ -+static inline -+struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_sb(au_sbr(sb, bindex)); -+} -+ -+static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_perm; -+} -+ -+static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_whable(au_sbr_perm(sb, bindex)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define wbr_wh_read_lock(wbr) au_rw_read_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_lock(wbr) au_rw_write_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_read_trylock(wbr) au_rw_read_trylock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock(wbr) au_rw_write_trylock(&(wbr)->wbr_wh_rwsem) -+/* -+#define wbr_wh_read_trylock_nested(wbr) \ -+ au_rw_read_trylock_nested(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock_nested(wbr) \ -+ au_rw_write_trylock_nested(&(wbr)->wbr_wh_rwsem) -+*/ -+ -+#define wbr_wh_read_unlock(wbr) au_rw_read_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_unlock(wbr) au_rw_write_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_downgrade_lock(wbr) au_rw_dgrade_lock(&(wbr)->wbr_wh_rwsem) -+ -+#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&(wbr)->wbr_wh_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_FHSM -+static inline void au_br_fhsm_init(struct au_br_fhsm *brfhsm) -+{ -+ mutex_init(&brfhsm->bf_lock); -+ brfhsm->bf_jiffy = 0; -+ brfhsm->bf_readable = 0; -+} -+ -+static inline void au_br_fhsm_fin(struct au_br_fhsm *brfhsm) -+{ -+ mutex_destroy(&brfhsm->bf_lock); -+} -+#else -+AuStubVoid(au_br_fhsm_init, struct au_br_fhsm *brfhsm) -+AuStubVoid(au_br_fhsm_fin, struct au_br_fhsm *brfhsm) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_BRANCH_H__ */ -diff --git a/fs/aufs/cpup.c b/fs/aufs/cpup.c -new file mode 100644 -index 000000000000..d413ad06ca89 ---- /dev/null -+++ b/fs/aufs/cpup.c -@@ -0,0 +1,1432 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * copy-up functions, see wbr_policy.c for copy-down -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags) -+{ -+ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE -+ | S_NOATIME | S_NOCMTIME | S_AUTOMOUNT; -+ -+ BUILD_BUG_ON(sizeof(iflags) != sizeof(dst->i_flags)); -+ -+ dst->i_flags |= iflags & ~mask; -+ if (au_test_fs_notime(dst->i_sb)) -+ dst->i_flags |= S_NOATIME | S_NOCMTIME; -+} -+ -+void au_cpup_attr_timesizes(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ fsstack_copy_attr_times(inode, h_inode); -+ fsstack_copy_inode_size(inode, h_inode); -+} -+ -+void au_cpup_attr_nlink(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ -+ sb = inode->i_sb; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!force -+ && !S_ISDIR(h_inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode)) -+ return; -+ -+ /* -+ * 0 can happen in revalidating. -+ * h_inode->i_mutex may not be held here, but it is harmless since once -+ * i_nlink reaches 0, it will never become positive except O_TMPFILE -+ * case. -+ * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause -+ * the incorrect link count. -+ */ -+ set_nlink(inode, h_inode->i_nlink); -+ -+ /* -+ * fewer nlink makes find(1) noisy, but larger nlink doesn't. -+ * it may includes whplink directory. -+ */ -+ if (S_ISDIR(h_inode->i_mode)) { -+ bbot = au_ibbot(inode); -+ for (bindex++; bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) -+ au_add_nlink(inode, h_inode); -+ } -+ } -+} -+ -+void au_cpup_attr_changeable(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ inode->i_mode = h_inode->i_mode; -+ inode->i_uid = h_inode->i_uid; -+ inode->i_gid = h_inode->i_gid; -+ au_cpup_attr_timesizes(inode); -+ au_cpup_attr_flags(inode, h_inode->i_flags); -+} -+ -+void au_cpup_igen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ iinfo->ii_higen = h_inode->i_generation; -+ iinfo->ii_hsb1 = h_inode->i_sb; -+} -+ -+void au_cpup_attr_all(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); -+ inode->i_rdev = h_inode->i_rdev; -+ inode->i_blkbits = h_inode->i_blkbits; -+ au_cpup_igen(inode, h_inode); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ -+ -+/* keep the timestamps of the parent dir when cpup */ -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path) -+{ -+ struct inode *h_inode; -+ -+ dt->dt_dentry = dentry; -+ dt->dt_h_path = *h_path; -+ h_inode = d_inode(h_path->dentry); -+ dt->dt_atime = h_inode->i_atime; -+ dt->dt_mtime = h_inode->i_mtime; -+ /* smp_mb(); */ -+} -+ -+void au_dtime_revert(struct au_dtime *dt) -+{ -+ struct iattr attr; -+ int err; -+ -+ attr.ia_atime = dt->dt_atime; -+ attr.ia_mtime = dt->dt_mtime; -+ attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET -+ | ATTR_ATIME | ATTR_ATIME_SET; -+ -+ /* no delegation since this is a directory */ -+ err = vfsub_notify_change(&dt->dt_h_path, &attr, /*delegated*/NULL); -+ if (unlikely(err)) -+ pr_warn("restoring timestamps failed(%d). ignored\n", err); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* internal use only */ -+struct au_cpup_reg_attr { -+ int valid; -+ struct kstat st; -+ unsigned int iflags; /* inode->i_flags */ -+}; -+ -+static noinline_for_stack -+int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct dentry *h_src, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, sbits, icex; -+ unsigned int mnt_flags; -+ unsigned char verbose; -+ struct iattr ia; -+ struct path h_path; -+ struct inode *h_isrc, *h_idst; -+ struct kstat *h_st; -+ struct au_branch *br; -+ -+ h_path.dentry = au_h_dptr(dst, bindex); -+ h_idst = d_inode(h_path.dentry); -+ br = au_sbr(dst->d_sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ h_isrc = d_inode(h_src); -+ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID -+ | ATTR_ATIME | ATTR_MTIME -+ | ATTR_ATIME_SET | ATTR_MTIME_SET; -+ if (h_src_attr && h_src_attr->valid) { -+ h_st = &h_src_attr->st; -+ ia.ia_uid = h_st->uid; -+ ia.ia_gid = h_st->gid; -+ ia.ia_atime = h_st->atime; -+ ia.ia_mtime = h_st->mtime; -+ if (h_idst->i_mode != h_st->mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_st->mode; -+ } -+ sbits = !!(h_st->mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_src_attr->iflags); -+ } else { -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ ia.ia_atime = h_isrc->i_atime; -+ ia.ia_mtime = h_isrc->i_mtime; -+ if (h_idst->i_mode != h_isrc->i_mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ } -+ sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_isrc->i_flags); -+ } -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); -+ } -+ -+ icex = br->br_perm & AuBrAttr_ICEX; -+ if (!err) { -+ mnt_flags = au_mntflags(dst->d_sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ err = au_cpup_xattr(h_path.dentry, h_src, icex, verbose); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, -+ char *buf, unsigned long blksize) -+{ -+ int err; -+ size_t sz, rbytes, wbytes; -+ unsigned char all_zero; -+ char *p, *zp; -+ struct inode *h_inode; -+ /* reduce stack usage */ -+ struct iattr *ia; -+ -+ zp = page_address(ZERO_PAGE(0)); -+ if (unlikely(!zp)) -+ return -ENOMEM; /* possible? */ -+ -+ err = 0; -+ all_zero = 0; -+ while (len) { -+ AuDbg("len %lld\n", len); -+ sz = blksize; -+ if (len < blksize) -+ sz = len; -+ -+ rbytes = 0; -+ /* todo: signal_pending? */ -+ while (!rbytes || err == -EAGAIN || err == -EINTR) { -+ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); -+ err = rbytes; -+ } -+ if (unlikely(err < 0)) -+ break; -+ -+ all_zero = 0; -+ if (len >= rbytes && rbytes == blksize) -+ all_zero = !memcmp(buf, zp, rbytes); -+ if (!all_zero) { -+ wbytes = rbytes; -+ p = buf; -+ while (wbytes) { -+ size_t b; -+ -+ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); -+ err = b; -+ /* todo: signal_pending? */ -+ if (unlikely(err == -EAGAIN || err == -EINTR)) -+ continue; -+ if (unlikely(err < 0)) -+ break; -+ wbytes -= b; -+ p += b; -+ } -+ if (unlikely(err < 0)) -+ break; -+ } else { -+ loff_t res; -+ -+ AuLabel(hole); -+ res = vfsub_llseek(dst, rbytes, SEEK_CUR); -+ err = res; -+ if (unlikely(res < 0)) -+ break; -+ } -+ len -= rbytes; -+ err = 0; -+ } -+ -+ /* the last block may be a hole */ -+ if (!err && all_zero) { -+ AuLabel(last hole); -+ -+ err = 1; -+ if (au_test_nfs(dst->f_path.dentry->d_sb)) { -+ /* nfs requires this step to make last hole */ -+ /* is this only nfs? */ -+ do { -+ /* todo: signal_pending? */ -+ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ if (err == 1) -+ dst->f_pos--; -+ } -+ -+ if (err == 1) { -+ ia = (void *)buf; -+ ia->ia_size = dst->f_pos; -+ ia->ia_valid = ATTR_SIZE | ATTR_FILE; -+ ia->ia_file = dst; -+ h_inode = file_inode(dst); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD2); -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&dst->f_path, ia, -+ /*delegated*/NULL); -+ inode_unlock(h_inode); -+ } -+ } -+ -+ return err; -+} -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ unsigned long blksize; -+ unsigned char do_kfree; -+ char *buf; -+ struct super_block *h_sb; -+ -+ err = -ENOMEM; -+ h_sb = file_inode(dst)->i_sb; -+ blksize = h_sb->s_blocksize; -+ if (!blksize || PAGE_SIZE < blksize) -+ blksize = PAGE_SIZE; -+ AuDbg("blksize %lu\n", blksize); -+ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); -+ if (do_kfree) -+ buf = kmalloc(blksize, GFP_NOFS); -+ else -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ if (len > (1 << 22)) -+ AuDbg("copying a large file %lld\n", (long long)len); -+ -+ src->f_pos = 0; -+ dst->f_pos = 0; -+ err = au_do_copy_file(dst, src, len, buf, blksize); -+ if (do_kfree) { -+ AuDebugOn(!au_kfree_do_sz_test(blksize)); -+ au_kfree_do_rcu(buf); -+ } else -+ free_page((unsigned long)buf); -+ -+out: -+ return err; -+} -+ -+static int au_do_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ -+ /* XFS acquires inode_lock */ -+ if (!au_test_xfs(h_src_sb)) -+ err = au_copy_file(dst, src, len); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = au_copy_file(dst, src, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ -+ return err; -+} -+ -+static int au_clone_or_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ loff_t lo; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ if (h_src_sb != file_inode(dst)->i_sb -+ || !dst->f_op->remap_file_range) { -+ err = au_do_copy(dst, src, len); -+ goto out; -+ } -+ -+ if (!au_test_nfs(h_src_sb)) { -+ inode_unlock_shared(h_src_inode); -+ lo = vfsub_clone_file_range(src, dst, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } else -+ lo = vfsub_clone_file_range(src, dst, len); -+ if (lo == len) { -+ err = 0; -+ goto out; /* success */ -+ } else if (lo >= 0) -+ /* todo: possible? */ -+ /* paritially succeeded */ -+ AuDbg("lo %lld, len %lld. Retrying.\n", lo, len); -+ else if (lo != -EOPNOTSUPP) { -+ /* older XFS has a condition in cloning */ -+ err = lo; -+ goto out; -+ } -+ -+ /* the backend fs on NFS may not support cloning */ -+ err = au_do_copy(dst, src, len); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * to support a sparse file which is opened with O_APPEND, -+ * we need to close the file. -+ */ -+static int au_cp_regular(struct au_cp_generic *cpg) -+{ -+ int err, i; -+ enum { SRC, DST }; -+ struct { -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ struct dentry *dentry; -+ int force_wr; -+ struct file *file; -+ } *f, file[] = { -+ { -+ .bindex = cpg->bsrc, -+ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, -+ }, -+ { -+ .bindex = cpg->bdst, -+ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, -+ .force_wr = !!au_ftest_cpup(cpg->flags, RWDST), -+ } -+ }; -+ struct au_branch *br; -+ struct super_block *sb, *h_src_sb; -+ struct inode *h_src_inode; -+ struct task_struct *tsk = current; -+ -+ /* bsrc branch can be ro/rw. */ -+ sb = cpg->dentry->d_sb; -+ f = file; -+ for (i = 0; i < 2; i++, f++) { -+ f->dentry = au_h_dptr(cpg->dentry, f->bindex); -+ f->file = au_h_open(cpg->dentry, f->bindex, f->flags, -+ /*file*/NULL, f->force_wr); -+ if (IS_ERR(f->file)) { -+ err = PTR_ERR(f->file); -+ if (i == SRC) -+ goto out; -+ else -+ goto out_src; -+ } -+ } -+ -+ /* try stopping to update while we copyup */ -+ h_src_inode = d_inode(file[SRC].dentry); -+ h_src_sb = h_src_inode->i_sb; -+ if (!au_test_nfs(h_src_sb)) -+ IMustLock(h_src_inode); -+ err = au_clone_or_copy(file[DST].file, file[SRC].file, cpg->len); -+ -+ /* i wonder if we had O_NO_DELAY_FPUT flag */ -+ if (tsk->flags & PF_KTHREAD) -+ __fput_sync(file[DST].file); -+ else { -+ /* it happened actually */ -+ fput(file[DST].file); -+ /* -+ * too bad. -+ * we have to call both since we don't know which place the file -+ * was added to. -+ */ -+ task_work_run(); -+ flush_delayed_fput(); -+ } -+ br = au_sbr(sb, file[DST].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ -+out_src: -+ fput(file[SRC].file); -+ br = au_sbr(sb, file[SRC].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+static int au_do_cpup_regular(struct au_cp_generic *cpg, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, rerr; -+ loff_t l; -+ struct path h_path; -+ struct inode *h_src_inode, *h_dst_inode; -+ -+ err = 0; -+ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); -+ l = i_size_read(h_src_inode); -+ if (cpg->len == -1 || l < cpg->len) -+ cpg->len = l; -+ if (cpg->len) { -+ /* try stopping to update while we are referencing */ -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ au_pin_hdir_unlock(cpg->pin); -+ -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc); -+ h_src_attr->iflags = h_src_inode->i_flags; -+ if (!au_test_nfs(h_src_inode->i_sb)) -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ if (unlikely(err)) { -+ inode_unlock_shared(h_src_inode); -+ goto out; -+ } -+ h_src_attr->valid = 1; -+ if (!au_test_nfs(h_src_inode->i_sb)) { -+ err = au_cp_regular(cpg); -+ inode_unlock_shared(h_src_inode); -+ } else { -+ inode_unlock_shared(h_src_inode); -+ err = au_cp_regular(cpg); -+ } -+ rerr = au_pin_hdir_relock(cpg->pin); -+ if (!err && rerr) -+ err = rerr; -+ } -+ if (!err && (h_src_inode->i_state & I_LINKABLE)) { -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_dst_inode = d_inode(h_path.dentry); -+ spin_lock(&h_dst_inode->i_lock); -+ h_dst_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_dst_inode->i_lock); -+ } -+ -+out: -+ return err; -+} -+ -+static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, -+ struct inode *h_dir) -+{ -+ int err; -+ DEFINE_DELAYED_CALL(done); -+ const char *sym; -+ -+ sym = vfs_get_link(h_src, &done); -+ err = PTR_ERR(sym); -+ if (IS_ERR(sym)) -+ goto out; -+ -+ err = vfsub_symlink(h_dir, h_path, sym); -+ -+out: -+ do_delayed_call(&done); -+ return err; -+} -+ -+/* -+ * regardless 'acl' option, reset all ACL. -+ * All ACL will be copied up later from the original entry on the lower branch. -+ */ -+static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) -+{ -+ int err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_dentry = h_path->dentry; -+ h_inode = d_inode(h_dentry); -+ /* forget_all_cached_acls(h_inode)); */ -+ err = vfsub_removexattr(h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (!err) -+ err = vfsub_acl_chmod(h_inode, mode); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_cpup_dir(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct inode *h_dir, struct path *h_path) -+{ -+ int err; -+ struct inode *dir, *inode; -+ -+ err = vfsub_removexattr(h_path->dentry, XATTR_NAME_POSIX_ACL_DEFAULT); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * strange behaviour from the users view, -+ * particularly setattr case -+ */ -+ dir = d_inode(dst_parent); -+ if (au_ibtop(dir) == cpg->bdst) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ inode = d_inode(cpg->dentry); -+ au_cpup_attr_nlink(inode, /*force*/1); -+ -+out: -+ return err; -+} -+ -+static noinline_for_stack -+int cpup_entry(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err; -+ umode_t mode; -+ unsigned int mnt_flags; -+ unsigned char isdir, isreg, force; -+ const unsigned char do_dt = !!au_ftest_cpup(cpg->flags, DTIME); -+ struct au_dtime dt; -+ struct path h_path; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *h_inode, *h_dir; -+ struct super_block *sb; -+ -+ /* bsrc branch can be ro/rw. */ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_inode = d_inode(h_src); -+ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc)); -+ -+ /* try stopping to be referenced while we are creating */ -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ if (au_ftest_cpup(cpg->flags, RENAME)) -+ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX, -+ AUFS_WH_PFX_LEN)); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ AuDebugOn(h_parent != h_dst->d_parent); -+ -+ sb = cpg->dentry->d_sb; -+ h_path.mnt = au_sbr_mnt(sb, cpg->bdst); -+ if (do_dt) { -+ h_path.dentry = h_parent; -+ au_dtime_store(&dt, dst_parent, &h_path); -+ } -+ h_path.dentry = h_dst; -+ -+ isreg = 0; -+ isdir = 0; -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ isreg = 1; -+ err = vfsub_create(h_dir, &h_path, 0600, /*want_excl*/true); -+ if (!err) -+ err = au_do_cpup_regular(cpg, h_src_attr); -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ err = vfsub_mkdir(h_dir, &h_path, mode); -+ if (!err) -+ err = au_do_cpup_dir(cpg, dst_parent, h_dir, &h_path); -+ break; -+ case S_IFLNK: -+ err = au_do_cpup_symlink(&h_path, h_src, h_dir); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ AuDebugOn(!capable(CAP_MKNOD)); -+ fallthrough; -+ case S_IFIFO: -+ case S_IFSOCK: -+ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown inode type 0%o\n", mode); -+ err = -EIO; -+ } -+ if (!err) -+ err = au_reset_acl(h_dir, &h_path, mode); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, UDBA_NONE) -+ && !isdir -+ && au_opt_test(mnt_flags, XINO) -+ && (h_inode->i_nlink == 1 -+ || (h_inode->i_state & I_LINKABLE)) -+ /* todo: unnecessary? */ -+ /* && d_inode(cpg->dentry)->i_nlink == 1 */ -+ && cpg->bdst < cpg->bsrc -+ && !au_ftest_cpup(cpg->flags, KEEPLINO)) -+ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0); -+ /* ignore this error */ -+ -+ if (!err) { -+ force = 0; -+ if (isreg) { -+ force = !!cpg->len; -+ if (cpg->len == -1) -+ force = !!i_size_read(h_inode); -+ } -+ au_fhsm_wrote(sb, cpg->bdst, force); -+ } -+ -+ if (do_dt) -+ au_dtime_revert(&dt); -+ return err; -+} -+ -+static int au_do_ren_after_cpup(struct au_cp_generic *cpg, struct path *h_path) -+{ -+ int err; -+ struct dentry *dentry, *h_dentry, *h_parent, *parent; -+ struct inode *h_dir; -+ aufs_bindex_t bdst; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ h_dentry = au_h_dptr(dentry, bdst); -+ if (!au_ftest_cpup(cpg->flags, OVERWRITE)) { -+ dget(h_dentry); -+ au_set_h_dptr(dentry, bdst, NULL); -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (!err) -+ h_path->dentry = dget(au_h_dptr(dentry, bdst)); -+ au_set_h_dptr(dentry, bdst, h_dentry); -+ } else { -+ err = 0; -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ dput(parent); -+ h_path->dentry = vfsub_lkup_one(&dentry->d_name, h_parent); -+ if (IS_ERR(h_path->dentry)) -+ err = PTR_ERR(h_path->dentry); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ AuDbg("%pd %pd\n", h_dentry, h_path->dentry); -+ /* no delegation since it is just created */ -+ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*delegated*/NULL, -+ /*flags*/0); -+ dput(h_path->dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * copyup the @dentry from @bsrc to @bdst. -+ * the caller must set the both of lower dentries. -+ * @len is for truncating when it is -1 copyup the entire file. -+ * in link/rename cases, @dst_parent may be different from the real one. -+ * basic->bsrc can be larger than basic->bdst. -+ * aufs doesn't touch the credential so -+ * security_inode_copy_up{,_xattr}() are unnecessary. -+ */ -+static int au_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, rerr; -+ aufs_bindex_t old_ibtop; -+ unsigned char isdir, plink; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct path h_path; -+ struct au_cpup_reg_attr h_src_attr; -+ } *a; -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->h_src_attr.valid = 0; -+ -+ sb = cpg->dentry->d_sb; -+ br = au_sbr(sb, cpg->bdst); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ inode = d_inode(cpg->dentry); -+ -+ if (!dst_parent) -+ dst_parent = dget_parent(cpg->dentry); -+ else -+ dget(dst_parent); -+ -+ plink = !!au_opt_test(au_mntflags(sb), PLINK); -+ dst_inode = au_h_iptr(inode, cpg->bdst); -+ if (dst_inode) { -+ if (unlikely(!plink)) { -+ err = -EIO; -+ AuIOErr("hi%lu(i%lu) exists on b%d " -+ "but plink is disabled\n", -+ dst_inode->i_ino, inode->i_ino, cpg->bdst); -+ goto out_parent; -+ } -+ -+ if (dst_inode->i_nlink) { -+ const int do_dt = au_ftest_cpup(cpg->flags, DTIME); -+ -+ h_src = au_plink_lkup(inode, cpg->bdst); -+ err = PTR_ERR(h_src); -+ if (IS_ERR(h_src)) -+ goto out_parent; -+ if (unlikely(d_is_negative(h_src))) { -+ err = -EIO; -+ AuIOErr("i%lu exists on b%d " -+ "but not pseudo-linked\n", -+ inode->i_ino, cpg->bdst); -+ dput(h_src); -+ goto out_parent; -+ } -+ -+ if (do_dt) { -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ } -+ -+ a->h_path.dentry = h_dst; -+ delegated = NULL; -+ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); -+ if (!err && au_ftest_cpup(cpg->flags, RENAME)) -+ err = au_do_ren_after_cpup(cpg, &a->h_path); -+ if (do_dt) -+ au_dtime_revert(&a->dt); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ dput(h_src); -+ goto out_parent; -+ } else -+ /* todo: cpup_wh_file? */ -+ /* udba work */ -+ au_update_ibrange(inode, /*do_put_zero*/1); -+ } -+ -+ isdir = S_ISDIR(inode->i_mode); -+ old_ibtop = au_ibtop(inode); -+ err = cpup_entry(cpg, dst_parent, &a->h_src_attr); -+ if (unlikely(err)) -+ goto out_rev; -+ dst_inode = d_inode(h_dst); -+ inode_lock_nested(dst_inode, AuLsc_I_CHILD2); -+ /* todo: necessary? */ -+ /* au_pin_hdir_unlock(cpg->pin); */ -+ -+ err = cpup_iattr(cpg->dentry, cpg->bdst, h_src, &a->h_src_attr); -+ if (unlikely(err)) { -+ /* todo: necessary? */ -+ /* au_pin_hdir_relock(cpg->pin); */ /* ignore an error */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ -+ if (cpg->bdst < old_ibtop) { -+ if (S_ISREG(inode->i_mode)) { -+ err = au_dy_iaop(inode, cpg->bdst, dst_inode); -+ if (unlikely(err)) { -+ /* ignore an error */ -+ /* au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ } -+ au_set_ibtop(inode, cpg->bdst); -+ } else -+ au_set_ibbot(inode, cpg->bdst); -+ au_set_h_iptr(inode, cpg->bdst, au_igrab(dst_inode), -+ au_hi_flags(inode, isdir)); -+ -+ /* todo: necessary? */ -+ /* err = au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ if (unlikely(err)) -+ goto out_rev; -+ -+ src_inode = d_inode(h_src); -+ if (!isdir -+ && (src_inode->i_nlink > 1 -+ || src_inode->i_state & I_LINKABLE) -+ && plink) -+ au_plink_append(inode, cpg->bdst, h_dst); -+ -+ if (au_ftest_cpup(cpg->flags, RENAME)) { -+ a->h_path.dentry = h_dst; -+ err = au_do_ren_after_cpup(cpg, &a->h_path); -+ } -+ if (!err) -+ goto out_parent; /* success */ -+ -+ /* revert */ -+out_rev: -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ a->h_path.dentry = h_dst; -+ rerr = 0; -+ if (d_is_positive(h_dst)) { -+ if (!isdir) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, -+ /*delegated*/NULL, /*force*/0); -+ } else -+ rerr = vfsub_rmdir(h_dir, &a->h_path); -+ } -+ au_dtime_revert(&a->dt); -+ if (rerr) { -+ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); -+ err = -EIO; -+ } -+out_parent: -+ dput(dst_parent); -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+#if 0 /* reserved */ -+struct au_cpup_single_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct dentry *dst_parent; -+}; -+ -+static void au_call_cpup_single(void *args) -+{ -+ struct au_cpup_single_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_single(a->cpg, a->dst_parent); -+ au_pin_hdir_release(a->cpg->pin); -+} -+#endif -+ -+/* -+ * prevent SIGXFSZ in copy-up. -+ * testing CAP_MKNOD is for generic fs, -+ * but CAP_FSETID is for xfs only, currently. -+ */ -+static int au_cpup_sio_test(struct au_pin *pin, umode_t mode) -+{ -+ int do_sio; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ do_sio = 0; -+ sb = au_pinned_parent(pin)->d_sb; -+ if (!au_wkq_test() -+ && (!au_sbi(sb)->si_plink_maint_pid -+ || au_plink_maint(sb, AuLock_NOPLM))) { -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ /* no condition about RLIMIT_FSIZE and the file size */ -+ do_sio = 1; -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ do_sio = !capable(CAP_MKNOD); -+ break; -+ } -+ if (!do_sio) -+ do_sio = ((mode & (S_ISUID | S_ISGID)) -+ && !capable(CAP_FSETID)); -+ /* this workaround may be removed in the future */ -+ if (!do_sio) { -+ h_dir = au_pinned_h_dir(pin); -+ do_sio = h_dir->i_mode & S_ISVTX; -+ } -+ } -+ -+ return do_sio; -+} -+ -+#if 0 /* reserved */ -+int au_sio_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode)) -+ err = au_cpup_single(cpg, dst_parent); -+ else { -+ struct au_cpup_single_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .dst_parent = dst_parent -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_single, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+#endif -+ -+/* -+ * copyup the @dentry from the first active lower branch to @bdst, -+ * using au_cpup_single(). -+ */ -+static int au_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err; -+ unsigned int flags_orig; -+ struct dentry *dentry; -+ -+ AuDebugOn(cpg->bsrc < 0); -+ -+ dentry = cpg->dentry; -+ DiMustWriteLock(dentry); -+ -+ err = au_lkup_neg(dentry, cpg->bdst, /*wh*/1); -+ if (!err) { -+ flags_orig = cpg->flags; -+ au_fset_cpup(cpg->flags, RENAME); -+ err = au_cpup_single(cpg, NULL); -+ cpg->flags = flags_orig; -+ if (!err) -+ return 0; /* success */ -+ -+ /* revert */ -+ au_set_h_dptr(dentry, cpg->bdst, NULL); -+ au_set_dbtop(dentry, cpg->bsrc); -+ } -+ -+ return err; -+} -+ -+struct au_cpup_simple_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+}; -+ -+static void au_call_cpup_simple(void *args) -+{ -+ struct au_cpup_simple_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_simple(a->cpg); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+static int au_do_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err, wkq_err; -+ struct dentry *dentry, *parent; -+ struct file *h_file; -+ struct inode *h_dir; -+ -+ dentry = cpg->dentry; -+ h_file = NULL; -+ if (au_ftest_cpup(cpg->flags, HOPEN)) { -+ AuDebugOn(cpg->bsrc < 0); -+ h_file = au_h_open_pre(dentry, cpg->bsrc, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ } -+ -+ parent = dget_parent(dentry); -+ h_dir = au_h_iptr(d_inode(parent), cpg->bdst); -+ if (!au_test_h_perm_sio(h_dir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_simple(cpg); -+ else { -+ struct au_cpup_simple_args args = { -+ .errp = &err, -+ .cpg = cpg -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ dput(parent); -+ if (h_file) -+ au_h_open_post(dentry, cpg->bsrc, h_file); -+ -+out: -+ return err; -+} -+ -+int au_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ aufs_bindex_t bsrc, bbot; -+ struct dentry *dentry, *h_dentry; -+ -+ if (cpg->bsrc < 0) { -+ dentry = cpg->dentry; -+ bbot = au_dbbot(dentry); -+ for (bsrc = cpg->bdst + 1; bsrc <= bbot; bsrc++) { -+ h_dentry = au_h_dptr(dentry, bsrc); -+ if (h_dentry) { -+ AuDebugOn(d_is_negative(h_dentry)); -+ break; -+ } -+ } -+ AuDebugOn(bsrc > bbot); -+ cpg->bsrc = bsrc; -+ } -+ AuDebugOn(cpg->bsrc <= cpg->bdst); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+int au_sio_cpdown_simple(struct au_cp_generic *cpg) -+{ -+ AuDebugOn(cpg->bdst <= cpg->bsrc); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * copyup the deleted file for writing. -+ */ -+static int au_do_cpup_wh(struct au_cp_generic *cpg, struct dentry *wh_dentry, -+ struct file *file) -+{ -+ int err; -+ unsigned int flags_orig; -+ aufs_bindex_t bsrc_orig; -+ struct au_dinfo *dinfo; -+ struct { -+ struct au_hdentry *hd; -+ struct dentry *h_dentry; -+ } hdst, hsrc; -+ -+ dinfo = au_di(cpg->dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bsrc_orig = cpg->bsrc; -+ cpg->bsrc = dinfo->di_btop; -+ hdst.hd = au_hdentry(dinfo, cpg->bdst); -+ hdst.h_dentry = hdst.hd->hd_dentry; -+ hdst.hd->hd_dentry = wh_dentry; -+ dinfo->di_btop = cpg->bdst; -+ -+ hsrc.h_dentry = NULL; -+ if (file) { -+ hsrc.hd = au_hdentry(dinfo, cpg->bsrc); -+ hsrc.h_dentry = hsrc.hd->hd_dentry; -+ hsrc.hd->hd_dentry = au_hf_top(file)->f_path.dentry; -+ } -+ flags_orig = cpg->flags; -+ cpg->flags = !AuCpup_DTIME; -+ err = au_cpup_single(cpg, /*h_parent*/NULL); -+ cpg->flags = flags_orig; -+ if (file) { -+ if (!err) -+ err = au_reopen_nondir(file); -+ hsrc.hd->hd_dentry = hsrc.h_dentry; -+ } -+ hdst.hd->hd_dentry = hdst.h_dentry; -+ dinfo->di_btop = cpg->bsrc; -+ cpg->bsrc = bsrc_orig; -+ -+ return err; -+} -+ -+static int au_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err; -+ aufs_bindex_t bdst; -+ struct au_dtime dt; -+ struct dentry *dentry, *parent, *h_parent, *wh_dentry; -+ struct au_branch *br; -+ struct path h_path; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ br = au_sbr(dentry->d_sb, bdst); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ h_path.dentry = h_parent; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, parent, &h_path); -+ err = au_do_cpup_wh(cpg, wh_dentry, file); -+ if (unlikely(err)) -+ goto out_wh; -+ -+ dget(wh_dentry); -+ h_path.dentry = wh_dentry; -+ if (!d_is_dir(wh_dentry)) { -+ /* no delegation since it is just created */ -+ err = vfsub_unlink(d_inode(h_parent), &h_path, -+ /*delegated*/NULL, /*force*/0); -+ } else -+ err = vfsub_rmdir(d_inode(h_parent), &h_path); -+ if (unlikely(err)) { -+ AuIOErr("failed remove copied-up tmp file %pd(%d)\n", -+ wh_dentry, err); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+struct au_cpup_wh_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct file *file; -+}; -+ -+static void au_call_cpup_wh(void *args) -+{ -+ struct au_cpup_wh_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_wh(a->cpg, a->file); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err, wkq_err; -+ aufs_bindex_t bdst; -+ struct dentry *dentry, *parent, *h_orph, *h_parent; -+ struct inode *dir, *h_dir, *h_tmpdir; -+ struct au_wbr *wbr; -+ struct au_pin wh_pin, *pin_orig; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_orph = NULL; -+ h_parent = NULL; -+ h_dir = au_igrab(au_h_iptr(dir, bdst)); -+ h_tmpdir = h_dir; -+ pin_orig = NULL; -+ if (!h_dir->i_nlink) { -+ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; -+ h_orph = wbr->wbr_orph; -+ -+ h_parent = dget(au_h_dptr(parent, bdst)); -+ au_set_h_dptr(parent, bdst, dget(h_orph)); -+ h_tmpdir = d_inode(h_orph); -+ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); -+ -+ inode_lock_nested(h_tmpdir, AuLsc_I_PARENT3); -+ /* todo: au_h_open_pre()? */ -+ -+ pin_orig = cpg->pin; -+ au_pin_init(&wh_pin, dentry, bdst, AuLsc_DI_PARENT, -+ AuLsc_I_PARENT3, cpg->pin->udba, AuPin_DI_LOCKED); -+ cpg->pin = &wh_pin; -+ } -+ -+ if (!au_test_h_perm_sio(h_tmpdir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_wh(cpg, file); -+ else { -+ struct au_cpup_wh_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .file = file -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ if (h_orph) { -+ inode_unlock(h_tmpdir); -+ /* todo: au_h_open_post()? */ -+ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); -+ au_set_h_dptr(parent, bdst, h_parent); -+ AuDebugOn(!pin_orig); -+ cpg->pin = pin_orig; -+ } -+ iput(h_dir); -+ dput(parent); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generic routine for both of copy-up and copy-down. -+ */ -+/* cf. revalidate function in file.c */ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg) -+{ -+ int err; -+ struct au_pin pin; -+ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (IS_ROOT(parent)) -+ goto out; -+ -+ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, -+ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); -+ -+ /* do not use au_dpage */ -+ real_parent = parent; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ if (h_parent) -+ goto out; /* success */ -+ -+ /* find top dir which is necessary to cpup */ -+ do { -+ d = parent; -+ dput(parent); -+ parent = dget_parent(d); -+ di_read_lock_parent3(parent, !AuLock_IR); -+ h_parent = au_h_dptr(parent, bdst); -+ di_read_unlock(parent, !AuLock_IR); -+ } while (!h_parent); -+ -+ if (d != real_parent) -+ di_write_lock_child3(d); -+ -+ /* somebody else might create while we were sleeping */ -+ h_dentry = au_h_dptr(d, bdst); -+ if (!h_dentry || d_is_negative(h_dentry)) { -+ if (h_dentry) -+ au_update_dbtop(d); -+ -+ au_pin_set_dentry(&pin, d); -+ err = au_do_pin(&pin); -+ if (!err) { -+ err = cp(d, bdst, &pin, h_parent, arg); -+ au_unpin(&pin); -+ } -+ } -+ -+ if (d != real_parent) -+ di_write_unlock(d); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent __maybe_unused, -+ void *arg __maybe_unused) -+{ -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = bdst, -+ .bsrc = -1, -+ .len = 0, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ return au_sio_cpup_simple(&cpg); -+} -+ -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); -+} -+ -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ err = 0; -+ if (au_h_iptr(dir, bdst)) -+ goto out; -+ -+ di_read_unlock(parent, AuLock_IR); -+ di_write_lock_parent(parent); -+ /* someone else might change our inode while we were sleeping */ -+ if (!au_h_iptr(dir, bdst)) -+ err = au_cpup_dirs(dentry, bdst); -+ di_downgrade_lock(parent, AuLock_IR); -+ -+out: -+ dput(parent); -+ return err; -+} -diff --git a/fs/aufs/cpup.h b/fs/aufs/cpup.h -new file mode 100644 -index 000000000000..c23c1bbcee7e ---- /dev/null -+++ b/fs/aufs/cpup.h -@@ -0,0 +1,87 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * copy-up/down functions -+ */ -+ -+#ifndef __AUFS_CPUP_H__ -+#define __AUFS_CPUP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct inode; -+struct file; -+struct au_pin; -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags); -+void au_cpup_attr_timesizes(struct inode *inode); -+void au_cpup_attr_nlink(struct inode *inode, int force); -+void au_cpup_attr_changeable(struct inode *inode); -+void au_cpup_igen(struct inode *inode, struct inode *h_inode); -+void au_cpup_attr_all(struct inode *inode, int force); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_cp_generic { -+ struct dentry *dentry; -+ aufs_bindex_t bdst, bsrc; -+ loff_t len; -+ struct au_pin *pin; -+ unsigned int flags; -+}; -+ -+/* cpup flags */ -+#define AuCpup_DTIME 1 /* do dtime_store/revert */ -+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, -+ for link(2) */ -+#define AuCpup_RENAME (1 << 2) /* rename after cpup */ -+#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in -+ cpup */ -+#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the -+ existing entry */ -+#define AuCpup_RWDST (1 << 5) /* force write target even if -+ the branch is marked as RO */ -+ -+#ifndef CONFIG_AUFS_BR_HFSPLUS -+#undef AuCpup_HOPEN -+#define AuCpup_HOPEN 0 -+#endif -+ -+#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) -+#define au_fset_cpup(flags, name) \ -+ do { (flags) |= AuCpup_##name; } while (0) -+#define au_fclr_cpup(flags, name) \ -+ do { (flags) &= ~AuCpup_##name; } while (0) -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len); -+int au_sio_cpup_simple(struct au_cp_generic *cpg); -+int au_sio_cpdown_simple(struct au_cp_generic *cpg); -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file); -+ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg); -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* keep timestamps when copyup */ -+struct au_dtime { -+ struct dentry *dt_dentry; -+ struct path dt_h_path; -+ struct timespec64 dt_atime, dt_mtime; -+}; -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path); -+void au_dtime_revert(struct au_dtime *dt); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_CPUP_H__ */ -diff --git a/fs/aufs/dbgaufs.c b/fs/aufs/dbgaufs.c -new file mode 100644 -index 000000000000..63f40a324f1b ---- /dev/null -+++ b/fs/aufs/dbgaufs.c -@@ -0,0 +1,513 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#include -+#include "aufs.h" -+ -+#ifndef CONFIG_SYSFS -+#error DEBUG_FS depends upon SYSFS -+#endif -+ -+static struct dentry *dbgaufs; -+static const mode_t dbgaufs_mode = 0444; -+ -+/* 20 is max digits length of ulong 64 */ -+struct dbgaufs_arg { -+ int n; -+ char a[20 * 4]; -+}; -+ -+/* -+ * common function for all XINO files -+ */ -+static int dbgaufs_xi_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ void *p; -+ -+ p = file->private_data; -+ if (p) { -+ /* this is struct dbgaufs_arg */ -+ AuDebugOn(!au_kfree_sz_test(p)); -+ au_kfree_do_rcu(p); -+ } -+ return 0; -+} -+ -+static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt, -+ int cnt) -+{ -+ int err; -+ struct kstat st; -+ struct dbgaufs_arg *p; -+ -+ err = -ENOMEM; -+ p = kmalloc(sizeof(*p), GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ p->n = 0; -+ file->private_data = p; -+ if (!xf) -+ goto out; -+ -+ err = vfsub_getattr(&xf->f_path, &st); -+ if (!err) { -+ if (do_fcnt) -+ p->n = snprintf -+ (p->a, sizeof(p->a), "%d, %llux%u %lld\n", -+ cnt, st.blocks, st.blksize, -+ (long long)st.size); -+ else -+ p->n = snprintf(p->a, sizeof(p->a), "%llux%u %lld\n", -+ st.blocks, st.blksize, -+ (long long)st.size); -+ AuDebugOn(p->n >= sizeof(p->a)); -+ } else { -+ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dbgaufs_plink_arg { -+ int n; -+ char a[]; -+}; -+ -+static int dbgaufs_plink_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ free_page((unsigned long)file->private_data); -+ return 0; -+} -+ -+static int dbgaufs_plink_open(struct inode *inode, struct file *file) -+{ -+ int err, i, limit; -+ unsigned long n, sum; -+ struct dbgaufs_plink_arg *p; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct hlist_bl_head *hbl; -+ -+ err = -ENOMEM; -+ p = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = -EFBIG; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ limit = PAGE_SIZE - sizeof(p->n); -+ -+ /* the number of buckets */ -+ n = snprintf(p->a + p->n, limit, "%d\n", AuPlink_NHASH); -+ p->n += n; -+ limit -= n; -+ -+ sum = 0; -+ for (i = 0, hbl = sbinfo->si_plink; i < AuPlink_NHASH; -+ i++, hbl++) { -+ n = au_hbl_count(hbl); -+ sum += n; -+ -+ n = snprintf(p->a + p->n, limit, "%lu ", n); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } -+ p->a[p->n - 1] = '\n'; -+ -+ /* the sum of plinks */ -+ n = snprintf(p->a + p->n, limit, "%lu\n", sum); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } else { -+#define str "1\n0\n0\n" -+ p->n = sizeof(str) - 1; -+ strcpy(p->a, str); -+#undef str -+ } -+ si_read_unlock(sb); -+ -+ err = 0; -+ file->private_data = p; -+ goto out; /* success */ -+ -+out_free: -+ free_page((unsigned long)p); -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_plink_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_plink_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+static const struct file_operations dbgaufs_plink_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_plink_open, -+ .release = dbgaufs_plink_release, -+ .read = dbgaufs_plink_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int dbgaufs_xib_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xib_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xib_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DbgaufsXi_PREFIX "xi" -+ -+static int dbgaufs_xino_open(struct inode *inode, struct file *file) -+{ -+ int err, idx; -+ long l; -+ aufs_bindex_t bindex; -+ char *p, a[sizeof(DbgaufsXi_PREFIX) + 8]; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct au_xino *xi; -+ struct file *xf; -+ struct qstr *name; -+ struct au_branch *br; -+ -+ err = -ENOENT; -+ name = &file->f_path.dentry->d_name; -+ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) -+ || memcmp(name->name, DbgaufsXi_PREFIX, -+ sizeof(DbgaufsXi_PREFIX) - 1))) -+ goto out; -+ -+ AuDebugOn(name->len >= sizeof(a)); -+ memcpy(a, name->name, name->len); -+ a[name->len] = '\0'; -+ p = strchr(a, '-'); -+ if (p) -+ *p = '\0'; -+ err = kstrtol(a + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ bindex = l; -+ idx = 0; -+ if (p) { -+ err = kstrtol(p + 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ idx = l; -+ } -+ -+ err = -ENOENT; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (unlikely(bindex < 0 || bindex > au_sbbot(sb))) -+ goto out_si; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ if (unlikely(idx >= xi->xi_nfile)) -+ goto out_si; -+ xf = au_xino_file(xi, idx); -+ if (xf) -+ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1, -+ au_xino_count(br)); -+ -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xino_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xino_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+void dbgaufs_xino_del(struct au_branch *br) -+{ -+ struct dentry *dbgaufs; -+ -+ dbgaufs = br->br_dbgaufs; -+ if (!dbgaufs) -+ return; -+ -+ br->br_dbgaufs = NULL; -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ debugfs_remove(dbgaufs); -+ lockdep_on(); -+} -+ -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ aufs_bindex_t bbot; -+ struct au_branch *br; -+ -+ if (!au_sbi(sb)->si_dbgaufs) -+ return; -+ -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ dbgaufs_xino_del(br); -+ } -+} -+ -+static void dbgaufs_br_do_add(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int idx, struct dentry *parent, -+ struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct dentry *d; -+ /* "xi" bindex(5) "-" idx(2) NULL */ -+ char name[sizeof(DbgaufsXi_PREFIX) + 8]; -+ -+ if (!idx) -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); -+ else -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d-%u", -+ bindex, idx); -+ br = au_sbr(sb, bindex); -+ if (br->br_dbgaufs) { -+ struct qstr qstr = QSTR_INIT(name, strlen(name)); -+ -+ if (!au_qstreq(&br->br_dbgaufs->d_name, &qstr)) { -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ d = debugfs_rename(parent, br->br_dbgaufs, parent, -+ name); -+ lockdep_on(); -+ if (unlikely(!d)) -+ pr_warn("failed renaming %pd/%s, ignored.\n", -+ parent, name); -+ } -+ } else { -+ lockdep_off(); -+ br->br_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, -+ sbinfo, &dbgaufs_xino_fop); -+ lockdep_on(); -+ if (unlikely(!br->br_dbgaufs)) -+ pr_warn("failed creating %pd/%s, ignored.\n", -+ parent, name); -+ } -+} -+ -+static void dbgaufs_br_add(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *parent, struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct au_xino *xi; -+ unsigned int u; -+ -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) -+ dbgaufs_br_do_add(sb, bindex, u, parent, sbinfo); -+} -+ -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *parent; -+ aufs_bindex_t bbot; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ parent = sbinfo->si_dbgaufs; -+ if (!parent) -+ return; -+ -+ bbot = au_sbbot(sb); -+ if (topdown) -+ for (; bindex <= bbot; bindex++) -+ dbgaufs_br_add(sb, bindex, parent, sbinfo); -+ else -+ for (; bbot >= bindex; bbot--) -+ dbgaufs_br_add(sb, bbot, parent, sbinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+static int dbgaufs_xigen_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xigen_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xigen_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -EIO; -+ sbinfo->si_dbgaufs_xigen = debugfs_create_file -+ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xigen_fop); -+ if (sbinfo->si_dbgaufs_xigen) -+ err = 0; -+ -+ return err; -+} -+#else -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ return 0; -+} -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__fin' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ debugfs_remove_recursive(sbinfo->si_dbgaufs); -+ sbinfo->si_dbgaufs = NULL; -+} -+ -+int dbgaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ char name[SysaufsSiNameLen]; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -ENOENT; -+ if (!dbgaufs) { -+ AuErr1("/debug/aufs is uninitialized\n"); -+ goto out; -+ } -+ -+ err = -EIO; -+ sysaufs_name(sbinfo, name); -+ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); -+ if (unlikely(!sbinfo->si_dbgaufs)) -+ goto out; -+ -+ /* regardless plink/noplink option */ -+ sbinfo->si_dbgaufs_plink = debugfs_create_file -+ ("plink", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_plink_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_plink)) -+ goto out_dir; -+ -+ /* regardless xino/noxino option */ -+ sbinfo->si_dbgaufs_xib = debugfs_create_file -+ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xib_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_xib)) -+ goto out_dir; -+ -+ err = dbgaufs_xigen_init(sbinfo); -+ if (!err) -+ goto out; /* success */ -+ -+out_dir: -+ dbgaufs_si_fin(sbinfo); -+out: -+ if (unlikely(err)) -+ pr_err("debugfs/aufs failed\n"); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_fin(void) -+{ -+ debugfs_remove(dbgaufs); -+} -+ -+int __init dbgaufs_init(void) -+{ -+ int err; -+ -+ err = -EIO; -+ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); -+ if (dbgaufs) -+ err = 0; -+ return err; -+} -diff --git a/fs/aufs/dbgaufs.h b/fs/aufs/dbgaufs.h -new file mode 100644 -index 000000000000..ad26624a9345 ---- /dev/null -+++ b/fs/aufs/dbgaufs.h -@@ -0,0 +1,40 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#ifndef __DBGAUFS_H__ -+#define __DBGAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+struct super_block; -+struct au_sbinfo; -+struct au_branch; -+ -+#ifdef CONFIG_DEBUG_FS -+/* dbgaufs.c */ -+void dbgaufs_xino_del(struct au_branch *br); -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown); -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo); -+int dbgaufs_si_init(struct au_sbinfo *sbinfo); -+void dbgaufs_fin(void); -+int __init dbgaufs_init(void); -+#else -+AuStubVoid(dbgaufs_xino_del, struct au_branch *br) -+AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex, -+ int topdown) -+AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) -+AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) -+AuStubVoid(dbgaufs_fin, void) -+AuStubInt0(__init dbgaufs_init, void) -+#endif /* CONFIG_DEBUG_FS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __DBGAUFS_H__ */ -diff --git a/fs/aufs/dcsub.c b/fs/aufs/dcsub.c -new file mode 100644 -index 000000000000..000854da9075 ---- /dev/null -+++ b/fs/aufs/dcsub.c -@@ -0,0 +1,212 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#include "aufs.h" -+ -+static void au_dpage_free(struct au_dpage *dpage) -+{ -+ int i; -+ struct dentry **p; -+ -+ p = dpage->dentries; -+ for (i = 0; i < dpage->ndentry; i++) -+ dput(*p++); -+ free_page((unsigned long)dpage->dentries); -+} -+ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) -+{ -+ int err; -+ void *p; -+ -+ err = -ENOMEM; -+ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); -+ if (unlikely(!dpages->dpages)) -+ goto out; -+ -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out_dpages; -+ -+ dpages->dpages[0].ndentry = 0; -+ dpages->dpages[0].dentries = p; -+ dpages->ndpage = 1; -+ return 0; /* success */ -+ -+out_dpages: -+ au_kfree_try_rcu(dpages->dpages); -+out: -+ return err; -+} -+ -+void au_dpages_free(struct au_dcsub_pages *dpages) -+{ -+ int i; -+ struct au_dpage *p; -+ -+ p = dpages->dpages; -+ for (i = 0; i < dpages->ndpage; i++) -+ au_dpage_free(p++); -+ au_kfree_try_rcu(dpages->dpages); -+} -+ -+static int au_dpages_append(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, gfp_t gfp) -+{ -+ int err, sz; -+ struct au_dpage *dpage; -+ void *p; -+ -+ dpage = dpages->dpages + dpages->ndpage - 1; -+ sz = PAGE_SIZE / sizeof(dentry); -+ if (unlikely(dpage->ndentry >= sz)) { -+ AuLabel(new dpage); -+ err = -ENOMEM; -+ sz = dpages->ndpage * sizeof(*dpages->dpages); -+ p = au_kzrealloc(dpages->dpages, sz, -+ sz + sizeof(*dpages->dpages), gfp, -+ /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpages->dpages = p; -+ dpage = dpages->dpages + dpages->ndpage; -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpage->ndentry = 0; -+ dpage->dentries = p; -+ dpages->ndpage++; -+ } -+ -+ AuDebugOn(au_dcount(dentry) <= 0); -+ dpage->dentries[dpage->ndentry++] = dget_dlock(dentry); -+ return 0; /* success */ -+ -+out: -+ return err; -+} -+ -+/* todo: BAD approach */ -+/* copied from linux/fs/dcache.c */ -+enum d_walk_ret { -+ D_WALK_CONTINUE, -+ D_WALK_QUIT, -+ D_WALK_NORETRY, -+ D_WALK_SKIP, -+}; -+ -+extern void d_walk(struct dentry *parent, void *data, -+ enum d_walk_ret (*enter)(void *, struct dentry *)); -+ -+struct ac_dpages_arg { -+ int err; -+ struct au_dcsub_pages *dpages; -+ struct super_block *sb; -+ au_dpages_test test; -+ void *arg; -+}; -+ -+static enum d_walk_ret au_call_dpages_append(void *_arg, struct dentry *dentry) -+{ -+ enum d_walk_ret ret; -+ struct ac_dpages_arg *arg = _arg; -+ -+ ret = D_WALK_CONTINUE; -+ if (dentry->d_sb == arg->sb -+ && !IS_ROOT(dentry) -+ && au_dcount(dentry) > 0 -+ && au_di(dentry) -+ && (!arg->test || arg->test(dentry, arg->arg))) { -+ arg->err = au_dpages_append(arg->dpages, dentry, GFP_ATOMIC); -+ if (unlikely(arg->err)) -+ ret = D_WALK_QUIT; -+ } -+ -+ return ret; -+} -+ -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg) -+{ -+ struct ac_dpages_arg args = { -+ .err = 0, -+ .dpages = dpages, -+ .sb = root->d_sb, -+ .test = test, -+ .arg = arg -+ }; -+ -+ d_walk(root, &args, au_call_dpages_append); -+ -+ return args.err; -+} -+ -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg) -+{ -+ int err; -+ -+ err = 0; -+ write_seqlock(&rename_lock); -+ spin_lock(&dentry->d_lock); -+ if (do_include -+ && au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * RCU for vfsmount is unnecessary since this is a traverse in a single -+ * mount -+ */ -+ while (!IS_ROOT(dentry)) { -+ dentry = dentry->d_parent; /* rename_lock is locked */ -+ spin_lock(&dentry->d_lock); -+ if (au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ write_sequnlock(&rename_lock); -+ return err; -+} -+ -+static inline int au_dcsub_dpages_aufs(struct dentry *dentry, void *arg) -+{ -+ return au_di(dentry) && dentry->d_sb == arg; -+} -+ -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include) -+{ -+ return au_dcsub_pages_rev(dpages, dentry, do_include, -+ au_dcsub_dpages_aufs, dentry->d_sb); -+} -+ -+int au_test_subdir(struct dentry *d1, struct dentry *d2) -+{ -+ struct path path[2] = { -+ { -+ .dentry = d1 -+ }, -+ { -+ .dentry = d2 -+ } -+ }; -+ -+ return path_is_under(path + 0, path + 1); -+} -diff --git a/fs/aufs/dcsub.h b/fs/aufs/dcsub.h -new file mode 100644 -index 000000000000..9d207c2b4666 ---- /dev/null -+++ b/fs/aufs/dcsub.h -@@ -0,0 +1,124 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#ifndef __AUFS_DCSUB_H__ -+#define __AUFS_DCSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct au_dpage { -+ int ndentry; -+ struct dentry **dentries; -+}; -+ -+struct au_dcsub_pages { -+ int ndpage; -+ struct au_dpage *dpages; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dcsub.c */ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); -+void au_dpages_free(struct au_dcsub_pages *dpages); -+typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg); -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg); -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include); -+int au_test_subdir(struct dentry *d1, struct dentry *d2); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * todo: in linux-3.13, several similar (but faster) helpers are added to -+ * include/linux/dcache.h. Try them (in the future). -+ */ -+ -+static inline int au_d_hashed_positive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = 0; -+ if (unlikely(d_unhashed(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_d_linkable(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = au_d_hashed_positive(d); -+ if (err -+ && d_is_positive(d) -+ && (inode->i_state & I_LINKABLE)) -+ err = 0; -+ return err; -+} -+ -+static inline int au_d_alive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode; -+ -+ err = 0; -+ if (!IS_ROOT(d)) -+ err = au_d_hashed_positive(d); -+ else { -+ inode = d_inode(d); -+ if (unlikely(d_unlinked(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ } -+ return err; -+} -+ -+static inline int au_alive_dir(struct dentry *d) -+{ -+ int err; -+ -+ err = au_d_alive(d); -+ if (unlikely(err || IS_DEADDIR(d_inode(d)))) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_qstreq(struct qstr *a, struct qstr *b) -+{ -+ return a->len == b->len -+ && !memcmp(a->name, b->name, a->len); -+} -+ -+/* -+ * by the commit -+ * 360f547 2015-01-25 dcache: let the dentry count go down to zero without -+ * taking d_lock -+ * the type of d_lockref.count became int, but the inlined function d_count() -+ * still returns unsigned int. -+ * I don't know why. Maybe it is for every d_count() users? -+ * Anyway au_dcount() lives on. -+ */ -+static inline int au_dcount(struct dentry *d) -+{ -+ return (int)d_count(d); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DCSUB_H__ */ -diff --git a/fs/aufs/debug.c b/fs/aufs/debug.c -new file mode 100644 -index 000000000000..fd0ba9d15742 ---- /dev/null -+++ b/fs/aufs/debug.c -@@ -0,0 +1,428 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* Returns 0, or -errno. arg is in kp->arg. */ -+static int param_atomic_t_set(const char *val, const struct kernel_param *kp) -+{ -+ int err, n; -+ -+ err = kstrtoint(val, 0, &n); -+ if (!err) { -+ if (n > 0) -+ au_debug_on(); -+ else -+ au_debug_off(); -+ } -+ return err; -+} -+ -+/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ -+static int param_atomic_t_get(char *buffer, const struct kernel_param *kp) -+{ -+ atomic_t *a; -+ -+ a = kp->arg; -+ return sprintf(buffer, "%d", atomic_read(a)); -+} -+ -+static struct kernel_param_ops param_ops_atomic_t = { -+ .set = param_atomic_t_set, -+ .get = param_atomic_t_get -+ /* void (*free)(void *arg) */ -+}; -+ -+atomic_t aufs_debug = ATOMIC_INIT(0); -+MODULE_PARM_DESC(debug, "debug print"); -+module_param_named(debug, aufs_debug, atomic_t, 0664); -+ -+DEFINE_MUTEX(au_dbg_mtx); /* just to serialize the dbg msgs */ -+char *au_plevel = KERN_DEBUG; -+#define dpri(fmt, ...) do { \ -+ if ((au_plevel \ -+ && strcmp(au_plevel, KERN_DEBUG)) \ -+ || au_debug_test()) \ -+ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dpri_whlist(struct au_nhash *whlist) -+{ -+ unsigned long ul, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; ul < n; ul++) { -+ hlist_for_each_entry(pos, head, wh_hash) -+ dpri("b%d, %.*s, %d\n", -+ pos->wh_bindex, -+ pos->wh_str.len, pos->wh_str.name, -+ pos->wh_str.len); -+ head++; -+ } -+} -+ -+void au_dpri_vdir(struct au_vdir *vdir) -+{ -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ unsigned char *o; -+ -+ if (!vdir || IS_ERR(vdir)) { -+ dpri("err %ld\n", PTR_ERR(vdir)); -+ return; -+ } -+ -+ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %llu\n", -+ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, -+ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); -+ for (ul = 0; ul < vdir->vd_nblk; ul++) { -+ p.deblk = vdir->vd_deblk[ul]; -+ o = p.deblk; -+ dpri("[%lu]: %p\n", ul, o); -+ } -+} -+ -+static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, -+ struct dentry *wh) -+{ -+ char *n = NULL; -+ int l = 0; -+ -+ if (!inode || IS_ERR(inode)) { -+ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); -+ return -1; -+ } -+ -+ /* the type of i_blocks depends upon CONFIG_LBDAF */ -+ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) -+ && sizeof(inode->i_blocks) != sizeof(u64)); -+ if (wh) { -+ n = (void *)wh->d_name.name; -+ l = wh->d_name.len; -+ } -+ -+ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," -+ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", -+ bindex, inode, -+ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", -+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, -+ i_size_read(inode), (unsigned long long)inode->i_blocks, -+ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff, -+ inode->i_mapping ? inode->i_mapping->nrpages : 0, -+ inode->i_state, inode->i_flags, inode_peek_iversion(inode), -+ inode->i_generation, -+ l ? ", wh " : "", l, n); -+ return 0; -+} -+ -+void au_dpri_inode(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ aufs_bindex_t bindex; -+ int err, hn; -+ -+ err = do_pri_inode(-1, inode, -1, NULL); -+ if (err || !au_test_aufs(inode->i_sb) || au_is_bad_inode(inode)) -+ return; -+ -+ iinfo = au_ii(inode); -+ dpri("i-1: btop %d, bbot %d, gen %d\n", -+ iinfo->ii_btop, iinfo->ii_bbot, au_iigen(inode, NULL)); -+ if (iinfo->ii_btop < 0) -+ return; -+ hn = 0; -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; bindex++) { -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ do_pri_inode(bindex, hi->hi_inode, hn, hi->hi_whdentry); -+ } -+} -+ -+void au_dpri_dalias(struct inode *inode) -+{ -+ struct dentry *d; -+ -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) -+ au_dpri_dentry(d); -+ spin_unlock(&inode->i_lock); -+} -+ -+static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) -+{ -+ struct dentry *wh = NULL; -+ int hn; -+ struct inode *inode; -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ -+ if (!dentry || IS_ERR(dentry)) { -+ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); -+ return -1; -+ } -+ /* do not call dget_parent() here */ -+ /* note: access d_xxx without d_lock */ -+ dpri("d%d: %p, %pd2?, %s, cnt %d, flags 0x%x, %shashed\n", -+ bindex, dentry, dentry, -+ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", -+ au_dcount(dentry), dentry->d_flags, -+ d_unhashed(dentry) ? "un" : ""); -+ hn = -1; -+ inode = NULL; -+ if (d_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (inode -+ && au_test_aufs(dentry->d_sb) -+ && bindex >= 0 -+ && !au_is_bad_inode(inode)) { -+ iinfo = au_ii(inode); -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ wh = hi->hi_whdentry; -+ } -+ do_pri_inode(bindex, inode, hn, wh); -+ return 0; -+} -+ -+void au_dpri_dentry(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_dentry(-1, dentry); -+ if (err || !au_test_aufs(dentry->d_sb)) -+ return; -+ -+ dinfo = au_di(dentry); -+ if (!dinfo) -+ return; -+ dpri("d-1: btop %d, bbot %d, bwh %d, bdiropq %d, gen %d, tmp %d\n", -+ dinfo->di_btop, dinfo->di_bbot, -+ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry), -+ dinfo->di_tmpfile); -+ if (dinfo->di_btop < 0) -+ return; -+ for (bindex = dinfo->di_btop; bindex <= dinfo->di_bbot; bindex++) -+ do_pri_dentry(bindex, au_hdentry(dinfo, bindex)->hd_dentry); -+} -+ -+static int do_pri_file(aufs_bindex_t bindex, struct file *file) -+{ -+ char a[32]; -+ -+ if (!file || IS_ERR(file)) { -+ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); -+ return -1; -+ } -+ a[0] = 0; -+ if (bindex < 0 -+ && !IS_ERR_OR_NULL(file->f_path.dentry) -+ && au_test_aufs(file->f_path.dentry->d_sb) -+ && au_fi(file)) -+ snprintf(a, sizeof(a), ", gen %d, mmapped %d", -+ au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); -+ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", -+ bindex, file->f_mode, file->f_flags, (long)file_count(file), -+ file->f_version, file->f_pos, a); -+ if (!IS_ERR_OR_NULL(file->f_path.dentry)) -+ do_pri_dentry(bindex, file->f_path.dentry); -+ return 0; -+} -+ -+void au_dpri_file(struct file *file) -+{ -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_file(-1, file); -+ if (err -+ || IS_ERR_OR_NULL(file->f_path.dentry) -+ || !au_test_aufs(file->f_path.dentry->d_sb)) -+ return; -+ -+ finfo = au_fi(file); -+ if (!finfo) -+ return; -+ if (finfo->fi_btop < 0) -+ return; -+ fidir = finfo->fi_hdir; -+ if (!fidir) -+ do_pri_file(finfo->fi_btop, finfo->fi_htop.hf_file); -+ else -+ for (bindex = finfo->fi_btop; -+ bindex >= 0 && bindex <= fidir->fd_bbot; -+ bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ do_pri_file(bindex, hfile ? hfile->hf_file : NULL); -+ } -+} -+ -+static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) -+{ -+ struct vfsmount *mnt; -+ struct super_block *sb; -+ -+ if (!br || IS_ERR(br)) -+ goto out; -+ mnt = au_br_mnt(br); -+ if (!mnt || IS_ERR(mnt)) -+ goto out; -+ sb = mnt->mnt_sb; -+ if (!sb || IS_ERR(sb)) -+ goto out; -+ -+ dpri("s%d: {perm 0x%x, id %d, wbr %p}, " -+ "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " -+ "xino %d\n", -+ bindex, br->br_perm, br->br_id, br->br_wbr, -+ au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), -+ sb->s_flags, sb->s_count, -+ atomic_read(&sb->s_active), -+ !!au_xino_file(br->br_xino, /*idx*/-1)); -+ return 0; -+ -+out: -+ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); -+ return -1; -+} -+ -+void au_dpri_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ aufs_bindex_t bindex; -+ int err; -+ /* to reduce stack size */ -+ struct { -+ struct vfsmount mnt; -+ struct au_branch fake; -+ } *a; -+ -+ /* this function can be called from magic sysrq */ -+ a = kzalloc(sizeof(*a), GFP_ATOMIC); -+ if (unlikely(!a)) { -+ dpri("no memory\n"); -+ return; -+ } -+ -+ a->mnt.mnt_sb = sb; -+ a->fake.br_path.mnt = &a->mnt; -+ err = do_pri_br(-1, &a->fake); -+ au_kfree_rcu(a); -+ dpri("dev 0x%x\n", sb->s_dev); -+ if (err || !au_test_aufs(sb)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ dpri("nw %d, gen %u, kobj %d\n", -+ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, -+ kref_read(&sbinfo->si_kobj.kref)); -+ for (bindex = 0; bindex <= sbinfo->si_bbot; bindex++) -+ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line) -+{ -+ struct inode *h_inode, *inode = d_inode(dentry); -+ struct dentry *h_dentry; -+ aufs_bindex_t bindex, bbot, bi; -+ -+ if (!inode /* || au_di(dentry)->di_lsc == AuLsc_DI_TMP */) -+ return; -+ -+ bbot = au_dbbot(dentry); -+ bi = au_ibbot(inode); -+ if (bi < bbot) -+ bbot = bi; -+ bindex = au_dbtop(dentry); -+ bi = au_ibtop(inode); -+ if (bi > bindex) -+ bindex = bi; -+ -+ for (; bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(h_inode != d_inode(h_dentry))) { -+ au_debug_on(); -+ AuDbg("b%d, %s:%d\n", bindex, func, line); -+ AuDbgDentry(dentry); -+ AuDbgInode(inode); -+ au_debug_off(); -+ BUG(); -+ } -+ } -+} -+ -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) -+{ -+ int err, i, j; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ AuDebugOn(err); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/1); -+ AuDebugOn(err); -+ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ for (j = dpage->ndentry - 1; !err && j >= 0; j--) -+ AuDebugOn(au_digen_test(dentries[j], sigen)); -+ } -+ au_dpages_free(&dpages); -+} -+ -+void au_dbg_verify_kthread(void) -+{ -+ if (au_wkq_test()) { -+ au_dbg_blocked(); -+ /* -+ * It may be recursive, but udba=notify between two aufs mounts, -+ * where a single ro branch is shared, is not a problem. -+ */ -+ /* WARN_ON(1); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_debug_init(void) -+{ -+ aufs_bindex_t bindex; -+ struct au_vdir_destr destr; -+ -+ bindex = -1; -+ AuDebugOn(bindex >= 0); -+ -+ destr.len = -1; -+ AuDebugOn(destr.len < NAME_MAX); -+ -+#ifdef CONFIG_4KSTACKS -+ pr_warn("CONFIG_4KSTACKS is defined.\n"); -+#endif -+ -+ return 0; -+} -diff --git a/fs/aufs/debug.h b/fs/aufs/debug.h -new file mode 100644 -index 000000000000..5799794de0c2 ---- /dev/null -+++ b/fs/aufs/debug.h -@@ -0,0 +1,213 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#ifndef __AUFS_DEBUG_H__ -+#define __AUFS_DEBUG_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuDebugOn(a) BUG_ON(a) -+ -+/* module parameter */ -+extern atomic_t aufs_debug; -+static inline void au_debug_on(void) -+{ -+ atomic_inc(&aufs_debug); -+} -+static inline void au_debug_off(void) -+{ -+ atomic_dec_if_positive(&aufs_debug); -+} -+ -+static inline int au_debug_test(void) -+{ -+ return atomic_read(&aufs_debug) > 0; -+} -+#else -+#define AuDebugOn(a) do {} while (0) -+AuStubVoid(au_debug_on, void) -+AuStubVoid(au_debug_off, void) -+AuStubInt0(au_debug_test, void) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+#define param_check_atomic_t(name, p) __param_check(name, p, atomic_t) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* debug print */ -+ -+#define AuDbg(fmt, ...) do { \ -+ if (au_debug_test()) \ -+ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ -+} while (0) -+#define AuLabel(l) AuDbg(#l "\n") -+#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) -+#define AuWarn1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_warn(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_err(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuIOErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ AuIOErr(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuUnsupportMsg "This operation is not supported." \ -+ " Please report this application to aufs-users ML." -+#define AuUnsupport(fmt, ...) do { \ -+ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ -+ dump_stack(); \ -+} while (0) -+ -+#define AuTraceErr(e) do { \ -+ if (unlikely((e) < 0)) \ -+ AuDbg("err %d\n", (int)(e)); \ -+} while (0) -+ -+#define AuTraceErrPtr(p) do { \ -+ if (IS_ERR(p)) \ -+ AuDbg("err %ld\n", PTR_ERR(p)); \ -+} while (0) -+ -+/* dirty macros for debug print, use with "%.*s" and caution */ -+#define AuLNPair(qstr) (qstr)->len, (qstr)->name -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry; -+#ifdef CONFIG_AUFS_DEBUG -+extern struct mutex au_dbg_mtx; -+extern char *au_plevel; -+struct au_nhash; -+void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; -+void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; -+void au_dpri_inode(struct inode *inode); -+void au_dpri_dalias(struct inode *inode); -+void au_dpri_dentry(struct dentry *dentry); -+struct file; -+void au_dpri_file(struct file *filp); -+struct super_block; -+void au_dpri_sb(struct super_block *sb); -+ -+#define au_dbg_verify_dinode(d) __au_dbg_verify_dinode(d, __func__, __LINE__) -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line); -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); -+void au_dbg_verify_kthread(void); -+ -+int __init au_debug_init(void); -+ -+#define AuDbgWhlist(w) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#w "\n"); \ -+ au_dpri_whlist(w); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgVdir(v) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#v "\n"); \ -+ au_dpri_vdir(v); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgInode(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_inode(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDAlias(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_dalias(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDentry(d) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#d "\n"); \ -+ au_dpri_dentry(d); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgFile(f) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#f "\n"); \ -+ au_dpri_file(f); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSb(sb) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#sb "\n"); \ -+ au_dpri_sb(sb); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSym(addr) do { \ -+ char sym[KSYM_SYMBOL_LEN]; \ -+ sprint_symbol(sym, (unsigned long)addr); \ -+ AuDbg("%s\n", sym); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry) -+AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) -+AuStubVoid(au_dbg_verify_kthread, void) -+AuStubInt0(__init au_debug_init, void) -+ -+#define AuDbgWhlist(w) do {} while (0) -+#define AuDbgVdir(v) do {} while (0) -+#define AuDbgInode(i) do {} while (0) -+#define AuDbgDAlias(i) do {} while (0) -+#define AuDbgDentry(d) do {} while (0) -+#define AuDbgFile(f) do {} while (0) -+#define AuDbgSb(sb) do {} while (0) -+#define AuDbgSym(addr) do {} while (0) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+int __init au_sysrq_init(void); -+void au_sysrq_fin(void); -+ -+#ifdef CONFIG_HW_CONSOLE -+#define au_dbg_blocked() do { \ -+ WARN_ON(1); \ -+ handle_sysrq('w'); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_blocked, void) -+#endif -+ -+#else -+AuStubInt0(__init au_sysrq_init, void) -+AuStubVoid(au_sysrq_fin, void) -+AuStubVoid(au_dbg_blocked, void) -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DEBUG_H__ */ -diff --git a/fs/aufs/dentry.c b/fs/aufs/dentry.c -new file mode 100644 -index 000000000000..1a029193315a ---- /dev/null -+++ b/fs/aufs/dentry.c -@@ -0,0 +1,1141 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * returns positive/negative dentry, NULL or an error. -+ * NULL means whiteout-ed or not-found. -+ */ -+static struct dentry* -+au_do_lookup(struct dentry *h_parent, struct dentry *dentry, -+ aufs_bindex_t bindex, struct au_do_lookup_args *args) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_branch *br; -+ int wh_found, opq; -+ unsigned char wh_able; -+ const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG); -+ const unsigned char ignore_perm = !!au_ftest_lkup(args->flags, -+ IGNORE_PERM); -+ -+ wh_found = 0; -+ br = au_sbr(dentry->d_sb, bindex); -+ wh_able = !!au_br_whable(br->br_perm); -+ if (wh_able) -+ wh_found = au_wh_test(h_parent, &args->whname, ignore_perm); -+ h_dentry = ERR_PTR(wh_found); -+ if (!wh_found) -+ goto real_lookup; -+ if (unlikely(wh_found < 0)) -+ goto out; -+ -+ /* We found a whiteout */ -+ /* au_set_dbbot(dentry, bindex); */ -+ au_set_dbwh(dentry, bindex); -+ if (!allow_neg) -+ return NULL; /* success */ -+ -+real_lookup: -+ if (!ignore_perm) -+ h_dentry = vfsub_lkup_one(args->name, h_parent); -+ else -+ h_dentry = au_sio_lkup_one(args->name, h_parent); -+ if (IS_ERR(h_dentry)) { -+ if (PTR_ERR(h_dentry) == -ENAMETOOLONG -+ && !allow_neg) -+ h_dentry = NULL; -+ goto out; -+ } -+ -+ h_inode = d_inode(h_dentry); -+ if (d_is_negative(h_dentry)) { -+ if (!allow_neg) -+ goto out_neg; -+ } else if (wh_found -+ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) -+ goto out_neg; -+ else if (au_ftest_lkup(args->flags, DIRREN) -+ /* && h_inode */ -+ && !au_dr_lkup_h_ino(args, bindex, h_inode->i_ino)) { -+ AuDbg("b%d %pd ignored hi%llu\n", bindex, h_dentry, -+ (unsigned long long)h_inode->i_ino); -+ goto out_neg; -+ } -+ -+ if (au_dbbot(dentry) <= bindex) -+ au_set_dbbot(dentry, bindex); -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+ if (!d_is_dir(h_dentry) -+ || !wh_able -+ || (d_really_is_positive(dentry) && !d_is_dir(dentry))) -+ goto out; /* success */ -+ -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ opq = au_diropq_test(h_dentry); -+ inode_unlock_shared(h_inode); -+ if (opq > 0) -+ au_set_dbdiropq(dentry, bindex); -+ else if (unlikely(opq < 0)) { -+ au_set_h_dptr(dentry, bindex, NULL); -+ h_dentry = ERR_PTR(opq); -+ } -+ goto out; -+ -+out_neg: -+ dput(h_dentry); -+ h_dentry = NULL; -+out: -+ return h_dentry; -+} -+ -+static int au_test_shwh(struct super_block *sb, const struct qstr *name) -+{ -+ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) -+ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) -+ return -EPERM; -+ return 0; -+} -+ -+/* -+ * returns the number of lower positive dentries, -+ * otherwise an error. -+ * can be called at unlinking with @type is zero. -+ */ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags) -+{ -+ int npositive, err; -+ aufs_bindex_t bindex, btail, bdiropq; -+ unsigned char isdir, dirperm1, dirren; -+ struct au_do_lookup_args args = { -+ .flags = flags, -+ .name = &dentry->d_name -+ }; -+ struct dentry *parent; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = au_test_shwh(sb, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_wh_name_alloc(&args.whname, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ isdir = !!d_is_dir(dentry); -+ dirperm1 = !!au_opt_test(au_mntflags(sb), DIRPERM1); -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ if (dirren) -+ au_fset_lkup(args.flags, DIRREN); -+ -+ npositive = 0; -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ struct dentry *h_parent, *h_dentry; -+ struct inode *h_inode, *h_dir; -+ struct au_branch *br; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) { -+ if (d_is_positive(h_dentry)) -+ npositive++; -+ break; -+ } -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !d_is_dir(h_parent)) -+ continue; -+ -+ if (dirren) { -+ /* if the inum matches, then use the prepared name */ -+ err = au_dr_lkup_name(&args, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ h_dentry = au_do_lookup(h_parent, dentry, bindex, &args); -+ inode_unlock_shared(h_dir); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out_parent; -+ if (h_dentry) -+ au_fclr_lkup(args.flags, ALLOW_NEG); -+ if (dirperm1) -+ au_fset_lkup(args.flags, IGNORE_PERM); -+ -+ if (au_dbwh(dentry) == bindex) -+ break; -+ if (!h_dentry) -+ continue; -+ if (d_is_negative(h_dentry)) -+ continue; -+ h_inode = d_inode(h_dentry); -+ npositive++; -+ if (!args.type) -+ args.type = h_inode->i_mode & S_IFMT; -+ if (args.type != S_IFDIR) -+ break; -+ else if (isdir) { -+ /* the type of lower may be different */ -+ bdiropq = au_dbdiropq(dentry); -+ if (bdiropq >= 0 && bdiropq <= bindex) -+ break; -+ } -+ br = au_sbr(sb, bindex); -+ if (dirren -+ && au_dr_hino_test_add(&br->br_dirren, h_inode->i_ino, -+ /*add_ent*/NULL)) { -+ /* prepare next name to lookup */ -+ err = au_dr_lkup(&args, dentry, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ } -+ -+ if (npositive) { -+ AuLabel(positive); -+ au_update_dbtop(dentry); -+ } -+ err = npositive; -+ if (unlikely(!au_opt_test(au_mntflags(sb), UDBA_NONE) -+ && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuIOErr("both of real entry and whiteout found, %pd, err %d\n", -+ dentry, err); -+ } -+ -+out_parent: -+ dput(parent); -+ au_kfree_try_rcu(args.whname.name); -+ if (dirren) -+ au_dr_lkup_fin(&args); -+out: -+ return err; -+} -+ -+struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent) -+{ -+ struct dentry *dentry; -+ int wkq_err; -+ -+ if (!au_test_h_perm_sio(d_inode(parent), MAY_EXEC)) -+ dentry = vfsub_lkup_one(name, parent); -+ else { -+ struct vfsub_lkup_one_args args = { -+ .errp = &dentry, -+ .name = name, -+ .parent = parent -+ }; -+ -+ wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args); -+ if (unlikely(wkq_err)) -+ dentry = ERR_PTR(wkq_err); -+ } -+ -+ return dentry; -+} -+ -+/* -+ * lookup @dentry on @bindex which should be negative. -+ */ -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh) -+{ -+ int err; -+ struct dentry *parent, *h_parent, *h_dentry; -+ struct au_branch *br; -+ -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bindex); -+ br = au_sbr(dentry->d_sb, bindex); -+ if (wh) -+ h_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); -+ else -+ h_dentry = au_sio_lkup_one(&dentry->d_name, h_parent); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out; -+ if (unlikely(d_is_positive(h_dentry))) { -+ err = -EIO; -+ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex); -+ dput(h_dentry); -+ goto out; -+ } -+ -+ err = 0; -+ if (bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ if (au_dbbot(dentry) < bindex) -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* subset of struct inode */ -+struct au_iattr { -+ unsigned long i_ino; -+ /* unsigned int i_nlink; */ -+ kuid_t i_uid; -+ kgid_t i_gid; -+ u64 i_version; -+/* -+ loff_t i_size; -+ blkcnt_t i_blocks; -+*/ -+ umode_t i_mode; -+}; -+ -+static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) -+{ -+ ia->i_ino = h_inode->i_ino; -+ /* ia->i_nlink = h_inode->i_nlink; */ -+ ia->i_uid = h_inode->i_uid; -+ ia->i_gid = h_inode->i_gid; -+ ia->i_version = inode_query_iversion(h_inode); -+/* -+ ia->i_size = h_inode->i_size; -+ ia->i_blocks = h_inode->i_blocks; -+*/ -+ ia->i_mode = (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) -+{ -+ return ia->i_ino != h_inode->i_ino -+ /* || ia->i_nlink != h_inode->i_nlink */ -+ || !uid_eq(ia->i_uid, h_inode->i_uid) -+ || !gid_eq(ia->i_gid, h_inode->i_gid) -+ || !inode_eq_iversion(h_inode, ia->i_version) -+/* -+ || ia->i_size != h_inode->i_size -+ || ia->i_blocks != h_inode->i_blocks -+*/ -+ || ia->i_mode != (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, -+ struct au_branch *br) -+{ -+ int err; -+ struct au_iattr ia; -+ struct inode *h_inode; -+ struct dentry *h_d; -+ struct super_block *h_sb; -+ -+ err = 0; -+ memset(&ia, -1, sizeof(ia)); -+ h_sb = h_dentry->d_sb; -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) { -+ h_inode = d_inode(h_dentry); -+ au_iattr_save(&ia, h_inode); -+ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) -+ /* nfs d_revalidate may return 0 for negative dentry */ -+ /* fuse d_revalidate always return 0 for negative dentry */ -+ goto out; -+ -+ /* main purpose is namei.c:cached_lookup() and d_revalidate */ -+ h_d = vfsub_lkup_one(&h_dentry->d_name, h_parent); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out; -+ -+ err = 0; -+ if (unlikely(h_d != h_dentry -+ || d_inode(h_d) != h_inode -+ || (h_inode && au_iattr_test(&ia, h_inode)))) -+ err = au_busy_or_stale(); -+ dput(h_d); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (udba == AuOpt_UDBA_REVAL -+ && !au_test_fs_remote(h_dentry->d_sb)) { -+ IMustLock(h_dir); -+ err = (d_inode(h_dentry->d_parent) != h_dir); -+ } else if (udba != AuOpt_UDBA_NONE) -+ err = au_h_verify_dentry(h_dentry, h_parent, br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_refresh_hdentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err; -+ aufs_bindex_t new_bindex, bindex, bbot, bwh, bdiropq; -+ struct au_hdentry tmp, *p, *q; -+ struct au_dinfo *dinfo; -+ struct super_block *sb; -+ -+ DiMustWriteLock(dentry); -+ -+ sb = dentry->d_sb; -+ dinfo = au_di(dentry); -+ bbot = dinfo->di_bbot; -+ bwh = dinfo->di_bwh; -+ bdiropq = dinfo->di_bdiropq; -+ bindex = dinfo->di_btop; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) { -+ if (!p->hd_dentry) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hd_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (dinfo->di_bwh == bindex) -+ bwh = new_bindex; -+ if (dinfo->di_bdiropq == bindex) -+ bdiropq = new_bindex; -+ if (new_bindex < 0) { -+ au_hdput(p); -+ p->hd_dentry = NULL; -+ continue; -+ } -+ -+ /* swap two lower dentries, and loop again */ -+ q = au_hdentry(dinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hd_dentry) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ dinfo->di_bwh = -1; -+ if (bwh >= 0 && bwh <= au_sbbot(sb) && au_sbr_whable(sb, bwh)) -+ dinfo->di_bwh = bwh; -+ -+ dinfo->di_bdiropq = -1; -+ if (bdiropq >= 0 -+ && bdiropq <= au_sbbot(sb) -+ && au_sbr_whable(sb, bdiropq)) -+ dinfo->di_bdiropq = bdiropq; -+ -+ err = -EIO; -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ bbot = au_dbbot(parent); -+ bindex = 0; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) -+ if (p->hd_dentry) { -+ dinfo->di_btop = bindex; -+ break; -+ } -+ -+ if (dinfo->di_btop >= 0) { -+ bindex = bbot; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex >= 0; bindex--, p--) -+ if (p->hd_dentry) { -+ dinfo->di_bbot = bindex; -+ err = 0; -+ break; -+ } -+ } -+ -+ return err; -+} -+ -+static void au_do_hide(struct dentry *dentry) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ if (!d_is_dir(dentry)) { -+ if (inode->i_nlink && !d_unhashed(dentry)) -+ drop_nlink(inode); -+ } else { -+ clear_nlink(inode); -+ /* stop next lookup */ -+ inode->i_flags |= S_DEAD; -+ } -+ smp_mb(); /* necessary? */ -+ } -+ d_drop(dentry); -+} -+ -+static int au_hide_children(struct dentry *parent) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *dentry; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, parent, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ /* in reverse order */ -+ for (i = dpages.ndpage - 1; i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = ndentry - 1; j >= 0; j--) { -+ dentry = dpage->dentries[j]; -+ if (dentry != parent) -+ au_do_hide(dentry); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static void au_hide(struct dentry *dentry) -+{ -+ int err; -+ -+ AuDbgDentry(dentry); -+ if (d_is_dir(dentry)) { -+ /* shrink_dcache_parent(dentry); */ -+ err = au_hide_children(dentry); -+ if (unlikely(err)) -+ AuIOErr("%pd, failed hiding children, ignored %d\n", -+ dentry, err); -+ } -+ au_do_hide(dentry); -+} -+ -+/* -+ * By adding a dirty branch, a cached dentry may be affected in various ways. -+ * -+ * a dirty branch is added -+ * - on the top of layers -+ * - in the middle of layers -+ * - to the bottom of layers -+ * -+ * on the added branch there exists -+ * - a whiteout -+ * - a diropq -+ * - a same named entry -+ * + exist -+ * * negative --> positive -+ * * positive --> positive -+ * - type is unchanged -+ * - type is changed -+ * + doesn't exist -+ * * negative --> negative -+ * * positive --> negative (rejected by au_br_del() for non-dir case) -+ * - none -+ */ -+static int au_refresh_by_dinfo(struct dentry *dentry, struct au_dinfo *dinfo, -+ struct au_dinfo *tmp) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct { -+ struct dentry *dentry; -+ struct inode *inode; -+ mode_t mode; -+ } orig_h, tmp_h = { -+ .dentry = NULL -+ }; -+ struct au_hdentry *hd; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ -+ err = 0; -+ AuDebugOn(dinfo->di_btop < 0); -+ orig_h.mode = 0; -+ orig_h.dentry = au_hdentry(dinfo, dinfo->di_btop)->hd_dentry; -+ orig_h.inode = NULL; -+ if (d_is_positive(orig_h.dentry)) { -+ orig_h.inode = d_inode(orig_h.dentry); -+ orig_h.mode = orig_h.inode->i_mode & S_IFMT; -+ } -+ if (tmp->di_btop >= 0) { -+ tmp_h.dentry = au_hdentry(tmp, tmp->di_btop)->hd_dentry; -+ if (d_is_positive(tmp_h.dentry)) { -+ tmp_h.inode = d_inode(tmp_h.dentry); -+ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT; -+ } -+ } -+ -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (!orig_h.inode) { -+ AuDbg("negative originally\n"); -+ if (inode) { -+ au_hide(dentry); -+ goto out; -+ } -+ AuDebugOn(inode); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ AuDebugOn(dinfo->di_bdiropq != -1); -+ -+ if (!tmp_h.inode) { -+ AuDbg("negative --> negative\n"); -+ /* should have only one negative lower */ -+ if (tmp->di_btop >= 0 -+ && tmp->di_btop < dinfo->di_btop) { -+ AuDebugOn(tmp->di_btop != tmp->di_bbot); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ au_set_h_dptr(dentry, dinfo->di_btop, NULL); -+ au_di_cp(dinfo, tmp); -+ hd = au_hdentry(tmp, tmp->di_btop); -+ au_set_h_dptr(dentry, tmp->di_btop, -+ dget(hd->hd_dentry)); -+ } -+ au_dbg_verify_dinode(dentry); -+ } else { -+ AuDbg("negative --> positive\n"); -+ /* -+ * similar to the behaviour of creating with bypassing -+ * aufs. -+ * unhash it in order to force an error in the -+ * succeeding create operation. -+ * we should not set S_DEAD here. -+ */ -+ d_drop(dentry); -+ /* au_di_swap(tmp, dinfo); */ -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive originally\n"); -+ /* inode may be NULL */ -+ AuDebugOn(inode && (inode->i_mode & S_IFMT) != orig_h.mode); -+ if (!tmp_h.inode) { -+ AuDbg("positive --> negative\n"); -+ /* or bypassing aufs */ -+ au_hide(dentry); -+ if (tmp->di_bwh >= 0 && tmp->di_bwh <= dinfo->di_btop) -+ dinfo->di_bwh = tmp->di_bwh; -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else if (orig_h.mode == tmp_h.mode) { -+ AuDbg("positive --> positive, same type\n"); -+ if (!S_ISDIR(orig_h.mode) -+ && dinfo->di_btop > tmp->di_btop) { -+ /* -+ * similar to the behaviour of removing and -+ * creating. -+ */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else { -+ /* fill empty slots */ -+ if (dinfo->di_btop > tmp->di_btop) -+ dinfo->di_btop = tmp->di_btop; -+ if (dinfo->di_bbot < tmp->di_bbot) -+ dinfo->di_bbot = tmp->di_bbot; -+ dinfo->di_bwh = tmp->di_bwh; -+ dinfo->di_bdiropq = tmp->di_bdiropq; -+ bbot = dinfo->di_bbot; -+ bindex = tmp->di_btop; -+ hd = au_hdentry(tmp, bindex); -+ for (; bindex <= bbot; bindex++, hd++) { -+ if (au_h_dptr(dentry, bindex)) -+ continue; -+ h_dentry = hd->hd_dentry; -+ if (!h_dentry) -+ continue; -+ AuDebugOn(d_is_negative(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ AuDebugOn(orig_h.mode -+ != (h_inode->i_mode -+ & S_IFMT)); -+ au_set_h_dptr(dentry, bindex, -+ dget(h_dentry)); -+ } -+ if (inode) -+ err = au_refresh_hinode(inode, dentry); -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive --> positive, different type\n"); -+ /* similar to the behaviour of removing and creating */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } -+ } -+ -+out: -+ return err; -+} -+ -+void au_refresh_dop(struct dentry *dentry, int force_reval) -+{ -+ const struct dentry_operations *dop -+ = force_reval ? &aufs_dop : dentry->d_sb->s_d_op; -+ static const unsigned int mask -+ = DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE; -+ -+ BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags)); -+ -+ if (dentry->d_op == dop) -+ return; -+ -+ AuDbg("%pd\n", dentry); -+ spin_lock(&dentry->d_lock); -+ if (dop == &aufs_dop) -+ dentry->d_flags |= mask; -+ else -+ dentry->d_flags &= ~mask; -+ dentry->d_op = dop; -+ spin_unlock(&dentry->d_lock); -+} -+ -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err, ebrange, nbr; -+ unsigned int sigen; -+ struct au_dinfo *dinfo, *tmp; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ DiMustWriteLock(dentry); -+ AuDebugOn(IS_ROOT(dentry)); -+ AuDebugOn(d_really_is_negative(parent)); -+ -+ sb = dentry->d_sb; -+ sigen = au_sigen(sb); -+ err = au_digen_test(parent, sigen); -+ if (unlikely(err)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ dinfo = au_di(dentry); -+ err = au_di_realloc(dinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ ebrange = au_dbrange_test(dentry); -+ if (!ebrange) -+ ebrange = au_do_refresh_hdentry(dentry, parent); -+ -+ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) { -+ AuDebugOn(au_dbtop(dentry) < 0 && au_dbbot(dentry) >= 0); -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ err = au_refresh_hinode_self(inode); -+ } -+ au_dbg_verify_dinode(dentry); -+ if (!err) -+ goto out_dgen; /* success */ -+ goto out; -+ } -+ -+ /* temporary dinfo */ -+ AuDbgDentry(dentry); -+ err = -ENOMEM; -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ /* -+ * if current working dir is removed, it returns an error. -+ * but the dentry is legal. -+ */ -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ AuDbgDentry(dentry); -+ au_di_swap(tmp, dinfo); -+ if (err == -ENOENT) -+ err = 0; -+ if (err >= 0) { -+ /* compare/refresh by dinfo */ -+ AuDbgDentry(dentry); -+ err = au_refresh_by_dinfo(dentry, dinfo, tmp); -+ au_dbg_verify_dinode(dentry); -+ AuTraceErr(err); -+ } -+ au_di_realloc(dinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err)) -+ goto out; -+ -+out_dgen: -+ au_update_digen(dentry); -+out: -+ if (unlikely(err && !(dentry->d_flags & DCACHE_NFSFS_RENAMED))) { -+ AuIOErr("failed refreshing %pd, %d\n", dentry, err); -+ AuDbgDentry(dentry); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_h_d_reval(struct dentry *h_dentry, unsigned int flags, -+ struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, valid; -+ -+ err = 0; -+ if (!(h_dentry->d_flags & DCACHE_OP_REVALIDATE)) -+ goto out; -+ -+ AuDbg("b%d\n", bindex); -+ /* -+ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, -+ * due to whiteout and branch permission. -+ */ -+ flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE -+ | LOOKUP_FOLLOW | LOOKUP_EXCL); -+ /* it may return tri-state */ -+ valid = h_dentry->d_op->d_revalidate(h_dentry, flags); -+ -+ if (unlikely(valid < 0)) -+ err = valid; -+ else if (!valid) -+ err = -EINVAL; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: remove this */ -+static int h_d_revalidate(struct dentry *dentry, struct inode *inode, -+ unsigned int flags, int do_udba, int dirren) -+{ -+ int err; -+ umode_t mode, h_mode; -+ aufs_bindex_t bindex, btail, btop, ibs, ibe; -+ unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; -+ struct inode *h_inode, *h_cached_inode; -+ struct dentry *h_dentry; -+ struct qstr *name, *h_name; -+ -+ err = 0; -+ plus = 0; -+ mode = 0; -+ ibs = -1; -+ ibe = -1; -+ unhashed = !!d_unhashed(dentry); -+ is_root = !!IS_ROOT(dentry); -+ name = &dentry->d_name; -+ tmpfile = au_di(dentry)->di_tmpfile; -+ -+ /* -+ * Theoretically, REVAL test should be unnecessary in case of -+ * {FS,I}NOTIFY. -+ * But {fs,i}notify doesn't fire some necessary events, -+ * IN_ATTRIB for atime/nlink/pageio -+ * Let's do REVAL test too. -+ */ -+ if (do_udba && inode) { -+ mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); -+ ibs = au_ibtop(inode); -+ ibe = au_ibbot(inode); -+ } -+ -+ btop = au_dbtop(dentry); -+ btail = btop; -+ if (inode && S_ISDIR(inode->i_mode)) -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ AuDbg("b%d, %pd\n", bindex, h_dentry); -+ h_nfs = !!au_test_nfs(h_dentry->d_sb); -+ spin_lock(&h_dentry->d_lock); -+ h_name = &h_dentry->d_name; -+ if (unlikely(do_udba -+ && !is_root -+ && ((!h_nfs -+ && (unhashed != !!d_unhashed(h_dentry) -+ || (!tmpfile && !dirren -+ && !au_qstreq(name, h_name)) -+ )) -+ || (h_nfs -+ && !(flags & LOOKUP_OPEN) -+ && (h_dentry->d_flags -+ & DCACHE_NFSFS_RENAMED))) -+ )) { -+ int h_unhashed; -+ -+ h_unhashed = d_unhashed(h_dentry); -+ spin_unlock(&h_dentry->d_lock); -+ AuDbg("unhash 0x%x 0x%x, %pd %pd\n", -+ unhashed, h_unhashed, dentry, h_dentry); -+ goto err; -+ } -+ spin_unlock(&h_dentry->d_lock); -+ -+ err = au_do_h_d_reval(h_dentry, flags, dentry, bindex); -+ if (unlikely(err)) -+ /* do not goto err, to keep the errno */ -+ break; -+ -+ /* todo: plink too? */ -+ if (!do_udba) -+ continue; -+ -+ /* UDBA tests */ -+ if (unlikely(!!inode != d_is_positive(h_dentry))) -+ goto err; -+ -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ h_plus = plus; -+ h_mode = mode; -+ h_cached_inode = h_inode; -+ if (h_inode) { -+ h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); -+ } -+ if (inode && ibs <= bindex && bindex <= ibe) -+ h_cached_inode = au_h_iptr(inode, bindex); -+ -+ if (!h_nfs) { -+ if (unlikely(plus != h_plus && !tmpfile)) -+ goto err; -+ } else { -+ if (unlikely(!(h_dentry->d_flags & DCACHE_NFSFS_RENAMED) -+ && !is_root -+ && !IS_ROOT(h_dentry) -+ && unhashed != d_unhashed(h_dentry))) -+ goto err; -+ } -+ if (unlikely(mode != h_mode -+ || h_cached_inode != h_inode)) -+ goto err; -+ continue; -+ -+err: -+ err = -EINVAL; -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: consolidate with do_refresh() and au_reval_for_attr() */ -+static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ if (!au_digen_test(dentry, sigen)) -+ return 0; -+ -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ AuDebugOn(au_digen_test(parent, sigen)); -+ au_dbg_verify_gen(parent, sigen); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *d, *parent; -+ -+ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR)) -+ return simple_reval_dpath(dentry, sigen); -+ -+ /* slow loop, keep it simple and stupid */ -+ /* cf: au_cpup_dirs() */ -+ err = 0; -+ parent = NULL; -+ while (au_digen_test(dentry, sigen)) { -+ d = dentry; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(d); -+ if (!au_digen_test(parent, sigen)) -+ break; -+ d = parent; -+ } -+ -+ if (d != dentry) -+ di_write_lock_child2(d); -+ -+ /* someone might update our dentry while we were sleeping */ -+ if (au_digen_test(d, sigen)) { -+ /* -+ * todo: consolidate with simple_reval_dpath(), -+ * do_refresh() and au_reval_for_attr(). -+ */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(d, parent); -+ di_read_unlock(parent, AuLock_IR); -+ } -+ -+ if (d != dentry) -+ di_write_unlock(d); -+ dput(parent); -+ if (unlikely(err)) -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * if valid returns 1, otherwise 0. -+ */ -+static int aufs_d_revalidate(struct dentry *dentry, unsigned int flags) -+{ -+ int valid, err; -+ unsigned int sigen; -+ unsigned char do_udba, dirren; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ /* todo: support rcu-walk? */ -+ if (flags & LOOKUP_RCU) -+ return -ECHILD; -+ -+ valid = 0; -+ if (unlikely(!au_di(dentry))) -+ goto out; -+ -+ valid = 1; -+ sb = dentry->d_sb; -+ /* -+ * todo: very ugly -+ * i_mutex of parent dir may be held, -+ * but we should not return 'invalid' due to busy. -+ */ -+ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW | AuLock_NOPLM); -+ if (unlikely(err)) { -+ valid = err; -+ AuTraceErr(err); -+ goto out; -+ } -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (unlikely(inode && au_is_bad_inode(inode))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ if (unlikely(au_dbrange_test(dentry))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ -+ sigen = au_sigen(sb); -+ if (au_digen_test(dentry, sigen)) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_dpath(dentry, sigen); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ } -+ di_downgrade_lock(dentry, AuLock_IR); -+ -+ err = -EINVAL; -+ if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) -+ && inode -+ && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !inode->i_nlink)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ -+ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); -+ if (do_udba && inode) { -+ aufs_bindex_t btop = au_ibtop(inode); -+ struct inode *h_inode; -+ -+ if (btop >= 0) { -+ h_inode = au_h_iptr(inode, btop); -+ if (h_inode && au_test_higen(inode, h_inode)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ } -+ } -+ -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ err = h_d_revalidate(dentry, inode, flags, do_udba, dirren); -+ if (unlikely(!err && do_udba && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuDbg("both of real entry and whiteout found, %p, err %d\n", -+ dentry, err); -+ } -+ goto out_inval; -+ -+out_dgrade: -+ di_downgrade_lock(dentry, AuLock_IR); -+out_inval: -+ aufs_read_unlock(dentry, AuLock_IR); -+ AuTraceErr(err); -+ valid = !err; -+out: -+ if (!valid) { -+ AuDbg("%pd invalid, %d\n", dentry, valid); -+ d_drop(dentry); -+ } -+ return valid; -+} -+ -+static void aufs_d_release(struct dentry *dentry) -+{ -+ if (au_di(dentry)) { -+ au_di_fin(dentry); -+ au_hn_di_reinit(dentry); -+ } -+} -+ -+const struct dentry_operations aufs_dop = { -+ .d_revalidate = aufs_d_revalidate, -+ .d_weak_revalidate = aufs_d_revalidate, -+ .d_release = aufs_d_release -+}; -+ -+/* aufs_dop without d_revalidate */ -+const struct dentry_operations aufs_dop_noreval = { -+ .d_release = aufs_d_release -+}; -diff --git a/fs/aufs/dentry.h b/fs/aufs/dentry.h -new file mode 100644 -index 000000000000..086f6ccf4b15 ---- /dev/null -+++ b/fs/aufs/dentry.h -@@ -0,0 +1,255 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#ifndef __AUFS_DENTRY_H__ -+#define __AUFS_DENTRY_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "rwsem.h" -+ -+struct au_hdentry { -+ struct dentry *hd_dentry; -+ aufs_bindex_t hd_id; -+}; -+ -+struct au_dinfo { -+ atomic_t di_generation; -+ -+ struct au_rwsem di_rwsem; -+ aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; -+ unsigned char di_tmpfile; /* to allow the different name */ -+ struct au_hdentry *di_hdentry; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* flags for au_lkup_dentry() */ -+#define AuLkup_ALLOW_NEG 1 -+#define AuLkup_IGNORE_PERM (1 << 1) -+#define AuLkup_DIRREN (1 << 2) -+#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) -+#define au_fset_lkup(flags, name) \ -+ do { (flags) |= AuLkup_##name; } while (0) -+#define au_fclr_lkup(flags, name) \ -+ do { (flags) &= ~AuLkup_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuLkup_DIRREN -+#define AuLkup_DIRREN 0 -+#endif -+ -+struct au_do_lookup_args { -+ unsigned int flags; -+ mode_t type; -+ struct qstr whname, *name; -+ struct au_dr_lookup dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dentry.c */ -+extern const struct dentry_operations aufs_dop, aufs_dop_noreval; -+struct au_branch; -+struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent); -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br); -+ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags); -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh); -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent); -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen); -+void au_refresh_dop(struct dentry *dentry, int force_reval); -+ -+/* dinfo.c */ -+void au_di_init_once(void *_di); -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc); -+void au_di_free(struct au_dinfo *dinfo); -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b); -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src); -+int au_di_init(struct dentry *dentry); -+void au_di_fin(struct dentry *dentry); -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink); -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc); -+void di_read_unlock(struct dentry *d, int flags); -+void di_downgrade_lock(struct dentry *d, int flags); -+void di_write_lock(struct dentry *d, unsigned int lsc); -+void di_write_unlock(struct dentry *d); -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex); -+aufs_bindex_t au_dbtail(struct dentry *dentry); -+aufs_bindex_t au_dbtaildir(struct dentry *dentry); -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+int au_digen_test(struct dentry *dentry, unsigned int sigen); -+int au_dbrange_test(struct dentry *dentry); -+void au_update_digen(struct dentry *dentry); -+void au_update_dbrange(struct dentry *dentry, int do_put_zero); -+void au_update_dbtop(struct dentry *dentry); -+void au_update_dbbot(struct dentry *dentry); -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_dinfo *au_di(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for dinfo */ -+enum { -+ AuLsc_DI_CHILD, /* child first */ -+ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_DI_CHILD3, /* copyup dirs */ -+ AuLsc_DI_PARENT, -+ AuLsc_DI_PARENT2, -+ AuLsc_DI_PARENT3, -+ AuLsc_DI_TMP /* temp for replacing dinfo */ -+}; -+ -+/* -+ * di_read_lock_child, di_write_lock_child, -+ * di_read_lock_child2, di_write_lock_child2, -+ * di_read_lock_child3, di_write_lock_child3, -+ * di_read_lock_parent, di_write_lock_parent, -+ * di_read_lock_parent2, di_write_lock_parent2, -+ * di_read_lock_parent3, di_write_lock_parent3, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void di_read_lock_##name(struct dentry *d, int flags) \ -+{ di_read_lock(d, flags, AuLsc_DI_##lsc); } -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void di_write_lock_##name(struct dentry *d) \ -+{ di_write_lock(d, AuLsc_DI_##lsc); } -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) -+#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) -+#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_digen(struct dentry *d) -+{ -+ return atomic_read(&au_di(d)->di_generation); -+} -+ -+static inline void au_h_dentry_init(struct au_hdentry *hdentry) -+{ -+ hdentry->hd_dentry = NULL; -+} -+ -+static inline struct au_hdentry *au_hdentry(struct au_dinfo *di, -+ aufs_bindex_t bindex) -+{ -+ return di->di_hdentry + bindex; -+} -+ -+static inline void au_hdput(struct au_hdentry *hd) -+{ -+ if (hd) -+ dput(hd->hd_dentry); -+} -+ -+static inline aufs_bindex_t au_dbtop(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_btop; -+} -+ -+static inline aufs_bindex_t au_dbbot(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bbot; -+} -+ -+static inline aufs_bindex_t au_dbwh(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bwh; -+} -+ -+static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bdiropq; -+} -+ -+/* todo: hard/soft set? */ -+static inline void au_set_dbtop(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_btop = bindex; -+} -+ -+static inline void au_set_dbbot(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bbot = bindex; -+} -+ -+static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ /* dbwh can be outside of btop - bbot range */ -+ au_di(dentry)->di_bwh = bindex; -+} -+ -+static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bdiropq = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_HNOTIFY -+static inline void au_digen_dec(struct dentry *d) -+{ -+ atomic_dec(&au_di(d)->di_generation); -+} -+ -+static inline void au_hn_di_reinit(struct dentry *dentry) -+{ -+ dentry->d_fsdata = NULL; -+} -+#else -+AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DENTRY_H__ */ -diff --git a/fs/aufs/dinfo.c b/fs/aufs/dinfo.c -new file mode 100644 -index 000000000000..aed5314e5e24 ---- /dev/null -+++ b/fs/aufs/dinfo.c -@@ -0,0 +1,541 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * dentry private data -+ */ -+ -+#include "aufs.h" -+ -+void au_di_init_once(void *_dinfo) -+{ -+ struct au_dinfo *dinfo = _dinfo; -+ -+ au_rw_init(&dinfo->di_rwsem); -+} -+ -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc) -+{ -+ struct au_dinfo *dinfo; -+ int nbr, i; -+ -+ dinfo = au_cache_alloc_dinfo(); -+ if (unlikely(!dinfo)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr <= 0) -+ nbr = 1; -+ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); -+ if (dinfo->di_hdentry) { -+ au_rw_write_lock_nested(&dinfo->di_rwsem, lsc); -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ dinfo->di_bwh = -1; -+ dinfo->di_bdiropq = -1; -+ dinfo->di_tmpfile = 0; -+ for (i = 0; i < nbr; i++) -+ dinfo->di_hdentry[i].hd_id = -1; -+ goto out; -+ } -+ -+ au_cache_free_dinfo(dinfo); -+ dinfo = NULL; -+ -+out: -+ return dinfo; -+} -+ -+void au_di_free(struct au_dinfo *dinfo) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bbot, bindex; -+ -+ /* dentry may not be revalidated */ -+ bindex = dinfo->di_btop; -+ if (bindex >= 0) { -+ bbot = dinfo->di_bbot; -+ p = au_hdentry(dinfo, bindex); -+ while (bindex++ <= bbot) -+ au_hdput(p++); -+ } -+ au_kfree_try_rcu(dinfo->di_hdentry); -+ au_cache_free_dinfo(dinfo); -+} -+ -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bi; -+ -+ AuRwMustWriteLock(&a->di_rwsem); -+ AuRwMustWriteLock(&b->di_rwsem); -+ -+#define DiSwap(v, name) \ -+ do { \ -+ v = a->di_##name; \ -+ a->di_##name = b->di_##name; \ -+ b->di_##name = v; \ -+ } while (0) -+ -+ DiSwap(p, hdentry); -+ DiSwap(bi, btop); -+ DiSwap(bi, bbot); -+ DiSwap(bi, bwh); -+ DiSwap(bi, bdiropq); -+ /* smp_mb(); */ -+ -+#undef DiSwap -+} -+ -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src) -+{ -+ AuRwMustWriteLock(&dst->di_rwsem); -+ AuRwMustWriteLock(&src->di_rwsem); -+ -+ dst->di_btop = src->di_btop; -+ dst->di_bbot = src->di_bbot; -+ dst->di_bwh = src->di_bwh; -+ dst->di_bdiropq = src->di_bdiropq; -+ /* smp_mb(); */ -+} -+ -+int au_di_init(struct dentry *dentry) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_dinfo *dinfo; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ dinfo = au_di_alloc(sb, AuLsc_DI_CHILD); -+ if (dinfo) { -+ atomic_set(&dinfo->di_generation, au_sigen(sb)); -+ /* smp_mb(); */ /* atomic_set */ -+ dentry->d_fsdata = dinfo; -+ } else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_di_fin(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ -+ dinfo = au_di(dentry); -+ AuRwDestroy(&dinfo->di_rwsem); -+ au_di_free(dinfo); -+} -+ -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*hdp) * (dinfo->di_bbot + 1); -+ if (!sz) -+ sz = sizeof(*hdp); -+ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hdp) { -+ dinfo->di_hdentry = hdp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void do_ii_write_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_write_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_write_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_write_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_write_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_write_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_write_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static void do_ii_read_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_read_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_read_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_read_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_read_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_read_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_read_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc) -+{ -+ struct inode *inode; -+ -+ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) -+ do_ii_write_lock(inode, lsc); -+ else if (au_ftest_lock(flags, IR)) -+ do_ii_read_lock(inode, lsc); -+ } -+} -+ -+void di_read_unlock(struct dentry *d, int flags) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) { -+ au_dbg_verify_dinode(d); -+ ii_write_unlock(inode); -+ } else if (au_ftest_lock(flags, IR)) { -+ au_dbg_verify_dinode(d); -+ ii_read_unlock(inode); -+ } -+ } -+ au_rw_read_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_downgrade_lock(struct dentry *d, int flags) -+{ -+ if (d_really_is_positive(d) && au_ftest_lock(flags, IR)) -+ ii_downgrade_lock(d_inode(d)); -+ au_rw_dgrade_lock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock(struct dentry *d, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) -+ do_ii_write_lock(d_inode(d), lsc); -+} -+ -+void di_write_unlock(struct dentry *d) -+{ -+ au_dbg_verify_dinode(d); -+ if (d_really_is_positive(d)) -+ ii_write_unlock(d_inode(d)); -+ au_rw_write_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_child(d1); -+ di_write_lock_child2(d2); -+ } else { -+ di_write_lock_child(d2); -+ di_write_lock_child2(d1); -+ } -+} -+ -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_parent(d1); -+ di_write_lock_parent2(d2); -+ } else { -+ di_write_lock_parent(d2); -+ di_write_lock_parent2(d1); -+ } -+} -+ -+void di_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock(d1); -+ if (d_inode(d1) == d_inode(d2)) -+ au_rw_write_unlock(&au_di(d2)->di_rwsem); -+ else -+ di_write_unlock(d2); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *d; -+ -+ DiMustAnyLock(dentry); -+ -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ return NULL; -+ AuDebugOn(bindex < 0); -+ d = au_hdentry(au_di(dentry), bindex)->hd_dentry; -+ AuDebugOn(d && au_dcount(d) <= 0); -+ return d; -+} -+ -+/* -+ * extended version of au_h_dptr(). -+ * returns a hashed and positive (or linkable) h_dentry in bindex, NULL, or -+ * error. -+ */ -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ AuDebugOn(d_really_is_negative(dentry)); -+ -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex -+ && bindex <= au_dbbot(dentry)) -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && !au_d_linkable(h_dentry)) { -+ dget(h_dentry); -+ goto out; /* success */ -+ } -+ -+ inode = d_inode(dentry); -+ AuDebugOn(bindex < au_ibtop(inode)); -+ AuDebugOn(au_ibbot(inode) < bindex); -+ h_inode = au_h_iptr(inode, bindex); -+ h_dentry = d_find_alias(h_inode); -+ if (h_dentry) { -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_linkable(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ } else -+ goto out; -+ } -+ -+ if (au_opt_test(au_mntflags(dentry->d_sb), PLINK)) { -+ h_dentry = au_plink_lkup(inode, bindex); -+ AuDebugOn(!h_dentry); -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_hashed_positive(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ h_dentry = NULL; -+ } -+ } -+ -+out: -+ AuDbgDentry(h_dentry); -+ return h_dentry; -+} -+ -+aufs_bindex_t au_dbtail(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bwh; -+ -+ bbot = au_dbbot(dentry); -+ if (0 <= bbot) { -+ bwh = au_dbwh(dentry); -+ if (!bwh) -+ return bwh; -+ if (0 < bwh && bwh < bbot) -+ return bwh - 1; -+ } -+ return bbot; -+} -+ -+aufs_bindex_t au_dbtaildir(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bopq; -+ -+ bbot = au_dbtail(dentry); -+ if (0 <= bbot) { -+ bopq = au_dbdiropq(dentry); -+ if (0 <= bopq && bopq < bbot) -+ bbot = bopq; -+ } -+ return bbot; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct au_dinfo *dinfo; -+ struct au_hdentry *hd; -+ struct au_branch *br; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ hd = au_hdentry(dinfo, bindex); -+ au_hdput(hd); -+ hd->hd_dentry = h_dentry; -+ if (h_dentry) { -+ br = au_sbr(dentry->d_sb, bindex); -+ hd->hd_id = br->br_id; -+ } -+} -+ -+int au_dbrange_test(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ -+ err = 0; -+ btop = au_dbtop(dentry); -+ bbot = au_dbbot(dentry); -+ if (btop >= 0) -+ AuDebugOn(bbot < 0 && btop > bbot); -+ else { -+ err = -EIO; -+ AuDebugOn(bbot >= 0); -+ } -+ -+ return err; -+} -+ -+int au_digen_test(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(au_digen(dentry) != sigen -+ || au_iigen_test(d_inode(dentry), sigen))) -+ err = -EIO; -+ -+ return err; -+} -+ -+void au_update_digen(struct dentry *dentry) -+{ -+ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+void au_update_dbrange(struct dentry *dentry, int do_put_zero) -+{ -+ struct au_dinfo *dinfo; -+ struct dentry *h_d; -+ struct au_hdentry *hdp; -+ aufs_bindex_t bindex, bbot; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ if (!dinfo || dinfo->di_btop < 0) -+ return; -+ -+ if (do_put_zero) { -+ bbot = dinfo->di_bbot; -+ bindex = dinfo->di_btop; -+ hdp = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, hdp++) { -+ h_d = hdp->hd_dentry; -+ if (h_d && d_is_negative(h_d)) -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+ } -+ -+ dinfo->di_btop = 0; -+ hdp = au_hdentry(dinfo, dinfo->di_btop); -+ for (; dinfo->di_btop <= dinfo->di_bbot; dinfo->di_btop++, hdp++) -+ if (hdp->hd_dentry) -+ break; -+ if (dinfo->di_btop > dinfo->di_bbot) { -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ return; -+ } -+ -+ hdp = au_hdentry(dinfo, dinfo->di_bbot); -+ for (; dinfo->di_bbot >= 0; dinfo->di_bbot--, hdp--) -+ if (hdp->hd_dentry) -+ break; -+ AuDebugOn(dinfo->di_btop > dinfo->di_bbot || dinfo->di_bbot < 0); -+} -+ -+void au_update_dbtop(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct dentry *h_dentry; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbtop(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+void au_update_dbbot(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, btop; -+ struct dentry *h_dentry; -+ -+ btop = au_dbtop(dentry); -+ for (bindex = au_dbbot(dentry); bindex >= btop; bindex--) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbbot(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) -+ if (au_h_dptr(dentry, bindex) == h_dentry) -+ return bindex; -+ return -1; -+} -diff --git a/fs/aufs/dir.c b/fs/aufs/dir.c -new file mode 100644 -index 000000000000..44adae19efb1 ---- /dev/null -+++ b/fs/aufs/dir.c -@@ -0,0 +1,750 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+void au_add_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink += 2; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen in revaliding */ -+ set_nlink(dir, nlink); -+} -+ -+void au_sub_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink -= 2; -+ smp_mb(); /* for i_nlink */ -+ /* nlink == 0 means the branch-fs is broken */ -+ set_nlink(dir, nlink); -+} -+ -+loff_t au_dir_size(struct file *file, struct dentry *dentry) -+{ -+ loff_t sz; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ sz = 0; -+ if (file) { -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file && file_inode(h_file)) -+ sz += vfsub_f_size_read(h_file); -+ } -+ } else { -+ AuDebugOn(!dentry); -+ AuDebugOn(!d_is_dir(dentry)); -+ -+ bbot = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) -+ sz += i_size_read(d_inode(h_dentry)); -+ } -+ } -+ if (sz < KMALLOC_MAX_SIZE) -+ sz = roundup_pow_of_two(sz); -+ if (sz > KMALLOC_MAX_SIZE) -+ sz = KMALLOC_MAX_SIZE; -+ else if (sz < NAME_MAX) { -+ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); -+ sz = AUFS_RDBLK_DEF; -+ } -+ return sz; -+} -+ -+struct au_dir_ts_arg { -+ struct dentry *dentry; -+ aufs_bindex_t brid; -+}; -+ -+static void au_do_dir_ts(void *arg) -+{ -+ struct au_dir_ts_arg *a = arg; -+ struct au_dtime dt; -+ struct path h_path; -+ struct inode *dir, *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ int err; -+ aufs_bindex_t btop, bindex; -+ -+ sb = a->dentry->d_sb; -+ if (d_really_is_negative(a->dentry)) -+ goto out; -+ /* no dir->i_mutex lock */ -+ aufs_read_lock(a->dentry, AuLock_DW); /* noflush */ -+ -+ dir = d_inode(a->dentry); -+ btop = au_ibtop(dir); -+ bindex = au_br_index(sb, a->brid); -+ if (bindex < btop) -+ goto out_unlock; -+ -+ br = au_sbr(sb, bindex); -+ h_path.dentry = au_h_dptr(a->dentry, bindex); -+ if (!h_path.dentry) -+ goto out_unlock; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, a->dentry, &h_path); -+ -+ br = au_sbr(sb, btop); -+ if (!au_br_writable(br->br_perm)) -+ goto out_unlock; -+ h_path.dentry = au_h_dptr(a->dentry, btop); -+ h_path.mnt = au_br_mnt(br); -+ err = vfsub_mnt_want_write(h_path.mnt); -+ if (err) -+ goto out_unlock; -+ hdir = au_hi(dir, btop); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ h_dir = au_h_iptr(dir, btop); -+ if (h_dir->i_nlink -+ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { -+ dt.dt_h_path = h_path; -+ au_dtime_revert(&dt); -+ } -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(h_path.mnt); -+ au_cpup_attr_timesizes(dir); -+ -+out_unlock: -+ aufs_read_unlock(a->dentry, AuLock_DW); -+out: -+ dput(a->dentry); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_try_rcu(arg); -+} -+ -+void au_dir_ts(struct inode *dir, aufs_bindex_t bindex) -+{ -+ int perm, wkq_err; -+ aufs_bindex_t btop; -+ struct au_dir_ts_arg *arg; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ dentry = d_find_any_alias(dir); -+ AuDebugOn(!dentry); -+ sb = dentry->d_sb; -+ btop = au_ibtop(dir); -+ if (btop == bindex) { -+ au_cpup_attr_timesizes(dir); -+ goto out; -+ } -+ -+ perm = au_sbr_perm(sb, btop); -+ if (!au_br_writable(perm)) -+ goto out; -+ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (!arg) -+ goto out; -+ -+ arg->dentry = dget(dentry); /* will be dput-ted by au_do_dir_ts() */ -+ arg->brid = au_sbr_id(sb, bindex); -+ wkq_err = au_wkq_nowait(au_do_dir_ts, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_err("wkq %d\n", wkq_err); -+ dput(dentry); -+ au_kfree_try_rcu(arg); -+ } -+ -+out: -+ dput(dentry); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int reopen_dir(struct file *file) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bindex, btail, btop; -+ struct dentry *dentry, *h_dentry; -+ struct file *h_file; -+ -+ /* open all lower dirs */ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ for (bindex = au_fbtop(file); bindex < btop; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, btop); -+ -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_fbbot_dir(file); btail < bindex; bindex--) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbbot_dir(file, btail); -+ -+ flags = vfsub_file_flags(file); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ continue; -+ -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; /* close all? */ -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static int do_open_dir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex, btail; -+ struct dentry *dentry, *h_dentry; -+ struct vfsmount *mnt; -+ -+ FiMustWriteLock(file); -+ AuDebugOn(h_file); -+ -+ err = 0; -+ mnt = file->f_path.mnt; -+ dentry = file->f_path.dentry; -+ file->f_version = inode_query_iversion(d_inode(dentry)); -+ bindex = au_dbtop(dentry); -+ au_set_fbtop(file, bindex); -+ btail = au_dbtaildir(dentry); -+ au_set_fbbot_dir(file, btail); -+ for (; !err && bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ err = vfsub_test_mntns(mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ break; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ break; -+ } -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ if (!err) -+ return 0; /* success */ -+ -+ /* close all */ -+ for (bindex = au_fbtop(file); bindex <= btail; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, -1); -+ au_set_fbbot_dir(file, -1); -+ -+ return err; -+} -+ -+static int aufs_open_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ err = -ENOMEM; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ fidir = au_fidir_alloc(sb); -+ if (fidir) { -+ struct au_do_open_args args = { -+ .open = do_open_dir, -+ .fidir = fidir -+ }; -+ err = au_do_open(file, &args); -+ if (unlikely(err)) -+ au_kfree_rcu(fidir); -+ } -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_release_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ struct au_vdir *vdir_cache; -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hf; -+ aufs_bindex_t bindex, bbot; -+ -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ if (fidir) { -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ vdir_cache = fidir->fd_vdir_cache; /* lock-free */ -+ if (vdir_cache) -+ au_vdir_free(vdir_cache); -+ -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) { -+ hf = fidir->fd_hfile + bindex; -+ /* -+ * calls fput() instead of filp_close(), -+ * since no dnotify or lock for the lower file. -+ */ -+ bbot = fidir->fd_bbot; -+ for (; bindex <= bbot; bindex++, hf++) -+ if (hf->hf_file) -+ au_hfput(hf, /*execed*/0); -+ } -+ au_kfree_rcu(fidir); -+ finfo->fi_hdir = NULL; -+ } -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_dir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ -+ err = 0; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ } -+ return err; -+} -+ -+static int aufs_flush_dir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_dir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= bbot; bindex++) { -+ struct path h_path; -+ -+ if (au_test_ro(sb, bindex, inode)) -+ continue; -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ if (!h_path.dentry) -+ continue; -+ -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_fsync(NULL, &h_path, datasync); -+ } -+ -+ return err; -+} -+ -+static int au_do_fsync_dir(struct file *file, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct file *h_file; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (!h_file || au_test_ro(sb, bindex, inode)) -+ continue; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * @file may be NULL -+ */ -+static int aufs_fsync_dir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock(inode); -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (file) -+ err = au_do_fsync_dir(file, datasync); -+ else { -+ di_write_lock_child(dentry); -+ err = au_do_fsync_dir_no_file(dentry, datasync); -+ } -+ au_cpup_attr_timesizes(inode); -+ di_write_unlock(dentry); -+ if (file) -+ fi_write_unlock(file); -+ -+ si_read_unlock(sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_iterate_shared(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode, *h_inode; -+ struct super_block *sb; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ err = au_alive_dir(dentry); -+ if (!err) -+ err = au_vdir_init(file); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (!au_test_nfsd()) { -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ } else { -+ /* -+ * nfsd filldir may call lookup_one_len(), vfs_getattr(), -+ * encode_fh() and others. -+ */ -+ atomic_inc(&h_inode->i_count); -+ di_read_unlock(dentry, AuLock_IR); -+ si_read_unlock(sb); -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ fi_write_unlock(file); -+ iput(h_inode); -+ -+ AuTraceErr(err); -+ return err; -+ } -+ -+out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuTestEmpty_WHONLY 1 -+#define AuTestEmpty_CALLED (1 << 1) -+#define AuTestEmpty_SHWH (1 << 2) -+#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) -+#define au_fset_testempty(flags, name) \ -+ do { (flags) |= AuTestEmpty_##name; } while (0) -+#define au_fclr_testempty(flags, name) \ -+ do { (flags) &= ~AuTestEmpty_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuTestEmpty_SHWH -+#define AuTestEmpty_SHWH 0 -+#endif -+ -+struct test_empty_arg { -+ struct dir_context ctx; -+ struct au_nhash *whlist; -+ unsigned int flags; -+ int err; -+ aufs_bindex_t bindex; -+}; -+ -+static int test_empty_cb(struct dir_context *ctx, const char *__name, -+ int namelen, loff_t offset __maybe_unused, u64 ino, -+ unsigned int d_type) -+{ -+ struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, -+ ctx); -+ char *name = (void *)__name; -+ -+ arg->err = 0; -+ au_fset_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (name[0] == '.' -+ && (namelen == 1 || (name[1] == '.' && namelen == 2))) -+ goto out; /* success */ -+ -+ if (namelen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (au_ftest_testempty(arg->flags, WHONLY) -+ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = -ENOTEMPTY; -+ goto out; -+ } -+ -+ name += AUFS_WH_PFX_LEN; -+ namelen -= AUFS_WH_PFX_LEN; -+ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = au_nhash_append_wh -+ (arg->whlist, name, namelen, ino, d_type, arg->bindex, -+ au_ftest_testempty(arg->flags, SHWH)); -+ -+out: -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err; -+ struct file *h_file; -+ struct au_branch *br; -+ -+ h_file = au_h_open(dentry, arg->bindex, -+ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, -+ /*file*/NULL, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !file_inode(h_file)->i_nlink) -+ goto out_put; -+ -+ do { -+ arg->err = 0; -+ au_fclr_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_testempty(arg->flags, CALLED)); -+ -+out_put: -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, arg->bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+struct do_test_empty_args { -+ int *errp; -+ struct dentry *dentry; -+ struct test_empty_arg *arg; -+}; -+ -+static void call_do_test_empty(void *args) -+{ -+ struct do_test_empty_args *a = args; -+ *a->errp = do_test_empty(a->dentry, a->arg); -+} -+ -+static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_dentry = au_h_dptr(dentry, arg->bindex); -+ h_inode = d_inode(h_dentry); -+ /* todo: i_mode changes anytime? */ -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ err = au_test_h_perm_sio(h_inode, MAY_EXEC | MAY_READ); -+ inode_unlock_shared(h_inode); -+ if (!err) -+ err = do_test_empty(dentry, arg); -+ else { -+ struct do_test_empty_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .arg = arg -+ }; -+ unsigned int flags = arg->flags; -+ -+ wkq_err = au_wkq_wait(call_do_test_empty, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ arg->flags = flags; -+ } -+ -+ return err; -+} -+ -+int au_test_empty_lower(struct dentry *dentry) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t bindex, btop, btail; -+ struct au_nhash whlist; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ int (*test_empty)(struct dentry *dentry, struct test_empty_arg *arg); -+ -+ SiMustAnyLock(dentry->d_sb); -+ -+ rdhash = au_sbi(dentry->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ arg.flags = 0; -+ arg.whlist = &whlist; -+ btop = au_dbtop(dentry); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ test_empty = do_test_empty; -+ if (au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)) -+ test_empty = sio_test_empty; -+ arg.bindex = btop; -+ err = test_empty(dentry, &arg); -+ if (unlikely(err)) -+ goto out_whlist; -+ -+ au_fset_testempty(arg.flags, WHONLY); -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop + 1; !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = test_empty(dentry, &arg); -+ } -+ } -+ -+out_whlist: -+ au_nhash_wh_free(&whlist); -+out: -+ return err; -+} -+ -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ int err; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ aufs_bindex_t bindex, btail; -+ -+ err = 0; -+ arg.whlist = whlist; -+ arg.flags = AuTestEmpty_WHONLY; -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = sio_test_empty(dentry, &arg); -+ } -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_dir_fop = { -+ .owner = THIS_MODULE, -+ .llseek = default_llseek, -+ .read = generic_read_dir, -+ .iterate_shared = aufs_iterate_shared, -+ .unlocked_ioctl = aufs_ioctl_dir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_dir, -+#endif -+ .open = aufs_open_dir, -+ .release = aufs_release_dir, -+ .flush = aufs_flush_dir, -+ .fsync = aufs_fsync_dir -+}; -diff --git a/fs/aufs/dir.h b/fs/aufs/dir.h -new file mode 100644 -index 000000000000..75fad78d2278 ---- /dev/null -+++ b/fs/aufs/dir.h -@@ -0,0 +1,121 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#ifndef __AUFS_DIR_H__ -+#define __AUFS_DIR_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* need to be faster and smaller */ -+ -+struct au_nhash { -+ unsigned int nh_num; -+ struct hlist_head *nh_head; -+}; -+ -+struct au_vdir_destr { -+ unsigned char len; -+ unsigned char name[]; -+} __packed; -+ -+struct au_vdir_dehstr { -+ struct hlist_node hash; -+ struct au_vdir_destr *str; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+struct au_vdir_de { -+ ino_t de_ino; -+ unsigned char de_type; -+ /* caution: packed */ -+ struct au_vdir_destr de_str; -+} __packed; -+ -+struct au_vdir_wh { -+ struct hlist_node wh_hash; -+#ifdef CONFIG_AUFS_SHWH -+ ino_t wh_ino; -+ aufs_bindex_t wh_bindex; -+ unsigned char wh_type; -+#else -+ aufs_bindex_t wh_bindex; -+#endif -+ /* caution: packed */ -+ struct au_vdir_destr wh_str; -+} __packed; -+ -+union au_vdir_deblk_p { -+ unsigned char *deblk; -+ struct au_vdir_de *de; -+}; -+ -+struct au_vdir { -+ unsigned char **vd_deblk; -+ unsigned long vd_nblk; -+ struct { -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ } vd_last; -+ -+ u64 vd_version; -+ unsigned int vd_deblk_sz; -+ unsigned long vd_jiffy; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dir.c */ -+extern const struct file_operations aufs_dir_fop; -+void au_add_nlink(struct inode *dir, struct inode *h_dir); -+void au_sub_nlink(struct inode *dir, struct inode *h_dir); -+loff_t au_dir_size(struct file *file, struct dentry *dentry); -+void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); -+int au_test_empty_lower(struct dentry *dentry); -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); -+ -+/* vdir.c */ -+unsigned int au_rdhash_est(loff_t sz); -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); -+void au_nhash_wh_free(struct au_nhash *whlist); -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit); -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh); -+void au_vdir_free(struct au_vdir *vdir); -+int au_vdir_init(struct file *file); -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx); -+ -+/* ioctl.c */ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); -+ -+#ifdef CONFIG_AUFS_RDU -+/* rdu.c */ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+#else -+AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#ifdef CONFIG_COMPAT -+AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#endif -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIR_H__ */ -diff --git a/fs/aufs/dirren.c b/fs/aufs/dirren.c -new file mode 100644 -index 000000000000..12b56c47f2dd ---- /dev/null -+++ b/fs/aufs/dirren.c -@@ -0,0 +1,1303 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2017-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * special handling in renaming a directory -+ * in order to support looking-up the before-renamed name on the lower readonly -+ * branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+static void au_dr_hino_del(struct au_dr_br *dr, struct au_dr_hino *ent) -+{ -+ int idx; -+ -+ idx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_del(&ent->dr_hnode, dr->dr_h_ino + idx); -+} -+ -+static int au_dr_hino_test_empty(struct au_dr_br *dr) -+{ -+ int ret, i; -+ struct hlist_bl_head *hbl; -+ -+ ret = 1; -+ for (i = 0; ret && i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ hlist_bl_lock(hbl); -+ ret &= hlist_bl_empty(hbl); -+ hlist_bl_unlock(hbl); -+ } -+ -+ return ret; -+} -+ -+static struct au_dr_hino *au_dr_hino_find(struct au_dr_br *dr, ino_t ino) -+{ -+ struct au_dr_hino *found, *ent; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int idx; -+ -+ found = NULL; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = ent; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return found; -+} -+ -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t ino, -+ struct au_dr_hino *add_ent) -+{ -+ int found, idx; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dr_hino *ent; -+ -+ found = 0; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+#if 0 /* debug print */ -+ { -+ struct hlist_bl_node *tmp; -+ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ AuDbg("hi%llu\n", (unsigned long long)ent->dr_h_ino); -+ } -+#endif -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = 1; -+ break; -+ } -+ if (!found && add_ent) -+ hlist_bl_add_head(&add_ent->dr_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found && add_ent) -+ AuDbg("i%llu added\n", (unsigned long long)add_ent->dr_h_ino); -+ -+ return found; -+} -+ -+void au_dr_hino_free(struct au_dr_br *dr) -+{ -+ int i; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_dr_hino *ent; -+ -+ /* SiMustWriteLock(sb); */ -+ -+ for (i = 0; i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ /* no spinlock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ au_kfree_rcu(ent); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+/* returns the number of inodes or an error */ -+static int au_dr_hino_store(struct super_block *sb, struct au_branch *br, -+ struct file *hinofile) -+{ -+ int err, i; -+ ssize_t ssz; -+ loff_t pos, oldsize; -+ __be64 u64; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *n1, *n2; -+ struct au_dr_hino *ent; -+ -+ SiMustWriteLock(sb); -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ -+ hinoinode = file_inode(hinofile); -+ oldsize = i_size_read(hinoinode); -+ -+ err = 0; -+ pos = 0; -+ hbl = br->br_dirren.dr_h_ino; -+ for (i = 0; !err && i < AuDirren_NHASH; i++, hbl++) { -+ /* no bit-lock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, n1, n2, hbl, dr_hnode) { -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ u64 = cpu_to_be64(ent->dr_h_ino); -+ ssz = vfsub_write_k(hinofile, &u64, sizeof(u64), &pos); -+ if (ssz == sizeof(u64)) -+ continue; -+ -+ /* write error */ -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -ENOSPC; -+ if (ssz < 0) -+ err = ssz; -+ break; -+ } -+ } -+ /* regardless the error */ -+ if (pos < oldsize) { -+ err = vfsub_trunc(&hinofile->f_path, pos, /*attr*/0, hinofile); -+ AuTraceErr(err); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_dr_hino_load(struct au_dr_br *dr, struct file *hinofile) -+{ -+ int err, hidx; -+ ssize_t ssz; -+ size_t sz, n; -+ loff_t pos; -+ uint64_t u64; -+ struct au_dr_hino *ent; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ -+ err = 0; -+ pos = 0; -+ hbl = dr->dr_h_ino; -+ hinoinode = file_inode(hinofile); -+ sz = i_size_read(hinoinode); -+ AuDebugOn(sz % sizeof(u64)); -+ n = sz / sizeof(u64); -+ while (n--) { -+ ssz = vfsub_read_k(hinofile, &u64, sizeof(u64), &pos); -+ if (unlikely(ssz != sizeof(u64))) { -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -EINVAL; -+ if (ssz < 0) -+ err = ssz; -+ goto out_free; -+ } -+ -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (!ent) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ ent->dr_h_ino = be64_to_cpu((__force __be64)u64); -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ hidx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_add(&ent->dr_hnode, hbl + hidx); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_hino_free(dr); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * @bindex/@br is a switch to distinguish whether suspending hnotify or not. -+ * @path is a switch to distinguish load and store. -+ */ -+static int au_dr_hino(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br, const struct path *path) -+{ -+ int err, flags; -+ unsigned char load, suspend; -+ struct file *hinofile; -+ struct au_hinode *hdir; -+ struct inode *dir, *delegated; -+ struct path hinopath; -+ struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, -+ sizeof(AUFS_WH_DR_BRHINO) - 1); -+ -+ AuDebugOn(bindex < 0 && !br); -+ AuDebugOn(bindex >= 0 && br); -+ -+ err = -EINVAL; -+ suspend = !br; -+ if (suspend) -+ br = au_sbr(sb, bindex); -+ load = !!path; -+ if (!load) { -+ path = &br->br_path; -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ if (unlikely(!au_br_writable(br->br_perm))) -+ goto out; -+ } -+ -+ hdir = NULL; -+ if (suspend) { -+ dir = d_inode(sb->s_root); -+ hdir = au_hinode(au_ii(dir), bindex); -+ dir = hdir->hi_inode; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ } else { -+ dir = d_inode(path->dentry); -+ inode_lock_nested(dir, AuLsc_I_CHILD); -+ } -+ hinopath.dentry = vfsub_lkup_one(&hinoname, path->dentry); -+ err = PTR_ERR(hinopath.dentry); -+ if (IS_ERR(hinopath.dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ flags = O_RDONLY; -+ if (load) { -+ if (d_is_negative(hinopath.dentry)) -+ goto out_dput; /* success */ -+ } else { -+ if (au_dr_hino_test_empty(&br->br_dirren)) { -+ if (d_is_positive(hinopath.dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(dir, &hinopath, &delegated, -+ /*force*/0); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ pr_err("ignored err %d, %pd2\n", -+ err, hinopath.dentry); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ err = 0; -+ } -+ goto out_dput; -+ } else if (!d_is_positive(hinopath.dentry)) { -+ err = vfsub_create(dir, &hinopath, 0600, -+ /*want_excl*/false); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ } -+ flags = O_WRONLY; -+ } -+ hinopath.mnt = path->mnt; -+ hinofile = vfsub_dentry_open(&hinopath, flags); -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+ dput(hinopath.dentry); -+ AuTraceErrPtr(hinofile); -+ if (IS_ERR(hinofile)) { -+ err = PTR_ERR(hinofile); -+ goto out; -+ } -+ -+ if (load) -+ err = au_dr_hino_load(&br->br_dirren, hinofile); -+ else -+ err = au_dr_hino_store(sb, br, hinofile); -+ fput(hinofile); -+ goto out; -+ -+out_dput: -+ dput(hinopath.dentry); -+out_unlock: -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_dr_brid_init(struct au_dr_brid *brid, const struct path *path) -+{ -+ int err; -+ struct kstatfs kstfs; -+ dev_t dev; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ err = vfs_statfs((void *)path, &kstfs); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* todo: support for UUID */ -+ -+ if (kstfs.f_fsid.val[0] || kstfs.f_fsid.val[1]) { -+ brid->type = AuBrid_FSID; -+ brid->fsid = kstfs.f_fsid; -+ } else { -+ dentry = path->dentry; -+ sb = dentry->d_sb; -+ dev = sb->s_dev; -+ if (dev) { -+ brid->type = AuBrid_DEV; -+ brid->dev = dev; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path) -+{ -+ int err, i; -+ struct au_dr_br *dr; -+ struct hlist_bl_head *hbl; -+ -+ dr = &br->br_dirren; -+ hbl = dr->dr_h_ino; -+ for (i = 0; i < AuDirren_NHASH; i++, hbl++) -+ INIT_HLIST_BL_HEAD(hbl); -+ -+ err = au_dr_brid_init(&dr->dr_brid, path); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_opt_test(au_mntflags(sb), DIRREN)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, path); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, /*path*/NULL); -+ if (!err) -+ au_dr_hino_free(&br->br_dirren); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brid_str(struct au_dr_brid *brid, struct inode *h_inode, -+ char *buf, size_t sz) -+{ -+ int err; -+ unsigned int major, minor; -+ char *p; -+ -+ p = buf; -+ err = snprintf(p, sz, "%d_", brid->type); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ switch (brid->type) { -+ case AuBrid_Unset: -+ return -EINVAL; -+ case AuBrid_UUID: -+ err = snprintf(p, sz, "%pU", brid->uuid.b); -+ break; -+ case AuBrid_FSID: -+ err = snprintf(p, sz, "%08x-%08x", -+ brid->fsid.val[0], brid->fsid.val[1]); -+ break; -+ case AuBrid_DEV: -+ major = MAJOR(brid->dev); -+ minor = MINOR(brid->dev); -+ if (major <= 0xff && minor <= 0xff) -+ err = snprintf(p, sz, "%02x%02x", major, minor); -+ else -+ err = snprintf(p, sz, "%03x:%05x", major, minor); -+ break; -+ } -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ err = snprintf(p, sz, "_%llu", (unsigned long long)h_inode->i_ino); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ -+ return p - buf; -+} -+ -+static int au_drinfo_name(struct au_branch *br, char *name, int len) -+{ -+ int rlen; -+ struct dentry *br_dentry; -+ struct inode *br_inode; -+ -+ br_dentry = au_br_dentry(br); -+ br_inode = d_inode(br_dentry); -+ rlen = au_brid_str(&br->br_dirren.dr_brid, br_inode, name, len); -+ AuDebugOn(rlen >= AUFS_DIRREN_ENV_VAL_SZ); -+ AuDebugOn(rlen > len); -+ -+ return rlen; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * from the given @h_dentry, construct drinfo at @*fdata. -+ * when the size of @*fdata is not enough, reallocate and return new @fdata and -+ * @allocated. -+ */ -+static int au_drinfo_construct(struct au_drinfo_fdata **fdata, -+ struct dentry *h_dentry, -+ unsigned char *allocated) -+{ -+ int err, v; -+ struct au_drinfo_fdata *f, *p; -+ struct au_drinfo *drinfo; -+ struct inode *h_inode; -+ struct qstr *qname; -+ -+ err = 0; -+ f = *fdata; -+ h_inode = d_inode(h_dentry); -+ qname = &h_dentry->d_name; -+ drinfo = &f->drinfo; -+ drinfo->ino = (__force uint64_t)cpu_to_be64(h_inode->i_ino); -+ drinfo->oldnamelen = qname->len; -+ if (*allocated < sizeof(*f) + qname->len) { -+ v = roundup_pow_of_two(*allocated + qname->len); -+ p = au_krealloc(f, v, GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out; -+ } -+ f = p; -+ *fdata = f; -+ *allocated = v; -+ drinfo = &f->drinfo; -+ } -+ memcpy(drinfo->oldname, qname->name, qname->len); -+ AuDbg("i%llu, %.*s\n", -+ be64_to_cpu((__force __be64)drinfo->ino), drinfo->oldnamelen, -+ drinfo->oldname); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* callers have to free the return value */ -+static struct au_drinfo *au_drinfo_read_k(struct file *file, ino_t h_ino) -+{ -+ struct au_drinfo *ret, *drinfo; -+ struct au_drinfo_fdata fdata; -+ int len; -+ loff_t pos; -+ ssize_t ssz; -+ -+ ret = ERR_PTR(-EIO); -+ pos = 0; -+ ssz = vfsub_read_k(file, &fdata, sizeof(fdata), &pos); -+ if (unlikely(ssz != sizeof(fdata))) { -+ AuIOErr("ssz %zd, %u, %pD2\n", -+ ssz, (unsigned int)sizeof(fdata), file); -+ goto out; -+ } -+ -+ fdata.magic = ntohl((__force __be32)fdata.magic); -+ switch (fdata.magic) { -+ case AUFS_DRINFO_MAGIC_V1: -+ break; -+ default: -+ AuIOErr("magic-num 0x%x, 0x%x, %pD2\n", -+ fdata.magic, AUFS_DRINFO_MAGIC_V1, file); -+ goto out; -+ } -+ -+ drinfo = &fdata.drinfo; -+ len = drinfo->oldnamelen; -+ if (!len) { -+ AuIOErr("broken drinfo %pD2\n", file); -+ goto out; -+ } -+ -+ ret = NULL; -+ drinfo->ino = be64_to_cpu((__force __be64)drinfo->ino); -+ if (unlikely(h_ino && drinfo->ino != h_ino)) { -+ AuDbg("ignored i%llu, i%llu, %pD2\n", -+ (unsigned long long)drinfo->ino, -+ (unsigned long long)h_ino, file); -+ goto out; /* success */ -+ } -+ -+ ret = kmalloc(sizeof(*ret) + len, GFP_NOFS); -+ if (unlikely(!ret)) { -+ ret = ERR_PTR(-ENOMEM); -+ AuTraceErrPtr(ret); -+ goto out; -+ } -+ -+ *ret = *drinfo; -+ ssz = vfsub_read_k(file, (void *)ret->oldname, len, &pos); -+ if (unlikely(ssz != len)) { -+ au_kfree_rcu(ret); -+ ret = ERR_PTR(-EIO); -+ AuIOErr("ssz %zd, %u, %pD2\n", ssz, len, file); -+ goto out; -+ } -+ -+ AuDbg("oldname %.*s\n", ret->oldnamelen, ret->oldname); -+ -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* in order to be revertible */ -+struct au_drinfo_rev_elm { -+ int created; -+ struct dentry *info_dentry; -+ struct au_drinfo *info_last; -+}; -+ -+struct au_drinfo_rev { -+ unsigned char already; -+ aufs_bindex_t nelm; -+ struct au_drinfo_rev_elm elm[]; -+}; -+ -+/* todo: isn't it too large? */ -+struct au_drinfo_store { -+ struct path h_ppath; -+ struct dentry *h_dentry; -+ struct au_drinfo_fdata *fdata; -+ char *infoname; /* inside of whname, just after PFX */ -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ]; -+ aufs_bindex_t btgt, btail; -+ unsigned char no_sio, -+ allocated, /* current size of *fdata */ -+ infonamelen, /* room size for p */ -+ whnamelen, /* length of the generated name */ -+ renameback; /* renamed back */ -+}; -+ -+/* on rename(2) error, the caller should revert it using @elm */ -+static int au_drinfo_do_store(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, len; -+ ssize_t ssz; -+ loff_t pos; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ struct inode *h_dir, *h_inode, *delegated; -+ struct file *infofile; -+ struct qstr *qname; -+ -+ AuDebugOn(elm -+ && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm))); -+ -+ infopath.dentry = vfsub_lookup_one_len(w->whname, w->h_ppath.dentry, -+ w->whnamelen); -+ AuTraceErrPtr(infopath.dentry); -+ if (IS_ERR(infopath.dentry)) { -+ err = PTR_ERR(infopath.dentry); -+ goto out; -+ } -+ -+ err = 0; -+ h_dir = d_inode(w->h_ppath.dentry); -+ if (elm && d_is_negative(infopath.dentry)) { -+ err = vfsub_create(h_dir, &infopath, 0600, /*want_excl*/true); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ elm->created = 1; -+ elm->info_dentry = dget(infopath.dentry); -+ } -+ -+ infofile = vfsub_dentry_open(&infopath, O_RDWR); -+ AuTraceErrPtr(infofile); -+ if (IS_ERR(infofile)) { -+ err = PTR_ERR(infofile); -+ goto out_dput; -+ } -+ -+ h_inode = d_inode(infopath.dentry); -+ if (elm && i_size_read(h_inode)) { -+ h_inode = d_inode(w->h_dentry); -+ elm->info_last = au_drinfo_read_k(infofile, h_inode->i_ino); -+ AuTraceErrPtr(elm->info_last); -+ if (IS_ERR(elm->info_last)) { -+ err = PTR_ERR(elm->info_last); -+ elm->info_last = NULL; -+ AuDebugOn(elm->info_dentry); -+ goto out_fput; -+ } -+ } -+ -+ if (elm && w->renameback) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ goto out_fput; -+ } -+ -+ pos = 0; -+ qname = &w->h_dentry->d_name; -+ len = sizeof(*w->fdata) + qname->len; -+ if (!elm) -+ len = sizeof(*w->fdata) + w->fdata->drinfo.oldnamelen; -+ ssz = vfsub_write_k(infofile, w->fdata, len, &pos); -+ if (ssz == len) { -+ AuDbg("hi%llu, %.*s\n", w->fdata->drinfo.ino, -+ w->fdata->drinfo.oldnamelen, w->fdata->drinfo.oldname); -+ goto out_fput; /* success */ -+ } else { -+ err = -EIO; -+ if (ssz < 0) -+ err = ssz; -+ /* the caller should revert it using @elm */ -+ } -+ -+out_fput: -+ fput(infofile); -+out_dput: -+ dput(infopath.dentry); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+struct au_call_drinfo_do_store_args { -+ int *errp; -+ struct au_drinfo_store *w; -+ struct au_drinfo_rev_elm *elm; -+}; -+ -+static void au_call_drinfo_do_store(void *args) -+{ -+ struct au_call_drinfo_do_store_args *a = args; -+ -+ *a->errp = au_drinfo_do_store(a->w, a->elm); -+} -+ -+static int au_drinfo_store_sio(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, wkq_err; -+ -+ if (w->no_sio) -+ err = au_drinfo_do_store(w, elm); -+ else { -+ struct au_call_drinfo_do_store_args a = { -+ .errp = &err, -+ .w = w, -+ .elm = elm -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_store, &a); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ AuTraceErr(err); -+ -+ return err; -+} -+ -+static int au_drinfo_store_work_init(struct au_drinfo_store *w, -+ aufs_bindex_t btgt) -+{ -+ int err; -+ -+ memset(w, 0, sizeof(*w)); -+ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); -+ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); -+ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); -+ w->btgt = btgt; -+ w->no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ -+ err = -ENOMEM; -+ w->fdata = kcalloc(1, w->allocated, GFP_NOFS); -+ if (unlikely(!w->fdata)) { -+ AuTraceErr(err); -+ goto out; -+ } -+ w->fdata->magic = (__force uint32_t)htonl(AUFS_DRINFO_MAGIC_V1); -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static void au_drinfo_store_work_fin(struct au_drinfo_store *w) -+{ -+ au_kfree_rcu(w->fdata); -+} -+ -+static void au_drinfo_store_rev(struct au_drinfo_rev *rev, -+ struct au_drinfo_store *w) -+{ -+ struct au_drinfo_rev_elm *elm; -+ struct inode *h_dir, *delegated; -+ int err, nelm; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ -+ h_dir = d_inode(w->h_ppath.dentry); -+ IMustLock(h_dir); -+ -+ err = 0; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ AuDebugOn(elm->created && elm->info_last); -+ if (elm->created) { -+ AuDbg("here\n"); -+ delegated = NULL; -+ infopath.dentry = elm->info_dentry; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, -+ !w->no_sio); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ dput(elm->info_dentry); -+ } else if (elm->info_last) { -+ AuDbg("here\n"); -+ w->fdata->drinfo = *elm->info_last; -+ memcpy(w->fdata->drinfo.oldname, -+ elm->info_last->oldname, -+ elm->info_last->oldnamelen); -+ err = au_drinfo_store_sio(w, /*elm*/NULL); -+ au_kfree_rcu(elm->info_last); -+ } -+ if (unlikely(err)) -+ AuIOErr("%d, %s\n", err, w->whname); -+ /* go on even if err */ -+ } -+} -+ -+/* caller has to call au_dr_rename_fin() later */ -+static int au_drinfo_store(struct dentry *dentry, aufs_bindex_t btgt, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, sz, nelm; -+ aufs_bindex_t bindex, btail; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev, **p; -+ struct au_drinfo_rev_elm *elm; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ btail = au_dbtaildir(dentry); -+ nelm = btail - btgt; -+ sz = sizeof(*rev) + sizeof(*elm) * nelm; -+ rev = kcalloc(1, sz, GFP_NOFS); -+ if (unlikely(!rev)) { -+ AuTraceErr(err); -+ goto out_args; -+ } -+ rev->nelm = nelm; -+ elm = rev->elm; -+ p = _rev; -+ *p = rev; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ work.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ work.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ hdir = au_hi(d_inode(dentry), btgt); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ for (bindex = btgt + 1; bindex <= btail; bindex++, elm++) { -+ work.h_dentry = au_h_dptr(dentry, bindex); -+ if (!work.h_dentry) -+ continue; -+ -+ err = au_drinfo_construct(&work.fdata, work.h_dentry, -+ &work.allocated); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ -+ work.renameback = au_qstreq(&work.h_dentry->d_name, dst_name); -+ br = au_sbr(sb, bindex); -+ work.whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ work.whnamelen += au_drinfo_name(br, work.infoname, -+ work.infonamelen); -+ AuDbg("whname %.*s, i%llu, %.*s\n", -+ work.whnamelen, work.whname, -+ be64_to_cpu((__force __be64)work.fdata->drinfo.ino), -+ work.fdata->drinfo.oldnamelen, -+ work.fdata->drinfo.oldname); -+ -+ err = au_drinfo_store_sio(&work, elm); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ } -+ if (unlikely(err)) { -+ /* revert all drinfo */ -+ au_drinfo_store_rev(rev, &work); -+ au_kfree_try_rcu(rev); -+ *p = NULL; -+ } -+ au_hn_inode_unlock(hdir); -+ -+out_args: -+ au_drinfo_store_work_fin(&work); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, already; -+ ino_t ino; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dr_br *dr; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_dr_hino *ent; -+ struct au_drinfo_rev *rev, **p; -+ -+ AuDbg("bindex %d\n", bindex); -+ -+ err = -ENOMEM; -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (unlikely(!ent)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, bindex); -+ dr = &br->br_dirren; -+ h_dentry = au_h_dptr(src, bindex); -+ h_inode = d_inode(h_dentry); -+ ino = h_inode->i_ino; -+ ent->dr_h_ino = ino; -+ already = au_dr_hino_test_add(dr, ino, ent); -+ AuDbg("b%d, hi%llu, already %d\n", -+ bindex, (unsigned long long)ino, already); -+ -+ err = au_drinfo_store(src, bindex, dst_name, _rev); -+ AuTraceErr(err); -+ if (!err) { -+ p = _rev; -+ rev = *p; -+ rev->already = already; -+ goto out; /* success */ -+ } -+ -+ /* revert */ -+ if (!already) -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ struct au_drinfo_rev *rev; -+ struct au_drinfo_rev_elm *elm; -+ int nelm; -+ -+ rev = _rev; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ dput(elm->info_dentry); -+ au_kfree_rcu(elm->info_last); -+ } -+ au_kfree_try_rcu(rev); -+} -+ -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ int err; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev = _rev; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *h_inode; -+ struct au_dr_br *dr; -+ struct au_dr_hino *ent; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, btgt); -+ work.h_ppath.dentry = au_h_dptr(src, btgt); -+ work.h_ppath.mnt = au_br_mnt(br); -+ au_drinfo_store_rev(rev, &work); -+ au_drinfo_store_work_fin(&work); -+ if (rev->already) -+ goto out; -+ -+ dr = &br->br_dirren; -+ h_inode = d_inode(work.h_ppath.dentry); -+ ent = au_dr_hino_find(dr, h_inode->i_ino); -+ BUG_ON(!ent); -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ au_kfree_try_rcu(rev); -+ if (unlikely(err)) -+ pr_err("failed to remove dirren info\n"); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct au_drinfo *au_drinfo_do_load(struct path *h_ppath, -+ char *whname, int whnamelen, -+ struct dentry **info_dentry) -+{ -+ struct au_drinfo *drinfo; -+ struct file *f; -+ struct inode *h_dir; -+ struct path infopath; -+ int unlocked; -+ -+ AuDbg("%pd/%.*s\n", h_ppath->dentry, whnamelen, whname); -+ -+ *info_dentry = NULL; -+ drinfo = NULL; -+ 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); -+ if (IS_ERR(infopath.dentry)) { -+ drinfo = (void *)infopath.dentry; -+ goto out; -+ } -+ -+ if (d_is_negative(infopath.dentry)) -+ goto out_dput; /* success */ -+ -+ infopath.mnt = h_ppath->mnt; -+ f = vfsub_dentry_open(&infopath, O_RDONLY); -+ inode_unlock_shared(h_dir); -+ unlocked = 1; -+ if (IS_ERR(f)) { -+ drinfo = (void *)f; -+ goto out_dput; -+ } -+ -+ drinfo = au_drinfo_read_k(f, /*h_ino*/0); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out_fput; -+ -+ AuDbg("oldname %.*s\n", drinfo->oldnamelen, drinfo->oldname); -+ *info_dentry = dget(infopath.dentry); /* keep it alive */ -+ -+out_fput: -+ fput(f); -+out_dput: -+ dput(infopath.dentry); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_dir); -+ AuTraceErrPtr(drinfo); -+ return drinfo; -+} -+ -+struct au_drinfo_do_load_args { -+ struct au_drinfo **drinfop; -+ struct path *h_ppath; -+ char *whname; -+ int whnamelen; -+ struct dentry **info_dentry; -+}; -+ -+static void au_call_drinfo_do_load(void *args) -+{ -+ struct au_drinfo_do_load_args *a = args; -+ -+ *a->drinfop = au_drinfo_do_load(a->h_ppath, a->whname, a->whnamelen, -+ a->info_dentry); -+} -+ -+struct au_drinfo_load { -+ struct path h_ppath; -+ struct qstr *qname; -+ unsigned char no_sio; -+ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+ -+static int au_drinfo_load(struct au_drinfo_load *w, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ int err, wkq_err, whnamelen, e; -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ] -+ = AUFS_WH_DR_INFO_PFX; -+ struct au_drinfo *drinfo; -+ struct qstr oldname; -+ struct inode *h_dir, *delegated; -+ struct dentry *info_dentry; -+ struct path infopath; -+ -+ whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ whnamelen += au_drinfo_name(br, whname + whnamelen, -+ sizeof(whname) - whnamelen); -+ if (w->no_sio) -+ drinfo = au_drinfo_do_load(&w->h_ppath, whname, whnamelen, -+ &info_dentry); -+ else { -+ struct au_drinfo_do_load_args args = { -+ .drinfop = &drinfo, -+ .h_ppath = &w->h_ppath, -+ .whname = whname, -+ .whnamelen = whnamelen, -+ .info_dentry = &info_dentry -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_load, &args); -+ if (unlikely(wkq_err)) -+ drinfo = ERR_PTR(wkq_err); -+ } -+ err = PTR_ERR(drinfo); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out; -+ -+ err = 0; -+ oldname.len = drinfo->oldnamelen; -+ oldname.name = drinfo->oldname; -+ if (au_qstreq(w->qname, &oldname)) { -+ /* the name is renamed back */ -+ au_kfree_rcu(drinfo); -+ drinfo = NULL; -+ -+ infopath.dentry = info_dentry; -+ infopath.mnt = w->h_ppath.mnt; -+ h_dir = d_inode(w->h_ppath.dentry); -+ delegated = NULL; -+ inode_lock_nested(h_dir, AuLsc_I_PARENT); -+ e = vfsub_unlink(h_dir, &infopath, &delegated, !w->no_sio); -+ inode_unlock(h_dir); -+ if (unlikely(e)) -+ AuIOErr("ignored %d, %pd2\n", e, &infopath.dentry); -+ if (unlikely(e == -EWOULDBLOCK)) -+ iput(delegated); -+ } -+ au_kfree_rcu(w->drinfo[bindex]); -+ w->drinfo[bindex] = drinfo; -+ dput(info_dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_dr_lkup_free(struct au_drinfo **drinfo, int n) -+{ -+ struct au_drinfo **p = drinfo; -+ -+ while (n-- > 0) -+ au_kfree_rcu(*drinfo++); -+ au_kfree_try_rcu(p); -+} -+ -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t btgt) -+{ -+ int err, ninfo; -+ struct au_drinfo_load w; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct inode *h_dir; -+ struct au_dr_hino *ent; -+ struct super_block *sb; -+ -+ AuDbg("%.*s, name %.*s, whname %.*s, b%d\n", -+ AuLNPair(&dentry->d_name), AuLNPair(&lkup->dirren.dr_name), -+ AuLNPair(&lkup->whname), btgt); -+ -+ sb = dentry->d_sb; -+ bbot = au_sbbot(sb); -+ w.ninfo = bbot + 1; -+ if (!lkup->dirren.drinfo) { -+ lkup->dirren.drinfo = kcalloc(w.ninfo, -+ sizeof(*lkup->dirren.drinfo), -+ GFP_NOFS); -+ if (unlikely(!lkup->dirren.drinfo)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ lkup->dirren.ninfo = w.ninfo; -+ } -+ w.drinfo = lkup->dirren.drinfo; -+ w.no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ w.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ AuDebugOn(!w.h_ppath.dentry); -+ w.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ w.qname = &dentry->d_name; -+ -+ ninfo = 0; -+ for (bindex = btgt + 1; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_drinfo_load(&w, bindex, br); -+ if (unlikely(err)) -+ goto out_free; -+ if (w.drinfo[bindex]) -+ ninfo++; -+ } -+ if (!ninfo) { -+ br = au_sbr(sb, btgt); -+ h_dir = d_inode(w.h_ppath.dentry); -+ ent = au_dr_hino_find(&br->br_dirren, h_dir->i_ino); -+ AuDebugOn(!ent); -+ au_dr_hino_del(&br->br_dirren, ent); -+ au_kfree_rcu(ent); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+ lkup->dirren.ninfo = 0; -+ lkup->dirren.drinfo = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup) -+{ -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+} -+ -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt) -+{ -+ int err; -+ struct au_drinfo *drinfo; -+ -+ err = 0; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= btgt); -+ drinfo = lkup->dirren.drinfo[btgt]; -+ if (!drinfo) -+ goto out; -+ -+ au_kfree_try_rcu(lkup->whname.name); -+ lkup->whname.name = NULL; -+ lkup->dirren.dr_name.len = drinfo->oldnamelen; -+ lkup->dirren.dr_name.name = drinfo->oldname; -+ lkup->name = &lkup->dirren.dr_name; -+ err = au_wh_name_alloc(&lkup->whname, lkup->name); -+ if (!err) -+ AuDbg("name %.*s, whname %.*s, b%d\n", -+ AuLNPair(lkup->name), AuLNPair(&lkup->whname), -+ btgt); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino) -+{ -+ int match; -+ struct au_drinfo *drinfo; -+ -+ match = 1; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= bindex); -+ drinfo = lkup->dirren.drinfo[bindex]; -+ if (!drinfo) -+ goto out; -+ -+ match = (drinfo->ino == h_ino); -+ AuDbg("match %d\n", match); -+ -+out: -+ return match; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_opt_set(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_dr_hino(sb, bindex, /*br*/NULL, &br->br_path); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_flush(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, bindex, /*br*/NULL, /*path*/NULL); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_clr(struct super_block *sb, int no_flush) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ if (!no_flush) { -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ au_dr_hino_free(&br->br_dirren); -+ } -+ -+out: -+ return err; -+} -diff --git a/fs/aufs/dirren.h b/fs/aufs/dirren.h -new file mode 100644 -index 000000000000..ade589d2e75c ---- /dev/null -+++ b/fs/aufs/dirren.h -@@ -0,0 +1,127 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * renamed dir info -+ */ -+ -+#ifndef __AUFS_DIRREN_H__ -+#define __AUFS_DIRREN_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "hbl.h" -+ -+#define AuDirren_NHASH 100 -+ -+#ifdef CONFIG_AUFS_DIRREN -+enum au_brid_type { -+ AuBrid_Unset, -+ AuBrid_UUID, -+ AuBrid_FSID, -+ AuBrid_DEV -+}; -+ -+struct au_dr_brid { -+ enum au_brid_type type; -+ union { -+ uuid_t uuid; /* unimplemented yet */ -+ fsid_t fsid; -+ dev_t dev; -+ }; -+}; -+ -+/* 20 is the max digits length of ulong 64 */ -+/* brid-type "_" uuid "_" inum */ -+#define AUFS_DIRREN_FNAME_SZ (1 + 1 + UUID_STRING_LEN + 20) -+#define AUFS_DIRREN_ENV_VAL_SZ (AUFS_DIRREN_FNAME_SZ + 1 + 20) -+ -+struct au_dr_hino { -+ struct hlist_bl_node dr_hnode; -+ ino_t dr_h_ino; -+}; -+ -+struct au_dr_br { -+ struct hlist_bl_head dr_h_ino[AuDirren_NHASH]; -+ struct au_dr_brid dr_brid; -+}; -+ -+struct au_dr_lookup { -+ /* dr_name is pointed by struct au_do_lookup_args.name */ -+ struct qstr dr_name; /* subset of dr_info */ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+#else -+struct au_dr_hino; -+/* empty */ -+struct au_dr_br { }; -+struct au_dr_lookup { }; -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+struct au_do_lookup_args; -+struct au_hinode; -+#ifdef CONFIG_AUFS_DIRREN -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+void au_dr_hino_free(struct au_dr_br *dr); -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br); -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *rev); -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t bindex, void *rev); -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino); -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup); -+int au_dr_opt_set(struct super_block *sb); -+int au_dr_opt_flush(struct super_block *sb); -+int au_dr_opt_clr(struct super_block *sb, int no_flush); -+#else -+AuStubInt0(au_dr_hino_test_add, struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+AuStubVoid(au_dr_hino_free, struct au_dr_br *dr); -+AuStubInt0(au_dr_br_init, struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+AuStubInt0(au_dr_br_fin, struct super_block *sb, struct au_branch *br); -+AuStubInt0(au_dr_rename, struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+AuStubVoid(au_dr_rename_fin, struct dentry *src, aufs_bindex_t btgt, void *rev); -+AuStubVoid(au_dr_rename_rev, struct dentry *src, aufs_bindex_t bindex, -+ void *rev); -+AuStubInt0(au_dr_lkup, struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+AuStubInt0(au_dr_lkup_name, struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+AuStubInt0(au_dr_lkup_h_ino, struct au_do_lookup_args *lkup, -+ aufs_bindex_t bindex, ino_t h_ino); -+AuStubVoid(au_dr_lkup_fin, struct au_do_lookup_args *lkup); -+AuStubInt0(au_dr_opt_set, struct super_block *sb); -+AuStubInt0(au_dr_opt_flush, struct super_block *sb); -+AuStubInt0(au_dr_opt_clr, struct super_block *sb, int no_flush); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DIRREN -+static inline int au_dr_ihash(ino_t h_ino) -+{ -+ return h_ino % AuDirren_NHASH; -+} -+#else -+AuStubInt0(au_dr_ihash, ino_t h_ino); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIRREN_H__ */ -diff --git a/fs/aufs/dynop.c b/fs/aufs/dynop.c -new file mode 100644 -index 000000000000..5dbb7193591b ---- /dev/null -+++ b/fs/aufs/dynop.c -@@ -0,0 +1,355 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * dynamically customizable operations for regular files -+ */ -+ -+#include "aufs.h" -+ -+#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) -+ -+/* -+ * How large will these lists be? -+ * Usually just a few elements, 20-30 at most for each, I guess. -+ */ -+static struct hlist_bl_head dynop[AuDyLast]; -+ -+static struct au_dykey *dy_gfind_get(struct hlist_bl_head *hbl, -+ const void *h_op) -+{ -+ struct au_dykey *key, *tmp; -+ struct hlist_bl_node *pos; -+ -+ key = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ key = tmp; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return key; -+} -+ -+static struct au_dykey *dy_bradd(struct au_branch *br, struct au_dykey *key) -+{ -+ struct au_dykey **k, *found; -+ const void *h_op = key->dk_op.dy_hop; -+ int i; -+ -+ found = NULL; -+ k = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else -+ break; -+ if (!found) { -+ spin_lock(&br->br_dykey_lock); -+ for (; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else { -+ k[i] = key; -+ break; -+ } -+ spin_unlock(&br->br_dykey_lock); -+ BUG_ON(i == AuBrDynOp); /* expand the array */ -+ } -+ -+ return found; -+} -+ -+/* kref_get() if @key is already added */ -+static struct au_dykey *dy_gadd(struct hlist_bl_head *hbl, struct au_dykey *key) -+{ -+ struct au_dykey *tmp, *found; -+ struct hlist_bl_node *pos; -+ const void *h_op = key->dk_op.dy_hop; -+ -+ found = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ found = tmp; -+ break; -+ } -+ if (!found) -+ hlist_bl_add_head(&key->dk_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found) -+ DyPrSym(key); -+ return found; -+} -+ -+static void dy_free_rcu(struct rcu_head *rcu) -+{ -+ struct au_dykey *key; -+ -+ key = container_of(rcu, struct au_dykey, dk_rcu); -+ DyPrSym(key); -+ kfree(key); -+} -+ -+static void dy_free(struct kref *kref) -+{ -+ struct au_dykey *key; -+ struct hlist_bl_head *hbl; -+ -+ key = container_of(kref, struct au_dykey, dk_kref); -+ hbl = dynop + key->dk_op.dy_type; -+ au_hbl_del(&key->dk_hnode, hbl); -+ call_rcu(&key->dk_rcu, dy_free_rcu); -+} -+ -+void au_dy_put(struct au_dykey *key) -+{ -+ kref_put(&key->dk_kref, dy_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define DyDbgDeclare(cnt) unsigned int cnt = 0 -+#define DyDbgInc(cnt) do { cnt++; } while (0) -+#else -+#define DyDbgDeclare(cnt) do {} while (0) -+#define DyDbgInc(cnt) do {} while (0) -+#endif -+ -+#define DySet(func, dst, src, h_op, h_sb) do { \ -+ DyDbgInc(cnt); \ -+ if (h_op->func) { \ -+ if (src.func) \ -+ dst.func = src.func; \ -+ else \ -+ AuDbg("%s %s\n", au_sbtype(h_sb), #func); \ -+ } \ -+} while (0) -+ -+#define DySetForce(func, dst, src) do { \ -+ AuDebugOn(!src.func); \ -+ DyDbgInc(cnt); \ -+ dst.func = src.func; \ -+} while (0) -+ -+#define DySetAop(func) \ -+ DySet(func, dyaop->da_op, aufs_aop, h_aop, h_sb) -+#define DySetAopForce(func) \ -+ DySetForce(func, dyaop->da_op, aufs_aop) -+ -+static void dy_aop(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused) -+{ -+ struct au_dyaop *dyaop = (void *)key; -+ const struct address_space_operations *h_aop = h_op; -+ DyDbgDeclare(cnt); -+ -+ AuDbg("%s\n", au_sbtype(h_sb)); -+ -+ DySetAop(writepage); -+ DySetAopForce(readpage); /* force */ -+ DySetAop(writepages); -+ DySetAop(set_page_dirty); -+ DySetAop(readpages); -+ DySetAop(readahead); -+ DySetAop(write_begin); -+ DySetAop(write_end); -+ DySetAop(bmap); -+ DySetAop(invalidatepage); -+ DySetAop(releasepage); -+ DySetAop(freepage); -+ /* this one will be changed according to an aufs mount option */ -+ DySetAop(direct_IO); -+ DySetAop(migratepage); -+ DySetAop(isolate_page); -+ DySetAop(putback_page); -+ DySetAop(launder_page); -+ DySetAop(is_partially_uptodate); -+ DySetAop(is_dirty_writeback); -+ DySetAop(error_remove_page); -+ DySetAop(swap_activate); -+ DySetAop(swap_deactivate); -+ -+ DyDbgSize(cnt, *h_aop); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void dy_bug(struct kref *kref) -+{ -+ BUG(); -+} -+ -+static struct au_dykey *dy_get(struct au_dynop *op, struct au_branch *br) -+{ -+ struct au_dykey *key, *old; -+ struct hlist_bl_head *hbl; -+ struct op { -+ unsigned int sz; -+ void (*set)(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused); -+ }; -+ static const struct op a[] = { -+ [AuDy_AOP] = { -+ .sz = sizeof(struct au_dyaop), -+ .set = dy_aop -+ } -+ }; -+ const struct op *p; -+ -+ hbl = dynop + op->dy_type; -+ key = dy_gfind_get(hbl, op->dy_hop); -+ if (key) -+ goto out_add; /* success */ -+ -+ p = a + op->dy_type; -+ key = kzalloc(p->sz, GFP_NOFS); -+ if (unlikely(!key)) { -+ key = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ key->dk_op.dy_hop = op->dy_hop; -+ kref_init(&key->dk_kref); -+ p->set(key, op->dy_hop, au_br_sb(br)); -+ old = dy_gadd(hbl, key); -+ if (old) { -+ au_kfree_rcu(key); -+ key = old; -+ } -+ -+out_add: -+ old = dy_bradd(br, key); -+ if (old) -+ /* its ref-count should never be zero here */ -+ kref_put(&key->dk_kref, dy_bug); -+out: -+ return key; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs prohibits O_DIRECT by default even if the branch supports it. -+ * This behaviour is necessary to return an error from open(O_DIRECT) instead -+ * of the succeeding I/O. The dio mount option enables O_DIRECT and makes -+ * open(O_DIRECT) always succeed, but the succeeding I/O may return an error. -+ * See the aufs manual in detail. -+ */ -+static void dy_adx(struct au_dyaop *dyaop, int do_dx) -+{ -+ if (!do_dx) -+ dyaop->da_op.direct_IO = NULL; -+ else -+ dyaop->da_op.direct_IO = aufs_aop.direct_IO; -+} -+ -+static struct au_dyaop *dy_aget(struct au_branch *br, -+ const struct address_space_operations *h_aop, -+ int do_dx) -+{ -+ struct au_dyaop *dyaop; -+ struct au_dynop op; -+ -+ op.dy_type = AuDy_AOP; -+ op.dy_haop = h_aop; -+ dyaop = (void *)dy_get(&op, br); -+ if (IS_ERR(dyaop)) -+ goto out; -+ dy_adx(dyaop, do_dx); -+ -+out: -+ return dyaop; -+} -+ -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode) -+{ -+ int err, do_dx; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dyaop *dyaop; -+ -+ AuDebugOn(!S_ISREG(h_inode->i_mode)); -+ IiMustWriteLock(inode); -+ -+ sb = inode->i_sb; -+ br = au_sbr(sb, bindex); -+ do_dx = !!au_opt_test(au_mntflags(sb), DIO); -+ dyaop = dy_aget(br, h_inode->i_mapping->a_ops, do_dx); -+ err = PTR_ERR(dyaop); -+ if (IS_ERR(dyaop)) -+ /* unnecessary to call dy_fput() */ -+ goto out; -+ -+ err = 0; -+ inode->i_mapping->a_ops = &dyaop->da_op; -+ -+out: -+ return err; -+} -+ -+/* -+ * Is it safe to replace a_ops during the inode/file is in operation? -+ * Yes, I hope so. -+ */ -+int au_dy_irefresh(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct inode *h_inode; -+ -+ err = 0; -+ if (S_ISREG(inode->i_mode)) { -+ btop = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, btop); -+ err = au_dy_iaop(inode, btop, h_inode); -+ } -+ return err; -+} -+ -+void au_dy_arefresh(int do_dx) -+{ -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dykey *key; -+ -+ hbl = dynop + AuDy_AOP; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(key, pos, hbl, dk_hnode) -+ dy_adx((void *)key, do_dx); -+ hlist_bl_unlock(hbl); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __init au_dy_init(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ INIT_HLIST_BL_HEAD(dynop + i); -+} -+ -+void au_dy_fin(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ WARN_ON(!hlist_bl_empty(dynop + i)); -+} -diff --git a/fs/aufs/dynop.h b/fs/aufs/dynop.h -new file mode 100644 -index 000000000000..66ac96bbf2ff ---- /dev/null -+++ b/fs/aufs/dynop.h -@@ -0,0 +1,64 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2010-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * dynamically customizable operations (for regular files only) -+ */ -+ -+#ifndef __AUFS_DYNOP_H__ -+#define __AUFS_DYNOP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+enum {AuDy_AOP, AuDyLast}; -+ -+struct au_dynop { -+ int dy_type; -+ union { -+ const void *dy_hop; -+ const struct address_space_operations *dy_haop; -+ }; -+}; -+ -+struct au_dykey { -+ union { -+ struct hlist_bl_node dk_hnode; -+ struct rcu_head dk_rcu; -+ }; -+ struct au_dynop dk_op; -+ -+ /* -+ * during I am in the branch local array, kref is gotten. when the -+ * branch is removed, kref is put. -+ */ -+ struct kref dk_kref; -+}; -+ -+/* stop unioning since their sizes are very different from each other */ -+struct au_dyaop { -+ struct au_dykey da_key; -+ struct address_space_operations da_op; /* not const */ -+}; -+/* make sure that 'struct au_dykey *' can be any type */ -+static_assert(!offsetof(struct au_dyaop, da_key)); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dynop.c */ -+struct au_branch; -+void au_dy_put(struct au_dykey *key); -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode); -+int au_dy_irefresh(struct inode *inode); -+void au_dy_arefresh(int do_dio); -+ -+void __init au_dy_init(void); -+void au_dy_fin(void); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DYNOP_H__ */ -diff --git a/fs/aufs/export.c b/fs/aufs/export.c -new file mode 100644 -index 000000000000..94005688ac0b ---- /dev/null -+++ b/fs/aufs/export.c -@@ -0,0 +1,824 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * export via nfs -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+union conv { -+#ifdef CONFIG_AUFS_INO_T_64 -+ __u32 a[2]; -+#else -+ __u32 a[1]; -+#endif -+ ino_t ino; -+}; -+ -+static ino_t decode_ino(__u32 *a) -+{ -+ union conv u; -+ -+ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); -+ u.a[0] = a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ u.a[1] = a[1]; -+#endif -+ return u.ino; -+} -+ -+static void encode_ino(__u32 *a, ino_t ino) -+{ -+ union conv u; -+ -+ u.ino = ino; -+ a[0] = u.a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ a[1] = u.a[1]; -+#endif -+} -+ -+/* NFS file handle */ -+enum { -+ Fh_br_id, -+ Fh_sigen, -+#ifdef CONFIG_AUFS_INO_T_64 -+ /* support 64bit inode number */ -+ Fh_ino1, -+ Fh_ino2, -+ Fh_dir_ino1, -+ Fh_dir_ino2, -+#else -+ Fh_ino1, -+ Fh_dir_ino1, -+#endif -+ Fh_igen, -+ Fh_h_type, -+ Fh_tail, -+ -+ Fh_ino = Fh_ino1, -+ Fh_dir_ino = Fh_dir_ino1 -+}; -+ -+static int au_test_anon(struct dentry *dentry) -+{ -+ /* note: read d_flags without d_lock */ -+ return !!(dentry->d_flags & DCACHE_DISCONNECTED); -+} -+ -+int au_test_nfsd(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ ret = !strcmp(comm, "nfsd"); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* inode generation external table */ -+ -+void au_xigen_inc(struct inode *inode) -+{ -+ loff_t pos; -+ ssize_t sz; -+ __u32 igen; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ sb = inode->i_sb; -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ -+ sbinfo = au_sbi(sb); -+ pos = inode->i_ino; -+ pos *= sizeof(igen); -+ igen = inode->i_generation + 1; -+ sz = xino_fwrite(sbinfo->si_xigen, &igen, sizeof(igen), &pos); -+ if (sz == sizeof(igen)) -+ return; /* success */ -+ -+ if (unlikely(sz >= 0)) -+ AuIOErr("xigen error (%zd)\n", sz); -+} -+ -+int au_xigen_new(struct inode *inode) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ err = 0; -+ /* todo: dirty, at mount time */ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ goto out; -+ sb = inode->i_sb; -+ SiMustAnyLock(sb); -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ goto out; -+ -+ err = -EFBIG; -+ pos = inode->i_ino; -+ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { -+ AuIOErr1("too large i%lld\n", pos); -+ goto out; -+ } -+ pos *= sizeof(inode->i_generation); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ file = sbinfo->si_xigen; -+ BUG_ON(!file); -+ -+ if (vfsub_f_size_read(file) -+ < pos + sizeof(inode->i_generation)) { -+ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); -+ sz = xino_fwrite(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ } else -+ sz = xino_fread(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ if (sz == sizeof(inode->i_generation)) -+ goto out; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xigen error (%zd)\n", sz); -+ } -+ -+out: -+ return err; -+} -+ -+int au_xigen_set(struct super_block *sb, struct path *path) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xigen); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ err = 0; -+ if (sbinfo->si_xigen) -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = file; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xigen_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xigen) { -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino) -+{ -+ struct dentry *dentry, *d; -+ struct inode *inode; -+ unsigned int sigen; -+ -+ dentry = NULL; -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ dentry = ERR_PTR(-ESTALE); -+ sigen = au_sigen(sb); -+ if (unlikely(au_is_bad_inode(inode) -+ || IS_DEADDIR(inode) -+ || sigen != au_iigen(inode, NULL))) -+ goto out_iput; -+ -+ dentry = NULL; -+ if (!dir_ino || S_ISDIR(inode->i_mode)) -+ dentry = d_find_alias(inode); -+ else { -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ if (!au_test_anon(d) -+ && d_inode(d->d_parent)->i_ino == dir_ino) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ if (unlikely(dentry && au_digen_test(dentry, sigen))) { -+ /* need to refresh */ -+ dput(dentry); -+ dentry = NULL; -+ } -+ -+out_iput: -+ iput(inode); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: dirty? */ -+/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ -+ -+struct au_compare_mnt_args { -+ /* input */ -+ struct super_block *sb; -+ -+ /* output */ -+ struct vfsmount *mnt; -+}; -+ -+static int au_compare_mnt(struct vfsmount *mnt, void *arg) -+{ -+ struct au_compare_mnt_args *a = arg; -+ -+ if (mnt->mnt_sb != a->sb) -+ return 0; -+ a->mnt = mntget(mnt); -+ return 1; -+} -+ -+static struct vfsmount *au_mnt_get(struct super_block *sb) -+{ -+ int err; -+ struct path root; -+ struct au_compare_mnt_args args = { -+ .sb = sb -+ }; -+ -+ get_fs_root(current->fs, &root); -+ rcu_read_lock(); -+ err = iterate_mounts(au_compare_mnt, &args, root.mnt); -+ rcu_read_unlock(); -+ path_put(&root); -+ AuDebugOn(!err); -+ AuDebugOn(!args.mnt); -+ return args.mnt; -+} -+ -+struct au_nfsd_si_lock { -+ unsigned int sigen; -+ aufs_bindex_t bindex, br_id; -+ unsigned char force_lock; -+}; -+ -+static int si_nfsd_read_lock(struct super_block *sb, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ /* branch id may be wrapped around */ -+ err = 0; -+ bindex = au_br_index(sb, nsi_lock->br_id); -+ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) -+ goto out; /* success */ -+ -+ err = -ESTALE; -+ bindex = -1; -+ if (!nsi_lock->force_lock) -+ si_read_unlock(sb); -+ -+out: -+ nsi_lock->bindex = bindex; -+ return err; -+} -+ -+struct find_name_by_ino { -+ struct dir_context ctx; -+ int called, found; -+ ino_t ino; -+ char *name; -+ int namelen; -+}; -+ -+static int -+find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, -+ loff_t offset, u64 ino, unsigned int d_type) -+{ -+ struct find_name_by_ino *a = container_of(ctx, struct find_name_by_ino, -+ ctx); -+ -+ a->called++; -+ if (a->ino != ino) -+ return 0; -+ -+ memcpy(a->name, name, namelen); -+ a->namelen = namelen; -+ a->found = 1; -+ return 1; -+} -+ -+static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *parent; -+ struct file *file; -+ struct inode *dir; -+ struct find_name_by_ino arg = { -+ .ctx = { -+ .actor = find_name_by_ino -+ } -+ }; -+ int err; -+ -+ parent = path->dentry; -+ if (nsi_lock) -+ si_read_unlock(parent->d_sb); -+ file = vfsub_dentry_open(path, au_dir_roflags); -+ dentry = (void *)file; -+ if (IS_ERR(file)) -+ goto out; -+ -+ dentry = ERR_PTR(-ENOMEM); -+ arg.name = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!arg.name)) -+ goto out_file; -+ arg.ino = ino; -+ arg.found = 0; -+ do { -+ arg.called = 0; -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(file, &arg.ctx); -+ } while (!err && !arg.found && arg.called); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_name; -+ /* instead of ENOENT */ -+ dentry = ERR_PTR(-ESTALE); -+ if (!arg.found) -+ goto out_name; -+ -+ /* do not call vfsub_lkup_one() */ -+ dir = d_inode(parent); -+ dentry = vfsub_lookup_one_len_unlocked(arg.name, parent, arg.namelen); -+ AuTraceErrPtr(dentry); -+ if (IS_ERR(dentry)) -+ goto out_name; -+ AuDebugOn(au_test_anon(dentry)); -+ if (unlikely(d_really_is_negative(dentry))) { -+ dput(dentry); -+ dentry = ERR_PTR(-ENOENT); -+ } -+ -+out_name: -+ free_page((unsigned long)arg.name); -+out_file: -+ fput(file); -+out: -+ if (unlikely(nsi_lock -+ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry; -+ struct path path; -+ -+ if (dir_ino != AUFS_ROOT_INO) { -+ path.dentry = decode_by_ino(sb, dir_ino, 0); -+ dentry = path.dentry; -+ if (!path.dentry || IS_ERR(path.dentry)) -+ goto out; -+ AuDebugOn(au_test_anon(path.dentry)); -+ } else -+ path.dentry = dget(sb->s_root); -+ -+ path.mnt = au_mnt_get(sb); -+ dentry = au_lkup_by_ino(&path, ino, nsi_lock); -+ path_put(&path); -+ -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int h_acceptable(void *expv, struct dentry *dentry) -+{ -+ return 1; -+} -+ -+static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, -+ char *buf, int len, struct super_block *sb) -+{ -+ char *p; -+ int n; -+ struct path path; -+ -+ p = d_path(h_rootpath, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ n = strlen(p); -+ -+ path.mnt = h_rootpath->mnt; -+ path.dentry = h_parent; -+ p = d_path(&path, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p += n; -+ -+ path.mnt = au_mnt_get(sb); -+ path.dentry = sb->s_root; -+ p = d_path(&path, buf, len - strlen(p)); -+ mntput(path.mnt); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p[strlen(p)] = '/'; -+ -+out: -+ AuTraceErrPtr(p); -+ return p; -+} -+ -+static -+struct dentry *decode_by_path(struct super_block *sb, ino_t ino, __u32 *fh, -+ int fh_len, struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *h_parent, *root; -+ struct super_block *h_sb; -+ char *pathname, *p; -+ struct vfsmount *h_mnt; -+ struct au_branch *br; -+ int err; -+ struct path path; -+ -+ br = au_sbr(sb, nsi_lock->bindex); -+ h_mnt = au_br_mnt(br); -+ h_sb = h_mnt->mnt_sb; -+ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ -+ lockdep_off(); -+ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), -+ fh_len - Fh_tail, fh[Fh_h_type], -+ h_acceptable, /*context*/NULL); -+ lockdep_on(); -+ dentry = h_parent; -+ if (unlikely(!h_parent || IS_ERR(h_parent))) { -+ AuWarn1("%s decode_fh failed, %ld\n", -+ au_sbtype(h_sb), PTR_ERR(h_parent)); -+ goto out; -+ } -+ dentry = NULL; -+ if (unlikely(au_test_anon(h_parent))) { -+ AuWarn1("%s decode_fh returned a disconnected dentry\n", -+ au_sbtype(h_sb)); -+ goto out_h_parent; -+ } -+ -+ dentry = ERR_PTR(-ENOMEM); -+ pathname = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!pathname)) -+ goto out_h_parent; -+ -+ root = sb->s_root; -+ path.mnt = h_mnt; -+ di_read_lock_parent(root, !AuLock_IR); -+ path.dentry = au_h_dptr(root, nsi_lock->bindex); -+ di_read_unlock(root, !AuLock_IR); -+ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); -+ dentry = (void *)p; -+ if (IS_ERR(p)) -+ goto out_pathname; -+ -+ si_read_unlock(sb); -+ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_relock; -+ -+ dentry = ERR_PTR(-ENOENT); -+ AuDebugOn(au_test_anon(path.dentry)); -+ if (unlikely(d_really_is_negative(path.dentry))) -+ goto out_path; -+ -+ if (ino != d_inode(path.dentry)->i_ino) -+ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); -+ else -+ dentry = dget(path.dentry); -+ -+out_path: -+ path_put(&path); -+out_relock: -+ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+out_pathname: -+ free_page((unsigned long)pathname); -+out_h_parent: -+ dput(h_parent); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry * -+aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, -+ int fh_type) -+{ -+ struct dentry *dentry; -+ __u32 *fh = fid->raw; -+ struct au_branch *br; -+ ino_t ino, dir_ino; -+ struct au_nfsd_si_lock nsi_lock = { -+ .force_lock = 0 -+ }; -+ -+ dentry = ERR_PTR(-ESTALE); -+ /* it should never happen, but the file handle is unreliable */ -+ if (unlikely(fh_len < Fh_tail)) -+ goto out; -+ nsi_lock.sigen = fh[Fh_sigen]; -+ nsi_lock.br_id = fh[Fh_br_id]; -+ -+ /* branch id may be wrapped around */ -+ br = NULL; -+ if (unlikely(si_nfsd_read_lock(sb, &nsi_lock))) -+ goto out; -+ nsi_lock.force_lock = 1; -+ -+ /* is this inode still cached? */ -+ ino = decode_ino(fh + Fh_ino); -+ /* it should never happen */ -+ if (unlikely(ino == AUFS_ROOT_INO)) -+ goto out_unlock; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ dentry = decode_by_ino(sb, ino, dir_ino); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* is the parent dir cached? */ -+ br = au_sbr(sb, nsi_lock.bindex); -+ au_lcnt_inc(&br->br_nfiles); -+ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* lookup path */ -+ dentry = decode_by_path(sb, ino, fh, fh_len, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (unlikely(!dentry)) -+ /* todo?: make it ESTALE */ -+ goto out_unlock; -+ -+accept: -+ if (!au_digen_test(dentry, au_sigen(sb)) -+ && d_inode(dentry)->i_generation == fh[Fh_igen]) -+ goto out_unlock; /* success */ -+ -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+out_unlock: -+ if (br) -+ au_lcnt_dec(&br->br_nfiles); -+ si_read_unlock(sb); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+#if 0 /* reserved for future use */ -+/* support subtreecheck option */ -+static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, -+ int fh_len, int fh_type) -+{ -+ struct dentry *parent; -+ __u32 *fh = fid->raw; -+ ino_t dir_ino; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ parent = decode_by_ino(sb, dir_ino, 0); -+ if (IS_ERR(parent)) -+ goto out; -+ if (!parent) -+ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), -+ dir_ino, fh, fh_len); -+ -+out: -+ AuTraceErrPtr(parent); -+ return parent; -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, -+ struct inode *dir) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ struct dentry *dentry, *parent, *h_parent; -+ struct inode *h_dir; -+ struct au_branch *br; -+ -+ err = -ENOSPC; -+ if (unlikely(*max_len <= Fh_tail)) { -+ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); -+ goto out; -+ } -+ -+ err = FILEID_ROOT; -+ if (inode->i_ino == AUFS_ROOT_INO) { -+ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); -+ goto out; -+ } -+ -+ h_parent = NULL; -+ sb = inode->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(err)) -+ goto out; -+ -+#ifdef CONFIG_AUFS_DEBUG -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ AuWarn1("NFS-exporting requires xino\n"); -+#endif -+ err = -EIO; -+ parent = NULL; -+ ii_read_lock_child(inode); -+ bindex = au_ibtop(inode); -+ if (!dir) { -+ dentry = d_find_any_alias(inode); -+ if (unlikely(!dentry)) -+ goto out_unlock; -+ AuDebugOn(au_test_anon(dentry)); -+ parent = dget_parent(dentry); -+ dput(dentry); -+ if (unlikely(!parent)) -+ goto out_unlock; -+ if (d_really_is_positive(parent)) -+ dir = d_inode(parent); -+ } -+ -+ ii_read_lock_parent(dir); -+ h_dir = au_h_iptr(dir, bindex); -+ ii_read_unlock(dir); -+ if (unlikely(!h_dir)) -+ goto out_parent; -+ h_parent = d_find_any_alias(h_dir); -+ if (unlikely(!h_parent)) -+ goto out_hparent; -+ -+ err = -EPERM; -+ br = au_sbr(sb, bindex); -+ h_sb = au_br_sb(br); -+ if (unlikely(!h_sb->s_export_op)) { -+ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); -+ goto out_hparent; -+ } -+ -+ fh[Fh_br_id] = br->br_id; -+ fh[Fh_sigen] = au_sigen(sb); -+ encode_ino(fh + Fh_ino, inode->i_ino); -+ encode_ino(fh + Fh_dir_ino, dir->i_ino); -+ fh[Fh_igen] = inode->i_generation; -+ -+ *max_len -= Fh_tail; -+ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), -+ max_len, -+ /*connectable or subtreecheck*/0); -+ err = fh[Fh_h_type]; -+ *max_len += Fh_tail; -+ /* todo: macros? */ -+ if (err != FILEID_INVALID) -+ err = 99; -+ else -+ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); -+ -+out_hparent: -+ dput(h_parent); -+out_parent: -+ dput(parent); -+out_unlock: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+out: -+ if (unlikely(err < 0)) -+ err = FILEID_INVALID; -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_commit_metadata(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ int (*f)(struct inode *inode); -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ ii_write_lock_child(inode); -+ bindex = au_ibtop(inode); -+ AuDebugOn(bindex < 0); -+ h_inode = au_h_iptr(inode, bindex); -+ -+ 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); -+ } -+ -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct export_operations aufs_export_op = { -+ .fh_to_dentry = aufs_fh_to_dentry, -+ /* .fh_to_parent = aufs_fh_to_parent, */ -+ .encode_fh = aufs_encode_fh, -+ .commit_metadata = aufs_commit_metadata -+}; -+ -+void au_export_init(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ __u32 u; -+ -+ BUILD_BUG_ON_MSG(IS_BUILTIN(CONFIG_AUFS_FS) -+ && IS_MODULE(CONFIG_EXPORTFS), -+ AUFS_NAME ": unsupported configuration " -+ "CONFIG_EXPORTFS=m and CONFIG_AUFS_FS=y"); -+ -+ sb->s_export_op = &aufs_export_op; -+ sbinfo = au_sbi(sb); -+ sbinfo->si_xigen = NULL; -+ get_random_bytes(&u, sizeof(u)); -+ BUILD_BUG_ON(sizeof(u) != sizeof(int)); -+ atomic_set(&sbinfo->si_xigen_next, u); -+} -diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c -new file mode 100644 -index 000000000000..7e9298b963aa ---- /dev/null -+++ b/fs/aufs/f_op.c -@@ -0,0 +1,749 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * file and vm operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct dentry *dentry, *h_dentry; -+ struct au_finfo *finfo; -+ struct inode *h_inode; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ finfo = au_fi(file); -+ memset(&finfo->fi_htop, 0, sizeof(finfo->fi_htop)); -+ atomic_set(&finfo->fi_mmapped, 0); -+ bindex = au_dbtop(dentry); -+ if (!h_file) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ goto out; -+ } -+ } else { -+ h_dentry = h_file->f_path.dentry; -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ /* br ref is already inc-ed */ -+ } -+ -+ if ((flags & __O_TMPFILE) -+ && !(flags & O_EXCL)) { -+ h_inode = file_inode(h_file); -+ spin_lock(&h_inode->i_lock); -+ h_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_inode->i_lock); -+ } -+ au_set_fbtop(file, bindex); -+ au_set_h_fptr(file, bindex, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ return err; -+} -+ -+static int aufs_open_nondir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_do_open_args args = { -+ .open = au_do_open_nondir -+ }; -+ -+ AuDbg("%pD, f_flags 0x%x, f_mode 0x%x\n", -+ file, vfsub_file_flags(file), file->f_mode); -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_do_open(file, &args); -+ si_read_unlock(sb); -+ return err; -+} -+ -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) -+{ -+ struct au_finfo *finfo; -+ aufs_bindex_t bindex; -+ -+ finfo = au_fi(file); -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) -+ au_set_h_fptr(file, bindex, NULL); -+ -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ struct file *h_file; -+ -+ err = 0; -+ h_file = au_hf_top(file); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ return err; -+} -+ -+static int aufs_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_nondir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * read and write functions acquire [fdi]_rwsem once, but release before -+ * mmap_sem. This is because to stop a race condition between mmap(2). -+ * Releasing these aufs-rwsem should be safe, no branch-management (by keeping -+ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in -+ * read functions after [fdi]_rwsem are released, but it should be harmless. -+ */ -+ -+/* Callers should call au_read_post() or fput() in the end */ -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc) -+{ -+ struct file *h_file; -+ int err; -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0, lsc); -+ if (!err) { -+ di_read_unlock(file->f_path.dentry, AuLock_IR); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (!keep_fi) -+ fi_read_unlock(file); -+ } else -+ h_file = ERR_PTR(err); -+ -+ return h_file; -+} -+ -+static void au_read_post(struct inode *inode, struct file *h_file) -+{ -+ /* update without lock, I don't think it a problem */ -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ fput(h_file); -+} -+ -+struct au_write_pre { -+ /* input */ -+ unsigned int lsc; -+ -+ /* output */ -+ blkcnt_t blks; -+ aufs_bindex_t btop; -+}; -+ -+/* -+ * return with iinfo is write-locked -+ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the -+ * end -+ */ -+static struct file *au_write_pre(struct file *file, int do_ready, -+ struct au_write_pre *wpre) -+{ -+ struct file *h_file; -+ struct dentry *dentry; -+ int err; -+ unsigned int lsc; -+ struct au_pin pin; -+ -+ lsc = 0; -+ if (wpre) -+ lsc = wpre->lsc; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, lsc); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ if (do_ready) { -+ err = au_ready_to_write(file, -1, &pin); -+ if (unlikely(err)) { -+ h_file = ERR_PTR(err); -+ di_write_unlock(dentry); -+ goto out_fi; -+ } -+ } -+ -+ di_downgrade_lock(dentry, /*flags*/0); -+ if (wpre) -+ wpre->btop = au_fbtop(file); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (wpre) -+ wpre->blks = file_inode(h_file)->i_blocks; -+ if (do_ready) -+ au_unpin(&pin); -+ di_read_unlock(dentry, /*flags*/0); -+ -+out_fi: -+ fi_write_unlock(file); -+out: -+ return h_file; -+} -+ -+static void au_write_post(struct inode *inode, struct file *h_file, -+ struct au_write_pre *wpre, ssize_t written) -+{ -+ struct inode *h_inode; -+ -+ au_cpup_attr_timesizes(inode); -+ AuDebugOn(au_ibtop(inode) != wpre->btop); -+ h_inode = file_inode(h_file); -+ inode->i_mode = h_inode->i_mode; -+ ii_write_unlock(inode); -+ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */ -+ if (written > 0) -+ au_fhsm_wrote(inode->i_sb, wpre->btop, -+ /*force*/h_inode->i_blocks > wpre->blks); -+ fput(h_file); -+} -+ -+/* -+ * todo: very ugly -+ * it locks both of i_mutex and si_rwsem for read in safe. -+ * if the plink maintenance mode continues forever (that is the problem), -+ * may loop forever. -+ */ -+static void au_mtx_and_read_lock(struct inode *inode) -+{ -+ int err; -+ struct super_block *sb = inode->i_sb; -+ -+ while (1) { -+ inode_lock(inode); -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) -+ break; -+ inode_unlock(inode); -+ si_read_lock(sb, AuLock_NOPLMW); -+ si_read_unlock(sb); -+ } -+} -+ -+static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio, -+ struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file; -+ ssize_t (*iter)(struct kiocb *, struct iov_iter *); -+ -+ err = security_file_permission(h_file, rw); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOSYS; /* the branch doesn't have its ->(read|write)_iter() */ -+ iter = NULL; -+ if (rw == MAY_READ) -+ iter = h_file->f_op->read_iter; -+ else if (rw == MAY_WRITE) -+ iter = h_file->f_op->write_iter; -+ -+ file = kio->ki_filp; -+ kio->ki_filp = h_file; -+ if (iter) { -+ lockdep_off(); -+ err = iter(kio, iov_iter); -+ lockdep_on(); -+ } else -+ /* currently there is no such fs */ -+ WARN_ON_ONCE(1); -+ kio->ki_filp = file; -+ -+out: -+ return err; -+} -+ -+static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file, *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/1, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (au_test_loopback_kthread()) { -+ au_warn_loopback(h_file->f_path.dentry->d_sb); -+ if (file->f_mapping != h_file->f_mapping) { -+ file->f_mapping = h_file->f_mapping; -+ smp_mb(); /* unnecessary? */ -+ } -+ } -+ fi_read_unlock(file); -+ -+ err = au_do_iter(h_file, MAY_READ, kio, iov_iter); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *file, *h_file; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ ssize_t err; -+ struct file *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t -+aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static long aufs_fallocate(struct file *file, int mode, loff_t offset, -+ loff_t len) -+{ -+ long err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_fallocate(h_file, mode, offset, len); -+ lockdep_on(); -+ au_write_post(inode, h_file, &wpre, /*written*/1); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static ssize_t aufs_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ enum { SRC, DST }; -+ struct { -+ struct inode *inode; -+ struct file *h_file; -+ struct super_block *h_sb; -+ } a[2]; -+#define a_src a[SRC] -+#define a_dst a[DST] -+ -+ err = -EINVAL; -+ a_src.inode = file_inode(src); -+ if (unlikely(!S_ISREG(a_src.inode->i_mode))) -+ goto out; -+ a_dst.inode = file_inode(dst); -+ if (unlikely(!S_ISREG(a_dst.inode->i_mode))) -+ goto out; -+ -+ au_mtx_and_read_lock(a_dst.inode); -+ /* -+ * in order to match the order in di_write_lock2_{child,parent}(), -+ * use f_path.dentry for this comparison. -+ */ -+ if (src->f_path.dentry < dst->f_path.dentry) { -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_1); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) -+ goto out_si; -+ -+ wpre.lsc = AuLsc_FI_2; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) { -+ au_read_post(a_src.inode, a_src.h_file); -+ goto out_si; -+ } -+ } else { -+ wpre.lsc = AuLsc_FI_1; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) -+ goto out_si; -+ -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_2); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) { -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, -+ /*written*/0); -+ goto out_si; -+ } -+ } -+ -+ err = -EXDEV; -+ a_src.h_sb = file_inode(a_src.h_file)->i_sb; -+ a_dst.h_sb = file_inode(a_dst.h_file)->i_sb; -+ if (unlikely(a_src.h_sb != a_dst.h_sb)) { -+ AuDbgFile(src); -+ AuDbgFile(dst); -+ goto out_file; -+ } -+ -+ err = vfsub_copy_file_range(a_src.h_file, src_pos, a_dst.h_file, -+ dst_pos, len, flags); -+ -+out_file: -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, err); -+ fi_read_unlock(src); -+ au_read_post(a_src.inode, a_src.h_file); -+out_si: -+ si_read_unlock(a_dst.inode->i_sb); -+ inode_unlock(a_dst.inode); -+out: -+ return err; -+#undef a_src -+#undef a_dst -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * The locking order around current->mmap_sem. -+ * - in most and regular cases -+ * file I/O syscall -- aufs_read() or something -+ * -- si_rwsem for read -- mmap_sem -+ * (Note that [fdi]i_rwsem are released before mmap_sem). -+ * - in mmap case -+ * mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem -+ * This AB-BA order is definitely bad, but is not a problem since "si_rwsem for -+ * read" allows multiple processes to acquire it and [fdi]i_rwsem are not held -+ * in file I/O. Aufs needs to stop lockdep in aufs_mmap() though. -+ * It means that when aufs acquires si_rwsem for write, the process should never -+ * acquire mmap_sem. -+ * -+ * Actually aufs_iterate() holds [fdi]i_rwsem before mmap_sem, but this is not a -+ * problem either since any directory is not able to be mmap-ed. -+ * The similar scenario is applied to aufs_readlink() too. -+ */ -+ -+#if 0 /* stop calling security_file_mmap() */ -+/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ -+#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) -+ -+static unsigned long au_arch_prot_conv(unsigned long flags) -+{ -+ /* currently ppc64 only */ -+#ifdef CONFIG_PPC64 -+ /* cf. linux/arch/powerpc/include/asm/mman.h */ -+ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); -+ return AuConv_VM_PROT(flags, SAO); -+#else -+ AuDebugOn(arch_calc_vm_prot_bits(-1)); -+ return 0; -+#endif -+} -+ -+static unsigned long au_prot_conv(unsigned long flags) -+{ -+ return AuConv_VM_PROT(flags, READ) -+ | AuConv_VM_PROT(flags, WRITE) -+ | AuConv_VM_PROT(flags, EXEC) -+ | au_arch_prot_conv(flags); -+} -+ -+/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ -+#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) -+ -+static unsigned long au_flag_conv(unsigned long flags) -+{ -+ return AuConv_VM_MAP(flags, GROWSDOWN) -+ | AuConv_VM_MAP(flags, DENYWRITE) -+ | AuConv_VM_MAP(flags, LOCKED); -+} -+#endif -+ -+static int aufs_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ int err; -+ const unsigned char wlock -+ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); -+ struct super_block *sb; -+ struct file *h_file; -+ struct inode *inode; -+ -+ AuDbgVmRegion(file, vma); -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ lockdep_off(); -+ si_read_lock(sb, AuLock_NOPLMW); -+ -+ h_file = au_write_pre(file, wlock, /*wpre*/NULL); -+ lockdep_on(); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ au_set_mmapped(file); -+ au_vm_file_reset(vma, h_file); -+ /* -+ * we cannot call security_mmap_file() here since it may acquire -+ * mmap_sem or i_mutex. -+ * -+ * err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags), -+ * au_flag_conv(vma->vm_flags)); -+ */ -+ if (!err) -+ err = call_mmap(h_file, vma); -+ if (!err) { -+ au_vm_prfile_set(vma, file); -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ goto out_fput; /* success */ -+ } -+ au_unset_mmapped(file); -+ au_vm_file_reset(vma, file); -+ -+out_fput: -+ lockdep_off(); -+ ii_write_unlock(inode); -+ lockdep_on(); -+ fput(h_file); -+out: -+ lockdep_off(); -+ si_read_unlock(sb); -+ lockdep_on(); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_fsync_nondir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ err = 0; /* -EBADF; */ /* posix? */ -+ if (unlikely(!(file->f_mode & FMODE_WRITE))) -+ goto out; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_unlock; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ au_write_post(inode, h_file, &wpre, /*written*/0); -+ -+out_unlock: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+out: -+ return err; -+} -+ -+static int aufs_fasync(int fd, struct file *file, int flag) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (h_file->f_op->fasync) -+ err = h_file->f_op->fasync(fd, h_file, flag); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_setfl(struct file *file, unsigned long arg) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ /* stop calling h_file->fasync */ -+ arg |= vfsub_file_flags(file) & FASYNC; -+ err = setfl(/*unused fd*/-1, h_file, arg); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no one supports this operation, currently */ -+#if 0 /* reserved for future use */ -+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, -+ size_t len, loff_t *pos, int more) -+{ -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_file_fop = { -+ .owner = THIS_MODULE, -+ -+ .llseek = default_llseek, -+ -+ .read_iter = aufs_read_iter, -+ .write_iter = aufs_write_iter, -+ -+#ifdef CONFIG_AUFS_POLL -+ .poll = aufs_poll, -+#endif -+ .unlocked_ioctl = aufs_ioctl_nondir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_nondir, -+#endif -+ .mmap = aufs_mmap, -+ .open = aufs_open_nondir, -+ .flush = aufs_flush_nondir, -+ .release = aufs_release_nondir, -+ .fsync = aufs_fsync_nondir, -+ .fasync = aufs_fasync, -+ /* .sendpage = aufs_sendpage, */ -+ .setfl = aufs_setfl, -+ .splice_write = aufs_splice_write, -+ .splice_read = aufs_splice_read, -+#if 0 /* reserved for future use */ -+ .aio_splice_write = aufs_aio_splice_write, -+ .aio_splice_read = aufs_aio_splice_read, -+#endif -+ .fallocate = aufs_fallocate, -+ .copy_file_range = aufs_copy_file_range -+}; -diff --git a/fs/aufs/fhsm.c b/fs/aufs/fhsm.c -new file mode 100644 -index 000000000000..cb054052cf9a ---- /dev/null -+++ b/fs/aufs/fhsm.c -@@ -0,0 +1,413 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * File-based Hierarchy Storage Management -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t au_fhsm_bottom(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ return fhsm->fhsm_bottom; -+} -+ -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ fhsm->fhsm_bottom = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_fhsm_test_jiffy(struct au_sbinfo *sbinfo, struct au_branch *br) -+{ -+ struct au_br_fhsm *bf; -+ -+ bf = br->br_fhsm; -+ MtxMustLock(&bf->bf_lock); -+ -+ return !bf->bf_readable -+ || time_after(jiffies, -+ bf->bf_jiffy + sbinfo->si_fhsm.fhsm_expire); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fhsm_notify(struct super_block *sb, int val) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (au_fhsm_pid(fhsm) -+ && atomic_read(&fhsm->fhsm_readable) != -1) { -+ atomic_set(&fhsm->fhsm_readable, val); -+ if (val) -+ wake_up(&fhsm->fhsm_wqh); -+ } -+} -+ -+static int au_fhsm_stfs(struct super_block *sb, aufs_bindex_t bindex, -+ struct aufs_stfs *rstfs, int do_lock, int do_notify) -+{ -+ int err; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(au_br_rdonly(br)); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ -+ if (do_lock) -+ mutex_lock(&bf->bf_lock); -+ else -+ MtxMustLock(&bf->bf_lock); -+ -+ /* sb->s_root for NFS is unreliable */ -+ err = au_br_stfs(br, &bf->bf_stfs); -+ if (unlikely(err)) { -+ AuErr1("FHSM failed (%d), b%d, ignored.\n", bindex, err); -+ goto out; -+ } -+ -+ bf->bf_jiffy = jiffies; -+ bf->bf_readable = 1; -+ if (do_notify) -+ au_fhsm_notify(sb, /*val*/1); -+ if (rstfs) -+ *rstfs = bf->bf_stfs; -+ -+out: -+ if (do_lock) -+ mutex_unlock(&bf->bf_lock); -+ au_fhsm_notify(sb, /*val*/1); -+ -+ return err; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ AuDbg("b%d, force %d\n", bindex, force); -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (!au_ftest_si(sbinfo, FHSM) -+ || fhsm->fhsm_bottom == bindex) -+ return; -+ -+ br = au_sbr(sb, bindex); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ mutex_lock(&bf->bf_lock); -+ if (force -+ || au_fhsm_pid(fhsm) -+ || au_fhsm_test_jiffy(sbinfo, br)) -+ err = au_fhsm_stfs(sb, bindex, /*rstfs*/NULL, /*do_lock*/0, -+ /*do_notify*/1); -+ mutex_unlock(&bf->bf_lock); -+} -+ -+void au_fhsm_wrote_all(struct super_block *sb, int force) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ /* exclude the bottom */ -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ au_fhsm_wrote(sb, bindex, force); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static __poll_t au_fhsm_poll(struct file *file, struct poll_table_struct *wait) -+{ -+ __poll_t mask; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ mask = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ poll_wait(file, &fhsm->fhsm_wqh, wait); -+ if (atomic_read(&fhsm->fhsm_readable)) -+ mask = EPOLLIN /* | EPOLLRDNORM */; -+ -+ if (!mask) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -+ -+static int au_fhsm_do_read_one(struct aufs_stbr __user *stbr, -+ struct aufs_stfs *stfs, __s16 brid) -+{ -+ int err; -+ -+ err = copy_to_user(&stbr->stfs, stfs, sizeof(*stfs)); -+ if (!err) -+ err = __put_user(brid, &stbr->brid); -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_do_read(struct super_block *sb, -+ struct aufs_stbr __user *stbr, size_t count) -+{ -+ ssize_t err; -+ int nstbr; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ /* except the bottom branch */ -+ err = 0; -+ nstbr = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; !err && bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_fhsm(br->br_perm)) -+ continue; -+ -+ bf = br->br_fhsm; -+ mutex_lock(&bf->bf_lock); -+ if (bf->bf_readable) { -+ err = -EFAULT; -+ if (count >= sizeof(*stbr)) -+ err = au_fhsm_do_read_one(stbr++, &bf->bf_stfs, -+ br->br_id); -+ if (!err) { -+ bf->bf_readable = 0; -+ count -= sizeof(*stbr); -+ nstbr++; -+ } -+ } -+ mutex_unlock(&bf->bf_lock); -+ } -+ if (!err) -+ err = sizeof(*stbr) * nstbr; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_read(struct file *file, char __user *buf, size_t count, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int readable; -+ aufs_bindex_t nfhsm, bindex, bbot; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct super_block *sb; -+ -+ err = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+need_data: -+ spin_lock_irq(&fhsm->fhsm_wqh.lock); -+ if (!atomic_read(&fhsm->fhsm_readable)) { -+ if (vfsub_file_flags(file) & O_NONBLOCK) -+ err = -EAGAIN; -+ else -+ err = wait_event_interruptible_locked_irq -+ (fhsm->fhsm_wqh, -+ atomic_read(&fhsm->fhsm_readable)); -+ } -+ spin_unlock_irq(&fhsm->fhsm_wqh.lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* sb may already be dead */ -+ au_rw_read_lock(&sbinfo->si_rwsem); -+ readable = atomic_read(&fhsm->fhsm_readable); -+ if (readable > 0) { -+ sb = sbinfo->si_sb; -+ AuDebugOn(!sb); -+ /* exclude the bottom branch */ -+ nfhsm = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ nfhsm++; -+ } -+ err = -EMSGSIZE; -+ if (nfhsm * sizeof(struct aufs_stbr) <= count) { -+ atomic_set(&fhsm->fhsm_readable, 0); -+ err = au_fhsm_do_read(sbinfo->si_sb, (void __user *)buf, -+ count); -+ } -+ } -+ au_rw_read_unlock(&sbinfo->si_rwsem); -+ if (!readable) -+ goto need_data; -+ -+out: -+ return err; -+} -+ -+static int au_fhsm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ /* sb may already be dead */ -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+ kobject_put(&sbinfo->si_kobj); -+ -+ return 0; -+} -+ -+static const struct file_operations au_fhsm_fops = { -+ .owner = THIS_MODULE, -+ .llseek = noop_llseek, -+ .read = au_fhsm_read, -+ .poll = au_fhsm_poll, -+ .release = au_fhsm_release -+}; -+ -+int au_fhsm_fd(struct super_block *sb, int oflags) -+{ -+ int err, fd; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) -+ goto out; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ if (!fhsm->fhsm_pid) -+ fhsm->fhsm_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&fhsm->fhsm_spin); -+ if (unlikely(err)) -+ goto out; -+ -+ oflags |= O_RDONLY; -+ /* oflags |= FMODE_NONOTIFY; */ -+ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out_pid; -+ -+ /* succeed regardless 'fhsm' status */ -+ kobject_get(&sbinfo->si_kobj); -+ si_noflush_read_lock(sb); -+ if (au_ftest_si(sbinfo, FHSM)) -+ au_fhsm_wrote_all(sb, /*force*/0); -+ si_read_unlock(sb); -+ goto out; /* success */ -+ -+out_pid: -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_fhsm_br_alloc(struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ br->br_fhsm = kmalloc(sizeof(*br->br_fhsm), GFP_NOFS); -+ if (br->br_fhsm) -+ au_br_fhsm_init(br->br_fhsm); -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_fhsm_fin(struct super_block *sb) -+{ -+ au_fhsm_notify(sb, /*val*/-1); -+} -+ -+void au_fhsm_init(struct au_sbinfo *sbinfo) -+{ -+ struct au_fhsm *fhsm; -+ -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock_init(&fhsm->fhsm_spin); -+ init_waitqueue_head(&fhsm->fhsm_wqh); -+ atomic_set(&fhsm->fhsm_readable, 0); -+ fhsm->fhsm_expire -+ = msecs_to_jiffies(AUFS_FHSM_CACHE_DEF_SEC * MSEC_PER_SEC); -+ fhsm->fhsm_bottom = -1; -+} -+ -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec) -+{ -+ sbinfo->si_fhsm.fhsm_expire -+ = msecs_to_jiffies(sec * MSEC_PER_SEC); -+} -+ -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo) -+{ -+ unsigned int u; -+ -+ if (!au_ftest_si(sbinfo, FHSM)) -+ return; -+ -+ u = jiffies_to_msecs(sbinfo->si_fhsm.fhsm_expire) / MSEC_PER_SEC; -+ if (u != AUFS_FHSM_CACHE_DEF_SEC) -+ seq_printf(seq, ",fhsm_sec=%u", u); -+} -diff --git a/fs/aufs/file.c b/fs/aufs/file.c -new file mode 100644 -index 000000000000..3911b2e7e46f ---- /dev/null -+++ b/fs/aufs/file.c -@@ -0,0 +1,850 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * handling file/dir, and address_space operation -+ */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+#include -+#endif -+#include -+#include "aufs.h" -+ -+/* drop flags for writing */ -+unsigned int au_file_roflags(unsigned int flags) -+{ -+ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); -+ flags |= O_RDONLY | O_NOATIME; -+ return flags; -+} -+ -+/* common functions to regular file and dir */ -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_path; -+ int err; -+ -+ /* a race condition can happen between open and unlink/rmdir */ -+ h_file = ERR_PTR(-ENOENT); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ spin_lock(&h_dentry->d_lock); -+ err = (!d_unhashed(dentry) && d_unlinked(h_dentry)) -+ /* || !d_inode(dentry)->i_nlink */ -+ ; -+ spin_unlock(&h_dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ err = au_br_test_oflag(flags, br); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* drop flags for writing */ -+ if (au_test_ro(sb, bindex, d_inode(dentry))) { -+ if (force_wr && !(flags & O_WRONLY)) -+ force_wr = 0; -+ flags = au_file_roflags(flags); -+ if (force_wr) { -+ h_file = ERR_PTR(-EROFS); -+ flags = au_file_roflags(flags); -+ if (unlikely(vfsub_native_ro(h_inode) -+ || IS_APPEND(h_inode))) -+ goto out; -+ flags &= ~O_ACCMODE; -+ flags |= O_WRONLY; -+ } -+ } -+ flags &= ~O_CREAT; -+ au_lcnt_inc(&br->br_nfiles); -+ h_path.dentry = h_dentry; -+ h_path.mnt = au_br_mnt(br); -+ h_file = vfsub_dentry_open(&h_path, flags); -+ if (IS_ERR(h_file)) -+ goto out_br; -+ -+ if (flags & __FMODE_EXEC) { -+ err = deny_write_access(h_file); -+ if (unlikely(err)) { -+ fput(h_file); -+ h_file = ERR_PTR(err); -+ goto out_br; -+ } -+ } -+ fsnotify_open(h_file); -+ goto out; /* success */ -+ -+out_br: -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return h_file; -+} -+ -+static int au_cmoo(struct dentry *dentry) -+{ -+ int err, cmoo, matched; -+ unsigned int udba; -+ struct path h_path; -+ struct au_pin pin; -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ struct inode *delegated; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ pid_t pid; -+ struct au_branch *br; -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ -+ DiMustWriteLock(dentry); -+ IiMustWriteLock(d_inode(dentry)); -+ -+ err = 0; -+ if (IS_ROOT(dentry)) -+ goto out; -+ cpg.bsrc = au_dbtop(dentry); -+ if (!cpg.bsrc) -+ goto out; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ pid = au_fhsm_pid(fhsm); -+ rcu_read_lock(); -+ matched = (pid -+ && (current->pid == pid -+ || rcu_dereference(current->real_parent)->pid == pid)); -+ rcu_read_unlock(); -+ if (matched) -+ goto out; -+ -+ br = au_sbr(sb, cpg.bsrc); -+ cmoo = au_br_cmoo(br->br_perm); -+ if (!cmoo) -+ goto out; -+ if (!d_is_reg(dentry)) -+ cmoo &= AuBrAttr_COO_ALL; -+ if (!cmoo) -+ goto out; -+ -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ err = au_wbr_do_copyup_bu(dentry, cpg.bsrc - 1); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) { -+ err = 0; /* there is no upper writable branch */ -+ goto out_dgrade; -+ } -+ AuDbg("bsrc %d, bdst %d\n", cpg.bsrc, cpg.bdst); -+ -+ /* do not respect the coo attrib for the target branch */ -+ err = au_cpup_dirs(dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ di_downgrade_lock(parent, AuLock_IR); -+ udba = au_opt_udba(sb); -+ err = au_pin(&pin, dentry, cpg.bdst, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ if (unlikely(err)) -+ goto out_parent; -+ if (!(cmoo & AuBrWAttr_MOO)) -+ goto out_parent; /* success */ -+ -+ err = au_pin(&pin, dentry, cpg.bsrc, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = au_h_dptr(dentry, cpg.bsrc); -+ hdir = au_hi(d_inode(parent), cpg.bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1); -+ au_unpin(&pin); -+ /* todo: keep h_dentry or not? */ -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) { -+ pr_err("unlink %pd after coo failed (%d), ignored\n", -+ dentry, err); -+ err = 0; -+ } -+ goto out_parent; /* success */ -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_parent: -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_do_open(struct file *file, struct au_do_open_args *args) -+{ -+ int err, aopen = args->aopen; -+ struct dentry *dentry; -+ struct au_finfo *finfo; -+ -+ if (!aopen) -+ err = au_finfo_init(file, args->fidir); -+ else { -+ lockdep_off(); -+ err = au_finfo_init(file, args->fidir); -+ lockdep_on(); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ di_write_lock_child(dentry); -+ err = au_cmoo(dentry); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (!err) { -+ if (!aopen) -+ err = args->open(file, vfsub_file_flags(file), NULL); -+ else { -+ lockdep_off(); -+ err = args->open(file, vfsub_file_flags(file), -+ args->h_file); -+ lockdep_on(); -+ } -+ } -+ di_read_unlock(dentry, AuLock_IR); -+ -+ finfo = au_fi(file); -+ if (!err) { -+ finfo->fi_file = file; -+ au_hbl_add(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ } -+ if (!aopen) -+ fi_write_unlock(file); -+ else { -+ lockdep_off(); -+ fi_write_unlock(file); -+ lockdep_on(); -+ } -+ if (unlikely(err)) { -+ finfo->fi_hdir = NULL; -+ au_finfo_fin(file); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reopen_nondir(struct file *file) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct dentry *dentry; -+ struct au_branch *br; -+ struct file *h_file, *h_file_tmp; -+ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ br = au_sbr(dentry->d_sb, btop); -+ h_file_tmp = NULL; -+ if (au_fbtop(file) == btop) { -+ h_file = au_hf_top(file); -+ if (file->f_mode == h_file->f_mode) -+ return 0; /* success */ -+ h_file_tmp = h_file; -+ get_file(h_file_tmp); -+ au_lcnt_inc(&br->br_nfiles); -+ au_set_h_fptr(file, btop, NULL); -+ } -+ AuDebugOn(au_fi(file)->fi_hdir); -+ /* -+ * it can happen -+ * file exists on both of rw and ro -+ * open --> dbtop and fbtop are both 0 -+ * prepend a branch as rw, "rw" become ro -+ * remove rw/file -+ * delete the top branch, "rw" becomes rw again -+ * --> dbtop is 1, fbtop is still 0 -+ * write --> fbtop is 0 but dbtop is 1 -+ */ -+ /* AuDebugOn(au_fbtop(file) < btop); */ -+ -+ h_file = au_h_open(dentry, btop, vfsub_file_flags(file) & ~O_TRUNC, -+ file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) { -+ if (h_file_tmp) { -+ /* revert */ -+ au_set_h_fptr(file, btop, h_file_tmp); -+ h_file_tmp = NULL; -+ } -+ goto out; /* todo: close all? */ -+ } -+ -+ err = 0; -+ au_set_fbtop(file, btop); -+ au_set_h_fptr(file, btop, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ if (h_file_tmp) { -+ fput(h_file_tmp); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, -+ struct dentry *hi_wh) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct au_dinfo *dinfo; -+ struct dentry *h_dentry; -+ struct au_hdentry *hdp; -+ -+ dinfo = au_di(file->f_path.dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ btop = dinfo->di_btop; -+ dinfo->di_btop = btgt; -+ hdp = au_hdentry(dinfo, btgt); -+ h_dentry = hdp->hd_dentry; -+ hdp->hd_dentry = hi_wh; -+ err = au_reopen_nondir(file); -+ hdp->hd_dentry = h_dentry; -+ dinfo->di_btop = btop; -+ -+ return err; -+} -+ -+static int au_ready_to_write_wh(struct file *file, loff_t len, -+ aufs_bindex_t bcpup, struct au_pin *pin) -+{ -+ int err; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry, *hi_wh; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = bcpup, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin -+ }; -+ -+ au_update_dbtop(cpg.dentry); -+ inode = d_inode(cpg.dentry); -+ h_inode = NULL; -+ if (au_dbtop(cpg.dentry) <= bcpup -+ && au_dbbot(cpg.dentry) >= bcpup) { -+ h_dentry = au_h_dptr(cpg.dentry, bcpup); -+ if (h_dentry && d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ } -+ hi_wh = au_hi_wh(inode, bcpup); -+ if (!hi_wh && !h_inode) -+ err = au_sio_cpup_wh(&cpg, file); -+ else -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, bcpup, hi_wh); -+ -+ if (!err -+ && (inode->i_nlink > 1 -+ || (inode->i_state & I_LINKABLE)) -+ && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) -+ au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); -+ -+ return err; -+} -+ -+/* -+ * prepare the @file for writing. -+ */ -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) -+{ -+ int err; -+ aufs_bindex_t dbtop; -+ struct dentry *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bsrc = au_fbtop(file); -+ err = au_test_ro(sb, cpg.bsrc, inode); -+ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) { -+ err = au_pin(pin, cpg.dentry, cpg.bsrc, AuOpt_UDBA_NONE, -+ /*flags*/0); -+ goto out; -+ } -+ -+ /* need to cpup or reopen */ -+ parent = dget_parent(cpg.dentry); -+ di_write_lock_parent(parent); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) -+ goto out_dgrade; -+ err = 0; -+ -+ if (!d_unhashed(cpg.dentry) && !au_h_dptr(parent, cpg.bdst)) { -+ err = au_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ } -+ -+ err = au_pin(pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ dbtop = au_dbtop(cpg.dentry); -+ if (dbtop <= cpg.bdst) -+ cpg.bsrc = cpg.bdst; -+ -+ if (dbtop <= cpg.bdst /* just reopen */ -+ || !d_unhashed(cpg.dentry) /* copyup and reopen */ -+ ) { -+ h_file = au_h_open_pre(cpg.dentry, cpg.bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ di_downgrade_lock(parent, AuLock_IR); -+ if (dbtop > cpg.bdst) -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ err = au_reopen_nondir(file); -+ au_h_open_post(cpg.dentry, cpg.bsrc, h_file); -+ } -+ } else { /* copyup as wh and reopen */ -+ /* -+ * since writable hfsplus branch is not supported, -+ * h_open_pre/post() are unnecessary. -+ */ -+ err = au_ready_to_write_wh(file, len, cpg.bdst, pin); -+ di_downgrade_lock(parent, AuLock_IR); -+ } -+ -+ if (!err) { -+ au_pin_set_parent_lflag(pin, /*lflag*/0); -+ goto out_dput; /* success */ -+ } -+ au_unpin(pin); -+ goto out_unlock; -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_dput: -+ dput(parent); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_noflush_read_lock(sb); -+ fi_read_lock(file); -+ ii_read_lock_child(inode); -+ -+ err = flush(file, id); -+ au_cpup_attr_timesizes(inode); -+ -+ ii_read_unlock(inode); -+ fi_read_unlock(file); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_file_refresh_by_inode(struct file *file, int *need_reopen) -+{ -+ int err; -+ struct au_pin pin; -+ struct au_finfo *finfo; -+ struct dentry *parent, *hi_wh; -+ struct inode *inode; -+ struct super_block *sb; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ finfo = au_fi(file); -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bdst = au_ibtop(inode); -+ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry)) -+ goto out; -+ -+ parent = dget_parent(cpg.dentry); -+ if (au_test_ro(sb, cpg.bdst, inode)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ di_read_unlock(parent, !AuLock_IR); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ err = 0; -+ } -+ -+ di_read_lock_parent(parent, AuLock_IR); -+ hi_wh = au_hi_wh(inode, cpg.bdst); -+ if (!S_ISDIR(inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode) -+ && !d_unhashed(cpg.dentry) -+ && cpg.bdst < au_dbtop(cpg.dentry)) { -+ err = au_test_and_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ /* always superio. */ -+ err = au_pin(&pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ } else if (hi_wh) { -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, cpg.bdst, hi_wh); -+ *need_reopen = 0; -+ } -+ -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_parent: -+ dput(parent); -+out: -+ return err; -+} -+ -+static void au_do_refresh_dir(struct file *file) -+{ -+ aufs_bindex_t bindex, bbot, new_bindex, brid; -+ struct au_hfile *p, tmp, *q; -+ struct au_finfo *finfo; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ FiMustWriteLock(file); -+ -+ sb = file->f_path.dentry->d_sb; -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ p = fidir->fd_hfile + finfo->fi_btop; -+ brid = p->hf_br->br_id; -+ bbot = fidir->fd_bbot; -+ for (bindex = finfo->fi_btop; bindex <= bbot; bindex++, p++) { -+ if (!p->hf_file) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hf_br->br_id); -+ if (new_bindex == bindex) -+ continue; -+ if (new_bindex < 0) { -+ au_set_h_fptr(file, bindex, NULL); -+ continue; -+ } -+ -+ /* swap two lower inode, and loop again */ -+ q = fidir->fd_hfile + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hf_file) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ p = fidir->fd_hfile; -+ if (!au_test_mmapped(file) && !d_unlinked(file->f_path.dentry)) { -+ bbot = au_sbbot(sb); -+ for (finfo->fi_btop = 0; finfo->fi_btop <= bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ } else { -+ bbot = au_br_index(sb, brid); -+ for (finfo->fi_btop = 0; finfo->fi_btop < bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) -+ au_hfput(p, /*execed*/0); -+ bbot = au_sbbot(sb); -+ } -+ -+ p = fidir->fd_hfile + bbot; -+ for (fidir->fd_bbot = bbot; fidir->fd_bbot >= finfo->fi_btop; -+ fidir->fd_bbot--, p--) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ AuDebugOn(fidir->fd_bbot < finfo->fi_btop); -+} -+ -+/* -+ * after branch manipulating, refresh the file. -+ */ -+static int refresh_file(struct file *file, int (*reopen)(struct file *file)) -+{ -+ int err, need_reopen, nbr; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_finfo *finfo; -+ struct au_hfile *hfile; -+ -+ dentry = file->f_path.dentry; -+ sb = dentry->d_sb; -+ nbr = au_sbbot(sb) + 1; -+ finfo = au_fi(file); -+ if (!finfo->fi_hdir) { -+ hfile = &finfo->fi_htop; -+ AuDebugOn(!hfile->hf_file); -+ bindex = au_br_index(sb, hfile->hf_br->br_id); -+ AuDebugOn(bindex < 0); -+ if (bindex != finfo->fi_btop) -+ au_set_fbtop(file, bindex); -+ } else { -+ err = au_fidir_realloc(finfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ au_do_refresh_dir(file); -+ } -+ -+ err = 0; -+ need_reopen = 1; -+ if (!au_test_mmapped(file)) -+ err = au_file_refresh_by_inode(file, &need_reopen); -+ if (finfo->fi_hdir) -+ /* harmless if err */ -+ au_fidir_realloc(finfo, nbr, /*may_shrink*/1); -+ if (!err && need_reopen && !d_unlinked(dentry)) -+ err = reopen(file); -+ if (!err) { -+ au_update_figen(file); -+ goto out; /* success */ -+ } -+ -+ /* error, close all lower files */ -+ if (finfo->fi_hdir) { -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ } -+ -+out: -+ return err; -+} -+ -+/* common function to regular file and dir */ -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc) -+{ -+ int err; -+ unsigned int sigen, figen; -+ aufs_bindex_t btop; -+ unsigned char pseudo_link; -+ struct dentry *dentry; -+ struct inode *inode; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ sigen = au_sigen(dentry->d_sb); -+ fi_write_lock_nested(file, fi_lsc); -+ figen = au_figen(file); -+ if (!fi_lsc) -+ di_write_lock_child(dentry); -+ else -+ di_write_lock_child2(dentry); -+ btop = au_dbtop(dentry); -+ pseudo_link = (btop != au_ibtop(inode)); -+ if (sigen == figen && !pseudo_link && au_fbtop(file) == btop) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ goto out; /* success */ -+ } -+ -+ AuDbg("sigen %d, figen %d\n", sigen, figen); -+ if (au_digen_test(dentry, sigen)) { -+ err = au_reval_dpath(dentry, sigen); -+ AuDebugOn(!err && au_digen_test(dentry, sigen)); -+ } -+ -+ if (!err) -+ err = refresh_file(file, reopen); -+ if (!err) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ } else { -+ di_write_unlock(dentry); -+ fi_write_unlock(file); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cf. aufs_nopage() */ -+/* for madvise(2) */ -+static int aufs_readpage(struct file *file __maybe_unused, struct page *page) -+{ -+ unlock_page(page); -+ return 0; -+} -+ -+/* it will never be called, but necessary to support O_DIRECT */ -+static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) -+{ BUG(); return 0; } -+ -+/* they will never be called. */ -+#ifdef CONFIG_AUFS_DEBUG -+static int aufs_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned flags, -+ struct page **pagep, void **fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_write_end(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned copied, -+ struct page *page, void *fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_writepage(struct page *page, struct writeback_control *wbc) -+{ AuUnsupport(); return 0; } -+ -+static int aufs_set_page_dirty(struct page *page) -+{ AuUnsupport(); return 0; } -+static void aufs_invalidatepage(struct page *page, unsigned int offset, -+ unsigned int length) -+{ AuUnsupport(); } -+static int aufs_releasepage(struct page *page, gfp_t gfp) -+{ AuUnsupport(); return 0; } -+#if 0 /* called by memory compaction regardless file */ -+static int aufs_migratepage(struct address_space *mapping, struct page *newpage, -+ struct page *page, enum migrate_mode mode) -+{ AuUnsupport(); return 0; } -+#endif -+static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) -+{ AuUnsupport(); return true; } -+static void aufs_putback_page(struct page *page) -+{ AuUnsupport(); } -+static int aufs_launder_page(struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_is_partially_uptodate(struct page *page, -+ unsigned long from, -+ unsigned long count) -+{ AuUnsupport(); return 0; } -+static void aufs_is_dirty_writeback(struct page *page, bool *dirty, -+ bool *writeback) -+{ AuUnsupport(); } -+static int aufs_error_remove_page(struct address_space *mapping, -+ struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, -+ sector_t *span) -+{ AuUnsupport(); return 0; } -+static void aufs_swap_deactivate(struct file *file) -+{ AuUnsupport(); } -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+const struct address_space_operations aufs_aop = { -+ .readpage = aufs_readpage, -+ .direct_IO = aufs_direct_IO, -+#ifdef CONFIG_AUFS_DEBUG -+ .writepage = aufs_writepage, -+ /* no writepages, because of writepage */ -+ .set_page_dirty = aufs_set_page_dirty, -+ /* no readpages, because of readpage */ -+ .write_begin = aufs_write_begin, -+ .write_end = aufs_write_end, -+ /* no bmap, no block device */ -+ .invalidatepage = aufs_invalidatepage, -+ .releasepage = aufs_releasepage, -+ /* is fallback_migrate_page ok? */ -+ /* .migratepage = aufs_migratepage, */ -+ .isolate_page = aufs_isolate_page, -+ .putback_page = aufs_putback_page, -+ .launder_page = aufs_launder_page, -+ .is_partially_uptodate = aufs_is_partially_uptodate, -+ .is_dirty_writeback = aufs_is_dirty_writeback, -+ .error_remove_page = aufs_error_remove_page, -+ .swap_activate = aufs_swap_activate, -+ .swap_deactivate = aufs_swap_deactivate -+#endif /* CONFIG_AUFS_DEBUG */ -+}; -diff --git a/fs/aufs/file.h b/fs/aufs/file.h -new file mode 100644 -index 000000000000..8bf8e67650d0 ---- /dev/null -+++ b/fs/aufs/file.h -@@ -0,0 +1,329 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * file operations -+ */ -+ -+#ifndef __AUFS_FILE_H__ -+#define __AUFS_FILE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "rwsem.h" -+ -+struct au_branch; -+struct au_hfile { -+ struct file *hf_file; -+ struct au_branch *hf_br; -+}; -+ -+struct au_vdir; -+struct au_fidir { -+ aufs_bindex_t fd_bbot; -+ aufs_bindex_t fd_nent; -+ struct au_vdir *fd_vdir_cache; -+ struct au_hfile fd_hfile[]; -+}; -+ -+static inline int au_fidir_sz(int nent) -+{ -+ AuDebugOn(nent < 0); -+ return sizeof(struct au_fidir) + sizeof(struct au_hfile) * nent; -+} -+ -+struct au_finfo { -+ atomic_t fi_generation; -+ -+ struct au_rwsem fi_rwsem; -+ aufs_bindex_t fi_btop; -+ -+ /* do not union them */ -+ struct { /* for non-dir */ -+ struct au_hfile fi_htop; -+ atomic_t fi_mmapped; -+ }; -+ struct au_fidir *fi_hdir; /* for dir only */ -+ -+ struct hlist_bl_node fi_hlist; -+ struct file *fi_file; /* very ugly */ -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* file.c */ -+extern const struct address_space_operations aufs_aop; -+unsigned int au_file_roflags(unsigned int flags); -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr); -+struct au_do_open_args { -+ int aopen; -+ int (*open)(struct file *file, int flags, -+ struct file *h_file); -+ struct au_fidir *fidir; -+ struct file *h_file; -+}; -+int au_do_open(struct file *file, struct au_do_open_args *args); -+int au_reopen_nondir(struct file *file); -+struct au_pin; -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc); -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)); -+ -+/* poll.c */ -+#ifdef CONFIG_AUFS_POLL -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt); -+#endif -+ -+#ifdef CONFIG_AUFS_BR_HFSPLUS -+/* hfsplus.c */ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr); -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#else -+AuStub(struct file *, au_h_open_pre, return NULL, struct dentry *dentry, -+ aufs_bindex_t bindex, int force_wr) -+AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#endif -+ -+/* f_op.c */ -+extern const struct file_operations aufs_file_fop; -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file); -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc); -+ -+/* finfo.c */ -+void au_hfput(struct au_hfile *hf, int execed); -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, -+ struct file *h_file); -+ -+void au_update_figen(struct file *file); -+struct au_fidir *au_fidir_alloc(struct super_block *sb); -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink); -+ -+void au_fi_init_once(void *_fi); -+void au_finfo_fin(struct file *file); -+int au_finfo_init(struct file *file, struct au_fidir *fidir); -+ -+/* ioctl.c */ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_finfo *au_fi(struct file *file) -+{ -+ return file->private_data; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define fi_read_lock(f) au_rw_read_lock(&au_fi(f)->fi_rwsem) -+#define fi_write_lock(f) au_rw_write_lock(&au_fi(f)->fi_rwsem) -+#define fi_read_trylock(f) au_rw_read_trylock(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock(f) au_rw_write_trylock(&au_fi(f)->fi_rwsem) -+/* -+#define fi_read_trylock_nested(f) \ -+ au_rw_read_trylock_nested(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock_nested(f) \ -+ au_rw_write_trylock_nested(&au_fi(f)->fi_rwsem) -+*/ -+ -+#define fi_read_unlock(f) au_rw_read_unlock(&au_fi(f)->fi_rwsem) -+#define fi_write_unlock(f) au_rw_write_unlock(&au_fi(f)->fi_rwsem) -+#define fi_downgrade_lock(f) au_rw_dgrade_lock(&au_fi(f)->fi_rwsem) -+ -+/* lock subclass for finfo */ -+enum { -+ AuLsc_FI_1, -+ AuLsc_FI_2 -+}; -+ -+static inline void fi_read_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_read_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+static inline void fi_write_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+/* -+ * fi_read_lock_1, fi_write_lock_1, -+ * fi_read_lock_2, fi_write_lock_2 -+ */ -+#define AuReadLockFunc(name) \ -+static inline void fi_read_lock_##name(struct file *f) \ -+{ fi_read_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuWriteLockFunc(name) \ -+static inline void fi_write_lock_##name(struct file *f) \ -+{ fi_write_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuRWLockFuncs(name) \ -+ AuReadLockFunc(name) \ -+ AuWriteLockFunc(name) -+ -+AuRWLockFuncs(1); -+AuRWLockFuncs(2); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) -+#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) -+#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: hard/soft set? */ -+static inline aufs_bindex_t au_fbtop(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_btop; -+} -+ -+static inline aufs_bindex_t au_fbbot_dir(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_bbot; -+} -+ -+static inline struct au_vdir *au_fvdir_cache(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_vdir_cache; -+} -+ -+static inline void au_set_fbtop(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_btop = bindex; -+} -+ -+static inline void au_set_fbbot_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_bbot = bindex; -+} -+ -+static inline void au_set_fvdir_cache(struct file *file, -+ struct au_vdir *vdir_cache) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_vdir_cache = vdir_cache; -+} -+ -+static inline struct file *au_hf_top(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_htop.hf_file; -+} -+ -+static inline struct file *au_hf_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_hfile[0 + bindex].hf_file; -+} -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_figen(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_generation); -+} -+ -+static inline void au_set_mmapped(struct file *f) -+{ -+ if (atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ return; -+ pr_warn("fi_mmapped wrapped around\n"); -+ while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ ; -+} -+ -+static inline void au_unset_mmapped(struct file *f) -+{ -+ atomic_dec(&au_fi(f)->fi_mmapped); -+} -+ -+static inline int au_test_mmapped(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_mmapped); -+} -+ -+/* customize vma->vm_file */ -+ -+static inline void au_do_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ f = vma->vm_file; -+ get_file(file); -+ vma->vm_file = file; -+ fput(f); -+} -+ -+#ifdef CONFIG_MMU -+#define AuDbgVmRegion(file, vma) do {} while (0) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ au_do_vm_file_reset(vma, file); -+} -+#else -+#define AuDbgVmRegion(file, vma) \ -+ AuDebugOn((vma)->vm_region && (vma)->vm_region->vm_file != (file)) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ au_do_vm_file_reset(vma, file); -+ f = vma->vm_region->vm_file; -+ get_file(file); -+ vma->vm_region->vm_file = file; -+ fput(f); -+} -+#endif /* CONFIG_MMU */ -+ -+/* handle vma->vm_prfile */ -+static inline void au_vm_prfile_set(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ get_file(file); -+ vma->vm_prfile = file; -+#ifndef CONFIG_MMU -+ get_file(file); -+ vma->vm_region->vm_prfile = file; -+#endif -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FILE_H__ */ -diff --git a/fs/aufs/finfo.c b/fs/aufs/finfo.c -new file mode 100644 -index 000000000000..e2d6859850b6 ---- /dev/null -+++ b/fs/aufs/finfo.c -@@ -0,0 +1,136 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * file private data -+ */ -+ -+#include "aufs.h" -+ -+void au_hfput(struct au_hfile *hf, int execed) -+{ -+ if (execed) -+ allow_write_access(hf->hf_file); -+ fput(hf->hf_file); -+ hf->hf_file = NULL; -+ au_lcnt_dec(&hf->hf_br->br_nfiles); -+ hf->hf_br = NULL; -+} -+ -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) -+{ -+ struct au_finfo *finfo = au_fi(file); -+ struct au_hfile *hf; -+ struct au_fidir *fidir; -+ -+ fidir = finfo->fi_hdir; -+ if (!fidir) { -+ AuDebugOn(finfo->fi_btop != bindex); -+ hf = &finfo->fi_htop; -+ } else -+ hf = fidir->fd_hfile + bindex; -+ -+ if (hf && hf->hf_file) -+ au_hfput(hf, vfsub_file_execed(file)); -+ if (val) { -+ FiMustWriteLock(file); -+ AuDebugOn(IS_ERR_OR_NULL(file->f_path.dentry)); -+ hf->hf_file = val; -+ hf->hf_br = au_sbr(file->f_path.dentry->d_sb, bindex); -+ } -+} -+ -+void au_update_figen(struct file *file) -+{ -+ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_path.dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_fidir *au_fidir_alloc(struct super_block *sb) -+{ -+ struct au_fidir *fidir; -+ int nbr; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr < 2) -+ nbr = 2; /* initial allocate for 2 branches */ -+ fidir = kzalloc(au_fidir_sz(nbr), GFP_NOFS); -+ if (fidir) { -+ fidir->fd_bbot = -1; -+ fidir->fd_nent = nbr; -+ } -+ -+ return fidir; -+} -+ -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink) -+{ -+ int err; -+ struct au_fidir *fidir, *p; -+ -+ AuRwMustWriteLock(&finfo->fi_rwsem); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ -+ err = -ENOMEM; -+ p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), -+ GFP_NOFS, may_shrink); -+ if (p) { -+ p->fd_nent = nbr; -+ finfo->fi_hdir = p; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_finfo_fin(struct file *file) -+{ -+ struct au_finfo *finfo; -+ -+ au_lcnt_dec(&au_sbi(file->f_path.dentry->d_sb)->si_nfiles); -+ -+ finfo = au_fi(file); -+ AuDebugOn(finfo->fi_hdir); -+ AuRwDestroy(&finfo->fi_rwsem); -+ au_cache_free_finfo(finfo); -+} -+ -+void au_fi_init_once(void *_finfo) -+{ -+ struct au_finfo *finfo = _finfo; -+ -+ au_rw_init(&finfo->fi_rwsem); -+} -+ -+int au_finfo_init(struct file *file, struct au_fidir *fidir) -+{ -+ int err; -+ struct au_finfo *finfo; -+ struct dentry *dentry; -+ -+ err = -ENOMEM; -+ dentry = file->f_path.dentry; -+ finfo = au_cache_alloc_finfo(); -+ if (unlikely(!finfo)) -+ goto out; -+ -+ err = 0; -+ au_lcnt_inc(&au_sbi(dentry->d_sb)->si_nfiles); -+ au_rw_write_lock(&finfo->fi_rwsem); -+ finfo->fi_btop = -1; -+ finfo->fi_hdir = fidir; -+ atomic_set(&finfo->fi_generation, au_digen(dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+ -+ file->private_data = finfo; -+ -+out: -+ return err; -+} -diff --git a/fs/aufs/fstype.h b/fs/aufs/fstype.h -new file mode 100644 -index 000000000000..7c001dae1859 ---- /dev/null -+++ b/fs/aufs/fstype.h -@@ -0,0 +1,388 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * judging filesystem type -+ */ -+ -+#ifndef __AUFS_FSTYPE_H__ -+#define __AUFS_FSTYPE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+static inline int au_test_aufs(struct super_block *sb) -+{ -+ return sb->s_magic == AUFS_SUPER_MAGIC; -+} -+ -+static inline const char *au_sbtype(struct super_block *sb) -+{ -+ return sb->s_type->name; -+} -+ -+static inline int au_test_iso9660(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ISO9660_FS) -+ return sb->s_magic == ISOFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_romfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ROMFS_FS) -+ return sb->s_magic == ROMFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_cramfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CRAMFS) -+ return sb->s_magic == CRAMFS_MAGIC; -+#endif -+ return 0; -+} -+ -+static inline int au_test_nfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NFS_FS) -+ return sb->s_magic == NFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fuse(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FUSE_FS) -+ return sb->s_magic == FUSE_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XFS_FS) -+ return sb->s_magic == XFS_SB_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_TMPFS -+ return sb->s_magic == TMPFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ECRYPT_FS) -+ return !strcmp(au_sbtype(sb), "ecryptfs"); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ramfs(struct super_block *sb) -+{ -+ return sb->s_magic == RAMFS_MAGIC; -+} -+ -+static inline int au_test_ubifs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_UBIFS_FS) -+ return sb->s_magic == UBIFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_procfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_PROC_FS -+ return sb->s_magic == PROC_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_sysfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SYSFS -+ return sb->s_magic == SYSFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_configfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CONFIGFS_FS) -+ return sb->s_magic == CONFIGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_minix(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_MINIX_FS) -+ return sb->s_magic == MINIX3_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC2 -+ || sb->s_magic == MINIX_SUPER_MAGIC -+ || sb->s_magic == MINIX_SUPER_MAGIC2; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fat(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FAT_FS) -+ return sb->s_magic == MSDOS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_msdos(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_vfat(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_securityfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SECURITYFS -+ return sb->s_magic == SECURITYFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_squashfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_SQUASHFS) -+ return sb->s_magic == SQUASHFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_btrfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_BTRFS_FS) -+ return sb->s_magic == BTRFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xenfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XENFS) -+ return sb->s_magic == XENFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_debugfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_DEBUG_FS -+ return sb->s_magic == DEBUGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_nilfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NILFS) -+ return sb->s_magic == NILFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_HFSPLUS_FS) -+ return sb->s_magic == HFSPLUS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * they can't be an aufs branch. -+ */ -+static inline int au_test_fs_unsuppoted(struct super_block *sb) -+{ -+ return -+#ifndef CONFIG_AUFS_BR_RAMFS -+ au_test_ramfs(sb) || -+#endif -+ au_test_procfs(sb) -+ || au_test_sysfs(sb) -+ || au_test_configfs(sb) -+ || au_test_debugfs(sb) -+ || au_test_securityfs(sb) -+ || au_test_xenfs(sb) -+ || au_test_ecryptfs(sb) -+ /* || !strcmp(au_sbtype(sb), "unionfs") */ -+ || au_test_aufs(sb); /* will be supported in next version */ -+} -+ -+static inline int au_test_fs_remote(struct super_block *sb) -+{ -+ return !au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ && !au_test_ramfs(sb) -+#endif -+ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * Note: these functions (below) are created after reading ->getattr() in all -+ * filesystems under linux/fs. it means we have to do so in every update... -+ */ -+ -+/* -+ * some filesystems require getattr to refresh the inode attributes before -+ * referencing. -+ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) -+ * and leave the work for d_revalidate() -+ */ -+static inline int au_test_fs_refresh_iattr(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ /* || au_test_btrfs(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't maintain i_size or i_blocks. -+ */ -+static inline int au_test_fs_bad_iattr_size(struct super_block *sb) -+{ -+ return au_test_xfs(sb) -+ || au_test_btrfs(sb) -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb) /* maintained, but incorrect */ -+ /* || au_test_minix(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't store the correct value in some of their inode -+ * attributes. -+ */ -+static inline int au_test_fs_bad_iattr(struct super_block *sb) -+{ -+ return au_test_fs_bad_iattr_size(sb) -+ || au_test_fat(sb) -+ || au_test_msdos(sb) -+ || au_test_vfat(sb); -+} -+ -+/* they don't check i_nlink in link(2) */ -+static inline int au_test_fs_no_limit_nlink(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ || au_test_ramfs(sb) -+#endif -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb); -+} -+ -+/* -+ * filesystems which sets S_NOATIME and S_NOCMTIME. -+ */ -+static inline int au_test_fs_notime(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ || au_test_ubifs(sb) -+ ; -+} -+ -+/* temporary support for i#1 in cramfs */ -+static inline int au_test_fs_unique_ino(struct inode *inode) -+{ -+ if (au_test_cramfs(inode->i_sb)) -+ return inode->i_ino != 1; -+ return 1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * the filesystem where the xino files placed must support i/o after unlink and -+ * maintain i_size and i_blocks. -+ */ -+static inline int au_test_fs_bad_xino(struct super_block *sb) -+{ -+ return au_test_fs_remote(sb) -+ || au_test_fs_bad_iattr_size(sb) -+ /* don't want unnecessary work for xino */ -+ || au_test_aufs(sb) -+ || au_test_ecryptfs(sb) -+ || au_test_nilfs(sb); -+} -+ -+static inline int au_test_fs_trunc_xino(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+ || au_test_ramfs(sb); -+} -+ -+/* -+ * test if the @sb is real-readonly. -+ */ -+static inline int au_test_fs_rr(struct super_block *sb) -+{ -+ return au_test_squashfs(sb) -+ || au_test_iso9660(sb) -+ || au_test_cramfs(sb) -+ || au_test_romfs(sb); -+} -+ -+/* -+ * test if the @inode is nfs with 'noacl' option -+ * NFS always sets SB_POSIXACL regardless its mount option 'noacl.' -+ */ -+static inline int au_test_nfs_noacl(struct inode *inode) -+{ -+ return au_test_nfs(inode->i_sb) -+ /* && IS_POSIXACL(inode) */ -+ && !nfs_server_capable(inode, NFS_CAP_ACLS); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FSTYPE_H__ */ -diff --git a/fs/aufs/hbl.h b/fs/aufs/hbl.h -new file mode 100644 -index 000000000000..571efb1e2300 ---- /dev/null -+++ b/fs/aufs/hbl.h -@@ -0,0 +1,52 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * helpers for hlist_bl.h -+ */ -+ -+#ifndef __AUFS_HBL_H__ -+#define __AUFS_HBL_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+static inline void au_hbl_add(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_add_head(node, hbl); -+ hlist_bl_unlock(hbl); -+} -+ -+static inline void au_hbl_del(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_del(node); -+ hlist_bl_unlock(hbl); -+} -+ -+#define au_hbl_for_each(pos, head) \ -+ for (pos = hlist_bl_first(head); \ -+ pos; \ -+ pos = pos->next) -+ -+static inline unsigned long au_hbl_count(struct hlist_bl_head *hbl) -+{ -+ unsigned long cnt; -+ struct hlist_bl_node *pos; -+ -+ cnt = 0; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) -+ cnt++; -+ hlist_bl_unlock(hbl); -+ return cnt; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_HBL_H__ */ -diff --git a/fs/aufs/hfsnotify.c b/fs/aufs/hfsnotify.c -new file mode 100644 -index 000000000000..db3a2605521b ---- /dev/null -+++ b/fs/aufs/hfsnotify.c -@@ -0,0 +1,275 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * fsnotify for the lower directories -+ */ -+ -+#include "aufs.h" -+ -+/* FS_IN_IGNORED is unnecessary */ -+static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE -+ | FS_CREATE | FS_EVENT_ON_CHILD); -+static DECLARE_WAIT_QUEUE_HEAD(au_hfsn_wq); -+static __cacheline_aligned_in_smp atomic64_t au_hfsn_ifree = ATOMIC64_INIT(0); -+ -+static void au_hfsn_free_mark(struct fsnotify_mark *mark) -+{ -+ struct au_hnotify *hn = container_of(mark, struct au_hnotify, -+ hn_mark); -+ /* AuDbg("here\n"); */ -+ au_cache_free_hnotify(hn); -+ smp_mb__before_atomic(); /* for atomic64_dec */ -+ if (atomic64_dec_and_test(&au_hfsn_ifree)) -+ wake_up(&au_hfsn_wq); -+} -+ -+static int au_hfsn_alloc(struct au_hinode *hinode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct fsnotify_mark *mark; -+ aufs_bindex_t bindex; -+ -+ hn = hinode->hi_notify; -+ sb = hn->hn_aufs_inode->i_sb; -+ bindex = au_br_index(sb, hinode->hi_id); -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br->br_hfsn); -+ -+ mark = &hn->hn_mark; -+ fsnotify_init_mark(mark, br->br_hfsn->hfsn_group); -+ mark->mask = AuHfsnMask; -+ /* -+ * by udba rename or rmdir, aufs assign a new inode to the known -+ * h_inode, so specify 1 to allow dups. -+ */ -+ lockdep_off(); -+ err = fsnotify_add_inode_mark(mark, hinode->hi_inode, /*allow_dups*/1); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static int au_hfsn_free(struct au_hinode *hinode, struct au_hnotify *hn) -+{ -+ struct fsnotify_mark *mark; -+ unsigned long long ull; -+ struct fsnotify_group *group; -+ -+ ull = atomic64_inc_return(&au_hfsn_ifree); -+ BUG_ON(!ull); -+ -+ mark = &hn->hn_mark; -+ spin_lock(&mark->lock); -+ group = mark->group; -+ fsnotify_get_group(group); -+ spin_unlock(&mark->lock); -+ lockdep_off(); -+ fsnotify_destroy_mark(mark, group); -+ fsnotify_put_mark(mark); -+ fsnotify_put_group(group); -+ lockdep_on(); -+ -+ /* free hn by myself */ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ struct fsnotify_mark *mark; -+ -+ mark = &hinode->hi_notify->hn_mark; -+ spin_lock(&mark->lock); -+ if (do_set) { -+ AuDebugOn(mark->mask & AuHfsnMask); -+ mark->mask |= AuHfsnMask; -+ } else { -+ AuDebugOn(!(mark->mask & AuHfsnMask)); -+ mark->mask &= ~AuHfsnMask; -+ } -+ spin_unlock(&mark->lock); -+ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* #define AuDbgHnotify */ -+#ifdef AuDbgHnotify -+static char *au_hfsn_name(u32 mask) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+#define test_ret(flag) \ -+ do { \ -+ if (mask & flag) \ -+ return #flag; \ -+ } while (0) -+ test_ret(FS_ACCESS); -+ test_ret(FS_MODIFY); -+ test_ret(FS_ATTRIB); -+ test_ret(FS_CLOSE_WRITE); -+ test_ret(FS_CLOSE_NOWRITE); -+ test_ret(FS_OPEN); -+ test_ret(FS_MOVED_FROM); -+ test_ret(FS_MOVED_TO); -+ test_ret(FS_CREATE); -+ test_ret(FS_DELETE); -+ test_ret(FS_DELETE_SELF); -+ test_ret(FS_MOVE_SELF); -+ test_ret(FS_UNMOUNT); -+ test_ret(FS_Q_OVERFLOW); -+ test_ret(FS_IN_IGNORED); -+ test_ret(FS_ISDIR); -+ test_ret(FS_IN_ONESHOT); -+ test_ret(FS_EVENT_ON_CHILD); -+ return ""; -+#undef test_ret -+#else -+ return "??"; -+#endif -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_free_group(struct fsnotify_group *group) -+{ -+ struct au_br_hfsnotify *hfsn = group->private; -+ -+ /* AuDbg("here\n"); */ -+ au_kfree_try_rcu(hfsn); -+} -+ -+static int au_hfsn_handle_event(struct fsnotify_group *group, -+ u32 mask, const void *data, int data_type, -+ struct inode *dir, -+ const struct qstr *file_name, u32 cookie, -+ struct fsnotify_iter_info *iter_info) -+{ -+ int err; -+ struct au_hnotify *hnotify; -+ struct inode *h_dir, *h_inode; -+ struct fsnotify_mark *inode_mark; -+ -+ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); -+ -+ err = 0; -+ /* if FS_UNMOUNT happens, there must be another bug */ -+ AuDebugOn(mask & FS_UNMOUNT); -+ if (mask & (FS_IN_IGNORED | FS_UNMOUNT)) -+ goto out; -+ -+ h_dir = dir; -+ h_inode = NULL; -+#ifdef AuDbgHnotify -+ au_debug_on(); -+ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 -+ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { -+ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", -+ h_dir->i_ino, mask, au_hfsn_name(mask), -+ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); -+ /* WARN_ON(1); */ -+ } -+ au_debug_off(); -+#endif -+ -+ inode_mark = fsnotify_iter_inode_mark(iter_info); -+ AuDebugOn(!inode_mark); -+ hnotify = container_of(inode_mark, struct au_hnotify, hn_mark); -+ err = au_hnotify(h_dir, hnotify, mask, file_name, h_inode); -+ -+out: -+ return err; -+} -+ -+static struct fsnotify_ops au_hfsn_ops = { -+ .handle_event = au_hfsn_handle_event, -+ .free_group_priv = au_hfsn_free_group, -+ .free_mark = au_hfsn_free_mark -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin_br(struct au_branch *br) -+{ -+ struct au_br_hfsnotify *hfsn; -+ -+ hfsn = br->br_hfsn; -+ if (hfsn) { -+ lockdep_off(); -+ fsnotify_put_group(hfsn->hfsn_group); -+ lockdep_on(); -+ } -+} -+ -+static int au_hfsn_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ struct fsnotify_group *group; -+ struct au_br_hfsnotify *hfsn; -+ -+ err = 0; -+ br->br_hfsn = NULL; -+ if (!au_br_hnotifyable(perm)) -+ goto out; -+ -+ err = -ENOMEM; -+ hfsn = kmalloc(sizeof(*hfsn), GFP_NOFS); -+ if (unlikely(!hfsn)) -+ goto out; -+ -+ err = 0; -+ group = fsnotify_alloc_group(&au_hfsn_ops); -+ if (IS_ERR(group)) { -+ err = PTR_ERR(group); -+ pr_err("fsnotify_alloc_group() failed, %d\n", err); -+ goto out_hfsn; -+ } -+ -+ group->private = hfsn; -+ hfsn->hfsn_group = group; -+ br->br_hfsn = hfsn; -+ goto out; /* success */ -+ -+out_hfsn: -+ au_kfree_try_rcu(hfsn); -+out: -+ return err; -+} -+ -+static int au_hfsn_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (!br->br_hfsn) -+ err = au_hfsn_init_br(br, perm); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin(void) -+{ -+ AuDbg("au_hfsn_ifree %lld\n", (long long)atomic64_read(&au_hfsn_ifree)); -+ wait_event(au_hfsn_wq, !atomic64_read(&au_hfsn_ifree)); -+} -+ -+const struct au_hnotify_op au_hnotify_op = { -+ .ctl = au_hfsn_ctl, -+ .alloc = au_hfsn_alloc, -+ .free = au_hfsn_free, -+ -+ .fin = au_hfsn_fin, -+ -+ .reset_br = au_hfsn_reset_br, -+ .fin_br = au_hfsn_fin_br, -+ .init_br = au_hfsn_init_br -+}; -diff --git a/fs/aufs/hfsplus.c b/fs/aufs/hfsplus.c -new file mode 100644 -index 000000000000..3d4fed48bf16 ---- /dev/null -+++ b/fs/aufs/hfsplus.c -@@ -0,0 +1,47 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * special support for filesystems which acquires an inode mutex -+ * at final closing a file, eg, hfsplus. -+ * -+ * This trick is very simple and stupid, just to open the file before really -+ * necessary open to tell hfsplus that this is not the final closing. -+ * The caller should call au_h_open_pre() after acquiring the inode mutex, -+ * and au_h_open_post() after releasing it. -+ */ -+ -+#include "aufs.h" -+ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ AuDebugOn(!h_dentry); -+ AuDebugOn(d_is_negative(h_dentry)); -+ -+ h_file = NULL; -+ if (au_test_hfsplus(h_dentry->d_sb) -+ && d_is_reg(h_dentry)) -+ h_file = au_h_open(dentry, bindex, -+ O_RDONLY | O_NOATIME | O_LARGEFILE, -+ /*file*/NULL, force_wr); -+ return h_file; -+} -+ -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file) -+{ -+ struct au_branch *br; -+ -+ if (h_file) { -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+} -diff --git a/fs/aufs/hnotify.c b/fs/aufs/hnotify.c -new file mode 100644 -index 000000000000..ea1060fb7de0 ---- /dev/null -+++ b/fs/aufs/hnotify.c -@@ -0,0 +1,702 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * abstraction to notify the direct changes on lower directories -+ */ -+ -+/* #include */ -+#include "aufs.h" -+ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ -+ err = -ENOMEM; -+ hn = au_cache_alloc_hnotify(); -+ if (hn) { -+ hn->hn_aufs_inode = inode; -+ hinode->hi_notify = hn; -+ err = au_hnotify_op.alloc(hinode); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ hinode->hi_notify = NULL; -+ au_cache_free_hnotify(hn); -+ /* -+ * The upper dir was removed by udba, but the same named -+ * dir left. In this case, aufs assigns a new inode -+ * number and set the monitor again. -+ * For the lower dir, the old monitor is still left. -+ */ -+ if (err == -EEXIST) -+ err = 0; -+ } -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hn_free(struct au_hinode *hinode) -+{ -+ struct au_hnotify *hn; -+ -+ hn = hinode->hi_notify; -+ if (hn) { -+ hinode->hi_notify = NULL; -+ if (au_hnotify_op.free(hinode, hn)) -+ au_cache_free_hnotify(hn); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_hn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ if (hinode->hi_notify) -+ au_hnotify_op.ctl(hinode, do_set); -+} -+ -+void au_hn_reset(struct inode *inode, unsigned int flags) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct inode *hi; -+ struct dentry *iwhdentry; -+ -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ hi = au_h_iptr(inode, bindex); -+ if (!hi) -+ continue; -+ -+ /* inode_lock_nested(hi, AuLsc_I_CHILD); */ -+ iwhdentry = au_hi_wh(inode, bindex); -+ if (iwhdentry) -+ dget(iwhdentry); -+ au_igrab(hi); -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ au_set_h_iptr(inode, bindex, au_igrab(hi), -+ flags & ~AuHi_XINO); -+ iput(hi); -+ dput(iwhdentry); -+ /* inode_unlock(hi); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int hn_xino(struct inode *inode, struct inode *h_inode) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot, bfound, btop; -+ struct inode *h_i; -+ -+ err = 0; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ goto out; -+ } -+ -+ bfound = -1; -+ bbot = au_ibbot(inode); -+ btop = au_ibtop(inode); -+#if 0 /* reserved for future use */ -+ if (bindex == bbot) { -+ /* keep this ino in rename case */ -+ goto out; -+ } -+#endif -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex) == h_inode) { -+ bfound = bindex; -+ break; -+ } -+ if (bfound < 0) -+ goto out; -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(inode, bindex); -+ if (!h_i) -+ continue; -+ -+ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ /* bad action? */ -+ } -+ -+ /* children inode number will be broken */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_tree(struct dentry *dentry) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ if (IS_ROOT(d)) -+ continue; -+ -+ au_digen_dec(d); -+ if (d_really_is_positive(d)) -+ /* todo: reset children xino? -+ cached children only? */ -+ au_iigen_dec(d_inode(d)); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+/* -+ * return 0 if processed. -+ */ -+static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, -+ const unsigned int isdir) -+{ -+ int err; -+ struct dentry *d; -+ struct qstr *dname; -+ -+ err = 1; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ err = 0; -+ goto out; -+ } -+ -+ if (!isdir) { -+ AuDebugOn(!name); -+ au_iigen_dec(inode); -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len != nlen -+ && memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ continue; -+ } -+ err = 0; -+ au_digen_dec(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&inode->i_lock); -+ } else { -+ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIR); -+ d = d_find_any_alias(inode); -+ if (!d) { -+ au_iigen_dec(inode); -+ goto out; -+ } -+ -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ err = hn_gen_tree(d); -+ spin_lock(&d->d_lock); -+ } -+ spin_unlock(&d->d_lock); -+ dput(d); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) -+{ -+ int err; -+ -+ if (IS_ROOT(dentry)) { -+ pr_warn("branch root dir was changed\n"); -+ return 0; -+ } -+ -+ err = 0; -+ if (!isdir) { -+ au_digen_dec(dentry); -+ if (d_really_is_positive(dentry)) -+ au_iigen_dec(d_inode(dentry)); -+ } else { -+ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR); -+ if (d_really_is_positive(dentry)) -+ err = hn_gen_tree(dentry); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* hnotify job flags */ -+#define AuHnJob_XINO0 1 -+#define AuHnJob_GEN (1 << 1) -+#define AuHnJob_DIRENT (1 << 2) -+#define AuHnJob_ISDIR (1 << 3) -+#define AuHnJob_TRYXINO0 (1 << 4) -+#define AuHnJob_MNTPNT (1 << 5) -+#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) -+#define au_fset_hnjob(flags, name) \ -+ do { (flags) |= AuHnJob_##name; } while (0) -+#define au_fclr_hnjob(flags, name) \ -+ do { (flags) &= ~AuHnJob_##name; } while (0) -+ -+enum { -+ AuHn_CHILD, -+ AuHn_PARENT, -+ AuHnLast -+}; -+ -+struct au_hnotify_args { -+ struct inode *h_dir, *dir, *h_child_inode; -+ u32 mask; -+ unsigned int flags[AuHnLast]; -+ unsigned int h_child_nlen; -+ char h_child_name[]; -+}; -+ -+struct hn_job_args { -+ unsigned int flags; -+ struct inode *inode, *h_inode, *dir, *h_dir; -+ struct dentry *dentry; -+ char *h_name; -+ int h_nlen; -+}; -+ -+static int hn_job(struct hn_job_args *a) -+{ -+ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); -+ int e; -+ -+ /* reset xino */ -+ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ -+ if (au_ftest_hnjob(a->flags, TRYXINO0) -+ && a->inode -+ && a->h_inode) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink -+ && !(a->h_inode->i_state & I_LINKABLE)) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ /* make the generation obsolete */ -+ if (au_ftest_hnjob(a->flags, GEN)) { -+ e = -1; -+ if (a->inode) -+ e = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, -+ isdir); -+ if (e && a->dentry) -+ hn_gen_by_name(a->dentry, isdir); -+ /* ignore this error */ -+ } -+ -+ /* make dir entries obsolete */ -+ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { -+ struct au_vdir *vdir; -+ -+ vdir = au_ivdir(a->inode); -+ if (vdir) -+ vdir->vd_jiffy = 0; -+ /* IMustLock(a->inode); */ -+ /* inode_inc_iversion(a->inode); */ -+ } -+ -+ /* can do nothing but warn */ -+ if (au_ftest_hnjob(a->flags, MNTPNT) -+ && a->dentry -+ && d_mountpoint(a->dentry)) -+ pr_warn("mount-point %pd is removed or renamed\n", a->dentry); -+ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, -+ struct inode *dir) -+{ -+ struct dentry *dentry, *d, *parent; -+ struct qstr *dname; -+ -+ parent = d_find_any_alias(dir); -+ if (!parent) -+ return NULL; -+ -+ dentry = NULL; -+ spin_lock(&parent->d_lock); -+ list_for_each_entry(d, &parent->d_subdirs, d_child) { -+ /* AuDbg("%pd\n", d); */ -+ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); -+ dname = &d->d_name; -+ if (dname->len != nlen || memcmp(dname->name, name, nlen)) -+ goto cont_unlock; -+ if (au_di(d)) -+ au_digen_dec(d); -+ else -+ goto cont_unlock; -+ if (au_dcount(d) > 0) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ -+cont_unlock: -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&parent->d_lock); -+ dput(parent); -+ -+ if (dentry) -+ di_write_lock_child(dentry); -+ -+ return dentry; -+} -+ -+static struct inode *lookup_wlock_by_ino(struct super_block *sb, -+ aufs_bindex_t bindex, ino_t h_ino) -+{ -+ struct inode *inode; -+ ino_t ino; -+ int err; -+ -+ inode = NULL; -+ err = au_xino_read(sb, bindex, h_ino, &ino); -+ if (!err && ino) -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("wrong root branch\n"); -+ iput(inode); -+ inode = NULL; -+ goto out; -+ } -+ -+ ii_write_lock_child(inode); -+ -+out: -+ return inode; -+} -+ -+static void au_hn_bh(void *_args) -+{ -+ struct au_hnotify_args *a = _args; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot, bfound; -+ unsigned char xino, try_iput; -+ int err; -+ struct inode *inode; -+ ino_t h_ino; -+ struct hn_job_args args; -+ struct dentry *dentry; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(!_args); -+ AuDebugOn(!a->h_dir); -+ AuDebugOn(!a->dir); -+ AuDebugOn(!a->mask); -+ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", -+ a->mask, a->dir->i_ino, a->h_dir->i_ino, -+ a->h_child_inode ? a->h_child_inode->i_ino : 0); -+ -+ inode = NULL; -+ dentry = NULL; -+ /* -+ * do not lock a->dir->i_mutex here -+ * because of d_revalidate() may cause a deadlock. -+ */ -+ sb = a->dir->i_sb; -+ AuDebugOn(!sb); -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!sbinfo); -+ si_write_lock(sb, AuLock_NOPLMW); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ switch (a->mask & FS_EVENTS_POSS_ON_CHILD) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ AuWarn1("DIRREN with UDBA may not work correctly " -+ "for the direct rename(2)\n"); -+ } -+ -+ ii_read_lock_parent(a->dir); -+ bfound = -1; -+ bbot = au_ibbot(a->dir); -+ for (bindex = au_ibtop(a->dir); bindex <= bbot; bindex++) -+ if (au_h_iptr(a->dir, bindex) == a->h_dir) { -+ bfound = bindex; -+ break; -+ } -+ ii_read_unlock(a->dir); -+ if (unlikely(bfound < 0)) -+ goto out; -+ -+ xino = !!au_opt_test(au_mntflags(sb), XINO); -+ h_ino = 0; -+ if (a->h_child_inode) -+ h_ino = a->h_child_inode->i_ino; -+ -+ if (a->h_child_nlen -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) -+ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, -+ a->dir); -+ try_iput = 0; -+ if (dentry && d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (xino && !inode && h_ino -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { -+ inode = lookup_wlock_by_ino(sb, bfound, h_ino); -+ try_iput = 1; -+ } -+ -+ args.flags = a->flags[AuHn_CHILD]; -+ args.dentry = dentry; -+ args.inode = inode; -+ args.h_inode = a->h_child_inode; -+ args.dir = a->dir; -+ args.h_dir = a->h_dir; -+ args.h_name = a->h_child_name; -+ args.h_nlen = a->h_child_nlen; -+ err = hn_job(&args); -+ if (dentry) { -+ if (au_di(dentry)) -+ di_write_unlock(dentry); -+ dput(dentry); -+ } -+ if (inode && try_iput) { -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ -+ ii_write_lock_parent(a->dir); -+ args.flags = a->flags[AuHn_PARENT]; -+ args.dentry = NULL; -+ args.inode = a->dir; -+ args.h_inode = a->h_dir; -+ args.dir = NULL; -+ args.h_dir = NULL; -+ args.h_name = NULL; -+ args.h_nlen = 0; -+ err = hn_job(&args); -+ ii_write_unlock(a->dir); -+ -+out: -+ iput(a->h_child_inode); -+ iput(a->h_dir); -+ iput(a->dir); -+ si_write_unlock(sb); -+ au_nwt_done(&sbinfo->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode) -+{ -+ int err, len; -+ unsigned int flags[AuHnLast], f; -+ unsigned char isdir, isroot, wh; -+ struct inode *dir; -+ struct au_hnotify_args *args; -+ char *p, *h_child_name; -+ -+ err = 0; -+ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); -+ dir = igrab(hnotify->hn_aufs_inode); -+ if (!dir) -+ goto out; -+ -+ isroot = (dir->i_ino == AUFS_ROOT_INO); -+ wh = 0; -+ h_child_name = (void *)h_child_qstr->name; -+ len = h_child_qstr->len; -+ if (h_child_name) { -+ if (len > AUFS_WH_PFX_LEN -+ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ h_child_name += AUFS_WH_PFX_LEN; -+ len -= AUFS_WH_PFX_LEN; -+ wh = 1; -+ } -+ } -+ -+ isdir = 0; -+ if (h_child_inode) -+ isdir = !!S_ISDIR(h_child_inode->i_mode); -+ flags[AuHn_PARENT] = AuHnJob_ISDIR; -+ flags[AuHn_CHILD] = 0; -+ if (isdir) -+ flags[AuHn_CHILD] = AuHnJob_ISDIR; -+ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); -+ au_fset_hnjob(flags[AuHn_CHILD], GEN); -+ switch (mask & ALL_FSNOTIFY_DIRENT_EVENTS) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ au_fset_hnjob(flags[AuHn_CHILD], XINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ fallthrough; -+ case FS_CREATE: -+ AuDebugOn(!h_child_name); -+ break; -+ -+ case FS_DELETE: -+ /* -+ * aufs never be able to get this child inode. -+ * revalidation should be in d_revalidate() -+ * by checking i_nlink, i_generation or d_unhashed(). -+ */ -+ AuDebugOn(!h_child_name); -+ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ break; -+ -+ default: -+ AuDebugOn(1); -+ } -+ -+ if (wh) -+ h_child_inode = NULL; -+ -+ err = -ENOMEM; -+ /* iput() and kfree() will be called in au_hnotify() */ -+ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ iput(dir); -+ goto out; -+ } -+ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; -+ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; -+ args->mask = mask; -+ args->dir = dir; -+ args->h_dir = igrab(h_dir); -+ if (h_child_inode) -+ h_child_inode = igrab(h_child_inode); /* can be NULL */ -+ args->h_child_inode = h_child_inode; -+ args->h_child_nlen = len; -+ if (len) { -+ p = (void *)args; -+ p += sizeof(*args); -+ memcpy(p, h_child_name, len); -+ p[len] = 0; -+ } -+ -+ /* NFS fires the event for silly-renamed one from kworker */ -+ f = 0; -+ if (!dir->i_nlink -+ || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) -+ f = AuWkq_NEST; -+ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ iput(args->h_child_inode); -+ iput(args->h_dir); -+ iput(args->dir); -+ au_kfree_rcu(args); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ AuDebugOn(!(udba & AuOptMask_UDBA)); -+ -+ err = 0; -+ if (au_hnotify_op.reset_br) -+ err = au_hnotify_op.reset_br(udba, br, perm); -+ -+ return err; -+} -+ -+int au_hnotify_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (au_hnotify_op.init_br) -+ err = au_hnotify_op.init_br(br, perm); -+ -+ return err; -+} -+ -+void au_hnotify_fin_br(struct au_branch *br) -+{ -+ if (au_hnotify_op.fin_br) -+ au_hnotify_op.fin_br(br); -+} -+ -+static void au_hn_destroy_cache(void) -+{ -+ kmem_cache_destroy(au_cache[AuCache_HNOTIFY]); -+ au_cache[AuCache_HNOTIFY] = NULL; -+} -+ -+int __init au_hnotify_init(void) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ au_cache[AuCache_HNOTIFY] = AuCache(au_hnotify); -+ if (au_cache[AuCache_HNOTIFY]) { -+ err = 0; -+ if (au_hnotify_op.init) -+ err = au_hnotify_op.init(); -+ if (unlikely(err)) -+ au_hn_destroy_cache(); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hnotify_fin(void) -+{ -+ if (au_hnotify_op.fin) -+ au_hnotify_op.fin(); -+ -+ /* cf. au_cache_fin() */ -+ if (au_cache[AuCache_HNOTIFY]) -+ au_hn_destroy_cache(); -+} -diff --git a/fs/aufs/i_op.c b/fs/aufs/i_op.c -new file mode 100644 -index 000000000000..42bc497e2630 ---- /dev/null -+++ b/fs/aufs/i_op.c -@@ -0,0 +1,1489 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (except add/del/rename) -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int h_permission(struct inode *h_inode, int mask, -+ struct path *h_path, int brperm) -+{ -+ int err; -+ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ -+ err = -EPERM; -+ if (write_mask && IS_IMMUTABLE(h_inode)) -+ goto out; -+ -+ err = -EACCES; -+ if (((mask & MAY_EXEC) -+ && S_ISREG(h_inode->i_mode) -+ && (path_noexec(h_path) -+ || !(h_inode->i_mode & 0111)))) -+ goto out; -+ -+ /* -+ * - skip the lower fs test in the case of write to ro branch. -+ * - nfs dir permission write check is optimized, but a policy for -+ * link/rename requires a real check. -+ * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' -+ * in this case, generic_permission() returns -EOPNOTSUPP. -+ */ -+ if ((write_mask && !au_br_writable(brperm)) -+ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) -+ && write_mask && !(mask & MAY_READ)) -+ || !h_inode->i_op->permission) { -+ /* AuLabel(generic_permission); */ -+ /* AuDbg("get_acl %ps\n", h_inode->i_op->get_acl); */ -+ err = generic_permission(h_inode, mask); -+ if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) -+ err = h_inode->i_op->permission(h_inode, mask); -+ AuTraceErr(err); -+ } else { -+ /* AuLabel(h_inode->permission); */ -+ err = h_inode->i_op->permission(h_inode, mask); -+ AuTraceErr(err); -+ } -+ -+ if (!err) -+ err = devcgroup_inode_permission(h_inode, mask); -+ if (!err) -+ err = security_inode_permission(h_inode, mask); -+ -+out: -+ return err; -+} -+ -+static int aufs_permission(struct inode *inode, int mask) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char isdir = !!S_ISDIR(inode->i_mode), -+ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ -+ /* todo: support rcu-walk? */ -+ if (mask & MAY_NOT_BLOCK) -+ return -ECHILD; -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_read_lock_child(inode); -+#if 0 /* reserved for future use */ -+ /* -+ * This test may be rather 'too much' since the test is essentially done -+ * in the aufs_lookup(). Theoretically it is possible that the inode -+ * generation doesn't match to the superblock's here. But it isn't a -+ * big deal I suppose. -+ */ -+ err = au_iigen_test(inode, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+#endif -+ -+ if (!isdir -+ || write_mask -+ || au_opt_test(au_mntflags(sb), DIRPERM1)) { -+ err = au_busy_or_stale(); -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (unlikely(!h_inode -+ || (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT))) -+ goto out; -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, br->br_perm); -+ if (write_mask -+ && !err -+ && !special_file(h_inode->i_mode)) { -+ /* test whether the upper writable branch exists */ -+ err = -EROFS; -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = 0; -+ break; -+ } -+ } -+ goto out; -+ } -+ -+ /* non-write to dir */ -+ err = 0; -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); !err && bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) { -+ err = au_busy_or_stale(); -+ if (unlikely(!S_ISDIR(h_inode->i_mode))) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, -+ br->br_perm); -+ } -+ } -+ -+out: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, -+ unsigned int flags) -+{ -+ struct dentry *ret, *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ int err, npositive; -+ -+ IMustLock(dir); -+ -+ /* todo: support rcu-walk? */ -+ ret = ERR_PTR(-ECHILD); -+ if (flags & LOOKUP_RCU) -+ goto out; -+ -+ ret = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_si; -+ -+ inode = NULL; -+ npositive = 0; /* suppress a warning */ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_alive_dir(parent); -+ if (!err) -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (!err) { -+ /* regardless LOOKUP_CREATE, always ALLOW_NEG */ -+ npositive = au_lkup_dentry(dentry, au_dbtop(parent), -+ AuLkup_ALLOW_NEG); -+ err = npositive; -+ } -+ di_read_unlock(parent, AuLock_IR); -+ ret = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out_unlock; -+ -+ if (npositive) { -+ inode = au_new_inode(dentry, /*must_new*/0); -+ if (IS_ERR(inode)) { -+ ret = (void *)inode; -+ inode = NULL; -+ goto out_unlock; -+ } -+ } -+ -+ if (inode) -+ atomic_inc(&inode->i_count); -+ ret = d_splice_alias(inode, dentry); -+#if 0 /* reserved for future use */ -+ if (unlikely(d_need_lookup(dentry))) { -+ spin_lock(&dentry->d_lock); -+ dentry->d_flags &= ~DCACHE_NEED_LOOKUP; -+ spin_unlock(&dentry->d_lock); -+ } else -+#endif -+ if (inode) { -+ if (!IS_ERR(ret)) { -+ iput(inode); -+ if (ret && ret != dentry) -+ ii_write_unlock(inode); -+ } else { -+ ii_write_unlock(inode); -+ iput(inode); -+ inode = NULL; -+ } -+ } -+ -+out_unlock: -+ di_write_unlock(dentry); -+out_si: -+ si_read_unlock(sb); -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * very dirty and complicated aufs ->atomic_open(). -+ * aufs_atomic_open() -+ * + au_aopen_or_create() -+ * + add_simple() -+ * + vfsub_atomic_open() -+ * + branch fs ->atomic_open() -+ * may call the actual 'open' for h_file -+ * + inc br_nfiles only if opened -+ * + au_aopen_no_open() or au_aopen_do_open() -+ * -+ * au_aopen_do_open() -+ * + finish_open() -+ * + au_do_aopen() -+ * + au_do_open() the body of all 'open' -+ * + au_do_open_nondir() -+ * set the passed h_file -+ * -+ * au_aopen_no_open() -+ * + finish_no_open() -+ */ -+ -+struct aopen_node { -+ struct hlist_bl_node hblist; -+ struct file *file, *h_file; -+}; -+ -+static int au_do_aopen(struct inode *inode, struct file *file) -+{ -+ struct hlist_bl_head *aopen; -+ struct hlist_bl_node *pos; -+ struct aopen_node *node; -+ struct au_do_open_args args = { -+ .aopen = 1, -+ .open = au_do_open_nondir -+ }; -+ -+ aopen = &au_sbi(inode->i_sb)->si_aopen; -+ hlist_bl_lock(aopen); -+ hlist_bl_for_each_entry(node, pos, aopen, hblist) -+ if (node->file == file) { -+ args.h_file = node->h_file; -+ break; -+ } -+ hlist_bl_unlock(aopen); -+ /* AuDebugOn(!args.h_file); */ -+ -+ return au_do_open(file, &args); -+} -+ -+static int au_aopen_do_open(struct file *file, struct dentry *dentry, -+ struct aopen_node *aopen_node) -+{ -+ int err; -+ struct hlist_bl_head *aopen; -+ -+ AuLabel(here); -+ aopen = &au_sbi(dentry->d_sb)->si_aopen; -+ au_hbl_add(&aopen_node->hblist, aopen); -+ err = finish_open(file, dentry, au_do_aopen); -+ au_hbl_del(&aopen_node->hblist, aopen); -+ /* AuDbgFile(file); */ -+ AuDbg("%pd%s%s\n", dentry, -+ (file->f_mode & FMODE_CREATED) ? " created" : "", -+ (file->f_mode & FMODE_OPENED) ? " opened" : ""); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_aopen_no_open(struct file *file, struct dentry *dentry) -+{ -+ int err; -+ -+ AuLabel(here); -+ dget(dentry); -+ err = finish_no_open(file, dentry); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int aufs_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct file *file, unsigned int open_flag, -+ umode_t create_mode) -+{ -+ int err, did_open; -+ unsigned int lkup_flags; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *d; -+ struct vfsub_aopen_args args = { -+ .open_flag = open_flag, -+ .create_mode = create_mode -+ }; -+ struct aopen_node aopen_node = { -+ .file = file -+ }; -+ -+ IMustLock(dir); -+ AuDbg("open_flag 0%o\n", open_flag); -+ AuDbgDentry(dentry); -+ -+ err = 0; -+ if (!au_di(dentry)) { -+ lkup_flags = LOOKUP_OPEN; -+ if (open_flag & O_CREAT) -+ lkup_flags |= LOOKUP_CREATE; -+ d = aufs_lookup(dir, dentry, lkup_flags); -+ if (IS_ERR(d)) { -+ err = PTR_ERR(d); -+ AuTraceErr(err); -+ goto out; -+ } else if (d) { -+ /* -+ * obsoleted dentry found. -+ * another error will be returned later. -+ */ -+ d_drop(d); -+ AuDbgDentry(d); -+ dput(d); -+ } -+ AuDbgDentry(dentry); -+ } -+ -+ if (d_is_positive(dentry) -+ || d_unhashed(dentry) -+ || d_unlinked(dentry) -+ || !(open_flag & O_CREAT)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out; /* success */ -+ } -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = dentry->d_parent; /* dir is locked */ -+ di_write_lock_parent(parent); -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ AuDbgDentry(dentry); -+ if (d_is_positive(dentry)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out_parent; /* success */ -+ } -+ -+ args.file = alloc_empty_file(file->f_flags, current_cred()); -+ err = PTR_ERR(args.file); -+ if (IS_ERR(args.file)) -+ goto out_parent; -+ -+ bindex = au_dbtop(dentry); -+ err = au_aopen_or_create(dir, dentry, &args); -+ AuTraceErr(err); -+ AuDbgFile(args.file); -+ file->f_mode = args.file->f_mode & ~FMODE_OPENED; -+ did_open = !!(args.file->f_mode & FMODE_OPENED); -+ if (!did_open) { -+ fput(args.file); -+ args.file = NULL; -+ } -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ goto out_sb; -+ } -+ -+ if (!did_open) -+ err = au_aopen_no_open(file, dentry); -+ else { -+ aopen_node.h_file = args.file; -+ err = au_aopen_do_open(file, dentry, &aopen_node); -+ } -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ if (did_open) -+ au_lcnt_dec(&args.br->br_nfiles); -+ } -+ goto out_sb; /* success */ -+ -+out_parent: -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+out_sb: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ AuDbgFile(file); -+ return err; -+} -+ -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, -+ const unsigned char add_entry, aufs_bindex_t bcpup, -+ aufs_bindex_t btop) -+{ -+ int err; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ -+ if (add_entry) -+ IMustLock(d_inode(parent)); -+ else -+ di_write_lock_parent(parent); -+ -+ err = 0; -+ if (!au_h_dptr(parent, bcpup)) { -+ if (btop > bcpup) -+ err = au_cpup_dirs(dentry, bcpup); -+ else if (btop < bcpup) -+ err = au_cpdown_dirs(dentry, bcpup); -+ else -+ BUG(); -+ } -+ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) { -+ h_parent = au_h_dptr(parent, bcpup); -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ err = au_lkup_neg(dentry, bcpup, /*wh*/0); -+ /* todo: no unlock here */ -+ inode_unlock_shared(h_dir); -+ -+ AuDbg("bcpup %d\n", bcpup); -+ if (!err) { -+ if (d_really_is_negative(dentry)) -+ au_set_h_dptr(dentry, btop, NULL); -+ au_update_dbrange(dentry, /*do_put_zero*/0); -+ } -+ } -+ -+ if (!add_entry) -+ di_write_unlock(parent); -+ if (!err) -+ err = bcpup; /* success */ -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * decide the branch and the parent dir where we will create a new entry. -+ * returns new bindex or an error. -+ * copyup the parent dir if needed. -+ */ -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bcpup, btop, src_btop; -+ const unsigned char add_entry -+ = au_ftest_wrdir(args->flags, ADD_ENTRY) -+ | au_ftest_wrdir(args->flags, TMPFILE); -+ struct super_block *sb; -+ struct dentry *parent; -+ struct au_sbinfo *sbinfo; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ parent = dget_parent(dentry); -+ btop = au_dbtop(dentry); -+ bcpup = btop; -+ if (args->force_btgt < 0) { -+ if (src_dentry) { -+ src_btop = au_dbtop(src_dentry); -+ if (src_btop < btop) -+ bcpup = src_btop; -+ } else if (add_entry) { -+ flags = 0; -+ if (au_ftest_wrdir(args->flags, ISDIR)) -+ au_fset_wbr(flags, DIR); -+ err = AuWbrCreate(sbinfo, dentry, flags); -+ bcpup = err; -+ } -+ -+ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) { -+ if (add_entry) -+ err = AuWbrCopyup(sbinfo, dentry); -+ else { -+ if (!IS_ROOT(dentry)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(sbinfo, dentry); -+ di_read_unlock(parent, !AuLock_IR); -+ } else -+ err = AuWbrCopyup(sbinfo, dentry); -+ } -+ bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else { -+ bcpup = args->force_btgt; -+ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry))); -+ } -+ -+ AuDbg("btop %d, bcpup %d\n", btop, bcpup); -+ err = bcpup; -+ if (bcpup == btop) -+ goto out; /* success */ -+ -+ /* copyup the new parent into the branch we process */ -+ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, btop); -+ if (err >= 0) { -+ if (d_really_is_negative(dentry)) { -+ au_set_h_dptr(dentry, btop, NULL); -+ au_set_dbtop(dentry, bcpup); -+ au_set_dbbot(dentry, bcpup); -+ } -+ AuDebugOn(add_entry -+ && !au_ftest_wrdir(args->flags, TMPFILE) -+ && !au_h_dptr(dentry, bcpup)); -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_pin_hdir_unlock(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_hn_inode_unlock(p->hdir); -+} -+ -+int au_pin_hdir_lock(struct au_pin *p) -+{ -+ int err; -+ -+ err = 0; -+ if (!p->hdir) -+ goto out; -+ -+ /* even if an error happens later, keep this lock */ -+ au_hn_inode_lock_nested(p->hdir, p->lsc_hi); -+ -+ err = -EBUSY; -+ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent))) -+ goto out; -+ -+ err = 0; -+ if (p->h_dentry) -+ err = au_h_verify(p->h_dentry, p->udba, p->hdir->hi_inode, -+ p->h_parent, p->br); -+ -+out: -+ return err; -+} -+ -+int au_pin_hdir_relock(struct au_pin *p) -+{ -+ int err, i; -+ struct inode *h_i; -+ struct dentry *h_d[] = { -+ p->h_dentry, -+ p->h_parent -+ }; -+ -+ err = au_pin_hdir_lock(p); -+ if (unlikely(err)) -+ goto out; -+ -+ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) { -+ if (!h_d[i]) -+ continue; -+ if (d_is_positive(h_d[i])) { -+ h_i = d_inode(h_d[i]); -+ err = !h_i->i_nlink; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) -+{ -+ atomic_long_set(&p->hdir->hi_inode->i_rwsem.owner, (long)task); -+} -+ -+void au_pin_hdir_acquire_nest(struct au_pin *p) -+{ -+ if (p->hdir) { -+ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map, -+ p->lsc_hi, 0, NULL, _RET_IP_); -+ au_pin_hdir_set_owner(p, current); -+ } -+} -+ -+void au_pin_hdir_release(struct au_pin *p) -+{ -+ if (p->hdir) { -+ au_pin_hdir_set_owner(p, p->task); -+ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, _RET_IP_); -+ } -+} -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin) -+{ -+ if (pin && pin->parent) -+ return au_h_dptr(pin->parent, pin->bindex); -+ return NULL; -+} -+ -+void au_unpin(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_pin_hdir_unlock(p); -+ if (p->h_mnt && au_ftest_pin(p->flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(p->h_mnt); -+ if (!p->hdir) -+ return; -+ -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ iput(p->hdir->hi_inode); -+ dput(p->parent); -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ /* do not clear p->task */ -+} -+ -+int au_do_pin(struct au_pin *p) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ err = 0; -+ sb = p->dentry->d_sb; -+ p->br = au_sbr(sb, p->bindex); -+ if (IS_ROOT(p->dentry)) { -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_err; -+ } -+ } -+ goto out; -+ } -+ -+ p->h_dentry = NULL; -+ if (p->bindex <= au_dbbot(p->dentry)) -+ p->h_dentry = au_h_dptr(p->dentry, p->bindex); -+ -+ p->parent = dget_parent(p->dentry); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_lock(p->parent, AuLock_IR, p->lsc_di); -+ -+ h_dir = NULL; -+ p->h_parent = au_h_dptr(p->parent, p->bindex); -+ p->hdir = au_hi(d_inode(p->parent), p->bindex); -+ if (p->hdir) -+ h_dir = p->hdir->hi_inode; -+ -+ /* -+ * udba case, or -+ * if DI_LOCKED is not set, then p->parent may be different -+ * and h_parent can be NULL. -+ */ -+ if (unlikely(!p->hdir || !h_dir || !p->h_parent)) { -+ err = -EBUSY; -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ } -+ -+ au_igrab(h_dir); -+ err = au_pin_hdir_lock(p); -+ if (!err) -+ goto out; /* success */ -+ -+ au_unpin(p); -+ -+out_err: -+ pr_err("err %d\n", err); -+ err = au_busy_or_stale(); -+out: -+ return err; -+} -+ -+void au_pin_init(struct au_pin *p, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags) -+{ -+ p->dentry = dentry; -+ p->udba = udba; -+ p->lsc_di = lsc_di; -+ p->lsc_hi = lsc_hi; -+ p->flags = flags; -+ p->bindex = bindex; -+ -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ -+ p->h_dentry = NULL; -+ p->h_parent = NULL; -+ p->br = NULL; -+ p->task = current; -+} -+ -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) -+{ -+ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, -+ udba, flags); -+ return au_do_pin(pin); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * ->setattr() and ->getattr() are called in various cases. -+ * chmod, stat: dentry is revalidated. -+ * fchmod, fstat: file and dentry are not revalidated, additionally they may be -+ * unhashed. -+ * for ->setattr(), ia->ia_file is passed from ftruncate only. -+ */ -+/* todo: consolidate with do_refresh() and simple_reval_dpath() */ -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ if (au_digen_test(dentry, sigen)) { -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a) -+{ -+ int err; -+ loff_t sz; -+ aufs_bindex_t btop, ibtop; -+ struct dentry *hi_wh, *parent; -+ struct inode *inode; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = 0 -+ }; -+ -+ if (d_is_dir(dentry)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ /* plink or hi_wh() case */ -+ btop = au_dbtop(dentry); -+ inode = d_inode(dentry); -+ ibtop = au_ibtop(inode); -+ if (btop != ibtop && !au_test_ro(inode->i_sb, ibtop, inode)) -+ wr_dir_args.force_btgt = ibtop; -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ if (unlikely(err < 0)) -+ goto out; -+ a->btgt = err; -+ if (err != btop) -+ au_fset_icpup(a->flags, DID_CPUP); -+ -+ err = 0; -+ a->pin_flags = AuPin_MNT_WRITE; -+ parent = NULL; -+ if (!IS_ROOT(dentry)) { -+ au_fset_pin(a->pin_flags, DI_LOCKED); -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ } -+ -+ err = au_pin(&a->pin, dentry, a->btgt, a->udba, a->pin_flags); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ sz = -1; -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (ia && (ia->ia_valid & ATTR_SIZE)) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (ia->ia_size < i_size_read(a->h_inode)) -+ sz = ia->ia_size; -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ hi_wh = NULL; -+ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unlinked(dentry)) { -+ hi_wh = au_hi_wh(inode, a->btgt); -+ if (!hi_wh) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = -1, -+ .len = sz, -+ .pin = &a->pin -+ }; -+ err = au_sio_cpup_wh(&cpg, /*file*/NULL); -+ if (unlikely(err)) -+ goto out_unlock; -+ hi_wh = au_hi_wh(inode, a->btgt); -+ /* todo: revalidate hi_wh? */ -+ } -+ } -+ -+ if (parent) { -+ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); -+ di_downgrade_lock(parent, AuLock_IR); -+ dput(parent); -+ parent = NULL; -+ } -+ if (!au_ftest_icpup(a->flags, DID_CPUP)) -+ goto out; /* success */ -+ -+ if (!d_unhashed(dentry)) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = btop, -+ .len = sz, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ } else if (!hi_wh) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ else -+ a->h_path.dentry = hi_wh; /* do not dget here */ -+ -+out_unlock: -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (!err) -+ goto out; /* success */ -+ au_unpin(&a->pin); -+out_parent: -+ if (parent) { -+ di_write_unlock(parent); -+ dput(parent); -+ } -+out: -+ if (!err) -+ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ return err; -+} -+ -+static int aufs_setattr(struct dentry *dentry, struct iattr *ia) -+{ -+ int err; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct file *file; -+ struct au_icpup_args *a; -+ -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ err = setattr_prepare(dentry, ia); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) -+ ia->ia_valid &= ~ATTR_MODE; -+ -+ file = NULL; -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ if (ia->ia_valid & ATTR_FILE) { -+ /* currently ftruncate(2) only */ -+ AuDebugOn(!d_is_reg(dentry)); -+ file = ia->ia_file; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, -+ /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out_si; -+ ia->ia_file = au_hf_top(file); -+ a->udba = AuOpt_UDBA_NONE; -+ } else { -+ /* fchmod() doesn't pass ia_file */ -+ a->udba = au_opt_udba(sb); -+ di_write_lock_child(dentry); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_dentry; -+ } -+ } -+ -+ err = au_pin_and_icpup(dentry, ia, a); -+ if (unlikely(err < 0)) -+ goto out_dentry; -+ if (au_ftest_icpup(a->flags, DID_CPUP)) { -+ ia->ia_file = NULL; -+ ia->ia_valid &= ~ATTR_FILE; -+ } -+ -+ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); -+ if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) -+ == (ATTR_MODE | ATTR_CTIME)) { -+ err = security_path_chmod(&a->h_path, ia->ia_mode); -+ if (unlikely(err)) -+ goto out_unlock; -+ } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) -+ && (ia->ia_valid & ATTR_CTIME)) { -+ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ -+ if (ia->ia_valid & ATTR_SIZE) { -+ struct file *f; -+ -+ if (ia->ia_size < i_size_read(inode)) -+ /* unmap only */ -+ truncate_setsize(inode, ia->ia_size); -+ -+ f = NULL; -+ if (ia->ia_valid & ATTR_FILE) -+ f = ia->ia_file; -+ inode_unlock(a->h_inode); -+ err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); -+ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ } else { -+ delegated = NULL; -+ while (1) { -+ err = vfsub_notify_change(&a->h_path, ia, &delegated); -+ if (delegated) { -+ err = break_deleg_wait(&delegated); -+ if (!err) -+ continue; -+ } -+ break; -+ } -+ } -+ /* -+ * regardless aufs 'acl' option setting. -+ * why don't all acl-aware fs call this func from their ->setattr()? -+ */ -+ if (!err && (ia->ia_valid & ATTR_MODE)) -+ err = vfsub_acl_chmod(a->h_inode, ia->ia_mode); -+ if (!err) -+ au_cpup_attr_changeable(inode); -+ -+out_unlock: -+ inode_unlock(a->h_inode); -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+out_dentry: -+ di_write_unlock(dentry); -+ if (file) { -+ fi_write_unlock(file); -+ ia->ia_file = file; -+ ia->ia_valid |= ATTR_FILE; -+ } -+out_si: -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+static int au_h_path_to_set_attr(struct dentry *dentry, -+ struct au_icpup_args *a, struct path *h_path) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ a->udba = au_opt_udba(sb); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_pin_and_icpup(dentry, /*ia*/NULL, a); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ h_path->dentry = a->h_path.dentry; -+ h_path->mnt = au_sbr_mnt(sb, a->btgt); -+ -+out: -+ return err; -+} -+ -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ struct au_icpup_args *a; -+ struct inode *h_inode; -+ -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ h_path.dentry = NULL; /* silence gcc */ -+ di_write_lock_child(dentry); -+ err = au_h_path_to_set_attr(dentry, a, &h_path); -+ if (unlikely(err)) -+ goto out_di; -+ -+ inode_unlock(a->h_inode); -+ switch (arg->type) { -+ case AU_XATTR_SET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfsub_setxattr(h_path.dentry, -+ arg->u.set.name, arg->u.set.value, -+ arg->u.set.size, arg->u.set.flags); -+ break; -+ case AU_ACL_SET: -+ err = -EOPNOTSUPP; -+ h_inode = d_inode(h_path.dentry); -+ if (h_inode->i_op->set_acl) -+ /* this will call posix_acl_update_mode */ -+ err = h_inode->i_op->set_acl(h_inode, -+ arg->u.acl_set.acl, -+ arg->u.acl_set.type); -+ break; -+ } -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+ -+out_di: -+ di_write_unlock(dentry); -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static void au_refresh_iattr(struct inode *inode, struct kstat *st, -+ unsigned int nlink) -+{ -+ unsigned int n; -+ -+ inode->i_mode = st->mode; -+ /* don't i_[ug]id_write() here */ -+ inode->i_uid = st->uid; -+ inode->i_gid = st->gid; -+ inode->i_atime = st->atime; -+ inode->i_mtime = st->mtime; -+ inode->i_ctime = st->ctime; -+ -+ au_cpup_attr_nlink(inode, /*force*/0); -+ if (S_ISDIR(inode->i_mode)) { -+ n = inode->i_nlink; -+ n -= nlink; -+ n += st->nlink; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen */ -+ set_nlink(inode, n); -+ } -+ -+ spin_lock(&inode->i_lock); -+ inode->i_blocks = st->blocks; -+ i_size_write(inode, st->size); -+ spin_unlock(&inode->i_lock); -+} -+ -+/* -+ * common routine for aufs_getattr() and au_getxattr(). -+ * returns zero or negative (an error). -+ * @dentry will be read-locked in success. -+ */ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked) -+{ -+ int err; -+ unsigned int mnt_flags, sigen; -+ unsigned char udba_none; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ -+ h_path->mnt = NULL; -+ h_path->dentry = NULL; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ mnt_flags = au_mntflags(sb); -+ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); -+ -+ if (unlikely(locked)) -+ goto body; /* skip locking dinfo */ -+ -+ /* support fstat(2) */ -+ if (!d_unlinked(dentry) && !udba_none) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(dentry, sigen); -+ if (!err) { -+ di_read_lock_child(dentry, AuLock_IR); -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) { -+ di_read_unlock(dentry, AuLock_IR); -+ goto out; -+ } -+ } else { -+ AuDebugOn(IS_ROOT(dentry)); -+ di_write_lock_child(dentry); -+ err = au_dbrange_test(dentry); -+ if (!err) -+ err = au_reval_for_attr(dentry, sigen); -+ if (!err) -+ di_downgrade_lock(dentry, AuLock_IR); -+ else { -+ di_write_unlock(dentry); -+ goto out; -+ } -+ } -+ } else -+ di_read_lock_child(dentry, AuLock_IR); -+ -+body: -+ if (!inode) { -+ inode = d_inode(dentry); -+ if (unlikely(!inode)) -+ goto out; -+ } -+ bindex = au_ibtop(inode); -+ h_path->mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path->mnt->mnt_sb; -+ if (!force -+ && !au_test_fs_bad_iattr(h_sb) -+ && udba_none) -+ goto out; /* success */ -+ -+ if (au_dbtop(dentry) == bindex) -+ h_path->dentry = au_h_dptr(dentry, bindex); -+ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { -+ h_path->dentry = au_plink_lkup(inode, bindex); -+ if (IS_ERR(h_path->dentry)) -+ /* pretending success */ -+ h_path->dentry = NULL; -+ else -+ dput(h_path->dentry); -+ } -+ -+out: -+ return err; -+} -+ -+static int aufs_getattr(const struct path *path, struct kstat *st, -+ u32 request, unsigned int query) -+{ -+ int err; -+ unsigned char positive; -+ struct path h_path; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ dentry = path->dentry; -+ inode = d_inode(dentry); -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ err = au_h_path_getattr(dentry, /*inode*/NULL, /*force*/0, &h_path, -+ /*locked*/0); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_fill; /* pretending success */ -+ -+ positive = d_is_positive(h_path.dentry); -+ if (positive) -+ /* no vfsub version */ -+ err = vfs_getattr(&h_path, st, request, query); -+ if (!err) { -+ if (positive) -+ au_refresh_iattr(inode, st, -+ d_inode(h_path.dentry)->i_nlink); -+ goto out_fill; /* success */ -+ } -+ AuTraceErr(err); -+ goto out_di; -+ -+out_fill: -+ generic_fillattr(inode, st); -+out_di: -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *aufs_get_link(struct dentry *dentry, struct inode *inode, -+ struct delayed_call *done) -+{ -+ const char *ret; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ int err; -+ aufs_bindex_t bindex; -+ -+ ret = NULL; /* suppress a warning */ -+ err = -ECHILD; -+ if (!dentry) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ err = -EINVAL; -+ inode = d_inode(dentry); -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode->i_op->get_link)) -+ goto out_unlock; -+ -+ err = -EBUSY; -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ dget(h_dentry); -+ } -+ if (!h_dentry) { -+ h_dentry = d_find_any_alias(h_inode); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_unlock; -+ } -+ } -+ if (unlikely(!h_dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ AuDbg("%ps\n", h_inode->i_op->get_link); -+ AuDbgDentry(h_dentry); -+ ret = vfs_get_link(h_dentry, done); -+ dput(h_dentry); -+ if (IS_ERR(ret)) -+ err = PTR_ERR(ret); -+ -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_IR); -+out: -+ if (unlikely(err)) -+ ret = ERR_PTR(err); -+ AuTraceErrPtr(ret); -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_is_special(struct inode *inode) -+{ -+ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); -+} -+ -+static int aufs_update_time(struct inode *inode, struct timespec64 *ts, -+ int flags) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ struct vfsmount *h_mnt; -+ -+ sb = inode->i_sb; -+ WARN_ONCE((flags & S_ATIME) && !IS_NOATIME(inode), -+ "unexpected s_flags 0x%lx", sb->s_flags); -+ -+ /* mmap_sem might be acquired already, cf. aufs_mmap() */ -+ lockdep_off(); -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_write_lock_child(inode); -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!au_test_ro(sb, bindex, inode)) { -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (!err) { -+ err = vfsub_update_time(h_inode, ts, flags); -+ vfsub_mnt_drop_write(h_mnt); -+ } -+ } else if (au_is_special(h_inode)) { -+ /* -+ * Never copy-up here. -+ * These special files may already be opened and used for -+ * communicating. If we copied it up, then the communication -+ * would be corrupted. -+ */ -+ AuWarn1("timestamps for i%lu are ignored " -+ "since it is on readonly branch (hi%lu).\n", -+ inode->i_ino, h_inode->i_ino); -+ } else if (flags & ~S_ATIME) { -+ err = -EIO; -+ AuIOErr1("unexpected flags 0x%x\n", flags); -+ AuDebugOn(1); -+ } -+ -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ lockdep_on(); -+ -+ if (!err && (flags & S_VERSION)) -+ inode_inc_iversion(inode); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no getattr version will be set by module.c:aufs_init() */ -+struct inode_operations aufs_iop_nogetattr[AuIop_Last], -+ aufs_iop[] = { -+ [AuIop_SYMLINK] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, /* unsupport for symlink? */ -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .get_link = aufs_get_link, -+ -+ /* .update_time = aufs_update_time */ -+ }, -+ [AuIop_DIR] = { -+ .create = aufs_create, -+ .lookup = aufs_lookup, -+ .link = aufs_link, -+ .unlink = aufs_unlink, -+ .symlink = aufs_symlink, -+ .mkdir = aufs_mkdir, -+ .rmdir = aufs_rmdir, -+ .mknod = aufs_mknod, -+ .rename = aufs_rename, -+ -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time, -+ .atomic_open = aufs_atomic_open, -+ .tmpfile = aufs_tmpfile -+ }, -+ [AuIop_OTHER] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time -+ } -+}; -diff --git a/fs/aufs/i_op_add.c b/fs/aufs/i_op_add.c -new file mode 100644 -index 000000000000..853c99e200da ---- /dev/null -+++ b/fs/aufs/i_op_add.c -@@ -0,0 +1,923 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (add entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * final procedure of adding a new entry, except link(2). -+ * remove whiteout, instantiate, copyup the parent dir's times and size -+ * and update version. -+ * if it failed, re-create the removed whiteout. -+ */ -+static int epilog(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct dentry *dentry) -+{ -+ int err, rerr; -+ aufs_bindex_t bwh; -+ struct path h_path; -+ struct super_block *sb; -+ struct inode *inode, *h_dir; -+ struct dentry *wh; -+ -+ bwh = -1; -+ sb = dir->i_sb; -+ if (wh_dentry) { -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ IMustLock(h_dir); -+ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); -+ bwh = au_dbwh(dentry); -+ h_path.dentry = wh_dentry; -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (!IS_ERR(inode)) { -+ d_instantiate(dentry, inode); -+ dir = d_inode(dentry->d_parent); /* dir inode is locked */ -+ IMustLock(dir); -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ return 0; /* success */ -+ } -+ -+ err = PTR_ERR(inode); -+ if (!wh_dentry) -+ goto out; -+ -+ /* revert */ -+ /* dir inode is locked */ -+ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); -+ rerr = PTR_ERR(wh); -+ if (IS_ERR(wh)) { -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } else -+ dput(wh); -+ -+out: -+ return err; -+} -+ -+static int au_d_may_add(struct dentry *dentry) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(d_unhashed(dentry))) -+ err = -ENOENT; -+ if (unlikely(d_really_is_positive(dentry))) -+ err = -EEXIST; -+ return err; -+} -+ -+/* -+ * simple tests for the adding inode operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ err = -ENAMETOOLONG; -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (d_really_is_negative(dentry)) { -+ err = -EEXIST; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } -+ -+ err = 0; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ err = -EIO; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * initial procedure of adding a new entry. -+ * prepare writable branch and the parent dir, lock it, -+ * and lookup whiteout for the new entry. -+ */ -+static struct dentry* -+lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, -+ struct dentry *src_dentry, struct au_pin *pin, -+ struct au_wr_dir_args *wr_dir_args) -+{ -+ struct dentry *wh_dentry, *h_parent; -+ struct super_block *sb; -+ struct au_branch *br; -+ int err; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ AuDbg("%pd\n", dentry); -+ -+ err = au_wr_dir(dentry, src_dentry, wr_dir_args); -+ bcpup = err; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) -+ err = au_may_add(dentry, bcpup, h_parent, -+ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); -+ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ br = au_sbr(sb, bcpup); -+ if (dt) { -+ struct path tmp = { -+ .dentry = h_parent, -+ .mnt = au_br_mnt(br) -+ }; -+ au_dtime_store(dt, au_pinned_parent(pin), &tmp); -+ } -+ -+ wh_dentry = NULL; -+ if (bcpup != au_dbwh(dentry)) -+ goto out; /* success */ -+ -+ /* -+ * ENAMETOOLONG here means that if we allowed create such name, then it -+ * would not be able to removed in the future. So we don't allow such -+ * name here and we don't handle ENAMETOOLONG differently here. -+ */ -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ -+out_unpin: -+ if (IS_ERR(wh_dentry)) -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { Mknod, Symlink, Creat }; -+struct simple_arg { -+ int type; -+ union { -+ struct { -+ umode_t mode; -+ bool want_excl; -+ bool try_aopen; -+ struct vfsub_aopen_args *aopen; -+ } c; -+ struct { -+ const char *symname; -+ } s; -+ struct { -+ umode_t mode; -+ dev_t dev; -+ } m; -+ } u; -+}; -+ -+static int add_simple(struct inode *dir, struct dentry *dentry, -+ struct simple_arg *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t btop; -+ unsigned char created; -+ const unsigned char try_aopen -+ = (arg->type == Creat && arg->u.c.try_aopen); -+ struct vfsub_aopen_args *aopen = arg->u.c.aopen; -+ struct dentry *wh_dentry, *parent; -+ struct inode *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ struct au_wr_dir_args wr_dir_args; -+ } *a; -+ -+ AuDbg("%pd\n", dentry); -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->wr_dir_args.force_btgt = -1; -+ a->wr_dir_args.flags = AuWrDir_ADD_ENTRY; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ if (!try_aopen) { -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ } -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ if (!try_aopen) -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &a->wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ sb = dentry->d_sb; -+ br = au_sbr(sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dir = au_pinned_h_dir(&a->pin); -+ switch (arg->type) { -+ case Creat: -+ if (!try_aopen || !h_dir->i_op->atomic_open) { -+ err = vfsub_create(h_dir, &a->h_path, arg->u.c.mode, -+ arg->u.c.want_excl); -+ created = !err; -+ if (!err && try_aopen) -+ aopen->file->f_mode |= FMODE_CREATED; -+ } else { -+ aopen->br = br; -+ err = vfsub_atomic_open(h_dir, a->h_path.dentry, aopen); -+ AuDbg("err %d\n", err); -+ AuDbgFile(aopen->file); -+ created = err >= 0 -+ && !!(aopen->file->f_mode & FMODE_CREATED); -+ } -+ break; -+ case Symlink: -+ err = vfsub_symlink(h_dir, &a->h_path, arg->u.s.symname); -+ created = !err; -+ break; -+ case Mknod: -+ err = vfsub_mknod(h_dir, &a->h_path, arg->u.m.mode, -+ arg->u.m.dev); -+ created = !err; -+ break; -+ default: -+ BUG(); -+ } -+ if (unlikely(err < 0)) -+ goto out_unpin; -+ -+ err = epilog(dir, btop, wh_dentry, dentry); -+ if (!err) -+ goto out_unpin; /* success */ -+ -+ /* revert */ -+ if (created /* && d_is_positive(a->h_path.dentry) */) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL, -+ /*force*/0); -+ if (rerr) { -+ AuIOErr("%pd revert failure(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+ } -+ if (try_aopen && h_dir->i_op->atomic_open -+ && (aopen->file->f_mode & FMODE_OPENED)) -+ /* aopen->file is still opened */ -+ au_lcnt_dec(&aopen->br->br_nfiles); -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ if (!try_aopen) -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ if (!try_aopen) -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, -+ dev_t dev) -+{ -+ struct simple_arg arg = { -+ .type = Mknod, -+ .u.m = { -+ .mode = mode, -+ .dev = dev -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) -+{ -+ struct simple_arg arg = { -+ .type = Symlink, -+ .u.s.symname = symname -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, -+ bool want_excl) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = mode, -+ .want_excl = want_excl -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *aopen_args) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = aopen_args->create_mode, -+ .want_excl = aopen_args->open_flag & O_EXCL, -+ .try_aopen = true, -+ .aopen = aopen_args -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent, *h_dentry; -+ struct inode *h_dir, *inode; -+ struct vfsmount *h_mnt; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_TMPFILE -+ }; -+ -+ /* copy-up may happen */ -+ inode_lock(dir); -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ -+ err = -EBUSY; -+ parent = d_find_any_alias(dir); -+ AuDebugOn(!parent); -+ di_write_lock_parent(parent); -+ if (unlikely(d_inode(parent) != dir)) -+ goto out_parent; -+ -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ bindex = au_dbtop(parent); -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ bindex = err; -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ err = -EOPNOTSUPP; -+ h_dir = au_h_iptr(dir, bindex); -+ if (unlikely(!h_dir->i_op->tmpfile)) -+ goto out_parent; -+ -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ h_parent = au_h_dptr(parent, bindex); -+ h_dentry = vfs_tmpfile(h_parent, mode, /*open_flag*/0); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_mnt; -+ } -+ -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, dget(h_dentry)); -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (IS_ERR(inode)) { -+ err = PTR_ERR(inode); -+ au_set_h_dptr(dentry, bindex, NULL); -+ au_set_dbtop(dentry, -1); -+ au_set_dbbot(dentry, -1); -+ } else { -+ if (!inode->i_nlink) -+ set_nlink(inode, 1); -+ d_tmpfile(dentry, inode); -+ au_di(dentry)->di_tmpfile = 1; -+ -+ /* update without i_mutex */ -+ if (au_ibtop(dir) == au_dbtop(dentry)) -+ au_cpup_attr_timesizes(dir); -+ } -+ dput(h_dentry); -+ -+out_mnt: -+ vfsub_mnt_drop_write(h_mnt); -+out_parent: -+ di_write_unlock(parent); -+ dput(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err)) { -+ au_di_fin(dentry); -+ dentry->d_fsdata = NULL; -+ } -+out_si: -+ si_read_unlock(sb); -+out: -+ inode_unlock(dir); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_link_args { -+ aufs_bindex_t bdst, bsrc; -+ struct au_pin pin; -+ struct path h_path; -+ struct dentry *src_parent, *parent; -+}; -+ -+static int au_cpup_before_link(struct dentry *src_dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ struct dentry *h_src_dentry; -+ struct au_cp_generic cpg = { -+ .dentry = src_dentry, -+ .bdst = a->bdst, -+ .bsrc = a->bsrc, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN /* | AuCpup_KEEPLINO */ -+ }; -+ -+ di_read_lock_parent(a->src_parent, AuLock_IR); -+ err = au_test_and_cpup_dirs(src_dentry, a->bdst); -+ if (unlikely(err)) -+ goto out; -+ -+ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); -+ err = au_pin(&a->pin, src_dentry, a->bdst, -+ au_opt_udba(src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&a->pin); -+ -+out: -+ di_read_unlock(a->src_parent, AuLock_IR); -+ return err; -+} -+ -+static int au_cpup_or_link(struct dentry *src_dentry, struct dentry *dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ unsigned char plink; -+ aufs_bindex_t bbot; -+ struct dentry *h_src_dentry; -+ struct inode *h_inode, *inode, *delegated; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ plink = 0; -+ h_inode = NULL; -+ sb = src_dentry->d_sb; -+ inode = d_inode(src_dentry); -+ if (au_ibtop(inode) <= a->bdst) -+ h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { -+ /* copyup src_dentry as the name of dentry. */ -+ bbot = au_dbbot(dentry); -+ if (bbot < a->bsrc) -+ au_set_dbbot(dentry, a->bsrc); -+ au_set_h_dptr(dentry, a->bsrc, -+ dget(au_h_dptr(src_dentry, a->bsrc))); -+ dget(a->h_path.dentry); -+ au_set_h_dptr(dentry, a->bdst, NULL); -+ AuDbg("temporary d_inode...\n"); -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = d_inode(src_dentry); /* tmp */ -+ spin_unlock(&dentry->d_lock); -+ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->bdst, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_KEEPLINO -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_h_open_post(dentry, a->bsrc, h_file); -+ if (!err) { -+ dput(a->h_path.dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ } else -+ au_set_h_dptr(dentry, a->bdst, -+ a->h_path.dentry); -+ } -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = NULL; /* restore */ -+ spin_unlock(&dentry->d_lock); -+ AuDbg("temporary d_inode...done\n"); -+ au_set_h_dptr(dentry, a->bsrc, NULL); -+ au_set_dbbot(dentry, bbot); -+ } else { -+ /* the inode of src_dentry already exists on a.bdst branch */ -+ h_src_dentry = d_find_alias(h_inode); -+ if (!h_src_dentry && au_plink_test(inode)) { -+ plink = 1; -+ h_src_dentry = au_plink_lkup(inode, a->bdst); -+ err = PTR_ERR(h_src_dentry); -+ if (IS_ERR(h_src_dentry)) -+ goto out; -+ -+ if (unlikely(d_is_negative(h_src_dentry))) { -+ dput(h_src_dentry); -+ h_src_dentry = NULL; -+ } -+ -+ } -+ if (h_src_dentry) { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ dput(h_src_dentry); -+ } else { -+ AuIOErr("no dentry found for hi%lu on b%d\n", -+ h_inode->i_ino, a->bdst); -+ err = -EIO; -+ } -+ } -+ -+ if (!err && !plink) -+ au_plink_append(inode, a->bdst, a->h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry) -+{ -+ int err, rerr; -+ struct au_dtime dt; -+ struct au_link_args *a; -+ struct dentry *wh_dentry, *h_src_dentry; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ IMustLock(dir); -+ inode = d_inode(src_dentry); -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->parent = dentry->d_parent; /* dir inode is locked */ -+ err = aufs_read_and_write_lock2(dentry, src_dentry, -+ AuLock_NOPLM | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_kfree; -+ err = au_d_linkable(src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ a->src_parent = dget_parent(src_dentry); -+ wr_dir_args.force_btgt = au_ibtop(inode); -+ -+ di_write_lock_parent(a->parent); -+ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, -+ &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ a->bdst = au_dbtop(dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); -+ a->bsrc = au_ibtop(inode); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ if (!h_src_dentry && au_di(src_dentry)->di_tmpfile) -+ h_src_dentry = dget(au_hi_wh(inode, a->bsrc)); -+ if (!h_src_dentry) { -+ a->bsrc = au_dbtop(src_dentry); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ AuDebugOn(!h_src_dentry); -+ } else if (IS_ERR(h_src_dentry)) { -+ err = PTR_ERR(h_src_dentry); -+ goto out_parent; -+ } -+ -+ /* -+ * aufs doesn't touch the credential so -+ * security_dentry_create_files_as() is unnecessary. -+ */ -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) -+ err = au_cpup_or_link(src_dentry, dentry, a); -+ else { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ dput(h_src_dentry); -+ } else { -+ /* -+ * copyup src_dentry to the branch we process, -+ * and then link(2) to it. -+ */ -+ dput(h_src_dentry); -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { -+ au_unpin(&a->pin); -+ di_write_unlock(a->parent); -+ err = au_cpup_before_link(src_dentry, a); -+ di_write_lock_parent(a->parent); -+ if (!err) -+ err = au_pin(&a->pin, dentry, a->bdst, -+ au_opt_udba(sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_wh; -+ } -+ if (!err) { -+ h_src_dentry = au_h_dptr(src_dentry, a->bdst); -+ err = -ENOENT; -+ if (h_src_dentry && d_is_positive(h_src_dentry)) { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, -+ au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry" -+ " for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ if (wh_dentry) { -+ a->h_path.dentry = wh_dentry; -+ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out_revert; -+ } -+ -+ au_dir_ts(dir, a->bdst); -+ inode_inc_iversion(dir); -+ inc_nlink(inode); -+ inode->i_ctime = dir->i_ctime; -+ d_instantiate(dentry, au_igrab(inode)); -+ if (d_unhashed(a->h_path.dentry)) -+ /* some filesystem calls d_drop() */ -+ d_drop(dentry); -+ /* some filesystems consume an inode even hardlink */ -+ au_fhsm_wrote(sb, a->bdst, /*force*/0); -+ goto out_unpin; /* success */ -+ -+out_revert: -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, -+ /*delegated*/NULL, /*force*/0); -+ if (unlikely(rerr)) { -+ AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+out_unpin: -+ au_unpin(&a->pin); -+out_wh: -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(a->parent); -+ dput(a->src_parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_and_write_unlock2(dentry, src_dentry); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ unsigned char diropq; -+ struct path h_path; -+ struct dentry *wh_dentry, *parent, *opq_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct { -+ struct au_pin pin; -+ struct au_dtime dt; -+ } *a; /* reduce the stack usage */ -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR -+ }; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ sb = dentry->d_sb; -+ bindex = au_dbtop(dentry); -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ /* make the dir opaque */ -+ diropq = 0; -+ h_inode = d_inode(h_path.dentry); -+ if (wh_dentry -+ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ opq_dentry = au_diropq_create(dentry, bindex); -+ inode_unlock(h_inode); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out_dir; -+ dput(opq_dentry); -+ diropq = 1; -+ } -+ -+ err = epilog(dir, bindex, wh_dentry, dentry); -+ if (!err) { -+ inc_nlink(dir); -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (diropq) { -+ AuLabel(revert opq); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bindex); -+ inode_unlock(h_inode); -+ if (rerr) { -+ AuIOErr("%pd reverting diropq failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ } -+ -+out_dir: -+ AuLabel(revert dir); -+ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); -+ if (rerr) { -+ AuIOErr("%pd reverting dir failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -diff --git a/fs/aufs/i_op_del.c b/fs/aufs/i_op_del.c -new file mode 100644 -index 000000000000..05f5d4219b41 ---- /dev/null -+++ b/fs/aufs/i_op_del.c -@@ -0,0 +1,500 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (del entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * decide if a new whiteout for @dentry is necessary or not. -+ * when it is necessary, prepare the parent dir for the upper branch whose -+ * branch index is @bcpup for creation. the actual creation of the whiteout will -+ * be done by caller. -+ * return value: -+ * 0: wh is unnecessary -+ * plus: wh is necessary -+ * minus: error -+ */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) -+{ -+ int need_wh, err; -+ aufs_bindex_t btop; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ if (*bcpup < 0) { -+ *bcpup = btop; -+ if (au_test_ro(sb, btop, d_inode(dentry))) { -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ *bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else -+ AuDebugOn(btop < *bcpup -+ || au_test_ro(sb, *bcpup, d_inode(dentry))); -+ AuDbg("bcpup %d, btop %d\n", *bcpup, btop); -+ -+ if (*bcpup != btop) { -+ err = au_cpup_dirs(dentry, *bcpup); -+ if (unlikely(err)) -+ goto out; -+ need_wh = 1; -+ } else { -+ struct au_dinfo *dinfo, *tmp; -+ -+ need_wh = -ENOMEM; -+ dinfo = au_di(dentry); -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (tmp) { -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ need_wh = au_lkup_dentry(dentry, btop + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ } -+ } -+ AuDbg("need_wh %d\n", need_wh); -+ err = need_wh; -+ -+out: -+ return err; -+} -+ -+/* -+ * simple tests for the del-entry operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry, *h_latest; -+ struct inode *h_inode; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (d_really_is_positive(dentry)) { -+ err = -ENOENT; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } -+ -+ err = -ENOENT; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ goto out; -+ err = 0; -+ -+ /* -+ * rmdir a dir may break the consistency on some filesystem. -+ * let's try heavy test. -+ */ -+ err = -EACCES; -+ if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1) -+ && au_test_h_perm(d_inode(h_parent), -+ MAY_EXEC | MAY_WRITE))) -+ goto out; -+ -+ h_latest = au_sio_lkup_one(&dentry->d_name, h_parent); -+ err = -EIO; -+ if (IS_ERR(h_latest)) -+ goto out; -+ if (h_latest == h_dentry) -+ err = 0; -+ dput(h_latest); -+ -+out: -+ return err; -+} -+ -+/* -+ * decide the branch where we operate for @dentry. the branch index will be set -+ * @rbcpup. after deciding it, 'pin' it and store the timestamps of the parent -+ * dir for reverting. -+ * when a new whiteout is necessary, create it. -+ */ -+static struct dentry* -+lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, -+ struct au_dtime *dt, struct au_pin *pin) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ struct path h_path; -+ int err, need_wh; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); -+ wh_dentry = ERR_PTR(need_wh); -+ if (unlikely(need_wh < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ bcpup = *rbcpup; -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path.dentry = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) { -+ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ } -+ -+ h_path.mnt = au_sbr_mnt(sb, bcpup); -+ au_dtime_store(dt, au_pinned_parent(pin), &h_path); -+ wh_dentry = NULL; -+ if (!need_wh) -+ goto out; /* success, no need to create whiteout */ -+ -+ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_unpin; -+ -+ /* returns with the parent is locked and wh_dentry is dget-ed */ -+ goto out; /* success */ -+ -+out_unpin: -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* -+ * when removing a dir, rename it to a unique temporary whiteout-ed name first -+ * in order to be revertible and save time for removing many child whiteouts -+ * under the dir. -+ * returns 1 when there are too many child whiteout and caller should remove -+ * them asynchronously. returns 0 when the number of children is enough small to -+ * remove now or the branch fs is a remote fs. -+ * otherwise return an error. -+ */ -+static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, -+ struct au_nhash *whlist, struct inode *dir) -+{ -+ int rmdir_later, err, dirwh; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ sb = dentry->d_sb; -+ SiMustAnyLock(sb); -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); -+ if (unlikely(err)) -+ goto out; -+ -+ /* stop monitoring */ -+ inode = d_inode(dentry); -+ au_hn_free(au_hi(inode, bindex)); -+ -+ if (!au_test_fs_remote(h_dentry->d_sb)) { -+ dirwh = au_sbi(sb)->si_dirwh; -+ rmdir_later = (dirwh <= 1); -+ if (!rmdir_later) -+ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, -+ dirwh); -+ if (rmdir_later) -+ return rmdir_later; -+ } -+ -+ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); -+ if (unlikely(err)) { -+ AuIOErr("rmdir %pd, b%d failed, %d. ignored\n", -+ h_dentry, bindex, err); -+ err = 0; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * final procedure for deleting a entry. -+ * maintain dentry and iattr. -+ */ -+static void epilog(struct inode *dir, struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ d_drop(dentry); -+ inode->i_ctime = dir->i_ctime; -+ -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+} -+ -+/* -+ * when an error happened, remove the created whiteout and revert everything. -+ */ -+static int do_revert(int err, struct inode *dir, aufs_bindex_t bindex, -+ aufs_bindex_t bwh, struct dentry *wh_dentry, -+ struct dentry *dentry, struct au_dtime *dt) -+{ -+ int rerr; -+ struct path h_path = { -+ .dentry = wh_dentry, -+ .mnt = au_sbr_mnt(dir->i_sb, bindex) -+ }; -+ -+ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, dentry); -+ if (!rerr) { -+ au_set_dbwh(dentry, bwh); -+ au_dtime_revert(dt); -+ return 0; -+ } -+ -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", dentry, err, rerr); -+ return -EIO; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_unlink(struct inode *dir, struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode, *h_dir, *delegated; -+ struct dentry *parent, *wh_dentry; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -EISDIR; -+ if (unlikely(d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ a->h_path.mnt = au_sbr_mnt(dentry->d_sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ dget(a->h_path.dentry); -+ if (bindex == btop) { -+ h_dir = au_pinned_h_dir(&a->pin); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &a->h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } else { -+ /* dir inode is locked */ -+ h_dir = d_inode(wh_dentry->d_parent); -+ IMustLock(h_dir); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_drop_nlink(inode); -+ epilog(dir, dentry, bindex); -+ -+ /* update target timestamps */ -+ if (bindex == btop) { -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); -+ /*ignore*/ -+ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } else -+ /* todo: this timestamp may be reverted later */ -+ inode->i_ctime = h_dir->i_ctime; -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(a->h_path.dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_rmdir(struct inode *dir, struct dentry *dentry) -+{ -+ int err, rmdir_later; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode; -+ struct dentry *parent, *wh_dentry, *h_dentry; -+ struct au_whtmp_rmdir *args; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -ENOTDIR; -+ if (unlikely(!d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ err = -ENOMEM; -+ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); -+ if (unlikely(!args)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ err = au_test_empty(dentry, &args->whlist); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ h_dentry = au_h_dptr(dentry, btop); -+ dget(h_dentry); -+ rmdir_later = 0; -+ if (bindex == btop) { -+ err = renwh_and_rmdir(dentry, btop, &args->whlist, dir); -+ if (err > 0) { -+ rmdir_later = err; -+ err = 0; -+ } -+ } else { -+ /* stop monitoring */ -+ au_hn_free(au_hi(inode, btop)); -+ -+ /* dir inode is locked */ -+ IMustLock(d_inode(wh_dentry->d_parent)); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_dead_dir(inode); -+ au_set_dbdiropq(dentry, -1); -+ epilog(dir, dentry, bindex); -+ -+ if (rmdir_later) { -+ au_whtmp_kick_rmdir(dir, btop, h_dentry, args); -+ args = NULL; -+ } -+ -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ AuLabel(revert); -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(h_dentry); -+out_parent: -+ di_write_unlock(parent); -+ if (args) -+ au_whtmp_rmdir_free(args); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff --git a/fs/aufs/i_op_ren.c b/fs/aufs/i_op_ren.c -new file mode 100644 -index 000000000000..37c52390034a ---- /dev/null -+++ b/fs/aufs/i_op_ren.c -@@ -0,0 +1,1237 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operation (rename entry) -+ * todo: this is crazy monster -+ */ -+ -+#include -+#include "aufs.h" -+ -+enum { AuSRC, AuDST, AuSrcDst }; -+enum { AuPARENT, AuCHILD, AuParentChild }; -+ -+#define AuRen_ISDIR_SRC 1 -+#define AuRen_ISDIR_DST (1 << 1) -+#define AuRen_ISSAMEDIR (1 << 2) -+#define AuRen_WHSRC (1 << 3) -+#define AuRen_WHDST (1 << 4) -+#define AuRen_MNT_WRITE (1 << 5) -+#define AuRen_DT_DSTDIR (1 << 6) -+#define AuRen_DIROPQ_SRC (1 << 7) -+#define AuRen_DIROPQ_DST (1 << 8) -+#define AuRen_DIRREN (1 << 9) -+#define AuRen_DROPPED_SRC (1 << 10) -+#define AuRen_DROPPED_DST (1 << 11) -+#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) -+#define au_fset_ren(flags, name) \ -+ do { (flags) |= AuRen_##name; } while (0) -+#define au_fclr_ren(flags, name) \ -+ do { (flags) &= ~AuRen_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuRen_DIRREN -+#define AuRen_DIRREN 0 -+#endif -+ -+struct au_ren_args { -+ struct { -+ struct dentry *dentry, *h_dentry, *parent, *h_parent, -+ *wh_dentry; -+ struct inode *dir, *inode; -+ struct au_hinode *hdir, *hinode; -+ struct au_dtime dt[AuParentChild]; -+ aufs_bindex_t btop, bdiropq; -+ } sd[AuSrcDst]; -+ -+#define src_dentry sd[AuSRC].dentry -+#define src_dir sd[AuSRC].dir -+#define src_inode sd[AuSRC].inode -+#define src_h_dentry sd[AuSRC].h_dentry -+#define src_parent sd[AuSRC].parent -+#define src_h_parent sd[AuSRC].h_parent -+#define src_wh_dentry sd[AuSRC].wh_dentry -+#define src_hdir sd[AuSRC].hdir -+#define src_hinode sd[AuSRC].hinode -+#define src_h_dir sd[AuSRC].hdir->hi_inode -+#define src_dt sd[AuSRC].dt -+#define src_btop sd[AuSRC].btop -+#define src_bdiropq sd[AuSRC].bdiropq -+ -+#define dst_dentry sd[AuDST].dentry -+#define dst_dir sd[AuDST].dir -+#define dst_inode sd[AuDST].inode -+#define dst_h_dentry sd[AuDST].h_dentry -+#define dst_parent sd[AuDST].parent -+#define dst_h_parent sd[AuDST].h_parent -+#define dst_wh_dentry sd[AuDST].wh_dentry -+#define dst_hdir sd[AuDST].hdir -+#define dst_hinode sd[AuDST].hinode -+#define dst_h_dir sd[AuDST].hdir->hi_inode -+#define dst_dt sd[AuDST].dt -+#define dst_btop sd[AuDST].btop -+#define dst_bdiropq sd[AuDST].bdiropq -+ -+ struct dentry *h_trap; -+ struct au_branch *br; -+ struct path h_path; -+ struct au_nhash whlist; -+ aufs_bindex_t btgt, src_bwh; -+ -+ struct { -+ unsigned short auren_flags; -+ unsigned char flags; /* syscall parameter */ -+ unsigned char exchange; -+ } __packed; -+ -+ struct au_whtmp_rmdir *thargs; -+ struct dentry *h_dst; -+ struct au_hinode *h_root; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * functions for reverting. -+ * when an error happened in a single rename systemcall, we should revert -+ * everything as if nothing happened. -+ * we don't need to revert the copied-up/down the parent dir since they are -+ * harmless. -+ */ -+ -+#define RevertFailure(fmt, ...) do { \ -+ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ -+ ##__VA_ARGS__, err, rerr); \ -+ err = -EIO; \ -+} while (0) -+ -+static void au_ren_do_rev_diropq(int err, struct au_ren_args *a, int idx) -+{ -+ int rerr; -+ struct dentry *d; -+#define src_or_dst(member) a->sd[idx].member -+ -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ rerr = au_diropq_remove(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ au_set_dbdiropq(d, src_or_dst(bdiropq)); -+ if (rerr) -+ RevertFailure("remove diropq %pd", d); -+ -+#undef src_or_dst_ -+} -+ -+static void au_ren_rev_diropq(int err, struct au_ren_args *a) -+{ -+ if (au_ftest_ren(a->auren_flags, DIROPQ_SRC)) -+ au_ren_do_rev_diropq(err, a, AuSRC); -+ if (au_ftest_ren(a->auren_flags, DIROPQ_DST)) -+ au_ren_do_rev_diropq(err, a, AuDST); -+} -+ -+static void au_ren_rev_rename(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ struct inode *delegated; -+ -+ a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, -+ a->src_h_parent); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->src_dentry); -+ return; -+ } -+ -+ delegated = NULL; -+ rerr = vfsub_rename(a->dst_h_dir, -+ au_h_dptr(a->src_dentry, a->btgt), -+ a->src_h_dir, &a->h_path, &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ -+ if (rerr) -+ RevertFailure("rename %pd", a->src_dentry); -+} -+ -+static void au_ren_rev_whtmp(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ struct inode *delegated; -+ -+ a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, -+ a->dst_h_parent); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->dst_dentry); -+ return; -+ } -+ if (d_is_positive(a->h_path.dentry)) { -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ return; -+ } -+ -+ delegated = NULL; -+ rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path, -+ &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ if (!rerr) -+ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); -+ else -+ RevertFailure("rename %pd", a->h_dst); -+} -+ -+static void au_ren_rev_whsrc(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = a->src_wh_dentry; -+ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); -+ au_set_dbwh(a->src_dentry, a->src_bwh); -+ if (rerr) -+ RevertFailure("unlink %pd", a->src_wh_dentry); -+} -+#undef RevertFailure -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * when we have to copyup the renaming entry, do it with the rename-target name -+ * in order to minimize the cost (the later actual rename is unnecessary). -+ * otherwise rename it on the target branch. -+ */ -+static int au_ren_or_cpup(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d; -+ struct inode *delegated; -+ -+ d = a->src_dentry; -+ if (au_dbtop(d) == a->btgt) { -+ a->h_path.dentry = a->dst_h_dentry; -+ AuDebugOn(au_dbtop(d) != a->btgt); -+ delegated = NULL; -+ err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), -+ a->dst_h_dir, &a->h_path, &delegated, -+ a->flags); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ } else -+ BUG(); -+ -+ if (!err && a->h_dst) -+ /* it will be set to dinfo later */ -+ dget(a->h_dst); -+ -+ return err; -+} -+ -+/* cf. aufs_rmdir() */ -+static int au_ren_del_whtmp(struct au_ren_args *a) -+{ -+ int err; -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ SiMustAnyLock(dir->i_sb); -+ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, -+ au_sbi(dir->i_sb)->si_dirwh) -+ || au_test_fs_remote(a->h_dst->d_sb)) { -+ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); -+ if (unlikely(err)) -+ pr_warn("failed removing whtmp dir %pd (%d), " -+ "ignored.\n", a->h_dst, err); -+ } else { -+ au_nhash_wh_free(&a->thargs->whlist); -+ a->thargs->whlist = a->whlist; -+ a->whlist.nh_num = 0; -+ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); -+ dput(a->h_dst); -+ a->thargs = NULL; -+ } -+ -+ return 0; -+} -+ -+/* make it 'opaque' dir. */ -+static int au_ren_do_diropq(struct au_ren_args *a, int idx) -+{ -+ int err; -+ struct dentry *d, *diropq; -+#define src_or_dst(member) a->sd[idx].member -+ -+ err = 0; -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ src_or_dst(bdiropq) = au_dbdiropq(d); -+ src_or_dst(hinode) = au_hi(src_or_dst(inode), a->btgt); -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ diropq = au_diropq_create(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ if (IS_ERR(diropq)) -+ err = PTR_ERR(diropq); -+ else -+ dput(diropq); -+ -+#undef src_or_dst_ -+ return err; -+} -+ -+static int au_ren_diropq(struct au_ren_args *a) -+{ -+ int err; -+ unsigned char always; -+ struct dentry *d; -+ -+ err = 0; -+ d = a->dst_dentry; /* already renamed on the branch */ -+ always = !!au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !au_ftest_ren(a->auren_flags, DIRREN) -+ && a->btgt != au_dbdiropq(a->src_dentry) -+ && (a->dst_wh_dentry -+ || a->btgt <= au_dbdiropq(d) -+ /* hide the lower to keep xino */ -+ /* the lowers may not be a dir, but we hide them anyway */ -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbg("here\n"); -+ err = au_ren_do_diropq(a, AuSRC); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, DIROPQ_SRC); -+ } -+ if (!a->exchange) -+ goto out; /* success */ -+ -+ d = a->src_dentry; /* already renamed on the branch */ -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ && a->btgt != au_dbdiropq(a->dst_dentry) -+ && (a->btgt < au_dbdiropq(d) -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbgDentry(a->src_dentry); -+ AuDbgDentry(a->dst_dentry); -+ err = au_ren_do_diropq(a, AuDST); -+ if (unlikely(err)) -+ goto out_rev_src; -+ au_fset_ren(a->auren_flags, DIROPQ_DST); -+ } -+ goto out; /* success */ -+ -+out_rev_src: -+ AuDbg("err %d, reverting src\n", err); -+ au_ren_rev_diropq(err, a); -+out: -+ return err; -+} -+ -+static int do_rename(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d, *h_d; -+ -+ if (!a->exchange) { -+ /* prepare workqueue args for asynchronous rmdir */ -+ h_d = a->dst_h_dentry; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ /* && !au_ftest_ren(a->auren_flags, DIRREN) */ -+ && d_is_positive(h_d)) { -+ err = -ENOMEM; -+ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, -+ GFP_NOFS); -+ if (unlikely(!a->thargs)) -+ goto out; -+ a->h_dst = dget(h_d); -+ } -+ -+ /* create whiteout for src_dentry */ -+ if (au_ftest_ren(a->auren_flags, WHSRC)) { -+ a->src_bwh = au_dbwh(a->src_dentry); -+ AuDebugOn(a->src_bwh >= 0); -+ a->src_wh_dentry = au_wh_create(a->src_dentry, a->btgt, -+ a->src_h_parent); -+ err = PTR_ERR(a->src_wh_dentry); -+ if (IS_ERR(a->src_wh_dentry)) -+ goto out_thargs; -+ } -+ -+ /* lookup whiteout for dentry */ -+ if (au_ftest_ren(a->auren_flags, WHDST)) { -+ h_d = au_wh_lkup(a->dst_h_parent, -+ &a->dst_dentry->d_name, a->br); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out_whsrc; -+ if (d_is_negative(h_d)) -+ dput(h_d); -+ else -+ a->dst_wh_dentry = h_d; -+ } -+ -+ /* rename dentry to tmpwh */ -+ if (a->thargs) { -+ err = au_whtmp_ren(a->dst_h_dentry, a->br); -+ if (unlikely(err)) -+ goto out_whdst; -+ -+ d = a->dst_dentry; -+ au_set_h_dptr(d, a->btgt, NULL); -+ err = au_lkup_neg(d, a->btgt, /*wh*/0); -+ if (unlikely(err)) -+ goto out_whtmp; -+ a->dst_h_dentry = au_h_dptr(d, a->btgt); -+ } -+ } -+ -+ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_btop != a->btgt); -+#if 0 /* debugging */ -+ BUG_ON(!au_ftest_ren(a->auren_flags, DIRREN) -+ && d_is_positive(a->dst_h_dentry) -+ && a->src_btop != a->btgt); -+#endif -+ -+ /* rename by vfs_rename or cpup */ -+ err = au_ren_or_cpup(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_whtmp; -+ -+ /* make dir opaque */ -+ err = au_ren_diropq(a); -+ if (unlikely(err)) -+ goto out_rename; -+ -+ /* update target timestamps */ -+ if (a->exchange) { -+ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } -+ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ -+ if (!a->exchange) { -+ /* remove whiteout for dentry */ -+ if (a->dst_wh_dentry) { -+ a->h_path.dentry = a->dst_wh_dentry; -+ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, -+ a->dst_dentry); -+ if (unlikely(err)) -+ goto out_diropq; -+ } -+ -+ /* remove whtmp */ -+ if (a->thargs) -+ au_ren_del_whtmp(a); /* ignore this error */ -+ -+ au_fhsm_wrote(a->src_dentry->d_sb, a->btgt, /*force*/0); -+ } -+ err = 0; -+ goto out_success; -+ -+out_diropq: -+ au_ren_rev_diropq(err, a); -+out_rename: -+ au_ren_rev_rename(err, a); -+ dput(a->h_dst); -+out_whtmp: -+ if (a->thargs) -+ au_ren_rev_whtmp(err, a); -+out_whdst: -+ dput(a->dst_wh_dentry); -+ a->dst_wh_dentry = NULL; -+out_whsrc: -+ if (a->src_wh_dentry) -+ au_ren_rev_whsrc(err, a); -+out_success: -+ dput(a->src_wh_dentry); -+ dput(a->dst_wh_dentry); -+out_thargs: -+ if (a->thargs) { -+ dput(a->h_dst); -+ au_whtmp_rmdir_free(a->thargs); -+ a->thargs = NULL; -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if @dentry dir can be rename destination or not. -+ * success means, it is a logically empty dir. -+ */ -+static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ return au_test_empty(dentry, whlist); -+} -+ -+/* -+ * test if @a->src_dentry dir can be rename source or not. -+ * if it can, return 0. -+ * success means, -+ * - it is a logically empty dir. -+ * - or, it exists on writable branch and has no children including whiteouts -+ * on the lower branch unless DIRREN is on. -+ */ -+static int may_rename_srcdir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t btop, btgt; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ dentry = a->src_dentry; -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ au_fset_ren(a->auren_flags, DIRREN); -+ -+ btgt = a->btgt; -+ btop = au_dbtop(dentry); -+ if (btop != btgt) { -+ struct au_nhash whlist; -+ -+ SiMustAnyLock(sb); -+ rdhash = sbinfo->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, -+ dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_test_empty(dentry, &whlist); -+ au_nhash_wh_free(&whlist); -+ goto out; -+ } -+ -+ if (btop == au_dbtaildir(dentry)) -+ return 0; /* success */ -+ -+ err = au_test_empty_lower(dentry); -+ -+out: -+ if (err == -ENOTEMPTY) { -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = 0; -+ } else { -+ AuWarn1("renaming dir who has child(ren) on multiple " -+ "branches, is not supported\n"); -+ err = -EXDEV; -+ } -+ } -+ return err; -+} -+ -+/* side effect: sets whlist and h_dentry */ -+static int au_ren_may_dir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ struct dentry *d; -+ -+ d = a->dst_dentry; -+ SiMustAnyLock(d->d_sb); -+ -+ err = 0; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) && a->dst_inode) { -+ rdhash = au_sbi(d->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); -+ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ if (!a->exchange) { -+ au_set_dbtop(d, a->dst_btop); -+ err = may_rename_dstdir(d, &a->whlist); -+ au_set_dbtop(d, a->btgt); -+ } else -+ err = may_rename_srcdir(a); -+ } -+ a->dst_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (unlikely(err)) -+ goto out; -+ -+ d = a->src_dentry; -+ a->src_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ err = may_rename_srcdir(a); -+ if (unlikely(err)) { -+ au_nhash_wh_free(&a->whlist); -+ a->whlist.nh_num = 0; -+ } -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * simple tests for rename. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+static int au_may_ren(struct au_ren_args *a) -+{ -+ int err, isdir; -+ struct inode *h_inode; -+ -+ if (a->src_btop == a->btgt) { -+ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, -+ au_ftest_ren(a->auren_flags, ISDIR_SRC)); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (unlikely(a->src_h_dentry == a->h_trap)) -+ goto out; -+ } -+ -+ err = 0; -+ if (a->dst_btop != a->btgt) -+ goto out; -+ -+ err = -ENOTEMPTY; -+ if (unlikely(a->dst_h_dentry == a->h_trap)) -+ goto out; -+ -+ err = -EIO; -+ isdir = !!au_ftest_ren(a->auren_flags, ISDIR_DST); -+ if (d_really_is_negative(a->dst_dentry)) { -+ if (d_is_negative(a->dst_h_dentry)) -+ err = au_may_add(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } else { -+ if (unlikely(d_is_negative(a->dst_h_dentry))) -+ goto out; -+ h_inode = d_inode(a->dst_h_dentry); -+ if (h_inode->i_nlink) -+ err = au_may_del(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } -+ -+out: -+ if (unlikely(err == -ENOENT || err == -EEXIST)) -+ err = -EIO; -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * locking order -+ * (VFS) -+ * - src_dir and dir by lock_rename() -+ * - inode if exists -+ * (aufs) -+ * - lock all -+ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, -+ * + si_read_lock -+ * + di_write_lock2_child() -+ * + di_write_lock_child() -+ * + ii_write_lock_child() -+ * + di_write_lock_child2() -+ * + ii_write_lock_child2() -+ * + src_parent and parent -+ * + di_write_lock_parent() -+ * + ii_write_lock_parent() -+ * + di_write_lock_parent2() -+ * + ii_write_lock_parent2() -+ * + lower src_dir and dir by vfsub_lock_rename() -+ * + verify the every relationships between child and parent. if any -+ * of them failed, unlock all and return -EBUSY. -+ */ -+static void au_ren_unlock(struct au_ren_args *a) -+{ -+ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ if (au_ftest_ren(a->auren_flags, DIRREN) -+ && a->h_root) -+ au_hn_inode_unlock(a->h_root); -+ if (au_ftest_ren(a->auren_flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+} -+ -+static int au_ren_lock(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int udba; -+ -+ err = 0; -+ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); -+ a->src_hdir = au_hi(a->src_dir, a->btgt); -+ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); -+ a->dst_hdir = au_hi(a->dst_dir, a->btgt); -+ -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, MNT_WRITE); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ struct dentry *root; -+ struct inode *dir; -+ -+ /* -+ * sbinfo is already locked, so this ii_read_lock is -+ * unnecessary. but our debugging feature checks it. -+ */ -+ root = a->src_inode->i_sb->s_root; -+ if (root != a->src_parent && root != a->dst_parent) { -+ dir = d_inode(root); -+ ii_read_lock_parent3(dir); -+ a->h_root = au_hi(dir, a->btgt); -+ ii_read_unlock(dir); -+ au_hn_inode_lock_nested(a->h_root, AuLsc_I_PARENT3); -+ } -+ } -+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ udba = au_opt_udba(a->src_dentry->d_sb); -+ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) -+ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) -+ err = au_busy_or_stale(); -+ if (!err && au_dbtop(a->src_dentry) == a->btgt) -+ err = au_h_verify(a->src_h_dentry, udba, -+ d_inode(a->src_h_parent), a->src_h_parent, -+ a->br); -+ if (!err && au_dbtop(a->dst_dentry) == a->btgt) -+ err = au_h_verify(a->dst_h_dentry, udba, -+ d_inode(a->dst_h_parent), a->dst_h_parent, -+ a->br); -+ if (!err) -+ goto out; /* success */ -+ -+ err = au_busy_or_stale(); -+ au_ren_unlock(a); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_ren_refresh_dir(struct au_ren_args *a) -+{ -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->src_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ -+ if (a->exchange) { -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->dst_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ } -+ -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ return; -+ -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ au_dir_ts(dir, a->btgt); -+} -+ -+static void au_ren_refresh(struct au_ren_args *a) -+{ -+ aufs_bindex_t bbot, bindex; -+ struct dentry *d, *h_d; -+ struct inode *i, *h_i; -+ struct super_block *sb; -+ -+ d = a->dst_dentry; -+ d_drop(d); -+ if (a->h_dst) -+ /* already dget-ed by au_ren_or_cpup() */ -+ au_set_h_dptr(d, a->btgt, a->h_dst); -+ -+ i = a->dst_inode; -+ if (i) { -+ if (!a->exchange) { -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ vfsub_drop_nlink(i); -+ else { -+ vfsub_dead_dir(i); -+ au_cpup_attr_timesizes(i); -+ } -+ au_update_dbrange(d, /*do_put_zero*/1); -+ } else -+ au_cpup_attr_nlink(i, /*force*/1); -+ } else { -+ bbot = a->btgt; -+ for (bindex = au_dbtop(d); bindex < bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ au_update_dbrange(d, /*do_put_zero*/0); -+ } -+ -+ if (a->exchange -+ || au_ftest_ren(a->auren_flags, DIRREN)) { -+ d_drop(a->src_dentry); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_set_dbwh(a->src_dentry, -1); -+ return; -+ } -+ -+ d = a->src_dentry; -+ au_set_dbwh(d, -1); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_d = au_h_dptr(d, bindex); -+ if (h_d) -+ au_set_h_dptr(d, bindex, NULL); -+ } -+ au_set_dbbot(d, a->btgt); -+ -+ sb = d->d_sb; -+ i = a->src_inode; -+ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) -+ return; /* success */ -+ -+ bbot = au_ibbot(i); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(i, bindex); -+ if (h_i) { -+ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ au_set_h_iptr(i, bindex, NULL, 0); -+ } -+ } -+ au_set_ibbot(i, a->btgt); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mainly for link(2) and rename(2) */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) -+{ -+ aufs_bindex_t bdiropq, bwh; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ parent = dentry->d_parent; -+ IMustLock(d_inode(parent)); /* dir is locked */ -+ -+ bdiropq = au_dbdiropq(parent); -+ bwh = au_dbwh(dentry); -+ br = au_sbr(dentry->d_sb, btgt); -+ if (au_br_rdonly(br) -+ || (0 <= bdiropq && bdiropq < btgt) -+ || (0 <= bwh && bwh < btgt)) -+ btgt = -1; -+ -+ AuDbg("btgt %d\n", btgt); -+ return btgt; -+} -+ -+/* sets src_btop, dst_btop and btgt */ -+static int au_ren_wbr(struct au_ren_args *a) -+{ -+ int err; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ a->src_btop = au_dbtop(a->src_dentry); -+ a->dst_btop = au_dbtop(a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ || au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ wr_dir_args.force_btgt = a->src_btop; -+ if (a->dst_inode && a->dst_btop < a->src_btop) -+ wr_dir_args.force_btgt = a->dst_btop; -+ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); -+ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); -+ a->btgt = err; -+ if (a->exchange) -+ au_update_dbtop(a->dst_dentry); -+ -+ return err; -+} -+ -+static void au_ren_dt(struct au_ren_args *a) -+{ -+ a->h_path.dentry = a->src_h_parent; -+ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) { -+ a->h_path.dentry = a->dst_h_parent; -+ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); -+ } -+ -+ au_fclr_ren(a->auren_flags, DT_DSTDIR); -+ if (!au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !a->exchange) -+ return; -+ -+ a->h_path.dentry = a->src_h_dentry; -+ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); -+ if (d_is_positive(a->dst_h_dentry)) { -+ au_fset_ren(a->auren_flags, DT_DSTDIR); -+ a->h_path.dentry = a->dst_h_dentry; -+ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); -+ } -+} -+ -+static void au_ren_rev_dt(int err, struct au_ren_args *a) -+{ -+ struct dentry *h_d; -+ struct inode *h_inode; -+ -+ au_dtime_revert(a->src_dt + AuPARENT); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ au_dtime_revert(a->dst_dt + AuPARENT); -+ -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) && err != -EIO) { -+ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->src_dt + AuCHILD); -+ inode_unlock(h_inode); -+ -+ if (au_ftest_ren(a->auren_flags, DT_DSTDIR)) { -+ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->dst_dt + AuCHILD); -+ inode_unlock(h_inode); -+ } -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_rename(struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry, -+ unsigned int _flags) -+{ -+ int err, lock_flags; -+ void *rev; -+ /* reduce stack space */ -+ struct au_ren_args *a; -+ struct au_pin pin; -+ -+ AuDbg("%pd, %pd, 0x%x\n", _src_dentry, _dst_dentry, _flags); -+ IMustLock(_src_dir); -+ IMustLock(_dst_dir); -+ -+ err = -EINVAL; -+ if (unlikely(_flags & RENAME_WHITEOUT)) -+ goto out; -+ -+ err = -ENOMEM; -+ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->flags = _flags; -+ BUILD_BUG_ON(sizeof(a->exchange) == sizeof(u8) -+ && RENAME_EXCHANGE > U8_MAX); -+ a->exchange = _flags & RENAME_EXCHANGE; -+ a->src_dir = _src_dir; -+ a->src_dentry = _src_dentry; -+ a->src_inode = NULL; -+ if (d_really_is_positive(a->src_dentry)) -+ a->src_inode = d_inode(a->src_dentry); -+ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ -+ a->dst_dir = _dst_dir; -+ a->dst_dentry = _dst_dentry; -+ a->dst_inode = NULL; -+ if (d_really_is_positive(a->dst_dentry)) -+ a->dst_inode = d_inode(a->dst_dentry); -+ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ -+ if (a->dst_inode) { -+ /* -+ * if EXCHANGE && src is non-dir && dst is dir, -+ * dst is not locked. -+ */ -+ /* IMustLock(a->dst_inode); */ -+ au_igrab(a->dst_inode); -+ } -+ -+ err = -ENOTDIR; -+ lock_flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN; -+ if (d_is_dir(a->src_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_SRC); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->dst_dentry) -+ && !d_is_dir(a->dst_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ if (a->dst_inode && d_is_dir(a->dst_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_DST); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->src_dentry) -+ && !d_is_dir(a->src_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, -+ lock_flags); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = au_d_hashed_positive(a->src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = -ENOENT; -+ if (a->dst_inode) { -+ /* -+ * If it is a dir, VFS unhash it before this -+ * function. It means we cannot rely upon d_unhashed(). -+ */ -+ if (unlikely(!a->dst_inode->i_nlink)) -+ goto out_unlock; -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ err = au_d_hashed_positive(a->dst_dentry); -+ if (unlikely(err && !a->exchange)) -+ goto out_unlock; -+ } else if (unlikely(IS_DEADDIR(a->dst_inode))) -+ goto out_unlock; -+ } else if (unlikely(d_unhashed(a->dst_dentry))) -+ goto out_unlock; -+ -+ /* -+ * is it possible? -+ * yes, it happened (in linux-3.3-rcN) but I don't know why. -+ * there may exist a problem somewhere else. -+ */ -+ err = -EINVAL; -+ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry))) -+ goto out_unlock; -+ -+ au_fset_ren(a->auren_flags, ISSAMEDIR); /* temporary */ -+ di_write_lock_parent(a->dst_parent); -+ -+ /* which branch we process */ -+ err = au_ren_wbr(a); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); -+ a->h_path.mnt = au_br_mnt(a->br); -+ -+ /* are they available to be renamed */ -+ err = au_ren_may_dir(a); -+ if (unlikely(err)) -+ goto out_children; -+ -+ /* prepare the writable parent dir on the same branch */ -+ if (a->dst_btop == a->btgt) { -+ au_fset_ren(a->auren_flags, WHDST); -+ } else { -+ err = au_cpup_dirs(a->dst_dentry, a->btgt); -+ if (unlikely(err)) -+ goto out_children; -+ } -+ -+ err = 0; -+ if (!a->exchange) { -+ if (a->src_dir != a->dst_dir) { -+ /* -+ * this temporary unlock is safe, -+ * because both dir->i_mutex are locked. -+ */ -+ di_write_unlock(a->dst_parent); -+ di_write_lock_parent(a->src_parent); -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ di_write_unlock(a->src_parent); -+ di_write_lock2_parent(a->src_parent, a->dst_parent, -+ /*isdir*/1); -+ au_fclr_ren(a->auren_flags, ISSAMEDIR); -+ } else -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ } -+ if (unlikely(err < 0)) -+ goto out_children; -+ if (err) -+ au_fset_ren(a->auren_flags, WHSRC); -+ -+ /* cpup src */ -+ if (a->src_btop != a->btgt) { -+ err = au_pin(&pin, a->src_dentry, a->btgt, -+ au_opt_udba(a->src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->src_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->src_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ AuDebugOn(au_dbtop(a->src_dentry) != a->src_btop); -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->src_btop = a->btgt; -+ a->src_h_dentry = au_h_dptr(a->src_dentry, a->btgt); -+ if (!a->exchange) -+ au_fset_ren(a->auren_flags, WHSRC); -+ } -+ -+ /* cpup dst */ -+ if (a->exchange && a->dst_inode -+ && a->dst_btop != a->btgt) { -+ err = au_pin(&pin, a->dst_dentry, a->btgt, -+ au_opt_udba(a->dst_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->dst_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->dst_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->dst_btop = a->btgt; -+ a->dst_h_dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ } -+ -+ /* lock them all */ -+ err = au_ren_lock(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_children; -+ -+ if (!a->exchange) { -+ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) -+ err = au_may_ren(a); -+ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ if (unlikely(err)) -+ goto out_hdir; -+ } -+ -+ /* store timestamps to be revertible */ -+ au_ren_dt(a); -+ -+ /* store dirren info */ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = au_dr_rename(a->src_dentry, a->btgt, -+ &a->dst_dentry->d_name, &rev); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dt; -+ } -+ -+ /* here we go */ -+ err = do_rename(a); -+ if (unlikely(err)) -+ goto out_dirren; -+ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_fin(a->src_dentry, a->btgt, rev); -+ -+ /* update dir attributes */ -+ au_ren_refresh_dir(a); -+ -+ /* dput/iput all lower dentries */ -+ au_ren_refresh(a); -+ -+ goto out_hdir; /* success */ -+ -+out_dirren: -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_rev(a->src_dentry, a->btgt, rev); -+out_dt: -+ au_ren_rev_dt(err, a); -+out_hdir: -+ au_ren_unlock(a); -+out_children: -+ au_nhash_wh_free(&a->whlist); -+ if (err && a->dst_inode && a->dst_btop != a->btgt) { -+ AuDbg("btop %d, btgt %d\n", a->dst_btop, a->btgt); -+ au_set_h_dptr(a->dst_dentry, a->btgt, NULL); -+ au_set_dbtop(a->dst_dentry, a->dst_btop); -+ } -+out_parent: -+ if (!err) { -+ if (d_unhashed(a->src_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_SRC); -+ if (d_unhashed(a->dst_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_DST); -+ if (!a->exchange) -+ d_move(a->src_dentry, a->dst_dentry); -+ else { -+ d_exchange(a->src_dentry, a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, DROPPED_DST)) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, DROPPED_SRC)) -+ d_drop(a->src_dentry); -+ } else { -+ au_update_dbtop(a->dst_dentry); -+ if (!a->dst_inode) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ di_write_unlock(a->dst_parent); -+ else -+ di_write_unlock2(a->src_parent, a->dst_parent); -+out_unlock: -+ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); -+out_free: -+ iput(a->dst_inode); -+ if (a->thargs) -+ au_whtmp_rmdir_free(a->thargs); -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff --git a/fs/aufs/iinfo.c b/fs/aufs/iinfo.c -new file mode 100644 -index 000000000000..5a837d7d0a33 ---- /dev/null -+++ b/fs/aufs/iinfo.c -@@ -0,0 +1,273 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode private data -+ */ -+ -+#include "aufs.h" -+ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct inode *h_inode; -+ struct au_hinode *hinode; -+ -+ IiMustAnyLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ h_inode = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ return h_inode; -+} -+ -+/* todo: hard/soft set? */ -+void au_hiput(struct au_hinode *hinode) -+{ -+ au_hn_free(hinode); -+ dput(hinode->hi_whdentry); -+ iput(hinode->hi_inode); -+} -+ -+unsigned int au_hi_flags(struct inode *inode, int isdir) -+{ -+ unsigned int flags; -+ const unsigned int mnt_flags = au_mntflags(inode->i_sb); -+ -+ flags = 0; -+ if (au_opt_test(mnt_flags, XINO)) -+ au_fset_hi(flags, XINO); -+ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) -+ au_fset_hi(flags, HNOTIFY); -+ return flags; -+} -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags) -+{ -+ struct au_hinode *hinode; -+ struct inode *hi; -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(iinfo, bindex); -+ hi = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ -+ if (hi) -+ au_hiput(hinode); -+ hinode->hi_inode = h_inode; -+ if (h_inode) { -+ int err; -+ struct super_block *sb = inode->i_sb; -+ struct au_branch *br; -+ -+ AuDebugOn(inode->i_mode -+ && (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)); -+ if (bindex == iinfo->ii_btop) -+ au_cpup_igen(inode, h_inode); -+ br = au_sbr(sb, bindex); -+ hinode->hi_id = br->br_id; -+ if (au_ftest_hi(flags, XINO)) { -+ err = au_xino_write(sb, bindex, h_inode->i_ino, -+ inode->i_ino); -+ if (unlikely(err)) -+ AuIOErr1("failed au_xino_write() %d\n", err); -+ } -+ -+ if (au_ftest_hi(flags, HNOTIFY) -+ && au_br_hnotifyable(br->br_perm)) { -+ err = au_hn_alloc(hinode, inode); -+ if (unlikely(err)) -+ AuIOErr1("au_hn_alloc() %d\n", err); -+ } -+ } -+} -+ -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh) -+{ -+ struct au_hinode *hinode; -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ AuDebugOn(hinode->hi_whdentry); -+ hinode->hi_whdentry = h_wh; -+} -+ -+void au_update_iigen(struct inode *inode, int half) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ unsigned int sigen; -+ -+ sigen = au_sigen(inode->i_sb); -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation = sigen; -+ if (half) -+ au_ig_fset(iigen->ig_flags, HALF_REFRESHED); -+ else -+ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED); -+ spin_unlock(&iigen->ig_spin); -+} -+ -+/* it may be called at remount time, too */ -+void au_update_ibrange(struct inode *inode, int do_put_zero) -+{ -+ struct au_iinfo *iinfo; -+ aufs_bindex_t bindex, bbot; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ iinfo = au_ii(inode); -+ if (do_put_zero && iinfo->ii_btop >= 0) { -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++) { -+ struct inode *h_i; -+ -+ h_i = au_hinode(iinfo, bindex)->hi_inode; -+ if (h_i -+ && !h_i->i_nlink -+ && !(h_i->i_state & I_LINKABLE)) -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ } -+ } -+ -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ bbot = au_sbbot(inode->i_sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_btop = bindex; -+ break; -+ } -+ if (iinfo->ii_btop >= 0) -+ for (bindex = bbot; bindex >= iinfo->ii_btop; bindex--) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_bbot = bindex; -+ break; -+ } -+ AuDebugOn(iinfo->ii_btop > iinfo->ii_bbot); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_icntnr_init_once(void *_c) -+{ -+ struct au_icntnr *c = _c; -+ struct au_iinfo *iinfo = &c->iinfo; -+ -+ spin_lock_init(&iinfo->ii_generation.ig_spin); -+ au_rw_init(&iinfo->ii_rwsem); -+ inode_init_once(&c->vfs_inode); -+} -+ -+void au_hinode_init(struct au_hinode *hinode) -+{ -+ hinode->hi_inode = NULL; -+ hinode->hi_id = -1; -+ au_hn_init(hinode); -+ hinode->hi_whdentry = NULL; -+} -+ -+int au_iinfo_init(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ int nbr, i; -+ -+ sb = inode->i_sb; -+ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+ nbr = au_sbbot(sb) + 1; -+ if (unlikely(nbr <= 0)) -+ nbr = 1; -+ hi = kmalloc_array(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); -+ if (hi) { -+ au_lcnt_inc(&au_sbi(sb)->si_ninodes); -+ -+ iinfo->ii_hinode = hi; -+ for (i = 0; i < nbr; i++, hi++) -+ au_hinode_init(hi); -+ -+ iinfo->ii_generation.ig_generation = au_sigen(sb); -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ iinfo->ii_vdir = NULL; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink) -+{ -+ int err, i; -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ err = -ENOMEM; -+ hip = au_krealloc(iinfo->ii_hinode, sizeof(*hip) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hip) { -+ iinfo->ii_hinode = hip; -+ i = iinfo->ii_bbot + 1; -+ hip += i; -+ for (; i < nbr; i++, hip++) -+ au_hinode_init(hip); -+ err = 0; -+ } -+ -+ return err; -+} -+ -+void au_iinfo_fin(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char unlinked = !inode->i_nlink; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ au_lcnt_dec(&au_sbi(sb)->si_ninodes); -+ if (si_pid_test(sb)) -+ au_xino_delete_inode(inode, unlinked); -+ else { -+ /* -+ * it is safe to hide the dependency between sbinfo and -+ * sb->s_umount. -+ */ -+ lockdep_off(); -+ si_noflush_read_lock(sb); -+ au_xino_delete_inode(inode, unlinked); -+ si_read_unlock(sb); -+ lockdep_on(); -+ } -+ -+ iinfo = au_ii(inode); -+ if (iinfo->ii_vdir) -+ au_vdir_free(iinfo->ii_vdir); -+ -+ bindex = iinfo->ii_btop; -+ if (bindex >= 0) { -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ while (bindex++ <= bbot) { -+ if (hi->hi_inode) -+ au_hiput(hi); -+ hi++; -+ } -+ } -+ au_kfree_rcu(iinfo->ii_hinode); -+ AuRwDestroy(&iinfo->ii_rwsem); -+} -diff --git a/fs/aufs/inode.c b/fs/aufs/inode.c -new file mode 100644 -index 000000000000..c071e525f499 ---- /dev/null -+++ b/fs/aufs/inode.c -@@ -0,0 +1,516 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct inode *au_igrab(struct inode *inode) -+{ -+ if (inode) { -+ AuDebugOn(!atomic_read(&inode->i_count)); -+ ihold(inode); -+ } -+ return inode; -+} -+ -+static void au_refresh_hinode_attr(struct inode *inode, int do_version) -+{ -+ au_cpup_attr_all(inode, /*force*/0); -+ au_update_iigen(inode, /*half*/1); -+ if (do_version) -+ inode_inc_iversion(inode); -+} -+ -+static int au_ii_refresh(struct inode *inode, int *update) -+{ -+ int err, e, nbr; -+ umode_t type; -+ aufs_bindex_t bindex, new_bindex; -+ struct super_block *sb; -+ struct au_iinfo *iinfo; -+ struct au_hinode *p, *q, tmp; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ *update = 0; -+ sb = inode->i_sb; -+ nbr = au_sbbot(sb) + 1; -+ type = inode->i_mode & S_IFMT; -+ iinfo = au_ii(inode); -+ err = au_hinode_realloc(iinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ AuDebugOn(iinfo->ii_btop < 0); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++, p++) { -+ if (!p->hi_inode) -+ continue; -+ -+ AuDebugOn(type != (p->hi_inode->i_mode & S_IFMT)); -+ new_bindex = au_br_index(sb, p->hi_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (new_bindex < 0) { -+ *update = 1; -+ au_hiput(p); -+ p->hi_inode = NULL; -+ continue; -+ } -+ -+ if (new_bindex < iinfo->ii_btop) -+ iinfo->ii_btop = new_bindex; -+ if (iinfo->ii_bbot < new_bindex) -+ iinfo->ii_bbot = new_bindex; -+ /* swap two lower inode, and loop again */ -+ q = au_hinode(iinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hi_inode) { -+ bindex--; -+ p--; -+ } -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ au_hinode_realloc(iinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_refresh_iop(struct inode *inode, int force_getattr) -+{ -+ int type; -+ struct au_sbinfo *sbi = au_sbi(inode->i_sb); -+ const struct inode_operations *iop -+ = force_getattr ? aufs_iop : sbi->si_iop_array; -+ -+ if (inode->i_op == iop) -+ return; -+ -+ switch (inode->i_mode & S_IFMT) { -+ case S_IFDIR: -+ type = AuIop_DIR; -+ break; -+ case S_IFLNK: -+ type = AuIop_SYMLINK; -+ break; -+ default: -+ type = AuIop_OTHER; -+ break; -+ } -+ -+ inode->i_op = iop + type; -+ /* unnecessary smp_wmb() */ -+} -+ -+int au_refresh_hinode_self(struct inode *inode) -+{ -+ int err, update; -+ -+ err = au_ii_refresh(inode, &update); -+ if (!err) -+ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry) -+{ -+ int err, e, update; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, bbot; -+ unsigned char isdir; -+ struct au_hinode *p; -+ struct au_iinfo *iinfo; -+ -+ err = au_ii_refresh(inode, &update); -+ if (unlikely(err)) -+ goto out; -+ -+ update = 0; -+ iinfo = au_ii(inode); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ mode = (inode->i_mode & S_IFMT); -+ isdir = S_ISDIR(mode); -+ flags = au_hi_flags(inode, isdir); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ struct inode *h_i, *h_inode; -+ struct dentry *h_d; -+ -+ h_d = au_h_dptr(dentry, bindex); -+ if (!h_d || d_is_negative(h_d)) -+ continue; -+ -+ h_inode = d_inode(h_d); -+ AuDebugOn(mode != (h_inode->i_mode & S_IFMT)); -+ if (iinfo->ii_btop <= bindex && bindex <= iinfo->ii_bbot) { -+ h_i = au_h_iptr(inode, bindex); -+ if (h_i) { -+ if (h_i == h_inode) -+ continue; -+ err = -EIO; -+ break; -+ } -+ } -+ if (bindex < iinfo->ii_btop) -+ iinfo->ii_btop = bindex; -+ if (iinfo->ii_bbot < bindex) -+ iinfo->ii_bbot = bindex; -+ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags); -+ update = 1; -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ if (!err) -+ au_refresh_hinode_attr(inode, update && isdir); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int set_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, btop, btail; -+ unsigned char isdir; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_iinfo *iinfo; -+ const struct inode_operations *iop; -+ -+ IiMustWriteLock(inode); -+ -+ err = 0; -+ isdir = 0; -+ iop = au_sbi(inode->i_sb)->si_iop_array; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ inode->i_fop = &aufs_file_fop; -+ err = au_dy_iaop(inode, btop, h_inode); -+ if (unlikely(err)) -+ goto out; -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ btail = au_dbtaildir(dentry); -+ inode->i_op = iop + AuIop_DIR; -+ inode->i_fop = &aufs_dir_fop; -+ break; -+ case S_IFLNK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_SYMLINK; -+ break; -+ case S_IFBLK: -+ case S_IFCHR: -+ case S_IFIFO: -+ case S_IFSOCK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ init_special_inode(inode, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown file type 0%o\n", mode); -+ err = -EIO; -+ goto out; -+ } -+ -+ /* do not set hnotify for whiteouted dirs (SHWH mode) */ -+ flags = au_hi_flags(inode, isdir); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) -+ && au_ftest_hi(flags, HNOTIFY) -+ && dentry->d_name.len > AUFS_WH_PFX_LEN -+ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) -+ au_fclr_hi(flags, HNOTIFY); -+ iinfo = au_ii(inode); -+ iinfo->ii_btop = btop; -+ iinfo->ii_bbot = btail; -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ au_set_h_iptr(inode, bindex, -+ au_igrab(d_inode(h_dentry)), flags); -+ } -+ au_cpup_attr_all(inode, /*force*/1); -+ /* -+ * to force calling aufs_get_acl() every time, -+ * do not call cache_no_acl() for aufs inode. -+ */ -+ -+out: -+ return err; -+} -+ -+/* -+ * successful returns with iinfo write_locked -+ * minus: errno -+ * zero: success, matched -+ * plus: no error, but unmatched -+ */ -+static int reval_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int gen, igflags; -+ aufs_bindex_t bindex, bbot; -+ struct inode *h_inode, *h_dinode; -+ struct dentry *h_dentry; -+ -+ /* -+ * before this function, if aufs got any iinfo lock, it must be only -+ * one, the parent dir. -+ * it can happen by UDBA and the obsoleted inode number. -+ */ -+ err = -EIO; -+ if (unlikely(inode->i_ino == parent_ino(dentry))) -+ goto out; -+ -+ err = 1; -+ ii_write_lock_new_child(inode); -+ h_dentry = au_h_dptr(dentry, au_dbtop(dentry)); -+ h_dinode = d_inode(h_dentry); -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (!h_inode || h_inode != h_dinode) -+ continue; -+ -+ err = 0; -+ gen = au_iigen(inode, &igflags); -+ if (gen == au_digen(dentry) -+ && !au_ig_ftest(igflags, HALF_REFRESHED)) -+ break; -+ -+ /* fully refresh inode using dentry */ -+ err = au_refresh_hinode(inode, dentry); -+ if (!err) -+ au_update_iigen(inode, /*half*/0); -+ break; -+ } -+ -+ if (unlikely(err)) -+ ii_write_unlock(inode); -+out: -+ return err; -+} -+ -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino) -+{ -+ int err, idx; -+ const int isnondir = d_type != DT_DIR; -+ -+ /* prevent hardlinked inode number from race condition */ -+ if (isnondir) { -+ err = au_xinondir_enter(sb, bindex, h_ino, &idx); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, bindex, h_ino, ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!*ino) { -+ err = -EIO; -+ *ino = au_xino_new_ino(sb); -+ if (unlikely(!*ino)) -+ goto out_xinondir; -+ err = au_xino_write(sb, bindex, h_ino, *ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ } -+ -+out_xinondir: -+ if (isnondir && idx >= 0) -+ au_xinondir_leave(sb, bindex, h_ino, idx); -+out: -+ return err; -+} -+ -+/* successful returns with iinfo write_locked */ -+/* todo: return with unlocked? */ -+struct inode *au_new_inode(struct dentry *dentry, int must_new) -+{ -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ ino_t h_ino, ino; -+ int err, idx, hlinked; -+ aufs_bindex_t btop; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ h_ino = h_inode->i_ino; -+ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; -+ -+new_ino: -+ /* -+ * stop 'race'-ing between hardlinks under different -+ * parents. -+ */ -+ if (hlinked) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, btop, h_ino, &ino); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!ino) { -+ ino = au_xino_new_ino(sb); -+ if (unlikely(!ino)) { -+ inode = ERR_PTR(-EIO); -+ goto out_xinondir; -+ } -+ } -+ -+ AuDbg("i%lu\n", (unsigned long)ino); -+ inode = au_iget_locked(sb, ino); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out_xinondir; -+ -+ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); -+ if (inode->i_state & I_NEW) { -+ ii_write_lock_new_child(inode); -+ err = set_inode(inode, dentry); -+ if (!err) { -+ unlock_new_inode(inode); -+ goto out_xinondir; /* success */ -+ } -+ -+ /* -+ * iget_failed() calls iput(), but we need to call -+ * ii_write_unlock() after iget_failed(). so dirty hack for -+ * i_count. -+ */ -+ atomic_inc(&inode->i_count); -+ iget_failed(inode); -+ ii_write_unlock(inode); -+ au_xino_write(sb, btop, h_ino, /*ino*/0); -+ /* ignore this error */ -+ goto out_iput; -+ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { -+ /* -+ * horrible race condition between lookup, readdir and copyup -+ * (or something). -+ */ -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ err = reval_inode(inode, dentry); -+ if (unlikely(err < 0)) { -+ hlinked = 0; -+ goto out_iput; -+ } -+ if (!err) -+ goto out; /* success */ -+ else if (hlinked && idx >= 0) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ if (unlikely(err)) { -+ iput(inode); -+ inode = ERR_PTR(err); -+ goto out; -+ } -+ } -+ } -+ -+ if (unlikely(au_test_fs_unique_ino(h_inode))) -+ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," -+ " b%d, %s, %pd, hi%lu, i%lu.\n", -+ btop, au_sbtype(h_dentry->d_sb), dentry, -+ (unsigned long)h_ino, (unsigned long)ino); -+ ino = 0; -+ err = au_xino_write(sb, btop, h_ino, /*ino*/0); -+ if (!err) { -+ iput(inode); -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ goto new_ino; -+ } -+ -+out_iput: -+ iput(inode); -+ inode = ERR_PTR(err); -+out_xinondir: -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+out: -+ return inode; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode) -+{ -+ int err; -+ struct inode *hi; -+ -+ err = au_br_rdonly(au_sbr(sb, bindex)); -+ -+ /* pseudo-link after flushed may happen out of bounds */ -+ if (!err -+ && inode -+ && au_ibtop(inode) <= bindex -+ && bindex <= au_ibbot(inode)) { -+ /* -+ * permission check is unnecessary since vfsub routine -+ * will be called later -+ */ -+ hi = au_h_iptr(inode, bindex); -+ if (hi) -+ err = IS_IMMUTABLE(hi) ? -EROFS : 0; -+ } -+ -+ return err; -+} -+ -+int au_test_h_perm(struct inode *h_inode, int mask) -+{ -+ if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) -+ return 0; -+ return inode_permission(h_inode, mask); -+} -+ -+int au_test_h_perm_sio(struct inode *h_inode, int mask) -+{ -+ if (au_test_nfs(h_inode->i_sb) -+ && (mask & MAY_WRITE) -+ && S_ISDIR(h_inode->i_mode)) -+ mask |= MAY_READ; /* force permission check */ -+ return au_test_h_perm(h_inode, mask); -+} -diff --git a/fs/aufs/inode.h b/fs/aufs/inode.h -new file mode 100644 -index 000000000000..7f1992a3ef5c ---- /dev/null -+++ b/fs/aufs/inode.h -@@ -0,0 +1,685 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations -+ */ -+ -+#ifndef __AUFS_INODE_H__ -+#define __AUFS_INODE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "rwsem.h" -+ -+struct vfsmount; -+ -+struct au_hnotify { -+#ifdef CONFIG_AUFS_HNOTIFY -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ /* never use fsnotify_add_vfsmount_mark() */ -+ struct fsnotify_mark hn_mark; -+#endif -+ struct inode *hn_aufs_inode; /* no get/put */ -+ struct rcu_head rcu; -+#endif -+} ____cacheline_aligned_in_smp; -+ -+struct au_hinode { -+ struct inode *hi_inode; -+ aufs_bindex_t hi_id; -+#ifdef CONFIG_AUFS_HNOTIFY -+ struct au_hnotify *hi_notify; -+#endif -+ -+ /* reference to the copied-up whiteout with get/put */ -+ struct dentry *hi_whdentry; -+}; -+ -+/* ig_flags */ -+#define AuIG_HALF_REFRESHED 1 -+#define au_ig_ftest(flags, name) ((flags) & AuIG_##name) -+#define au_ig_fset(flags, name) \ -+ do { (flags) |= AuIG_##name; } while (0) -+#define au_ig_fclr(flags, name) \ -+ do { (flags) &= ~AuIG_##name; } while (0) -+ -+struct au_iigen { -+ spinlock_t ig_spin; -+ __u32 ig_generation, ig_flags; -+}; -+ -+struct au_vdir; -+struct au_iinfo { -+ struct au_iigen ii_generation; -+ struct super_block *ii_hsb1; /* no get/put */ -+ -+ struct au_rwsem ii_rwsem; -+ aufs_bindex_t ii_btop, ii_bbot; -+ __u32 ii_higen; -+ struct au_hinode *ii_hinode; -+ struct au_vdir *ii_vdir; -+}; -+ -+struct au_icntnr { -+ struct au_iinfo iinfo; -+ struct inode vfs_inode; -+ struct hlist_bl_node plink; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* au_pin flags */ -+#define AuPin_DI_LOCKED 1 -+#define AuPin_MNT_WRITE (1 << 1) -+#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) -+#define au_fset_pin(flags, name) \ -+ do { (flags) |= AuPin_##name; } while (0) -+#define au_fclr_pin(flags, name) \ -+ do { (flags) &= ~AuPin_##name; } while (0) -+ -+struct au_pin { -+ /* input */ -+ struct dentry *dentry; -+ unsigned int udba; -+ unsigned char lsc_di, lsc_hi, flags; -+ aufs_bindex_t bindex; -+ -+ /* output */ -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ struct vfsmount *h_mnt; -+ -+ /* temporary unlock/relock for copyup */ -+ struct dentry *h_dentry, *h_parent; -+ struct au_branch *br; -+ struct task_struct *task; -+}; -+ -+void au_pin_hdir_unlock(struct au_pin *p); -+int au_pin_hdir_lock(struct au_pin *p); -+int au_pin_hdir_relock(struct au_pin *p); -+void au_pin_hdir_acquire_nest(struct au_pin *p); -+void au_pin_hdir_release(struct au_pin *p); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_iinfo *au_ii(struct inode *inode) -+{ -+ BUG_ON(is_bad_inode(inode)); -+ return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* inode.c */ -+struct inode *au_igrab(struct inode *inode); -+void au_refresh_iop(struct inode *inode, int force_getattr); -+int au_refresh_hinode_self(struct inode *inode); -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry); -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino); -+struct inode *au_new_inode(struct dentry *dentry, int must_new); -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode); -+int au_test_h_perm(struct inode *h_inode, int mask); -+int au_test_h_perm_sio(struct inode *h_inode, int mask); -+ -+static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, unsigned int d_type, ino_t *ino) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ return au_ino(sb, bindex, h_ino, d_type, ino); -+#else -+ return 0; -+#endif -+} -+ -+/* i_op.c */ -+enum { -+ AuIop_SYMLINK, -+ AuIop_DIR, -+ AuIop_OTHER, -+ AuIop_Last -+}; -+extern struct inode_operations aufs_iop[AuIop_Last], /* not const */ -+ aufs_iop_nogetattr[AuIop_Last]; -+ -+/* au_wr_dir flags */ -+#define AuWrDir_ADD_ENTRY 1 -+#define AuWrDir_ISDIR (1 << 1) -+#define AuWrDir_TMPFILE (1 << 2) -+#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) -+#define au_fset_wrdir(flags, name) \ -+ do { (flags) |= AuWrDir_##name; } while (0) -+#define au_fclr_wrdir(flags, name) \ -+ do { (flags) &= ~AuWrDir_##name; } while (0) -+ -+struct au_wr_dir_args { -+ aufs_bindex_t force_btgt; -+ unsigned char flags; -+}; -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args); -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin); -+void au_pin_init(struct au_pin *pin, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags); -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) __must_check; -+int au_do_pin(struct au_pin *pin) __must_check; -+void au_unpin(struct au_pin *pin); -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen); -+ -+#define AuIcpup_DID_CPUP 1 -+#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) -+#define au_fset_icpup(flags, name) \ -+ do { (flags) |= AuIcpup_##name; } while (0) -+#define au_fclr_icpup(flags, name) \ -+ do { (flags) &= ~AuIcpup_##name; } while (0) -+ -+struct au_icpup_args { -+ unsigned char flags; -+ unsigned char pin_flags; -+ aufs_bindex_t btgt; -+ unsigned int udba; -+ struct au_pin pin; -+ struct path h_path; -+ struct inode *h_inode; -+}; -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a); -+ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked); -+ -+/* i_op_add.c */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, -+ dev_t dev); -+int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname); -+int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, -+ bool want_excl); -+struct vfsub_aopen_args; -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode); -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry); -+int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); -+ -+/* i_op_del.c */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_unlink(struct inode *dir, struct dentry *dentry); -+int aufs_rmdir(struct inode *dir, struct dentry *dentry); -+ -+/* i_op_ren.c */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); -+int aufs_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct dentry *dentry, -+ unsigned int flags); -+ -+/* iinfo.c */ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); -+void au_hiput(struct au_hinode *hinode); -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh); -+unsigned int au_hi_flags(struct inode *inode, int isdir); -+ -+/* hinode flags */ -+#define AuHi_XINO 1 -+#define AuHi_HNOTIFY (1 << 1) -+#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) -+#define au_fset_hi(flags, name) \ -+ do { (flags) |= AuHi_##name; } while (0) -+#define au_fclr_hi(flags, name) \ -+ do { (flags) &= ~AuHi_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuHi_HNOTIFY -+#define AuHi_HNOTIFY 0 -+#endif -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags); -+ -+void au_update_iigen(struct inode *inode, int half); -+void au_update_ibrange(struct inode *inode, int do_put_zero); -+ -+void au_icntnr_init_once(void *_c); -+void au_hinode_init(struct au_hinode *hinode); -+int au_iinfo_init(struct inode *inode); -+void au_iinfo_fin(struct inode *inode); -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink); -+ -+#ifdef CONFIG_PROC_FS -+/* plink.c */ -+int au_plink_maint(struct super_block *sb, int flags); -+struct au_sbinfo; -+void au_plink_maint_leave(struct au_sbinfo *sbinfo); -+int au_plink_maint_enter(struct super_block *sb); -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb); -+#else -+AuStubVoid(au_plink_list, struct super_block *sb) -+#endif -+int au_plink_test(struct inode *inode); -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+void au_plink_put(struct super_block *sb, int verbose); -+void au_plink_clean(struct super_block *sb, int verbose); -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); -+#else -+AuStubInt0(au_plink_maint, struct super_block *sb, int flags); -+AuStubVoid(au_plink_maint_leave, struct au_sbinfo *sbinfo); -+AuStubInt0(au_plink_maint_enter, struct super_block *sb); -+AuStubVoid(au_plink_list, struct super_block *sb); -+AuStubInt0(au_plink_test, struct inode *inode); -+AuStub(struct dentry *, au_plink_lkup, return NULL, -+ struct inode *inode, aufs_bindex_t bindex); -+AuStubVoid(au_plink_append, struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+AuStubVoid(au_plink_put, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_clean, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_half_refresh, struct super_block *sb, aufs_bindex_t br_id); -+#endif /* CONFIG_PROC_FS */ -+ -+#ifdef CONFIG_AUFS_XATTR -+/* xattr.c */ -+int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, -+ unsigned int verbose); -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size); -+void au_xattr_init(struct super_block *sb); -+#else -+AuStubInt0(au_cpup_xattr, struct dentry *h_dst, struct dentry *h_src, -+ int ignore_flags, unsigned int verbose); -+AuStubVoid(au_xattr_init, struct super_block *sb); -+#endif -+ -+#ifdef CONFIG_FS_POSIX_ACL -+struct posix_acl *aufs_get_acl(struct inode *inode, int type); -+int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type); -+#endif -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+enum { -+ AU_XATTR_SET, -+ AU_ACL_SET -+}; -+ -+struct au_sxattr { -+ int type; -+ union { -+ struct { -+ const char *name; -+ const void *value; -+ size_t size; -+ int flags; -+ } set; -+ struct { -+ struct posix_acl *acl; -+ int type; -+ } acl_set; -+ } u; -+}; -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for iinfo */ -+enum { -+ AuLsc_II_CHILD, /* child first */ -+ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_II_CHILD3, /* copyup dirs */ -+ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ -+ AuLsc_II_PARENT2, -+ AuLsc_II_PARENT3, /* copyup dirs */ -+ AuLsc_II_NEW_CHILD -+}; -+ -+/* -+ * ii_read_lock_child, ii_write_lock_child, -+ * ii_read_lock_child2, ii_write_lock_child2, -+ * ii_read_lock_child3, ii_write_lock_child3, -+ * ii_read_lock_parent, ii_write_lock_parent, -+ * ii_read_lock_parent2, ii_write_lock_parent2, -+ * ii_read_lock_parent3, ii_write_lock_parent3, -+ * ii_read_lock_new_child, ii_write_lock_new_child, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void ii_read_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void ii_write_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+AuRWLockFuncs(new_child, NEW_CHILD); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define ii_read_unlock(i) au_rw_read_unlock(&au_ii(i)->ii_rwsem) -+#define ii_write_unlock(i) au_rw_write_unlock(&au_ii(i)->ii_rwsem) -+#define ii_downgrade_lock(i) au_rw_dgrade_lock(&au_ii(i)->ii_rwsem) -+ -+#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) -+#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) -+#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void au_icntnr_init(struct au_icntnr *c) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ c->vfs_inode.i_mode = 0; -+#endif -+} -+ -+static inline unsigned int au_iigen(struct inode *inode, unsigned int *igflags) -+{ -+ unsigned int gen; -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ if (igflags) -+ *igflags = iigen->ig_flags; -+ gen = iigen->ig_generation; -+ spin_unlock(&iigen->ig_spin); -+ -+ return gen; -+} -+ -+/* tiny test for inode number */ -+/* tmpfs generation is too rough */ -+static inline int au_test_higen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = au_ii(inode); -+ AuRwMustAnyLock(&iinfo->ii_rwsem); -+ return !(iinfo->ii_hsb1 == h_inode->i_sb -+ && iinfo->ii_higen == h_inode->i_generation); -+} -+ -+static inline void au_iigen_dec(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation--; -+ spin_unlock(&iigen->ig_spin); -+} -+ -+static inline int au_iigen_test(struct inode *inode, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(inode && au_iigen(inode, NULL) != sigen)) -+ err = -EIO; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_hinode *au_hinode(struct au_iinfo *iinfo, -+ aufs_bindex_t bindex) -+{ -+ return iinfo->ii_hinode + bindex; -+} -+ -+static inline int au_is_bad_inode(struct inode *inode) -+{ -+ return !!(is_bad_inode(inode) || !au_hinode(au_ii(inode), 0)); -+} -+ -+static inline aufs_bindex_t au_ii_br_id(struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_id; -+} -+ -+static inline aufs_bindex_t au_ibtop(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_btop; -+} -+ -+static inline aufs_bindex_t au_ibbot(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_bbot; -+} -+ -+static inline struct au_vdir *au_ivdir(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_vdir; -+} -+ -+static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_whdentry; -+} -+ -+static inline void au_set_ibtop(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_btop = bindex; -+} -+ -+static inline void au_set_ibbot(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_bbot = bindex; -+} -+ -+static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_vdir = vdir; -+} -+ -+static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_pinned_parent(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->parent; -+ return NULL; -+} -+ -+static inline struct inode *au_pinned_h_dir(struct au_pin *pin) -+{ -+ if (pin && pin->hdir) -+ return pin->hdir->hi_inode; -+ return NULL; -+} -+ -+static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->hdir; -+ return NULL; -+} -+ -+static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) -+{ -+ if (pin) -+ pin->dentry = dentry; -+} -+ -+static inline void au_pin_set_parent_lflag(struct au_pin *pin, -+ unsigned char lflag) -+{ -+ if (pin) { -+ if (lflag) -+ au_fset_pin(pin->flags, DI_LOCKED); -+ else -+ au_fclr_pin(pin->flags, DI_LOCKED); -+ } -+} -+ -+#if 0 /* reserved */ -+static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) -+{ -+ if (pin) { -+ dput(pin->parent); -+ pin->parent = dget(parent); -+ } -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+#ifdef CONFIG_AUFS_HNOTIFY -+struct au_hnotify_op { -+ void (*ctl)(struct au_hinode *hinode, int do_set); -+ int (*alloc)(struct au_hinode *hinode); -+ -+ /* -+ * if it returns true, the caller should free hinode->hi_notify, -+ * otherwise ->free() frees it. -+ */ -+ int (*free)(struct au_hinode *hinode, -+ struct au_hnotify *hn) __must_check; -+ -+ void (*fin)(void); -+ int (*init)(void); -+ -+ int (*reset_br)(unsigned int udba, struct au_branch *br, int perm); -+ void (*fin_br)(struct au_branch *br); -+ int (*init_br)(struct au_branch *br, int perm); -+}; -+ -+/* hnotify.c */ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode); -+void au_hn_free(struct au_hinode *hinode); -+void au_hn_ctl(struct au_hinode *hinode, int do_set); -+void au_hn_reset(struct inode *inode, unsigned int flags); -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode); -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm); -+int au_hnotify_init_br(struct au_branch *br, int perm); -+void au_hnotify_fin_br(struct au_branch *br); -+int __init au_hnotify_init(void); -+void au_hnotify_fin(void); -+ -+/* hfsnotify.c */ -+extern const struct au_hnotify_op au_hnotify_op; -+ -+static inline -+void au_hn_init(struct au_hinode *hinode) -+{ -+ hinode->hi_notify = NULL; -+} -+ -+static inline struct au_hnotify *au_hn(struct au_hinode *hinode) -+{ -+ return hinode->hi_notify; -+} -+ -+#else -+AuStub(int, au_hn_alloc, return -EOPNOTSUPP, -+ struct au_hinode *hinode __maybe_unused, -+ struct inode *inode __maybe_unused) -+AuStub(struct au_hnotify *, au_hn, return NULL, struct au_hinode *hinode) -+AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) -+AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, -+ int do_set __maybe_unused) -+AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, -+ unsigned int flags __maybe_unused) -+AuStubInt0(au_hnotify_reset_br, unsigned int udba __maybe_unused, -+ struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubInt0(au_hnotify_init_br, struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubVoid(au_hnotify_fin_br, struct au_branch *br __maybe_unused) -+AuStubInt0(__init au_hnotify_init, void) -+AuStubVoid(au_hnotify_fin, void) -+AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+static inline void au_hn_suspend(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/0); -+} -+ -+static inline void au_hn_resume(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/1); -+} -+ -+static inline void au_hn_inode_lock(struct au_hinode *hdir) -+{ -+ inode_lock(hdir->hi_inode); -+ au_hn_suspend(hdir); -+} -+ -+static inline void au_hn_inode_lock_nested(struct au_hinode *hdir, -+ unsigned int sc __maybe_unused) -+{ -+ inode_lock_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+ -+#if 0 /* unused */ -+#include "vfsub.h" -+static inline void au_hn_inode_lock_shared_nested(struct au_hinode *hdir, -+ unsigned int sc) -+{ -+ inode_lock_shared_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+#endif -+ -+static inline void au_hn_inode_unlock(struct au_hinode *hdir) -+{ -+ au_hn_resume(hdir); -+ inode_unlock(hdir->hi_inode); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_INODE_H__ */ -diff --git a/fs/aufs/ioctl.c b/fs/aufs/ioctl.c -new file mode 100644 -index 000000000000..9d0e969217a9 ---- /dev/null -+++ b/fs/aufs/ioctl.c -@@ -0,0 +1,207 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * ioctl -+ * plink-management and readdir in userspace. -+ * assist the pathconf(3) wrapper library. -+ * move-down -+ * File-based Hierarchical Storage Management. -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static int au_wbr_fd(struct path *path, struct aufs_wbr_fd __user *arg) -+{ -+ int err, fd; -+ aufs_bindex_t wbi, bindex, bbot; -+ struct file *h_file; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_branch *br; -+ struct aufs_wbr_fd wbrfd = { -+ .oflags = au_dir_roflags, -+ .brid = -1 -+ }; -+ const int valid = O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY -+ | O_NOATIME | O_CLOEXEC; -+ -+ AuDebugOn(wbrfd.oflags & ~valid); -+ -+ if (arg) { -+ err = copy_from_user(&wbrfd, arg, sizeof(wbrfd)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ -+ err = -EINVAL; -+ AuDbg("wbrfd{0%o, %d}\n", wbrfd.oflags, wbrfd.brid); -+ wbrfd.oflags |= au_dir_roflags; -+ AuDbg("0%o\n", wbrfd.oflags); -+ if (unlikely(wbrfd.oflags & ~valid)) -+ goto out; -+ } -+ -+ fd = get_unused_fd_flags(0); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out; -+ -+ h_file = ERR_PTR(-EINVAL); -+ wbi = 0; -+ br = NULL; -+ sb = path->dentry->d_sb; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_IR); -+ bbot = au_sbbot(sb); -+ if (wbrfd.brid >= 0) { -+ wbi = au_br_index(sb, wbrfd.brid); -+ if (unlikely(wbi < 0 || wbi > bbot)) -+ goto out_unlock; -+ } -+ -+ h_file = ERR_PTR(-ENOENT); -+ br = au_sbr(sb, wbi); -+ if (!au_br_writable(br->br_perm)) { -+ if (arg) -+ goto out_unlock; -+ -+ bindex = wbi + 1; -+ wbi = -1; -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) { -+ wbi = bindex; -+ br = au_sbr(sb, wbi); -+ break; -+ } -+ } -+ } -+ AuDbg("wbi %d\n", wbi); -+ if (wbi >= 0) -+ h_file = au_h_open(root, wbi, wbrfd.oflags, NULL, -+ /*force_wr*/0); -+ -+out_unlock: -+ aufs_read_unlock(root, AuLock_IR); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_fd; -+ -+ au_lcnt_dec(&br->br_nfiles); /* cf. au_h_open() */ -+ fd_install(fd, h_file); -+ err = fd; -+ goto out; /* success */ -+ -+out_fd: -+ put_unused_fd(fd); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ struct dentry *dentry; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_FHSM_FD: -+ dentry = file->f_path.dentry; -+ if (IS_ROOT(dentry)) -+ err = au_fhsm_fd(dentry->d_sb, arg); -+ else -+ err = -ENOTTY; -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_MVDOWN: -+ err = au_mvdown(file->f_path.dentry, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_compat_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_compat_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_compat_ioctl(file, arg); -+ break; -+ -+ default: -+ err = aufs_ioctl_dir(file, cmd, arg); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); -+} -+#endif -diff --git a/fs/aufs/lcnt.h b/fs/aufs/lcnt.h -new file mode 100644 -index 000000000000..c7db43d9e260 ---- /dev/null -+++ b/fs/aufs/lcnt.h -@@ -0,0 +1,173 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2018-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * simple long counter wrapper -+ */ -+ -+#ifndef __AUFS_LCNT_H__ -+#define __AUFS_LCNT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+#define AuLCntATOMIC 1 -+#define AuLCntPCPUCNT 2 -+/* -+ * why does percpu_refcount require extra synchronize_rcu()s in -+ * au_br_do_free() -+ */ -+#define AuLCntPCPUREF 3 -+ -+/* #define AuLCntChosen AuLCntATOMIC */ -+#define AuLCntChosen AuLCntPCPUCNT -+/* #define AuLCntChosen AuLCntPCPUREF */ -+ -+#if AuLCntChosen == AuLCntATOMIC -+#include -+ -+typedef atomic_long_t au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ atomic_long_set(cnt, 0); -+ return 0; -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt __maybe_unused, -+ int do_sync __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ atomic_long_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ atomic_long_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ return atomic_long_read(cnt); -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUCNT -+#include -+ -+typedef struct percpu_counter au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ return percpu_counter_init(cnt, 0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync __maybe_unused) -+{ -+ percpu_counter_destroy(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_counter_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_counter_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ s64 n; -+ -+ n = percpu_counter_sum(cnt); -+ BUG_ON(n < 0); -+ if (LONG_MAX != LLONG_MAX -+ && n > LONG_MAX) -+ AuWarn1("%s\n", "wrap-around"); -+ -+ return n; -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUREF -+#include -+ -+typedef struct percpu_ref au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, percpu_ref_func_t *release) -+{ -+ if (!release) -+ release = percpu_ref_exit; -+ return percpu_ref_init(cnt, release, /*percpu mode*/0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ synchronize_rcu(); -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync) -+{ -+ percpu_ref_kill(cnt); -+ if (do_sync) -+ au_lcnt_wait_for_fin(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_ref_get(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_ref_put(cnt); -+} -+ -+/* -+ * avoid calling this func as possible. -+ */ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev) -+{ -+ long l; -+ -+ percpu_ref_switch_to_atomic_sync(cnt); -+ l = atomic_long_read(&cnt->count); -+ if (do_rev) -+ percpu_ref_switch_to_percpu(cnt); -+ -+ /* percpu_ref is initialized by 1 instead of 0 */ -+ return l - 1; -+} -+#endif -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuLCntZero(val) do { \ -+ long l = val; \ -+ if (l) \ -+ AuDbg("%s = %ld\n", #val, l); \ -+} while (0) -+#else -+#define AuLCntZero(val) do {} while (0) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LCNT_H__ */ -diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c -new file mode 100644 -index 000000000000..a8b63acc6204 ---- /dev/null -+++ b/fs/aufs/loop.c -@@ -0,0 +1,135 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * support for loopback block device as a branch -+ */ -+ -+#include "aufs.h" -+ -+/* added into drivers/block/loop.c */ -+static struct file *(*backing_file_func)(struct super_block *sb); -+ -+/* -+ * test if two lower dentries have overlapping branches. -+ */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding) -+{ -+ struct super_block *h_sb; -+ struct file *backing_file; -+ -+ if (unlikely(!backing_file_func)) { -+ /* don't load "loop" module here */ -+ backing_file_func = symbol_get(loop_backing_file); -+ if (unlikely(!backing_file_func)) -+ /* "loop" module is not loaded */ -+ return 0; -+ } -+ -+ h_sb = h_adding->d_sb; -+ backing_file = backing_file_func(h_sb); -+ if (!backing_file) -+ return 0; -+ -+ h_adding = backing_file->f_path.dentry; -+ /* -+ * h_adding can be local NFS. -+ * in this case aufs cannot detect the loop. -+ */ -+ if (unlikely(h_adding->d_sb == sb)) -+ return 1; -+ return !!au_test_subdir(h_adding, sb->s_root); -+} -+ -+/* true if a kernel thread named 'loop[0-9].*' accesses a file */ -+int au_test_loopback_kthread(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char c, comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ c = comm[4]; -+ ret = ('0' <= c && c <= '9' -+ && !strncmp(comm, "loop", 4)); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define au_warn_loopback_step 16 -+static int au_warn_loopback_nelem = au_warn_loopback_step; -+static unsigned long *au_warn_loopback_array; -+ -+void au_warn_loopback(struct super_block *h_sb) -+{ -+ int i, new_nelem; -+ unsigned long *a, magic; -+ static DEFINE_SPINLOCK(spin); -+ -+ magic = h_sb->s_magic; -+ spin_lock(&spin); -+ a = au_warn_loopback_array; -+ for (i = 0; i < au_warn_loopback_nelem && *a; i++) -+ if (a[i] == magic) { -+ spin_unlock(&spin); -+ return; -+ } -+ -+ /* h_sb is new to us, print it */ -+ if (i < au_warn_loopback_nelem) { -+ a[i] = magic; -+ goto pr; -+ } -+ -+ /* expand the array */ -+ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; -+ a = au_kzrealloc(au_warn_loopback_array, -+ au_warn_loopback_nelem * sizeof(unsigned long), -+ new_nelem * sizeof(unsigned long), GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (a) { -+ au_warn_loopback_nelem = new_nelem; -+ au_warn_loopback_array = a; -+ a[i] = magic; -+ goto pr; -+ } -+ -+ spin_unlock(&spin); -+ AuWarn1("realloc failed, ignored\n"); -+ return; -+ -+pr: -+ spin_unlock(&spin); -+ pr_warn("you may want to try another patch for loopback file " -+ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); -+} -+ -+int au_loopback_init(void) -+{ -+ int err; -+ struct super_block *sb __maybe_unused; -+ -+ BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(*au_warn_loopback_array)); -+ -+ err = 0; -+ au_warn_loopback_array = kcalloc(au_warn_loopback_step, -+ sizeof(unsigned long), GFP_NOFS); -+ if (unlikely(!au_warn_loopback_array)) -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_loopback_fin(void) -+{ -+ if (backing_file_func) -+ symbol_put(loop_backing_file); -+ au_kfree_try_rcu(au_warn_loopback_array); -+} -diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h -new file mode 100644 -index 000000000000..94f4f80ae33b ---- /dev/null -+++ b/fs/aufs/loop.h -@@ -0,0 +1,42 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * support for loopback mount as a branch -+ */ -+ -+#ifndef __AUFS_LOOP_H__ -+#define __AUFS_LOOP_H__ -+ -+#ifdef __KERNEL__ -+ -+struct dentry; -+struct super_block; -+ -+#ifdef CONFIG_AUFS_BDEV_LOOP -+/* drivers/block/loop.c */ -+struct file *loop_backing_file(struct super_block *sb); -+ -+/* loop.c */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding); -+int au_test_loopback_kthread(void); -+void au_warn_loopback(struct super_block *h_sb); -+ -+int au_loopback_init(void); -+void au_loopback_fin(void); -+#else -+AuStub(struct file *, loop_backing_file, return NULL, struct super_block *sb) -+ -+AuStubInt0(au_test_loopback_overlap, struct super_block *sb, -+ struct dentry *h_adding) -+AuStubInt0(au_test_loopback_kthread, void) -+AuStubVoid(au_warn_loopback, struct super_block *h_sb) -+ -+AuStubInt0(au_loopback_init, void) -+AuStubVoid(au_loopback_fin, void) -+#endif /* BLK_DEV_LOOP */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LOOP_H__ */ -diff --git a/fs/aufs/magic.mk b/fs/aufs/magic.mk -new file mode 100644 -index 000000000000..7bc9eef3ffec ---- /dev/null -+++ b/fs/aufs/magic.mk -@@ -0,0 +1,31 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+# defined in ${srctree}/fs/fuse/inode.c -+# tristate -+ifdef CONFIG_FUSE_FS -+ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 -+endif -+ -+# defined in ${srctree}/fs/xfs/xfs_sb.h -+# tristate -+ifdef CONFIG_XFS_FS -+ccflags-y += -DXFS_SB_MAGIC=0x58465342 -+endif -+ -+# defined in ${srctree}/fs/configfs/mount.c -+# tristate -+ifdef CONFIG_CONFIGFS_FS -+ccflags-y += -DCONFIGFS_MAGIC=0x62656570 -+endif -+ -+# defined in ${srctree}/fs/ubifs/ubifs.h -+# tristate -+ifdef CONFIG_UBIFS_FS -+ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 -+endif -+ -+# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h -+# tristate -+ifdef CONFIG_HFSPLUS_FS -+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b -+endif -diff --git a/fs/aufs/module.c b/fs/aufs/module.c -new file mode 100644 -index 000000000000..18039801580f ---- /dev/null -+++ b/fs/aufs/module.c -@@ -0,0 +1,259 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * module global variables and operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* shrinkable realloc */ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink) -+{ -+ size_t sz; -+ int diff; -+ -+ sz = 0; -+ diff = -1; -+ if (p) { -+#if 0 /* unused */ -+ if (!new_sz) { -+ au_kfree_rcu(p); -+ p = NULL; -+ goto out; -+ } -+#else -+ AuDebugOn(!new_sz); -+#endif -+ sz = ksize(p); -+ diff = au_kmidx_sub(sz, new_sz); -+ } -+ if (sz && !diff) -+ goto out; -+ -+ if (sz < new_sz) -+ /* expand or SLOB */ -+ p = krealloc(p, new_sz, gfp); -+ else if (new_sz < sz && may_shrink) { -+ /* shrink */ -+ void *q; -+ -+ q = kmalloc(new_sz, gfp); -+ if (q) { -+ if (p) { -+ memcpy(q, p, new_sz); -+ au_kfree_try_rcu(p); -+ } -+ p = q; -+ } else -+ p = NULL; -+ } -+ -+out: -+ return p; -+} -+ -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink) -+{ -+ p = au_krealloc(p, new_sz, gfp, may_shrink); -+ if (p && new_sz > nused) -+ memset(p + nused, 0, new_sz - nused); -+ return p; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * aufs caches -+ */ -+struct kmem_cache *au_cache[AuCache_Last]; -+ -+static void au_cache_fin(void) -+{ -+ int i; -+ -+ /* -+ * Make sure all delayed rcu free inodes are flushed before we -+ * destroy cache. -+ */ -+ rcu_barrier(); -+ -+ /* excluding AuCache_HNOTIFY */ -+ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last); -+ for (i = 0; i < AuCache_HNOTIFY; i++) { -+ kmem_cache_destroy(au_cache[i]); -+ au_cache[i] = NULL; -+ } -+} -+ -+static int __init au_cache_init(void) -+{ -+ au_cache[AuCache_DINFO] = AuCacheCtor(au_dinfo, au_di_init_once); -+ if (au_cache[AuCache_DINFO]) -+ /* SLAB_DESTROY_BY_RCU */ -+ au_cache[AuCache_ICNTNR] = AuCacheCtor(au_icntnr, -+ au_icntnr_init_once); -+ if (au_cache[AuCache_ICNTNR]) -+ au_cache[AuCache_FINFO] = AuCacheCtor(au_finfo, -+ au_fi_init_once); -+ if (au_cache[AuCache_FINFO]) -+ au_cache[AuCache_VDIR] = AuCache(au_vdir); -+ if (au_cache[AuCache_VDIR]) -+ au_cache[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); -+ if (au_cache[AuCache_DEHSTR]) -+ return 0; -+ -+ au_cache_fin(); -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dir_roflags; -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* -+ * iterate_supers_type() doesn't protect us from -+ * remounting (branch management) -+ */ -+struct hlist_bl_head au_sbilist; -+#endif -+ -+/* -+ * functions for module interface. -+ */ -+MODULE_LICENSE("GPL"); -+/* MODULE_LICENSE("GPL v2"); */ -+MODULE_AUTHOR("Junjiro R. Okajima "); -+MODULE_DESCRIPTION(AUFS_NAME -+ " -- Advanced multi layered unification filesystem"); -+MODULE_VERSION(AUFS_VERSION); -+ -+/* this module parameter has no meaning when SYSFS is disabled */ -+int sysaufs_brs = 1; -+MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); -+module_param_named(brs, sysaufs_brs, int, 0444); -+ -+/* this module parameter has no meaning when USER_NS is disabled */ -+bool au_userns; -+MODULE_PARM_DESC(allow_userns, "allow unprivileged to mount under userns"); -+module_param_named(allow_userns, au_userns, bool, 0444); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ -+ -+int au_seq_path(struct seq_file *seq, struct path *path) -+{ -+ int err; -+ -+ err = seq_path(seq, path, au_esc_chars); -+ if (err >= 0) -+ err = 0; -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init aufs_init(void) -+{ -+ int err, i; -+ char *p; -+ -+ p = au_esc_chars; -+ for (i = 1; i <= ' '; i++) -+ *p++ = i; -+ *p++ = '\\'; -+ *p++ = '\x7f'; -+ *p = 0; -+ -+ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); -+ -+ memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop)); -+ for (i = 0; i < AuIop_Last; i++) -+ aufs_iop_nogetattr[i].getattr = NULL; -+ -+ memset(au_cache, 0, sizeof(au_cache)); /* including hnotify */ -+ -+ au_sbilist_init(); -+ sysaufs_brs_init(); -+ au_debug_init(); -+ au_dy_init(); -+ err = sysaufs_init(); -+ if (unlikely(err)) -+ goto out; -+ err = dbgaufs_init(); -+ if (unlikely(err)) -+ goto out_sysaufs; -+ err = au_procfs_init(); -+ if (unlikely(err)) -+ goto out_dbgaufs; -+ err = au_wkq_init(); -+ if (unlikely(err)) -+ goto out_procfs; -+ err = au_loopback_init(); -+ if (unlikely(err)) -+ goto out_wkq; -+ err = au_hnotify_init(); -+ if (unlikely(err)) -+ goto out_loopback; -+ err = au_sysrq_init(); -+ if (unlikely(err)) -+ goto out_hin; -+ err = au_cache_init(); -+ if (unlikely(err)) -+ goto out_sysrq; -+ -+ aufs_fs_type.fs_flags |= au_userns ? FS_USERNS_MOUNT : 0; -+ err = register_filesystem(&aufs_fs_type); -+ if (unlikely(err)) -+ goto out_cache; -+ -+ /* since we define pr_fmt, call printk directly */ -+ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); -+ goto out; /* success */ -+ -+out_cache: -+ au_cache_fin(); -+out_sysrq: -+ au_sysrq_fin(); -+out_hin: -+ au_hnotify_fin(); -+out_loopback: -+ au_loopback_fin(); -+out_wkq: -+ au_wkq_fin(); -+out_procfs: -+ au_procfs_fin(); -+out_dbgaufs: -+ dbgaufs_fin(); -+out_sysaufs: -+ sysaufs_fin(); -+ au_dy_fin(); -+out: -+ return err; -+} -+ -+static void __exit aufs_exit(void) -+{ -+ unregister_filesystem(&aufs_fs_type); -+ au_cache_fin(); -+ au_sysrq_fin(); -+ au_hnotify_fin(); -+ au_loopback_fin(); -+ au_wkq_fin(); -+ au_procfs_fin(); -+ dbgaufs_fin(); -+ sysaufs_fin(); -+ au_dy_fin(); -+} -+ -+module_init(aufs_init); -+module_exit(aufs_exit); -diff --git a/fs/aufs/module.h b/fs/aufs/module.h -new file mode 100644 -index 000000000000..cf4679c65542 ---- /dev/null -+++ b/fs/aufs/module.h -@@ -0,0 +1,153 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * module initialization and module-global -+ */ -+ -+#ifndef __AUFS_MODULE_H__ -+#define __AUFS_MODULE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "debug.h" -+#include "dentry.h" -+#include "dir.h" -+#include "file.h" -+#include "inode.h" -+ -+struct path; -+struct seq_file; -+ -+/* module parameters */ -+extern int sysaufs_brs; -+extern bool au_userns; -+ -+/* ---------------------------------------------------------------------- */ -+ -+extern int au_dir_roflags; -+ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink); -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink); -+ -+/* -+ * Comparing the size of the object with sizeof(struct rcu_head) -+ * case 1: object is always larger -+ * --> au_kfree_rcu() or au_kfree_do_rcu() -+ * case 2: object is always smaller -+ * --> au_kfree_small() -+ * case 3: object can be any size -+ * --> au_kfree_try_rcu() -+ */ -+ -+static inline void au_kfree_do_rcu(const void *p) -+{ -+ struct { -+ struct rcu_head rcu; -+ } *a = (void *)p; -+ -+ kfree_rcu(a, rcu); -+} -+ -+#define au_kfree_rcu(_p) do { \ -+ typeof(_p) p = (_p); \ -+ BUILD_BUG_ON(sizeof(*p) < sizeof(struct rcu_head)); \ -+ if (p) \ -+ au_kfree_do_rcu(p); \ -+ } while (0) -+ -+#define au_kfree_do_sz_test(sz) (sz >= sizeof(struct rcu_head)) -+#define au_kfree_sz_test(p) (p && au_kfree_do_sz_test(ksize(p))) -+ -+static inline void au_kfree_try_rcu(const void *p) -+{ -+ if (!p) -+ return; -+ if (au_kfree_sz_test(p)) -+ au_kfree_do_rcu(p); -+ else -+ kfree(p); -+} -+ -+static inline void au_kfree_small(const void *p) -+{ -+ if (!p) -+ return; -+ AuDebugOn(au_kfree_sz_test(p)); -+ kfree(p); -+} -+ -+static inline int au_kmidx_sub(size_t sz, size_t new_sz) -+{ -+#ifndef CONFIG_SLOB -+ return kmalloc_index(sz) - kmalloc_index(new_sz); -+#else -+ return -1; /* SLOB is untested */ -+#endif -+} -+ -+int au_seq_path(struct seq_file *seq, struct path *path); -+ -+#ifdef CONFIG_PROC_FS -+/* procfs.c */ -+int __init au_procfs_init(void); -+void au_procfs_fin(void); -+#else -+AuStubInt0(au_procfs_init, void); -+AuStubVoid(au_procfs_fin, void); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* kmem cache */ -+enum { -+ AuCache_DINFO, -+ AuCache_ICNTNR, -+ AuCache_FINFO, -+ AuCache_VDIR, -+ AuCache_DEHSTR, -+ AuCache_HNOTIFY, /* must be last */ -+ AuCache_Last -+}; -+ -+extern struct kmem_cache *au_cache[AuCache_Last]; -+ -+#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) -+#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) -+#define AuCacheCtor(type, ctor) \ -+ kmem_cache_create(#type, sizeof(struct type), \ -+ __alignof__(struct type), AuCacheFlags, ctor) -+ -+#define AuCacheFuncs(name, index) \ -+ static inline struct au_##name *au_cache_alloc_##name(void) \ -+ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ -+ static inline void au_cache_free_##name##_norcu(struct au_##name *p) \ -+ { kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ \ -+ static inline void au_cache_free_##name##_rcu_cb(struct rcu_head *rcu) \ -+ { void *p = rcu; \ -+ p -= offsetof(struct au_##name, rcu); \ -+ kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ static inline void au_cache_free_##name##_rcu(struct au_##name *p) \ -+ { BUILD_BUG_ON(sizeof(struct au_##name) < sizeof(struct rcu_head)); \ -+ call_rcu(&p->rcu, au_cache_free_##name##_rcu_cb); } \ -+ \ -+ static inline void au_cache_free_##name(struct au_##name *p) \ -+ { /* au_cache_free_##name##_norcu(p); */ \ -+ au_cache_free_##name##_rcu(p); } -+ -+AuCacheFuncs(dinfo, DINFO); -+AuCacheFuncs(icntnr, ICNTNR); -+AuCacheFuncs(finfo, FINFO); -+AuCacheFuncs(vdir, VDIR); -+AuCacheFuncs(vdir_dehstr, DEHSTR); -+#ifdef CONFIG_AUFS_HNOTIFY -+AuCacheFuncs(hnotify, HNOTIFY); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_MODULE_H__ */ -diff --git a/fs/aufs/mvdown.c b/fs/aufs/mvdown.c -new file mode 100644 -index 000000000000..d28a33f4a944 ---- /dev/null -+++ b/fs/aufs/mvdown.c -@@ -0,0 +1,693 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * move-down, opposite of copy-up -+ */ -+ -+#include "aufs.h" -+ -+struct au_mvd_args { -+ struct { -+ struct super_block *h_sb; -+ struct dentry *h_parent; -+ struct au_hinode *hdir; -+ struct inode *h_dir, *h_inode; -+ struct au_pin pin; -+ } info[AUFS_MVDOWN_NARRAY]; -+ -+ struct aufs_mvdown mvdown; -+ struct dentry *dentry, *parent; -+ struct inode *inode, *dir; -+ struct super_block *sb; -+ aufs_bindex_t bopq, bwh, bfound; -+ unsigned char rename_lock; -+}; -+ -+#define mvd_errno mvdown.au_errno -+#define mvd_bsrc mvdown.stbr[AUFS_MVDOWN_UPPER].bindex -+#define mvd_src_brid mvdown.stbr[AUFS_MVDOWN_UPPER].brid -+#define mvd_bdst mvdown.stbr[AUFS_MVDOWN_LOWER].bindex -+#define mvd_dst_brid mvdown.stbr[AUFS_MVDOWN_LOWER].brid -+ -+#define mvd_h_src_sb info[AUFS_MVDOWN_UPPER].h_sb -+#define mvd_h_src_parent info[AUFS_MVDOWN_UPPER].h_parent -+#define mvd_hdir_src info[AUFS_MVDOWN_UPPER].hdir -+#define mvd_h_src_dir info[AUFS_MVDOWN_UPPER].h_dir -+#define mvd_h_src_inode info[AUFS_MVDOWN_UPPER].h_inode -+#define mvd_pin_src info[AUFS_MVDOWN_UPPER].pin -+ -+#define mvd_h_dst_sb info[AUFS_MVDOWN_LOWER].h_sb -+#define mvd_h_dst_parent info[AUFS_MVDOWN_LOWER].h_parent -+#define mvd_hdir_dst info[AUFS_MVDOWN_LOWER].hdir -+#define mvd_h_dst_dir info[AUFS_MVDOWN_LOWER].h_dir -+#define mvd_h_dst_inode info[AUFS_MVDOWN_LOWER].h_inode -+#define mvd_pin_dst info[AUFS_MVDOWN_LOWER].pin -+ -+#define AU_MVD_PR(flag, ...) do { \ -+ if (flag) \ -+ pr_err(__VA_ARGS__); \ -+ } while (0) -+ -+static int find_lower_writable(struct au_mvd_args *a) -+{ -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ sb = a->sb; -+ bindex = a->mvd_bsrc; -+ bbot = au_sbbot(sb); -+ if (a->mvdown.flags & AUFS_MVDOWN_FHSM_LOWER) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm) -+ && !sb_rdonly(au_br_sb(br))) -+ return bindex; -+ } -+ else if (!(a->mvdown.flags & AUFS_MVDOWN_ROLOWER)) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br)) -+ return bindex; -+ } -+ else -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!sb_rdonly(au_br_sb(br))) { -+ if (au_br_rdonly(br)) -+ a->mvdown.flags -+ |= AUFS_MVDOWN_ROLOWER_R; -+ return bindex; -+ } -+ } -+ -+ return -1; -+} -+ -+/* make the parent dir on bdst */ -+static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc); -+ a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst); -+ a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc); -+ a->mvd_h_dst_parent = NULL; -+ if (au_dbbot(a->parent) >= a->mvd_bdst) -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ if (!a->mvd_h_dst_parent) { -+ err = au_cpdown_dirs(a->dentry, a->mvd_bdst); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "cpdown_dirs failed\n"); -+ goto out; -+ } -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* lock them all */ -+static int au_do_lock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct dentry *h_trap; -+ -+ a->mvd_h_src_sb = au_sbr_sb(a->sb, a->mvd_bsrc); -+ a->mvd_h_dst_sb = au_sbr_sb(a->sb, a->mvd_bdst); -+ err = au_pin(&a->mvd_pin_dst, a->dentry, a->mvd_bdst, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_dst failed\n"); -+ goto out; -+ } -+ -+ if (a->mvd_h_src_sb != a->mvd_h_dst_sb) { -+ a->rename_lock = 0; -+ au_pin_init(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ AuLsc_DI_PARENT, AuLsc_I_PARENT3, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ err = au_do_pin(&a->mvd_pin_src); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ } -+ -+ a->rename_lock = 1; -+ au_pin_hdir_unlock(&a->mvd_pin_dst); -+ err = au_pin(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ au_pin_hdir_unlock(&a->mvd_pin_src); -+ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ if (h_trap) { -+ err = (h_trap != a->mvd_h_src_parent); -+ if (err) -+ err = (h_trap != a->mvd_h_dst_parent); -+ } -+ BUG_ON(err); /* it should never happen */ -+ if (unlikely(a->mvd_h_src_dir != au_pinned_h_dir(&a->mvd_pin_src))) { -+ err = -EBUSY; -+ AuTraceErr(err); -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ -+out_dst: -+ au_unpin(&a->mvd_pin_dst); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_do_unlock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ if (!a->rename_lock) -+ au_unpin(&a->mvd_pin_src); -+ else { -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ } -+ au_unpin(&a->mvd_pin_dst); -+} -+ -+/* copy-down the file */ -+static int au_do_cpdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_cp_generic cpg = { -+ .dentry = a->dentry, -+ .bdst = a->mvd_bdst, -+ .bsrc = a->mvd_bsrc, -+ .len = -1, -+ .pin = &a->mvd_pin_dst, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ -+ AuDbg("b%d, b%d\n", cpg.bsrc, cpg.bdst); -+ if (a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ au_fset_cpup(cpg.flags, OVERWRITE); -+ if (a->mvdown.flags & AUFS_MVDOWN_ROLOWER) -+ au_fset_cpup(cpg.flags, RWDST); -+ err = au_sio_cpdown_simple(&cpg); -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "cpdown failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the whiteout on bdst if exist which may be created by UDBA while we -+ * were sleeping -+ */ -+static int au_do_unlink_wh(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ struct inode *delegated; -+ -+ br = au_sbr(a->sb, a->mvd_bdst); -+ h_path.dentry = au_wh_lkup(a->mvd_h_dst_parent, &a->dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) { -+ AU_MVD_PR(dmsg, "wh_lkup failed\n"); -+ goto out; -+ } -+ -+ err = 0; -+ if (d_is_positive(h_path.dentry)) { -+ h_path.mnt = au_br_mnt(br); -+ delegated = NULL; -+ err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path, -+ &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "wh_unlink failed\n"); -+ } -+ dput(h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the topmost h_dentry -+ */ -+static int au_do_unlink(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct path h_path; -+ struct inode *delegated; -+ -+ h_path.mnt = au_sbr_mnt(a->sb, a->mvd_bsrc); -+ h_path.dentry = au_h_dptr(a->dentry, a->mvd_bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "unlink failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* Since mvdown succeeded, we ignore an error of this function */ -+static void au_do_stfs(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ a->mvdown.flags |= AUFS_MVDOWN_STFS_FAILED; -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_UPPER].stfs); -+ if (!err) { -+ br = au_sbr(a->sb, a->mvd_bdst); -+ a->mvdown.stbr[AUFS_MVDOWN_LOWER].brid = br->br_id; -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_LOWER].stfs); -+ } -+ if (!err) -+ a->mvdown.flags &= ~AUFS_MVDOWN_STFS_FAILED; -+ else -+ AU_MVD_PR(dmsg, "statfs failed (%d), ignored\n", err); -+} -+ -+/* -+ * copy-down the file and unlink the bsrc file. -+ * - unlink the bdst whout if exist -+ * - copy-down the file (with whtmp name and rename) -+ * - unlink the bsrc file -+ */ -+static int au_do_mvdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = au_do_mkdir(dmsg, a); -+ if (!err) -+ err = au_do_lock(dmsg, a); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * do not revert the activities we made on bdst since they should be -+ * harmless in aufs. -+ */ -+ -+ err = au_do_cpdown(dmsg, a); -+ if (!err) -+ err = au_do_unlink_wh(dmsg, a); -+ if (!err && !(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ err = au_do_unlink(dmsg, a); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ AuDbg("%pd2, 0x%x, %d --> %d\n", -+ a->dentry, a->mvdown.flags, a->mvd_bsrc, a->mvd_bdst); -+ if (find_lower_writable(a) < 0) -+ a->mvdown.flags |= AUFS_MVDOWN_BOTTOM; -+ -+ if (a->mvdown.flags & AUFS_MVDOWN_STFS) -+ au_do_stfs(dmsg, a); -+ -+ /* maintain internal array */ -+ if (!(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) { -+ au_set_h_dptr(a->dentry, a->mvd_bsrc, NULL); -+ au_set_dbtop(a->dentry, a->mvd_bdst); -+ au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0); -+ au_set_ibtop(a->inode, a->mvd_bdst); -+ } else { -+ /* hide the lower */ -+ au_set_h_dptr(a->dentry, a->mvd_bdst, NULL); -+ au_set_dbbot(a->dentry, a->mvd_bsrc); -+ au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0); -+ au_set_ibbot(a->inode, a->mvd_bsrc); -+ } -+ if (au_dbbot(a->dentry) < a->mvd_bdst) -+ au_set_dbbot(a->dentry, a->mvd_bdst); -+ if (au_ibbot(a->inode) < a->mvd_bdst) -+ au_set_ibbot(a->inode, a->mvd_bdst); -+ -+out_unlock: -+ au_do_unlock(dmsg, a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* make sure the file is idle */ -+static int au_mvd_args_busy(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err, plinked; -+ -+ err = 0; -+ plinked = !!au_opt_test(au_mntflags(a->sb), PLINK); -+ if (au_dbtop(a->dentry) == a->mvd_bsrc -+ && au_dcount(a->dentry) == 1 -+ && atomic_read(&a->inode->i_count) == 1 -+ /* && a->mvd_h_src_inode->i_nlink == 1 */ -+ && (!plinked || !au_plink_test(a->inode)) -+ && a->inode->i_nlink == 1) -+ goto out; -+ -+ err = -EBUSY; -+ AU_MVD_PR(dmsg, -+ "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", -+ a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), -+ atomic_read(&a->inode->i_count), a->inode->i_nlink, -+ a->mvd_h_src_inode->i_nlink, -+ plinked, plinked ? au_plink_test(a->inode) : 0); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* make sure the parent dir is fine */ -+static int au_mvd_args_parent(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ if (unlikely(au_alive_dir(a->parent))) { -+ err = -ENOENT; -+ AU_MVD_PR(dmsg, "parent dir is dead\n"); -+ goto out; -+ } -+ -+ a->bopq = au_dbdiropq(a->parent); -+ bindex = au_wbr_nonopq(a->dentry, a->mvd_bdst); -+ AuDbg("b%d\n", bindex); -+ if (unlikely((bindex >= 0 && bindex < a->mvd_bdst) -+ || (a->bopq != -1 && a->bopq < a->mvd_bdst))) { -+ err = -EINVAL; -+ a->mvd_errno = EAU_MVDOWN_OPAQUE; -+ AU_MVD_PR(dmsg, "ancestor is opaque b%d, b%d\n", -+ a->bopq, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_intermediate(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ struct au_dinfo *dinfo, *tmp; -+ -+ /* lookup the next lower positive entry */ -+ err = -ENOMEM; -+ tmp = au_di_alloc(a->sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ -+ a->bfound = -1; -+ a->bwh = -1; -+ dinfo = au_di(a->dentry); -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ -+ /* returns the number of positive dentries */ -+ err = au_lkup_dentry(a->dentry, a->mvd_bsrc + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ if (!err) -+ a->bwh = au_dbwh(a->dentry); -+ else if (err > 0) -+ a->bfound = au_dbtop(a->dentry); -+ -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err < 0)) -+ AU_MVD_PR(dmsg, "failed look-up lower\n"); -+ -+ /* -+ * here, we have these cases. -+ * bfound == -1 -+ * no positive dentry under bsrc. there are more sub-cases. -+ * bwh < 0 -+ * there no whiteout, we can safely move-down. -+ * bwh <= bsrc -+ * impossible -+ * bsrc < bwh && bwh < bdst -+ * there is a whiteout on RO branch. cannot proceed. -+ * bwh == bdst -+ * there is a whiteout on the RW target branch. it should -+ * be removed. -+ * bdst < bwh -+ * there is a whiteout somewhere unrelated branch. -+ * -1 < bfound && bfound <= bsrc -+ * impossible. -+ * bfound < bdst -+ * found, but it is on RO branch between bsrc and bdst. cannot -+ * proceed. -+ * bfound == bdst -+ * found, replace it if AUFS_MVDOWN_FORCE is set. otherwise return -+ * error. -+ * bdst < bfound -+ * found, after we create the file on bdst, it will be hidden. -+ */ -+ -+ AuDebugOn(a->bfound == -1 -+ && a->bwh != -1 -+ && a->bwh <= a->mvd_bsrc); -+ AuDebugOn(-1 < a->bfound -+ && a->bfound <= a->mvd_bsrc); -+ -+ err = -EINVAL; -+ if (a->bfound == -1 -+ && a->mvd_bsrc < a->bwh -+ && a->bwh != -1 -+ && a->bwh < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_WHITEOUT; -+ AU_MVD_PR(dmsg, "bsrc %d, bdst %d, bfound %d, bwh %d\n", -+ a->mvd_bsrc, a->mvd_bdst, a->bfound, a->bwh); -+ goto out; -+ } else if (a->bfound != -1 && a->bfound < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_UPPER; -+ AU_MVD_PR(dmsg, "bdst %d, bfound %d\n", -+ a->mvd_bdst, a->bfound); -+ goto out; -+ } -+ -+ err = 0; /* success */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_exist(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ && a->bfound == a->mvd_bdst) -+ err = -EEXIST; -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(a->inode->i_mode))) -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_UPPER)) -+ a->mvd_bsrc = au_ibtop(a->inode); -+ else { -+ a->mvd_bsrc = au_br_index(a->sb, a->mvd_src_brid); -+ if (unlikely(a->mvd_bsrc < 0 -+ || (a->mvd_bsrc < au_dbtop(a->dentry) -+ || au_dbbot(a->dentry) < a->mvd_bsrc -+ || !au_h_dptr(a->dentry, a->mvd_bsrc)) -+ || (a->mvd_bsrc < au_ibtop(a->inode) -+ || au_ibbot(a->inode) < a->mvd_bsrc -+ || !au_h_iptr(a->inode, a->mvd_bsrc)))) { -+ a->mvd_errno = EAU_MVDOWN_NOUPPER; -+ AU_MVD_PR(dmsg, "no upper\n"); -+ goto out; -+ } -+ } -+ if (unlikely(a->mvd_bsrc == au_sbbot(a->sb))) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "on the bottom\n"); -+ goto out; -+ } -+ a->mvd_h_src_inode = au_h_iptr(a->inode, a->mvd_bsrc); -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_rdonly(br); -+ if (!(a->mvdown.flags & AUFS_MVDOWN_ROUPPER)) { -+ if (unlikely(err)) -+ goto out; -+ } else if (!(vfsub_native_ro(a->mvd_h_src_inode) -+ || IS_APPEND(a->mvd_h_src_inode))) { -+ if (err) -+ a->mvdown.flags |= AUFS_MVDOWN_ROUPPER_R; -+ /* go on */ -+ } else -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_LOWER)) { -+ a->mvd_bdst = find_lower_writable(a); -+ if (unlikely(a->mvd_bdst < 0)) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "no writable lower branch\n"); -+ goto out; -+ } -+ } else { -+ a->mvd_bdst = au_br_index(a->sb, a->mvd_dst_brid); -+ if (unlikely(a->mvd_bdst < 0 -+ || au_sbbot(a->sb) < a->mvd_bdst)) { -+ a->mvd_errno = EAU_MVDOWN_NOLOWERBR; -+ AU_MVD_PR(dmsg, "no lower brid\n"); -+ goto out; -+ } -+ } -+ -+ err = au_mvd_args_busy(dmsg, a); -+ if (!err) -+ err = au_mvd_args_parent(dmsg, a); -+ if (!err) -+ err = au_mvd_args_intermediate(dmsg, a); -+ if (!err) -+ err = au_mvd_args_exist(dmsg, a); -+ if (!err) -+ AuDbg("b%d, b%d\n", a->mvd_bsrc, a->mvd_bdst); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *uarg) -+{ -+ int err, e; -+ unsigned char dmsg; -+ struct au_mvd_args *args; -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -ENOMEM; -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) -+ goto out; -+ -+ err = copy_from_user(&args->mvdown, uarg, sizeof(args->mvdown)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(uarg, sizeof(*uarg)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ AuDbg("flags 0x%x\n", args->mvdown.flags); -+ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R); -+ args->mvdown.au_errno = 0; -+ args->dentry = dentry; -+ args->inode = inode; -+ args->sb = dentry->d_sb; -+ -+ err = -ENOENT; -+ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG); -+ args->parent = dget_parent(dentry); -+ args->dir = d_inode(args->parent); -+ inode_lock_nested(args->dir, I_MUTEX_PARENT); -+ dput(args->parent); -+ if (unlikely(args->parent != dentry->d_parent)) { -+ AU_MVD_PR(dmsg, "parent dir is moved\n"); -+ goto out_dir; -+ } -+ -+ inode_lock_nested(inode, I_MUTEX_CHILD); -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW); -+ if (unlikely(err)) -+ goto out_inode; -+ -+ di_write_lock_parent(args->parent); -+ err = au_mvd_args(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_do_mvdown(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ au_cpup_attr_timesizes(args->dir); -+ au_cpup_attr_timesizes(inode); -+ if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst)); -+ /* au_digen_dec(dentry); */ -+ -+out_parent: -+ di_write_unlock(args->parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+out_inode: -+ inode_unlock(inode); -+out_dir: -+ inode_unlock(args->dir); -+out_free: -+ e = copy_to_user(uarg, &args->mvdown, sizeof(args->mvdown)); -+ if (unlikely(e)) -+ err = -EFAULT; -+ au_kfree_rcu(args); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff --git a/fs/aufs/opts.c b/fs/aufs/opts.c -new file mode 100644 -index 000000000000..26ecf5604117 ---- /dev/null -+++ b/fs/aufs/opts.c -@@ -0,0 +1,1867 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#include -+#include /* a distribution requires */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { -+ Opt_br, -+ Opt_add, Opt_del, Opt_mod, Opt_append, Opt_prepend, -+ Opt_idel, Opt_imod, -+ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, -+ Opt_rdblk_def, Opt_rdhash_def, -+ Opt_xino, Opt_noxino, -+ Opt_trunc_xino, Opt_trunc_xino_v, Opt_notrunc_xino, -+ Opt_trunc_xino_path, Opt_itrunc_xino, -+ Opt_trunc_xib, Opt_notrunc_xib, -+ Opt_shwh, Opt_noshwh, -+ Opt_plink, Opt_noplink, Opt_list_plink, -+ Opt_udba, -+ Opt_dio, Opt_nodio, -+ Opt_diropq_a, Opt_diropq_w, -+ Opt_warn_perm, Opt_nowarn_perm, -+ Opt_wbr_copyup, Opt_wbr_create, -+ Opt_fhsm_sec, -+ Opt_verbose, Opt_noverbose, -+ Opt_sum, Opt_nosum, Opt_wsum, -+ Opt_dirperm1, Opt_nodirperm1, -+ Opt_dirren, Opt_nodirren, -+ Opt_acl, Opt_noacl, -+ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err -+}; -+ -+static match_table_t options = { -+ {Opt_br, "br=%s"}, -+ {Opt_br, "br:%s"}, -+ -+ {Opt_add, "add=%d:%s"}, -+ {Opt_add, "add:%d:%s"}, -+ {Opt_add, "ins=%d:%s"}, -+ {Opt_add, "ins:%d:%s"}, -+ {Opt_append, "append=%s"}, -+ {Opt_append, "append:%s"}, -+ {Opt_prepend, "prepend=%s"}, -+ {Opt_prepend, "prepend:%s"}, -+ -+ {Opt_del, "del=%s"}, -+ {Opt_del, "del:%s"}, -+ /* {Opt_idel, "idel:%d"}, */ -+ {Opt_mod, "mod=%s"}, -+ {Opt_mod, "mod:%s"}, -+ /* {Opt_imod, "imod:%d:%s"}, */ -+ -+ {Opt_dirwh, "dirwh=%d"}, -+ -+ {Opt_xino, "xino=%s"}, -+ {Opt_noxino, "noxino"}, -+ {Opt_trunc_xino, "trunc_xino"}, -+ {Opt_trunc_xino_v, "trunc_xino_v=%d:%d"}, -+ {Opt_notrunc_xino, "notrunc_xino"}, -+ {Opt_trunc_xino_path, "trunc_xino=%s"}, -+ {Opt_itrunc_xino, "itrunc_xino=%d"}, -+ /* {Opt_zxino, "zxino=%s"}, */ -+ {Opt_trunc_xib, "trunc_xib"}, -+ {Opt_notrunc_xib, "notrunc_xib"}, -+ -+#ifdef CONFIG_PROC_FS -+ {Opt_plink, "plink"}, -+#else -+ {Opt_ignore_silent, "plink"}, -+#endif -+ -+ {Opt_noplink, "noplink"}, -+ -+#ifdef CONFIG_AUFS_DEBUG -+ {Opt_list_plink, "list_plink"}, -+#endif -+ -+ {Opt_udba, "udba=%s"}, -+ -+ {Opt_dio, "dio"}, -+ {Opt_nodio, "nodio"}, -+ -+#ifdef CONFIG_AUFS_DIRREN -+ {Opt_dirren, "dirren"}, -+ {Opt_nodirren, "nodirren"}, -+#else -+ {Opt_ignore, "dirren"}, -+ {Opt_ignore_silent, "nodirren"}, -+#endif -+ -+#ifdef CONFIG_AUFS_FHSM -+ {Opt_fhsm_sec, "fhsm_sec=%d"}, -+#else -+ {Opt_ignore, "fhsm_sec=%d"}, -+#endif -+ -+ {Opt_diropq_a, "diropq=always"}, -+ {Opt_diropq_a, "diropq=a"}, -+ {Opt_diropq_w, "diropq=whiteouted"}, -+ {Opt_diropq_w, "diropq=w"}, -+ -+ {Opt_warn_perm, "warn_perm"}, -+ {Opt_nowarn_perm, "nowarn_perm"}, -+ -+ /* keep them temporary */ -+ {Opt_ignore_silent, "nodlgt"}, -+ {Opt_ignore, "clean_plink"}, -+ -+#ifdef CONFIG_AUFS_SHWH -+ {Opt_shwh, "shwh"}, -+#endif -+ {Opt_noshwh, "noshwh"}, -+ -+ {Opt_dirperm1, "dirperm1"}, -+ {Opt_nodirperm1, "nodirperm1"}, -+ -+ {Opt_verbose, "verbose"}, -+ {Opt_verbose, "v"}, -+ {Opt_noverbose, "noverbose"}, -+ {Opt_noverbose, "quiet"}, -+ {Opt_noverbose, "q"}, -+ {Opt_noverbose, "silent"}, -+ -+ {Opt_sum, "sum"}, -+ {Opt_nosum, "nosum"}, -+ {Opt_wsum, "wsum"}, -+ -+ {Opt_rdcache, "rdcache=%d"}, -+ {Opt_rdblk, "rdblk=%d"}, -+ {Opt_rdblk_def, "rdblk=def"}, -+ {Opt_rdhash, "rdhash=%d"}, -+ {Opt_rdhash_def, "rdhash=def"}, -+ -+ {Opt_wbr_create, "create=%s"}, -+ {Opt_wbr_create, "create_policy=%s"}, -+ {Opt_wbr_copyup, "cpup=%s"}, -+ {Opt_wbr_copyup, "copyup=%s"}, -+ {Opt_wbr_copyup, "copyup_policy=%s"}, -+ -+ /* generic VFS flag */ -+#ifdef CONFIG_FS_POSIX_ACL -+ {Opt_acl, "acl"}, -+ {Opt_noacl, "noacl"}, -+#else -+ {Opt_ignore, "acl"}, -+ {Opt_ignore_silent, "noacl"}, -+#endif -+ -+ /* internal use for the scripts */ -+ {Opt_ignore_silent, "si=%s"}, -+ -+ {Opt_br, "dirs=%s"}, -+ {Opt_ignore, "debug=%d"}, -+ {Opt_ignore, "delete=whiteout"}, -+ {Opt_ignore, "delete=all"}, -+ {Opt_ignore, "imap=%s"}, -+ -+ /* temporary workaround, due to old mount(8)? */ -+ {Opt_ignore_silent, "relatime"}, -+ -+ {Opt_err, NULL} -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *au_parser_pattern(int val, match_table_t tbl) -+{ -+ struct match_token *p; -+ -+ p = tbl; -+ while (p->pattern) { -+ if (p->token == val) -+ return p->pattern; -+ p++; -+ } -+ BUG(); -+ return "??"; -+} -+ -+static const char *au_optstr(int *val, match_table_t tbl) -+{ -+ struct match_token *p; -+ int v; -+ -+ v = *val; -+ if (!v) -+ goto out; -+ p = tbl; -+ while (p->pattern) { -+ if (p->token -+ && (v & p->token) == p->token) { -+ *val &= ~p->token; -+ return p->pattern; -+ } -+ p++; -+ } -+ -+out: -+ return NULL; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t brperm = { -+ {AuBrPerm_RO, AUFS_BRPERM_RO}, -+ {AuBrPerm_RR, AUFS_BRPERM_RR}, -+ {AuBrPerm_RW, AUFS_BRPERM_RW}, -+ {0, NULL} -+}; -+ -+static match_table_t brattr = { -+ /* general */ -+ {AuBrAttr_COO_REG, AUFS_BRATTR_COO_REG}, -+ {AuBrAttr_COO_ALL, AUFS_BRATTR_COO_ALL}, -+ /* 'unpin' attrib is meaningless since linux-3.18-rc1 */ -+ {AuBrAttr_UNPIN, AUFS_BRATTR_UNPIN}, -+#ifdef CONFIG_AUFS_FHSM -+ {AuBrAttr_FHSM, AUFS_BRATTR_FHSM}, -+#endif -+#ifdef CONFIG_AUFS_XATTR -+ {AuBrAttr_ICEX, AUFS_BRATTR_ICEX}, -+ {AuBrAttr_ICEX_SEC, AUFS_BRATTR_ICEX_SEC}, -+ {AuBrAttr_ICEX_SYS, AUFS_BRATTR_ICEX_SYS}, -+ {AuBrAttr_ICEX_TR, AUFS_BRATTR_ICEX_TR}, -+ {AuBrAttr_ICEX_USR, AUFS_BRATTR_ICEX_USR}, -+ {AuBrAttr_ICEX_OTH, AUFS_BRATTR_ICEX_OTH}, -+#endif -+ -+ /* ro/rr branch */ -+ {AuBrRAttr_WH, AUFS_BRRATTR_WH}, -+ -+ /* rw branch */ -+ {AuBrWAttr_MOO, AUFS_BRWATTR_MOO}, -+ {AuBrWAttr_NoLinkWH, AUFS_BRWATTR_NLWH}, -+ -+ {0, NULL} -+}; -+ -+static int br_attr_val(char *str, match_table_t table, substring_t args[]) -+{ -+ int attr, v; -+ char *p; -+ -+ attr = 0; -+ do { -+ p = strchr(str, '+'); -+ if (p) -+ *p = 0; -+ v = match_token(str, table, args); -+ if (v) { -+ if (v & AuBrAttr_CMOO_Mask) -+ attr &= ~AuBrAttr_CMOO_Mask; -+ attr |= v; -+ } else { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch attribute %s\n", str); -+ break; -+ } -+ if (p) -+ str = p + 1; -+ } while (p); -+ -+ return attr; -+} -+ -+static int au_do_optstr_br_attr(au_br_perm_str_t *str, int perm) -+{ -+ int sz; -+ const char *p; -+ char *q; -+ -+ q = str->a; -+ *q = 0; -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } else -+ goto out; -+ -+ do { -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ *q++ = '+'; -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } -+ } while (p); -+ -+out: -+ return q - str->a; -+} -+ -+static int noinline_for_stack br_perm_val(char *perm) -+{ -+ int val, bad, sz; -+ char *p; -+ substring_t args[MAX_OPT_ARGS]; -+ au_br_perm_str_t attr; -+ -+ p = strchr(perm, '+'); -+ if (p) -+ *p = 0; -+ val = match_token(perm, brperm, args); -+ if (!val) { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch permission %s\n", perm); -+ val = AuBrPerm_RO; -+ goto out; -+ } -+ if (!p) -+ goto out; -+ -+ val |= br_attr_val(p + 1, brattr, args); -+ -+ bad = 0; -+ switch (val & AuBrPerm_Mask) { -+ case AuBrPerm_RO: -+ case AuBrPerm_RR: -+ bad = val & AuBrWAttr_Mask; -+ val &= ~AuBrWAttr_Mask; -+ break; -+ case AuBrPerm_RW: -+ bad = val & AuBrRAttr_Mask; -+ val &= ~AuBrRAttr_Mask; -+ break; -+ } -+ -+ /* -+ * 'unpin' attrib becomes meaningless since linux-3.18-rc1, but aufs -+ * does not treat it as an error, just warning. -+ * this is a tiny guard for the user operation. -+ */ -+ if (val & AuBrAttr_UNPIN) { -+ bad |= AuBrAttr_UNPIN; -+ val &= ~AuBrAttr_UNPIN; -+ } -+ -+ if (unlikely(bad)) { -+ sz = au_do_optstr_br_attr(&attr, bad); -+ AuDebugOn(!sz); -+ pr_warn("ignored branch attribute %s\n", attr.a); -+ } -+ -+out: -+ return val; -+} -+ -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm) -+{ -+ au_br_perm_str_t attr; -+ const char *p; -+ char *q; -+ int sz; -+ -+ q = str->a; -+ p = au_optstr(&perm, brperm); -+ AuDebugOn(!p || !*p); -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ -+ sz = au_do_optstr_br_attr(&attr, perm); -+ if (sz) { -+ *q++ = '+'; -+ memcpy(q, attr.a, sz + 1); -+ } -+ -+ AuDebugOn(strlen(str->a) >= sizeof(str->a)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t udbalevel = { -+ {AuOpt_UDBA_REVAL, "reval"}, -+ {AuOpt_UDBA_NONE, "none"}, -+#ifdef CONFIG_AUFS_HNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, -+#endif -+#endif -+ {-1, NULL} -+}; -+ -+static int noinline_for_stack udba_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, udbalevel, args); -+} -+ -+const char *au_optstr_udba(int udba) -+{ -+ return au_parser_pattern(udba, udbalevel); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t au_wbr_create_policy = { -+ {AuWbrCreate_TDP, "tdp"}, -+ {AuWbrCreate_TDP, "top-down-parent"}, -+ {AuWbrCreate_RR, "rr"}, -+ {AuWbrCreate_RR, "round-robin"}, -+ {AuWbrCreate_MFS, "mfs"}, -+ {AuWbrCreate_MFS, "most-free-space"}, -+ {AuWbrCreate_MFSV, "mfs:%d"}, -+ {AuWbrCreate_MFSV, "most-free-space:%d"}, -+ -+ /* top-down regardless the parent, and then mfs */ -+ {AuWbrCreate_TDMFS, "tdmfs:%d"}, -+ {AuWbrCreate_TDMFSV, "tdmfs:%d:%d"}, -+ -+ {AuWbrCreate_MFSRR, "mfsrr:%d"}, -+ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, -+ {AuWbrCreate_PMFS, "pmfs"}, -+ {AuWbrCreate_PMFSV, "pmfs:%d"}, -+ {AuWbrCreate_PMFSRR, "pmfsrr:%d"}, -+ {AuWbrCreate_PMFSRRV, "pmfsrr:%d:%d"}, -+ -+ {-1, NULL} -+}; -+ -+static int au_wbr_mfs_wmark(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ unsigned long long ull; -+ -+ err = 0; -+ if (!match_u64(arg, &ull)) -+ create->mfsrr_watermark = ull; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int au_wbr_mfs_sec(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int n, err; -+ -+ err = 0; -+ if (!match_int(arg, &n) && 0 <= n && n <= AUFS_MFS_MAX_SEC) -+ create->mfs_second = n; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int noinline_for_stack -+au_wbr_create_val(char *str, struct au_opt_wbr_create *create) -+{ -+ int err, e; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ err = match_token(str, au_wbr_create_policy, args); -+ create->wbr_create = err; -+ switch (err) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (!e) -+ e = au_wbr_mfs_sec(&args[1], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (unlikely(e)) { -+ err = e; -+ break; -+ } -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ create->mfs_second = AUFS_MFS_DEF_SEC; -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ e = au_wbr_mfs_sec(&args[0], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ } -+ -+ return err; -+} -+ -+const char *au_optstr_wbr_create(int wbr_create) -+{ -+ return au_parser_pattern(wbr_create, au_wbr_create_policy); -+} -+ -+static match_table_t au_wbr_copyup_policy = { -+ {AuWbrCopyup_TDP, "tdp"}, -+ {AuWbrCopyup_TDP, "top-down-parent"}, -+ {AuWbrCopyup_BUP, "bup"}, -+ {AuWbrCopyup_BUP, "bottom-up-parent"}, -+ {AuWbrCopyup_BU, "bu"}, -+ {AuWbrCopyup_BU, "bottom-up"}, -+ {-1, NULL} -+}; -+ -+static int noinline_for_stack au_wbr_copyup_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, au_wbr_copyup_policy, args); -+} -+ -+const char *au_optstr_wbr_copyup(int wbr_copyup) -+{ -+ return au_parser_pattern(wbr_copyup, au_wbr_copyup_policy); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const int lkup_dirflags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY; -+ -+static void dump_opts(struct au_opts *opts) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ /* reduce stack space */ -+ union { -+ struct au_opt_add *add; -+ struct au_opt_del *del; -+ struct au_opt_mod *mod; -+ struct au_opt_xino *xino; -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ u.add = &opt->add; -+ AuDbg("add {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_del: -+ case Opt_idel: -+ u.del = &opt->del; -+ AuDbg("del {%s, %p}\n", -+ u.del->pathname, u.del->h_path.dentry); -+ break; -+ case Opt_mod: -+ case Opt_imod: -+ u.mod = &opt->mod; -+ AuDbg("mod {%s, 0x%x, %p}\n", -+ u.mod->path, u.mod->perm, u.mod->h_root); -+ break; -+ case Opt_append: -+ u.add = &opt->add; -+ AuDbg("append {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_prepend: -+ u.add = &opt->add; -+ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_dirwh: -+ AuDbg("dirwh %d\n", opt->dirwh); -+ break; -+ case Opt_rdcache: -+ AuDbg("rdcache %d\n", opt->rdcache); -+ break; -+ case Opt_rdblk: -+ AuDbg("rdblk %u\n", opt->rdblk); -+ break; -+ case Opt_rdblk_def: -+ AuDbg("rdblk_def\n"); -+ break; -+ case Opt_rdhash: -+ AuDbg("rdhash %u\n", opt->rdhash); -+ break; -+ case Opt_rdhash_def: -+ AuDbg("rdhash_def\n"); -+ break; -+ case Opt_xino: -+ u.xino = &opt->xino; -+ AuDbg("xino {%s %pD}\n", u.xino->path, u.xino->file); -+ break; -+ case Opt_trunc_xino: -+ AuLabel(trunc_xino); -+ break; -+ case Opt_notrunc_xino: -+ AuLabel(notrunc_xino); -+ break; -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); -+ break; -+ case Opt_noxino: -+ AuLabel(noxino); -+ break; -+ case Opt_trunc_xib: -+ AuLabel(trunc_xib); -+ break; -+ case Opt_notrunc_xib: -+ AuLabel(notrunc_xib); -+ break; -+ case Opt_shwh: -+ AuLabel(shwh); -+ break; -+ case Opt_noshwh: -+ AuLabel(noshwh); -+ break; -+ case Opt_dirperm1: -+ AuLabel(dirperm1); -+ break; -+ case Opt_nodirperm1: -+ AuLabel(nodirperm1); -+ break; -+ case Opt_plink: -+ AuLabel(plink); -+ break; -+ case Opt_noplink: -+ AuLabel(noplink); -+ break; -+ case Opt_list_plink: -+ AuLabel(list_plink); -+ break; -+ case Opt_udba: -+ AuDbg("udba %d, %s\n", -+ opt->udba, au_optstr_udba(opt->udba)); -+ break; -+ case Opt_dio: -+ AuLabel(dio); -+ break; -+ case Opt_nodio: -+ AuLabel(nodio); -+ break; -+ case Opt_diropq_a: -+ AuLabel(diropq_a); -+ break; -+ case Opt_diropq_w: -+ AuLabel(diropq_w); -+ break; -+ case Opt_warn_perm: -+ AuLabel(warn_perm); -+ break; -+ case Opt_nowarn_perm: -+ AuLabel(nowarn_perm); -+ break; -+ case Opt_verbose: -+ AuLabel(verbose); -+ break; -+ case Opt_noverbose: -+ AuLabel(noverbose); -+ break; -+ case Opt_sum: -+ AuLabel(sum); -+ break; -+ case Opt_nosum: -+ AuLabel(nosum); -+ break; -+ case Opt_wsum: -+ AuLabel(wsum); -+ break; -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ AuDbg("create %d, %s\n", u.create->wbr_create, -+ au_optstr_wbr_create(u.create->wbr_create)); -+ switch (u.create->wbr_create) { -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ AuDbg("%d sec\n", u.create->mfs_second); -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ AuDbg("%llu watermark\n", -+ u.create->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ AuDbg("%llu watermark, %d sec\n", -+ u.create->mfsrr_watermark, -+ u.create->mfs_second); -+ break; -+ } -+ break; -+ case Opt_wbr_copyup: -+ AuDbg("copyup %d, %s\n", opt->wbr_copyup, -+ au_optstr_wbr_copyup(opt->wbr_copyup)); -+ break; -+ case Opt_fhsm_sec: -+ AuDbg("fhsm_sec %u\n", opt->fhsm_second); -+ break; -+ case Opt_dirren: -+ AuLabel(dirren); -+ break; -+ case Opt_nodirren: -+ AuLabel(nodirren); -+ break; -+ case Opt_acl: -+ AuLabel(acl); -+ break; -+ case Opt_noacl: -+ AuLabel(noacl); -+ break; -+ default: -+ BUG(); -+ } -+ opt++; -+ } -+#endif -+} -+ -+void au_opts_free(struct au_opts *opts) -+{ -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ case Opt_append: -+ case Opt_prepend: -+ path_put(&opt->add.path); -+ break; -+ case Opt_del: -+ case Opt_idel: -+ path_put(&opt->del.h_path); -+ break; -+ case Opt_mod: -+ case Opt_imod: -+ dput(opt->mod.h_root); -+ break; -+ case Opt_xino: -+ fput(opt->xino.file); -+ break; -+ } -+ opt++; -+ } -+} -+ -+static int opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct au_opt_add *add = &opt->add; -+ char *p; -+ -+ add->bindex = bindex; -+ add->perm = AuBrPerm_RO; -+ add->pathname = opt_str; -+ p = strchr(opt_str, '='); -+ if (p) { -+ *p++ = 0; -+ if (*p) -+ add->perm = br_perm_val(p); -+ } -+ -+ err = vfsub_kern_path(add->pathname, lkup_dirflags, &add->path); -+ if (!err) { -+ if (!p) { -+ add->perm = AuBrPerm_RO; -+ if (au_test_fs_rr(add->path.dentry->d_sb)) -+ add->perm = AuBrPerm_RR; -+ else if (!bindex && !(sb_flags & SB_RDONLY)) -+ add->perm = AuBrPerm_RW; -+ } -+ opt->type = Opt_add; -+ goto out; -+ } -+ pr_err("lookup failed %s (%d)\n", add->pathname, err); -+ err = -EINVAL; -+ -+out: -+ return err; -+} -+ -+static int au_opts_parse_del(struct au_opt_del *del, substring_t args[]) -+{ -+ int err; -+ -+ del->pathname = args[0].from; -+ AuDbg("del path %s\n", del->pathname); -+ -+ err = vfsub_kern_path(del->pathname, lkup_dirflags, &del->h_path); -+ if (unlikely(err)) -+ pr_err("lookup failed %s (%d)\n", del->pathname, err); -+ -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_opts_parse_idel(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_opt_del *del, substring_t args[]) -+{ -+ int err; -+ struct dentry *root; -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbbot(sb) < bindex) { -+ pr_err("out of bounds, %d\n", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ del->h_path.dentry = dget(au_h_dptr(root, bindex)); -+ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); -+ -+out: -+ aufs_read_unlock(root, !AuLock_IR); -+ return err; -+} -+#endif -+ -+static int noinline_for_stack -+au_opts_parse_mod(struct au_opt_mod *mod, substring_t args[]) -+{ -+ int err; -+ struct path path; -+ char *p; -+ -+ err = -EINVAL; -+ mod->path = args[0].from; -+ p = strchr(mod->path, '='); -+ if (unlikely(!p)) { -+ pr_err("no permission %s\n", args[0].from); -+ goto out; -+ } -+ -+ *p++ = 0; -+ err = vfsub_kern_path(mod->path, lkup_dirflags, &path); -+ if (unlikely(err)) { -+ pr_err("lookup failed %s (%d)\n", mod->path, err); -+ goto out; -+ } -+ -+ mod->perm = br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s\n", mod->path, mod->perm, p); -+ mod->h_root = dget(path.dentry); -+ path_put(&path); -+ -+out: -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_opts_parse_imod(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_opt_mod *mod, substring_t args[]) -+{ -+ int err; -+ struct dentry *root; -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbbot(sb) < bindex) { -+ pr_err("out of bounds, %d\n", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ mod->perm = br_perm_val(args[1].from); -+ AuDbg("mod path %s, perm 0x%x, %s\n", -+ mod->path, mod->perm, args[1].from); -+ mod->h_root = dget(au_h_dptr(root, bindex)); -+ -+out: -+ aufs_read_unlock(root, !AuLock_IR); -+ return err; -+} -+#endif -+ -+static int au_opts_parse_xino(struct super_block *sb, struct au_opt_xino *xino, -+ substring_t args[]) -+{ -+ int err; -+ struct file *file; -+ -+ file = au_xino_create(sb, args[0].from, /*silent*/0, /*wbrtop*/0); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(file->f_path.dentry->d_sb == sb)) { -+ fput(file); -+ pr_err("%s must be outside\n", args[0].from); -+ goto out; -+ } -+ -+ err = 0; -+ xino->file = file; -+ xino->path = args[0].from; -+ -+out: -+ return err; -+} -+ -+static int noinline_for_stack -+au_opts_parse_xino_itrunc_path(struct super_block *sb, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ substring_t args[]) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct path path; -+ struct dentry *root; -+ -+ err = vfsub_kern_path(args[0].from, lkup_dirflags, &path); -+ if (unlikely(err)) { -+ pr_err("lookup failed %s (%d)\n", args[0].from, err); -+ goto out; -+ } -+ -+ xino_itrunc->bindex = -1; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (au_h_dptr(root, bindex) == path.dentry) { -+ xino_itrunc->bindex = bindex; -+ break; -+ } -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ path_put(&path); -+ -+ if (unlikely(xino_itrunc->bindex < 0)) { -+ pr_err("no such branch %s\n", args[0].from); -+ err = -EINVAL; -+ } -+ -+out: -+ return err; -+} -+ -+/* called without aufs lock */ -+int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts) -+{ -+ int err, n, token; -+ aufs_bindex_t bindex; -+ unsigned char skipped; -+ struct dentry *root; -+ struct au_opt *opt, *opt_tail; -+ char *opt_str; -+ /* reduce the stack space */ -+ union { -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct { -+ substring_t args[MAX_OPT_ARGS]; -+ } *a; -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ root = sb->s_root; -+ err = 0; -+ bindex = 0; -+ opt = opts->opt; -+ opt_tail = opt + opts->max_opt - 1; -+ opt->type = Opt_tail; -+ while (!err && (opt_str = strsep(&str, ",")) && *opt_str) { -+ err = -EINVAL; -+ skipped = 0; -+ token = match_token(opt_str, options, a->args); -+ switch (token) { -+ case Opt_br: -+ err = 0; -+ while (!err && (opt_str = strsep(&a->args[0].from, ":")) -+ && *opt_str) { -+ err = opt_add(opt, opt_str, opts->sb_flags, -+ bindex++); -+ if (unlikely(!err && ++opt > opt_tail)) { -+ err = -E2BIG; -+ break; -+ } -+ opt->type = Opt_tail; -+ skipped = 1; -+ } -+ break; -+ case Opt_add: -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ bindex = n; -+ err = opt_add(opt, a->args[1].from, opts->sb_flags, -+ bindex); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_append: -+ err = opt_add(opt, a->args[0].from, opts->sb_flags, -+ /*dummy bindex*/1); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_prepend: -+ err = opt_add(opt, a->args[0].from, opts->sb_flags, -+ /*bindex*/0); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_del: -+ err = au_opts_parse_del(&opt->del, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#if 0 /* reserved for future use */ -+ case Opt_idel: -+ del->pathname = "(indexed)"; -+ if (unlikely(match_int(&args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ err = au_opts_parse_idel(sb, n, &opt->del, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#endif -+ case Opt_mod: -+ err = au_opts_parse_mod(&opt->mod, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#ifdef IMOD /* reserved for future use */ -+ case Opt_imod: -+ u.mod->path = "(indexed)"; -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ err = au_opts_parse_imod(sb, n, &opt->mod, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#endif -+ case Opt_xino: -+ err = au_opts_parse_xino(sb, &opt->xino, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+ -+ case Opt_trunc_xino_path: -+ err = au_opts_parse_xino_itrunc_path -+ (sb, &opt->xino_itrunc, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+ -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ u.xino_itrunc->bindex = n; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (n < 0 || au_sbbot(sb) < n) { -+ pr_err("out of bounds, %d\n", n); -+ aufs_read_unlock(root, !AuLock_IR); -+ break; -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_dirwh: -+ if (unlikely(match_int(&a->args[0], &opt->dirwh))) -+ break; -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_rdcache: -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ if (unlikely(n > AUFS_RDCACHE_MAX)) { -+ pr_err("rdcache must be smaller than %d\n", -+ AUFS_RDCACHE_MAX); -+ break; -+ } -+ opt->rdcache = n; -+ err = 0; -+ opt->type = token; -+ break; -+ case Opt_rdblk: -+ if (unlikely(match_int(&a->args[0], &n) -+ || n < 0 -+ || n > KMALLOC_MAX_SIZE)) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ if (unlikely(n && n < NAME_MAX)) { -+ pr_err("rdblk must be larger than %d\n", -+ NAME_MAX); -+ break; -+ } -+ opt->rdblk = n; -+ err = 0; -+ opt->type = token; -+ break; -+ case Opt_rdhash: -+ if (unlikely(match_int(&a->args[0], &n) -+ || n < 0 -+ || n * sizeof(struct hlist_head) -+ > KMALLOC_MAX_SIZE)) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ opt->rdhash = n; -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_trunc_xino: -+ case Opt_notrunc_xino: -+ case Opt_noxino: -+ case Opt_trunc_xib: -+ case Opt_notrunc_xib: -+ case Opt_shwh: -+ case Opt_noshwh: -+ case Opt_dirperm1: -+ case Opt_nodirperm1: -+ case Opt_plink: -+ case Opt_noplink: -+ case Opt_list_plink: -+ case Opt_dio: -+ case Opt_nodio: -+ case Opt_diropq_a: -+ case Opt_diropq_w: -+ case Opt_warn_perm: -+ case Opt_nowarn_perm: -+ case Opt_verbose: -+ case Opt_noverbose: -+ case Opt_sum: -+ case Opt_nosum: -+ case Opt_wsum: -+ case Opt_rdblk_def: -+ case Opt_rdhash_def: -+ case Opt_dirren: -+ case Opt_nodirren: -+ case Opt_acl: -+ case Opt_noacl: -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_udba: -+ opt->udba = udba_val(a->args[0].from); -+ if (opt->udba >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ u.create->wbr_create -+ = au_wbr_create_val(a->args[0].from, u.create); -+ if (u.create->wbr_create >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ case Opt_wbr_copyup: -+ opt->wbr_copyup = au_wbr_copyup_val(a->args[0].from); -+ if (opt->wbr_copyup >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ -+ case Opt_fhsm_sec: -+ if (unlikely(match_int(&a->args[0], &n) -+ || n < 0)) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ if (sysaufs_brs) { -+ opt->fhsm_second = n; -+ opt->type = token; -+ } else -+ pr_warn("ignored %s\n", opt_str); -+ err = 0; -+ break; -+ -+ case Opt_ignore: -+ pr_warn("ignored %s\n", opt_str); -+ fallthrough; -+ case Opt_ignore_silent: -+ skipped = 1; -+ err = 0; -+ break; -+ case Opt_err: -+ pr_err("unknown option %s\n", opt_str); -+ break; -+ } -+ -+ if (!err && !skipped) { -+ if (unlikely(++opt > opt_tail)) { -+ err = -E2BIG; -+ opt--; -+ opt->type = Opt_tail; -+ break; -+ } -+ opt->type = Opt_tail; -+ } -+ } -+ -+ au_kfree_rcu(a); -+ dump_opts(opts); -+ if (unlikely(err)) -+ au_opts_free(opts); -+ -+out: -+ return err; -+} -+ -+static int au_opt_wbr_create(struct super_block *sb, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_wbr_create_ops->fin) { -+ err = sbinfo->si_wbr_create_ops->fin(sb); -+ if (!err) -+ err = 1; -+ } -+ -+ sbinfo->si_wbr_create = create->wbr_create; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; -+ switch (create->wbr_create) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRR: -+ case AuWbrCreate_PMFSRRV: -+ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFS: -+ case AuWbrCreate_PMFSV: -+ sbinfo->si_wbr_mfs.mfs_expire -+ = msecs_to_jiffies(create->mfs_second * MSEC_PER_SEC); -+ break; -+ } -+ -+ if (sbinfo->si_wbr_create_ops->init) -+ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ -+ -+ return err; -+} -+ -+/* -+ * returns, -+ * plus: processed without an error -+ * zero: unprocessed -+ */ -+static int au_opt_simple(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ switch (opt->type) { -+ case Opt_udba: -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= opt->udba; -+ opts->given_udba |= opt->udba; -+ break; -+ -+ case Opt_plink: -+ au_opt_set(sbinfo->si_mntflags, PLINK); -+ break; -+ case Opt_noplink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_opt_clr(sbinfo->si_mntflags, PLINK); -+ break; -+ case Opt_list_plink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_list(sb); -+ break; -+ -+ case Opt_dio: -+ au_opt_set(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ break; -+ case Opt_nodio: -+ au_opt_clr(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ break; -+ -+ case Opt_fhsm_sec: -+ au_fhsm_set(sbinfo, opt->fhsm_second); -+ break; -+ -+ case Opt_diropq_a: -+ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ case Opt_diropq_w: -+ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ -+ case Opt_warn_perm: -+ au_opt_set(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ case Opt_nowarn_perm: -+ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ -+ case Opt_verbose: -+ au_opt_set(sbinfo->si_mntflags, VERBOSE); -+ break; -+ case Opt_noverbose: -+ au_opt_clr(sbinfo->si_mntflags, VERBOSE); -+ break; -+ -+ case Opt_sum: -+ au_opt_set(sbinfo->si_mntflags, SUM); -+ break; -+ case Opt_wsum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_set(sbinfo->si_mntflags, SUM_W); -+ break; -+ case Opt_nosum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_clr(sbinfo->si_mntflags, SUM_W); -+ break; -+ -+ case Opt_wbr_create: -+ err = au_opt_wbr_create(sb, &opt->wbr_create); -+ break; -+ case Opt_wbr_copyup: -+ sbinfo->si_wbr_copyup = opt->wbr_copyup; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; -+ break; -+ -+ case Opt_dirwh: -+ sbinfo->si_dirwh = opt->dirwh; -+ break; -+ -+ case Opt_rdcache: -+ sbinfo->si_rdcache -+ = msecs_to_jiffies(opt->rdcache * MSEC_PER_SEC); -+ break; -+ case Opt_rdblk: -+ sbinfo->si_rdblk = opt->rdblk; -+ break; -+ case Opt_rdblk_def: -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ break; -+ case Opt_rdhash: -+ sbinfo->si_rdhash = opt->rdhash; -+ break; -+ case Opt_rdhash_def: -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ break; -+ -+ case Opt_shwh: -+ au_opt_set(sbinfo->si_mntflags, SHWH); -+ break; -+ case Opt_noshwh: -+ au_opt_clr(sbinfo->si_mntflags, SHWH); -+ break; -+ -+ case Opt_dirperm1: -+ au_opt_set(sbinfo->si_mntflags, DIRPERM1); -+ break; -+ case Opt_nodirperm1: -+ au_opt_clr(sbinfo->si_mntflags, DIRPERM1); -+ break; -+ -+ case Opt_trunc_xino: -+ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ case Opt_notrunc_xino: -+ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ err = au_xino_trunc(sb, opt->xino_itrunc.bindex, -+ /*idx_begin*/0); -+ if (!err) -+ err = 1; -+ break; -+ -+ case Opt_trunc_xib: -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ break; -+ case Opt_notrunc_xib: -+ au_fclr_opts(opts->flags, TRUNC_XIB); -+ break; -+ -+ case Opt_dirren: -+ err = 1; -+ if (!au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_set(sb); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_set(sbinfo->si_mntflags, DIRREN); -+ break; -+ case Opt_nodirren: -+ err = 1; -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_clr(sb, au_ftest_opts(opts->flags, -+ DR_FLUSHED)); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_clr(sbinfo->si_mntflags, DIRREN); -+ break; -+ -+ case Opt_acl: -+ sb->s_flags |= SB_POSIXACL; -+ break; -+ case Opt_noacl: -+ sb->s_flags &= ~SB_POSIXACL; -+ break; -+ -+ default: -+ err = 0; -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * returns tri-state. -+ * plus: processed without an error -+ * zero: unprocessed -+ * minus: error -+ */ -+static int au_opt_br(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err, do_refresh; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_append: -+ opt->add.bindex = au_sbbot(sb) + 1; -+ if (opt->add.bindex < 0) -+ opt->add.bindex = 0; -+ goto add; -+ /* Always goto add, not fallthrough */ -+ case Opt_prepend: -+ opt->add.bindex = 0; -+ fallthrough; -+ add: /* indented label */ -+ case Opt_add: -+ err = au_br_add(sb, &opt->add, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_del: -+ case Opt_idel: -+ err = au_br_del(sb, &opt->del, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_mod: -+ case Opt_imod: -+ err = au_br_mod(sb, &opt->mod, -+ au_ftest_opts(opts->flags, REMOUNT), -+ &do_refresh); -+ if (!err) { -+ err = 1; -+ if (do_refresh) -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ } -+ return err; -+} -+ -+static int au_opt_xino(struct super_block *sb, struct au_opt *opt, -+ struct au_opt_xino **opt_xino, -+ struct au_opts *opts) -+{ -+ int err; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_xino: -+ err = au_xino_set(sb, &opt->xino, -+ !!au_ftest_opts(opts->flags, REMOUNT)); -+ if (unlikely(err)) -+ break; -+ -+ *opt_xino = &opt->xino; -+ break; -+ -+ case Opt_noxino: -+ au_xino_clr(sb); -+ *opt_xino = (void *)-1; -+ break; -+ } -+ -+ return err; -+} -+ -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending) -+{ -+ int err, fhsm; -+ aufs_bindex_t bindex, bbot; -+ unsigned char do_plink, skip, do_free, can_no_dreval; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root, *dentry; -+ struct inode *dir, *h_dir; -+ struct au_sbinfo *sbinfo; -+ struct au_hinode *hdir; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); -+ -+ if (!(sb_flags & SB_RDONLY)) { -+ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) -+ pr_warn("first branch should be rw\n"); -+ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) -+ pr_warn_once("shwh should be used with ro\n"); -+ } -+ -+ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) -+ && !au_opt_test(sbinfo->si_mntflags, XINO)) -+ pr_warn_once("udba=*notify requires xino\n"); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRPERM1)) -+ pr_warn_once("dirperm1 breaks the protection" -+ " by the permission bits on the lower branch\n"); -+ -+ err = 0; -+ fhsm = 0; -+ root = sb->s_root; -+ dir = d_inode(root); -+ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); -+ can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending), -+ UDBA_NONE); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ skip = 0; -+ h_dir = au_h_iptr(dir, bindex); -+ br = au_sbr(sb, bindex); -+ -+ if ((br->br_perm & AuBrAttr_ICEX) -+ && !h_dir->i_op->listxattr) -+ br->br_perm &= ~AuBrAttr_ICEX; -+#if 0 /* untested */ -+ if ((br->br_perm & AuBrAttr_ICEX_SEC) -+ && (au_br_sb(br)->s_flags & SB_NOSEC)) -+ br->br_perm &= ~AuBrAttr_ICEX_SEC; -+#endif -+ -+ do_free = 0; -+ wbr = br->br_wbr; -+ if (wbr) -+ wbr_wh_read_lock(wbr); -+ -+ if (!au_br_writable(br->br_perm)) { -+ do_free = !!wbr; -+ skip = (!wbr -+ || (!wbr->wbr_whbase -+ && !wbr->wbr_plink -+ && !wbr->wbr_orph)); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ /* skip = (!br->br_whbase && !br->br_orph); */ -+ skip = (!wbr || !wbr->wbr_whbase); -+ if (skip && wbr) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } else { -+ /* skip = (br->br_whbase && br->br_ohph); */ -+ skip = (wbr && wbr->wbr_whbase); -+ if (skip) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } -+ if (wbr) -+ wbr_wh_read_unlock(wbr); -+ -+ if (can_no_dreval) { -+ dentry = br->br_path.dentry; -+ spin_lock(&dentry->d_lock); -+ if (dentry->d_flags & -+ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE)) -+ can_no_dreval = 0; -+ spin_unlock(&dentry->d_lock); -+ } -+ -+ if (au_br_fhsm(br->br_perm)) { -+ fhsm++; -+ AuDebugOn(!br->br_fhsm); -+ } -+ -+ if (skip) -+ continue; -+ -+ hdir = au_hi(dir, bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ if (wbr) -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ if (wbr) -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ -+ if (!err && do_free) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ -+ if (can_no_dreval) -+ au_fset_si(sbinfo, NO_DREVAL); -+ else -+ au_fclr_si(sbinfo, NO_DREVAL); -+ -+ if (fhsm >= 2) { -+ au_fset_si(sbinfo, FHSM); -+ for (bindex = bbot; bindex >= 0; bindex--) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) { -+ au_fhsm_set_bottom(sb, bindex); -+ break; -+ } -+ } -+ } else { -+ au_fclr_si(sbinfo, FHSM); -+ au_fhsm_set_bottom(sb, -1); -+ } -+ -+ return err; -+} -+ -+int au_opts_mount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err; -+ unsigned int tmp; -+ aufs_bindex_t bindex, bbot; -+ struct au_opt *opt; -+ struct au_opt_xino *opt_xino, xino; -+ struct au_sbinfo *sbinfo; -+ struct au_branch *br; -+ struct inode *dir; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_simple(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ /* disable xino and udba temporary */ -+ sbinfo = au_sbi(sb); -+ tmp = sbinfo->si_mntflags; -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); -+ -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_br(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot < 0)) { -+ err = -EINVAL; -+ pr_err("no branches\n"); -+ goto out; -+ } -+ -+ if (au_opt_test(tmp, XINO)) -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ opt = opts->opt; -+ while (!err && opt->type != Opt_tail) -+ err = au_opt_xino(sb, opt++, &opt_xino, opts); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_opts_verify(sb, sb->s_flags, tmp); -+ if (unlikely(err)) -+ goto out; -+ -+ /* restore xino */ -+ if (au_opt_test(tmp, XINO) && !opt_xino) { -+ xino.file = au_xino_def(sb); -+ err = PTR_ERR(xino.file); -+ if (IS_ERR(xino.file)) -+ goto out; -+ -+ err = au_xino_set(sb, &xino, /*remount*/0); -+ fput(xino.file); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* restore udba */ -+ tmp &= AuOptMask_UDBA; -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= tmp; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(tmp, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ if (au_opt_test(tmp, UDBA_HNOTIFY)) { -+ dir = d_inode(sb->s_root); -+ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); -+ } -+ -+out: -+ return err; -+} -+ -+int au_opts_remount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err, rerr; -+ unsigned char no_dreval; -+ struct inode *dir; -+ struct au_opt_xino *opt_xino; -+ struct au_opt *opt; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ au_fset_opts(opts->flags, DR_FLUSHED); -+ -+ dir = d_inode(sb->s_root); -+ sbinfo = au_sbi(sb); -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) { -+ err = au_opt_simple(sb, opt, opts); -+ if (!err) -+ err = au_opt_br(sb, opt, opts); -+ if (!err) -+ err = au_opt_xino(sb, opt, &opt_xino, opts); -+ opt++; -+ } -+ if (err > 0) -+ err = 0; -+ AuTraceErr(err); -+ /* go on even err */ -+ -+ no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL); -+ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ -+ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL)) -+ au_fset_opts(opts->flags, REFRESH_IDOP); -+ -+ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { -+ rerr = au_xib_trunc(sb); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ } -+ -+ /* will be handled by the caller */ -+ if (!au_ftest_opts(opts->flags, REFRESH) -+ && (opts->given_udba -+ || au_opt_test(sbinfo->si_mntflags, XINO) -+ || au_ftest_opts(opts->flags, REFRESH_IDOP) -+ )) -+ au_fset_opts(opts->flags, REFRESH); -+ -+ AuDbg("status 0x%x\n", opts->flags); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_opt_udba(struct super_block *sb) -+{ -+ return au_mntflags(sb) & AuOptMask_UDBA; -+} -diff --git a/fs/aufs/opts.h b/fs/aufs/opts.h -new file mode 100644 -index 000000000000..5e00aeac6d21 ---- /dev/null -+++ b/fs/aufs/opts.h -@@ -0,0 +1,212 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#ifndef __AUFS_OPTS_H__ -+#define __AUFS_OPTS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct file; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mount flags */ -+#define AuOpt_XINO 1 /* external inode number bitmap -+ and translation table */ -+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ -+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ -+#define AuOpt_UDBA_REVAL (1 << 3) -+#define AuOpt_UDBA_HNOTIFY (1 << 4) -+#define AuOpt_SHWH (1 << 5) /* show whiteout */ -+#define AuOpt_PLINK (1 << 6) /* pseudo-link */ -+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm -+ bits */ -+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ -+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ -+#define AuOpt_SUM_W (1 << 11) /* unimplemented */ -+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ -+#define AuOpt_VERBOSE (1 << 13) /* print the cause of error */ -+#define AuOpt_DIO (1 << 14) /* direct io */ -+#define AuOpt_DIRREN (1 << 15) /* directory rename */ -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuOpt_UDBA_HNOTIFY -+#define AuOpt_UDBA_HNOTIFY 0 -+#endif -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpt_DIRREN -+#define AuOpt_DIRREN 0 -+#endif -+#ifndef CONFIG_AUFS_SHWH -+#undef AuOpt_SHWH -+#define AuOpt_SHWH 0 -+#endif -+ -+#define AuOpt_Def (AuOpt_XINO \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_PLINK \ -+ /* | AuOpt_DIRPERM1 */ \ -+ | AuOpt_WARN_PERM) -+#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_UDBA_HNOTIFY) -+ -+#define au_opt_test(flags, name) (flags & AuOpt_##name) -+#define au_opt_set(flags, name) do { \ -+ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_set_udba(flags, name) do { \ -+ (flags) &= ~AuOptMask_UDBA; \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_clr(flags, name) do { \ -+ ((flags) &= ~AuOpt_##name); \ -+} while (0) -+ -+static inline unsigned int au_opts_plink(unsigned int mntflags) -+{ -+#ifdef CONFIG_PROC_FS -+ return mntflags; -+#else -+ return mntflags & ~AuOpt_PLINK; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies to select one among multiple writable branches */ -+enum { -+ AuWbrCreate_TDP, /* top down parent */ -+ AuWbrCreate_RR, /* round robin */ -+ AuWbrCreate_MFS, /* most free space */ -+ AuWbrCreate_MFSV, /* mfs with seconds */ -+ AuWbrCreate_MFSRR, /* mfs then rr */ -+ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ -+ AuWbrCreate_TDMFS, /* top down regardless parent and mfs */ -+ AuWbrCreate_TDMFSV, /* top down regardless parent and mfs */ -+ AuWbrCreate_PMFS, /* parent and mfs */ -+ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ -+ AuWbrCreate_PMFSRR, /* parent, mfs and round-robin */ -+ AuWbrCreate_PMFSRRV, /* plus seconds */ -+ -+ AuWbrCreate_Def = AuWbrCreate_TDP -+}; -+ -+enum { -+ AuWbrCopyup_TDP, /* top down parent */ -+ AuWbrCopyup_BUP, /* bottom up parent */ -+ AuWbrCopyup_BU, /* bottom up */ -+ -+ AuWbrCopyup_Def = AuWbrCopyup_TDP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_opt_add { -+ aufs_bindex_t bindex; -+ char *pathname; -+ int perm; -+ struct path path; -+}; -+ -+struct au_opt_del { -+ char *pathname; -+ struct path h_path; -+}; -+ -+struct au_opt_mod { -+ char *path; -+ int perm; -+ struct dentry *h_root; -+}; -+ -+struct au_opt_xino { -+ char *path; -+ struct file *file; -+}; -+ -+struct au_opt_xino_itrunc { -+ aufs_bindex_t bindex; -+}; -+ -+struct au_opt_wbr_create { -+ int wbr_create; -+ int mfs_second; -+ unsigned long long mfsrr_watermark; -+}; -+ -+struct au_opt { -+ int type; -+ union { -+ struct au_opt_xino xino; -+ struct au_opt_xino_itrunc xino_itrunc; -+ struct au_opt_add add; -+ struct au_opt_del del; -+ struct au_opt_mod mod; -+ int dirwh; -+ int rdcache; -+ unsigned int rdblk; -+ unsigned int rdhash; -+ int udba; -+ struct au_opt_wbr_create wbr_create; -+ int wbr_copyup; -+ unsigned int fhsm_second; -+ }; -+}; -+ -+/* opts flags */ -+#define AuOpts_REMOUNT 1 -+#define AuOpts_REFRESH (1 << 1) -+#define AuOpts_TRUNC_XIB (1 << 2) -+#define AuOpts_REFRESH_DYAOP (1 << 3) -+#define AuOpts_REFRESH_IDOP (1 << 4) -+#define AuOpts_DR_FLUSHED (1 << 5) -+#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) -+#define au_fset_opts(flags, name) \ -+ do { (flags) |= AuOpts_##name; } while (0) -+#define au_fclr_opts(flags, name) \ -+ do { (flags) &= ~AuOpts_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpts_DR_FLUSHED -+#define AuOpts_DR_FLUSHED 0 -+#endif -+ -+struct au_opts { -+ struct au_opt *opt; -+ int max_opt; -+ -+ unsigned int given_udba; -+ unsigned int flags; -+ unsigned long sb_flags; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* opts.c */ -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm); -+const char *au_optstr_udba(int udba); -+const char *au_optstr_wbr_copyup(int wbr_copyup); -+const char *au_optstr_wbr_create(int wbr_create); -+ -+void au_opts_free(struct au_opts *opts); -+struct super_block; -+int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts); -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending); -+int au_opts_mount(struct super_block *sb, struct au_opts *opts); -+int au_opts_remount(struct super_block *sb, struct au_opts *opts); -+ -+unsigned int au_opt_udba(struct super_block *sb); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_OPTS_H__ */ -diff --git a/fs/aufs/plink.c b/fs/aufs/plink.c -new file mode 100644 -index 000000000000..1c67183bebfb ---- /dev/null -+++ b/fs/aufs/plink.c -@@ -0,0 +1,503 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * pseudo-link -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * the pseudo-link maintenance mode. -+ * during a user process maintains the pseudo-links, -+ * prohibit adding a new plink and branch manipulation. -+ * -+ * Flags -+ * NOPLM: -+ * For entry functions which will handle plink, and i_mutex is already held -+ * in VFS. -+ * They cannot wait and should return an error at once. -+ * Callers has to check the error. -+ * NOPLMW: -+ * For entry functions which will handle plink, but i_mutex is not held -+ * in VFS. -+ * They can wait the plink maintenance mode to finish. -+ * -+ * They behave like F_SETLK and F_SETLKW. -+ * If the caller never handle plink, then both flags are unnecessary. -+ */ -+ -+int au_plink_maint(struct super_block *sb, int flags) -+{ -+ int err; -+ pid_t pid, ppid; -+ struct task_struct *parent, *prev; -+ struct au_sbinfo *sbi; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(sb), PLINK)) -+ goto out; -+ -+ sbi = au_sbi(sb); -+ pid = sbi->si_plink_maint_pid; -+ if (!pid || pid == current->pid) -+ goto out; -+ -+ /* todo: it highly depends upon /sbin/mount.aufs */ -+ prev = NULL; -+ parent = current; -+ ppid = 0; -+ rcu_read_lock(); -+ while (1) { -+ parent = rcu_dereference(parent->real_parent); -+ if (parent == prev) -+ break; -+ ppid = task_pid_vnr(parent); -+ if (pid == ppid) { -+ rcu_read_unlock(); -+ goto out; -+ } -+ prev = parent; -+ } -+ rcu_read_unlock(); -+ -+ if (au_ftest_lock(flags, NOPLMW)) { -+ /* if there is no i_mutex lock in VFS, we don't need to wait */ -+ /* AuDebugOn(!lockdep_depth(current)); */ -+ while (sbi->si_plink_maint_pid) { -+ si_read_unlock(sb); -+ /* gave up wake_up_bit() */ -+ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint_pid); -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&sbi->si_nowait); -+ si_noflush_read_lock(sb); -+ } -+ } else if (au_ftest_lock(flags, NOPLM)) { -+ AuDbg("ppid %d, pid %d\n", ppid, pid); -+ err = -EAGAIN; -+ } -+ -+out: -+ return err; -+} -+ -+void au_plink_maint_leave(struct au_sbinfo *sbinfo) -+{ -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ sbinfo->si_plink_maint_pid = 0; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ wake_up_all(&sbinfo->si_plink_wq); -+} -+ -+int au_plink_maint_enter(struct super_block *sb) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ /* make sure i am the only one in this fs */ -+ si_write_lock(sb, AuLock_FLUSH); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ if (!sbinfo->si_plink_maint_pid) -+ sbinfo->si_plink_maint_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ } -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ AuDbg("%lu\n", icntnr->vfs_inode.i_ino); -+ hlist_bl_unlock(hbl); -+ } -+} -+#endif -+ -+/* is the inode pseudo-linked? */ -+int au_plink_test(struct inode *inode) -+{ -+ int found, i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ sbinfo = au_sbi(inode->i_sb); -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ found = 0; -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ return found; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generate a name for plink. -+ * the file will be stored under AUFS_WH_PLINKDIR. -+ */ -+/* 20 is max digits length of ulong 64 */ -+#define PLINK_NAME_LEN ((20 + 1) * 2) -+ -+static int plink_name(char *name, int len, struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ int rlen; -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, bindex); -+ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); -+ return rlen; -+} -+ -+struct au_do_plink_lkup_args { -+ struct dentry **errp; -+ struct qstr *tgtname; -+ struct dentry *h_parent; -+ struct au_branch *br; -+}; -+ -+static struct dentry *au_do_plink_lkup(struct qstr *tgtname, -+ struct dentry *h_parent, -+ struct au_branch *br) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_inode = d_inode(h_parent); -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2); -+ h_dentry = vfsub_lkup_one(tgtname, h_parent); -+ 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); -+} -+ -+/* 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 au_branch *br; -+ int wkq_err; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = QSTR_INIT(a, 0); -+ -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ br = au_sbr(inode->i_sb, bindex); -+ h_parent = br->br_wbr->wbr_plink; -+ 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 -+ }; -+ -+ 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); -+ -+ 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) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = au_br_mnt(br) -+ }; -+ struct inode *h_dir, *delegated; -+ -+ h_dir = d_inode(h_parent); -+ inode_lock_nested(h_dir, AuLsc_I_CHILD2); -+again: -+ h_path.dentry = vfsub_lkup_one(tgt, h_parent); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ /* wh.plink dir is not monitored */ -+ /* todo: is it really safe? */ -+ if (d_is_positive(h_path.dentry) -+ && d_inode(h_path.dentry) != d_inode(h_dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ dput(h_path.dentry); -+ h_path.dentry = NULL; -+ if (!err) -+ goto again; -+ } -+ if (!err && d_is_negative(h_path.dentry)) { -+ delegated = NULL; -+ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ dput(h_path.dentry); -+ -+out: -+ inode_unlock(h_dir); -+ return err; -+} -+ -+struct do_whplink_args { -+ int *errp; -+ struct qstr *tgt; -+ struct dentry *h_parent; -+ 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); -+} -+ -+static int whplink(struct dentry *h_dentry, struct inode *inode, -+ aufs_bindex_t bindex, struct au_branch *br) -+{ -+ int err, wkq_err; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ 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; -+ tgtname.len = plink_name(a, sizeof(a), inode, bindex); -+ -+ /* always superio. */ -+ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { -+ struct do_whplink_args args = { -+ .errp = &err, -+ .tgt = &tgtname, -+ .h_parent = h_parent, -+ .h_dentry = h_dentry, -+ .br = br -+ }; -+ 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); -+ -+ return err; -+} -+ -+/* -+ * create a new pseudo-link for @h_dentry on @bindex. -+ * the linked inode is held in aufs @inode. -+ */ -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ int found, err, cnt, i; -+ -+ sb = inode->i_sb; -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ found = au_plink_test(inode); -+ if (found) -+ return; -+ -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ au_igrab(inode); -+ -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) { -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ } -+ if (!found) { -+ icntnr = container_of(inode, struct au_icntnr, vfs_inode); -+ hlist_bl_add_head(&icntnr->plink, hbl); -+ } -+ hlist_bl_unlock(hbl); -+ if (!found) { -+ cnt = au_hbl_count(hbl); -+#define msg "unexpectedly unbalanced or too many pseudo-links" -+ if (cnt > AUFS_PLINK_WARN) -+ AuWarn1(msg ", %d\n", cnt); -+#undef msg -+ err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex)); -+ if (unlikely(err)) { -+ pr_warn("err %d, damaged pseudo link.\n", err); -+ au_hbl_del(&icntnr->plink, hbl); -+ iput(&icntnr->vfs_inode); -+ } -+ } else -+ iput(&icntnr->vfs_inode); -+} -+ -+/* free all plinks */ -+void au_plink_put(struct super_block *sb, int verbose) -+{ -+ int i, warned; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no spin_lock since sbinfo is write-locked */ -+ warned = 0; -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ if (!warned && verbose && !hlist_bl_empty(hbl)) { -+ pr_warn("pseudo-link is not flushed"); -+ warned = 1; -+ } -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) -+ iput(&icntnr->vfs_inode); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+void au_plink_clean(struct super_block *sb, int verbose) -+{ -+ struct dentry *root; -+ -+ root = sb->s_root; -+ aufs_write_lock(root); -+ if (au_opt_test(au_mntflags(sb), PLINK)) -+ au_plink_put(sb, verbose); -+ aufs_write_unlock(root); -+} -+ -+static int au_plink_do_half_refresh(struct inode *inode, aufs_bindex_t br_id) -+{ -+ int do_put; -+ aufs_bindex_t btop, bbot, bindex; -+ -+ do_put = 0; -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop >= 0) { -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ if (!au_h_iptr(inode, bindex) -+ || au_ii_br_id(inode, bindex) != br_id) -+ continue; -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ do_put = 1; -+ break; -+ } -+ if (do_put) -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex)) { -+ do_put = 0; -+ break; -+ } -+ } else -+ do_put = 1; -+ -+ return do_put; -+} -+ -+/* free the plinks on a branch specified by @br_id */ -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ struct inode *inode; -+ int i, do_put; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no bit_lock since sbinfo is write-locked */ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) { -+ inode = au_igrab(&icntnr->vfs_inode); -+ ii_write_lock_child(inode); -+ do_put = au_plink_do_half_refresh(inode, br_id); -+ if (do_put) { -+ hlist_bl_del(&icntnr->plink); -+ iput(inode); -+ } -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ } -+} -diff --git a/fs/aufs/poll.c b/fs/aufs/poll.c -new file mode 100644 -index 000000000000..ff7697c334b4 ---- /dev/null -+++ b/fs/aufs/poll.c -@@ -0,0 +1,38 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * poll operation -+ * There is only one filesystem which implements ->poll operation, currently. -+ */ -+ -+#include "aufs.h" -+ -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt) -+{ -+ __poll_t mask; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ /* We should pretend an error happened. */ -+ mask = EPOLLERR /* | EPOLLIN | EPOLLOUT */; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ if (IS_ERR(h_file)) { -+ AuDbg("h_file %ld\n", PTR_ERR(h_file)); -+ goto out; -+ } -+ -+ mask = vfs_poll(h_file, pt); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ if (mask & EPOLLERR) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -diff --git a/fs/aufs/posix_acl.c b/fs/aufs/posix_acl.c -new file mode 100644 -index 000000000000..946c2247e78d ---- /dev/null -+++ b/fs/aufs/posix_acl.c -@@ -0,0 +1,92 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * posix acl operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct posix_acl *aufs_get_acl(struct inode *inode, int type) -+{ -+ struct posix_acl *acl; -+ int err; -+ aufs_bindex_t bindex; -+ struct inode *h_inode; -+ struct super_block *sb; -+ -+ 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; -+ -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode -+ || ((h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)))) { -+ err = au_busy_or_stale(); -+ acl = ERR_PTR(err); -+ goto out; -+ } -+ -+ /* always topmost only */ -+ acl = get_acl(h_inode, type); -+ if (IS_ERR(acl)) -+ forget_cached_acl(inode, type); -+ else -+ set_cached_acl(inode, type, acl); -+ -+out: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ -+ AuTraceErrPtr(acl); -+ return acl; -+} -+ -+int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type) -+{ -+ int err; -+ ssize_t ssz; -+ struct dentry *dentry; -+ struct au_sxattr arg = { -+ .type = AU_ACL_SET, -+ .u.acl_set = { -+ .acl = acl, -+ .type = type -+ }, -+ }; -+ -+ IMustLock(inode); -+ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ dentry = dget(inode->i_sb->s_root); -+ else { -+ dentry = d_find_alias(inode); -+ if (!dentry) -+ dentry = d_find_any_alias(inode); -+ if (!dentry) { -+ pr_warn("cannot handle this inode, " -+ "please report to aufs-users ML\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ } -+ -+ ssz = au_sxattr(dentry, inode, &arg); -+ /* forget even it if succeeds since the branch might set differently */ -+ forget_cached_acl(inode, type); -+ dput(dentry); -+ err = ssz; -+ if (ssz >= 0) -+ err = 0; -+ -+out: -+ return err; -+} -diff --git a/fs/aufs/procfs.c b/fs/aufs/procfs.c -new file mode 100644 -index 000000000000..055e9bcc9af4 ---- /dev/null -+++ b/fs/aufs/procfs.c -@@ -0,0 +1,157 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * procfs interfaces -+ */ -+ -+#include -+#include "aufs.h" -+ -+static int au_procfs_plm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) { -+ au_plink_maint_leave(sbinfo); -+ kobject_put(&sbinfo->si_kobj); -+ } -+ -+ return 0; -+} -+ -+static void au_procfs_plm_write_clean(struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) -+ au_plink_clean(sbinfo->si_sb, /*verbose*/0); -+} -+ -+static int au_procfs_plm_write_si(struct file *file, unsigned long id) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ err = -EBUSY; -+ if (unlikely(file->private_data)) -+ goto out; -+ -+ sb = NULL; -+ /* don't use au_sbilist_lock() here */ -+ hlist_bl_lock(&au_sbilist); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ if (id == sysaufs_si_id(sbinfo)) { -+ if (kobject_get_unless_zero(&sbinfo->si_kobj)) -+ sb = sbinfo->si_sb; -+ break; -+ } -+ hlist_bl_unlock(&au_sbilist); -+ -+ err = -EINVAL; -+ if (unlikely(!sb)) -+ goto out; -+ -+ err = au_plink_maint_enter(sb); -+ if (!err) -+ /* keep kobject_get() */ -+ file->private_data = sbinfo; -+ else -+ kobject_put(&sbinfo->si_kobj); -+out: -+ return err; -+} -+ -+/* -+ * Accept a valid "si=xxxx" only. -+ * Once it is accepted successfully, accept "clean" too. -+ */ -+static ssize_t au_procfs_plm_write(struct file *file, const char __user *ubuf, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ unsigned long id; -+ /* last newline is allowed */ -+ char buf[3 + sizeof(unsigned long) * 2 + 1]; -+ -+ err = -EACCES; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(count > sizeof(buf))) -+ goto out; -+ -+ err = copy_from_user(buf, ubuf, count); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ buf[count] = 0; -+ -+ err = -EINVAL; -+ if (!strcmp("clean", buf)) { -+ au_procfs_plm_write_clean(file); -+ goto out_success; -+ } else if (unlikely(strncmp("si=", buf, 3))) -+ goto out; -+ -+ err = kstrtoul(buf + 3, 16, &id); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_procfs_plm_write_si(file, id); -+ if (unlikely(err)) -+ goto out; -+ -+out_success: -+ err = count; /* success */ -+out: -+ return err; -+} -+ -+static const struct proc_ops au_procfs_plm_op = { -+ .proc_write = au_procfs_plm_write, -+ .proc_release = au_procfs_plm_release -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct proc_dir_entry *au_procfs_dir; -+ -+void au_procfs_fin(void) -+{ -+ remove_proc_entry(AUFS_PLINK_MAINT_NAME, au_procfs_dir); -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+} -+ -+int __init au_procfs_init(void) -+{ -+ int err; -+ struct proc_dir_entry *entry; -+ -+ err = -ENOMEM; -+ au_procfs_dir = proc_mkdir(AUFS_PLINK_MAINT_DIR, NULL); -+ if (unlikely(!au_procfs_dir)) -+ goto out; -+ -+ entry = proc_create(AUFS_PLINK_MAINT_NAME, S_IFREG | 0200, -+ au_procfs_dir, &au_procfs_plm_op); -+ if (unlikely(!entry)) -+ goto out_dir; -+ -+ err = 0; -+ goto out; /* success */ -+ -+ -+out_dir: -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+out: -+ return err; -+} -diff --git a/fs/aufs/rdu.c b/fs/aufs/rdu.c -new file mode 100644 -index 000000000000..bef4607f057e ---- /dev/null -+++ b/fs/aufs/rdu.c -@@ -0,0 +1,371 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * readdir in userspace. -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* bits for struct aufs_rdu.flags */ -+#define AuRdu_CALLED 1 -+#define AuRdu_CONT (1 << 1) -+#define AuRdu_FULL (1 << 2) -+#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) -+#define au_fset_rdu(flags, name) \ -+ do { (flags) |= AuRdu_##name; } while (0) -+#define au_fclr_rdu(flags, name) \ -+ do { (flags) &= ~AuRdu_##name; } while (0) -+ -+struct au_rdu_arg { -+ struct dir_context ctx; -+ struct aufs_rdu *rdu; -+ union au_rdu_ent_ul ent; -+ unsigned long end; -+ -+ struct super_block *sb; -+ int err; -+}; -+ -+static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, -+ loff_t offset, u64 h_ino, unsigned int d_type) -+{ -+ int err, len; -+ struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); -+ struct aufs_rdu *rdu = arg->rdu; -+ struct au_rdu_ent ent; -+ -+ err = 0; -+ arg->err = 0; -+ au_fset_rdu(rdu->cookie.flags, CALLED); -+ len = au_rdu_len(nlen); -+ if (arg->ent.ul + len < arg->end) { -+ ent.ino = h_ino; -+ ent.bindex = rdu->cookie.bindex; -+ ent.type = d_type; -+ ent.nlen = nlen; -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ ent.type = DT_UNKNOWN; -+ -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = -EFAULT; -+ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) -+ goto out; -+ if (copy_to_user(arg->ent.e->name, name, nlen)) -+ goto out; -+ /* the terminating NULL */ -+ if (__put_user(0, arg->ent.e->name + nlen)) -+ goto out; -+ err = 0; -+ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ -+ arg->ent.ul += len; -+ rdu->rent++; -+ } else { -+ err = -EFAULT; -+ au_fset_rdu(rdu->cookie.flags, FULL); -+ rdu->full = 1; -+ rdu->tail = arg->ent; -+ } -+ -+out: -+ /* AuTraceErr(err); */ -+ return err; -+} -+ -+static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) -+{ -+ int err; -+ loff_t offset; -+ struct au_rdu_cookie *cookie = &arg->rdu->cookie; -+ -+ /* we don't have to care (FMODE_32BITHASH | FMODE_64BITHASH) for ext4 */ -+ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); -+ err = offset; -+ if (unlikely(offset != cookie->h_pos)) -+ goto out; -+ -+ err = 0; -+ do { -+ arg->err = 0; -+ au_fclr_rdu(cookie->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err -+ && au_ftest_rdu(cookie->flags, CALLED) -+ && !au_ftest_rdu(cookie->flags, FULL)); -+ cookie->h_pos = h_file->f_pos; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ aufs_bindex_t bbot; -+ struct au_rdu_arg arg = { -+ .ctx = { -+ .actor = au_rdu_fill -+ } -+ }; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct file *h_file; -+ struct au_rdu_cookie *cookie = &rdu->cookie; -+ -+ /* VERIFY_WRITE */ -+ err = !access_ok(rdu->ent.e, rdu->sz); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu->rent = 0; -+ rdu->tail = rdu->ent; -+ rdu->full = 0; -+ arg.rdu = rdu; -+ arg.ent = rdu->ent; -+ arg.end = arg.ent.ul; -+ arg.end += rdu->sz; -+ -+ err = -ENOTDIR; -+ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) -+ goto out; -+ -+ err = security_file_permission(file, MAY_READ); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock_shared(inode); -+ -+ arg.sb = inode->i_sb; -+ err = si_read_lock(arg.sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_mtx; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ /* todo: reval? */ -+ fi_read_lock(file); -+ -+ err = -EAGAIN; -+ if (unlikely(au_ftest_rdu(cookie->flags, CONT) -+ && cookie->generation != au_figen(file))) -+ goto out_unlock; -+ -+ err = 0; -+ if (!rdu->blk) { -+ rdu->blk = au_sbi(arg.sb)->si_rdblk; -+ if (!rdu->blk) -+ rdu->blk = au_dir_size(file, /*dentry*/NULL); -+ } -+ bbot = au_fbtop(file); -+ if (cookie->bindex < bbot) -+ cookie->bindex = bbot; -+ bbot = au_fbbot_dir(file); -+ /* AuDbg("b%d, b%d\n", cookie->bindex, bbot); */ -+ for (; !err && cookie->bindex <= bbot; -+ cookie->bindex++, cookie->h_pos = 0) { -+ h_file = au_hf_dir(file, cookie->bindex); -+ if (!h_file) -+ continue; -+ -+ au_fclr_rdu(cookie->flags, FULL); -+ err = au_rdu_do(h_file, &arg); -+ AuTraceErr(err); -+ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) -+ break; -+ } -+ AuDbg("rent %llu\n", rdu->rent); -+ -+ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { -+ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); -+ au_fset_rdu(cookie->flags, CONT); -+ cookie->generation = au_figen(file); -+ } -+ -+ ii_read_lock_child(inode); -+ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibtop(inode))); -+ ii_read_unlock(inode); -+ -+out_unlock: -+ fi_read_unlock(file); -+out_si: -+ si_read_unlock(arg.sb); -+out_mtx: -+ inode_unlock_shared(inode); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ ino_t ino; -+ unsigned long long nent; -+ union au_rdu_ent_ul *u; -+ struct au_rdu_ent ent; -+ struct super_block *sb; -+ -+ err = 0; -+ nent = rdu->nent; -+ u = &rdu->ent; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ while (nent-- > 0) { -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = copy_from_user(&ent, u->e, sizeof(ent)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&u->e->ino, sizeof(ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ -+ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ -+ if (!ent.wh) -+ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); -+ else -+ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, -+ &ino); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ break; -+ } -+ -+ err = __put_user(ino, &u->e->ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ u->ul += au_rdu_len(ent.nlen); -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_rdu_verify(struct aufs_rdu *rdu) -+{ -+ AuDbg("rdu{%llu, %p, %u | %u | %llu, %u, %u | " -+ "%llu, b%d, 0x%x, g%u}\n", -+ rdu->sz, rdu->ent.e, rdu->verify[AufsCtlRduV_SZ], -+ rdu->blk, -+ rdu->rent, rdu->shwh, rdu->full, -+ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, -+ rdu->cookie.generation); -+ -+ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu)) -+ return 0; -+ -+ AuDbg("%u:%u\n", -+ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu)); -+ return -EINVAL; -+} -+ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = (void __user *)arg; -+ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = compat_ptr(arg); -+ -+ /* todo: get_user()? */ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu.ent.e = compat_ptr(rdu.ent.ul); -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ rdu.ent.ul = ptr_to_compat(rdu.ent.e); -+ rdu.tail.ul = ptr_to_compat(rdu.tail.e); -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -diff --git a/fs/aufs/rwsem.h b/fs/aufs/rwsem.h -new file mode 100644 -index 000000000000..ab5af8236699 ---- /dev/null -+++ b/fs/aufs/rwsem.h -@@ -0,0 +1,60 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * simple read-write semaphore wrappers -+ */ -+ -+#ifndef __AUFS_RWSEM_H__ -+#define __AUFS_RWSEM_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+/* in the future, the name 'au_rwsem' will be totally gone */ -+#define au_rwsem rw_semaphore -+ -+/* to debug easier, do not make them inlined functions */ -+#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) -+/* rwsem_is_locked() is unusable */ -+#define AuRwMustReadLock(rw) AuDebugOn(!lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 1)) -+#define AuRwMustWriteLock(rw) AuDebugOn(!lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 0)) -+#define AuRwMustAnyLock(rw) AuDebugOn(!lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held(rw)) -+#define AuRwDestroy(rw) AuDebugOn(!lockdep_recursing(current) \ -+ && debug_locks \ -+ && lockdep_is_held(rw)) -+ -+#define au_rw_init(rw) init_rwsem(rw) -+ -+#define au_rw_init_wlock(rw) do { \ -+ au_rw_init(rw); \ -+ down_write(rw); \ -+ } while (0) -+ -+#define au_rw_init_wlock_nested(rw, lsc) do { \ -+ au_rw_init(rw); \ -+ down_write_nested(rw, lsc); \ -+ } while (0) -+ -+#define au_rw_read_lock(rw) down_read(rw) -+#define au_rw_read_lock_nested(rw, lsc) down_read_nested(rw, lsc) -+#define au_rw_read_unlock(rw) up_read(rw) -+#define au_rw_dgrade_lock(rw) downgrade_write(rw) -+#define au_rw_write_lock(rw) down_write(rw) -+#define au_rw_write_lock_nested(rw, lsc) down_write_nested(rw, lsc) -+#define au_rw_write_unlock(rw) up_write(rw) -+/* why is not _nested version defined? */ -+#define au_rw_read_trylock(rw) down_read_trylock(rw) -+#define au_rw_write_trylock(rw) down_write_trylock(rw) -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_RWSEM_H__ */ -diff --git a/fs/aufs/sbinfo.c b/fs/aufs/sbinfo.c -new file mode 100644 -index 000000000000..26c6afab5df6 ---- /dev/null -+++ b/fs/aufs/sbinfo.c -@@ -0,0 +1,301 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * superblock private data -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * they are necessary regardless sysfs is disabled. -+ */ -+void au_si_free(struct kobject *kobj) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ char *locked __maybe_unused; /* debug only */ -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ for (i = 0; i < AuPlink_NHASH; i++) -+ AuDebugOn(!hlist_bl_empty(sbinfo->si_plink + i)); -+ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); -+ -+ AuLCntZero(au_lcnt_read(&sbinfo->si_ninodes, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_ninodes, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&sbinfo->si_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_nfiles, /*do_sync*/0); -+ -+ dbgaufs_si_fin(sbinfo); -+ au_rw_write_lock(&sbinfo->si_rwsem); -+ au_br_free(sbinfo); -+ au_rw_write_unlock(&sbinfo->si_rwsem); -+ -+ au_kfree_try_rcu(sbinfo->si_branch); -+ mutex_destroy(&sbinfo->si_xib_mtx); -+ AuRwDestroy(&sbinfo->si_rwsem); -+ -+ au_lcnt_wait_for_fin(&sbinfo->si_ninodes); -+ /* si_nfiles is waited too */ -+ au_kfree_rcu(sbinfo); -+} -+ -+int au_si_alloc(struct super_block *sb) -+{ -+ int err, i; -+ struct au_sbinfo *sbinfo; -+ -+ err = -ENOMEM; -+ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); -+ if (unlikely(!sbinfo)) -+ goto out; -+ -+ /* will be reallocated separately */ -+ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); -+ if (unlikely(!sbinfo->si_branch)) -+ goto out_sbinfo; -+ -+ err = sysaufs_si_init(sbinfo); -+ if (!err) { -+ dbgaufs_si_null(sbinfo); -+ err = dbgaufs_si_init(sbinfo); -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ } -+ if (unlikely(err)) -+ goto out_br; -+ -+ au_nwt_init(&sbinfo->si_nowait); -+ au_rw_init_wlock(&sbinfo->si_rwsem); -+ -+ au_lcnt_init(&sbinfo->si_ninodes, /*release*/NULL); -+ au_lcnt_init(&sbinfo->si_nfiles, /*release*/NULL); -+ -+ sbinfo->si_bbot = -1; -+ sbinfo->si_last_br_id = AUFS_BRANCH_MAX / 2; -+ -+ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; -+ sbinfo->si_wbr_create = AuWbrCreate_Def; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; -+ -+ au_fhsm_init(sbinfo); -+ -+ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def); -+ -+ sbinfo->si_xino_jiffy = jiffies; -+ sbinfo->si_xino_expire -+ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC); -+ mutex_init(&sbinfo->si_xib_mtx); -+ /* leave si_xib_last_pindex and si_xib_next_bit */ -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_aopen); -+ -+ sbinfo->si_rdcache = msecs_to_jiffies(AUFS_RDCACHE_DEF * MSEC_PER_SEC); -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ sbinfo->si_dirwh = AUFS_DIRWH_DEF; -+ -+ for (i = 0; i < AuPlink_NHASH; i++) -+ INIT_HLIST_BL_HEAD(sbinfo->si_plink + i); -+ init_waitqueue_head(&sbinfo->si_plink_wq); -+ spin_lock_init(&sbinfo->si_plink_maint_lock); -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_files); -+ -+ /* with getattr by default */ -+ sbinfo->si_iop_array = aufs_iop; -+ -+ /* leave other members for sysaufs and si_mnt. */ -+ sbinfo->si_sb = sb; -+ sb->s_fs_info = sbinfo; -+ si_pid_set(sb); -+ return 0; /* success */ -+ -+out_br: -+ au_kfree_try_rcu(sbinfo->si_branch); -+out_sbinfo: -+ au_kfree_rcu(sbinfo); -+out: -+ return err; -+} -+ -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*brp) * (sbinfo->si_bbot + 1); -+ if (unlikely(!sz)) -+ sz = sizeof(*brp); -+ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (brp) { -+ sbinfo->si_branch = brp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_sigen_inc(struct super_block *sb) -+{ -+ unsigned int gen; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ gen = ++au_sbi(sb)->si_generation; -+ au_update_digen(sb->s_root); -+ inode = d_inode(sb->s_root); -+ au_update_iigen(inode, /*half*/0); -+ inode_inc_iversion(inode); -+ return gen; -+} -+ -+aufs_bindex_t au_new_br_id(struct super_block *sb) -+{ -+ aufs_bindex_t br_id; -+ int i; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { -+ br_id = ++sbinfo->si_last_br_id; -+ AuDebugOn(br_id < 0); -+ if (br_id && au_br_index(sb, br_id) < 0) -+ return br_id; -+ } -+ -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* it is ok that new 'nwt' tasks are appended while we are sleeping */ -+int si_read_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ err = 0; -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_read_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+int si_write_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_write_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* dentry and super_block lock. call at entry point */ -+int aufs_read_lock(struct dentry *dentry, int flags) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_ftest_lock(flags, DW)) -+ di_write_lock_child(dentry); -+ else -+ di_read_lock_child(dentry, flags); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ err = au_digen_test(dentry, au_sigen(sb)); -+ if (!au_opt_test(au_mntflags(sb), UDBA_NONE)) -+ AuDebugOn(!err && au_dbrange_test(dentry)); -+ else if (!err) -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) -+ aufs_read_unlock(dentry, flags); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_unlock(struct dentry *dentry, int flags) -+{ -+ if (au_ftest_lock(flags, DW)) -+ di_write_unlock(dentry); -+ else -+ di_read_unlock(dentry, flags); -+ si_read_unlock(dentry->d_sb); -+} -+ -+void aufs_write_lock(struct dentry *dentry) -+{ -+ si_write_lock(dentry->d_sb, AuLock_FLUSH | AuLock_NOPLMW); -+ di_write_lock_child(dentry); -+} -+ -+void aufs_write_unlock(struct dentry *dentry) -+{ -+ di_write_unlock(dentry); -+ si_write_unlock(dentry->d_sb); -+} -+ -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) -+{ -+ int err; -+ unsigned int sigen; -+ struct super_block *sb; -+ -+ sb = d1->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS)); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(d1, sigen); -+ AuDebugOn(!err && au_dbrange_test(d1)); -+ if (!err) { -+ err = au_digen_test(d2, sigen); -+ AuDebugOn(!err && au_dbrange_test(d2)); -+ } -+ if (unlikely(err)) -+ aufs_read_and_write_unlock2(d1, d2); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock2(d1, d2); -+ si_read_unlock(d1->d_sb); -+} -diff --git a/fs/aufs/super.c b/fs/aufs/super.c -new file mode 100644 -index 000000000000..589dd0122020 ---- /dev/null -+++ b/fs/aufs/super.c -@@ -0,0 +1,1034 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount and super_block operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * super_operations -+ */ -+static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) -+{ -+ struct au_icntnr *c; -+ -+ c = au_cache_alloc_icntnr(); -+ if (c) { -+ au_icntnr_init(c); -+ inode_set_iversion(&c->vfs_inode, 1); /* sigen(sb); */ -+ c->iinfo.ii_hinode = NULL; -+ return &c->vfs_inode; -+ } -+ return NULL; -+} -+ -+static void aufs_destroy_inode(struct inode *inode) -+{ -+ if (!au_is_bad_inode(inode)) -+ au_iinfo_fin(inode); -+} -+ -+static void aufs_free_inode(struct inode *inode) -+{ -+ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); -+} -+ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino) -+{ -+ struct inode *inode; -+ int err; -+ -+ inode = iget_locked(sb, ino); -+ if (unlikely(!inode)) { -+ inode = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ if (!(inode->i_state & I_NEW)) -+ goto out; -+ -+ err = au_xigen_new(inode); -+ if (!err) -+ err = au_iinfo_init(inode); -+ if (!err) -+ inode_inc_iversion(inode); -+ else { -+ iget_failed(inode); -+ inode = ERR_PTR(err); -+ } -+ -+out: -+ /* never return NULL */ -+ AuDebugOn(!inode); -+ AuTraceErrPtr(inode); -+ return inode; -+} -+ -+/* lock free root dinfo */ -+static int au_show_brs(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct path path; -+ struct au_hdentry *hdp; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ bindex = 0; -+ hdp = au_hdentry(au_di(sb->s_root), bindex); -+ for (; !err && bindex <= bbot; bindex++, hdp++) { -+ br = au_sbr(sb, bindex); -+ path.mnt = au_br_mnt(br); -+ path.dentry = hdp->hd_dentry; -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s", perm.a); -+ if (bindex != bbot) -+ seq_putc(seq, ':'); -+ } -+ } -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, -+ const char *append) -+{ -+ char *p; -+ -+ p = fmt; -+ while (*pat != ':') -+ *p++ = *pat++; -+ *p++ = *pat++; -+ strcpy(p, append); -+ AuDebugOn(strlen(fmt) >= len); -+} -+ -+static void au_show_wbr_create(struct seq_file *m, int v, -+ struct au_sbinfo *sbinfo) -+{ -+ const char *pat; -+ char fmt[32]; -+ struct au_wbr_mfs *mfs; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ seq_puts(m, ",create="); -+ pat = au_optstr_wbr_create(v); -+ mfs = &sbinfo->si_wbr_mfs; -+ switch (v) { -+ case AuWbrCreate_TDP: -+ case AuWbrCreate_RR: -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ seq_puts(m, pat); -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%lu"); -+ seq_printf(m, fmt, -+ jiffies_to_msecs(mfs->mfs_expire) -+ / MSEC_PER_SEC); -+ break; -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu:%lu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark, -+ jiffies_to_msecs(mfs->mfs_expire) / MSEC_PER_SEC); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static int au_show_xino(struct seq_file *seq, struct super_block *sb) -+{ -+#ifdef CONFIG_SYSFS -+ return 0; -+#else -+ int err; -+ const int len = sizeof(AUFS_XINO_FNAME) - 1; -+ aufs_bindex_t bindex, brid; -+ struct qstr *name; -+ struct file *f; -+ struct dentry *d, *h_root; -+ struct au_branch *br; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ err = 0; -+ f = au_sbi(sb)->si_xib; -+ if (!f) -+ goto out; -+ -+ /* stop printing the default xino path on the first writable branch */ -+ h_root = NULL; -+ bindex = au_xi_root(sb, f->f_path.dentry); -+ if (bindex >= 0) { -+ br = au_sbr_sb(sb, bindex); -+ h_root = au_br_dentry(br); -+ } -+ -+ d = f->f_path.dentry; -+ name = &d->d_name; -+ /* safe ->d_parent because the file is unlinked */ -+ if (d->d_parent == h_root -+ && name->len == len -+ && !memcmp(name->name, AUFS_XINO_FNAME, len)) -+ goto out; -+ -+ seq_puts(seq, ",xino="); -+ err = au_xino_path(seq, f); -+ -+out: -+ return err; -+#endif -+} -+ -+/* seq_file will re-call me in case of too long string */ -+static int aufs_show_options(struct seq_file *m, struct dentry *dentry) -+{ -+ int err; -+ unsigned int mnt_flags, v; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+#define AuBool(name, str) do { \ -+ v = au_opt_test(mnt_flags, name); \ -+ if (v != au_opt_test(AuOpt_Def, name)) \ -+ seq_printf(m, ",%s" #str, v ? "" : "no"); \ -+} while (0) -+ -+#define AuStr(name, str) do { \ -+ v = mnt_flags & AuOptMask_##name; \ -+ if (v != (AuOpt_Def & AuOptMask_##name)) \ -+ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ -+} while (0) -+ -+#define AuUInt(name, str, val) do { \ -+ if (val != AUFS_##name##_DEF) \ -+ seq_printf(m, "," #str "=%u", val); \ -+} while (0) -+ -+ sb = dentry->d_sb; -+ if (sb->s_flags & SB_POSIXACL) -+ seq_puts(m, ",acl"); -+#if 0 /* reserved for future use */ -+ if (sb->s_flags & SB_I_VERSION) -+ seq_puts(m, ",i_version"); -+#endif -+ -+ /* lock free root dinfo */ -+ si_noflush_read_lock(sb); -+ sbinfo = au_sbi(sb); -+ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); -+ -+ mnt_flags = au_mntflags(sb); -+ if (au_opt_test(mnt_flags, XINO)) { -+ err = au_show_xino(m, sb); -+ if (unlikely(err)) -+ goto out; -+ } else -+ seq_puts(m, ",noxino"); -+ -+ AuBool(TRUNC_XINO, trunc_xino); -+ AuStr(UDBA, udba); -+ AuBool(SHWH, shwh); -+ AuBool(PLINK, plink); -+ AuBool(DIO, dio); -+ AuBool(DIRPERM1, dirperm1); -+ -+ v = sbinfo->si_wbr_create; -+ if (v != AuWbrCreate_Def) -+ au_show_wbr_create(m, v, sbinfo); -+ -+ v = sbinfo->si_wbr_copyup; -+ if (v != AuWbrCopyup_Def) -+ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); -+ -+ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); -+ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) -+ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); -+ -+ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); -+ -+ v = jiffies_to_msecs(sbinfo->si_rdcache) / MSEC_PER_SEC; -+ AuUInt(RDCACHE, rdcache, v); -+ -+ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); -+ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); -+ -+ au_fhsm_show(m, sbinfo); -+ -+ AuBool(DIRREN, dirren); -+ AuBool(SUM, sum); -+ /* AuBool(SUM_W, wsum); */ -+ AuBool(WARN_PERM, warn_perm); -+ AuBool(VERBOSE, verbose); -+ -+out: -+ /* be sure to print "br:" last */ -+ if (!sysaufs_brs) { -+ seq_puts(m, ",br:"); -+ au_show_brs(m, sb); -+ } -+ si_read_unlock(sb); -+ return 0; -+ -+#undef AuBool -+#undef AuStr -+#undef AuUInt -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sum mode which returns the summation for statfs(2) */ -+ -+static u64 au_add_till_max(u64 a, u64 b) -+{ -+ u64 old; -+ -+ old = a; -+ a += b; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static u64 au_mul_till_max(u64 a, long mul) -+{ -+ u64 old; -+ -+ old = a; -+ a *= mul; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) -+{ -+ int err; -+ long bsize, factor; -+ u64 blocks, bfree, bavail, files, ffree; -+ aufs_bindex_t bbot, bindex, i; -+ unsigned char shared; -+ struct path h_path; -+ struct super_block *h_sb; -+ -+ err = 0; -+ bsize = LONG_MAX; -+ files = 0; -+ ffree = 0; -+ blocks = 0; -+ bfree = 0; -+ bavail = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path.mnt->mnt_sb; -+ shared = 0; -+ for (i = 0; !shared && i < bindex; i++) -+ shared = (au_sbr_sb(sb, i) == h_sb); -+ if (shared) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bsize > buf->f_bsize) { -+ /* -+ * we will reduce bsize, so we have to expand blocks -+ * etc. to match them again -+ */ -+ factor = (bsize / buf->f_bsize); -+ blocks = au_mul_till_max(blocks, factor); -+ bfree = au_mul_till_max(bfree, factor); -+ bavail = au_mul_till_max(bavail, factor); -+ bsize = buf->f_bsize; -+ } -+ -+ factor = (buf->f_bsize / bsize); -+ blocks = au_add_till_max(blocks, -+ au_mul_till_max(buf->f_blocks, factor)); -+ bfree = au_add_till_max(bfree, -+ au_mul_till_max(buf->f_bfree, factor)); -+ bavail = au_add_till_max(bavail, -+ au_mul_till_max(buf->f_bavail, factor)); -+ files = au_add_till_max(files, buf->f_files); -+ ffree = au_add_till_max(ffree, buf->f_ffree); -+ } -+ -+ buf->f_bsize = bsize; -+ buf->f_blocks = blocks; -+ buf->f_bfree = bfree; -+ buf->f_bavail = bavail; -+ buf->f_files = files; -+ buf->f_ffree = ffree; -+ buf->f_frsize = 0; -+ -+out: -+ return err; -+} -+ -+static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ -+ /* lock free root dinfo */ -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (!au_opt_test(au_mntflags(sb), SUM)) { -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_sbr_mnt(sb, 0); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ } else -+ err = au_statfs_sum(sb, buf); -+ si_read_unlock(sb); -+ -+ if (!err) { -+ buf->f_type = AUFS_SUPER_MAGIC; -+ buf->f_namelen = AUFS_MAX_NAMELEN; -+ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); -+ } -+ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_sync_fs(struct super_block *sb, int wait) -+{ -+ int err, e; -+ aufs_bindex_t bbot, bindex; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ -+ err = 0; -+ si_noflush_read_lock(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_writable(br->br_perm)) -+ continue; -+ -+ h_sb = au_sbr_sb(sb, bindex); -+ e = vfsub_sync_filesystem(h_sb, wait); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even if an error happens */ -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* final actions when unmounting a file system */ -+static void aufs_put_super(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo) -+ kobject_put(&sbinfo->si_kobj); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg) -+{ -+ void *array; -+ unsigned long long n, sz; -+ -+ array = NULL; -+ n = 0; -+ if (!*hint) -+ goto out; -+ -+ if (*hint > ULLONG_MAX / sizeof(array)) { -+ array = ERR_PTR(-EMFILE); -+ pr_err("hint %llu\n", *hint); -+ goto out; -+ } -+ -+ sz = sizeof(array) * *hint; -+ array = kzalloc(sz, GFP_NOFS); -+ if (unlikely(!array)) -+ array = vzalloc(sz); -+ if (unlikely(!array)) { -+ array = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ n = cb(sb, array, *hint, arg); -+ AuDebugOn(n > *hint); -+ -+out: -+ *hint = n; -+ return array; -+} -+ -+static unsigned long long au_iarray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct inode **p, *inode; -+ struct list_head *head; -+ -+ n = 0; -+ p = a; -+ head = arg; -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(inode, head, i_sb_list) { -+ if (!au_is_bad_inode(inode) -+ && au_ii(inode)->ii_btop >= 0) { -+ spin_lock(&inode->i_lock); -+ if (atomic_read(&inode->i_count)) { -+ au_igrab(inode); -+ *p++ = inode; -+ n++; -+ AuDebugOn(n > max); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ return n; -+} -+ -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_ninodes, /*do_rev*/1); -+ return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes); -+} -+ -+void au_iarray_free(struct inode **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ iput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * refresh dentry and inode at remount time. -+ */ -+/* todo: consolidate with simple_reval_dpath() and au_reval_for_attr() */ -+static int au_do_refresh(struct dentry *dentry, unsigned int dir_flags, -+ struct dentry *parent) -+{ -+ int err; -+ -+ di_write_lock_child(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ if (!err && dir_flags) -+ au_hn_reset(d_inode(dentry), dir_flags); -+ di_read_unlock(parent, AuLock_IR); -+ di_write_unlock(dentry); -+ -+ return err; -+} -+ -+static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen, -+ struct au_sbinfo *sbinfo, -+ const unsigned int dir_flags, unsigned int do_idop) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) { -+ if (d_really_is_positive(dentry)) { -+ if (!d_is_dir(dentry)) -+ err = au_do_refresh(dentry, /*dir_flags*/0, -+ parent); -+ else { -+ err = au_do_refresh(dentry, dir_flags, parent); -+ if (unlikely(err)) -+ au_fset_si(sbinfo, FAILED_REFRESH_DIR); -+ } -+ } else -+ err = au_do_refresh(dentry, /*dir_flags*/0, parent); -+ AuDbgDentry(dentry); -+ } -+ dput(parent); -+ -+ if (!err) { -+ if (do_idop) -+ au_refresh_dop(dentry, /*force_reval*/0); -+ } else -+ au_refresh_dop(dentry, /*force_reval*/1); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_refresh_d(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, i, j, ndentry, e; -+ unsigned int sigen; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *d; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root = sb->s_root; -+ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); -+ -+ if (do_idop) -+ au_refresh_dop(root, /*force_reval*/0); -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ sigen = au_sigen(sb); -+ sbinfo = au_sbi(sb); -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags, -+ do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even err */ -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_refresh_i(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int sigen; -+ unsigned long long max, ull; -+ struct inode *inode, **array; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ sigen = au_sigen(sb); -+ for (ull = 0; ull < max; ull++) { -+ inode = array[ull]; -+ if (unlikely(!inode)) -+ break; -+ -+ e = 0; -+ ii_write_lock_child(inode); -+ if (au_iigen(inode, NULL) != sigen) { -+ e = au_refresh_hinode_self(inode); -+ if (unlikely(e)) { -+ au_refresh_iop(inode, /*force_getattr*/1); -+ pr_err("error %d, i%lu\n", e, inode->i_ino); -+ if (!err) -+ err = e; -+ /* go on even if err */ -+ } -+ } -+ if (!e && do_idop) -+ au_refresh_iop(inode, /*force_getattr*/0); -+ ii_write_unlock(inode); -+ } -+ -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+static void au_remount_refresh(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int udba; -+ aufs_bindex_t bindex, bbot; -+ struct dentry *root; -+ struct inode *inode; -+ struct au_branch *br; -+ struct au_sbinfo *sbi; -+ -+ au_sigen_inc(sb); -+ sbi = au_sbi(sb); -+ au_fclr_si(sbi, FAILED_REFRESH_DIR); -+ -+ root = sb->s_root; -+ DiMustNoWaiters(root); -+ inode = d_inode(root); -+ IiMustNoWaiters(inode); -+ -+ udba = au_opt_udba(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(udba, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); -+ -+ if (do_idop) { -+ if (au_ftest_si(sbi, NO_DREVAL)) { -+ AuDebugOn(sb->s_d_op == &aufs_dop_noreval); -+ sb->s_d_op = &aufs_dop_noreval; -+ AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr); -+ sbi->si_iop_array = aufs_iop_nogetattr; -+ } else { -+ AuDebugOn(sb->s_d_op == &aufs_dop); -+ sb->s_d_op = &aufs_dop; -+ AuDebugOn(sbi->si_iop_array == aufs_iop); -+ sbi->si_iop_array = aufs_iop; -+ } -+ pr_info("reset to %ps and %ps\n", -+ sb->s_d_op, sbi->si_iop_array); -+ } -+ -+ di_write_unlock(root); -+ err = au_refresh_d(sb, do_idop); -+ e = au_refresh_i(sb, do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ au_cpup_attr_all(inode, /*force*/1); -+ -+ if (unlikely(err)) -+ AuIOErr("refresh failed, ignored, %d\n", err); -+} -+ -+/* stop extra interpretation of errno in mount(8), and strange error messages */ -+static int cvt_err(int err) -+{ -+ AuTraceErr(err); -+ -+ switch (err) { -+ case -ENOENT: -+ case -ENOTDIR: -+ case -EEXIST: -+ case -EIO: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int aufs_remount_fs(struct super_block *sb, int *flags, char *data) -+{ -+ int err, do_dx; -+ unsigned int mntflags; -+ struct au_opts opts = { -+ .opt = NULL -+ }; -+ struct dentry *root; -+ struct inode *inode; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ root = sb->s_root; -+ if (!data || !*data) { -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) { -+ di_write_lock_child(root); -+ err = au_opts_verify(sb, *flags, /*pending*/0); -+ aufs_write_unlock(root); -+ } -+ goto out; -+ } -+ -+ err = -ENOMEM; -+ opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!opts.opt)) -+ goto out; -+ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); -+ opts.flags = AuOpts_REMOUNT; -+ opts.sb_flags = *flags; -+ -+ /* parse it before aufs lock */ -+ err = au_opts_parse(sb, data, &opts); -+ if (unlikely(err)) -+ goto out_opts; -+ -+ sbinfo = au_sbi(sb); -+ inode = d_inode(root); -+ inode_lock(inode); -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_mtx; -+ di_write_lock_child(root); -+ -+ /* au_opts_remount() may return an error */ -+ err = au_opts_remount(sb, &opts); -+ au_opts_free(&opts); -+ -+ if (au_ftest_opts(opts.flags, REFRESH)) -+ au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_IDOP)); -+ -+ if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) { -+ mntflags = au_mntflags(sb); -+ do_dx = !!au_opt_test(mntflags, DIO); -+ au_dy_arefresh(do_dx); -+ } -+ -+ au_fhsm_wrote_all(sb, /*force*/1); /* ?? */ -+ aufs_write_unlock(root); -+ -+out_mtx: -+ inode_unlock(inode); -+out_opts: -+ free_page((unsigned long)opts.opt); -+out: -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+static const struct super_operations aufs_sop = { -+ .alloc_inode = aufs_alloc_inode, -+ .destroy_inode = aufs_destroy_inode, -+ .free_inode = aufs_free_inode, -+ /* always deleting, no clearing */ -+ .drop_inode = generic_delete_inode, -+ .show_options = aufs_show_options, -+ .statfs = aufs_statfs, -+ .put_super = aufs_put_super, -+ .sync_fs = aufs_sync_fs, -+ .remount_fs = aufs_remount_fs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int alloc_root(struct super_block *sb) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *root; -+ -+ err = -ENOMEM; -+ inode = au_iget_locked(sb, AUFS_ROOT_INO); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out; -+ -+ inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ -+ inode->i_fop = &aufs_dir_fop; -+ inode->i_mode = S_IFDIR; -+ set_nlink(inode, 2); -+ unlock_new_inode(inode); -+ -+ root = d_make_root(inode); -+ if (unlikely(!root)) -+ goto out; -+ err = PTR_ERR(root); -+ if (IS_ERR(root)) -+ goto out; -+ -+ err = au_di_init(root); -+ if (!err) { -+ sb->s_root = root; -+ return 0; /* success */ -+ } -+ dput(root); -+ -+out: -+ return err; -+} -+ -+static int aufs_fill_super(struct super_block *sb, void *raw_data, -+ int silent __maybe_unused) -+{ -+ int err; -+ struct au_opts opts = { -+ .opt = NULL -+ }; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root; -+ struct inode *inode; -+ char *arg = raw_data; -+ -+ if (unlikely(!arg || !*arg)) { -+ err = -EINVAL; -+ pr_err("no arg\n"); -+ goto out; -+ } -+ -+ err = -ENOMEM; -+ opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!opts.opt)) -+ goto out; -+ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); -+ opts.sb_flags = sb->s_flags; -+ -+ err = au_si_alloc(sb); -+ if (unlikely(err)) -+ goto out_opts; -+ sbinfo = au_sbi(sb); -+ -+ /* all timestamps always follow the ones on the branch */ -+ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; -+ sb->s_flags |= SB_I_VERSION; /* do we really need this? */ -+ sb->s_op = &aufs_sop; -+ sb->s_d_op = &aufs_dop; -+ sb->s_magic = AUFS_SUPER_MAGIC; -+ sb->s_maxbytes = 0; -+ sb->s_stack_depth = 1; -+ au_export_init(sb); -+ au_xattr_init(sb); -+ -+ err = alloc_root(sb); -+ if (unlikely(err)) { -+ si_write_unlock(sb); -+ goto out_info; -+ } -+ root = sb->s_root; -+ inode = d_inode(root); -+ -+ /* -+ * actually we can parse options regardless aufs lock here. -+ * but at remount time, parsing must be done before aufs lock. -+ * so we follow the same rule. -+ */ -+ ii_write_lock_parent(inode); -+ aufs_write_unlock(root); -+ err = au_opts_parse(sb, arg, &opts); -+ if (unlikely(err)) -+ goto out_root; -+ -+ /* lock vfs_inode first, then aufs. */ -+ inode_lock(inode); -+ aufs_write_lock(root); -+ err = au_opts_mount(sb, &opts); -+ au_opts_free(&opts); -+ if (!err && au_ftest_si(sbinfo, NO_DREVAL)) { -+ sb->s_d_op = &aufs_dop_noreval; -+ pr_info("%ps\n", sb->s_d_op); -+ au_refresh_dop(root, /*force_reval*/0); -+ sbinfo->si_iop_array = aufs_iop_nogetattr; -+ au_refresh_iop(inode, /*force_getattr*/0); -+ } -+ aufs_write_unlock(root); -+ inode_unlock(inode); -+ if (!err) -+ goto out_opts; /* success */ -+ -+out_root: -+ dput(root); -+ sb->s_root = NULL; -+out_info: -+ kobject_put(&sbinfo->si_kobj); -+ sb->s_fs_info = NULL; -+out_opts: -+ free_page((unsigned long)opts.opt); -+out: -+ AuTraceErr(err); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *aufs_mount(struct file_system_type *fs_type, int flags, -+ const char *dev_name __maybe_unused, -+ void *raw_data) -+{ -+ struct dentry *root; -+ -+ /* all timestamps always follow the ones on the branch */ -+ /* mnt->mnt_flags |= MNT_NOATIME | MNT_NODIRATIME; */ -+ root = mount_nodev(fs_type, flags, raw_data, aufs_fill_super); -+ if (IS_ERR(root)) -+ goto out; -+ -+ au_sbilist_add(root->d_sb); -+ -+out: -+ return root; -+} -+ -+static void aufs_kill_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo) { -+ au_sbilist_del(sb); -+ aufs_write_lock(sb->s_root); -+ au_fhsm_fin(sb); -+ if (sbinfo->si_wbr_create_ops->fin) -+ sbinfo->si_wbr_create_ops->fin(sb); -+ if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) { -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE); -+ au_remount_refresh(sb, /*do_idop*/0); -+ } -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_xino_clr(sb); -+ au_dr_opt_flush(sb); -+ sbinfo->si_sb = NULL; -+ aufs_write_unlock(sb->s_root); -+ au_nwt_flush(&sbinfo->si_nowait); -+ } -+ kill_anon_super(sb); -+} -+ -+struct file_system_type aufs_fs_type = { -+ .name = AUFS_FSTYPE, -+ /* a race between rename and others */ -+ .fs_flags = FS_RENAME_DOES_D_MOVE, -+ .mount = aufs_mount, -+ .kill_sb = aufs_kill_sb, -+ /* no need to __module_get() and module_put(). */ -+ .owner = THIS_MODULE, -+}; -diff --git a/fs/aufs/super.h b/fs/aufs/super.h -new file mode 100644 -index 000000000000..f840eedbd572 ---- /dev/null -+++ b/fs/aufs/super.h -@@ -0,0 +1,574 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * super_block operations -+ */ -+ -+#ifndef __AUFS_SUPER_H__ -+#define __AUFS_SUPER_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "hbl.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "wkq.h" -+ -+/* policies to select one among multiple writable branches */ -+struct au_wbr_copyup_operations { -+ int (*copyup)(struct dentry *dentry); -+}; -+ -+#define AuWbr_DIR 1 /* target is a dir */ -+#define AuWbr_PARENT (1 << 1) /* always require a parent */ -+ -+#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) -+#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } -+#define au_fclr_wbr(flags, name) { (flags) &= ~AuWbr_##name; } -+ -+struct au_wbr_create_operations { -+ int (*create)(struct dentry *dentry, unsigned int flags); -+ int (*init)(struct super_block *sb); -+ int (*fin)(struct super_block *sb); -+}; -+ -+struct au_wbr_mfs { -+ struct mutex mfs_lock; /* protect this structure */ -+ unsigned long mfs_jiffy; -+ unsigned long mfs_expire; -+ aufs_bindex_t mfs_bindex; -+ -+ unsigned long long mfsrr_bytes; -+ unsigned long long mfsrr_watermark; -+}; -+ -+#define AuPlink_NHASH 100 -+static inline int au_plink_hash(ino_t ino) -+{ -+ return ino % AuPlink_NHASH; -+} -+ -+/* File-based Hierarchical Storage Management */ -+struct au_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ /* allow only one process who can receive the notification */ -+ spinlock_t fhsm_spin; -+ pid_t fhsm_pid; -+ wait_queue_head_t fhsm_wqh; -+ atomic_t fhsm_readable; -+ -+ /* these are protected by si_rwsem */ -+ unsigned long fhsm_expire; -+ aufs_bindex_t fhsm_bottom; -+#endif -+}; -+ -+struct au_branch; -+struct au_sbinfo { -+ /* nowait tasks in the system-wide workqueue */ -+ struct au_nowait_tasks si_nowait; -+ -+ /* -+ * tried sb->s_umount, but failed due to the dependency between i_mutex. -+ * rwsem for au_sbinfo is necessary. -+ */ -+ struct au_rwsem si_rwsem; -+ -+ /* -+ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from -+ * remount. -+ */ -+ au_lcnt_t si_ninodes, si_nfiles; -+ -+ /* branch management */ -+ unsigned int si_generation; -+ -+ /* see AuSi_ flags */ -+ unsigned char au_si_status; -+ -+ aufs_bindex_t si_bbot; -+ -+ /* dirty trick to keep br_id plus */ -+ unsigned int si_last_br_id : -+ sizeof(aufs_bindex_t) * BITS_PER_BYTE - 1; -+ struct au_branch **si_branch; -+ -+ /* policy to select a writable branch */ -+ unsigned char si_wbr_copyup; -+ unsigned char si_wbr_create; -+ struct au_wbr_copyup_operations *si_wbr_copyup_ops; -+ struct au_wbr_create_operations *si_wbr_create_ops; -+ -+ /* round robin */ -+ atomic_t si_wbr_rr_next; -+ -+ /* most free space */ -+ struct au_wbr_mfs si_wbr_mfs; -+ -+ /* File-based Hierarchical Storage Management */ -+ struct au_fhsm si_fhsm; -+ -+ /* mount flags */ -+ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ -+ unsigned int si_mntflags; -+ -+ /* external inode number (bitmap and translation table) */ -+ loff_t si_ximaxent; /* max entries in a xino */ -+ -+ struct file *si_xib; -+ struct mutex si_xib_mtx; /* protect xib members */ -+ unsigned long *si_xib_buf; -+ unsigned long si_xib_last_pindex; -+ int si_xib_next_bit; -+ -+ unsigned long si_xino_jiffy; -+ unsigned long si_xino_expire; -+ /* reserved for future use */ -+ /* unsigned long long si_xib_limit; */ /* Max xib file size */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+ /* i_generation */ -+ /* todo: make xigen file an array to support many inode numbers */ -+ struct file *si_xigen; -+ atomic_t si_xigen_next; -+#endif -+ -+ /* dirty trick to support atomic_open */ -+ struct hlist_bl_head si_aopen; -+ -+ /* vdir parameters */ -+ unsigned long si_rdcache; /* max cache time in jiffies */ -+ unsigned int si_rdblk; /* deblk size */ -+ unsigned int si_rdhash; /* hash size */ -+ -+ /* -+ * If the number of whiteouts are larger than si_dirwh, leave all of -+ * them after au_whtmp_ren to reduce the cost of rmdir(2). -+ * future fsck.aufs or kernel thread will remove them later. -+ * Otherwise, remove all whiteouts and the dir in rmdir(2). -+ */ -+ unsigned int si_dirwh; -+ -+ /* pseudo_link list */ -+ struct hlist_bl_head si_plink[AuPlink_NHASH]; -+ wait_queue_head_t si_plink_wq; -+ spinlock_t si_plink_maint_lock; -+ pid_t si_plink_maint_pid; -+ -+ /* file list */ -+ struct hlist_bl_head si_files; -+ -+ /* with/without getattr, brother of sb->s_d_op */ -+ const struct inode_operations *si_iop_array; -+ -+ /* -+ * sysfs and lifetime management. -+ * this is not a small structure and it may be a waste of memory in case -+ * of sysfs is disabled, particularly when many aufs-es are mounted. -+ * but using sysfs is majority. -+ */ -+ struct kobject si_kobj; -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *si_dbgaufs; -+ struct dentry *si_dbgaufs_plink; -+ struct dentry *si_dbgaufs_xib; -+#ifdef CONFIG_AUFS_EXPORT -+ struct dentry *si_dbgaufs_xigen; -+#endif -+#endif -+ -+#ifdef CONFIG_AUFS_SBILIST -+ struct hlist_bl_node si_list; -+#endif -+ -+ /* dirty, necessary for unmounting, sysfs and sysrq */ -+ struct super_block *si_sb; -+}; -+ -+/* sbinfo status flags */ -+/* -+ * set true when refresh_dirs() failed at remount time. -+ * then try refreshing dirs at access time again. -+ * if it is false, refreshing dirs at access time is unnecessary -+ */ -+#define AuSi_FAILED_REFRESH_DIR 1 -+#define AuSi_FHSM (1 << 1) /* fhsm is active now */ -+#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ -+ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuSi_FHSM -+#define AuSi_FHSM 0 -+#endif -+ -+static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, -+ unsigned int flag) -+{ -+ AuRwMustAnyLock(&sbi->si_rwsem); -+ return sbi->au_si_status & flag; -+} -+#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) -+#define au_fset_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status |= AuSi_##name; \ -+} while (0) -+#define au_fclr_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status &= ~AuSi_##name; \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policy to select one among writable branches */ -+#define AuWbrCopyup(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) -+#define AuWbrCreate(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) -+ -+/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ -+#define AuLock_DW 1 /* write-lock dentry */ -+#define AuLock_IR (1 << 1) /* read-lock inode */ -+#define AuLock_IW (1 << 2) /* write-lock inode */ -+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ -+#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ -+ /* except RENAME_EXCHANGE */ -+#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ -+#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ -+#define AuLock_GEN (1 << 7) /* test digen/iigen */ -+#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) -+#define au_fset_lock(flags, name) \ -+ do { (flags) |= AuLock_##name; } while (0) -+#define au_fclr_lock(flags, name) \ -+ do { (flags) &= ~AuLock_##name; } while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* super.c */ -+extern struct file_system_type aufs_fs_type; -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino); -+typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array, -+ unsigned long long max, void *arg); -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg); -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max); -+void au_iarray_free(struct inode **a, unsigned long long max); -+ -+/* sbinfo.c */ -+void au_si_free(struct kobject *kobj); -+int au_si_alloc(struct super_block *sb); -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink); -+ -+unsigned int au_sigen_inc(struct super_block *sb); -+aufs_bindex_t au_new_br_id(struct super_block *sb); -+ -+int si_read_lock(struct super_block *sb, int flags); -+int si_write_lock(struct super_block *sb, int flags); -+int aufs_read_lock(struct dentry *dentry, int flags); -+void aufs_read_unlock(struct dentry *dentry, int flags); -+void aufs_write_lock(struct dentry *dentry); -+void aufs_write_unlock(struct dentry *dentry); -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags); -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+/* wbr_policy.c */ -+extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; -+extern struct au_wbr_create_operations au_wbr_create_ops[]; -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex); -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop); -+ -+/* mvdown.c */ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *arg); -+ -+#ifdef CONFIG_AUFS_FHSM -+/* fhsm.c */ -+ -+static inline pid_t au_fhsm_pid(struct au_fhsm *fhsm) -+{ -+ pid_t pid; -+ -+ spin_lock(&fhsm->fhsm_spin); -+ pid = fhsm->fhsm_pid; -+ spin_unlock(&fhsm->fhsm_spin); -+ -+ return pid; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force); -+void au_fhsm_wrote_all(struct super_block *sb, int force); -+int au_fhsm_fd(struct super_block *sb, int oflags); -+int au_fhsm_br_alloc(struct au_branch *br); -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex); -+void au_fhsm_fin(struct super_block *sb); -+void au_fhsm_init(struct au_sbinfo *sbinfo); -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec); -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo); -+#else -+AuStubVoid(au_fhsm_wrote, struct super_block *sb, aufs_bindex_t bindex, -+ int force) -+AuStubVoid(au_fhsm_wrote_all, struct super_block *sb, int force) -+AuStub(int, au_fhsm_fd, return -EOPNOTSUPP, struct super_block *sb, int oflags) -+AuStub(pid_t, au_fhsm_pid, return 0, struct au_fhsm *fhsm) -+AuStubInt0(au_fhsm_br_alloc, struct au_branch *br) -+AuStubVoid(au_fhsm_set_bottom, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(au_fhsm_fin, struct super_block *sb) -+AuStubVoid(au_fhsm_init, struct au_sbinfo *sbinfo) -+AuStubVoid(au_fhsm_set, struct au_sbinfo *sbinfo, unsigned int sec) -+AuStubVoid(au_fhsm_show, struct seq_file *seq, struct au_sbinfo *sbinfo) -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_sbinfo *au_sbi(struct super_block *sb) -+{ -+ return sb->s_fs_info; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+int au_test_nfsd(void); -+void au_export_init(struct super_block *sb); -+void au_xigen_inc(struct inode *inode); -+int au_xigen_new(struct inode *inode); -+int au_xigen_set(struct super_block *sb, struct path *path); -+void au_xigen_clr(struct super_block *sb); -+ -+static inline int au_busy_or_stale(void) -+{ -+ if (!au_test_nfsd()) -+ return -EBUSY; -+ return -ESTALE; -+} -+#else -+AuStubInt0(au_test_nfsd, void) -+AuStubVoid(au_export_init, struct super_block *sb) -+AuStubVoid(au_xigen_inc, struct inode *inode) -+AuStubInt0(au_xigen_new, struct inode *inode) -+AuStubInt0(au_xigen_set, struct super_block *sb, struct path *path) -+AuStubVoid(au_xigen_clr, struct super_block *sb) -+AuStub(int, au_busy_or_stale, return -EBUSY, void) -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* module.c */ -+extern struct hlist_bl_head au_sbilist; -+ -+static inline void au_sbilist_init(void) -+{ -+ INIT_HLIST_BL_HEAD(&au_sbilist); -+} -+ -+static inline void au_sbilist_add(struct super_block *sb) -+{ -+ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+static inline void au_sbilist_del(struct super_block *sb) -+{ -+ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+static inline void au_sbilist_lock(void) -+{ -+ hlist_bl_lock(&au_sbilist); -+} -+ -+static inline void au_sbilist_unlock(void) -+{ -+ hlist_bl_unlock(&au_sbilist); -+} -+#define AuGFP_SBILIST GFP_ATOMIC -+#else -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+#else -+AuStubVoid(au_sbilist_init, void) -+AuStubVoid(au_sbilist_add, struct super_block *sb) -+AuStubVoid(au_sbilist_del, struct super_block *sb) -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+#ifdef CONFIG_DEBUG_FS -+ sbinfo->si_dbgaufs = NULL; -+ sbinfo->si_dbgaufs_plink = NULL; -+ sbinfo->si_dbgaufs_xib = NULL; -+#ifdef CONFIG_AUFS_EXPORT -+ sbinfo->si_dbgaufs_xigen = NULL; -+#endif -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* current->atomic_flags */ -+/* this value should never corrupt the ones defined in linux/sched.h */ -+#define PFA_AUFS 0x10 -+ -+TASK_PFA_TEST(AUFS, test_aufs) /* task_test_aufs */ -+TASK_PFA_SET(AUFS, aufs) /* task_set_aufs */ -+TASK_PFA_CLEAR(AUFS, aufs) /* task_clear_aufs */ -+ -+static inline int si_pid_test(struct super_block *sb) -+{ -+ return !!task_test_aufs(current); -+} -+ -+static inline void si_pid_clr(struct super_block *sb) -+{ -+ AuDebugOn(!task_test_aufs(current)); -+ task_clear_aufs(current); -+} -+ -+static inline void si_pid_set(struct super_block *sb) -+{ -+ AuDebugOn(task_test_aufs(current)); -+ task_set_aufs(current); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock superblock. mainly for entry point functions */ -+#define __si_read_lock(sb) au_rw_read_lock(&au_sbi(sb)->si_rwsem) -+#define __si_write_lock(sb) au_rw_write_lock(&au_sbi(sb)->si_rwsem) -+#define __si_read_trylock(sb) au_rw_read_trylock(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock(sb) au_rw_write_trylock(&au_sbi(sb)->si_rwsem) -+/* -+#define __si_read_trylock_nested(sb) \ -+ au_rw_read_trylock_nested(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock_nested(sb) \ -+ au_rw_write_trylock_nested(&au_sbi(sb)->si_rwsem) -+*/ -+ -+#define __si_read_unlock(sb) au_rw_read_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_write_unlock(sb) au_rw_write_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_downgrade_lock(sb) au_rw_dgrade_lock(&au_sbi(sb)->si_rwsem) -+ -+#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) -+#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) -+#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) -+ -+static inline void si_noflush_read_lock(struct super_block *sb) -+{ -+ __si_read_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_read_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_read_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+static inline void si_noflush_write_lock(struct super_block *sb) -+{ -+ __si_write_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_write_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_write_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+#if 0 /* reserved */ -+static inline int si_read_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_read_trylock(sb); -+} -+#endif -+ -+static inline void si_read_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_read_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline int si_write_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_write_trylock(sb); -+} -+#endif -+ -+static inline void si_write_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_write_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline void si_downgrade_lock(struct super_block *sb) -+{ -+ __si_downgrade_lock(sb); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline aufs_bindex_t au_sbbot(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_bbot; -+} -+ -+static inline unsigned int au_mntflags(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_mntflags; -+} -+ -+static inline unsigned int au_sigen(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_generation; -+} -+ -+static inline struct au_branch *au_sbr(struct super_block *sb, -+ aufs_bindex_t bindex) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_branch[0 + bindex]; -+} -+ -+static inline loff_t au_xi_maxent(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_ximaxent; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_SUPER_H__ */ -diff --git a/fs/aufs/sysaufs.c b/fs/aufs/sysaufs.c -new file mode 100644 -index 000000000000..88d64b34555e ---- /dev/null -+++ b/fs/aufs/sysaufs.c -@@ -0,0 +1,80 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface and lifetime management -+ * they are necessary regardless sysfs is disabled. -+ */ -+ -+#include -+#include "aufs.h" -+ -+unsigned long sysaufs_si_mask; -+struct kset *sysaufs_kset; -+ -+#define AuSiAttr(_name) { \ -+ .attr = { .name = __stringify(_name), .mode = 0444 }, \ -+ .show = sysaufs_si_##_name, \ -+} -+ -+static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); -+struct attribute *sysaufs_si_attrs[] = { -+ &sysaufs_si_attr_xi_path.attr, -+ NULL, -+}; -+ -+static const struct sysfs_ops au_sbi_ops = { -+ .show = sysaufs_si_show -+}; -+ -+static struct kobj_type au_sbi_ktype = { -+ .release = au_si_free, -+ .sysfs_ops = &au_sbi_ops, -+ .default_attrs = sysaufs_si_attrs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ sbinfo->si_kobj.kset = sysaufs_kset; -+ /* cf. sysaufs_name() */ -+ err = kobject_init_and_add -+ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_kset->kobj*/NULL, -+ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); -+ -+ return err; -+} -+ -+void sysaufs_fin(void) -+{ -+ sysfs_remove_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ kset_unregister(sysaufs_kset); -+} -+ -+int __init sysaufs_init(void) -+{ -+ int err; -+ -+ do { -+ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); -+ } while (!sysaufs_si_mask); -+ -+ err = -EINVAL; -+ sysaufs_kset = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); -+ if (unlikely(!sysaufs_kset)) -+ goto out; -+ err = PTR_ERR(sysaufs_kset); -+ if (IS_ERR(sysaufs_kset)) -+ goto out; -+ err = sysfs_create_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ if (unlikely(err)) -+ kset_unregister(sysaufs_kset); -+ -+out: -+ return err; -+} -diff --git a/fs/aufs/sysaufs.h b/fs/aufs/sysaufs.h -new file mode 100644 -index 000000000000..0d14752482cf ---- /dev/null -+++ b/fs/aufs/sysaufs.h -@@ -0,0 +1,89 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface and mount lifetime management -+ */ -+ -+#ifndef __SYSAUFS_H__ -+#define __SYSAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "module.h" -+ -+struct super_block; -+struct au_sbinfo; -+ -+struct sysaufs_si_attr { -+ struct attribute attr; -+ int (*show)(struct seq_file *seq, struct super_block *sb); -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sysaufs.c */ -+extern unsigned long sysaufs_si_mask; -+extern struct kset *sysaufs_kset; -+extern struct attribute *sysaufs_si_attrs[]; -+int sysaufs_si_init(struct au_sbinfo *sbinfo); -+int __init sysaufs_init(void); -+void sysaufs_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* some people doesn't like to show a pointer in kernel */ -+static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) -+{ -+ return sysaufs_si_mask ^ (unsigned long)sbinfo; -+} -+ -+#define SysaufsSiNamePrefix "si_" -+#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) -+static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) -+{ -+ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", -+ sysaufs_si_id(sbinfo)); -+} -+ -+struct au_branch; -+#ifdef CONFIG_SYSFS -+/* sysfs.c */ -+extern struct attribute_group *sysaufs_attr_group; -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf); -+long au_brinfo_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+ -+void sysaufs_br_init(struct au_branch *br); -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+ -+#define sysaufs_brs_init() do {} while (0) -+ -+#else -+#define sysaufs_attr_group NULL -+ -+AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) -+AuStub(ssize_t, sysaufs_si_show, return 0, struct kobject *kobj, -+ struct attribute *attr, char *buf) -+AuStubVoid(sysaufs_br_init, struct au_branch *br) -+AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+ -+static inline void sysaufs_brs_init(void) -+{ -+ sysaufs_brs = 0; -+} -+ -+#endif /* CONFIG_SYSFS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __SYSAUFS_H__ */ -diff --git a/fs/aufs/sysfs.c b/fs/aufs/sysfs.c -new file mode 100644 -index 000000000000..955ed071a12a ---- /dev/null -+++ b/fs/aufs/sysfs.c -@@ -0,0 +1,338 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static struct attribute *au_attr[] = { -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group sysaufs_attr_group_body = { -+ .attrs = au_attr -+}; -+ -+struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ err = au_xino_path(seq, au_sbi(sb)->si_xib); -+ seq_putc(seq, '\n'); -+ } -+ return err; -+} -+ -+/* -+ * the lifetime of branch is independent from the entry under sysfs. -+ * sysfs handles the lifetime of the entry, and never call ->show() after it is -+ * unlinked. -+ */ -+static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, -+ aufs_bindex_t bindex, int idx) -+{ -+ int err; -+ struct path path; -+ struct dentry *root; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ AuDbg("b%d\n", bindex); -+ -+ err = 0; -+ root = sb->s_root; -+ di_read_lock_parent(root, !AuLock_IR); -+ br = au_sbr(sb, bindex); -+ -+ switch (idx) { -+ case AuBrSysfs_BR: -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(root, bindex); -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s\n", perm.a); -+ } -+ break; -+ case AuBrSysfs_BRID: -+ seq_printf(seq, "%d\n", br->br_id); -+ break; -+ } -+ di_read_unlock(root, !AuLock_IR); -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct seq_file *au_seq(char *p, ssize_t len) -+{ -+ struct seq_file *seq; -+ -+ seq = kzalloc(sizeof(*seq), GFP_NOFS); -+ if (seq) { -+ /* mutex_init(&seq.lock); */ -+ seq->buf = p; -+ seq->size = len; -+ return seq; /* success */ -+ } -+ -+ seq = ERR_PTR(-ENOMEM); -+ return seq; -+} -+ -+#define SysaufsBr_PREFIX "br" -+#define SysaufsBrid_PREFIX "brid" -+ -+/* todo: file size may exceed PAGE_SIZE */ -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ int idx; -+ long l; -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct seq_file *seq; -+ char *name; -+ struct attribute **cattr; -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ sb = sbinfo->si_sb; -+ -+ /* -+ * prevent a race condition between sysfs and aufs. -+ * for instance, sysfs_file_read() calls sysfs_get_active_two() which -+ * prohibits maintaining the sysfs entries. -+ * hew we acquire read lock after sysfs_get_active_two(). -+ * on the other hand, the remount process may maintain the sysfs/aufs -+ * entries after acquiring write lock. -+ * it can cause a deadlock. -+ * simply we gave up processing read here. -+ */ -+ err = -EBUSY; -+ if (unlikely(!si_noflush_read_trylock(sb))) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_unlock; -+ -+ name = (void *)attr->name; -+ cattr = sysaufs_si_attrs; -+ while (*cattr) { -+ if (!strcmp(name, (*cattr)->name)) { -+ err = container_of(*cattr, struct sysaufs_si_attr, attr) -+ ->show(seq, sb); -+ goto out_seq; -+ } -+ cattr++; -+ } -+ -+ if (!strncmp(name, SysaufsBrid_PREFIX, -+ sizeof(SysaufsBrid_PREFIX) - 1)) { -+ idx = AuBrSysfs_BRID; -+ name += sizeof(SysaufsBrid_PREFIX) - 1; -+ } else if (!strncmp(name, SysaufsBr_PREFIX, -+ sizeof(SysaufsBr_PREFIX) - 1)) { -+ idx = AuBrSysfs_BR; -+ name += sizeof(SysaufsBr_PREFIX) - 1; -+ } else -+ BUG(); -+ -+ err = kstrtol(name, 10, &l); -+ if (!err) { -+ bbot = au_sbbot(sb); -+ if (l <= bbot) -+ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx); -+ else -+ err = -ENOENT; -+ } -+ -+out_seq: -+ if (!err) { -+ err = seq->count; -+ /* sysfs limit */ -+ if (unlikely(err == PAGE_SIZE)) -+ err = -EFBIG; -+ } -+ au_kfree_rcu(seq); -+out_unlock: -+ si_read_unlock(sb); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brinfo(struct super_block *sb, union aufs_brinfo __user *arg) -+{ -+ int err; -+ int16_t brid; -+ aufs_bindex_t bindex, bbot; -+ size_t sz; -+ char *buf; -+ struct seq_file *seq; -+ struct au_branch *br; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ bbot = au_sbbot(sb); -+ err = bbot + 1; -+ if (!arg) -+ goto out; -+ -+ err = -ENOMEM; -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_buf; -+ -+ sz = sizeof(*arg) - offsetof(union aufs_brinfo, path); -+ for (bindex = 0; bindex <= bbot; bindex++, arg++) { -+ /* VERIFY_WRITE */ -+ err = !access_ok(arg, sizeof(*arg)); -+ if (unlikely(err)) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ brid = br->br_id; -+ BUILD_BUG_ON(sizeof(brid) != sizeof(arg->id)); -+ err = __put_user(brid, &arg->id); -+ if (unlikely(err)) -+ break; -+ -+ BUILD_BUG_ON(sizeof(br->br_perm) != sizeof(arg->perm)); -+ err = __put_user(br->br_perm, &arg->perm); -+ if (unlikely(err)) -+ break; -+ -+ err = au_seq_path(seq, &br->br_path); -+ if (unlikely(err)) -+ break; -+ seq_putc(seq, '\0'); -+ if (!seq_has_overflowed(seq)) { -+ err = copy_to_user(arg->path, seq->buf, seq->count); -+ seq->count = 0; -+ if (unlikely(err)) -+ break; -+ } else { -+ err = -E2BIG; -+ goto out_seq; -+ } -+ } -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+out_seq: -+ au_kfree_rcu(seq); -+out_buf: -+ free_page((unsigned long)buf); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+long au_brinfo_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+void sysaufs_br_init(struct au_branch *br) -+{ -+ int i; -+ struct au_brsysfs *br_sysfs; -+ struct attribute *attr; -+ -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ attr = &br_sysfs->attr; -+ sysfs_attr_init(attr); -+ attr->name = br_sysfs->name; -+ attr->mode = 0444; -+ br_sysfs++; -+ } -+} -+ -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_branch *br; -+ struct kobject *kobj; -+ struct au_brsysfs *br_sysfs; -+ int i; -+ aufs_bindex_t bbot; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ sysfs_remove_file(kobj, &br_sysfs->attr); -+ br_sysfs++; -+ } -+ } -+} -+ -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, i; -+ aufs_bindex_t bbot; -+ struct kobject *kobj; -+ struct au_branch *br; -+ struct au_brsysfs *br_sysfs; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name), -+ SysaufsBr_PREFIX "%d", bindex); -+ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name), -+ SysaufsBrid_PREFIX "%d", bindex); -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ err = sysfs_create_file(kobj, &br_sysfs->attr); -+ if (unlikely(err)) -+ pr_warn("failed %s under sysfs(%d)\n", -+ br_sysfs->name, err); -+ br_sysfs++; -+ } -+ } -+} -diff --git a/fs/aufs/sysrq.c b/fs/aufs/sysrq.c -new file mode 100644 -index 000000000000..d51b95163e24 ---- /dev/null -+++ b/fs/aufs/sysrq.c -@@ -0,0 +1,136 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * magic sysrq handler -+ */ -+ -+/* #include */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void sysrq_sb(struct super_block *sb) -+{ -+ char *plevel; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ struct inode *i; -+ -+ plevel = au_plevel; -+ au_plevel = KERN_WARNING; -+ -+ /* since we define pr_fmt, call printk directly */ -+#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str) -+ -+ sbinfo = au_sbi(sb); -+ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); -+ pr("superblock\n"); -+ au_dpri_sb(sb); -+ -+#if 0 /* reserved */ -+ do { -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ -+ err = au_dpages_init(&dpages, GFP_ATOMIC); -+ if (unlikely(err)) -+ break; -+ err = au_dcsub_pages(&dpages, sb->s_root, NULL, NULL); -+ if (!err) -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) -+ au_dpri_dentry(dpage->dentries[j]); -+ } -+ au_dpages_free(&dpages); -+ } while (0); -+#endif -+ -+ pr("isolated inode\n"); -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { -+ spin_lock(&i->i_lock); -+ if (hlist_empty(&i->i_dentry)) -+ au_dpri_inode(i); -+ spin_unlock(&i->i_lock); -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ pr("files\n"); -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ umode_t mode; -+ -+ file = finfo->fi_file; -+ mode = file_inode(file)->i_mode; -+ if (!special_file(mode)) -+ au_dpri_file(file); -+ } -+ hlist_bl_unlock(files); -+ pr("done\n"); -+ -+#undef pr -+ au_plevel = plevel; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* module parameter */ -+static char *aufs_sysrq_key = "a"; -+module_param_named(sysrq, aufs_sysrq_key, charp, 0444); -+MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); -+ -+static void au_sysrq(int key __maybe_unused) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ lockdep_off(); -+ au_sbilist_lock(); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ sysrq_sb(sbinfo->si_sb); -+ au_sbilist_unlock(); -+ lockdep_on(); -+} -+ -+static struct sysrq_key_op au_sysrq_op = { -+ .handler = au_sysrq, -+ .help_msg = "Aufs", -+ .action_msg = "Aufs", -+ .enable_mask = SYSRQ_ENABLE_DUMP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_sysrq_init(void) -+{ -+ int err; -+ char key; -+ -+ err = -1; -+ key = *aufs_sysrq_key; -+ if ('a' <= key && key <= 'z') -+ err = register_sysrq_key(key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d, sysrq=%c\n", err, key); -+ return err; -+} -+ -+void au_sysrq_fin(void) -+{ -+ int err; -+ -+ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d (ignored)\n", err); -+} -diff --git a/fs/aufs/vdir.c b/fs/aufs/vdir.c -new file mode 100644 -index 000000000000..6cc7ecf0b0e1 ---- /dev/null -+++ b/fs/aufs/vdir.c -@@ -0,0 +1,883 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * virtual or vertical directory -+ */ -+ -+#include -+#include "aufs.h" -+ -+static unsigned int calc_size(int nlen) -+{ -+ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); -+} -+ -+static int set_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) { -+ p->de->de_str.len = 0; -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -1; /* error */ -+} -+ -+/* returns true or false */ -+static int is_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) -+ return !p->de->de_str.len; -+ return 1; -+} -+ -+static unsigned char *last_deblk(struct au_vdir *vdir) -+{ -+ return vdir->vd_deblk[vdir->vd_nblk - 1]; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* estimate the appropriate size for name hash table */ -+unsigned int au_rdhash_est(loff_t sz) -+{ -+ unsigned int n; -+ -+ n = UINT_MAX; -+ sz >>= 10; -+ if (sz < n) -+ n = sz; -+ if (sz < AUFS_RDHASH_DEF) -+ n = AUFS_RDHASH_DEF; -+ /* pr_info("n %u\n", n); */ -+ return n; -+} -+ -+/* -+ * the allocated memory has to be freed by -+ * au_nhash_wh_free() or au_nhash_de_free(). -+ */ -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) -+{ -+ struct hlist_head *head; -+ unsigned int u; -+ size_t sz; -+ -+ sz = sizeof(*nhash->nh_head) * num_hash; -+ head = kmalloc(sz, gfp); -+ if (head) { -+ nhash->nh_num = num_hash; -+ nhash->nh_head = head; -+ for (u = 0; u < num_hash; u++) -+ INIT_HLIST_HEAD(head++); -+ return 0; /* success */ -+ } -+ -+ return -ENOMEM; -+} -+ -+static void nhash_count(struct hlist_head *head) -+{ -+#if 0 /* debugging */ -+ unsigned long n; -+ struct hlist_node *pos; -+ -+ n = 0; -+ hlist_for_each(pos, head) -+ n++; -+ pr_info("%lu\n", n); -+#endif -+} -+ -+static void au_nhash_wh_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_wh *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, wh_hash) -+ au_kfree_rcu(pos); -+} -+ -+static void au_nhash_de_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_dehstr *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, hash) -+ au_cache_free_vdir_dehstr(pos); -+} -+ -+static void au_nhash_do_free(struct au_nhash *nhash, -+ void (*free)(struct hlist_head *head)) -+{ -+ unsigned int n; -+ struct hlist_head *head; -+ -+ n = nhash->nh_num; -+ if (!n) -+ return; -+ -+ head = nhash->nh_head; -+ while (n-- > 0) { -+ nhash_count(head); -+ free(head++); -+ } -+ au_kfree_try_rcu(nhash->nh_head); -+} -+ -+void au_nhash_wh_free(struct au_nhash *whlist) -+{ -+ au_nhash_do_free(whlist, au_nhash_wh_do_free); -+} -+ -+static void au_nhash_de_free(struct au_nhash *delist) -+{ -+ au_nhash_do_free(delist, au_nhash_de_do_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit) -+{ -+ int num; -+ unsigned int u, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ num = 0; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (u = 0; u < n; u++, head++) -+ hlist_for_each_entry(pos, head, wh_hash) -+ if (pos->wh_bindex == btgt && ++num > limit) -+ return 1; -+ return 0; -+} -+ -+static struct hlist_head *au_name_hash(struct au_nhash *nhash, -+ unsigned char *name, -+ unsigned int len) -+{ -+ unsigned int v; -+ /* const unsigned int magic_bit = 12; */ -+ -+ AuDebugOn(!nhash->nh_num || !nhash->nh_head); -+ -+ v = 0; -+ if (len > 8) -+ len = 8; -+ while (len--) -+ v += *name++; -+ /* v = hash_long(v, magic_bit); */ -+ v %= nhash->nh_num; -+ return nhash->nh_head + v; -+} -+ -+static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, -+ int nlen) -+{ -+ return str->len == nlen && !memcmp(str->name, name, nlen); -+} -+ -+/* returns found or not */ -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(whlist, name, nlen); -+ hlist_for_each_entry(pos, head, wh_hash) { -+ str = &pos->wh_str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* returns found(true) or not */ -+static int test_known(struct au_nhash *delist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_dehstr *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(delist, name, nlen); -+ hlist_for_each_entry(pos, head, hash) { -+ str = pos->str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, -+ unsigned char d_type) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ wh->wh_ino = ino; -+ wh->wh_type = d_type; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh) -+{ -+ int err; -+ struct au_vdir_destr *str; -+ struct au_vdir_wh *wh; -+ -+ AuDbg("%.*s\n", nlen, name); -+ AuDebugOn(!whlist->nh_num || !whlist->nh_head); -+ -+ err = -ENOMEM; -+ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); -+ if (unlikely(!wh)) -+ goto out; -+ -+ err = 0; -+ wh->wh_bindex = bindex; -+ if (shwh) -+ au_shwh_init_wh(wh, ino, d_type); -+ str = &wh->wh_str; -+ str->len = nlen; -+ memcpy(str->name, name, nlen); -+ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+static int append_deblk(struct au_vdir *vdir) -+{ -+ int err; -+ unsigned long ul; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, deblk_end; -+ unsigned char **o; -+ -+ err = -ENOMEM; -+ o = au_krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!o)) -+ goto out; -+ -+ vdir->vd_deblk = o; -+ p.deblk = kmalloc(deblk_sz, GFP_NOFS); -+ if (p.deblk) { -+ ul = vdir->vd_nblk++; -+ vdir->vd_deblk[ul] = p.deblk; -+ vdir->vd_last.ul = ul; -+ vdir->vd_last.p.deblk = p.deblk; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ } -+ -+out: -+ return err; -+} -+ -+static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, -+ unsigned int d_type, struct au_nhash *delist) -+{ -+ int err; -+ unsigned int sz; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, *room, deblk_end; -+ struct au_vdir_dehstr *dehstr; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ room = &vdir->vd_last.p; -+ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk -+ || !is_deblk_end(room, &deblk_end)); -+ -+ sz = calc_size(nlen); -+ if (unlikely(sz > deblk_end.deblk - room->deblk)) { -+ err = append_deblk(vdir); -+ if (unlikely(err)) -+ goto out; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ /* smp_mb(); */ -+ AuDebugOn(room->deblk != p.deblk); -+ } -+ -+ err = -ENOMEM; -+ dehstr = au_cache_alloc_vdir_dehstr(); -+ if (unlikely(!dehstr)) -+ goto out; -+ -+ dehstr->str = &room->de->de_str; -+ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); -+ room->de->de_ino = ino; -+ room->de->de_type = d_type; -+ room->de->de_str.len = nlen; -+ memcpy(room->de->de_str.name, name, nlen); -+ -+ err = 0; -+ room->deblk += sz; -+ if (unlikely(set_deblk_end(room, &deblk_end))) -+ err = append_deblk(vdir); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_vdir_free(struct au_vdir *vdir) -+{ -+ unsigned char **deblk; -+ -+ deblk = vdir->vd_deblk; -+ while (vdir->vd_nblk--) -+ au_kfree_try_rcu(*deblk++); -+ au_kfree_try_rcu(vdir->vd_deblk); -+ au_cache_free_vdir(vdir); -+} -+ -+static struct au_vdir *alloc_vdir(struct file *file) -+{ -+ struct au_vdir *vdir; -+ struct super_block *sb; -+ int err; -+ -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ err = -ENOMEM; -+ vdir = au_cache_alloc_vdir(); -+ if (unlikely(!vdir)) -+ goto out; -+ -+ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); -+ if (unlikely(!vdir->vd_deblk)) -+ goto out_free; -+ -+ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; -+ if (!vdir->vd_deblk_sz) { -+ /* estimate the appropriate size for deblk */ -+ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); -+ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ -+ } -+ vdir->vd_nblk = 0; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ err = append_deblk(vdir); -+ if (!err) -+ return vdir; /* success */ -+ -+ au_kfree_try_rcu(vdir->vd_deblk); -+ -+out_free: -+ au_cache_free_vdir(vdir); -+out: -+ vdir = ERR_PTR(err); -+ return vdir; -+} -+ -+static int reinit_vdir(struct au_vdir *vdir) -+{ -+ int err; -+ union au_vdir_deblk_p p, deblk_end; -+ -+ while (vdir->vd_nblk > 1) { -+ au_kfree_try_rcu(vdir->vd_deblk[vdir->vd_nblk - 1]); -+ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ -+ vdir->vd_nblk--; -+ } -+ p.deblk = vdir->vd_deblk[0]; -+ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ /* keep vd_dblk_sz */ -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ /* smp_mb(); */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuFillVdir_CALLED 1 -+#define AuFillVdir_WHABLE (1 << 1) -+#define AuFillVdir_SHWH (1 << 2) -+#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) -+#define au_fset_fillvdir(flags, name) \ -+ do { (flags) |= AuFillVdir_##name; } while (0) -+#define au_fclr_fillvdir(flags, name) \ -+ do { (flags) &= ~AuFillVdir_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuFillVdir_SHWH -+#define AuFillVdir_SHWH 0 -+#endif -+ -+struct fillvdir_arg { -+ struct dir_context ctx; -+ struct file *file; -+ struct au_vdir *vdir; -+ struct au_nhash delist; -+ struct au_nhash whlist; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ int err; -+}; -+ -+static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, -+ loff_t offset __maybe_unused, u64 h_ino, -+ unsigned int d_type) -+{ -+ struct fillvdir_arg *arg = container_of(ctx, struct fillvdir_arg, ctx); -+ char *name = (void *)__name; -+ struct super_block *sb; -+ ino_t ino; -+ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); -+ -+ arg->err = 0; -+ sb = arg->file->f_path.dentry->d_sb; -+ au_fset_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (nlen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (test_known(&arg->delist, name, nlen) -+ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already exists or whiteouted */ -+ -+ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); -+ if (!arg->err) { -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ d_type = DT_UNKNOWN; -+ arg->err = append_de(arg->vdir, name, nlen, ino, -+ d_type, &arg->delist); -+ } -+ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { -+ name += AUFS_WH_PFX_LEN; -+ nlen -= AUFS_WH_PFX_LEN; -+ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already whiteouted */ -+ -+ ino = 0; /* just to suppress a warning */ -+ if (shwh) -+ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, -+ &ino); -+ if (!arg->err) { -+ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) -+ d_type = DT_UNKNOWN; -+ arg->err = au_nhash_append_wh -+ (&arg->whlist, name, nlen, ino, d_type, -+ arg->bindex, shwh); -+ } -+ } -+ -+out: -+ if (!arg->err) -+ arg->vdir->vd_jiffy = jiffies; -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, -+ struct au_nhash *whlist, struct au_nhash *delist) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ int err; -+ unsigned int nh, u; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct hlist_node *n; -+ char *p, *o; -+ struct au_vdir_destr *destr; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); -+ -+ err = -ENOMEM; -+ o = p = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ nh = whlist->nh_num; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ for (u = 0; u < nh; u++) { -+ head = whlist->nh_head + u; -+ hlist_for_each_entry_safe(pos, n, head, wh_hash) { -+ destr = &pos->wh_str; -+ memcpy(p, destr->name, destr->len); -+ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, -+ pos->wh_ino, pos->wh_type, delist); -+ if (unlikely(err)) -+ break; -+ } -+ } -+ -+ free_page((unsigned long)o); -+ -+out: -+ AuTraceErr(err); -+ return err; -+#else -+ return 0; -+#endif -+} -+ -+static int au_do_read_vdir(struct fillvdir_arg *arg) -+{ -+ int err; -+ unsigned int rdhash; -+ loff_t offset; -+ aufs_bindex_t bbot, bindex, btop; -+ unsigned char shwh; -+ struct file *hf, *file; -+ struct super_block *sb; -+ -+ file = arg->file; -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); -+ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out_delist; -+ -+ err = 0; -+ arg->flags = 0; -+ shwh = 0; -+ if (au_opt_test(au_mntflags(sb), SHWH)) { -+ shwh = 1; -+ au_fset_fillvdir(arg->flags, SHWH); -+ } -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; !err && bindex <= bbot; bindex++) { -+ hf = au_hf_dir(file, bindex); -+ if (!hf) -+ continue; -+ -+ offset = vfsub_llseek(hf, 0, SEEK_SET); -+ err = offset; -+ if (unlikely(offset)) -+ break; -+ -+ arg->bindex = bindex; -+ au_fclr_fillvdir(arg->flags, WHABLE); -+ if (shwh -+ || (bindex != bbot -+ && au_br_whable(au_sbr_perm(sb, bindex)))) -+ au_fset_fillvdir(arg->flags, WHABLE); -+ do { -+ arg->err = 0; -+ au_fclr_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(hf, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); -+ -+ /* -+ * dir_relax() may be good for concurrency, but aufs should not -+ * use it since it will cause a lockdep problem. -+ */ -+ } -+ -+ if (!err && shwh) -+ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); -+ -+ au_nhash_wh_free(&arg->whlist); -+ -+out_delist: -+ au_nhash_de_free(&arg->delist); -+out: -+ return err; -+} -+ -+static int read_vdir(struct file *file, int may_read) -+{ -+ int err; -+ unsigned long expire; -+ unsigned char do_read; -+ struct fillvdir_arg arg = { -+ .ctx = { -+ .actor = fillvdir -+ } -+ }; -+ struct inode *inode; -+ struct au_vdir *vdir, *allocated; -+ -+ err = 0; -+ inode = file_inode(file); -+ IMustLock(inode); -+ IiMustWriteLock(inode); -+ SiMustAnyLock(inode->i_sb); -+ -+ allocated = NULL; -+ do_read = 0; -+ expire = au_sbi(inode->i_sb)->si_rdcache; -+ vdir = au_ivdir(inode); -+ if (!vdir) { -+ do_read = 1; -+ vdir = alloc_vdir(file); -+ err = PTR_ERR(vdir); -+ if (IS_ERR(vdir)) -+ goto out; -+ err = 0; -+ allocated = vdir; -+ } else if (may_read -+ && (!inode_eq_iversion(inode, vdir->vd_version) -+ || time_after(jiffies, vdir->vd_jiffy + expire))) { -+ do_read = 1; -+ err = reinit_vdir(vdir); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ if (!do_read) -+ return 0; /* success */ -+ -+ arg.file = file; -+ arg.vdir = vdir; -+ err = au_do_read_vdir(&arg); -+ if (!err) { -+ /* file->f_pos = 0; */ /* todo: ctx->pos? */ -+ vdir->vd_version = inode_query_iversion(inode); -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ if (allocated) -+ au_set_ivdir(inode, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) -+{ -+ int err, rerr; -+ unsigned long ul, n; -+ const unsigned int deblk_sz = src->vd_deblk_sz; -+ -+ AuDebugOn(tgt->vd_nblk != 1); -+ -+ err = -ENOMEM; -+ if (tgt->vd_nblk < src->vd_nblk) { -+ unsigned char **p; -+ -+ p = au_krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk = p; -+ } -+ -+ if (tgt->vd_deblk_sz != deblk_sz) { -+ unsigned char *p; -+ -+ tgt->vd_deblk_sz = deblk_sz; -+ p = au_krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS, -+ /*may_shrink*/1); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk[0] = p; -+ } -+ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); -+ tgt->vd_version = src->vd_version; -+ tgt->vd_jiffy = src->vd_jiffy; -+ -+ n = src->vd_nblk; -+ for (ul = 1; ul < n; ul++) { -+ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, -+ GFP_NOFS); -+ if (unlikely(!tgt->vd_deblk[ul])) -+ goto out; -+ tgt->vd_nblk++; -+ } -+ tgt->vd_nblk = n; -+ tgt->vd_last.ul = tgt->vd_last.ul; -+ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; -+ tgt->vd_last.p.deblk += src->vd_last.p.deblk -+ - src->vd_deblk[src->vd_last.ul]; -+ /* smp_mb(); */ -+ return 0; /* success */ -+ -+out: -+ rerr = reinit_vdir(tgt); -+ BUG_ON(rerr); -+ return err; -+} -+ -+int au_vdir_init(struct file *file) -+{ -+ int err; -+ struct inode *inode; -+ struct au_vdir *vdir_cache, *allocated; -+ -+ /* test file->f_pos here instead of ctx->pos */ -+ err = read_vdir(file, !file->f_pos); -+ if (unlikely(err)) -+ goto out; -+ -+ allocated = NULL; -+ vdir_cache = au_fvdir_cache(file); -+ if (!vdir_cache) { -+ vdir_cache = alloc_vdir(file); -+ err = PTR_ERR(vdir_cache); -+ if (IS_ERR(vdir_cache)) -+ goto out; -+ allocated = vdir_cache; -+ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { -+ /* test file->f_pos here instead of ctx->pos */ -+ err = reinit_vdir(vdir_cache); -+ if (unlikely(err)) -+ goto out; -+ } else -+ return 0; /* success */ -+ -+ inode = file_inode(file); -+ err = copy_vdir(vdir_cache, au_ivdir(inode)); -+ if (!err) { -+ file->f_version = inode_query_iversion(inode); -+ if (allocated) -+ au_set_fvdir_cache(file, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static loff_t calc_offset(struct au_vdir *vdir) -+{ -+ loff_t offset; -+ union au_vdir_deblk_p p; -+ -+ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; -+ offset = vdir->vd_last.p.deblk - p.deblk; -+ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; -+ return offset; -+} -+ -+/* returns true or false */ -+static int seek_vdir(struct file *file, struct dir_context *ctx) -+{ -+ int valid; -+ unsigned int deblk_sz; -+ unsigned long ul, n; -+ loff_t offset; -+ union au_vdir_deblk_p p, deblk_end; -+ struct au_vdir *vdir_cache; -+ -+ valid = 1; -+ vdir_cache = au_fvdir_cache(file); -+ offset = calc_offset(vdir_cache); -+ AuDbg("offset %lld\n", offset); -+ if (ctx->pos == offset) -+ goto out; -+ -+ vdir_cache->vd_last.ul = 0; -+ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; -+ if (!ctx->pos) -+ goto out; -+ -+ valid = 0; -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ ul = div64_u64(ctx->pos, deblk_sz); -+ AuDbg("ul %lu\n", ul); -+ if (ul >= vdir_cache->vd_nblk) -+ goto out; -+ -+ n = vdir_cache->vd_nblk; -+ for (; ul < n; ul++) { -+ p.deblk = vdir_cache->vd_deblk[ul]; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ offset = ul; -+ offset *= deblk_sz; -+ while (!is_deblk_end(&p, &deblk_end) && offset < ctx->pos) { -+ unsigned int l; -+ -+ l = calc_size(p.de->de_str.len); -+ offset += l; -+ p.deblk += l; -+ } -+ if (!is_deblk_end(&p, &deblk_end)) { -+ valid = 1; -+ vdir_cache->vd_last.ul = ul; -+ vdir_cache->vd_last.p = p; -+ break; -+ } -+ } -+ -+out: -+ /* smp_mb(); */ -+ if (!valid) -+ AuDbg("valid %d\n", !valid); -+ return valid; -+} -+ -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx) -+{ -+ unsigned int l, deblk_sz; -+ union au_vdir_deblk_p deblk_end; -+ struct au_vdir *vdir_cache; -+ struct au_vdir_de *de; -+ -+ if (!seek_vdir(file, ctx)) -+ return 0; -+ -+ vdir_cache = au_fvdir_cache(file); -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ while (1) { -+ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ deblk_end.deblk += deblk_sz; -+ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { -+ de = vdir_cache->vd_last.p.de; -+ AuDbg("%.*s, off%lld, i%lu, dt%d\n", -+ de->de_str.len, de->de_str.name, ctx->pos, -+ (unsigned long)de->de_ino, de->de_type); -+ if (unlikely(!dir_emit(ctx, de->de_str.name, -+ de->de_str.len, de->de_ino, -+ de->de_type))) { -+ /* todo: ignore the error caused by udba? */ -+ /* return err; */ -+ return 0; -+ } -+ -+ l = calc_size(de->de_str.len); -+ vdir_cache->vd_last.p.deblk += l; -+ ctx->pos += l; -+ } -+ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { -+ vdir_cache->vd_last.ul++; -+ vdir_cache->vd_last.p.deblk -+ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ ctx->pos = deblk_sz * vdir_cache->vd_last.ul; -+ continue; -+ } -+ break; -+ } -+ -+ /* smp_mb(); */ -+ return 0; -+} -diff --git a/fs/aufs/vfsub.c b/fs/aufs/vfsub.c -new file mode 100644 -index 000000000000..fa29c543cc28 ---- /dev/null -+++ b/fs/aufs/vfsub.c -@@ -0,0 +1,872 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb) -+{ -+ if (!au_test_fuse(h_sb) || !au_userns) -+ return 0; -+ -+ return is_current_mnt_ns(mnt) ? 0 : -EACCES; -+} -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb, int wait) -+{ -+ int err; -+ -+ lockdep_off(); -+ down_read(&h_sb->s_umount); -+ err = __sync_filesystem(h_sb, wait); -+ up_read(&h_sb->s_umount); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did) -+{ -+ int err; -+ struct kstat st; -+ struct super_block *h_sb; -+ -+ /* 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 */ -+ err = 0; -+ if (!did) -+ did = &err; -+ h_sb = h_path->dentry->d_sb; -+ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); -+ if (*did) -+ err = vfsub_getattr(h_path, &st); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct file *vfsub_dentry_open(struct path *path, int flags) -+{ -+ return dentry_open(path, flags /* | __FMODE_NONOTIFY */, -+ current_cred()); -+} -+ -+struct file *vfsub_filp_open(const char *path, int oflags, int mode) -+{ -+ struct file *file; -+ -+ lockdep_off(); -+ file = filp_open(path, -+ oflags /* | __FMODE_NONOTIFY */, -+ mode); -+ lockdep_on(); -+ if (IS_ERR(file)) -+ goto out; -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+out: -+ return file; -+} -+ -+/* -+ * Ideally this function should call VFS:do_last() in order to keep all its -+ * checkings. But it is very hard for aufs to regenerate several VFS internal -+ * structure such as nameidata. This is a second (or third) best approach. -+ * cf. linux/fs/namei.c:do_last(), lookup_open() and atomic_open(). -+ */ -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args) -+{ -+ int err; -+ struct au_branch *br = args->br; -+ struct file *file = args->file; -+ /* copied from linux/fs/namei.c:atomic_open() */ -+ struct dentry *const DENTRY_NOT_SET = (void *)-1UL; -+ -+ IMustLock(dir); -+ AuDebugOn(!dir->i_op->atomic_open); -+ -+ err = au_br_test_oflag(args->open_flag, br); -+ if (unlikely(err)) -+ goto out; -+ -+ au_lcnt_inc(&br->br_nfiles); -+ file->f_path.dentry = DENTRY_NOT_SET; -+ file->f_path.mnt = au_br_mnt(br); -+ AuDbg("%ps\n", dir->i_op->atomic_open); -+ err = dir->i_op->atomic_open(dir, dentry, file, args->open_flag, -+ args->create_mode); -+ if (unlikely(err < 0)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* temporary workaround for nfsv4 branch */ -+ if (au_test_nfs(dir->i_sb)) -+ nfs_mark_for_revalidate(dir); -+ -+ if (file->f_mode & FMODE_CREATED) -+ fsnotify_create(dir, dentry); -+ if (!(file->f_mode & FMODE_OPENED)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* todo: call VFS:may_open() here */ -+ /* todo: ima_file_check() too? */ -+ if (!err && (args->open_flag & __FMODE_EXEC)) -+ err = deny_write_access(file); -+ if (!err) -+ fsnotify_open(file); -+ else -+ au_lcnt_dec(&br->br_nfiles); -+ /* note that the file is created and still opened */ -+ -+out: -+ return err; -+} -+ -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) -+{ -+ int err; -+ -+ err = kern_path(name, flags, path); -+ if (!err && d_is_positive(path->dentry)) -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+struct dentry *vfsub_lookup_one_len_unlocked(const char *name, -+ struct dentry *parent, int len) -+{ -+ struct path path = { -+ .mnt = NULL -+ }; -+ -+ path.dentry = lookup_one_len_unlocked(name, parent, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (d_is_positive(path.dentry)) -+ 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, -+ int len) -+{ -+ struct path path = { -+ .mnt = NULL -+ }; -+ -+ /* VFS checks it too, but by WARN_ON_ONCE() */ -+ IMustLock(d_inode(parent)); -+ -+ path.dentry = lookup_one_len(name, parent, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (d_is_positive(path.dentry)) -+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ -+ -+out: -+ AuTraceErrPtr(path.dentry); -+ return path.dentry; -+} -+ -+void vfsub_call_lkup_one(void *args) -+{ -+ struct vfsub_lkup_one_args *a = args; -+ *a->errp = vfsub_lkup_one(a->name, a->parent); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ struct dentry *d; -+ -+ lockdep_off(); -+ d = lock_rename(d1, d2); -+ lockdep_on(); -+ au_hn_suspend(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_suspend(hdir2); -+ -+ return d; -+} -+ -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ au_hn_resume(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_resume(hdir2); -+ lockdep_off(); -+ unlock_rename(d1, d2); -+ lockdep_on(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, 0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_create(dir, path->dentry, mode, want_excl); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_symlink(path, d, symname); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_symlink(dir, path->dentry, symname); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_mknod(dir, path->dentry, mode, dev); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+static int au_test_nlink(struct inode *inode) -+{ -+ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ -+ -+ if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) -+ return 0; -+ return -EMLINK; -+} -+ -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ err = au_test_nlink(d_inode(src_dentry)); -+ if (unlikely(err)) -+ return err; -+ -+ /* we don't call may_linkat() */ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_link(src_dentry, path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_link(src_dentry, dir, path->dentry, delegated_inode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ /* fuse has different memory inode for the same inumber */ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags) -+{ -+ int err; -+ struct path tmp = { -+ .mnt = path->mnt -+ }; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ IMustLock(src_dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ tmp.dentry = src_dentry->d_parent; -+ err = security_path_rename(&tmp, src_dentry, path, d, /*flags*/0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_rename(src_dir, src_dentry, dir, path->dentry, -+ delegated_inode, flags); -+ lockdep_on(); -+ if (!err) { -+ int did; -+ -+ tmp.dentry = d->d_parent; -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mkdir(path, d, mode); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_mkdir(dir, path->dentry, mode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rmdir(struct inode *dir, struct path *path) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_rmdir(path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_rmdir(dir, path->dentry); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = { -+ .dentry = path->dentry->d_parent, -+ .mnt = path->mnt -+ }; -+ -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: support mmap_sem? */ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_read(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_read(file, kbuf, count, ppos); -+ lockdep_on(); -+ AuTraceErr(err); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_write(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_write(file, kbuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_flush(struct file *file, fl_owner_t id) -+{ -+ int err; -+ -+ err = 0; -+ if (file->f_op->flush) { -+ if (!au_test_nfs(file->f_path.dentry->d_sb)) -+ err = file->f_op->flush(file, id); -+ else { -+ lockdep_off(); -+ err = file->f_op->flush(file, id); -+ lockdep_on(); -+ } -+ if (!err) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); -+ /*ignore*/ -+ } -+ return err; -+} -+ -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ lockdep_off(); -+ err = iterate_dir(file, ctx); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+ return err; -+} -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_to(in, ppos, pipe, len, flags); -+ lockdep_on(); -+ file_accessed(in); -+ if (err >= 0) -+ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_from(pipe, out, ppos, len, flags); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_fsync(struct file *file, struct path *path, int datasync) -+{ -+ int err; -+ -+ /* file can be NULL */ -+ lockdep_off(); -+ err = vfs_fsync(file, datasync); -+ lockdep_on(); -+ if (!err) { -+ if (!path) { -+ AuDebugOn(!file); -+ path = &file->f_path; -+ } -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ } -+ return err; -+} -+ -+/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file) -+{ -+ int err; -+ struct inode *h_inode; -+ struct super_block *h_sb; -+ -+ if (!h_file) { -+ err = vfsub_truncate(h_path, length); -+ goto out; -+ } -+ -+ h_inode = d_inode(h_path->dentry); -+ h_sb = h_inode->i_sb; -+ 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); -+ if (!err) { -+ lockdep_off(); -+ err = do_truncate(h_path->dentry, length, attr, h_file); -+ lockdep_on(); -+ } -+ lockdep_off(); -+ sb_end_write(h_sb); -+ lockdep_on(); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_vfsub_mkdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ int mode; -+}; -+ -+static void au_call_vfsub_mkdir(void *args) -+{ -+ struct au_vfsub_mkdir_args *a = args; -+ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); -+} -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err, do_sio, wkq_err; -+ -+ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_mkdir(dir, path, mode); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_mkdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .mode = mode -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+struct au_vfsub_rmdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+}; -+ -+static void au_call_vfsub_rmdir(void *args) -+{ -+ struct au_vfsub_rmdir_args *a = args; -+ *a->errp = vfsub_rmdir(a->dir, a->path); -+} -+ -+int vfsub_sio_rmdir(struct inode *dir, struct path *path) -+{ -+ int err, do_sio, wkq_err; -+ -+ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_rmdir(dir, path); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_rmdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct notify_change_args { -+ int *errp; -+ struct path *path; -+ struct iattr *ia; -+ struct inode **delegated_inode; -+}; -+ -+static void call_notify_change(void *args) -+{ -+ struct notify_change_args *a = args; -+ struct inode *h_inode; -+ -+ h_inode = d_inode(a->path->dentry); -+ IMustLock(h_inode); -+ -+ *a->errp = -EPERM; -+ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ lockdep_off(); -+ *a->errp = notify_change(a->path->dentry, a->ia, -+ a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) -+ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ -+ } -+ AuTraceErr(*a->errp); -+} -+ -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ call_notify_change(&args); -+ -+ return err; -+} -+ -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err, wkq_err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ wkq_err = au_wkq_wait(call_notify_change, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct unlink_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ struct inode **delegated_inode; -+}; -+ -+static void call_unlink(void *args) -+{ -+ struct unlink_args *a = args; -+ struct dentry *d = a->path->dentry; -+ struct inode *h_inode; -+ const int stop_sillyrename = (au_test_nfs(d->d_sb) -+ && au_dcount(d) == 1); -+ -+ IMustLock(a->dir); -+ -+ a->path->dentry = d->d_parent; -+ *a->errp = security_path_unlink(a->path, d); -+ a->path->dentry = d; -+ if (unlikely(*a->errp)) -+ return; -+ -+ if (!stop_sillyrename) -+ dget(d); -+ h_inode = NULL; -+ if (d_is_positive(d)) { -+ h_inode = d_inode(d); -+ ihold(h_inode); -+ } -+ -+ lockdep_off(); -+ *a->errp = vfs_unlink(a->dir, d, a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) { -+ struct path tmp = { -+ .dentry = d->d_parent, -+ .mnt = a->path->mnt -+ }; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+ if (!stop_sillyrename) -+ dput(d); -+ if (h_inode) -+ iput(h_inode); -+ -+ AuTraceErr(*a->errp); -+} -+ -+/* -+ * @dir: must be locked. -+ * @dentry: target dentry. -+ */ -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force) -+{ -+ int err; -+ struct unlink_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .delegated_inode = delegated_inode -+ }; -+ -+ if (!force) -+ call_unlink(&args); -+ else { -+ int wkq_err; -+ -+ wkq_err = au_wkq_wait(call_unlink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -diff --git a/fs/aufs/vfsub.h b/fs/aufs/vfsub.h -new file mode 100644 -index 000000000000..7d8993052cd5 ---- /dev/null -+++ b/fs/aufs/vfsub.h -@@ -0,0 +1,341 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#ifndef __AUFS_VFSUB_H__ -+#define __AUFS_VFSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "debug.h" -+ -+/* copied from linux/fs/internal.h */ -+/* todo: BAD approach!! */ -+extern void __mnt_drop_write(struct vfsmount *); -+extern struct file *alloc_empty_file(int, const struct cred *); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for lower inode */ -+/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ -+/* reduce? gave up. */ -+enum { -+ AuLsc_I_Begin = I_MUTEX_PARENT2, /* 5 */ -+ AuLsc_I_PARENT, /* lower inode, parent first */ -+ AuLsc_I_PARENT2, /* copyup dirs */ -+ AuLsc_I_PARENT3, /* copyup wh */ -+ AuLsc_I_CHILD, -+ AuLsc_I_CHILD2, -+ AuLsc_I_End -+}; -+ -+/* to debug easier, do not make them inlined functions */ -+#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) -+#define IMustLock(i) AuDebugOn(!inode_is_locked(i)) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void vfsub_drop_nlink(struct inode *inode) -+{ -+ AuDebugOn(!inode->i_nlink); -+ drop_nlink(inode); -+} -+ -+static inline void vfsub_dead_dir(struct inode *inode) -+{ -+ AuDebugOn(!S_ISDIR(inode->i_mode)); -+ inode->i_flags |= S_DEAD; -+ clear_nlink(inode); -+} -+ -+static inline int vfsub_native_ro(struct inode *inode) -+{ -+ return sb_rdonly(inode->i_sb) -+ || IS_RDONLY(inode) -+ /* || IS_APPEND(inode) */ -+ || IS_IMMUTABLE(inode); -+} -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb); -+#else -+AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb); -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb, int wait); -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did); -+struct file *vfsub_dentry_open(struct path *path, int flags); -+struct file *vfsub_filp_open(const char *path, int oflags, int mode); -+struct au_branch; -+struct vfsub_aopen_args { -+ struct file *file; -+ unsigned int open_flag; -+ umode_t create_mode; -+ struct au_branch *br; -+}; -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+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, -+ int len); -+ -+struct vfsub_lkup_one_args { -+ struct dentry **errp; -+ struct qstr *name; -+ struct dentry *parent; -+}; -+ -+static inline struct dentry *vfsub_lkup_one(struct qstr *name, -+ struct dentry *parent) -+{ -+ return vfsub_lookup_one_len(name->name, parent, name->len); -+} -+ -+void vfsub_call_lkup_one(void *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_mnt_want_write(struct vfsmount *mnt) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = mnt_want_write(mnt); -+ lockdep_on(); -+ return err; -+} -+ -+static inline void vfsub_mnt_drop_write(struct vfsmount *mnt) -+{ -+ lockdep_off(); -+ mnt_drop_write(mnt); -+ lockdep_on(); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_mnt_drop_write_file(struct file *file) -+{ -+ lockdep_off(); -+ mnt_drop_write_file(file); -+ lockdep_on(); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_hinode; -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, -+ bool want_excl); -+int vfsub_symlink(struct inode *dir, struct path *path, -+ const char *symname); -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, -+ struct path *path, struct inode **delegated_inode); -+int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, -+ struct inode *hdir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags); -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_rmdir(struct inode *dir, struct path *path); -+ -+/* ---------------------------------------------------------------------- */ -+ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+int vfsub_flush(struct file *file, fl_owner_t id); -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx); -+ -+static inline loff_t vfsub_f_size_read(struct file *file) -+{ -+ return i_size_read(file_inode(file)); -+} -+ -+static inline unsigned int vfsub_file_flags(struct file *file) -+{ -+ unsigned int flags; -+ -+ spin_lock(&file->f_lock); -+ flags = file->f_flags; -+ spin_unlock(&file->f_lock); -+ -+ return flags; -+} -+ -+static inline int vfsub_file_execed(struct file *file) -+{ -+ /* todo: direct access f_flags */ -+ return !!(vfsub_file_flags(file) & __FMODE_EXEC); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_file_accessed(struct file *h_file) -+{ -+ file_accessed(h_file); -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+#if 0 /* reserved */ -+static inline void vfsub_touch_atime(struct vfsmount *h_mnt, -+ struct dentry *h_dentry) -+{ -+ struct path h_path = { -+ .dentry = h_dentry, -+ .mnt = h_mnt -+ }; -+ touch_atime(&h_path); -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+static inline int vfsub_update_time(struct inode *h_inode, -+ struct timespec64 *ts, int flags) -+{ -+ return update_time(h_inode, ts, flags); -+ /* no vfsub_update_h_iattr() since we don't have struct path */ -+} -+ -+#ifdef CONFIG_FS_POSIX_ACL -+static inline int vfsub_acl_chmod(struct inode *h_inode, umode_t h_mode) -+{ -+ int err; -+ -+ err = posix_acl_chmod(h_inode, h_mode); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ return err; -+} -+#else -+AuStubInt0(vfsub_acl_chmod, struct inode *h_inode, umode_t h_mode); -+#endif -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+ -+static inline long vfsub_truncate(struct path *path, loff_t length) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = vfs_truncate(path, length); -+ lockdep_on(); -+ return err; -+} -+ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file); -+int vfsub_fsync(struct file *file, struct path *path, int datasync); -+ -+/* -+ * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such -+ * ioctl. -+ */ -+static inline loff_t vfsub_clone_file_range(struct file *src, struct file *dst, -+ loff_t len) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_clone_file_range(src, 0, dst, 0, len, /*remap_flags*/0); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* copy_file_range(2) is a systemcall */ -+static inline ssize_t vfsub_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t ssz; -+ -+ lockdep_off(); -+ ssz = vfs_copy_file_range(src, src_pos, dst, dst_pos, len, flags); -+ lockdep_on(); -+ -+ return ssz; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_llseek(file, offset, origin); -+ lockdep_on(); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_sio_rmdir(struct inode *dir, struct path *path); -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force); -+ -+static inline int vfsub_getattr(const struct path *path, struct kstat *st) -+{ -+ return vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_setxattr(dentry, name, value, size, flags); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static inline int vfsub_removexattr(struct dentry *dentry, const char *name) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_removexattr(dentry, name); -+ lockdep_on(); -+ -+ return err; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_VFSUB_H__ */ -diff --git a/fs/aufs/wbr_policy.c b/fs/aufs/wbr_policy.c -new file mode 100644 -index 000000000000..a18045b12573 ---- /dev/null -+++ b/fs/aufs/wbr_policy.c -@@ -0,0 +1,817 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * policies for selecting one among multiple writable branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* subset of cpup_attr() */ -+static noinline_for_stack -+int au_cpdown_attr(struct path *h_path, struct dentry *h_src) -+{ -+ int err, sbits; -+ struct iattr ia; -+ struct inode *h_isrc; -+ -+ h_isrc = d_inode(h_src); -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; -+ ia.ia_mode = h_isrc->i_mode; -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(d_inode(h_path->dentry), h_isrc->i_flags); -+ /* no delegation since it is just created */ -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); -+ } -+ -+ return err; -+} -+ -+#define AuCpdown_PARENT_OPQ 1 -+#define AuCpdown_WHED (1 << 1) -+#define AuCpdown_MADE_DIR (1 << 2) -+#define AuCpdown_DIROPQ (1 << 3) -+#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) -+#define au_fset_cpdown(flags, name) \ -+ do { (flags) |= AuCpdown_##name; } while (0) -+#define au_fclr_cpdown(flags, name) \ -+ do { (flags) &= ~AuCpdown_##name; } while (0) -+ -+static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, -+ unsigned int *flags) -+{ -+ int err; -+ struct dentry *opq_dentry; -+ -+ opq_dentry = au_diropq_create(dentry, bdst); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ dput(opq_dentry); -+ au_fset_cpdown(*flags, DIROPQ); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, -+ struct inode *dir, aufs_bindex_t bdst) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ -+ br = au_sbr(dentry->d_sb, bdst); -+ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ if (d_is_positive(h_path.dentry)) { -+ h_path.mnt = au_br_mnt(br); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, -+ dentry); -+ } -+ dput(h_path.dentry); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t bopq, btop; -+ struct path h_path; -+ struct dentry *parent; -+ struct inode *h_dir, *h_inode, *inode, *dir; -+ unsigned int *flags = arg; -+ -+ btop = au_dbtop(dentry); -+ /* dentry is di-locked */ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_dir = d_inode(h_parent); -+ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); -+ IMustLock(h_dir); -+ -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (unlikely(err < 0)) -+ goto out; -+ h_path.dentry = au_h_dptr(dentry, bdst); -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); -+ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, 0755); -+ if (unlikely(err)) -+ goto out_put; -+ au_fset_cpdown(*flags, MADE_DIR); -+ -+ bopq = au_dbdiropq(dentry); -+ au_fclr_cpdown(*flags, WHED); -+ au_fclr_cpdown(*flags, DIROPQ); -+ if (au_dbwh(dentry) == bdst) -+ au_fset_cpdown(*flags, WHED); -+ if (!au_ftest_cpdown(*flags, PARENT_OPQ) && bopq <= bdst) -+ au_fset_cpdown(*flags, PARENT_OPQ); -+ h_inode = d_inode(h_path.dentry); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_opq(dentry, bdst, flags); -+ if (unlikely(err)) { -+ inode_unlock(h_inode); -+ goto out_dir; -+ } -+ } -+ -+ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, btop)); -+ inode_unlock(h_inode); -+ if (unlikely(err)) -+ goto out_opq; -+ -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); -+ if (unlikely(err)) -+ goto out_opq; -+ } -+ -+ inode = d_inode(dentry); -+ if (au_ibbot(inode) < bdst) -+ au_set_ibbot(inode, bdst); -+ au_set_h_iptr(inode, bdst, au_igrab(h_inode), -+ au_hi_flags(inode, /*isdir*/1)); -+ au_fhsm_wrote(dentry->d_sb, bdst, /*force*/0); -+ goto out; /* success */ -+ -+ /* revert */ -+out_opq: -+ if (au_ftest_cpdown(*flags, DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bdst); -+ inode_unlock(h_inode); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing diropq for %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ goto out; -+ } -+ } -+out_dir: -+ if (au_ftest_cpdown(*flags, MADE_DIR)) { -+ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ } -+ } -+out_put: -+ au_set_h_dptr(dentry, bdst, NULL); -+ if (au_dbbot(dentry) == bdst) -+ au_update_dbbot(dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ unsigned int flags; -+ -+ flags = 0; -+ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &flags); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for create */ -+ -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t bopq; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *parent, *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ parent = dget_parent(dentry); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/0); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = bindex; -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ di_read_lock_parent2(d, !AuLock_IR); -+ bopq = au_dbdiropq(d); -+ di_read_unlock(d, !AuLock_IR); -+ if (bopq >= 0 && bopq < err) -+ err = bopq; -+ } -+ } -+ -+out_free: -+ dput(parent); -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) -+ return bindex; -+ return -EROFS; -+} -+ -+/* top down parent */ -+static int au_wbr_create_tdp(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t btop, bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ err = btop; -+ if (!au_br_rdonly(au_sbr(sb, btop))) -+ goto out; -+ -+ err = -EROFS; -+ parent = dget_parent(dentry); -+ for (bindex = au_dbtop(parent); bindex < btop; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) { -+ err = au_wbr_bu(sb, btop - 1); -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ } -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* an exception for the policy other than tdp */ -+static int au_wbr_create_exp(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bdiropq; -+ struct dentry *parent; -+ -+ err = -1; -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ bdiropq = au_dbdiropq(parent); -+ if (bwh >= 0) { -+ if (bdiropq >= 0) -+ err = min(bdiropq, bwh); -+ else -+ err = bwh; -+ AuDbg("%d\n", err); -+ } else if (bdiropq >= 0) { -+ err = bdiropq; -+ AuDbg("%d\n", err); -+ } -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) -+ err = -1; -+ -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* round robin */ -+static int au_wbr_create_init_rr(struct super_block *sb) -+{ -+ int err; -+ -+ err = au_wbr_bu(sb, au_sbbot(sb)); -+ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ -+ /* smp_mb(); */ -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_rr(struct dentry *dentry, unsigned int flags) -+{ -+ int err, nbr; -+ unsigned int u; -+ aufs_bindex_t bindex, bbot; -+ struct super_block *sb; -+ atomic_t *next; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ next = &au_sbi(sb)->si_wbr_rr_next; -+ bbot = au_sbbot(sb); -+ nbr = bbot + 1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (!au_ftest_wbr(flags, DIR)) { -+ err = atomic_dec_return(next) + 1; -+ /* modulo for 0 is meaningless */ -+ if (unlikely(!err)) -+ err = atomic_dec_return(next) + 1; -+ } else -+ err = atomic_read(next); -+ AuDbg("%d\n", err); -+ u = err; -+ err = u % nbr; -+ AuDbg("%d\n", err); -+ if (!au_br_rdonly(au_sbr(sb, err))) -+ break; -+ err = -EROFS; -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space */ -+static void au_mfs(struct dentry *dentry, struct dentry *parent) -+{ -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ struct dentry *h_parent; -+ aufs_bindex_t bindex, bbot; -+ int err; -+ unsigned long long b, bavail; -+ struct path h_path; -+ /* reduce the stack usage */ -+ struct kstatfs *st; -+ -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) { -+ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); -+ return; -+ } -+ -+ bavail = 0; -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ MtxMustLock(&mfs->mfs_lock); -+ mfs->mfs_bindex = -EROFS; -+ mfs->mfsrr_bytes = 0; -+ if (!parent) { -+ bindex = 0; -+ bbot = au_sbbot(sb); -+ } else { -+ bindex = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ } -+ -+ for (; bindex <= bbot; bindex++) { -+ if (parent) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ } -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, st); -+ if (unlikely(err)) { -+ AuWarn1("failed statfs, b%d, %d\n", bindex, err); -+ continue; -+ } -+ -+ /* when the available size is equal, select the lower one */ -+ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) -+ || sizeof(b) < sizeof(st->f_bsize)); -+ b = st->f_bavail * st->f_bsize; -+ br->br_wbr->wbr_bytes = b; -+ if (b >= bavail) { -+ bavail = b; -+ mfs->mfs_bindex = bindex; -+ mfs->mfs_jiffy = jiffies; -+ } -+ } -+ -+ mfs->mfsrr_bytes = bavail; -+ AuDbg("b%d\n", mfs->mfs_bindex); -+ au_kfree_rcu(st); -+} -+ -+static int au_wbr_create_mfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct dentry *parent; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = NULL; -+ if (au_ftest_wbr(flags, PARENT)) -+ parent = dget_parent(dentry); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0 -+ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) -+ au_mfs(dentry, parent); -+ mutex_unlock(&mfs->mfs_lock); -+ err = mfs->mfs_bindex; -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfs(struct super_block *sb) -+{ -+ struct au_wbr_mfs *mfs; -+ -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_init(&mfs->mfs_lock); -+ mfs->mfs_jiffy = 0; -+ mfs->mfs_bindex = -EROFS; -+ -+ return 0; -+} -+ -+static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) -+{ -+ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down regardless parent, and then mfs */ -+static int au_wbr_create_tdmfs(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t bwh, btail, bindex, bfound, bmfs; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ struct au_branch *br; -+ struct dentry *parent; -+ -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0) -+ au_mfs(dentry, /*parent*/NULL); -+ watermark = mfs->mfsrr_watermark; -+ bmfs = mfs->mfs_bindex; -+ mutex_unlock(&mfs->mfs_lock); -+ -+ /* another style of au_wbr_create_exp() */ -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ if (bwh >= 0 && bwh < btail) -+ btail = bwh; -+ -+ err = au_wbr_nonopq(dentry, btail); -+ if (unlikely(err < 0)) -+ goto out; -+ btail = err; -+ bfound = -1; -+ for (bindex = 0; bindex <= btail; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ if (br->br_wbr->wbr_bytes > watermark) { -+ bfound = bindex; -+ break; -+ } -+ } -+ err = bfound; -+ if (err < 0) -+ err = bmfs; -+ -+out: -+ dput(parent); -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space and then round robin */ -+static int au_wbr_create_mfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_mfs(dentry, flags); -+ if (err >= 0) { -+ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) -+ err = au_wbr_create_rr(dentry, flags); -+ mutex_unlock(&mfs->mfs_lock); -+ } -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfsrr(struct super_block *sb) -+{ -+ int err; -+ -+ au_wbr_create_init_mfs(sb); /* ignore */ -+ err = au_wbr_create_init_rr(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down parent and most free space */ -+static int au_wbr_create_pmfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err, e2; -+ unsigned long long b; -+ aufs_bindex_t bindex, btop, bbot; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ struct au_branch *br; -+ -+ err = au_wbr_create_tdp(dentry, flags); -+ if (unlikely(err < 0)) -+ goto out; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ if (btop == bbot) -+ goto out_parent; /* success */ -+ -+ e2 = au_wbr_create_mfs(dentry, flags); -+ if (e2 < 0) -+ goto out_parent; /* success */ -+ -+ /* when the available size is equal, select upper one */ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ b = br->br_wbr->wbr_bytes; -+ AuDbg("b%d, %llu\n", err, b); -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { -+ b = br->br_wbr->wbr_bytes; -+ err = bindex; -+ AuDbg("b%d, %llu\n", err, b); -+ } -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out_parent: -+ dput(parent); -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * - top down parent -+ * - most free space with parent -+ * - most free space round-robin regardless parent -+ */ -+static int au_wbr_create_pmfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_pmfs(dentry, flags | AuWbr_PARENT); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ watermark = mfs->mfsrr_watermark; -+ mutex_unlock(&mfs->mfs_lock); -+ if (br->br_wbr->wbr_bytes < watermark) -+ /* regardless the parent dir */ -+ err = au_wbr_create_mfsrr(dentry, flags); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for copyup */ -+ -+/* top down parent */ -+static int au_wbr_copyup_tdp(struct dentry *dentry) -+{ -+ return au_wbr_create_tdp(dentry, /*flags, anything is ok*/0); -+} -+ -+/* bottom up parent */ -+static int au_wbr_copyup_bup(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bindex, btop; -+ struct dentry *parent, *h_parent; -+ struct super_block *sb; -+ -+ err = -EROFS; -+ sb = dentry->d_sb; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ for (bindex = au_dbtop(dentry); bindex >= btop; bindex--) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) -+ err = au_wbr_bu(sb, btop - 1); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* bottom up */ -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop) -+{ -+ int err; -+ -+ err = au_wbr_bu(dentry->d_sb, btop); -+ AuDbg("b%d\n", err); -+ if (err > btop) -+ err = au_wbr_nonopq(dentry, err); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_copyup_bu(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop; -+ -+ btop = au_dbtop(dentry); -+ err = au_wbr_do_copyup_bu(dentry, btop); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { -+ [AuWbrCopyup_TDP] = { -+ .copyup = au_wbr_copyup_tdp -+ }, -+ [AuWbrCopyup_BUP] = { -+ .copyup = au_wbr_copyup_bup -+ }, -+ [AuWbrCopyup_BU] = { -+ .copyup = au_wbr_copyup_bu -+ } -+}; -+ -+struct au_wbr_create_operations au_wbr_create_ops[] = { -+ [AuWbrCreate_TDP] = { -+ .create = au_wbr_create_tdp -+ }, -+ [AuWbrCreate_RR] = { -+ .create = au_wbr_create_rr, -+ .init = au_wbr_create_init_rr -+ }, -+ [AuWbrCreate_MFS] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSV] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRR] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRRV] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFS] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFSV] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFS] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSV] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRR] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRRV] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ } -+}; -diff --git a/fs/aufs/whout.c b/fs/aufs/whout.c -new file mode 100644 -index 000000000000..9363954c4b06 ---- /dev/null -+++ b/fs/aufs/whout.c -@@ -0,0 +1,1049 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#include "aufs.h" -+ -+#define WH_MASK 0444 -+ -+/* -+ * If a directory contains this file, then it is opaque. We start with the -+ * .wh. flag so that it is blocked by lookup. -+ */ -+static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, -+ sizeof(AUFS_WH_DIROPQ) - 1); -+ -+/* -+ * generate whiteout name, which is NOT terminated by NULL. -+ * @name: original d_name.name -+ * @len: original d_name.len -+ * @wh: whiteout qstr -+ * returns zero when succeeds, otherwise error. -+ * succeeded value as wh->name should be freed by kfree(). -+ */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) -+{ -+ char *p; -+ -+ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) -+ return -ENAMETOOLONG; -+ -+ wh->len = name->len + AUFS_WH_PFX_LEN; -+ p = kmalloc(wh->len, GFP_NOFS); -+ wh->name = p; -+ if (p) { -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if the @wh_name exists under @h_parent. -+ * @try_sio specifies the necessary of super-io. -+ */ -+int au_wh_test(struct dentry *h_parent, 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); -+ else -+ wh_dentry = au_sio_lkup_one(wh_name, h_parent); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) { -+ if (err == -ENAMETOOLONG) -+ err = 0; -+ goto out; -+ } -+ -+ err = 0; -+ if (d_is_negative(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = 1; -+ if (d_is_reg(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = -EIO; -+ AuIOErr("%pd Invalid whiteout entry type 0%o.\n", -+ wh_dentry, d_inode(wh_dentry)->i_mode); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ return err; -+} -+ -+/* -+ * test if the @h_dentry sets opaque or not. -+ */ -+int au_diropq_test(struct dentry *h_dentry) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = d_inode(h_dentry); -+ err = au_wh_test(h_dentry, &diropq_name, -+ au_test_h_perm_sio(h_dir, MAY_EXEC)); -+ return err; -+} -+ -+/* -+ * returns a negative dentry whose name is unique and temporary. -+ */ -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix) -+{ -+ struct dentry *dentry; -+ int i; -+ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1], -+ *name, *p; -+ /* strict atomic_t is unnecessary here */ -+ static unsigned short cnt; -+ struct qstr qs; -+ -+ BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); -+ -+ name = defname; -+ qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1; -+ if (unlikely(prefix->len > DNAME_INLINE_LEN)) { -+ dentry = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(qs.len > NAME_MAX)) -+ goto out; -+ dentry = ERR_PTR(-ENOMEM); -+ name = kmalloc(qs.len + 1, GFP_NOFS); -+ if (unlikely(!name)) -+ goto out; -+ } -+ -+ /* doubly whiteout-ed */ -+ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); -+ p = name + AUFS_WH_PFX_LEN * 2; -+ memcpy(p, prefix->name, prefix->len); -+ p += prefix->len; -+ *p++ = '.'; -+ AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN); -+ -+ qs.name = name; -+ for (i = 0; i < 3; i++) { -+ sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++); -+ dentry = au_sio_lkup_one(&qs, h_parent); -+ if (IS_ERR(dentry) || d_is_negative(dentry)) -+ goto out_name; -+ dput(dentry); -+ } -+ /* pr_warn("could not get random name\n"); */ -+ dentry = ERR_PTR(-EEXIST); -+ AuDbg("%.*s\n", AuLNPair(&qs)); -+ BUG(); -+ -+out_name: -+ if (name != defname) -+ au_kfree_try_rcu(name); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* -+ * rename the @h_dentry on @br to the whiteouted temporary name. -+ */ -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = au_br_mnt(br) -+ }; -+ struct inode *h_dir, *delegated; -+ struct dentry *h_parent; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ /* under the same dir, no need to lock_rename() */ -+ delegated = NULL; -+ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, &delegated, -+ /*flags*/0); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ dput(h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * functions for removing a whiteout -+ */ -+ -+static int do_unlink_wh(struct inode *h_dir, struct path *h_path) -+{ -+ int err, force; -+ struct inode *delegated; -+ -+ /* -+ * forces superio when the dir has a sticky bit. -+ * this may be a violation of unix fs semantics. -+ */ -+ force = (h_dir->i_mode & S_ISVTX) -+ && !uid_eq(current_fsuid(), d_inode(h_path->dentry)->i_uid); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, h_path, &delegated, force); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ return err; -+} -+ -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry) -+{ -+ int err; -+ -+ err = do_unlink_wh(h_dir, h_path); -+ if (!err && dentry) -+ au_set_dbwh(dentry, -1); -+ -+ return err; -+} -+ -+static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh, -+ struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = au_br_mnt(br) -+ }; -+ -+ err = 0; -+ h_path.dentry = vfsub_lkup_one(wh, h_parent); -+ 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); -+ dput(h_path.dentry); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * initialize/clean whiteout for a branch -+ */ -+ -+static void au_wh_clean(struct inode *h_dir, struct path *whpath, -+ const int isdir) -+{ -+ int err; -+ struct inode *delegated; -+ -+ if (d_is_negative(whpath->dentry)) -+ return; -+ -+ if (isdir) -+ err = vfsub_rmdir(h_dir, whpath); -+ else { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, whpath, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } -+ if (unlikely(err)) -+ pr_warn("failed removing %pd (%d), ignored.\n", -+ whpath->dentry, err); -+} -+ -+static int test_linkable(struct dentry *h_root) -+{ -+ struct inode *h_dir = d_inode(h_root); -+ -+ if (h_dir->i_op->link) -+ return 0; -+ -+ pr_err("%pd (%s) doesn't support link(2), use noplink and rw+nolwh\n", -+ h_root, au_sbtype(h_root->d_sb)); -+ return -ENOSYS; /* the branch doesn't have its ->link() */ -+} -+ -+/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ -+static int au_whdir(struct inode *h_dir, struct path *path) -+{ -+ int err; -+ -+ err = -EEXIST; -+ if (d_is_negative(path->dentry)) { -+ int mode = 0700; -+ -+ if (au_test_nfs(path->dentry->d_sb)) -+ mode |= 0111; -+ err = vfsub_mkdir(h_dir, path, mode); -+ } else if (d_is_dir(path->dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd exists\n", path->dentry); -+ -+ return err; -+} -+ -+struct au_wh_base { -+ const struct qstr *name; -+ struct dentry *dentry; -+}; -+ -+static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+} -+ -+/* -+ * returns tri-state, -+ * minus: error, caller should print the message -+ * zero: success -+ * plus: error, caller should NOT print the message -+ */ -+static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = d_inode(h_root); -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * for the moment, aufs supports the branch filesystem which does not support -+ * link(2). testing on FAT which does not support i_op->setattr() fully either, -+ * copyup failed. finally, such filesystem will not be used as the writable -+ * branch. -+ * -+ * returns tri-state, see above. -+ */ -+static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ WbrWhMustWriteLock(wbr); -+ -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ /* -+ * todo: should this create be done in /sbin/mount.aufs helper? -+ */ -+ err = -EEXIST; -+ h_dir = d_inode(h_root); -+ if (d_is_negative(base[AuBrWh_BASE].dentry)) { -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ err = vfsub_create(h_dir, h_path, WH_MASK, /*want_excl*/true); -+ } else if (d_is_reg(base[AuBrWh_BASE].dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd2 exists\n", base[AuBrWh_BASE].dentry); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); -+ -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize the whiteout base file/dir for @br. -+ */ -+int au_wh_init(struct au_branch *br, struct super_block *sb) -+{ -+ int err, i; -+ const unsigned char do_plink -+ = !!au_opt_test(au_mntflags(sb), PLINK); -+ struct inode *h_dir; -+ struct path path = br->br_path; -+ struct dentry *h_root = path.dentry; -+ struct au_wbr *wbr = br->br_wbr; -+ static const struct qstr base_name[] = { -+ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, -+ sizeof(AUFS_BASE_NAME) - 1), -+ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, -+ sizeof(AUFS_PLINKDIR_NAME) - 1), -+ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, -+ sizeof(AUFS_ORPHDIR_NAME) - 1) -+ }; -+ struct au_wh_base base[] = { -+ [AuBrWh_BASE] = { -+ .name = base_name + AuBrWh_BASE, -+ .dentry = NULL -+ }, -+ [AuBrWh_PLINK] = { -+ .name = base_name + AuBrWh_PLINK, -+ .dentry = NULL -+ }, -+ [AuBrWh_ORPH] = { -+ .name = base_name + AuBrWh_ORPH, -+ .dentry = NULL -+ } -+ }; -+ -+ if (wbr) -+ WbrWhMustWriteLock(wbr); -+ -+ for (i = 0; i < AuBrWh_Last; i++) { -+ /* doubly whiteouted */ -+ struct dentry *d; -+ -+ d = au_wh_lkup(h_root, (void *)base[i].name, br); -+ err = PTR_ERR(d); -+ if (IS_ERR(d)) -+ goto out; -+ -+ base[i].dentry = d; -+ AuDebugOn(wbr -+ && wbr->wbr_wh[i] -+ && wbr->wbr_wh[i] != base[i].dentry); -+ } -+ -+ if (wbr) -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ -+ err = 0; -+ if (!au_br_writable(br->br_perm)) { -+ h_dir = d_inode(h_root); -+ au_wh_init_ro(h_dir, base, &path); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } else { -+ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } -+ goto out; /* success */ -+ -+out_err: -+ pr_err("an error(%d) on the writable branch %pd(%s)\n", -+ err, h_root, au_sbtype(h_root->d_sb)); -+out: -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(base[i].dentry); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * whiteouts are all hard-linked usually. -+ * when its link count reaches a ceiling, we create a new whiteout base -+ * asynchronously. -+ */ -+ -+struct reinit_br_wh { -+ struct super_block *sb; -+ struct au_branch *br; -+}; -+ -+static void reinit_br_wh(void *arg) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct path h_path; -+ struct reinit_br_wh *a = arg; -+ struct au_wbr *wbr; -+ struct inode *dir, *delegated; -+ struct dentry *h_root; -+ struct au_hinode *hdir; -+ -+ err = 0; -+ wbr = a->br->br_wbr; -+ /* big aufs lock */ -+ si_noflush_write_lock(a->sb); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(a->sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ di_read_lock_parent(a->sb->s_root, AuLock_IR); -+ dir = d_inode(a->sb->s_root); -+ hdir = au_hi(dir, bindex); -+ h_root = au_h_dptr(a->sb->s_root, bindex); -+ AuDebugOn(h_root != au_br_dentry(a->br)); -+ -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ wbr_wh_write_lock(wbr); -+ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, -+ h_root, a->br); -+ if (!err) { -+ h_path.dentry = wbr->wbr_whbase; -+ h_path.mnt = au_br_mnt(a->br); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, -+ /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } else { -+ pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); -+ err = 0; -+ } -+ dput(wbr->wbr_whbase); -+ wbr->wbr_whbase = NULL; -+ if (!err) -+ err = au_wh_init(a->br, a->sb); -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ di_read_unlock(a->sb->s_root, AuLock_IR); -+ if (!err) -+ au_fhsm_wrote(a->sb, bindex, /*force*/0); -+ -+out: -+ if (wbr) -+ atomic_dec(&wbr->wbr_wh_running); -+ au_lcnt_dec(&a->br->br_count); -+ si_write_unlock(a->sb); -+ au_nwt_done(&au_sbi(a->sb)->si_nowait); -+ au_kfree_rcu(a); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) -+{ -+ int do_dec, wkq_err; -+ struct reinit_br_wh *arg; -+ -+ do_dec = 1; -+ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) -+ goto out; -+ -+ /* ignore ENOMEM */ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (arg) { -+ /* -+ * dec(wh_running), kfree(arg) and dec(br_count) -+ * in reinit function -+ */ -+ arg->sb = sb; -+ arg->br = br; -+ au_lcnt_inc(&br->br_count); -+ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ do_dec = 0; -+ } -+ -+out: -+ if (do_dec) -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create the whiteout @wh. -+ */ -+static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *wh) -+{ -+ int err; -+ struct path h_path = { -+ .dentry = wh -+ }; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ struct inode *h_dir, *delegated; -+ -+ h_parent = wh->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ br = au_sbr(sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ wbr = br->br_wbr; -+ wbr_wh_read_lock(wbr); -+ if (wbr->wbr_whbase) { -+ delegated = NULL; -+ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ if (!err || err != -EMLINK) -+ goto out; -+ -+ /* link count full. re-initialize br_whbase. */ -+ kick_reinit_br_wh(sb, br); -+ } -+ -+ /* return this error in this context */ -+ err = vfsub_create(h_dir, &h_path, WH_MASK, /*want_excl*/true); -+ if (!err) -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ -+out: -+ wbr_wh_read_unlock(wbr); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create or remove the diropq. -+ */ -+static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *opq_dentry, *h_dentry; -+ struct super_block *sb; -+ struct au_branch *br; -+ 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); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ -+ if (au_ftest_diropq(flags, CREATE)) { -+ err = link_or_create_wh(sb, bindex, opq_dentry); -+ if (!err) { -+ au_set_dbdiropq(dentry, bindex); -+ 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); -+ if (!err) -+ au_set_dbdiropq(dentry, -1); -+ } -+ dput(opq_dentry); -+ opq_dentry = ERR_PTR(err); -+ -+out: -+ return opq_dentry; -+} -+ -+struct do_diropq_args { -+ struct dentry **errp; -+ struct dentry *dentry; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+}; -+ -+static void call_do_diropq(void *args) -+{ -+ struct do_diropq_args *a = args; -+ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); -+} -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *diropq, *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!au_test_h_perm_sio(d_inode(h_dentry), MAY_EXEC | MAY_WRITE)) -+ diropq = do_diropq(dentry, bindex, flags); -+ else { -+ int wkq_err; -+ struct do_diropq_args args = { -+ .errp = &diropq, -+ .dentry = dentry, -+ .bindex = bindex, -+ .flags = flags -+ }; -+ -+ wkq_err = au_wkq_wait(call_do_diropq, &args); -+ if (unlikely(wkq_err)) -+ diropq = ERR_PTR(wkq_err); -+ } -+ -+ return diropq; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * lookup whiteout dentry. -+ * @h_parent: lower parent dentry which must exist and be locked -+ * @base_name: name of dentry which will be whiteouted -+ * returns dentry for whiteout. -+ */ -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br) -+{ -+ int err; -+ struct qstr wh_name; -+ struct dentry *wh_dentry; -+ -+ 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); -+ au_kfree_try_rcu(wh_name.name); -+ } -+ return wh_dentry; -+} -+ -+/* -+ * link/create a whiteout for @dentry on @bindex. -+ */ -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ int err; -+ -+ sb = dentry->d_sb; -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); -+ if (!IS_ERR(wh_dentry) && d_is_negative(wh_dentry)) { -+ err = link_or_create_wh(sb, bindex, wh_dentry); -+ if (!err) { -+ au_set_dbwh(dentry, bindex); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ } else { -+ dput(wh_dentry); -+ wh_dentry = ERR_PTR(err); -+ } -+ } -+ -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* 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) -+{ -+ int err; -+ unsigned long ul, n; -+ struct qstr wh_name; -+ char *p; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ err = -ENOMEM; -+ p = (void *)__get_free_page(GFP_NOFS); -+ wh_name.name = p; -+ if (unlikely(!wh_name.name)) -+ goto out; -+ -+ err = 0; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; !err && ul < n; ul++, head++) { -+ hlist_for_each_entry(pos, head, wh_hash) { -+ if (pos->wh_bindex != bindex) -+ continue; -+ -+ str = &pos->wh_str; -+ 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); -+ if (!err) -+ continue; -+ break; -+ } -+ AuIOErr("whiteout name too long %.*s\n", -+ str->len, str->name); -+ err = -EIO; -+ break; -+ } -+ } -+ free_page((unsigned long)wh_name.name); -+ -+out: -+ return err; -+} -+ -+struct del_wh_children_args { -+ int *errp; -+ struct dentry *h_dentry; -+ 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); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) -+{ -+ struct au_whtmp_rmdir *whtmp; -+ int err; -+ unsigned int rdhash; -+ -+ SiMustAnyLock(sb); -+ -+ whtmp = kzalloc(sizeof(*whtmp), gfp); -+ if (unlikely(!whtmp)) { -+ whtmp = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ /* no estimation for dir size */ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = AUFS_RDHASH_DEF; -+ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); -+ if (unlikely(err)) { -+ au_kfree_rcu(whtmp); -+ whtmp = ERR_PTR(err); -+ } -+ -+out: -+ return whtmp; -+} -+ -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) -+{ -+ if (whtmp->br) -+ au_lcnt_dec(&whtmp->br->br_count); -+ dput(whtmp->wh_dentry); -+ iput(whtmp->dir); -+ au_nhash_wh_free(&whtmp->whlist); -+ au_kfree_rcu(whtmp); -+} -+ -+/* -+ * rmdir the whiteouted temporary named dir @h_dentry. -+ * @whlist: whiteouted children. -+ */ -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist) -+{ -+ int err; -+ unsigned int h_nlink; -+ struct path h_tmp; -+ struct inode *wh_inode, *h_dir; -+ struct au_branch *br; -+ -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ IMustLock(h_dir); -+ -+ br = au_sbr(dir->i_sb, bindex); -+ wh_inode = d_inode(wh_dentry); -+ inode_lock_nested(wh_inode, AuLsc_I_CHILD); -+ -+ /* -+ * someone else might change some whiteouts while we were sleeping. -+ * it means this whlist may have an obsoleted entry. -+ */ -+ if (!au_test_h_perm_sio(wh_inode, MAY_EXEC | MAY_WRITE)) -+ err = del_wh_children(wh_dentry, whlist, bindex, br); -+ else { -+ int wkq_err; -+ struct del_wh_children_args args = { -+ .errp = &err, -+ .h_dentry = wh_dentry, -+ .whlist = whlist, -+ .bindex = bindex, -+ .br = br -+ }; -+ -+ wkq_err = au_wkq_wait(call_del_wh_children, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ 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); -+ /* some fs doesn't change the parent nlink in some cases */ -+ h_nlink -= h_dir->i_nlink; -+ } -+ -+ if (!err) { -+ if (au_ibtop(dir) == bindex) { -+ /* todo: dir->i_mutex is necessary */ -+ au_cpup_attr_timesizes(dir); -+ if (h_nlink) -+ vfsub_drop_nlink(dir); -+ } -+ return 0; /* success */ -+ } -+ -+ pr_warn("failed removing %pd(%d), ignored\n", wh_dentry, err); -+ return err; -+} -+ -+static void call_rmdir_whtmp(void *args) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct au_whtmp_rmdir *a = args; -+ struct super_block *sb; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ struct au_hinode *hdir; -+ -+ /* rmdir by nfsd may cause deadlock with this i_mutex */ -+ /* inode_lock(a->dir); */ -+ err = -EROFS; -+ sb = a->dir->i_sb; -+ si_read_lock(sb, !AuLock_FLUSH); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ err = -EIO; -+ ii_write_lock_parent(a->dir); -+ h_parent = dget_parent(a->wh_dentry); -+ h_dir = d_inode(h_parent); -+ hdir = au_hi(a->dir, bindex); -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out_mnt; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, -+ a->br); -+ if (!err) -+ err = au_whtmp_rmdir(a->dir, bindex, a->wh_dentry, &a->whlist); -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+ -+out_mnt: -+ dput(h_parent); -+ ii_write_unlock(a->dir); -+out: -+ /* inode_unlock(a->dir); */ -+ au_whtmp_rmdir_free(a); -+ si_read_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) -+{ -+ int wkq_err; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ /* all post-process will be done in do_rmdir_whtmp(). */ -+ sb = dir->i_sb; -+ args->dir = au_igrab(dir); -+ args->br = au_sbr(sb, bindex); -+ au_lcnt_inc(&args->br->br_count); -+ args->wh_dentry = dget(wh_dentry); -+ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_warn("rmdir error %pd (%d), ignored\n", wh_dentry, wkq_err); -+ au_whtmp_rmdir_free(args); -+ } -+} -diff --git a/fs/aufs/whout.h b/fs/aufs/whout.h -new file mode 100644 -index 000000000000..dc4eb41e70dd ---- /dev/null -+++ b/fs/aufs/whout.h -@@ -0,0 +1,73 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#ifndef __AUFS_WHOUT_H__ -+#define __AUFS_WHOUT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "dir.h" -+ -+/* whout.c */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); -+int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, int try_sio); -+int au_diropq_test(struct dentry *h_dentry); -+struct au_branch; -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix); -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry); -+int au_wh_init(struct au_branch *br, struct super_block *sb); -+ -+/* diropq flags */ -+#define AuDiropq_CREATE 1 -+#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) -+#define au_fset_diropq(flags, name) \ -+ do { (flags) |= AuDiropq_##name; } while (0) -+#define au_fclr_diropq(flags, name) \ -+ do { (flags) &= ~AuDiropq_##name; } while (0) -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags); -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br); -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent); -+ -+/* real rmdir for the whiteout-ed dir */ -+struct au_whtmp_rmdir { -+ struct inode *dir; -+ struct au_branch *br; -+ struct dentry *wh_dentry; -+ struct au_nhash whlist; -+}; -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist); -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_diropq_create(struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); -+} -+ -+static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WHOUT_H__ */ -diff --git a/fs/aufs/wkq.c b/fs/aufs/wkq.c -new file mode 100644 -index 000000000000..288f5cf4b200 ---- /dev/null -+++ b/fs/aufs/wkq.c -@@ -0,0 +1,359 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credential scheme -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* internal workqueue named AUFS_WKQ_NAME */ -+ -+static struct workqueue_struct *au_wkq; -+ -+struct au_wkinfo { -+ struct work_struct wk; -+ struct kobject *kobj; -+ -+ unsigned int flags; /* see wkq.h */ -+ -+ au_wkq_func_t func; -+ void *args; -+ -+#ifdef CONFIG_LOCKDEP -+ int dont_check; -+ struct held_lock **hlock; -+#endif -+ -+ struct completion *comp; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs passes some operations to the workqueue such as the internal copyup. -+ * This scheme looks rather unnatural for LOCKDEP debugging feature, since the -+ * job run by workqueue depends upon the locks acquired in the other task. -+ * Delegating a small operation to the workqueue, aufs passes its lockdep -+ * information too. And the job in the workqueue restores the info in order to -+ * pretend as if it acquired those locks. This is just to make LOCKDEP work -+ * correctly and expectedly. -+ */ -+ -+#ifndef CONFIG_LOCKDEP -+AuStubInt0(au_wkq_lockdep_alloc, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_free, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_pre, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_post, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_init, struct au_wkinfo *wkinfo); -+#else -+static void au_wkq_lockdep_init(struct au_wkinfo *wkinfo) -+{ -+ wkinfo->hlock = NULL; -+ wkinfo->dont_check = 0; -+} -+ -+/* -+ * 1: matched -+ * 0: unmatched -+ */ -+static int au_wkq_lockdep_test(struct lock_class_key *key, const char *name) -+{ -+ static DEFINE_SPINLOCK(spin); -+ static struct { -+ char *name; -+ struct lock_class_key *key; -+ } a[] = { -+ { .name = "&sbinfo->si_rwsem" }, -+ { .name = "&finfo->fi_rwsem" }, -+ { .name = "&dinfo->di_rwsem" }, -+ { .name = "&iinfo->ii_rwsem" } -+ }; -+ static int set; -+ int i; -+ -+ /* lockless read from 'set.' see below */ -+ if (set == ARRAY_SIZE(a)) { -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) -+ goto match; -+ goto unmatch; -+ } -+ -+ spin_lock(&spin); -+ if (set) -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) { -+ spin_unlock(&spin); -+ goto match; -+ } -+ for (i = 0; i < ARRAY_SIZE(a); i++) { -+ if (a[i].key) { -+ if (unlikely(a[i].key == key)) { /* rare but possible */ -+ spin_unlock(&spin); -+ goto match; -+ } else -+ continue; -+ } -+ if (strstr(a[i].name, name)) { -+ /* -+ * the order of these three lines is important for the -+ * lockless read above. -+ */ -+ a[i].key = key; -+ spin_unlock(&spin); -+ set++; -+ /* AuDbg("%d, %s\n", set, name); */ -+ goto match; -+ } -+ } -+ spin_unlock(&spin); -+ goto unmatch; -+ -+match: -+ return 1; -+unmatch: -+ return 0; -+} -+ -+static int au_wkq_lockdep_alloc(struct au_wkinfo *wkinfo) -+{ -+ int err, n; -+ struct task_struct *curr; -+ struct held_lock **hl, *held_locks, *p; -+ -+ err = 0; -+ curr = current; -+ wkinfo->dont_check = lockdep_recursing(curr); -+ if (wkinfo->dont_check) -+ goto out; -+ n = curr->lockdep_depth; -+ if (!n) -+ goto out; -+ -+ err = -ENOMEM; -+ wkinfo->hlock = kmalloc_array(n + 1, sizeof(*wkinfo->hlock), GFP_NOFS); -+ if (unlikely(!wkinfo->hlock)) -+ goto out; -+ -+ err = 0; -+#if 0 /* left for debugging */ -+ if (0 && au_debug_test()) -+ lockdep_print_held_locks(curr); -+#endif -+ held_locks = curr->held_locks; -+ hl = wkinfo->hlock; -+ while (n--) { -+ p = held_locks++; -+ if (au_wkq_lockdep_test(p->instance->key, p->instance->name)) -+ *hl++ = p; -+ } -+ *hl = NULL; -+ -+out: -+ return err; -+} -+ -+static void au_wkq_lockdep_free(struct au_wkinfo *wkinfo) -+{ -+ au_kfree_try_rcu(wkinfo->hlock); -+} -+ -+static void au_wkq_lockdep_pre(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ int subclass; -+ -+ if (wkinfo->dont_check) -+ lockdep_off(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) { /* assignment */ -+ subclass = lockdep_hlock_class(p)->subclass; -+ /* AuDbg("%s, %d\n", p->instance->name, subclass); */ -+ if (p->read) -+ rwsem_acquire_read(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ else -+ rwsem_acquire(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ } -+} -+ -+static void au_wkq_lockdep_post(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ -+ if (wkinfo->dont_check) -+ lockdep_on(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) /* assignment */ -+ rwsem_release(p->instance, /*p->acquire_ip*/_RET_IP_); -+} -+#endif -+ -+static void wkq_func(struct work_struct *wk) -+{ -+ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); -+ -+ AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)); -+ AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); -+ -+ au_wkq_lockdep_pre(wkinfo); -+ wkinfo->func(wkinfo->args); -+ au_wkq_lockdep_post(wkinfo); -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) -+ complete(wkinfo->comp); -+ else { -+ kobject_put(wkinfo->kobj); -+ module_put(THIS_MODULE); /* todo: ?? */ -+ au_kfree_rcu(wkinfo); -+ } -+} -+ -+/* -+ * Since struct completion is large, try allocating it dynamically. -+ */ -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ -+static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) -+{ -+ *comp = kmalloc(sizeof(**comp), GFP_NOFS); -+ if (*comp) { -+ init_completion(*comp); -+ wkinfo->comp = *comp; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+static void au_wkq_comp_free(struct completion *comp) -+{ -+ au_kfree_rcu(comp); -+} -+ -+static void au_wkq_run(struct au_wkinfo *wkinfo) -+{ -+ if (au_ftest_wkq(wkinfo->flags, NEST)) { -+ if (au_wkq_test()) { -+ AuWarn1("wkq from wkq, unless silly-rename on NFS," -+ " due to a dead dir by UDBA," -+ " or async xino write?\n"); -+ AuDebugOn(au_ftest_wkq(wkinfo->flags, WAIT)); -+ } -+ } else -+ au_dbg_verify_kthread(); -+ -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) { -+ INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func); -+ queue_work(au_wkq, &wkinfo->wk); -+ } else { -+ INIT_WORK(&wkinfo->wk, wkq_func); -+ schedule_work(&wkinfo->wk); -+ } -+} -+ -+/* -+ * Be careful. It is easy to make deadlock happen. -+ * processA: lock, wkq and wait -+ * processB: wkq and wait, lock in wkq -+ * --> deadlock -+ */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) -+{ -+ int err; -+ AuWkqCompDeclare(comp); -+ struct au_wkinfo wkinfo = { -+ .flags = flags, -+ .func = func, -+ .args = args -+ }; -+ -+ err = au_wkq_comp_alloc(&wkinfo, &comp); -+ if (unlikely(err)) -+ goto out; -+ err = au_wkq_lockdep_alloc(&wkinfo); -+ if (unlikely(err)) -+ goto out_comp; -+ if (!err) { -+ au_wkq_run(&wkinfo); -+ /* no timeout, no interrupt */ -+ wait_for_completion(wkinfo.comp); -+ } -+ au_wkq_lockdep_free(&wkinfo); -+ -+out_comp: -+ au_wkq_comp_free(comp); -+out: -+ destroy_work_on_stack(&wkinfo.wk); -+ return err; -+} -+ -+/* -+ * Note: dget/dput() in func for aufs dentries are not supported. It will be a -+ * problem in a concurrent umounting. -+ */ -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags) -+{ -+ int err; -+ struct au_wkinfo *wkinfo; -+ -+ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); -+ -+ /* -+ * wkq_func() must free this wkinfo. -+ * it highly depends upon the implementation of workqueue. -+ */ -+ err = 0; -+ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); -+ if (wkinfo) { -+ wkinfo->kobj = &au_sbi(sb)->si_kobj; -+ wkinfo->flags = flags & ~AuWkq_WAIT; -+ wkinfo->func = func; -+ wkinfo->args = args; -+ wkinfo->comp = NULL; -+ au_wkq_lockdep_init(wkinfo); -+ kobject_get(wkinfo->kobj); -+ __module_get(THIS_MODULE); /* todo: ?? */ -+ -+ au_wkq_run(wkinfo); -+ } else { -+ err = -ENOMEM; -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_nwt_init(struct au_nowait_tasks *nwt) -+{ -+ atomic_set(&nwt->nw_len, 0); -+ /* smp_mb(); */ /* atomic_set */ -+ init_waitqueue_head(&nwt->nw_wq); -+} -+ -+void au_wkq_fin(void) -+{ -+ destroy_workqueue(au_wkq); -+} -+ -+int __init au_wkq_init(void) -+{ -+ int err; -+ -+ err = 0; -+ au_wkq = alloc_workqueue(AUFS_WKQ_NAME, 0, WQ_DFL_ACTIVE); -+ if (IS_ERR(au_wkq)) -+ err = PTR_ERR(au_wkq); -+ else if (!au_wkq) -+ err = -ENOMEM; -+ -+ return err; -+} -diff --git a/fs/aufs/wkq.h b/fs/aufs/wkq.h -new file mode 100644 -index 000000000000..850085fdd2d2 ---- /dev/null -+++ b/fs/aufs/wkq.h -@@ -0,0 +1,76 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credentials management scheme -+ */ -+ -+#ifndef __AUFS_WKQ_H__ -+#define __AUFS_WKQ_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct super_block; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue -+ */ -+struct au_nowait_tasks { -+ atomic_t nw_len; -+ wait_queue_head_t nw_wq; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+typedef void (*au_wkq_func_t)(void *args); -+ -+/* wkq flags */ -+#define AuWkq_WAIT 1 -+#define AuWkq_NEST (1 << 1) -+#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) -+#define au_fset_wkq(flags, name) \ -+ do { (flags) |= AuWkq_##name; } while (0) -+#define au_fclr_wkq(flags, name) \ -+ do { (flags) &= ~AuWkq_##name; } while (0) -+ -+/* wkq.c */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args); -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags); -+void au_nwt_init(struct au_nowait_tasks *nwt); -+int __init au_wkq_init(void); -+void au_wkq_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int au_wkq_test(void) -+{ -+ return current->flags & PF_WQ_WORKER; -+} -+ -+static inline int au_wkq_wait(au_wkq_func_t func, void *args) -+{ -+ return au_wkq_do_wait(AuWkq_WAIT, func, args); -+} -+ -+static inline void au_nwt_done(struct au_nowait_tasks *nwt) -+{ -+ if (atomic_dec_and_test(&nwt->nw_len)) -+ wake_up_all(&nwt->nw_wq); -+} -+ -+static inline int au_nwt_flush(struct au_nowait_tasks *nwt) -+{ -+ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); -+ return 0; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WKQ_H__ */ -diff --git a/fs/aufs/xattr.c b/fs/aufs/xattr.c -new file mode 100644 -index 000000000000..a71145b741b1 ---- /dev/null -+++ b/fs/aufs/xattr.c -@@ -0,0 +1,343 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * handling xattr functions -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int au_xattr_ignore(int err, char *name, unsigned int ignore_flags) -+{ -+ if (!ignore_flags) -+ goto out; -+ switch (err) { -+ case -ENOMEM: -+ case -EDQUOT: -+ goto out; -+ } -+ -+ if ((ignore_flags & AuBrAttr_ICEX) == AuBrAttr_ICEX) { -+ err = 0; -+ goto out; -+ } -+ -+#define cmp(brattr, prefix) do { \ -+ if (!strncmp(name, XATTR_##prefix##_PREFIX, \ -+ XATTR_##prefix##_PREFIX_LEN)) { \ -+ if (ignore_flags & AuBrAttr_ICEX_##brattr) \ -+ err = 0; \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+ cmp(SEC, SECURITY); -+ cmp(SYS, SYSTEM); -+ cmp(TR, TRUSTED); -+ cmp(USR, USER); -+#undef cmp -+ -+ if (ignore_flags & AuBrAttr_ICEX_OTH) -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static const int au_xattr_out_of_list = AuBrAttr_ICEX_OTH << 1; -+ -+static int au_do_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, -+ char *name, char **buf, unsigned int ignore_flags, -+ unsigned int verbose) -+{ -+ int err; -+ ssize_t ssz; -+ struct inode *h_idst; -+ -+ ssz = vfs_getxattr_alloc(h_src, name, buf, 0, GFP_NOFS); -+ err = ssz; -+ if (unlikely(err <= 0)) { -+ if (err == -ENODATA -+ || (err == -EOPNOTSUPP -+ && ((ignore_flags & au_xattr_out_of_list) -+ || (au_test_nfs_noacl(d_inode(h_src)) -+ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) -+ || !strcmp(name, -+ XATTR_NAME_POSIX_ACL_DEFAULT)))) -+ )) -+ err = 0; -+ if (err && (verbose || au_debug_test())) -+ pr_err("%s, err %d\n", name, err); -+ goto out; -+ } -+ -+ /* unlock it temporary */ -+ h_idst = d_inode(h_dst); -+ inode_unlock(h_idst); -+ err = vfsub_setxattr(h_dst, name, *buf, ssz, /*flags*/0); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ if (unlikely(err)) { -+ if (verbose || au_debug_test()) -+ pr_err("%s, err %d\n", name, err); -+ err = au_xattr_ignore(err, name, ignore_flags); -+ } -+ -+out: -+ return err; -+} -+ -+int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, -+ unsigned int verbose) -+{ -+ int err, unlocked, acl_access, acl_default; -+ ssize_t ssz; -+ struct inode *h_isrc, *h_idst; -+ char *value, *p, *o, *e; -+ -+ /* try stopping to update the source inode while we are referencing */ -+ /* there should not be the parent-child relationship between them */ -+ h_isrc = d_inode(h_src); -+ h_idst = d_inode(h_dst); -+ inode_unlock(h_idst); -+ inode_lock_shared_nested(h_isrc, AuLsc_I_CHILD); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ unlocked = 0; -+ -+ /* some filesystems don't list POSIX ACL, for example tmpfs */ -+ ssz = vfs_listxattr(h_src, NULL, 0); -+ err = ssz; -+ if (unlikely(err < 0)) { -+ AuTraceErr(err); -+ if (err == -ENODATA -+ || err == -EOPNOTSUPP) -+ err = 0; /* ignore */ -+ goto out; -+ } -+ -+ err = 0; -+ p = NULL; -+ o = NULL; -+ if (ssz) { -+ err = -ENOMEM; -+ p = kmalloc(ssz, GFP_NOFS); -+ o = p; -+ if (unlikely(!p)) -+ goto out; -+ err = vfs_listxattr(h_src, p, ssz); -+ } -+ inode_unlock_shared(h_isrc); -+ unlocked = 1; -+ AuDbg("err %d, ssz %zd\n", err, ssz); -+ if (unlikely(err < 0)) -+ goto out_free; -+ -+ err = 0; -+ e = p + ssz; -+ value = NULL; -+ acl_access = 0; -+ acl_default = 0; -+ while (!err && p < e) { -+ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, -+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); -+ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, -+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) -+ - 1); -+ err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, -+ verbose); -+ p += strlen(p) + 1; -+ } -+ AuTraceErr(err); -+ ignore_flags |= au_xattr_out_of_list; -+ if (!err && !acl_access) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_ACCESS, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ if (!err && !acl_default) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_DEFAULT, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ -+ au_kfree_try_rcu(value); -+ -+out_free: -+ au_kfree_try_rcu(o); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_isrc); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_smack_reentering(struct super_block *sb) -+{ -+#if IS_ENABLED(CONFIG_SECURITY_SMACK) || IS_ENABLED(CONFIG_SECURITY_SELINUX) -+ /* -+ * as a part of lookup, smack_d_instantiate() is called, and it calls -+ * i_op->getxattr(). ouch. -+ */ -+ return si_pid_test(sb); -+#else -+ return 0; -+#endif -+} -+ -+enum { -+ AU_XATTR_LIST, -+ AU_XATTR_GET -+}; -+ -+struct au_lgxattr { -+ int type; -+ union { -+ struct { -+ char *list; -+ size_t size; -+ } list; -+ struct { -+ const char *name; -+ void *value; -+ size_t size; -+ } get; -+ } u; -+}; -+ -+static ssize_t au_lgxattr(struct dentry *dentry, struct inode *inode, -+ struct au_lgxattr *arg) -+{ -+ ssize_t err; -+ int reenter; -+ struct path h_path; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ reenter = au_smack_reentering(sb); -+ if (!reenter) { -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_h_path_getattr(dentry, inode, /*force*/1, &h_path, reenter); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_di; /* pretending success */ -+ -+ /* always topmost entry only */ -+ switch (arg->type) { -+ case AU_XATTR_LIST: -+ err = vfs_listxattr(h_path.dentry, -+ arg->u.list.list, arg->u.list.size); -+ break; -+ case AU_XATTR_GET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfs_getxattr(h_path.dentry, -+ arg->u.get.name, arg->u.get.value, -+ arg->u.get.size); -+ break; -+ } -+ -+out_di: -+ if (!reenter) -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ if (!reenter) -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_LIST, -+ .u.list = { -+ .list = list, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, /*inode*/NULL, &arg); -+} -+ -+static ssize_t au_getxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, void *value, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_GET, -+ .u.get = { -+ .name = name, -+ .value = value, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, inode, &arg); -+} -+ -+static int au_setxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ struct au_sxattr arg = { -+ .type = AU_XATTR_SET, -+ .u.set = { -+ .name = name, -+ .value = value, -+ .size = size, -+ .flags = flags -+ }, -+ }; -+ -+ return au_sxattr(dentry, inode, &arg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xattr_get(const struct xattr_handler *handler, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, void *buffer, size_t size) -+{ -+ return au_getxattr(dentry, inode, name, buffer, size); -+} -+ -+static int au_xattr_set(const struct xattr_handler *handler, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ return au_setxattr(dentry, inode, name, value, size, flags); -+} -+ -+static const struct xattr_handler au_xattr_handler = { -+ .name = "", -+ .prefix = "", -+ .get = au_xattr_get, -+ .set = au_xattr_set -+}; -+ -+static const struct xattr_handler *au_xattr_handlers[] = { -+#ifdef CONFIG_FS_POSIX_ACL -+ &posix_acl_access_xattr_handler, -+ &posix_acl_default_xattr_handler, -+#endif -+ &au_xattr_handler, /* must be last */ -+ NULL -+}; -+ -+void au_xattr_init(struct super_block *sb) -+{ -+ sb->s_xattr = au_xattr_handlers; -+} -diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c -new file mode 100644 -index 000000000000..753e92a3d6d7 ---- /dev/null -+++ b/fs/aufs/xino.c -@@ -0,0 +1,1912 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+/* -+ * external inode number translation table and bitmap -+ * -+ * things to consider -+ * - the lifetime -+ * + au_xino object -+ * + XINO files (xino, xib, xigen) -+ * + dynamic debugfs entries (xiN) -+ * + static debugfs entries (xib, xigen) -+ * + static sysfs entry (xi_path) -+ * - several entry points to handle them. -+ * + mount(2) without xino option (default) -+ * + mount(2) with xino option -+ * + mount(2) with noxino option -+ * + umount(2) -+ * + remount with add/del branches -+ * + remount with xino/noxino options -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t sbr_find_shared(struct super_block *sb, aufs_bindex_t btop, -+ aufs_bindex_t bbot, -+ struct super_block *h_sb) -+{ -+ /* todo: try binary-search if the branches are many */ -+ for (; btop <= bbot; btop++) -+ if (h_sb == au_sbr_sb(sb, btop)) -+ return btop; -+ return -1; -+} -+ -+/* -+ * find another branch who is on the same filesystem of the specified -+ * branch{@btgt}. search until @bbot. -+ */ -+static aufs_bindex_t is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, -+ aufs_bindex_t bbot) -+{ -+ aufs_bindex_t bindex; -+ struct super_block *tgt_sb; -+ -+ tgt_sb = au_sbr_sb(sb, btgt); -+ bindex = sbr_find_shared(sb, /*btop*/0, btgt - 1, tgt_sb); -+ if (bindex < 0) -+ bindex = sbr_find_shared(sb, btgt + 1, bbot, tgt_sb); -+ -+ return bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * stop unnecessary notify events at creating xino files -+ */ -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry) -+{ -+ aufs_bindex_t bfound, bindex, bbot; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ bfound = -1; -+ parent = dentry->d_parent; /* safe d_parent access */ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_dentry(br) == parent) { -+ bfound = bindex; -+ break; -+ } -+ } -+ -+ AuDbg("bfound b%d\n", bfound); -+ return bfound; -+} -+ -+struct au_xino_lock_dir { -+ struct au_hinode *hdir; -+ struct dentry *parent; -+ struct inode *dir; -+}; -+ -+static struct dentry *au_dget_parent_lock(struct dentry *dentry, -+ unsigned int lsc) -+{ -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ inode_lock_nested(dir, lsc); -+#if 0 /* it should not happen */ -+ spin_lock(&dentry->d_lock); -+ if (unlikely(dentry->d_parent != parent)) { -+ spin_unlock(&dentry->d_lock); -+ inode_unlock(dir); -+ dput(parent); -+ parent = NULL; -+ goto out; -+ } -+ spin_unlock(&dentry->d_lock); -+ -+out: -+#endif -+ return parent; -+} -+ -+static void au_xino_lock_dir(struct super_block *sb, struct path *xipath, -+ struct au_xino_lock_dir *ldir) -+{ -+ aufs_bindex_t bindex; -+ -+ ldir->hdir = NULL; -+ bindex = au_xi_root(sb, xipath->dentry); -+ if (bindex >= 0) { -+ /* rw branch root */ -+ ldir->hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(ldir->hdir, AuLsc_I_PARENT); -+ } else { -+ /* other */ -+ ldir->parent = au_dget_parent_lock(xipath->dentry, -+ AuLsc_I_PARENT); -+ ldir->dir = d_inode(ldir->parent); -+ } -+} -+ -+static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) -+{ -+ if (ldir->hdir) -+ au_hn_inode_unlock(ldir->hdir); -+ else { -+ inode_unlock(ldir->dir); -+ dput(ldir->parent); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create and set a new xino file -+ */ -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop) -+{ -+ struct file *file; -+ struct dentry *h_parent, *d; -+ struct inode *h_dir, *inode; -+ int err; -+ static DEFINE_MUTEX(mtx); -+ -+ /* -+ * at mount-time, and the xino file is the default path, -+ * hnotify is disabled so we have no notify events to ignore. -+ * when a user specified the xino, we cannot get au_hdir to be ignored. -+ */ -+ if (!wbrtop) -+ mutex_lock(&mtx); -+ file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE -+ /* | __FMODE_NONOTIFY */, -+ 0666); -+ if (IS_ERR(file)) { -+ if (!wbrtop) -+ mutex_unlock(&mtx); -+ if (!silent) -+ pr_err("open %s(%ld)\n", fpath, PTR_ERR(file)); -+ return file; -+ } -+ -+ /* keep file count */ -+ err = 0; -+ d = file->f_path.dentry; -+ h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT); -+ if (!wbrtop) -+ mutex_unlock(&mtx); -+ /* mnt_want_write() is unnecessary here */ -+ h_dir = d_inode(h_parent); -+ inode = file_inode(file); -+ /* no delegation since it is just created */ -+ if (inode->i_nlink) -+ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, -+ /*force*/0); -+ inode_unlock(h_dir); -+ dput(h_parent); -+ if (unlikely(err)) { -+ if (!silent) -+ pr_err("unlink %s(%d)\n", fpath, err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(sb == d->d_sb)) { -+ if (!silent) -+ pr_err("%s must be outside\n", fpath); -+ goto out; -+ } -+ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { -+ if (!silent) -+ pr_err("xino doesn't support %s(%s)\n", -+ fpath, au_sbtype(d->d_sb)); -+ goto out; -+ } -+ return file; /* success */ -+ -+out: -+ fput(file); -+ file = ERR_PTR(err); -+ return file; -+} -+ -+/* -+ * create a new xinofile at the same place/path as @base. -+ */ -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src) -+{ -+ struct file *file; -+ struct dentry *dentry, *parent; -+ struct inode *dir, *delegated; -+ struct qstr *name; -+ struct path 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); -+ IMustLock(dir); -+ -+ name = &dentry->d_name; -+ path.dentry = vfsub_lookup_one_len(name->name, parent, name->len); -+ if (IS_ERR(path.dentry)) { -+ file = (void *)path.dentry; -+ pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry)); -+ goto out; -+ } -+ -+ /* no need to mnt_want_write() since we call dentry_open() later */ -+ err = vfs_create(dir, path.dentry, 0666, NULL); -+ if (unlikely(err)) { -+ file = ERR_PTR(err); -+ pr_err("%pd create err %d\n", dentry, err); -+ goto out_dput; -+ } -+ -+ path.mnt = base->mnt; -+ file = vfsub_dentry_open(&path, -+ O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE -+ /* | __FMODE_NONOTIFY */); -+ if (IS_ERR(file)) { -+ pr_err("%pd open err %ld\n", dentry, PTR_ERR(file)); -+ goto out_dput; -+ } -+ -+ delegated = NULL; -+ err = vfsub_unlink(dir, &file->f_path, &delegated, /*force*/0); -+ au_xino_unlock_dir(&ldir); -+ do_unlock = 0; -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) { -+ pr_err("%pd unlink err %d\n", dentry, err); -+ goto out_fput; -+ } -+ -+ if (copy_src) { -+ /* no one can touch copy_src xino */ -+ err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src)); -+ if (unlikely(err)) { -+ pr_err("%pd copy err %d\n", dentry, err); -+ goto out_fput; -+ } -+ } -+ goto out_dput; /* success */ -+ -+out_fput: -+ fput(file); -+ file = ERR_PTR(err); -+out_dput: -+ dput(path.dentry); -+out: -+ if (do_unlock) -+ au_xino_unlock_dir(&ldir); -+ return file; -+} -+ -+struct file *au_xino_file1(struct au_xino *xi) -+{ -+ struct file *file; -+ unsigned int u, nfile; -+ -+ file = NULL; -+ nfile = xi->xi_nfile; -+ for (u = 0; u < nfile; u++) { -+ file = xi->xi_file[u]; -+ if (file) -+ break; -+ } -+ -+ return file; -+} -+ -+static int au_xino_file_set(struct au_xino *xi, int idx, struct file *file) -+{ -+ int err; -+ struct file *f; -+ void *p; -+ -+ if (file) -+ get_file(file); -+ -+ err = 0; -+ f = NULL; -+ if (idx < xi->xi_nfile) { -+ f = xi->xi_file[idx]; -+ if (f) -+ fput(f); -+ } else { -+ p = au_kzrealloc(xi->xi_file, -+ sizeof(*xi->xi_file) * xi->xi_nfile, -+ sizeof(*xi->xi_file) * (idx + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (p) { -+ MtxMustLock(&xi->xi_mtx); -+ xi->xi_file = p; -+ xi->xi_nfile = idx + 1; -+ } else { -+ err = -ENOMEM; -+ if (file) -+ fput(file); -+ goto out; -+ } -+ } -+ xi->xi_file[idx] = file; -+ -+out: -+ return err; -+} -+ -+/* -+ * if @xinew->xi is not set, then create new xigen file. -+ */ -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew) -+{ -+ struct file *file; -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ file = au_xino_create2(sb, xinew->base, xinew->copy_src); -+ if (IS_ERR(file)) { -+ err = PTR_ERR(file); -+ pr_err("%s[%d], err %d\n", -+ xinew->xi ? "xino" : "xigen", -+ xinew->idx, err); -+ goto out; -+ } -+ -+ if (xinew->xi) -+ err = au_xino_file_set(xinew->xi, xinew->idx, file); -+ else { -+ BUG(); -+ /* todo: make xigen file an array */ -+ /* err = au_xigen_file_set(sb, xinew->idx, file); */ -+ } -+ fput(file); -+ if (unlikely(err)) -+ file = ERR_PTR(err); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate xino files -+ */ -+static int au_xino_do_trunc(struct super_block *sb, aufs_bindex_t bindex, -+ int idx, struct kstatfs *st) -+{ -+ int err; -+ blkcnt_t blocks; -+ struct file *file, *new_xino; -+ struct au_xi_new xinew = { -+ .idx = idx -+ }; -+ -+ err = 0; -+ xinew.xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xinew.xi, idx); -+ if (!file) -+ goto out; -+ -+ xinew.base = &file->f_path; -+ err = vfs_statfs(xinew.base, st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ goto out; -+ } -+ -+ blocks = file_inode(file)->i_blocks; -+ pr_info("begin truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)blocks, st->f_bfree, st->f_blocks); -+ -+ xinew.copy_src = file; -+ new_xino = au_xi_new(sb, &xinew); -+ if (IS_ERR(new_xino)) { -+ err = PTR_ERR(new_xino); -+ pr_err("xino(b%d-%d), err %d, ignored\n", bindex, idx, err); -+ goto out; -+ } -+ -+ err = vfs_statfs(&new_xino->f_path, st); -+ if (!err) -+ pr_info("end truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)file_inode(new_xino)->i_blocks, -+ st->f_bfree, st->f_blocks); -+ else { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin) -+{ -+ int err, i; -+ unsigned long jiffy; -+ aufs_bindex_t bbot; -+ struct kstatfs *st; -+ struct au_branch *br; -+ struct au_xino *xi; -+ -+ err = -ENOMEM; -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) -+ goto out; -+ -+ err = -EINVAL; -+ bbot = au_sbbot(sb); -+ if (unlikely(bindex < 0 || bbot < bindex)) -+ goto out_st; -+ -+ err = 0; -+ jiffy = jiffies; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (i = idx_begin; !err && i < xi->xi_nfile; i++) -+ err = au_xino_do_trunc(sb, bindex, i, st); -+ if (!err) -+ au_sbi(sb)->si_xino_jiffy = jiffy; -+ -+out_st: -+ au_kfree_rcu(st); -+out: -+ return err; -+} -+ -+struct xino_do_trunc_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ int idx; -+}; -+ -+static void xino_do_trunc(void *_args) -+{ -+ struct xino_do_trunc_args *args = _args; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *dir; -+ int err, idx; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ sb = args->sb; -+ dir = d_inode(sb->s_root); -+ br = args->br; -+ idx = args->idx; -+ -+ si_noflush_write_lock(sb); -+ ii_read_lock_parent(dir); -+ bindex = au_br_index(sb, br->br_id); -+ err = au_xino_trunc(sb, bindex, idx); -+ ii_read_unlock(dir); -+ if (unlikely(err)) -+ pr_warn("err b%d, (%d)\n", bindex, err); -+ atomic_dec(&br->br_xino->xi_truncating); -+ au_lcnt_dec(&br->br_count); -+ si_write_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_rcu(args); -+} -+ -+/* -+ * returns the index in the xi_file array whose corresponding file is necessary -+ * to truncate, or -1 which means no need to truncate. -+ */ -+static int xino_trunc_test(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ unsigned int u; -+ struct kstatfs st; -+ struct au_sbinfo *sbinfo; -+ struct au_xino *xi; -+ struct file *file; -+ -+ /* todo: si_xino_expire and the ratio should be customizable */ -+ sbinfo = au_sbi(sb); -+ if (time_before(jiffies, -+ sbinfo->si_xino_jiffy + sbinfo->si_xino_expire)) -+ return -1; -+ -+ /* truncation border */ -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) { -+ file = au_xino_file(xi, u); -+ if (!file) -+ continue; -+ -+ err = vfs_statfs(&file->f_path, &st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ return -1; -+ } -+ if (div64_u64(st.f_bfree * 100, st.f_blocks) -+ >= AUFS_XINO_DEF_TRUNC) -+ return u; -+ } -+ -+ return -1; -+} -+ -+static void xino_try_trunc(struct super_block *sb, struct au_branch *br) -+{ -+ int idx; -+ struct xino_do_trunc_args *args; -+ int wkq_err; -+ -+ idx = xino_trunc_test(sb, br); -+ if (idx < 0) -+ return; -+ -+ if (atomic_inc_return(&br->br_xino->xi_truncating) > 1) -+ goto out; -+ -+ /* lock and kfree() will be called in trunc_xino() */ -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ goto out; -+ } -+ -+ au_lcnt_inc(&br->br_count); -+ args->sb = sb; -+ args->br = br; -+ args->idx = idx; -+ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb, /*flags*/0); -+ if (!wkq_err) -+ return; /* success */ -+ -+ pr_err("wkq %d\n", wkq_err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(args); -+ -+out: -+ atomic_dec(&br->br_xino->xi_truncating); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xi_calc { -+ int idx; -+ loff_t pos; -+}; -+ -+static void au_xi_calc(struct super_block *sb, ino_t h_ino, -+ struct au_xi_calc *calc) -+{ -+ loff_t maxent; -+ -+ maxent = au_xi_maxent(sb); -+ calc->idx = div64_u64_rem(h_ino, maxent, &calc->pos); -+ calc->pos *= sizeof(ino_t); -+} -+ -+static int au_xino_do_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc) -+{ -+ int err; -+ struct file *file; -+ struct au_xino *xi = br->br_xino; -+ struct au_xi_new xinew = { -+ .xi = xi -+ }; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!xi) -+ goto out; -+ -+ mutex_lock(&xi->xi_mtx); -+ file = au_xino_file(xi, calc->idx); -+ if (file) -+ goto out_mtx; -+ -+ file = au_xino_file(xi, /*idx*/-1); -+ AuDebugOn(!file); -+ xinew.idx = calc->idx; -+ xinew.base = &file->f_path; -+ /* xinew.copy_src = NULL; */ -+ file = au_xi_new(sb, &xinew); -+ if (IS_ERR(file)) -+ err = PTR_ERR(file); -+ -+out_mtx: -+ mutex_unlock(&xi->xi_mtx); -+out: -+ return err; -+} -+ -+struct au_xino_do_new_async_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ ino_t ino; -+}; -+ -+struct au_xi_writing { -+ struct hlist_bl_node node; -+ ino_t h_ino, ino; -+}; -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino); -+ -+static void au_xino_call_do_new_async(void *args) -+{ -+ struct au_xino_do_new_async_args *a = args; -+ struct au_branch *br; -+ struct super_block *sb; -+ struct au_sbinfo *sbi; -+ struct inode *root; -+ struct file *file; -+ struct au_xi_writing *del, *p; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int err; -+ -+ br = a->br; -+ sb = a->sb; -+ sbi = au_sbi(sb); -+ si_noflush_read_lock(sb); -+ root = d_inode(sb->s_root); -+ ii_read_lock_child(root); -+ err = au_xino_do_new_async(sb, br, &a->calc); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ file = au_xino_file(br->br_xino, a->calc.idx); -+ AuDebugOn(!file); -+ err = au_xino_do_write(file, &a->calc, a->ino); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ del = NULL; -+ hbl = &br->br_xino->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->ino == a->ino) { -+ del = p; -+ hlist_bl_del(&p->node); -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ au_kfree_rcu(del); -+ -+out: -+ au_lcnt_dec(&br->br_count); -+ ii_read_unlock(root); -+ si_read_unlock(sb); -+ au_nwt_done(&sbi->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* -+ * create a new xino file asynchronously -+ */ -+static int au_xino_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc, ino_t ino) -+{ -+ int err; -+ struct au_xino_do_new_async_args *arg; -+ -+ err = -ENOMEM; -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (unlikely(!arg)) -+ goto out; -+ -+ arg->sb = sb; -+ arg->br = br; -+ arg->calc = *calc; -+ arg->ino = ino; -+ au_lcnt_inc(&br->br_count); -+ err = au_wkq_nowait(au_xino_call_do_new_async, arg, sb, AuWkq_NEST); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * read @ino from xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ */ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino) -+{ -+ int err; -+ ssize_t sz; -+ struct au_xi_calc calc; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct au_xino *xi; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_xi_writing *p; -+ -+ *ino = 0; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return 0; /* no xino */ -+ -+ err = 0; -+ au_xi_calc(sb, h_ino, &calc); -+ xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ hbl = &xi->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->h_ino == h_ino) { -+ AuDbg("hi%llu, i%llu, found\n", -+ (u64)p->h_ino, (u64)p->ino); -+ *ino = p->ino; -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ return 0; -+ } else if (vfsub_f_size_read(file) < calc.pos + sizeof(*ino)) -+ return 0; /* no xino */ -+ -+ sbinfo = au_sbi(sb); -+ sz = xino_fread(file, ino, sizeof(*ino), &calc.pos); -+ if (sz == sizeof(*ino)) -+ return 0; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xino read error (%zd)\n", sz); -+ } -+ return err; -+} -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino) -+{ -+ ssize_t sz; -+ -+ sz = xino_fwrite(file, &ino, sizeof(ino), &calc->pos); -+ if (sz == sizeof(ino)) -+ return 0; /* success */ -+ -+ AuIOErr("write failed (%zd)\n", sz); -+ return -EIO; -+} -+ -+/* -+ * write @ino to the xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ * even if @ino is zero, it is written to the xinofile and means no entry. -+ * if the size of the xino file on a specific filesystem exceeds the watermark, -+ * try truncating it. -+ */ -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino) -+{ -+ int err; -+ unsigned int mnt_flags; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct au_xi_writing *p; -+ -+ SiMustAnyLock(sb); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO)) -+ return 0; -+ -+ au_xi_calc(sb, h_ino, &calc); -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ /* store the inum pair into the list */ -+ p = kmalloc(sizeof(*p), GFP_NOFS | __GFP_NOFAIL); -+ p->h_ino = h_ino; -+ p->ino = ino; -+ au_hbl_add(&p->node, &xi->xi_writing); -+ -+ /* create and write a new xino file asynchronously */ -+ err = au_xino_new_async(sb, br, &calc, ino); -+ if (!err) -+ return 0; /* success */ -+ goto out; -+ } -+ -+ err = au_xino_do_write(file, &calc, ino); -+ if (!err) { -+ br = au_sbr(sb, bindex); -+ if (au_opt_test(mnt_flags, TRUNC_XINO) -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr("write failed (%d)\n", err); -+ return -EIO; -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+/* todo: unnecessary to support mmap_sem since kernel-space? */ -+ssize_t xino_fread(struct file *file, void *kbuf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_read_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fread_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_access(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct xino_fread_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_xino_fread(void *args) -+{ -+ struct xino_fread_args *a = args; -+ *a->errp = xino_fread(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct xino_fread_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ wkq_err = au_wkq_wait(call_xino_fread, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+static ssize_t do_xino_fwrite(struct file *file, void *kbuf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_write_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fwrite_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_modify(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct do_xino_fwrite_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_do_xino_fwrite(void *args) -+{ -+ struct do_xino_fwrite_args *a = args; -+ *a->errp = do_xino_fwrite(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct do_xino_fwrite_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ /* -+ * it breaks RLIMIT_FSIZE and normal user's limit, -+ * users should care about quota and real 'filesystem full.' -+ */ -+ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ -+ if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) { -+ lockdep_off(); -+ err = do_xino_fwrite(file, buf, size, pos); -+ lockdep_on(); -+ } else { -+ lockdep_off(); -+ err = xino_fwrite_wkq(file, buf, size, pos); -+ lockdep_on(); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * inode number bitmap -+ */ -+static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; -+static ino_t xib_calc_ino(unsigned long pindex, int bit) -+{ -+ ino_t ino; -+ -+ AuDebugOn(bit < 0 || page_bits <= bit); -+ ino = AUFS_FIRST_INO + pindex * page_bits + bit; -+ return ino; -+} -+ -+static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) -+{ -+ AuDebugOn(ino < AUFS_FIRST_INO); -+ ino -= AUFS_FIRST_INO; -+ *pindex = ino / page_bits; -+ *bit = ino % page_bits; -+} -+ -+static int xib_pindex(struct super_block *sb, unsigned long pindex) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct au_sbinfo *sbinfo; -+ struct file *xib; -+ unsigned long *p; -+ -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE -+ || !au_opt_test(sbinfo->si_mntflags, XINO)); -+ -+ if (pindex == sbinfo->si_xib_last_pindex) -+ return 0; -+ -+ xib = sbinfo->si_xib; -+ p = sbinfo->si_xib_buf; -+ pos = sbinfo->si_xib_last_pindex; -+ pos *= PAGE_SIZE; -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) -+ goto out; -+ -+ pos = pindex; -+ pos *= PAGE_SIZE; -+ if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE) -+ sz = xino_fread(xib, p, PAGE_SIZE, &pos); -+ else { -+ memset(p, 0, PAGE_SIZE); -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ } -+ if (sz == PAGE_SIZE) { -+ sbinfo->si_xib_last_pindex = pindex; -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr1("write failed (%zd)\n", sz); -+ err = sz; -+ if (sz >= 0) -+ err = -EIO; -+ return err; -+} -+ -+static void au_xib_clear_bit(struct inode *inode) -+{ -+ int err, bit; -+ unsigned long pindex; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(inode->i_nlink); -+ -+ sb = inode->i_sb; -+ xib_calc_bit(inode->i_ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ err = xib_pindex(sb, pindex); -+ if (!err) { -+ clear_bit(bit, sbinfo->si_xib_buf); -+ sbinfo->si_xib_next_bit = bit; -+ } -+ mutex_unlock(&sbinfo->si_xib_mtx); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate a xino bitmap file -+ */ -+ -+/* todo: slow */ -+static int do_xib_restore(struct super_block *sb, struct file *file, void *page) -+{ -+ int err, bit; -+ ssize_t sz; -+ unsigned long pindex; -+ loff_t pos, pend; -+ struct au_sbinfo *sbinfo; -+ ino_t *ino; -+ unsigned long *p; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ pend = vfsub_f_size_read(file); -+ pos = 0; -+ while (pos < pend) { -+ sz = xino_fread(file, page, PAGE_SIZE, &pos); -+ err = sz; -+ if (unlikely(sz <= 0)) -+ goto out; -+ -+ err = 0; -+ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { -+ if (unlikely(*ino < AUFS_FIRST_INO)) -+ continue; -+ -+ xib_calc_bit(*ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ err = xib_pindex(sb, pindex); -+ if (!err) -+ set_bit(bit, p); -+ else -+ goto out; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static int xib_restore(struct super_block *sb) -+{ -+ int err, i; -+ unsigned int nfile; -+ aufs_bindex_t bindex, bbot; -+ void *page; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct file *file; -+ -+ err = -ENOMEM; -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) -+ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) { -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ nfile = xi->xi_nfile; -+ for (i = 0; i < nfile; i++) { -+ file = au_xino_file(xi, i); -+ if (file) -+ err = do_xib_restore(sb, file, page); -+ } -+ } else -+ AuDbg("skip shared b%d\n", bindex); -+ free_page((unsigned long)page); -+ -+out: -+ return err; -+} -+ -+int au_xib_trunc(struct super_block *sb) -+{ -+ int err; -+ ssize_t sz; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ unsigned long *p; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ if (!au_opt_test(sbinfo->si_mntflags, XINO)) -+ goto out; -+ -+ file = sbinfo->si_xib; -+ if (vfsub_f_size_read(file) <= PAGE_SIZE) -+ goto out; -+ -+ file = au_xino_create2(sb, &sbinfo->si_xib->f_path, NULL); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ -+ p = sbinfo->si_xib_buf; -+ memset(p, 0, PAGE_SIZE); -+ pos = 0; -+ sz = xino_fwrite(sbinfo->si_xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) { -+ err = sz; -+ AuIOErr("err %d\n", err); -+ if (sz >= 0) -+ err = -EIO; -+ goto out; -+ } -+ -+ mutex_lock(&sbinfo->si_xib_mtx); -+ /* mnt_want_write() is unnecessary here */ -+ err = xib_restore(sb); -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xino *au_xino_alloc(unsigned int nfile) -+{ -+ struct au_xino *xi; -+ -+ xi = kzalloc(sizeof(*xi), GFP_NOFS); -+ if (unlikely(!xi)) -+ goto out; -+ xi->xi_nfile = nfile; -+ xi->xi_file = kcalloc(nfile, sizeof(*xi->xi_file), GFP_NOFS); -+ if (unlikely(!xi->xi_file)) -+ goto out_free; -+ -+ xi->xi_nondir.total = 8; /* initial size */ -+ xi->xi_nondir.array = kcalloc(xi->xi_nondir.total, sizeof(ino_t), -+ GFP_NOFS); -+ if (unlikely(!xi->xi_nondir.array)) -+ goto out_file; -+ -+ spin_lock_init(&xi->xi_nondir.spin); -+ init_waitqueue_head(&xi->xi_nondir.wqh); -+ mutex_init(&xi->xi_mtx); -+ INIT_HLIST_BL_HEAD(&xi->xi_writing); -+ atomic_set(&xi->xi_truncating, 0); -+ kref_init(&xi->xi_kref); -+ goto out; /* success */ -+ -+out_file: -+ au_kfree_try_rcu(xi->xi_file); -+out_free: -+ au_kfree_rcu(xi); -+ xi = NULL; -+out: -+ return xi; -+} -+ -+static int au_xino_init(struct au_branch *br, int idx, struct file *file) -+{ -+ int err; -+ struct au_xino *xi; -+ -+ err = 0; -+ xi = au_xino_alloc(idx + 1); -+ if (unlikely(!xi)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ if (file) -+ get_file(file); -+ xi->xi_file[idx] = file; -+ AuDebugOn(br->br_xino); -+ br->br_xino = xi; -+ -+out: -+ return err; -+} -+ -+static void au_xino_release(struct kref *kref) -+{ -+ struct au_xino *xi; -+ int i; -+ unsigned long ul; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *n; -+ struct au_xi_writing *p; -+ -+ xi = container_of(kref, struct au_xino, xi_kref); -+ for (i = 0; i < xi->xi_nfile; i++) -+ if (xi->xi_file[i]) -+ fput(xi->xi_file[i]); -+ for (i = xi->xi_nondir.total - 1; i >= 0; i--) -+ AuDebugOn(xi->xi_nondir.array[i]); -+ mutex_destroy(&xi->xi_mtx); -+ hbl = &xi->xi_writing; -+ ul = au_hbl_count(hbl); -+ if (unlikely(ul)) { -+ pr_warn("xi_writing %lu\n", ul); -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry_safe(p, pos, n, hbl, node) { -+ hlist_bl_del(&p->node); -+ /* kmemleak reported au_kfree_rcu() doesn't free it */ -+ kfree(p); -+ } -+ hlist_bl_unlock(hbl); -+ } -+ au_kfree_try_rcu(xi->xi_file); -+ au_kfree_try_rcu(xi->xi_nondir.array); -+ au_kfree_rcu(xi); -+} -+ -+int au_xino_put(struct au_branch *br) -+{ -+ int ret; -+ struct au_xino *xi; -+ -+ ret = 0; -+ xi = br->br_xino; -+ if (xi) { -+ br->br_xino = NULL; -+ ret = kref_put(&xi->xi_kref, au_xino_release); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * xino mount option handlers -+ */ -+ -+/* xino bitmap */ -+static void xino_clear_xib(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+} -+ -+static int au_xino_set_xib(struct super_block *sb, struct path *path) -+{ -+ int err; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct super_block *xi_sb; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xib); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ xi_sb = file_inode(file)->i_sb; -+ sbinfo->si_ximaxent = xi_sb->s_maxbytes; -+ if (unlikely(sbinfo->si_ximaxent < PAGE_SIZE)) { -+ err = -EIO; -+ pr_err("s_maxbytes(%llu) on %s is too small\n", -+ (u64)sbinfo->si_ximaxent, au_sbtype(xi_sb)); -+ goto out_unset; -+ } -+ sbinfo->si_ximaxent /= sizeof(ino_t); -+ -+ err = -ENOMEM; -+ if (!sbinfo->si_xib_buf) -+ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!sbinfo->si_xib_buf)) -+ goto out_unset; -+ -+ sbinfo->si_xib_last_pindex = 0; -+ sbinfo->si_xib_next_bit = 0; -+ if (vfsub_f_size_read(file) < PAGE_SIZE) { -+ pos = 0; -+ err = xino_fwrite(file, sbinfo->si_xib_buf, PAGE_SIZE, &pos); -+ if (unlikely(err != PAGE_SIZE)) -+ goto out_free; -+ } -+ err = 0; -+ goto out; /* success */ -+ -+out_free: -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+ if (err >= 0) -+ err = -EIO; -+out_unset: -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* xino for each branch */ -+static void xino_clear_br(struct super_block *sb) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br); -+ au_xino_put(br); -+ } -+} -+ -+static void au_xino_set_br_shared(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bshared) -+{ -+ struct au_branch *brshared; -+ -+ brshared = au_sbr(sb, bshared); -+ AuDebugOn(!brshared->br_xino); -+ AuDebugOn(!brshared->br_xino->xi_file); -+ if (br->br_xino != brshared->br_xino) { -+ au_xino_get(brshared); -+ au_xino_put(br); -+ br->br_xino = brshared->br_xino; -+ } -+} -+ -+struct au_xino_do_set_br { -+ struct au_branch *br; -+ ino_t h_ino; -+ aufs_bindex_t bshared; -+}; -+ -+static int au_xino_do_set_br(struct super_block *sb, struct path *path, -+ struct au_xino_do_set_br *args) -+{ -+ int err; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xi_new xinew = { -+ .base = path -+ }; -+ -+ br = args->br; -+ xinew.xi = br->br_xino; -+ au_xi_calc(sb, args->h_ino, &calc); -+ xinew.copy_src = au_xino_file(xinew.xi, calc.idx); -+ if (args->bshared >= 0) -+ /* shared xino */ -+ au_xino_set_br_shared(sb, br, args->bshared); -+ else if (!xinew.xi) { -+ /* new xino */ -+ err = au_xino_init(br, calc.idx, xinew.copy_src); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* force re-creating */ -+ xinew.xi = br->br_xino; -+ xinew.idx = calc.idx; -+ mutex_lock(&xinew.xi->xi_mtx); -+ file = au_xi_new(sb, &xinew); -+ mutex_unlock(&xinew.xi->xi_mtx); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ AuDebugOn(!file); -+ -+ err = au_xino_do_write(file, &calc, AUFS_ROOT_INO); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_xino_set_br(struct super_block *sb, struct path *path) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_xino_do_set_br args; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ bbot = au_sbbot(sb); -+ inode = d_inode(sb->s_root); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ args.h_ino = au_h_iptr(inode, bindex)->i_ino; -+ args.br = au_sbr(sb, bindex); -+ args.bshared = is_sb_shared(sb, bindex, bindex - 1); -+ err = au_xino_do_set_br(sb, path, &args); -+ if (unlikely(err)) -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xino_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ au_xigen_clr(sb); -+ xino_clear_xib(sb); -+ xino_clear_br(sb); -+ dbgaufs_brs_del(sb, 0); -+ sbinfo = au_sbi(sb); -+ /* lvalue, do not call au_mntflags() */ -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+} -+ -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount) -+{ -+ int err, skip; -+ struct dentry *dentry, *parent, *cur_dentry, *cur_parent; -+ struct qstr *dname, *cur_name; -+ struct file *cur_xino; -+ struct au_sbinfo *sbinfo; -+ struct path *path, *cur_path; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ path = &xiopt->file->f_path; -+ dentry = path->dentry; -+ parent = dget_parent(dentry); -+ if (remount) { -+ skip = 0; -+ cur_xino = sbinfo->si_xib; -+ if (cur_xino) { -+ cur_path = &cur_xino->f_path; -+ cur_dentry = cur_path->dentry; -+ cur_parent = dget_parent(cur_dentry); -+ cur_name = &cur_dentry->d_name; -+ dname = &dentry->d_name; -+ skip = (cur_parent == parent -+ && au_qstreq(dname, cur_name)); -+ dput(cur_parent); -+ } -+ if (skip) -+ goto out; -+ } -+ -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ err = au_xino_set_xib(sb, path); -+ /* si_x{read,write} are set */ -+ if (!err) -+ err = au_xigen_set(sb, path); -+ if (!err) -+ err = au_xino_set_br(sb, path); -+ if (!err) { -+ dbgaufs_brs_add(sb, 0, /*topdown*/1); -+ goto out; /* success */ -+ } -+ -+ /* reset all */ -+ AuIOErr("failed setting xino(%d).\n", err); -+ au_xino_clr(sb); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* -+ * create a xinofile at the default place/path. -+ */ -+struct file *au_xino_def(struct super_block *sb) -+{ -+ struct file *file; -+ char *page, *p; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ struct path path; -+ aufs_bindex_t bbot, bindex, bwr; -+ -+ br = NULL; -+ bbot = au_sbbot(sb); -+ bwr = -1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm) -+ && !au_test_fs_bad_xino(au_br_sb(br))) { -+ bwr = bindex; -+ break; -+ } -+ } -+ -+ if (bwr >= 0) { -+ file = ERR_PTR(-ENOMEM); -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(sb->s_root, bwr); -+ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); -+ file = (void *)p; -+ if (!IS_ERR(p)) { -+ strcat(p, "/" AUFS_XINO_FNAME); -+ AuDbg("%s\n", p); -+ file = au_xino_create(sb, p, /*silent*/0, /*wbrtop*/1); -+ } -+ free_page((unsigned long)page); -+ } else { -+ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0, -+ /*wbrtop*/0); -+ if (IS_ERR(file)) -+ goto out; -+ h_sb = file->f_path.dentry->d_sb; -+ if (unlikely(au_test_fs_bad_xino(h_sb))) { -+ pr_err("xino doesn't support %s(%s)\n", -+ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); -+ fput(file); -+ file = ERR_PTR(-EINVAL); -+ } -+ } -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * initialize the xinofile for the specified branch @br -+ * at the place/path where @base_file indicates. -+ * test whether another branch is on the same filesystem or not, -+ * if found then share the xinofile with another branch. -+ */ -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, -+ struct path *base) -+{ -+ int err; -+ struct au_xino_do_set_br args = { -+ .h_ino = h_ino, -+ .br = br -+ }; -+ -+ args.bshared = sbr_find_shared(sb, /*btop*/0, au_sbbot(sb), -+ au_br_sb(br)); -+ err = au_xino_do_set_br(sb, base, &args); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * get an unused inode number from bitmap -+ */ -+ino_t au_xino_new_ino(struct super_block *sb) -+{ -+ ino_t ino; -+ unsigned long *p, pindex, ul, pend; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ int free_bit, err; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return iunique(sb, AUFS_FIRST_INO); -+ -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ free_bit = sbinfo->si_xib_next_bit; -+ if (free_bit < page_bits && !test_bit(free_bit, p)) -+ goto out; /* success */ -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ -+ pindex = sbinfo->si_xib_last_pindex; -+ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ -+ file = sbinfo->si_xib; -+ pend = vfsub_f_size_read(file) / PAGE_SIZE; -+ for (ul = pindex + 1; ul <= pend; ul++) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ BUG(); -+ -+out: -+ set_bit(free_bit, p); -+ sbinfo->si_xib_next_bit = free_bit + 1; -+ pindex = sbinfo->si_xib_last_pindex; -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ ino = xib_calc_ino(pindex, free_bit); -+ AuDbg("i%lu\n", (unsigned long)ino); -+ return ino; -+out_err: -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ AuDbg("i0\n"); -+ return 0; -+} -+ -+/* for s_op->delete_inode() */ -+void au_xino_delete_inode(struct inode *inode, const int unlinked) -+{ -+ int err; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, bi; -+ unsigned char try_trunc; -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ struct inode *h_inode; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ struct file *file; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO) -+ || inode->i_ino == AUFS_ROOT_INO) -+ return; -+ -+ if (unlinked) { -+ au_xigen_inc(inode); -+ au_xib_clear_bit(inode); -+ } -+ -+ iinfo = au_ii(inode); -+ bindex = iinfo->ii_btop; -+ if (bindex < 0) -+ return; -+ -+ try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO); -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ for (; bindex <= bbot; bindex++, hi++) { -+ h_inode = hi->hi_inode; -+ if (!h_inode -+ || (!unlinked && h_inode->i_nlink)) -+ continue; -+ -+ /* inode may not be revalidated */ -+ bi = au_br_index(sb, hi->hi_id); -+ if (bi < 0) -+ continue; -+ -+ br = au_sbr(sb, bi); -+ au_xi_calc(sb, h_inode->i_ino, &calc); -+ file = au_xino_file(br->br_xino, calc.idx); -+ if (IS_ERR_OR_NULL(file)) -+ continue; -+ -+ err = au_xino_do_write(file, &calc, /*ino*/0); -+ if (!err && try_trunc -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xinondir_find(struct au_xino *xi, ino_t h_ino) -+{ -+ int found, total, i; -+ -+ found = -1; -+ total = xi->xi_nondir.total; -+ for (i = 0; i < total; i++) { -+ if (xi->xi_nondir.array[i] != h_ino) -+ continue; -+ found = i; -+ break; -+ } -+ -+ return found; -+} -+ -+static int au_xinondir_expand(struct au_xino *xi) -+{ -+ int err, sz; -+ ino_t *p; -+ -+ BUILD_BUG_ON(KMALLOC_MAX_SIZE > INT_MAX); -+ -+ err = -ENOMEM; -+ sz = xi->xi_nondir.total * sizeof(ino_t); -+ if (unlikely(sz > KMALLOC_MAX_SIZE / 2)) -+ goto out; -+ p = au_kzrealloc(xi->xi_nondir.array, sz, sz << 1, GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (p) { -+ xi->xi_nondir.array = p; -+ xi->xi_nondir.total <<= 1; -+ AuDbg("xi_nondir.total %d\n", xi->xi_nondir.total); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx) -+{ -+ struct au_xino *xi; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ xi = au_sbr(sb, bindex)->br_xino; -+ AuDebugOn(idx < 0 || xi->xi_nondir.total <= idx); -+ -+ spin_lock(&xi->xi_nondir.spin); -+ AuDebugOn(xi->xi_nondir.array[idx] != h_ino); -+ xi->xi_nondir.array[idx] = 0; -+ spin_unlock(&xi->xi_nondir.spin); -+ wake_up_all(&xi->xi_nondir.wqh); -+} -+ -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx) -+{ -+ int err, found, empty; -+ struct au_xino *xi; -+ -+ err = 0; -+ *idx = -1; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ goto out; /* no xino */ -+ -+ xi = au_sbr(sb, bindex)->br_xino; -+ -+again: -+ spin_lock(&xi->xi_nondir.spin); -+ found = au_xinondir_find(xi, h_ino); -+ if (found == -1) { -+ empty = au_xinondir_find(xi, /*h_ino*/0); -+ if (empty == -1) { -+ empty = xi->xi_nondir.total; -+ err = au_xinondir_expand(xi); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ xi->xi_nondir.array[empty] = h_ino; -+ *idx = empty; -+ } else { -+ spin_unlock(&xi->xi_nondir.spin); -+ wait_event(xi->xi_nondir.wqh, -+ xi->xi_nondir.array[found] != h_ino); -+ goto again; -+ } -+ -+out_unlock: -+ spin_unlock(&xi->xi_nondir.spin); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_xino_path(struct seq_file *seq, struct file *file) -+{ -+ int err; -+ -+ err = au_seq_path(seq, &file->f_path); -+ if (unlikely(err)) -+ goto out; -+ -+#define Deleted "\\040(deleted)" -+ seq->count -= sizeof(Deleted) - 1; -+ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, -+ sizeof(Deleted) - 1)); -+#undef Deleted -+ -+out: -+ return err; -+} -diff --git a/fs/dcache.c b/fs/dcache.c -index ea0485861d93..ddca6240e0db 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -1285,7 +1285,7 @@ enum d_walk_ret { - * - * The @enter() callbacks are called with d_lock held. - */ --static void d_walk(struct dentry *parent, void *data, -+void d_walk(struct dentry *parent, void *data, - enum d_walk_ret (*enter)(void *, struct dentry *)) - { - struct dentry *this_parent; -diff --git a/fs/fcntl.c b/fs/fcntl.c -index 19ac5baad50f..073ca6af500f 100644 ---- a/fs/fcntl.c -+++ b/fs/fcntl.c -@@ -32,7 +32,7 @@ - - #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) - --static int setfl(int fd, struct file * filp, unsigned long arg) -+int setfl(int fd, struct file *filp, unsigned long arg) - { - struct inode * inode = file_inode(filp); - int error = 0; -@@ -63,6 +63,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg) - - if (filp->f_op->check_flags) - error = filp->f_op->check_flags(arg); -+ if (!error && filp->f_op->setfl) -+ error = filp->f_op->setfl(filp, arg); - if (error) - return error; - -diff --git a/fs/inode.c b/fs/inode.c -index 9d78c37b00b8..e7f0c614a58f 100644 ---- a/fs/inode.c -+++ b/fs/inode.c -@@ -1770,7 +1770,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 cebaa3e81794..451dee24a546 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -792,6 +792,12 @@ static inline int check_mnt(struct mount *mnt) - return mnt->mnt_ns == current->nsproxy->mnt_ns; - } - -+/* for aufs, CONFIG_AUFS_BR_FUSE */ -+int is_current_mnt_ns(struct vfsmount *mnt) -+{ -+ return check_mnt(real_mount(mnt)); -+} -+ - /* - * vfsmount lock must be held for write - */ -diff --git a/fs/proc/base.c b/fs/proc/base.c -index b362523a9829..669448bb8a73 100644 ---- a/fs/proc/base.c -+++ b/fs/proc/base.c -@@ -2184,7 +2184,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) { -- *path = vma->vm_file->f_path; -+ *path = vma_pr_or_file(vma)->f_path; - path_get(path); - rc = 0; - } -diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c -index 13452b32e2bd..38acccfef9d4 100644 ---- a/fs/proc/nommu.c -+++ b/fs/proc/nommu.c -@@ -40,7 +40,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) - file = region->vm_file; - - if (file) { -- struct inode *inode = file_inode(region->vm_file); -+ struct inode *inode; -+ -+ file = vmr_pr_or_file(region); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - } -diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c -index ee5a235b3056..80a46dcede7b 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) - const char *name = NULL; - - if (file) { -- struct inode *inode = file_inode(vma->vm_file); -+ struct inode *inode; -+ -+ file = vma_pr_or_file(vma); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; -@@ -1855,7 +1858,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; -- struct file *file = vma->vm_file; -+ struct file *file = vma_pr_or_file(vma); - struct mm_struct *mm = vma->vm_mm; - struct mempolicy *pol; - char buffer[64]; -diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c -index a6d21fc0033c..02c2de31196e 100644 ---- a/fs/proc/task_nommu.c -+++ b/fs/proc/task_nommu.c -@@ -155,7 +155,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) - file = vma->vm_file; - - if (file) { -- struct inode *inode = file_inode(vma->vm_file); -+ struct inode *inode; -+ -+ file = vma_pr_or_file(vma); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; -diff --git a/fs/splice.c b/fs/splice.c -index 866d5c2367b2..55b535626208 100644 ---- a/fs/splice.c -+++ b/fs/splice.c -@@ -756,8 +756,8 @@ static int warn_unsupported(struct file *file, const char *op) - /* - * Attempt to initiate a splice from pipe to file. - */ --static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -- loff_t *ppos, size_t len, unsigned int flags) -+long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) - { - if (unlikely(!out->f_op->splice_write)) - return warn_unsupported(out, "write"); -@@ -767,9 +767,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, - /* - * Attempt to initiate a splice from a file to a pipe. - */ --static long do_splice_to(struct file *in, loff_t *ppos, -- struct pipe_inode_info *pipe, size_t len, -- unsigned int flags) -+long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) - { - int ret; - -diff --git a/fs/sync.c b/fs/sync.c -index 1373a610dc78..b7b5a0a0df6f 100644 ---- a/fs/sync.c -+++ b/fs/sync.c -@@ -28,7 +28,7 @@ - * wait == 1 case since in that case write_inode() functions do - * sync_dirty_buffer() and thus effectively write one block at a time. - */ --static int __sync_filesystem(struct super_block *sb, int wait) -+int __sync_filesystem(struct super_block *sb, int wait) - { - if (wait) - sync_inodes_sb(sb); -diff --git a/include/linux/fs.h b/include/linux/fs.h -index 8667d0cdc71e..837dd6e727e4 100644 ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -1332,6 +1332,7 @@ extern void fasync_free(struct fasync_struct *); - /* can be called from interrupts */ - extern void kill_fasync(struct fasync_struct **, int, int); - -+extern int setfl(int fd, struct file *filp, unsigned long arg); - 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); -@@ -1843,6 +1844,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); -+ int (*setfl)(struct file *, unsigned long); - 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); -@@ -2328,6 +2330,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); -+extern int update_time(struct inode *, struct timespec64 *, int); - - /* /sys/fs */ - extern struct kobject *fs_kobj; -@@ -2564,6 +2567,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb) - } - - void emergency_thaw_all(void); -+extern int __sync_filesystem(struct super_block *, int); - extern int sync_filesystem(struct super_block *); - 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 f5594879175a..93bb86198167 100644 ---- a/include/linux/lockdep.h -+++ b/include/linux/lockdep.h -@@ -241,6 +241,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock, - return lock->key == key; - } - -+struct lock_class *lockdep_hlock_class(struct held_lock *hlock); -+ - /* - * Acquire a lock. - * -@@ -375,6 +377,7 @@ static inline void lockdep_unregister_key(struct lock_class_key *key) - - #define lockdep_depth(tsk) (0) - -+#define lockdep_is_held(lock) (1) - #define lockdep_is_held_type(l, r) (1) - - #define lockdep_assert_held(l) do { (void)(l); } while (0) -diff --git a/include/linux/mm.h b/include/linux/mm.h -index db6ae4d3fb4e..1a632192d9d9 100644 ---- a/include/linux/mm.h -+++ b/include/linux/mm.h -@@ -1712,6 +1712,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, - unmap_mapping_range(mapping, holebegin, holelen, 0); - } - -+extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int); -+extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[], -+ int); -+extern void vma_do_get_file(struct vm_area_struct *, const char[], int); -+extern void vma_do_fput(struct vm_area_struct *, const char[], int); -+ -+#define vma_file_update_time(vma) vma_do_file_update_time(vma, __func__, \ -+ __LINE__) -+#define vma_pr_or_file(vma) vma_do_pr_or_file(vma, __func__, \ -+ __LINE__) -+#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__) -+#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__) -+ -+#ifndef CONFIG_MMU -+extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int); -+extern void vmr_do_fput(struct vm_region *, const char[], int); -+ -+#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \ -+ __LINE__) -+#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__) -+#endif /* !CONFIG_MMU */ -+ - extern int access_process_vm(struct task_struct *tsk, unsigned long addr, - 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 5a9238f6caad..ad387c3cb14f 100644 ---- a/include/linux/mm_types.h -+++ b/include/linux/mm_types.h -@@ -280,6 +280,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 */ -+ struct file *vm_prfile; /* the virtual backing file or NULL */ - - int vm_usage; /* region usage count (access under nommu_region_sem) */ - bool vm_icache_flushed : 1; /* true if the icache has been flushed for -@@ -359,6 +360,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). */ -+ struct file *vm_prfile; /* shadow of vm_file */ - void * vm_private_data; /* was vm_pte (shared mem) */ - - #ifdef CONFIG_SWAP -diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h -index 8f882f5881e8..6b9808f09843 100644 ---- a/include/linux/mnt_namespace.h -+++ b/include/linux/mnt_namespace.h -@@ -7,12 +7,15 @@ struct mnt_namespace; - struct fs_struct; - struct user_namespace; - struct ns_common; -+struct vfsmount; - - extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, - struct user_namespace *, struct fs_struct *); - extern void put_mnt_ns(struct mnt_namespace *ns); - extern struct ns_common *from_mnt_ns(struct mnt_namespace *); - -+extern int is_current_mnt_ns(struct vfsmount *mnt); -+ - extern const struct file_operations proc_mounts_operations; - extern const struct file_operations proc_mountinfo_operations; - extern const struct file_operations proc_mountstats_operations; -diff --git a/include/linux/splice.h b/include/linux/splice.h -index a55179fd60fc..8e21c53cf883 100644 ---- a/include/linux/splice.h -+++ b/include/linux/splice.h -@@ -93,4 +93,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *); - - extern const struct pipe_buf_operations page_cache_pipe_buf_ops; - extern const struct pipe_buf_operations default_pipe_buf_ops; -+ -+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+extern long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); - #endif -diff --git a/include/uapi/linux/aufs_type.h b/include/uapi/linux/aufs_type.h -new file mode 100644 -index 000000000000..a1f4e7081d06 ---- /dev/null -+++ b/include/uapi/linux/aufs_type.h -@@ -0,0 +1,439 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -+/* -+ * Copyright (C) 2005-2020 Junjiro R. Okajima -+ */ -+ -+#ifndef __AUFS_TYPE_H__ -+#define __AUFS_TYPE_H__ -+ -+#define AUFS_NAME "aufs" -+ -+#ifdef __KERNEL__ -+/* -+ * define it before including all other headers. -+ * sched.h may use pr_* macros before defining "current", so define the -+ * no-current version first, and re-define later. -+ */ -+#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__ -+#include -+#undef pr_fmt -+#define pr_fmt(fmt) \ -+ AUFS_NAME " %s:%d:%.*s[%d]: " fmt, __func__, __LINE__, \ -+ (int)sizeof(current->comm), current->comm, current->pid -+#include -+#else -+#include -+#include -+#include -+#endif /* __KERNEL__ */ -+ -+#define AUFS_VERSION "5.x-rcN" -+ -+/* todo? move this to linux-2.6.19/include/magic.h */ -+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef __KERNEL__ -+#ifdef CONFIG_AUFS_BRANCH_MAX_127 -+typedef int8_t aufs_bindex_t; -+#define AUFS_BRANCH_MAX 127 -+#else -+typedef int16_t aufs_bindex_t; -+#ifdef CONFIG_AUFS_BRANCH_MAX_511 -+#define AUFS_BRANCH_MAX 511 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) -+#define AUFS_BRANCH_MAX 1023 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) -+#define AUFS_BRANCH_MAX 32767 -+#endif -+#endif -+ -+#ifndef AUFS_BRANCH_MAX -+#error unknown CONFIG_AUFS_BRANCH_MAX value -+#endif -+#endif /* __KERNEL__ */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AUFS_FSTYPE AUFS_NAME -+ -+#define AUFS_ROOT_INO 2 -+#define AUFS_FIRST_INO 11 -+ -+#define AUFS_WH_PFX ".wh." -+#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) -+#define AUFS_WH_TMP_LEN 4 -+/* a limit for rmdir/rename a dir and copyup */ -+#define AUFS_MAX_NAMELEN (NAME_MAX \ -+ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ -+ - 1 /* dot */\ -+ - AUFS_WH_TMP_LEN) /* hex */ -+#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" -+#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME -+#define AUFS_XINO_DEF_SEC 30 /* seconds */ -+#define AUFS_XINO_DEF_TRUNC 45 /* percentage */ -+#define AUFS_DIRWH_DEF 3 -+#define AUFS_RDCACHE_DEF 10 /* seconds */ -+#define AUFS_RDCACHE_MAX 3600 /* seconds */ -+#define AUFS_RDBLK_DEF 512 /* bytes */ -+#define AUFS_RDHASH_DEF 32 -+#define AUFS_WKQ_NAME AUFS_NAME "d" -+#define AUFS_MFS_DEF_SEC 30 /* seconds */ -+#define AUFS_MFS_MAX_SEC 3600 /* seconds */ -+#define AUFS_FHSM_CACHE_DEF_SEC 30 /* seconds */ -+#define AUFS_PLINK_WARN 50 /* number of plinks in a single bucket */ -+ -+/* pseudo-link maintenace under /proc */ -+#define AUFS_PLINK_MAINT_NAME "plink_maint" -+#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME -+#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME -+ -+/* dirren, renamed dir */ -+#define AUFS_DR_INFO_PFX AUFS_WH_PFX ".dr." -+#define AUFS_DR_BRHINO_NAME AUFS_WH_PFX "hino" -+/* whiteouted doubly */ -+#define AUFS_WH_DR_INFO_PFX AUFS_WH_PFX AUFS_DR_INFO_PFX -+#define AUFS_WH_DR_BRHINO AUFS_WH_PFX AUFS_DR_BRHINO_NAME -+ -+#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ -+#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME -+ -+#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME -+#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" -+#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" -+ -+/* doubly whiteouted */ -+#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME -+#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME -+#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME -+ -+/* branch permissions and attributes */ -+#define AUFS_BRPERM_RW "rw" -+#define AUFS_BRPERM_RO "ro" -+#define AUFS_BRPERM_RR "rr" -+#define AUFS_BRATTR_COO_REG "coo_reg" -+#define AUFS_BRATTR_COO_ALL "coo_all" -+#define AUFS_BRATTR_FHSM "fhsm" -+#define AUFS_BRATTR_UNPIN "unpin" -+#define AUFS_BRATTR_ICEX "icex" -+#define AUFS_BRATTR_ICEX_SEC "icexsec" -+#define AUFS_BRATTR_ICEX_SYS "icexsys" -+#define AUFS_BRATTR_ICEX_TR "icextr" -+#define AUFS_BRATTR_ICEX_USR "icexusr" -+#define AUFS_BRATTR_ICEX_OTH "icexoth" -+#define AUFS_BRRATTR_WH "wh" -+#define AUFS_BRWATTR_NLWH "nolwh" -+#define AUFS_BRWATTR_MOO "moo" -+ -+#define AuBrPerm_RW 1 /* writable, hardlinkable wh */ -+#define AuBrPerm_RO (1 << 1) /* readonly */ -+#define AuBrPerm_RR (1 << 2) /* natively readonly */ -+#define AuBrPerm_Mask (AuBrPerm_RW | AuBrPerm_RO | AuBrPerm_RR) -+ -+#define AuBrAttr_COO_REG (1 << 3) /* copy-up on open */ -+#define AuBrAttr_COO_ALL (1 << 4) -+#define AuBrAttr_COO_Mask (AuBrAttr_COO_REG | AuBrAttr_COO_ALL) -+ -+#define AuBrAttr_FHSM (1 << 5) /* file-based hsm */ -+#define AuBrAttr_UNPIN (1 << 6) /* rename-able top dir of -+ branch. meaningless since -+ linux-3.18-rc1 */ -+ -+/* ignore error in copying XATTR */ -+#define AuBrAttr_ICEX_SEC (1 << 7) -+#define AuBrAttr_ICEX_SYS (1 << 8) -+#define AuBrAttr_ICEX_TR (1 << 9) -+#define AuBrAttr_ICEX_USR (1 << 10) -+#define AuBrAttr_ICEX_OTH (1 << 11) -+#define AuBrAttr_ICEX (AuBrAttr_ICEX_SEC \ -+ | AuBrAttr_ICEX_SYS \ -+ | AuBrAttr_ICEX_TR \ -+ | AuBrAttr_ICEX_USR \ -+ | AuBrAttr_ICEX_OTH) -+ -+#define AuBrRAttr_WH (1 << 12) /* whiteout-able */ -+#define AuBrRAttr_Mask AuBrRAttr_WH -+ -+#define AuBrWAttr_NoLinkWH (1 << 13) /* un-hardlinkable whiteouts */ -+#define AuBrWAttr_MOO (1 << 14) /* move-up on open */ -+#define AuBrWAttr_Mask (AuBrWAttr_NoLinkWH | AuBrWAttr_MOO) -+ -+#define AuBrAttr_CMOO_Mask (AuBrAttr_COO_Mask | AuBrWAttr_MOO) -+ -+/* #warning test userspace */ -+#ifdef __KERNEL__ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuBrAttr_FHSM -+#define AuBrAttr_FHSM 0 -+#endif -+#ifndef CONFIG_AUFS_XATTR -+#undef AuBrAttr_ICEX -+#define AuBrAttr_ICEX 0 -+#undef AuBrAttr_ICEX_SEC -+#define AuBrAttr_ICEX_SEC 0 -+#undef AuBrAttr_ICEX_SYS -+#define AuBrAttr_ICEX_SYS 0 -+#undef AuBrAttr_ICEX_TR -+#define AuBrAttr_ICEX_TR 0 -+#undef AuBrAttr_ICEX_USR -+#define AuBrAttr_ICEX_USR 0 -+#undef AuBrAttr_ICEX_OTH -+#define AuBrAttr_ICEX_OTH 0 -+#endif -+#endif -+ -+/* the longest combination */ -+/* AUFS_BRATTR_ICEX and AUFS_BRATTR_ICEX_TR don't affect here */ -+#define AuBrPermStrSz sizeof(AUFS_BRPERM_RW \ -+ "+" AUFS_BRATTR_COO_REG \ -+ "+" AUFS_BRATTR_FHSM \ -+ "+" AUFS_BRATTR_UNPIN \ -+ "+" AUFS_BRATTR_ICEX_SEC \ -+ "+" AUFS_BRATTR_ICEX_SYS \ -+ "+" AUFS_BRATTR_ICEX_USR \ -+ "+" AUFS_BRATTR_ICEX_OTH \ -+ "+" AUFS_BRWATTR_NLWH) -+ -+typedef struct { -+ char a[AuBrPermStrSz]; -+} au_br_perm_str_t; -+ -+static inline int au_br_writable(int brperm) -+{ -+ return brperm & AuBrPerm_RW; -+} -+ -+static inline int au_br_whable(int brperm) -+{ -+ return brperm & (AuBrPerm_RW | AuBrRAttr_WH); -+} -+ -+static inline int au_br_wh_linkable(int brperm) -+{ -+ return !(brperm & AuBrWAttr_NoLinkWH); -+} -+ -+static inline int au_br_cmoo(int brperm) -+{ -+ return brperm & AuBrAttr_CMOO_Mask; -+} -+ -+static inline int au_br_fhsm(int brperm) -+{ -+ return brperm & AuBrAttr_FHSM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* ioctl */ -+enum { -+ /* readdir in userspace */ -+ AuCtl_RDU, -+ AuCtl_RDU_INO, -+ -+ AuCtl_WBR_FD, /* pathconf wrapper */ -+ AuCtl_IBUSY, /* busy inode */ -+ AuCtl_MVDOWN, /* move-down */ -+ AuCtl_BR, /* info about branches */ -+ AuCtl_FHSM_FD /* connection for fhsm */ -+}; -+ -+/* borrowed from linux/include/linux/kernel.h */ -+#ifndef ALIGN -+#ifdef _GNU_SOURCE -+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -+#else -+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) -+#endif -+#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) -+#endif -+ -+/* borrowed from linux/include/linux/compiler-gcc3.h */ -+#ifndef __aligned -+#define __aligned(x) __attribute__((aligned(x))) -+#endif -+ -+#ifdef __KERNEL__ -+#ifndef __packed -+#define __packed __attribute__((packed)) -+#endif -+#endif -+ -+struct au_rdu_cookie { -+ uint64_t h_pos; -+ int16_t bindex; -+ uint8_t flags; -+ uint8_t pad; -+ uint32_t generation; -+} __aligned(8); -+ -+struct au_rdu_ent { -+ uint64_t ino; -+ int16_t bindex; -+ uint8_t type; -+ uint8_t nlen; -+ uint8_t wh; -+ char name[]; -+} __aligned(8); -+ -+static inline int au_rdu_len(int nlen) -+{ -+ /* include the terminating NULL */ -+ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, -+ sizeof(uint64_t)); -+} -+ -+union au_rdu_ent_ul { -+ struct au_rdu_ent __user *e; -+ uint64_t ul; -+}; -+ -+enum { -+ AufsCtlRduV_SZ, -+ AufsCtlRduV_End -+}; -+ -+struct aufs_rdu { -+ /* input */ -+ union { -+ uint64_t sz; /* AuCtl_RDU */ -+ uint64_t nent; /* AuCtl_RDU_INO */ -+ }; -+ union au_rdu_ent_ul ent; -+ uint16_t verify[AufsCtlRduV_End]; -+ -+ /* input/output */ -+ uint32_t blk; -+ -+ /* output */ -+ union au_rdu_ent_ul tail; -+ /* number of entries which were added in a single call */ -+ uint64_t rent; -+ uint8_t full; -+ uint8_t shwh; -+ -+ struct au_rdu_cookie cookie; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dirren. the branch is identified by the filename who contains this */ -+struct au_drinfo { -+ uint64_t ino; -+ union { -+ uint8_t oldnamelen; -+ uint64_t _padding; -+ }; -+ uint8_t oldname[]; -+} __aligned(8); -+ -+struct au_drinfo_fdata { -+ uint32_t magic; -+ struct au_drinfo drinfo; -+} __aligned(8); -+ -+#define AUFS_DRINFO_MAGIC_V1 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x01) -+/* future */ -+#define AUFS_DRINFO_MAGIC_V2 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x02) -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_wbr_fd { -+ uint32_t oflags; -+ int16_t brid; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_ibusy { -+ uint64_t ino, h_ino; -+ int16_t bindex; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* error code for move-down */ -+/* the actual message strings are implemented in aufs-util.git */ -+enum { -+ EAU_MVDOWN_OPAQUE = 1, -+ EAU_MVDOWN_WHITEOUT, -+ EAU_MVDOWN_UPPER, -+ EAU_MVDOWN_BOTTOM, -+ EAU_MVDOWN_NOUPPER, -+ EAU_MVDOWN_NOLOWERBR, -+ EAU_Last -+}; -+ -+/* flags for move-down */ -+#define AUFS_MVDOWN_DMSG 1 -+#define AUFS_MVDOWN_OWLOWER (1 << 1) /* overwrite lower */ -+#define AUFS_MVDOWN_KUPPER (1 << 2) /* keep upper */ -+#define AUFS_MVDOWN_ROLOWER (1 << 3) /* do even if lower is RO */ -+#define AUFS_MVDOWN_ROLOWER_R (1 << 4) /* did on lower RO */ -+#define AUFS_MVDOWN_ROUPPER (1 << 5) /* do even if upper is RO */ -+#define AUFS_MVDOWN_ROUPPER_R (1 << 6) /* did on upper RO */ -+#define AUFS_MVDOWN_BRID_UPPER (1 << 7) /* upper brid */ -+#define AUFS_MVDOWN_BRID_LOWER (1 << 8) /* lower brid */ -+#define AUFS_MVDOWN_FHSM_LOWER (1 << 9) /* find fhsm attr for lower */ -+#define AUFS_MVDOWN_STFS (1 << 10) /* req. stfs */ -+#define AUFS_MVDOWN_STFS_FAILED (1 << 11) /* output: stfs is unusable */ -+#define AUFS_MVDOWN_BOTTOM (1 << 12) /* output: no more lowers */ -+ -+/* index for move-down */ -+enum { -+ AUFS_MVDOWN_UPPER, -+ AUFS_MVDOWN_LOWER, -+ AUFS_MVDOWN_NARRAY -+}; -+ -+/* -+ * additional info of move-down -+ * number of free blocks and inodes. -+ * subset of struct kstatfs, but smaller and always 64bit. -+ */ -+struct aufs_stfs { -+ uint64_t f_blocks; -+ uint64_t f_bavail; -+ uint64_t f_files; -+ uint64_t f_ffree; -+}; -+ -+struct aufs_stbr { -+ int16_t brid; /* optional input */ -+ int16_t bindex; /* output */ -+ struct aufs_stfs stfs; /* output when AUFS_MVDOWN_STFS set */ -+} __aligned(8); -+ -+struct aufs_mvdown { -+ uint32_t flags; /* input/output */ -+ struct aufs_stbr stbr[AUFS_MVDOWN_NARRAY]; /* input/output */ -+ int8_t au_errno; /* output */ -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+union aufs_brinfo { -+ /* PATH_MAX may differ between kernel-space and user-space */ -+ char _spacer[4096]; -+ struct { -+ int16_t id; -+ int perm; -+ char path[]; -+ }; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuCtlType 'A' -+#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) -+#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) -+#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \ -+ struct aufs_wbr_fd) -+#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) -+#define AUFS_CTL_MVDOWN _IOWR(AuCtlType, AuCtl_MVDOWN, \ -+ struct aufs_mvdown) -+#define AUFS_CTL_BRINFO _IOW(AuCtlType, AuCtl_BR, union aufs_brinfo) -+#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int) -+ -+#endif /* __AUFS_TYPE_H__ */ -diff --git a/kernel/fork.c b/kernel/fork.c -index 6d266388d380..dd7f13c3bee7 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -554,7 +554,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, - struct inode *inode = file_inode(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); -diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c -index c1418b47f625..7f006a47790c 100644 ---- a/kernel/locking/lockdep.c -+++ b/kernel/locking/lockdep.c -@@ -188,7 +188,7 @@ static - struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; - static DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS); - --static inline struct lock_class *hlock_class(struct held_lock *hlock) -+inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) - { - unsigned int class_idx = hlock->class_idx; - -@@ -209,6 +209,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock) - */ - return lock_classes + class_idx; - } -+#define hlock_class(hlock) lockdep_hlock_class(hlock) - - #ifdef CONFIG_LOCK_STAT - static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats); -diff --git a/mm/Makefile b/mm/Makefile -index d73aed0fc99c..93076a66ad6a 100644 ---- a/mm/Makefile -+++ b/mm/Makefile -@@ -52,7 +52,7 @@ obj-y := filemap.o mempool.o oom_kill.o fadvise.o \ - mm_init.o percpu.o slab_common.o \ - compaction.o vmacache.o \ - interval_tree.o list_lru.o workingset.o \ -- debug.o gup.o $(mmu-y) -+ prfile.o debug.o gup.o $(mmu-y) - - # 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 0b2067b3c328..3334207431c7 100644 ---- a/mm/filemap.c -+++ b/mm/filemap.c -@@ -2909,7 +2909,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf) - vm_fault_t ret = VM_FAULT_LOCKED; - - sb_start_pagefault(inode->i_sb); -- file_update_time(vmf->vma->vm_file); -+ vma_file_update_time(vmf->vma); - lock_page(page); - if (page->mapping != inode->i_mapping) { - unlock_page(page); -diff --git a/mm/mmap.c b/mm/mmap.c -index 5c8b4485860d..59f2f758d77e 100644 ---- a/mm/mmap.c -+++ b/mm/mmap.c -@@ -179,7 +179,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) -- fput(vma->vm_file); -+ vma_fput(vma); - mpol_put(vma_policy(vma)); - vm_area_free(vma); - return next; -@@ -951,7 +951,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); -- fput(file); -+ vma_fput(vma); - } - if (next->anon_vma) - anon_vma_merge(vma, next); -@@ -1897,8 +1897,8 @@ unsigned long mmap_region(struct file *file, unsigned long addr, - return addr; - - unmap_and_free_vma: -+ vma_fput(vma); - vma->vm_file = NULL; -- fput(file); - - /* Undo any partial mapping done by a device driver. */ - unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end); -@@ -2757,7 +2757,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, - goto out_free_mpol; - - if (new->vm_file) -- get_file(new->vm_file); -+ vma_get_file(new); - - if (new->vm_ops && new->vm_ops->open) - new->vm_ops->open(new); -@@ -2776,7 +2776,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) -- fput(new->vm_file); -+ vma_fput(new); - unlink_anon_vmas(new); - out_free_mpol: - mpol_put(vma_policy(new)); -@@ -2969,7 +2969,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; -- struct file *file; -+ struct file *file, *prfile; - - pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n", - current->comm, current->pid); -@@ -3044,10 +3044,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, - } - } - -- file = get_file(vma->vm_file); -+ vma_get_file(vma); -+ file = vma->vm_file; -+ prfile = vma->vm_prfile; - ret = do_mmap(vma->vm_file, start, size, - prot, flags, pgoff, &populate, NULL); -+ if (!IS_ERR_VALUE(ret) && file && prfile) { -+ struct vm_area_struct *new_vma; -+ -+ new_vma = find_vma(mm, ret); -+ if (!new_vma->vm_prfile) -+ new_vma->vm_prfile = prfile; -+ if (new_vma != vma) -+ get_file(prfile); -+ } -+ /* -+ * two fput()s instead of vma_fput(vma), -+ * coz vma may not be available anymore. -+ */ - fput(file); -+ if (prfile) -+ fput(prfile); - out: - mmap_write_unlock(mm); - if (populate) -@@ -3334,7 +3351,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) -- get_file(new_vma->vm_file); -+ vma_get_file(new_vma); - if (new_vma->vm_ops && new_vma->vm_ops->open) - 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 0faf39b32cdb..78ecad7204c8 100644 ---- a/mm/nommu.c -+++ b/mm/nommu.c -@@ -533,7 +533,7 @@ static void __put_nommu_region(struct vm_region *region) - up_write(&nommu_region_sem); - - if (region->vm_file) -- fput(region->vm_file); -+ vmr_fput(region); - - /* IO memory and memory shared directly out of the pagecache - * from ramfs/tmpfs mustn't be released here */ -@@ -665,7 +665,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); - if (vma->vm_file) -- fput(vma->vm_file); -+ vma_fput(vma); - put_nommu_region(vma->vm_region); - vm_area_free(vma); - } -@@ -1188,7 +1188,7 @@ unsigned long do_mmap(struct file *file, - goto error_just_free; - } - } -- fput(region->vm_file); -+ vmr_fput(region); - kmem_cache_free(vm_region_jar, region); - region = pregion; - result = start; -@@ -1265,10 +1265,10 @@ unsigned long do_mmap(struct file *file, - up_write(&nommu_region_sem); - error: - if (region->vm_file) -- fput(region->vm_file); -+ vmr_fput(region); - kmem_cache_free(vm_region_jar, region); - if (vma->vm_file) -- fput(vma->vm_file); -+ vma_fput(vma); - vm_area_free(vma); - return ret; - -diff --git a/mm/prfile.c b/mm/prfile.c -new file mode 100644 -index 000000000000..00d51187c325 ---- /dev/null -+++ b/mm/prfile.c -@@ -0,0 +1,86 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Mainly for aufs which mmap(2) different file and wants to print different -+ * path in /proc/PID/maps. -+ * Call these functions via macros defined in linux/mm.h. -+ * -+ * See Documentation/filesystems/aufs/design/06mmap.txt -+ * -+ * Copyright (c) 2014-2020 Junjro R. Okajima -+ * Copyright (c) 2014 Ian Campbell -+ */ -+ -+#include -+#include -+#include -+ -+/* #define PRFILE_TRACE */ -+static inline void prfile_trace(struct file *f, struct file *pr, -+ const char func[], int line, const char func2[]) -+{ -+#ifdef PRFILE_TRACE -+ if (pr) -+ pr_info("%s:%d: %s, %pD2\n", func, line, func2, f); -+#endif -+} -+ -+void vma_do_file_update_time(struct vm_area_struct *vma, const char func[], -+ int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ file_update_time(f); -+ if (f && pr) -+ file_update_time(pr); -+} -+ -+struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[], -+ int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ return (f && pr) ? pr : f; -+} -+ -+void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ get_file(f); -+ if (f && pr) -+ get_file(pr); -+} -+ -+void vma_do_fput(struct vm_area_struct *vma, const char func[], int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ fput(f); -+ if (f && pr) -+ fput(pr); -+} -+ -+#ifndef CONFIG_MMU -+struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[], -+ int line) -+{ -+ struct file *f = region->vm_file, *pr = region->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ return (f && pr) ? pr : f; -+} -+ -+void vmr_do_fput(struct vm_region *region, const char func[], int line) -+{ -+ struct file *f = region->vm_file, *pr = region->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ fput(f); -+ if (f && pr) -+ fput(pr); -+} -+#endif /* !CONFIG_MMU */ diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-symbol-exports.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-symbol-exports.patch deleted file mode 100644 index 32dab496c6..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-symbol-exports.patch +++ /dev/null @@ -1,260 +0,0 @@ - - fs/dcache.c | 2 ++ - fs/exec.c | 1 + - fs/fcntl.c | 1 + - fs/file_table.c | 2 ++ - fs/namespace.c | 3 +++ - fs/notify/group.c | 1 + - fs/open.c | 1 + - fs/read_write.c | 2 ++ - fs/splice.c | 2 ++ - fs/xattr.c | 1 + - kernel/locking/lockdep.c | 1 + - kernel/task_work.c | 1 + - security/security.c | 8 ++++++++ - 13 files changed, 26 insertions(+) - -diff -Nurp linux-5.15.37-aufs/fs/dcache.c linux-5.15.37-aufs-mod/fs/dcache.c ---- linux-5.15.37-aufs/fs/dcache.c 2022-04-08 20:22:30.617616719 +0300 -+++ linux-5.15.37-aufs-mod/fs/dcache.c 2022-04-08 20:24:23.624148779 +0300 -@@ -1450,6 +1450,7 @@ rename_retry: - seq = 1; - goto again; - } -+EXPORT_SYMBOL_GPL(d_walk); - - struct check_mount { - struct vfsmount *mnt; -@@ -2995,6 +2996,7 @@ void d_exchange(struct dentry *dentry1, - - write_sequnlock(&rename_lock); - } -+EXPORT_SYMBOL_GPL(d_exchange); - - /** - * d_ancestor - search for an ancestor -diff -Nurp linux-5.15.37-aufs/fs/exec.c linux-5.15.37-aufs-mod/fs/exec.c ---- linux-5.15.37-aufs/fs/exec.c 2022-04-08 20:07:30.690498863 +0300 -+++ linux-5.15.37-aufs-mod/fs/exec.c 2022-04-08 20:24:23.624148779 +0300 -@@ -112,6 +112,7 @@ bool path_noexec(const struct path *path - return (path->mnt->mnt_flags & MNT_NOEXEC) || - (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC); - } -+EXPORT_SYMBOL_GPL(path_noexec); - - #ifdef CONFIG_USELIB - /* -diff -Nurp linux-5.15.37-aufs/fs/fcntl.c linux-5.15.37-aufs-mod/fs/fcntl.c ---- linux-5.15.37-aufs/fs/fcntl.c 2022-04-08 20:22:30.617616719 +0300 -+++ linux-5.15.37-aufs-mod/fs/fcntl.c 2022-04-08 20:24:23.624148779 +0300 -@@ -86,6 +86,7 @@ int setfl(int fd, struct file *filp, uns - out: - return error; - } -+EXPORT_SYMBOL_GPL(setfl); - - static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, - int force) -diff -Nurp linux-5.15.37-aufs/fs/file_table.c linux-5.15.37-aufs-mod/fs/file_table.c ---- linux-5.15.37-aufs/fs/file_table.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/fs/file_table.c 2022-04-08 20:24:23.624148779 +0300 -@@ -198,6 +198,7 @@ over: - } - return ERR_PTR(-ENFILE); - } -+EXPORT_SYMBOL_GPL(alloc_empty_file); - - /* - * Variant of alloc_empty_file() that doesn't check and modify nr_files. -@@ -412,6 +413,7 @@ void __fput_sync(struct file *file) - } - - EXPORT_SYMBOL(fput); -+EXPORT_SYMBOL_GPL(__fput_sync); - - void __init files_init(void) - { -diff -Nurp linux-5.15.37-aufs/fs/namespace.c linux-5.15.37-aufs-mod/fs/namespace.c ---- linux-5.15.37-aufs/fs/namespace.c 2022-04-08 20:22:30.617616719 +0300 -+++ linux-5.15.37-aufs-mod/fs/namespace.c 2022-04-08 20:24:23.624148779 +0300 -@@ -440,6 +440,7 @@ void __mnt_drop_write(struct vfsmount *m - mnt_dec_writers(real_mount(mnt)); - preempt_enable(); - } -+EXPORT_SYMBOL_GPL(__mnt_drop_write); - - /** - * mnt_drop_write - give up write access to a mount -@@ -844,6 +845,7 @@ int is_current_mnt_ns(struct vfsmount *m - { - return check_mnt(real_mount(mnt)); - } -+EXPORT_SYMBOL_GPL(is_current_mnt_ns); - - /* - * vfsmount lock must be held for write -@@ -2047,6 +2049,7 @@ int iterate_mounts(int (*f)(struct vfsmo - } - return 0; - } -+EXPORT_SYMBOL_GPL(iterate_mounts); - - static void lock_mnt_tree(struct mount *mnt) - { -diff -Nurp linux-5.15.37-aufs/fs/notify/group.c linux-5.15.37-aufs-mod/fs/notify/group.c ---- linux-5.15.37-aufs/fs/notify/group.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/fs/notify/group.c 2022-04-08 20:24:23.624148779 +0300 -@@ -100,6 +100,7 @@ void fsnotify_get_group(struct fsnotify_ - { - refcount_inc(&group->refcnt); - } -+EXPORT_SYMBOL_GPL(fsnotify_get_group); - - /* - * Drop a reference to a group. Free it if it's through. -diff -Nurp linux-5.15.37-aufs/fs/open.c linux-5.15.37-aufs-mod/fs/open.c ---- linux-5.15.37-aufs/fs/open.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/fs/open.c 2022-04-08 20:24:23.625148828 +0300 -@@ -66,6 +66,7 @@ int do_truncate(struct user_namespace *m - inode_unlock(dentry->d_inode); - return ret; - } -+EXPORT_SYMBOL_GPL(do_truncate); - - long vfs_truncate(const struct path *path, loff_t length) - { -diff -Nurp linux-5.15.37-aufs/fs/read_write.c linux-5.15.37-aufs-mod/fs/read_write.c ---- linux-5.15.37-aufs/fs/read_write.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/fs/read_write.c 2022-04-08 20:24:23.625148828 +0300 -@@ -488,6 +488,7 @@ ssize_t vfs_read(struct file *file, char - inc_syscr(current); - return ret; - } -+EXPORT_SYMBOL_GPL(vfs_read); - - static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) - { -@@ -598,6 +599,7 @@ ssize_t vfs_write(struct file *file, con - file_end_write(file); - return ret; - } -+EXPORT_SYMBOL_GPL(vfs_write); - - /* file_ppos returns &file->f_pos or NULL if file is stream */ - static inline loff_t *file_ppos(struct file *file) -diff -Nurp linux-5.15.37-aufs/fs/splice.c linux-5.15.37-aufs-mod/fs/splice.c ---- linux-5.15.37-aufs/fs/splice.c 2022-04-08 20:22:30.617616719 +0300 -+++ linux-5.15.37-aufs-mod/fs/splice.c 2022-04-08 20:24:23.625148828 +0300 -@@ -766,6 +766,7 @@ long do_splice_from(struct pipe_inode_in - return warn_unsupported(out, "write"); - return out->f_op->splice_write(pipe, out, ppos, len, flags); - } -+EXPORT_SYMBOL_GPL(do_splice_from); - - /* - * Attempt to initiate a splice from a file to a pipe. -@@ -795,6 +796,7 @@ long do_splice_to(struct file *in, loff_ - return warn_unsupported(in, "read"); - return in->f_op->splice_read(in, ppos, pipe, len, flags); - } -+EXPORT_SYMBOL_GPL(do_splice_to); - - /** - * splice_direct_to_actor - splices data directly between two non-pipes -diff -Nurp linux-5.15.37-aufs/fs/xattr.c linux-5.15.37-aufs-mod/fs/xattr.c ---- linux-5.15.37-aufs/fs/xattr.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/fs/xattr.c 2022-04-08 20:24:23.625148828 +0300 -@@ -384,6 +384,7 @@ vfs_getxattr_alloc(struct user_namespace - *xattr_value = value; - return error; - } -+EXPORT_SYMBOL_GPL(vfs_getxattr_alloc); - - ssize_t - __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name, -diff -Nurp linux-5.15.37-aufs/kernel/locking/lockdep.c linux-5.15.37-aufs-mod/kernel/locking/lockdep.c ---- linux-5.15.37-aufs/kernel/locking/lockdep.c 2022-04-08 20:22:30.619616817 +0300 -+++ linux-5.15.37-aufs-mod/kernel/locking/lockdep.c 2022-04-08 20:24:23.625148828 +0300 -@@ -208,6 +208,7 @@ inline struct lock_class *lockdep_hlock_ - */ - return lock_classes + class_idx; - } -+EXPORT_SYMBOL_GPL(lockdep_hlock_class); - #define hlock_class(hlock) lockdep_hlock_class(hlock) - - #ifdef CONFIG_LOCK_STAT -diff -Nurp linux-5.15.37-aufs/kernel/task_work.c linux-5.15.37-aufs-mod/kernel/task_work.c ---- linux-5.15.37-aufs/kernel/task_work.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs-mod/kernel/task_work.c 2022-04-08 20:24:23.625148828 +0300 -@@ -167,3 +167,4 @@ void task_work_run(void) - } while (work); - } - } -+EXPORT_SYMBOL_GPL(task_work_run); -diff -Nurp linux-5.15.37-aufs/security/security.c linux-5.15.37-aufs-mod/security/security.c ---- linux-5.15.37-aufs/security/security.c 2022-04-08 20:07:30.718500239 +0300 -+++ linux-5.15.37-aufs-mod/security/security.c 2022-04-08 20:24:23.626148877 +0300 -@@ -1164,6 +1164,7 @@ int security_path_rmdir(const struct pat - return 0; - return call_int_hook(path_rmdir, 0, dir, dentry); - } -+EXPORT_SYMBOL_GPL(security_path_rmdir); - - int security_path_unlink(const struct path *dir, struct dentry *dentry) - { -@@ -1180,6 +1181,7 @@ int security_path_symlink(const struct p - return 0; - return call_int_hook(path_symlink, 0, dir, dentry, old_name); - } -+EXPORT_SYMBOL_GPL(security_path_symlink); - - int security_path_link(struct dentry *old_dentry, const struct path *new_dir, - struct dentry *new_dentry) -@@ -1188,6 +1190,7 @@ int security_path_link(struct dentry *ol - return 0; - return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry); - } -+EXPORT_SYMBOL_GPL(security_path_link); - - int security_path_rename(const struct path *old_dir, struct dentry *old_dentry, - const struct path *new_dir, struct dentry *new_dentry, -@@ -1215,6 +1218,7 @@ int security_path_truncate(const struct - return 0; - return call_int_hook(path_truncate, 0, path); - } -+EXPORT_SYMBOL_GPL(security_path_truncate); - - int security_path_chmod(const struct path *path, umode_t mode) - { -@@ -1222,6 +1226,7 @@ int security_path_chmod(const struct pat - return 0; - return call_int_hook(path_chmod, 0, path, mode); - } -+EXPORT_SYMBOL_GPL(security_path_chmod); - - int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) - { -@@ -1229,6 +1234,7 @@ int security_path_chown(const struct pat - return 0; - return call_int_hook(path_chown, 0, path, uid, gid); - } -+EXPORT_SYMBOL_GPL(security_path_chown); - - int security_path_chroot(const struct path *path) - { -@@ -1329,6 +1335,7 @@ int security_inode_permission(struct ino - return 0; - return call_int_hook(inode_permission, 0, inode, mask); - } -+EXPORT_SYMBOL_GPL(security_inode_permission); - - int security_inode_setattr(struct dentry *dentry, struct iattr *attr) - { -@@ -1526,6 +1533,7 @@ int security_file_permission(struct file - - return fsnotify_perm(file, mask); - } -+EXPORT_SYMBOL_GPL(security_file_permission); - - int security_file_alloc(struct file *file) - { diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-tristate.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-tristate.patch deleted file mode 100644 index f95f4ab698..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15-tristate.patch +++ /dev/null @@ -1,24 +0,0 @@ - -Allow aufs to be built as module. - -Signed-off-by: Thomas Backlund - ---- a/fs/aufs/Kconfig -+++ b/fs/aufs/Kconfig -@@ -1,6 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0 - config AUFS_FS -- bool "Aufs (Advanced multi layered unification filesystem) support" -+ tristate "Aufs (Advanced multi layered unification filesystem) support" - help - Aufs is a stackable unification filesystem such as Unionfs, - which unifies several directories and provides a merged single -@@ -72,7 +72,7 @@ endchoice - - config AUFS_EXPORT - bool "NFS-exportable aufs" -- depends on EXPORTFS = y -+ depends on EXPORTFS - help - If you want to export your mounted aufs via NFS, then enable this - option. There are several requirements for this configuration. diff --git a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15.patch b/kernel/tools/perf/files/patches/mageia/fs-aufs5.15.patch deleted file mode 100644 index 3484d64f6f..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-aufs5.15.patch +++ /dev/null @@ -1,38061 +0,0 @@ - - Documentation/ABI/testing/debugfs-aufs | 55 +++++ - Documentation/ABI/testing/sysfs-aufs | 31 ++ - Documentation/filesystems/aufs/README | 396 ++++++++++++++++++++++++++++++++++++ - Documentation/filesystems/aufs/design/01intro.txt | 158 ++++++++++++++ - Documentation/filesystems/aufs/design/02struct.txt | 245 ++++++++++++++++++++++ - Documentation/filesystems/aufs/design/03atomic_open.txt | 72 ++++++ - Documentation/filesystems/aufs/design/03lookup.txt | 100 +++++++++ - Documentation/filesystems/aufs/design/04branch.txt | 61 +++++ - Documentation/filesystems/aufs/design/05wbr_policy.txt | 51 ++++ - Documentation/filesystems/aufs/design/06dirren.dot | 31 ++ - Documentation/filesystems/aufs/design/06dirren.txt | 89 ++++++++ - Documentation/filesystems/aufs/design/06fhsm.txt | 105 +++++++++ - Documentation/filesystems/aufs/design/06mmap.txt | 59 +++++ - Documentation/filesystems/aufs/design/06xattr.txt | 81 +++++++ - Documentation/filesystems/aufs/design/07export.txt | 45 ++++ - Documentation/filesystems/aufs/design/08shwh.txt | 39 +++ - Documentation/filesystems/aufs/design/10dynop.txt | 34 +++ - MAINTAINERS | 13 + - drivers/block/loop.c | 18 + - fs/Kconfig | 1 - fs/Makefile | 1 - fs/aufs/Kconfig | 199 ++++++++++++++++++ - fs/aufs/Makefile | 39 +++ - fs/aufs/aufs.h | 49 ++++ - fs/aufs/branch.c | 1414 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/branch.h | 362 ++++++++++++++++++++++++++++++++ - fs/aufs/cpup.c | 1446 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/cpup.h | 87 +++++++ - fs/aufs/dbgaufs.c | 513 ++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/dbgaufs.h | 40 +++ - fs/aufs/dcsub.c | 212 +++++++++++++++++++ - fs/aufs/dcsub.h | 124 +++++++++++ - fs/aufs/debug.c | 431 +++++++++++++++++++++++++++++++++++++++ - fs/aufs/debug.h | 213 +++++++++++++++++++ - fs/aufs/dentry.c | 1155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/dentry.h | 256 +++++++++++++++++++++++ - fs/aufs/dinfo.c | 541 +++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/dir.c | 752 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/dir.h | 121 +++++++++++ - fs/aufs/dirren.c | 1302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/dirren.h | 127 +++++++++++ - fs/aufs/dynop.c | 355 ++++++++++++++++++++++++++++++++ - fs/aufs/dynop.h | 64 +++++ - fs/aufs/export.c | 817 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/f_op.c | 758 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/fhsm.c | 413 +++++++++++++++++++++++++++++++++++++ - fs/aufs/file.c | 850 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/file.h | 329 +++++++++++++++++++++++++++++ - fs/aufs/finfo.c | 136 ++++++++++++ - fs/aufs/fsctx.c | 1229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/fstype.h | 388 +++++++++++++++++++++++++++++++++++ - fs/aufs/hbl.h | 52 ++++ - fs/aufs/hfsnotify.c | 276 +++++++++++++++++++++++++ - fs/aufs/hfsplus.c | 47 ++++ - fs/aufs/hnotify.c | 702 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/i_op.c | 1499 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/i_op_add.c | 928 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/i_op_del.c | 509 ++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/i_op_ren.c | 1244 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/iinfo.c | 273 ++++++++++++++++++++++++ - fs/aufs/inode.c | 518 +++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/inode.h | 692 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/ioctl.c | 207 ++++++++++++++++++ - fs/aufs/lcnt.h | 173 +++++++++++++++ - fs/aufs/loop.c | 135 ++++++++++++ - fs/aufs/loop.h | 42 +++ - fs/aufs/magic.mk | 31 ++ - fs/aufs/module.c | 259 +++++++++++++++++++++++ - fs/aufs/module.h | 153 +++++++++++++ - fs/aufs/mvdown.c | 693 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/opts.c | 1019 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/opts.h | 250 ++++++++++++++++++++++ - fs/aufs/plink.c | 503 +++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/poll.c | 38 +++ - fs/aufs/posix_acl.c | 98 ++++++++ - fs/aufs/procfs.c | 157 ++++++++++++++ - fs/aufs/rdu.c | 371 +++++++++++++++++++++++++++++++++ - fs/aufs/rwsem.h | 72 ++++++ - fs/aufs/sbinfo.c | 303 +++++++++++++++++++++++++++ - fs/aufs/super.c | 858 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/super.h | 579 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/sysaufs.c | 80 +++++++ - fs/aufs/sysaufs.h | 89 ++++++++ - fs/aufs/sysfs.c | 338 ++++++++++++++++++++++++++++++ - fs/aufs/sysrq.c | 136 ++++++++++++ - fs/aufs/vdir.c | 883 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/vfsub.c | 905 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/vfsub.h | 345 +++++++++++++++++++++++++++++++ - fs/aufs/wbr_policy.c | 817 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/whout.c | 1059 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/aufs/whout.h | 74 ++++++ - fs/aufs/wkq.c | 359 ++++++++++++++++++++++++++++++++ - fs/aufs/wkq.h | 76 ++++++ - fs/aufs/xattr.c | 355 ++++++++++++++++++++++++++++++++ - fs/aufs/xino.c | 1913 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - fs/dcache.c | 2 - fs/fcntl.c | 4 - fs/namespace.c | 6 - fs/proc/base.c | 2 - fs/proc/nommu.c | 5 - fs/proc/task_mmu.c | 7 - fs/proc/task_nommu.c | 5 - fs/splice.c | 10 - include/linux/fs.h | 4 - include/linux/lockdep.h | 2 - include/linux/mm.h | 37 +++ - include/linux/mm_types.h | 6 - include/linux/mnt_namespace.h | 3 - include/linux/splice.h | 6 - include/uapi/linux/aufs_type.h | 439 +++++++++++++++++++++++++++++++++++++++ - kernel/fork.c | 2 - kernel/locking/lockdep.c | 3 - mm/Makefile | 1 - mm/filemap.c | 2 - mm/mmap.c | 39 +++ - mm/nommu.c | 10 - mm/prfile.c | 86 +++++++ - 117 files changed, 37172 insertions(+), 26 deletions(-) - -diff -Nurp linux-5.15.37/Documentation/ABI/testing/debugfs-aufs linux-5.15.37-aufs/Documentation/ABI/testing/debugfs-aufs ---- linux-5.15.37/Documentation/ABI/testing/debugfs-aufs 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/ABI/testing/debugfs-aufs 2022-04-08 20:22:30.608616279 +0300 -@@ -0,0 +1,55 @@ -+What: /debug/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /debug/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /debug/aufs/si_/plink -+Date: Apr 2013 -+Contact: J. R. Okajima -+Description: -+ It has three lines and shows the information about the -+ pseudo-link. The first line is a single number -+ representing a number of buckets. The second line is a -+ number of pseudo-links per buckets (separated by a -+ blank). The last line is a single number representing a -+ total number of psedo-links. -+ When the aufs mount option 'noplink' is specified, it -+ will show "1\n0\n0\n". -+ -+What: /debug/aufs/si_/xib -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xib (External Inode Number -+ Bitmap), its block size and file size. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -+ -+What: /debug/aufs/si_/xi -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xino (External Inode Number -+ Translation Table), its link count, block size and file -+ size. -+ Due to the file size limit, there may exist multiple -+ xino files per branch. In this case, "-N" is added to -+ the filename and it corresponds to the index of the -+ internal xino array. "-0" is omitted. -+ When the aufs mount option 'noxino' is specified, Those -+ entries won't exist. About XINO files, see the aufs -+ manual. -+ -+What: /debug/aufs/si_/xigen -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xigen (External Inode -+ Generation Table), its block size and file size. -+ If CONFIG_AUFS_EXPORT is disabled, this entry will not -+ be created. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -diff -Nurp linux-5.15.37/Documentation/ABI/testing/sysfs-aufs linux-5.15.37-aufs/Documentation/ABI/testing/sysfs-aufs ---- linux-5.15.37/Documentation/ABI/testing/sysfs-aufs 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/ABI/testing/sysfs-aufs 2022-04-08 20:22:30.608616279 +0300 -@@ -0,0 +1,31 @@ -+What: /sys/fs/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /sys/fs/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /sys/fs/aufs/si_/br -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of a member directory (which -+ is called branch) in aufs, and its permission. -+ -+What: /sys/fs/aufs/si_/brid -+Date: July 2013 -+Contact: J. R. Okajima -+Description: -+ It shows the id of a member directory (which is called -+ branch) in aufs. -+ -+What: /sys/fs/aufs/si_/xi_path -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of XINO (External Inode Number -+ Bitmap, Translation Table and Generation Table) file -+ even if it is the default path. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see the aufs manual. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/01intro.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/01intro.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/01intro.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/01intro.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,158 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Introduction -+---------------------------------------- -+ -+aufs [ei ju: ef es] | /ey-yoo-ef-es/ | [a u f s] -+1. abbrev. for "advanced multi-layered unification filesystem". -+2. abbrev. for "another unionfs". -+3. abbrev. for "auf das" in German which means "on the" in English. -+ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E). -+ But "Filesystem aufs Filesystem" is hard to understand. -+4. abbrev. for "African Urban Fashion Show". -+ -+AUFS is a filesystem with features: -+- multi layered stackable unification filesystem, the member directory -+ is called as a branch. -+- branch permission and attribute, 'readonly', 'real-readonly', -+ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their -+ combination. -+- internal "file copy-on-write". -+- logical deletion, whiteout. -+- dynamic branch manipulation, adding, deleting and changing permission. -+- allow bypassing aufs, user's direct branch access. -+- external inode number translation table and bitmap which maintains the -+ persistent aufs inode number. -+- seekable directory, including NFS readdir. -+- file mapping, mmap and sharing pages. -+- pseudo-link, hardlink over branches. -+- loopback mounted filesystem as a branch. -+- several policies to select one among multiple writable branches. -+- revert a single systemcall when an error occurs in aufs. -+- and more... -+ -+ -+Multi Layered Stackable Unification Filesystem -+---------------------------------------------------------------------- -+Most people already knows what it is. -+It is a filesystem which unifies several directories and provides a -+merged single directory. When users access a file, the access will be -+passed/re-directed/converted (sorry, I am not sure which English word is -+correct) to the real file on the member filesystem. The member -+filesystem is called 'lower filesystem' or 'branch' and has a mode -+'readonly' and 'readwrite.' And the deletion for a file on the lower -+readonly branch is handled by creating 'whiteout' on the upper writable -+branch. -+ -+On LKML, there have been discussions about UnionMount (Jan Blunck, -+Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took -+different approaches to implement the merged-view. -+The former tries putting it into VFS, and the latter implements as a -+separate filesystem. -+(If I misunderstand about these implementations, please let me know and -+I shall correct it. Because it is a long time ago when I read their -+source files last time). -+ -+UnionMount's approach will be able to small, but may be hard to share -+branches between several UnionMount since the whiteout in it is -+implemented in the inode on branch filesystem and always -+shared. According to Bharata's post, readdir does not seems to be -+finished yet. -+There are several missing features known in this implementations such as -+- for users, the inode number may change silently. eg. copy-up. -+- link(2) may break by copy-up. -+- read(2) may get an obsoleted filedata (fstat(2) too). -+- fcntl(F_SETLK) may be broken by copy-up. -+- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after -+ open(O_RDWR). -+ -+In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was -+merged into mainline. This is another implementation of UnionMount as a -+separated filesystem. All the limitations and known problems which -+UnionMount are equally inherited to "overlay" filesystem. -+ -+Unionfs has a longer history. When I started implementing a stackable -+filesystem (Aug 2005), it already existed. It has virtual super_block, -+inode, dentry and file objects and they have an array pointing lower -+same kind objects. After contributing many patches for Unionfs, I -+re-started my project AUFS (Jun 2006). -+ -+In AUFS, the structure of filesystem resembles to Unionfs, but I -+implemented my own ideas, approaches and enhancements and it became -+totally different one. -+ -+Comparing DM snapshot and fs based implementation -+- the number of bytes to be copied between devices is much smaller. -+- the type of filesystem must be one and only. -+- the fs must be writable, no readonly fs, even for the lower original -+ device. so the compression fs will not be usable. but if we use -+ loopback mount, we may address this issue. -+ for instance, -+ mount /cdrom/squashfs.img /sq -+ losetup /sq/ext2.img -+ losetup /somewhere/cow -+ dmsetup "snapshot /dev/loop0 /dev/loop1 ..." -+- it will be difficult (or needs more operations) to extract the -+ difference between the original device and COW. -+- DM snapshot-merge may help a lot when users try merging. in the -+ fs-layer union, users will use rsync(1). -+ -+You may want to read my old paper "Filesystems in LiveCD" -+(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf). -+ -+ -+Several characters/aspects/persona of aufs -+---------------------------------------------------------------------- -+ -+Aufs has several characters, aspects or persona. -+1. a filesystem, callee of VFS helper -+2. sub-VFS, caller of VFS helper for branches -+3. a virtual filesystem which maintains persistent inode number -+4. reader/writer of files on branches such like an application -+ -+1. Callee of VFS Helper -+As an ordinary linux filesystem, aufs is a callee of VFS. For instance, -+unlink(2) from an application reaches sys_unlink() kernel function and -+then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it -+calls filesystem specific unlink operation. Actually aufs implements the -+unlink operation but it behaves like a redirector. -+ -+2. Caller of VFS Helper for Branches -+aufs_unlink() passes the unlink request to the branch filesystem as if -+it were called from VFS. So the called unlink operation of the branch -+filesystem acts as usual. As a caller of VFS helper, aufs should handle -+every necessary pre/post operation for the branch filesystem. -+- acquire the lock for the parent dir on a branch -+- lookup in a branch -+- revalidate dentry on a branch -+- mnt_want_write() for a branch -+- vfs_unlink() for a branch -+- mnt_drop_write() for a branch -+- release the lock on a branch -+ -+3. Persistent Inode Number -+One of the most important issue for a filesystem is to maintain inode -+numbers. This is particularly important to support exporting a -+filesystem via NFS. Aufs is a virtual filesystem which doesn't have a -+backend block device for its own. But some storage is necessary to -+keep and maintain the inode numbers. It may be a large space and may not -+suit to keep in memory. Aufs rents some space from its first writable -+branch filesystem (by default) and creates file(s) on it. These files -+are created by aufs internally and removed soon (currently) keeping -+opened. -+Note: Because these files are removed, they are totally gone after -+ unmounting aufs. It means the inode numbers are not persistent -+ across unmount or reboot. I have a plan to make them really -+ persistent which will be important for aufs on NFS server. -+ -+4. Read/Write Files Internally (copy-on-write) -+Because a branch can be readonly, when you write a file on it, aufs will -+"copy-up" it to the upper writable branch internally. And then write the -+originally requested thing to the file. Generally kernel doesn't -+open/read/write file actively. In aufs, even a single write may cause a -+internal "file copy". This behaviour is very similar to cp(1) command. -+ -+Some people may think it is better to pass such work to user space -+helper, instead of doing in kernel space. Actually I am still thinking -+about it. But currently I have implemented it in kernel space. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/02struct.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/02struct.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/02struct.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/02struct.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,245 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Basic Aufs Internal Structure -+ -+Superblock/Inode/Dentry/File Objects -+---------------------------------------------------------------------- -+As like an ordinary filesystem, aufs has its own -+superblock/inode/dentry/file objects. All these objects have a -+dynamically allocated array and store the same kind of pointers to the -+lower filesystem, branch. -+For example, when you build a union with one readwrite branch and one -+readonly, mounted /au, /rw and /ro respectively. -+- /au = /rw + /ro -+- /ro/fileA exists but /rw/fileA -+ -+Aufs lookup operation finds /ro/fileA and gets dentry for that. These -+pointers are stored in a aufs dentry. The array in aufs dentry will be, -+- [0] = NULL (because /rw/fileA doesn't exist) -+- [1] = /ro/fileA -+ -+This style of an array is essentially same to the aufs -+superblock/inode/dentry/file objects. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+branches dynamically, these objects has its own generation. When -+branches are changed, the generation in aufs superblock is -+incremented. And a generation in other object are compared when it is -+accessed. When a generation in other objects are obsoleted, aufs -+refreshes the internal array. -+ -+ -+Superblock -+---------------------------------------------------------------------- -+Additionally aufs superblock has some data for policies to select one -+among multiple writable branches, XIB files, pseudo-links and kobject. -+See below in detail. -+About the policies which supports copy-down a directory, see -+wbr_policy.txt too. -+ -+ -+Branch and XINO(External Inode Number Translation Table) -+---------------------------------------------------------------------- -+Every branch has its own xino (external inode number translation table) -+file. The xino file is created and unlinked by aufs internally. When two -+members of a union exist on the same filesystem, they share the single -+xino file. -+The struct of a xino file is simple, just a sequence of aufs inode -+numbers which is indexed by the lower inode number. -+In the above sample, assume the inode number of /ro/fileA is i111 and -+aufs assigns the inode number i999 for fileA. Then aufs writes 999 as -+4(8) bytes at 111 * 4(8) bytes offset in the xino file. -+ -+When the inode numbers are not contiguous, the xino file will be sparse -+which has a hole in it and doesn't consume as much disk space as it -+might appear. If your branch filesystem consumes disk space for such -+holes, then you should specify 'xino=' option at mounting aufs. -+ -+Aufs has a mount option to free the disk blocks for such holes in XINO -+files on tmpfs or ramdisk. But it is not so effective actually. If you -+meet a problem of disk shortage due to XINO files, then you should try -+"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git. -+The patch localizes the assignment inumbers per tmpfs-mount and avoid -+the holes in XINO files. -+ -+Also a writable branch has three kinds of "whiteout bases". All these -+are existed when the branch is joined to aufs, and their names are -+whiteout-ed doubly, so that users will never see their names in aufs -+hierarchy. -+1. a regular file which will be hardlinked to all whiteouts. -+2. a directory to store a pseudo-link. -+3. a directory to store an "orphan"-ed file temporary. -+ -+1. Whiteout Base -+ When you remove a file on a readonly branch, aufs handles it as a -+ logical deletion and creates a whiteout on the upper writable branch -+ as a hardlink of this file in order not to consume inode on the -+ writable branch. -+2. Pseudo-link Dir -+ See below, Pseudo-link. -+3. Step-Parent Dir -+ When "fileC" exists on the lower readonly branch only and it is -+ opened and removed with its parent dir, and then user writes -+ something into it, then aufs copies-up fileC to this -+ directory. Because there is no other dir to store fileC. After -+ creating a file under this dir, the file is unlinked. -+ -+Because aufs supports manipulating branches, ie. add/delete/change -+dynamically, a branch has its own id. When the branch order changes, -+aufs finds the new index by searching the branch id. -+ -+ -+Pseudo-link -+---------------------------------------------------------------------- -+Assume "fileA" exists on the lower readonly branch only and it is -+hardlinked to "fileB" on the branch. When you write something to fileA, -+aufs copies-up it to the upper writable branch. Additionally aufs -+creates a hardlink under the Pseudo-link Directory of the writable -+branch. The inode of a pseudo-link is kept in aufs super_block as a -+simple list. If fileB is read after unlinking fileA, aufs returns -+filedata from the pseudo-link instead of the lower readonly -+branch. Because the pseudo-link is based upon the inode, to keep the -+inode number by xino (see above) is essentially necessary. -+ -+All the hardlinks under the Pseudo-link Directory of the writable branch -+should be restored in a proper location later. Aufs provides a utility -+to do this. The userspace helpers executed at remounting and unmounting -+aufs by default. -+During this utility is running, it puts aufs into the pseudo-link -+maintenance mode. In this mode, only the process which began the -+maintenance mode (and its child processes) is allowed to operate in -+aufs. Some other processes which are not related to the pseudo-link will -+be allowed to run too, but the rest have to return an error or wait -+until the maintenance mode ends. If a process already acquires an inode -+mutex (in VFS), it has to return an error. -+ -+ -+XIB(external inode number bitmap) -+---------------------------------------------------------------------- -+Addition to the xino file per a branch, aufs has an external inode number -+bitmap in a superblock object. It is also an internal file such like a -+xino file. -+It is a simple bitmap to mark whether the aufs inode number is in-use or -+not. -+To reduce the file I/O, aufs prepares a single memory page to cache xib. -+ -+As well as XINO files, aufs has a feature to truncate/refresh XIB to -+reduce the number of consumed disk blocks for these files. -+ -+ -+Virtual or Vertical Dir, and Readdir in Userspace -+---------------------------------------------------------------------- -+In order to support multiple layers (branches), aufs readdir operation -+constructs a virtual dir block on memory. For readdir, aufs calls -+vfs_readdir() internally for each dir on branches, merges their entries -+with eliminating the whiteout-ed ones, and sets it to file (dir) -+object. So the file object has its entry list until it is closed. The -+entry list will be updated when the file position is zero and becomes -+obsoleted. This decision is made in aufs automatically. -+ -+The dynamically allocated memory block for the name of entries has a -+unit of 512 bytes (by default) and stores the names contiguously (no -+padding). Another block for each entry is handled by kmem_cache too. -+During building dir blocks, aufs creates hash list and judging whether -+the entry is whiteouted by its upper branch or already listed. -+The merged result is cached in the corresponding inode object and -+maintained by a customizable life-time option. -+ -+Some people may call it can be a security hole or invite DoS attack -+since the opened and once readdir-ed dir (file object) holds its entry -+list and becomes a pressure for system memory. But I'd say it is similar -+to files under /proc or /sys. The virtual files in them also holds a -+memory page (generally) while they are opened. When an idea to reduce -+memory for them is introduced, it will be applied to aufs too. -+For those who really hate this situation, I've developed readdir(3) -+library which operates this merging in userspace. You just need to set -+LD_PRELOAD environment variable, and aufs will not consume no memory in -+kernel space for readdir(3). -+ -+ -+Workqueue -+---------------------------------------------------------------------- -+Aufs sometimes requires privilege access to a branch. For instance, -+in copy-up/down operation. When a user process is going to make changes -+to a file which exists in the lower readonly branch only, and the mode -+of one of ancestor directories may not be writable by a user -+process. Here aufs copy-up the file with its ancestors and they may -+require privilege to set its owner/group/mode/etc. -+This is a typical case of a application character of aufs (see -+Introduction). -+ -+Aufs uses workqueue synchronously for this case. It creates its own -+workqueue. The workqueue is a kernel thread and has privilege. Aufs -+passes the request to call mkdir or write (for example), and wait for -+its completion. This approach solves a problem of a signal handler -+simply. -+If aufs didn't adopt the workqueue and changed the privilege of the -+process, then the process may receive the unexpected SIGXFSZ or other -+signals. -+ -+Also aufs uses the system global workqueue ("events" kernel thread) too -+for asynchronous tasks, such like handling inotify/fsnotify, re-creating a -+whiteout base and etc. This is unrelated to a privilege. -+Most of aufs operation tries acquiring a rw_semaphore for aufs -+superblock at the beginning, at the same time waits for the completion -+of all queued asynchronous tasks. -+ -+ -+Whiteout -+---------------------------------------------------------------------- -+The whiteout in aufs is very similar to Unionfs's. That is represented -+by its filename. UnionMount takes an approach of a file mode, but I am -+afraid several utilities (find(1) or something) will have to support it. -+ -+Basically the whiteout represents "logical deletion" which stops aufs to -+lookup further, but also it represents "dir is opaque" which also stop -+further lookup. -+ -+In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively. -+In order to make several functions in a single systemcall to be -+revertible, aufs adopts an approach to rename a directory to a temporary -+unique whiteouted name. -+For example, in rename(2) dir where the target dir already existed, aufs -+renames the target dir to a temporary unique whiteouted name before the -+actual rename on a branch, and then handles other actions (make it opaque, -+update the attributes, etc). If an error happens in these actions, aufs -+simply renames the whiteouted name back and returns an error. If all are -+succeeded, aufs registers a function to remove the whiteouted unique -+temporary name completely and asynchronously to the system global -+workqueue. -+ -+ -+Copy-up -+---------------------------------------------------------------------- -+It is a well-known feature or concept. -+When user modifies a file on a readonly branch, aufs operate "copy-up" -+internally and makes change to the new file on the upper writable branch. -+When the trigger systemcall does not update the timestamps of the parent -+dir, aufs reverts it after copy-up. -+ -+ -+Move-down (aufs3.9 and later) -+---------------------------------------------------------------------- -+"Copy-up" is one of the essential feature in aufs. It copies a file from -+the lower readonly branch to the upper writable branch when a user -+changes something about the file. -+"Move-down" is an opposite action of copy-up. Basically this action is -+ran manually instead of automatically and internally. -+For desgin and implementation, aufs has to consider these issues. -+- whiteout for the file may exist on the lower branch. -+- ancestor directories may not exist on the lower branch. -+- diropq for the ancestor directories may exist on the upper branch. -+- free space on the lower branch will reduce. -+- another access to the file may happen during moving-down, including -+ UDBA (see "Revalidate Dentry and UDBA"). -+- the file should not be hard-linked nor pseudo-linked. they should be -+ handled by auplink utility later. -+ -+Sometimes users want to move-down a file from the upper writable branch -+to the lower readonly or writable branch. For instance, -+- the free space of the upper writable branch is going to run out. -+- create a new intermediate branch between the upper and lower branch. -+- etc. -+ -+For this purpose, use "aumvdown" command in aufs-util.git. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/03atomic_open.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/03atomic_open.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/03atomic_open.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/03atomic_open.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,72 @@ -+ -+# Copyright (C) 2015-2021 Junjiro R. Okajima -+ -+Support for a branch who has its ->atomic_open() -+---------------------------------------------------------------------- -+The filesystems who implement its ->atomic_open() are not majority. For -+example NFSv4 does, and aufs should call NFSv4 ->atomic_open, -+particularly for open(O_CREAT|O_EXCL, 0400) case. Other than -+->atomic_open(), NFSv4 returns an error for this open(2). While I am not -+sure whether all filesystems who have ->atomic_open() behave like this, -+but NFSv4 surely returns the error. -+ -+In order to support ->atomic_open() for aufs, there are a few -+approaches. -+ -+A. Introduce aufs_atomic_open() -+ - calls one of VFS:do_last(), lookup_open() or atomic_open() for -+ branch fs. -+B. Introduce aufs_atomic_open() calling create, open and chmod. this is -+ an aufs user Pip Cet's approach -+ - calls aufs_create(), VFS finish_open() and notify_change(). -+ - pass fake-mode to finish_open(), and then correct the mode by -+ notify_change(). -+C. Extend aufs_open() to call branch fs's ->atomic_open() -+ - no aufs_atomic_open(). -+ - aufs_lookup() registers the TID to an aufs internal object. -+ - aufs_create() does nothing when the matching TID is registered, but -+ registers the mode. -+ - aufs_open() calls branch fs's ->atomic_open() when the matching -+ TID is registered. -+D. Extend aufs_open() to re-try branch fs's ->open() with superuser's -+ credential -+ - no aufs_atomic_open(). -+ - aufs_create() registers the TID to an internal object. this info -+ represents "this process created this file just now." -+ - when aufs gets EACCES from branch fs's ->open(), then confirm the -+ registered TID and re-try open() with superuser's credential. -+ -+Pros and cons for each approach. -+ -+A. -+ - straightforward but highly depends upon VFS internal. -+ - the atomic behavaiour is kept. -+ - some of parameters such as nameidata are hard to reproduce for -+ branch fs. -+ - large overhead. -+B. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+C. -+ - the atomic behavaiour is kept. -+ - dirty and tricky. -+ - VFS checks whether the file is created correctly after calling -+ ->create(), which means this approach doesn't work. -+D. -+ - easy to implement. -+ - the atomic behavaiour is lost. -+ - to open a file with superuser's credential and give it to a user -+ process is a bad idea, since the file object keeps the credential -+ in it. It may affect LSM or something. This approach doesn't work -+ either. -+ -+The approach A is ideal, but it hard to implement. So here is a -+variation of A, which is to be implemented. -+ -+A-1. Introduce aufs_atomic_open() -+ - calls branch fs ->atomic_open() if exists. otherwise calls -+ vfs_create() and finish_open(). -+ - the demerit is that the several checks after branch fs -+ ->atomic_open() are lost. in the ordinary case, the checks are -+ done by VFS:do_last(), lookup_open() and atomic_open(). some can -+ be implemented in aufs, but not all I am afraid. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/03lookup.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/03lookup.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/03lookup.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/03lookup.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,100 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Lookup in a Branch -+---------------------------------------------------------------------- -+Since aufs has a character of sub-VFS (see Introduction), it operates -+lookup for branches as VFS does. It may be a heavy work. But almost all -+lookup operation in aufs is the simplest case, ie. lookup only an entry -+directly connected to its parent. Digging down the directory hierarchy -+is unnecessary. VFS has a function lookup_one_len() for that use, and -+aufs calls it. -+ -+When a branch is a remote filesystem, aufs basically relies upon its -+->d_revalidate(), also aufs forces the hardest revalidate tests for -+them. -+For d_revalidate, aufs implements three levels of revalidate tests. See -+"Revalidate Dentry and UDBA" in detail. -+ -+ -+Test Only the Highest One for the Directory Permission (dirperm1 option) -+---------------------------------------------------------------------- -+Let's try case study. -+- aufs has two branches, upper readwrite and lower readonly. -+ /au = /rw + /ro -+- "dirA" exists under /ro, but /rw. and its mode is 0700. -+- user invoked "chmod a+rx /au/dirA" -+- the internal copy-up is activated and "/rw/dirA" is created and its -+ permission bits are set to world readable. -+- then "/au/dirA" becomes world readable? -+ -+In this case, /ro/dirA is still 0700 since it exists in readonly branch, -+or it may be a natively readonly filesystem. If aufs respects the lower -+branch, it should not respond readdir request from other users. But user -+allowed it by chmod. Should really aufs rejects showing the entries -+under /ro/dirA? -+ -+To be honest, I don't have a good solution for this case. So aufs -+implements 'dirperm1' and 'nodirperm1' mount options, and leave it to -+users. -+When dirperm1 is specified, aufs checks only the highest one for the -+directory permission, and shows the entries. Otherwise, as usual, checks -+every dir existing on all branches and rejects the request. -+ -+As a side effect, dirperm1 option improves the performance of aufs -+because the number of permission check is reduced when the number of -+branch is many. -+ -+ -+Revalidate Dentry and UDBA (User's Direct Branch Access) -+---------------------------------------------------------------------- -+Generally VFS helpers re-validate a dentry as a part of lookup. -+0. digging down the directory hierarchy. -+1. lock the parent dir by its i_mutex. -+2. lookup the final (child) entry. -+3. revalidate it. -+4. call the actual operation (create, unlink, etc.) -+5. unlock the parent dir -+ -+If the filesystem implements its ->d_revalidate() (step 3), then it is -+called. Actually aufs implements it and checks the dentry on a branch is -+still valid. -+But it is not enough. Because aufs has to release the lock for the -+parent dir on a branch at the end of ->lookup() (step 2) and -+->d_revalidate() (step 3) while the i_mutex of the aufs dir is still -+held by VFS. -+If the file on a branch is changed directly, eg. bypassing aufs, after -+aufs released the lock, then the subsequent operation may cause -+something unpleasant result. -+ -+This situation is a result of VFS architecture, ->lookup() and -+->d_revalidate() is separated. But I never say it is wrong. It is a good -+design from VFS's point of view. It is just not suitable for sub-VFS -+character in aufs. -+ -+Aufs supports such case by three level of revalidation which is -+selectable by user. -+1. Simple Revalidate -+ Addition to the native flow in VFS's, confirm the child-parent -+ relationship on the branch just after locking the parent dir on the -+ branch in the "actual operation" (step 4). When this validation -+ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still -+ checks the validation of the dentry on branches. -+2. Monitor Changes Internally by Inotify/Fsnotify -+ Addition to above, in the "actual operation" (step 4) aufs re-lookup -+ the dentry on the branch, and returns EBUSY if it finds different -+ dentry. -+ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches -+ during it is in cache. When the event is notified, aufs registers a -+ function to kernel 'events' thread by schedule_work(). And the -+ function sets some special status to the cached aufs dentry and inode -+ private data. If they are not cached, then aufs has nothing to -+ do. When the same file is accessed through aufs (step 0-3) later, -+ aufs will detect the status and refresh all necessary data. -+ In this mode, aufs has to ignore the event which is fired by aufs -+ itself. -+3. No Extra Validation -+ This is the simplest test and doesn't add any additional revalidation -+ test, and skip the revalidation in step 4. It is useful and improves -+ aufs performance when system surely hide the aufs branches from user, -+ by over-mounting something (or another method). -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/04branch.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/04branch.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/04branch.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/04branch.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,61 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Branch Manipulation -+ -+Since aufs supports dynamic branch manipulation, ie. add/remove a branch -+and changing its permission/attribute, there are a lot of works to do. -+ -+ -+Add a Branch -+---------------------------------------------------------------------- -+o Confirm the adding dir exists outside of aufs, including loopback -+ mount, and its various attributes. -+o Initialize the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o Check the owner/group/mode of the directory -+ When the owner/group/mode of the adding directory differs from the -+ existing branch, aufs issues a warning because it may impose a -+ security risk. -+ For example, when a upper writable branch has a world writable empty -+ top directory, a malicious user can create any files on the writable -+ branch directly, like copy-up and modify manually. If something like -+ /etc/{passwd,shadow} exists on the lower readonly branch but the upper -+ writable branch, and the writable branch is world-writable, then a -+ malicious guy may create /etc/passwd on the writable branch directly -+ and the infected file will be valid in aufs. -+ I am afraid it can be a security issue, but aufs can do nothing except -+ producing a warning. -+ -+ -+Delete a Branch -+---------------------------------------------------------------------- -+o Confirm the deleting branch is not busy -+ To be general, there is one merit to adopt "remount" interface to -+ manipulate branches. It is to discard caches. At deleting a branch, -+ aufs checks the still cached (and connected) dentries and inodes. If -+ there are any, then they are all in-use. An inode without its -+ corresponding dentry can be alive alone (for example, inotify/fsnotify case). -+ -+ For the cached one, aufs checks whether the same named entry exists on -+ other branches. -+ If the cached one is a directory, because aufs provides a merged view -+ to users, as long as one dir is left on any branch aufs can show the -+ dir to users. In this case, the branch can be removed from aufs. -+ Otherwise aufs rejects deleting the branch. -+ -+ If any file on the deleting branch is opened by aufs, then aufs -+ rejects deleting. -+ -+ -+Modify the Permission of a Branch -+---------------------------------------------------------------------- -+o Re-initialize or remove the xino file and whiteout bases if necessary. -+ See struct.txt. -+ -+o rw --> ro: Confirm the modifying branch is not busy -+ Aufs rejects the request if any of these conditions are true. -+ - a file on the branch is mmap-ed. -+ - a regular file on the branch is opened for write and there is no -+ same named entry on the upper branch. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/05wbr_policy.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/05wbr_policy.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/05wbr_policy.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,51 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Policies to Select One among Multiple Writable Branches -+---------------------------------------------------------------------- -+When the number of writable branch is more than one, aufs has to decide -+the target branch for file creation or copy-up. By default, the highest -+writable branch which has the parent (or ancestor) dir of the target -+file is chosen (top-down-parent policy). -+By user's request, aufs implements some other policies to select the -+writable branch, for file creation several policies, round-robin, -+most-free-space, and other policies. For copy-up, top-down-parent, -+bottom-up-parent, bottom-up and others. -+ -+As expected, the round-robin policy selects the branch in circular. When -+you have two writable branches and creates 10 new files, 5 files will be -+created for each branch. mkdir(2) systemcall is an exception. When you -+create 10 new directories, all will be created on the same branch. -+And the most-free-space policy selects the one which has most free -+space among the writable branches. The amount of free space will be -+checked by aufs internally, and users can specify its time interval. -+ -+The policies for copy-up is more simple, -+top-down-parent is equivalent to the same named on in create policy, -+bottom-up-parent selects the writable branch where the parent dir -+exists and the nearest upper one from the copyup-source, -+bottom-up selects the nearest upper writable branch from the -+copyup-source, regardless the existence of the parent dir. -+ -+There are some rules or exceptions to apply these policies. -+- If there is a readonly branch above the policy-selected branch and -+ the parent dir is marked as opaque (a variation of whiteout), or the -+ target (creating) file is whiteout-ed on the upper readonly branch, -+ then the result of the policy is ignored and the target file will be -+ created on the nearest upper writable branch than the readonly branch. -+- If there is a writable branch above the policy-selected branch and -+ the parent dir is marked as opaque or the target file is whiteouted -+ on the branch, then the result of the policy is ignored and the target -+ file will be created on the highest one among the upper writable -+ branches who has diropq or whiteout. In case of whiteout, aufs removes -+ it as usual. -+- link(2) and rename(2) systemcalls are exceptions in every policy. -+ They try selecting the branch where the source exists as possible -+ since copyup a large file will take long time. If it can't be, -+ ie. the branch where the source exists is readonly, then they will -+ follow the copyup policy. -+- There is an exception for rename(2) when the target exists. -+ If the rename target exists, aufs compares the index of the branches -+ where the source and the target exists and selects the higher -+ one. If the selected branch is readonly, then aufs follows the -+ copyup policy. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/06dirren.dot linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06dirren.dot ---- linux-5.15.37/Documentation/filesystems/aufs/design/06dirren.dot 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06dirren.dot 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,31 @@ -+ -+// to view this graph, run dot(1) command in GRAPHVIZ. -+ -+digraph G { -+node [shape=box]; -+whinfo [label="detailed info file\n(lower_brid_root-hinum, h_inum, namelen, old name)"]; -+ -+node [shape=oval]; -+ -+aufs_rename -> whinfo [label="store/remove"]; -+ -+node [shape=oval]; -+inode_list [label="h_inum list in branch\ncache"]; -+ -+node [shape=box]; -+whinode [label="h_inum list file"]; -+ -+node [shape=oval]; -+brmgmt [label="br_add/del/mod/umount"]; -+ -+brmgmt -> inode_list [label="create/remove"]; -+brmgmt -> whinode [label="load/store"]; -+ -+inode_list -> whinode [style=dashed,dir=both]; -+ -+aufs_rename -> inode_list [label="add/del"]; -+ -+aufs_lookup -> inode_list [label="search"]; -+ -+aufs_lookup -> whinfo [label="load/remove"]; -+} -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/06dirren.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06dirren.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/06dirren.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06dirren.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,89 @@ -+ -+# Copyright (C) 2017-2021 Junjiro R. Okajima -+ -+Special handling for renaming a directory (DIRREN) -+---------------------------------------------------------------------- -+First, let's assume we have a simple usecase. -+ -+- /u = /rw + /ro -+- /rw/dirA exists -+- /ro/dirA and /ro/dirA/file exist too -+- there is no dirB on both branches -+- a user issues rename("dirA", "dirB") -+ -+Now, what should aufs behave against this rename(2)? -+There are a few possible cases. -+ -+A. returns EROFS. -+ since dirA exists on a readonly branch which cannot be renamed. -+B. returns EXDEV. -+ it is possible to copy-up dirA (only the dir itself), but the child -+ entries ("file" in this case) should not be. it must be a bad -+ approach to copy-up recursively. -+C. returns a success. -+ even the branch /ro is readonly, aufs tries renaming it. Obviously it -+ is a violation of aufs' policy. -+D. construct an extra information which indicates that /ro/dirA should -+ be handled as the name of dirB. -+ overlayfs has a similar feature called REDIRECT. -+ -+Until now, aufs implements the case B only which returns EXDEV, and -+expects the userspace application behaves like mv(1) which tries -+issueing rename(2) recursively. -+ -+A new aufs feature called DIRREN is introduced which implements the case -+D. There are several "extra information" added. -+ -+1. detailed info per renamed directory -+ path: /rw/dirB/$AUFS_WH_DR_INFO_PFX. -+2. the inode-number list of directories on a branch -+ path: /rw/dirB/$AUFS_WH_DR_BRHINO -+ -+The filename of "detailed info per directory" represents the lower -+branch, and its format is -+- a type of the branch id -+ one of these. -+ + uuid (not implemented yet) -+ + fsid -+ + dev -+- the inode-number of the branch root dir -+ -+And it contains these info in a single regular file. -+- magic number -+- branch's inode-number of the logically renamed dir -+- the name of the before-renamed dir -+ -+The "detailed info per directory" file is created in aufs rename(2), and -+loaded in any lookup. -+The info is considered in lookup for the matching case only. Here -+"matching" means that the root of branch (in the info filename) is same -+to the current looking-up branch. After looking-up the before-renamed -+name, the inode-number is compared. And the matched dentry is used. -+ -+The "inode-number list of directories" is a regular file which contains -+simply the inode-numbers on the branch. The file is created or updated -+in removing the branch, and loaded in adding the branch. Its lifetime is -+equal to the branch. -+The list is refered in lookup, and when the current target inode is -+found in the list, the aufs tries loading the "detailed info per -+directory" and get the changed and valid name of the dir. -+ -+Theoretically these "extra informaiton" may be able to be put into XATTR -+in the dir inode. But aufs doesn't choose this way because -+1. XATTR may not be supported by the branch (or its configuration) -+2. XATTR may have its size limit. -+3. XATTR may be less easy to convert than a regular file, when the -+ format of the info is changed in the future. -+At the same time, I agree that the regular file approach is much slower -+than XATTR approach. So, in the future, aufs may take the XATTR or other -+better approach. -+ -+This DIRREN feature is enabled by aufs configuration, and is activated -+by a new mount option. -+ -+For the more complicated case, there is a work with UDBA option, which -+is to dected the direct access to the branches (by-passing aufs) and to -+maintain the cashes in aufs. Since a single cached aufs dentry may -+contains two names, before- and after-rename, the name comparision in -+UDBA handler may not work correctly. In this case, the behaviour will be -+equivalen to udba=reval case. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/06fhsm.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06fhsm.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/06fhsm.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06fhsm.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,105 @@ -+ -+# Copyright (C) 2011-2021 Junjiro R. Okajima -+ -+File-based Hierarchical Storage Management (FHSM) -+---------------------------------------------------------------------- -+Hierarchical Storage Management (or HSM) is a well-known feature in the -+storage world. Aufs provides this feature as file-based with multiple -+writable branches, based upon the principle of "Colder, the Lower". -+Here the word "colder" means that the less used files, and "lower" means -+that the position in the order of the stacked branches vertically. -+These multiple writable branches are prioritized, ie. the topmost one -+should be the fastest drive and be used heavily. -+ -+o Characters in aufs FHSM story -+- aufs itself and a new branch attribute. -+- a new ioctl interface to move-down and to establish a connection with -+ the daemon ("move-down" is a converse of "copy-up"). -+- userspace tool and daemon. -+ -+The userspace daemon establishes a connection with aufs and waits for -+the notification. The notified information is very similar to struct -+statfs containing the number of consumed blocks and inodes. -+When the consumed blocks/inodes of a branch exceeds the user-specified -+upper watermark, the daemon activates its move-down process until the -+consumed blocks/inodes reaches the user-specified lower watermark. -+ -+The actual move-down is done by aufs based upon the request from -+user-space since we need to maintain the inode number and the internal -+pointer arrays in aufs. -+ -+Currently aufs FHSM handles the regular files only. Additionally they -+must not be hard-linked nor pseudo-linked. -+ -+ -+o Cowork of aufs and the user-space daemon -+ During the userspace daemon established the connection, aufs sends a -+ small notification to it whenever aufs writes something into the -+ writable branch. But it may cost high since aufs issues statfs(2) -+ internally. So user can specify a new option to cache the -+ info. Actually the notification is controlled by these factors. -+ + the specified cache time. -+ + classified as "force" by aufs internally. -+ Until the specified time expires, aufs doesn't send the info -+ except the forced cases. When aufs decide forcing, the info is always -+ notified to userspace. -+ For example, the number of free inodes is generally large enough and -+ the shortage of it happens rarely. So aufs doesn't force the -+ notification when creating a new file, directory and others. This is -+ the typical case which aufs doesn't force. -+ When aufs writes the actual filedata and the files consumes any of new -+ blocks, the aufs forces notifying. -+ -+ -+o Interfaces in aufs -+- New branch attribute. -+ + fhsm -+ Specifies that the branch is managed by FHSM feature. In other word, -+ participant in the FHSM. -+ When nofhsm is set to the branch, it will not be the source/target -+ branch of the move-down operation. This attribute is set -+ independently from coo and moo attributes, and if you want full -+ FHSM, you should specify them as well. -+- New mount option. -+ + fhsm_sec -+ Specifies a second to suppress many less important info to be -+ notified. -+- New ioctl. -+ + AUFS_CTL_FHSM_FD -+ create a new file descriptor which userspace can read the notification -+ (a subset of struct statfs) from aufs. -+- Module parameter 'brs' -+ It has to be set to 1. Otherwise the new mount option 'fhsm' will not -+ be set. -+- mount helpers /sbin/mount.aufs and /sbin/umount.aufs -+ When there are two or more branches with fhsm attributes, -+ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs -+ terminates it. As a result of remounting and branch-manipulation, the -+ number of branches with fhsm attribute can be one. In this case, -+ /sbin/mount.aufs will terminate the user-space daemon. -+ -+ -+Finally the operation is done as these steps in kernel-space. -+- make sure that, -+ + no one else is using the file. -+ + the file is not hard-linked. -+ + the file is not pseudo-linked. -+ + the file is a regular file. -+ + the parent dir is not opaqued. -+- find the target writable branch. -+- make sure the file is not whiteout-ed by the upper (than the target) -+ branch. -+- make the parent dir on the target branch. -+- mutex lock the inode on the branch. -+- unlink the whiteout on the target branch (if exists). -+- lookup and create the whiteout-ed temporary name on the target branch. -+- copy the file as the whiteout-ed temporary name on the target branch. -+- rename the whiteout-ed temporary name to the original name. -+- unlink the file on the source branch. -+- maintain the internal pointer array and the external inode number -+ table (XINO). -+- maintain the timestamps and other attributes of the parent dir and the -+ file. -+ -+And of course, in every step, an error may happen. So the operation -+should restore the original file state after an error happens. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/06mmap.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06mmap.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/06mmap.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06mmap.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,59 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+mmap(2) -- File Memory Mapping -+---------------------------------------------------------------------- -+In aufs, the file-mapped pages are handled by a branch fs directly, no -+interaction with aufs. It means aufs_mmap() calls the branch fs's -+->mmap(). -+This approach is simple and good, but there is one problem. -+Under /proc, several entries show the mmapped files by its path (with -+device and inode number), and the printed path will be the path on the -+branch fs's instead of virtual aufs's. -+This is not a problem in most cases, but some utilities lsof(1) (and its -+user) may expect the path on aufs. -+ -+To address this issue, aufs adds a new member called vm_prfile in struct -+vm_area_struct (and struct vm_region). The original vm_file points to -+the file on the branch fs in order to handle everything correctly as -+usual. The new vm_prfile points to a virtual file in aufs, and the -+show-functions in procfs refers to vm_prfile if it is set. -+Also we need to maintain several other places where touching vm_file -+such like -+- fork()/clone() copies vma and the reference count of vm_file is -+ incremented. -+- merging vma maintains the ref count too. -+ -+This is not a good approach. It just fakes the printed path. But it -+leaves all behaviour around f_mapping unchanged. This is surely an -+advantage. -+Actually aufs had adopted another complicated approach which calls -+generic_file_mmap() and handles struct vm_operations_struct. In this -+approach, aufs met a hard problem and I could not solve it without -+switching the approach. -+ -+There may be one more another approach which is -+- bind-mount the branch-root onto the aufs-root internally -+- grab the new vfsmount (ie. struct mount) -+- lazy-umount the branch-root internally -+- in open(2) the aufs-file, open the branch-file with the hidden -+ vfsmount (instead of the original branch's vfsmount) -+- ideally this "bind-mount and lazy-umount" should be done atomically, -+ but it may be possible from userspace by the mount helper. -+ -+Adding the internal hidden vfsmount and using it in opening a file, the -+file path under /proc will be printed correctly. This approach looks -+smarter, but is not possible I am afraid. -+- aufs-root may be bind-mount later. when it happens, another hidden -+ vfsmount will be required. -+- it is hard to get the chance to bind-mount and lazy-umount -+ + in kernel-space, FS can have vfsmount in open(2) via -+ file->f_path, and aufs can know its vfsmount. But several locks are -+ already acquired, and if aufs tries to bind-mount and lazy-umount -+ here, then it may cause a deadlock. -+ + in user-space, bind-mount doesn't invoke the mount helper. -+- since /proc shows dev and ino, aufs has to give vma these info. it -+ means a new member vm_prinode will be necessary. this is essentially -+ equivalent to vm_prfile described above. -+ -+I have to give up this "looks-smater" approach. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/06xattr.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06xattr.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/06xattr.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/06xattr.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,81 @@ -+ -+# Copyright (C) 2014-2021 Junjiro R. Okajima -+ -+Listing XATTR/EA and getting the value -+---------------------------------------------------------------------- -+For the inode standard attributes (owner, group, timestamps, etc.), aufs -+shows the values from the topmost existing file. This behaviour is good -+for the non-dir entries since the bahaviour exactly matches the shown -+information. But for the directories, aufs considers all the same named -+entries on the lower branches. Which means, if one of the lower entry -+rejects readdir call, then aufs returns an error even if the topmost -+entry allows it. This behaviour is necessary to respect the branch fs's -+security, but can make users confused since the user-visible standard -+attributes don't match the behaviour. -+To address this issue, aufs has a mount option called dirperm1 which -+checks the permission for the topmost entry only, and ignores the lower -+entry's permission. -+ -+A similar issue can happen around XATTR. -+getxattr(2) and listxattr(2) families behave as if dirperm1 option is -+always set. Otherwise these very unpleasant situation would happen. -+- listxattr(2) may return the duplicated entries. -+- users may not be able to remove or reset the XATTR forever, -+ -+ -+XATTR/EA support in the internal (copy,move)-(up,down) -+---------------------------------------------------------------------- -+Generally the extended attributes of inode are categorized as these. -+- "security" for LSM and capability. -+- "system" for posix ACL, 'acl' mount option is required for the branch -+ fs generally. -+- "trusted" for userspace, CAP_SYS_ADMIN is required. -+- "user" for userspace, 'user_xattr' mount option is required for the -+ branch fs generally. -+ -+Moreover there are some other categories. Aufs handles these rather -+unpopular categories as the ordinary ones, ie. there is no special -+condition nor exception. -+ -+In copy-up, the support for XATTR on the dst branch may differ from the -+src branch. In this case, the copy-up operation will get an error and -+the original user operation which triggered the copy-up will fail. It -+can happen that even all copy-up will fail. -+When both of src and dst branches support XATTR and if an error occurs -+during copying XATTR, then the copy-up should fail obviously. That is a -+good reason and aufs should return an error to userspace. But when only -+the src branch support that XATTR, aufs should not return an error. -+For example, the src branch supports ACL but the dst branch doesn't -+because the dst branch may natively un-support it or temporary -+un-support it due to "noacl" mount option. Of course, the dst branch fs -+may NOT return an error even if the XATTR is not supported. It is -+totally up to the branch fs. -+ -+Anyway when the aufs internal copy-up gets an error from the dst branch -+fs, then aufs tries removing the just copied entry and returns the error -+to the userspace. The worst case of this situation will be all copy-up -+will fail. -+ -+For the copy-up operation, there two basic approaches. -+- copy the specified XATTR only (by category above), and return the -+ error unconditionally if it happens. -+- copy all XATTR, and ignore the error on the specified category only. -+ -+In order to support XATTR and to implement the correct behaviour, aufs -+chooses the latter approach and introduces some new branch attributes, -+"icexsec", "icexsys", "icextr", "icexusr", and "icexoth". -+They correspond to the XATTR namespaces (see above). Additionally, to be -+convenient, "icex" is also provided which means all "icex*" attributes -+are set (here the word "icex" stands for "ignore copy-error on XATTR"). -+ -+The meaning of these attributes is to ignore the error from setting -+XATTR on that branch. -+Note that aufs tries copying all XATTR unconditionally, and ignores the -+error from the dst branch according to the specified attributes. -+ -+Some XATTR may have its default value. The default value may come from -+the parent dir or the environment. If the default value is set at the -+file creating-time, it will be overwritten by copy-up. -+Some contradiction may happen I am afraid. -+Do we need another attribute to stop copying XATTR? I am unsure. For -+now, aufs implements the branch attributes to ignore the error. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/07export.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/07export.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/07export.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/07export.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,45 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Export Aufs via NFS -+---------------------------------------------------------------------- -+Here is an approach. -+- like xino/xib, add a new file 'xigen' which stores aufs inode -+ generation. -+- iget_locked(): initialize aufs inode generation for a new inode, and -+ store it in xigen file. -+- destroy_inode(): increment aufs inode generation and store it in xigen -+ file. it is necessary even if it is not unlinked, because any data of -+ inode may be changed by UDBA. -+- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise -+ build file handle by -+ + branch id (4 bytes) -+ + superblock generation (4 bytes) -+ + inode number (4 or 8 bytes) -+ + parent dir inode number (4 or 8 bytes) -+ + inode generation (4 bytes)) -+ + return value of exportfs_encode_fh() for the parent on a branch (4 -+ bytes) -+ + file handle for a branch (by exportfs_encode_fh()) -+- fh_to_dentry(): -+ + find the index of a branch from its id in handle, and check it is -+ still exist in aufs. -+ + 1st level: get the inode number from handle and search it in cache. -+ + 2nd level: if not found in cache, get the parent inode number from -+ the handle and search it in cache. and then open the found parent -+ dir, find the matching inode number by vfs_readdir() and get its -+ name, and call lookup_one_len() for the target dentry. -+ + 3rd level: if the parent dir is not cached, call -+ exportfs_decode_fh() for a branch and get the parent on a branch, -+ build a pathname of it, convert it a pathname in aufs, call -+ path_lookup(). now aufs gets a parent dir dentry, then handle it as -+ the 2nd level. -+ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount -+ for every branch, but not itself. to get this, (currently) aufs -+ searches in current->nsproxy->mnt_ns list. it may not be a good -+ idea, but I didn't get other approach. -+ + test the generation of the gotten inode. -+- every inode operation: they may get EBUSY due to UDBA. in this case, -+ convert it into ESTALE for NFSD. -+- readdir(): call lockdep_on/off() because filldir in NFSD calls -+ lookup_one_len(), vfs_getattr(), encode_fh() and others. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/08shwh.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/08shwh.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/08shwh.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/08shwh.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,39 @@ -+ -+# Copyright (C) 2005-2021 Junjiro R. Okajima -+ -+Show Whiteout Mode (shwh) -+---------------------------------------------------------------------- -+Generally aufs hides the name of whiteouts. But in some cases, to show -+them is very useful for users. For instance, creating a new middle layer -+(branch) by merging existing layers. -+ -+(borrowing aufs1 HOW-TO from a user, Michael Towers) -+When you have three branches, -+- Bottom: 'system', squashfs (underlying base system), read-only -+- Middle: 'mods', squashfs, read-only -+- Top: 'overlay', ram (tmpfs), read-write -+ -+The top layer is loaded at boot time and saved at shutdown, to preserve -+the changes made to the system during the session. -+When larger changes have been made, or smaller changes have accumulated, -+the size of the saved top layer data grows. At this point, it would be -+nice to be able to merge the two overlay branches ('mods' and 'overlay') -+and rewrite the 'mods' squashfs, clearing the top layer and thus -+restoring save and load speed. -+ -+This merging is simplified by the use of another aufs mount, of just the -+two overlay branches using the 'shwh' option. -+# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \ -+ aufs /livesys/merge_union -+ -+A merged view of these two branches is then available at -+/livesys/merge_union, and the new feature is that the whiteouts are -+visible! -+Note that in 'shwh' mode the aufs mount must be 'ro', which will disable -+writing to all branches. Also the default mode for all branches is 'ro'. -+It is now possible to save the combined contents of the two overlay -+branches to a new squashfs, e.g.: -+# mksquashfs /livesys/merge_union /path/to/newmods.squash -+ -+This new squashfs archive can be stored on the boot device and the -+initramfs will use it to replace the old one at the next boot. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/design/10dynop.txt linux-5.15.37-aufs/Documentation/filesystems/aufs/design/10dynop.txt ---- linux-5.15.37/Documentation/filesystems/aufs/design/10dynop.txt 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/design/10dynop.txt 2022-04-08 20:22:30.609616328 +0300 -@@ -0,0 +1,34 @@ -+ -+# Copyright (C) 2010-2021 Junjiro R. Okajima -+ -+Dynamically customizable FS operations -+---------------------------------------------------------------------- -+Generally FS operations (struct inode_operations, struct -+address_space_operations, struct file_operations, etc.) are defined as -+"static const", but it never means that FS have only one set of -+operation. Some FS have multiple sets of them. For instance, ext2 has -+three sets, one for XIP, for NOBH, and for normal. -+Since aufs overrides and redirects these operations, sometimes aufs has -+to change its behaviour according to the branch FS type. More importantly -+VFS acts differently if a function (member in the struct) is set or -+not. It means aufs should have several sets of operations and select one -+among them according to the branch FS definition. -+ -+In order to solve this problem and not to affect the behaviour of VFS, -+aufs defines these operations dynamically. For instance, aufs defines -+dummy direct_IO function for struct address_space_operations, but it may -+not be set to the address_space_operations actually. When the branch FS -+doesn't have it, aufs doesn't set it to its address_space_operations -+while the function definition itself is still alive. So the behaviour -+itself will not change, and it will return an error when direct_IO is -+not set. -+ -+The lifetime of these dynamically generated operation object is -+maintained by aufs branch object. When the branch is removed from aufs, -+the reference counter of the object is decremented. When it reaches -+zero, the dynamically generated operation object will be freed. -+ -+This approach is designed to support AIO (io_submit), Direct I/O and -+XIP (DAX) mainly. -+Currently this approach is applied to address_space_operations for -+regular files only. -diff -Nurp linux-5.15.37/Documentation/filesystems/aufs/README linux-5.15.37-aufs/Documentation/filesystems/aufs/README ---- linux-5.15.37/Documentation/filesystems/aufs/README 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/Documentation/filesystems/aufs/README 2022-04-08 20:22:30.608616279 +0300 -@@ -0,0 +1,396 @@ -+ -+Aufs5 -- advanced multi layered unification filesystem version 5.x -+http://aufs.sf.net -+Junjiro R. Okajima -+ -+ -+0. Introduction -+---------------------------------------- -+In the early days, aufs was entirely re-designed and re-implemented -+Unionfs Version 1.x series. Adding many original ideas, approaches, -+improvements and implementations, it became totally different from -+Unionfs while keeping the basic features. -+Later, Unionfs Version 2.x series began taking some of the same -+approaches to aufs1's. -+Unionfs was being developed by Professor Erez Zadok at Stony Brook -+University and his team. -+ -+Aufs5 supports linux-v5.0 and later, If you want older kernel version -+support, -+- for linux-v4.x series, try aufs4-linux.git or aufs4-standalone.git -+- for linux-v3.x series, try aufs3-linux.git or aufs3-standalone.git -+- for linux-v2.6.16 and later, try aufs2-2.6.git, aufs2-standalone.git -+ or aufs1 from CVS on SourceForge. -+ -+Note: it becomes clear that "Aufs was rejected. Let's give it up." -+ According to Christoph Hellwig, linux rejects all union-type -+ filesystems but UnionMount. -+ -+ -+PS. Al Viro seems have a plan to merge aufs as well as overlayfs and -+ UnionMount, and he pointed out an issue around a directory mutex -+ lock and aufs addressed it. But it is still unsure whether aufs will -+ be merged (or any other union solution). -+ -+ -+ -+1. Features -+---------------------------------------- -+- unite several directories into a single virtual filesystem. The member -+ directory is called as a branch. -+- you can specify the permission flags to the branch, which are 'readonly', -+ 'readwrite' and 'whiteout-able.' -+- by upper writable branch, internal copyup and whiteout, files/dirs on -+ readonly branch are modifiable logically. -+- dynamic branch manipulation, add, del. -+- etc... -+ -+Also there are many enhancements in aufs, such as: -+- test only the highest one for the directory permission (dirperm1) -+- copyup on open (coo=) -+- 'move' policy for copy-up between two writable branches, after -+ checking free space. -+- xattr, acl -+- readdir(3) in userspace. -+- keep inode number by external inode number table -+- keep the timestamps of file/dir in internal copyup operation -+- seekable directory, supporting NFS readdir. -+- whiteout is hardlinked in order to reduce the consumption of inodes -+ on branch -+- do not copyup, nor create a whiteout when it is unnecessary -+- revert a single systemcall when an error occurs in aufs -+- remount interface instead of ioctl -+- maintain /etc/mtab by an external command, /sbin/mount.aufs. -+- loopback mounted filesystem as a branch -+- kernel thread for removing the dir who has a plenty of whiteouts -+- support copyup sparse file (a file which has a 'hole' in it) -+- default permission flags for branches -+- selectable permission flags for ro branch, whether whiteout can -+ exist or not -+- export via NFS. -+- support /fs/aufs and /aufs. -+- support multiple writable branches, some policies to select one -+ among multiple writable branches. -+- a new semantics for link(2) and rename(2) to support multiple -+ writable branches. -+- no glibc changes are required. -+- pseudo hardlink (hardlink over branches) -+- allow a direct access manually to a file on branch, e.g. bypassing aufs. -+ including NFS or remote filesystem branch. -+- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. -+- and more... -+ -+Currently these features are dropped temporary from aufs5. -+See design/08plan.txt in detail. -+- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs -+ (robr) -+- statistics of aufs thread (/sys/fs/aufs/stat) -+ -+Features or just an idea in the future (see also design/*.txt), -+- reorder the branch index without del/re-add. -+- permanent xino files for NFSD -+- an option for refreshing the opened files after add/del branches -+- light version, without branch manipulation. (unnecessary?) -+- copyup in userspace -+- inotify in userspace -+- readv/writev -+ -+ -+2. Download -+---------------------------------------- -+There are three GIT trees for aufs5, aufs5-linux.git, -+aufs5-standalone.git, and aufs-util.git. Note that there is no "5" in -+"aufs-util.git." -+While the aufs-util is always necessary, you need either of aufs5-linux -+or aufs5-standalone. -+ -+The aufs5-linux tree includes the whole linux mainline GIT tree, -+git://git.kernel.org/.../torvalds/linux.git. -+And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot -+build aufs5 as an external kernel module. -+Several extra patches are not included in this tree. Only -+aufs5-standalone tree contains them. They are described in the later -+section "Configuration and Compilation." -+ -+On the other hand, the aufs5-standalone tree has only aufs source files -+and necessary patches, and you can select CONFIG_AUFS_FS=m. -+But you need to apply all aufs patches manually. -+ -+You will find GIT branches whose name is in form of "aufs5.x" where "x" -+represents the linux kernel version, "linux-5.x". For instance, -+"aufs5.0" is for linux-5.0. For latest "linux-5.x-rcN", use -+"aufs5.x-rcN" branch. -+ -+o aufs5-linux tree -+$ git clone --reference /your/linux/git/tree \ -+ git://github.com/sfjro/aufs5-linux.git aufs5-linux.git -+- if you don't have linux GIT tree, then remove "--reference ..." -+$ cd aufs5-linux.git -+$ git checkout origin/aufs5.0 -+ -+Or You may want to directly git-pull aufs into your linux GIT tree, and -+leave the patch-work to GIT. -+$ cd /your/linux/git/tree -+$ git remote add aufs5 git://github.com/sfjro/aufs5-linux.git -+$ git fetch aufs5 -+$ git checkout -b my5.0 v5.0 -+$ (add your local change...) -+$ git pull aufs5 aufs5.0 -+- now you have v5.0 + your_changes + aufs5.0 in you my5.0 branch. -+- you may need to solve some conflicts between your_changes and -+ aufs5.0. in this case, git-rerere is recommended so that you can -+ solve the similar conflicts automatically when you upgrade to 5.1 or -+ later in the future. -+ -+o aufs5-standalone tree -+$ git clone git://github.com/sfjro/aufs5-standalone.git aufs5-standalone.git -+$ cd aufs5-standalone.git -+$ git checkout origin/aufs5.0 -+ -+o aufs-util tree -+$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git -+- note that the public aufs-util.git is on SourceForge instead of -+ GitHUB. -+$ cd aufs-util.git -+$ git checkout origin/aufs5.0 -+ -+Note: The 5.x-rcN branch is to be used with `rc' kernel versions ONLY. -+The minor version number, 'x' in '5.x', of aufs may not always -+follow the minor version number of the kernel. -+Because changes in the kernel that cause the use of a new -+minor version number do not always require changes to aufs-util. -+ -+Since aufs-util has its own minor version number, you may not be -+able to find a GIT branch in aufs-util for your kernel's -+exact minor version number. -+In this case, you should git-checkout the branch for the -+nearest lower number. -+ -+For (an unreleased) example: -+If you are using "linux-5.10" and the "aufs5.10" branch -+does not exist in aufs-util repository, then "aufs5.9", "aufs5.8" -+or something numerically smaller is the branch for your kernel. -+ -+Also you can view all branches by -+ $ git branch -a -+ -+ -+3. Configuration and Compilation -+---------------------------------------- -+Make sure you have git-checkout'ed the correct branch. -+ -+For aufs5-linux tree, -+- enable CONFIG_AUFS_FS. -+- set other aufs configurations if necessary. -+- for aufs5.13 and later -+ Because aufs is not only an ordinary filesystem (callee of VFS), but -+ also a caller of VFS functions for branch filesystems, subclassing of -+ the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging -+ feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will -+ need to customize some LOCKDEP numbers. Here are what I use on my -+ test environment. -+ CONFIG_LOCKDEP_BITS=21 -+ CONFIG_LOCKDEP_CHAINS_BITS=21 -+ CONFIG_LOCKDEP_STACK_TRACE_BITS=24 -+ -+For aufs5-standalone tree, -+There are several ways to build. -+ -+1. -+- apply ./aufs5-kbuild.patch to your kernel source files. -+- apply ./aufs5-base.patch too. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too, if you have a plan to set -+ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs5-standalone.patch. -+- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your -+ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. -+- enable CONFIG_AUFS_FS, you can select either -+ =m or =y. -+- and build your kernel as usual. -+- install the built kernel. -+- install the header files too by "make headers_install" to the -+ directory where you specify. By default, it is $PWD/usr. -+ "make help" shows a brief note for headers_install. -+- and reboot your system. -+ -+2. -+- module only (CONFIG_AUFS_FS=m). -+- apply ./aufs5-base.patch to your kernel source files. -+- apply ./aufs5-mmap.patch too. -+- apply ./aufs5-standalone.patch too. -+- build your kernel, don't forget "make headers_install", and reboot. -+- edit ./config.mk and set other aufs configurations if necessary. -+ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes -+ every aufs configurations. -+- build the module by simple "make". -+- you can specify ${KDIR} make variable which points to your kernel -+ source tree. -+- install the files -+ + run "make install" to install the aufs module, or copy the built -+ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply). -+ + run "make install_headers" (instead of headers_install) to install -+ the modified aufs header file (you can specify DESTDIR which is -+ available in aufs standalone version's Makefile only), or copy -+ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever -+ you like manually. By default, the target directory is $PWD/usr. -+- no need to apply aufs5-kbuild.patch, nor copying source files to your -+ kernel source tree. -+ -+Note: The header file aufs_type.h is necessary to build aufs-util -+ as well as "make headers_install" in the kernel source tree. -+ headers_install is subject to be forgotten, but it is essentially -+ necessary, not only for building aufs-util. -+ You may not meet problems without headers_install in some older -+ version though. -+ -+And then, -+- read README in aufs-util, build and install it -+- note that your distribution may contain an obsoleted version of -+ aufs_type.h in /usr/include/linux or something. When you build aufs -+ utilities, make sure that your compiler refers the correct aufs header -+ file which is built by "make headers_install." -+- if you want to use readdir(3) in userspace or pathconf(3) wrapper, -+ then run "make install_ulib" too. And refer to the aufs manual in -+ detail. -+ -+There several other patches in aufs5-standalone.git. They are all -+optional. When you meet some problems, they will help you. -+- aufs5-loopback.patch -+ Supports a nested loopback mount in a branch-fs. This patch is -+ unnecessary until aufs produces a message like "you may want to try -+ another patch for loopback file". -+- vfs-ino.patch -+ Modifies a system global kernel internal function get_next_ino() in -+ order to stop assigning 0 for an inode-number. Not directly related to -+ aufs, but recommended generally. -+- tmpfs-idr.patch -+ Keeps the tmpfs inode number as the lowest value. Effective to reduce -+ the size of aufs XINO files for tmpfs branch. Also it prevents the -+ duplication of inode number, which is important for backup tools and -+ other utilities. When you find aufs XINO files for tmpfs branch -+ growing too much, try this patch. -+ -+ -+4. Usage -+---------------------------------------- -+At first, make sure aufs-util are installed, and please read the aufs -+manual, aufs.5 in aufs-util.git tree. -+$ man -l aufs.5 -+ -+And then, -+$ mkdir /tmp/rw /tmp/aufs -+# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs -+ -+Here is another example. The result is equivalent. -+# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs -+ Or -+# mount -t aufs -o br:/tmp/rw none /tmp/aufs -+# mount -o remount,append:${HOME} /tmp/aufs -+ -+Then, you can see whole tree of your home dir through /tmp/aufs. If -+you modify a file under /tmp/aufs, the one on your home directory is -+not affected, instead the same named file will be newly created under -+/tmp/rw. And all of your modification to a file will be applied to -+the one under /tmp/rw. This is called the file based Copy on Write -+(COW) method. -+Aufs mount options are described in aufs.5. -+If you run chroot or something and make your aufs as a root directory, -+then you need to customize the shutdown script. See the aufs manual in -+detail. -+ -+Additionally, there are some sample usages of aufs which are a -+diskless system with network booting, and LiveCD over NFS. -+See sample dir in CVS tree on SourceForge. -+ -+ -+5. Contact -+---------------------------------------- -+When you have any problems or strange behaviour in aufs, please let me -+know with: -+- /proc/mounts (instead of the output of mount(8)) -+- /sys/module/aufs/* -+- /sys/fs/aufs/* (if you have them) -+- /debug/aufs/* (if you have them) -+- linux kernel version -+ if your kernel is not plain, for example modified by distributor, -+ the url where i can download its source is necessary too. -+- aufs version which was printed at loading the module or booting the -+ system, instead of the date you downloaded. -+- configuration (define/undefine CONFIG_AUFS_xxx) -+- kernel configuration or /proc/config.gz (if you have it) -+- LSM (linux security module, if you are using) -+- behaviour which you think to be incorrect -+- actual operation, reproducible one is better -+- mailto: aufs-users at lists.sourceforge.net -+ -+Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches, -+and Feature Requests) on SourceForge. Please join and write to -+aufs-users ML. -+ -+ -+6. Acknowledgements -+---------------------------------------- -+Thanks to everyone who have tried and are using aufs, whoever -+have reported a bug or any feedback. -+ -+Especially donators: -+Tomas Matejicek(slax.org) made a donation (much more than once). -+ Since Apr 2010, Tomas M (the author of Slax and Linux Live -+ scripts) is making "doubling" donations. -+ Unfortunately I cannot list all of the donators, but I really -+ appreciate. -+ It ends Aug 2010, but the ordinary donation URL is still available. -+ -+Dai Itasaka made a donation (2007/8). -+Chuck Smith made a donation (2008/4, 10 and 12). -+Henk Schoneveld made a donation (2008/9). -+Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10). -+Francois Dupoux made a donation (2008/11). -+Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public -+ aufs2 GIT tree (2009/2). -+William Grant made a donation (2009/3). -+Patrick Lane made a donation (2009/4). -+The Mail Archive (mail-archive.com) made donations (2009/5). -+Nippy Networks (Ed Wildgoose) made a donation (2009/7). -+New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11). -+Pavel Pronskiy made a donation (2011/2). -+Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy -+ Networks (Ed Wildgoose) made a donation for hardware (2011/3). -+Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and -+11). -+Sam Liddicott made a donation (2011/9). -+Era Scarecrow made a donation (2013/4). -+Bor Ratajc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+POIRETTE Marc made a donation (2013/4). -+Alessandro Gorreta made a donation (2013/4). -+lauri kasvandik made a donation (2013/5). -+"pemasu from Finland" made a donation (2013/7). -+The Parted Magic Project made a donation (2013/9 and 11). -+Pavel Barta made a donation (2013/10). -+Nikolay Pertsev made a donation (2014/5). -+James B made a donation (2014/7, 2015/7, and 2021/12). -+Stefano Di Biase made a donation (2014/8). -+Daniel Epellei made a donation (2015/1). -+OmegaPhil made a donation (2016/1, 2018/4). -+Tomasz Szewczyk made a donation (2016/4). -+James Burry made a donation (2016/12). -+Carsten Rose made a donation (2018/9). -+Porteus Kiosk made a donation (2018/10). -+ -+Thank you very much. -+Donations are always, including future donations, very important and -+helpful for me to keep on developing aufs. -+ -+ -+7. -+---------------------------------------- -+If you are an experienced user, no explanation is needed. Aufs is -+just a linux filesystem. -+ -+ -+Enjoy! -+ -+# Local variables: ; -+# mode: text; -+# End: ; -diff -Nurp linux-5.15.37/drivers/block/loop.c linux-5.15.37-aufs/drivers/block/loop.c ---- linux-5.15.37/drivers/block/loop.c 2022-04-08 20:07:30.626495709 +0300 -+++ linux-5.15.37-aufs/drivers/block/loop.c 2022-04-08 20:22:30.610616377 +0300 -@@ -636,6 +636,24 @@ out_putf: - return error; - } - -+/* -+ * for AUFS -+ * no get/put for file. -+ */ -+struct file *loop_backing_file(struct super_block *sb) -+{ -+ struct file *ret; -+ struct loop_device *l; -+ -+ ret = NULL; -+ if (MAJOR(sb->s_dev) == LOOP_MAJOR) { -+ l = sb->s_bdev->bd_disk->private_data; -+ ret = l->lo_backing_file; -+ } -+ return ret; -+} -+EXPORT_SYMBOL_GPL(loop_backing_file); -+ - /* loop sysfs attributes */ - - static ssize_t loop_attr_show(struct device *dev, char *page, -diff -Nurp linux-5.15.37/fs/aufs/aufs.h linux-5.15.37-aufs/fs/aufs/aufs.h ---- linux-5.15.37/fs/aufs/aufs.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/aufs.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,49 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * all header files -+ */ -+ -+#ifndef __AUFS_H__ -+#define __AUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#define AuStub(type, name, body, ...) \ -+ static inline type name(__VA_ARGS__) { body; } -+ -+#define AuStubVoid(name, ...) \ -+ AuStub(void, name, , __VA_ARGS__) -+#define AuStubInt0(name, ...) \ -+ AuStub(int, name, return 0, __VA_ARGS__) -+ -+#include "debug.h" -+ -+#include "branch.h" -+#include "cpup.h" -+#include "dcsub.h" -+#include "dbgaufs.h" -+#include "dentry.h" -+#include "dir.h" -+#include "dirren.h" -+#include "dynop.h" -+#include "file.h" -+#include "fstype.h" -+#include "hbl.h" -+#include "inode.h" -+#include "lcnt.h" -+#include "loop.h" -+#include "module.h" -+#include "opts.h" -+#include "rwsem.h" -+#include "super.h" -+#include "sysaufs.h" -+#include "vfsub.h" -+#include "whout.h" -+#include "wkq.h" -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/branch.c linux-5.15.37-aufs/fs/aufs/branch.c ---- linux-5.15.37/fs/aufs/branch.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/branch.c 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,1414 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * branch management -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * free a single branch -+ */ -+static void au_br_do_free(struct au_branch *br) -+{ -+ int i; -+ struct au_wbr *wbr; -+ struct au_dykey **key; -+ -+ au_hnotify_fin_br(br); -+ /* always, regardless the mount option */ -+ au_dr_hino_free(&br->br_dirren); -+ au_xino_put(br); -+ -+ AuLCntZero(au_lcnt_read(&br->br_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_nfiles, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&br->br_count, /*do_rev*/0)); -+ au_lcnt_fin(&br->br_count, /*do_sync*/0); -+ -+ wbr = br->br_wbr; -+ if (wbr) { -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(wbr->wbr_wh[i]); -+ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); -+ AuRwDestroy(&wbr->wbr_wh_rwsem); -+ } -+ -+ if (br->br_fhsm) { -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_try_rcu(br->br_fhsm); -+ } -+ -+ key = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++, key++) -+ if (*key) -+ au_dy_put(*key); -+ else -+ break; -+ -+ /* recursive lock, s_umount of branch's */ -+ /* synchronize_rcu(); */ /* why? */ -+ lockdep_off(); -+ path_put(&br->br_path); -+ lockdep_on(); -+ au_kfree_rcu(wbr); -+ au_lcnt_wait_for_fin(&br->br_nfiles); -+ au_lcnt_wait_for_fin(&br->br_count); -+ /* I don't know why, but percpu_refcount requires this */ -+ /* synchronize_rcu(); */ -+ au_kfree_rcu(br); -+} -+ -+/* -+ * frees all branches -+ */ -+void au_br_free(struct au_sbinfo *sbinfo) -+{ -+ aufs_bindex_t bmax; -+ struct au_branch **br; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ bmax = sbinfo->si_bbot + 1; -+ br = sbinfo->si_branch; -+ while (bmax--) -+ au_br_do_free(*br++); -+} -+ -+/* -+ * find the index of a branch which is specified by @br_id. -+ */ -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_sbr_id(sb, bindex) == br_id) -+ return bindex; -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * add a branch -+ */ -+ -+static int test_overlap(struct super_block *sb, struct dentry *h_adding, -+ struct dentry *h_root) -+{ -+ if (unlikely(h_adding == h_root -+ || au_test_loopback_overlap(sb, h_adding))) -+ return 1; -+ if (h_adding->d_sb != h_root->d_sb) -+ return 0; -+ return au_test_subdir(h_adding, h_root) -+ || au_test_subdir(h_root, h_adding); -+} -+ -+/* -+ * returns a newly allocated branch. @new_nbranch is a number of branches -+ * after adding a branch. -+ */ -+static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, -+ int perm) -+{ -+ struct au_branch *add_branch; -+ struct dentry *root; -+ struct inode *inode; -+ int err; -+ -+ err = -ENOMEM; -+ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS); -+ if (unlikely(!add_branch)) -+ goto out; -+ add_branch->br_xino = au_xino_alloc(/*nfile*/1); -+ if (unlikely(!add_branch->br_xino)) -+ goto out_br; -+ err = au_hnotify_init_br(add_branch, perm); -+ if (unlikely(err)) -+ goto out_xino; -+ -+ if (au_br_writable(perm)) { -+ /* may be freed separately at changing the branch permission */ -+ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr), -+ GFP_NOFS); -+ if (unlikely(!add_branch->br_wbr)) -+ goto out_hnotify; -+ } -+ -+ if (au_br_fhsm(perm)) { -+ err = au_fhsm_br_alloc(add_branch); -+ if (unlikely(err)) -+ goto out_wbr; -+ } -+ -+ root = sb->s_root; -+ err = au_sbr_realloc(au_sbi(sb), new_nbranch, /*may_shrink*/0); -+ if (!err) -+ err = au_di_realloc(au_di(root), new_nbranch, /*may_shrink*/0); -+ if (!err) { -+ inode = d_inode(root); -+ err = au_hinode_realloc(au_ii(inode), new_nbranch, -+ /*may_shrink*/0); -+ } -+ if (!err) -+ return add_branch; /* success */ -+ -+out_wbr: -+ au_kfree_rcu(add_branch->br_wbr); -+out_hnotify: -+ au_hnotify_fin_br(add_branch); -+out_xino: -+ au_xino_put(add_branch); -+out_br: -+ au_kfree_rcu(add_branch); -+out: -+ return ERR_PTR(err); -+} -+ -+/* -+ * test if the branch permission is legal or not. -+ */ -+static int test_br(struct inode *inode, int brperm, char *path) -+{ -+ int err; -+ -+ err = (au_br_writable(brperm) && IS_RDONLY(inode)); -+ if (!err) -+ goto out; -+ -+ err = -EINVAL; -+ pr_err("write permission for readonly mount or inode, %s\n", path); -+ -+out: -+ return err; -+} -+ -+/* -+ * returns: -+ * 0: success, the caller will add it -+ * plus: success, it is already unified, the caller should ignore it -+ * minus: error -+ */ -+static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ root = sb->s_root; -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot >= 0 -+ && au_find_dbindex(root, add->path.dentry) >= 0)) { -+ err = 1; -+ if (!remount) { -+ err = -EINVAL; -+ pr_err("%s duplicated\n", add->pathname); -+ } -+ goto out; -+ } -+ -+ err = -ENOSPC; /* -E2BIG; */ -+ if (unlikely(AUFS_BRANCH_MAX <= add->bindex -+ || AUFS_BRANCH_MAX - 1 <= bbot)) { -+ pr_err("number of branches exceeded %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EDOM; -+ if (unlikely(add->bindex < 0 || bbot + 1 < add->bindex)) { -+ pr_err("bad index %d\n", add->bindex); -+ goto out; -+ } -+ -+ inode = d_inode(add->path.dentry); -+ err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { -+ pr_err("no existence %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(inode->i_sb == sb)) { -+ pr_err("%s must be outside\n", add->pathname); -+ goto out; -+ } -+ -+ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { -+ pr_err("unsupported filesystem, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ if (unlikely(inode->i_sb->s_stack_depth)) { -+ pr_err("already stacked, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bbot < 0) -+ return 0; /* success */ -+ -+ err = -EINVAL; -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (unlikely(test_overlap(sb, add->path.dentry, -+ au_h_dptr(root, bindex)))) { -+ pr_err("%s is overlapped\n", add->pathname); -+ goto out; -+ } -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { -+ h_dentry = au_h_dptr(root, 0); -+ h_inode = d_inode(h_dentry); -+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) -+ || !uid_eq(h_inode->i_uid, inode->i_uid) -+ || !gid_eq(h_inode->i_gid, inode->i_gid)) -+ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", -+ add->pathname, -+ i_uid_read(inode), i_gid_read(inode), -+ (inode->i_mode & S_IALLUGO), -+ i_uid_read(h_inode), i_gid_read(h_inode), -+ (h_inode->i_mode & S_IALLUGO)); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize or clean the whiteouts for an adding branch -+ */ -+static int au_br_init_wh(struct super_block *sb, struct au_branch *br, -+ int new_perm) -+{ -+ int err, old_perm; -+ aufs_bindex_t bindex; -+ struct inode *h_inode; -+ struct au_wbr *wbr; -+ struct au_hinode *hdir; -+ struct dentry *h_dentry; -+ -+ err = vfsub_mnt_want_write(au_br_mnt(br)); -+ if (unlikely(err)) -+ goto out; -+ -+ wbr = br->br_wbr; -+ old_perm = br->br_perm; -+ br->br_perm = new_perm; -+ hdir = NULL; -+ h_inode = NULL; -+ bindex = au_br_index(sb, br->br_id); -+ if (0 <= bindex) { -+ hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ } else { -+ h_dentry = au_br_dentry(br); -+ h_inode = d_inode(h_dentry); -+ inode_lock_nested(h_inode, AuLsc_I_PARENT); -+ } -+ if (!wbr) -+ err = au_wh_init(br, sb); -+ else { -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ wbr_wh_write_unlock(wbr); -+ } -+ if (hdir) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(h_inode); -+ vfsub_mnt_drop_write(au_br_mnt(br)); -+ br->br_perm = old_perm; -+ -+ if (!err && wbr && !au_br_writable(new_perm)) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ -+out: -+ return err; -+} -+ -+static int au_wbr_init(struct au_branch *br, struct super_block *sb, -+ int perm) -+{ -+ int err; -+ struct kstatfs kst; -+ struct au_wbr *wbr; -+ -+ wbr = br->br_wbr; -+ au_rw_init(&wbr->wbr_wh_rwsem); -+ atomic_set(&wbr->wbr_wh_running, 0); -+ -+ /* -+ * a limit for rmdir/rename a dir -+ * cf. AUFS_MAX_NAMELEN in include/uapi/linux/aufs_type.h -+ */ -+ err = vfs_statfs(&br->br_path, &kst); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (kst.f_namelen >= NAME_MAX) -+ err = au_br_init_wh(sb, br, perm); -+ else -+ pr_err("%pd(%s), unsupported namelen %ld\n", -+ au_br_dentry(br), -+ au_sbtype(au_br_dentry(br)->d_sb), kst.f_namelen); -+ -+out: -+ return err; -+} -+ -+/* initialize a new branch */ -+static int au_br_init(struct au_branch *br, struct super_block *sb, -+ struct au_opt_add *add) -+{ -+ int err; -+ struct au_branch *brbase; -+ struct file *xf; -+ struct inode *h_inode; -+ -+ err = 0; -+ br->br_perm = add->perm; -+ br->br_path = add->path; /* set first, path_get() later */ -+ spin_lock_init(&br->br_dykey_lock); -+ au_lcnt_init(&br->br_nfiles, /*release*/NULL); -+ au_lcnt_init(&br->br_count, /*release*/NULL); -+ br->br_id = au_new_br_id(sb); -+ AuDebugOn(br->br_id < 0); -+ -+ /* always, regardless the given option */ -+ err = au_dr_br_init(sb, br, &add->path); -+ if (unlikely(err)) -+ goto out_err; -+ -+ if (au_br_writable(add->perm)) { -+ err = au_wbr_init(br, sb, add->perm); -+ if (unlikely(err)) -+ goto out_err; -+ } -+ -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ brbase = au_sbr(sb, 0); -+ xf = au_xino_file(brbase->br_xino, /*idx*/-1); -+ AuDebugOn(!xf); -+ h_inode = d_inode(add->path.dentry); -+ err = au_xino_init_br(sb, br, h_inode->i_ino, &xf->f_path); -+ if (unlikely(err)) { -+ AuDebugOn(au_xino_file(br->br_xino, /*idx*/-1)); -+ goto out_err; -+ } -+ } -+ -+ sysaufs_br_init(br); -+ path_get(&br->br_path); -+ goto out; /* success */ -+ -+out_err: -+ memset(&br->br_path, 0, sizeof(br->br_path)); -+out: -+ return err; -+} -+ -+static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, -+ struct au_branch *br, aufs_bindex_t bbot, -+ aufs_bindex_t amount) -+{ -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ memmove(brp + 1, brp, sizeof(*brp) * amount); -+ *brp = br; -+ sbinfo->si_bbot++; -+ if (unlikely(bbot < 0)) -+ sbinfo->si_bbot = 0; -+} -+ -+static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); -+ au_h_dentry_init(hdp); -+ dinfo->di_bbot++; -+ if (unlikely(bbot < 0)) -+ dinfo->di_btop = 0; -+} -+ -+static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bbot, aufs_bindex_t amount) -+{ -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ memmove(hip + 1, hip, sizeof(*hip) * amount); -+ au_hinode_init(hip); -+ iinfo->ii_bbot++; -+ if (unlikely(bbot < 0)) -+ iinfo->ii_btop = 0; -+} -+ -+static void au_br_do_add(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bindex) -+{ -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode, *h_inode; -+ aufs_bindex_t bbot, amount; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ bbot = au_sbbot(sb); -+ amount = bbot + 1 - bindex; -+ h_dentry = au_br_dentry(br); -+ au_sbilist_lock(); -+ au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); -+ au_br_do_add_hdp(au_di(root), bindex, bbot, amount); -+ au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); -+ au_set_h_dptr(root, bindex, dget(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); -+ au_sbilist_unlock(); -+} -+ -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bbot, add_bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode; -+ struct au_branch *add_branch; -+ -+ root = sb->s_root; -+ root_inode = d_inode(root); -+ IMustLock(root_inode); -+ IiMustWriteLock(root_inode); -+ err = test_add(sb, add, remount); -+ if (unlikely(err < 0)) -+ goto out; -+ if (err) { -+ err = 0; -+ goto out; /* success */ -+ } -+ -+ bbot = au_sbbot(sb); -+ add_branch = au_br_alloc(sb, bbot + 2, add->perm); -+ err = PTR_ERR(add_branch); -+ if (IS_ERR(add_branch)) -+ goto out; -+ -+ err = au_br_init(add_branch, sb, add); -+ if (unlikely(err)) { -+ au_br_do_free(add_branch); -+ goto out; -+ } -+ -+ add_bindex = add->bindex; -+ sysaufs_brs_del(sb, add_bindex); /* remove successors */ -+ au_br_do_add(sb, add_branch, add_bindex); -+ sysaufs_brs_add(sb, add_bindex); /* append successors */ -+ dbgaufs_brs_add(sb, add_bindex, /*topdown*/0); /* rename successors */ -+ -+ h_dentry = add->path.dentry; -+ if (!add_bindex) { -+ au_cpup_attr_all(root_inode, /*force*/1); -+ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; -+ } else -+ au_add_nlink(root_inode, d_inode(h_dentry)); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static unsigned long long au_farray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct file **p, *f; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ -+ n = 0; -+ p = a; -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ f = finfo->fi_file; -+ if (file_count(f) -+ && !special_file(file_inode(f)->i_mode)) { -+ get_file(f); -+ *p++ = f; -+ n++; -+ AuDebugOn(n > max); -+ } -+ } -+ hlist_bl_unlock(files); -+ -+ return n; -+} -+ -+static struct file **au_farray_alloc(struct super_block *sb, -+ unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_nfiles, /*do_rev*/1); -+ return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL); -+} -+ -+static void au_farray_free(struct file **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ if (a[ull]) -+ fput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * delete a branch -+ */ -+ -+/* to show the line number, do not make it inlined function */ -+#define AuVerbose(do_info, fmt, ...) do { \ -+ if (do_info) \ -+ pr_info(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+static int au_test_ibusy(struct inode *inode, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return (inode && !S_ISDIR(inode->i_mode)) || btop == bbot; -+} -+ -+static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t btop, -+ aufs_bindex_t bbot) -+{ -+ return au_test_ibusy(d_inode(dentry), btop, bbot); -+} -+ -+/* -+ * test if the branch is deletable or not. -+ */ -+static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t btop, bbot; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; !err && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; !err && j < ndentry; j++) { -+ d = dpage->dentries[j]; -+ AuDebugOn(au_dcount(d) <= 0); -+ if (!au_digen_test(d, sigen)) { -+ di_read_lock_child(d, AuLock_IR); -+ if (unlikely(au_dbrange_test(d))) { -+ di_read_unlock(d, AuLock_IR); -+ continue; -+ } -+ } else { -+ di_write_lock_child(d); -+ if (unlikely(au_dbrange_test(d))) { -+ di_write_unlock(d); -+ continue; -+ } -+ err = au_reval_dpath(d, sigen); -+ if (!err) -+ di_downgrade_lock(d, AuLock_IR); -+ else { -+ di_write_unlock(d); -+ break; -+ } -+ } -+ -+ /* AuDbgDentry(d); */ -+ btop = au_dbtop(d); -+ bbot = au_dbbot(d); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_dptr(d, bindex) -+ && au_test_dbusy(d, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy %pd\n", d); -+ AuDbgDentry(d); -+ } -+ di_read_unlock(d, AuLock_IR); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int sigen, const unsigned int verbose) -+{ -+ int err; -+ unsigned long long max, ull; -+ struct inode *i, **array; -+ aufs_bindex_t btop, bbot; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ AuDbg("b%d\n", bindex); -+ for (ull = 0; !err && ull < max; ull++) { -+ i = array[ull]; -+ if (unlikely(!i)) -+ break; -+ if (i->i_ino == AUFS_ROOT_INO) -+ continue; -+ -+ /* AuDbgInode(i); */ -+ if (au_iigen(i, NULL) == sigen) -+ ii_read_lock_child(i); -+ else { -+ ii_write_lock_child(i); -+ err = au_refresh_hinode_self(i); -+ au_iigen_dec(i); -+ if (!err) -+ ii_downgrade_lock(i); -+ else { -+ ii_write_unlock(i); -+ break; -+ } -+ } -+ -+ btop = au_ibtop(i); -+ bbot = au_ibbot(i); -+ if (btop <= bindex -+ && bindex <= bbot -+ && au_h_iptr(i, bindex) -+ && au_test_ibusy(i, btop, bbot)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy i%lu\n", i->i_ino); -+ AuDbgInode(i); -+ } -+ ii_read_unlock(i); -+ } -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+static int test_children_busy(struct dentry *root, aufs_bindex_t bindex, -+ const unsigned int verbose) -+{ -+ int err; -+ unsigned int sigen; -+ -+ sigen = au_sigen(root->d_sb); -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = test_dentry_busy(root, bindex, sigen, verbose); -+ if (!err) -+ err = test_inode_busy(root->d_sb, bindex, sigen, verbose); -+ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ -+ -+ return err; -+} -+ -+static int test_dir_busy(struct file *file, aufs_bindex_t br_id, -+ struct file **to_free, int *idx) -+{ -+ int err; -+ unsigned char matched, root; -+ aufs_bindex_t bindex, bbot; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ err = 0; -+ root = IS_ROOT(file->f_path.dentry); -+ if (root) { -+ get_file(file); -+ to_free[*idx] = file; -+ (*idx)++; -+ goto out; -+ } -+ -+ matched = 0; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ matched = 1; -+ break; -+ } -+ } -+ if (matched) -+ err = -EBUSY; -+ -+out: -+ return err; -+} -+ -+static int test_file_busy(struct super_block *sb, aufs_bindex_t br_id, -+ struct file **to_free, int opened) -+{ -+ int err, idx; -+ unsigned long long ull, max; -+ aufs_bindex_t btop; -+ struct file *file, **array; -+ struct dentry *root; -+ struct au_hfile *hfile; -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ idx = 0; -+ root = sb->s_root; -+ di_write_unlock(root); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ btop = au_fbtop(file); -+ if (!d_is_dir(file->f_path.dentry)) { -+ hfile = &au_fi(file)->fi_htop; -+ if (hfile->hf_br->br_id == br_id) -+ err = -EBUSY; -+ } else -+ err = test_dir_busy(file, br_id, to_free, &idx); -+ fi_read_unlock(file); -+ if (unlikely(err)) -+ break; -+ } -+ di_write_lock_child(root); -+ au_farray_free(array, max); -+ AuDebugOn(idx > opened); -+ -+out: -+ return err; -+} -+ -+static void br_del_file(struct file **to_free, unsigned long long opened, -+ aufs_bindex_t br_id) -+{ -+ unsigned long long ull; -+ aufs_bindex_t bindex, btop, bbot, bfound; -+ struct file *file; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ -+ for (ull = 0; ull < opened; ull++) { -+ file = to_free[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ bfound = -1; -+ fidir = au_fi(file)->fi_hdir; -+ AuDebugOn(!fidir); -+ fi_write_lock(file); -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ if (!hfile->hf_file) -+ continue; -+ -+ if (hfile->hf_br->br_id == br_id) { -+ bfound = bindex; -+ break; -+ } -+ } -+ AuDebugOn(bfound < 0); -+ au_set_h_fptr(file, bfound, NULL); -+ if (bfound == btop) { -+ for (btop++; btop <= bbot; btop++) -+ if (au_hf_dir(file, btop)) { -+ au_set_fbtop(file, btop); -+ break; -+ } -+ } -+ fi_write_unlock(file); -+ } -+} -+ -+static void au_br_do_del_brp(struct au_sbinfo *sbinfo, -+ const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_branch **brp, **p; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ if (bindex < bbot) -+ memmove(brp, brp + 1, sizeof(*brp) * (bbot - bindex)); -+ sbinfo->si_branch[0 + bbot] = NULL; -+ sbinfo->si_bbot--; -+ -+ p = au_krealloc(sbinfo->si_branch, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ sbinfo->si_branch = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hdentry *hdp, *p; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = au_hdentry(dinfo, bindex); -+ if (bindex < bbot) -+ memmove(hdp, hdp + 1, sizeof(*hdp) * (bbot - bindex)); -+ /* au_h_dentry_init(au_hdentry(dinfo, bbot); */ -+ dinfo->di_bbot--; -+ -+ p = au_krealloc(dinfo->di_hdentry, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ dinfo->di_hdentry = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bbot) -+{ -+ struct au_hinode *hip, *p; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = au_hinode(iinfo, bindex); -+ if (bindex < bbot) -+ memmove(hip, hip + 1, sizeof(*hip) * (bbot - bindex)); -+ /* au_hinode_init(au_hinode(iinfo, bbot)); */ -+ iinfo->ii_bbot--; -+ -+ p = au_krealloc(iinfo->ii_hinode, sizeof(*p) * bbot, AuGFP_SBILIST, -+ /*may_shrink*/1); -+ if (p) -+ iinfo->ii_hinode = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root, *h_root; -+ struct inode *inode, *h_inode; -+ struct au_hinode *hinode; -+ -+ SiMustWriteLock(sb); -+ -+ root = sb->s_root; -+ inode = d_inode(root); -+ sbinfo = au_sbi(sb); -+ bbot = sbinfo->si_bbot; -+ -+ h_root = au_h_dptr(root, bindex); -+ hinode = au_hi(inode, bindex); -+ h_inode = au_igrab(hinode->hi_inode); -+ au_hiput(hinode); -+ -+ au_sbilist_lock(); -+ au_br_do_del_brp(sbinfo, bindex, bbot); -+ au_br_do_del_hdp(au_di(root), bindex, bbot); -+ au_br_do_del_hip(au_ii(inode), bindex, bbot); -+ au_sbilist_unlock(); -+ -+ /* ignore an error */ -+ au_dr_br_fin(sb, br); /* always, regardless the mount option */ -+ -+ dput(h_root); -+ iput(h_inode); -+ au_br_do_free(br); -+} -+ -+static unsigned long long empty_cb(struct super_block *sb, void *array, -+ unsigned long long max, void *arg) -+{ -+ return max; -+} -+ -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) -+{ -+ int err, rerr, i; -+ unsigned long long opened; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, br_id; -+ unsigned char do_wh, verbose; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root; -+ struct file **to_free; -+ -+ err = 0; -+ opened = 0; -+ to_free = NULL; -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, del->h_path.dentry); -+ if (bindex < 0) { -+ if (remount) -+ goto out; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", del->pathname); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = -EBUSY; -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ bbot = au_sbbot(sb); -+ if (unlikely(!bbot)) { -+ AuVerbose(verbose, "no more branches left\n"); -+ goto out; -+ } -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!path_equal(&br->br_path, &del->h_path)); -+ if (unlikely(au_lcnt_read(&br->br_count, /*do_rev*/1))) { -+ AuVerbose(verbose, "br %pd2 is busy now\n", del->h_path.dentry); -+ goto out; -+ } -+ -+ br_id = br->br_id; -+ opened = au_lcnt_read(&br->br_nfiles, /*do_rev*/1); -+ if (unlikely(opened)) { -+ to_free = au_array_alloc(&opened, empty_cb, sb, NULL); -+ err = PTR_ERR(to_free); -+ if (IS_ERR(to_free)) -+ goto out; -+ -+ err = test_file_busy(sb, br_id, to_free, opened); -+ if (unlikely(err)) { -+ AuVerbose(verbose, "%llu file(s) opened\n", opened); -+ goto out; -+ } -+ } -+ -+ wbr = br->br_wbr; -+ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); -+ if (do_wh) { -+ /* instead of WbrWhMustWriteLock(wbr) */ -+ SiMustWriteLock(sb); -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ } -+ -+ err = test_children_busy(root, bindex, verbose); -+ if (unlikely(err)) { -+ if (do_wh) -+ goto out_wh; -+ goto out; -+ } -+ -+ err = 0; -+ if (to_free) { -+ /* -+ * now we confirmed the branch is deletable. -+ * let's free the remaining opened dirs on the branch. -+ */ -+ di_write_unlock(root); -+ br_del_file(to_free, opened, br_id); -+ di_write_lock_child(root); -+ } -+ -+ sysaufs_brs_del(sb, bindex); /* remove successors */ -+ dbgaufs_xino_del(br); /* remove one */ -+ au_br_do_del(sb, bindex, br); -+ sysaufs_brs_add(sb, bindex); /* append successors */ -+ dbgaufs_brs_add(sb, bindex, /*topdown*/1); /* rename successors */ -+ -+ if (!bindex) { -+ au_cpup_attr_all(d_inode(root), /*force*/1); -+ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; -+ } else -+ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry)); -+ if (au_opt_test(mnt_flags, PLINK)) -+ au_plink_half_refresh(sb, br_id); -+ -+ goto out; /* success */ -+ -+out_wh: -+ /* revert */ -+ rerr = au_br_init_wh(sb, br, br->br_perm); -+ if (rerr) -+ pr_warn("failed re-creating base whiteout, %s. (%d)\n", -+ del->pathname, rerr); -+out: -+ if (to_free) -+ au_farray_free(to_free, opened); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_ibusy(struct super_block *sb, struct aufs_ibusy __user *arg) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ struct aufs_ibusy ibusy; -+ struct inode *inode, *h_inode; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = copy_from_user(&ibusy, arg, sizeof(ibusy)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&arg->h_ino, sizeof(arg->h_ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(ibusy.bindex < 0 || ibusy.bindex > au_sbbot(sb))) -+ goto out_unlock; -+ -+ err = 0; -+ ibusy.h_ino = 0; /* invalid */ -+ inode = ilookup(sb, ibusy.ino); -+ if (!inode -+ || inode->i_ino == AUFS_ROOT_INO -+ || au_is_bad_inode(inode)) -+ goto out_unlock; -+ -+ ii_read_lock_child(inode); -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop <= ibusy.bindex && ibusy.bindex <= bbot) { -+ h_inode = au_h_iptr(inode, ibusy.bindex); -+ if (h_inode && au_test_ibusy(inode, btop, bbot)) -+ ibusy.h_ino = h_inode->i_ino; -+ } -+ ii_read_unlock(inode); -+ iput(inode); -+ -+out_unlock: -+ si_read_unlock(sb); -+ if (!err) { -+ err = __put_user(ibusy.h_ino, &arg->h_ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ } -+out: -+ return err; -+} -+ -+long au_ibusy_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_ibusy(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * change a branch permission -+ */ -+ -+static void au_warn_ima(void) -+{ -+#ifdef CONFIG_IMA -+ /* since it doesn't support mark_files_ro() */ -+ AuWarn1("RW -> RO makes IMA to produce wrong message\n"); -+#endif -+} -+ -+static int do_need_sigen_inc(int a, int b) -+{ -+ return au_br_whable(a) && !au_br_whable(b); -+} -+ -+static int need_sigen_inc(int old, int new) -+{ -+ return do_need_sigen_inc(old, new) -+ || do_need_sigen_inc(new, old); -+} -+ -+static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, do_warn; -+ unsigned int mnt_flags; -+ unsigned long long ull, max; -+ aufs_bindex_t br_id; -+ unsigned char verbose, writer; -+ struct file *file, *hf, **array; -+ struct au_hfile *hfile; -+ struct inode *h_inode; -+ -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ -+ array = au_farray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ do_warn = 0; -+ br_id = au_sbr_id(sb, bindex); -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (unlikely(!file)) -+ break; -+ -+ /* AuDbg("%pD\n", file); */ -+ fi_read_lock(file); -+ if (unlikely(au_test_mmapped(file))) { -+ err = -EBUSY; -+ AuVerbose(verbose, "mmapped %pD\n", file); -+ AuDbgFile(file); -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ goto out_array; -+ } -+ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ if (!d_is_reg(file->f_path.dentry) -+ || !(file->f_mode & FMODE_WRITE) -+ || hfile->hf_br->br_id != br_id -+ || !(hf->f_mode & FMODE_WRITE)) -+ array[ull] = NULL; -+ else { -+ do_warn = 1; -+ get_file(file); -+ } -+ -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ fput(file); -+ } -+ -+ err = 0; -+ if (do_warn) -+ au_warn_ima(); -+ -+ for (ull = 0; ull < max; ull++) { -+ file = array[ull]; -+ if (!file) -+ continue; -+ -+ /* todo: already flushed? */ -+ /* -+ * fs/super.c:mark_files_ro() is gone, but aufs keeps its -+ * approach which resets f_mode and calls mnt_drop_write() and -+ * file_release_write() for each file, because the branch -+ * attribute in aufs world is totally different from the native -+ * fs rw/ro mode. -+ */ -+ /* fi_read_lock(file); */ -+ hfile = &au_fi(file)->fi_htop; -+ hf = hfile->hf_file; -+ /* fi_read_unlock(file); */ -+ spin_lock(&hf->f_lock); -+ writer = !!(hf->f_mode & FMODE_WRITER); -+ hf->f_mode &= ~(FMODE_WRITE | FMODE_WRITER); -+ spin_unlock(&hf->f_lock); -+ if (writer) { -+ h_inode = file_inode(hf); -+ if (hf->f_mode & FMODE_READ) -+ i_readcount_inc(h_inode); -+ put_write_access(h_inode); -+ __mnt_drop_write(hf->f_path.mnt); -+ } -+ } -+ -+out_array: -+ au_farray_free(array, max); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ struct dentry *root; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ root = sb->s_root; -+ bindex = au_find_dbindex(root, mod->h_root); -+ if (bindex < 0) { -+ if (remount) -+ return 0; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", mod->path); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = test_br(d_inode(mod->h_root), mod->perm, mod->path); -+ if (unlikely(err)) -+ goto out; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(mod->h_root != au_br_dentry(br)); -+ if (br->br_perm == mod->perm) -+ return 0; /* success */ -+ -+ /* pre-allocate for non-fhsm --> fhsm */ -+ bf = NULL; -+ if (!au_br_fhsm(br->br_perm) && au_br_fhsm(mod->perm)) { -+ err = au_fhsm_br_alloc(br); -+ if (unlikely(err)) -+ goto out; -+ bf = br->br_fhsm; -+ br->br_fhsm = NULL; -+ } -+ -+ if (au_br_writable(br->br_perm)) { -+ /* remove whiteout base */ -+ err = au_br_init_wh(sb, br, mod->perm); -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (!au_br_writable(mod->perm)) { -+ /* rw --> ro, file might be mmapped */ -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(d_inode(root)); -+ di_write_unlock(root); -+ err = au_br_mod_files_ro(sb, bindex); -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ if (unlikely(err)) { -+ rerr = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), -+ GFP_NOFS); -+ if (br->br_wbr) -+ rerr = au_wbr_init(br, sb, br->br_perm); -+ if (unlikely(rerr)) { -+ AuIOErr("nested error %d (%d)\n", -+ rerr, err); -+ br->br_perm = mod->perm; -+ } -+ } -+ } -+ } else if (au_br_writable(mod->perm)) { -+ /* ro --> rw */ -+ err = -ENOMEM; -+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS); -+ if (br->br_wbr) { -+ err = au_wbr_init(br, sb, mod->perm); -+ if (unlikely(err)) { -+ au_kfree_rcu(br->br_wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_bf; -+ -+ if (au_br_fhsm(br->br_perm)) { -+ if (!au_br_fhsm(mod->perm)) { -+ /* fhsm --> non-fhsm */ -+ au_br_fhsm_fin(br->br_fhsm); -+ au_kfree_rcu(br->br_fhsm); -+ br->br_fhsm = NULL; -+ } -+ } else if (au_br_fhsm(mod->perm)) -+ /* non-fhsm --> fhsm */ -+ br->br_fhsm = bf; -+ -+ *do_refresh |= need_sigen_inc(br->br_perm, mod->perm); -+ br->br_perm = mod->perm; -+ goto out; /* success */ -+ -+out_bf: -+ au_kfree_try_rcu(bf); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs) -+{ -+ int err; -+ struct kstatfs kstfs; -+ -+ err = vfs_statfs(&br->br_path, &kstfs); -+ if (!err) { -+ stfs->f_blocks = kstfs.f_blocks; -+ stfs->f_bavail = kstfs.f_bavail; -+ stfs->f_files = kstfs.f_files; -+ stfs->f_ffree = kstfs.f_ffree; -+ } -+ -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/branch.h linux-5.15.37-aufs/fs/aufs/branch.h ---- linux-5.15.37/fs/aufs/branch.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/branch.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,362 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * branch filesystems and xino for them -+ */ -+ -+#ifndef __AUFS_BRANCH_H__ -+#define __AUFS_BRANCH_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "dynop.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "super.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* a xino file */ -+struct au_xino { -+ struct file **xi_file; -+ unsigned int xi_nfile; -+ -+ struct { -+ spinlock_t spin; -+ ino_t *array; -+ int total; -+ /* reserved for future use */ -+ /* unsigned long *bitmap; */ -+ wait_queue_head_t wqh; -+ } xi_nondir; -+ -+ struct mutex xi_mtx; /* protects xi_file array */ -+ struct hlist_bl_head xi_writing; -+ -+ atomic_t xi_truncating; -+ -+ struct kref xi_kref; -+}; -+ -+/* File-based Hierarchical Storage Management */ -+struct au_br_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ struct mutex bf_lock; -+ unsigned long bf_jiffy; -+ struct aufs_stfs bf_stfs; -+ int bf_readable; -+#endif -+}; -+ -+/* members for writable branch only */ -+enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; -+struct au_wbr { -+ struct au_rwsem wbr_wh_rwsem; -+ struct dentry *wbr_wh[AuBrWh_Last]; -+ atomic_t wbr_wh_running; -+#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ -+#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ -+#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ -+ -+ /* mfs mode */ -+ unsigned long long wbr_bytes; -+}; -+ -+/* ext2 has 3 types of operations at least, ext3 has 4 */ -+#define AuBrDynOp (AuDyLast * 4) -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+/* support for asynchronous destruction */ -+struct au_br_hfsnotify { -+ struct fsnotify_group *hfsn_group; -+}; -+#endif -+ -+/* sysfs entries */ -+struct au_brsysfs { -+ char name[16]; -+ struct attribute attr; -+}; -+ -+enum { -+ AuBrSysfs_BR, -+ AuBrSysfs_BRID, -+ AuBrSysfs_Last -+}; -+ -+/* protected by superblock rwsem */ -+struct au_branch { -+ struct au_xino *br_xino; -+ -+ aufs_bindex_t br_id; -+ -+ int br_perm; -+ struct path br_path; -+ spinlock_t br_dykey_lock; -+ struct au_dykey *br_dykey[AuBrDynOp]; -+ au_lcnt_t br_nfiles; /* opened files */ -+ au_lcnt_t br_count; /* in-use for other */ -+ -+ struct au_wbr *br_wbr; -+ struct au_br_fhsm *br_fhsm; -+ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ struct au_br_hfsnotify *br_hfsn; -+#endif -+ -+#ifdef CONFIG_SYSFS -+ /* entries under sysfs per mount-point */ -+ struct au_brsysfs br_sysfs[AuBrSysfs_Last]; -+#endif -+ -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *br_dbgaufs; /* xino */ -+#endif -+ -+ struct au_dr_br br_dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct vfsmount *au_br_mnt(struct au_branch *br) -+{ -+ return br->br_path.mnt; -+} -+ -+static inline struct dentry *au_br_dentry(struct au_branch *br) -+{ -+ return br->br_path.dentry; -+} -+ -+static inline struct user_namespace *au_br_userns(struct au_branch *br) -+{ -+ return mnt_user_ns(br->br_path.mnt); -+} -+ -+static inline struct super_block *au_br_sb(struct au_branch *br) -+{ -+ return au_br_mnt(br)->mnt_sb; -+} -+ -+static inline int au_br_rdonly(struct au_branch *br) -+{ -+ return (sb_rdonly(au_br_sb(br)) -+ || !au_br_writable(br->br_perm)) -+ ? -EROFS : 0; -+} -+ -+static inline int au_br_hnotifyable(int brperm __maybe_unused) -+{ -+#ifdef CONFIG_AUFS_HNOTIFY -+ return !(brperm & AuBrPerm_RR); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_br_test_oflag(int oflag, struct au_branch *br) -+{ -+ int err, exec_flag; -+ -+ err = 0; -+ exec_flag = oflag & __FMODE_EXEC; -+ if (unlikely(exec_flag && path_noexec(&br->br_path))) -+ err = -EACCES; -+ -+ return err; -+} -+ -+static inline void au_xino_get(struct au_branch *br) -+{ -+ struct au_xino *xi; -+ -+ xi = br->br_xino; -+ if (xi) -+ kref_get(&xi->xi_kref); -+} -+ -+static inline int au_xino_count(struct au_branch *br) -+{ -+ int v; -+ struct au_xino *xi; -+ -+ v = 0; -+ xi = br->br_xino; -+ if (xi) -+ v = kref_read(&xi->xi_kref); -+ -+ return v; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* branch.c */ -+struct au_sbinfo; -+void au_br_free(struct au_sbinfo *sinfo); -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id); -+struct au_opt_add; -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); -+struct au_opt_del; -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); -+long au_ibusy_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_ibusy_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+struct au_opt_mod; -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_refresh); -+struct aufs_stfs; -+int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs); -+ -+/* xino.c */ -+static const loff_t au_loff_max = LLONG_MAX; -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry); -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop); -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src); -+struct au_xi_new { -+ struct au_xino *xi; /* switch between xino and xigen */ -+ int idx; -+ struct path *base; -+ struct file *copy_src; -+}; -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew); -+ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino); -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino); -+ssize_t xino_fread(struct file *file, void *buf, size_t size, loff_t *pos); -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos); -+ -+int au_xib_trunc(struct super_block *sb); -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin); -+ -+struct au_xino *au_xino_alloc(unsigned int nfile); -+int au_xino_put(struct au_branch *br); -+struct file *au_xino_file1(struct au_xino *xi); -+ -+struct au_opt_xino; -+void au_xino_clr(struct super_block *sb); -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount); -+struct file *au_xino_def(struct super_block *sb); -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t hino, -+ struct path *base); -+ -+ino_t au_xino_new_ino(struct super_block *sb); -+void au_xino_delete_inode(struct inode *inode, const int unlinked); -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx); -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx); -+ -+int au_xino_path(struct seq_file *seq, struct file *file); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* @idx is signed to accept -1 meaning the first file */ -+static inline struct file *au_xino_file(struct au_xino *xi, int idx) -+{ -+ struct file *file; -+ -+ file = NULL; -+ if (!xi) -+ goto out; -+ -+ if (idx >= 0) { -+ if (idx < xi->xi_nfile) -+ file = xi->xi_file[idx]; -+ } else -+ file = au_xino_file1(xi); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Superblock to branch */ -+static inline -+aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_id; -+} -+ -+static inline -+struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_mnt(au_sbr(sb, bindex)); -+} -+ -+static inline -+struct user_namespace *au_sbr_userns(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_userns(au_sbr(sb, bindex)); -+} -+ -+static inline -+struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_sb(au_sbr(sb, bindex)); -+} -+ -+static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_perm; -+} -+ -+static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_whable(au_sbr_perm(sb, bindex)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define wbr_wh_read_lock(wbr) au_rw_read_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_lock(wbr) au_rw_write_lock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_read_trylock(wbr) au_rw_read_trylock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock(wbr) au_rw_write_trylock(&(wbr)->wbr_wh_rwsem) -+/* -+#define wbr_wh_read_trylock_nested(wbr) \ -+ au_rw_read_trylock_nested(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_trylock_nested(wbr) \ -+ au_rw_write_trylock_nested(&(wbr)->wbr_wh_rwsem) -+*/ -+ -+#define wbr_wh_read_unlock(wbr) au_rw_read_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_write_unlock(wbr) au_rw_write_unlock(&(wbr)->wbr_wh_rwsem) -+#define wbr_wh_downgrade_lock(wbr) au_rw_dgrade_lock(&(wbr)->wbr_wh_rwsem) -+ -+#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&(wbr)->wbr_wh_rwsem) -+#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&(wbr)->wbr_wh_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_FHSM -+static inline void au_br_fhsm_init(struct au_br_fhsm *brfhsm) -+{ -+ mutex_init(&brfhsm->bf_lock); -+ brfhsm->bf_jiffy = 0; -+ brfhsm->bf_readable = 0; -+} -+ -+static inline void au_br_fhsm_fin(struct au_br_fhsm *brfhsm) -+{ -+ mutex_destroy(&brfhsm->bf_lock); -+} -+#else -+AuStubVoid(au_br_fhsm_init, struct au_br_fhsm *brfhsm) -+AuStubVoid(au_br_fhsm_fin, struct au_br_fhsm *brfhsm) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_BRANCH_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/cpup.c linux-5.15.37-aufs/fs/aufs/cpup.c ---- linux-5.15.37/fs/aufs/cpup.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/cpup.c 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,1446 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * copy-up functions, see wbr_policy.c for copy-down -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags) -+{ -+ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE -+ | S_NOATIME | S_NOCMTIME | S_AUTOMOUNT; -+ -+ BUILD_BUG_ON(sizeof(iflags) != sizeof(dst->i_flags)); -+ -+ dst->i_flags |= iflags & ~mask; -+ if (au_test_fs_notime(dst->i_sb)) -+ dst->i_flags |= S_NOATIME | S_NOCMTIME; -+} -+ -+void au_cpup_attr_timesizes(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ fsstack_copy_attr_times(inode, h_inode); -+ fsstack_copy_inode_size(inode, h_inode); -+} -+ -+void au_cpup_attr_nlink(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ -+ sb = inode->i_sb; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!force -+ && !S_ISDIR(h_inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode)) -+ return; -+ -+ /* -+ * 0 can happen in revalidating. -+ * h_inode->i_mutex may not be held here, but it is harmless since once -+ * i_nlink reaches 0, it will never become positive except O_TMPFILE -+ * case. -+ * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause -+ * the incorrect link count. -+ */ -+ set_nlink(inode, h_inode->i_nlink); -+ -+ /* -+ * fewer nlink makes find(1) noisy, but larger nlink doesn't. -+ * it may includes whplink directory. -+ */ -+ if (S_ISDIR(h_inode->i_mode)) { -+ bbot = au_ibbot(inode); -+ for (bindex++; bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) -+ au_add_nlink(inode, h_inode); -+ } -+ } -+} -+ -+void au_cpup_attr_changeable(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ inode->i_mode = h_inode->i_mode; -+ inode->i_uid = h_inode->i_uid; -+ inode->i_gid = h_inode->i_gid; -+ au_cpup_attr_timesizes(inode); -+ au_cpup_attr_flags(inode, h_inode->i_flags); -+} -+ -+void au_cpup_igen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ iinfo->ii_higen = h_inode->i_generation; -+ iinfo->ii_hsb1 = h_inode->i_sb; -+} -+ -+void au_cpup_attr_all(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); -+ inode->i_rdev = h_inode->i_rdev; -+ inode->i_blkbits = h_inode->i_blkbits; -+ au_cpup_igen(inode, h_inode); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ -+ -+/* keep the timestamps of the parent dir when cpup */ -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path) -+{ -+ struct inode *h_inode; -+ -+ dt->dt_dentry = dentry; -+ dt->dt_h_path = *h_path; -+ h_inode = d_inode(h_path->dentry); -+ dt->dt_atime = h_inode->i_atime; -+ dt->dt_mtime = h_inode->i_mtime; -+ /* smp_mb(); */ -+} -+ -+void au_dtime_revert(struct au_dtime *dt) -+{ -+ struct iattr attr; -+ int err; -+ -+ attr.ia_atime = dt->dt_atime; -+ attr.ia_mtime = dt->dt_mtime; -+ attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET -+ | ATTR_ATIME | ATTR_ATIME_SET; -+ -+ /* no delegation since this is a directory */ -+ err = vfsub_notify_change(&dt->dt_h_path, &attr, /*delegated*/NULL); -+ if (unlikely(err)) -+ pr_warn("restoring timestamps failed(%d). ignored\n", err); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* internal use only */ -+struct au_cpup_reg_attr { -+ int valid; -+ struct kstat st; -+ unsigned int iflags; /* inode->i_flags */ -+}; -+ -+static noinline_for_stack -+int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct path *h_src, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, sbits, icex; -+ unsigned int mnt_flags; -+ unsigned char verbose; -+ struct iattr ia; -+ struct path h_path; -+ struct inode *h_isrc, *h_idst; -+ struct kstat *h_st; -+ struct au_branch *br; -+ -+ br = au_sbr(dst->d_sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = au_h_dptr(dst, bindex); -+ h_idst = d_inode(h_path.dentry); -+ h_isrc = d_inode(h_src->dentry); -+ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID -+ | ATTR_ATIME | ATTR_MTIME -+ | ATTR_ATIME_SET | ATTR_MTIME_SET; -+ if (h_src_attr && h_src_attr->valid) { -+ h_st = &h_src_attr->st; -+ ia.ia_uid = h_st->uid; -+ ia.ia_gid = h_st->gid; -+ ia.ia_atime = h_st->atime; -+ ia.ia_mtime = h_st->mtime; -+ if (h_idst->i_mode != h_st->mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_st->mode; -+ } -+ sbits = !!(h_st->mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_src_attr->iflags); -+ } else { -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ ia.ia_atime = h_isrc->i_atime; -+ ia.ia_mtime = h_isrc->i_mtime; -+ if (h_idst->i_mode != h_isrc->i_mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ } -+ sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_isrc->i_flags); -+ } -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); -+ } -+ -+ icex = br->br_perm & AuBrAttr_ICEX; -+ if (!err) { -+ mnt_flags = au_mntflags(dst->d_sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ err = au_cpup_xattr(&h_path, h_src, icex, verbose); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, -+ char *buf, unsigned long blksize) -+{ -+ int err; -+ size_t sz, rbytes, wbytes; -+ unsigned char all_zero; -+ char *p, *zp; -+ struct inode *h_inode; -+ /* reduce stack usage */ -+ struct iattr *ia; -+ -+ zp = page_address(ZERO_PAGE(0)); -+ if (unlikely(!zp)) -+ return -ENOMEM; /* possible? */ -+ -+ err = 0; -+ all_zero = 0; -+ while (len) { -+ AuDbg("len %lld\n", len); -+ sz = blksize; -+ if (len < blksize) -+ sz = len; -+ -+ rbytes = 0; -+ /* todo: signal_pending? */ -+ while (!rbytes || err == -EAGAIN || err == -EINTR) { -+ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); -+ err = rbytes; -+ } -+ if (unlikely(err < 0)) -+ break; -+ -+ all_zero = 0; -+ if (len >= rbytes && rbytes == blksize) -+ all_zero = !memcmp(buf, zp, rbytes); -+ if (!all_zero) { -+ wbytes = rbytes; -+ p = buf; -+ while (wbytes) { -+ size_t b; -+ -+ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); -+ err = b; -+ /* todo: signal_pending? */ -+ if (unlikely(err == -EAGAIN || err == -EINTR)) -+ continue; -+ if (unlikely(err < 0)) -+ break; -+ wbytes -= b; -+ p += b; -+ } -+ if (unlikely(err < 0)) -+ break; -+ } else { -+ loff_t res; -+ -+ AuLabel(hole); -+ res = vfsub_llseek(dst, rbytes, SEEK_CUR); -+ err = res; -+ if (unlikely(res < 0)) -+ break; -+ } -+ len -= rbytes; -+ err = 0; -+ } -+ -+ /* the last block may be a hole */ -+ if (!err && all_zero) { -+ AuLabel(last hole); -+ -+ err = 1; -+ if (au_test_nfs(dst->f_path.dentry->d_sb)) { -+ /* nfs requires this step to make last hole */ -+ /* is this only nfs? */ -+ do { -+ /* todo: signal_pending? */ -+ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ if (err == 1) -+ dst->f_pos--; -+ } -+ -+ if (err == 1) { -+ ia = (void *)buf; -+ ia->ia_size = dst->f_pos; -+ ia->ia_valid = ATTR_SIZE | ATTR_FILE; -+ ia->ia_file = dst; -+ h_inode = file_inode(dst); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD2); -+ /* no delegation since it is just created */ -+ err = vfsub_notify_change(&dst->f_path, ia, -+ /*delegated*/NULL); -+ inode_unlock(h_inode); -+ } -+ } -+ -+ return err; -+} -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ unsigned long blksize; -+ unsigned char do_kfree; -+ char *buf; -+ struct super_block *h_sb; -+ -+ err = -ENOMEM; -+ h_sb = file_inode(dst)->i_sb; -+ blksize = h_sb->s_blocksize; -+ if (!blksize || PAGE_SIZE < blksize) -+ blksize = PAGE_SIZE; -+ AuDbg("blksize %lu\n", blksize); -+ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); -+ if (do_kfree) -+ buf = kmalloc(blksize, GFP_NOFS); -+ else -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ if (len > (1 << 22)) -+ AuDbg("copying a large file %lld\n", (long long)len); -+ -+ src->f_pos = 0; -+ dst->f_pos = 0; -+ err = au_do_copy_file(dst, src, len, buf, blksize); -+ if (do_kfree) { -+ AuDebugOn(!au_kfree_do_sz_test(blksize)); -+ au_kfree_do_rcu(buf); -+ } else -+ free_page((unsigned long)buf); -+ -+out: -+ return err; -+} -+ -+static int au_do_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ -+ /* XFS acquires inode_lock */ -+ if (!au_test_xfs(h_src_sb)) -+ err = au_copy_file(dst, src, len); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = au_copy_file(dst, src, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ -+ return err; -+} -+ -+static int au_clone_or_copy(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ loff_t lo; -+ struct super_block *h_src_sb; -+ struct inode *h_src_inode; -+ -+ h_src_inode = file_inode(src); -+ h_src_sb = h_src_inode->i_sb; -+ if (h_src_sb != file_inode(dst)->i_sb -+ || !dst->f_op->remap_file_range) { -+ err = au_do_copy(dst, src, len); -+ goto out; -+ } -+ -+ if (!au_test_nfs(h_src_sb)) { -+ inode_unlock_shared(h_src_inode); -+ lo = vfsub_clone_file_range(src, dst, len); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } else -+ lo = vfsub_clone_file_range(src, dst, len); -+ if (lo == len) { -+ err = 0; -+ goto out; /* success */ -+ } else if (lo >= 0) -+ /* todo: possible? */ -+ /* paritially succeeded */ -+ AuDbg("lo %lld, len %lld. Retrying.\n", lo, len); -+ else if (lo != -EOPNOTSUPP) { -+ /* older XFS has a condition in cloning */ -+ err = lo; -+ goto out; -+ } -+ -+ /* the backend fs on NFS may not support cloning */ -+ err = au_do_copy(dst, src, len); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * to support a sparse file which is opened with O_APPEND, -+ * we need to close the file. -+ */ -+static int au_cp_regular(struct au_cp_generic *cpg) -+{ -+ int err, i; -+ enum { SRC, DST }; -+ struct { -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ struct dentry *dentry; -+ int force_wr; -+ struct file *file; -+ } *f, file[] = { -+ { -+ .bindex = cpg->bsrc, -+ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, -+ }, -+ { -+ .bindex = cpg->bdst, -+ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, -+ .force_wr = !!au_ftest_cpup(cpg->flags, RWDST), -+ } -+ }; -+ struct au_branch *br; -+ struct super_block *sb, *h_src_sb; -+ struct inode *h_src_inode; -+ struct task_struct *tsk = current; -+ -+ /* bsrc branch can be ro/rw. */ -+ sb = cpg->dentry->d_sb; -+ f = file; -+ for (i = 0; i < 2; i++, f++) { -+ f->dentry = au_h_dptr(cpg->dentry, f->bindex); -+ f->file = au_h_open(cpg->dentry, f->bindex, f->flags, -+ /*file*/NULL, f->force_wr); -+ if (IS_ERR(f->file)) { -+ err = PTR_ERR(f->file); -+ if (i == SRC) -+ goto out; -+ else -+ goto out_src; -+ } -+ } -+ -+ /* try stopping to update while we copyup */ -+ h_src_inode = d_inode(file[SRC].dentry); -+ h_src_sb = h_src_inode->i_sb; -+ if (!au_test_nfs(h_src_sb)) -+ IMustLock(h_src_inode); -+ err = au_clone_or_copy(file[DST].file, file[SRC].file, cpg->len); -+ -+ /* i wonder if we had O_NO_DELAY_FPUT flag */ -+ if (tsk->flags & PF_KTHREAD) -+ __fput_sync(file[DST].file); -+ else { -+ /* it happened actually */ -+ fput(file[DST].file); -+ /* -+ * too bad. -+ * we have to call both since we don't know which place the file -+ * was added to. -+ */ -+ task_work_run(); -+ flush_delayed_fput(); -+ } -+ br = au_sbr(sb, file[DST].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ -+out_src: -+ fput(file[SRC].file); -+ br = au_sbr(sb, file[SRC].bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+static int au_do_cpup_regular(struct au_cp_generic *cpg, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err, rerr; -+ loff_t l; -+ struct path h_path; -+ struct inode *h_src_inode, *h_dst_inode; -+ -+ err = 0; -+ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); -+ l = i_size_read(h_src_inode); -+ if (cpg->len == -1 || l < cpg->len) -+ cpg->len = l; -+ if (cpg->len) { -+ /* try stopping to update while we are referencing */ -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ au_pin_hdir_unlock(cpg->pin); -+ -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc); -+ h_src_attr->iflags = h_src_inode->i_flags; -+ if (!au_test_nfs(h_src_inode->i_sb)) -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ else { -+ inode_unlock_shared(h_src_inode); -+ err = vfsub_getattr(&h_path, &h_src_attr->st); -+ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); -+ } -+ if (unlikely(err)) { -+ inode_unlock_shared(h_src_inode); -+ goto out; -+ } -+ h_src_attr->valid = 1; -+ if (!au_test_nfs(h_src_inode->i_sb)) { -+ err = au_cp_regular(cpg); -+ inode_unlock_shared(h_src_inode); -+ } else { -+ inode_unlock_shared(h_src_inode); -+ err = au_cp_regular(cpg); -+ } -+ rerr = au_pin_hdir_relock(cpg->pin); -+ if (!err && rerr) -+ err = rerr; -+ } -+ if (!err && (h_src_inode->i_state & I_LINKABLE)) { -+ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_dst_inode = d_inode(h_path.dentry); -+ spin_lock(&h_dst_inode->i_lock); -+ h_dst_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_dst_inode->i_lock); -+ } -+ -+out: -+ return err; -+} -+ -+static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, -+ struct inode *h_dir) -+{ -+ int err; -+ DEFINE_DELAYED_CALL(done); -+ const char *sym; -+ -+ sym = vfs_get_link(h_src, &done); -+ err = PTR_ERR(sym); -+ if (IS_ERR(sym)) -+ goto out; -+ -+ err = vfsub_symlink(h_dir, h_path, sym); -+ -+out: -+ do_delayed_call(&done); -+ return err; -+} -+ -+/* -+ * regardless 'acl' option, reset all ACL. -+ * All ACL will be copied up later from the original entry on the lower branch. -+ */ -+static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) -+{ -+ int err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = mnt_user_ns(h_path->mnt); -+ h_dentry = h_path->dentry; -+ h_inode = d_inode(h_dentry); -+ /* forget_all_cached_acls(h_inode)); */ -+ err = vfsub_removexattr(h_userns, h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (!err) -+ err = vfsub_acl_chmod(h_userns, h_inode, mode); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_cpup_dir(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct inode *h_dir, struct path *h_path) -+{ -+ int err; -+ struct inode *dir, *inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = mnt_user_ns(h_path->mnt); -+ err = vfsub_removexattr(h_userns, h_path->dentry, -+ XATTR_NAME_POSIX_ACL_DEFAULT); -+ AuTraceErr(err); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * strange behaviour from the users view, -+ * particularly setattr case -+ */ -+ dir = d_inode(dst_parent); -+ if (au_ibtop(dir) == cpg->bdst) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ inode = d_inode(cpg->dentry); -+ au_cpup_attr_nlink(inode, /*force*/1); -+ -+out: -+ return err; -+} -+ -+static noinline_for_stack -+int cpup_entry(struct au_cp_generic *cpg, struct dentry *dst_parent, -+ struct au_cpup_reg_attr *h_src_attr) -+{ -+ int err; -+ umode_t mode; -+ unsigned int mnt_flags; -+ unsigned char isdir, isreg, force; -+ const unsigned char do_dt = !!au_ftest_cpup(cpg->flags, DTIME); -+ struct au_dtime dt; -+ struct path h_path; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *h_inode, *h_dir; -+ struct super_block *sb; -+ -+ /* bsrc branch can be ro/rw. */ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ h_inode = d_inode(h_src); -+ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc)); -+ -+ /* try stopping to be referenced while we are creating */ -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ if (au_ftest_cpup(cpg->flags, RENAME)) -+ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX, -+ AUFS_WH_PFX_LEN)); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ AuDebugOn(h_parent != h_dst->d_parent); -+ -+ sb = cpg->dentry->d_sb; -+ h_path.mnt = au_sbr_mnt(sb, cpg->bdst); -+ if (do_dt) { -+ h_path.dentry = h_parent; -+ au_dtime_store(&dt, dst_parent, &h_path); -+ } -+ h_path.dentry = h_dst; -+ -+ isreg = 0; -+ isdir = 0; -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ isreg = 1; -+ err = vfsub_create(h_dir, &h_path, 0600, /*want_excl*/true); -+ if (!err) -+ err = au_do_cpup_regular(cpg, h_src_attr); -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ err = vfsub_mkdir(h_dir, &h_path, mode); -+ if (!err) -+ err = au_do_cpup_dir(cpg, dst_parent, h_dir, &h_path); -+ break; -+ case S_IFLNK: -+ err = au_do_cpup_symlink(&h_path, h_src, h_dir); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ AuDebugOn(!capable(CAP_MKNOD)); -+ fallthrough; -+ case S_IFIFO: -+ case S_IFSOCK: -+ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown inode type 0%o\n", mode); -+ err = -EIO; -+ } -+ if (!err) -+ err = au_reset_acl(h_dir, &h_path, mode); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, UDBA_NONE) -+ && !isdir -+ && au_opt_test(mnt_flags, XINO) -+ && (h_inode->i_nlink == 1 -+ || (h_inode->i_state & I_LINKABLE)) -+ /* todo: unnecessary? */ -+ /* && d_inode(cpg->dentry)->i_nlink == 1 */ -+ && cpg->bdst < cpg->bsrc -+ && !au_ftest_cpup(cpg->flags, KEEPLINO)) -+ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0); -+ /* ignore this error */ -+ -+ if (!err) { -+ force = 0; -+ if (isreg) { -+ force = !!cpg->len; -+ if (cpg->len == -1) -+ force = !!i_size_read(h_inode); -+ } -+ au_fhsm_wrote(sb, cpg->bdst, force); -+ } -+ -+ if (do_dt) -+ au_dtime_revert(&dt); -+ return err; -+} -+ -+static int au_do_ren_after_cpup(struct au_cp_generic *cpg, struct path *h_path) -+{ -+ 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); -+ au_set_h_dptr(dentry, bdst, NULL); -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (!err) -+ h_path->dentry = dget(au_h_dptr(dentry, bdst)); -+ au_set_h_dptr(dentry, bdst, h_dentry); -+ } else { -+ err = 0; -+ parent = dget_parent(dentry); -+ h_ppath.dentry = au_h_dptr(parent, bdst); -+ dput(parent); -+ h_path->dentry = vfsub_lkup_one(&dentry->d_name, &h_ppath); -+ if (IS_ERR(h_path->dentry)) -+ err = PTR_ERR(h_path->dentry); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ AuDbg("%pd %pd\n", h_dentry, h_path->dentry); -+ /* no delegation since it is just created */ -+ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*delegated*/NULL, -+ /*flags*/0); -+ dput(h_path->dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * copyup the @dentry from @bsrc to @bdst. -+ * the caller must set the both of lower dentries. -+ * @len is for truncating when it is -1 copyup the entire file. -+ * in link/rename cases, @dst_parent may be different from the real one. -+ * basic->bsrc can be larger than basic->bdst. -+ * aufs doesn't touch the credential so -+ * security_inode_copy_up{,_xattr}() are unnecessary. -+ */ -+static int au_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, rerr; -+ aufs_bindex_t old_ibtop; -+ unsigned char isdir, plink; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_src_path; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct path h_path; -+ struct au_cpup_reg_attr h_src_attr; -+ } *a; -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->h_src_attr.valid = 0; -+ -+ sb = cpg->dentry->d_sb; -+ br = au_sbr(sb, cpg->bdst); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); -+ inode = d_inode(cpg->dentry); -+ -+ if (!dst_parent) -+ dst_parent = dget_parent(cpg->dentry); -+ else -+ dget(dst_parent); -+ -+ plink = !!au_opt_test(au_mntflags(sb), PLINK); -+ dst_inode = au_h_iptr(inode, cpg->bdst); -+ if (dst_inode) { -+ if (unlikely(!plink)) { -+ err = -EIO; -+ AuIOErr("hi%lu(i%lu) exists on b%d " -+ "but plink is disabled\n", -+ dst_inode->i_ino, inode->i_ino, cpg->bdst); -+ goto out_parent; -+ } -+ -+ if (dst_inode->i_nlink) { -+ const int do_dt = au_ftest_cpup(cpg->flags, DTIME); -+ -+ h_src = au_plink_lkup(inode, cpg->bdst); -+ err = PTR_ERR(h_src); -+ if (IS_ERR(h_src)) -+ goto out_parent; -+ if (unlikely(d_is_negative(h_src))) { -+ err = -EIO; -+ AuIOErr("i%lu exists on b%d " -+ "but not pseudo-linked\n", -+ inode->i_ino, cpg->bdst); -+ dput(h_src); -+ goto out_parent; -+ } -+ -+ if (do_dt) { -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ } -+ -+ a->h_path.dentry = h_dst; -+ delegated = NULL; -+ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); -+ if (!err && au_ftest_cpup(cpg->flags, RENAME)) -+ err = au_do_ren_after_cpup(cpg, &a->h_path); -+ if (do_dt) -+ au_dtime_revert(&a->dt); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ dput(h_src); -+ goto out_parent; -+ } else -+ /* todo: cpup_wh_file? */ -+ /* udba work */ -+ au_update_ibrange(inode, /*do_put_zero*/1); -+ } -+ -+ isdir = S_ISDIR(inode->i_mode); -+ old_ibtop = au_ibtop(inode); -+ err = cpup_entry(cpg, dst_parent, &a->h_src_attr); -+ if (unlikely(err)) -+ goto out_rev; -+ dst_inode = d_inode(h_dst); -+ inode_lock_nested(dst_inode, AuLsc_I_CHILD2); -+ /* todo: necessary? */ -+ /* au_pin_hdir_unlock(cpg->pin); */ -+ -+ h_src_path.dentry = h_src; -+ h_src_path.mnt = au_sbr_mnt(sb, cpg->bsrc); -+ err = cpup_iattr(cpg->dentry, cpg->bdst, &h_src_path, &a->h_src_attr); -+ if (unlikely(err)) { -+ /* todo: necessary? */ -+ /* au_pin_hdir_relock(cpg->pin); */ /* ignore an error */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ -+ if (cpg->bdst < old_ibtop) { -+ if (S_ISREG(inode->i_mode)) { -+ err = au_dy_iaop(inode, cpg->bdst, dst_inode); -+ if (unlikely(err)) { -+ /* ignore an error */ -+ /* au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ goto out_rev; -+ } -+ } -+ au_set_ibtop(inode, cpg->bdst); -+ } else -+ au_set_ibbot(inode, cpg->bdst); -+ au_set_h_iptr(inode, cpg->bdst, au_igrab(dst_inode), -+ au_hi_flags(inode, isdir)); -+ -+ /* todo: necessary? */ -+ /* err = au_pin_hdir_relock(cpg->pin); */ -+ inode_unlock(dst_inode); -+ if (unlikely(err)) -+ goto out_rev; -+ -+ src_inode = d_inode(h_src); -+ if (!isdir -+ && (src_inode->i_nlink > 1 -+ || src_inode->i_state & I_LINKABLE) -+ && plink) -+ au_plink_append(inode, cpg->bdst, h_dst); -+ -+ if (au_ftest_cpup(cpg->flags, RENAME)) { -+ a->h_path.dentry = h_dst; -+ err = au_do_ren_after_cpup(cpg, &a->h_path); -+ } -+ if (!err) -+ goto out_parent; /* success */ -+ -+ /* revert */ -+out_rev: -+ a->h_path.dentry = h_parent; -+ au_dtime_store(&a->dt, dst_parent, &a->h_path); -+ a->h_path.dentry = h_dst; -+ rerr = 0; -+ if (d_is_positive(h_dst)) { -+ if (!isdir) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, -+ /*delegated*/NULL, /*force*/0); -+ } else -+ rerr = vfsub_rmdir(h_dir, &a->h_path); -+ } -+ au_dtime_revert(&a->dt); -+ if (rerr) { -+ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); -+ err = -EIO; -+ } -+out_parent: -+ dput(dst_parent); -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+#if 0 /* reserved */ -+struct au_cpup_single_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct dentry *dst_parent; -+}; -+ -+static void au_call_cpup_single(void *args) -+{ -+ struct au_cpup_single_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_single(a->cpg, a->dst_parent); -+ au_pin_hdir_release(a->cpg->pin); -+} -+#endif -+ -+/* -+ * prevent SIGXFSZ in copy-up. -+ * testing CAP_MKNOD is for generic fs, -+ * but CAP_FSETID is for xfs only, currently. -+ */ -+static int au_cpup_sio_test(struct au_pin *pin, umode_t mode) -+{ -+ int do_sio; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ do_sio = 0; -+ sb = au_pinned_parent(pin)->d_sb; -+ if (!au_wkq_test() -+ && (!au_sbi(sb)->si_plink_maint_pid -+ || au_plink_maint(sb, AuLock_NOPLM))) { -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ /* no condition about RLIMIT_FSIZE and the file size */ -+ do_sio = 1; -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ do_sio = !capable(CAP_MKNOD); -+ break; -+ } -+ if (!do_sio) -+ do_sio = ((mode & (S_ISUID | S_ISGID)) -+ && !capable(CAP_FSETID)); -+ /* this workaround may be removed in the future */ -+ if (!do_sio) { -+ h_dir = au_pinned_h_dir(pin); -+ do_sio = h_dir->i_mode & S_ISVTX; -+ } -+ } -+ -+ return do_sio; -+} -+ -+#if 0 /* reserved */ -+int au_sio_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc); -+ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode)) -+ err = au_cpup_single(cpg, dst_parent); -+ else { -+ struct au_cpup_single_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .dst_parent = dst_parent -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_single, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+#endif -+ -+/* -+ * copyup the @dentry from the first active lower branch to @bdst, -+ * using au_cpup_single(). -+ */ -+static int au_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err; -+ unsigned int flags_orig; -+ struct dentry *dentry; -+ -+ AuDebugOn(cpg->bsrc < 0); -+ -+ dentry = cpg->dentry; -+ DiMustWriteLock(dentry); -+ -+ err = au_lkup_neg(dentry, cpg->bdst, /*wh*/1); -+ if (!err) { -+ flags_orig = cpg->flags; -+ au_fset_cpup(cpg->flags, RENAME); -+ err = au_cpup_single(cpg, NULL); -+ cpg->flags = flags_orig; -+ if (!err) -+ return 0; /* success */ -+ -+ /* revert */ -+ au_set_h_dptr(dentry, cpg->bdst, NULL); -+ au_set_dbtop(dentry, cpg->bsrc); -+ } -+ -+ return err; -+} -+ -+struct au_cpup_simple_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+}; -+ -+static void au_call_cpup_simple(void *args) -+{ -+ struct au_cpup_simple_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_simple(a->cpg); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+static int au_do_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ int err, wkq_err; -+ struct dentry *dentry, *parent; -+ struct file *h_file; -+ struct inode *h_dir; -+ struct user_namespace *h_userns; -+ -+ dentry = cpg->dentry; -+ h_file = NULL; -+ if (au_ftest_cpup(cpg->flags, HOPEN)) { -+ AuDebugOn(cpg->bsrc < 0); -+ h_file = au_h_open_pre(dentry, cpg->bsrc, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ } -+ -+ parent = dget_parent(dentry); -+ h_dir = au_h_iptr(d_inode(parent), cpg->bdst); -+ h_userns = au_sbr_userns(dentry->d_sb, cpg->bdst); -+ if (!au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_simple(cpg); -+ else { -+ struct au_cpup_simple_args args = { -+ .errp = &err, -+ .cpg = cpg -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ dput(parent); -+ if (h_file) -+ au_h_open_post(dentry, cpg->bsrc, h_file); -+ -+out: -+ return err; -+} -+ -+int au_sio_cpup_simple(struct au_cp_generic *cpg) -+{ -+ aufs_bindex_t bsrc, bbot; -+ struct dentry *dentry, *h_dentry; -+ -+ if (cpg->bsrc < 0) { -+ dentry = cpg->dentry; -+ bbot = au_dbbot(dentry); -+ for (bsrc = cpg->bdst + 1; bsrc <= bbot; bsrc++) { -+ h_dentry = au_h_dptr(dentry, bsrc); -+ if (h_dentry) { -+ AuDebugOn(d_is_negative(h_dentry)); -+ break; -+ } -+ } -+ AuDebugOn(bsrc > bbot); -+ cpg->bsrc = bsrc; -+ } -+ AuDebugOn(cpg->bsrc <= cpg->bdst); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+int au_sio_cpdown_simple(struct au_cp_generic *cpg) -+{ -+ AuDebugOn(cpg->bdst <= cpg->bsrc); -+ return au_do_sio_cpup_simple(cpg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * copyup the deleted file for writing. -+ */ -+static int au_do_cpup_wh(struct au_cp_generic *cpg, struct dentry *wh_dentry, -+ struct file *file) -+{ -+ int err; -+ unsigned int flags_orig; -+ aufs_bindex_t bsrc_orig; -+ struct au_dinfo *dinfo; -+ struct { -+ struct au_hdentry *hd; -+ struct dentry *h_dentry; -+ } hdst, hsrc; -+ -+ dinfo = au_di(cpg->dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bsrc_orig = cpg->bsrc; -+ cpg->bsrc = dinfo->di_btop; -+ hdst.hd = au_hdentry(dinfo, cpg->bdst); -+ hdst.h_dentry = hdst.hd->hd_dentry; -+ hdst.hd->hd_dentry = wh_dentry; -+ dinfo->di_btop = cpg->bdst; -+ -+ hsrc.h_dentry = NULL; -+ if (file) { -+ hsrc.hd = au_hdentry(dinfo, cpg->bsrc); -+ hsrc.h_dentry = hsrc.hd->hd_dentry; -+ hsrc.hd->hd_dentry = au_hf_top(file)->f_path.dentry; -+ } -+ flags_orig = cpg->flags; -+ cpg->flags = !AuCpup_DTIME; -+ err = au_cpup_single(cpg, /*h_parent*/NULL); -+ cpg->flags = flags_orig; -+ if (file) { -+ if (!err) -+ err = au_reopen_nondir(file); -+ hsrc.hd->hd_dentry = hsrc.h_dentry; -+ } -+ hdst.hd->hd_dentry = hdst.h_dentry; -+ dinfo->di_btop = cpg->bsrc; -+ cpg->bsrc = bsrc_orig; -+ -+ return err; -+} -+ -+static int au_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err; -+ aufs_bindex_t bdst; -+ struct au_dtime dt; -+ struct dentry *dentry, *parent, *h_parent, *wh_dentry; -+ struct au_branch *br; -+ struct path h_path; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ br = au_sbr(dentry->d_sb, bdst); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ h_path.dentry = h_parent; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, parent, &h_path); -+ err = au_do_cpup_wh(cpg, wh_dentry, file); -+ if (unlikely(err)) -+ goto out_wh; -+ -+ dget(wh_dentry); -+ h_path.dentry = wh_dentry; -+ if (!d_is_dir(wh_dentry)) { -+ /* no delegation since it is just created */ -+ err = vfsub_unlink(d_inode(h_parent), &h_path, -+ /*delegated*/NULL, /*force*/0); -+ } else -+ err = vfsub_rmdir(d_inode(h_parent), &h_path); -+ if (unlikely(err)) { -+ AuIOErr("failed remove copied-up tmp file %pd(%d)\n", -+ wh_dentry, err); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+struct au_cpup_wh_args { -+ int *errp; -+ struct au_cp_generic *cpg; -+ struct file *file; -+}; -+ -+static void au_call_cpup_wh(void *args) -+{ -+ struct au_cpup_wh_args *a = args; -+ -+ au_pin_hdir_acquire_nest(a->cpg->pin); -+ *a->errp = au_cpup_wh(a->cpg, a->file); -+ au_pin_hdir_release(a->cpg->pin); -+} -+ -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file) -+{ -+ int err, wkq_err; -+ aufs_bindex_t bdst; -+ struct dentry *dentry, *parent, *h_orph, *h_parent; -+ struct inode *dir, *h_dir, *h_tmpdir; -+ struct au_wbr *wbr; -+ struct au_pin wh_pin, *pin_orig; -+ struct user_namespace *h_userns; -+ -+ dentry = cpg->dentry; -+ bdst = cpg->bdst; -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_orph = NULL; -+ h_parent = NULL; -+ h_dir = au_igrab(au_h_iptr(dir, bdst)); -+ h_tmpdir = h_dir; -+ pin_orig = NULL; -+ if (!h_dir->i_nlink) { -+ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; -+ h_orph = wbr->wbr_orph; -+ -+ h_parent = dget(au_h_dptr(parent, bdst)); -+ au_set_h_dptr(parent, bdst, dget(h_orph)); -+ h_tmpdir = d_inode(h_orph); -+ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); -+ -+ inode_lock_nested(h_tmpdir, AuLsc_I_PARENT3); -+ /* todo: au_h_open_pre()? */ -+ -+ pin_orig = cpg->pin; -+ au_pin_init(&wh_pin, dentry, bdst, AuLsc_DI_PARENT, -+ AuLsc_I_PARENT3, cpg->pin->udba, AuPin_DI_LOCKED); -+ cpg->pin = &wh_pin; -+ } -+ -+ h_userns = au_sbr_userns(dentry->d_sb, bdst); -+ if (!au_test_h_perm_sio(h_userns, h_tmpdir, MAY_EXEC | MAY_WRITE) -+ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) -+ err = au_cpup_wh(cpg, file); -+ else { -+ struct au_cpup_wh_args args = { -+ .errp = &err, -+ .cpg = cpg, -+ .file = file -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ if (h_orph) { -+ inode_unlock(h_tmpdir); -+ /* todo: au_h_open_post()? */ -+ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); -+ au_set_h_dptr(parent, bdst, h_parent); -+ AuDebugOn(!pin_orig); -+ cpg->pin = pin_orig; -+ } -+ iput(h_dir); -+ dput(parent); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generic routine for both of copy-up and copy-down. -+ */ -+/* cf. revalidate function in file.c */ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg) -+{ -+ int err; -+ struct au_pin pin; -+ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (IS_ROOT(parent)) -+ goto out; -+ -+ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, -+ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); -+ -+ /* do not use au_dpage */ -+ real_parent = parent; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ if (h_parent) -+ goto out; /* success */ -+ -+ /* find top dir which is necessary to cpup */ -+ do { -+ d = parent; -+ dput(parent); -+ parent = dget_parent(d); -+ di_read_lock_parent3(parent, !AuLock_IR); -+ h_parent = au_h_dptr(parent, bdst); -+ di_read_unlock(parent, !AuLock_IR); -+ } while (!h_parent); -+ -+ if (d != real_parent) -+ di_write_lock_child3(d); -+ -+ /* somebody else might create while we were sleeping */ -+ h_dentry = au_h_dptr(d, bdst); -+ if (!h_dentry || d_is_negative(h_dentry)) { -+ if (h_dentry) -+ au_update_dbtop(d); -+ -+ au_pin_set_dentry(&pin, d); -+ err = au_do_pin(&pin); -+ if (!err) { -+ err = cp(d, bdst, &pin, h_parent, arg); -+ au_unpin(&pin); -+ } -+ } -+ -+ if (d != real_parent) -+ di_write_unlock(d); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent __maybe_unused, -+ void *arg __maybe_unused) -+{ -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = bdst, -+ .bsrc = -1, -+ .len = 0, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ return au_sio_cpup_simple(&cpg); -+} -+ -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); -+} -+ -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ err = 0; -+ if (au_h_iptr(dir, bdst)) -+ goto out; -+ -+ di_read_unlock(parent, AuLock_IR); -+ di_write_lock_parent(parent); -+ /* someone else might change our inode while we were sleeping */ -+ if (!au_h_iptr(dir, bdst)) -+ err = au_cpup_dirs(dentry, bdst); -+ di_downgrade_lock(parent, AuLock_IR); -+ -+out: -+ dput(parent); -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/cpup.h linux-5.15.37-aufs/fs/aufs/cpup.h ---- linux-5.15.37/fs/aufs/cpup.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/cpup.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,87 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * copy-up/down functions -+ */ -+ -+#ifndef __AUFS_CPUP_H__ -+#define __AUFS_CPUP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct inode; -+struct file; -+struct au_pin; -+ -+void au_cpup_attr_flags(struct inode *dst, unsigned int iflags); -+void au_cpup_attr_timesizes(struct inode *inode); -+void au_cpup_attr_nlink(struct inode *inode, int force); -+void au_cpup_attr_changeable(struct inode *inode); -+void au_cpup_igen(struct inode *inode, struct inode *h_inode); -+void au_cpup_attr_all(struct inode *inode, int force); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_cp_generic { -+ struct dentry *dentry; -+ aufs_bindex_t bdst, bsrc; -+ loff_t len; -+ struct au_pin *pin; -+ unsigned int flags; -+}; -+ -+/* cpup flags */ -+#define AuCpup_DTIME 1 /* do dtime_store/revert */ -+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, -+ for link(2) */ -+#define AuCpup_RENAME (1 << 2) /* rename after cpup */ -+#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in -+ cpup */ -+#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the -+ existing entry */ -+#define AuCpup_RWDST (1 << 5) /* force write target even if -+ the branch is marked as RO */ -+ -+#ifndef CONFIG_AUFS_BR_HFSPLUS -+#undef AuCpup_HOPEN -+#define AuCpup_HOPEN 0 -+#endif -+ -+#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) -+#define au_fset_cpup(flags, name) \ -+ do { (flags) |= AuCpup_##name; } while (0) -+#define au_fclr_cpup(flags, name) \ -+ do { (flags) &= ~AuCpup_##name; } while (0) -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len); -+int au_sio_cpup_simple(struct au_cp_generic *cpg); -+int au_sio_cpdown_simple(struct au_cp_generic *cpg); -+int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file); -+ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg), -+ void *arg); -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* keep timestamps when copyup */ -+struct au_dtime { -+ struct dentry *dt_dentry; -+ struct path dt_h_path; -+ struct timespec64 dt_atime, dt_mtime; -+}; -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path); -+void au_dtime_revert(struct au_dtime *dt); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_CPUP_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dbgaufs.c linux-5.15.37-aufs/fs/aufs/dbgaufs.c ---- linux-5.15.37/fs/aufs/dbgaufs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dbgaufs.c 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,513 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#include -+#include "aufs.h" -+ -+#ifndef CONFIG_SYSFS -+#error DEBUG_FS depends upon SYSFS -+#endif -+ -+static struct dentry *dbgaufs; -+static const mode_t dbgaufs_mode = 0444; -+ -+/* 20 is max digits length of ulong 64 */ -+struct dbgaufs_arg { -+ int n; -+ char a[20 * 4]; -+}; -+ -+/* -+ * common function for all XINO files -+ */ -+static int dbgaufs_xi_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ void *p; -+ -+ p = file->private_data; -+ if (p) { -+ /* this is struct dbgaufs_arg */ -+ AuDebugOn(!au_kfree_sz_test(p)); -+ au_kfree_do_rcu(p); -+ } -+ return 0; -+} -+ -+static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt, -+ int cnt) -+{ -+ int err; -+ struct kstat st; -+ struct dbgaufs_arg *p; -+ -+ err = -ENOMEM; -+ p = kmalloc(sizeof(*p), GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ p->n = 0; -+ file->private_data = p; -+ if (!xf) -+ goto out; -+ -+ err = vfsub_getattr(&xf->f_path, &st); -+ if (!err) { -+ if (do_fcnt) -+ p->n = snprintf -+ (p->a, sizeof(p->a), "%d, %llux%u %lld\n", -+ cnt, st.blocks, st.blksize, -+ (long long)st.size); -+ else -+ p->n = snprintf(p->a, sizeof(p->a), "%llux%u %lld\n", -+ st.blocks, st.blksize, -+ (long long)st.size); -+ AuDebugOn(p->n >= sizeof(p->a)); -+ } else { -+ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dbgaufs_plink_arg { -+ int n; -+ char a[]; -+}; -+ -+static int dbgaufs_plink_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ free_page((unsigned long)file->private_data); -+ return 0; -+} -+ -+static int dbgaufs_plink_open(struct inode *inode, struct file *file) -+{ -+ int err, i, limit; -+ unsigned long n, sum; -+ struct dbgaufs_plink_arg *p; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct hlist_bl_head *hbl; -+ -+ err = -ENOMEM; -+ p = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = -EFBIG; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ limit = PAGE_SIZE - sizeof(p->n); -+ -+ /* the number of buckets */ -+ n = snprintf(p->a + p->n, limit, "%d\n", AuPlink_NHASH); -+ p->n += n; -+ limit -= n; -+ -+ sum = 0; -+ for (i = 0, hbl = sbinfo->si_plink; i < AuPlink_NHASH; -+ i++, hbl++) { -+ n = au_hbl_count(hbl); -+ sum += n; -+ -+ n = snprintf(p->a + p->n, limit, "%lu ", n); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } -+ p->a[p->n - 1] = '\n'; -+ -+ /* the sum of plinks */ -+ n = snprintf(p->a + p->n, limit, "%lu\n", sum); -+ p->n += n; -+ limit -= n; -+ if (unlikely(limit <= 0)) -+ goto out_free; -+ } else { -+#define str "1\n0\n0\n" -+ p->n = sizeof(str) - 1; -+ strcpy(p->a, str); -+#undef str -+ } -+ si_read_unlock(sb); -+ -+ err = 0; -+ file->private_data = p; -+ goto out; /* success */ -+ -+out_free: -+ free_page((unsigned long)p); -+out: -+ return err; -+} -+ -+static ssize_t dbgaufs_plink_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_plink_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+static const struct file_operations dbgaufs_plink_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_plink_open, -+ .release = dbgaufs_plink_release, -+ .read = dbgaufs_plink_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int dbgaufs_xib_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xib_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xib_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DbgaufsXi_PREFIX "xi" -+ -+static int dbgaufs_xino_open(struct inode *inode, struct file *file) -+{ -+ int err, idx; -+ long l; -+ aufs_bindex_t bindex; -+ char *p, a[sizeof(DbgaufsXi_PREFIX) + 8]; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct au_xino *xi; -+ struct file *xf; -+ struct qstr *name; -+ struct au_branch *br; -+ -+ err = -ENOENT; -+ name = &file->f_path.dentry->d_name; -+ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) -+ || memcmp(name->name, DbgaufsXi_PREFIX, -+ sizeof(DbgaufsXi_PREFIX) - 1))) -+ goto out; -+ -+ AuDebugOn(name->len >= sizeof(a)); -+ memcpy(a, name->name, name->len); -+ a[name->len] = '\0'; -+ p = strchr(a, '-'); -+ if (p) -+ *p = '\0'; -+ err = kstrtol(a + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ bindex = l; -+ idx = 0; -+ if (p) { -+ err = kstrtol(p + 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ idx = l; -+ } -+ -+ err = -ENOENT; -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (unlikely(bindex < 0 || bindex > au_sbbot(sb))) -+ goto out_si; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ if (unlikely(idx >= xi->xi_nfile)) -+ goto out_si; -+ xf = au_xino_file(xi, idx); -+ if (xf) -+ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1, -+ au_xino_count(br)); -+ -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xino_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xino_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+void dbgaufs_xino_del(struct au_branch *br) -+{ -+ struct dentry *dbgaufs; -+ -+ dbgaufs = br->br_dbgaufs; -+ if (!dbgaufs) -+ return; -+ -+ br->br_dbgaufs = NULL; -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ debugfs_remove(dbgaufs); -+ lockdep_on(); -+} -+ -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ aufs_bindex_t bbot; -+ struct au_branch *br; -+ -+ if (!au_sbi(sb)->si_dbgaufs) -+ return; -+ -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ dbgaufs_xino_del(br); -+ } -+} -+ -+static void dbgaufs_br_do_add(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int idx, struct dentry *parent, -+ struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct dentry *d; -+ /* "xi" bindex(5) "-" idx(2) NULL */ -+ char name[sizeof(DbgaufsXi_PREFIX) + 8]; -+ -+ if (!idx) -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); -+ else -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d-%u", -+ bindex, idx); -+ br = au_sbr(sb, bindex); -+ if (br->br_dbgaufs) { -+ struct qstr qstr = QSTR_INIT(name, strlen(name)); -+ -+ if (!au_qstreq(&br->br_dbgaufs->d_name, &qstr)) { -+ /* debugfs acquires the parent i_mutex */ -+ lockdep_off(); -+ d = debugfs_rename(parent, br->br_dbgaufs, parent, -+ name); -+ lockdep_on(); -+ if (unlikely(!d)) -+ pr_warn("failed renaming %pd/%s, ignored.\n", -+ parent, name); -+ } -+ } else { -+ lockdep_off(); -+ br->br_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, -+ sbinfo, &dbgaufs_xino_fop); -+ lockdep_on(); -+ if (unlikely(!br->br_dbgaufs)) -+ pr_warn("failed creating %pd/%s, ignored.\n", -+ parent, name); -+ } -+} -+ -+static void dbgaufs_br_add(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *parent, struct au_sbinfo *sbinfo) -+{ -+ struct au_branch *br; -+ struct au_xino *xi; -+ unsigned int u; -+ -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) -+ dbgaufs_br_do_add(sb, bindex, u, parent, sbinfo); -+} -+ -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *parent; -+ aufs_bindex_t bbot; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ parent = sbinfo->si_dbgaufs; -+ if (!parent) -+ return; -+ -+ bbot = au_sbbot(sb); -+ if (topdown) -+ for (; bindex <= bbot; bindex++) -+ dbgaufs_br_add(sb, bindex, parent, sbinfo); -+ else -+ for (; bbot >= bindex; bbot--) -+ dbgaufs_br_add(sb, bbot, parent, sbinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+static int dbgaufs_xigen_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0, /*cnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xigen_fop = { -+ .owner = THIS_MODULE, -+ .open = dbgaufs_xigen_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -EIO; -+ sbinfo->si_dbgaufs_xigen = debugfs_create_file -+ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xigen_fop); -+ if (sbinfo->si_dbgaufs_xigen) -+ err = 0; -+ -+ return err; -+} -+#else -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ return 0; -+} -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__fin' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ debugfs_remove_recursive(sbinfo->si_dbgaufs); -+ sbinfo->si_dbgaufs = NULL; -+} -+ -+int dbgaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ char name[SysaufsSiNameLen]; -+ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -ENOENT; -+ if (!dbgaufs) { -+ AuErr1("/debug/aufs is uninitialized\n"); -+ goto out; -+ } -+ -+ err = -EIO; -+ sysaufs_name(sbinfo, name); -+ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); -+ if (unlikely(!sbinfo->si_dbgaufs)) -+ goto out; -+ -+ /* regardless plink/noplink option */ -+ sbinfo->si_dbgaufs_plink = debugfs_create_file -+ ("plink", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_plink_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_plink)) -+ goto out_dir; -+ -+ /* regardless xino/noxino option */ -+ sbinfo->si_dbgaufs_xib = debugfs_create_file -+ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xib_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_xib)) -+ goto out_dir; -+ -+ err = dbgaufs_xigen_init(sbinfo); -+ if (!err) -+ goto out; /* success */ -+ -+out_dir: -+ dbgaufs_si_fin(sbinfo); -+out: -+ if (unlikely(err)) -+ pr_err("debugfs/aufs failed\n"); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_fin(void) -+{ -+ debugfs_remove(dbgaufs); -+} -+ -+int __init dbgaufs_init(void) -+{ -+ int err; -+ -+ err = -EIO; -+ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); -+ if (dbgaufs) -+ err = 0; -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/dbgaufs.h linux-5.15.37-aufs/fs/aufs/dbgaufs.h ---- linux-5.15.37/fs/aufs/dbgaufs.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dbgaufs.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,40 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#ifndef __DBGAUFS_H__ -+#define __DBGAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+struct super_block; -+struct au_sbinfo; -+struct au_branch; -+ -+#ifdef CONFIG_DEBUG_FS -+/* dbgaufs.c */ -+void dbgaufs_xino_del(struct au_branch *br); -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown); -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo); -+int dbgaufs_si_init(struct au_sbinfo *sbinfo); -+void dbgaufs_fin(void); -+int __init dbgaufs_init(void); -+#else -+AuStubVoid(dbgaufs_xino_del, struct au_branch *br) -+AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex, -+ int topdown) -+AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) -+AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) -+AuStubVoid(dbgaufs_fin, void) -+AuStubInt0(__init dbgaufs_init, void) -+#endif /* CONFIG_DEBUG_FS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __DBGAUFS_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dcsub.c linux-5.15.37-aufs/fs/aufs/dcsub.c ---- linux-5.15.37/fs/aufs/dcsub.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dcsub.c 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,212 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#include "aufs.h" -+ -+static void au_dpage_free(struct au_dpage *dpage) -+{ -+ int i; -+ struct dentry **p; -+ -+ p = dpage->dentries; -+ for (i = 0; i < dpage->ndentry; i++) -+ dput(*p++); -+ free_page((unsigned long)dpage->dentries); -+} -+ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) -+{ -+ int err; -+ void *p; -+ -+ err = -ENOMEM; -+ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); -+ if (unlikely(!dpages->dpages)) -+ goto out; -+ -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out_dpages; -+ -+ dpages->dpages[0].ndentry = 0; -+ dpages->dpages[0].dentries = p; -+ dpages->ndpage = 1; -+ return 0; /* success */ -+ -+out_dpages: -+ au_kfree_try_rcu(dpages->dpages); -+out: -+ return err; -+} -+ -+void au_dpages_free(struct au_dcsub_pages *dpages) -+{ -+ int i; -+ struct au_dpage *p; -+ -+ p = dpages->dpages; -+ for (i = 0; i < dpages->ndpage; i++) -+ au_dpage_free(p++); -+ au_kfree_try_rcu(dpages->dpages); -+} -+ -+static int au_dpages_append(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, gfp_t gfp) -+{ -+ int err, sz; -+ struct au_dpage *dpage; -+ void *p; -+ -+ dpage = dpages->dpages + dpages->ndpage - 1; -+ sz = PAGE_SIZE / sizeof(dentry); -+ if (unlikely(dpage->ndentry >= sz)) { -+ AuLabel(new dpage); -+ err = -ENOMEM; -+ sz = dpages->ndpage * sizeof(*dpages->dpages); -+ p = au_kzrealloc(dpages->dpages, sz, -+ sz + sizeof(*dpages->dpages), gfp, -+ /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpages->dpages = p; -+ dpage = dpages->dpages + dpages->ndpage; -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpage->ndentry = 0; -+ dpage->dentries = p; -+ dpages->ndpage++; -+ } -+ -+ AuDebugOn(au_dcount(dentry) <= 0); -+ dpage->dentries[dpage->ndentry++] = dget_dlock(dentry); -+ return 0; /* success */ -+ -+out: -+ return err; -+} -+ -+/* todo: BAD approach */ -+/* copied from linux/fs/dcache.c */ -+enum d_walk_ret { -+ D_WALK_CONTINUE, -+ D_WALK_QUIT, -+ D_WALK_NORETRY, -+ D_WALK_SKIP, -+}; -+ -+extern void d_walk(struct dentry *parent, void *data, -+ enum d_walk_ret (*enter)(void *, struct dentry *)); -+ -+struct ac_dpages_arg { -+ int err; -+ struct au_dcsub_pages *dpages; -+ struct super_block *sb; -+ au_dpages_test test; -+ void *arg; -+}; -+ -+static enum d_walk_ret au_call_dpages_append(void *_arg, struct dentry *dentry) -+{ -+ enum d_walk_ret ret; -+ struct ac_dpages_arg *arg = _arg; -+ -+ ret = D_WALK_CONTINUE; -+ if (dentry->d_sb == arg->sb -+ && !IS_ROOT(dentry) -+ && au_dcount(dentry) > 0 -+ && au_di(dentry) -+ && (!arg->test || arg->test(dentry, arg->arg))) { -+ arg->err = au_dpages_append(arg->dpages, dentry, GFP_ATOMIC); -+ if (unlikely(arg->err)) -+ ret = D_WALK_QUIT; -+ } -+ -+ return ret; -+} -+ -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg) -+{ -+ struct ac_dpages_arg args = { -+ .err = 0, -+ .dpages = dpages, -+ .sb = root->d_sb, -+ .test = test, -+ .arg = arg -+ }; -+ -+ d_walk(root, &args, au_call_dpages_append); -+ -+ return args.err; -+} -+ -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg) -+{ -+ int err; -+ -+ err = 0; -+ write_seqlock(&rename_lock); -+ spin_lock(&dentry->d_lock); -+ if (do_include -+ && au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * RCU for vfsmount is unnecessary since this is a traverse in a single -+ * mount -+ */ -+ while (!IS_ROOT(dentry)) { -+ dentry = dentry->d_parent; /* rename_lock is locked */ -+ spin_lock(&dentry->d_lock); -+ if (au_dcount(dentry) > 0 -+ && (!test || test(dentry, arg))) -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ spin_unlock(&dentry->d_lock); -+ if (unlikely(err)) -+ break; -+ } -+ -+out: -+ write_sequnlock(&rename_lock); -+ return err; -+} -+ -+static inline int au_dcsub_dpages_aufs(struct dentry *dentry, void *arg) -+{ -+ return au_di(dentry) && dentry->d_sb == arg; -+} -+ -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include) -+{ -+ return au_dcsub_pages_rev(dpages, dentry, do_include, -+ au_dcsub_dpages_aufs, dentry->d_sb); -+} -+ -+int au_test_subdir(struct dentry *d1, struct dentry *d2) -+{ -+ struct path path[2] = { -+ { -+ .dentry = d1 -+ }, -+ { -+ .dentry = d2 -+ } -+ }; -+ -+ return path_is_under(path + 0, path + 1); -+} -diff -Nurp linux-5.15.37/fs/aufs/dcsub.h linux-5.15.37-aufs/fs/aufs/dcsub.h ---- linux-5.15.37/fs/aufs/dcsub.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dcsub.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,124 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#ifndef __AUFS_DCSUB_H__ -+#define __AUFS_DCSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct au_dpage { -+ int ndentry; -+ struct dentry **dentries; -+}; -+ -+struct au_dcsub_pages { -+ int ndpage; -+ struct au_dpage *dpages; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dcsub.c */ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); -+void au_dpages_free(struct au_dcsub_pages *dpages); -+typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg); -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg); -+int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, int do_include); -+int au_test_subdir(struct dentry *d1, struct dentry *d2); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * todo: in linux-3.13, several similar (but faster) helpers are added to -+ * include/linux/dcache.h. Try them (in the future). -+ */ -+ -+static inline int au_d_hashed_positive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = 0; -+ if (unlikely(d_unhashed(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_d_linkable(struct dentry *d) -+{ -+ int err; -+ struct inode *inode = d_inode(d); -+ -+ err = au_d_hashed_positive(d); -+ if (err -+ && d_is_positive(d) -+ && (inode->i_state & I_LINKABLE)) -+ err = 0; -+ return err; -+} -+ -+static inline int au_d_alive(struct dentry *d) -+{ -+ int err; -+ struct inode *inode; -+ -+ err = 0; -+ if (!IS_ROOT(d)) -+ err = au_d_hashed_positive(d); -+ else { -+ inode = d_inode(d); -+ if (unlikely(d_unlinked(d) -+ || d_is_negative(d) -+ || !inode->i_nlink)) -+ err = -ENOENT; -+ } -+ return err; -+} -+ -+static inline int au_alive_dir(struct dentry *d) -+{ -+ int err; -+ -+ err = au_d_alive(d); -+ if (unlikely(err || IS_DEADDIR(d_inode(d)))) -+ err = -ENOENT; -+ return err; -+} -+ -+static inline int au_qstreq(struct qstr *a, struct qstr *b) -+{ -+ return a->len == b->len -+ && !memcmp(a->name, b->name, a->len); -+} -+ -+/* -+ * by the commit -+ * 360f547 2015-01-25 dcache: let the dentry count go down to zero without -+ * taking d_lock -+ * the type of d_lockref.count became int, but the inlined function d_count() -+ * still returns unsigned int. -+ * I don't know why. Maybe it is for every d_count() users? -+ * Anyway au_dcount() lives on. -+ */ -+static inline int au_dcount(struct dentry *d) -+{ -+ return (int)d_count(d); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DCSUB_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/debug.c linux-5.15.37-aufs/fs/aufs/debug.c ---- linux-5.15.37/fs/aufs/debug.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/debug.c 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,431 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* Returns 0, or -errno. arg is in kp->arg. */ -+static int param_atomic_t_set(const char *val, const struct kernel_param *kp) -+{ -+ int err, n; -+ -+ err = kstrtoint(val, 0, &n); -+ if (!err) { -+ if (n > 0) -+ au_debug_on(); -+ else -+ au_debug_off(); -+ } -+ return err; -+} -+ -+/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ -+static int param_atomic_t_get(char *buffer, const struct kernel_param *kp) -+{ -+ atomic_t *a; -+ -+ a = kp->arg; -+ return sprintf(buffer, "%d", atomic_read(a)); -+} -+ -+static struct kernel_param_ops param_ops_atomic_t = { -+ .set = param_atomic_t_set, -+ .get = param_atomic_t_get -+ /* void (*free)(void *arg) */ -+}; -+ -+atomic_t aufs_debug = ATOMIC_INIT(0); -+MODULE_PARM_DESC(debug, "debug print"); -+module_param_named(debug, aufs_debug, atomic_t, 0664); -+ -+DEFINE_MUTEX(au_dbg_mtx); /* just to serialize the dbg msgs */ -+char *au_plevel = KERN_DEBUG; -+#define dpri(fmt, ...) do { \ -+ if ((au_plevel \ -+ && strcmp(au_plevel, KERN_DEBUG)) \ -+ || au_debug_test()) \ -+ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dpri_whlist(struct au_nhash *whlist) -+{ -+ unsigned long ul, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; ul < n; ul++) { -+ hlist_for_each_entry(pos, head, wh_hash) -+ dpri("b%d, %.*s, %d\n", -+ pos->wh_bindex, -+ pos->wh_str.len, pos->wh_str.name, -+ pos->wh_str.len); -+ head++; -+ } -+} -+ -+void au_dpri_vdir(struct au_vdir *vdir) -+{ -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ unsigned char *o; -+ -+ if (!vdir || IS_ERR(vdir)) { -+ dpri("err %ld\n", PTR_ERR(vdir)); -+ return; -+ } -+ -+ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %llu\n", -+ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, -+ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); -+ for (ul = 0; ul < vdir->vd_nblk; ul++) { -+ p.deblk = vdir->vd_deblk[ul]; -+ o = p.deblk; -+ dpri("[%lu]: %p\n", ul, o); -+ } -+} -+ -+static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, -+ struct dentry *wh) -+{ -+ char *n = NULL; -+ int l = 0; -+ -+ if (!inode || IS_ERR(inode)) { -+ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); -+ return -1; -+ } -+ -+ /* the type of i_blocks depends upon CONFIG_LBDAF */ -+ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) -+ && sizeof(inode->i_blocks) != sizeof(u64)); -+ if (wh) { -+ n = (void *)wh->d_name.name; -+ l = wh->d_name.len; -+ } -+ -+ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," -+ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", -+ bindex, inode, -+ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", -+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, -+ i_size_read(inode), (unsigned long long)inode->i_blocks, -+ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff, -+ inode->i_mapping ? inode->i_mapping->nrpages : 0, -+ inode->i_state, inode->i_flags, inode_peek_iversion(inode), -+ inode->i_generation, -+ l ? ", wh " : "", l, n); -+ return 0; -+} -+ -+void au_dpri_inode(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ aufs_bindex_t bindex; -+ int err, hn; -+ -+ err = do_pri_inode(-1, inode, -1, NULL); -+ if (err || !au_test_aufs(inode->i_sb) || au_is_bad_inode(inode)) -+ return; -+ -+ iinfo = au_ii(inode); -+ dpri("i-1: btop %d, bbot %d, gen %d\n", -+ iinfo->ii_btop, iinfo->ii_bbot, au_iigen(inode, NULL)); -+ if (iinfo->ii_btop < 0) -+ return; -+ hn = 0; -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; bindex++) { -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ do_pri_inode(bindex, hi->hi_inode, hn, hi->hi_whdentry); -+ } -+} -+ -+void au_dpri_dalias(struct inode *inode) -+{ -+ struct dentry *d; -+ -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) -+ au_dpri_dentry(d); -+ spin_unlock(&inode->i_lock); -+} -+ -+static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) -+{ -+ struct dentry *wh = NULL; -+ int hn; -+ struct inode *inode; -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ -+ if (!dentry || IS_ERR(dentry)) { -+ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); -+ return -1; -+ } -+ /* do not call dget_parent() here */ -+ /* note: access d_xxx without d_lock */ -+ dpri("d%d: %p, %pd2?, %s, cnt %d, flags 0x%x, %shashed\n", -+ bindex, dentry, dentry, -+ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", -+ au_dcount(dentry), dentry->d_flags, -+ d_unhashed(dentry) ? "un" : ""); -+ hn = -1; -+ inode = NULL; -+ if (d_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (inode -+ && au_test_aufs(dentry->d_sb) -+ && bindex >= 0 -+ && !au_is_bad_inode(inode)) { -+ iinfo = au_ii(inode); -+ hi = au_hinode(iinfo, bindex); -+ hn = !!au_hn(hi); -+ wh = hi->hi_whdentry; -+ } -+ do_pri_inode(bindex, inode, hn, wh); -+ return 0; -+} -+ -+void au_dpri_dentry(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_dentry(-1, dentry); -+ if (err || !au_test_aufs(dentry->d_sb)) -+ return; -+ -+ dinfo = au_di(dentry); -+ if (!dinfo) -+ return; -+ dpri("d-1: btop %d, bbot %d, bwh %d, bdiropq %d, gen %d, tmp %d\n", -+ dinfo->di_btop, dinfo->di_bbot, -+ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry), -+ dinfo->di_tmpfile); -+ if (dinfo->di_btop < 0) -+ return; -+ for (bindex = dinfo->di_btop; bindex <= dinfo->di_bbot; bindex++) -+ do_pri_dentry(bindex, au_hdentry(dinfo, bindex)->hd_dentry); -+} -+ -+static int do_pri_file(aufs_bindex_t bindex, struct file *file) -+{ -+ char a[32]; -+ -+ if (!file || IS_ERR(file)) { -+ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); -+ return -1; -+ } -+ a[0] = 0; -+ if (bindex < 0 -+ && !IS_ERR_OR_NULL(file->f_path.dentry) -+ && au_test_aufs(file->f_path.dentry->d_sb) -+ && au_fi(file)) -+ snprintf(a, sizeof(a), ", gen %d, mmapped %d", -+ au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); -+ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", -+ bindex, file->f_mode, file->f_flags, (long)file_count(file), -+ file->f_version, file->f_pos, a); -+ if (!IS_ERR_OR_NULL(file->f_path.dentry)) -+ do_pri_dentry(bindex, file->f_path.dentry); -+ return 0; -+} -+ -+void au_dpri_file(struct file *file) -+{ -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hfile; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_file(-1, file); -+ if (err -+ || IS_ERR_OR_NULL(file->f_path.dentry) -+ || !au_test_aufs(file->f_path.dentry->d_sb)) -+ return; -+ -+ finfo = au_fi(file); -+ if (!finfo) -+ return; -+ if (finfo->fi_btop < 0) -+ return; -+ fidir = finfo->fi_hdir; -+ if (!fidir) -+ do_pri_file(finfo->fi_btop, finfo->fi_htop.hf_file); -+ else -+ for (bindex = finfo->fi_btop; -+ bindex >= 0 && bindex <= fidir->fd_bbot; -+ bindex++) { -+ hfile = fidir->fd_hfile + bindex; -+ do_pri_file(bindex, hfile ? hfile->hf_file : NULL); -+ } -+} -+ -+static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) -+{ -+ struct vfsmount *mnt; -+ struct super_block *sb; -+ -+ if (!br || IS_ERR(br)) -+ goto out; -+ mnt = au_br_mnt(br); -+ if (!mnt || IS_ERR(mnt)) -+ goto out; -+ sb = mnt->mnt_sb; -+ if (!sb || IS_ERR(sb)) -+ goto out; -+ -+ dpri("s%d: {perm 0x%x, id %d, wbr %p}, " -+ "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " -+ "xino %d\n", -+ bindex, br->br_perm, br->br_id, br->br_wbr, -+ au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), -+ sb->s_flags, sb->s_count, -+ atomic_read(&sb->s_active), -+ !!au_xino_file(br->br_xino, /*idx*/-1)); -+ return 0; -+ -+out: -+ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); -+ return -1; -+} -+ -+void au_dpri_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ aufs_bindex_t bindex; -+ int err; -+ /* to reduce stack size */ -+ struct { -+ struct vfsmount mnt; -+ struct au_branch fake; -+ } *a; -+ -+ /* this function can be called from magic sysrq */ -+ a = kzalloc(sizeof(*a), GFP_ATOMIC); -+ if (unlikely(!a)) { -+ dpri("no memory\n"); -+ return; -+ } -+ -+ a->mnt.mnt_sb = sb; -+ a->fake.br_path.mnt = &a->mnt; -+ err = do_pri_br(-1, &a->fake); -+ au_kfree_rcu(a); -+ dpri("dev 0x%x\n", sb->s_dev); -+ if (err || !au_test_aufs(sb)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ dpri("nw %d, gen %u, kobj %d\n", -+ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, -+ kref_read(&sbinfo->si_kobj.kref)); -+ for (bindex = 0; bindex <= sbinfo->si_bbot; bindex++) -+ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line) -+{ -+ struct inode *h_inode, *inode = d_inode(dentry); -+ struct dentry *h_dentry; -+ aufs_bindex_t bindex, bbot, bi; -+ -+ if (!inode /* || au_di(dentry)->di_lsc == AuLsc_DI_TMP */) -+ return; -+ -+ bbot = au_dbbot(dentry); -+ bi = au_ibbot(inode); -+ if (bi < bbot) -+ bbot = bi; -+ bindex = au_dbtop(dentry); -+ bi = au_ibtop(inode); -+ if (bi > bindex) -+ bindex = bi; -+ -+ for (; bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(h_inode != d_inode(h_dentry))) { -+ au_debug_on(); -+ AuDbg("b%d, %s:%d\n", bindex, func, line); -+ AuDbgDentry(dentry); -+ AuDbgInode(inode); -+ au_debug_off(); -+ if (au_test_fuse(h_inode->i_sb)) -+ WARN_ON_ONCE(1); -+ else -+ BUG(); -+ } -+ } -+} -+ -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) -+{ -+ int err, i, j; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ AuDebugOn(err); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/1); -+ AuDebugOn(err); -+ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ for (j = dpage->ndentry - 1; !err && j >= 0; j--) -+ AuDebugOn(au_digen_test(dentries[j], sigen)); -+ } -+ au_dpages_free(&dpages); -+} -+ -+void au_dbg_verify_kthread(void) -+{ -+ if (au_wkq_test()) { -+ au_dbg_blocked(); -+ /* -+ * It may be recursive, but udba=notify between two aufs mounts, -+ * where a single ro branch is shared, is not a problem. -+ */ -+ /* WARN_ON(1); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_debug_init(void) -+{ -+ aufs_bindex_t bindex; -+ struct au_vdir_destr destr; -+ -+ bindex = -1; -+ AuDebugOn(bindex >= 0); -+ -+ destr.len = -1; -+ AuDebugOn(destr.len < NAME_MAX); -+ -+#ifdef CONFIG_4KSTACKS -+ pr_warn("CONFIG_4KSTACKS is defined.\n"); -+#endif -+ -+ return 0; -+} -diff -Nurp linux-5.15.37/fs/aufs/debug.h linux-5.15.37-aufs/fs/aufs/debug.h ---- linux-5.15.37/fs/aufs/debug.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/debug.h 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,213 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#ifndef __AUFS_DEBUG_H__ -+#define __AUFS_DEBUG_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuDebugOn(a) BUG_ON(a) -+ -+/* module parameter */ -+extern atomic_t aufs_debug; -+static inline void au_debug_on(void) -+{ -+ atomic_inc(&aufs_debug); -+} -+static inline void au_debug_off(void) -+{ -+ atomic_dec_if_positive(&aufs_debug); -+} -+ -+static inline int au_debug_test(void) -+{ -+ return atomic_read(&aufs_debug) > 0; -+} -+#else -+#define AuDebugOn(a) do {} while (0) -+AuStubVoid(au_debug_on, void) -+AuStubVoid(au_debug_off, void) -+AuStubInt0(au_debug_test, void) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+#define param_check_atomic_t(name, p) __param_check(name, p, atomic_t) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* debug print */ -+ -+#define AuDbg(fmt, ...) do { \ -+ if (au_debug_test()) \ -+ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ -+} while (0) -+#define AuLabel(l) AuDbg(#l "\n") -+#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) -+#define AuWarn1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_warn(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_err(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuIOErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ AuIOErr(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuUnsupportMsg "This operation is not supported." \ -+ " Please report this application to aufs-users ML." -+#define AuUnsupport(fmt, ...) do { \ -+ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ -+ dump_stack(); \ -+} while (0) -+ -+#define AuTraceErr(e) do { \ -+ if (unlikely((e) < 0)) \ -+ AuDbg("err %d\n", (int)(e)); \ -+} while (0) -+ -+#define AuTraceErrPtr(p) do { \ -+ if (IS_ERR(p)) \ -+ AuDbg("err %ld\n", PTR_ERR(p)); \ -+} while (0) -+ -+/* dirty macros for debug print, use with "%.*s" and caution */ -+#define AuLNPair(qstr) (qstr)->len, (qstr)->name -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry; -+#ifdef CONFIG_AUFS_DEBUG -+extern struct mutex au_dbg_mtx; -+extern char *au_plevel; -+struct au_nhash; -+void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; -+void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; -+void au_dpri_inode(struct inode *inode); -+void au_dpri_dalias(struct inode *inode); -+void au_dpri_dentry(struct dentry *dentry); -+struct file; -+void au_dpri_file(struct file *filp); -+struct super_block; -+void au_dpri_sb(struct super_block *sb); -+ -+#define au_dbg_verify_dinode(d) __au_dbg_verify_dinode(d, __func__, __LINE__) -+void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line); -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); -+void au_dbg_verify_kthread(void); -+ -+int __init au_debug_init(void); -+ -+#define AuDbgWhlist(w) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#w "\n"); \ -+ au_dpri_whlist(w); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgVdir(v) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#v "\n"); \ -+ au_dpri_vdir(v); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgInode(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_inode(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDAlias(i) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#i "\n"); \ -+ au_dpri_dalias(i); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgDentry(d) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#d "\n"); \ -+ au_dpri_dentry(d); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgFile(f) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#f "\n"); \ -+ au_dpri_file(f); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSb(sb) do { \ -+ mutex_lock(&au_dbg_mtx); \ -+ AuDbg(#sb "\n"); \ -+ au_dpri_sb(sb); \ -+ mutex_unlock(&au_dbg_mtx); \ -+} while (0) -+ -+#define AuDbgSym(addr) do { \ -+ char sym[KSYM_SYMBOL_LEN]; \ -+ sprint_symbol(sym, (unsigned long)addr); \ -+ AuDbg("%s\n", sym); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry) -+AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) -+AuStubVoid(au_dbg_verify_kthread, void) -+AuStubInt0(__init au_debug_init, void) -+ -+#define AuDbgWhlist(w) do {} while (0) -+#define AuDbgVdir(v) do {} while (0) -+#define AuDbgInode(i) do {} while (0) -+#define AuDbgDAlias(i) do {} while (0) -+#define AuDbgDentry(d) do {} while (0) -+#define AuDbgFile(f) do {} while (0) -+#define AuDbgSb(sb) do {} while (0) -+#define AuDbgSym(addr) do {} while (0) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+int __init au_sysrq_init(void); -+void au_sysrq_fin(void); -+ -+#ifdef CONFIG_HW_CONSOLE -+#define au_dbg_blocked() do { \ -+ WARN_ON(1); \ -+ handle_sysrq('w'); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_blocked, void) -+#endif -+ -+#else -+AuStubInt0(__init au_sysrq_init, void) -+AuStubVoid(au_sysrq_fin, void) -+AuStubVoid(au_dbg_blocked, void) -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DEBUG_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dentry.c linux-5.15.37-aufs/fs/aufs/dentry.c ---- linux-5.15.37/fs/aufs/dentry.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dentry.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,1155 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * returns positive/negative dentry, NULL or an error. -+ * NULL means whiteout-ed or not-found. -+ */ -+static struct dentry* -+au_do_lookup(struct dentry *h_parent, struct dentry *dentry, -+ aufs_bindex_t bindex, struct au_do_lookup_args *args) -+{ -+ struct dentry *h_dentry; -+ 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); -+ const unsigned char ignore_perm = !!au_ftest_lkup(args->flags, -+ IGNORE_PERM); -+ -+ 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_path, &args->whname, -+ ignore_perm); -+ h_dentry = ERR_PTR(wh_found); -+ if (!wh_found) -+ goto real_lookup; -+ if (unlikely(wh_found < 0)) -+ goto out; -+ -+ /* We found a whiteout */ -+ /* au_set_dbbot(dentry, bindex); */ -+ au_set_dbwh(dentry, bindex); -+ if (!allow_neg) -+ return NULL; /* success */ -+ -+real_lookup: -+ if (!ignore_perm) -+ h_dentry = vfsub_lkup_one(args->name, &h_path); -+ else -+ 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) -+ h_dentry = NULL; -+ goto out; -+ } -+ -+ h_inode = d_inode(h_dentry); -+ if (d_is_negative(h_dentry)) { -+ if (!allow_neg) -+ goto out_neg; -+ } else if (wh_found -+ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) -+ goto out_neg; -+ else if (au_ftest_lkup(args->flags, DIRREN) -+ /* && h_inode */ -+ && !au_dr_lkup_h_ino(args, bindex, h_inode->i_ino)) { -+ AuDbg("b%d %pd ignored hi%llu\n", bindex, h_dentry, -+ (unsigned long long)h_inode->i_ino); -+ goto out_neg; -+ } -+ -+ if (au_dbbot(dentry) <= bindex) -+ au_set_dbbot(dentry, bindex); -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+ if (!d_is_dir(h_dentry) -+ || !wh_able -+ || (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_path); -+ inode_unlock_shared(h_inode); -+ if (opq > 0) -+ au_set_dbdiropq(dentry, bindex); -+ else if (unlikely(opq < 0)) { -+ au_set_h_dptr(dentry, bindex, NULL); -+ h_dentry = ERR_PTR(opq); -+ } -+ goto out; -+ -+out_neg: -+ dput(h_dentry); -+ h_dentry = NULL; -+out: -+ return h_dentry; -+} -+ -+static int au_test_shwh(struct super_block *sb, const struct qstr *name) -+{ -+ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) -+ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) -+ return -EPERM; -+ return 0; -+} -+ -+/* -+ * returns the number of lower positive dentries, -+ * otherwise an error. -+ * can be called at unlinking with @type is zero. -+ */ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags) -+{ -+ int npositive, err; -+ aufs_bindex_t bindex, btail, bdiropq; -+ unsigned char isdir, dirperm1, dirren; -+ struct au_do_lookup_args args = { -+ .flags = flags, -+ .name = &dentry->d_name -+ }; -+ struct dentry *parent; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = au_test_shwh(sb, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_wh_name_alloc(&args.whname, args.name); -+ if (unlikely(err)) -+ goto out; -+ -+ isdir = !!d_is_dir(dentry); -+ dirperm1 = !!au_opt_test(au_mntflags(sb), DIRPERM1); -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ if (dirren) -+ au_fset_lkup(args.flags, DIRREN); -+ -+ npositive = 0; -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ struct dentry *h_parent, *h_dentry; -+ struct inode *h_inode, *h_dir; -+ struct au_branch *br; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) { -+ if (d_is_positive(h_dentry)) -+ npositive++; -+ break; -+ } -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !d_is_dir(h_parent)) -+ continue; -+ -+ if (dirren) { -+ /* if the inum matches, then use the prepared name */ -+ err = au_dr_lkup_name(&args, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ h_dentry = au_do_lookup(h_parent, dentry, bindex, &args); -+ inode_unlock_shared(h_dir); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out_parent; -+ if (h_dentry) -+ au_fclr_lkup(args.flags, ALLOW_NEG); -+ if (dirperm1) -+ au_fset_lkup(args.flags, IGNORE_PERM); -+ -+ if (au_dbwh(dentry) == bindex) -+ break; -+ if (!h_dentry) -+ continue; -+ if (d_is_negative(h_dentry)) -+ continue; -+ h_inode = d_inode(h_dentry); -+ npositive++; -+ if (!args.type) -+ args.type = h_inode->i_mode & S_IFMT; -+ if (args.type != S_IFDIR) -+ break; -+ else if (isdir) { -+ /* the type of lower may be different */ -+ bdiropq = au_dbdiropq(dentry); -+ if (bdiropq >= 0 && bdiropq <= bindex) -+ break; -+ } -+ br = au_sbr(sb, bindex); -+ if (dirren -+ && au_dr_hino_test_add(&br->br_dirren, h_inode->i_ino, -+ /*add_ent*/NULL)) { -+ /* prepare next name to lookup */ -+ err = au_dr_lkup(&args, dentry, bindex); -+ if (unlikely(err)) -+ goto out_parent; -+ } -+ } -+ -+ if (npositive) { -+ AuLabel(positive); -+ au_update_dbtop(dentry); -+ } -+ err = npositive; -+ if (unlikely(!au_opt_test(au_mntflags(sb), UDBA_NONE) -+ && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuIOErr("both of real entry and whiteout found, %pd, err %d\n", -+ dentry, err); -+ } -+ -+out_parent: -+ dput(parent); -+ au_kfree_try_rcu(args.whname.name); -+ if (dirren) -+ au_dr_lkup_fin(&args); -+out: -+ return err; -+} -+ -+struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name, -+ struct path *ppath) -+{ -+ struct dentry *dentry; -+ int wkq_err; -+ -+ 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, -+ .ppath = ppath -+ }; -+ -+ wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args); -+ if (unlikely(wkq_err)) -+ dentry = ERR_PTR(wkq_err); -+ } -+ -+ return dentry; -+} -+ -+/* -+ * lookup @dentry on @bindex which should be negative. -+ */ -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh) -+{ -+ int err; -+ struct dentry *parent, *h_dentry; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ struct path h_ppath; -+ -+ parent = dget_parent(dentry); -+ 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_ppath.dentry, br, &dentry->d_name); -+ else -+ 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; -+ if (unlikely(d_is_positive(h_dentry))) { -+ err = -EIO; -+ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex); -+ dput(h_dentry); -+ goto out; -+ } -+ -+ err = 0; -+ if (bindex < au_dbtop(dentry)) -+ au_set_dbtop(dentry, bindex); -+ if (au_dbbot(dentry) < bindex) -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* subset of struct inode */ -+struct au_iattr { -+ unsigned long i_ino; -+ /* unsigned int i_nlink; */ -+ kuid_t i_uid; -+ kgid_t i_gid; -+ u64 i_version; -+/* -+ loff_t i_size; -+ blkcnt_t i_blocks; -+*/ -+ umode_t i_mode; -+}; -+ -+static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) -+{ -+ ia->i_ino = h_inode->i_ino; -+ /* ia->i_nlink = h_inode->i_nlink; */ -+ ia->i_uid = h_inode->i_uid; -+ ia->i_gid = h_inode->i_gid; -+ ia->i_version = inode_query_iversion(h_inode); -+/* -+ ia->i_size = h_inode->i_size; -+ ia->i_blocks = h_inode->i_blocks; -+*/ -+ ia->i_mode = (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) -+{ -+ return ia->i_ino != h_inode->i_ino -+ /* || ia->i_nlink != h_inode->i_nlink */ -+ || !uid_eq(ia->i_uid, h_inode->i_uid) -+ || !gid_eq(ia->i_gid, h_inode->i_gid) -+ || !inode_eq_iversion(h_inode, ia->i_version) -+/* -+ || ia->i_size != h_inode->i_size -+ || ia->i_blocks != h_inode->i_blocks -+*/ -+ || ia->i_mode != (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, -+ struct au_branch *br) -+{ -+ int err; -+ struct au_iattr ia; -+ struct inode *h_inode; -+ struct dentry *h_d; -+ struct super_block *h_sb; -+ struct path h_ppath; -+ -+ err = 0; -+ memset(&ia, -1, sizeof(ia)); -+ h_sb = h_dentry->d_sb; -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) { -+ h_inode = d_inode(h_dentry); -+ au_iattr_save(&ia, h_inode); -+ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) -+ /* nfs d_revalidate may return 0 for negative dentry */ -+ /* fuse d_revalidate always return 0 for negative dentry */ -+ goto out; -+ -+ /* main purpose is namei.c:cached_lookup() and d_revalidate */ -+ 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; -+ -+ err = 0; -+ if (unlikely(h_d != h_dentry -+ || d_inode(h_d) != h_inode -+ || (h_inode && au_iattr_test(&ia, h_inode)))) -+ err = au_busy_or_stale(); -+ dput(h_d); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (udba == AuOpt_UDBA_REVAL -+ && !au_test_fs_remote(h_dentry->d_sb)) { -+ IMustLock(h_dir); -+ err = (d_inode(h_dentry->d_parent) != h_dir); -+ } else if (udba != AuOpt_UDBA_NONE) -+ err = au_h_verify_dentry(h_dentry, h_parent, br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_refresh_hdentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err; -+ aufs_bindex_t new_bindex, bindex, bbot, bwh, bdiropq; -+ struct au_hdentry tmp, *p, *q; -+ struct au_dinfo *dinfo; -+ struct super_block *sb; -+ -+ DiMustWriteLock(dentry); -+ -+ sb = dentry->d_sb; -+ dinfo = au_di(dentry); -+ bbot = dinfo->di_bbot; -+ bwh = dinfo->di_bwh; -+ bdiropq = dinfo->di_bdiropq; -+ bindex = dinfo->di_btop; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) { -+ if (!p->hd_dentry) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hd_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (dinfo->di_bwh == bindex) -+ bwh = new_bindex; -+ if (dinfo->di_bdiropq == bindex) -+ bdiropq = new_bindex; -+ if (new_bindex < 0) { -+ au_hdput(p); -+ p->hd_dentry = NULL; -+ continue; -+ } -+ -+ /* swap two lower dentries, and loop again */ -+ q = au_hdentry(dinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hd_dentry) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ dinfo->di_bwh = -1; -+ if (bwh >= 0 && bwh <= au_sbbot(sb) && au_sbr_whable(sb, bwh)) -+ dinfo->di_bwh = bwh; -+ -+ dinfo->di_bdiropq = -1; -+ if (bdiropq >= 0 -+ && bdiropq <= au_sbbot(sb) -+ && au_sbr_whable(sb, bdiropq)) -+ dinfo->di_bdiropq = bdiropq; -+ -+ err = -EIO; -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ bbot = au_dbbot(parent); -+ bindex = 0; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, p++) -+ if (p->hd_dentry) { -+ dinfo->di_btop = bindex; -+ break; -+ } -+ -+ if (dinfo->di_btop >= 0) { -+ bindex = bbot; -+ p = au_hdentry(dinfo, bindex); -+ for (; bindex >= 0; bindex--, p--) -+ if (p->hd_dentry) { -+ dinfo->di_bbot = bindex; -+ err = 0; -+ break; -+ } -+ } -+ -+ return err; -+} -+ -+static void au_do_hide(struct dentry *dentry) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ if (!d_is_dir(dentry)) { -+ if (inode->i_nlink && !d_unhashed(dentry)) -+ drop_nlink(inode); -+ } else { -+ clear_nlink(inode); -+ /* stop next lookup */ -+ inode->i_flags |= S_DEAD; -+ } -+ smp_mb(); /* necessary? */ -+ } -+ d_drop(dentry); -+} -+ -+static int au_hide_children(struct dentry *parent) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *dentry; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, parent, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ /* in reverse order */ -+ for (i = dpages.ndpage - 1; i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = ndentry - 1; j >= 0; j--) { -+ dentry = dpage->dentries[j]; -+ if (dentry != parent) -+ au_do_hide(dentry); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static void au_hide(struct dentry *dentry) -+{ -+ int err; -+ -+ AuDbgDentry(dentry); -+ if (d_is_dir(dentry)) { -+ /* shrink_dcache_parent(dentry); */ -+ err = au_hide_children(dentry); -+ if (unlikely(err)) -+ AuIOErr("%pd, failed hiding children, ignored %d\n", -+ dentry, err); -+ } -+ au_do_hide(dentry); -+} -+ -+/* -+ * By adding a dirty branch, a cached dentry may be affected in various ways. -+ * -+ * a dirty branch is added -+ * - on the top of layers -+ * - in the middle of layers -+ * - to the bottom of layers -+ * -+ * on the added branch there exists -+ * - a whiteout -+ * - a diropq -+ * - a same named entry -+ * + exist -+ * * negative --> positive -+ * * positive --> positive -+ * - type is unchanged -+ * - type is changed -+ * + doesn't exist -+ * * negative --> negative -+ * * positive --> negative (rejected by au_br_del() for non-dir case) -+ * - none -+ */ -+static int au_refresh_by_dinfo(struct dentry *dentry, struct au_dinfo *dinfo, -+ struct au_dinfo *tmp) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct { -+ struct dentry *dentry; -+ struct inode *inode; -+ mode_t mode; -+ } orig_h, tmp_h = { -+ .dentry = NULL -+ }; -+ struct au_hdentry *hd; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ -+ err = 0; -+ AuDebugOn(dinfo->di_btop < 0); -+ orig_h.mode = 0; -+ orig_h.dentry = au_hdentry(dinfo, dinfo->di_btop)->hd_dentry; -+ orig_h.inode = NULL; -+ if (d_is_positive(orig_h.dentry)) { -+ orig_h.inode = d_inode(orig_h.dentry); -+ orig_h.mode = orig_h.inode->i_mode & S_IFMT; -+ } -+ if (tmp->di_btop >= 0) { -+ tmp_h.dentry = au_hdentry(tmp, tmp->di_btop)->hd_dentry; -+ if (d_is_positive(tmp_h.dentry)) { -+ tmp_h.inode = d_inode(tmp_h.dentry); -+ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT; -+ } -+ } -+ -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (!orig_h.inode) { -+ AuDbg("negative originally\n"); -+ if (inode) { -+ au_hide(dentry); -+ goto out; -+ } -+ AuDebugOn(inode); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ AuDebugOn(dinfo->di_bdiropq != -1); -+ -+ if (!tmp_h.inode) { -+ AuDbg("negative --> negative\n"); -+ /* should have only one negative lower */ -+ if (tmp->di_btop >= 0 -+ && tmp->di_btop < dinfo->di_btop) { -+ AuDebugOn(tmp->di_btop != tmp->di_bbot); -+ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); -+ au_set_h_dptr(dentry, dinfo->di_btop, NULL); -+ au_di_cp(dinfo, tmp); -+ hd = au_hdentry(tmp, tmp->di_btop); -+ au_set_h_dptr(dentry, tmp->di_btop, -+ dget(hd->hd_dentry)); -+ } -+ au_dbg_verify_dinode(dentry); -+ } else { -+ AuDbg("negative --> positive\n"); -+ /* -+ * similar to the behaviour of creating with bypassing -+ * aufs. -+ * unhash it in order to force an error in the -+ * succeeding create operation. -+ * we should not set S_DEAD here. -+ */ -+ d_drop(dentry); -+ /* au_di_swap(tmp, dinfo); */ -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive originally\n"); -+ /* inode may be NULL */ -+ AuDebugOn(inode && (inode->i_mode & S_IFMT) != orig_h.mode); -+ if (!tmp_h.inode) { -+ AuDbg("positive --> negative\n"); -+ /* or bypassing aufs */ -+ au_hide(dentry); -+ if (tmp->di_bwh >= 0 && tmp->di_bwh <= dinfo->di_btop) -+ dinfo->di_bwh = tmp->di_bwh; -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else if (orig_h.mode == tmp_h.mode) { -+ AuDbg("positive --> positive, same type\n"); -+ if (!S_ISDIR(orig_h.mode) -+ && dinfo->di_btop > tmp->di_btop) { -+ /* -+ * similar to the behaviour of removing and -+ * creating. -+ */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } else { -+ /* fill empty slots */ -+ if (dinfo->di_btop > tmp->di_btop) -+ dinfo->di_btop = tmp->di_btop; -+ if (dinfo->di_bbot < tmp->di_bbot) -+ dinfo->di_bbot = tmp->di_bbot; -+ dinfo->di_bwh = tmp->di_bwh; -+ dinfo->di_bdiropq = tmp->di_bdiropq; -+ bbot = dinfo->di_bbot; -+ bindex = tmp->di_btop; -+ hd = au_hdentry(tmp, bindex); -+ for (; bindex <= bbot; bindex++, hd++) { -+ if (au_h_dptr(dentry, bindex)) -+ continue; -+ h_dentry = hd->hd_dentry; -+ if (!h_dentry) -+ continue; -+ AuDebugOn(d_is_negative(h_dentry)); -+ h_inode = d_inode(h_dentry); -+ AuDebugOn(orig_h.mode -+ != (h_inode->i_mode -+ & S_IFMT)); -+ au_set_h_dptr(dentry, bindex, -+ dget(h_dentry)); -+ } -+ if (inode) -+ err = au_refresh_hinode(inode, dentry); -+ au_dbg_verify_dinode(dentry); -+ } -+ } else { -+ AuDbg("positive --> positive, different type\n"); -+ /* similar to the behaviour of removing and creating */ -+ au_hide(dentry); -+ if (inode) -+ err = au_refresh_hinode_self(inode); -+ au_dbg_verify_dinode(dentry); -+ } -+ } -+ -+out: -+ return err; -+} -+ -+void au_refresh_dop(struct dentry *dentry, int force_reval) -+{ -+ const struct dentry_operations *dop -+ = force_reval ? &aufs_dop : dentry->d_sb->s_d_op; -+ static const unsigned int mask -+ = DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE; -+ -+ BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags)); -+ -+ if (dentry->d_op == dop) -+ return; -+ -+ AuDbg("%pd\n", dentry); -+ spin_lock(&dentry->d_lock); -+ if (dop == &aufs_dop) -+ dentry->d_flags |= mask; -+ else -+ dentry->d_flags &= ~mask; -+ dentry->d_op = dop; -+ spin_unlock(&dentry->d_lock); -+} -+ -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent) -+{ -+ int err, ebrange, nbr; -+ unsigned int sigen; -+ struct au_dinfo *dinfo, *tmp; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ DiMustWriteLock(dentry); -+ AuDebugOn(IS_ROOT(dentry)); -+ AuDebugOn(d_really_is_negative(parent)); -+ -+ sb = dentry->d_sb; -+ sigen = au_sigen(sb); -+ err = au_digen_test(parent, sigen); -+ if (unlikely(err)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ dinfo = au_di(dentry); -+ err = au_di_realloc(dinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ ebrange = au_dbrange_test(dentry); -+ if (!ebrange) -+ ebrange = au_do_refresh_hdentry(dentry, parent); -+ -+ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) { -+ AuDebugOn(au_dbtop(dentry) < 0 && au_dbbot(dentry) >= 0); -+ if (d_really_is_positive(dentry)) { -+ inode = d_inode(dentry); -+ err = au_refresh_hinode_self(inode); -+ } -+ au_dbg_verify_dinode(dentry); -+ if (!err) -+ goto out_dgen; /* success */ -+ goto out; -+ } -+ -+ /* temporary dinfo */ -+ AuDbgDentry(dentry); -+ err = -ENOMEM; -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ /* -+ * if current working dir is removed, it returns an error. -+ * but the dentry is legal. -+ */ -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ AuDbgDentry(dentry); -+ au_di_swap(tmp, dinfo); -+ if (err == -ENOENT) -+ err = 0; -+ if (err >= 0) { -+ /* compare/refresh by dinfo */ -+ AuDbgDentry(dentry); -+ err = au_refresh_by_dinfo(dentry, dinfo, tmp); -+ au_dbg_verify_dinode(dentry); -+ AuTraceErr(err); -+ } -+ au_di_realloc(dinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err)) -+ goto out; -+ -+out_dgen: -+ au_update_digen(dentry); -+out: -+ if (unlikely(err && !(dentry->d_flags & DCACHE_NFSFS_RENAMED))) { -+ AuIOErr("failed refreshing %pd, %d\n", dentry, err); -+ AuDbgDentry(dentry); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_do_h_d_reval(struct dentry *h_dentry, unsigned int flags, -+ struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, valid; -+ -+ err = 0; -+ if (!(h_dentry->d_flags & DCACHE_OP_REVALIDATE)) -+ goto out; -+ -+ AuDbg("b%d\n", bindex); -+ /* -+ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, -+ * due to whiteout and branch permission. -+ */ -+ flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE -+ | LOOKUP_FOLLOW | LOOKUP_EXCL); -+ /* it may return tri-state */ -+ valid = h_dentry->d_op->d_revalidate(h_dentry, flags); -+ -+ if (unlikely(valid < 0)) -+ err = valid; -+ else if (!valid) -+ err = -EINVAL; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: remove this */ -+static int h_d_revalidate(struct dentry *dentry, struct inode *inode, -+ unsigned int flags, int do_udba, int dirren) -+{ -+ int err; -+ umode_t mode, h_mode; -+ aufs_bindex_t bindex, btail, btop, ibs, ibe; -+ unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; -+ struct inode *h_inode, *h_cached_inode; -+ struct dentry *h_dentry; -+ struct qstr *name, *h_name; -+ -+ err = 0; -+ plus = 0; -+ mode = 0; -+ ibs = -1; -+ ibe = -1; -+ unhashed = !!d_unhashed(dentry); -+ is_root = !!IS_ROOT(dentry); -+ name = &dentry->d_name; -+ tmpfile = au_di(dentry)->di_tmpfile; -+ -+ /* -+ * Theoretically, REVAL test should be unnecessary in case of -+ * {FS,I}NOTIFY. -+ * But {fs,i}notify doesn't fire some necessary events, -+ * IN_ATTRIB for atime/nlink/pageio -+ * Let's do REVAL test too. -+ */ -+ if (do_udba && inode) { -+ mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); -+ ibs = au_ibtop(inode); -+ ibe = au_ibbot(inode); -+ } -+ -+ btop = au_dbtop(dentry); -+ btail = btop; -+ if (inode && S_ISDIR(inode->i_mode)) -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ AuDbg("b%d, %pd\n", bindex, h_dentry); -+ h_nfs = !!au_test_nfs(h_dentry->d_sb); -+ spin_lock(&h_dentry->d_lock); -+ h_name = &h_dentry->d_name; -+ if (unlikely(do_udba -+ && !is_root -+ && ((!h_nfs -+ && (unhashed != !!d_unhashed(h_dentry) -+ || (!tmpfile && !dirren -+ && !au_qstreq(name, h_name)) -+ )) -+ || (h_nfs -+ && !(flags & LOOKUP_OPEN) -+ && (h_dentry->d_flags -+ & DCACHE_NFSFS_RENAMED))) -+ )) { -+ int h_unhashed; -+ -+ h_unhashed = d_unhashed(h_dentry); -+ spin_unlock(&h_dentry->d_lock); -+ AuDbg("unhash 0x%x 0x%x, %pd %pd\n", -+ unhashed, h_unhashed, dentry, h_dentry); -+ goto err; -+ } -+ spin_unlock(&h_dentry->d_lock); -+ -+ err = au_do_h_d_reval(h_dentry, flags, dentry, bindex); -+ if (unlikely(err)) -+ /* do not goto err, to keep the errno */ -+ break; -+ -+ /* todo: plink too? */ -+ if (!do_udba) -+ continue; -+ -+ /* UDBA tests */ -+ if (unlikely(!!inode != d_is_positive(h_dentry))) -+ goto err; -+ -+ h_inode = NULL; -+ if (d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ h_plus = plus; -+ h_mode = mode; -+ h_cached_inode = h_inode; -+ if (h_inode) { -+ h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); -+ } -+ if (inode && ibs <= bindex && bindex <= ibe) -+ h_cached_inode = au_h_iptr(inode, bindex); -+ -+ if (!h_nfs) { -+ if (unlikely(plus != h_plus && !tmpfile)) -+ goto err; -+ } else { -+ if (unlikely(!(h_dentry->d_flags & DCACHE_NFSFS_RENAMED) -+ && !is_root -+ && !IS_ROOT(h_dentry) -+ && unhashed != d_unhashed(h_dentry))) -+ goto err; -+ } -+ if (unlikely(mode != h_mode -+ || h_cached_inode != h_inode)) -+ goto err; -+ continue; -+ -+err: -+ err = -EINVAL; -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: consolidate with do_refresh() and au_reval_for_attr() */ -+static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ if (!au_digen_test(dentry, sigen)) -+ return 0; -+ -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ AuDebugOn(au_digen_test(parent, sigen)); -+ au_dbg_verify_gen(parent, sigen); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *d, *parent; -+ -+ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR)) -+ return simple_reval_dpath(dentry, sigen); -+ -+ /* slow loop, keep it simple and stupid */ -+ /* cf: au_cpup_dirs() */ -+ err = 0; -+ parent = NULL; -+ while (au_digen_test(dentry, sigen)) { -+ d = dentry; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(d); -+ if (!au_digen_test(parent, sigen)) -+ break; -+ d = parent; -+ } -+ -+ if (d != dentry) -+ di_write_lock_child2(d); -+ -+ /* someone might update our dentry while we were sleeping */ -+ if (au_digen_test(d, sigen)) { -+ /* -+ * todo: consolidate with simple_reval_dpath(), -+ * do_refresh() and au_reval_for_attr(). -+ */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(d, parent); -+ di_read_unlock(parent, AuLock_IR); -+ } -+ -+ if (d != dentry) -+ di_write_unlock(d); -+ dput(parent); -+ if (unlikely(err)) -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * if valid returns 1, otherwise 0. -+ */ -+static int aufs_d_revalidate(struct dentry *dentry, unsigned int flags) -+{ -+ int valid, err; -+ unsigned int sigen; -+ unsigned char do_udba, dirren; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ /* todo: support rcu-walk? */ -+ if (flags & LOOKUP_RCU) -+ return -ECHILD; -+ -+ valid = 0; -+ if (unlikely(!au_di(dentry))) -+ goto out; -+ -+ valid = 1; -+ sb = dentry->d_sb; -+ /* -+ * todo: very ugly -+ * i_mutex of parent dir may be held, -+ * but we should not return 'invalid' due to busy. -+ */ -+ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW | AuLock_NOPLM); -+ if (unlikely(err)) { -+ valid = err; -+ AuTraceErr(err); -+ goto out; -+ } -+ inode = NULL; -+ if (d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (unlikely(inode && au_is_bad_inode(inode))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ if (unlikely(au_dbrange_test(dentry))) { -+ err = -EINVAL; -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ -+ sigen = au_sigen(sb); -+ if (au_digen_test(dentry, sigen)) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_dpath(dentry, sigen); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ goto out_dgrade; -+ } -+ } -+ di_downgrade_lock(dentry, AuLock_IR); -+ -+ err = -EINVAL; -+ if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) -+ && inode -+ && !(inode->i_state && I_LINKABLE) -+ && (IS_DEADDIR(inode) || !inode->i_nlink)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ -+ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); -+ if (do_udba && inode) { -+ aufs_bindex_t btop = au_ibtop(inode); -+ struct inode *h_inode; -+ -+ if (btop >= 0) { -+ h_inode = au_h_iptr(inode, btop); -+ if (h_inode && au_test_higen(inode, h_inode)) { -+ AuTraceErr(err); -+ goto out_inval; -+ } -+ } -+ } -+ -+ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); -+ err = h_d_revalidate(dentry, inode, flags, do_udba, dirren); -+ if (unlikely(!err && do_udba && au_dbtop(dentry) < 0)) { -+ err = -EIO; -+ AuDbg("both of real entry and whiteout found, %p, err %d\n", -+ dentry, err); -+ } -+ goto out_inval; -+ -+out_dgrade: -+ di_downgrade_lock(dentry, AuLock_IR); -+out_inval: -+ aufs_read_unlock(dentry, AuLock_IR); -+ AuTraceErr(err); -+ valid = !err; -+out: -+ if (!valid) { -+ AuDbg("%pd invalid, %d\n", dentry, valid); -+ d_drop(dentry); -+ } -+ return valid; -+} -+ -+static void aufs_d_release(struct dentry *dentry) -+{ -+ if (au_di(dentry)) { -+ au_di_fin(dentry); -+ au_hn_di_reinit(dentry); -+ } -+} -+ -+const struct dentry_operations aufs_dop = { -+ .d_revalidate = aufs_d_revalidate, -+ .d_weak_revalidate = aufs_d_revalidate, -+ .d_release = aufs_d_release -+}; -+ -+/* aufs_dop without d_revalidate */ -+const struct dentry_operations aufs_dop_noreval = { -+ .d_release = aufs_d_release -+}; -diff -Nurp linux-5.15.37/fs/aufs/dentry.h linux-5.15.37-aufs/fs/aufs/dentry.h ---- linux-5.15.37/fs/aufs/dentry.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dentry.h 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,256 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#ifndef __AUFS_DENTRY_H__ -+#define __AUFS_DENTRY_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dirren.h" -+#include "rwsem.h" -+ -+struct au_hdentry { -+ struct dentry *hd_dentry; -+ aufs_bindex_t hd_id; -+}; -+ -+struct au_dinfo { -+ atomic_t di_generation; -+ -+ struct au_rwsem di_rwsem; -+ aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; -+ unsigned char di_tmpfile; /* to allow the different name */ -+ struct au_hdentry *di_hdentry; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* flags for au_lkup_dentry() */ -+#define AuLkup_ALLOW_NEG 1 -+#define AuLkup_IGNORE_PERM (1 << 1) -+#define AuLkup_DIRREN (1 << 2) -+#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) -+#define au_fset_lkup(flags, name) \ -+ do { (flags) |= AuLkup_##name; } while (0) -+#define au_fclr_lkup(flags, name) \ -+ do { (flags) &= ~AuLkup_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuLkup_DIRREN -+#define AuLkup_DIRREN 0 -+#endif -+ -+struct au_do_lookup_args { -+ unsigned int flags; -+ mode_t type; -+ struct qstr whname, *name; -+ struct au_dr_lookup dirren; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dentry.c */ -+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 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); -+ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, -+ unsigned int flags); -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh); -+int au_refresh_dentry(struct dentry *dentry, struct dentry *parent); -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen); -+void au_refresh_dop(struct dentry *dentry, int force_reval); -+ -+/* dinfo.c */ -+void au_di_init_once(void *_di); -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc); -+void au_di_free(struct au_dinfo *dinfo); -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b); -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src); -+int au_di_init(struct dentry *dentry); -+void au_di_fin(struct dentry *dentry); -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink); -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc); -+void di_read_unlock(struct dentry *d, int flags); -+void di_downgrade_lock(struct dentry *d, int flags); -+void di_write_lock(struct dentry *d, unsigned int lsc); -+void di_write_unlock(struct dentry *d); -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex); -+aufs_bindex_t au_dbtail(struct dentry *dentry); -+aufs_bindex_t au_dbtaildir(struct dentry *dentry); -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+int au_digen_test(struct dentry *dentry, unsigned int sigen); -+int au_dbrange_test(struct dentry *dentry); -+void au_update_digen(struct dentry *dentry); -+void au_update_dbrange(struct dentry *dentry, int do_put_zero); -+void au_update_dbtop(struct dentry *dentry); -+void au_update_dbbot(struct dentry *dentry); -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_dinfo *au_di(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for dinfo */ -+enum { -+ AuLsc_DI_CHILD, /* child first */ -+ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_DI_CHILD3, /* copyup dirs */ -+ AuLsc_DI_PARENT, -+ AuLsc_DI_PARENT2, -+ AuLsc_DI_PARENT3, -+ AuLsc_DI_TMP /* temp for replacing dinfo */ -+}; -+ -+/* -+ * di_read_lock_child, di_write_lock_child, -+ * di_read_lock_child2, di_write_lock_child2, -+ * di_read_lock_child3, di_write_lock_child3, -+ * di_read_lock_parent, di_write_lock_parent, -+ * di_read_lock_parent2, di_write_lock_parent2, -+ * di_read_lock_parent3, di_write_lock_parent3, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void di_read_lock_##name(struct dentry *d, int flags) \ -+{ di_read_lock(d, flags, AuLsc_DI_##lsc); } -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void di_write_lock_##name(struct dentry *d) \ -+{ di_write_lock(d, AuLsc_DI_##lsc); } -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) -+#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) -+#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_digen(struct dentry *d) -+{ -+ return atomic_read(&au_di(d)->di_generation); -+} -+ -+static inline void au_h_dentry_init(struct au_hdentry *hdentry) -+{ -+ hdentry->hd_dentry = NULL; -+} -+ -+static inline struct au_hdentry *au_hdentry(struct au_dinfo *di, -+ aufs_bindex_t bindex) -+{ -+ return di->di_hdentry + bindex; -+} -+ -+static inline void au_hdput(struct au_hdentry *hd) -+{ -+ if (hd) -+ dput(hd->hd_dentry); -+} -+ -+static inline aufs_bindex_t au_dbtop(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_btop; -+} -+ -+static inline aufs_bindex_t au_dbbot(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bbot; -+} -+ -+static inline aufs_bindex_t au_dbwh(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bwh; -+} -+ -+static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bdiropq; -+} -+ -+/* todo: hard/soft set? */ -+static inline void au_set_dbtop(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_btop = bindex; -+} -+ -+static inline void au_set_dbbot(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bbot = bindex; -+} -+ -+static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ /* dbwh can be outside of btop - bbot range */ -+ au_di(dentry)->di_bwh = bindex; -+} -+ -+static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bdiropq = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_HNOTIFY -+static inline void au_digen_dec(struct dentry *d) -+{ -+ atomic_dec(&au_di(d)->di_generation); -+} -+ -+static inline void au_hn_di_reinit(struct dentry *dentry) -+{ -+ dentry->d_fsdata = NULL; -+} -+#else -+AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DENTRY_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dinfo.c linux-5.15.37-aufs/fs/aufs/dinfo.c ---- linux-5.15.37/fs/aufs/dinfo.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dinfo.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,541 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * dentry private data -+ */ -+ -+#include "aufs.h" -+ -+void au_di_init_once(void *_dinfo) -+{ -+ struct au_dinfo *dinfo = _dinfo; -+ -+ au_rw_init(&dinfo->di_rwsem); -+} -+ -+struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc) -+{ -+ struct au_dinfo *dinfo; -+ int nbr, i; -+ -+ dinfo = au_cache_alloc_dinfo(); -+ if (unlikely(!dinfo)) -+ goto out; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr <= 0) -+ nbr = 1; -+ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); -+ if (dinfo->di_hdentry) { -+ au_rw_write_lock_nested(&dinfo->di_rwsem, lsc); -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ dinfo->di_bwh = -1; -+ dinfo->di_bdiropq = -1; -+ dinfo->di_tmpfile = 0; -+ for (i = 0; i < nbr; i++) -+ dinfo->di_hdentry[i].hd_id = -1; -+ goto out; -+ } -+ -+ au_cache_free_dinfo(dinfo); -+ dinfo = NULL; -+ -+out: -+ return dinfo; -+} -+ -+void au_di_free(struct au_dinfo *dinfo) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bbot, bindex; -+ -+ /* dentry may not be revalidated */ -+ bindex = dinfo->di_btop; -+ if (bindex >= 0) { -+ bbot = dinfo->di_bbot; -+ p = au_hdentry(dinfo, bindex); -+ while (bindex++ <= bbot) -+ au_hdput(p++); -+ } -+ au_kfree_try_rcu(dinfo->di_hdentry); -+ au_cache_free_dinfo(dinfo); -+} -+ -+void au_di_swap(struct au_dinfo *a, struct au_dinfo *b) -+{ -+ struct au_hdentry *p; -+ aufs_bindex_t bi; -+ -+ AuRwMustWriteLock(&a->di_rwsem); -+ AuRwMustWriteLock(&b->di_rwsem); -+ -+#define DiSwap(v, name) \ -+ do { \ -+ v = a->di_##name; \ -+ a->di_##name = b->di_##name; \ -+ b->di_##name = v; \ -+ } while (0) -+ -+ DiSwap(p, hdentry); -+ DiSwap(bi, btop); -+ DiSwap(bi, bbot); -+ DiSwap(bi, bwh); -+ DiSwap(bi, bdiropq); -+ /* smp_mb(); */ -+ -+#undef DiSwap -+} -+ -+void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src) -+{ -+ AuRwMustWriteLock(&dst->di_rwsem); -+ AuRwMustWriteLock(&src->di_rwsem); -+ -+ dst->di_btop = src->di_btop; -+ dst->di_bbot = src->di_bbot; -+ dst->di_bwh = src->di_bwh; -+ dst->di_bdiropq = src->di_bdiropq; -+ /* smp_mb(); */ -+} -+ -+int au_di_init(struct dentry *dentry) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_dinfo *dinfo; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ dinfo = au_di_alloc(sb, AuLsc_DI_CHILD); -+ if (dinfo) { -+ atomic_set(&dinfo->di_generation, au_sigen(sb)); -+ /* smp_mb(); */ /* atomic_set */ -+ dentry->d_fsdata = dinfo; -+ } else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_di_fin(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ -+ dinfo = au_di(dentry); -+ AuRwDestroy(&dinfo->di_rwsem); -+ au_di_free(dinfo); -+} -+ -+int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*hdp) * (dinfo->di_bbot + 1); -+ if (!sz) -+ sz = sizeof(*hdp); -+ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hdp) { -+ dinfo->di_hdentry = hdp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void do_ii_write_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_write_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_write_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_write_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_write_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_write_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_write_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static void do_ii_read_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_read_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_read_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_read_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_read_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_read_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_read_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc) -+{ -+ struct inode *inode; -+ -+ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) -+ do_ii_write_lock(inode, lsc); -+ else if (au_ftest_lock(flags, IR)) -+ do_ii_read_lock(inode, lsc); -+ } -+} -+ -+void di_read_unlock(struct dentry *d, int flags) -+{ -+ struct inode *inode; -+ -+ if (d_really_is_positive(d)) { -+ inode = d_inode(d); -+ if (au_ftest_lock(flags, IW)) { -+ au_dbg_verify_dinode(d); -+ ii_write_unlock(inode); -+ } else if (au_ftest_lock(flags, IR)) { -+ au_dbg_verify_dinode(d); -+ ii_read_unlock(inode); -+ } -+ } -+ au_rw_read_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_downgrade_lock(struct dentry *d, int flags) -+{ -+ if (d_really_is_positive(d) && au_ftest_lock(flags, IR)) -+ ii_downgrade_lock(d_inode(d)); -+ au_rw_dgrade_lock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock(struct dentry *d, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d_really_is_positive(d)) -+ do_ii_write_lock(d_inode(d), lsc); -+} -+ -+void di_write_unlock(struct dentry *d) -+{ -+ au_dbg_verify_dinode(d); -+ if (d_really_is_positive(d)) -+ ii_write_unlock(d_inode(d)); -+ au_rw_write_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_child(d1); -+ di_write_lock_child2(d2); -+ } else { -+ di_write_lock_child(d2); -+ di_write_lock_child2(d1); -+ } -+} -+ -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d_inode(d1) == d_inode(d2) -+ || d1->d_sb != d2->d_sb); -+ -+ if ((isdir && au_test_subdir(d1, d2)) -+ || d1 < d2) { -+ di_write_lock_parent(d1); -+ di_write_lock_parent2(d2); -+ } else { -+ di_write_lock_parent(d2); -+ di_write_lock_parent2(d1); -+ } -+} -+ -+void di_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock(d1); -+ if (d_inode(d1) == d_inode(d2)) -+ au_rw_write_unlock(&au_di(d2)->di_rwsem); -+ else -+ di_write_unlock(d2); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *d; -+ -+ DiMustAnyLock(dentry); -+ -+ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) -+ return NULL; -+ AuDebugOn(bindex < 0); -+ d = au_hdentry(au_di(dentry), bindex)->hd_dentry; -+ AuDebugOn(d && au_dcount(d) <= 0); -+ return d; -+} -+ -+/* -+ * extended version of au_h_dptr(). -+ * returns a hashed and positive (or linkable) h_dentry in bindex, NULL, or -+ * error. -+ */ -+struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *h_dentry; -+ struct inode *inode, *h_inode; -+ -+ AuDebugOn(d_really_is_negative(dentry)); -+ -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex -+ && bindex <= au_dbbot(dentry)) -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && !au_d_linkable(h_dentry)) { -+ dget(h_dentry); -+ goto out; /* success */ -+ } -+ -+ inode = d_inode(dentry); -+ AuDebugOn(bindex < au_ibtop(inode)); -+ AuDebugOn(au_ibbot(inode) < bindex); -+ h_inode = au_h_iptr(inode, bindex); -+ h_dentry = d_find_alias(h_inode); -+ if (h_dentry) { -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_linkable(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ } else -+ goto out; -+ } -+ -+ if (au_opt_test(au_mntflags(dentry->d_sb), PLINK)) { -+ h_dentry = au_plink_lkup(inode, bindex); -+ AuDebugOn(!h_dentry); -+ if (!IS_ERR(h_dentry)) { -+ if (!au_d_hashed_positive(h_dentry)) -+ goto out; /* success */ -+ dput(h_dentry); -+ h_dentry = NULL; -+ } -+ } -+ -+out: -+ AuDbgDentry(h_dentry); -+ return h_dentry; -+} -+ -+aufs_bindex_t au_dbtail(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bwh; -+ -+ bbot = au_dbbot(dentry); -+ if (0 <= bbot) { -+ bwh = au_dbwh(dentry); -+ if (!bwh) -+ return bwh; -+ if (0 < bwh && bwh < bbot) -+ return bwh - 1; -+ } -+ return bbot; -+} -+ -+aufs_bindex_t au_dbtaildir(struct dentry *dentry) -+{ -+ aufs_bindex_t bbot, bopq; -+ -+ bbot = au_dbtail(dentry); -+ if (0 <= bbot) { -+ bopq = au_dbdiropq(dentry); -+ if (0 <= bopq && bopq < bbot) -+ bbot = bopq; -+ } -+ return bbot; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct au_dinfo *dinfo; -+ struct au_hdentry *hd; -+ struct au_branch *br; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ hd = au_hdentry(dinfo, bindex); -+ au_hdput(hd); -+ hd->hd_dentry = h_dentry; -+ if (h_dentry) { -+ br = au_sbr(dentry->d_sb, bindex); -+ hd->hd_id = br->br_id; -+ } -+} -+ -+int au_dbrange_test(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop, bbot; -+ -+ err = 0; -+ btop = au_dbtop(dentry); -+ bbot = au_dbbot(dentry); -+ if (btop >= 0) -+ AuDebugOn(bbot < 0 && btop > bbot); -+ else { -+ err = -EIO; -+ AuDebugOn(bbot >= 0); -+ } -+ -+ return err; -+} -+ -+int au_digen_test(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(au_digen(dentry) != sigen -+ || au_iigen_test(d_inode(dentry), sigen))) -+ err = -EIO; -+ -+ return err; -+} -+ -+void au_update_digen(struct dentry *dentry) -+{ -+ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+void au_update_dbrange(struct dentry *dentry, int do_put_zero) -+{ -+ struct au_dinfo *dinfo; -+ struct dentry *h_d; -+ struct au_hdentry *hdp; -+ aufs_bindex_t bindex, bbot; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ if (!dinfo || dinfo->di_btop < 0) -+ return; -+ -+ if (do_put_zero) { -+ bbot = dinfo->di_bbot; -+ bindex = dinfo->di_btop; -+ hdp = au_hdentry(dinfo, bindex); -+ for (; bindex <= bbot; bindex++, hdp++) { -+ h_d = hdp->hd_dentry; -+ if (h_d && d_is_negative(h_d)) -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+ } -+ -+ dinfo->di_btop = 0; -+ hdp = au_hdentry(dinfo, dinfo->di_btop); -+ for (; dinfo->di_btop <= dinfo->di_bbot; dinfo->di_btop++, hdp++) -+ if (hdp->hd_dentry) -+ break; -+ if (dinfo->di_btop > dinfo->di_bbot) { -+ dinfo->di_btop = -1; -+ dinfo->di_bbot = -1; -+ return; -+ } -+ -+ hdp = au_hdentry(dinfo, dinfo->di_bbot); -+ for (; dinfo->di_bbot >= 0; dinfo->di_bbot--, hdp--) -+ if (hdp->hd_dentry) -+ break; -+ AuDebugOn(dinfo->di_btop > dinfo->di_bbot || dinfo->di_bbot < 0); -+} -+ -+void au_update_dbtop(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct dentry *h_dentry; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbtop(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+void au_update_dbbot(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, btop; -+ struct dentry *h_dentry; -+ -+ btop = au_dbtop(dentry); -+ for (bindex = au_dbbot(dentry); bindex >= btop; bindex--) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (d_is_positive(h_dentry)) { -+ au_set_dbbot(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) -+{ -+ aufs_bindex_t bindex, bbot; -+ -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) -+ if (au_h_dptr(dentry, bindex) == h_dentry) -+ return bindex; -+ return -1; -+} -diff -Nurp linux-5.15.37/fs/aufs/dir.c linux-5.15.37-aufs/fs/aufs/dir.c ---- linux-5.15.37/fs/aufs/dir.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dir.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,752 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+void au_add_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink += 2; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen in revaliding */ -+ set_nlink(dir, nlink); -+} -+ -+void au_sub_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ unsigned int nlink; -+ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ nlink = dir->i_nlink; -+ nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ nlink -= 2; -+ smp_mb(); /* for i_nlink */ -+ /* nlink == 0 means the branch-fs is broken */ -+ set_nlink(dir, nlink); -+} -+ -+loff_t au_dir_size(struct file *file, struct dentry *dentry) -+{ -+ loff_t sz; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ sz = 0; -+ if (file) { -+ AuDebugOn(!d_is_dir(file->f_path.dentry)); -+ -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file && file_inode(h_file)) -+ sz += vfsub_f_size_read(h_file); -+ } -+ } else { -+ AuDebugOn(!dentry); -+ AuDebugOn(!d_is_dir(dentry)); -+ -+ bbot = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); -+ bindex <= bbot && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) -+ sz += i_size_read(d_inode(h_dentry)); -+ } -+ } -+ if (sz < KMALLOC_MAX_SIZE) -+ sz = roundup_pow_of_two(sz); -+ if (sz > KMALLOC_MAX_SIZE) -+ sz = KMALLOC_MAX_SIZE; -+ else if (sz < NAME_MAX) { -+ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); -+ sz = AUFS_RDBLK_DEF; -+ } -+ return sz; -+} -+ -+struct au_dir_ts_arg { -+ struct dentry *dentry; -+ aufs_bindex_t brid; -+}; -+ -+static void au_do_dir_ts(void *arg) -+{ -+ struct au_dir_ts_arg *a = arg; -+ struct au_dtime dt; -+ struct path h_path; -+ struct inode *dir, *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ int err; -+ aufs_bindex_t btop, bindex; -+ -+ sb = a->dentry->d_sb; -+ if (d_really_is_negative(a->dentry)) -+ goto out; -+ /* no dir->i_mutex lock */ -+ aufs_read_lock(a->dentry, AuLock_DW); /* noflush */ -+ -+ dir = d_inode(a->dentry); -+ btop = au_ibtop(dir); -+ bindex = au_br_index(sb, a->brid); -+ if (bindex < btop) -+ goto out_unlock; -+ -+ br = au_sbr(sb, bindex); -+ h_path.dentry = au_h_dptr(a->dentry, bindex); -+ if (!h_path.dentry) -+ goto out_unlock; -+ h_path.mnt = au_br_mnt(br); -+ au_dtime_store(&dt, a->dentry, &h_path); -+ -+ br = au_sbr(sb, btop); -+ if (!au_br_writable(br->br_perm)) -+ goto out_unlock; -+ h_path.dentry = au_h_dptr(a->dentry, btop); -+ h_path.mnt = au_br_mnt(br); -+ err = vfsub_mnt_want_write(h_path.mnt); -+ if (err) -+ goto out_unlock; -+ hdir = au_hi(dir, btop); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ h_dir = au_h_iptr(dir, btop); -+ if (h_dir->i_nlink -+ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { -+ dt.dt_h_path = h_path; -+ au_dtime_revert(&dt); -+ } -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(h_path.mnt); -+ au_cpup_attr_timesizes(dir); -+ -+out_unlock: -+ aufs_read_unlock(a->dentry, AuLock_DW); -+out: -+ dput(a->dentry); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_try_rcu(arg); -+} -+ -+void au_dir_ts(struct inode *dir, aufs_bindex_t bindex) -+{ -+ int perm, wkq_err; -+ aufs_bindex_t btop; -+ struct au_dir_ts_arg *arg; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ dentry = d_find_any_alias(dir); -+ AuDebugOn(!dentry); -+ sb = dentry->d_sb; -+ btop = au_ibtop(dir); -+ if (btop == bindex) { -+ au_cpup_attr_timesizes(dir); -+ goto out; -+ } -+ -+ perm = au_sbr_perm(sb, btop); -+ if (!au_br_writable(perm)) -+ goto out; -+ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (!arg) -+ goto out; -+ -+ arg->dentry = dget(dentry); /* will be dput-ted by au_do_dir_ts() */ -+ arg->brid = au_sbr_id(sb, bindex); -+ wkq_err = au_wkq_nowait(au_do_dir_ts, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_err("wkq %d\n", wkq_err); -+ dput(dentry); -+ au_kfree_try_rcu(arg); -+ } -+ -+out: -+ dput(dentry); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int reopen_dir(struct file *file) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bindex, btail, btop; -+ struct dentry *dentry, *h_dentry; -+ struct file *h_file; -+ -+ /* open all lower dirs */ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ for (bindex = au_fbtop(file); bindex < btop; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, btop); -+ -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_fbbot_dir(file); btail < bindex; bindex--) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbbot_dir(file, btail); -+ -+ flags = vfsub_file_flags(file); -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ continue; -+ -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; /* close all? */ -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static int do_open_dir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex, btail; -+ struct dentry *dentry, *h_dentry; -+ struct vfsmount *mnt; -+ -+ FiMustWriteLock(file); -+ AuDebugOn(h_file); -+ -+ err = 0; -+ mnt = file->f_path.mnt; -+ dentry = file->f_path.dentry; -+ file->f_version = inode_query_iversion(d_inode(dentry)); -+ bindex = au_dbtop(dentry); -+ au_set_fbtop(file, bindex); -+ btail = au_dbtaildir(dentry); -+ au_set_fbbot_dir(file, btail); -+ for (; !err && bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ err = vfsub_test_mntns(mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ break; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ break; -+ } -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ if (!err) -+ return 0; /* success */ -+ -+ /* close all */ -+ for (bindex = au_fbtop(file); bindex <= btail; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbtop(file, -1); -+ au_set_fbbot_dir(file, -1); -+ -+ return err; -+} -+ -+static int aufs_open_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ err = -ENOMEM; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ fidir = au_fidir_alloc(sb); -+ if (fidir) { -+ struct au_do_open_args args = { -+ .open = do_open_dir, -+ .fidir = fidir -+ }; -+ err = au_do_open(file, &args); -+ if (unlikely(err)) -+ au_kfree_rcu(fidir); -+ } -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_release_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ struct au_vdir *vdir_cache; -+ struct au_finfo *finfo; -+ struct au_fidir *fidir; -+ struct au_hfile *hf; -+ aufs_bindex_t bindex, bbot; -+ -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ if (fidir) { -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ vdir_cache = fidir->fd_vdir_cache; /* lock-free */ -+ if (vdir_cache) -+ au_vdir_free(vdir_cache); -+ -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) { -+ hf = fidir->fd_hfile + bindex; -+ /* -+ * calls fput() instead of filp_close(), -+ * since no dnotify or lock for the lower file. -+ */ -+ bbot = fidir->fd_bbot; -+ for (; bindex <= bbot; bindex++, hf++) -+ if (hf->hf_file) -+ au_hfput(hf, /*execed*/0); -+ } -+ au_kfree_rcu(fidir); -+ finfo->fi_hdir = NULL; -+ } -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_dir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct file *h_file; -+ -+ err = 0; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ } -+ return err; -+} -+ -+static int aufs_flush_dir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_dir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= bbot; bindex++) { -+ struct path h_path; -+ -+ if (au_test_ro(sb, bindex, inode)) -+ continue; -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ if (!h_path.dentry) -+ continue; -+ -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_fsync(NULL, &h_path, datasync); -+ } -+ -+ return err; -+} -+ -+static int au_do_fsync_dir(struct file *file, int datasync) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct file *h_file; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { -+ h_file = au_hf_dir(file, bindex); -+ if (!h_file || au_test_ro(sb, bindex, inode)) -+ continue; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * @file may be NULL -+ */ -+static int aufs_fsync_dir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock(inode); -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (file) -+ err = au_do_fsync_dir(file, datasync); -+ else { -+ di_write_lock_child(dentry); -+ err = au_do_fsync_dir_no_file(dentry, datasync); -+ } -+ au_cpup_attr_timesizes(inode); -+ di_write_unlock(dentry); -+ if (file) -+ fi_write_unlock(file); -+ -+ si_read_unlock(sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_iterate_shared(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode, *h_inode; -+ struct super_block *sb; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out; -+ err = au_alive_dir(dentry); -+ if (!err) -+ err = au_vdir_init(file); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (!au_test_nfsd()) { -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ } else { -+ /* -+ * nfsd filldir may call lookup_one_len(), vfs_getattr(), -+ * encode_fh() and others. -+ */ -+ atomic_inc(&h_inode->i_count); -+ di_read_unlock(dentry, AuLock_IR); -+ si_read_unlock(sb); -+ err = au_vdir_fill_de(file, ctx); -+ fsstack_copy_attr_atime(inode, h_inode); -+ fi_write_unlock(file); -+ iput(h_inode); -+ -+ AuTraceErr(err); -+ return err; -+ } -+ -+out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuTestEmpty_WHONLY 1 -+#define AuTestEmpty_CALLED (1 << 1) -+#define AuTestEmpty_SHWH (1 << 2) -+#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) -+#define au_fset_testempty(flags, name) \ -+ do { (flags) |= AuTestEmpty_##name; } while (0) -+#define au_fclr_testempty(flags, name) \ -+ do { (flags) &= ~AuTestEmpty_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuTestEmpty_SHWH -+#define AuTestEmpty_SHWH 0 -+#endif -+ -+struct test_empty_arg { -+ struct dir_context ctx; -+ struct au_nhash *whlist; -+ unsigned int flags; -+ int err; -+ aufs_bindex_t bindex; -+}; -+ -+static int test_empty_cb(struct dir_context *ctx, const char *__name, -+ int namelen, loff_t offset __maybe_unused, u64 ino, -+ unsigned int d_type) -+{ -+ struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, -+ ctx); -+ char *name = (void *)__name; -+ -+ arg->err = 0; -+ au_fset_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (name[0] == '.' -+ && (namelen == 1 || (name[1] == '.' && namelen == 2))) -+ goto out; /* success */ -+ -+ if (namelen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (au_ftest_testempty(arg->flags, WHONLY) -+ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = -ENOTEMPTY; -+ goto out; -+ } -+ -+ name += AUFS_WH_PFX_LEN; -+ namelen -= AUFS_WH_PFX_LEN; -+ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = au_nhash_append_wh -+ (arg->whlist, name, namelen, ino, d_type, arg->bindex, -+ au_ftest_testempty(arg->flags, SHWH)); -+ -+out: -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err; -+ struct file *h_file; -+ struct au_branch *br; -+ -+ h_file = au_h_open(dentry, arg->bindex, -+ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, -+ /*file*/NULL, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !file_inode(h_file)->i_nlink) -+ goto out_put; -+ -+ do { -+ arg->err = 0; -+ au_fclr_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_testempty(arg->flags, CALLED)); -+ -+out_put: -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, arg->bindex); -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return err; -+} -+ -+struct do_test_empty_args { -+ int *errp; -+ struct dentry *dentry; -+ struct test_empty_arg *arg; -+}; -+ -+static void call_do_test_empty(void *args) -+{ -+ struct do_test_empty_args *a = args; -+ *a->errp = do_test_empty(a->dentry, a->arg); -+} -+ -+static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ h_userns = au_sbr_userns(dentry->d_sb, arg->bindex); -+ h_dentry = au_h_dptr(dentry, arg->bindex); -+ h_inode = d_inode(h_dentry); -+ /* todo: i_mode changes anytime? */ -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); -+ err = au_test_h_perm_sio(h_userns, h_inode, MAY_EXEC | MAY_READ); -+ inode_unlock_shared(h_inode); -+ if (!err) -+ err = do_test_empty(dentry, arg); -+ else { -+ struct do_test_empty_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .arg = arg -+ }; -+ unsigned int flags = arg->flags; -+ -+ wkq_err = au_wkq_wait(call_do_test_empty, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ arg->flags = flags; -+ } -+ -+ return err; -+} -+ -+int au_test_empty_lower(struct dentry *dentry) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t bindex, btop, btail; -+ struct au_nhash whlist; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ int (*test_empty)(struct dentry *dentry, struct test_empty_arg *arg); -+ -+ SiMustAnyLock(dentry->d_sb); -+ -+ rdhash = au_sbi(dentry->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ arg.flags = 0; -+ arg.whlist = &whlist; -+ btop = au_dbtop(dentry); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ test_empty = do_test_empty; -+ if (au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)) -+ test_empty = sio_test_empty; -+ arg.bindex = btop; -+ err = test_empty(dentry, &arg); -+ if (unlikely(err)) -+ goto out_whlist; -+ -+ au_fset_testempty(arg.flags, WHONLY); -+ btail = au_dbtaildir(dentry); -+ for (bindex = btop + 1; !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = test_empty(dentry, &arg); -+ } -+ } -+ -+out_whlist: -+ au_nhash_wh_free(&whlist); -+out: -+ return err; -+} -+ -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ int err; -+ struct test_empty_arg arg = { -+ .ctx = { -+ .actor = test_empty_cb -+ } -+ }; -+ aufs_bindex_t bindex, btail; -+ -+ err = 0; -+ arg.whlist = whlist; -+ arg.flags = AuTestEmpty_WHONLY; -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_dbtop(dentry); !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && d_is_positive(h_dentry)) { -+ arg.bindex = bindex; -+ err = sio_test_empty(dentry, &arg); -+ } -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_dir_fop = { -+ .owner = THIS_MODULE, -+ .llseek = default_llseek, -+ .read = generic_read_dir, -+ .iterate_shared = aufs_iterate_shared, -+ .unlocked_ioctl = aufs_ioctl_dir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_dir, -+#endif -+ .open = aufs_open_dir, -+ .release = aufs_release_dir, -+ .flush = aufs_flush_dir, -+ .fsync = aufs_fsync_dir -+}; -diff -Nurp linux-5.15.37/fs/aufs/dir.h linux-5.15.37-aufs/fs/aufs/dir.h ---- linux-5.15.37/fs/aufs/dir.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dir.h 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,121 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#ifndef __AUFS_DIR_H__ -+#define __AUFS_DIR_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* need to be faster and smaller */ -+ -+struct au_nhash { -+ unsigned int nh_num; -+ struct hlist_head *nh_head; -+}; -+ -+struct au_vdir_destr { -+ unsigned char len; -+ unsigned char name[]; -+} __packed; -+ -+struct au_vdir_dehstr { -+ struct hlist_node hash; -+ struct au_vdir_destr *str; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+struct au_vdir_de { -+ ino_t de_ino; -+ unsigned char de_type; -+ /* caution: packed */ -+ struct au_vdir_destr de_str; -+} __packed; -+ -+struct au_vdir_wh { -+ struct hlist_node wh_hash; -+#ifdef CONFIG_AUFS_SHWH -+ ino_t wh_ino; -+ aufs_bindex_t wh_bindex; -+ unsigned char wh_type; -+#else -+ aufs_bindex_t wh_bindex; -+#endif -+ /* caution: packed */ -+ struct au_vdir_destr wh_str; -+} __packed; -+ -+union au_vdir_deblk_p { -+ unsigned char *deblk; -+ struct au_vdir_de *de; -+}; -+ -+struct au_vdir { -+ unsigned char **vd_deblk; -+ unsigned long vd_nblk; -+ struct { -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ } vd_last; -+ -+ u64 vd_version; -+ unsigned int vd_deblk_sz; -+ unsigned long vd_jiffy; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dir.c */ -+extern const struct file_operations aufs_dir_fop; -+void au_add_nlink(struct inode *dir, struct inode *h_dir); -+void au_sub_nlink(struct inode *dir, struct inode *h_dir); -+loff_t au_dir_size(struct file *file, struct dentry *dentry); -+void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); -+int au_test_empty_lower(struct dentry *dentry); -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); -+ -+/* vdir.c */ -+unsigned int au_rdhash_est(loff_t sz); -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); -+void au_nhash_wh_free(struct au_nhash *whlist); -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit); -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh); -+void au_vdir_free(struct au_vdir *vdir); -+int au_vdir_init(struct file *file); -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx); -+ -+/* ioctl.c */ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); -+ -+#ifdef CONFIG_AUFS_RDU -+/* rdu.c */ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+#else -+AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#ifdef CONFIG_COMPAT -+AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, -+ unsigned int cmd, unsigned long arg) -+#endif -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIR_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dirren.c linux-5.15.37-aufs/fs/aufs/dirren.c ---- linux-5.15.37/fs/aufs/dirren.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dirren.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,1302 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * special handling in renaming a directory -+ * in order to support looking-up the before-renamed name on the lower readonly -+ * branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+static void au_dr_hino_del(struct au_dr_br *dr, struct au_dr_hino *ent) -+{ -+ int idx; -+ -+ idx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_del(&ent->dr_hnode, dr->dr_h_ino + idx); -+} -+ -+static int au_dr_hino_test_empty(struct au_dr_br *dr) -+{ -+ int ret, i; -+ struct hlist_bl_head *hbl; -+ -+ ret = 1; -+ for (i = 0; ret && i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ hlist_bl_lock(hbl); -+ ret &= hlist_bl_empty(hbl); -+ hlist_bl_unlock(hbl); -+ } -+ -+ return ret; -+} -+ -+static struct au_dr_hino *au_dr_hino_find(struct au_dr_br *dr, ino_t ino) -+{ -+ struct au_dr_hino *found, *ent; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int idx; -+ -+ found = NULL; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = ent; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return found; -+} -+ -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t ino, -+ struct au_dr_hino *add_ent) -+{ -+ int found, idx; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dr_hino *ent; -+ -+ found = 0; -+ idx = au_dr_ihash(ino); -+ hbl = dr->dr_h_ino + idx; -+#if 0 /* debug print */ -+ { -+ struct hlist_bl_node *tmp; -+ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ AuDbg("hi%llu\n", (unsigned long long)ent->dr_h_ino); -+ } -+#endif -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) -+ if (ent->dr_h_ino == ino) { -+ found = 1; -+ break; -+ } -+ if (!found && add_ent) -+ hlist_bl_add_head(&add_ent->dr_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found && add_ent) -+ AuDbg("i%llu added\n", (unsigned long long)add_ent->dr_h_ino); -+ -+ return found; -+} -+ -+void au_dr_hino_free(struct au_dr_br *dr) -+{ -+ int i; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_dr_hino *ent; -+ -+ /* SiMustWriteLock(sb); */ -+ -+ for (i = 0; i < AuDirren_NHASH; i++) { -+ hbl = dr->dr_h_ino + i; -+ /* no spinlock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) -+ au_kfree_rcu(ent); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+/* returns the number of inodes or an error */ -+static int au_dr_hino_store(struct super_block *sb, struct au_branch *br, -+ struct file *hinofile) -+{ -+ int err, i; -+ ssize_t ssz; -+ loff_t pos, oldsize; -+ __be64 u64; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *n1, *n2; -+ struct au_dr_hino *ent; -+ -+ SiMustWriteLock(sb); -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ -+ hinoinode = file_inode(hinofile); -+ oldsize = i_size_read(hinoinode); -+ -+ err = 0; -+ pos = 0; -+ hbl = br->br_dirren.dr_h_ino; -+ for (i = 0; !err && i < AuDirren_NHASH; i++, hbl++) { -+ /* no bit-lock since sbinfo must be write-locked */ -+ hlist_bl_for_each_entry_safe(ent, n1, n2, hbl, dr_hnode) { -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ u64 = cpu_to_be64(ent->dr_h_ino); -+ ssz = vfsub_write_k(hinofile, &u64, sizeof(u64), &pos); -+ if (ssz == sizeof(u64)) -+ continue; -+ -+ /* write error */ -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -ENOSPC; -+ if (ssz < 0) -+ err = ssz; -+ break; -+ } -+ } -+ /* regardless the error */ -+ if (pos < oldsize) { -+ err = vfsub_trunc(&hinofile->f_path, pos, /*attr*/0, hinofile); -+ AuTraceErr(err); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_dr_hino_load(struct au_dr_br *dr, struct file *hinofile) -+{ -+ int err, hidx; -+ ssize_t ssz; -+ size_t sz, n; -+ loff_t pos; -+ uint64_t u64; -+ struct au_dr_hino *ent; -+ struct inode *hinoinode; -+ struct hlist_bl_head *hbl; -+ -+ err = 0; -+ pos = 0; -+ hbl = dr->dr_h_ino; -+ hinoinode = file_inode(hinofile); -+ sz = i_size_read(hinoinode); -+ AuDebugOn(sz % sizeof(u64)); -+ n = sz / sizeof(u64); -+ while (n--) { -+ ssz = vfsub_read_k(hinofile, &u64, sizeof(u64), &pos); -+ if (unlikely(ssz != sizeof(u64))) { -+ pr_err("ssz %zd, %pD2\n", ssz, hinofile); -+ err = -EINVAL; -+ if (ssz < 0) -+ err = ssz; -+ goto out_free; -+ } -+ -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (!ent) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ ent->dr_h_ino = be64_to_cpu((__force __be64)u64); -+ AuDbg("hi%llu, %pD2\n", -+ (unsigned long long)ent->dr_h_ino, hinofile); -+ hidx = au_dr_ihash(ent->dr_h_ino); -+ au_hbl_add(&ent->dr_hnode, hbl + hidx); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_hino_free(dr); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * @bindex/@br is a switch to distinguish whether suspending hnotify or not. -+ * @path is a switch to distinguish load and store. -+ */ -+static int au_dr_hino(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br, const struct path *path) -+{ -+ int err, flags; -+ unsigned char load, suspend; -+ struct file *hinofile; -+ struct au_hinode *hdir; -+ struct inode *dir, *delegated; -+ struct path hinopath; -+ struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, -+ sizeof(AUFS_WH_DR_BRHINO) - 1); -+ -+ AuDebugOn(bindex < 0 && !br); -+ AuDebugOn(bindex >= 0 && br); -+ -+ err = -EINVAL; -+ suspend = !br; -+ if (suspend) -+ br = au_sbr(sb, bindex); -+ load = !!path; -+ if (!load) { -+ path = &br->br_path; -+ AuDebugOn(!au_br_writable(br->br_perm)); -+ if (unlikely(!au_br_writable(br->br_perm))) -+ goto out; -+ } -+ -+ hdir = NULL; -+ if (suspend) { -+ dir = d_inode(sb->s_root); -+ hdir = au_hinode(au_ii(dir), bindex); -+ dir = hdir->hi_inode; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ } else { -+ dir = d_inode(path->dentry); -+ inode_lock_nested(dir, AuLsc_I_CHILD); -+ } -+ 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; -+ -+ err = 0; -+ flags = O_RDONLY; -+ if (load) { -+ if (d_is_negative(hinopath.dentry)) -+ goto out_dput; /* success */ -+ } else { -+ if (au_dr_hino_test_empty(&br->br_dirren)) { -+ if (d_is_positive(hinopath.dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(dir, &hinopath, &delegated, -+ /*force*/0); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ pr_err("ignored err %d, %pd2\n", -+ err, hinopath.dentry); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ err = 0; -+ } -+ goto out_dput; -+ } else if (!d_is_positive(hinopath.dentry)) { -+ err = vfsub_create(dir, &hinopath, 0600, -+ /*want_excl*/false); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ } -+ flags = O_WRONLY; -+ } -+ hinofile = vfsub_dentry_open(&hinopath, flags); -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+ dput(hinopath.dentry); -+ AuTraceErrPtr(hinofile); -+ if (IS_ERR(hinofile)) { -+ err = PTR_ERR(hinofile); -+ goto out; -+ } -+ -+ if (load) -+ err = au_dr_hino_load(&br->br_dirren, hinofile); -+ else -+ err = au_dr_hino_store(sb, br, hinofile); -+ fput(hinofile); -+ goto out; -+ -+out_dput: -+ dput(hinopath.dentry); -+out_unlock: -+ if (suspend) -+ au_hn_inode_unlock(hdir); -+ else -+ inode_unlock(dir); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_dr_brid_init(struct au_dr_brid *brid, const struct path *path) -+{ -+ int err; -+ struct kstatfs kstfs; -+ dev_t dev; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ err = vfs_statfs((void *)path, &kstfs); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* todo: support for UUID */ -+ -+ if (kstfs.f_fsid.val[0] || kstfs.f_fsid.val[1]) { -+ brid->type = AuBrid_FSID; -+ brid->fsid = kstfs.f_fsid; -+ } else { -+ dentry = path->dentry; -+ sb = dentry->d_sb; -+ dev = sb->s_dev; -+ if (dev) { -+ brid->type = AuBrid_DEV; -+ brid->dev = dev; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path) -+{ -+ int err, i; -+ struct au_dr_br *dr; -+ struct hlist_bl_head *hbl; -+ -+ dr = &br->br_dirren; -+ hbl = dr->dr_h_ino; -+ for (i = 0; i < AuDirren_NHASH; i++, hbl++) -+ INIT_HLIST_BL_HEAD(hbl); -+ -+ err = au_dr_brid_init(&dr->dr_brid, path); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_opt_test(au_mntflags(sb), DIRREN)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, path); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, /*bindex*/-1, br, /*path*/NULL); -+ if (!err) -+ au_dr_hino_free(&br->br_dirren); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brid_str(struct au_dr_brid *brid, struct inode *h_inode, -+ char *buf, size_t sz) -+{ -+ int err; -+ unsigned int major, minor; -+ char *p; -+ -+ p = buf; -+ err = snprintf(p, sz, "%d_", brid->type); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ switch (brid->type) { -+ case AuBrid_Unset: -+ return -EINVAL; -+ case AuBrid_UUID: -+ err = snprintf(p, sz, "%pU", brid->uuid.b); -+ break; -+ case AuBrid_FSID: -+ err = snprintf(p, sz, "%08x-%08x", -+ brid->fsid.val[0], brid->fsid.val[1]); -+ break; -+ case AuBrid_DEV: -+ major = MAJOR(brid->dev); -+ minor = MINOR(brid->dev); -+ if (major <= 0xff && minor <= 0xff) -+ err = snprintf(p, sz, "%02x%02x", major, minor); -+ else -+ err = snprintf(p, sz, "%03x:%05x", major, minor); -+ break; -+ } -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ err = snprintf(p, sz, "_%llu", (unsigned long long)h_inode->i_ino); -+ AuDebugOn(err > sz); -+ p += err; -+ sz -= err; -+ -+ return p - buf; -+} -+ -+static int au_drinfo_name(struct au_branch *br, char *name, int len) -+{ -+ int rlen; -+ struct dentry *br_dentry; -+ struct inode *br_inode; -+ -+ br_dentry = au_br_dentry(br); -+ br_inode = d_inode(br_dentry); -+ rlen = au_brid_str(&br->br_dirren.dr_brid, br_inode, name, len); -+ AuDebugOn(rlen >= AUFS_DIRREN_ENV_VAL_SZ); -+ AuDebugOn(rlen > len); -+ -+ return rlen; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * from the given @h_dentry, construct drinfo at @*fdata. -+ * when the size of @*fdata is not enough, reallocate and return new @fdata and -+ * @allocated. -+ */ -+static int au_drinfo_construct(struct au_drinfo_fdata **fdata, -+ struct dentry *h_dentry, -+ unsigned char *allocated) -+{ -+ int err, v; -+ struct au_drinfo_fdata *f, *p; -+ struct au_drinfo *drinfo; -+ struct inode *h_inode; -+ struct qstr *qname; -+ -+ err = 0; -+ f = *fdata; -+ h_inode = d_inode(h_dentry); -+ qname = &h_dentry->d_name; -+ drinfo = &f->drinfo; -+ drinfo->ino = (__force uint64_t)cpu_to_be64(h_inode->i_ino); -+ drinfo->oldnamelen = qname->len; -+ if (*allocated < sizeof(*f) + qname->len) { -+ v = roundup_pow_of_two(*allocated + qname->len); -+ p = au_krealloc(f, v, GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) { -+ err = -ENOMEM; -+ AuTraceErr(err); -+ goto out; -+ } -+ f = p; -+ *fdata = f; -+ *allocated = v; -+ drinfo = &f->drinfo; -+ } -+ memcpy(drinfo->oldname, qname->name, qname->len); -+ AuDbg("i%llu, %.*s\n", -+ be64_to_cpu((__force __be64)drinfo->ino), drinfo->oldnamelen, -+ drinfo->oldname); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* callers have to free the return value */ -+static struct au_drinfo *au_drinfo_read_k(struct file *file, ino_t h_ino) -+{ -+ struct au_drinfo *ret, *drinfo; -+ struct au_drinfo_fdata fdata; -+ int len; -+ loff_t pos; -+ ssize_t ssz; -+ -+ ret = ERR_PTR(-EIO); -+ pos = 0; -+ ssz = vfsub_read_k(file, &fdata, sizeof(fdata), &pos); -+ if (unlikely(ssz != sizeof(fdata))) { -+ AuIOErr("ssz %zd, %u, %pD2\n", -+ ssz, (unsigned int)sizeof(fdata), file); -+ goto out; -+ } -+ -+ fdata.magic = ntohl((__force __be32)fdata.magic); -+ switch (fdata.magic) { -+ case AUFS_DRINFO_MAGIC_V1: -+ break; -+ default: -+ AuIOErr("magic-num 0x%x, 0x%x, %pD2\n", -+ fdata.magic, AUFS_DRINFO_MAGIC_V1, file); -+ goto out; -+ } -+ -+ drinfo = &fdata.drinfo; -+ len = drinfo->oldnamelen; -+ if (!len) { -+ AuIOErr("broken drinfo %pD2\n", file); -+ goto out; -+ } -+ -+ ret = NULL; -+ drinfo->ino = be64_to_cpu((__force __be64)drinfo->ino); -+ if (unlikely(h_ino && drinfo->ino != h_ino)) { -+ AuDbg("ignored i%llu, i%llu, %pD2\n", -+ (unsigned long long)drinfo->ino, -+ (unsigned long long)h_ino, file); -+ goto out; /* success */ -+ } -+ -+ ret = kmalloc(sizeof(*ret) + len, GFP_NOFS); -+ if (unlikely(!ret)) { -+ ret = ERR_PTR(-ENOMEM); -+ AuTraceErrPtr(ret); -+ goto out; -+ } -+ -+ *ret = *drinfo; -+ ssz = vfsub_read_k(file, (void *)ret->oldname, len, &pos); -+ if (unlikely(ssz != len)) { -+ au_kfree_rcu(ret); -+ ret = ERR_PTR(-EIO); -+ AuIOErr("ssz %zd, %u, %pD2\n", ssz, len, file); -+ goto out; -+ } -+ -+ AuDbg("oldname %.*s\n", ret->oldnamelen, ret->oldname); -+ -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* in order to be revertible */ -+struct au_drinfo_rev_elm { -+ int created; -+ struct dentry *info_dentry; -+ struct au_drinfo *info_last; -+}; -+ -+struct au_drinfo_rev { -+ unsigned char already; -+ aufs_bindex_t nelm; -+ struct au_drinfo_rev_elm elm[]; -+}; -+ -+/* todo: isn't it too large? */ -+struct au_drinfo_store { -+ struct path h_ppath; -+ struct dentry *h_dentry; -+ struct au_drinfo_fdata *fdata; -+ char *infoname; /* inside of whname, just after PFX */ -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ]; -+ aufs_bindex_t btgt, btail; -+ unsigned char no_sio, -+ allocated, /* current size of *fdata */ -+ infonamelen, /* room size for p */ -+ whnamelen, /* length of the generated name */ -+ renameback; /* renamed back */ -+}; -+ -+/* on rename(2) error, the caller should revert it using @elm */ -+static int au_drinfo_do_store(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, len; -+ ssize_t ssz; -+ loff_t pos; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ struct inode *h_dir, *h_inode, *delegated; -+ struct file *infofile; -+ struct qstr *qname; -+ -+ AuDebugOn(elm -+ && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm))); -+ -+ infopath.dentry = vfsub_lookup_one_len(w->whname, &w->h_ppath, -+ w->whnamelen); -+ AuTraceErrPtr(infopath.dentry); -+ if (IS_ERR(infopath.dentry)) { -+ err = PTR_ERR(infopath.dentry); -+ goto out; -+ } -+ -+ err = 0; -+ h_dir = d_inode(w->h_ppath.dentry); -+ if (elm && d_is_negative(infopath.dentry)) { -+ err = vfsub_create(h_dir, &infopath, 0600, /*want_excl*/true); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dput; -+ elm->created = 1; -+ elm->info_dentry = dget(infopath.dentry); -+ } -+ -+ infofile = vfsub_dentry_open(&infopath, O_RDWR); -+ AuTraceErrPtr(infofile); -+ if (IS_ERR(infofile)) { -+ err = PTR_ERR(infofile); -+ goto out_dput; -+ } -+ -+ h_inode = d_inode(infopath.dentry); -+ if (elm && i_size_read(h_inode)) { -+ h_inode = d_inode(w->h_dentry); -+ elm->info_last = au_drinfo_read_k(infofile, h_inode->i_ino); -+ AuTraceErrPtr(elm->info_last); -+ if (IS_ERR(elm->info_last)) { -+ err = PTR_ERR(elm->info_last); -+ elm->info_last = NULL; -+ AuDebugOn(elm->info_dentry); -+ goto out_fput; -+ } -+ } -+ -+ if (elm && w->renameback) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ goto out_fput; -+ } -+ -+ pos = 0; -+ qname = &w->h_dentry->d_name; -+ len = sizeof(*w->fdata) + qname->len; -+ if (!elm) -+ len = sizeof(*w->fdata) + w->fdata->drinfo.oldnamelen; -+ ssz = vfsub_write_k(infofile, w->fdata, len, &pos); -+ if (ssz == len) { -+ AuDbg("hi%llu, %.*s\n", w->fdata->drinfo.ino, -+ w->fdata->drinfo.oldnamelen, w->fdata->drinfo.oldname); -+ goto out_fput; /* success */ -+ } else { -+ err = -EIO; -+ if (ssz < 0) -+ err = ssz; -+ /* the caller should revert it using @elm */ -+ } -+ -+out_fput: -+ fput(infofile); -+out_dput: -+ dput(infopath.dentry); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+struct au_call_drinfo_do_store_args { -+ int *errp; -+ struct au_drinfo_store *w; -+ struct au_drinfo_rev_elm *elm; -+}; -+ -+static void au_call_drinfo_do_store(void *args) -+{ -+ struct au_call_drinfo_do_store_args *a = args; -+ -+ *a->errp = au_drinfo_do_store(a->w, a->elm); -+} -+ -+static int au_drinfo_store_sio(struct au_drinfo_store *w, -+ struct au_drinfo_rev_elm *elm) -+{ -+ int err, wkq_err; -+ -+ if (w->no_sio) -+ err = au_drinfo_do_store(w, elm); -+ else { -+ struct au_call_drinfo_do_store_args a = { -+ .errp = &err, -+ .w = w, -+ .elm = elm -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_store, &a); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ AuTraceErr(err); -+ -+ return err; -+} -+ -+static int au_drinfo_store_work_init(struct au_drinfo_store *w, -+ aufs_bindex_t btgt) -+{ -+ int err; -+ -+ memset(w, 0, sizeof(*w)); -+ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); -+ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); -+ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); -+ w->btgt = btgt; -+ w->no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ -+ err = -ENOMEM; -+ w->fdata = kcalloc(1, w->allocated, GFP_NOFS); -+ if (unlikely(!w->fdata)) { -+ AuTraceErr(err); -+ goto out; -+ } -+ w->fdata->magic = (__force uint32_t)htonl(AUFS_DRINFO_MAGIC_V1); -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static void au_drinfo_store_work_fin(struct au_drinfo_store *w) -+{ -+ au_kfree_rcu(w->fdata); -+} -+ -+static void au_drinfo_store_rev(struct au_drinfo_rev *rev, -+ struct au_drinfo_store *w) -+{ -+ struct au_drinfo_rev_elm *elm; -+ struct inode *h_dir, *delegated; -+ int err, nelm; -+ struct path infopath = { -+ .mnt = w->h_ppath.mnt -+ }; -+ -+ h_dir = d_inode(w->h_ppath.dentry); -+ IMustLock(h_dir); -+ -+ err = 0; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ AuDebugOn(elm->created && elm->info_last); -+ if (elm->created) { -+ AuDbg("here\n"); -+ delegated = NULL; -+ infopath.dentry = elm->info_dentry; -+ err = vfsub_unlink(h_dir, &infopath, &delegated, -+ !w->no_sio); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) -+ iput(delegated); -+ dput(elm->info_dentry); -+ } else if (elm->info_last) { -+ AuDbg("here\n"); -+ w->fdata->drinfo = *elm->info_last; -+ memcpy(w->fdata->drinfo.oldname, -+ elm->info_last->oldname, -+ elm->info_last->oldnamelen); -+ err = au_drinfo_store_sio(w, /*elm*/NULL); -+ au_kfree_rcu(elm->info_last); -+ } -+ if (unlikely(err)) -+ AuIOErr("%d, %s\n", err, w->whname); -+ /* go on even if err */ -+ } -+} -+ -+/* caller has to call au_dr_rename_fin() later */ -+static int au_drinfo_store(struct dentry *dentry, aufs_bindex_t btgt, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, sz, nelm; -+ aufs_bindex_t bindex, btail; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev, **p; -+ struct au_drinfo_rev_elm *elm; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ btail = au_dbtaildir(dentry); -+ nelm = btail - btgt; -+ sz = sizeof(*rev) + sizeof(*elm) * nelm; -+ rev = kcalloc(1, sz, GFP_NOFS); -+ if (unlikely(!rev)) { -+ AuTraceErr(err); -+ goto out_args; -+ } -+ rev->nelm = nelm; -+ elm = rev->elm; -+ p = _rev; -+ *p = rev; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ work.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ work.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ hdir = au_hi(d_inode(dentry), btgt); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); -+ for (bindex = btgt + 1; bindex <= btail; bindex++, elm++) { -+ work.h_dentry = au_h_dptr(dentry, bindex); -+ if (!work.h_dentry) -+ continue; -+ -+ err = au_drinfo_construct(&work.fdata, work.h_dentry, -+ &work.allocated); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ -+ work.renameback = au_qstreq(&work.h_dentry->d_name, dst_name); -+ br = au_sbr(sb, bindex); -+ work.whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ work.whnamelen += au_drinfo_name(br, work.infoname, -+ work.infonamelen); -+ AuDbg("whname %.*s, i%llu, %.*s\n", -+ work.whnamelen, work.whname, -+ be64_to_cpu((__force __be64)work.fdata->drinfo.ino), -+ work.fdata->drinfo.oldnamelen, -+ work.fdata->drinfo.oldname); -+ -+ err = au_drinfo_store_sio(&work, elm); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ } -+ if (unlikely(err)) { -+ /* revert all drinfo */ -+ au_drinfo_store_rev(rev, &work); -+ au_kfree_try_rcu(rev); -+ *p = NULL; -+ } -+ au_hn_inode_unlock(hdir); -+ -+out_args: -+ au_drinfo_store_work_fin(&work); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev) -+{ -+ int err, already; -+ ino_t ino; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dr_br *dr; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_dr_hino *ent; -+ struct au_drinfo_rev *rev, **p; -+ -+ AuDbg("bindex %d\n", bindex); -+ -+ err = -ENOMEM; -+ ent = kmalloc(sizeof(*ent), GFP_NOFS); -+ if (unlikely(!ent)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, bindex); -+ dr = &br->br_dirren; -+ h_dentry = au_h_dptr(src, bindex); -+ h_inode = d_inode(h_dentry); -+ ino = h_inode->i_ino; -+ ent->dr_h_ino = ino; -+ already = au_dr_hino_test_add(dr, ino, ent); -+ AuDbg("b%d, hi%llu, already %d\n", -+ bindex, (unsigned long long)ino, already); -+ -+ err = au_drinfo_store(src, bindex, dst_name, _rev); -+ AuTraceErr(err); -+ if (!err) { -+ p = _rev; -+ rev = *p; -+ rev->already = already; -+ goto out; /* success */ -+ } -+ -+ /* revert */ -+ if (!already) -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ struct au_drinfo_rev *rev; -+ struct au_drinfo_rev_elm *elm; -+ int nelm; -+ -+ rev = _rev; -+ elm = rev->elm; -+ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { -+ dput(elm->info_dentry); -+ au_kfree_rcu(elm->info_last); -+ } -+ au_kfree_try_rcu(rev); -+} -+ -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t btgt, void *_rev) -+{ -+ int err; -+ struct au_drinfo_store work; -+ struct au_drinfo_rev *rev = _rev; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *h_inode; -+ struct au_dr_br *dr; -+ struct au_dr_hino *ent; -+ -+ err = au_drinfo_store_work_init(&work, btgt); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = src->d_sb; -+ br = au_sbr(sb, btgt); -+ work.h_ppath.dentry = au_h_dptr(src, btgt); -+ work.h_ppath.mnt = au_br_mnt(br); -+ au_drinfo_store_rev(rev, &work); -+ au_drinfo_store_work_fin(&work); -+ if (rev->already) -+ goto out; -+ -+ dr = &br->br_dirren; -+ h_inode = d_inode(work.h_ppath.dentry); -+ ent = au_dr_hino_find(dr, h_inode->i_ino); -+ BUG_ON(!ent); -+ au_dr_hino_del(dr, ent); -+ au_kfree_rcu(ent); -+ -+out: -+ au_kfree_try_rcu(rev); -+ if (unlikely(err)) -+ pr_err("failed to remove dirren info\n"); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct au_drinfo *au_drinfo_do_load(struct path *h_ppath, -+ char *whname, int whnamelen, -+ struct dentry **info_dentry) -+{ -+ struct au_drinfo *drinfo; -+ struct file *f; -+ struct inode *h_dir; -+ struct path infopath; -+ int unlocked; -+ -+ AuDbg("%pd/%.*s\n", h_ppath->dentry, whnamelen, whname); -+ -+ *info_dentry = NULL; -+ drinfo = NULL; -+ 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, whnamelen); -+ if (IS_ERR(infopath.dentry)) { -+ drinfo = (void *)infopath.dentry; -+ goto out; -+ } -+ -+ if (d_is_negative(infopath.dentry)) -+ goto out_dput; /* success */ -+ -+ infopath.mnt = h_ppath->mnt; -+ f = vfsub_dentry_open(&infopath, O_RDONLY); -+ inode_unlock_shared(h_dir); -+ unlocked = 1; -+ if (IS_ERR(f)) { -+ drinfo = (void *)f; -+ goto out_dput; -+ } -+ -+ drinfo = au_drinfo_read_k(f, /*h_ino*/0); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out_fput; -+ -+ AuDbg("oldname %.*s\n", drinfo->oldnamelen, drinfo->oldname); -+ *info_dentry = dget(infopath.dentry); /* keep it alive */ -+ -+out_fput: -+ fput(f); -+out_dput: -+ dput(infopath.dentry); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_dir); -+ AuTraceErrPtr(drinfo); -+ return drinfo; -+} -+ -+struct au_drinfo_do_load_args { -+ struct au_drinfo **drinfop; -+ struct path *h_ppath; -+ char *whname; -+ int whnamelen; -+ struct dentry **info_dentry; -+}; -+ -+static void au_call_drinfo_do_load(void *args) -+{ -+ struct au_drinfo_do_load_args *a = args; -+ -+ *a->drinfop = au_drinfo_do_load(a->h_ppath, a->whname, a->whnamelen, -+ a->info_dentry); -+} -+ -+struct au_drinfo_load { -+ struct path h_ppath; -+ struct qstr *qname; -+ unsigned char no_sio; -+ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+ -+static int au_drinfo_load(struct au_drinfo_load *w, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ int err, wkq_err, whnamelen, e; -+ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ] -+ = AUFS_WH_DR_INFO_PFX; -+ struct au_drinfo *drinfo; -+ struct qstr oldname; -+ struct inode *h_dir, *delegated; -+ struct dentry *info_dentry; -+ struct path infopath; -+ -+ whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; -+ whnamelen += au_drinfo_name(br, whname + whnamelen, -+ sizeof(whname) - whnamelen); -+ if (w->no_sio) -+ drinfo = au_drinfo_do_load(&w->h_ppath, whname, whnamelen, -+ &info_dentry); -+ else { -+ struct au_drinfo_do_load_args args = { -+ .drinfop = &drinfo, -+ .h_ppath = &w->h_ppath, -+ .whname = whname, -+ .whnamelen = whnamelen, -+ .info_dentry = &info_dentry -+ }; -+ wkq_err = au_wkq_wait(au_call_drinfo_do_load, &args); -+ if (unlikely(wkq_err)) -+ drinfo = ERR_PTR(wkq_err); -+ } -+ err = PTR_ERR(drinfo); -+ if (IS_ERR_OR_NULL(drinfo)) -+ goto out; -+ -+ err = 0; -+ oldname.len = drinfo->oldnamelen; -+ oldname.name = drinfo->oldname; -+ if (au_qstreq(w->qname, &oldname)) { -+ /* the name is renamed back */ -+ au_kfree_rcu(drinfo); -+ drinfo = NULL; -+ -+ infopath.dentry = info_dentry; -+ infopath.mnt = w->h_ppath.mnt; -+ h_dir = d_inode(w->h_ppath.dentry); -+ delegated = NULL; -+ inode_lock_nested(h_dir, AuLsc_I_PARENT); -+ e = vfsub_unlink(h_dir, &infopath, &delegated, !w->no_sio); -+ inode_unlock(h_dir); -+ if (unlikely(e)) -+ AuIOErr("ignored %d, %pd2\n", e, &infopath.dentry); -+ if (unlikely(e == -EWOULDBLOCK)) -+ iput(delegated); -+ } -+ au_kfree_rcu(w->drinfo[bindex]); -+ w->drinfo[bindex] = drinfo; -+ dput(info_dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_dr_lkup_free(struct au_drinfo **drinfo, int n) -+{ -+ struct au_drinfo **p = drinfo; -+ -+ while (n-- > 0) -+ au_kfree_rcu(*drinfo++); -+ au_kfree_try_rcu(p); -+} -+ -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t btgt) -+{ -+ int err, ninfo; -+ struct au_drinfo_load w; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct inode *h_dir; -+ struct au_dr_hino *ent; -+ struct super_block *sb; -+ -+ AuDbg("%.*s, name %.*s, whname %.*s, b%d\n", -+ AuLNPair(&dentry->d_name), AuLNPair(&lkup->dirren.dr_name), -+ AuLNPair(&lkup->whname), btgt); -+ -+ sb = dentry->d_sb; -+ bbot = au_sbbot(sb); -+ w.ninfo = bbot + 1; -+ if (!lkup->dirren.drinfo) { -+ lkup->dirren.drinfo = kcalloc(w.ninfo, -+ sizeof(*lkup->dirren.drinfo), -+ GFP_NOFS); -+ if (unlikely(!lkup->dirren.drinfo)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ lkup->dirren.ninfo = w.ninfo; -+ } -+ w.drinfo = lkup->dirren.drinfo; -+ w.no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); -+ w.h_ppath.dentry = au_h_dptr(dentry, btgt); -+ AuDebugOn(!w.h_ppath.dentry); -+ w.h_ppath.mnt = au_sbr_mnt(sb, btgt); -+ w.qname = &dentry->d_name; -+ -+ ninfo = 0; -+ for (bindex = btgt + 1; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_drinfo_load(&w, bindex, br); -+ if (unlikely(err)) -+ goto out_free; -+ if (w.drinfo[bindex]) -+ ninfo++; -+ } -+ if (!ninfo) { -+ br = au_sbr(sb, btgt); -+ h_dir = d_inode(w.h_ppath.dentry); -+ ent = au_dr_hino_find(&br->br_dirren, h_dir->i_ino); -+ AuDebugOn(!ent); -+ au_dr_hino_del(&br->br_dirren, ent); -+ au_kfree_rcu(ent); -+ } -+ goto out; /* success */ -+ -+out_free: -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+ lkup->dirren.ninfo = 0; -+ lkup->dirren.drinfo = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup) -+{ -+ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); -+} -+ -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt) -+{ -+ int err; -+ struct au_drinfo *drinfo; -+ -+ err = 0; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= btgt); -+ drinfo = lkup->dirren.drinfo[btgt]; -+ if (!drinfo) -+ goto out; -+ -+ au_kfree_try_rcu(lkup->whname.name); -+ lkup->whname.name = NULL; -+ lkup->dirren.dr_name.len = drinfo->oldnamelen; -+ lkup->dirren.dr_name.name = drinfo->oldname; -+ lkup->name = &lkup->dirren.dr_name; -+ err = au_wh_name_alloc(&lkup->whname, lkup->name); -+ if (!err) -+ AuDbg("name %.*s, whname %.*s, b%d\n", -+ AuLNPair(lkup->name), AuLNPair(&lkup->whname), -+ btgt); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino) -+{ -+ int match; -+ struct au_drinfo *drinfo; -+ -+ match = 1; -+ if (!lkup->dirren.drinfo) -+ goto out; -+ AuDebugOn(lkup->dirren.ninfo <= bindex); -+ drinfo = lkup->dirren.drinfo[bindex]; -+ if (!drinfo) -+ goto out; -+ -+ match = (drinfo->ino == h_ino); -+ AuDbg("match %d\n", match); -+ -+out: -+ return match; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dr_opt_set(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_dr_hino(sb, bindex, /*br*/NULL, &br->br_path); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_flush(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) -+ err = au_dr_hino(sb, bindex, /*br*/NULL, /*path*/NULL); -+ } -+ -+ return err; -+} -+ -+int au_dr_opt_clr(struct super_block *sb, int no_flush) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ err = 0; -+ if (!no_flush) { -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ au_dr_hino_free(&br->br_dirren); -+ } -+ -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/dirren.h linux-5.15.37-aufs/fs/aufs/dirren.h ---- linux-5.15.37/fs/aufs/dirren.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dirren.h 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,127 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * renamed dir info -+ */ -+ -+#ifndef __AUFS_DIRREN_H__ -+#define __AUFS_DIRREN_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "hbl.h" -+ -+#define AuDirren_NHASH 100 -+ -+#ifdef CONFIG_AUFS_DIRREN -+enum au_brid_type { -+ AuBrid_Unset, -+ AuBrid_UUID, -+ AuBrid_FSID, -+ AuBrid_DEV -+}; -+ -+struct au_dr_brid { -+ enum au_brid_type type; -+ union { -+ uuid_t uuid; /* unimplemented yet */ -+ fsid_t fsid; -+ dev_t dev; -+ }; -+}; -+ -+/* 20 is the max digits length of ulong 64 */ -+/* brid-type "_" uuid "_" inum */ -+#define AUFS_DIRREN_FNAME_SZ (1 + 1 + UUID_STRING_LEN + 20) -+#define AUFS_DIRREN_ENV_VAL_SZ (AUFS_DIRREN_FNAME_SZ + 1 + 20) -+ -+struct au_dr_hino { -+ struct hlist_bl_node dr_hnode; -+ ino_t dr_h_ino; -+}; -+ -+struct au_dr_br { -+ struct hlist_bl_head dr_h_ino[AuDirren_NHASH]; -+ struct au_dr_brid dr_brid; -+}; -+ -+struct au_dr_lookup { -+ /* dr_name is pointed by struct au_do_lookup_args.name */ -+ struct qstr dr_name; /* subset of dr_info */ -+ aufs_bindex_t ninfo; -+ struct au_drinfo **drinfo; -+}; -+#else -+struct au_dr_hino; -+/* empty */ -+struct au_dr_br { }; -+struct au_dr_lookup { }; -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+struct au_do_lookup_args; -+struct au_hinode; -+#ifdef CONFIG_AUFS_DIRREN -+int au_dr_hino_test_add(struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+void au_dr_hino_free(struct au_dr_br *dr); -+int au_dr_br_init(struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+int au_dr_br_fin(struct super_block *sb, struct au_branch *br); -+int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *rev); -+void au_dr_rename_rev(struct dentry *src, aufs_bindex_t bindex, void *rev); -+int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, -+ ino_t h_ino); -+void au_dr_lkup_fin(struct au_do_lookup_args *lkup); -+int au_dr_opt_set(struct super_block *sb); -+int au_dr_opt_flush(struct super_block *sb); -+int au_dr_opt_clr(struct super_block *sb, int no_flush); -+#else -+AuStubInt0(au_dr_hino_test_add, struct au_dr_br *dr, ino_t h_ino, -+ struct au_dr_hino *add_ent); -+AuStubVoid(au_dr_hino_free, struct au_dr_br *dr); -+AuStubInt0(au_dr_br_init, struct super_block *sb, struct au_branch *br, -+ const struct path *path); -+AuStubInt0(au_dr_br_fin, struct super_block *sb, struct au_branch *br); -+AuStubInt0(au_dr_rename, struct dentry *src, aufs_bindex_t bindex, -+ struct qstr *dst_name, void *_rev); -+AuStubVoid(au_dr_rename_fin, struct dentry *src, aufs_bindex_t btgt, void *rev); -+AuStubVoid(au_dr_rename_rev, struct dentry *src, aufs_bindex_t bindex, -+ void *rev); -+AuStubInt0(au_dr_lkup, struct au_do_lookup_args *lkup, struct dentry *dentry, -+ aufs_bindex_t bindex); -+AuStubInt0(au_dr_lkup_name, struct au_do_lookup_args *lkup, aufs_bindex_t btgt); -+AuStubInt0(au_dr_lkup_h_ino, struct au_do_lookup_args *lkup, -+ aufs_bindex_t bindex, ino_t h_ino); -+AuStubVoid(au_dr_lkup_fin, struct au_do_lookup_args *lkup); -+AuStubInt0(au_dr_opt_set, struct super_block *sb); -+AuStubInt0(au_dr_opt_flush, struct super_block *sb); -+AuStubInt0(au_dr_opt_clr, struct super_block *sb, int no_flush); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DIRREN -+static inline int au_dr_ihash(ino_t h_ino) -+{ -+ return h_ino % AuDirren_NHASH; -+} -+#else -+AuStubInt0(au_dr_ihash, ino_t h_ino); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIRREN_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/dynop.c linux-5.15.37-aufs/fs/aufs/dynop.c ---- linux-5.15.37/fs/aufs/dynop.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dynop.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,355 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * dynamically customizable operations for regular files -+ */ -+ -+#include "aufs.h" -+ -+#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) -+ -+/* -+ * How large will these lists be? -+ * Usually just a few elements, 20-30 at most for each, I guess. -+ */ -+static struct hlist_bl_head dynop[AuDyLast]; -+ -+static struct au_dykey *dy_gfind_get(struct hlist_bl_head *hbl, -+ const void *h_op) -+{ -+ struct au_dykey *key, *tmp; -+ struct hlist_bl_node *pos; -+ -+ key = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ key = tmp; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ -+ return key; -+} -+ -+static struct au_dykey *dy_bradd(struct au_branch *br, struct au_dykey *key) -+{ -+ struct au_dykey **k, *found; -+ const void *h_op = key->dk_op.dy_hop; -+ int i; -+ -+ found = NULL; -+ k = br->br_dykey; -+ for (i = 0; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else -+ break; -+ if (!found) { -+ spin_lock(&br->br_dykey_lock); -+ for (; i < AuBrDynOp; i++) -+ if (k[i]) { -+ if (k[i]->dk_op.dy_hop == h_op) { -+ found = k[i]; -+ break; -+ } -+ } else { -+ k[i] = key; -+ break; -+ } -+ spin_unlock(&br->br_dykey_lock); -+ BUG_ON(i == AuBrDynOp); /* expand the array */ -+ } -+ -+ return found; -+} -+ -+/* kref_get() if @key is already added */ -+static struct au_dykey *dy_gadd(struct hlist_bl_head *hbl, struct au_dykey *key) -+{ -+ struct au_dykey *tmp, *found; -+ struct hlist_bl_node *pos; -+ const void *h_op = key->dk_op.dy_hop; -+ -+ found = NULL; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) -+ if (tmp->dk_op.dy_hop == h_op) { -+ if (kref_get_unless_zero(&tmp->dk_kref)) -+ found = tmp; -+ break; -+ } -+ if (!found) -+ hlist_bl_add_head(&key->dk_hnode, hbl); -+ hlist_bl_unlock(hbl); -+ -+ if (!found) -+ DyPrSym(key); -+ return found; -+} -+ -+static void dy_free_rcu(struct rcu_head *rcu) -+{ -+ struct au_dykey *key; -+ -+ key = container_of(rcu, struct au_dykey, dk_rcu); -+ DyPrSym(key); -+ kfree(key); -+} -+ -+static void dy_free(struct kref *kref) -+{ -+ struct au_dykey *key; -+ struct hlist_bl_head *hbl; -+ -+ key = container_of(kref, struct au_dykey, dk_kref); -+ hbl = dynop + key->dk_op.dy_type; -+ au_hbl_del(&key->dk_hnode, hbl); -+ call_rcu(&key->dk_rcu, dy_free_rcu); -+} -+ -+void au_dy_put(struct au_dykey *key) -+{ -+ kref_put(&key->dk_kref, dy_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define DyDbgDeclare(cnt) unsigned int cnt = 0 -+#define DyDbgInc(cnt) do { cnt++; } while (0) -+#else -+#define DyDbgDeclare(cnt) do {} while (0) -+#define DyDbgInc(cnt) do {} while (0) -+#endif -+ -+#define DySet(func, dst, src, h_op, h_sb) do { \ -+ DyDbgInc(cnt); \ -+ if (h_op->func) { \ -+ if (src.func) \ -+ dst.func = src.func; \ -+ else \ -+ AuDbg("%s %s\n", au_sbtype(h_sb), #func); \ -+ } \ -+} while (0) -+ -+#define DySetForce(func, dst, src) do { \ -+ AuDebugOn(!src.func); \ -+ DyDbgInc(cnt); \ -+ dst.func = src.func; \ -+} while (0) -+ -+#define DySetAop(func) \ -+ DySet(func, dyaop->da_op, aufs_aop, h_aop, h_sb) -+#define DySetAopForce(func) \ -+ DySetForce(func, dyaop->da_op, aufs_aop) -+ -+static void dy_aop(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused) -+{ -+ struct au_dyaop *dyaop = (void *)key; -+ const struct address_space_operations *h_aop = h_op; -+ DyDbgDeclare(cnt); -+ -+ AuDbg("%s\n", au_sbtype(h_sb)); -+ -+ DySetAop(writepage); -+ DySetAopForce(readpage); /* force */ -+ DySetAop(writepages); -+ DySetAop(set_page_dirty); -+ DySetAop(readpages); -+ DySetAop(readahead); -+ DySetAop(write_begin); -+ DySetAop(write_end); -+ DySetAop(bmap); -+ DySetAop(invalidatepage); -+ DySetAop(releasepage); -+ DySetAop(freepage); -+ /* this one will be changed according to an aufs mount option */ -+ DySetAop(direct_IO); -+ DySetAop(migratepage); -+ DySetAop(isolate_page); -+ DySetAop(putback_page); -+ DySetAop(launder_page); -+ DySetAop(is_partially_uptodate); -+ DySetAop(is_dirty_writeback); -+ DySetAop(error_remove_page); -+ DySetAop(swap_activate); -+ DySetAop(swap_deactivate); -+ -+ DyDbgSize(cnt, *h_aop); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void dy_bug(struct kref *kref) -+{ -+ BUG(); -+} -+ -+static struct au_dykey *dy_get(struct au_dynop *op, struct au_branch *br) -+{ -+ struct au_dykey *key, *old; -+ struct hlist_bl_head *hbl; -+ struct op { -+ unsigned int sz; -+ void (*set)(struct au_dykey *key, const void *h_op, -+ struct super_block *h_sb __maybe_unused); -+ }; -+ static const struct op a[] = { -+ [AuDy_AOP] = { -+ .sz = sizeof(struct au_dyaop), -+ .set = dy_aop -+ } -+ }; -+ const struct op *p; -+ -+ hbl = dynop + op->dy_type; -+ key = dy_gfind_get(hbl, op->dy_hop); -+ if (key) -+ goto out_add; /* success */ -+ -+ p = a + op->dy_type; -+ key = kzalloc(p->sz, GFP_NOFS); -+ if (unlikely(!key)) { -+ key = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ key->dk_op.dy_hop = op->dy_hop; -+ kref_init(&key->dk_kref); -+ p->set(key, op->dy_hop, au_br_sb(br)); -+ old = dy_gadd(hbl, key); -+ if (old) { -+ au_kfree_rcu(key); -+ key = old; -+ } -+ -+out_add: -+ old = dy_bradd(br, key); -+ if (old) -+ /* its ref-count should never be zero here */ -+ kref_put(&key->dk_kref, dy_bug); -+out: -+ return key; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs prohibits O_DIRECT by default even if the branch supports it. -+ * This behaviour is necessary to return an error from open(O_DIRECT) instead -+ * of the succeeding I/O. The dio mount option enables O_DIRECT and makes -+ * open(O_DIRECT) always succeed, but the succeeding I/O may return an error. -+ * See the aufs manual in detail. -+ */ -+static void dy_adx(struct au_dyaop *dyaop, int do_dx) -+{ -+ if (!do_dx) -+ dyaop->da_op.direct_IO = NULL; -+ else -+ dyaop->da_op.direct_IO = aufs_aop.direct_IO; -+} -+ -+static struct au_dyaop *dy_aget(struct au_branch *br, -+ const struct address_space_operations *h_aop, -+ int do_dx) -+{ -+ struct au_dyaop *dyaop; -+ struct au_dynop op; -+ -+ op.dy_type = AuDy_AOP; -+ op.dy_haop = h_aop; -+ dyaop = (void *)dy_get(&op, br); -+ if (IS_ERR(dyaop)) -+ goto out; -+ dy_adx(dyaop, do_dx); -+ -+out: -+ return dyaop; -+} -+ -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode) -+{ -+ int err, do_dx; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_dyaop *dyaop; -+ -+ AuDebugOn(!S_ISREG(h_inode->i_mode)); -+ IiMustWriteLock(inode); -+ -+ sb = inode->i_sb; -+ br = au_sbr(sb, bindex); -+ do_dx = !!au_opt_test(au_mntflags(sb), DIO); -+ dyaop = dy_aget(br, h_inode->i_mapping->a_ops, do_dx); -+ err = PTR_ERR(dyaop); -+ if (IS_ERR(dyaop)) -+ /* unnecessary to call dy_fput() */ -+ goto out; -+ -+ err = 0; -+ inode->i_mapping->a_ops = &dyaop->da_op; -+ -+out: -+ return err; -+} -+ -+/* -+ * Is it safe to replace a_ops during the inode/file is in operation? -+ * Yes, I hope so. -+ */ -+int au_dy_irefresh(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct inode *h_inode; -+ -+ err = 0; -+ if (S_ISREG(inode->i_mode)) { -+ btop = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, btop); -+ err = au_dy_iaop(inode, btop, h_inode); -+ } -+ return err; -+} -+ -+void au_dy_arefresh(int do_dx) -+{ -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_dykey *key; -+ -+ hbl = dynop + AuDy_AOP; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(key, pos, hbl, dk_hnode) -+ dy_adx((void *)key, do_dx); -+ hlist_bl_unlock(hbl); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void __init au_dy_init(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ INIT_HLIST_BL_HEAD(dynop + i); -+} -+ -+void au_dy_fin(void) -+{ -+ int i; -+ -+ for (i = 0; i < AuDyLast; i++) -+ WARN_ON(!hlist_bl_empty(dynop + i)); -+} -diff -Nurp linux-5.15.37/fs/aufs/dynop.h linux-5.15.37-aufs/fs/aufs/dynop.h ---- linux-5.15.37/fs/aufs/dynop.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/dynop.h 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,64 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * dynamically customizable operations (for regular files only) -+ */ -+ -+#ifndef __AUFS_DYNOP_H__ -+#define __AUFS_DYNOP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+enum {AuDy_AOP, AuDyLast}; -+ -+struct au_dynop { -+ int dy_type; -+ union { -+ const void *dy_hop; -+ const struct address_space_operations *dy_haop; -+ }; -+}; -+ -+struct au_dykey { -+ union { -+ struct hlist_bl_node dk_hnode; -+ struct rcu_head dk_rcu; -+ }; -+ struct au_dynop dk_op; -+ -+ /* -+ * during I am in the branch local array, kref is gotten. when the -+ * branch is removed, kref is put. -+ */ -+ struct kref dk_kref; -+}; -+ -+/* stop unioning since their sizes are very different from each other */ -+struct au_dyaop { -+ struct au_dykey da_key; -+ struct address_space_operations da_op; /* not const */ -+}; -+/* make sure that 'struct au_dykey *' can be any type */ -+static_assert(!offsetof(struct au_dyaop, da_key)); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dynop.c */ -+struct au_branch; -+void au_dy_put(struct au_dykey *key); -+int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode); -+int au_dy_irefresh(struct inode *inode); -+void au_dy_arefresh(int do_dio); -+ -+void __init au_dy_init(void); -+void au_dy_fin(void); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DYNOP_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/export.c linux-5.15.37-aufs/fs/aufs/export.c ---- linux-5.15.37/fs/aufs/export.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/export.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,817 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * export via nfs -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+union conv { -+#ifdef CONFIG_AUFS_INO_T_64 -+ __u32 a[2]; -+#else -+ __u32 a[1]; -+#endif -+ ino_t ino; -+}; -+ -+static ino_t decode_ino(__u32 *a) -+{ -+ union conv u; -+ -+ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); -+ u.a[0] = a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ u.a[1] = a[1]; -+#endif -+ return u.ino; -+} -+ -+static void encode_ino(__u32 *a, ino_t ino) -+{ -+ union conv u; -+ -+ u.ino = ino; -+ a[0] = u.a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ a[1] = u.a[1]; -+#endif -+} -+ -+/* NFS file handle */ -+enum { -+ Fh_br_id, -+ Fh_sigen, -+#ifdef CONFIG_AUFS_INO_T_64 -+ /* support 64bit inode number */ -+ Fh_ino1, -+ Fh_ino2, -+ Fh_dir_ino1, -+ Fh_dir_ino2, -+#else -+ Fh_ino1, -+ Fh_dir_ino1, -+#endif -+ Fh_igen, -+ Fh_h_type, -+ Fh_tail, -+ -+ Fh_ino = Fh_ino1, -+ Fh_dir_ino = Fh_dir_ino1 -+}; -+ -+static int au_test_anon(struct dentry *dentry) -+{ -+ /* note: read d_flags without d_lock */ -+ return !!(dentry->d_flags & DCACHE_DISCONNECTED); -+} -+ -+int au_test_nfsd(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ ret = !strcmp(comm, "nfsd"); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* inode generation external table */ -+ -+void au_xigen_inc(struct inode *inode) -+{ -+ loff_t pos; -+ ssize_t sz; -+ __u32 igen; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ sb = inode->i_sb; -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ -+ sbinfo = au_sbi(sb); -+ pos = inode->i_ino; -+ pos *= sizeof(igen); -+ igen = inode->i_generation + 1; -+ sz = xino_fwrite(sbinfo->si_xigen, &igen, sizeof(igen), &pos); -+ if (sz == sizeof(igen)) -+ return; /* success */ -+ -+ if (unlikely(sz >= 0)) -+ AuIOErr("xigen error (%zd)\n", sz); -+} -+ -+int au_xigen_new(struct inode *inode) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ err = 0; -+ /* todo: dirty, at mount time */ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ goto out; -+ sb = inode->i_sb; -+ SiMustAnyLock(sb); -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ goto out; -+ -+ err = -EFBIG; -+ pos = inode->i_ino; -+ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { -+ AuIOErr1("too large i%lld\n", pos); -+ goto out; -+ } -+ pos *= sizeof(inode->i_generation); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ file = sbinfo->si_xigen; -+ BUG_ON(!file); -+ -+ if (vfsub_f_size_read(file) -+ < pos + sizeof(inode->i_generation)) { -+ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); -+ sz = xino_fwrite(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ } else -+ sz = xino_fread(file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ if (sz == sizeof(inode->i_generation)) -+ goto out; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xigen error (%zd)\n", sz); -+ } -+ -+out: -+ return err; -+} -+ -+int au_xigen_set(struct super_block *sb, struct path *path) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xigen); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ err = 0; -+ if (sbinfo->si_xigen) -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = file; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xigen_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xigen) { -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino) -+{ -+ struct dentry *dentry, *d; -+ struct inode *inode; -+ unsigned int sigen; -+ -+ dentry = NULL; -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ dentry = ERR_PTR(-ESTALE); -+ sigen = au_sigen(sb); -+ if (unlikely(au_is_bad_inode(inode) -+ || IS_DEADDIR(inode) -+ || sigen != au_iigen(inode, NULL))) -+ goto out_iput; -+ -+ dentry = NULL; -+ if (!dir_ino || S_ISDIR(inode->i_mode)) -+ dentry = d_find_alias(inode); -+ else { -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ if (!au_test_anon(d) -+ && d_inode(d->d_parent)->i_ino == dir_ino) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ if (unlikely(dentry && au_digen_test(dentry, sigen))) { -+ /* need to refresh */ -+ dput(dentry); -+ dentry = NULL; -+ } -+ -+out_iput: -+ iput(inode); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: dirty? */ -+/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ -+ -+struct au_compare_mnt_args { -+ /* input */ -+ struct super_block *sb; -+ -+ /* output */ -+ struct vfsmount *mnt; -+}; -+ -+static int au_compare_mnt(struct vfsmount *mnt, void *arg) -+{ -+ struct au_compare_mnt_args *a = arg; -+ -+ if (mnt->mnt_sb != a->sb) -+ return 0; -+ a->mnt = mntget(mnt); -+ return 1; -+} -+ -+static struct vfsmount *au_mnt_get(struct super_block *sb) -+{ -+ int err; -+ struct path root; -+ struct au_compare_mnt_args args = { -+ .sb = sb -+ }; -+ -+ get_fs_root(current->fs, &root); -+ rcu_read_lock(); -+ err = iterate_mounts(au_compare_mnt, &args, root.mnt); -+ rcu_read_unlock(); -+ path_put(&root); -+ AuDebugOn(!err); -+ AuDebugOn(!args.mnt); -+ return args.mnt; -+} -+ -+struct au_nfsd_si_lock { -+ unsigned int sigen; -+ aufs_bindex_t bindex, br_id; -+ unsigned char force_lock; -+}; -+ -+static int si_nfsd_read_lock(struct super_block *sb, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ /* branch id may be wrapped around */ -+ err = 0; -+ bindex = au_br_index(sb, nsi_lock->br_id); -+ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) -+ goto out; /* success */ -+ -+ err = -ESTALE; -+ bindex = -1; -+ if (!nsi_lock->force_lock) -+ si_read_unlock(sb); -+ -+out: -+ nsi_lock->bindex = bindex; -+ return err; -+} -+ -+struct find_name_by_ino { -+ struct dir_context ctx; -+ int called, found; -+ ino_t ino; -+ char *name; -+ int namelen; -+}; -+ -+static int -+find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, -+ loff_t offset, u64 ino, unsigned int d_type) -+{ -+ struct find_name_by_ino *a = container_of(ctx, struct find_name_by_ino, -+ ctx); -+ -+ a->called++; -+ if (a->ino != ino) -+ return 0; -+ -+ memcpy(a->name, name, namelen); -+ a->namelen = namelen; -+ a->found = 1; -+ return 1; -+} -+ -+static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *parent; -+ struct file *file; -+ struct inode *dir; -+ struct find_name_by_ino arg = { -+ .ctx = { -+ .actor = find_name_by_ino -+ } -+ }; -+ int err; -+ -+ parent = path->dentry; -+ if (nsi_lock) -+ si_read_unlock(parent->d_sb); -+ file = vfsub_dentry_open(path, au_dir_roflags); -+ dentry = (void *)file; -+ if (IS_ERR(file)) -+ goto out; -+ -+ dentry = ERR_PTR(-ENOMEM); -+ arg.name = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!arg.name)) -+ goto out_file; -+ arg.ino = ino; -+ arg.found = 0; -+ do { -+ arg.called = 0; -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(file, &arg.ctx); -+ } while (!err && !arg.found && arg.called); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_name; -+ /* instead of ENOENT */ -+ dentry = ERR_PTR(-ESTALE); -+ if (!arg.found) -+ goto out_name; -+ -+ /* do not call vfsub_lkup_one() */ -+ dir = d_inode(parent); -+ dentry = vfsub_lookup_one_len_unlocked(arg.name, path, arg.namelen); -+ AuTraceErrPtr(dentry); -+ if (IS_ERR(dentry)) -+ goto out_name; -+ AuDebugOn(au_test_anon(dentry)); -+ if (unlikely(d_really_is_negative(dentry))) { -+ dput(dentry); -+ dentry = ERR_PTR(-ENOENT); -+ } -+ -+out_name: -+ free_page((unsigned long)arg.name); -+out_file: -+ fput(file); -+out: -+ if (unlikely(nsi_lock -+ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry; -+ struct path path; -+ -+ if (dir_ino != AUFS_ROOT_INO) { -+ path.dentry = decode_by_ino(sb, dir_ino, 0); -+ dentry = path.dentry; -+ if (!path.dentry || IS_ERR(path.dentry)) -+ goto out; -+ AuDebugOn(au_test_anon(path.dentry)); -+ } else -+ path.dentry = dget(sb->s_root); -+ -+ path.mnt = au_mnt_get(sb); -+ dentry = au_lkup_by_ino(&path, ino, nsi_lock); -+ path_put(&path); -+ -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int h_acceptable(void *expv, struct dentry *dentry) -+{ -+ return 1; -+} -+ -+static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, -+ char *buf, int len, struct super_block *sb) -+{ -+ char *p; -+ int n; -+ struct path path; -+ -+ p = d_path(h_rootpath, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ n = strlen(p); -+ -+ path.mnt = h_rootpath->mnt; -+ path.dentry = h_parent; -+ p = d_path(&path, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p += n; -+ -+ path.mnt = au_mnt_get(sb); -+ path.dentry = sb->s_root; -+ p = d_path(&path, buf, len - strlen(p)); -+ mntput(path.mnt); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p[strlen(p)] = '/'; -+ -+out: -+ AuTraceErrPtr(p); -+ return p; -+} -+ -+static -+struct dentry *decode_by_path(struct super_block *sb, ino_t ino, __u32 *fh, -+ int fh_len, struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *h_parent, *root; -+ struct super_block *h_sb; -+ char *pathname, *p; -+ struct vfsmount *h_mnt; -+ struct au_branch *br; -+ int err; -+ struct path path; -+ -+ br = au_sbr(sb, nsi_lock->bindex); -+ h_mnt = au_br_mnt(br); -+ h_sb = h_mnt->mnt_sb; -+ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ -+ lockdep_off(); -+ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), -+ fh_len - Fh_tail, fh[Fh_h_type], -+ h_acceptable, /*context*/NULL); -+ lockdep_on(); -+ dentry = h_parent; -+ if (unlikely(!h_parent || IS_ERR(h_parent))) { -+ AuWarn1("%s decode_fh failed, %ld\n", -+ au_sbtype(h_sb), PTR_ERR(h_parent)); -+ goto out; -+ } -+ dentry = NULL; -+ if (unlikely(au_test_anon(h_parent))) { -+ AuWarn1("%s decode_fh returned a disconnected dentry\n", -+ au_sbtype(h_sb)); -+ goto out_h_parent; -+ } -+ -+ dentry = ERR_PTR(-ENOMEM); -+ pathname = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!pathname)) -+ goto out_h_parent; -+ -+ root = sb->s_root; -+ path.mnt = h_mnt; -+ di_read_lock_parent(root, !AuLock_IR); -+ path.dentry = au_h_dptr(root, nsi_lock->bindex); -+ di_read_unlock(root, !AuLock_IR); -+ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); -+ dentry = (void *)p; -+ if (IS_ERR(p)) -+ goto out_pathname; -+ -+ si_read_unlock(sb); -+ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_relock; -+ -+ dentry = ERR_PTR(-ENOENT); -+ AuDebugOn(au_test_anon(path.dentry)); -+ if (unlikely(d_really_is_negative(path.dentry))) -+ goto out_path; -+ -+ if (ino != d_inode(path.dentry)->i_ino) -+ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); -+ else -+ dentry = dget(path.dentry); -+ -+out_path: -+ path_put(&path); -+out_relock: -+ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+out_pathname: -+ free_page((unsigned long)pathname); -+out_h_parent: -+ dput(h_parent); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry * -+aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, -+ int fh_type) -+{ -+ struct dentry *dentry; -+ __u32 *fh = fid->raw; -+ struct au_branch *br; -+ ino_t ino, dir_ino; -+ struct au_nfsd_si_lock nsi_lock = { -+ .force_lock = 0 -+ }; -+ -+ dentry = ERR_PTR(-ESTALE); -+ /* it should never happen, but the file handle is unreliable */ -+ if (unlikely(fh_len < Fh_tail)) -+ goto out; -+ nsi_lock.sigen = fh[Fh_sigen]; -+ nsi_lock.br_id = fh[Fh_br_id]; -+ -+ /* branch id may be wrapped around */ -+ br = NULL; -+ if (unlikely(si_nfsd_read_lock(sb, &nsi_lock))) -+ goto out; -+ nsi_lock.force_lock = 1; -+ -+ /* is this inode still cached? */ -+ ino = decode_ino(fh + Fh_ino); -+ /* it should never happen */ -+ if (unlikely(ino == AUFS_ROOT_INO)) -+ goto out_unlock; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ dentry = decode_by_ino(sb, ino, dir_ino); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* is the parent dir cached? */ -+ br = au_sbr(sb, nsi_lock.bindex); -+ au_lcnt_inc(&br->br_nfiles); -+ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* lookup path */ -+ dentry = decode_by_path(sb, ino, fh, fh_len, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (unlikely(!dentry)) -+ /* todo?: make it ESTALE */ -+ goto out_unlock; -+ -+accept: -+ if (!au_digen_test(dentry, au_sigen(sb)) -+ && d_inode(dentry)->i_generation == fh[Fh_igen]) -+ goto out_unlock; /* success */ -+ -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+out_unlock: -+ if (br) -+ au_lcnt_dec(&br->br_nfiles); -+ si_read_unlock(sb); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+#if 0 /* reserved for future use */ -+/* support subtreecheck option */ -+static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, -+ int fh_len, int fh_type) -+{ -+ struct dentry *parent; -+ __u32 *fh = fid->raw; -+ ino_t dir_ino; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ parent = decode_by_ino(sb, dir_ino, 0); -+ if (IS_ERR(parent)) -+ goto out; -+ if (!parent) -+ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), -+ dir_ino, fh, fh_len); -+ -+out: -+ AuTraceErrPtr(parent); -+ return parent; -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, -+ struct inode *dir) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ struct dentry *dentry, *parent, *h_parent; -+ struct inode *h_dir; -+ struct au_branch *br; -+ -+ err = -ENOSPC; -+ if (unlikely(*max_len <= Fh_tail)) { -+ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); -+ goto out; -+ } -+ -+ err = FILEID_ROOT; -+ if (inode->i_ino == AUFS_ROOT_INO) { -+ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); -+ goto out; -+ } -+ -+ h_parent = NULL; -+ sb = inode->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH); -+ if (unlikely(err)) -+ goto out; -+ -+#ifdef CONFIG_AUFS_DEBUG -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ AuWarn1("NFS-exporting requires xino\n"); -+#endif -+ err = -EIO; -+ parent = NULL; -+ ii_read_lock_child(inode); -+ bindex = au_ibtop(inode); -+ if (!dir) { -+ dentry = d_find_any_alias(inode); -+ if (unlikely(!dentry)) -+ goto out_unlock; -+ AuDebugOn(au_test_anon(dentry)); -+ parent = dget_parent(dentry); -+ dput(dentry); -+ if (unlikely(!parent)) -+ goto out_unlock; -+ if (d_really_is_positive(parent)) -+ dir = d_inode(parent); -+ } -+ -+ ii_read_lock_parent(dir); -+ h_dir = au_h_iptr(dir, bindex); -+ ii_read_unlock(dir); -+ if (unlikely(!h_dir)) -+ goto out_parent; -+ h_parent = d_find_any_alias(h_dir); -+ if (unlikely(!h_parent)) -+ goto out_hparent; -+ -+ err = -EPERM; -+ br = au_sbr(sb, bindex); -+ h_sb = au_br_sb(br); -+ if (unlikely(!h_sb->s_export_op)) { -+ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); -+ goto out_hparent; -+ } -+ -+ fh[Fh_br_id] = br->br_id; -+ fh[Fh_sigen] = au_sigen(sb); -+ encode_ino(fh + Fh_ino, inode->i_ino); -+ encode_ino(fh + Fh_dir_ino, dir->i_ino); -+ fh[Fh_igen] = inode->i_generation; -+ -+ *max_len -= Fh_tail; -+ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), -+ max_len, -+ /*connectable or subtreecheck*/0); -+ err = fh[Fh_h_type]; -+ *max_len += Fh_tail; -+ /* todo: macros? */ -+ if (err != FILEID_INVALID) -+ err = 99; -+ else -+ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); -+ -+out_hparent: -+ dput(h_parent); -+out_parent: -+ dput(parent); -+out_unlock: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+out: -+ if (unlikely(err < 0)) -+ err = FILEID_INVALID; -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_commit_metadata(struct inode *inode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ int (*f)(struct inode *inode); -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ ii_write_lock_child(inode); -+ bindex = au_ibtop(inode); -+ AuDebugOn(bindex < 0); -+ h_inode = au_h_iptr(inode, bindex); -+ -+ f = h_inode->i_sb->s_export_op->commit_metadata; -+ if (f) -+ err = f(h_inode); -+ else -+ err = sync_inode_metadata(h_inode, /*wait*/1); -+ -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct export_operations aufs_export_op = { -+ .fh_to_dentry = aufs_fh_to_dentry, -+ /* .fh_to_parent = aufs_fh_to_parent, */ -+ .encode_fh = aufs_encode_fh, -+ .commit_metadata = aufs_commit_metadata -+}; -+ -+void au_export_init(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ __u32 u; -+ -+ BUILD_BUG_ON_MSG(IS_BUILTIN(CONFIG_AUFS_FS) -+ && IS_MODULE(CONFIG_EXPORTFS), -+ AUFS_NAME ": unsupported configuration " -+ "CONFIG_EXPORTFS=m and CONFIG_AUFS_FS=y"); -+ -+ sb->s_export_op = &aufs_export_op; -+ sbinfo = au_sbi(sb); -+ sbinfo->si_xigen = NULL; -+ get_random_bytes(&u, sizeof(u)); -+ BUILD_BUG_ON(sizeof(u) != sizeof(int)); -+ atomic_set(&sbinfo->si_xigen_next, u); -+} -diff -Nurp linux-5.15.37/fs/aufs/fhsm.c linux-5.15.37-aufs/fs/aufs/fhsm.c ---- linux-5.15.37/fs/aufs/fhsm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/fhsm.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,413 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * File-based Hierarchy Storage Management -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t au_fhsm_bottom(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ return fhsm->fhsm_bottom; -+} -+ -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ AuDebugOn(!fhsm); -+ fhsm->fhsm_bottom = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_fhsm_test_jiffy(struct au_sbinfo *sbinfo, struct au_branch *br) -+{ -+ struct au_br_fhsm *bf; -+ -+ bf = br->br_fhsm; -+ MtxMustLock(&bf->bf_lock); -+ -+ return !bf->bf_readable -+ || time_after(jiffies, -+ bf->bf_jiffy + sbinfo->si_fhsm.fhsm_expire); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fhsm_notify(struct super_block *sb, int val) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (au_fhsm_pid(fhsm) -+ && atomic_read(&fhsm->fhsm_readable) != -1) { -+ atomic_set(&fhsm->fhsm_readable, val); -+ if (val) -+ wake_up(&fhsm->fhsm_wqh); -+ } -+} -+ -+static int au_fhsm_stfs(struct super_block *sb, aufs_bindex_t bindex, -+ struct aufs_stfs *rstfs, int do_lock, int do_notify) -+{ -+ int err; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ br = au_sbr(sb, bindex); -+ AuDebugOn(au_br_rdonly(br)); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ -+ if (do_lock) -+ mutex_lock(&bf->bf_lock); -+ else -+ MtxMustLock(&bf->bf_lock); -+ -+ /* sb->s_root for NFS is unreliable */ -+ err = au_br_stfs(br, &bf->bf_stfs); -+ if (unlikely(err)) { -+ AuErr1("FHSM failed (%d), b%d, ignored.\n", bindex, err); -+ goto out; -+ } -+ -+ bf->bf_jiffy = jiffies; -+ bf->bf_readable = 1; -+ if (do_notify) -+ au_fhsm_notify(sb, /*val*/1); -+ if (rstfs) -+ *rstfs = bf->bf_stfs; -+ -+out: -+ if (do_lock) -+ mutex_unlock(&bf->bf_lock); -+ au_fhsm_notify(sb, /*val*/1); -+ -+ return err; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ AuDbg("b%d, force %d\n", bindex, force); -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ if (!au_ftest_si(sbinfo, FHSM) -+ || fhsm->fhsm_bottom == bindex) -+ return; -+ -+ br = au_sbr(sb, bindex); -+ bf = br->br_fhsm; -+ AuDebugOn(!bf); -+ mutex_lock(&bf->bf_lock); -+ if (force -+ || au_fhsm_pid(fhsm) -+ || au_fhsm_test_jiffy(sbinfo, br)) -+ err = au_fhsm_stfs(sb, bindex, /*rstfs*/NULL, /*do_lock*/0, -+ /*do_notify*/1); -+ mutex_unlock(&bf->bf_lock); -+} -+ -+void au_fhsm_wrote_all(struct super_block *sb, int force) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ /* exclude the bottom */ -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ au_fhsm_wrote(sb, bindex, force); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static __poll_t au_fhsm_poll(struct file *file, struct poll_table_struct *wait) -+{ -+ __poll_t mask; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ mask = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ poll_wait(file, &fhsm->fhsm_wqh, wait); -+ if (atomic_read(&fhsm->fhsm_readable)) -+ mask = EPOLLIN /* | EPOLLRDNORM */; -+ -+ if (!mask) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -+ -+static int au_fhsm_do_read_one(struct aufs_stbr __user *stbr, -+ struct aufs_stfs *stfs, __s16 brid) -+{ -+ int err; -+ -+ err = copy_to_user(&stbr->stfs, stfs, sizeof(*stfs)); -+ if (!err) -+ err = __put_user(brid, &stbr->brid); -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_do_read(struct super_block *sb, -+ struct aufs_stbr __user *stbr, size_t count) -+{ -+ ssize_t err; -+ int nstbr; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ struct au_br_fhsm *bf; -+ -+ /* except the bottom branch */ -+ err = 0; -+ nstbr = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; !err && bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_fhsm(br->br_perm)) -+ continue; -+ -+ bf = br->br_fhsm; -+ mutex_lock(&bf->bf_lock); -+ if (bf->bf_readable) { -+ err = -EFAULT; -+ if (count >= sizeof(*stbr)) -+ err = au_fhsm_do_read_one(stbr++, &bf->bf_stfs, -+ br->br_id); -+ if (!err) { -+ bf->bf_readable = 0; -+ count -= sizeof(*stbr); -+ nstbr++; -+ } -+ } -+ mutex_unlock(&bf->bf_lock); -+ } -+ if (!err) -+ err = sizeof(*stbr) * nstbr; -+ -+ return err; -+} -+ -+static ssize_t au_fhsm_read(struct file *file, char __user *buf, size_t count, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int readable; -+ aufs_bindex_t nfhsm, bindex, bbot; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ struct au_branch *br; -+ struct super_block *sb; -+ -+ err = 0; -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+need_data: -+ spin_lock_irq(&fhsm->fhsm_wqh.lock); -+ if (!atomic_read(&fhsm->fhsm_readable)) { -+ if (vfsub_file_flags(file) & O_NONBLOCK) -+ err = -EAGAIN; -+ else -+ err = wait_event_interruptible_locked_irq -+ (fhsm->fhsm_wqh, -+ atomic_read(&fhsm->fhsm_readable)); -+ } -+ spin_unlock_irq(&fhsm->fhsm_wqh.lock); -+ if (unlikely(err)) -+ goto out; -+ -+ /* sb may already be dead */ -+ au_rw_read_lock(&sbinfo->si_rwsem); -+ readable = atomic_read(&fhsm->fhsm_readable); -+ if (readable > 0) { -+ sb = sbinfo->si_sb; -+ AuDebugOn(!sb); -+ /* exclude the bottom branch */ -+ nfhsm = 0; -+ bbot = au_fhsm_bottom(sb); -+ for (bindex = 0; bindex < bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) -+ nfhsm++; -+ } -+ err = -EMSGSIZE; -+ if (nfhsm * sizeof(struct aufs_stbr) <= count) { -+ atomic_set(&fhsm->fhsm_readable, 0); -+ err = au_fhsm_do_read(sbinfo->si_sb, (void __user *)buf, -+ count); -+ } -+ } -+ au_rw_read_unlock(&sbinfo->si_rwsem); -+ if (!readable) -+ goto need_data; -+ -+out: -+ return err; -+} -+ -+static int au_fhsm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ /* sb may already be dead */ -+ sbinfo = file->private_data; -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+ kobject_put(&sbinfo->si_kobj); -+ -+ return 0; -+} -+ -+static const struct file_operations au_fhsm_fops = { -+ .owner = THIS_MODULE, -+ .llseek = noop_llseek, -+ .read = au_fhsm_read, -+ .poll = au_fhsm_poll, -+ .release = au_fhsm_release -+}; -+ -+int au_fhsm_fd(struct super_block *sb, int oflags) -+{ -+ int err, fd; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) -+ goto out; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock(&fhsm->fhsm_spin); -+ if (!fhsm->fhsm_pid) -+ fhsm->fhsm_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&fhsm->fhsm_spin); -+ if (unlikely(err)) -+ goto out; -+ -+ oflags |= O_RDONLY; -+ /* oflags |= FMODE_NONOTIFY; */ -+ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out_pid; -+ -+ /* succeed regardless 'fhsm' status */ -+ kobject_get(&sbinfo->si_kobj); -+ si_noflush_read_lock(sb); -+ if (au_ftest_si(sbinfo, FHSM)) -+ au_fhsm_wrote_all(sb, /*force*/0); -+ si_read_unlock(sb); -+ goto out; /* success */ -+ -+out_pid: -+ spin_lock(&fhsm->fhsm_spin); -+ fhsm->fhsm_pid = 0; -+ spin_unlock(&fhsm->fhsm_spin); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_fhsm_br_alloc(struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ br->br_fhsm = kmalloc(sizeof(*br->br_fhsm), GFP_NOFS); -+ if (br->br_fhsm) -+ au_br_fhsm_init(br->br_fhsm); -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_fhsm_fin(struct super_block *sb) -+{ -+ au_fhsm_notify(sb, /*val*/-1); -+} -+ -+void au_fhsm_init(struct au_sbinfo *sbinfo) -+{ -+ struct au_fhsm *fhsm; -+ -+ fhsm = &sbinfo->si_fhsm; -+ spin_lock_init(&fhsm->fhsm_spin); -+ init_waitqueue_head(&fhsm->fhsm_wqh); -+ atomic_set(&fhsm->fhsm_readable, 0); -+ fhsm->fhsm_expire -+ = msecs_to_jiffies(AUFS_FHSM_CACHE_DEF_SEC * MSEC_PER_SEC); -+ fhsm->fhsm_bottom = -1; -+} -+ -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec) -+{ -+ sbinfo->si_fhsm.fhsm_expire -+ = msecs_to_jiffies(sec * MSEC_PER_SEC); -+} -+ -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo) -+{ -+ unsigned int u; -+ -+ if (!au_ftest_si(sbinfo, FHSM)) -+ return; -+ -+ u = jiffies_to_msecs(sbinfo->si_fhsm.fhsm_expire) / MSEC_PER_SEC; -+ if (u != AUFS_FHSM_CACHE_DEF_SEC) -+ seq_printf(seq, ",fhsm_sec=%u", u); -+} -diff -Nurp linux-5.15.37/fs/aufs/file.c linux-5.15.37-aufs/fs/aufs/file.c ---- linux-5.15.37/fs/aufs/file.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/file.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,850 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * handling file/dir, and address_space operation -+ */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+#include -+#endif -+#include -+#include "aufs.h" -+ -+/* drop flags for writing */ -+unsigned int au_file_roflags(unsigned int flags) -+{ -+ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); -+ flags |= O_RDONLY | O_NOATIME; -+ return flags; -+} -+ -+/* common functions to regular file and dir */ -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_path; -+ int err; -+ -+ /* a race condition can happen between open and unlink/rmdir */ -+ h_file = ERR_PTR(-ENOENT); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ spin_lock(&h_dentry->d_lock); -+ err = (!d_unhashed(dentry) && d_unlinked(h_dentry)) -+ /* || !d_inode(dentry)->i_nlink */ -+ ; -+ spin_unlock(&h_dentry->d_lock); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ err = au_br_test_oflag(flags, br); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* drop flags for writing */ -+ if (au_test_ro(sb, bindex, d_inode(dentry))) { -+ if (force_wr && !(flags & O_WRONLY)) -+ force_wr = 0; -+ flags = au_file_roflags(flags); -+ if (force_wr) { -+ h_file = ERR_PTR(-EROFS); -+ flags = au_file_roflags(flags); -+ if (unlikely(vfsub_native_ro(h_inode) -+ || IS_APPEND(h_inode))) -+ goto out; -+ flags &= ~O_ACCMODE; -+ flags |= O_WRONLY; -+ } -+ } -+ flags &= ~O_CREAT; -+ au_lcnt_inc(&br->br_nfiles); -+ h_path.dentry = h_dentry; -+ h_path.mnt = au_br_mnt(br); -+ h_file = vfsub_dentry_open(&h_path, flags); -+ if (IS_ERR(h_file)) -+ goto out_br; -+ -+ if (flags & __FMODE_EXEC) { -+ err = deny_write_access(h_file); -+ if (unlikely(err)) { -+ fput(h_file); -+ h_file = ERR_PTR(err); -+ goto out_br; -+ } -+ } -+ fsnotify_open(h_file); -+ goto out; /* success */ -+ -+out_br: -+ au_lcnt_dec(&br->br_nfiles); -+out: -+ return h_file; -+} -+ -+static int au_cmoo(struct dentry *dentry) -+{ -+ int err, cmoo, matched; -+ unsigned int udba; -+ struct path h_path; -+ struct au_pin pin; -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ struct inode *delegated; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct au_fhsm *fhsm; -+ pid_t pid; -+ struct au_branch *br; -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ -+ DiMustWriteLock(dentry); -+ IiMustWriteLock(d_inode(dentry)); -+ -+ err = 0; -+ if (IS_ROOT(dentry)) -+ goto out; -+ cpg.bsrc = au_dbtop(dentry); -+ if (!cpg.bsrc) -+ goto out; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ fhsm = &sbinfo->si_fhsm; -+ pid = au_fhsm_pid(fhsm); -+ rcu_read_lock(); -+ matched = (pid -+ && (current->pid == pid -+ || rcu_dereference(current->real_parent)->pid == pid)); -+ rcu_read_unlock(); -+ if (matched) -+ goto out; -+ -+ br = au_sbr(sb, cpg.bsrc); -+ cmoo = au_br_cmoo(br->br_perm); -+ if (!cmoo) -+ goto out; -+ if (!d_is_reg(dentry)) -+ cmoo &= AuBrAttr_COO_ALL; -+ if (!cmoo) -+ goto out; -+ -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ err = au_wbr_do_copyup_bu(dentry, cpg.bsrc - 1); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) { -+ err = 0; /* there is no upper writable branch */ -+ goto out_dgrade; -+ } -+ AuDbg("bsrc %d, bdst %d\n", cpg.bsrc, cpg.bdst); -+ -+ /* do not respect the coo attrib for the target branch */ -+ err = au_cpup_dirs(dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ di_downgrade_lock(parent, AuLock_IR); -+ udba = au_opt_udba(sb); -+ err = au_pin(&pin, dentry, cpg.bdst, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ if (unlikely(err)) -+ goto out_parent; -+ if (!(cmoo & AuBrWAttr_MOO)) -+ goto out_parent; /* success */ -+ -+ err = au_pin(&pin, dentry, cpg.bsrc, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = au_h_dptr(dentry, cpg.bsrc); -+ hdir = au_hi(d_inode(parent), cpg.bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1); -+ au_unpin(&pin); -+ /* todo: keep h_dentry or not? */ -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) { -+ pr_err("unlink %pd after coo failed (%d), ignored\n", -+ dentry, err); -+ err = 0; -+ } -+ goto out_parent; /* success */ -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_parent: -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_do_open(struct file *file, struct au_do_open_args *args) -+{ -+ int err, aopen = args->aopen; -+ struct dentry *dentry; -+ struct au_finfo *finfo; -+ -+ if (!aopen) -+ err = au_finfo_init(file, args->fidir); -+ else { -+ lockdep_off(); -+ err = au_finfo_init(file, args->fidir); -+ lockdep_on(); -+ } -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ di_write_lock_child(dentry); -+ err = au_cmoo(dentry); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (!err) { -+ if (!aopen) -+ err = args->open(file, vfsub_file_flags(file), NULL); -+ else { -+ lockdep_off(); -+ err = args->open(file, vfsub_file_flags(file), -+ args->h_file); -+ lockdep_on(); -+ } -+ } -+ di_read_unlock(dentry, AuLock_IR); -+ -+ finfo = au_fi(file); -+ if (!err) { -+ finfo->fi_file = file; -+ au_hbl_add(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ } -+ if (!aopen) -+ fi_write_unlock(file); -+ else { -+ lockdep_off(); -+ fi_write_unlock(file); -+ lockdep_on(); -+ } -+ if (unlikely(err)) { -+ finfo->fi_hdir = NULL; -+ au_finfo_fin(file); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_reopen_nondir(struct file *file) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct dentry *dentry; -+ struct au_branch *br; -+ struct file *h_file, *h_file_tmp; -+ -+ dentry = file->f_path.dentry; -+ btop = au_dbtop(dentry); -+ br = au_sbr(dentry->d_sb, btop); -+ h_file_tmp = NULL; -+ if (au_fbtop(file) == btop) { -+ h_file = au_hf_top(file); -+ if (file->f_mode == h_file->f_mode) -+ return 0; /* success */ -+ h_file_tmp = h_file; -+ get_file(h_file_tmp); -+ au_lcnt_inc(&br->br_nfiles); -+ au_set_h_fptr(file, btop, NULL); -+ } -+ AuDebugOn(au_fi(file)->fi_hdir); -+ /* -+ * it can happen -+ * file exists on both of rw and ro -+ * open --> dbtop and fbtop are both 0 -+ * prepend a branch as rw, "rw" become ro -+ * remove rw/file -+ * delete the top branch, "rw" becomes rw again -+ * --> dbtop is 1, fbtop is still 0 -+ * write --> fbtop is 0 but dbtop is 1 -+ */ -+ /* AuDebugOn(au_fbtop(file) < btop); */ -+ -+ h_file = au_h_open(dentry, btop, vfsub_file_flags(file) & ~O_TRUNC, -+ file, /*force_wr*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) { -+ if (h_file_tmp) { -+ /* revert */ -+ au_set_h_fptr(file, btop, h_file_tmp); -+ h_file_tmp = NULL; -+ } -+ goto out; /* todo: close all? */ -+ } -+ -+ err = 0; -+ au_set_fbtop(file, btop); -+ au_set_h_fptr(file, btop, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ if (h_file_tmp) { -+ fput(h_file_tmp); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, -+ struct dentry *hi_wh) -+{ -+ int err; -+ aufs_bindex_t btop; -+ struct au_dinfo *dinfo; -+ struct dentry *h_dentry; -+ struct au_hdentry *hdp; -+ -+ dinfo = au_di(file->f_path.dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ btop = dinfo->di_btop; -+ dinfo->di_btop = btgt; -+ hdp = au_hdentry(dinfo, btgt); -+ h_dentry = hdp->hd_dentry; -+ hdp->hd_dentry = hi_wh; -+ err = au_reopen_nondir(file); -+ hdp->hd_dentry = h_dentry; -+ dinfo->di_btop = btop; -+ -+ return err; -+} -+ -+static int au_ready_to_write_wh(struct file *file, loff_t len, -+ aufs_bindex_t bcpup, struct au_pin *pin) -+{ -+ int err; -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry, *hi_wh; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = bcpup, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin -+ }; -+ -+ au_update_dbtop(cpg.dentry); -+ inode = d_inode(cpg.dentry); -+ h_inode = NULL; -+ if (au_dbtop(cpg.dentry) <= bcpup -+ && au_dbbot(cpg.dentry) >= bcpup) { -+ h_dentry = au_h_dptr(cpg.dentry, bcpup); -+ if (h_dentry && d_is_positive(h_dentry)) -+ h_inode = d_inode(h_dentry); -+ } -+ hi_wh = au_hi_wh(inode, bcpup); -+ if (!hi_wh && !h_inode) -+ err = au_sio_cpup_wh(&cpg, file); -+ else -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, bcpup, hi_wh); -+ -+ if (!err -+ && (inode->i_nlink > 1 -+ || (inode->i_state & I_LINKABLE)) -+ && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) -+ au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); -+ -+ return err; -+} -+ -+/* -+ * prepare the @file for writing. -+ */ -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) -+{ -+ int err; -+ aufs_bindex_t dbtop; -+ struct dentry *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = len, -+ .pin = pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bsrc = au_fbtop(file); -+ err = au_test_ro(sb, cpg.bsrc, inode); -+ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) { -+ err = au_pin(pin, cpg.dentry, cpg.bsrc, AuOpt_UDBA_NONE, -+ /*flags*/0); -+ goto out; -+ } -+ -+ /* need to cpup or reopen */ -+ parent = dget_parent(cpg.dentry); -+ di_write_lock_parent(parent); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ if (unlikely(err < 0)) -+ goto out_dgrade; -+ err = 0; -+ -+ if (!d_unhashed(cpg.dentry) && !au_h_dptr(parent, cpg.bdst)) { -+ err = au_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_dgrade; -+ } -+ -+ err = au_pin(pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ dbtop = au_dbtop(cpg.dentry); -+ if (dbtop <= cpg.bdst) -+ cpg.bsrc = cpg.bdst; -+ -+ if (dbtop <= cpg.bdst /* just reopen */ -+ || !d_unhashed(cpg.dentry) /* copyup and reopen */ -+ ) { -+ h_file = au_h_open_pre(cpg.dentry, cpg.bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ di_downgrade_lock(parent, AuLock_IR); -+ if (dbtop > cpg.bdst) -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ err = au_reopen_nondir(file); -+ au_h_open_post(cpg.dentry, cpg.bsrc, h_file); -+ } -+ } else { /* copyup as wh and reopen */ -+ /* -+ * since writable hfsplus branch is not supported, -+ * h_open_pre/post() are unnecessary. -+ */ -+ err = au_ready_to_write_wh(file, len, cpg.bdst, pin); -+ di_downgrade_lock(parent, AuLock_IR); -+ } -+ -+ if (!err) { -+ au_pin_set_parent_lflag(pin, /*lflag*/0); -+ goto out_dput; /* success */ -+ } -+ au_unpin(pin); -+ goto out_unlock; -+ -+out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_dput: -+ dput(parent); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_noflush_read_lock(sb); -+ fi_read_lock(file); -+ ii_read_lock_child(inode); -+ -+ err = flush(file, id); -+ au_cpup_attr_timesizes(inode); -+ -+ ii_read_unlock(inode); -+ fi_read_unlock(file); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_file_refresh_by_inode(struct file *file, int *need_reopen) -+{ -+ int err; -+ struct au_pin pin; -+ struct au_finfo *finfo; -+ struct dentry *parent, *hi_wh; -+ struct inode *inode; -+ struct super_block *sb; -+ struct au_cp_generic cpg = { -+ .dentry = file->f_path.dentry, -+ .bdst = -1, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME -+ }; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ finfo = au_fi(file); -+ sb = cpg.dentry->d_sb; -+ inode = d_inode(cpg.dentry); -+ cpg.bdst = au_ibtop(inode); -+ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry)) -+ goto out; -+ -+ parent = dget_parent(cpg.dentry); -+ if (au_test_ro(sb, cpg.bdst, inode)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); -+ cpg.bdst = err; -+ di_read_unlock(parent, !AuLock_IR); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ err = 0; -+ } -+ -+ di_read_lock_parent(parent, AuLock_IR); -+ hi_wh = au_hi_wh(inode, cpg.bdst); -+ if (!S_ISDIR(inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode) -+ && !d_unhashed(cpg.dentry) -+ && cpg.bdst < au_dbtop(cpg.dentry)) { -+ err = au_test_and_cpup_dirs(cpg.dentry, cpg.bdst); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ /* always superio. */ -+ err = au_pin(&pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ } else if (hi_wh) { -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, cpg.bdst, hi_wh); -+ *need_reopen = 0; -+ } -+ -+out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+out_parent: -+ dput(parent); -+out: -+ return err; -+} -+ -+static void au_do_refresh_dir(struct file *file) -+{ -+ aufs_bindex_t bindex, bbot, new_bindex, brid; -+ struct au_hfile *p, tmp, *q; -+ struct au_finfo *finfo; -+ struct super_block *sb; -+ struct au_fidir *fidir; -+ -+ FiMustWriteLock(file); -+ -+ sb = file->f_path.dentry->d_sb; -+ finfo = au_fi(file); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ p = fidir->fd_hfile + finfo->fi_btop; -+ brid = p->hf_br->br_id; -+ bbot = fidir->fd_bbot; -+ for (bindex = finfo->fi_btop; bindex <= bbot; bindex++, p++) { -+ if (!p->hf_file) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hf_br->br_id); -+ if (new_bindex == bindex) -+ continue; -+ if (new_bindex < 0) { -+ au_set_h_fptr(file, bindex, NULL); -+ continue; -+ } -+ -+ /* swap two lower inode, and loop again */ -+ q = fidir->fd_hfile + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hf_file) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ p = fidir->fd_hfile; -+ if (!au_test_mmapped(file) && !d_unlinked(file->f_path.dentry)) { -+ bbot = au_sbbot(sb); -+ for (finfo->fi_btop = 0; finfo->fi_btop <= bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ } else { -+ bbot = au_br_index(sb, brid); -+ for (finfo->fi_btop = 0; finfo->fi_btop < bbot; -+ finfo->fi_btop++, p++) -+ if (p->hf_file) -+ au_hfput(p, /*execed*/0); -+ bbot = au_sbbot(sb); -+ } -+ -+ p = fidir->fd_hfile + bbot; -+ for (fidir->fd_bbot = bbot; fidir->fd_bbot >= finfo->fi_btop; -+ fidir->fd_bbot--, p--) -+ if (p->hf_file) { -+ if (file_inode(p->hf_file)) -+ break; -+ au_hfput(p, /*execed*/0); -+ } -+ AuDebugOn(fidir->fd_bbot < finfo->fi_btop); -+} -+ -+/* -+ * after branch manipulating, refresh the file. -+ */ -+static int refresh_file(struct file *file, int (*reopen)(struct file *file)) -+{ -+ int err, need_reopen, nbr; -+ aufs_bindex_t bbot, bindex; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_finfo *finfo; -+ struct au_hfile *hfile; -+ -+ dentry = file->f_path.dentry; -+ sb = dentry->d_sb; -+ nbr = au_sbbot(sb) + 1; -+ finfo = au_fi(file); -+ if (!finfo->fi_hdir) { -+ hfile = &finfo->fi_htop; -+ AuDebugOn(!hfile->hf_file); -+ bindex = au_br_index(sb, hfile->hf_br->br_id); -+ AuDebugOn(bindex < 0); -+ if (bindex != finfo->fi_btop) -+ au_set_fbtop(file, bindex); -+ } else { -+ err = au_fidir_realloc(finfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ au_do_refresh_dir(file); -+ } -+ -+ err = 0; -+ need_reopen = 1; -+ if (!au_test_mmapped(file)) -+ err = au_file_refresh_by_inode(file, &need_reopen); -+ if (finfo->fi_hdir) -+ /* harmless if err */ -+ au_fidir_realloc(finfo, nbr, /*may_shrink*/1); -+ if (!err && need_reopen && !d_unlinked(dentry)) -+ err = reopen(file); -+ if (!err) { -+ au_update_figen(file); -+ goto out; /* success */ -+ } -+ -+ /* error, close all lower files */ -+ if (finfo->fi_hdir) { -+ bbot = au_fbbot_dir(file); -+ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ } -+ -+out: -+ return err; -+} -+ -+/* common function to regular file and dir */ -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc) -+{ -+ int err; -+ unsigned int sigen, figen; -+ aufs_bindex_t btop; -+ unsigned char pseudo_link; -+ struct dentry *dentry; -+ struct inode *inode; -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ sigen = au_sigen(dentry->d_sb); -+ fi_write_lock_nested(file, fi_lsc); -+ figen = au_figen(file); -+ if (!fi_lsc) -+ di_write_lock_child(dentry); -+ else -+ di_write_lock_child2(dentry); -+ btop = au_dbtop(dentry); -+ pseudo_link = (btop != au_ibtop(inode)); -+ if (sigen == figen && !pseudo_link && au_fbtop(file) == btop) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ goto out; /* success */ -+ } -+ -+ AuDbg("sigen %d, figen %d\n", sigen, figen); -+ if (au_digen_test(dentry, sigen)) { -+ err = au_reval_dpath(dentry, sigen); -+ AuDebugOn(!err && au_digen_test(dentry, sigen)); -+ } -+ -+ if (!err) -+ err = refresh_file(file, reopen); -+ if (!err) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ } else { -+ di_write_unlock(dentry); -+ fi_write_unlock(file); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cf. aufs_nopage() */ -+/* for madvise(2) */ -+static int aufs_readpage(struct file *file __maybe_unused, struct page *page) -+{ -+ unlock_page(page); -+ return 0; -+} -+ -+/* it will never be called, but necessary to support O_DIRECT */ -+static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) -+{ BUG(); return 0; } -+ -+/* they will never be called. */ -+#ifdef CONFIG_AUFS_DEBUG -+static int aufs_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned flags, -+ struct page **pagep, void **fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_write_end(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned copied, -+ struct page *page, void *fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_writepage(struct page *page, struct writeback_control *wbc) -+{ AuUnsupport(); return 0; } -+ -+static int aufs_set_page_dirty(struct page *page) -+{ AuUnsupport(); return 0; } -+static void aufs_invalidatepage(struct page *page, unsigned int offset, -+ unsigned int length) -+{ AuUnsupport(); } -+static int aufs_releasepage(struct page *page, gfp_t gfp) -+{ AuUnsupport(); return 0; } -+#if 0 /* called by memory compaction regardless file */ -+static int aufs_migratepage(struct address_space *mapping, struct page *newpage, -+ struct page *page, enum migrate_mode mode) -+{ AuUnsupport(); return 0; } -+#endif -+static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) -+{ AuUnsupport(); return true; } -+static void aufs_putback_page(struct page *page) -+{ AuUnsupport(); } -+static int aufs_launder_page(struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_is_partially_uptodate(struct page *page, -+ unsigned long from, -+ unsigned long count) -+{ AuUnsupport(); return 0; } -+static void aufs_is_dirty_writeback(struct page *page, bool *dirty, -+ bool *writeback) -+{ AuUnsupport(); } -+static int aufs_error_remove_page(struct address_space *mapping, -+ struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, -+ sector_t *span) -+{ AuUnsupport(); return 0; } -+static void aufs_swap_deactivate(struct file *file) -+{ AuUnsupport(); } -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+const struct address_space_operations aufs_aop = { -+ .readpage = aufs_readpage, -+ .direct_IO = aufs_direct_IO, -+#ifdef CONFIG_AUFS_DEBUG -+ .writepage = aufs_writepage, -+ /* no writepages, because of writepage */ -+ .set_page_dirty = aufs_set_page_dirty, -+ /* no readpages, because of readpage */ -+ .write_begin = aufs_write_begin, -+ .write_end = aufs_write_end, -+ /* no bmap, no block device */ -+ .invalidatepage = aufs_invalidatepage, -+ .releasepage = aufs_releasepage, -+ /* is fallback_migrate_page ok? */ -+ /* .migratepage = aufs_migratepage, */ -+ .isolate_page = aufs_isolate_page, -+ .putback_page = aufs_putback_page, -+ .launder_page = aufs_launder_page, -+ .is_partially_uptodate = aufs_is_partially_uptodate, -+ .is_dirty_writeback = aufs_is_dirty_writeback, -+ .error_remove_page = aufs_error_remove_page, -+ .swap_activate = aufs_swap_activate, -+ .swap_deactivate = aufs_swap_deactivate -+#endif /* CONFIG_AUFS_DEBUG */ -+}; -diff -Nurp linux-5.15.37/fs/aufs/file.h linux-5.15.37-aufs/fs/aufs/file.h ---- linux-5.15.37/fs/aufs/file.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/file.h 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,329 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * file operations -+ */ -+ -+#ifndef __AUFS_FILE_H__ -+#define __AUFS_FILE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "rwsem.h" -+ -+struct au_branch; -+struct au_hfile { -+ struct file *hf_file; -+ struct au_branch *hf_br; -+}; -+ -+struct au_vdir; -+struct au_fidir { -+ aufs_bindex_t fd_bbot; -+ aufs_bindex_t fd_nent; -+ struct au_vdir *fd_vdir_cache; -+ struct au_hfile fd_hfile[]; -+}; -+ -+static inline int au_fidir_sz(int nent) -+{ -+ AuDebugOn(nent < 0); -+ return sizeof(struct au_fidir) + sizeof(struct au_hfile) * nent; -+} -+ -+struct au_finfo { -+ atomic_t fi_generation; -+ -+ struct au_rwsem fi_rwsem; -+ aufs_bindex_t fi_btop; -+ -+ /* do not union them */ -+ struct { /* for non-dir */ -+ struct au_hfile fi_htop; -+ atomic_t fi_mmapped; -+ }; -+ struct au_fidir *fi_hdir; /* for dir only */ -+ -+ struct hlist_bl_node fi_hlist; -+ struct file *fi_file; /* very ugly */ -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* file.c */ -+extern const struct address_space_operations aufs_aop; -+unsigned int au_file_roflags(unsigned int flags); -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file, int force_wr); -+struct au_do_open_args { -+ int aopen; -+ int (*open)(struct file *file, int flags, -+ struct file *h_file); -+ struct au_fidir *fidir; -+ struct file *h_file; -+}; -+int au_do_open(struct file *file, struct au_do_open_args *args); -+int au_reopen_nondir(struct file *file); -+struct au_pin; -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock, unsigned int fi_lsc); -+int au_do_flush(struct file *file, fl_owner_t id, -+ int (*flush)(struct file *file, fl_owner_t id)); -+ -+/* poll.c */ -+#ifdef CONFIG_AUFS_POLL -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt); -+#endif -+ -+#ifdef CONFIG_AUFS_BR_HFSPLUS -+/* hfsplus.c */ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr); -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#else -+AuStub(struct file *, au_h_open_pre, return NULL, struct dentry *dentry, -+ aufs_bindex_t bindex, int force_wr) -+AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#endif -+ -+/* f_op.c */ -+extern const struct file_operations aufs_file_fop; -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file); -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc); -+ -+/* finfo.c */ -+void au_hfput(struct au_hfile *hf, int execed); -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, -+ struct file *h_file); -+ -+void au_update_figen(struct file *file); -+struct au_fidir *au_fidir_alloc(struct super_block *sb); -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink); -+ -+void au_fi_init_once(void *_fi); -+void au_finfo_fin(struct file *file); -+int au_finfo_init(struct file *file, struct au_fidir *fidir); -+ -+/* ioctl.c */ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_finfo *au_fi(struct file *file) -+{ -+ return file->private_data; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define fi_read_lock(f) au_rw_read_lock(&au_fi(f)->fi_rwsem) -+#define fi_write_lock(f) au_rw_write_lock(&au_fi(f)->fi_rwsem) -+#define fi_read_trylock(f) au_rw_read_trylock(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock(f) au_rw_write_trylock(&au_fi(f)->fi_rwsem) -+/* -+#define fi_read_trylock_nested(f) \ -+ au_rw_read_trylock_nested(&au_fi(f)->fi_rwsem) -+#define fi_write_trylock_nested(f) \ -+ au_rw_write_trylock_nested(&au_fi(f)->fi_rwsem) -+*/ -+ -+#define fi_read_unlock(f) au_rw_read_unlock(&au_fi(f)->fi_rwsem) -+#define fi_write_unlock(f) au_rw_write_unlock(&au_fi(f)->fi_rwsem) -+#define fi_downgrade_lock(f) au_rw_dgrade_lock(&au_fi(f)->fi_rwsem) -+ -+/* lock subclass for finfo */ -+enum { -+ AuLsc_FI_1, -+ AuLsc_FI_2 -+}; -+ -+static inline void fi_read_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_read_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+static inline void fi_write_lock_nested(struct file *f, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_fi(f)->fi_rwsem, lsc); -+} -+ -+/* -+ * fi_read_lock_1, fi_write_lock_1, -+ * fi_read_lock_2, fi_write_lock_2 -+ */ -+#define AuReadLockFunc(name) \ -+static inline void fi_read_lock_##name(struct file *f) \ -+{ fi_read_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuWriteLockFunc(name) \ -+static inline void fi_write_lock_##name(struct file *f) \ -+{ fi_write_lock_nested(f, AuLsc_FI_##name); } -+ -+#define AuRWLockFuncs(name) \ -+ AuReadLockFunc(name) \ -+ AuWriteLockFunc(name) -+ -+AuRWLockFuncs(1); -+AuRWLockFuncs(2); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) -+#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) -+#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: hard/soft set? */ -+static inline aufs_bindex_t au_fbtop(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_btop; -+} -+ -+static inline aufs_bindex_t au_fbbot_dir(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_bbot; -+} -+ -+static inline struct au_vdir *au_fvdir_cache(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_vdir_cache; -+} -+ -+static inline void au_set_fbtop(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_btop = bindex; -+} -+ -+static inline void au_set_fbbot_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_bbot = bindex; -+} -+ -+static inline void au_set_fvdir_cache(struct file *file, -+ struct au_vdir *vdir_cache) -+{ -+ FiMustWriteLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ au_fi(file)->fi_hdir->fd_vdir_cache = vdir_cache; -+} -+ -+static inline struct file *au_hf_top(struct file *file) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_htop.hf_file; -+} -+ -+static inline struct file *au_hf_dir(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustAnyLock(file); -+ AuDebugOn(!au_fi(file)->fi_hdir); -+ return au_fi(file)->fi_hdir->fd_hfile[0 + bindex].hf_file; -+} -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_figen(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_generation); -+} -+ -+static inline void au_set_mmapped(struct file *f) -+{ -+ if (atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ return; -+ pr_warn("fi_mmapped wrapped around\n"); -+ while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) -+ ; -+} -+ -+static inline void au_unset_mmapped(struct file *f) -+{ -+ atomic_dec(&au_fi(f)->fi_mmapped); -+} -+ -+static inline int au_test_mmapped(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_mmapped); -+} -+ -+/* customize vma->vm_file */ -+ -+static inline void au_do_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ f = vma->vm_file; -+ get_file(file); -+ vma->vm_file = file; -+ fput(f); -+} -+ -+#ifdef CONFIG_MMU -+#define AuDbgVmRegion(file, vma) do {} while (0) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ au_do_vm_file_reset(vma, file); -+} -+#else -+#define AuDbgVmRegion(file, vma) \ -+ AuDebugOn((vma)->vm_region && (vma)->vm_region->vm_file != (file)) -+ -+static inline void au_vm_file_reset(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ struct file *f; -+ -+ au_do_vm_file_reset(vma, file); -+ f = vma->vm_region->vm_file; -+ get_file(file); -+ vma->vm_region->vm_file = file; -+ fput(f); -+} -+#endif /* CONFIG_MMU */ -+ -+/* handle vma->vm_prfile */ -+static inline void au_vm_prfile_set(struct vm_area_struct *vma, -+ struct file *file) -+{ -+ get_file(file); -+ vma->vm_prfile = file; -+#ifndef CONFIG_MMU -+ get_file(file); -+ vma->vm_region->vm_prfile = file; -+#endif -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FILE_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/finfo.c linux-5.15.37-aufs/fs/aufs/finfo.c ---- linux-5.15.37/fs/aufs/finfo.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/finfo.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,136 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * file private data -+ */ -+ -+#include "aufs.h" -+ -+void au_hfput(struct au_hfile *hf, int execed) -+{ -+ if (execed) -+ allow_write_access(hf->hf_file); -+ fput(hf->hf_file); -+ hf->hf_file = NULL; -+ au_lcnt_dec(&hf->hf_br->br_nfiles); -+ hf->hf_br = NULL; -+} -+ -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) -+{ -+ struct au_finfo *finfo = au_fi(file); -+ struct au_hfile *hf; -+ struct au_fidir *fidir; -+ -+ fidir = finfo->fi_hdir; -+ if (!fidir) { -+ AuDebugOn(finfo->fi_btop != bindex); -+ hf = &finfo->fi_htop; -+ } else -+ hf = fidir->fd_hfile + bindex; -+ -+ if (hf && hf->hf_file) -+ au_hfput(hf, vfsub_file_execed(file)); -+ if (val) { -+ FiMustWriteLock(file); -+ AuDebugOn(IS_ERR_OR_NULL(file->f_path.dentry)); -+ hf->hf_file = val; -+ hf->hf_br = au_sbr(file->f_path.dentry->d_sb, bindex); -+ } -+} -+ -+void au_update_figen(struct file *file) -+{ -+ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_path.dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_fidir *au_fidir_alloc(struct super_block *sb) -+{ -+ struct au_fidir *fidir; -+ int nbr; -+ -+ nbr = au_sbbot(sb) + 1; -+ if (nbr < 2) -+ nbr = 2; /* initial allocate for 2 branches */ -+ fidir = kzalloc(au_fidir_sz(nbr), GFP_NOFS); -+ if (fidir) { -+ fidir->fd_bbot = -1; -+ fidir->fd_nent = nbr; -+ } -+ -+ return fidir; -+} -+ -+int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink) -+{ -+ int err; -+ struct au_fidir *fidir, *p; -+ -+ AuRwMustWriteLock(&finfo->fi_rwsem); -+ fidir = finfo->fi_hdir; -+ AuDebugOn(!fidir); -+ -+ err = -ENOMEM; -+ p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), -+ GFP_NOFS, may_shrink); -+ if (p) { -+ p->fd_nent = nbr; -+ finfo->fi_hdir = p; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_finfo_fin(struct file *file) -+{ -+ struct au_finfo *finfo; -+ -+ au_lcnt_dec(&au_sbi(file->f_path.dentry->d_sb)->si_nfiles); -+ -+ finfo = au_fi(file); -+ AuDebugOn(finfo->fi_hdir); -+ AuRwDestroy(&finfo->fi_rwsem); -+ au_cache_free_finfo(finfo); -+} -+ -+void au_fi_init_once(void *_finfo) -+{ -+ struct au_finfo *finfo = _finfo; -+ -+ au_rw_init(&finfo->fi_rwsem); -+} -+ -+int au_finfo_init(struct file *file, struct au_fidir *fidir) -+{ -+ int err; -+ struct au_finfo *finfo; -+ struct dentry *dentry; -+ -+ err = -ENOMEM; -+ dentry = file->f_path.dentry; -+ finfo = au_cache_alloc_finfo(); -+ if (unlikely(!finfo)) -+ goto out; -+ -+ err = 0; -+ au_lcnt_inc(&au_sbi(dentry->d_sb)->si_nfiles); -+ au_rw_write_lock(&finfo->fi_rwsem); -+ finfo->fi_btop = -1; -+ finfo->fi_hdir = fidir; -+ atomic_set(&finfo->fi_generation, au_digen(dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+ -+ file->private_data = finfo; -+ -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/f_op.c linux-5.15.37-aufs/fs/aufs/f_op.c ---- linux-5.15.37/fs/aufs/f_op.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/f_op.c 2022-04-08 20:22:30.612616475 +0300 -@@ -0,0 +1,758 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * file and vm operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+int au_do_open_nondir(struct file *file, int flags, struct file *h_file) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct dentry *dentry, *h_dentry; -+ struct au_finfo *finfo; -+ struct inode *h_inode; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ dentry = file->f_path.dentry; -+ AuDebugOn(IS_ERR_OR_NULL(dentry)); -+ finfo = au_fi(file); -+ memset(&finfo->fi_htop, 0, sizeof(finfo->fi_htop)); -+ atomic_set(&finfo->fi_mmapped, 0); -+ bindex = au_dbtop(dentry); -+ if (!h_file) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ goto out; -+ } -+ } else { -+ h_dentry = h_file->f_path.dentry; -+ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); -+ if (unlikely(err)) -+ goto out; -+ /* br ref is already inc-ed */ -+ } -+ -+ if ((flags & __O_TMPFILE) -+ && !(flags & O_EXCL)) { -+ h_inode = file_inode(h_file); -+ spin_lock(&h_inode->i_lock); -+ h_inode->i_state |= I_LINKABLE; -+ spin_unlock(&h_inode->i_lock); -+ } -+ au_set_fbtop(file, bindex); -+ au_set_h_fptr(file, bindex, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+out: -+ return err; -+} -+ -+static int aufs_open_nondir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_do_open_args args = { -+ .open = au_do_open_nondir -+ }; -+ -+ AuDbg("%pD, f_flags 0x%x, f_mode 0x%x\n", -+ file, vfsub_file_flags(file), file->f_mode); -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_do_open(file, &args); -+ si_read_unlock(sb); -+ return err; -+} -+ -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) -+{ -+ struct au_finfo *finfo; -+ aufs_bindex_t bindex; -+ -+ finfo = au_fi(file); -+ au_hbl_del(&finfo->fi_hlist, -+ &au_sbi(file->f_path.dentry->d_sb)->si_files); -+ bindex = finfo->fi_btop; -+ if (bindex >= 0) -+ au_set_h_fptr(file, bindex, NULL); -+ -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ int err; -+ struct file *h_file; -+ -+ err = 0; -+ h_file = au_hf_top(file); -+ if (h_file) -+ err = vfsub_flush(h_file, id); -+ return err; -+} -+ -+static int aufs_flush_nondir(struct file *file, fl_owner_t id) -+{ -+ return au_do_flush(file, id, au_do_flush_nondir); -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * read and write functions acquire [fdi]_rwsem once, but release before -+ * mmap_sem. This is because to stop a race condition between mmap(2). -+ * Releasing these aufs-rwsem should be safe, no branch-management (by keeping -+ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in -+ * read functions after [fdi]_rwsem are released, but it should be harmless. -+ */ -+ -+/* Callers should call au_read_post() or fput() in the end */ -+struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc) -+{ -+ struct file *h_file; -+ int err; -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0, lsc); -+ if (!err) { -+ di_read_unlock(file->f_path.dentry, AuLock_IR); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (!keep_fi) -+ fi_read_unlock(file); -+ } else -+ h_file = ERR_PTR(err); -+ -+ return h_file; -+} -+ -+static void au_read_post(struct inode *inode, struct file *h_file) -+{ -+ /* update without lock, I don't think it a problem */ -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ fput(h_file); -+} -+ -+struct au_write_pre { -+ /* input */ -+ unsigned int lsc; -+ -+ /* output */ -+ blkcnt_t blks; -+ aufs_bindex_t btop; -+}; -+ -+/* -+ * return with iinfo is write-locked -+ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the -+ * end -+ */ -+static struct file *au_write_pre(struct file *file, int do_ready, -+ struct au_write_pre *wpre) -+{ -+ struct file *h_file; -+ struct dentry *dentry; -+ int err; -+ unsigned int lsc; -+ struct au_pin pin; -+ -+ lsc = 0; -+ if (wpre) -+ lsc = wpre->lsc; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, lsc); -+ h_file = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ if (do_ready) { -+ err = au_ready_to_write(file, -1, &pin); -+ if (unlikely(err)) { -+ h_file = ERR_PTR(err); -+ di_write_unlock(dentry); -+ goto out_fi; -+ } -+ } -+ -+ di_downgrade_lock(dentry, /*flags*/0); -+ if (wpre) -+ wpre->btop = au_fbtop(file); -+ h_file = au_hf_top(file); -+ get_file(h_file); -+ if (wpre) -+ wpre->blks = file_inode(h_file)->i_blocks; -+ if (do_ready) -+ au_unpin(&pin); -+ di_read_unlock(dentry, /*flags*/0); -+ -+out_fi: -+ fi_write_unlock(file); -+out: -+ return h_file; -+} -+ -+static void au_write_post(struct inode *inode, struct file *h_file, -+ struct au_write_pre *wpre, ssize_t written) -+{ -+ struct inode *h_inode; -+ -+ au_cpup_attr_timesizes(inode); -+ AuDebugOn(au_ibtop(inode) != wpre->btop); -+ h_inode = file_inode(h_file); -+ inode->i_mode = h_inode->i_mode; -+ ii_write_unlock(inode); -+ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */ -+ if (written > 0) -+ au_fhsm_wrote(inode->i_sb, wpre->btop, -+ /*force*/h_inode->i_blocks > wpre->blks); -+ fput(h_file); -+} -+ -+/* -+ * todo: very ugly -+ * it locks both of i_mutex and si_rwsem for read in safe. -+ * if the plink maintenance mode continues forever (that is the problem), -+ * may loop forever. -+ */ -+static void au_mtx_and_read_lock(struct inode *inode) -+{ -+ int err; -+ struct super_block *sb = inode->i_sb; -+ -+ while (1) { -+ inode_lock(inode); -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) -+ break; -+ inode_unlock(inode); -+ si_read_lock(sb, AuLock_NOPLMW); -+ si_read_unlock(sb); -+ } -+} -+ -+static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio, -+ struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file; -+ ssize_t (*iter)(struct kiocb *, struct iov_iter *); -+ -+ err = security_file_permission(h_file, rw); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOSYS; /* the branch doesn't have its ->(read|write)_iter() */ -+ iter = NULL; -+ if (rw == MAY_READ) -+ iter = h_file->f_op->read_iter; -+ else if (rw == MAY_WRITE) -+ iter = h_file->f_op->write_iter; -+ -+ file = kio->ki_filp; -+ kio->ki_filp = h_file; -+ if (iter) { -+ lockdep_off(); -+ err = iter(kio, iov_iter); -+ lockdep_on(); -+ } else -+ /* currently there is no such fs */ -+ WARN_ON_ONCE(1); -+ kio->ki_filp = file; -+ -+out: -+ return err; -+} -+ -+static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct file *file, *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/1, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (au_test_loopback_kthread()) { -+ au_warn_loopback(h_file->f_path.dentry->d_sb); -+ if (file->f_mapping != h_file->f_mapping) { -+ file->f_mapping = h_file->f_mapping; -+ smp_mb(); /* unnecessary? */ -+ } -+ } -+ fi_read_unlock(file); -+ -+ err = au_do_iter(h_file, MAY_READ, kio, iov_iter); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *file, *h_file; -+ -+ file = kio->ki_filp; -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+/* -+ * We may be able to remove aufs_splice_{read,write}() since almost all FSes -+ * don't have their own .splice_{read,write} implimentations, and they use -+ * generic_file_splice_read() and iter_file_splice_write() who can act like the -+ * simple converters to f_op->iter_read() and ->iter_write(). -+ * But we keep our own implementations because some non-mainlined FSes may have -+ * their own .splice_{read,write} implimentations and aufs doesn't want to take -+ * away an opportunity to co-work with aufs from them. -+ */ -+static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ ssize_t err; -+ struct file *h_file; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_read_post(inode, h_file); -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t -+aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); -+ au_write_post(inode, h_file, &wpre, err); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static long aufs_fallocate(struct file *file, int mode, loff_t offset, -+ loff_t len) -+{ -+ long err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ lockdep_off(); -+ err = vfs_fallocate(h_file, mode, offset, len); -+ lockdep_on(); -+ au_write_post(inode, h_file, &wpre, /*written*/1); -+ -+out: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+ return err; -+} -+ -+static ssize_t aufs_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_write_pre wpre; -+ enum { SRC, DST }; -+ struct { -+ struct inode *inode; -+ struct file *h_file; -+ struct super_block *h_sb; -+ } a[2]; -+#define a_src a[SRC] -+#define a_dst a[DST] -+ -+ err = -EINVAL; -+ a_src.inode = file_inode(src); -+ if (unlikely(!S_ISREG(a_src.inode->i_mode))) -+ goto out; -+ a_dst.inode = file_inode(dst); -+ if (unlikely(!S_ISREG(a_dst.inode->i_mode))) -+ goto out; -+ -+ au_mtx_and_read_lock(a_dst.inode); -+ /* -+ * in order to match the order in di_write_lock2_{child,parent}(), -+ * use f_path.dentry for this comparison. -+ */ -+ if (src->f_path.dentry < dst->f_path.dentry) { -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_1); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) -+ goto out_si; -+ -+ wpre.lsc = AuLsc_FI_2; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) { -+ au_read_post(a_src.inode, a_src.h_file); -+ goto out_si; -+ } -+ } else { -+ wpre.lsc = AuLsc_FI_1; -+ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); -+ err = PTR_ERR(a_dst.h_file); -+ if (IS_ERR(a_dst.h_file)) -+ goto out_si; -+ -+ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_2); -+ err = PTR_ERR(a_src.h_file); -+ if (IS_ERR(a_src.h_file)) { -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, -+ /*written*/0); -+ goto out_si; -+ } -+ } -+ -+ err = -EXDEV; -+ a_src.h_sb = file_inode(a_src.h_file)->i_sb; -+ a_dst.h_sb = file_inode(a_dst.h_file)->i_sb; -+ if (unlikely(a_src.h_sb != a_dst.h_sb)) { -+ AuDbgFile(src); -+ AuDbgFile(dst); -+ goto out_file; -+ } -+ -+ err = vfsub_copy_file_range(a_src.h_file, src_pos, a_dst.h_file, -+ dst_pos, len, flags); -+ -+out_file: -+ au_write_post(a_dst.inode, a_dst.h_file, &wpre, err); -+ fi_read_unlock(src); -+ au_read_post(a_src.inode, a_src.h_file); -+out_si: -+ si_read_unlock(a_dst.inode->i_sb); -+ inode_unlock(a_dst.inode); -+out: -+ return err; -+#undef a_src -+#undef a_dst -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * The locking order around current->mmap_sem. -+ * - in most and regular cases -+ * file I/O syscall -- aufs_read() or something -+ * -- si_rwsem for read -- mmap_sem -+ * (Note that [fdi]i_rwsem are released before mmap_sem). -+ * - in mmap case -+ * mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem -+ * This AB-BA order is definitely bad, but is not a problem since "si_rwsem for -+ * read" allows multiple processes to acquire it and [fdi]i_rwsem are not held -+ * in file I/O. Aufs needs to stop lockdep in aufs_mmap() though. -+ * It means that when aufs acquires si_rwsem for write, the process should never -+ * acquire mmap_sem. -+ * -+ * Actually aufs_iterate() holds [fdi]i_rwsem before mmap_sem, but this is not a -+ * problem either since any directory is not able to be mmap-ed. -+ * The similar scenario is applied to aufs_readlink() too. -+ */ -+ -+#if 0 /* stop calling security_file_mmap() */ -+/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ -+#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) -+ -+static unsigned long au_arch_prot_conv(unsigned long flags) -+{ -+ /* currently ppc64 only */ -+#ifdef CONFIG_PPC64 -+ /* cf. linux/arch/powerpc/include/asm/mman.h */ -+ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); -+ return AuConv_VM_PROT(flags, SAO); -+#else -+ AuDebugOn(arch_calc_vm_prot_bits(-1)); -+ return 0; -+#endif -+} -+ -+static unsigned long au_prot_conv(unsigned long flags) -+{ -+ return AuConv_VM_PROT(flags, READ) -+ | AuConv_VM_PROT(flags, WRITE) -+ | AuConv_VM_PROT(flags, EXEC) -+ | au_arch_prot_conv(flags); -+} -+ -+/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ -+#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) -+ -+static unsigned long au_flag_conv(unsigned long flags) -+{ -+ return AuConv_VM_MAP(flags, GROWSDOWN) -+ | AuConv_VM_MAP(flags, DENYWRITE) -+ | AuConv_VM_MAP(flags, LOCKED); -+} -+#endif -+ -+static int aufs_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ int err; -+ const unsigned char wlock -+ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); -+ struct super_block *sb; -+ struct file *h_file; -+ struct inode *inode; -+ -+ AuDbgVmRegion(file, vma); -+ -+ inode = file_inode(file); -+ sb = inode->i_sb; -+ lockdep_off(); -+ si_read_lock(sb, AuLock_NOPLMW); -+ -+ h_file = au_write_pre(file, wlock, /*wpre*/NULL); -+ lockdep_on(); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ au_set_mmapped(file); -+ au_vm_file_reset(vma, h_file); -+ /* -+ * we cannot call security_mmap_file() here since it may acquire -+ * mmap_sem or i_mutex. -+ * -+ * err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags), -+ * au_flag_conv(vma->vm_flags)); -+ */ -+ if (!err) -+ err = call_mmap(h_file, vma); -+ if (!err) { -+ au_vm_prfile_set(vma, file); -+ fsstack_copy_attr_atime(inode, file_inode(h_file)); -+ goto out_fput; /* success */ -+ } -+ au_unset_mmapped(file); -+ au_vm_file_reset(vma, file); -+ -+out_fput: -+ lockdep_off(); -+ ii_write_unlock(inode); -+ lockdep_on(); -+ fput(h_file); -+out: -+ lockdep_off(); -+ si_read_unlock(sb); -+ lockdep_on(); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_fsync_nondir(struct file *file, loff_t start, loff_t end, -+ int datasync) -+{ -+ int err; -+ struct au_write_pre wpre; -+ struct inode *inode; -+ struct file *h_file; -+ -+ err = 0; /* -EBADF; */ /* posix? */ -+ if (unlikely(!(file->f_mode & FMODE_WRITE))) -+ goto out; -+ -+ inode = file_inode(file); -+ au_mtx_and_read_lock(inode); -+ -+ wpre.lsc = 0; -+ h_file = au_write_pre(file, /*do_ready*/1, &wpre); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_unlock; -+ -+ err = vfsub_fsync(h_file, &h_file->f_path, datasync); -+ au_write_post(inode, h_file, &wpre, /*written*/0); -+ -+out_unlock: -+ si_read_unlock(inode->i_sb); -+ inode_unlock(inode); -+out: -+ return err; -+} -+ -+static int aufs_fasync(int fd, struct file *file, int flag) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ if (h_file->f_op->fasync) -+ err = h_file->f_op->fasync(fd, h_file, flag); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static int aufs_setfl(struct file *file, unsigned long arg) -+{ -+ int err; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ /* stop calling h_file->fasync */ -+ arg |= vfsub_file_flags(file) & FASYNC; -+ err = setfl(/*unused fd*/-1, h_file, arg); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no one supports this operation, currently */ -+#if 0 /* reserved for future use */ -+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, -+ size_t len, loff_t *pos, int more) -+{ -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_file_fop = { -+ .owner = THIS_MODULE, -+ -+ .llseek = default_llseek, -+ -+ .read_iter = aufs_read_iter, -+ .write_iter = aufs_write_iter, -+ -+#ifdef CONFIG_AUFS_POLL -+ .poll = aufs_poll, -+#endif -+ .unlocked_ioctl = aufs_ioctl_nondir, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = aufs_compat_ioctl_nondir, -+#endif -+ .mmap = aufs_mmap, -+ .open = aufs_open_nondir, -+ .flush = aufs_flush_nondir, -+ .release = aufs_release_nondir, -+ .fsync = aufs_fsync_nondir, -+ .fasync = aufs_fasync, -+ /* .sendpage = aufs_sendpage, */ -+ .setfl = aufs_setfl, -+ .splice_write = aufs_splice_write, -+ .splice_read = aufs_splice_read, -+#if 0 /* reserved for future use */ -+ .aio_splice_write = aufs_aio_splice_write, -+ .aio_splice_read = aufs_aio_splice_read, -+#endif -+ .fallocate = aufs_fallocate, -+ .copy_file_range = aufs_copy_file_range -+}; -diff -Nurp linux-5.15.37/fs/aufs/fsctx.c linux-5.15.37-aufs/fs/aufs/fsctx.c ---- linux-5.15.37/fs/aufs/fsctx.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/fsctx.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,1229 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2022 Junjiro R. Okajima -+ */ -+ -+/* -+ * fs context, aka new mount api -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct au_fsctx_opts { -+ aufs_bindex_t bindex; -+ unsigned char skipped; -+ struct au_opt *opt, *opt_tail; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct au_opts opts; -+}; -+ -+/* stop extra interpretation of errno in mount(8), and strange error messages */ -+static int cvt_err(int err) -+{ -+ AuTraceErr(err); -+ -+ switch (err) { -+ case -ENOENT: -+ case -ENOTDIR: -+ case -EEXIST: -+ case -EIO: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int au_fsctx_reconfigure(struct fs_context *fc) -+{ -+ int err, do_dx; -+ unsigned int mntflags; -+ struct dentry *root; -+ struct super_block *sb; -+ struct inode *inode; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ AuDbg("fc %p\n", fc); -+ -+ root = fc->root; -+ sb = root->d_sb; -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (!err) { -+ di_write_lock_child(root); -+ err = au_opts_verify(sb, fc->sb_flags, /*pending*/0); -+ aufs_write_unlock(root); -+ } -+ -+ inode = d_inode(root); -+ inode_lock(inode); -+ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ di_write_lock_child(root); -+ -+ /* au_opts_remount() may return an error */ -+ err = au_opts_remount(sb, &a->opts); -+ -+ if (au_ftest_opts(a->opts.flags, REFRESH)) -+ au_remount_refresh(sb, au_ftest_opts(a->opts.flags, -+ REFRESH_IDOP)); -+ -+ if (au_ftest_opts(a->opts.flags, REFRESH_DYAOP)) { -+ mntflags = au_mntflags(sb); -+ do_dx = !!au_opt_test(mntflags, DIO); -+ au_dy_arefresh(do_dx); -+ } -+ -+ au_fhsm_wrote_all(sb, /*force*/1); /* ?? */ -+ aufs_write_unlock(root); -+ -+out: -+ inode_unlock(inode); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_fsctx_fill_super(struct super_block *sb, struct fs_context *fc) -+{ -+ int err; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_sbinfo *sbinfo = a->sbinfo; -+ struct dentry *root; -+ struct inode *inode; -+ -+ sbinfo->si_sb = sb; -+ sb->s_fs_info = sbinfo; -+ kobject_get(&sbinfo->si_kobj); -+ -+ __si_write_lock(sb); -+ si_pid_set(sb); -+ au_sbilist_add(sb); -+ -+ /* all timestamps always follow the ones on the branch */ -+ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; -+ sb->s_flags |= SB_I_VERSION; /* do we really need this? */ -+ sb->s_op = &aufs_sop; -+ sb->s_d_op = &aufs_dop; -+ sb->s_magic = AUFS_SUPER_MAGIC; -+ sb->s_maxbytes = 0; -+ sb->s_stack_depth = 1; -+ au_export_init(sb); -+ au_xattr_init(sb); -+ -+ err = au_alloc_root(sb); -+ if (unlikely(err)) { -+ si_write_unlock(sb); -+ goto out; -+ } -+ root = sb->s_root; -+ inode = d_inode(root); -+ ii_write_lock_parent(inode); -+ aufs_write_unlock(root); -+ -+ /* lock vfs_inode first, then aufs. */ -+ inode_lock(inode); -+ aufs_write_lock(root); -+ err = au_opts_mount(sb, &a->opts); -+ AuTraceErr(err); -+ if (!err && au_ftest_si(sbinfo, NO_DREVAL)) { -+ sb->s_d_op = &aufs_dop_noreval; -+ /* infofc(fc, "%ps", sb->s_d_op); */ -+ pr_info("%ps\n", sb->s_d_op); -+ au_refresh_dop(root, /*force_reval*/0); -+ sbinfo->si_iop_array = aufs_iop_nogetattr; -+ au_refresh_iop(inode, /*force_getattr*/0); -+ } -+ aufs_write_unlock(root); -+ inode_unlock(inode); -+ if (!err) -+ goto out; /* success */ -+ -+ dput(root); -+ sb->s_root = NULL; -+ -+out: -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ AuTraceErr(err); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_get_tree(struct fs_context *fc) -+{ -+ int err; -+ -+ AuDbg("fc %p\n", fc); -+ err = get_tree_nodev(fc, au_fsctx_fill_super); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fsctx_dump(struct au_opts *opts) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ /* reduce stack space */ -+ union { -+ struct au_opt_add *add; -+ struct au_opt_del *del; -+ struct au_opt_mod *mod; -+ struct au_opt_xino *xino; -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ u.add = &opt->add; -+ AuDbg("add {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_del: -+ fallthrough; -+ case Opt_idel: -+ u.del = &opt->del; -+ AuDbg("del {%s, %p}\n", -+ u.del->pathname, u.del->h_path.dentry); -+ break; -+ case Opt_mod: -+ fallthrough; -+ case Opt_imod: -+ u.mod = &opt->mod; -+ AuDbg("mod {%s, 0x%x, %p}\n", -+ u.mod->path, u.mod->perm, u.mod->h_root); -+ break; -+ case Opt_append: -+ u.add = &opt->add; -+ AuDbg("append {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_prepend: -+ u.add = &opt->add; -+ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ -+ case Opt_dirwh: -+ AuDbg("dirwh %d\n", opt->dirwh); -+ break; -+ case Opt_rdcache: -+ AuDbg("rdcache %d\n", opt->rdcache); -+ break; -+ case Opt_rdblk: -+ AuDbg("rdblk %d\n", opt->rdblk); -+ break; -+ case Opt_rdhash: -+ AuDbg("rdhash %u\n", opt->rdhash); -+ break; -+ -+ case Opt_xino: -+ u.xino = &opt->xino; -+ AuDbg("xino {%s %pD}\n", u.xino->path, u.xino->file); -+ break; -+ -+#define au_fsctx_TF(name) \ -+ case Opt_##name: \ -+ if (opt->tf) \ -+ AuLabel(name); \ -+ else \ -+ AuLabel(no##name); \ -+ break; -+ -+ /* simple true/false flag */ -+ au_fsctx_TF(trunc_xino); -+ au_fsctx_TF(trunc_xib); -+ au_fsctx_TF(dirperm1); -+ au_fsctx_TF(plink); -+ au_fsctx_TF(shwh); -+ au_fsctx_TF(dio); -+ au_fsctx_TF(warn_perm); -+ au_fsctx_TF(verbose); -+ au_fsctx_TF(sum); -+ au_fsctx_TF(dirren); -+ au_fsctx_TF(acl); -+#undef au_fsctx_TF -+ -+ case Opt_trunc_xino_path: -+ fallthrough; -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); -+ break; -+ case Opt_noxino: -+ AuLabel(noxino); -+ break; -+ -+ case Opt_list_plink: -+ AuLabel(list_plink); -+ break; -+ case Opt_udba: -+ AuDbg("udba %d, %s\n", -+ opt->udba, au_optstr_udba(opt->udba)); -+ break; -+ case Opt_diropq_a: -+ AuLabel(diropq_a); -+ break; -+ case Opt_diropq_w: -+ AuLabel(diropq_w); -+ break; -+ case Opt_wsum: -+ AuLabel(wsum); -+ break; -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ AuDbg("create %d, %s\n", u.create->wbr_create, -+ au_optstr_wbr_create(u.create->wbr_create)); -+ switch (u.create->wbr_create) { -+ case AuWbrCreate_MFSV: -+ fallthrough; -+ case AuWbrCreate_PMFSV: -+ AuDbg("%d sec\n", u.create->mfs_second); -+ break; -+ case AuWbrCreate_MFSRR: -+ fallthrough; -+ case AuWbrCreate_TDMFS: -+ AuDbg("%llu watermark\n", -+ u.create->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSRRV: -+ fallthrough; -+ case AuWbrCreate_TDMFSV: -+ fallthrough; -+ case AuWbrCreate_PMFSRRV: -+ AuDbg("%llu watermark, %d sec\n", -+ u.create->mfsrr_watermark, -+ u.create->mfs_second); -+ break; -+ } -+ break; -+ case Opt_wbr_copyup: -+ AuDbg("copyup %d, %s\n", opt->wbr_copyup, -+ au_optstr_wbr_copyup(opt->wbr_copyup)); -+ break; -+ case Opt_fhsm_sec: -+ AuDbg("fhsm_sec %u\n", opt->fhsm_second); -+ break; -+ -+ default: -+ AuDbg("type %d\n", opt->type); -+ BUG(); -+ } -+ opt++; -+ } -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * For conditionally compiled mount options. -+ * Instead of fsparam_flag_no(), use this macro to distinguish ignore_silent. -+ */ -+#define au_ignore_flag(name, action) \ -+ fsparam_flag(name, action), \ -+ fsparam_flag("no" name, Opt_ignore_silent) -+ -+const struct fs_parameter_spec aufs_fsctx_paramspec[] = { -+ fsparam_string("br", Opt_br), -+ -+ /* "add=%d:%s" or "ins=%d:%s" */ -+ fsparam_string("add", Opt_add), -+ fsparam_string("ins", Opt_add), -+ fsparam_path("append", Opt_append), -+ fsparam_path("prepend", Opt_prepend), -+ -+ fsparam_path("del", Opt_del), -+ /* fsparam_s32("idel", Opt_idel), */ -+ fsparam_path("mod", Opt_mod), -+ /* fsparam_string("imod", Opt_imod), */ -+ -+ fsparam_s32("dirwh", Opt_dirwh), -+ -+ fsparam_path("xino", Opt_xino), -+ fsparam_flag("noxino", Opt_noxino), -+ fsparam_flag_no("trunc_xino", Opt_trunc_xino), -+ /* "trunc_xino_v=%d:%d" */ -+ /* fsparam_string("trunc_xino_v", Opt_trunc_xino_v), */ -+ fsparam_path("trunc_xino", Opt_trunc_xino_path), -+ fsparam_s32("itrunc_xino", Opt_itrunc_xino), -+ /* fsparam_path("zxino", Opt_zxino), */ -+ fsparam_flag_no("trunc_xib", Opt_trunc_xib), -+ -+#ifdef CONFIG_PROC_FS -+ fsparam_flag_no("plink", Opt_plink), -+#else -+ au_ignore_flag("plink", Opt_ignore), -+#endif -+ -+#ifdef CONFIG_AUFS_DEBUG -+ fsparam_flag("list_plink", Opt_list_plink), -+#endif -+ -+ fsparam_string("udba", Opt_udba), -+ -+ fsparam_flag_no("dio", Opt_dio), -+ -+#ifdef CONFIG_AUFS_DIRREN -+ fsparam_flag_no("dirren", Opt_dirren), -+#else -+ au_ignore_flag("dirren", Opt_ignore), -+#endif -+ -+#ifdef CONFIG_AUFS_FHSM -+ fsparam_s32("fhsm_sec", Opt_fhsm_sec), -+#else -+ fsparam_s32("fhsm_sec", Opt_ignore), -+#endif -+ -+ /* always | a | whiteouted | w */ -+ fsparam_string("diropq", Opt_diropq), -+ -+ fsparam_flag_no("warn_perm", Opt_warn_perm), -+ -+#ifdef CONFIG_AUFS_SHWH -+ fsparam_flag_no("shwh", Opt_shwh), -+#else -+ au_ignore_flag("shwh", Opt_err), -+#endif -+ -+ fsparam_flag_no("dirperm1", Opt_dirperm1), -+ -+ fsparam_flag_no("verbose", Opt_verbose), -+ fsparam_flag("v", Opt_verbose), -+ fsparam_flag("quiet", Opt_noverbose), -+ fsparam_flag("q", Opt_noverbose), -+ /* user-space may handle this */ -+ fsparam_flag("silent", Opt_noverbose), -+ -+ fsparam_flag_no("sum", Opt_sum), -+ fsparam_flag("wsum", Opt_wsum), -+ -+ fsparam_s32("rdcache", Opt_rdcache), -+ /* "def" or s32 */ -+ fsparam_string("rdblk", Opt_rdblk), -+ /* "def" or s32 */ -+ fsparam_string("rdhash", Opt_rdhash), -+ -+ fsparam_string("create", Opt_wbr_create), -+ fsparam_string("create_policy", Opt_wbr_create), -+ fsparam_string("cpup", Opt_wbr_copyup), -+ fsparam_string("copyup", Opt_wbr_copyup), -+ fsparam_string("copyup_policy", Opt_wbr_copyup), -+ -+ /* generic VFS flag */ -+#ifdef CONFIG_FS_POSIX_ACL -+ fsparam_flag_no("acl", Opt_acl), -+#else -+ au_ignore_flag("acl"), -+#endif -+ -+ /* internal use for the scripts */ -+ fsparam_string("si", Opt_ignore_silent), -+ -+ /* obsoleted, keep them temporary */ -+ fsparam_flag("nodlgt", Opt_ignore_silent), -+ fsparam_flag("clean_plink", Opt_ignore), -+ fsparam_string("dirs", Opt_br), -+ fsparam_u32("debug", Opt_ignore), -+ /* "whiteout" or "all" */ -+ fsparam_string("delete", Opt_ignore), -+ fsparam_string("imap", Opt_ignore), -+ -+ /* temporary workaround, due to old mount(8)? */ -+ fsparam_flag("relatime", Opt_ignore_silent), -+ -+ {} -+}; -+ -+static int au_fsctx_parse_do_add(struct fs_context *fc, struct au_opt *opt, -+ char *brspec, size_t speclen, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ char *p; -+ -+ AuDbg("brspec %s\n", brspec); -+ -+ err = -ENOMEM; -+ if (!speclen) -+ speclen = strlen(brspec); -+ /* will be freed by au_fsctx_free() */ -+ p = kmemdup_nul(brspec, speclen, GFP_NOFS); -+ if (unlikely(!p)) { -+ errorfc(fc, "failed in %s", brspec); -+ goto out; -+ } -+ err = au_opt_add(opt, p, fc->sb_flags, bindex); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_br(struct fs_context *fc, char *brspec) -+{ -+ int err; -+ char *p; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ aufs_bindex_t bindex = a->bindex; -+ -+ AuDbg("brspec %s\n", brspec); -+ -+ err = -EINVAL; -+ while ((p = strsep(&brspec, ":")) && *p) { -+ err = au_fsctx_parse_do_add(fc, opt, p, /*len*/0, bindex); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ break; -+ bindex++; -+ opt++; -+ if (unlikely(opt > a->opt_tail)) { -+ err = -E2BIG; -+ bindex--; -+ opt--; -+ break; -+ } -+ opt->type = Opt_tail; -+ a->skipped = 1; -+ } -+ a->bindex = bindex; -+ a->opt = opt; -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_add(struct fs_context *fc, char *addspec) -+{ -+ int err, n; -+ char *p; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ -+ err = -EINVAL; -+ p = strchr(addspec, ':'); -+ if (unlikely(!p)) { -+ errorfc(fc, "bad arg in %s", addspec); -+ goto out; -+ } -+ *p++ = '\0'; -+ err = kstrtoint(addspec, 0, &n); -+ if (unlikely(err)) { -+ errorfc(fc, "bad integer in %s", addspec); -+ goto out; -+ } -+ AuDbg("n %d\n", n); -+ err = au_fsctx_parse_do_add(fc, opt, p, /*len*/0, n); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_del(struct fs_context *fc, struct au_opt_del *del, -+ struct fs_parameter *param) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ /* will be freed by au_fsctx_free() */ -+ del->pathname = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!del->pathname)) -+ goto out; -+ AuDbg("del %s\n", del->pathname); -+ err = vfsub_kern_path(del->pathname, AuOpt_LkupDirFlags, &del->h_path); -+ if (unlikely(err)) -+ errorfc(fc, "lookup failed %s (%d)", del->pathname, err); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_fsctx_parse_idel(struct fs_context *fc, struct au_opt_del *del, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbbot(sb) < bindex) { -+ errorfc(fc, "out of bounds, %d", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ del->h_path.dentry = dget(au_h_dptr(root, bindex)); -+ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); -+ -+out: -+ aufs_read_unlock(root, !AuLock_IR); -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static int au_fsctx_parse_mod(struct fs_context *fc, struct au_opt_mod *mod, -+ struct fs_parameter *param) -+{ -+ int err; -+ struct path path; -+ char *p; -+ -+ err = -ENOMEM; -+ /* will be freed by au_fsctx_free() */ -+ mod->path = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!mod->path)) -+ goto out; -+ -+ err = -EINVAL; -+ p = strchr(mod->path, '='); -+ if (unlikely(!p)) { -+ errorfc(fc, "no permission %s", mod->path); -+ goto out; -+ } -+ -+ *p++ = 0; -+ err = vfsub_kern_path(mod->path, AuOpt_LkupDirFlags, &path); -+ if (unlikely(err)) { -+ errorfc(fc, "lookup failed %s (%d)", mod->path, err); -+ goto out; -+ } -+ -+ mod->perm = au_br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s", mod->path, mod->perm, p); -+ mod->h_root = dget(path.dentry); -+ path_put(&path); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_fsctx_parse_imod(struct fs_context *fc, struct au_opt_mod *mod, -+ char *ibrspec) -+{ -+ int err, n; -+ char *p; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = -EINVAL; -+ p = strchr(ibrspec, ':'); -+ if (unlikely(!p)) { -+ errorfc(fc, "no index, %s", ibrspec); -+ goto out; -+ } -+ *p++ = '\0'; -+ err = kstrtoint(ibrspec, 0, &n); -+ if (unlikely(err)) { -+ errorfc(fc, "bad integer in %s", ibrspec); -+ goto out; -+ } -+ AuDbg("n %d\n", n); -+ -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (n < 0 || au_sbbot(sb) < n) { -+ errorfc(fc, "out of bounds, %d", bindex); -+ goto out_root; -+ } -+ -+ err = 0; -+ mod->perm = au_br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s\n", -+ mod->path, mod->perm, p); -+ mod->h_root = dget(au_h_dptr(root, bindex)); -+ -+out_root: -+ aufs_read_unlock(root, !AuLock_IR); -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static int au_fsctx_parse_xino(struct fs_context *fc, -+ struct au_opt_xino *xino, -+ struct fs_parameter *param) -+{ -+ int err; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ err = -ENOMEM; -+ /* will be freed by au_opts_free() */ -+ xino->path = kmemdup_nul(param->string, param->size, GFP_NOFS); -+ if (unlikely(!xino->path)) -+ goto out; -+ AuDbg("path %s\n", xino->path); -+ -+ xino->file = au_xino_create(a->sb, xino->path, /*silent*/0, -+ /*wbrtop*/0); -+ err = PTR_ERR(xino->file); -+ if (IS_ERR(xino->file)) { -+ xino->file = NULL; -+ goto out; -+ } -+ -+ err = 0; -+ if (unlikely(a->sb && xino->file->f_path.dentry->d_sb == a->sb)) { -+ err = -EINVAL; -+ errorfc(fc, "%s must be outside", xino->path); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static -+int au_fsctx_parse_xino_itrunc_path(struct fs_context *fc, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ char *pathname) -+{ -+ int err; -+ aufs_bindex_t bbot, bindex; -+ struct path path; -+ struct dentry *root; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ AuDebugOn(!a->sb); -+ -+ err = vfsub_kern_path(pathname, AuOpt_LkupDirFlags, &path); -+ if (unlikely(err)) { -+ errorfc(fc, "lookup failed %s (%d)", pathname, err); -+ goto out; -+ } -+ -+ xino_itrunc->bindex = -1; -+ root = a->sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ bbot = au_sbbot(a->sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (au_h_dptr(root, bindex) == path.dentry) { -+ xino_itrunc->bindex = bindex; -+ break; -+ } -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ path_put(&path); -+ -+ if (unlikely(xino_itrunc->bindex < 0)) { -+ err = -EINVAL; -+ errorfc(fc, "no such branch %s", pathname); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_xino_itrunc(struct fs_context *fc, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ unsigned int bindex) -+{ -+ int err; -+ aufs_bindex_t bbot; -+ struct super_block *sb; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ sb = a->sb; -+ AuDebugOn(!sb); -+ -+ err = 0; -+ si_noflush_read_lock(sb); -+ bbot = au_sbbot(sb); -+ si_read_unlock(sb); -+ if (bindex <= bbot) -+ xino_itrunc->bindex = bindex; -+ else { -+ err = -EINVAL; -+ errorfc(fc, "out of bounds, %u", bindex); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_fsctx_parse_param(struct fs_context *fc, struct fs_parameter *param) -+{ -+ int err, token; -+ struct fs_parse_result result; -+ struct au_fsctx_opts *a = fc->fs_private; -+ struct au_opt *opt = a->opt; -+ -+ AuDbg("fc %p, param {key %s, string %s}\n", -+ fc, param->key, param->string); -+ err = fs_parse(fc, aufs_fsctx_paramspec, param, &result); -+ if (unlikely(err < 0)) -+ goto out; -+ token = err; -+ AuDbg("token %d, res{negated %d, uint64 %llu}\n", -+ token, result.negated, result.uint_64); -+ -+ err = -EINVAL; -+ a->skipped = 0; -+ switch (token) { -+ case Opt_br: -+ err = au_fsctx_parse_br(fc, param->string); -+ break; -+ case Opt_add: -+ err = au_fsctx_parse_add(fc, param->string); -+ break; -+ case Opt_append: -+ err = au_fsctx_parse_do_add(fc, opt, param->string, param->size, -+ /*dummy bindex*/1); -+ break; -+ case Opt_prepend: -+ err = au_fsctx_parse_do_add(fc, opt, param->string, param->size, -+ /*bindex*/0); -+ break; -+ -+ case Opt_del: -+ err = au_fsctx_parse_del(fc, &opt->del, param); -+ break; -+#if 0 /* reserved for future use */ -+ case Opt_idel: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ del->pathname = "(indexed)"; -+ err = au_opts_parse_idel(fc, &opt->del, result.uint_32); -+ break; -+#endif -+ -+ case Opt_mod: -+ err = au_fsctx_parse_mod(fc, &opt->mod, param); -+ break; -+#ifdef IMOD /* reserved for future use */ -+ case Opt_imod: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ u.mod->path = "(indexed)"; -+ err = au_opts_parse_imod(fc, &opt->mod, param->string); -+ break; -+#endif -+ -+ case Opt_xino: -+ err = au_fsctx_parse_xino(fc, &opt->xino, param); -+ break; -+ case Opt_trunc_xino_path: -+ if (!a->sb) { -+ errorfc(fc, "no such branch %s", param->string); -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc_path(fc, &opt->xino_itrunc, -+ param->string); -+ break; -+#if 0 -+ case Opt_trunc_xino_v: -+ if (!a->sb) { -+ err = 0; -+ a->skipped = 1; -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc_path(fc, &opt->xino_itrunc, -+ param->string); -+ break; -+#endif -+ case Opt_itrunc_xino: -+ if (!a->sb) { -+ errorfc(fc, "out of bounds %s", param->string); -+ break; -+ } -+ err = au_fsctx_parse_xino_itrunc(fc, &opt->xino_itrunc, -+ result.int_32); -+ break; -+ -+ case Opt_dirwh: -+ err = 0; -+ opt->dirwh = result.int_32; -+ break; -+ -+ case Opt_rdcache: -+ if (unlikely(result.int_32 > AUFS_RDCACHE_MAX)) { -+ errorfc(fc, "rdcache must be smaller than %d", -+ AUFS_RDCACHE_MAX); -+ break; -+ } -+ err = 0; -+ opt->rdcache = result.int_32; -+ break; -+ -+ case Opt_rdblk: -+ err = 0; -+ opt->rdblk = AUFS_RDBLK_DEF; -+ if (!strcmp(param->string, "def")) -+ break; -+ -+ err = kstrtoint(param->string, 0, &result.int_32); -+ if (unlikely(err)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ err = -EINVAL; -+ if (unlikely(result.int_32 < 0 -+ || result.int_32 > KMALLOC_MAX_SIZE)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ if (unlikely(result.int_32 && result.int_32 < NAME_MAX)) { -+ errorfc(fc, "rdblk must be larger than %d", NAME_MAX); -+ break; -+ } -+ err = 0; -+ opt->rdblk = result.int_32; -+ break; -+ -+ case Opt_rdhash: -+ err = 0; -+ opt->rdhash = AUFS_RDHASH_DEF; -+ if (!strcmp(param->string, "def")) -+ break; -+ -+ err = kstrtoint(param->string, 0, &result.int_32); -+ if (unlikely(err)) { -+ errorfc(fc, "bad value in %s", param->key); -+ break; -+ } -+ /* how about zero? */ -+ if (result.int_32 < 0 -+ || result.int_32 * sizeof(struct hlist_head) -+ > KMALLOC_MAX_SIZE) { -+ err = -EINVAL; -+ errorfc(fc, "bad integer in %s", param->key); -+ break; -+ } -+ opt->rdhash = result.int_32; -+ break; -+ -+ case Opt_diropq: -+ /* -+ * As other options, fs/aufs/opts.c can handle these strings by -+ * match_token(). But "diropq=" is deprecated now and will -+ * never have other value. So simple strcmp() is enough here. -+ */ -+ if (!strcmp(param->string, "a") || -+ !strcmp(param->string, "always")) { -+ err = 0; -+ opt->type = Opt_diropq_a; -+ } else if (!strcmp(param->string, "w") || -+ !strcmp(param->string, "whiteouted")) { -+ err = 0; -+ opt->type = Opt_diropq_w; -+ } else -+ errorfc(fc, "unknown value %s", param->string); -+ break; -+ -+ case Opt_udba: -+ opt->udba = au_udba_val(param->string); -+ if (opt->udba >= 0) -+ err = 0; -+ else -+ errorf(fc, "wrong value, %s", param->string); -+ break; -+ -+ case Opt_wbr_create: -+ opt->wbr_create.wbr_create -+ = au_wbr_create_val(param->string, &opt->wbr_create); -+ if (opt->wbr_create.wbr_create >= 0) -+ err = 0; -+ else -+ errorf(fc, "wrong value, %s", param->key); -+ break; -+ -+ case Opt_wbr_copyup: -+ opt->wbr_copyup = au_wbr_copyup_val(param->string); -+ if (opt->wbr_copyup >= 0) -+ err = 0; -+ else -+ errorfc(fc, "wrong value, %s", param->key); -+ break; -+ -+ case Opt_fhsm_sec: -+ if (unlikely(result.int_32 < 0)) { -+ errorfc(fc, "bad integer in %s\n", param->key); -+ break; -+ } -+ err = 0; -+ if (sysaufs_brs) -+ opt->fhsm_second = result.int_32; -+ else -+ warnfc(fc, "ignored %s %s", param->key, param->string); -+ break; -+ -+ /* simple true/false flag */ -+#define au_fsctx_TF(name) \ -+ case Opt_##name: \ -+ err = 0; \ -+ opt->tf = !result.negated; \ -+ break; -+ au_fsctx_TF(trunc_xino); -+ au_fsctx_TF(trunc_xib); -+ au_fsctx_TF(dirperm1); -+ au_fsctx_TF(plink); -+ au_fsctx_TF(shwh); -+ au_fsctx_TF(dio); -+ au_fsctx_TF(warn_perm); -+ au_fsctx_TF(verbose); -+ au_fsctx_TF(sum); -+ au_fsctx_TF(dirren); -+ au_fsctx_TF(acl); -+#undef au_fsctx_TF -+ -+ case Opt_noverbose: -+ err = 0; -+ opt->type = Opt_verbose; -+ opt->tf = false; -+ break; -+ -+ case Opt_noxino: -+ fallthrough; -+ case Opt_list_plink: -+ fallthrough; -+ case Opt_wsum: -+ err = 0; -+ break; -+ -+ case Opt_ignore: -+ warnfc(fc, "ignored %s", param->key); -+ fallthrough; -+ case Opt_ignore_silent: -+ a->skipped = 1; -+ err = 0; -+ break; -+ default: -+ a->skipped = 1; -+ err = -ENOPARAM; -+ break; -+ } -+ if (unlikely(err)) -+ goto out; -+ if (a->skipped) -+ goto out; -+ -+ switch (token) { -+ case Opt_br: -+ fallthrough; -+ case Opt_noverbose: -+ fallthrough; -+ case Opt_diropq: -+ break; -+ default: -+ opt->type = token; -+ break; -+ } -+ opt++; -+ if (unlikely(opt > a->opt_tail)) { -+ err = -E2BIG; -+ opt--; -+ } -+ opt->type = Opt_tail; -+ a->opt = opt; -+ -+out: -+ return err; -+} -+ -+/* -+ * these options accept both 'name=val' and 'name:val' form. -+ * some accept optional '=' in its value. -+ * eg. br:/br1=rw:/br2=ro and br=/br1=rw:/br2=ro -+ */ -+static inline unsigned int is_colonopt(char *str) -+{ -+#define do_test(name) \ -+ if (!strncmp(str, name ":", sizeof(name))) \ -+ return sizeof(name) - 1; -+ do_test("br"); -+ do_test("add"); -+ do_test("ins"); -+ do_test("append"); -+ do_test("prepend"); -+ do_test("del"); -+ /* do_test("idel"); */ -+ do_test("mod"); -+ /* do_test("imod"); */ -+#undef do_test -+ -+ return 0; -+} -+ -+static int au_fsctx_parse_monolithic(struct fs_context *fc, void *data) -+{ -+ int err; -+ unsigned int u; -+ char *str; -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ str = data; -+ AuDbg("str %s\n", str); -+ while (str) { -+ u = is_colonopt(str); -+ if (u) -+ str[u] = '='; -+ str = strchr(str, ','); -+ if (!str) -+ break; -+ str++; -+ } -+ str = data; -+ AuDbg("str %s\n", str); -+ -+ err = generic_parse_monolithic(fc, str); -+ AuTraceErr(err); -+ au_fsctx_dump(&a->opts); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_fsctx_opts_free(struct au_opts *opts) -+{ -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ fallthrough; -+ case Opt_append: -+ fallthrough; -+ case Opt_prepend: -+ kfree(opt->add.pathname); -+ path_put(&opt->add.path); -+ break; -+ case Opt_del: -+ kfree(opt->del.pathname); -+ fallthrough; -+ case Opt_idel: -+ path_put(&opt->del.h_path); -+ break; -+ case Opt_mod: -+ kfree(opt->mod.path); -+ fallthrough; -+ case Opt_imod: -+ dput(opt->mod.h_root); -+ break; -+ case Opt_xino: -+ kfree(opt->xino.path); -+ fput(opt->xino.file); -+ break; -+ } -+ opt++; -+ } -+} -+ -+static void au_fsctx_free(struct fs_context *fc) -+{ -+ struct au_fsctx_opts *a = fc->fs_private; -+ -+ /* fs_type=%p, root=%pD */ -+ AuDbg("fc %p{sb_flags 0x%x, sb_flags_mask 0x%x, purpose %u\n", -+ fc, fc->sb_flags, fc->sb_flags_mask, fc->purpose); -+ -+ kobject_put(&a->sbinfo->si_kobj); -+ au_fsctx_opts_free(&a->opts); -+ free_page((unsigned long)a->opts.opt); -+ au_kfree_rcu(a); -+} -+ -+static const struct fs_context_operations au_fsctx_ops = { -+ .free = au_fsctx_free, -+ .parse_param = au_fsctx_parse_param, -+ .parse_monolithic = au_fsctx_parse_monolithic, -+ .get_tree = au_fsctx_get_tree, -+ .reconfigure = au_fsctx_reconfigure -+ /* -+ * nfs4 requires ->dup()? No. -+ * I don't know what is this ->dup() for. -+ */ -+}; -+ -+int aufs_fsctx_init(struct fs_context *fc) -+{ -+ int err; -+ struct au_fsctx_opts *a; -+ -+ /* fs_type=%p, root=%pD */ -+ AuDbg("fc %p{sb_flags 0x%x, sb_flags_mask 0x%x, purpose %u\n", -+ fc, fc->sb_flags, fc->sb_flags_mask, fc->purpose); -+ -+ /* they will be freed by au_fsctx_free() */ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->bindex = 0; -+ a->opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!a->opts.opt)) -+ goto out_a; -+ a->opt = a->opts.opt; -+ a->opt->type = Opt_tail; -+ a->opts.max_opt = PAGE_SIZE / sizeof(*a->opts.opt); -+ a->opt_tail = a->opt + a->opts.max_opt - 1; -+ a->opts.sb_flags = fc->sb_flags; -+ -+ a->sb = NULL; -+ if (fc->root) { -+ AuDebugOn(fc->purpose != FS_CONTEXT_FOR_RECONFIGURE); -+ a->opts.flags = AuOpts_REMOUNT; -+ a->sb = fc->root->d_sb; -+ a->sbinfo = au_sbi(a->sb); -+ kobject_get(&a->sbinfo->si_kobj); -+ } else { -+ a->sbinfo = au_si_alloc(a->sb); -+ AuDebugOn(!a->sbinfo); -+ err = PTR_ERR(a->sbinfo); -+ if (IS_ERR(a->sbinfo)) -+ goto out_opt; -+ au_rw_write_unlock(&a->sbinfo->si_rwsem); -+ } -+ -+ err = 0; -+ fc->fs_private = a; -+ fc->ops = &au_fsctx_ops; -+ goto out; /* success */ -+ -+out_opt: -+ free_page((unsigned long)a->opts.opt); -+out_a: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/fstype.h linux-5.15.37-aufs/fs/aufs/fstype.h ---- linux-5.15.37/fs/aufs/fstype.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/fstype.h 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,388 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * judging filesystem type -+ */ -+ -+#ifndef __AUFS_FSTYPE_H__ -+#define __AUFS_FSTYPE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+static inline int au_test_aufs(struct super_block *sb) -+{ -+ return sb->s_magic == AUFS_SUPER_MAGIC; -+} -+ -+static inline const char *au_sbtype(struct super_block *sb) -+{ -+ return sb->s_type->name; -+} -+ -+static inline int au_test_iso9660(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ISO9660_FS) -+ return sb->s_magic == ISOFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_romfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ROMFS_FS) -+ return sb->s_magic == ROMFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_cramfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CRAMFS) -+ return sb->s_magic == CRAMFS_MAGIC; -+#endif -+ return 0; -+} -+ -+static inline int au_test_nfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NFS_FS) -+ return sb->s_magic == NFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fuse(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FUSE_FS) -+ return sb->s_magic == FUSE_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XFS_FS) -+ return sb->s_magic == XFS_SB_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_TMPFS -+ return sb->s_magic == TMPFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_ECRYPT_FS) -+ return !strcmp(au_sbtype(sb), "ecryptfs"); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ramfs(struct super_block *sb) -+{ -+ return sb->s_magic == RAMFS_MAGIC; -+} -+ -+static inline int au_test_ubifs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_UBIFS_FS) -+ return sb->s_magic == UBIFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_procfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_PROC_FS -+ return sb->s_magic == PROC_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_sysfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SYSFS -+ return sb->s_magic == SYSFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_configfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_CONFIGFS_FS) -+ return sb->s_magic == CONFIGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_minix(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_MINIX_FS) -+ return sb->s_magic == MINIX3_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC2 -+ || sb->s_magic == MINIX_SUPER_MAGIC -+ || sb->s_magic == MINIX_SUPER_MAGIC2; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fat(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_FAT_FS) -+ return sb->s_magic == MSDOS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_msdos(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_vfat(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_securityfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SECURITYFS -+ return sb->s_magic == SECURITYFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_squashfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_SQUASHFS) -+ return sb->s_magic == SQUASHFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_btrfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_BTRFS_FS) -+ return sb->s_magic == BTRFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xenfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_XENFS) -+ return sb->s_magic == XENFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_debugfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_DEBUG_FS -+ return sb->s_magic == DEBUGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_nilfs(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_NILFS) -+ return sb->s_magic == NILFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) -+{ -+#if IS_ENABLED(CONFIG_HFSPLUS_FS) -+ return sb->s_magic == HFSPLUS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * they can't be an aufs branch. -+ */ -+static inline int au_test_fs_unsuppoted(struct super_block *sb) -+{ -+ return -+#ifndef CONFIG_AUFS_BR_RAMFS -+ au_test_ramfs(sb) || -+#endif -+ au_test_procfs(sb) -+ || au_test_sysfs(sb) -+ || au_test_configfs(sb) -+ || au_test_debugfs(sb) -+ || au_test_securityfs(sb) -+ || au_test_xenfs(sb) -+ || au_test_ecryptfs(sb) -+ /* || !strcmp(au_sbtype(sb), "unionfs") */ -+ || au_test_aufs(sb); /* will be supported in next version */ -+} -+ -+static inline int au_test_fs_remote(struct super_block *sb) -+{ -+ return !au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ && !au_test_ramfs(sb) -+#endif -+ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * Note: these functions (below) are created after reading ->getattr() in all -+ * filesystems under linux/fs. it means we have to do so in every update... -+ */ -+ -+/* -+ * some filesystems require getattr to refresh the inode attributes before -+ * referencing. -+ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) -+ * and leave the work for d_revalidate() -+ */ -+static inline int au_test_fs_refresh_iattr(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ /* || au_test_btrfs(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't maintain i_size or i_blocks. -+ */ -+static inline int au_test_fs_bad_iattr_size(struct super_block *sb) -+{ -+ return au_test_xfs(sb) -+ || au_test_btrfs(sb) -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb) /* maintained, but incorrect */ -+ /* || au_test_minix(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't store the correct value in some of their inode -+ * attributes. -+ */ -+static inline int au_test_fs_bad_iattr(struct super_block *sb) -+{ -+ return au_test_fs_bad_iattr_size(sb) -+ || au_test_fat(sb) -+ || au_test_msdos(sb) -+ || au_test_vfat(sb); -+} -+ -+/* they don't check i_nlink in link(2) */ -+static inline int au_test_fs_no_limit_nlink(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ || au_test_ramfs(sb) -+#endif -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb); -+} -+ -+/* -+ * filesystems which sets S_NOATIME and S_NOCMTIME. -+ */ -+static inline int au_test_fs_notime(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ || au_test_ubifs(sb) -+ ; -+} -+ -+/* temporary support for i#1 in cramfs */ -+static inline int au_test_fs_unique_ino(struct inode *inode) -+{ -+ if (au_test_cramfs(inode->i_sb)) -+ return inode->i_ino != 1; -+ return 1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * the filesystem where the xino files placed must support i/o after unlink and -+ * maintain i_size and i_blocks. -+ */ -+static inline int au_test_fs_bad_xino(struct super_block *sb) -+{ -+ return au_test_fs_remote(sb) -+ || au_test_fs_bad_iattr_size(sb) -+ /* don't want unnecessary work for xino */ -+ || au_test_aufs(sb) -+ || au_test_ecryptfs(sb) -+ || au_test_nilfs(sb); -+} -+ -+static inline int au_test_fs_trunc_xino(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+ || au_test_ramfs(sb); -+} -+ -+/* -+ * test if the @sb is real-readonly. -+ */ -+static inline int au_test_fs_rr(struct super_block *sb) -+{ -+ return au_test_squashfs(sb) -+ || au_test_iso9660(sb) -+ || au_test_cramfs(sb) -+ || au_test_romfs(sb); -+} -+ -+/* -+ * test if the @inode is nfs with 'noacl' option -+ * NFS always sets SB_POSIXACL regardless its mount option 'noacl.' -+ */ -+static inline int au_test_nfs_noacl(struct inode *inode) -+{ -+ return au_test_nfs(inode->i_sb) -+ /* && IS_POSIXACL(inode) */ -+ && !nfs_server_capable(inode, NFS_CAP_ACLS); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FSTYPE_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/hbl.h linux-5.15.37-aufs/fs/aufs/hbl.h ---- linux-5.15.37/fs/aufs/hbl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/hbl.h 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,52 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2017-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * helpers for hlist_bl.h -+ */ -+ -+#ifndef __AUFS_HBL_H__ -+#define __AUFS_HBL_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+static inline void au_hbl_add(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_add_head(node, hbl); -+ hlist_bl_unlock(hbl); -+} -+ -+static inline void au_hbl_del(struct hlist_bl_node *node, -+ struct hlist_bl_head *hbl) -+{ -+ hlist_bl_lock(hbl); -+ hlist_bl_del(node); -+ hlist_bl_unlock(hbl); -+} -+ -+#define au_hbl_for_each(pos, head) \ -+ for (pos = hlist_bl_first(head); \ -+ pos; \ -+ pos = pos->next) -+ -+static inline unsigned long au_hbl_count(struct hlist_bl_head *hbl) -+{ -+ unsigned long cnt; -+ struct hlist_bl_node *pos; -+ -+ cnt = 0; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) -+ cnt++; -+ hlist_bl_unlock(hbl); -+ return cnt; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_HBL_H__ */ -diff --git a/fs/aufs/hfsnotify.c b/fs/aufs/hfsnotify.c -new file mode 100644 -index 000000000000..c2c7766d6cf1 ---- /dev/null -+++ b/fs/aufs/hfsnotify.c -@@ -0,0 +1,275 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * fsnotify for the lower directories -+ */ -+ -+#include "aufs.h" -+ -+/* FS_IN_IGNORED is unnecessary */ -+static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE -+ | FS_CREATE | FS_EVENT_ON_CHILD); -+static DECLARE_WAIT_QUEUE_HEAD(au_hfsn_wq); -+static __cacheline_aligned_in_smp atomic64_t au_hfsn_ifree = ATOMIC64_INIT(0); -+ -+static void au_hfsn_free_mark(struct fsnotify_mark *mark) -+{ -+ struct au_hnotify *hn = container_of(mark, struct au_hnotify, -+ hn_mark); -+ /* AuDbg("here\n"); */ -+ au_cache_free_hnotify(hn); -+ smp_mb__before_atomic(); /* for atomic64_dec */ -+ if (atomic64_dec_and_test(&au_hfsn_ifree)) -+ wake_up(&au_hfsn_wq); -+} -+ -+static int au_hfsn_alloc(struct au_hinode *hinode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct fsnotify_mark *mark; -+ aufs_bindex_t bindex; -+ -+ hn = hinode->hi_notify; -+ sb = hn->hn_aufs_inode->i_sb; -+ bindex = au_br_index(sb, hinode->hi_id); -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br->br_hfsn); -+ -+ mark = &hn->hn_mark; -+ fsnotify_init_mark(mark, br->br_hfsn->hfsn_group); -+ mark->mask = AuHfsnMask; -+ /* -+ * by udba rename or rmdir, aufs assign a new inode to the known -+ * h_inode, so specify 1 to allow dups. -+ */ -+ lockdep_off(); -+ err = fsnotify_add_inode_mark(mark, hinode->hi_inode, /*allow_dups*/1); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static int au_hfsn_free(struct au_hinode *hinode, struct au_hnotify *hn) -+{ -+ struct fsnotify_mark *mark; -+ unsigned long long ull; -+ struct fsnotify_group *group; -+ -+ ull = atomic64_inc_return(&au_hfsn_ifree); -+ BUG_ON(!ull); -+ -+ mark = &hn->hn_mark; -+ spin_lock(&mark->lock); -+ group = mark->group; -+ fsnotify_get_group(group); -+ spin_unlock(&mark->lock); -+ lockdep_off(); -+ fsnotify_destroy_mark(mark, group); -+ fsnotify_put_mark(mark); -+ fsnotify_put_group(group); -+ lockdep_on(); -+ -+ /* free hn by myself */ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ struct fsnotify_mark *mark; -+ -+ mark = &hinode->hi_notify->hn_mark; -+ spin_lock(&mark->lock); -+ if (do_set) { -+ AuDebugOn(mark->mask & AuHfsnMask); -+ mark->mask |= AuHfsnMask; -+ } else { -+ AuDebugOn(!(mark->mask & AuHfsnMask)); -+ mark->mask &= ~AuHfsnMask; -+ } -+ spin_unlock(&mark->lock); -+ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* #define AuDbgHnotify */ -+#ifdef AuDbgHnotify -+static char *au_hfsn_name(u32 mask) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+#define test_ret(flag) \ -+ do { \ -+ if (mask & flag) \ -+ return #flag; \ -+ } while (0) -+ test_ret(FS_ACCESS); -+ test_ret(FS_MODIFY); -+ test_ret(FS_ATTRIB); -+ test_ret(FS_CLOSE_WRITE); -+ test_ret(FS_CLOSE_NOWRITE); -+ test_ret(FS_OPEN); -+ test_ret(FS_MOVED_FROM); -+ test_ret(FS_MOVED_TO); -+ test_ret(FS_CREATE); -+ test_ret(FS_DELETE); -+ test_ret(FS_DELETE_SELF); -+ test_ret(FS_MOVE_SELF); -+ test_ret(FS_UNMOUNT); -+ test_ret(FS_Q_OVERFLOW); -+ test_ret(FS_IN_IGNORED); -+ test_ret(FS_ISDIR); -+ test_ret(FS_IN_ONESHOT); -+ test_ret(FS_EVENT_ON_CHILD); -+ return ""; -+#undef test_ret -+#else -+ return "??"; -+#endif -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_free_group(struct fsnotify_group *group) -+{ -+ struct au_br_hfsnotify *hfsn = group->private; -+ -+ /* AuDbg("here\n"); */ -+ au_kfree_try_rcu(hfsn); -+} -+ -+static int au_hfsn_handle_event(struct fsnotify_group *group, -+ u32 mask, const void *data, int data_type, -+ struct inode *dir, -+ const struct qstr *file_name, u32 cookie, -+ struct fsnotify_iter_info *iter_info) -+{ -+ int err; -+ struct au_hnotify *hnotify; -+ struct inode *h_dir, *h_inode; -+ struct fsnotify_mark *inode_mark; -+ -+ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); -+ -+ err = 0; -+ /* if FS_UNMOUNT happens, there must be another bug */ -+ AuDebugOn(mask & FS_UNMOUNT); -+ if (mask & (FS_IN_IGNORED | FS_UNMOUNT)) -+ goto out; -+ -+ h_dir = dir; -+ h_inode = NULL; -+#ifdef AuDbgHnotify -+ au_debug_on(); -+ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 -+ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { -+ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", -+ h_dir->i_ino, mask, au_hfsn_name(mask), -+ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); -+ /* WARN_ON(1); */ -+ } -+ au_debug_off(); -+#endif -+ -+ inode_mark = fsnotify_iter_inode_mark(iter_info); -+ AuDebugOn(!inode_mark); -+ hnotify = container_of(inode_mark, struct au_hnotify, hn_mark); -+ err = au_hnotify(h_dir, hnotify, mask, file_name, h_inode); -+ -+out: -+ return err; -+} -+ -+static struct fsnotify_ops au_hfsn_ops = { -+ .handle_event = au_hfsn_handle_event, -+ .free_group_priv = au_hfsn_free_group, -+ .free_mark = au_hfsn_free_mark -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin_br(struct au_branch *br) -+{ -+ struct au_br_hfsnotify *hfsn; -+ -+ hfsn = br->br_hfsn; -+ if (hfsn) { -+ lockdep_off(); -+ fsnotify_put_group(hfsn->hfsn_group); -+ lockdep_on(); -+ } -+} -+ -+static int au_hfsn_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ struct fsnotify_group *group; -+ struct au_br_hfsnotify *hfsn; -+ -+ err = 0; -+ br->br_hfsn = NULL; -+ if (!au_br_hnotifyable(perm)) -+ goto out; -+ -+ err = -ENOMEM; -+ hfsn = kmalloc(sizeof(*hfsn), GFP_NOFS); -+ if (unlikely(!hfsn)) -+ goto out; -+ -+ err = 0; -+ group = fsnotify_alloc_group(&au_hfsn_ops); -+ if (IS_ERR(group)) { -+ err = PTR_ERR(group); -+ pr_err("fsnotify_alloc_group() failed, %d\n", err); -+ goto out_hfsn; -+ } -+ -+ group->private = hfsn; -+ hfsn->hfsn_group = group; -+ br->br_hfsn = hfsn; -+ goto out; /* success */ -+ -+out_hfsn: -+ au_kfree_try_rcu(hfsn); -+out: -+ return err; -+} -+ -+static int au_hfsn_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (!br->br_hfsn) -+ err = au_hfsn_init_br(br, perm); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_fin(void) -+{ -+ AuDbg("au_hfsn_ifree %lld\n", (long long)atomic64_read(&au_hfsn_ifree)); -+ wait_event(au_hfsn_wq, !atomic64_read(&au_hfsn_ifree)); -+} -+ -+const struct au_hnotify_op au_hnotify_op = { -+ .ctl = au_hfsn_ctl, -+ .alloc = au_hfsn_alloc, -+ .free = au_hfsn_free, -+ -+ .fin = au_hfsn_fin, -+ -+ .reset_br = au_hfsn_reset_br, -+ .fin_br = au_hfsn_fin_br, -+ .init_br = au_hfsn_init_br -+}; -diff -Nurp linux-5.15.37/fs/aufs/hfsplus.c linux-5.15.37-aufs/fs/aufs/hfsplus.c ---- linux-5.15.37/fs/aufs/hfsplus.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/hfsplus.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,47 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * special support for filesystems which acquires an inode mutex -+ * at final closing a file, eg, hfsplus. -+ * -+ * This trick is very simple and stupid, just to open the file before really -+ * necessary open to tell hfsplus that this is not the final closing. -+ * The caller should call au_h_open_pre() after acquiring the inode mutex, -+ * and au_h_open_post() after releasing it. -+ */ -+ -+#include "aufs.h" -+ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, -+ int force_wr) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ AuDebugOn(!h_dentry); -+ AuDebugOn(d_is_negative(h_dentry)); -+ -+ h_file = NULL; -+ if (au_test_hfsplus(h_dentry->d_sb) -+ && d_is_reg(h_dentry)) -+ h_file = au_h_open(dentry, bindex, -+ O_RDONLY | O_NOATIME | O_LARGEFILE, -+ /*file*/NULL, force_wr); -+ return h_file; -+} -+ -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file) -+{ -+ struct au_branch *br; -+ -+ if (h_file) { -+ fput(h_file); -+ br = au_sbr(dentry->d_sb, bindex); -+ au_lcnt_dec(&br->br_nfiles); -+ } -+} -diff -Nurp linux-5.15.37/fs/aufs/hnotify.c linux-5.15.37-aufs/fs/aufs/hnotify.c ---- linux-5.15.37/fs/aufs/hnotify.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/hnotify.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,702 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * abstraction to notify the direct changes on lower directories -+ */ -+ -+/* #include */ -+#include "aufs.h" -+ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ -+ err = -ENOMEM; -+ hn = au_cache_alloc_hnotify(); -+ if (hn) { -+ hn->hn_aufs_inode = inode; -+ hinode->hi_notify = hn; -+ err = au_hnotify_op.alloc(hinode); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ hinode->hi_notify = NULL; -+ au_cache_free_hnotify(hn); -+ /* -+ * The upper dir was removed by udba, but the same named -+ * dir left. In this case, aufs assigns a new inode -+ * number and set the monitor again. -+ * For the lower dir, the old monitor is still left. -+ */ -+ if (err == -EEXIST) -+ err = 0; -+ } -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hn_free(struct au_hinode *hinode) -+{ -+ struct au_hnotify *hn; -+ -+ hn = hinode->hi_notify; -+ if (hn) { -+ hinode->hi_notify = NULL; -+ if (au_hnotify_op.free(hinode, hn)) -+ au_cache_free_hnotify(hn); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_hn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ if (hinode->hi_notify) -+ au_hnotify_op.ctl(hinode, do_set); -+} -+ -+void au_hn_reset(struct inode *inode, unsigned int flags) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct inode *hi; -+ struct dentry *iwhdentry; -+ -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ hi = au_h_iptr(inode, bindex); -+ if (!hi) -+ continue; -+ -+ /* inode_lock_nested(hi, AuLsc_I_CHILD); */ -+ iwhdentry = au_hi_wh(inode, bindex); -+ if (iwhdentry) -+ dget(iwhdentry); -+ au_igrab(hi); -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ au_set_h_iptr(inode, bindex, au_igrab(hi), -+ flags & ~AuHi_XINO); -+ iput(hi); -+ dput(iwhdentry); -+ /* inode_unlock(hi); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int hn_xino(struct inode *inode, struct inode *h_inode) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot, bfound, btop; -+ struct inode *h_i; -+ -+ err = 0; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ goto out; -+ } -+ -+ bfound = -1; -+ bbot = au_ibbot(inode); -+ btop = au_ibtop(inode); -+#if 0 /* reserved for future use */ -+ if (bindex == bbot) { -+ /* keep this ino in rename case */ -+ goto out; -+ } -+#endif -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex) == h_inode) { -+ bfound = bindex; -+ break; -+ } -+ if (bfound < 0) -+ goto out; -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(inode, bindex); -+ if (!h_i) -+ continue; -+ -+ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ /* bad action? */ -+ } -+ -+ /* children inode number will be broken */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_tree(struct dentry *dentry) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ if (IS_ROOT(d)) -+ continue; -+ -+ au_digen_dec(d); -+ if (d_really_is_positive(d)) -+ /* todo: reset children xino? -+ cached children only? */ -+ au_iigen_dec(d_inode(d)); -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+/* -+ * return 0 if processed. -+ */ -+static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, -+ const unsigned int isdir) -+{ -+ int err; -+ struct dentry *d; -+ struct qstr *dname; -+ -+ err = 1; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("branch root dir was changed\n"); -+ err = 0; -+ goto out; -+ } -+ -+ if (!isdir) { -+ AuDebugOn(!name); -+ au_iigen_dec(inode); -+ spin_lock(&inode->i_lock); -+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len != nlen -+ && memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ continue; -+ } -+ err = 0; -+ au_digen_dec(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&inode->i_lock); -+ } else { -+ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIR); -+ d = d_find_any_alias(inode); -+ if (!d) { -+ au_iigen_dec(inode); -+ goto out; -+ } -+ -+ spin_lock(&d->d_lock); -+ dname = &d->d_name; -+ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) { -+ spin_unlock(&d->d_lock); -+ err = hn_gen_tree(d); -+ spin_lock(&d->d_lock); -+ } -+ spin_unlock(&d->d_lock); -+ dput(d); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) -+{ -+ int err; -+ -+ if (IS_ROOT(dentry)) { -+ pr_warn("branch root dir was changed\n"); -+ return 0; -+ } -+ -+ err = 0; -+ if (!isdir) { -+ au_digen_dec(dentry); -+ if (d_really_is_positive(dentry)) -+ au_iigen_dec(d_inode(dentry)); -+ } else { -+ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR); -+ if (d_really_is_positive(dentry)) -+ err = hn_gen_tree(dentry); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* hnotify job flags */ -+#define AuHnJob_XINO0 1 -+#define AuHnJob_GEN (1 << 1) -+#define AuHnJob_DIRENT (1 << 2) -+#define AuHnJob_ISDIR (1 << 3) -+#define AuHnJob_TRYXINO0 (1 << 4) -+#define AuHnJob_MNTPNT (1 << 5) -+#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) -+#define au_fset_hnjob(flags, name) \ -+ do { (flags) |= AuHnJob_##name; } while (0) -+#define au_fclr_hnjob(flags, name) \ -+ do { (flags) &= ~AuHnJob_##name; } while (0) -+ -+enum { -+ AuHn_CHILD, -+ AuHn_PARENT, -+ AuHnLast -+}; -+ -+struct au_hnotify_args { -+ struct inode *h_dir, *dir, *h_child_inode; -+ u32 mask; -+ unsigned int flags[AuHnLast]; -+ unsigned int h_child_nlen; -+ char h_child_name[]; -+}; -+ -+struct hn_job_args { -+ unsigned int flags; -+ struct inode *inode, *h_inode, *dir, *h_dir; -+ struct dentry *dentry; -+ char *h_name; -+ int h_nlen; -+}; -+ -+static int hn_job(struct hn_job_args *a) -+{ -+ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); -+ int e; -+ -+ /* reset xino */ -+ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ -+ if (au_ftest_hnjob(a->flags, TRYXINO0) -+ && a->inode -+ && a->h_inode) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink -+ && !(a->h_inode->i_state & I_LINKABLE)) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ /* make the generation obsolete */ -+ if (au_ftest_hnjob(a->flags, GEN)) { -+ e = -1; -+ if (a->inode) -+ e = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, -+ isdir); -+ if (e && a->dentry) -+ hn_gen_by_name(a->dentry, isdir); -+ /* ignore this error */ -+ } -+ -+ /* make dir entries obsolete */ -+ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { -+ struct au_vdir *vdir; -+ -+ vdir = au_ivdir(a->inode); -+ if (vdir) -+ vdir->vd_jiffy = 0; -+ /* IMustLock(a->inode); */ -+ /* inode_inc_iversion(a->inode); */ -+ } -+ -+ /* can do nothing but warn */ -+ if (au_ftest_hnjob(a->flags, MNTPNT) -+ && a->dentry -+ && d_mountpoint(a->dentry)) -+ pr_warn("mount-point %pd is removed or renamed\n", a->dentry); -+ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, -+ struct inode *dir) -+{ -+ struct dentry *dentry, *d, *parent; -+ struct qstr *dname; -+ -+ parent = d_find_any_alias(dir); -+ if (!parent) -+ return NULL; -+ -+ dentry = NULL; -+ spin_lock(&parent->d_lock); -+ list_for_each_entry(d, &parent->d_subdirs, d_child) { -+ /* AuDbg("%pd\n", d); */ -+ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); -+ dname = &d->d_name; -+ if (dname->len != nlen || memcmp(dname->name, name, nlen)) -+ goto cont_unlock; -+ if (au_di(d)) -+ au_digen_dec(d); -+ else -+ goto cont_unlock; -+ if (au_dcount(d) > 0) { -+ dentry = dget_dlock(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ -+cont_unlock: -+ spin_unlock(&d->d_lock); -+ } -+ spin_unlock(&parent->d_lock); -+ dput(parent); -+ -+ if (dentry) -+ di_write_lock_child(dentry); -+ -+ return dentry; -+} -+ -+static struct inode *lookup_wlock_by_ino(struct super_block *sb, -+ aufs_bindex_t bindex, ino_t h_ino) -+{ -+ struct inode *inode; -+ ino_t ino; -+ int err; -+ -+ inode = NULL; -+ err = au_xino_read(sb, bindex, h_ino, &ino); -+ if (!err && ino) -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warn("wrong root branch\n"); -+ iput(inode); -+ inode = NULL; -+ goto out; -+ } -+ -+ ii_write_lock_child(inode); -+ -+out: -+ return inode; -+} -+ -+static void au_hn_bh(void *_args) -+{ -+ struct au_hnotify_args *a = _args; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot, bfound; -+ unsigned char xino, try_iput; -+ int err; -+ struct inode *inode; -+ ino_t h_ino; -+ struct hn_job_args args; -+ struct dentry *dentry; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(!_args); -+ AuDebugOn(!a->h_dir); -+ AuDebugOn(!a->dir); -+ AuDebugOn(!a->mask); -+ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", -+ a->mask, a->dir->i_ino, a->h_dir->i_ino, -+ a->h_child_inode ? a->h_child_inode->i_ino : 0); -+ -+ inode = NULL; -+ dentry = NULL; -+ /* -+ * do not lock a->dir->i_mutex here -+ * because of d_revalidate() may cause a deadlock. -+ */ -+ sb = a->dir->i_sb; -+ AuDebugOn(!sb); -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!sbinfo); -+ si_write_lock(sb, AuLock_NOPLMW); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ switch (a->mask & FS_EVENTS_POSS_ON_CHILD) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ AuWarn1("DIRREN with UDBA may not work correctly " -+ "for the direct rename(2)\n"); -+ } -+ -+ ii_read_lock_parent(a->dir); -+ bfound = -1; -+ bbot = au_ibbot(a->dir); -+ for (bindex = au_ibtop(a->dir); bindex <= bbot; bindex++) -+ if (au_h_iptr(a->dir, bindex) == a->h_dir) { -+ bfound = bindex; -+ break; -+ } -+ ii_read_unlock(a->dir); -+ if (unlikely(bfound < 0)) -+ goto out; -+ -+ xino = !!au_opt_test(au_mntflags(sb), XINO); -+ h_ino = 0; -+ if (a->h_child_inode) -+ h_ino = a->h_child_inode->i_ino; -+ -+ if (a->h_child_nlen -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) -+ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, -+ a->dir); -+ try_iput = 0; -+ if (dentry && d_really_is_positive(dentry)) -+ inode = d_inode(dentry); -+ if (xino && !inode && h_ino -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { -+ inode = lookup_wlock_by_ino(sb, bfound, h_ino); -+ try_iput = 1; -+ } -+ -+ args.flags = a->flags[AuHn_CHILD]; -+ args.dentry = dentry; -+ args.inode = inode; -+ args.h_inode = a->h_child_inode; -+ args.dir = a->dir; -+ args.h_dir = a->h_dir; -+ args.h_name = a->h_child_name; -+ args.h_nlen = a->h_child_nlen; -+ err = hn_job(&args); -+ if (dentry) { -+ if (au_di(dentry)) -+ di_write_unlock(dentry); -+ dput(dentry); -+ } -+ if (inode && try_iput) { -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ -+ ii_write_lock_parent(a->dir); -+ args.flags = a->flags[AuHn_PARENT]; -+ args.dentry = NULL; -+ args.inode = a->dir; -+ args.h_inode = a->h_dir; -+ args.dir = NULL; -+ args.h_dir = NULL; -+ args.h_name = NULL; -+ args.h_nlen = 0; -+ err = hn_job(&args); -+ ii_write_unlock(a->dir); -+ -+out: -+ iput(a->h_child_inode); -+ iput(a->h_dir); -+ iput(a->dir); -+ si_write_unlock(sb); -+ au_nwt_done(&sbinfo->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode) -+{ -+ int err, len; -+ unsigned int flags[AuHnLast], f; -+ unsigned char isdir, isroot, wh; -+ struct inode *dir; -+ struct au_hnotify_args *args; -+ char *p, *h_child_name; -+ -+ err = 0; -+ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); -+ dir = igrab(hnotify->hn_aufs_inode); -+ if (!dir) -+ goto out; -+ -+ isroot = (dir->i_ino == AUFS_ROOT_INO); -+ wh = 0; -+ h_child_name = (void *)h_child_qstr->name; -+ len = h_child_qstr->len; -+ if (h_child_name) { -+ if (len > AUFS_WH_PFX_LEN -+ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ h_child_name += AUFS_WH_PFX_LEN; -+ len -= AUFS_WH_PFX_LEN; -+ wh = 1; -+ } -+ } -+ -+ isdir = 0; -+ if (h_child_inode) -+ isdir = !!S_ISDIR(h_child_inode->i_mode); -+ flags[AuHn_PARENT] = AuHnJob_ISDIR; -+ flags[AuHn_CHILD] = 0; -+ if (isdir) -+ flags[AuHn_CHILD] = AuHnJob_ISDIR; -+ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); -+ au_fset_hnjob(flags[AuHn_CHILD], GEN); -+ switch (mask & ALL_FSNOTIFY_DIRENT_EVENTS) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ au_fset_hnjob(flags[AuHn_CHILD], XINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ fallthrough; -+ case FS_CREATE: -+ AuDebugOn(!h_child_name); -+ break; -+ -+ case FS_DELETE: -+ /* -+ * aufs never be able to get this child inode. -+ * revalidation should be in d_revalidate() -+ * by checking i_nlink, i_generation or d_unhashed(). -+ */ -+ AuDebugOn(!h_child_name); -+ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ break; -+ -+ default: -+ AuDebugOn(1); -+ } -+ -+ if (wh) -+ h_child_inode = NULL; -+ -+ err = -ENOMEM; -+ /* iput() and kfree() will be called in au_hnotify() */ -+ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ iput(dir); -+ goto out; -+ } -+ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; -+ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; -+ args->mask = mask; -+ args->dir = dir; -+ args->h_dir = igrab(h_dir); -+ if (h_child_inode) -+ h_child_inode = igrab(h_child_inode); /* can be NULL */ -+ args->h_child_inode = h_child_inode; -+ args->h_child_nlen = len; -+ if (len) { -+ p = (void *)args; -+ p += sizeof(*args); -+ memcpy(p, h_child_name, len); -+ p[len] = 0; -+ } -+ -+ /* NFS fires the event for silly-renamed one from kworker */ -+ f = 0; -+ if (!dir->i_nlink -+ || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) -+ f = AuWkq_NEST; -+ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ iput(args->h_child_inode); -+ iput(args->h_dir); -+ iput(args->dir); -+ au_kfree_rcu(args); -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm) -+{ -+ int err; -+ -+ AuDebugOn(!(udba & AuOptMask_UDBA)); -+ -+ err = 0; -+ if (au_hnotify_op.reset_br) -+ err = au_hnotify_op.reset_br(udba, br, perm); -+ -+ return err; -+} -+ -+int au_hnotify_init_br(struct au_branch *br, int perm) -+{ -+ int err; -+ -+ err = 0; -+ if (au_hnotify_op.init_br) -+ err = au_hnotify_op.init_br(br, perm); -+ -+ return err; -+} -+ -+void au_hnotify_fin_br(struct au_branch *br) -+{ -+ if (au_hnotify_op.fin_br) -+ au_hnotify_op.fin_br(br); -+} -+ -+static void au_hn_destroy_cache(void) -+{ -+ kmem_cache_destroy(au_cache[AuCache_HNOTIFY]); -+ au_cache[AuCache_HNOTIFY] = NULL; -+} -+ -+int __init au_hnotify_init(void) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ au_cache[AuCache_HNOTIFY] = AuCache(au_hnotify); -+ if (au_cache[AuCache_HNOTIFY]) { -+ err = 0; -+ if (au_hnotify_op.init) -+ err = au_hnotify_op.init(); -+ if (unlikely(err)) -+ au_hn_destroy_cache(); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hnotify_fin(void) -+{ -+ if (au_hnotify_op.fin) -+ au_hnotify_op.fin(); -+ -+ /* cf. au_cache_fin() */ -+ if (au_cache[AuCache_HNOTIFY]) -+ au_hn_destroy_cache(); -+} -diff -Nurp linux-5.15.37/fs/aufs/iinfo.c linux-5.15.37-aufs/fs/aufs/iinfo.c ---- linux-5.15.37/fs/aufs/iinfo.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/iinfo.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,273 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode private data -+ */ -+ -+#include "aufs.h" -+ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct inode *h_inode; -+ struct au_hinode *hinode; -+ -+ IiMustAnyLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ h_inode = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ return h_inode; -+} -+ -+/* todo: hard/soft set? */ -+void au_hiput(struct au_hinode *hinode) -+{ -+ au_hn_free(hinode); -+ dput(hinode->hi_whdentry); -+ iput(hinode->hi_inode); -+} -+ -+unsigned int au_hi_flags(struct inode *inode, int isdir) -+{ -+ unsigned int flags; -+ const unsigned int mnt_flags = au_mntflags(inode->i_sb); -+ -+ flags = 0; -+ if (au_opt_test(mnt_flags, XINO)) -+ au_fset_hi(flags, XINO); -+ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) -+ au_fset_hi(flags, HNOTIFY); -+ return flags; -+} -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags) -+{ -+ struct au_hinode *hinode; -+ struct inode *hi; -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(iinfo, bindex); -+ hi = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ -+ if (hi) -+ au_hiput(hinode); -+ hinode->hi_inode = h_inode; -+ if (h_inode) { -+ int err; -+ struct super_block *sb = inode->i_sb; -+ struct au_branch *br; -+ -+ AuDebugOn(inode->i_mode -+ && (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)); -+ if (bindex == iinfo->ii_btop) -+ au_cpup_igen(inode, h_inode); -+ br = au_sbr(sb, bindex); -+ hinode->hi_id = br->br_id; -+ if (au_ftest_hi(flags, XINO)) { -+ err = au_xino_write(sb, bindex, h_inode->i_ino, -+ inode->i_ino); -+ if (unlikely(err)) -+ AuIOErr1("failed au_xino_write() %d\n", err); -+ } -+ -+ if (au_ftest_hi(flags, HNOTIFY) -+ && au_br_hnotifyable(br->br_perm)) { -+ err = au_hn_alloc(hinode, inode); -+ if (unlikely(err)) -+ AuIOErr1("au_hn_alloc() %d\n", err); -+ } -+ } -+} -+ -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh) -+{ -+ struct au_hinode *hinode; -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_hinode(au_ii(inode), bindex); -+ AuDebugOn(hinode->hi_whdentry); -+ hinode->hi_whdentry = h_wh; -+} -+ -+void au_update_iigen(struct inode *inode, int half) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ unsigned int sigen; -+ -+ sigen = au_sigen(inode->i_sb); -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation = sigen; -+ if (half) -+ au_ig_fset(iigen->ig_flags, HALF_REFRESHED); -+ else -+ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED); -+ spin_unlock(&iigen->ig_spin); -+} -+ -+/* it may be called at remount time, too */ -+void au_update_ibrange(struct inode *inode, int do_put_zero) -+{ -+ struct au_iinfo *iinfo; -+ aufs_bindex_t bindex, bbot; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ iinfo = au_ii(inode); -+ if (do_put_zero && iinfo->ii_btop >= 0) { -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++) { -+ struct inode *h_i; -+ -+ h_i = au_hinode(iinfo, bindex)->hi_inode; -+ if (h_i -+ && !h_i->i_nlink -+ && !(h_i->i_state & I_LINKABLE)) -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ } -+ } -+ -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ bbot = au_sbbot(inode->i_sb); -+ for (bindex = 0; bindex <= bbot; bindex++) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_btop = bindex; -+ break; -+ } -+ if (iinfo->ii_btop >= 0) -+ for (bindex = bbot; bindex >= iinfo->ii_btop; bindex--) -+ if (au_hinode(iinfo, bindex)->hi_inode) { -+ iinfo->ii_bbot = bindex; -+ break; -+ } -+ AuDebugOn(iinfo->ii_btop > iinfo->ii_bbot); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_icntnr_init_once(void *_c) -+{ -+ struct au_icntnr *c = _c; -+ struct au_iinfo *iinfo = &c->iinfo; -+ -+ spin_lock_init(&iinfo->ii_generation.ig_spin); -+ au_rw_init(&iinfo->ii_rwsem); -+ inode_init_once(&c->vfs_inode); -+} -+ -+void au_hinode_init(struct au_hinode *hinode) -+{ -+ hinode->hi_inode = NULL; -+ hinode->hi_id = -1; -+ au_hn_init(hinode); -+ hinode->hi_whdentry = NULL; -+} -+ -+int au_iinfo_init(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ int nbr, i; -+ -+ sb = inode->i_sb; -+ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+ nbr = au_sbbot(sb) + 1; -+ if (unlikely(nbr <= 0)) -+ nbr = 1; -+ hi = kmalloc_array(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); -+ if (hi) { -+ au_lcnt_inc(&au_sbi(sb)->si_ninodes); -+ -+ iinfo->ii_hinode = hi; -+ for (i = 0; i < nbr; i++, hi++) -+ au_hinode_init(hi); -+ -+ iinfo->ii_generation.ig_generation = au_sigen(sb); -+ iinfo->ii_btop = -1; -+ iinfo->ii_bbot = -1; -+ iinfo->ii_vdir = NULL; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink) -+{ -+ int err, i; -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ err = -ENOMEM; -+ hip = au_krealloc(iinfo->ii_hinode, sizeof(*hip) * nbr, GFP_NOFS, -+ may_shrink); -+ if (hip) { -+ iinfo->ii_hinode = hip; -+ i = iinfo->ii_bbot + 1; -+ hip += i; -+ for (; i < nbr; i++, hip++) -+ au_hinode_init(hip); -+ err = 0; -+ } -+ -+ return err; -+} -+ -+void au_iinfo_fin(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char unlinked = !inode->i_nlink; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ au_lcnt_dec(&au_sbi(sb)->si_ninodes); -+ if (si_pid_test(sb)) -+ au_xino_delete_inode(inode, unlinked); -+ else { -+ /* -+ * it is safe to hide the dependency between sbinfo and -+ * sb->s_umount. -+ */ -+ lockdep_off(); -+ si_noflush_read_lock(sb); -+ au_xino_delete_inode(inode, unlinked); -+ si_read_unlock(sb); -+ lockdep_on(); -+ } -+ -+ iinfo = au_ii(inode); -+ if (iinfo->ii_vdir) -+ au_vdir_free(iinfo->ii_vdir); -+ -+ bindex = iinfo->ii_btop; -+ if (bindex >= 0) { -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ while (bindex++ <= bbot) { -+ if (hi->hi_inode) -+ au_hiput(hi); -+ hi++; -+ } -+ } -+ au_kfree_rcu(iinfo->ii_hinode); -+ AuRwDestroy(&iinfo->ii_rwsem); -+} -diff -Nurp linux-5.15.37/fs/aufs/inode.c linux-5.15.37-aufs/fs/aufs/inode.c ---- linux-5.15.37/fs/aufs/inode.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/inode.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,518 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode functions -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct inode *au_igrab(struct inode *inode) -+{ -+ if (inode) { -+ AuDebugOn(!atomic_read(&inode->i_count)); -+ ihold(inode); -+ } -+ return inode; -+} -+ -+static void au_refresh_hinode_attr(struct inode *inode, int do_version) -+{ -+ au_cpup_attr_all(inode, /*force*/0); -+ au_update_iigen(inode, /*half*/1); -+ if (do_version) -+ inode_inc_iversion(inode); -+} -+ -+static int au_ii_refresh(struct inode *inode, int *update) -+{ -+ int err, e, nbr; -+ umode_t type; -+ aufs_bindex_t bindex, new_bindex; -+ struct super_block *sb; -+ struct au_iinfo *iinfo; -+ struct au_hinode *p, *q, tmp; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ IiMustWriteLock(inode); -+ -+ *update = 0; -+ sb = inode->i_sb; -+ nbr = au_sbbot(sb) + 1; -+ type = inode->i_mode & S_IFMT; -+ iinfo = au_ii(inode); -+ err = au_hinode_realloc(iinfo, nbr, /*may_shrink*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ AuDebugOn(iinfo->ii_btop < 0); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; -+ bindex++, p++) { -+ if (!p->hi_inode) -+ continue; -+ -+ AuDebugOn(type != (p->hi_inode->i_mode & S_IFMT)); -+ new_bindex = au_br_index(sb, p->hi_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (new_bindex < 0) { -+ *update = 1; -+ au_hiput(p); -+ p->hi_inode = NULL; -+ continue; -+ } -+ -+ if (new_bindex < iinfo->ii_btop) -+ iinfo->ii_btop = new_bindex; -+ if (iinfo->ii_bbot < new_bindex) -+ iinfo->ii_bbot = new_bindex; -+ /* swap two lower inode, and loop again */ -+ q = au_hinode(iinfo, new_bindex); -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hi_inode) { -+ bindex--; -+ p--; -+ } -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ au_hinode_realloc(iinfo, nbr, /*may_shrink*/1); /* harmless if err */ -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_refresh_iop(struct inode *inode, int force_getattr) -+{ -+ int type; -+ struct au_sbinfo *sbi = au_sbi(inode->i_sb); -+ const struct inode_operations *iop -+ = force_getattr ? aufs_iop : sbi->si_iop_array; -+ -+ if (inode->i_op == iop) -+ return; -+ -+ switch (inode->i_mode & S_IFMT) { -+ case S_IFDIR: -+ type = AuIop_DIR; -+ break; -+ case S_IFLNK: -+ type = AuIop_SYMLINK; -+ break; -+ default: -+ type = AuIop_OTHER; -+ break; -+ } -+ -+ inode->i_op = iop + type; -+ /* unnecessary smp_wmb() */ -+} -+ -+int au_refresh_hinode_self(struct inode *inode) -+{ -+ int err, update; -+ -+ err = au_ii_refresh(inode, &update); -+ if (!err) -+ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry) -+{ -+ int err, e, update; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, bbot; -+ unsigned char isdir; -+ struct au_hinode *p; -+ struct au_iinfo *iinfo; -+ -+ err = au_ii_refresh(inode, &update); -+ if (unlikely(err)) -+ goto out; -+ -+ update = 0; -+ iinfo = au_ii(inode); -+ p = au_hinode(iinfo, iinfo->ii_btop); -+ mode = (inode->i_mode & S_IFMT); -+ isdir = S_ISDIR(mode); -+ flags = au_hi_flags(inode, isdir); -+ bbot = au_dbbot(dentry); -+ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { -+ struct inode *h_i, *h_inode; -+ struct dentry *h_d; -+ -+ h_d = au_h_dptr(dentry, bindex); -+ if (!h_d || d_is_negative(h_d)) -+ continue; -+ -+ h_inode = d_inode(h_d); -+ AuDebugOn(mode != (h_inode->i_mode & S_IFMT)); -+ if (iinfo->ii_btop <= bindex && bindex <= iinfo->ii_bbot) { -+ h_i = au_h_iptr(inode, bindex); -+ if (h_i) { -+ if (h_i == h_inode) -+ continue; -+ err = -EIO; -+ break; -+ } -+ } -+ if (bindex < iinfo->ii_btop) -+ iinfo->ii_btop = bindex; -+ if (iinfo->ii_bbot < bindex) -+ iinfo->ii_bbot = bindex; -+ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags); -+ update = 1; -+ } -+ au_update_ibrange(inode, /*do_put_zero*/0); -+ e = au_dy_irefresh(inode); -+ if (unlikely(e && !err)) -+ err = e; -+ if (!err) -+ au_refresh_hinode_attr(inode, update && isdir); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int set_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, btop, btail; -+ unsigned char isdir; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_iinfo *iinfo; -+ const struct inode_operations *iop; -+ -+ IiMustWriteLock(inode); -+ -+ err = 0; -+ isdir = 0; -+ iop = au_sbi(inode->i_sb)->si_iop_array; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ inode->i_fop = &aufs_file_fop; -+ err = au_dy_iaop(inode, btop, h_inode); -+ if (unlikely(err)) -+ goto out; -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ btail = au_dbtaildir(dentry); -+ inode->i_op = iop + AuIop_DIR; -+ inode->i_fop = &aufs_dir_fop; -+ break; -+ case S_IFLNK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_SYMLINK; -+ break; -+ case S_IFBLK: -+ case S_IFCHR: -+ case S_IFIFO: -+ case S_IFSOCK: -+ btail = au_dbtail(dentry); -+ inode->i_op = iop + AuIop_OTHER; -+ init_special_inode(inode, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown file type 0%o\n", mode); -+ err = -EIO; -+ goto out; -+ } -+ -+ /* do not set hnotify for whiteouted dirs (SHWH mode) */ -+ flags = au_hi_flags(inode, isdir); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) -+ && au_ftest_hi(flags, HNOTIFY) -+ && dentry->d_name.len > AUFS_WH_PFX_LEN -+ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) -+ au_fclr_hi(flags, HNOTIFY); -+ iinfo = au_ii(inode); -+ iinfo->ii_btop = btop; -+ iinfo->ii_bbot = btail; -+ for (bindex = btop; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ au_set_h_iptr(inode, bindex, -+ au_igrab(d_inode(h_dentry)), flags); -+ } -+ au_cpup_attr_all(inode, /*force*/1); -+ /* -+ * to force calling aufs_get_acl() every time, -+ * do not call cache_no_acl() for aufs inode. -+ */ -+ -+out: -+ return err; -+} -+ -+/* -+ * successful returns with iinfo write_locked -+ * minus: errno -+ * zero: success, matched -+ * plus: no error, but unmatched -+ */ -+static int reval_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int gen, igflags; -+ aufs_bindex_t bindex, bbot; -+ struct inode *h_inode, *h_dinode; -+ struct dentry *h_dentry; -+ -+ /* -+ * before this function, if aufs got any iinfo lock, it must be only -+ * one, the parent dir. -+ * it can happen by UDBA and the obsoleted inode number. -+ */ -+ err = -EIO; -+ if (unlikely(inode->i_ino == parent_ino(dentry))) -+ goto out; -+ -+ err = 1; -+ ii_write_lock_new_child(inode); -+ h_dentry = au_h_dptr(dentry, au_dbtop(dentry)); -+ h_dinode = d_inode(h_dentry); -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (!h_inode || h_inode != h_dinode) -+ continue; -+ -+ err = 0; -+ gen = au_iigen(inode, &igflags); -+ if (gen == au_digen(dentry) -+ && !au_ig_ftest(igflags, HALF_REFRESHED)) -+ break; -+ -+ /* fully refresh inode using dentry */ -+ err = au_refresh_hinode(inode, dentry); -+ if (!err) -+ au_update_iigen(inode, /*half*/0); -+ break; -+ } -+ -+ if (unlikely(err)) -+ ii_write_unlock(inode); -+out: -+ return err; -+} -+ -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino) -+{ -+ int err, idx; -+ const int isnondir = d_type != DT_DIR; -+ -+ /* prevent hardlinked inode number from race condition */ -+ if (isnondir) { -+ err = au_xinondir_enter(sb, bindex, h_ino, &idx); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, bindex, h_ino, ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!*ino) { -+ err = -EIO; -+ *ino = au_xino_new_ino(sb); -+ if (unlikely(!*ino)) -+ goto out_xinondir; -+ err = au_xino_write(sb, bindex, h_ino, *ino); -+ if (unlikely(err)) -+ goto out_xinondir; -+ } -+ -+out_xinondir: -+ if (isnondir && idx >= 0) -+ au_xinondir_leave(sb, bindex, h_ino, idx); -+out: -+ return err; -+} -+ -+/* successful returns with iinfo write_locked */ -+/* todo: return with unlocked? */ -+struct inode *au_new_inode(struct dentry *dentry, int must_new) -+{ -+ struct inode *inode, *h_inode; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ ino_t h_ino, ino; -+ int err, idx, hlinked; -+ aufs_bindex_t btop; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ h_dentry = au_h_dptr(dentry, btop); -+ h_inode = d_inode(h_dentry); -+ h_ino = h_inode->i_ino; -+ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; -+ -+new_ino: -+ /* -+ * stop 'race'-ing between hardlinks under different -+ * parents. -+ */ -+ if (hlinked) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ err = au_xino_read(sb, btop, h_ino, &ino); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_xinondir; -+ -+ if (!ino) { -+ ino = au_xino_new_ino(sb); -+ if (unlikely(!ino)) { -+ inode = ERR_PTR(-EIO); -+ goto out_xinondir; -+ } -+ } -+ -+ AuDbg("i%lu\n", (unsigned long)ino); -+ inode = au_iget_locked(sb, ino); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out_xinondir; -+ -+ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); -+ if (inode->i_state & I_NEW) { -+ ii_write_lock_new_child(inode); -+ err = set_inode(inode, dentry); -+ if (!err) { -+ unlock_new_inode(inode); -+ goto out_xinondir; /* success */ -+ } -+ -+ /* -+ * iget_failed() calls iput(), but we need to call -+ * ii_write_unlock() after iget_failed(). so dirty hack for -+ * i_count. -+ */ -+ atomic_inc(&inode->i_count); -+ iget_failed(inode); -+ ii_write_unlock(inode); -+ au_xino_write(sb, btop, h_ino, /*ino*/0); -+ /* ignore this error */ -+ goto out_iput; -+ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { -+ /* -+ * horrible race condition between lookup, readdir and copyup -+ * (or something). -+ */ -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ err = reval_inode(inode, dentry); -+ if (unlikely(err < 0)) { -+ hlinked = 0; -+ goto out_iput; -+ } -+ if (!err) -+ goto out; /* success */ -+ else if (hlinked && idx >= 0) { -+ err = au_xinondir_enter(sb, btop, h_ino, &idx); -+ if (unlikely(err)) { -+ iput(inode); -+ inode = ERR_PTR(err); -+ goto out; -+ } -+ } -+ } -+ -+ if (unlikely(au_test_fs_unique_ino(h_inode))) -+ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," -+ " b%d, %s, %pd, hi%lu, i%lu.\n", -+ btop, au_sbtype(h_dentry->d_sb), dentry, -+ (unsigned long)h_ino, (unsigned long)ino); -+ ino = 0; -+ err = au_xino_write(sb, btop, h_ino, /*ino*/0); -+ if (!err) { -+ iput(inode); -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+ goto new_ino; -+ } -+ -+out_iput: -+ iput(inode); -+ inode = ERR_PTR(err); -+out_xinondir: -+ if (hlinked && idx >= 0) -+ au_xinondir_leave(sb, btop, h_ino, idx); -+out: -+ return inode; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode) -+{ -+ int err; -+ struct inode *hi; -+ -+ err = au_br_rdonly(au_sbr(sb, bindex)); -+ -+ /* pseudo-link after flushed may happen out of bounds */ -+ if (!err -+ && inode -+ && au_ibtop(inode) <= bindex -+ && bindex <= au_ibbot(inode)) { -+ /* -+ * permission check is unnecessary since vfsub routine -+ * will be called later -+ */ -+ hi = au_h_iptr(inode, bindex); -+ if (hi) -+ err = IS_IMMUTABLE(hi) ? -EROFS : 0; -+ } -+ -+ return err; -+} -+ -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask) -+{ -+ if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) -+ return 0; -+ return inode_permission(h_userns, h_inode, mask); -+} -+ -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask) -+{ -+ if (au_test_nfs(h_inode->i_sb) -+ && (mask & MAY_WRITE) -+ && S_ISDIR(h_inode->i_mode)) -+ mask |= MAY_READ; /* force permission check */ -+ return au_test_h_perm(h_userns, h_inode, mask); -+} -diff -Nurp linux-5.15.37/fs/aufs/inode.h linux-5.15.37-aufs/fs/aufs/inode.h ---- linux-5.15.37/fs/aufs/inode.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/inode.h 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,692 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations -+ */ -+ -+#ifndef __AUFS_INODE_H__ -+#define __AUFS_INODE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "rwsem.h" -+ -+struct vfsmount; -+ -+struct au_hnotify { -+#ifdef CONFIG_AUFS_HNOTIFY -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ /* never use fsnotify_add_vfsmount_mark() */ -+ struct fsnotify_mark hn_mark; -+#endif -+ struct inode *hn_aufs_inode; /* no get/put */ -+ struct rcu_head rcu; -+#endif -+} ____cacheline_aligned_in_smp; -+ -+struct au_hinode { -+ struct inode *hi_inode; -+ aufs_bindex_t hi_id; -+#ifdef CONFIG_AUFS_HNOTIFY -+ struct au_hnotify *hi_notify; -+#endif -+ -+ /* reference to the copied-up whiteout with get/put */ -+ struct dentry *hi_whdentry; -+}; -+ -+/* ig_flags */ -+#define AuIG_HALF_REFRESHED 1 -+#define au_ig_ftest(flags, name) ((flags) & AuIG_##name) -+#define au_ig_fset(flags, name) \ -+ do { (flags) |= AuIG_##name; } while (0) -+#define au_ig_fclr(flags, name) \ -+ do { (flags) &= ~AuIG_##name; } while (0) -+ -+struct au_iigen { -+ spinlock_t ig_spin; -+ __u32 ig_generation, ig_flags; -+}; -+ -+struct au_vdir; -+struct au_iinfo { -+ struct au_iigen ii_generation; -+ struct super_block *ii_hsb1; /* no get/put */ -+ -+ struct au_rwsem ii_rwsem; -+ aufs_bindex_t ii_btop, ii_bbot; -+ __u32 ii_higen; -+ struct au_hinode *ii_hinode; -+ struct au_vdir *ii_vdir; -+}; -+ -+struct au_icntnr { -+ struct au_iinfo iinfo; -+ struct inode vfs_inode; -+ struct hlist_bl_node plink; -+ struct rcu_head rcu; -+} ____cacheline_aligned_in_smp; -+ -+/* au_pin flags */ -+#define AuPin_DI_LOCKED 1 -+#define AuPin_MNT_WRITE (1 << 1) -+#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) -+#define au_fset_pin(flags, name) \ -+ do { (flags) |= AuPin_##name; } while (0) -+#define au_fclr_pin(flags, name) \ -+ do { (flags) &= ~AuPin_##name; } while (0) -+ -+struct au_pin { -+ /* input */ -+ struct dentry *dentry; -+ unsigned int udba; -+ unsigned char lsc_di, lsc_hi, flags; -+ aufs_bindex_t bindex; -+ -+ /* output */ -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ struct vfsmount *h_mnt; -+ -+ /* temporary unlock/relock for copyup */ -+ struct dentry *h_dentry, *h_parent; -+ struct au_branch *br; -+ struct task_struct *task; -+}; -+ -+void au_pin_hdir_unlock(struct au_pin *p); -+int au_pin_hdir_lock(struct au_pin *p); -+int au_pin_hdir_relock(struct au_pin *p); -+void au_pin_hdir_acquire_nest(struct au_pin *p); -+void au_pin_hdir_release(struct au_pin *p); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_iinfo *au_ii(struct inode *inode) -+{ -+ BUG_ON(is_bad_inode(inode)); -+ return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* inode.c */ -+struct inode *au_igrab(struct inode *inode); -+void au_refresh_iop(struct inode *inode, int force_getattr); -+int au_refresh_hinode_self(struct inode *inode); -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry); -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino); -+struct inode *au_new_inode(struct dentry *dentry, int must_new); -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode); -+int au_test_h_perm(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask); -+int au_test_h_perm_sio(struct user_namespace *h_userns, struct inode *h_inode, -+ int mask); -+ -+static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, unsigned int d_type, ino_t *ino) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ return au_ino(sb, bindex, h_ino, d_type, ino); -+#else -+ return 0; -+#endif -+} -+ -+/* i_op.c */ -+enum { -+ AuIop_SYMLINK, -+ AuIop_DIR, -+ AuIop_OTHER, -+ AuIop_Last -+}; -+extern struct inode_operations aufs_iop[AuIop_Last], /* not const */ -+ aufs_iop_nogetattr[AuIop_Last]; -+ -+/* au_wr_dir flags */ -+#define AuWrDir_ADD_ENTRY 1 -+#define AuWrDir_ISDIR (1 << 1) -+#define AuWrDir_TMPFILE (1 << 2) -+#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) -+#define au_fset_wrdir(flags, name) \ -+ do { (flags) |= AuWrDir_##name; } while (0) -+#define au_fclr_wrdir(flags, name) \ -+ do { (flags) &= ~AuWrDir_##name; } while (0) -+ -+struct au_wr_dir_args { -+ aufs_bindex_t force_btgt; -+ unsigned char flags; -+}; -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args); -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin); -+void au_pin_init(struct au_pin *pin, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags); -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) __must_check; -+int au_do_pin(struct au_pin *pin) __must_check; -+void au_unpin(struct au_pin *pin); -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen); -+ -+#define AuIcpup_DID_CPUP 1 -+#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) -+#define au_fset_icpup(flags, name) \ -+ do { (flags) |= AuIcpup_##name; } while (0) -+#define au_fclr_icpup(flags, name) \ -+ do { (flags) &= ~AuIcpup_##name; } while (0) -+ -+struct au_icpup_args { -+ unsigned char flags; -+ unsigned char pin_flags; -+ aufs_bindex_t btgt; -+ unsigned int udba; -+ struct au_pin pin; -+ struct path h_path; -+ struct inode *h_inode; -+}; -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a); -+ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked); -+ -+/* i_op_add.c */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, dev_t dev); -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, const char *symname); -+int aufs_create(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, bool want_excl); -+struct vfsub_aopen_args; -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode); -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry); -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode); -+ -+/* i_op_del.c */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_unlink(struct inode *dir, struct dentry *dentry); -+int aufs_rmdir(struct inode *dir, struct dentry *dentry); -+ -+/* i_op_ren.c */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); -+int aufs_rename(struct user_namespace *userns, -+ struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry, -+ unsigned int _flags); -+ -+/* iinfo.c */ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); -+void au_hiput(struct au_hinode *hinode); -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh); -+unsigned int au_hi_flags(struct inode *inode, int isdir); -+ -+/* hinode flags */ -+#define AuHi_XINO 1 -+#define AuHi_HNOTIFY (1 << 1) -+#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) -+#define au_fset_hi(flags, name) \ -+ do { (flags) |= AuHi_##name; } while (0) -+#define au_fclr_hi(flags, name) \ -+ do { (flags) &= ~AuHi_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuHi_HNOTIFY -+#define AuHi_HNOTIFY 0 -+#endif -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags); -+ -+void au_update_iigen(struct inode *inode, int half); -+void au_update_ibrange(struct inode *inode, int do_put_zero); -+ -+void au_icntnr_init_once(void *_c); -+void au_hinode_init(struct au_hinode *hinode); -+int au_iinfo_init(struct inode *inode); -+void au_iinfo_fin(struct inode *inode); -+int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink); -+ -+#ifdef CONFIG_PROC_FS -+/* plink.c */ -+int au_plink_maint(struct super_block *sb, int flags); -+struct au_sbinfo; -+void au_plink_maint_leave(struct au_sbinfo *sbinfo); -+int au_plink_maint_enter(struct super_block *sb); -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb); -+#else -+AuStubVoid(au_plink_list, struct super_block *sb) -+#endif -+int au_plink_test(struct inode *inode); -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+void au_plink_put(struct super_block *sb, int verbose); -+void au_plink_clean(struct super_block *sb, int verbose); -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); -+#else -+AuStubInt0(au_plink_maint, struct super_block *sb, int flags); -+AuStubVoid(au_plink_maint_leave, struct au_sbinfo *sbinfo); -+AuStubInt0(au_plink_maint_enter, struct super_block *sb); -+AuStubVoid(au_plink_list, struct super_block *sb); -+AuStubInt0(au_plink_test, struct inode *inode); -+AuStub(struct dentry *, au_plink_lkup, return NULL, -+ struct inode *inode, aufs_bindex_t bindex); -+AuStubVoid(au_plink_append, struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+AuStubVoid(au_plink_put, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_clean, struct super_block *sb, int verbose); -+AuStubVoid(au_plink_half_refresh, struct super_block *sb, aufs_bindex_t br_id); -+#endif /* CONFIG_PROC_FS */ -+ -+#ifdef CONFIG_AUFS_XATTR -+/* xattr.c */ -+int au_cpup_xattr(struct path *h_dst, struct path *h_src, int ignore_flags, -+ unsigned int verbose); -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size); -+void au_xattr_init(struct super_block *sb); -+#else -+AuStubInt0(au_cpup_xattr, struct path *h_dst, struct path *h_src, -+ int ignore_flags, unsigned int verbose); -+AuStubVoid(au_xattr_init, struct super_block *sb); -+#endif -+ -+#ifdef CONFIG_FS_POSIX_ACL -+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 -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+enum { -+ AU_XATTR_SET, -+ AU_ACL_SET -+}; -+ -+struct au_sxattr { -+ int type; -+ union { -+ struct { -+ const char *name; -+ const void *value; -+ size_t size; -+ int flags; -+ } set; -+ struct { -+ struct posix_acl *acl; -+ int type; -+ } acl_set; -+ } u; -+}; -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for iinfo */ -+enum { -+ AuLsc_II_CHILD, /* child first */ -+ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_II_CHILD3, /* copyup dirs */ -+ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ -+ AuLsc_II_PARENT2, -+ AuLsc_II_PARENT3, /* copyup dirs */ -+ AuLsc_II_NEW_CHILD -+}; -+ -+/* -+ * ii_read_lock_child, ii_write_lock_child, -+ * ii_read_lock_child2, ii_write_lock_child2, -+ * ii_read_lock_child3, ii_write_lock_child3, -+ * ii_read_lock_parent, ii_write_lock_parent, -+ * ii_read_lock_parent2, ii_write_lock_parent2, -+ * ii_read_lock_parent3, ii_write_lock_parent3, -+ * ii_read_lock_new_child, ii_write_lock_new_child, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void ii_read_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void ii_write_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+AuRWLockFuncs(new_child, NEW_CHILD); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define ii_read_unlock(i) au_rw_read_unlock(&au_ii(i)->ii_rwsem) -+#define ii_write_unlock(i) au_rw_write_unlock(&au_ii(i)->ii_rwsem) -+#define ii_downgrade_lock(i) au_rw_dgrade_lock(&au_ii(i)->ii_rwsem) -+ -+#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) -+#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) -+#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void au_icntnr_init(struct au_icntnr *c) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ c->vfs_inode.i_mode = 0; -+#endif -+} -+ -+static inline unsigned int au_iigen(struct inode *inode, unsigned int *igflags) -+{ -+ unsigned int gen; -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ if (igflags) -+ *igflags = iigen->ig_flags; -+ gen = iigen->ig_generation; -+ spin_unlock(&iigen->ig_spin); -+ -+ return gen; -+} -+ -+/* tiny test for inode number */ -+/* tmpfs generation is too rough */ -+static inline int au_test_higen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = au_ii(inode); -+ AuRwMustAnyLock(&iinfo->ii_rwsem); -+ return !(iinfo->ii_hsb1 == h_inode->i_sb -+ && iinfo->ii_higen == h_inode->i_generation); -+} -+ -+static inline void au_iigen_dec(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct au_iigen *iigen; -+ -+ iinfo = au_ii(inode); -+ iigen = &iinfo->ii_generation; -+ spin_lock(&iigen->ig_spin); -+ iigen->ig_generation--; -+ spin_unlock(&iigen->ig_spin); -+} -+ -+static inline int au_iigen_test(struct inode *inode, unsigned int sigen) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(inode && au_iigen(inode, NULL) != sigen)) -+ err = -EIO; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_hinode *au_hinode(struct au_iinfo *iinfo, -+ aufs_bindex_t bindex) -+{ -+ return iinfo->ii_hinode + bindex; -+} -+ -+static inline int au_is_bad_inode(struct inode *inode) -+{ -+ return !!(is_bad_inode(inode) || !au_hinode(au_ii(inode), 0)); -+} -+ -+static inline aufs_bindex_t au_ii_br_id(struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_id; -+} -+ -+static inline aufs_bindex_t au_ibtop(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_btop; -+} -+ -+static inline aufs_bindex_t au_ibbot(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_bbot; -+} -+ -+static inline struct au_vdir *au_ivdir(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_vdir; -+} -+ -+static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex)->hi_whdentry; -+} -+ -+static inline void au_set_ibtop(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_btop = bindex; -+} -+ -+static inline void au_set_ibbot(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_bbot = bindex; -+} -+ -+static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_vdir = vdir; -+} -+ -+static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_hinode(au_ii(inode), bindex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_pinned_parent(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->parent; -+ return NULL; -+} -+ -+static inline struct inode *au_pinned_h_dir(struct au_pin *pin) -+{ -+ if (pin && pin->hdir) -+ return pin->hdir->hi_inode; -+ return NULL; -+} -+ -+static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->hdir; -+ return NULL; -+} -+ -+static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) -+{ -+ if (pin) -+ pin->dentry = dentry; -+} -+ -+static inline void au_pin_set_parent_lflag(struct au_pin *pin, -+ unsigned char lflag) -+{ -+ if (pin) { -+ if (lflag) -+ au_fset_pin(pin->flags, DI_LOCKED); -+ else -+ au_fclr_pin(pin->flags, DI_LOCKED); -+ } -+} -+ -+#if 0 /* reserved */ -+static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) -+{ -+ if (pin) { -+ dput(pin->parent); -+ pin->parent = dget(parent); -+ } -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_branch; -+#ifdef CONFIG_AUFS_HNOTIFY -+struct au_hnotify_op { -+ void (*ctl)(struct au_hinode *hinode, int do_set); -+ int (*alloc)(struct au_hinode *hinode); -+ -+ /* -+ * if it returns true, the caller should free hinode->hi_notify, -+ * otherwise ->free() frees it. -+ */ -+ int (*free)(struct au_hinode *hinode, -+ struct au_hnotify *hn) __must_check; -+ -+ void (*fin)(void); -+ int (*init)(void); -+ -+ int (*reset_br)(unsigned int udba, struct au_branch *br, int perm); -+ void (*fin_br)(struct au_branch *br); -+ int (*init_br)(struct au_branch *br, int perm); -+}; -+ -+/* hnotify.c */ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode); -+void au_hn_free(struct au_hinode *hinode); -+void au_hn_ctl(struct au_hinode *hinode, int do_set); -+void au_hn_reset(struct inode *inode, unsigned int flags); -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ const struct qstr *h_child_qstr, struct inode *h_child_inode); -+int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm); -+int au_hnotify_init_br(struct au_branch *br, int perm); -+void au_hnotify_fin_br(struct au_branch *br); -+int __init au_hnotify_init(void); -+void au_hnotify_fin(void); -+ -+/* hfsnotify.c */ -+extern const struct au_hnotify_op au_hnotify_op; -+ -+static inline -+void au_hn_init(struct au_hinode *hinode) -+{ -+ hinode->hi_notify = NULL; -+} -+ -+static inline struct au_hnotify *au_hn(struct au_hinode *hinode) -+{ -+ return hinode->hi_notify; -+} -+ -+#else -+AuStub(int, au_hn_alloc, return -EOPNOTSUPP, -+ struct au_hinode *hinode __maybe_unused, -+ struct inode *inode __maybe_unused) -+AuStub(struct au_hnotify *, au_hn, return NULL, struct au_hinode *hinode) -+AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) -+AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, -+ int do_set __maybe_unused) -+AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, -+ unsigned int flags __maybe_unused) -+AuStubInt0(au_hnotify_reset_br, unsigned int udba __maybe_unused, -+ struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubInt0(au_hnotify_init_br, struct au_branch *br __maybe_unused, -+ int perm __maybe_unused) -+AuStubVoid(au_hnotify_fin_br, struct au_branch *br __maybe_unused) -+AuStubInt0(__init au_hnotify_init, void) -+AuStubVoid(au_hnotify_fin, void) -+AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+static inline void au_hn_suspend(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/0); -+} -+ -+static inline void au_hn_resume(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/1); -+} -+ -+static inline void au_hn_inode_lock(struct au_hinode *hdir) -+{ -+ inode_lock(hdir->hi_inode); -+ au_hn_suspend(hdir); -+} -+ -+static inline void au_hn_inode_lock_nested(struct au_hinode *hdir, -+ unsigned int sc __maybe_unused) -+{ -+ inode_lock_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+ -+#if 0 /* unused */ -+#include "vfsub.h" -+static inline void au_hn_inode_lock_shared_nested(struct au_hinode *hdir, -+ unsigned int sc) -+{ -+ inode_lock_shared_nested(hdir->hi_inode, sc); -+ au_hn_suspend(hdir); -+} -+#endif -+ -+static inline void au_hn_inode_unlock(struct au_hinode *hdir) -+{ -+ au_hn_resume(hdir); -+ inode_unlock(hdir->hi_inode); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_INODE_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/ioctl.c linux-5.15.37-aufs/fs/aufs/ioctl.c ---- linux-5.15.37/fs/aufs/ioctl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/ioctl.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,207 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * ioctl -+ * plink-management and readdir in userspace. -+ * assist the pathconf(3) wrapper library. -+ * move-down -+ * File-based Hierarchical Storage Management. -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static int au_wbr_fd(struct path *path, struct aufs_wbr_fd __user *arg) -+{ -+ int err, fd; -+ aufs_bindex_t wbi, bindex, bbot; -+ struct file *h_file; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_branch *br; -+ struct aufs_wbr_fd wbrfd = { -+ .oflags = au_dir_roflags, -+ .brid = -1 -+ }; -+ const int valid = O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY -+ | O_NOATIME | O_CLOEXEC; -+ -+ AuDebugOn(wbrfd.oflags & ~valid); -+ -+ if (arg) { -+ err = copy_from_user(&wbrfd, arg, sizeof(wbrfd)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ -+ err = -EINVAL; -+ AuDbg("wbrfd{0%o, %d}\n", wbrfd.oflags, wbrfd.brid); -+ wbrfd.oflags |= au_dir_roflags; -+ AuDbg("0%o\n", wbrfd.oflags); -+ if (unlikely(wbrfd.oflags & ~valid)) -+ goto out; -+ } -+ -+ fd = get_unused_fd_flags(0); -+ err = fd; -+ if (unlikely(fd < 0)) -+ goto out; -+ -+ h_file = ERR_PTR(-EINVAL); -+ wbi = 0; -+ br = NULL; -+ sb = path->dentry->d_sb; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_IR); -+ bbot = au_sbbot(sb); -+ if (wbrfd.brid >= 0) { -+ wbi = au_br_index(sb, wbrfd.brid); -+ if (unlikely(wbi < 0 || wbi > bbot)) -+ goto out_unlock; -+ } -+ -+ h_file = ERR_PTR(-ENOENT); -+ br = au_sbr(sb, wbi); -+ if (!au_br_writable(br->br_perm)) { -+ if (arg) -+ goto out_unlock; -+ -+ bindex = wbi + 1; -+ wbi = -1; -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm)) { -+ wbi = bindex; -+ br = au_sbr(sb, wbi); -+ break; -+ } -+ } -+ } -+ AuDbg("wbi %d\n", wbi); -+ if (wbi >= 0) -+ h_file = au_h_open(root, wbi, wbrfd.oflags, NULL, -+ /*force_wr*/0); -+ -+out_unlock: -+ aufs_read_unlock(root, AuLock_IR); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_fd; -+ -+ au_lcnt_dec(&br->br_nfiles); /* cf. au_h_open() */ -+ fd_install(fd, h_file); -+ err = fd; -+ goto out; /* success */ -+ -+out_fd: -+ put_unused_fd(fd); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ struct dentry *dentry; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_FHSM_FD: -+ dentry = file->f_path.dentry; -+ if (IS_ROOT(dentry)) -+ err = au_fhsm_fd(dentry->d_sb, arg); -+ else -+ err = -ENOTTY; -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_MVDOWN: -+ err = au_mvdown(file->f_path.dentry, (void __user *)arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path, (void __user *)arg); -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_compat_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_IBUSY: -+ err = au_ibusy_compat_ioctl(file, arg); -+ break; -+ -+ case AUFS_CTL_BRINFO: -+ err = au_brinfo_compat_ioctl(file, arg); -+ break; -+ -+ default: -+ err = aufs_ioctl_dir(file, cmd, arg); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); -+} -+#endif -diff -Nurp linux-5.15.37/fs/aufs/i_op_add.c linux-5.15.37-aufs/fs/aufs/i_op_add.c ---- linux-5.15.37/fs/aufs/i_op_add.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/i_op_add.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,928 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (add entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * final procedure of adding a new entry, except link(2). -+ * remove whiteout, instantiate, copyup the parent dir's times and size -+ * and update version. -+ * if it failed, re-create the removed whiteout. -+ */ -+static int epilog(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct dentry *dentry) -+{ -+ int err, rerr; -+ aufs_bindex_t bwh; -+ struct path h_path; -+ struct super_block *sb; -+ struct inode *inode, *h_dir; -+ struct dentry *wh; -+ -+ bwh = -1; -+ sb = dir->i_sb; -+ if (wh_dentry) { -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ IMustLock(h_dir); -+ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); -+ bwh = au_dbwh(dentry); -+ h_path.dentry = wh_dentry; -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (!IS_ERR(inode)) { -+ d_instantiate(dentry, inode); -+ dir = d_inode(dentry->d_parent); /* dir inode is locked */ -+ IMustLock(dir); -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ return 0; /* success */ -+ } -+ -+ err = PTR_ERR(inode); -+ if (!wh_dentry) -+ goto out; -+ -+ /* revert */ -+ /* dir inode is locked */ -+ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); -+ rerr = PTR_ERR(wh); -+ if (IS_ERR(wh)) { -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } else -+ dput(wh); -+ -+out: -+ return err; -+} -+ -+static int au_d_may_add(struct dentry *dentry) -+{ -+ int err; -+ -+ err = 0; -+ if (unlikely(d_unhashed(dentry))) -+ err = -ENOENT; -+ if (unlikely(d_really_is_positive(dentry))) -+ err = -EEXIST; -+ return err; -+} -+ -+/* -+ * simple tests for the adding inode operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ err = -ENAMETOOLONG; -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (d_really_is_negative(dentry)) { -+ err = -EEXIST; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } -+ -+ err = 0; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ err = -EIO; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * initial procedure of adding a new entry. -+ * prepare writable branch and the parent dir, lock it, -+ * and lookup whiteout for the new entry. -+ */ -+static struct dentry* -+lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, -+ struct dentry *src_dentry, struct au_pin *pin, -+ struct au_wr_dir_args *wr_dir_args) -+{ -+ struct dentry *wh_dentry, *h_parent; -+ struct super_block *sb; -+ struct au_branch *br; -+ int err; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ AuDbg("%pd\n", dentry); -+ -+ err = au_wr_dir(dentry, src_dentry, wr_dir_args); -+ bcpup = err; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) -+ err = au_may_add(dentry, bcpup, h_parent, -+ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); -+ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ br = au_sbr(sb, bcpup); -+ if (dt) { -+ struct path tmp = { -+ .dentry = h_parent, -+ .mnt = au_br_mnt(br) -+ }; -+ au_dtime_store(dt, au_pinned_parent(pin), &tmp); -+ } -+ -+ wh_dentry = NULL; -+ if (bcpup != au_dbwh(dentry)) -+ goto out; /* success */ -+ -+ /* -+ * ENAMETOOLONG here means that if we allowed create such name, then it -+ * would not be able to removed in the future. So we don't allow such -+ * name here and we don't handle ENAMETOOLONG differently here. -+ */ -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ -+out_unpin: -+ if (IS_ERR(wh_dentry)) -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { Mknod, Symlink, Creat }; -+struct simple_arg { -+ int type; -+ union { -+ struct { -+ umode_t mode; -+ bool want_excl; -+ bool try_aopen; -+ struct vfsub_aopen_args *aopen; -+ } c; -+ struct { -+ const char *symname; -+ } s; -+ struct { -+ umode_t mode; -+ dev_t dev; -+ } m; -+ } u; -+}; -+ -+static int add_simple(struct inode *dir, struct dentry *dentry, -+ struct simple_arg *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t btop; -+ unsigned char created; -+ const unsigned char try_aopen -+ = (arg->type == Creat && arg->u.c.try_aopen); -+ struct vfsub_aopen_args *aopen = arg->u.c.aopen; -+ struct dentry *wh_dentry, *parent; -+ struct inode *h_dir; -+ struct super_block *sb; -+ struct au_branch *br; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ struct au_wr_dir_args wr_dir_args; -+ } *a; -+ -+ AuDbg("%pd\n", dentry); -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ a->wr_dir_args.force_btgt = -1; -+ a->wr_dir_args.flags = AuWrDir_ADD_ENTRY; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ if (!try_aopen) { -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ } -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ if (!try_aopen) -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &a->wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ sb = dentry->d_sb; -+ br = au_sbr(sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_path.mnt = au_br_mnt(br); -+ h_dir = au_pinned_h_dir(&a->pin); -+ switch (arg->type) { -+ case Creat: -+ if (!try_aopen || !h_dir->i_op->atomic_open) { -+ err = vfsub_create(h_dir, &a->h_path, arg->u.c.mode, -+ arg->u.c.want_excl); -+ created = !err; -+ if (!err && try_aopen) -+ aopen->file->f_mode |= FMODE_CREATED; -+ } else { -+ aopen->br = br; -+ err = vfsub_atomic_open(h_dir, a->h_path.dentry, aopen); -+ AuDbg("err %d\n", err); -+ AuDbgFile(aopen->file); -+ created = err >= 0 -+ && !!(aopen->file->f_mode & FMODE_CREATED); -+ } -+ break; -+ case Symlink: -+ err = vfsub_symlink(h_dir, &a->h_path, arg->u.s.symname); -+ created = !err; -+ break; -+ case Mknod: -+ err = vfsub_mknod(h_dir, &a->h_path, arg->u.m.mode, -+ arg->u.m.dev); -+ created = !err; -+ break; -+ default: -+ BUG(); -+ } -+ if (unlikely(err < 0)) -+ goto out_unpin; -+ -+ err = epilog(dir, btop, wh_dentry, dentry); -+ if (!err) -+ goto out_unpin; /* success */ -+ -+ /* revert */ -+ if (created /* && d_is_positive(a->h_path.dentry) */) { -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL, -+ /*force*/0); -+ if (rerr) { -+ AuIOErr("%pd revert failure(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+ } -+ if (try_aopen && h_dir->i_op->atomic_open -+ && (aopen->file->f_mode & FMODE_OPENED)) -+ /* aopen->file is still opened */ -+ au_lcnt_dec(&aopen->br->br_nfiles); -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ if (!try_aopen) -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ if (!try_aopen) -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_mknod(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, dev_t dev) -+{ -+ struct simple_arg arg = { -+ .type = Mknod, -+ .u.m = { -+ .mode = mode, -+ .dev = dev -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_symlink(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, const char *symname) -+{ -+ struct simple_arg arg = { -+ .type = Symlink, -+ .u.s.symname = symname -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_create(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode, bool want_excl) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = mode, -+ .want_excl = want_excl -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int au_aopen_or_create(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *aopen_args) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = aopen_args->create_mode, -+ .want_excl = aopen_args->open_flag & O_EXCL, -+ .try_aopen = true, -+ .aopen = aopen_args -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_tmpfile(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent, *h_dentry; -+ struct inode *h_dir, *inode; -+ struct vfsmount *h_mnt; -+ struct user_namespace *h_userns; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_TMPFILE -+ }; -+ -+ /* copy-up may happen */ -+ inode_lock(dir); -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ -+ err = -EBUSY; -+ parent = d_find_any_alias(dir); -+ AuDebugOn(!parent); -+ di_write_lock_parent(parent); -+ if (unlikely(d_inode(parent) != dir)) -+ goto out_parent; -+ -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ bindex = au_dbtop(parent); -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ bindex = err; -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ err = -EOPNOTSUPP; -+ h_dir = au_h_iptr(dir, bindex); -+ if (unlikely(!h_dir->i_op->tmpfile)) -+ goto out_parent; -+ -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ h_userns = mnt_user_ns(h_mnt); -+ h_parent = au_h_dptr(parent, bindex); -+ h_dentry = vfs_tmpfile(h_userns, h_parent, mode, /*open_flag*/0); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_mnt; -+ } -+ -+ au_set_dbtop(dentry, bindex); -+ au_set_dbbot(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, dget(h_dentry)); -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (IS_ERR(inode)) { -+ err = PTR_ERR(inode); -+ au_set_h_dptr(dentry, bindex, NULL); -+ au_set_dbtop(dentry, -1); -+ au_set_dbbot(dentry, -1); -+ } else { -+ if (!inode->i_nlink) -+ set_nlink(inode, 1); -+ d_tmpfile(dentry, inode); -+ au_di(dentry)->di_tmpfile = 1; -+ -+ /* update without i_mutex */ -+ if (au_ibtop(dir) == au_dbtop(dentry)) -+ au_cpup_attr_timesizes(dir); -+ } -+ dput(h_dentry); -+ -+out_mnt: -+ vfsub_mnt_drop_write(h_mnt); -+out_parent: -+ di_write_unlock(parent); -+ dput(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err)) { -+ au_di_fin(dentry); -+ dentry->d_fsdata = NULL; -+ } -+out_si: -+ si_read_unlock(sb); -+out: -+ inode_unlock(dir); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_link_args { -+ aufs_bindex_t bdst, bsrc; -+ struct au_pin pin; -+ struct path h_path; -+ struct dentry *src_parent, *parent; -+}; -+ -+static int au_cpup_before_link(struct dentry *src_dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ struct dentry *h_src_dentry; -+ struct au_cp_generic cpg = { -+ .dentry = src_dentry, -+ .bdst = a->bdst, -+ .bsrc = a->bsrc, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN /* | AuCpup_KEEPLINO */ -+ }; -+ -+ di_read_lock_parent(a->src_parent, AuLock_IR); -+ err = au_test_and_cpup_dirs(src_dentry, a->bdst); -+ if (unlikely(err)) -+ goto out; -+ -+ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); -+ err = au_pin(&a->pin, src_dentry, a->bdst, -+ au_opt_udba(src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&a->pin); -+ -+out: -+ di_read_unlock(a->src_parent, AuLock_IR); -+ return err; -+} -+ -+static int au_cpup_or_link(struct dentry *src_dentry, struct dentry *dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ unsigned char plink; -+ aufs_bindex_t bbot; -+ struct dentry *h_src_dentry; -+ struct inode *h_inode, *inode, *delegated; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ plink = 0; -+ h_inode = NULL; -+ sb = src_dentry->d_sb; -+ inode = d_inode(src_dentry); -+ if (au_ibtop(inode) <= a->bdst) -+ h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { -+ /* copyup src_dentry as the name of dentry. */ -+ bbot = au_dbbot(dentry); -+ if (bbot < a->bsrc) -+ au_set_dbbot(dentry, a->bsrc); -+ au_set_h_dptr(dentry, a->bsrc, -+ dget(au_h_dptr(src_dentry, a->bsrc))); -+ dget(a->h_path.dentry); -+ au_set_h_dptr(dentry, a->bdst, NULL); -+ AuDbg("temporary d_inode...\n"); -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = d_inode(src_dentry); /* tmp */ -+ spin_unlock(&dentry->d_lock); -+ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->bdst, -+ .bsrc = -1, -+ .len = -1, -+ .pin = &a->pin, -+ .flags = AuCpup_KEEPLINO -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_h_open_post(dentry, a->bsrc, h_file); -+ if (!err) { -+ dput(a->h_path.dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ } else -+ au_set_h_dptr(dentry, a->bdst, -+ a->h_path.dentry); -+ } -+ spin_lock(&dentry->d_lock); -+ dentry->d_inode = NULL; /* restore */ -+ spin_unlock(&dentry->d_lock); -+ AuDbg("temporary d_inode...done\n"); -+ au_set_h_dptr(dentry, a->bsrc, NULL); -+ au_set_dbbot(dentry, bbot); -+ } else { -+ /* the inode of src_dentry already exists on a.bdst branch */ -+ h_src_dentry = d_find_alias(h_inode); -+ if (!h_src_dentry && au_plink_test(inode)) { -+ plink = 1; -+ h_src_dentry = au_plink_lkup(inode, a->bdst); -+ err = PTR_ERR(h_src_dentry); -+ if (IS_ERR(h_src_dentry)) -+ goto out; -+ -+ if (unlikely(d_is_negative(h_src_dentry))) { -+ dput(h_src_dentry); -+ h_src_dentry = NULL; -+ } -+ -+ } -+ if (h_src_dentry) { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ dput(h_src_dentry); -+ } else { -+ AuIOErr("no dentry found for hi%lu on b%d\n", -+ h_inode->i_ino, a->bdst); -+ err = -EIO; -+ } -+ } -+ -+ if (!err && !plink) -+ au_plink_append(inode, a->bdst, a->h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry) -+{ -+ int err, rerr; -+ struct au_dtime dt; -+ struct au_link_args *a; -+ struct dentry *wh_dentry, *h_src_dentry; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ IMustLock(dir); -+ inode = d_inode(src_dentry); -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->parent = dentry->d_parent; /* dir inode is locked */ -+ err = aufs_read_and_write_lock2(dentry, src_dentry, -+ AuLock_NOPLM | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_kfree; -+ err = au_d_linkable(src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ a->src_parent = dget_parent(src_dentry); -+ wr_dir_args.force_btgt = au_ibtop(inode); -+ -+ di_write_lock_parent(a->parent); -+ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, -+ &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ a->bdst = au_dbtop(dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); -+ a->bsrc = au_ibtop(inode); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ if (!h_src_dentry && au_di(src_dentry)->di_tmpfile) -+ h_src_dentry = dget(au_hi_wh(inode, a->bsrc)); -+ if (!h_src_dentry) { -+ a->bsrc = au_dbtop(src_dentry); -+ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); -+ AuDebugOn(!h_src_dentry); -+ } else if (IS_ERR(h_src_dentry)) { -+ err = PTR_ERR(h_src_dentry); -+ goto out_parent; -+ } -+ -+ /* -+ * aufs doesn't touch the credential so -+ * security_dentry_create_files_as() is unnecessary. -+ */ -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) -+ err = au_cpup_or_link(src_dentry, dentry, a); -+ else { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ dput(h_src_dentry); -+ } else { -+ /* -+ * copyup src_dentry to the branch we process, -+ * and then link(2) to it. -+ */ -+ dput(h_src_dentry); -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { -+ au_unpin(&a->pin); -+ di_write_unlock(a->parent); -+ err = au_cpup_before_link(src_dentry, a); -+ di_write_lock_parent(a->parent); -+ if (!err) -+ err = au_pin(&a->pin, dentry, a->bdst, -+ au_opt_udba(sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_wh; -+ } -+ if (!err) { -+ h_src_dentry = au_h_dptr(src_dentry, a->bdst); -+ err = -ENOENT; -+ if (h_src_dentry && d_is_positive(h_src_dentry)) { -+ delegated = NULL; -+ err = vfsub_link(h_src_dentry, -+ au_pinned_h_dir(&a->pin), -+ &a->h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry" -+ " for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ } -+ } -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ if (wh_dentry) { -+ a->h_path.dentry = wh_dentry; -+ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out_revert; -+ } -+ -+ au_dir_ts(dir, a->bdst); -+ inode_inc_iversion(dir); -+ inc_nlink(inode); -+ inode->i_ctime = dir->i_ctime; -+ d_instantiate(dentry, au_igrab(inode)); -+ if (d_unhashed(a->h_path.dentry)) -+ /* some filesystem calls d_drop() */ -+ d_drop(dentry); -+ /* some filesystems consume an inode even hardlink */ -+ au_fhsm_wrote(sb, a->bdst, /*force*/0); -+ goto out_unpin; /* success */ -+ -+out_revert: -+ /* no delegation since it is just created */ -+ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, -+ /*delegated*/NULL, /*force*/0); -+ if (unlikely(rerr)) { -+ AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+out_unpin: -+ au_unpin(&a->pin); -+out_wh: -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(a->parent); -+ dput(a->src_parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_and_write_unlock2(dentry, src_dentry); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int aufs_mkdir(struct user_namespace *userns, struct inode *dir, -+ struct dentry *dentry, umode_t mode) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ unsigned char diropq; -+ struct path h_path; -+ struct dentry *wh_dentry, *parent, *opq_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct { -+ struct au_pin pin; -+ struct au_dtime dt; -+ } *a; /* reduce the stack usage */ -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR -+ }; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_may_add(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ sb = dentry->d_sb; -+ bindex = au_dbtop(dentry); -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ /* make the dir opaque */ -+ diropq = 0; -+ h_inode = d_inode(h_path.dentry); -+ if (wh_dentry -+ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ opq_dentry = au_diropq_create(dentry, bindex); -+ inode_unlock(h_inode); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out_dir; -+ dput(opq_dentry); -+ diropq = 1; -+ } -+ -+ err = epilog(dir, bindex, wh_dentry, dentry); -+ if (!err) { -+ inc_nlink(dir); -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (diropq) { -+ AuLabel(revert opq); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bindex); -+ inode_unlock(h_inode); -+ if (rerr) { -+ AuIOErr("%pd reverting diropq failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ } -+ -+out_dir: -+ AuLabel(revert dir); -+ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); -+ if (rerr) { -+ AuIOErr("%pd reverting dir failed(%d, %d)\n", -+ dentry, err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&a->dt); -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ if (unlikely(err)) { -+ au_update_dbtop(dentry); -+ d_drop(dentry); -+ } -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/i_op.c linux-5.15.37-aufs/fs/aufs/i_op.c ---- linux-5.15.37/fs/aufs/i_op.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/i_op.c 2022-04-08 20:22:30.613616524 +0300 -@@ -0,0 +1,1499 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (except add/del/rename) -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int h_permission(struct inode *h_inode, int mask, -+ struct path *h_path, int brperm) -+{ -+ int err; -+ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct user_namespace *h_userns; -+ -+ err = -EPERM; -+ if (write_mask && IS_IMMUTABLE(h_inode)) -+ goto out; -+ -+ err = -EACCES; -+ if (((mask & MAY_EXEC) -+ && S_ISREG(h_inode->i_mode) -+ && (path_noexec(h_path) -+ || !(h_inode->i_mode & 0111)))) -+ goto out; -+ -+ /* -+ * - skip the lower fs test in the case of write to ro branch. -+ * - nfs dir permission write check is optimized, but a policy for -+ * link/rename requires a real check. -+ * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' -+ * in this case, generic_permission() returns -EOPNOTSUPP. -+ */ -+ h_userns = mnt_user_ns(h_path->mnt); -+ if ((write_mask && !au_br_writable(brperm)) -+ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) -+ && write_mask && !(mask & MAY_READ)) -+ || !h_inode->i_op->permission) { -+ /* AuLabel(generic_permission); */ -+ /* AuDbg("get_acl %ps\n", h_inode->i_op->get_acl); */ -+ err = generic_permission(h_userns, h_inode, mask); -+ if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) -+ err = h_inode->i_op->permission(h_userns, h_inode, -+ mask); -+ AuTraceErr(err); -+ } else { -+ /* AuLabel(h_inode->permission); */ -+ err = h_inode->i_op->permission(h_userns, h_inode, mask); -+ AuTraceErr(err); -+ } -+ -+ if (!err) -+ err = devcgroup_inode_permission(h_inode, mask); -+ if (!err) -+ err = security_inode_permission(h_inode, mask); -+ -+out: -+ return err; -+} -+ -+static int aufs_permission(struct user_namespace *userns, struct inode *inode, -+ int mask) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ const unsigned char isdir = !!S_ISDIR(inode->i_mode), -+ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ -+ /* todo: support rcu-walk? */ -+ if (mask & MAY_NOT_BLOCK) -+ return -ECHILD; -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_read_lock_child(inode); -+#if 0 /* reserved for future use */ -+ /* -+ * This test may be rather 'too much' since the test is essentially done -+ * in the aufs_lookup(). Theoretically it is possible that the inode -+ * generation doesn't match to the superblock's here. But it isn't a -+ * big deal I suppose. -+ */ -+ err = au_iigen_test(inode, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+#endif -+ -+ if (!isdir -+ || write_mask -+ || au_opt_test(au_mntflags(sb), DIRPERM1)) { -+ err = au_busy_or_stale(); -+ h_inode = au_h_iptr(inode, au_ibtop(inode)); -+ if (unlikely(!h_inode -+ || (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT))) -+ goto out; -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, br->br_perm); -+ if (write_mask -+ && !err -+ && !special_file(h_inode->i_mode)) { -+ /* test whether the upper writable branch exists */ -+ err = -EROFS; -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = 0; -+ break; -+ } -+ } -+ goto out; -+ } -+ -+ /* non-write to dir */ -+ err = 0; -+ bbot = au_ibbot(inode); -+ for (bindex = au_ibtop(inode); !err && bindex <= bbot; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) { -+ err = au_busy_or_stale(); -+ if (unlikely(!S_ISDIR(h_inode->i_mode))) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, &br->br_path, -+ br->br_perm); -+ } -+ } -+ -+out: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, -+ unsigned int flags) -+{ -+ struct dentry *ret, *parent; -+ struct inode *inode; -+ struct super_block *sb; -+ int err, npositive; -+ -+ IMustLock(dir); -+ -+ /* todo: support rcu-walk? */ -+ ret = ERR_PTR(-ECHILD); -+ if (flags & LOOKUP_RCU) -+ goto out; -+ -+ ret = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ sb = dir->i_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_di_init(dentry); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_si; -+ -+ inode = NULL; -+ npositive = 0; /* suppress a warning */ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_alive_dir(parent); -+ if (!err) -+ err = au_digen_test(parent, au_sigen(sb)); -+ if (!err) { -+ /* regardless LOOKUP_CREATE, always ALLOW_NEG */ -+ npositive = au_lkup_dentry(dentry, au_dbtop(parent), -+ AuLkup_ALLOW_NEG); -+ err = npositive; -+ } -+ di_read_unlock(parent, AuLock_IR); -+ ret = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out_unlock; -+ -+ if (npositive) { -+ inode = au_new_inode(dentry, /*must_new*/0); -+ if (IS_ERR(inode)) { -+ ret = (void *)inode; -+ inode = NULL; -+ goto out_unlock; -+ } -+ } -+ -+ if (inode) -+ atomic_inc(&inode->i_count); -+ ret = d_splice_alias(inode, dentry); -+#if 0 /* reserved for future use */ -+ if (unlikely(d_need_lookup(dentry))) { -+ spin_lock(&dentry->d_lock); -+ dentry->d_flags &= ~DCACHE_NEED_LOOKUP; -+ spin_unlock(&dentry->d_lock); -+ } else -+#endif -+ if (inode) { -+ if (!IS_ERR(ret)) { -+ iput(inode); -+ if (ret && ret != dentry) -+ ii_write_unlock(inode); -+ } else { -+ ii_write_unlock(inode); -+ iput(inode); -+ inode = NULL; -+ } -+ } -+ -+out_unlock: -+ di_write_unlock(dentry); -+out_si: -+ si_read_unlock(sb); -+out: -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * very dirty and complicated aufs ->atomic_open(). -+ * aufs_atomic_open() -+ * + au_aopen_or_create() -+ * + add_simple() -+ * + vfsub_atomic_open() -+ * + branch fs ->atomic_open() -+ * may call the actual 'open' for h_file -+ * + inc br_nfiles only if opened -+ * + au_aopen_no_open() or au_aopen_do_open() -+ * -+ * au_aopen_do_open() -+ * + finish_open() -+ * + au_do_aopen() -+ * + au_do_open() the body of all 'open' -+ * + au_do_open_nondir() -+ * set the passed h_file -+ * -+ * au_aopen_no_open() -+ * + finish_no_open() -+ */ -+ -+struct aopen_node { -+ struct hlist_bl_node hblist; -+ struct file *file, *h_file; -+}; -+ -+static int au_do_aopen(struct inode *inode, struct file *file) -+{ -+ struct hlist_bl_head *aopen; -+ struct hlist_bl_node *pos; -+ struct aopen_node *node; -+ struct au_do_open_args args = { -+ .aopen = 1, -+ .open = au_do_open_nondir -+ }; -+ -+ aopen = &au_sbi(inode->i_sb)->si_aopen; -+ hlist_bl_lock(aopen); -+ hlist_bl_for_each_entry(node, pos, aopen, hblist) -+ if (node->file == file) { -+ args.h_file = node->h_file; -+ break; -+ } -+ hlist_bl_unlock(aopen); -+ /* AuDebugOn(!args.h_file); */ -+ -+ return au_do_open(file, &args); -+} -+ -+static int au_aopen_do_open(struct file *file, struct dentry *dentry, -+ struct aopen_node *aopen_node) -+{ -+ int err; -+ struct hlist_bl_head *aopen; -+ -+ AuLabel(here); -+ aopen = &au_sbi(dentry->d_sb)->si_aopen; -+ au_hbl_add(&aopen_node->hblist, aopen); -+ err = finish_open(file, dentry, au_do_aopen); -+ au_hbl_del(&aopen_node->hblist, aopen); -+ /* AuDbgFile(file); */ -+ AuDbg("%pd%s%s\n", dentry, -+ (file->f_mode & FMODE_CREATED) ? " created" : "", -+ (file->f_mode & FMODE_OPENED) ? " opened" : ""); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_aopen_no_open(struct file *file, struct dentry *dentry) -+{ -+ int err; -+ -+ AuLabel(here); -+ dget(dentry); -+ err = finish_no_open(file, dentry); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int aufs_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct file *file, unsigned int open_flag, -+ umode_t create_mode) -+{ -+ int err, did_open; -+ unsigned int lkup_flags; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct dentry *parent, *d; -+ struct vfsub_aopen_args args = { -+ .open_flag = open_flag, -+ .create_mode = create_mode -+ }; -+ struct aopen_node aopen_node = { -+ .file = file -+ }; -+ -+ IMustLock(dir); -+ AuDbg("open_flag 0%o\n", open_flag); -+ AuDbgDentry(dentry); -+ -+ err = 0; -+ if (!au_di(dentry)) { -+ lkup_flags = LOOKUP_OPEN; -+ if (open_flag & O_CREAT) -+ lkup_flags |= LOOKUP_CREATE; -+ d = aufs_lookup(dir, dentry, lkup_flags); -+ if (IS_ERR(d)) { -+ err = PTR_ERR(d); -+ AuTraceErr(err); -+ goto out; -+ } else if (d) { -+ /* -+ * obsoleted dentry found. -+ * another error will be returned later. -+ */ -+ d_drop(d); -+ AuDbgDentry(d); -+ dput(d); -+ } -+ AuDbgDentry(dentry); -+ } -+ -+ if (d_is_positive(dentry) -+ || d_unhashed(dentry) -+ || d_unlinked(dentry) -+ || !(open_flag & O_CREAT)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out; /* success */ -+ } -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = dentry->d_parent; /* dir is locked */ -+ di_write_lock_parent(parent); -+ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ -+ AuDbgDentry(dentry); -+ if (d_is_positive(dentry)) { -+ err = au_aopen_no_open(file, dentry); -+ goto out_parent; /* success */ -+ } -+ -+ args.file = alloc_empty_file(file->f_flags, current_cred()); -+ err = PTR_ERR(args.file); -+ if (IS_ERR(args.file)) -+ goto out_parent; -+ -+ bindex = au_dbtop(dentry); -+ err = au_aopen_or_create(dir, dentry, &args); -+ AuTraceErr(err); -+ AuDbgFile(args.file); -+ file->f_mode = args.file->f_mode & ~FMODE_OPENED; -+ did_open = !!(args.file->f_mode & FMODE_OPENED); -+ if (!did_open) { -+ fput(args.file); -+ args.file = NULL; -+ } -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ goto out_sb; -+ } -+ -+ if (!did_open) -+ err = au_aopen_no_open(file, dentry); -+ else { -+ aopen_node.h_file = args.file; -+ err = au_aopen_do_open(file, dentry, &aopen_node); -+ } -+ if (unlikely(err < 0)) { -+ if (args.file) -+ fput(args.file); -+ if (did_open) -+ au_lcnt_dec(&args.br->br_nfiles); -+ } -+ goto out_sb; /* success */ -+ -+out_parent: -+ di_write_unlock(parent); -+ di_write_unlock(dentry); -+out_sb: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ AuDbgFile(file); -+ return err; -+} -+ -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, -+ const unsigned char add_entry, aufs_bindex_t bcpup, -+ aufs_bindex_t btop) -+{ -+ int err; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ -+ if (add_entry) -+ IMustLock(d_inode(parent)); -+ else -+ di_write_lock_parent(parent); -+ -+ err = 0; -+ if (!au_h_dptr(parent, bcpup)) { -+ if (btop > bcpup) -+ err = au_cpup_dirs(dentry, bcpup); -+ else if (btop < bcpup) -+ err = au_cpdown_dirs(dentry, bcpup); -+ else -+ BUG(); -+ } -+ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) { -+ h_parent = au_h_dptr(parent, bcpup); -+ h_dir = d_inode(h_parent); -+ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); -+ err = au_lkup_neg(dentry, bcpup, /*wh*/0); -+ /* todo: no unlock here */ -+ inode_unlock_shared(h_dir); -+ -+ AuDbg("bcpup %d\n", bcpup); -+ if (!err) { -+ if (d_really_is_negative(dentry)) -+ au_set_h_dptr(dentry, btop, NULL); -+ au_update_dbrange(dentry, /*do_put_zero*/0); -+ } -+ } -+ -+ if (!add_entry) -+ di_write_unlock(parent); -+ if (!err) -+ err = bcpup; /* success */ -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * decide the branch and the parent dir where we will create a new entry. -+ * returns new bindex or an error. -+ * copyup the parent dir if needed. -+ */ -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bcpup, btop, src_btop; -+ const unsigned char add_entry -+ = au_ftest_wrdir(args->flags, ADD_ENTRY) -+ | au_ftest_wrdir(args->flags, TMPFILE); -+ struct super_block *sb; -+ struct dentry *parent; -+ struct au_sbinfo *sbinfo; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ parent = dget_parent(dentry); -+ btop = au_dbtop(dentry); -+ bcpup = btop; -+ if (args->force_btgt < 0) { -+ if (src_dentry) { -+ src_btop = au_dbtop(src_dentry); -+ if (src_btop < btop) -+ bcpup = src_btop; -+ } else if (add_entry) { -+ flags = 0; -+ if (au_ftest_wrdir(args->flags, ISDIR)) -+ au_fset_wbr(flags, DIR); -+ err = AuWbrCreate(sbinfo, dentry, flags); -+ bcpup = err; -+ } -+ -+ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) { -+ if (add_entry) -+ err = AuWbrCopyup(sbinfo, dentry); -+ else { -+ if (!IS_ROOT(dentry)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(sbinfo, dentry); -+ di_read_unlock(parent, !AuLock_IR); -+ } else -+ err = AuWbrCopyup(sbinfo, dentry); -+ } -+ bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else { -+ bcpup = args->force_btgt; -+ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry))); -+ } -+ -+ AuDbg("btop %d, bcpup %d\n", btop, bcpup); -+ err = bcpup; -+ if (bcpup == btop) -+ goto out; /* success */ -+ -+ /* copyup the new parent into the branch we process */ -+ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, btop); -+ if (err >= 0) { -+ if (d_really_is_negative(dentry)) { -+ au_set_h_dptr(dentry, btop, NULL); -+ au_set_dbtop(dentry, bcpup); -+ au_set_dbbot(dentry, bcpup); -+ } -+ AuDebugOn(add_entry -+ && !au_ftest_wrdir(args->flags, TMPFILE) -+ && !au_h_dptr(dentry, bcpup)); -+ } -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_pin_hdir_unlock(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_hn_inode_unlock(p->hdir); -+} -+ -+int au_pin_hdir_lock(struct au_pin *p) -+{ -+ int err; -+ -+ err = 0; -+ if (!p->hdir) -+ goto out; -+ -+ /* even if an error happens later, keep this lock */ -+ au_hn_inode_lock_nested(p->hdir, p->lsc_hi); -+ -+ err = -EBUSY; -+ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent))) -+ goto out; -+ -+ err = 0; -+ if (p->h_dentry) -+ err = au_h_verify(p->h_dentry, p->udba, p->hdir->hi_inode, -+ p->h_parent, p->br); -+ -+out: -+ return err; -+} -+ -+int au_pin_hdir_relock(struct au_pin *p) -+{ -+ int err, i; -+ struct inode *h_i; -+ struct dentry *h_d[] = { -+ p->h_dentry, -+ p->h_parent -+ }; -+ -+ err = au_pin_hdir_lock(p); -+ if (unlikely(err)) -+ goto out; -+ -+ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) { -+ if (!h_d[i]) -+ continue; -+ if (d_is_positive(h_d[i])) { -+ h_i = d_inode(h_d[i]); -+ err = !h_i->i_nlink; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) -+{ -+ atomic_long_set(&p->hdir->hi_inode->i_rwsem.owner, (long)task); -+} -+ -+void au_pin_hdir_acquire_nest(struct au_pin *p) -+{ -+ if (p->hdir) { -+ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map, -+ p->lsc_hi, 0, NULL, _RET_IP_); -+ au_pin_hdir_set_owner(p, current); -+ } -+} -+ -+void au_pin_hdir_release(struct au_pin *p) -+{ -+ if (p->hdir) { -+ au_pin_hdir_set_owner(p, p->task); -+ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, _RET_IP_); -+ } -+} -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin) -+{ -+ if (pin && pin->parent) -+ return au_h_dptr(pin->parent, pin->bindex); -+ return NULL; -+} -+ -+void au_unpin(struct au_pin *p) -+{ -+ if (p->hdir) -+ au_pin_hdir_unlock(p); -+ if (p->h_mnt && au_ftest_pin(p->flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(p->h_mnt); -+ if (!p->hdir) -+ return; -+ -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ iput(p->hdir->hi_inode); -+ dput(p->parent); -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ /* do not clear p->task */ -+} -+ -+int au_do_pin(struct au_pin *p) -+{ -+ int err; -+ struct super_block *sb; -+ struct inode *h_dir; -+ -+ err = 0; -+ sb = p->dentry->d_sb; -+ p->br = au_sbr(sb, p->bindex); -+ if (IS_ROOT(p->dentry)) { -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_err; -+ } -+ } -+ goto out; -+ } -+ -+ p->h_dentry = NULL; -+ if (p->bindex <= au_dbbot(p->dentry)) -+ p->h_dentry = au_h_dptr(p->dentry, p->bindex); -+ -+ p->parent = dget_parent(p->dentry); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_lock(p->parent, AuLock_IR, p->lsc_di); -+ -+ h_dir = NULL; -+ p->h_parent = au_h_dptr(p->parent, p->bindex); -+ p->hdir = au_hi(d_inode(p->parent), p->bindex); -+ if (p->hdir) -+ h_dir = p->hdir->hi_inode; -+ -+ /* -+ * udba case, or -+ * if DI_LOCKED is not set, then p->parent may be different -+ * and h_parent can be NULL. -+ */ -+ if (unlikely(!p->hdir || !h_dir || !p->h_parent)) { -+ err = -EBUSY; -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = au_br_mnt(p->br); -+ err = vfsub_mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ } -+ -+ au_igrab(h_dir); -+ err = au_pin_hdir_lock(p); -+ if (!err) -+ goto out; /* success */ -+ -+ au_unpin(p); -+ -+out_err: -+ pr_err("err %d\n", err); -+ err = au_busy_or_stale(); -+out: -+ return err; -+} -+ -+void au_pin_init(struct au_pin *p, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags) -+{ -+ p->dentry = dentry; -+ p->udba = udba; -+ p->lsc_di = lsc_di; -+ p->lsc_hi = lsc_hi; -+ p->flags = flags; -+ p->bindex = bindex; -+ -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+ -+ p->h_dentry = NULL; -+ p->h_parent = NULL; -+ p->br = NULL; -+ p->task = current; -+} -+ -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) -+{ -+ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, -+ udba, flags); -+ return au_do_pin(pin); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * ->setattr() and ->getattr() are called in various cases. -+ * chmod, stat: dentry is revalidated. -+ * fchmod, fstat: file and dentry are not revalidated, additionally they may be -+ * unhashed. -+ * for ->setattr(), ia->ia_file is passed from ftruncate only. -+ */ -+/* todo: consolidate with do_refresh() and simple_reval_dpath() */ -+int au_reval_for_attr(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ if (au_digen_test(dentry, sigen)) { -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a) -+{ -+ int err; -+ loff_t sz; -+ aufs_bindex_t btop, ibtop; -+ struct dentry *hi_wh, *parent; -+ struct inode *inode; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = 0 -+ }; -+ -+ if (d_is_dir(dentry)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ /* plink or hi_wh() case */ -+ btop = au_dbtop(dentry); -+ inode = d_inode(dentry); -+ ibtop = au_ibtop(inode); -+ if (btop != ibtop && !au_test_ro(inode->i_sb, ibtop, inode)) -+ wr_dir_args.force_btgt = ibtop; -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ if (unlikely(err < 0)) -+ goto out; -+ a->btgt = err; -+ if (err != btop) -+ au_fset_icpup(a->flags, DID_CPUP); -+ -+ err = 0; -+ a->pin_flags = AuPin_MNT_WRITE; -+ parent = NULL; -+ if (!IS_ROOT(dentry)) { -+ au_fset_pin(a->pin_flags, DI_LOCKED); -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ } -+ -+ err = au_pin(&a->pin, dentry, a->btgt, a->udba, a->pin_flags); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ sz = -1; -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (ia && (ia->ia_valid & ATTR_SIZE)) { -+ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); -+ if (ia->ia_size < i_size_read(a->h_inode)) -+ sz = ia->ia_size; -+ inode_unlock_shared(a->h_inode); -+ } -+ -+ hi_wh = NULL; -+ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unlinked(dentry)) { -+ hi_wh = au_hi_wh(inode, a->btgt); -+ if (!hi_wh) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = -1, -+ .len = sz, -+ .pin = &a->pin -+ }; -+ err = au_sio_cpup_wh(&cpg, /*file*/NULL); -+ if (unlikely(err)) -+ goto out_unlock; -+ hi_wh = au_hi_wh(inode, a->btgt); -+ /* todo: revalidate hi_wh? */ -+ } -+ } -+ -+ if (parent) { -+ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); -+ di_downgrade_lock(parent, AuLock_IR); -+ dput(parent); -+ parent = NULL; -+ } -+ if (!au_ftest_icpup(a->flags, DID_CPUP)) -+ goto out; /* success */ -+ -+ if (!d_unhashed(dentry)) { -+ struct au_cp_generic cpg = { -+ .dentry = dentry, -+ .bdst = a->btgt, -+ .bsrc = btop, -+ .len = sz, -+ .pin = &a->pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ if (!err) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ } else if (!hi_wh) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ else -+ a->h_path.dentry = hi_wh; /* do not dget here */ -+ -+out_unlock: -+ a->h_inode = d_inode(a->h_path.dentry); -+ if (!err) -+ goto out; /* success */ -+ au_unpin(&a->pin); -+out_parent: -+ if (parent) { -+ di_write_unlock(parent); -+ dput(parent); -+ } -+out: -+ if (!err) -+ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ return err; -+} -+ -+static int aufs_setattr(struct user_namespace *userns, struct dentry *dentry, -+ struct iattr *ia) -+{ -+ int err; -+ struct inode *inode, *delegated; -+ struct super_block *sb; -+ struct file *file; -+ struct au_icpup_args *a; -+ struct user_namespace *h_userns; -+ -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ -+ err = setattr_prepare(userns, dentry, ia); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) -+ ia->ia_valid &= ~ATTR_MODE; -+ -+ file = NULL; -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ if (ia->ia_valid & ATTR_FILE) { -+ /* currently ftruncate(2) only */ -+ AuDebugOn(!d_is_reg(dentry)); -+ file = ia->ia_file; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, -+ /*fi_lsc*/0); -+ if (unlikely(err)) -+ goto out_si; -+ ia->ia_file = au_hf_top(file); -+ a->udba = AuOpt_UDBA_NONE; -+ } else { -+ /* fchmod() doesn't pass ia_file */ -+ a->udba = au_opt_udba(sb); -+ di_write_lock_child(dentry); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out_dentry; -+ } -+ } -+ -+ err = au_pin_and_icpup(dentry, ia, a); -+ if (unlikely(err < 0)) -+ goto out_dentry; -+ if (au_ftest_icpup(a->flags, DID_CPUP)) { -+ ia->ia_file = NULL; -+ ia->ia_valid &= ~ATTR_FILE; -+ } -+ -+ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); -+ if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) -+ == (ATTR_MODE | ATTR_CTIME)) { -+ err = security_path_chmod(&a->h_path, ia->ia_mode); -+ if (unlikely(err)) -+ goto out_unlock; -+ } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) -+ && (ia->ia_valid & ATTR_CTIME)) { -+ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ -+ if (ia->ia_valid & ATTR_SIZE) { -+ struct file *f; -+ -+ if (ia->ia_size < i_size_read(inode)) -+ /* unmap only */ -+ truncate_setsize(inode, ia->ia_size); -+ -+ f = NULL; -+ if (ia->ia_valid & ATTR_FILE) -+ f = ia->ia_file; -+ inode_unlock(a->h_inode); -+ err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); -+ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); -+ } else { -+ delegated = NULL; -+ while (1) { -+ err = vfsub_notify_change(&a->h_path, ia, &delegated); -+ if (delegated) { -+ err = break_deleg_wait(&delegated); -+ if (!err) -+ continue; -+ } -+ break; -+ } -+ } -+ /* -+ * regardless aufs 'acl' option setting. -+ * why don't all acl-aware fs call this func from their ->setattr()? -+ */ -+ if (!err && (ia->ia_valid & ATTR_MODE)) { -+ h_userns = mnt_user_ns(a->h_path.mnt); -+ err = vfsub_acl_chmod(h_userns, a->h_inode, ia->ia_mode); -+ } -+ if (!err) -+ au_cpup_attr_changeable(inode); -+ -+out_unlock: -+ inode_unlock(a->h_inode); -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+out_dentry: -+ di_write_unlock(dentry); -+ if (file) { -+ fi_write_unlock(file); -+ ia->ia_file = file; -+ ia->ia_valid |= ATTR_FILE; -+ } -+out_si: -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) -+static int au_h_path_to_set_attr(struct dentry *dentry, -+ struct au_icpup_args *a, struct path *h_path) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ a->udba = au_opt_udba(sb); -+ /* no d_unlinked(), to set UDBA_NONE for root */ -+ if (d_unhashed(dentry)) -+ a->udba = AuOpt_UDBA_NONE; -+ if (a->udba != AuOpt_UDBA_NONE) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_reval_for_attr(dentry, au_sigen(sb)); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_pin_and_icpup(dentry, /*ia*/NULL, a); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ h_path->dentry = a->h_path.dentry; -+ h_path->mnt = au_sbr_mnt(sb, a->btgt); -+ -+out: -+ return err; -+} -+ -+ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, -+ struct au_sxattr *arg) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ struct au_icpup_args *a; -+ struct inode *h_inode; -+ struct user_namespace *h_userns; -+ -+ IMustLock(inode); -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_kfree; -+ -+ h_path.dentry = NULL; /* silence gcc */ -+ di_write_lock_child(dentry); -+ err = au_h_path_to_set_attr(dentry, a, &h_path); -+ if (unlikely(err)) -+ goto out_di; -+ h_userns = mnt_user_ns(h_path.mnt); -+ -+ inode_unlock(a->h_inode); -+ switch (arg->type) { -+ case AU_XATTR_SET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfsub_setxattr(h_userns, h_path.dentry, -+ arg->u.set.name, arg->u.set.value, -+ arg->u.set.size, arg->u.set.flags); -+ break; -+ case AU_ACL_SET: -+ err = -EOPNOTSUPP; -+ h_inode = d_inode(h_path.dentry); -+ if (h_inode->i_op->set_acl) { -+ /* this will call posix_acl_update_mode */ -+ err = h_inode->i_op->set_acl(h_userns, h_inode, -+ arg->u.acl_set.acl, -+ arg->u.acl_set.type); -+ } -+ break; -+ } -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ -+ au_unpin(&a->pin); -+ if (unlikely(err)) -+ au_update_dbtop(dentry); -+ -+out_di: -+ di_write_unlock(dentry); -+ si_read_unlock(sb); -+out_kfree: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -+ -+static void au_refresh_iattr(struct inode *inode, struct kstat *st, -+ unsigned int nlink) -+{ -+ unsigned int n; -+ -+ inode->i_mode = st->mode; -+ /* don't i_[ug]id_write() here */ -+ inode->i_uid = st->uid; -+ inode->i_gid = st->gid; -+ inode->i_atime = st->atime; -+ inode->i_mtime = st->mtime; -+ inode->i_ctime = st->ctime; -+ -+ au_cpup_attr_nlink(inode, /*force*/0); -+ if (S_ISDIR(inode->i_mode)) { -+ n = inode->i_nlink; -+ n -= nlink; -+ n += st->nlink; -+ smp_mb(); /* for i_nlink */ -+ /* 0 can happen */ -+ set_nlink(inode, n); -+ } -+ -+ spin_lock(&inode->i_lock); -+ inode->i_blocks = st->blocks; -+ i_size_write(inode, st->size); -+ spin_unlock(&inode->i_lock); -+} -+ -+/* -+ * common routine for aufs_getattr() and au_getxattr(). -+ * returns zero or negative (an error). -+ * @dentry will be read-locked in success. -+ */ -+int au_h_path_getattr(struct dentry *dentry, struct inode *inode, int force, -+ struct path *h_path, int locked) -+{ -+ int err; -+ unsigned int mnt_flags, sigen; -+ unsigned char udba_none; -+ aufs_bindex_t bindex; -+ struct super_block *sb, *h_sb; -+ -+ h_path->mnt = NULL; -+ h_path->dentry = NULL; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ mnt_flags = au_mntflags(sb); -+ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); -+ -+ if (unlikely(locked)) -+ goto body; /* skip locking dinfo */ -+ -+ /* support fstat(2) */ -+ if (!d_unlinked(dentry) && !udba_none) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(dentry, sigen); -+ if (!err) { -+ di_read_lock_child(dentry, AuLock_IR); -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) { -+ di_read_unlock(dentry, AuLock_IR); -+ goto out; -+ } -+ } else { -+ AuDebugOn(IS_ROOT(dentry)); -+ di_write_lock_child(dentry); -+ err = au_dbrange_test(dentry); -+ if (!err) -+ err = au_reval_for_attr(dentry, sigen); -+ if (!err) -+ di_downgrade_lock(dentry, AuLock_IR); -+ else { -+ di_write_unlock(dentry); -+ goto out; -+ } -+ } -+ } else -+ di_read_lock_child(dentry, AuLock_IR); -+ -+body: -+ if (!inode) { -+ inode = d_inode(dentry); -+ if (unlikely(!inode)) -+ goto out; -+ } -+ bindex = au_ibtop(inode); -+ h_path->mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path->mnt->mnt_sb; -+ if (!force -+ && !au_test_fs_bad_iattr(h_sb) -+ && udba_none) -+ goto out; /* success */ -+ -+ if (au_dbtop(dentry) == bindex) -+ h_path->dentry = au_h_dptr(dentry, bindex); -+ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { -+ h_path->dentry = au_plink_lkup(inode, bindex); -+ if (IS_ERR(h_path->dentry)) -+ /* pretending success */ -+ h_path->dentry = NULL; -+ else -+ dput(h_path->dentry); -+ } -+ -+out: -+ return err; -+} -+ -+static int aufs_getattr(struct user_namespace *userns, const struct path *path, -+ struct kstat *st, u32 request, unsigned int query) -+{ -+ int err; -+ unsigned char positive; -+ struct path h_path; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ dentry = path->dentry; -+ inode = d_inode(dentry); -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ err = au_h_path_getattr(dentry, /*inode*/NULL, /*force*/0, &h_path, -+ /*locked*/0); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_fill; /* pretending success */ -+ -+ positive = d_is_positive(h_path.dentry); -+ if (positive) -+ /* no vfsub version */ -+ err = vfs_getattr(&h_path, st, request, query); -+ if (!err) { -+ if (positive) -+ au_refresh_iattr(inode, st, -+ d_inode(h_path.dentry)->i_nlink); -+ goto out_fill; /* success */ -+ } -+ AuTraceErr(err); -+ goto out_di; -+ -+out_fill: -+ generic_fillattr(userns, inode, st); -+out_di: -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *aufs_get_link(struct dentry *dentry, struct inode *inode, -+ struct delayed_call *done) -+{ -+ const char *ret; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ int err; -+ aufs_bindex_t bindex; -+ -+ ret = NULL; /* suppress a warning */ -+ err = -ECHILD; -+ if (!dentry) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ err = -EINVAL; -+ inode = d_inode(dentry); -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode->i_op->get_link)) -+ goto out_unlock; -+ -+ err = -EBUSY; -+ h_dentry = NULL; -+ if (au_dbtop(dentry) <= bindex) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ dget(h_dentry); -+ } -+ if (!h_dentry) { -+ h_dentry = d_find_any_alias(h_inode); -+ if (IS_ERR(h_dentry)) { -+ err = PTR_ERR(h_dentry); -+ goto out_unlock; -+ } -+ } -+ if (unlikely(!h_dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ AuDbg("%ps\n", h_inode->i_op->get_link); -+ AuDbgDentry(h_dentry); -+ ret = vfs_get_link(h_dentry, done); -+ dput(h_dentry); -+ if (IS_ERR(ret)) -+ err = PTR_ERR(ret); -+ -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_IR); -+out: -+ if (unlikely(err)) -+ ret = ERR_PTR(err); -+ AuTraceErrPtr(ret); -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_is_special(struct inode *inode) -+{ -+ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); -+} -+ -+static int aufs_update_time(struct inode *inode, struct timespec64 *ts, -+ int flags) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct super_block *sb; -+ struct inode *h_inode; -+ struct vfsmount *h_mnt; -+ -+ sb = inode->i_sb; -+ WARN_ONCE((flags & S_ATIME) && !IS_NOATIME(inode), -+ "unexpected s_flags 0x%lx", sb->s_flags); -+ -+ /* mmap_sem might be acquired already, cf. aufs_mmap() */ -+ lockdep_off(); -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_write_lock_child(inode); -+ -+ err = 0; -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!au_test_ro(sb, bindex, inode)) { -+ h_mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mnt_want_write(h_mnt); -+ if (!err) { -+ err = vfsub_update_time(h_inode, ts, flags); -+ vfsub_mnt_drop_write(h_mnt); -+ } -+ } else if (au_is_special(h_inode)) { -+ /* -+ * Never copy-up here. -+ * These special files may already be opened and used for -+ * communicating. If we copied it up, then the communication -+ * would be corrupted. -+ */ -+ AuWarn1("timestamps for i%lu are ignored " -+ "since it is on readonly branch (hi%lu).\n", -+ inode->i_ino, h_inode->i_ino); -+ } else if (flags & ~S_ATIME) { -+ err = -EIO; -+ AuIOErr1("unexpected flags 0x%x\n", flags); -+ AuDebugOn(1); -+ } -+ -+ if (!err) -+ au_cpup_attr_timesizes(inode); -+ ii_write_unlock(inode); -+ si_read_unlock(sb); -+ lockdep_on(); -+ -+ if (!err && (flags & S_VERSION)) -+ inode_inc_iversion(inode); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no getattr version will be set by module.c:aufs_init() */ -+struct inode_operations aufs_iop_nogetattr[AuIop_Last], -+ aufs_iop[] = { -+ [AuIop_SYMLINK] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, /* unsupport for symlink? */ -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .get_link = aufs_get_link, -+ -+ /* .update_time = aufs_update_time */ -+ }, -+ [AuIop_DIR] = { -+ .create = aufs_create, -+ .lookup = aufs_lookup, -+ .link = aufs_link, -+ .unlink = aufs_unlink, -+ .symlink = aufs_symlink, -+ .mkdir = aufs_mkdir, -+ .rmdir = aufs_rmdir, -+ .mknod = aufs_mknod, -+ .rename = aufs_rename, -+ -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time, -+ .atomic_open = aufs_atomic_open, -+ .tmpfile = aufs_tmpfile -+ }, -+ [AuIop_OTHER] = { -+ .permission = aufs_permission, -+#ifdef CONFIG_FS_POSIX_ACL -+ .get_acl = aufs_get_acl, -+ .set_acl = aufs_set_acl, -+#endif -+ -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ -+#ifdef CONFIG_AUFS_XATTR -+ .listxattr = aufs_listxattr, -+#endif -+ -+ .update_time = aufs_update_time -+ } -+}; -diff -Nurp linux-5.15.37/fs/aufs/i_op_del.c linux-5.15.37-aufs/fs/aufs/i_op_del.c ---- linux-5.15.37/fs/aufs/i_op_del.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/i_op_del.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,509 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operations (del entry) -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * decide if a new whiteout for @dentry is necessary or not. -+ * when it is necessary, prepare the parent dir for the upper branch whose -+ * branch index is @bcpup for creation. the actual creation of the whiteout will -+ * be done by caller. -+ * return value: -+ * 0: wh is unnecessary -+ * plus: wh is necessary -+ * minus: error -+ */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) -+{ -+ int need_wh, err; -+ aufs_bindex_t btop; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ if (*bcpup < 0) { -+ *bcpup = btop; -+ if (au_test_ro(sb, btop, d_inode(dentry))) { -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ *bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else -+ AuDebugOn(btop < *bcpup -+ || au_test_ro(sb, *bcpup, d_inode(dentry))); -+ AuDbg("bcpup %d, btop %d\n", *bcpup, btop); -+ -+ if (*bcpup != btop) { -+ err = au_cpup_dirs(dentry, *bcpup); -+ if (unlikely(err)) -+ goto out; -+ need_wh = 1; -+ } else { -+ struct au_dinfo *dinfo, *tmp; -+ -+ need_wh = -ENOMEM; -+ dinfo = au_di(dentry); -+ tmp = au_di_alloc(sb, AuLsc_DI_TMP); -+ if (tmp) { -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ /* returns the number of positive dentries */ -+ need_wh = au_lkup_dentry(dentry, btop + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ } -+ } -+ AuDbg("need_wh %d\n", need_wh); -+ err = need_wh; -+ -+out: -+ return err; -+} -+ -+/* -+ * simple tests for the del-entry operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ 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); -+ if (d_really_is_positive(dentry)) { -+ err = -ENOENT; -+ if (unlikely(d_is_negative(h_dentry))) -+ goto out; -+ h_inode = d_inode(h_dentry); -+ if (unlikely(!h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(d_is_positive(h_dentry))) -+ goto out; -+ } -+ -+ err = -ENOENT; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ goto out; -+ err = 0; -+ -+ /* -+ * rmdir a dir may break the consistency on some filesystem. -+ * let's try heavy test. -+ */ -+ err = -EACCES; -+ 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_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; -+ if (h_latest == h_dentry) -+ err = 0; -+ dput(h_latest); -+ -+out: -+ return err; -+} -+ -+/* -+ * decide the branch where we operate for @dentry. the branch index will be set -+ * @rbcpup. after deciding it, 'pin' it and store the timestamps of the parent -+ * dir for reverting. -+ * when a new whiteout is necessary, create it. -+ */ -+static struct dentry* -+lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, -+ struct au_dtime *dt, struct au_pin *pin) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ struct path h_path; -+ int err, need_wh; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); -+ wh_dentry = ERR_PTR(need_wh); -+ if (unlikely(need_wh < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ bcpup = *rbcpup; -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path.dentry = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbtop(dentry) == bcpup) { -+ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ } -+ -+ h_path.mnt = au_sbr_mnt(sb, bcpup); -+ au_dtime_store(dt, au_pinned_parent(pin), &h_path); -+ wh_dentry = NULL; -+ if (!need_wh) -+ goto out; /* success, no need to create whiteout */ -+ -+ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_unpin; -+ -+ /* returns with the parent is locked and wh_dentry is dget-ed */ -+ goto out; /* success */ -+ -+out_unpin: -+ au_unpin(pin); -+out: -+ return wh_dentry; -+} -+ -+/* -+ * when removing a dir, rename it to a unique temporary whiteout-ed name first -+ * in order to be revertible and save time for removing many child whiteouts -+ * under the dir. -+ * returns 1 when there are too many child whiteout and caller should remove -+ * them asynchronously. returns 0 when the number of children is enough small to -+ * remove now or the branch fs is a remote fs. -+ * otherwise return an error. -+ */ -+static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, -+ struct au_nhash *whlist, struct inode *dir) -+{ -+ int rmdir_later, err, dirwh; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ sb = dentry->d_sb; -+ SiMustAnyLock(sb); -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); -+ if (unlikely(err)) -+ goto out; -+ -+ /* stop monitoring */ -+ inode = d_inode(dentry); -+ au_hn_free(au_hi(inode, bindex)); -+ -+ if (!au_test_fs_remote(h_dentry->d_sb)) { -+ dirwh = au_sbi(sb)->si_dirwh; -+ rmdir_later = (dirwh <= 1); -+ if (!rmdir_later) -+ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, -+ dirwh); -+ if (rmdir_later) -+ return rmdir_later; -+ } -+ -+ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); -+ if (unlikely(err)) { -+ AuIOErr("rmdir %pd, b%d failed, %d. ignored\n", -+ h_dentry, bindex, err); -+ err = 0; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * final procedure for deleting a entry. -+ * maintain dentry and iattr. -+ */ -+static void epilog(struct inode *dir, struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ d_drop(dentry); -+ inode->i_ctime = dir->i_ctime; -+ -+ au_dir_ts(dir, bindex); -+ inode_inc_iversion(dir); -+} -+ -+/* -+ * when an error happened, remove the created whiteout and revert everything. -+ */ -+static int do_revert(int err, struct inode *dir, aufs_bindex_t bindex, -+ aufs_bindex_t bwh, struct dentry *wh_dentry, -+ struct dentry *dentry, struct au_dtime *dt) -+{ -+ int rerr; -+ struct path h_path = { -+ .dentry = wh_dentry, -+ .mnt = au_sbr_mnt(dir->i_sb, bindex) -+ }; -+ -+ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, dentry); -+ if (!rerr) { -+ au_set_dbwh(dentry, bwh); -+ au_dtime_revert(dt); -+ return 0; -+ } -+ -+ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", dentry, err, rerr); -+ return -EIO; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_unlink(struct inode *dir, struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode, *h_dir, *delegated; -+ struct dentry *parent, *wh_dentry; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_d_hashed_positive(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -EISDIR; -+ if (unlikely(d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ a->h_path.mnt = au_sbr_mnt(dentry->d_sb, btop); -+ a->h_path.dentry = au_h_dptr(dentry, btop); -+ dget(a->h_path.dentry); -+ if (bindex == btop) { -+ h_dir = au_pinned_h_dir(&a->pin); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &a->h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } else { -+ /* dir inode is locked */ -+ h_dir = d_inode(wh_dentry->d_parent); -+ IMustLock(h_dir); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_drop_nlink(inode); -+ epilog(dir, dentry, bindex); -+ -+ /* update target timestamps */ -+ if (bindex == btop) { -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); -+ /*ignore*/ -+ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } else -+ /* todo: this timestamp may be reverted later */ -+ inode->i_ctime = h_dir->i_ctime; -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(a->h_path.dentry); -+out_parent: -+ di_write_unlock(parent); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ return err; -+} -+ -+int aufs_rmdir(struct inode *dir, struct dentry *dentry) -+{ -+ int err, rmdir_later; -+ aufs_bindex_t bwh, bindex, btop; -+ struct inode *inode; -+ struct dentry *parent, *wh_dentry, *h_dentry; -+ struct au_whtmp_rmdir *args; -+ /* to reduce stack size */ -+ struct { -+ struct au_dtime dt; -+ struct au_pin pin; -+ } *a; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); -+ if (unlikely(err)) -+ goto out_free; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ inode = d_inode(dentry); -+ IMustLock(inode); -+ err = -ENOTDIR; -+ if (unlikely(!d_is_dir(dentry))) -+ goto out_unlock; /* possible? */ -+ -+ err = -ENOMEM; -+ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); -+ if (unlikely(!args)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ err = au_test_empty(dentry, &args->whlist); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ btop = au_dbtop(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &a->dt, -+ &a->pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_parent; -+ -+ h_dentry = au_h_dptr(dentry, btop); -+ dget(h_dentry); -+ rmdir_later = 0; -+ if (bindex == btop) { -+ err = renwh_and_rmdir(dentry, btop, &args->whlist, dir); -+ if (err > 0) { -+ rmdir_later = err; -+ err = 0; -+ } -+ } else { -+ /* stop monitoring */ -+ au_hn_free(au_hi(inode, btop)); -+ -+ /* dir inode is locked */ -+ IMustLock(d_inode(wh_dentry->d_parent)); -+ err = 0; -+ } -+ -+ if (!err) { -+ vfsub_dead_dir(inode); -+ au_set_dbdiropq(dentry, -1); -+ epilog(dir, dentry, bindex); -+ -+ if (rmdir_later) { -+ au_whtmp_kick_rmdir(dir, btop, h_dentry, args); -+ args = NULL; -+ } -+ -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ AuLabel(revert); -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, -+ &a->dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+out_unpin: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ dput(h_dentry); -+out_parent: -+ di_write_unlock(parent); -+ if (args) -+ au_whtmp_rmdir_free(args); -+out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+out_free: -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/i_op_ren.c linux-5.15.37-aufs/fs/aufs/i_op_ren.c ---- linux-5.15.37/fs/aufs/i_op_ren.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/i_op_ren.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,1244 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * inode operation (rename entry) -+ * todo: this is crazy monster -+ */ -+ -+#include -+#include "aufs.h" -+ -+enum { AuSRC, AuDST, AuSrcDst }; -+enum { AuPARENT, AuCHILD, AuParentChild }; -+ -+#define AuRen_ISDIR_SRC 1 -+#define AuRen_ISDIR_DST (1 << 1) -+#define AuRen_ISSAMEDIR (1 << 2) -+#define AuRen_WHSRC (1 << 3) -+#define AuRen_WHDST (1 << 4) -+#define AuRen_MNT_WRITE (1 << 5) -+#define AuRen_DT_DSTDIR (1 << 6) -+#define AuRen_DIROPQ_SRC (1 << 7) -+#define AuRen_DIROPQ_DST (1 << 8) -+#define AuRen_DIRREN (1 << 9) -+#define AuRen_DROPPED_SRC (1 << 10) -+#define AuRen_DROPPED_DST (1 << 11) -+#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) -+#define au_fset_ren(flags, name) \ -+ do { (flags) |= AuRen_##name; } while (0) -+#define au_fclr_ren(flags, name) \ -+ do { (flags) &= ~AuRen_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuRen_DIRREN -+#define AuRen_DIRREN 0 -+#endif -+ -+struct au_ren_args { -+ struct { -+ struct dentry *dentry, *h_dentry, *parent, *h_parent, -+ *wh_dentry; -+ struct inode *dir, *inode; -+ struct au_hinode *hdir, *hinode; -+ struct au_dtime dt[AuParentChild]; -+ aufs_bindex_t btop, bdiropq; -+ } sd[AuSrcDst]; -+ -+#define src_dentry sd[AuSRC].dentry -+#define src_dir sd[AuSRC].dir -+#define src_inode sd[AuSRC].inode -+#define src_h_dentry sd[AuSRC].h_dentry -+#define src_parent sd[AuSRC].parent -+#define src_h_parent sd[AuSRC].h_parent -+#define src_wh_dentry sd[AuSRC].wh_dentry -+#define src_hdir sd[AuSRC].hdir -+#define src_hinode sd[AuSRC].hinode -+#define src_h_dir sd[AuSRC].hdir->hi_inode -+#define src_dt sd[AuSRC].dt -+#define src_btop sd[AuSRC].btop -+#define src_bdiropq sd[AuSRC].bdiropq -+ -+#define dst_dentry sd[AuDST].dentry -+#define dst_dir sd[AuDST].dir -+#define dst_inode sd[AuDST].inode -+#define dst_h_dentry sd[AuDST].h_dentry -+#define dst_parent sd[AuDST].parent -+#define dst_h_parent sd[AuDST].h_parent -+#define dst_wh_dentry sd[AuDST].wh_dentry -+#define dst_hdir sd[AuDST].hdir -+#define dst_hinode sd[AuDST].hinode -+#define dst_h_dir sd[AuDST].hdir->hi_inode -+#define dst_dt sd[AuDST].dt -+#define dst_btop sd[AuDST].btop -+#define dst_bdiropq sd[AuDST].bdiropq -+ -+ struct dentry *h_trap; -+ struct au_branch *br; -+ struct path h_path; -+ struct au_nhash whlist; -+ aufs_bindex_t btgt, src_bwh; -+ -+ struct { -+ unsigned short auren_flags; -+ unsigned char flags; /* syscall parameter */ -+ unsigned char exchange; -+ } __packed; -+ -+ struct au_whtmp_rmdir *thargs; -+ struct dentry *h_dst; -+ struct au_hinode *h_root; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * functions for reverting. -+ * when an error happened in a single rename systemcall, we should revert -+ * everything as if nothing happened. -+ * we don't need to revert the copied-up/down the parent dir since they are -+ * harmless. -+ */ -+ -+#define RevertFailure(fmt, ...) do { \ -+ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ -+ ##__VA_ARGS__, err, rerr); \ -+ err = -EIO; \ -+} while (0) -+ -+static void au_ren_do_rev_diropq(int err, struct au_ren_args *a, int idx) -+{ -+ int rerr; -+ struct dentry *d; -+#define src_or_dst(member) a->sd[idx].member -+ -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ rerr = au_diropq_remove(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ au_set_dbdiropq(d, src_or_dst(bdiropq)); -+ if (rerr) -+ RevertFailure("remove diropq %pd", d); -+ -+#undef src_or_dst_ -+} -+ -+static void au_ren_rev_diropq(int err, struct au_ren_args *a) -+{ -+ if (au_ftest_ren(a->auren_flags, DIROPQ_SRC)) -+ au_ren_do_rev_diropq(err, a, AuSRC); -+ if (au_ftest_ren(a->auren_flags, DIROPQ_DST)) -+ au_ren_do_rev_diropq(err, a, AuDST); -+} -+ -+static void au_ren_rev_rename(int err, struct au_ren_args *a) -+{ -+ 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, &h_ppath); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->src_dentry); -+ return; -+ } -+ -+ delegated = NULL; -+ rerr = vfsub_rename(a->dst_h_dir, -+ au_h_dptr(a->src_dentry, a->btgt), -+ a->src_h_dir, &a->h_path, &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ -+ if (rerr) -+ RevertFailure("rename %pd", a->src_dentry); -+} -+ -+static void au_ren_rev_whtmp(int err, struct au_ren_args *a) -+{ -+ 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, &h_ppath); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lkup one %pd", a->dst_dentry); -+ return; -+ } -+ if (d_is_positive(a->h_path.dentry)) { -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ return; -+ } -+ -+ delegated = NULL; -+ rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path, -+ &delegated, a->flags); -+ if (unlikely(rerr == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ if (!rerr) -+ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); -+ else -+ RevertFailure("rename %pd", a->h_dst); -+} -+ -+static void au_ren_rev_whsrc(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = a->src_wh_dentry; -+ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); -+ au_set_dbwh(a->src_dentry, a->src_bwh); -+ if (rerr) -+ RevertFailure("unlink %pd", a->src_wh_dentry); -+} -+#undef RevertFailure -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * when we have to copyup the renaming entry, do it with the rename-target name -+ * in order to minimize the cost (the later actual rename is unnecessary). -+ * otherwise rename it on the target branch. -+ */ -+static int au_ren_or_cpup(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d; -+ struct inode *delegated; -+ -+ d = a->src_dentry; -+ if (au_dbtop(d) == a->btgt) { -+ a->h_path.dentry = a->dst_h_dentry; -+ AuDebugOn(au_dbtop(d) != a->btgt); -+ delegated = NULL; -+ err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), -+ a->dst_h_dir, &a->h_path, &delegated, -+ a->flags); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ } else -+ BUG(); -+ -+ if (!err && a->h_dst) -+ /* it will be set to dinfo later */ -+ dget(a->h_dst); -+ -+ return err; -+} -+ -+/* cf. aufs_rmdir() */ -+static int au_ren_del_whtmp(struct au_ren_args *a) -+{ -+ int err; -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ SiMustAnyLock(dir->i_sb); -+ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, -+ au_sbi(dir->i_sb)->si_dirwh) -+ || au_test_fs_remote(a->h_dst->d_sb)) { -+ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); -+ if (unlikely(err)) -+ pr_warn("failed removing whtmp dir %pd (%d), " -+ "ignored.\n", a->h_dst, err); -+ } else { -+ au_nhash_wh_free(&a->thargs->whlist); -+ a->thargs->whlist = a->whlist; -+ a->whlist.nh_num = 0; -+ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); -+ dput(a->h_dst); -+ a->thargs = NULL; -+ } -+ -+ return 0; -+} -+ -+/* make it 'opaque' dir. */ -+static int au_ren_do_diropq(struct au_ren_args *a, int idx) -+{ -+ int err; -+ struct dentry *d, *diropq; -+#define src_or_dst(member) a->sd[idx].member -+ -+ err = 0; -+ d = src_or_dst(dentry); /* {src,dst}_dentry */ -+ src_or_dst(bdiropq) = au_dbdiropq(d); -+ src_or_dst(hinode) = au_hi(src_or_dst(inode), a->btgt); -+ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); -+ diropq = au_diropq_create(d, a->btgt); -+ au_hn_inode_unlock(src_or_dst(hinode)); -+ if (IS_ERR(diropq)) -+ err = PTR_ERR(diropq); -+ else -+ dput(diropq); -+ -+#undef src_or_dst_ -+ return err; -+} -+ -+static int au_ren_diropq(struct au_ren_args *a) -+{ -+ int err; -+ unsigned char always; -+ struct dentry *d; -+ -+ err = 0; -+ d = a->dst_dentry; /* already renamed on the branch */ -+ always = !!au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !au_ftest_ren(a->auren_flags, DIRREN) -+ && a->btgt != au_dbdiropq(a->src_dentry) -+ && (a->dst_wh_dentry -+ || a->btgt <= au_dbdiropq(d) -+ /* hide the lower to keep xino */ -+ /* the lowers may not be a dir, but we hide them anyway */ -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbg("here\n"); -+ err = au_ren_do_diropq(a, AuSRC); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, DIROPQ_SRC); -+ } -+ if (!a->exchange) -+ goto out; /* success */ -+ -+ d = a->src_dentry; /* already renamed on the branch */ -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ && a->btgt != au_dbdiropq(a->dst_dentry) -+ && (a->btgt < au_dbdiropq(d) -+ || a->btgt < au_dbbot(d) -+ || always)) { -+ AuDbgDentry(a->src_dentry); -+ AuDbgDentry(a->dst_dentry); -+ err = au_ren_do_diropq(a, AuDST); -+ if (unlikely(err)) -+ goto out_rev_src; -+ au_fset_ren(a->auren_flags, DIROPQ_DST); -+ } -+ goto out; /* success */ -+ -+out_rev_src: -+ AuDbg("err %d, reverting src\n", err); -+ au_ren_rev_diropq(err, a); -+out: -+ return err; -+} -+ -+static int do_rename(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d, *h_d; -+ -+ if (!a->exchange) { -+ /* prepare workqueue args for asynchronous rmdir */ -+ h_d = a->dst_h_dentry; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) -+ /* && !au_ftest_ren(a->auren_flags, DIRREN) */ -+ && d_is_positive(h_d)) { -+ err = -ENOMEM; -+ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, -+ GFP_NOFS); -+ if (unlikely(!a->thargs)) -+ goto out; -+ a->h_dst = dget(h_d); -+ } -+ -+ /* create whiteout for src_dentry */ -+ if (au_ftest_ren(a->auren_flags, WHSRC)) { -+ a->src_bwh = au_dbwh(a->src_dentry); -+ AuDebugOn(a->src_bwh >= 0); -+ a->src_wh_dentry = au_wh_create(a->src_dentry, a->btgt, -+ a->src_h_parent); -+ err = PTR_ERR(a->src_wh_dentry); -+ if (IS_ERR(a->src_wh_dentry)) -+ goto out_thargs; -+ } -+ -+ /* lookup whiteout for dentry */ -+ if (au_ftest_ren(a->auren_flags, WHDST)) { -+ h_d = au_wh_lkup(a->dst_h_parent, -+ &a->dst_dentry->d_name, a->br); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out_whsrc; -+ if (d_is_negative(h_d)) -+ dput(h_d); -+ else -+ a->dst_wh_dentry = h_d; -+ } -+ -+ /* rename dentry to tmpwh */ -+ if (a->thargs) { -+ err = au_whtmp_ren(a->dst_h_dentry, a->br); -+ if (unlikely(err)) -+ goto out_whdst; -+ -+ d = a->dst_dentry; -+ au_set_h_dptr(d, a->btgt, NULL); -+ err = au_lkup_neg(d, a->btgt, /*wh*/0); -+ if (unlikely(err)) -+ goto out_whtmp; -+ a->dst_h_dentry = au_h_dptr(d, a->btgt); -+ } -+ } -+ -+ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_btop != a->btgt); -+#if 0 /* debugging */ -+ BUG_ON(!au_ftest_ren(a->auren_flags, DIRREN) -+ && d_is_positive(a->dst_h_dentry) -+ && a->src_btop != a->btgt); -+#endif -+ -+ /* rename by vfs_rename or cpup */ -+ err = au_ren_or_cpup(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_whtmp; -+ -+ /* make dir opaque */ -+ err = au_ren_diropq(a); -+ if (unlikely(err)) -+ goto out_rename; -+ -+ /* update target timestamps */ -+ if (a->exchange) { -+ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ } -+ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; -+ -+ if (!a->exchange) { -+ /* remove whiteout for dentry */ -+ if (a->dst_wh_dentry) { -+ a->h_path.dentry = a->dst_wh_dentry; -+ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, -+ a->dst_dentry); -+ if (unlikely(err)) -+ goto out_diropq; -+ } -+ -+ /* remove whtmp */ -+ if (a->thargs) -+ au_ren_del_whtmp(a); /* ignore this error */ -+ -+ au_fhsm_wrote(a->src_dentry->d_sb, a->btgt, /*force*/0); -+ } -+ err = 0; -+ goto out_success; -+ -+out_diropq: -+ au_ren_rev_diropq(err, a); -+out_rename: -+ au_ren_rev_rename(err, a); -+ dput(a->h_dst); -+out_whtmp: -+ if (a->thargs) -+ au_ren_rev_whtmp(err, a); -+out_whdst: -+ dput(a->dst_wh_dentry); -+ a->dst_wh_dentry = NULL; -+out_whsrc: -+ if (a->src_wh_dentry) -+ au_ren_rev_whsrc(err, a); -+out_success: -+ dput(a->src_wh_dentry); -+ dput(a->dst_wh_dentry); -+out_thargs: -+ if (a->thargs) { -+ dput(a->h_dst); -+ au_whtmp_rmdir_free(a->thargs); -+ a->thargs = NULL; -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if @dentry dir can be rename destination or not. -+ * success means, it is a logically empty dir. -+ */ -+static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ return au_test_empty(dentry, whlist); -+} -+ -+/* -+ * test if @a->src_dentry dir can be rename source or not. -+ * if it can, return 0. -+ * success means, -+ * - it is a logically empty dir. -+ * - or, it exists on writable branch and has no children including whiteouts -+ * on the lower branch unless DIRREN is on. -+ */ -+static int may_rename_srcdir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t btop, btgt; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ dentry = a->src_dentry; -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) -+ au_fset_ren(a->auren_flags, DIRREN); -+ -+ btgt = a->btgt; -+ btop = au_dbtop(dentry); -+ if (btop != btgt) { -+ struct au_nhash whlist; -+ -+ SiMustAnyLock(sb); -+ rdhash = sbinfo->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, -+ dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_test_empty(dentry, &whlist); -+ au_nhash_wh_free(&whlist); -+ goto out; -+ } -+ -+ if (btop == au_dbtaildir(dentry)) -+ return 0; /* success */ -+ -+ err = au_test_empty_lower(dentry); -+ -+out: -+ if (err == -ENOTEMPTY) { -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = 0; -+ } else { -+ AuWarn1("renaming dir who has child(ren) on multiple " -+ "branches, is not supported\n"); -+ err = -EXDEV; -+ } -+ } -+ return err; -+} -+ -+/* side effect: sets whlist and h_dentry */ -+static int au_ren_may_dir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ struct dentry *d; -+ -+ d = a->dst_dentry; -+ SiMustAnyLock(d->d_sb); -+ -+ err = 0; -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST) && a->dst_inode) { -+ rdhash = au_sbi(d->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); -+ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ if (!a->exchange) { -+ au_set_dbtop(d, a->dst_btop); -+ err = may_rename_dstdir(d, &a->whlist); -+ au_set_dbtop(d, a->btgt); -+ } else -+ err = may_rename_srcdir(a); -+ } -+ a->dst_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (unlikely(err)) -+ goto out; -+ -+ d = a->src_dentry; -+ a->src_h_dentry = au_h_dptr(d, au_dbtop(d)); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ err = may_rename_srcdir(a); -+ if (unlikely(err)) { -+ au_nhash_wh_free(&a->whlist); -+ a->whlist.nh_num = 0; -+ } -+ } -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * simple tests for rename. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+static int au_may_ren(struct au_ren_args *a) -+{ -+ int err, isdir; -+ struct inode *h_inode; -+ -+ if (a->src_btop == a->btgt) { -+ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, -+ au_ftest_ren(a->auren_flags, ISDIR_SRC)); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (unlikely(a->src_h_dentry == a->h_trap)) -+ goto out; -+ } -+ -+ err = 0; -+ if (a->dst_btop != a->btgt) -+ goto out; -+ -+ err = -ENOTEMPTY; -+ if (unlikely(a->dst_h_dentry == a->h_trap)) -+ goto out; -+ -+ err = -EIO; -+ isdir = !!au_ftest_ren(a->auren_flags, ISDIR_DST); -+ if (d_really_is_negative(a->dst_dentry)) { -+ if (d_is_negative(a->dst_h_dentry)) -+ err = au_may_add(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } else { -+ if (unlikely(d_is_negative(a->dst_h_dentry))) -+ goto out; -+ h_inode = d_inode(a->dst_h_dentry); -+ if (h_inode->i_nlink) -+ err = au_may_del(a->dst_dentry, a->btgt, -+ a->dst_h_parent, isdir); -+ } -+ -+out: -+ if (unlikely(err == -ENOENT || err == -EEXIST)) -+ err = -EIO; -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * locking order -+ * (VFS) -+ * - src_dir and dir by lock_rename() -+ * - inode if exists -+ * (aufs) -+ * - lock all -+ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, -+ * + si_read_lock -+ * + di_write_lock2_child() -+ * + di_write_lock_child() -+ * + ii_write_lock_child() -+ * + di_write_lock_child2() -+ * + ii_write_lock_child2() -+ * + src_parent and parent -+ * + di_write_lock_parent() -+ * + ii_write_lock_parent() -+ * + di_write_lock_parent2() -+ * + ii_write_lock_parent2() -+ * + lower src_dir and dir by vfsub_lock_rename() -+ * + verify the every relationships between child and parent. if any -+ * of them failed, unlock all and return -EBUSY. -+ */ -+static void au_ren_unlock(struct au_ren_args *a) -+{ -+ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ if (au_ftest_ren(a->auren_flags, DIRREN) -+ && a->h_root) -+ au_hn_inode_unlock(a->h_root); -+ if (au_ftest_ren(a->auren_flags, MNT_WRITE)) -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+} -+ -+static int au_ren_lock(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int udba; -+ -+ err = 0; -+ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); -+ a->src_hdir = au_hi(a->src_dir, a->btgt); -+ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); -+ a->dst_hdir = au_hi(a->dst_dir, a->btgt); -+ -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out; -+ au_fset_ren(a->auren_flags, MNT_WRITE); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ struct dentry *root; -+ struct inode *dir; -+ -+ /* -+ * sbinfo is already locked, so this ii_read_lock is -+ * unnecessary. but our debugging feature checks it. -+ */ -+ root = a->src_inode->i_sb->s_root; -+ if (root != a->src_parent && root != a->dst_parent) { -+ dir = d_inode(root); -+ ii_read_lock_parent3(dir); -+ a->h_root = au_hi(dir, a->btgt); -+ ii_read_unlock(dir); -+ au_hn_inode_lock_nested(a->h_root, AuLsc_I_PARENT3); -+ } -+ } -+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ udba = au_opt_udba(a->src_dentry->d_sb); -+ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) -+ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) -+ err = au_busy_or_stale(); -+ if (!err && au_dbtop(a->src_dentry) == a->btgt) -+ err = au_h_verify(a->src_h_dentry, udba, -+ d_inode(a->src_h_parent), a->src_h_parent, -+ a->br); -+ if (!err && au_dbtop(a->dst_dentry) == a->btgt) -+ err = au_h_verify(a->dst_h_dentry, udba, -+ d_inode(a->dst_h_parent), a->dst_h_parent, -+ a->br); -+ if (!err) -+ goto out; /* success */ -+ -+ err = au_busy_or_stale(); -+ au_ren_unlock(a); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_ren_refresh_dir(struct au_ren_args *a) -+{ -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->src_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ -+ if (a->exchange) { -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->dst_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ } -+ au_dir_ts(dir, a->btgt); -+ } -+ -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ return; -+ -+ dir = a->src_dir; -+ inode_inc_iversion(dir); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ au_dir_ts(dir, a->btgt); -+} -+ -+static void au_ren_refresh(struct au_ren_args *a) -+{ -+ aufs_bindex_t bbot, bindex; -+ struct dentry *d, *h_d; -+ struct inode *i, *h_i; -+ struct super_block *sb; -+ -+ d = a->dst_dentry; -+ d_drop(d); -+ if (a->h_dst) -+ /* already dget-ed by au_ren_or_cpup() */ -+ au_set_h_dptr(d, a->btgt, a->h_dst); -+ -+ i = a->dst_inode; -+ if (i) { -+ if (!a->exchange) { -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ vfsub_drop_nlink(i); -+ else { -+ vfsub_dead_dir(i); -+ au_cpup_attr_timesizes(i); -+ } -+ au_update_dbrange(d, /*do_put_zero*/1); -+ } else -+ au_cpup_attr_nlink(i, /*force*/1); -+ } else { -+ bbot = a->btgt; -+ for (bindex = au_dbtop(d); bindex < bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) -+ au_set_h_dptr(d, bindex, NULL); -+ au_update_dbrange(d, /*do_put_zero*/0); -+ } -+ -+ if (a->exchange -+ || au_ftest_ren(a->auren_flags, DIRREN)) { -+ d_drop(a->src_dentry); -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_set_dbwh(a->src_dentry, -1); -+ return; -+ } -+ -+ d = a->src_dentry; -+ au_set_dbwh(d, -1); -+ bbot = au_dbbot(d); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_d = au_h_dptr(d, bindex); -+ if (h_d) -+ au_set_h_dptr(d, bindex, NULL); -+ } -+ au_set_dbbot(d, a->btgt); -+ -+ sb = d->d_sb; -+ i = a->src_inode; -+ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) -+ return; /* success */ -+ -+ bbot = au_ibbot(i); -+ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { -+ h_i = au_h_iptr(i, bindex); -+ if (h_i) { -+ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ au_set_h_iptr(i, bindex, NULL, 0); -+ } -+ } -+ au_set_ibbot(i, a->btgt); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mainly for link(2) and rename(2) */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) -+{ -+ aufs_bindex_t bdiropq, bwh; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ parent = dentry->d_parent; -+ IMustLock(d_inode(parent)); /* dir is locked */ -+ -+ bdiropq = au_dbdiropq(parent); -+ bwh = au_dbwh(dentry); -+ br = au_sbr(dentry->d_sb, btgt); -+ if (au_br_rdonly(br) -+ || (0 <= bdiropq && bdiropq < btgt) -+ || (0 <= bwh && bwh < btgt)) -+ btgt = -1; -+ -+ AuDbg("btgt %d\n", btgt); -+ return btgt; -+} -+ -+/* sets src_btop, dst_btop and btgt */ -+static int au_ren_wbr(struct au_ren_args *a) -+{ -+ int err; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ a->src_btop = au_dbtop(a->src_dentry); -+ a->dst_btop = au_dbtop(a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ || au_ftest_ren(a->auren_flags, ISDIR_DST)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ wr_dir_args.force_btgt = a->src_btop; -+ if (a->dst_inode && a->dst_btop < a->src_btop) -+ wr_dir_args.force_btgt = a->dst_btop; -+ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); -+ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); -+ a->btgt = err; -+ if (a->exchange) -+ au_update_dbtop(a->dst_dentry); -+ -+ return err; -+} -+ -+static void au_ren_dt(struct au_ren_args *a) -+{ -+ a->h_path.dentry = a->src_h_parent; -+ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) { -+ a->h_path.dentry = a->dst_h_parent; -+ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); -+ } -+ -+ au_fclr_ren(a->auren_flags, DT_DSTDIR); -+ if (!au_ftest_ren(a->auren_flags, ISDIR_SRC) -+ && !a->exchange) -+ return; -+ -+ a->h_path.dentry = a->src_h_dentry; -+ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); -+ if (d_is_positive(a->dst_h_dentry)) { -+ au_fset_ren(a->auren_flags, DT_DSTDIR); -+ a->h_path.dentry = a->dst_h_dentry; -+ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); -+ } -+} -+ -+static void au_ren_rev_dt(int err, struct au_ren_args *a) -+{ -+ struct dentry *h_d; -+ struct inode *h_inode; -+ -+ au_dtime_revert(a->src_dt + AuPARENT); -+ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ au_dtime_revert(a->dst_dt + AuPARENT); -+ -+ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) && err != -EIO) { -+ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->src_dt + AuCHILD); -+ inode_unlock(h_inode); -+ -+ if (au_ftest_ren(a->auren_flags, DT_DSTDIR)) { -+ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; -+ h_inode = d_inode(h_d); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ au_dtime_revert(a->dst_dt + AuCHILD); -+ inode_unlock(h_inode); -+ } -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_rename(struct user_namespace *userns, -+ struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry, -+ unsigned int _flags) -+{ -+ int err, lock_flags; -+ void *rev; -+ /* reduce stack space */ -+ struct au_ren_args *a; -+ struct au_pin pin; -+ -+ AuDbg("%pd, %pd, 0x%x\n", _src_dentry, _dst_dentry, _flags); -+ IMustLock(_src_dir); -+ IMustLock(_dst_dir); -+ -+ err = -EINVAL; -+ if (unlikely(_flags & RENAME_WHITEOUT)) -+ goto out; -+ -+ err = -ENOMEM; -+ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->flags = _flags; -+ BUILD_BUG_ON(sizeof(a->exchange) == sizeof(u8) -+ && RENAME_EXCHANGE > U8_MAX); -+ a->exchange = _flags & RENAME_EXCHANGE; -+ a->src_dir = _src_dir; -+ a->src_dentry = _src_dentry; -+ a->src_inode = NULL; -+ if (d_really_is_positive(a->src_dentry)) -+ a->src_inode = d_inode(a->src_dentry); -+ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ -+ a->dst_dir = _dst_dir; -+ a->dst_dentry = _dst_dentry; -+ a->dst_inode = NULL; -+ if (d_really_is_positive(a->dst_dentry)) -+ a->dst_inode = d_inode(a->dst_dentry); -+ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ -+ if (a->dst_inode) { -+ /* -+ * if EXCHANGE && src is non-dir && dst is dir, -+ * dst is not locked. -+ */ -+ /* IMustLock(a->dst_inode); */ -+ au_igrab(a->dst_inode); -+ } -+ -+ err = -ENOTDIR; -+ lock_flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN; -+ if (d_is_dir(a->src_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_SRC); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->dst_dentry) -+ && !d_is_dir(a->dst_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ if (a->dst_inode && d_is_dir(a->dst_dentry)) { -+ au_fset_ren(a->auren_flags, ISDIR_DST); -+ if (unlikely(!a->exchange -+ && d_really_is_positive(a->src_dentry) -+ && !d_is_dir(a->src_dentry))) -+ goto out_free; -+ lock_flags |= AuLock_DIRS; -+ } -+ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, -+ lock_flags); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = au_d_hashed_positive(a->src_dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ err = -ENOENT; -+ if (a->dst_inode) { -+ /* -+ * If it is a dir, VFS unhash it before this -+ * function. It means we cannot rely upon d_unhashed(). -+ */ -+ if (unlikely(!a->dst_inode->i_nlink)) -+ goto out_unlock; -+ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { -+ err = au_d_hashed_positive(a->dst_dentry); -+ if (unlikely(err && !a->exchange)) -+ goto out_unlock; -+ } else if (unlikely(IS_DEADDIR(a->dst_inode))) -+ goto out_unlock; -+ } else if (unlikely(d_unhashed(a->dst_dentry))) -+ goto out_unlock; -+ -+ /* -+ * is it possible? -+ * yes, it happened (in linux-3.3-rcN) but I don't know why. -+ * there may exist a problem somewhere else. -+ */ -+ err = -EINVAL; -+ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry))) -+ goto out_unlock; -+ -+ au_fset_ren(a->auren_flags, ISSAMEDIR); /* temporary */ -+ di_write_lock_parent(a->dst_parent); -+ -+ /* which branch we process */ -+ err = au_ren_wbr(a); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); -+ a->h_path.mnt = au_br_mnt(a->br); -+ -+ /* are they available to be renamed */ -+ err = au_ren_may_dir(a); -+ if (unlikely(err)) -+ goto out_children; -+ -+ /* prepare the writable parent dir on the same branch */ -+ if (a->dst_btop == a->btgt) { -+ au_fset_ren(a->auren_flags, WHDST); -+ } else { -+ err = au_cpup_dirs(a->dst_dentry, a->btgt); -+ if (unlikely(err)) -+ goto out_children; -+ } -+ -+ err = 0; -+ if (!a->exchange) { -+ if (a->src_dir != a->dst_dir) { -+ /* -+ * this temporary unlock is safe, -+ * because both dir->i_mutex are locked. -+ */ -+ di_write_unlock(a->dst_parent); -+ di_write_lock_parent(a->src_parent); -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ di_write_unlock(a->src_parent); -+ di_write_lock2_parent(a->src_parent, a->dst_parent, -+ /*isdir*/1); -+ au_fclr_ren(a->auren_flags, ISSAMEDIR); -+ } else -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->auren_flags, -+ ISDIR_SRC), -+ &a->btgt); -+ } -+ if (unlikely(err < 0)) -+ goto out_children; -+ if (err) -+ au_fset_ren(a->auren_flags, WHSRC); -+ -+ /* cpup src */ -+ if (a->src_btop != a->btgt) { -+ err = au_pin(&pin, a->src_dentry, a->btgt, -+ au_opt_udba(a->src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->src_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->src_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ AuDebugOn(au_dbtop(a->src_dentry) != a->src_btop); -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->src_btop = a->btgt; -+ a->src_h_dentry = au_h_dptr(a->src_dentry, a->btgt); -+ if (!a->exchange) -+ au_fset_ren(a->auren_flags, WHSRC); -+ } -+ -+ /* cpup dst */ -+ if (a->exchange && a->dst_inode -+ && a->dst_btop != a->btgt) { -+ err = au_pin(&pin, a->dst_dentry, a->btgt, -+ au_opt_udba(a->dst_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) { -+ struct au_cp_generic cpg = { -+ .dentry = a->dst_dentry, -+ .bdst = a->btgt, -+ .bsrc = a->dst_btop, -+ .len = -1, -+ .pin = &pin, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ err = au_sio_cpup_simple(&cpg); -+ au_unpin(&pin); -+ } -+ if (unlikely(err)) -+ goto out_children; -+ a->dst_btop = a->btgt; -+ a->dst_h_dentry = au_h_dptr(a->dst_dentry, a->btgt); -+ } -+ -+ /* lock them all */ -+ err = au_ren_lock(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_children; -+ -+ if (!a->exchange) { -+ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) -+ err = au_may_ren(a); -+ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ if (unlikely(err)) -+ goto out_hdir; -+ } -+ -+ /* store timestamps to be revertible */ -+ au_ren_dt(a); -+ -+ /* store dirren info */ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) { -+ err = au_dr_rename(a->src_dentry, a->btgt, -+ &a->dst_dentry->d_name, &rev); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out_dt; -+ } -+ -+ /* here we go */ -+ err = do_rename(a); -+ if (unlikely(err)) -+ goto out_dirren; -+ -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_fin(a->src_dentry, a->btgt, rev); -+ -+ /* update dir attributes */ -+ au_ren_refresh_dir(a); -+ -+ /* dput/iput all lower dentries */ -+ au_ren_refresh(a); -+ -+ goto out_hdir; /* success */ -+ -+out_dirren: -+ if (au_ftest_ren(a->auren_flags, DIRREN)) -+ au_dr_rename_rev(a->src_dentry, a->btgt, rev); -+out_dt: -+ au_ren_rev_dt(err, a); -+out_hdir: -+ au_ren_unlock(a); -+out_children: -+ au_nhash_wh_free(&a->whlist); -+ if (err && a->dst_inode && a->dst_btop != a->btgt) { -+ AuDbg("btop %d, btgt %d\n", a->dst_btop, a->btgt); -+ au_set_h_dptr(a->dst_dentry, a->btgt, NULL); -+ au_set_dbtop(a->dst_dentry, a->dst_btop); -+ } -+out_parent: -+ if (!err) { -+ if (d_unhashed(a->src_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_SRC); -+ if (d_unhashed(a->dst_dentry)) -+ au_fset_ren(a->auren_flags, DROPPED_DST); -+ if (!a->exchange) -+ d_move(a->src_dentry, a->dst_dentry); -+ else { -+ d_exchange(a->src_dentry, a->dst_dentry); -+ if (au_ftest_ren(a->auren_flags, DROPPED_DST)) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, DROPPED_SRC)) -+ d_drop(a->src_dentry); -+ } else { -+ au_update_dbtop(a->dst_dentry); -+ if (!a->dst_inode) -+ d_drop(a->dst_dentry); -+ } -+ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) -+ di_write_unlock(a->dst_parent); -+ else -+ di_write_unlock2(a->src_parent, a->dst_parent); -+out_unlock: -+ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); -+out_free: -+ iput(a->dst_inode); -+ if (a->thargs) -+ au_whtmp_rmdir_free(a->thargs); -+ au_kfree_rcu(a); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/Kconfig linux-5.15.37-aufs/fs/aufs/Kconfig ---- linux-5.15.37/fs/aufs/Kconfig 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/Kconfig 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,199 @@ -+# SPDX-License-Identifier: GPL-2.0 -+config AUFS_FS -+ bool "Aufs (Advanced multi layered unification filesystem) support" -+ help -+ Aufs is a stackable unification filesystem such as Unionfs, -+ which unifies several directories and provides a merged single -+ directory. -+ In the early days, aufs was entirely re-designed and -+ re-implemented Unionfs Version 1.x series. Introducing many -+ original ideas, approaches and improvements, it becomes totally -+ different from Unionfs while keeping the basic features. -+ -+if AUFS_FS -+choice -+ prompt "Maximum number of branches" -+ default AUFS_BRANCH_MAX_127 -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_127 -+ bool "127" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_511 -+ bool "511" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_1023 -+ bool "1023" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_32767 -+ bool "32767" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+endchoice -+ -+config AUFS_SBILIST -+ bool -+ depends on AUFS_MAGIC_SYSRQ || PROC_FS -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq or /proc, enabled automatically. -+ -+config AUFS_HNOTIFY -+ bool "Detect direct branch access (bypassing aufs)" -+ help -+ If you want to modify files on branches directly, eg. bypassing aufs, -+ and want aufs to detect the changes of them fully, then enable this -+ option and use 'udba=notify' mount option. -+ Currently there is only one available configuration, "fsnotify". -+ It will have a negative impact to the performance. -+ See detail in aufs.5. -+ -+choice -+ prompt "method" if AUFS_HNOTIFY -+ default AUFS_HFSNOTIFY -+config AUFS_HFSNOTIFY -+ bool "fsnotify" -+ select FSNOTIFY -+endchoice -+ -+config AUFS_EXPORT -+ bool "NFS-exportable aufs" -+ depends on EXPORTFS = y -+ help -+ If you want to export your mounted aufs via NFS, then enable this -+ option. There are several requirements for this configuration. -+ See detail in aufs.5. -+ -+config AUFS_INO_T_64 -+ bool -+ depends on AUFS_EXPORT -+ depends on 64BIT && !(ALPHA || S390) -+ default y -+ help -+ Automatic configuration for internal use. -+ /* typedef unsigned long/int __kernel_ino_t */ -+ /* alpha and s390x are int */ -+ -+config AUFS_XATTR -+ bool "support for XATTR/EA (including Security Labels)" -+ help -+ If your branch fs supports XATTR/EA and you want to make them -+ available in aufs too, then enable this opsion and specify the -+ branch attributes for EA. -+ See detail in aufs.5. -+ -+config AUFS_FHSM -+ bool "File-based Hierarchical Storage Management" -+ help -+ Hierarchical Storage Management (or HSM) is a well-known feature -+ in the storage world. Aufs provides this feature as file-based. -+ with multiple branches. -+ These multiple branches are prioritized, ie. the topmost one -+ should be the fastest drive and be used heavily. -+ -+config AUFS_RDU -+ bool "Readdir in userspace" -+ help -+ Aufs has two methods to provide a merged view for a directory, -+ by a user-space library and by kernel-space natively. The latter -+ is always enabled but sometimes large and slow. -+ If you enable this option, install the library in aufs2-util -+ package, and set some environment variables for your readdir(3), -+ then the work will be handled in user-space which generally -+ shows better performance in most cases. -+ See detail in aufs.5. -+ -+config AUFS_DIRREN -+ bool "Workaround for rename(2)-ing a directory" -+ help -+ By default, aufs returns EXDEV error in renameing a dir who has -+ his child on the lower branch, since it is a bad idea to issue -+ rename(2) internally for every lower branch. But user may not -+ accept this behaviour. So here is a workaround to allow such -+ rename(2) and store some extra infromation on the writable -+ branch. Obviously this costs high (and I don't like it). -+ To use this feature, you need to enable this configuration AND -+ to specify the mount option `dirren.' -+ See details in aufs.5 and the design documents. -+ -+config AUFS_SHWH -+ bool "Show whiteouts" -+ help -+ If you want to make the whiteouts in aufs visible, then enable -+ this option and specify 'shwh' mount option. Although it may -+ sounds like philosophy or something, but in technically it -+ simply shows the name of whiteout with keeping its behaviour. -+ -+config AUFS_BR_RAMFS -+ bool "Ramfs (initramfs/rootfs) as an aufs branch" -+ help -+ If you want to use ramfs as an aufs branch fs, then enable this -+ option. Generally tmpfs is recommended. -+ Aufs prohibited them to be a branch fs by default, because -+ initramfs becomes unusable after switch_root or something -+ generally. If you sets initramfs as an aufs branch and boot your -+ system by switch_root, you will meet a problem easily since the -+ files in initramfs may be inaccessible. -+ Unless you are going to use ramfs as an aufs branch fs without -+ switch_root or something, leave it N. -+ -+config AUFS_BR_FUSE -+ bool "Fuse fs as an aufs branch" -+ depends on FUSE_FS -+ select AUFS_POLL -+ help -+ If you want to use fuse-based userspace filesystem as an aufs -+ branch fs, then enable this option. -+ It implements the internal poll(2) operation which is -+ implemented by fuse only (curretnly). -+ -+config AUFS_POLL -+ bool -+ help -+ Automatic configuration for internal use. -+ -+config AUFS_BR_HFSPLUS -+ bool "Hfsplus as an aufs branch" -+ depends on HFSPLUS_FS -+ default y -+ help -+ If you want to use hfsplus fs as an aufs branch fs, then enable -+ this option. This option introduces a small overhead at -+ copying-up a file on hfsplus. -+ -+config AUFS_BDEV_LOOP -+ bool -+ depends on BLK_DEV_LOOP -+ default y -+ help -+ Automatic configuration for internal use. -+ Convert =[ym] into =y. -+ -+config AUFS_DEBUG -+ bool "Debug aufs" -+ help -+ Enable this to compile aufs internal debug code. -+ It will have a negative impact to the performance. -+ -+config AUFS_MAGIC_SYSRQ -+ bool -+ depends on AUFS_DEBUG && MAGIC_SYSRQ -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq, enabled automatically. -+endif -diff -Nurp linux-5.15.37/fs/aufs/lcnt.h linux-5.15.37-aufs/fs/aufs/lcnt.h ---- linux-5.15.37/fs/aufs/lcnt.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/lcnt.h 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,173 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2018-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * simple long counter wrapper -+ */ -+ -+#ifndef __AUFS_LCNT_H__ -+#define __AUFS_LCNT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+#define AuLCntATOMIC 1 -+#define AuLCntPCPUCNT 2 -+/* -+ * why does percpu_refcount require extra synchronize_rcu()s in -+ * au_br_do_free() -+ */ -+#define AuLCntPCPUREF 3 -+ -+/* #define AuLCntChosen AuLCntATOMIC */ -+#define AuLCntChosen AuLCntPCPUCNT -+/* #define AuLCntChosen AuLCntPCPUREF */ -+ -+#if AuLCntChosen == AuLCntATOMIC -+#include -+ -+typedef atomic_long_t au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ atomic_long_set(cnt, 0); -+ return 0; -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt __maybe_unused, -+ int do_sync __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ atomic_long_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ atomic_long_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ return atomic_long_read(cnt); -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUCNT -+#include -+ -+typedef struct percpu_counter au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) -+{ -+ return percpu_counter_init(cnt, 0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ /* empty */ -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync __maybe_unused) -+{ -+ percpu_counter_destroy(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_counter_inc(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_counter_dec(cnt); -+} -+ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) -+{ -+ s64 n; -+ -+ n = percpu_counter_sum(cnt); -+ BUG_ON(n < 0); -+ if (LONG_MAX != LLONG_MAX -+ && n > LONG_MAX) -+ AuWarn1("%s\n", "wrap-around"); -+ -+ return n; -+} -+#endif -+ -+#if AuLCntChosen == AuLCntPCPUREF -+#include -+ -+typedef struct percpu_ref au_lcnt_t; -+ -+static inline int au_lcnt_init(au_lcnt_t *cnt, percpu_ref_func_t *release) -+{ -+ if (!release) -+ release = percpu_ref_exit; -+ return percpu_ref_init(cnt, release, /*percpu mode*/0, GFP_NOFS); -+} -+ -+static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) -+{ -+ synchronize_rcu(); -+} -+ -+static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync) -+{ -+ percpu_ref_kill(cnt); -+ if (do_sync) -+ au_lcnt_wait_for_fin(cnt); -+} -+ -+static inline void au_lcnt_inc(au_lcnt_t *cnt) -+{ -+ percpu_ref_get(cnt); -+} -+ -+static inline void au_lcnt_dec(au_lcnt_t *cnt) -+{ -+ percpu_ref_put(cnt); -+} -+ -+/* -+ * avoid calling this func as possible. -+ */ -+static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev) -+{ -+ long l; -+ -+ percpu_ref_switch_to_atomic_sync(cnt); -+ l = atomic_long_read(&cnt->count); -+ if (do_rev) -+ percpu_ref_switch_to_percpu(cnt); -+ -+ /* percpu_ref is initialized by 1 instead of 0 */ -+ return l - 1; -+} -+#endif -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuLCntZero(val) do { \ -+ long l = val; \ -+ if (l) \ -+ AuDbg("%s = %ld\n", #val, l); \ -+} while (0) -+#else -+#define AuLCntZero(val) do {} while (0) -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LCNT_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/loop.c linux-5.15.37-aufs/fs/aufs/loop.c ---- linux-5.15.37/fs/aufs/loop.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/loop.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,135 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * support for loopback block device as a branch -+ */ -+ -+#include "aufs.h" -+ -+/* added into drivers/block/loop.c */ -+static struct file *(*backing_file_func)(struct super_block *sb); -+ -+/* -+ * test if two lower dentries have overlapping branches. -+ */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding) -+{ -+ struct super_block *h_sb; -+ struct file *backing_file; -+ -+ if (unlikely(!backing_file_func)) { -+ /* don't load "loop" module here */ -+ backing_file_func = symbol_get(loop_backing_file); -+ if (unlikely(!backing_file_func)) -+ /* "loop" module is not loaded */ -+ return 0; -+ } -+ -+ h_sb = h_adding->d_sb; -+ backing_file = backing_file_func(h_sb); -+ if (!backing_file) -+ return 0; -+ -+ h_adding = backing_file->f_path.dentry; -+ /* -+ * h_adding can be local NFS. -+ * in this case aufs cannot detect the loop. -+ */ -+ if (unlikely(h_adding->d_sb == sb)) -+ return 1; -+ return !!au_test_subdir(h_adding, sb->s_root); -+} -+ -+/* true if a kernel thread named 'loop[0-9].*' accesses a file */ -+int au_test_loopback_kthread(void) -+{ -+ int ret; -+ struct task_struct *tsk = current; -+ char c, comm[sizeof(tsk->comm)]; -+ -+ ret = 0; -+ if (tsk->flags & PF_KTHREAD) { -+ get_task_comm(comm, tsk); -+ c = comm[4]; -+ ret = ('0' <= c && c <= '9' -+ && !strncmp(comm, "loop", 4)); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define au_warn_loopback_step 16 -+static int au_warn_loopback_nelem = au_warn_loopback_step; -+static unsigned long *au_warn_loopback_array; -+ -+void au_warn_loopback(struct super_block *h_sb) -+{ -+ int i, new_nelem; -+ unsigned long *a, magic; -+ static DEFINE_SPINLOCK(spin); -+ -+ magic = h_sb->s_magic; -+ spin_lock(&spin); -+ a = au_warn_loopback_array; -+ for (i = 0; i < au_warn_loopback_nelem && *a; i++) -+ if (a[i] == magic) { -+ spin_unlock(&spin); -+ return; -+ } -+ -+ /* h_sb is new to us, print it */ -+ if (i < au_warn_loopback_nelem) { -+ a[i] = magic; -+ goto pr; -+ } -+ -+ /* expand the array */ -+ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; -+ a = au_kzrealloc(au_warn_loopback_array, -+ au_warn_loopback_nelem * sizeof(unsigned long), -+ new_nelem * sizeof(unsigned long), GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (a) { -+ au_warn_loopback_nelem = new_nelem; -+ au_warn_loopback_array = a; -+ a[i] = magic; -+ goto pr; -+ } -+ -+ spin_unlock(&spin); -+ AuWarn1("realloc failed, ignored\n"); -+ return; -+ -+pr: -+ spin_unlock(&spin); -+ pr_warn("you may want to try another patch for loopback file " -+ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); -+} -+ -+int au_loopback_init(void) -+{ -+ int err; -+ struct super_block *sb __maybe_unused; -+ -+ BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(*au_warn_loopback_array)); -+ -+ err = 0; -+ au_warn_loopback_array = kcalloc(au_warn_loopback_step, -+ sizeof(unsigned long), GFP_NOFS); -+ if (unlikely(!au_warn_loopback_array)) -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+void au_loopback_fin(void) -+{ -+ if (backing_file_func) -+ symbol_put(loop_backing_file); -+ au_kfree_try_rcu(au_warn_loopback_array); -+} -diff -Nurp linux-5.15.37/fs/aufs/loop.h linux-5.15.37-aufs/fs/aufs/loop.h ---- linux-5.15.37/fs/aufs/loop.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/loop.h 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,42 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * support for loopback mount as a branch -+ */ -+ -+#ifndef __AUFS_LOOP_H__ -+#define __AUFS_LOOP_H__ -+ -+#ifdef __KERNEL__ -+ -+struct dentry; -+struct super_block; -+ -+#ifdef CONFIG_AUFS_BDEV_LOOP -+/* drivers/block/loop.c */ -+struct file *loop_backing_file(struct super_block *sb); -+ -+/* loop.c */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding); -+int au_test_loopback_kthread(void); -+void au_warn_loopback(struct super_block *h_sb); -+ -+int au_loopback_init(void); -+void au_loopback_fin(void); -+#else -+AuStub(struct file *, loop_backing_file, return NULL, struct super_block *sb) -+ -+AuStubInt0(au_test_loopback_overlap, struct super_block *sb, -+ struct dentry *h_adding) -+AuStubInt0(au_test_loopback_kthread, void) -+AuStubVoid(au_warn_loopback, struct super_block *h_sb) -+ -+AuStubInt0(au_loopback_init, void) -+AuStubVoid(au_loopback_fin, void) -+#endif /* BLK_DEV_LOOP */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LOOP_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/magic.mk linux-5.15.37-aufs/fs/aufs/magic.mk ---- linux-5.15.37/fs/aufs/magic.mk 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/magic.mk 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,31 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+# defined in ${srctree}/fs/fuse/inode.c -+# tristate -+ifdef CONFIG_FUSE_FS -+ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 -+endif -+ -+# defined in ${srctree}/fs/xfs/xfs_sb.h -+# tristate -+ifdef CONFIG_XFS_FS -+ccflags-y += -DXFS_SB_MAGIC=0x58465342 -+endif -+ -+# defined in ${srctree}/fs/configfs/mount.c -+# tristate -+ifdef CONFIG_CONFIGFS_FS -+ccflags-y += -DCONFIGFS_MAGIC=0x62656570 -+endif -+ -+# defined in ${srctree}/fs/ubifs/ubifs.h -+# tristate -+ifdef CONFIG_UBIFS_FS -+ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 -+endif -+ -+# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h -+# tristate -+ifdef CONFIG_HFSPLUS_FS -+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b -+endif -diff -Nurp linux-5.15.37/fs/aufs/Makefile linux-5.15.37-aufs/fs/aufs/Makefile ---- linux-5.15.37/fs/aufs/Makefile 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/Makefile 2022-04-08 20:22:30.611616426 +0300 -@@ -0,0 +1,39 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+include ${srctree}/${src}/magic.mk -+-include ${srctree}/${src}/priv_def.mk -+ -+# cf. include/linux/kernel.h -+# enable pr_debug -+ccflags-y += -DDEBUG -+# sparse requires the full pathname -+ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h -+ -+obj-$(CONFIG_AUFS_FS) += aufs.o -+aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o fsctx.o \ -+ wkq.o vfsub.o dcsub.o \ -+ cpup.o whout.o wbr_policy.o \ -+ dinfo.o dentry.o \ -+ dynop.o \ -+ finfo.o file.o f_op.o \ -+ dir.o vdir.o \ -+ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ -+ mvdown.o ioctl.o -+ -+# all are boolean -+aufs-$(CONFIG_PROC_FS) += procfs.o plink.o -+aufs-$(CONFIG_SYSFS) += sysfs.o -+aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o -+aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o -+aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o -+aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o -+aufs-$(CONFIG_AUFS_EXPORT) += export.o -+aufs-$(CONFIG_AUFS_XATTR) += xattr.o -+aufs-$(CONFIG_FS_POSIX_ACL) += posix_acl.o -+aufs-$(CONFIG_AUFS_DIRREN) += dirren.o -+aufs-$(CONFIG_AUFS_FHSM) += fhsm.o -+aufs-$(CONFIG_AUFS_POLL) += poll.o -+aufs-$(CONFIG_AUFS_RDU) += rdu.o -+aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o -+aufs-$(CONFIG_AUFS_DEBUG) += debug.o -+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff -Nurp linux-5.15.37/fs/aufs/module.c linux-5.15.37-aufs/fs/aufs/module.c ---- linux-5.15.37/fs/aufs/module.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/module.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,259 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * module global variables and operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* shrinkable realloc */ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink) -+{ -+ size_t sz; -+ int diff; -+ -+ sz = 0; -+ diff = -1; -+ if (p) { -+#if 0 /* unused */ -+ if (!new_sz) { -+ au_kfree_rcu(p); -+ p = NULL; -+ goto out; -+ } -+#else -+ AuDebugOn(!new_sz); -+#endif -+ sz = ksize(p); -+ diff = au_kmidx_sub(sz, new_sz); -+ } -+ if (sz && !diff) -+ goto out; -+ -+ if (sz < new_sz) -+ /* expand or SLOB */ -+ p = krealloc(p, new_sz, gfp); -+ else if (new_sz < sz && may_shrink) { -+ /* shrink */ -+ void *q; -+ -+ q = kmalloc(new_sz, gfp); -+ if (q) { -+ if (p) { -+ memcpy(q, p, new_sz); -+ au_kfree_try_rcu(p); -+ } -+ p = q; -+ } else -+ p = NULL; -+ } -+ -+out: -+ return p; -+} -+ -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink) -+{ -+ p = au_krealloc(p, new_sz, gfp, may_shrink); -+ if (p && new_sz > nused) -+ memset(p + nused, 0, new_sz - nused); -+ return p; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * aufs caches -+ */ -+struct kmem_cache *au_cache[AuCache_Last]; -+ -+static void au_cache_fin(void) -+{ -+ int i; -+ -+ /* -+ * Make sure all delayed rcu free inodes are flushed before we -+ * destroy cache. -+ */ -+ rcu_barrier(); -+ -+ /* excluding AuCache_HNOTIFY */ -+ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last); -+ for (i = 0; i < AuCache_HNOTIFY; i++) { -+ kmem_cache_destroy(au_cache[i]); -+ au_cache[i] = NULL; -+ } -+} -+ -+static int __init au_cache_init(void) -+{ -+ au_cache[AuCache_DINFO] = AuCacheCtor(au_dinfo, au_di_init_once); -+ if (au_cache[AuCache_DINFO]) -+ /* SLAB_DESTROY_BY_RCU */ -+ au_cache[AuCache_ICNTNR] = AuCacheCtor(au_icntnr, -+ au_icntnr_init_once); -+ if (au_cache[AuCache_ICNTNR]) -+ au_cache[AuCache_FINFO] = AuCacheCtor(au_finfo, -+ au_fi_init_once); -+ if (au_cache[AuCache_FINFO]) -+ au_cache[AuCache_VDIR] = AuCache(au_vdir); -+ if (au_cache[AuCache_VDIR]) -+ au_cache[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); -+ if (au_cache[AuCache_DEHSTR]) -+ return 0; -+ -+ au_cache_fin(); -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dir_roflags; -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* -+ * iterate_supers_type() doesn't protect us from -+ * remounting (branch management) -+ */ -+struct hlist_bl_head au_sbilist; -+#endif -+ -+/* -+ * functions for module interface. -+ */ -+MODULE_LICENSE("GPL"); -+/* MODULE_LICENSE("GPL v2"); */ -+MODULE_AUTHOR("Junjiro R. Okajima "); -+MODULE_DESCRIPTION(AUFS_NAME -+ " -- Advanced multi layered unification filesystem"); -+MODULE_VERSION(AUFS_VERSION); -+ -+/* this module parameter has no meaning when SYSFS is disabled */ -+int sysaufs_brs = 1; -+MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); -+module_param_named(brs, sysaufs_brs, int, 0444); -+ -+/* this module parameter has no meaning when USER_NS is disabled */ -+bool au_userns; -+MODULE_PARM_DESC(allow_userns, "allow unprivileged to mount under userns"); -+module_param_named(allow_userns, au_userns, bool, 0444); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ -+ -+int au_seq_path(struct seq_file *seq, struct path *path) -+{ -+ int err; -+ -+ err = seq_path(seq, path, au_esc_chars); -+ if (err >= 0) -+ err = 0; -+ else -+ err = -ENOMEM; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init aufs_init(void) -+{ -+ int err, i; -+ char *p; -+ -+ p = au_esc_chars; -+ for (i = 1; i <= ' '; i++) -+ *p++ = i; -+ *p++ = '\\'; -+ *p++ = '\x7f'; -+ *p = 0; -+ -+ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); -+ -+ memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop)); -+ for (i = 0; i < AuIop_Last; i++) -+ aufs_iop_nogetattr[i].getattr = NULL; -+ -+ memset(au_cache, 0, sizeof(au_cache)); /* including hnotify */ -+ -+ au_sbilist_init(); -+ sysaufs_brs_init(); -+ au_debug_init(); -+ au_dy_init(); -+ err = sysaufs_init(); -+ if (unlikely(err)) -+ goto out; -+ err = dbgaufs_init(); -+ if (unlikely(err)) -+ goto out_sysaufs; -+ err = au_procfs_init(); -+ if (unlikely(err)) -+ goto out_dbgaufs; -+ err = au_wkq_init(); -+ if (unlikely(err)) -+ goto out_procfs; -+ err = au_loopback_init(); -+ if (unlikely(err)) -+ goto out_wkq; -+ err = au_hnotify_init(); -+ if (unlikely(err)) -+ goto out_loopback; -+ err = au_sysrq_init(); -+ if (unlikely(err)) -+ goto out_hin; -+ err = au_cache_init(); -+ if (unlikely(err)) -+ goto out_sysrq; -+ -+ aufs_fs_type.fs_flags |= au_userns ? FS_USERNS_MOUNT : 0; -+ err = register_filesystem(&aufs_fs_type); -+ if (unlikely(err)) -+ goto out_cache; -+ -+ /* since we define pr_fmt, call printk directly */ -+ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); -+ goto out; /* success */ -+ -+out_cache: -+ au_cache_fin(); -+out_sysrq: -+ au_sysrq_fin(); -+out_hin: -+ au_hnotify_fin(); -+out_loopback: -+ au_loopback_fin(); -+out_wkq: -+ au_wkq_fin(); -+out_procfs: -+ au_procfs_fin(); -+out_dbgaufs: -+ dbgaufs_fin(); -+out_sysaufs: -+ sysaufs_fin(); -+ au_dy_fin(); -+out: -+ return err; -+} -+ -+static void __exit aufs_exit(void) -+{ -+ unregister_filesystem(&aufs_fs_type); -+ au_cache_fin(); -+ au_sysrq_fin(); -+ au_hnotify_fin(); -+ au_loopback_fin(); -+ au_wkq_fin(); -+ au_procfs_fin(); -+ dbgaufs_fin(); -+ sysaufs_fin(); -+ au_dy_fin(); -+} -+ -+module_init(aufs_init); -+module_exit(aufs_exit); -diff -Nurp linux-5.15.37/fs/aufs/module.h linux-5.15.37-aufs/fs/aufs/module.h ---- linux-5.15.37/fs/aufs/module.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/module.h 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,153 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * module initialization and module-global -+ */ -+ -+#ifndef __AUFS_MODULE_H__ -+#define __AUFS_MODULE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "debug.h" -+#include "dentry.h" -+#include "dir.h" -+#include "file.h" -+#include "inode.h" -+ -+struct path; -+struct seq_file; -+ -+/* module parameters */ -+extern int sysaufs_brs; -+extern bool au_userns; -+ -+/* ---------------------------------------------------------------------- */ -+ -+extern int au_dir_roflags; -+ -+void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink); -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, -+ int may_shrink); -+ -+/* -+ * Comparing the size of the object with sizeof(struct rcu_head) -+ * case 1: object is always larger -+ * --> au_kfree_rcu() or au_kfree_do_rcu() -+ * case 2: object is always smaller -+ * --> au_kfree_small() -+ * case 3: object can be any size -+ * --> au_kfree_try_rcu() -+ */ -+ -+static inline void au_kfree_do_rcu(const void *p) -+{ -+ struct { -+ struct rcu_head rcu; -+ } *a = (void *)p; -+ -+ kfree_rcu(a, rcu); -+} -+ -+#define au_kfree_rcu(_p) do { \ -+ typeof(_p) p = (_p); \ -+ BUILD_BUG_ON(sizeof(*p) < sizeof(struct rcu_head)); \ -+ if (p) \ -+ au_kfree_do_rcu(p); \ -+ } while (0) -+ -+#define au_kfree_do_sz_test(sz) (sz >= sizeof(struct rcu_head)) -+#define au_kfree_sz_test(p) (p && au_kfree_do_sz_test(ksize(p))) -+ -+static inline void au_kfree_try_rcu(const void *p) -+{ -+ if (!p) -+ return; -+ if (au_kfree_sz_test(p)) -+ au_kfree_do_rcu(p); -+ else -+ kfree(p); -+} -+ -+static inline void au_kfree_small(const void *p) -+{ -+ if (!p) -+ return; -+ AuDebugOn(au_kfree_sz_test(p)); -+ kfree(p); -+} -+ -+static inline int au_kmidx_sub(size_t sz, size_t new_sz) -+{ -+#ifndef CONFIG_SLOB -+ return __kmalloc_index(sz, false) - __kmalloc_index(new_sz, false); -+#else -+ return -1; /* SLOB is untested */ -+#endif -+} -+ -+int au_seq_path(struct seq_file *seq, struct path *path); -+ -+#ifdef CONFIG_PROC_FS -+/* procfs.c */ -+int __init au_procfs_init(void); -+void au_procfs_fin(void); -+#else -+AuStubInt0(au_procfs_init, void); -+AuStubVoid(au_procfs_fin, void); -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* kmem cache */ -+enum { -+ AuCache_DINFO, -+ AuCache_ICNTNR, -+ AuCache_FINFO, -+ AuCache_VDIR, -+ AuCache_DEHSTR, -+ AuCache_HNOTIFY, /* must be last */ -+ AuCache_Last -+}; -+ -+extern struct kmem_cache *au_cache[AuCache_Last]; -+ -+#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) -+#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) -+#define AuCacheCtor(type, ctor) \ -+ kmem_cache_create(#type, sizeof(struct type), \ -+ __alignof__(struct type), AuCacheFlags, ctor) -+ -+#define AuCacheFuncs(name, index) \ -+ static inline struct au_##name *au_cache_alloc_##name(void) \ -+ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ -+ static inline void au_cache_free_##name##_norcu(struct au_##name *p) \ -+ { kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ \ -+ static inline void au_cache_free_##name##_rcu_cb(struct rcu_head *rcu) \ -+ { void *p = rcu; \ -+ p -= offsetof(struct au_##name, rcu); \ -+ kmem_cache_free(au_cache[AuCache_##index], p); } \ -+ static inline void au_cache_free_##name##_rcu(struct au_##name *p) \ -+ { BUILD_BUG_ON(sizeof(struct au_##name) < sizeof(struct rcu_head)); \ -+ call_rcu(&p->rcu, au_cache_free_##name##_rcu_cb); } \ -+ \ -+ static inline void au_cache_free_##name(struct au_##name *p) \ -+ { /* au_cache_free_##name##_norcu(p); */ \ -+ au_cache_free_##name##_rcu(p); } -+ -+AuCacheFuncs(dinfo, DINFO); -+AuCacheFuncs(icntnr, ICNTNR); -+AuCacheFuncs(finfo, FINFO); -+AuCacheFuncs(vdir, VDIR); -+AuCacheFuncs(vdir_dehstr, DEHSTR); -+#ifdef CONFIG_AUFS_HNOTIFY -+AuCacheFuncs(hnotify, HNOTIFY); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_MODULE_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/mvdown.c linux-5.15.37-aufs/fs/aufs/mvdown.c ---- linux-5.15.37/fs/aufs/mvdown.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/mvdown.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,693 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2011-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * move-down, opposite of copy-up -+ */ -+ -+#include "aufs.h" -+ -+struct au_mvd_args { -+ struct { -+ struct super_block *h_sb; -+ struct dentry *h_parent; -+ struct au_hinode *hdir; -+ struct inode *h_dir, *h_inode; -+ struct au_pin pin; -+ } info[AUFS_MVDOWN_NARRAY]; -+ -+ struct aufs_mvdown mvdown; -+ struct dentry *dentry, *parent; -+ struct inode *inode, *dir; -+ struct super_block *sb; -+ aufs_bindex_t bopq, bwh, bfound; -+ unsigned char rename_lock; -+}; -+ -+#define mvd_errno mvdown.au_errno -+#define mvd_bsrc mvdown.stbr[AUFS_MVDOWN_UPPER].bindex -+#define mvd_src_brid mvdown.stbr[AUFS_MVDOWN_UPPER].brid -+#define mvd_bdst mvdown.stbr[AUFS_MVDOWN_LOWER].bindex -+#define mvd_dst_brid mvdown.stbr[AUFS_MVDOWN_LOWER].brid -+ -+#define mvd_h_src_sb info[AUFS_MVDOWN_UPPER].h_sb -+#define mvd_h_src_parent info[AUFS_MVDOWN_UPPER].h_parent -+#define mvd_hdir_src info[AUFS_MVDOWN_UPPER].hdir -+#define mvd_h_src_dir info[AUFS_MVDOWN_UPPER].h_dir -+#define mvd_h_src_inode info[AUFS_MVDOWN_UPPER].h_inode -+#define mvd_pin_src info[AUFS_MVDOWN_UPPER].pin -+ -+#define mvd_h_dst_sb info[AUFS_MVDOWN_LOWER].h_sb -+#define mvd_h_dst_parent info[AUFS_MVDOWN_LOWER].h_parent -+#define mvd_hdir_dst info[AUFS_MVDOWN_LOWER].hdir -+#define mvd_h_dst_dir info[AUFS_MVDOWN_LOWER].h_dir -+#define mvd_h_dst_inode info[AUFS_MVDOWN_LOWER].h_inode -+#define mvd_pin_dst info[AUFS_MVDOWN_LOWER].pin -+ -+#define AU_MVD_PR(flag, ...) do { \ -+ if (flag) \ -+ pr_err(__VA_ARGS__); \ -+ } while (0) -+ -+static int find_lower_writable(struct au_mvd_args *a) -+{ -+ struct super_block *sb; -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ sb = a->sb; -+ bindex = a->mvd_bsrc; -+ bbot = au_sbbot(sb); -+ if (a->mvdown.flags & AUFS_MVDOWN_FHSM_LOWER) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm) -+ && !sb_rdonly(au_br_sb(br))) -+ return bindex; -+ } -+ else if (!(a->mvdown.flags & AUFS_MVDOWN_ROLOWER)) -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br)) -+ return bindex; -+ } -+ else -+ for (bindex++; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!sb_rdonly(au_br_sb(br))) { -+ if (au_br_rdonly(br)) -+ a->mvdown.flags -+ |= AUFS_MVDOWN_ROLOWER_R; -+ return bindex; -+ } -+ } -+ -+ return -1; -+} -+ -+/* make the parent dir on bdst */ -+static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc); -+ a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst); -+ a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc); -+ a->mvd_h_dst_parent = NULL; -+ if (au_dbbot(a->parent) >= a->mvd_bdst) -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ if (!a->mvd_h_dst_parent) { -+ err = au_cpdown_dirs(a->dentry, a->mvd_bdst); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "cpdown_dirs failed\n"); -+ goto out; -+ } -+ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* lock them all */ -+static int au_do_lock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct dentry *h_trap; -+ -+ a->mvd_h_src_sb = au_sbr_sb(a->sb, a->mvd_bsrc); -+ a->mvd_h_dst_sb = au_sbr_sb(a->sb, a->mvd_bdst); -+ err = au_pin(&a->mvd_pin_dst, a->dentry, a->mvd_bdst, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_dst failed\n"); -+ goto out; -+ } -+ -+ if (a->mvd_h_src_sb != a->mvd_h_dst_sb) { -+ a->rename_lock = 0; -+ au_pin_init(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ AuLsc_DI_PARENT, AuLsc_I_PARENT3, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ err = au_do_pin(&a->mvd_pin_src); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ } -+ -+ a->rename_lock = 1; -+ au_pin_hdir_unlock(&a->mvd_pin_dst); -+ err = au_pin(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, -+ au_opt_udba(a->sb), -+ AuPin_MNT_WRITE | AuPin_DI_LOCKED); -+ AuTraceErr(err); -+ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); -+ if (unlikely(err)) { -+ AU_MVD_PR(dmsg, "pin_src failed\n"); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ au_pin_hdir_unlock(&a->mvd_pin_src); -+ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ if (h_trap) { -+ err = (h_trap != a->mvd_h_src_parent); -+ if (err) -+ err = (h_trap != a->mvd_h_dst_parent); -+ } -+ BUG_ON(err); /* it should never happen */ -+ if (unlikely(a->mvd_h_src_dir != au_pinned_h_dir(&a->mvd_pin_src))) { -+ err = -EBUSY; -+ AuTraceErr(err); -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ goto out_dst; -+ } -+ goto out; /* success */ -+ -+out_dst: -+ au_unpin(&a->mvd_pin_dst); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_do_unlock(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ if (!a->rename_lock) -+ au_unpin(&a->mvd_pin_src); -+ else { -+ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, -+ a->mvd_h_dst_parent, a->mvd_hdir_dst); -+ au_pin_hdir_lock(&a->mvd_pin_src); -+ au_unpin(&a->mvd_pin_src); -+ au_pin_hdir_lock(&a->mvd_pin_dst); -+ } -+ au_unpin(&a->mvd_pin_dst); -+} -+ -+/* copy-down the file */ -+static int au_do_cpdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_cp_generic cpg = { -+ .dentry = a->dentry, -+ .bdst = a->mvd_bdst, -+ .bsrc = a->mvd_bsrc, -+ .len = -1, -+ .pin = &a->mvd_pin_dst, -+ .flags = AuCpup_DTIME | AuCpup_HOPEN -+ }; -+ -+ AuDbg("b%d, b%d\n", cpg.bsrc, cpg.bdst); -+ if (a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ au_fset_cpup(cpg.flags, OVERWRITE); -+ if (a->mvdown.flags & AUFS_MVDOWN_ROLOWER) -+ au_fset_cpup(cpg.flags, RWDST); -+ err = au_sio_cpdown_simple(&cpg); -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "cpdown failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the whiteout on bdst if exist which may be created by UDBA while we -+ * were sleeping -+ */ -+static int au_do_unlink_wh(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ struct inode *delegated; -+ -+ br = au_sbr(a->sb, a->mvd_bdst); -+ h_path.dentry = au_wh_lkup(a->mvd_h_dst_parent, &a->dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) { -+ AU_MVD_PR(dmsg, "wh_lkup failed\n"); -+ goto out; -+ } -+ -+ err = 0; -+ if (d_is_positive(h_path.dentry)) { -+ h_path.mnt = au_br_mnt(br); -+ delegated = NULL; -+ err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path, -+ &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "wh_unlink failed\n"); -+ } -+ dput(h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * unlink the topmost h_dentry -+ */ -+static int au_do_unlink(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct path h_path; -+ struct inode *delegated; -+ -+ h_path.mnt = au_sbr_mnt(a->sb, a->mvd_bsrc); -+ h_path.dentry = au_h_dptr(a->dentry, a->mvd_bsrc); -+ delegated = NULL; -+ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) -+ AU_MVD_PR(dmsg, "unlink failed\n"); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* Since mvdown succeeded, we ignore an error of this function */ -+static void au_do_stfs(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ a->mvdown.flags |= AUFS_MVDOWN_STFS_FAILED; -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_UPPER].stfs); -+ if (!err) { -+ br = au_sbr(a->sb, a->mvd_bdst); -+ a->mvdown.stbr[AUFS_MVDOWN_LOWER].brid = br->br_id; -+ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_LOWER].stfs); -+ } -+ if (!err) -+ a->mvdown.flags &= ~AUFS_MVDOWN_STFS_FAILED; -+ else -+ AU_MVD_PR(dmsg, "statfs failed (%d), ignored\n", err); -+} -+ -+/* -+ * copy-down the file and unlink the bsrc file. -+ * - unlink the bdst whout if exist -+ * - copy-down the file (with whtmp name and rename) -+ * - unlink the bsrc file -+ */ -+static int au_do_mvdown(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = au_do_mkdir(dmsg, a); -+ if (!err) -+ err = au_do_lock(dmsg, a); -+ if (unlikely(err)) -+ goto out; -+ -+ /* -+ * do not revert the activities we made on bdst since they should be -+ * harmless in aufs. -+ */ -+ -+ err = au_do_cpdown(dmsg, a); -+ if (!err) -+ err = au_do_unlink_wh(dmsg, a); -+ if (!err && !(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ err = au_do_unlink(dmsg, a); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ AuDbg("%pd2, 0x%x, %d --> %d\n", -+ a->dentry, a->mvdown.flags, a->mvd_bsrc, a->mvd_bdst); -+ if (find_lower_writable(a) < 0) -+ a->mvdown.flags |= AUFS_MVDOWN_BOTTOM; -+ -+ if (a->mvdown.flags & AUFS_MVDOWN_STFS) -+ au_do_stfs(dmsg, a); -+ -+ /* maintain internal array */ -+ if (!(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) { -+ au_set_h_dptr(a->dentry, a->mvd_bsrc, NULL); -+ au_set_dbtop(a->dentry, a->mvd_bdst); -+ au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0); -+ au_set_ibtop(a->inode, a->mvd_bdst); -+ } else { -+ /* hide the lower */ -+ au_set_h_dptr(a->dentry, a->mvd_bdst, NULL); -+ au_set_dbbot(a->dentry, a->mvd_bsrc); -+ au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0); -+ au_set_ibbot(a->inode, a->mvd_bsrc); -+ } -+ if (au_dbbot(a->dentry) < a->mvd_bdst) -+ au_set_dbbot(a->dentry, a->mvd_bdst); -+ if (au_ibbot(a->inode) < a->mvd_bdst) -+ au_set_ibbot(a->inode, a->mvd_bdst); -+ -+out_unlock: -+ au_do_unlock(dmsg, a); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* make sure the file is idle */ -+static int au_mvd_args_busy(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err, plinked; -+ -+ err = 0; -+ plinked = !!au_opt_test(au_mntflags(a->sb), PLINK); -+ if (au_dbtop(a->dentry) == a->mvd_bsrc -+ && au_dcount(a->dentry) == 1 -+ && atomic_read(&a->inode->i_count) == 1 -+ /* && a->mvd_h_src_inode->i_nlink == 1 */ -+ && (!plinked || !au_plink_test(a->inode)) -+ && a->inode->i_nlink == 1) -+ goto out; -+ -+ err = -EBUSY; -+ AU_MVD_PR(dmsg, -+ "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", -+ a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), -+ atomic_read(&a->inode->i_count), a->inode->i_nlink, -+ a->mvd_h_src_inode->i_nlink, -+ plinked, plinked ? au_plink_test(a->inode) : 0); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* make sure the parent dir is fine */ -+static int au_mvd_args_parent(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ if (unlikely(au_alive_dir(a->parent))) { -+ err = -ENOENT; -+ AU_MVD_PR(dmsg, "parent dir is dead\n"); -+ goto out; -+ } -+ -+ a->bopq = au_dbdiropq(a->parent); -+ bindex = au_wbr_nonopq(a->dentry, a->mvd_bdst); -+ AuDbg("b%d\n", bindex); -+ if (unlikely((bindex >= 0 && bindex < a->mvd_bdst) -+ || (a->bopq != -1 && a->bopq < a->mvd_bdst))) { -+ err = -EINVAL; -+ a->mvd_errno = EAU_MVDOWN_OPAQUE; -+ AU_MVD_PR(dmsg, "ancestor is opaque b%d, b%d\n", -+ a->bopq, a->mvd_bdst); -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_intermediate(const unsigned char dmsg, -+ struct au_mvd_args *a) -+{ -+ int err; -+ struct au_dinfo *dinfo, *tmp; -+ -+ /* lookup the next lower positive entry */ -+ err = -ENOMEM; -+ tmp = au_di_alloc(a->sb, AuLsc_DI_TMP); -+ if (unlikely(!tmp)) -+ goto out; -+ -+ a->bfound = -1; -+ a->bwh = -1; -+ dinfo = au_di(a->dentry); -+ au_di_cp(tmp, dinfo); -+ au_di_swap(tmp, dinfo); -+ -+ /* returns the number of positive dentries */ -+ err = au_lkup_dentry(a->dentry, a->mvd_bsrc + 1, -+ /* AuLkup_IGNORE_PERM */ 0); -+ if (!err) -+ a->bwh = au_dbwh(a->dentry); -+ else if (err > 0) -+ a->bfound = au_dbtop(a->dentry); -+ -+ au_di_swap(tmp, dinfo); -+ au_rw_write_unlock(&tmp->di_rwsem); -+ au_di_free(tmp); -+ if (unlikely(err < 0)) -+ AU_MVD_PR(dmsg, "failed look-up lower\n"); -+ -+ /* -+ * here, we have these cases. -+ * bfound == -1 -+ * no positive dentry under bsrc. there are more sub-cases. -+ * bwh < 0 -+ * there no whiteout, we can safely move-down. -+ * bwh <= bsrc -+ * impossible -+ * bsrc < bwh && bwh < bdst -+ * there is a whiteout on RO branch. cannot proceed. -+ * bwh == bdst -+ * there is a whiteout on the RW target branch. it should -+ * be removed. -+ * bdst < bwh -+ * there is a whiteout somewhere unrelated branch. -+ * -1 < bfound && bfound <= bsrc -+ * impossible. -+ * bfound < bdst -+ * found, but it is on RO branch between bsrc and bdst. cannot -+ * proceed. -+ * bfound == bdst -+ * found, replace it if AUFS_MVDOWN_FORCE is set. otherwise return -+ * error. -+ * bdst < bfound -+ * found, after we create the file on bdst, it will be hidden. -+ */ -+ -+ AuDebugOn(a->bfound == -1 -+ && a->bwh != -1 -+ && a->bwh <= a->mvd_bsrc); -+ AuDebugOn(-1 < a->bfound -+ && a->bfound <= a->mvd_bsrc); -+ -+ err = -EINVAL; -+ if (a->bfound == -1 -+ && a->mvd_bsrc < a->bwh -+ && a->bwh != -1 -+ && a->bwh < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_WHITEOUT; -+ AU_MVD_PR(dmsg, "bsrc %d, bdst %d, bfound %d, bwh %d\n", -+ a->mvd_bsrc, a->mvd_bdst, a->bfound, a->bwh); -+ goto out; -+ } else if (a->bfound != -1 && a->bfound < a->mvd_bdst) { -+ a->mvd_errno = EAU_MVDOWN_UPPER; -+ AU_MVD_PR(dmsg, "bdst %d, bfound %d\n", -+ a->mvd_bdst, a->bfound); -+ goto out; -+ } -+ -+ err = 0; /* success */ -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args_exist(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ -+ err = 0; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_OWLOWER) -+ && a->bfound == a->mvd_bdst) -+ err = -EEXIST; -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_mvd_args(const unsigned char dmsg, struct au_mvd_args *a) -+{ -+ int err; -+ struct au_branch *br; -+ -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(a->inode->i_mode))) -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_UPPER)) -+ a->mvd_bsrc = au_ibtop(a->inode); -+ else { -+ a->mvd_bsrc = au_br_index(a->sb, a->mvd_src_brid); -+ if (unlikely(a->mvd_bsrc < 0 -+ || (a->mvd_bsrc < au_dbtop(a->dentry) -+ || au_dbbot(a->dentry) < a->mvd_bsrc -+ || !au_h_dptr(a->dentry, a->mvd_bsrc)) -+ || (a->mvd_bsrc < au_ibtop(a->inode) -+ || au_ibbot(a->inode) < a->mvd_bsrc -+ || !au_h_iptr(a->inode, a->mvd_bsrc)))) { -+ a->mvd_errno = EAU_MVDOWN_NOUPPER; -+ AU_MVD_PR(dmsg, "no upper\n"); -+ goto out; -+ } -+ } -+ if (unlikely(a->mvd_bsrc == au_sbbot(a->sb))) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "on the bottom\n"); -+ goto out; -+ } -+ a->mvd_h_src_inode = au_h_iptr(a->inode, a->mvd_bsrc); -+ br = au_sbr(a->sb, a->mvd_bsrc); -+ err = au_br_rdonly(br); -+ if (!(a->mvdown.flags & AUFS_MVDOWN_ROUPPER)) { -+ if (unlikely(err)) -+ goto out; -+ } else if (!(vfsub_native_ro(a->mvd_h_src_inode) -+ || IS_APPEND(a->mvd_h_src_inode))) { -+ if (err) -+ a->mvdown.flags |= AUFS_MVDOWN_ROUPPER_R; -+ /* go on */ -+ } else -+ goto out; -+ -+ err = -EINVAL; -+ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_LOWER)) { -+ a->mvd_bdst = find_lower_writable(a); -+ if (unlikely(a->mvd_bdst < 0)) { -+ a->mvd_errno = EAU_MVDOWN_BOTTOM; -+ AU_MVD_PR(dmsg, "no writable lower branch\n"); -+ goto out; -+ } -+ } else { -+ a->mvd_bdst = au_br_index(a->sb, a->mvd_dst_brid); -+ if (unlikely(a->mvd_bdst < 0 -+ || au_sbbot(a->sb) < a->mvd_bdst)) { -+ a->mvd_errno = EAU_MVDOWN_NOLOWERBR; -+ AU_MVD_PR(dmsg, "no lower brid\n"); -+ goto out; -+ } -+ } -+ -+ err = au_mvd_args_busy(dmsg, a); -+ if (!err) -+ err = au_mvd_args_parent(dmsg, a); -+ if (!err) -+ err = au_mvd_args_intermediate(dmsg, a); -+ if (!err) -+ err = au_mvd_args_exist(dmsg, a); -+ if (!err) -+ AuDbg("b%d, b%d\n", a->mvd_bsrc, a->mvd_bdst); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *uarg) -+{ -+ int err, e; -+ unsigned char dmsg; -+ struct au_mvd_args *args; -+ struct inode *inode; -+ -+ inode = d_inode(dentry); -+ err = -EPERM; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -ENOMEM; -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) -+ goto out; -+ -+ err = copy_from_user(&args->mvdown, uarg, sizeof(args->mvdown)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(uarg, sizeof(*uarg)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out_free; -+ } -+ AuDbg("flags 0x%x\n", args->mvdown.flags); -+ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R); -+ args->mvdown.au_errno = 0; -+ args->dentry = dentry; -+ args->inode = inode; -+ args->sb = dentry->d_sb; -+ -+ err = -ENOENT; -+ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG); -+ args->parent = dget_parent(dentry); -+ args->dir = d_inode(args->parent); -+ inode_lock_nested(args->dir, I_MUTEX_PARENT); -+ dput(args->parent); -+ if (unlikely(args->parent != dentry->d_parent)) { -+ AU_MVD_PR(dmsg, "parent dir is moved\n"); -+ goto out_dir; -+ } -+ -+ inode_lock_nested(inode, I_MUTEX_CHILD); -+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW); -+ if (unlikely(err)) -+ goto out_inode; -+ -+ di_write_lock_parent(args->parent); -+ err = au_mvd_args(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ err = au_do_mvdown(dmsg, args); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ au_cpup_attr_timesizes(args->dir); -+ au_cpup_attr_timesizes(inode); -+ if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER)) -+ au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst)); -+ /* au_digen_dec(dentry); */ -+ -+out_parent: -+ di_write_unlock(args->parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+out_inode: -+ inode_unlock(inode); -+out_dir: -+ inode_unlock(args->dir); -+out_free: -+ e = copy_to_user(uarg, &args->mvdown, sizeof(args->mvdown)); -+ if (unlikely(e)) -+ err = -EFAULT; -+ au_kfree_rcu(args); -+out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/opts.c linux-5.15.37-aufs/fs/aufs/opts.c ---- linux-5.15.37/fs/aufs/opts.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/opts.c 2022-04-08 20:22:30.614616573 +0300 -@@ -0,0 +1,1019 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#include /* a distribution requires */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *au_parser_pattern(int val, match_table_t tbl) -+{ -+ struct match_token *p; -+ -+ p = tbl; -+ while (p->pattern) { -+ if (p->token == val) -+ return p->pattern; -+ p++; -+ } -+ BUG(); -+ return "??"; -+} -+ -+static const char *au_optstr(int *val, match_table_t tbl) -+{ -+ struct match_token *p; -+ int v; -+ -+ v = *val; -+ if (!v) -+ goto out; -+ p = tbl; -+ while (p->pattern) { -+ if (p->token -+ && (v & p->token) == p->token) { -+ *val &= ~p->token; -+ return p->pattern; -+ } -+ p++; -+ } -+ -+out: -+ return NULL; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t brperm = { -+ {AuBrPerm_RO, AUFS_BRPERM_RO}, -+ {AuBrPerm_RR, AUFS_BRPERM_RR}, -+ {AuBrPerm_RW, AUFS_BRPERM_RW}, -+ {0, NULL} -+}; -+ -+static match_table_t brattr = { -+ /* general */ -+ {AuBrAttr_COO_REG, AUFS_BRATTR_COO_REG}, -+ {AuBrAttr_COO_ALL, AUFS_BRATTR_COO_ALL}, -+ /* 'unpin' attrib is meaningless since linux-3.18-rc1 */ -+ {AuBrAttr_UNPIN, AUFS_BRATTR_UNPIN}, -+#ifdef CONFIG_AUFS_FHSM -+ {AuBrAttr_FHSM, AUFS_BRATTR_FHSM}, -+#endif -+#ifdef CONFIG_AUFS_XATTR -+ {AuBrAttr_ICEX, AUFS_BRATTR_ICEX}, -+ {AuBrAttr_ICEX_SEC, AUFS_BRATTR_ICEX_SEC}, -+ {AuBrAttr_ICEX_SYS, AUFS_BRATTR_ICEX_SYS}, -+ {AuBrAttr_ICEX_TR, AUFS_BRATTR_ICEX_TR}, -+ {AuBrAttr_ICEX_USR, AUFS_BRATTR_ICEX_USR}, -+ {AuBrAttr_ICEX_OTH, AUFS_BRATTR_ICEX_OTH}, -+#endif -+ -+ /* ro/rr branch */ -+ {AuBrRAttr_WH, AUFS_BRRATTR_WH}, -+ -+ /* rw branch */ -+ {AuBrWAttr_MOO, AUFS_BRWATTR_MOO}, -+ {AuBrWAttr_NoLinkWH, AUFS_BRWATTR_NLWH}, -+ -+ {0, NULL} -+}; -+ -+static int br_attr_val(char *str, match_table_t table, substring_t args[]) -+{ -+ int attr, v; -+ char *p; -+ -+ attr = 0; -+ do { -+ p = strchr(str, '+'); -+ if (p) -+ *p = 0; -+ v = match_token(str, table, args); -+ if (v) { -+ if (v & AuBrAttr_CMOO_Mask) -+ attr &= ~AuBrAttr_CMOO_Mask; -+ attr |= v; -+ } else { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch attribute %s\n", str); -+ break; -+ } -+ if (p) -+ str = p + 1; -+ } while (p); -+ -+ return attr; -+} -+ -+static int au_do_optstr_br_attr(au_br_perm_str_t *str, int perm) -+{ -+ int sz; -+ const char *p; -+ char *q; -+ -+ q = str->a; -+ *q = 0; -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } else -+ goto out; -+ -+ do { -+ p = au_optstr(&perm, brattr); -+ if (p) { -+ *q++ = '+'; -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ } -+ } while (p); -+ -+out: -+ return q - str->a; -+} -+ -+int au_br_perm_val(char *perm) -+{ -+ int val, bad, sz; -+ char *p; -+ substring_t args[MAX_OPT_ARGS]; -+ au_br_perm_str_t attr; -+ -+ p = strchr(perm, '+'); -+ if (p) -+ *p = 0; -+ val = match_token(perm, brperm, args); -+ if (!val) { -+ if (p) -+ *p = '+'; -+ pr_warn("ignored branch permission %s\n", perm); -+ val = AuBrPerm_RO; -+ goto out; -+ } -+ if (!p) -+ goto out; -+ -+ val |= br_attr_val(p + 1, brattr, args); -+ -+ bad = 0; -+ switch (val & AuBrPerm_Mask) { -+ case AuBrPerm_RO: -+ case AuBrPerm_RR: -+ bad = val & AuBrWAttr_Mask; -+ val &= ~AuBrWAttr_Mask; -+ break; -+ case AuBrPerm_RW: -+ bad = val & AuBrRAttr_Mask; -+ val &= ~AuBrRAttr_Mask; -+ break; -+ } -+ -+ /* -+ * 'unpin' attrib becomes meaningless since linux-3.18-rc1, but aufs -+ * does not treat it as an error, just warning. -+ * this is a tiny guard for the user operation. -+ */ -+ if (val & AuBrAttr_UNPIN) { -+ bad |= AuBrAttr_UNPIN; -+ val &= ~AuBrAttr_UNPIN; -+ } -+ -+ if (unlikely(bad)) { -+ sz = au_do_optstr_br_attr(&attr, bad); -+ AuDebugOn(!sz); -+ pr_warn("ignored branch attribute %s\n", attr.a); -+ } -+ -+out: -+ return val; -+} -+ -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm) -+{ -+ au_br_perm_str_t attr; -+ const char *p; -+ char *q; -+ int sz; -+ -+ q = str->a; -+ p = au_optstr(&perm, brperm); -+ AuDebugOn(!p || !*p); -+ sz = strlen(p); -+ memcpy(q, p, sz + 1); -+ q += sz; -+ -+ sz = au_do_optstr_br_attr(&attr, perm); -+ if (sz) { -+ *q++ = '+'; -+ memcpy(q, attr.a, sz + 1); -+ } -+ -+ AuDebugOn(strlen(str->a) >= sizeof(str->a)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t udbalevel = { -+ {AuOpt_UDBA_REVAL, "reval"}, -+ {AuOpt_UDBA_NONE, "none"}, -+#ifdef CONFIG_AUFS_HNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, -+#endif -+#endif -+ {-1, NULL} -+}; -+ -+int au_udba_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, udbalevel, args); -+} -+ -+const char *au_optstr_udba(int udba) -+{ -+ return au_parser_pattern(udba, udbalevel); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t au_wbr_create_policy = { -+ {AuWbrCreate_TDP, "tdp"}, -+ {AuWbrCreate_TDP, "top-down-parent"}, -+ {AuWbrCreate_RR, "rr"}, -+ {AuWbrCreate_RR, "round-robin"}, -+ {AuWbrCreate_MFS, "mfs"}, -+ {AuWbrCreate_MFS, "most-free-space"}, -+ {AuWbrCreate_MFSV, "mfs:%d"}, -+ {AuWbrCreate_MFSV, "most-free-space:%d"}, -+ -+ /* top-down regardless the parent, and then mfs */ -+ {AuWbrCreate_TDMFS, "tdmfs:%d"}, -+ {AuWbrCreate_TDMFSV, "tdmfs:%d:%d"}, -+ -+ {AuWbrCreate_MFSRR, "mfsrr:%d"}, -+ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, -+ {AuWbrCreate_PMFS, "pmfs"}, -+ {AuWbrCreate_PMFSV, "pmfs:%d"}, -+ {AuWbrCreate_PMFSRR, "pmfsrr:%d"}, -+ {AuWbrCreate_PMFSRRV, "pmfsrr:%d:%d"}, -+ -+ {-1, NULL} -+}; -+ -+static int au_wbr_mfs_wmark(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ unsigned long long ull; -+ -+ err = 0; -+ if (!match_u64(arg, &ull)) -+ create->mfsrr_watermark = ull; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int au_wbr_mfs_sec(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int n, err; -+ -+ err = 0; -+ if (!match_int(arg, &n) && 0 <= n && n <= AUFS_MFS_MAX_SEC) -+ create->mfs_second = n; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+int au_wbr_create_val(char *str, struct au_opt_wbr_create *create) -+{ -+ int err, e; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ err = match_token(str, au_wbr_create_policy, args); -+ create->wbr_create = err; -+ switch (err) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (!e) -+ e = au_wbr_mfs_sec(&args[1], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (unlikely(e)) { -+ err = e; -+ break; -+ } -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ create->mfs_second = AUFS_MFS_DEF_SEC; -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ e = au_wbr_mfs_sec(&args[0], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ } -+ -+ return err; -+} -+ -+const char *au_optstr_wbr_create(int wbr_create) -+{ -+ return au_parser_pattern(wbr_create, au_wbr_create_policy); -+} -+ -+static match_table_t au_wbr_copyup_policy = { -+ {AuWbrCopyup_TDP, "tdp"}, -+ {AuWbrCopyup_TDP, "top-down-parent"}, -+ {AuWbrCopyup_BUP, "bup"}, -+ {AuWbrCopyup_BUP, "bottom-up-parent"}, -+ {AuWbrCopyup_BU, "bu"}, -+ {AuWbrCopyup_BU, "bottom-up"}, -+ {-1, NULL} -+}; -+ -+int au_wbr_copyup_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, au_wbr_copyup_policy, args); -+} -+ -+const char *au_optstr_wbr_copyup(int wbr_copyup) -+{ -+ return au_parser_pattern(wbr_copyup, au_wbr_copyup_policy); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct au_opt_add *add = &opt->add; -+ char *p; -+ -+ add->bindex = bindex; -+ add->perm = AuBrPerm_RO; -+ add->pathname = opt_str; -+ p = strchr(opt_str, '='); -+ if (p) { -+ *p++ = 0; -+ if (*p) -+ add->perm = au_br_perm_val(p); -+ } -+ -+ err = vfsub_kern_path(add->pathname, AuOpt_LkupDirFlags, &add->path); -+ if (!err) { -+ if (!p) { -+ add->perm = AuBrPerm_RO; -+ if (au_test_fs_rr(add->path.dentry->d_sb)) -+ add->perm = AuBrPerm_RR; -+ else if (!bindex && !(sb_flags & SB_RDONLY)) -+ add->perm = AuBrPerm_RW; -+ } -+ opt->type = Opt_add; -+ goto out; -+ } -+ pr_err("lookup failed %s (%d)\n", add->pathname, err); -+ err = -EINVAL; -+ -+out: -+ return err; -+} -+ -+static int au_opt_wbr_create(struct super_block *sb, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_wbr_create_ops->fin) { -+ err = sbinfo->si_wbr_create_ops->fin(sb); -+ if (!err) -+ err = 1; -+ } -+ -+ sbinfo->si_wbr_create = create->wbr_create; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; -+ switch (create->wbr_create) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRR: -+ case AuWbrCreate_PMFSRRV: -+ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; -+ fallthrough; -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFS: -+ case AuWbrCreate_PMFSV: -+ sbinfo->si_wbr_mfs.mfs_expire -+ = msecs_to_jiffies(create->mfs_second * MSEC_PER_SEC); -+ break; -+ } -+ -+ if (sbinfo->si_wbr_create_ops->init) -+ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ -+ -+ return err; -+} -+ -+/* -+ * returns, -+ * plus: processed without an error -+ * zero: unprocessed -+ */ -+static int au_opt_simple(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ switch (opt->type) { -+ case Opt_udba: -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= opt->udba; -+ opts->given_udba |= opt->udba; -+ break; -+ -+ case Opt_plink: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, PLINK); -+ else { -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_opt_clr(sbinfo->si_mntflags, PLINK); -+ } -+ break; -+ case Opt_list_plink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_list(sb); -+ break; -+ -+ case Opt_dio: -+ if (opt->tf) { -+ au_opt_set(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } else { -+ au_opt_clr(sbinfo->si_mntflags, DIO); -+ au_fset_opts(opts->flags, REFRESH_DYAOP); -+ } -+ break; -+ -+ case Opt_fhsm_sec: -+ au_fhsm_set(sbinfo, opt->fhsm_second); -+ break; -+ -+ case Opt_diropq_a: -+ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ case Opt_diropq_w: -+ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ -+ case Opt_warn_perm: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, WARN_PERM); -+ else -+ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ -+ case Opt_verbose: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, VERBOSE); -+ else -+ au_opt_clr(sbinfo->si_mntflags, VERBOSE); -+ break; -+ -+ case Opt_sum: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, SUM); -+ else { -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_clr(sbinfo->si_mntflags, SUM_W); -+ } -+ break; -+ case Opt_wsum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_set(sbinfo->si_mntflags, SUM_W); -+ break; -+ -+ case Opt_wbr_create: -+ err = au_opt_wbr_create(sb, &opt->wbr_create); -+ break; -+ case Opt_wbr_copyup: -+ sbinfo->si_wbr_copyup = opt->wbr_copyup; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; -+ break; -+ -+ case Opt_dirwh: -+ sbinfo->si_dirwh = opt->dirwh; -+ break; -+ -+ case Opt_rdcache: -+ sbinfo->si_rdcache -+ = msecs_to_jiffies(opt->rdcache * MSEC_PER_SEC); -+ break; -+ case Opt_rdblk: -+ sbinfo->si_rdblk = opt->rdblk; -+ break; -+ case Opt_rdhash: -+ sbinfo->si_rdhash = opt->rdhash; -+ break; -+ -+ case Opt_shwh: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, SHWH); -+ else -+ au_opt_clr(sbinfo->si_mntflags, SHWH); -+ break; -+ -+ case Opt_dirperm1: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, DIRPERM1); -+ else -+ au_opt_clr(sbinfo->si_mntflags, DIRPERM1); -+ break; -+ -+ case Opt_trunc_xino: -+ if (opt->tf) -+ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); -+ else -+ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ err = au_xino_trunc(sb, opt->xino_itrunc.bindex, -+ /*idx_begin*/0); -+ if (!err) -+ err = 1; -+ break; -+ -+ case Opt_trunc_xib: -+ if (opt->tf) -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ else -+ au_fclr_opts(opts->flags, TRUNC_XIB); -+ break; -+ -+ case Opt_dirren: -+ err = 1; -+ if (opt->tf) { -+ if (!au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_set(sb); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_set(sbinfo->si_mntflags, DIRREN); -+ } else { -+ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) { -+ err = au_dr_opt_clr(sb, au_ftest_opts(opts->flags, -+ DR_FLUSHED)); -+ if (!err) -+ err = 1; -+ } -+ if (err == 1) -+ au_opt_clr(sbinfo->si_mntflags, DIRREN); -+ } -+ break; -+ -+ case Opt_acl: -+ if (opt->tf) -+ sb->s_flags |= SB_POSIXACL; -+ else -+ sb->s_flags &= ~SB_POSIXACL; -+ break; -+ -+ default: -+ err = 0; -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * returns tri-state. -+ * plus: processed without an error -+ * zero: unprocessed -+ * minus: error -+ */ -+static int au_opt_br(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err, do_refresh; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_append: -+ opt->add.bindex = au_sbbot(sb) + 1; -+ if (opt->add.bindex < 0) -+ opt->add.bindex = 0; -+ goto add; -+ /* Always goto add, not fallthrough */ -+ case Opt_prepend: -+ opt->add.bindex = 0; -+ fallthrough; -+ add: /* indented label */ -+ case Opt_add: -+ err = au_br_add(sb, &opt->add, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_del: -+ case Opt_idel: -+ err = au_br_del(sb, &opt->del, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ -+ case Opt_mod: -+ case Opt_imod: -+ err = au_br_mod(sb, &opt->mod, -+ au_ftest_opts(opts->flags, REMOUNT), -+ &do_refresh); -+ if (!err) { -+ err = 1; -+ if (do_refresh) -+ au_fset_opts(opts->flags, REFRESH); -+ } -+ break; -+ } -+ return err; -+} -+ -+static int au_opt_xino(struct super_block *sb, struct au_opt *opt, -+ struct au_opt_xino **opt_xino, -+ struct au_opts *opts) -+{ -+ int err; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_xino: -+ err = au_xino_set(sb, &opt->xino, -+ !!au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) -+ *opt_xino = &opt->xino; -+ break; -+ case Opt_noxino: -+ au_xino_clr(sb); -+ *opt_xino = (void *)-1; -+ break; -+ } -+ -+ return err; -+} -+ -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending) -+{ -+ int err, fhsm; -+ aufs_bindex_t bindex, bbot; -+ unsigned char do_plink, skip, do_free, can_no_dreval; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root, *dentry; -+ struct inode *dir, *h_dir; -+ struct au_sbinfo *sbinfo; -+ struct au_hinode *hdir; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); -+ -+ if (!(sb_flags & SB_RDONLY)) { -+ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) -+ pr_warn("first branch should be rw\n"); -+ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) -+ pr_warn_once("shwh should be used with ro\n"); -+ } -+ -+ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) -+ && !au_opt_test(sbinfo->si_mntflags, XINO)) -+ pr_warn_once("udba=*notify requires xino\n"); -+ -+ if (au_opt_test(sbinfo->si_mntflags, DIRPERM1)) -+ pr_warn_once("dirperm1 breaks the protection" -+ " by the permission bits on the lower branch\n"); -+ -+ err = 0; -+ fhsm = 0; -+ root = sb->s_root; -+ dir = d_inode(root); -+ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); -+ can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending), -+ UDBA_NONE); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) { -+ skip = 0; -+ h_dir = au_h_iptr(dir, bindex); -+ br = au_sbr(sb, bindex); -+ -+ if ((br->br_perm & AuBrAttr_ICEX) -+ && !h_dir->i_op->listxattr) -+ br->br_perm &= ~AuBrAttr_ICEX; -+#if 0 /* untested */ -+ if ((br->br_perm & AuBrAttr_ICEX_SEC) -+ && (au_br_sb(br)->s_flags & SB_NOSEC)) -+ br->br_perm &= ~AuBrAttr_ICEX_SEC; -+#endif -+ -+ do_free = 0; -+ wbr = br->br_wbr; -+ if (wbr) -+ wbr_wh_read_lock(wbr); -+ -+ if (!au_br_writable(br->br_perm)) { -+ do_free = !!wbr; -+ skip = (!wbr -+ || (!wbr->wbr_whbase -+ && !wbr->wbr_plink -+ && !wbr->wbr_orph)); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ /* skip = (!br->br_whbase && !br->br_orph); */ -+ skip = (!wbr || !wbr->wbr_whbase); -+ if (skip && wbr) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } else { -+ /* skip = (br->br_whbase && br->br_ohph); */ -+ skip = (wbr && wbr->wbr_whbase); -+ if (skip) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ } -+ if (wbr) -+ wbr_wh_read_unlock(wbr); -+ -+ if (can_no_dreval) { -+ dentry = br->br_path.dentry; -+ spin_lock(&dentry->d_lock); -+ if (dentry->d_flags & -+ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE)) -+ can_no_dreval = 0; -+ spin_unlock(&dentry->d_lock); -+ } -+ -+ if (au_br_fhsm(br->br_perm)) { -+ fhsm++; -+ AuDebugOn(!br->br_fhsm); -+ } -+ -+ if (skip) -+ continue; -+ -+ hdir = au_hi(dir, bindex); -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ if (wbr) -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(br, sb); -+ if (wbr) -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ -+ if (!err && do_free) { -+ au_kfree_rcu(wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ -+ if (can_no_dreval) -+ au_fset_si(sbinfo, NO_DREVAL); -+ else -+ au_fclr_si(sbinfo, NO_DREVAL); -+ -+ if (fhsm >= 2) { -+ au_fset_si(sbinfo, FHSM); -+ for (bindex = bbot; bindex >= 0; bindex--) { -+ br = au_sbr(sb, bindex); -+ if (au_br_fhsm(br->br_perm)) { -+ au_fhsm_set_bottom(sb, bindex); -+ break; -+ } -+ } -+ } else { -+ au_fclr_si(sbinfo, FHSM); -+ au_fhsm_set_bottom(sb, -1); -+ } -+ -+ return err; -+} -+ -+int au_opts_mount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err; -+ unsigned int tmp; -+ aufs_bindex_t bindex, bbot; -+ struct au_opt *opt; -+ struct au_opt_xino *opt_xino, xino; -+ struct au_sbinfo *sbinfo; -+ struct au_branch *br; -+ struct inode *dir; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_simple(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ /* disable xino and udba temporary */ -+ sbinfo = au_sbi(sb); -+ tmp = sbinfo->si_mntflags; -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); -+ -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_br(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ bbot = au_sbbot(sb); -+ if (unlikely(bbot < 0)) { -+ err = -EINVAL; -+ pr_err("no branches\n"); -+ goto out; -+ } -+ -+ if (au_opt_test(tmp, XINO)) -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ opt = opts->opt; -+ while (!err && opt->type != Opt_tail) -+ err = au_opt_xino(sb, opt++, &opt_xino, opts); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_opts_verify(sb, sb->s_flags, tmp); -+ if (unlikely(err)) -+ goto out; -+ -+ /* restore xino */ -+ if (au_opt_test(tmp, XINO) && !opt_xino) { -+ xino.file = au_xino_def(sb); -+ err = PTR_ERR(xino.file); -+ if (IS_ERR(xino.file)) -+ goto out; -+ -+ err = au_xino_set(sb, &xino, /*remount*/0); -+ fput(xino.file); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* restore udba */ -+ tmp &= AuOptMask_UDBA; -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= tmp; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(tmp, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ if (au_opt_test(tmp, UDBA_HNOTIFY)) { -+ dir = d_inode(sb->s_root); -+ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); -+ } -+ -+out: -+ return err; -+} -+ -+int au_opts_remount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err, rerr; -+ unsigned char no_dreval; -+ struct inode *dir; -+ struct au_opt_xino *opt_xino; -+ struct au_opt *opt; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = au_dr_opt_flush(sb); -+ if (unlikely(err)) -+ goto out; -+ au_fset_opts(opts->flags, DR_FLUSHED); -+ -+ dir = d_inode(sb->s_root); -+ sbinfo = au_sbi(sb); -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) { -+ err = au_opt_simple(sb, opt, opts); -+ if (!err) -+ err = au_opt_br(sb, opt, opts); -+ if (!err) -+ err = au_opt_xino(sb, opt, &opt_xino, opts); -+ opt++; -+ } -+ if (err > 0) -+ err = 0; -+ AuTraceErr(err); -+ /* go on even err */ -+ -+ no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL); -+ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ -+ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL)) -+ au_fset_opts(opts->flags, REFRESH_IDOP); -+ -+ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { -+ rerr = au_xib_trunc(sb); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ } -+ -+ /* will be handled by the caller */ -+ if (!au_ftest_opts(opts->flags, REFRESH) -+ && (opts->given_udba -+ || au_opt_test(sbinfo->si_mntflags, XINO) -+ || au_ftest_opts(opts->flags, REFRESH_IDOP) -+ )) -+ au_fset_opts(opts->flags, REFRESH); -+ -+ AuDbg("status 0x%x\n", opts->flags); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_opt_udba(struct super_block *sb) -+{ -+ return au_mntflags(sb) & AuOptMask_UDBA; -+} -diff -Nurp linux-5.15.37/fs/aufs/opts.h linux-5.15.37-aufs/fs/aufs/opts.h ---- linux-5.15.37/fs/aufs/opts.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/opts.h 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,250 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#ifndef __AUFS_OPTS_H__ -+#define __AUFS_OPTS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+ -+enum { -+ Opt_br, -+ Opt_add, Opt_del, Opt_mod, Opt_append, Opt_prepend, -+ Opt_idel, Opt_imod, -+ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, -+ Opt_xino, Opt_noxino, -+ Opt_trunc_xino, Opt_trunc_xino_v, -+ Opt_trunc_xino_path, Opt_itrunc_xino, -+ Opt_trunc_xib, -+ Opt_shwh, -+ Opt_plink, Opt_list_plink, -+ Opt_udba, -+ Opt_dio, -+ Opt_diropq, Opt_diropq_a, Opt_diropq_w, -+ Opt_warn_perm, -+ Opt_wbr_copyup, Opt_wbr_create, -+ Opt_fhsm_sec, -+ Opt_verbose, Opt_noverbose, -+ Opt_sum, Opt_wsum, -+ Opt_dirperm1, -+ Opt_dirren, -+ Opt_acl, -+ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mount flags */ -+#define AuOpt_XINO 1 /* external inode number bitmap -+ and translation table */ -+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ -+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ -+#define AuOpt_UDBA_REVAL (1 << 3) -+#define AuOpt_UDBA_HNOTIFY (1 << 4) -+#define AuOpt_SHWH (1 << 5) /* show whiteout */ -+#define AuOpt_PLINK (1 << 6) /* pseudo-link */ -+#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm -+ bits */ -+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ -+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ -+#define AuOpt_SUM_W (1 << 11) /* unimplemented */ -+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ -+#define AuOpt_VERBOSE (1 << 13) /* print the cause of error */ -+#define AuOpt_DIO (1 << 14) /* direct io */ -+#define AuOpt_DIRREN (1 << 15) /* directory rename */ -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuOpt_UDBA_HNOTIFY -+#define AuOpt_UDBA_HNOTIFY 0 -+#endif -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpt_DIRREN -+#define AuOpt_DIRREN 0 -+#endif -+#ifndef CONFIG_AUFS_SHWH -+#undef AuOpt_SHWH -+#define AuOpt_SHWH 0 -+#endif -+ -+#define AuOpt_Def (AuOpt_XINO \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_PLINK \ -+ /* | AuOpt_DIRPERM1 */ \ -+ | AuOpt_WARN_PERM) -+#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_UDBA_HNOTIFY) -+ -+#define AuOpt_LkupDirFlags (LOOKUP_FOLLOW | LOOKUP_DIRECTORY) -+ -+#define au_opt_test(flags, name) (flags & AuOpt_##name) -+#define au_opt_set(flags, name) do { \ -+ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_set_udba(flags, name) do { \ -+ (flags) &= ~AuOptMask_UDBA; \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_clr(flags, name) do { \ -+ ((flags) &= ~AuOpt_##name); \ -+} while (0) -+ -+static inline unsigned int au_opts_plink(unsigned int mntflags) -+{ -+#ifdef CONFIG_PROC_FS -+ return mntflags; -+#else -+ return mntflags & ~AuOpt_PLINK; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies to select one among multiple writable branches */ -+enum { -+ AuWbrCreate_TDP, /* top down parent */ -+ AuWbrCreate_RR, /* round robin */ -+ AuWbrCreate_MFS, /* most free space */ -+ AuWbrCreate_MFSV, /* mfs with seconds */ -+ AuWbrCreate_MFSRR, /* mfs then rr */ -+ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ -+ AuWbrCreate_TDMFS, /* top down regardless parent and mfs */ -+ AuWbrCreate_TDMFSV, /* top down regardless parent and mfs */ -+ AuWbrCreate_PMFS, /* parent and mfs */ -+ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ -+ AuWbrCreate_PMFSRR, /* parent, mfs and round-robin */ -+ AuWbrCreate_PMFSRRV, /* plus seconds */ -+ -+ AuWbrCreate_Def = AuWbrCreate_TDP -+}; -+ -+enum { -+ AuWbrCopyup_TDP, /* top down parent */ -+ AuWbrCopyup_BUP, /* bottom up parent */ -+ AuWbrCopyup_BU, /* bottom up */ -+ -+ AuWbrCopyup_Def = AuWbrCopyup_TDP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct file; -+ -+struct au_opt_add { -+ aufs_bindex_t bindex; -+ char *pathname; -+ int perm; -+ struct path path; -+}; -+ -+struct au_opt_del { -+ char *pathname; -+ struct path h_path; -+}; -+ -+struct au_opt_mod { -+ char *path; -+ int perm; -+ struct dentry *h_root; -+}; -+ -+struct au_opt_xino { -+ char *path; -+ struct file *file; -+}; -+ -+struct au_opt_xino_itrunc { -+ aufs_bindex_t bindex; -+}; -+ -+struct au_opt_wbr_create { -+ int wbr_create; -+ int mfs_second; -+ unsigned long long mfsrr_watermark; -+}; -+ -+struct au_opt { -+ int type; -+ union { -+ struct au_opt_xino xino; -+ struct au_opt_xino_itrunc xino_itrunc; -+ struct au_opt_add add; -+ struct au_opt_del del; -+ struct au_opt_mod mod; -+ int dirwh; -+ int rdcache; -+ unsigned int rdblk; -+ unsigned int rdhash; -+ int udba; -+ struct au_opt_wbr_create wbr_create; -+ int wbr_copyup; -+ unsigned int fhsm_second; -+ bool tf; /* generic flag, true or false */ -+ }; -+}; -+ -+/* opts flags */ -+#define AuOpts_REMOUNT 1 -+#define AuOpts_REFRESH (1 << 1) -+#define AuOpts_TRUNC_XIB (1 << 2) -+#define AuOpts_REFRESH_DYAOP (1 << 3) -+#define AuOpts_REFRESH_IDOP (1 << 4) -+#define AuOpts_DR_FLUSHED (1 << 5) -+#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) -+#define au_fset_opts(flags, name) \ -+ do { (flags) |= AuOpts_##name; } while (0) -+#define au_fclr_opts(flags, name) \ -+ do { (flags) &= ~AuOpts_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_DIRREN -+#undef AuOpts_DR_FLUSHED -+#define AuOpts_DR_FLUSHED 0 -+#endif -+ -+struct au_opts { -+ struct au_opt *opt; -+ int max_opt; -+ -+ unsigned int given_udba; -+ unsigned int flags; -+ unsigned long sb_flags; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* opts.c */ -+int au_br_perm_val(char *perm); -+void au_optstr_br_perm(au_br_perm_str_t *str, int perm); -+int au_udba_val(char *str); -+const char *au_optstr_udba(int udba); -+int au_wbr_create_val(char *str, struct au_opt_wbr_create *create); -+const char *au_optstr_wbr_create(int wbr_create); -+int au_wbr_copyup_val(char *str); -+const char *au_optstr_wbr_copyup(int wbr_copyup); -+ -+int au_opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex); -+struct super_block; -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending); -+int au_opts_mount(struct super_block *sb, struct au_opts *opts); -+int au_opts_remount(struct super_block *sb, struct au_opts *opts); -+ -+unsigned int au_opt_udba(struct super_block *sb); -+ -+/* fsctx.c */ -+int aufs_fsctx_init(struct fs_context *fc); -+extern const struct fs_parameter_spec aufs_fsctx_paramspec[]; -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_OPTS_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/plink.c linux-5.15.37-aufs/fs/aufs/plink.c ---- linux-5.15.37/fs/aufs/plink.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/plink.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,503 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * pseudo-link -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * the pseudo-link maintenance mode. -+ * during a user process maintains the pseudo-links, -+ * prohibit adding a new plink and branch manipulation. -+ * -+ * Flags -+ * NOPLM: -+ * For entry functions which will handle plink, and i_mutex is already held -+ * in VFS. -+ * They cannot wait and should return an error at once. -+ * Callers has to check the error. -+ * NOPLMW: -+ * For entry functions which will handle plink, but i_mutex is not held -+ * in VFS. -+ * They can wait the plink maintenance mode to finish. -+ * -+ * They behave like F_SETLK and F_SETLKW. -+ * If the caller never handle plink, then both flags are unnecessary. -+ */ -+ -+int au_plink_maint(struct super_block *sb, int flags) -+{ -+ int err; -+ pid_t pid, ppid; -+ struct task_struct *parent, *prev; -+ struct au_sbinfo *sbi; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(sb), PLINK)) -+ goto out; -+ -+ sbi = au_sbi(sb); -+ pid = sbi->si_plink_maint_pid; -+ if (!pid || pid == current->pid) -+ goto out; -+ -+ /* todo: it highly depends upon /sbin/mount.aufs */ -+ prev = NULL; -+ parent = current; -+ ppid = 0; -+ rcu_read_lock(); -+ while (1) { -+ parent = rcu_dereference(parent->real_parent); -+ if (parent == prev) -+ break; -+ ppid = task_pid_vnr(parent); -+ if (pid == ppid) { -+ rcu_read_unlock(); -+ goto out; -+ } -+ prev = parent; -+ } -+ rcu_read_unlock(); -+ -+ if (au_ftest_lock(flags, NOPLMW)) { -+ /* if there is no i_mutex lock in VFS, we don't need to wait */ -+ /* AuDebugOn(!lockdep_depth(current)); */ -+ while (sbi->si_plink_maint_pid) { -+ si_read_unlock(sb); -+ /* gave up wake_up_bit() */ -+ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint_pid); -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&sbi->si_nowait); -+ si_noflush_read_lock(sb); -+ } -+ } else if (au_ftest_lock(flags, NOPLM)) { -+ AuDbg("ppid %d, pid %d\n", ppid, pid); -+ err = -EAGAIN; -+ } -+ -+out: -+ return err; -+} -+ -+void au_plink_maint_leave(struct au_sbinfo *sbinfo) -+{ -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ sbinfo->si_plink_maint_pid = 0; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ wake_up_all(&sbinfo->si_plink_wq); -+} -+ -+int au_plink_maint_enter(struct super_block *sb) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ /* make sure i am the only one in this fs */ -+ si_write_lock(sb, AuLock_FLUSH); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ if (!sbinfo->si_plink_maint_pid) -+ sbinfo->si_plink_maint_pid = current->pid; -+ else -+ err = -EBUSY; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ } -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ AuDbg("%lu\n", icntnr->vfs_inode.i_ino); -+ hlist_bl_unlock(hbl); -+ } -+} -+#endif -+ -+/* is the inode pseudo-linked? */ -+int au_plink_test(struct inode *inode) -+{ -+ int found, i; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ -+ sbinfo = au_sbi(inode->i_sb); -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ found = 0; -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ hlist_bl_unlock(hbl); -+ return found; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generate a name for plink. -+ * the file will be stored under AUFS_WH_PLINKDIR. -+ */ -+/* 20 is max digits length of ulong 64 */ -+#define PLINK_NAME_LEN ((20 + 1) * 2) -+ -+static int plink_name(char *name, int len, struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ int rlen; -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, bindex); -+ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); -+ return rlen; -+} -+ -+struct au_do_plink_lkup_args { -+ struct dentry **errp; -+ struct qstr *tgtname; -+ struct path *h_ppath; -+}; -+ -+static struct dentry *au_do_plink_lkup(struct qstr *tgtname, -+ struct path *h_ppath) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_inode = d_inode(h_ppath->dentry); -+ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2); -+ 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_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; -+ struct au_branch *br; -+ struct path h_ppath; -+ int wkq_err; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = QSTR_INIT(a, 0); -+ -+ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); -+ -+ br = au_sbr(inode->i_sb, bindex); -+ 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_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_ppath); -+ -+ return h_dentry; -+} -+ -+/* create a pseudo-link */ -+static int do_whplink(struct qstr *tgt, struct path *h_ppath, -+ struct dentry *h_dentry) -+{ -+ int err; -+ struct path h_path; -+ struct inode *h_dir, *delegated; -+ -+ 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_ppath); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ /* wh.plink dir is not monitored */ -+ /* todo: is it really safe? */ -+ if (d_is_positive(h_path.dentry) -+ && d_inode(h_path.dentry) != d_inode(h_dentry)) { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ dput(h_path.dentry); -+ h_path.dentry = NULL; -+ if (!err) -+ goto again; -+ } -+ if (!err && d_is_negative(h_path.dentry)) { -+ delegated = NULL; -+ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ } -+ dput(h_path.dentry); -+ -+out: -+ inode_unlock(h_dir); -+ return err; -+} -+ -+struct do_whplink_args { -+ int *errp; -+ struct qstr *tgt; -+ struct path *h_ppath; -+ struct dentry *h_dentry; -+}; -+ -+static void call_do_whplink(void *args) -+{ -+ struct do_whplink_args *a = args; -+ *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) -+{ -+ int err, wkq_err; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct path h_ppath; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = QSTR_INIT(a, 0); -+ -+ 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. */ -+ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { -+ struct do_whplink_args args = { -+ .errp = &err, -+ .tgt = &tgtname, -+ .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_ppath, h_dentry); -+ -+ return err; -+} -+ -+/* -+ * create a new pseudo-link for @h_dentry on @bindex. -+ * the linked inode is held in aufs @inode. -+ */ -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_icntnr *icntnr; -+ int found, err, cnt, i; -+ -+ sb = inode->i_sb; -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ found = au_plink_test(inode); -+ if (found) -+ return; -+ -+ i = au_plink_hash(inode->i_ino); -+ hbl = sbinfo->si_plink + i; -+ au_igrab(inode); -+ -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) { -+ if (&icntnr->vfs_inode == inode) { -+ found = 1; -+ break; -+ } -+ } -+ if (!found) { -+ icntnr = container_of(inode, struct au_icntnr, vfs_inode); -+ hlist_bl_add_head(&icntnr->plink, hbl); -+ } -+ hlist_bl_unlock(hbl); -+ if (!found) { -+ cnt = au_hbl_count(hbl); -+#define msg "unexpectedly unbalanced or too many pseudo-links" -+ if (cnt > AUFS_PLINK_WARN) -+ AuWarn1(msg ", %d\n", cnt); -+#undef msg -+ err = whplink(h_dentry, inode, bindex); -+ if (unlikely(err)) { -+ pr_warn("err %d, damaged pseudo link.\n", err); -+ au_hbl_del(&icntnr->plink, hbl); -+ iput(&icntnr->vfs_inode); -+ } -+ } else -+ iput(&icntnr->vfs_inode); -+} -+ -+/* free all plinks */ -+void au_plink_put(struct super_block *sb, int verbose) -+{ -+ int i, warned; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no spin_lock since sbinfo is write-locked */ -+ warned = 0; -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ if (!warned && verbose && !hlist_bl_empty(hbl)) { -+ pr_warn("pseudo-link is not flushed"); -+ warned = 1; -+ } -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) -+ iput(&icntnr->vfs_inode); -+ INIT_HLIST_BL_HEAD(hbl); -+ } -+} -+ -+void au_plink_clean(struct super_block *sb, int verbose) -+{ -+ struct dentry *root; -+ -+ root = sb->s_root; -+ aufs_write_lock(root); -+ if (au_opt_test(au_mntflags(sb), PLINK)) -+ au_plink_put(sb, verbose); -+ aufs_write_unlock(root); -+} -+ -+static int au_plink_do_half_refresh(struct inode *inode, aufs_bindex_t br_id) -+{ -+ int do_put; -+ aufs_bindex_t btop, bbot, bindex; -+ -+ do_put = 0; -+ btop = au_ibtop(inode); -+ bbot = au_ibbot(inode); -+ if (btop >= 0) { -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ if (!au_h_iptr(inode, bindex) -+ || au_ii_br_id(inode, bindex) != br_id) -+ continue; -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ do_put = 1; -+ break; -+ } -+ if (do_put) -+ for (bindex = btop; bindex <= bbot; bindex++) -+ if (au_h_iptr(inode, bindex)) { -+ do_put = 0; -+ break; -+ } -+ } else -+ do_put = 1; -+ -+ return do_put; -+} -+ -+/* free the plinks on a branch specified by @br_id */ -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *tmp; -+ struct au_icntnr *icntnr; -+ struct inode *inode; -+ int i, do_put; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); -+ -+ /* no bit_lock since sbinfo is write-locked */ -+ for (i = 0; i < AuPlink_NHASH; i++) { -+ hbl = sbinfo->si_plink + i; -+ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) { -+ inode = au_igrab(&icntnr->vfs_inode); -+ ii_write_lock_child(inode); -+ do_put = au_plink_do_half_refresh(inode, br_id); -+ if (do_put) { -+ hlist_bl_del(&icntnr->plink); -+ iput(inode); -+ } -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ } -+} -diff -Nurp linux-5.15.37/fs/aufs/poll.c linux-5.15.37-aufs/fs/aufs/poll.c ---- linux-5.15.37/fs/aufs/poll.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/poll.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,38 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * poll operation -+ * There is only one filesystem which implements ->poll operation, currently. -+ */ -+ -+#include "aufs.h" -+ -+__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt) -+{ -+ __poll_t mask; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ /* We should pretend an error happened. */ -+ mask = EPOLLERR /* | EPOLLIN | EPOLLOUT */; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); -+ -+ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); -+ if (IS_ERR(h_file)) { -+ AuDbg("h_file %ld\n", PTR_ERR(h_file)); -+ goto out; -+ } -+ -+ mask = vfs_poll(h_file, pt); -+ fput(h_file); /* instead of au_read_post() */ -+ -+out: -+ si_read_unlock(sb); -+ if (mask & EPOLLERR) -+ AuDbg("mask 0x%x\n", mask); -+ return mask; -+} -diff -Nurp linux-5.15.37/fs/aufs/posix_acl.c linux-5.15.37-aufs/fs/aufs/posix_acl.c ---- linux-5.15.37/fs/aufs/posix_acl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/posix_acl.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,98 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * posix acl operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu) -+{ -+ struct posix_acl *acl; -+ int err; -+ aufs_bindex_t bindex; -+ 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 unlock; -+ -+ bindex = au_ibtop(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (unlikely(!h_inode -+ || ((h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT)))) { -+ err = au_busy_or_stale(); -+ acl = ERR_PTR(err); -+ goto unlock; -+ } -+ -+ /* always topmost only */ -+ acl = get_acl(h_inode, type); -+ if (IS_ERR(acl)) -+ forget_cached_acl(inode, type); -+ else -+ set_cached_acl(inode, type, acl); -+ -+unlock: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ -+out: -+ AuTraceErrPtr(acl); -+ return acl; -+} -+ -+int aufs_set_acl(struct user_namespace *userns, struct inode *inode, -+ struct posix_acl *acl, int type) -+{ -+ int err; -+ ssize_t ssz; -+ struct dentry *dentry; -+ struct au_sxattr arg = { -+ .type = AU_ACL_SET, -+ .u.acl_set = { -+ .acl = acl, -+ .type = type -+ }, -+ }; -+ -+ IMustLock(inode); -+ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ dentry = dget(inode->i_sb->s_root); -+ else { -+ dentry = d_find_alias(inode); -+ if (!dentry) -+ dentry = d_find_any_alias(inode); -+ if (!dentry) { -+ pr_warn("cannot handle this inode, " -+ "please report to aufs-users ML\n"); -+ err = -ENOENT; -+ goto out; -+ } -+ } -+ -+ ssz = au_sxattr(dentry, inode, &arg); -+ /* forget even it if succeeds since the branch might set differently */ -+ forget_cached_acl(inode, type); -+ dput(dentry); -+ err = ssz; -+ if (ssz >= 0) -+ err = 0; -+ -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/procfs.c linux-5.15.37-aufs/fs/aufs/procfs.c ---- linux-5.15.37/fs/aufs/procfs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/procfs.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,157 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2010-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * procfs interfaces -+ */ -+ -+#include -+#include "aufs.h" -+ -+static int au_procfs_plm_release(struct inode *inode, struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) { -+ au_plink_maint_leave(sbinfo); -+ kobject_put(&sbinfo->si_kobj); -+ } -+ -+ return 0; -+} -+ -+static void au_procfs_plm_write_clean(struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = file->private_data; -+ if (sbinfo) -+ au_plink_clean(sbinfo->si_sb, /*verbose*/0); -+} -+ -+static int au_procfs_plm_write_si(struct file *file, unsigned long id) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ err = -EBUSY; -+ if (unlikely(file->private_data)) -+ goto out; -+ -+ sb = NULL; -+ /* don't use au_sbilist_lock() here */ -+ hlist_bl_lock(&au_sbilist); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ if (id == sysaufs_si_id(sbinfo)) { -+ if (kobject_get_unless_zero(&sbinfo->si_kobj)) -+ sb = sbinfo->si_sb; -+ break; -+ } -+ hlist_bl_unlock(&au_sbilist); -+ -+ err = -EINVAL; -+ if (unlikely(!sb)) -+ goto out; -+ -+ err = au_plink_maint_enter(sb); -+ if (!err) -+ /* keep kobject_get() */ -+ file->private_data = sbinfo; -+ else -+ kobject_put(&sbinfo->si_kobj); -+out: -+ return err; -+} -+ -+/* -+ * Accept a valid "si=xxxx" only. -+ * Once it is accepted successfully, accept "clean" too. -+ */ -+static ssize_t au_procfs_plm_write(struct file *file, const char __user *ubuf, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ unsigned long id; -+ /* last newline is allowed */ -+ char buf[3 + sizeof(unsigned long) * 2 + 1]; -+ -+ err = -EACCES; -+ if (unlikely(!capable(CAP_SYS_ADMIN))) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(count > sizeof(buf))) -+ goto out; -+ -+ err = copy_from_user(buf, ubuf, count); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ goto out; -+ } -+ buf[count] = 0; -+ -+ err = -EINVAL; -+ if (!strcmp("clean", buf)) { -+ au_procfs_plm_write_clean(file); -+ goto out_success; -+ } else if (unlikely(strncmp("si=", buf, 3))) -+ goto out; -+ -+ err = kstrtoul(buf + 3, 16, &id); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_procfs_plm_write_si(file, id); -+ if (unlikely(err)) -+ goto out; -+ -+out_success: -+ err = count; /* success */ -+out: -+ return err; -+} -+ -+static const struct proc_ops au_procfs_plm_op = { -+ .proc_write = au_procfs_plm_write, -+ .proc_release = au_procfs_plm_release -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct proc_dir_entry *au_procfs_dir; -+ -+void au_procfs_fin(void) -+{ -+ remove_proc_entry(AUFS_PLINK_MAINT_NAME, au_procfs_dir); -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+} -+ -+int __init au_procfs_init(void) -+{ -+ int err; -+ struct proc_dir_entry *entry; -+ -+ err = -ENOMEM; -+ au_procfs_dir = proc_mkdir(AUFS_PLINK_MAINT_DIR, NULL); -+ if (unlikely(!au_procfs_dir)) -+ goto out; -+ -+ entry = proc_create(AUFS_PLINK_MAINT_NAME, S_IFREG | 0200, -+ au_procfs_dir, &au_procfs_plm_op); -+ if (unlikely(!entry)) -+ goto out_dir; -+ -+ err = 0; -+ goto out; /* success */ -+ -+ -+out_dir: -+ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/rdu.c linux-5.15.37-aufs/fs/aufs/rdu.c ---- linux-5.15.37/fs/aufs/rdu.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/rdu.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,371 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * readdir in userspace. -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* bits for struct aufs_rdu.flags */ -+#define AuRdu_CALLED 1 -+#define AuRdu_CONT (1 << 1) -+#define AuRdu_FULL (1 << 2) -+#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) -+#define au_fset_rdu(flags, name) \ -+ do { (flags) |= AuRdu_##name; } while (0) -+#define au_fclr_rdu(flags, name) \ -+ do { (flags) &= ~AuRdu_##name; } while (0) -+ -+struct au_rdu_arg { -+ struct dir_context ctx; -+ struct aufs_rdu *rdu; -+ union au_rdu_ent_ul ent; -+ unsigned long end; -+ -+ struct super_block *sb; -+ int err; -+}; -+ -+static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, -+ loff_t offset, u64 h_ino, unsigned int d_type) -+{ -+ int err, len; -+ struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); -+ struct aufs_rdu *rdu = arg->rdu; -+ struct au_rdu_ent ent; -+ -+ err = 0; -+ arg->err = 0; -+ au_fset_rdu(rdu->cookie.flags, CALLED); -+ len = au_rdu_len(nlen); -+ if (arg->ent.ul + len < arg->end) { -+ ent.ino = h_ino; -+ ent.bindex = rdu->cookie.bindex; -+ ent.type = d_type; -+ ent.nlen = nlen; -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ ent.type = DT_UNKNOWN; -+ -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = -EFAULT; -+ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) -+ goto out; -+ if (copy_to_user(arg->ent.e->name, name, nlen)) -+ goto out; -+ /* the terminating NULL */ -+ if (__put_user(0, arg->ent.e->name + nlen)) -+ goto out; -+ err = 0; -+ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ -+ arg->ent.ul += len; -+ rdu->rent++; -+ } else { -+ err = -EFAULT; -+ au_fset_rdu(rdu->cookie.flags, FULL); -+ rdu->full = 1; -+ rdu->tail = arg->ent; -+ } -+ -+out: -+ /* AuTraceErr(err); */ -+ return err; -+} -+ -+static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) -+{ -+ int err; -+ loff_t offset; -+ struct au_rdu_cookie *cookie = &arg->rdu->cookie; -+ -+ /* we don't have to care (FMODE_32BITHASH | FMODE_64BITHASH) for ext4 */ -+ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); -+ err = offset; -+ if (unlikely(offset != cookie->h_pos)) -+ goto out; -+ -+ err = 0; -+ do { -+ arg->err = 0; -+ au_fclr_rdu(cookie->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(h_file, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err -+ && au_ftest_rdu(cookie->flags, CALLED) -+ && !au_ftest_rdu(cookie->flags, FULL)); -+ cookie->h_pos = h_file->f_pos; -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ aufs_bindex_t bbot; -+ struct au_rdu_arg arg = { -+ .ctx = { -+ .actor = au_rdu_fill -+ } -+ }; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct file *h_file; -+ struct au_rdu_cookie *cookie = &rdu->cookie; -+ -+ /* VERIFY_WRITE */ -+ err = !access_ok(rdu->ent.e, rdu->sz); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu->rent = 0; -+ rdu->tail = rdu->ent; -+ rdu->full = 0; -+ arg.rdu = rdu; -+ arg.ent = rdu->ent; -+ arg.end = arg.ent.ul; -+ arg.end += rdu->sz; -+ -+ err = -ENOTDIR; -+ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) -+ goto out; -+ -+ err = security_file_permission(file, MAY_READ); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_path.dentry; -+ inode = d_inode(dentry); -+ inode_lock_shared(inode); -+ -+ arg.sb = inode->i_sb; -+ err = si_read_lock(arg.sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out_mtx; -+ err = au_alive_dir(dentry); -+ if (unlikely(err)) -+ goto out_si; -+ /* todo: reval? */ -+ fi_read_lock(file); -+ -+ err = -EAGAIN; -+ if (unlikely(au_ftest_rdu(cookie->flags, CONT) -+ && cookie->generation != au_figen(file))) -+ goto out_unlock; -+ -+ err = 0; -+ if (!rdu->blk) { -+ rdu->blk = au_sbi(arg.sb)->si_rdblk; -+ if (!rdu->blk) -+ rdu->blk = au_dir_size(file, /*dentry*/NULL); -+ } -+ bbot = au_fbtop(file); -+ if (cookie->bindex < bbot) -+ cookie->bindex = bbot; -+ bbot = au_fbbot_dir(file); -+ /* AuDbg("b%d, b%d\n", cookie->bindex, bbot); */ -+ for (; !err && cookie->bindex <= bbot; -+ cookie->bindex++, cookie->h_pos = 0) { -+ h_file = au_hf_dir(file, cookie->bindex); -+ if (!h_file) -+ continue; -+ -+ au_fclr_rdu(cookie->flags, FULL); -+ err = au_rdu_do(h_file, &arg); -+ AuTraceErr(err); -+ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) -+ break; -+ } -+ AuDbg("rent %llu\n", rdu->rent); -+ -+ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { -+ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); -+ au_fset_rdu(cookie->flags, CONT); -+ cookie->generation = au_figen(file); -+ } -+ -+ ii_read_lock_child(inode); -+ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibtop(inode))); -+ ii_read_unlock(inode); -+ -+out_unlock: -+ fi_read_unlock(file); -+out_si: -+ si_read_unlock(arg.sb); -+out_mtx: -+ inode_unlock_shared(inode); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ ino_t ino; -+ unsigned long long nent; -+ union au_rdu_ent_ul *u; -+ struct au_rdu_ent ent; -+ struct super_block *sb; -+ -+ err = 0; -+ nent = rdu->nent; -+ u = &rdu->ent; -+ sb = file->f_path.dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ while (nent-- > 0) { -+ /* unnecessary to support mmap_sem since this is a dir */ -+ err = copy_from_user(&ent, u->e, sizeof(ent)); -+ if (!err) -+ /* VERIFY_WRITE */ -+ err = !access_ok(&u->e->ino, sizeof(ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ -+ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ -+ if (!ent.wh) -+ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); -+ else -+ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, -+ &ino); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ break; -+ } -+ -+ err = __put_user(ino, &u->e->ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ u->ul += au_rdu_len(ent.nlen); -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_rdu_verify(struct aufs_rdu *rdu) -+{ -+ AuDbg("rdu{%llu, %p, %u | %u | %llu, %u, %u | " -+ "%llu, b%d, 0x%x, g%u}\n", -+ rdu->sz, rdu->ent.e, rdu->verify[AufsCtlRduV_SZ], -+ rdu->blk, -+ rdu->rent, rdu->shwh, rdu->full, -+ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, -+ rdu->cookie.generation); -+ -+ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu)) -+ return 0; -+ -+ AuDbg("%u:%u\n", -+ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu)); -+ return -EINVAL; -+} -+ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = (void __user *)arg; -+ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+#ifdef CONFIG_COMPAT -+long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = compat_ptr(arg); -+ -+ /* todo: get_user()? */ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu.ent.e = compat_ptr(rdu.ent.ul); -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ rdu.ent.ul = ptr_to_compat(rdu.ent.e); -+ rdu.tail.ul = ptr_to_compat(rdu.tail.e); -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+#endif -diff -Nurp linux-5.15.37/fs/aufs/rwsem.h linux-5.15.37-aufs/fs/aufs/rwsem.h ---- linux-5.15.37/fs/aufs/rwsem.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/rwsem.h 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,72 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * simple read-write semaphore wrappers -+ */ -+ -+#ifndef __AUFS_RWSEM_H__ -+#define __AUFS_RWSEM_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "debug.h" -+ -+/* in the future, the name 'au_rwsem' will be totally gone */ -+#define au_rwsem rw_semaphore -+ -+/* to debug easier, do not make them inlined functions */ -+#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) -+ -+#ifdef CONFIG_LOCKDEP -+/* rwsem_is_locked() is unusable */ -+#define AuRwMustReadLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 1)) -+#define AuRwMustWriteLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held_type(rw, 0)) -+#define AuRwMustAnyLock(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && !lockdep_is_held(rw)) -+#define AuRwDestroy(rw) AuDebugOn(IS_ENABLED(CONFIG_LOCKDEP) \ -+ && !lockdep_recursing(current) \ -+ && debug_locks \ -+ && lockdep_is_held(rw)) -+#else -+#define AuRwMustReadLock(rw) do {} while (0) -+#define AuRwMustWriteLock(rw) do {} while (0) -+#define AuRwMustAnyLock(rw) do {} while (0) -+#define AuRwDestroy(rw) do {} while (0) -+#endif -+ -+#define au_rw_init(rw) init_rwsem(rw) -+ -+#define au_rw_init_wlock(rw) do { \ -+ au_rw_init(rw); \ -+ down_write(rw); \ -+ } while (0) -+ -+#define au_rw_init_wlock_nested(rw, lsc) do { \ -+ au_rw_init(rw); \ -+ down_write_nested(rw, lsc); \ -+ } while (0) -+ -+#define au_rw_read_lock(rw) down_read(rw) -+#define au_rw_read_lock_nested(rw, lsc) down_read_nested(rw, lsc) -+#define au_rw_read_unlock(rw) up_read(rw) -+#define au_rw_dgrade_lock(rw) downgrade_write(rw) -+#define au_rw_write_lock(rw) down_write(rw) -+#define au_rw_write_lock_nested(rw, lsc) down_write_nested(rw, lsc) -+#define au_rw_write_unlock(rw) up_write(rw) -+/* why is not _nested version defined? */ -+#define au_rw_read_trylock(rw) down_read_trylock(rw) -+#define au_rw_write_trylock(rw) down_write_trylock(rw) -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_RWSEM_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/sbinfo.c linux-5.15.37-aufs/fs/aufs/sbinfo.c ---- linux-5.15.37/fs/aufs/sbinfo.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/sbinfo.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,303 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * superblock private data -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * they are necessary regardless sysfs is disabled. -+ */ -+void au_si_free(struct kobject *kobj) -+{ -+ int i; -+ struct au_sbinfo *sbinfo; -+ char *locked __maybe_unused; /* debug only */ -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ for (i = 0; i < AuPlink_NHASH; i++) -+ AuDebugOn(!hlist_bl_empty(sbinfo->si_plink + i)); -+ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); -+ -+ AuLCntZero(au_lcnt_read(&sbinfo->si_ninodes, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_ninodes, /*do_sync*/0); -+ AuLCntZero(au_lcnt_read(&sbinfo->si_nfiles, /*do_rev*/0)); -+ au_lcnt_fin(&sbinfo->si_nfiles, /*do_sync*/0); -+ -+ dbgaufs_si_fin(sbinfo); -+ au_rw_write_lock(&sbinfo->si_rwsem); -+ au_br_free(sbinfo); -+ au_rw_write_unlock(&sbinfo->si_rwsem); -+ -+ au_kfree_try_rcu(sbinfo->si_branch); -+ mutex_destroy(&sbinfo->si_xib_mtx); -+ AuRwDestroy(&sbinfo->si_rwsem); -+ -+ au_lcnt_wait_for_fin(&sbinfo->si_ninodes); -+ /* si_nfiles is waited too */ -+ au_kfree_rcu(sbinfo); -+} -+ -+struct au_sbinfo *au_si_alloc(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ int err, i; -+ -+ err = -ENOMEM; -+ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); -+ if (unlikely(!sbinfo)) -+ goto out; -+ -+ /* will be reallocated separately */ -+ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); -+ if (unlikely(!sbinfo->si_branch)) -+ goto out_sbinfo; -+ -+ err = sysaufs_si_init(sbinfo); -+ if (!err) { -+ dbgaufs_si_null(sbinfo); -+ err = dbgaufs_si_init(sbinfo); -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ } -+ if (unlikely(err)) -+ goto out_br; -+ -+ au_nwt_init(&sbinfo->si_nowait); -+ au_rw_init_wlock(&sbinfo->si_rwsem); -+ -+ au_lcnt_init(&sbinfo->si_ninodes, /*release*/NULL); -+ au_lcnt_init(&sbinfo->si_nfiles, /*release*/NULL); -+ -+ sbinfo->si_bbot = -1; -+ sbinfo->si_last_br_id = AUFS_BRANCH_MAX / 2; -+ -+ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; -+ sbinfo->si_wbr_create = AuWbrCreate_Def; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; -+ -+ au_fhsm_init(sbinfo); -+ -+ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def); -+ -+ sbinfo->si_xino_jiffy = jiffies; -+ sbinfo->si_xino_expire -+ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC); -+ mutex_init(&sbinfo->si_xib_mtx); -+ /* leave si_xib_last_pindex and si_xib_next_bit */ -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_aopen); -+ -+ sbinfo->si_rdcache = msecs_to_jiffies(AUFS_RDCACHE_DEF * MSEC_PER_SEC); -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ sbinfo->si_dirwh = AUFS_DIRWH_DEF; -+ -+ for (i = 0; i < AuPlink_NHASH; i++) -+ INIT_HLIST_BL_HEAD(sbinfo->si_plink + i); -+ init_waitqueue_head(&sbinfo->si_plink_wq); -+ spin_lock_init(&sbinfo->si_plink_maint_lock); -+ -+ INIT_HLIST_BL_HEAD(&sbinfo->si_files); -+ -+ /* with getattr by default */ -+ sbinfo->si_iop_array = aufs_iop; -+ -+ /* leave other members for sysaufs and si_mnt. */ -+ sbinfo->si_sb = sb; -+ if (sb) { -+ sb->s_fs_info = sbinfo; -+ si_pid_set(sb); -+ } -+ return sbinfo; /* success */ -+ -+out_br: -+ au_kfree_try_rcu(sbinfo->si_branch); -+out_sbinfo: -+ au_kfree_rcu(sbinfo); -+out: -+ return ERR_PTR(err); -+} -+ -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink) -+{ -+ int err, sz; -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*brp) * (sbinfo->si_bbot + 1); -+ if (unlikely(!sz)) -+ sz = sizeof(*brp); -+ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS, -+ may_shrink); -+ if (brp) { -+ sbinfo->si_branch = brp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_sigen_inc(struct super_block *sb) -+{ -+ unsigned int gen; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ gen = ++au_sbi(sb)->si_generation; -+ au_update_digen(sb->s_root); -+ inode = d_inode(sb->s_root); -+ au_update_iigen(inode, /*half*/0); -+ inode_inc_iversion(inode); -+ return gen; -+} -+ -+aufs_bindex_t au_new_br_id(struct super_block *sb) -+{ -+ aufs_bindex_t br_id; -+ int i; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { -+ br_id = ++sbinfo->si_last_br_id; -+ AuDebugOn(br_id < 0); -+ if (br_id && au_br_index(sb, br_id) < 0) -+ return br_id; -+ } -+ -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* it is ok that new 'nwt' tasks are appended while we are sleeping */ -+int si_read_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ err = 0; -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_read_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+int si_write_lock(struct super_block *sb, int flags) -+{ -+ int err; -+ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ -+ si_noflush_write_lock(sb); -+ err = au_plink_maint(sb, flags); -+ if (unlikely(err)) -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* dentry and super_block lock. call at entry point */ -+int aufs_read_lock(struct dentry *dentry, int flags) -+{ -+ int err; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_ftest_lock(flags, DW)) -+ di_write_lock_child(dentry); -+ else -+ di_read_lock_child(dentry, flags); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ err = au_digen_test(dentry, au_sigen(sb)); -+ if (!au_opt_test(au_mntflags(sb), UDBA_NONE)) -+ AuDebugOn(!err && au_dbrange_test(dentry)); -+ else if (!err) -+ err = au_dbrange_test(dentry); -+ if (unlikely(err)) -+ aufs_read_unlock(dentry, flags); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_unlock(struct dentry *dentry, int flags) -+{ -+ if (au_ftest_lock(flags, DW)) -+ di_write_unlock(dentry); -+ else -+ di_read_unlock(dentry, flags); -+ si_read_unlock(dentry->d_sb); -+} -+ -+void aufs_write_lock(struct dentry *dentry) -+{ -+ si_write_lock(dentry->d_sb, AuLock_FLUSH | AuLock_NOPLMW); -+ di_write_lock_child(dentry); -+} -+ -+void aufs_write_unlock(struct dentry *dentry) -+{ -+ di_write_unlock(dentry); -+ si_write_unlock(dentry->d_sb); -+} -+ -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) -+{ -+ int err; -+ unsigned int sigen; -+ struct super_block *sb; -+ -+ sb = d1->d_sb; -+ err = si_read_lock(sb, flags); -+ if (unlikely(err)) -+ goto out; -+ -+ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS)); -+ -+ if (au_ftest_lock(flags, GEN)) { -+ sigen = au_sigen(sb); -+ err = au_digen_test(d1, sigen); -+ AuDebugOn(!err && au_dbrange_test(d1)); -+ if (!err) { -+ err = au_digen_test(d2, sigen); -+ AuDebugOn(!err && au_dbrange_test(d2)); -+ } -+ if (unlikely(err)) -+ aufs_read_and_write_unlock2(d1, d2); -+ } -+ -+out: -+ return err; -+} -+ -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock2(d1, d2); -+ si_read_unlock(d1->d_sb); -+} -diff -Nurp linux-5.15.37/fs/aufs/super.c linux-5.15.37-aufs/fs/aufs/super.c ---- linux-5.15.37/fs/aufs/super.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/super.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,858 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * mount and super_block operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * super_operations -+ */ -+static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) -+{ -+ struct au_icntnr *c; -+ -+ c = au_cache_alloc_icntnr(); -+ if (c) { -+ au_icntnr_init(c); -+ inode_set_iversion(&c->vfs_inode, 1); /* sigen(sb); */ -+ c->iinfo.ii_hinode = NULL; -+ return &c->vfs_inode; -+ } -+ return NULL; -+} -+ -+static void aufs_destroy_inode(struct inode *inode) -+{ -+ if (!au_is_bad_inode(inode)) -+ au_iinfo_fin(inode); -+} -+ -+static void aufs_free_inode(struct inode *inode) -+{ -+ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); -+} -+ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino) -+{ -+ struct inode *inode; -+ int err; -+ -+ inode = iget_locked(sb, ino); -+ if (unlikely(!inode)) { -+ inode = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ if (!(inode->i_state & I_NEW)) -+ goto out; -+ -+ err = au_xigen_new(inode); -+ if (!err) -+ err = au_iinfo_init(inode); -+ if (!err) -+ inode_inc_iversion(inode); -+ else { -+ iget_failed(inode); -+ inode = ERR_PTR(err); -+ } -+ -+out: -+ /* never return NULL */ -+ AuDebugOn(!inode); -+ AuTraceErrPtr(inode); -+ return inode; -+} -+ -+/* lock free root dinfo */ -+static int au_show_brs(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct path path; -+ struct au_hdentry *hdp; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ bindex = 0; -+ hdp = au_hdentry(au_di(sb->s_root), bindex); -+ for (; !err && bindex <= bbot; bindex++, hdp++) { -+ br = au_sbr(sb, bindex); -+ path.mnt = au_br_mnt(br); -+ path.dentry = hdp->hd_dentry; -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s", perm.a); -+ if (bindex != bbot) -+ seq_putc(seq, ':'); -+ } -+ } -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, -+ const char *append) -+{ -+ char *p; -+ -+ p = fmt; -+ while (*pat != ':') -+ *p++ = *pat++; -+ *p++ = *pat++; -+ strcpy(p, append); -+ AuDebugOn(strlen(fmt) >= len); -+} -+ -+static void au_show_wbr_create(struct seq_file *m, int v, -+ struct au_sbinfo *sbinfo) -+{ -+ const char *pat; -+ char fmt[32]; -+ struct au_wbr_mfs *mfs; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ seq_puts(m, ",create="); -+ pat = au_optstr_wbr_create(v); -+ mfs = &sbinfo->si_wbr_mfs; -+ switch (v) { -+ case AuWbrCreate_TDP: -+ case AuWbrCreate_RR: -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ seq_puts(m, pat); -+ break; -+ case AuWbrCreate_MFSRR: -+ case AuWbrCreate_TDMFS: -+ case AuWbrCreate_PMFSRR: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%lu"); -+ seq_printf(m, fmt, -+ jiffies_to_msecs(mfs->mfs_expire) -+ / MSEC_PER_SEC); -+ break; -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_TDMFSV: -+ case AuWbrCreate_PMFSRRV: -+ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu:%lu"); -+ seq_printf(m, fmt, mfs->mfsrr_watermark, -+ jiffies_to_msecs(mfs->mfs_expire) / MSEC_PER_SEC); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static int au_show_xino(struct seq_file *seq, struct super_block *sb) -+{ -+#ifdef CONFIG_SYSFS -+ return 0; -+#else -+ int err; -+ const int len = sizeof(AUFS_XINO_FNAME) - 1; -+ aufs_bindex_t bindex, brid; -+ struct qstr *name; -+ struct file *f; -+ struct dentry *d, *h_root; -+ struct au_branch *br; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ err = 0; -+ f = au_sbi(sb)->si_xib; -+ if (!f) -+ goto out; -+ -+ /* stop printing the default xino path on the first writable branch */ -+ h_root = NULL; -+ bindex = au_xi_root(sb, f->f_path.dentry); -+ if (bindex >= 0) { -+ br = au_sbr_sb(sb, bindex); -+ h_root = au_br_dentry(br); -+ } -+ -+ d = f->f_path.dentry; -+ name = &d->d_name; -+ /* safe ->d_parent because the file is unlinked */ -+ if (d->d_parent == h_root -+ && name->len == len -+ && !memcmp(name->name, AUFS_XINO_FNAME, len)) -+ goto out; -+ -+ seq_puts(seq, ",xino="); -+ err = au_xino_path(seq, f); -+ -+out: -+ return err; -+#endif -+} -+ -+/* seq_file will re-call me in case of too long string */ -+static int aufs_show_options(struct seq_file *m, struct dentry *dentry) -+{ -+ int err; -+ unsigned int mnt_flags, v; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+#define AuBool(name, str) do { \ -+ v = au_opt_test(mnt_flags, name); \ -+ if (v != au_opt_test(AuOpt_Def, name)) \ -+ seq_printf(m, ",%s" #str, v ? "" : "no"); \ -+} while (0) -+ -+#define AuStr(name, str) do { \ -+ v = mnt_flags & AuOptMask_##name; \ -+ if (v != (AuOpt_Def & AuOptMask_##name)) \ -+ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ -+} while (0) -+ -+#define AuUInt(name, str, val) do { \ -+ if (val != AUFS_##name##_DEF) \ -+ seq_printf(m, "," #str "=%u", val); \ -+} while (0) -+ -+ sb = dentry->d_sb; -+ if (sb->s_flags & SB_POSIXACL) -+ seq_puts(m, ",acl"); -+#if 0 /* reserved for future use */ -+ if (sb->s_flags & SB_I_VERSION) -+ seq_puts(m, ",i_version"); -+#endif -+ -+ /* lock free root dinfo */ -+ si_noflush_read_lock(sb); -+ sbinfo = au_sbi(sb); -+ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); -+ -+ mnt_flags = au_mntflags(sb); -+ if (au_opt_test(mnt_flags, XINO)) { -+ err = au_show_xino(m, sb); -+ if (unlikely(err)) -+ goto out; -+ } else -+ seq_puts(m, ",noxino"); -+ -+ AuBool(TRUNC_XINO, trunc_xino); -+ AuStr(UDBA, udba); -+ AuBool(SHWH, shwh); -+ AuBool(PLINK, plink); -+ AuBool(DIO, dio); -+ AuBool(DIRPERM1, dirperm1); -+ -+ v = sbinfo->si_wbr_create; -+ if (v != AuWbrCreate_Def) -+ au_show_wbr_create(m, v, sbinfo); -+ -+ v = sbinfo->si_wbr_copyup; -+ if (v != AuWbrCopyup_Def) -+ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); -+ -+ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); -+ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) -+ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); -+ -+ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); -+ -+ v = jiffies_to_msecs(sbinfo->si_rdcache) / MSEC_PER_SEC; -+ AuUInt(RDCACHE, rdcache, v); -+ -+ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); -+ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); -+ -+ au_fhsm_show(m, sbinfo); -+ -+ AuBool(DIRREN, dirren); -+ AuBool(SUM, sum); -+ /* AuBool(SUM_W, wsum); */ -+ AuBool(WARN_PERM, warn_perm); -+ AuBool(VERBOSE, verbose); -+ -+out: -+ /* be sure to print "br:" last */ -+ if (!sysaufs_brs) { -+ seq_puts(m, ",br:"); -+ au_show_brs(m, sb); -+ } -+ si_read_unlock(sb); -+ return 0; -+ -+#undef AuBool -+#undef AuStr -+#undef AuUInt -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sum mode which returns the summation for statfs(2) */ -+ -+static u64 au_add_till_max(u64 a, u64 b) -+{ -+ u64 old; -+ -+ old = a; -+ a += b; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static u64 au_mul_till_max(u64 a, long mul) -+{ -+ u64 old; -+ -+ old = a; -+ a *= mul; -+ if (old <= a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) -+{ -+ int err; -+ long bsize, factor; -+ u64 blocks, bfree, bavail, files, ffree; -+ aufs_bindex_t bbot, bindex, i; -+ unsigned char shared; -+ struct path h_path; -+ struct super_block *h_sb; -+ -+ err = 0; -+ bsize = LONG_MAX; -+ files = 0; -+ ffree = 0; -+ blocks = 0; -+ bfree = 0; -+ bavail = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_path.mnt->mnt_sb; -+ shared = 0; -+ for (i = 0; !shared && i < bindex; i++) -+ shared = (au_sbr_sb(sb, i) == h_sb); -+ if (shared) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bsize > buf->f_bsize) { -+ /* -+ * we will reduce bsize, so we have to expand blocks -+ * etc. to match them again -+ */ -+ factor = (bsize / buf->f_bsize); -+ blocks = au_mul_till_max(blocks, factor); -+ bfree = au_mul_till_max(bfree, factor); -+ bavail = au_mul_till_max(bavail, factor); -+ bsize = buf->f_bsize; -+ } -+ -+ factor = (buf->f_bsize / bsize); -+ blocks = au_add_till_max(blocks, -+ au_mul_till_max(buf->f_blocks, factor)); -+ bfree = au_add_till_max(bfree, -+ au_mul_till_max(buf->f_bfree, factor)); -+ bavail = au_add_till_max(bavail, -+ au_mul_till_max(buf->f_bavail, factor)); -+ files = au_add_till_max(files, buf->f_files); -+ ffree = au_add_till_max(ffree, buf->f_ffree); -+ } -+ -+ buf->f_bsize = bsize; -+ buf->f_blocks = blocks; -+ buf->f_bfree = bfree; -+ buf->f_bavail = bavail; -+ buf->f_files = files; -+ buf->f_ffree = ffree; -+ buf->f_frsize = 0; -+ -+out: -+ return err; -+} -+ -+static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ int err; -+ struct path h_path; -+ struct super_block *sb; -+ -+ /* lock free root dinfo */ -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (!au_opt_test(au_mntflags(sb), SUM)) { -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_sbr_mnt(sb, 0); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, buf); -+ } else -+ err = au_statfs_sum(sb, buf); -+ si_read_unlock(sb); -+ -+ if (!err) { -+ buf->f_type = AUFS_SUPER_MAGIC; -+ buf->f_namelen = AUFS_MAX_NAMELEN; -+ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); -+ } -+ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_sync_fs(struct super_block *sb, int wait) -+{ -+ int err, e; -+ aufs_bindex_t bbot, bindex; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ -+ err = 0; -+ si_noflush_read_lock(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!au_br_writable(br->br_perm)) -+ continue; -+ -+ h_sb = au_sbr_sb(sb, bindex); -+ e = vfsub_sync_filesystem(h_sb); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even if an error happens */ -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* final actions when unmounting a file system */ -+static void aufs_put_super(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo) -+ kobject_put(&sbinfo->si_kobj); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg) -+{ -+ void *array; -+ unsigned long long n, sz; -+ -+ array = NULL; -+ n = 0; -+ if (!*hint) -+ goto out; -+ -+ if (*hint > ULLONG_MAX / sizeof(array)) { -+ array = ERR_PTR(-EMFILE); -+ pr_err("hint %llu\n", *hint); -+ goto out; -+ } -+ -+ sz = sizeof(array) * *hint; -+ array = kzalloc(sz, GFP_NOFS); -+ if (unlikely(!array)) -+ array = vzalloc(sz); -+ if (unlikely(!array)) { -+ array = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ n = cb(sb, array, *hint, arg); -+ AuDebugOn(n > *hint); -+ -+out: -+ *hint = n; -+ return array; -+} -+ -+static unsigned long long au_iarray_cb(struct super_block *sb, void *a, -+ unsigned long long max __maybe_unused, -+ void *arg) -+{ -+ unsigned long long n; -+ struct inode **p, *inode; -+ struct list_head *head; -+ -+ n = 0; -+ p = a; -+ head = arg; -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(inode, head, i_sb_list) { -+ if (!au_is_bad_inode(inode) -+ && au_ii(inode)->ii_btop >= 0) { -+ spin_lock(&inode->i_lock); -+ if (atomic_read(&inode->i_count)) { -+ au_igrab(inode); -+ *p++ = inode; -+ n++; -+ AuDebugOn(n > max); -+ } -+ spin_unlock(&inode->i_lock); -+ } -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ return n; -+} -+ -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max) -+{ -+ struct au_sbinfo *sbi; -+ -+ sbi = au_sbi(sb); -+ *max = au_lcnt_read(&sbi->si_ninodes, /*do_rev*/1); -+ return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes); -+} -+ -+void au_iarray_free(struct inode **a, unsigned long long max) -+{ -+ unsigned long long ull; -+ -+ for (ull = 0; ull < max; ull++) -+ iput(a[ull]); -+ kvfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * refresh dentry and inode at remount time. -+ */ -+/* todo: consolidate with simple_reval_dpath() and au_reval_for_attr() */ -+static int au_do_refresh(struct dentry *dentry, unsigned int dir_flags, -+ struct dentry *parent) -+{ -+ int err; -+ -+ di_write_lock_child(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ err = au_refresh_dentry(dentry, parent); -+ if (!err && dir_flags) -+ au_hn_reset(d_inode(dentry), dir_flags); -+ di_read_unlock(parent, AuLock_IR); -+ di_write_unlock(dentry); -+ -+ return err; -+} -+ -+static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen, -+ struct au_sbinfo *sbinfo, -+ const unsigned int dir_flags, unsigned int do_idop) -+{ -+ int err; -+ struct dentry *parent; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) { -+ if (d_really_is_positive(dentry)) { -+ if (!d_is_dir(dentry)) -+ err = au_do_refresh(dentry, /*dir_flags*/0, -+ parent); -+ else { -+ err = au_do_refresh(dentry, dir_flags, parent); -+ if (unlikely(err)) -+ au_fset_si(sbinfo, FAILED_REFRESH_DIR); -+ } -+ } else -+ err = au_do_refresh(dentry, /*dir_flags*/0, parent); -+ AuDbgDentry(dentry); -+ } -+ dput(parent); -+ -+ if (!err) { -+ if (do_idop) -+ au_refresh_dop(dentry, /*force_reval*/0); -+ } else -+ au_refresh_dop(dentry, /*force_reval*/1); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_refresh_d(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, i, j, ndentry, e; -+ unsigned int sigen; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *d; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root = sb->s_root; -+ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); -+ -+ if (do_idop) -+ au_refresh_dop(root, /*force_reval*/0); -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ sigen = au_sigen(sb); -+ sbinfo = au_sbi(sb); -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags, -+ do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even err */ -+ } -+ } -+ -+out_dpages: -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_refresh_i(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int sigen; -+ unsigned long long max, ull; -+ struct inode *inode, **array; -+ -+ array = au_iarray_alloc(sb, &max); -+ err = PTR_ERR(array); -+ if (IS_ERR(array)) -+ goto out; -+ -+ err = 0; -+ sigen = au_sigen(sb); -+ for (ull = 0; ull < max; ull++) { -+ inode = array[ull]; -+ if (unlikely(!inode)) -+ break; -+ -+ e = 0; -+ ii_write_lock_child(inode); -+ if (au_iigen(inode, NULL) != sigen) { -+ e = au_refresh_hinode_self(inode); -+ if (unlikely(e)) { -+ au_refresh_iop(inode, /*force_getattr*/1); -+ pr_err("error %d, i%lu\n", e, inode->i_ino); -+ if (!err) -+ err = e; -+ /* go on even if err */ -+ } -+ } -+ if (!e && do_idop) -+ au_refresh_iop(inode, /*force_getattr*/0); -+ ii_write_unlock(inode); -+ } -+ -+ au_iarray_free(array, max); -+ -+out: -+ return err; -+} -+ -+void au_remount_refresh(struct super_block *sb, unsigned int do_idop) -+{ -+ int err, e; -+ unsigned int udba; -+ aufs_bindex_t bindex, bbot; -+ struct dentry *root; -+ struct inode *inode; -+ struct au_branch *br; -+ struct au_sbinfo *sbi; -+ -+ au_sigen_inc(sb); -+ sbi = au_sbi(sb); -+ au_fclr_si(sbi, FAILED_REFRESH_DIR); -+ -+ root = sb->s_root; -+ DiMustNoWaiters(root); -+ inode = d_inode(root); -+ IiMustNoWaiters(inode); -+ -+ udba = au_opt_udba(sb); -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ err = au_hnotify_reset_br(udba, br, br->br_perm); -+ if (unlikely(err)) -+ AuIOErr("hnotify failed on br %d, %d, ignored\n", -+ bindex, err); -+ /* go on even if err */ -+ } -+ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); -+ -+ if (do_idop) { -+ if (au_ftest_si(sbi, NO_DREVAL)) { -+ AuDebugOn(sb->s_d_op == &aufs_dop_noreval); -+ sb->s_d_op = &aufs_dop_noreval; -+ AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr); -+ sbi->si_iop_array = aufs_iop_nogetattr; -+ } else { -+ AuDebugOn(sb->s_d_op == &aufs_dop); -+ sb->s_d_op = &aufs_dop; -+ AuDebugOn(sbi->si_iop_array == aufs_iop); -+ sbi->si_iop_array = aufs_iop; -+ } -+ pr_info("reset to %ps and %ps\n", -+ sb->s_d_op, sbi->si_iop_array); -+ } -+ -+ di_write_unlock(root); -+ err = au_refresh_d(sb, do_idop); -+ e = au_refresh_i(sb, do_idop); -+ if (unlikely(e && !err)) -+ err = e; -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ au_cpup_attr_all(inode, /*force*/1); -+ -+ if (unlikely(err)) -+ AuIOErr("refresh failed, ignored, %d\n", err); -+} -+ -+const struct super_operations aufs_sop = { -+ .alloc_inode = aufs_alloc_inode, -+ .destroy_inode = aufs_destroy_inode, -+ .free_inode = aufs_free_inode, -+ /* always deleting, no clearing */ -+ .drop_inode = generic_delete_inode, -+ .show_options = aufs_show_options, -+ .statfs = aufs_statfs, -+ .put_super = aufs_put_super, -+ .sync_fs = aufs_sync_fs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_alloc_root(struct super_block *sb) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *root; -+ -+ err = -ENOMEM; -+ inode = au_iget_locked(sb, AUFS_ROOT_INO); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out; -+ -+ inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ -+ inode->i_fop = &aufs_dir_fop; -+ inode->i_mode = S_IFDIR; -+ set_nlink(inode, 2); -+ unlock_new_inode(inode); -+ -+ root = d_make_root(inode); -+ if (unlikely(!root)) -+ goto out; -+ err = PTR_ERR(root); -+ if (IS_ERR(root)) -+ goto out; -+ -+ err = au_di_init(root); -+ if (!err) { -+ sb->s_root = root; -+ return 0; /* success */ -+ } -+ dput(root); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void aufs_kill_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *root; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ goto out; -+ -+ au_sbilist_del(sb); -+ -+ root = sb->s_root; -+ if (root) -+ aufs_write_lock(root); -+ else -+ __si_write_lock(sb); -+ -+ au_fhsm_fin(sb); -+ if (sbinfo->si_wbr_create_ops->fin) -+ sbinfo->si_wbr_create_ops->fin(sb); -+ if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) { -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE); -+ au_remount_refresh(sb, /*do_idop*/0); -+ } -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb, /*verbose*/1); -+ au_xino_clr(sb); -+ if (root) -+ au_dr_opt_flush(sb); -+ -+ if (root) -+ aufs_write_unlock(root); -+ else -+ __si_write_unlock(sb); -+ -+ sbinfo->si_sb = NULL; -+ au_nwt_flush(&sbinfo->si_nowait); -+ -+out: -+ kill_anon_super(sb); -+} -+ -+struct file_system_type aufs_fs_type = { -+ .name = AUFS_FSTYPE, -+ /* a race between rename and others */ -+ .fs_flags = FS_RENAME_DOES_D_MOVE -+ /* untested */ -+ /*| FS_ALLOW_IDMAP*/ -+ , -+ .init_fs_context = aufs_fsctx_init, -+ .parameters = aufs_fsctx_paramspec, -+ .kill_sb = aufs_kill_sb, -+ /* no need to __module_get() and module_put(). */ -+ .owner = THIS_MODULE, -+}; -diff -Nurp linux-5.15.37/fs/aufs/super.h linux-5.15.37-aufs/fs/aufs/super.h ---- linux-5.15.37/fs/aufs/super.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/super.h 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,579 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * super_block operations -+ */ -+ -+#ifndef __AUFS_SUPER_H__ -+#define __AUFS_SUPER_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "hbl.h" -+#include "lcnt.h" -+#include "rwsem.h" -+#include "wkq.h" -+ -+/* policies to select one among multiple writable branches */ -+struct au_wbr_copyup_operations { -+ int (*copyup)(struct dentry *dentry); -+}; -+ -+#define AuWbr_DIR 1 /* target is a dir */ -+#define AuWbr_PARENT (1 << 1) /* always require a parent */ -+ -+#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) -+#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } -+#define au_fclr_wbr(flags, name) { (flags) &= ~AuWbr_##name; } -+ -+struct au_wbr_create_operations { -+ int (*create)(struct dentry *dentry, unsigned int flags); -+ int (*init)(struct super_block *sb); -+ int (*fin)(struct super_block *sb); -+}; -+ -+struct au_wbr_mfs { -+ struct mutex mfs_lock; /* protect this structure */ -+ unsigned long mfs_jiffy; -+ unsigned long mfs_expire; -+ aufs_bindex_t mfs_bindex; -+ -+ unsigned long long mfsrr_bytes; -+ unsigned long long mfsrr_watermark; -+}; -+ -+#define AuPlink_NHASH 100 -+static inline int au_plink_hash(ino_t ino) -+{ -+ return ino % AuPlink_NHASH; -+} -+ -+/* File-based Hierarchical Storage Management */ -+struct au_fhsm { -+#ifdef CONFIG_AUFS_FHSM -+ /* allow only one process who can receive the notification */ -+ spinlock_t fhsm_spin; -+ pid_t fhsm_pid; -+ wait_queue_head_t fhsm_wqh; -+ atomic_t fhsm_readable; -+ -+ /* these are protected by si_rwsem */ -+ unsigned long fhsm_expire; -+ aufs_bindex_t fhsm_bottom; -+#endif -+}; -+ -+struct au_branch; -+struct au_sbinfo { -+ /* nowait tasks in the system-wide workqueue */ -+ struct au_nowait_tasks si_nowait; -+ -+ /* -+ * tried sb->s_umount, but failed due to the dependency between i_mutex. -+ * rwsem for au_sbinfo is necessary. -+ */ -+ struct au_rwsem si_rwsem; -+ -+ /* -+ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from -+ * remount. -+ */ -+ au_lcnt_t si_ninodes, si_nfiles; -+ -+ /* branch management */ -+ unsigned int si_generation; -+ -+ /* see AuSi_ flags */ -+ unsigned char au_si_status; -+ -+ aufs_bindex_t si_bbot; -+ -+ /* dirty trick to keep br_id plus */ -+ unsigned int si_last_br_id : -+ sizeof(aufs_bindex_t) * BITS_PER_BYTE - 1; -+ struct au_branch **si_branch; -+ -+ /* policy to select a writable branch */ -+ unsigned char si_wbr_copyup; -+ unsigned char si_wbr_create; -+ struct au_wbr_copyup_operations *si_wbr_copyup_ops; -+ struct au_wbr_create_operations *si_wbr_create_ops; -+ -+ /* round robin */ -+ atomic_t si_wbr_rr_next; -+ -+ /* most free space */ -+ struct au_wbr_mfs si_wbr_mfs; -+ -+ /* File-based Hierarchical Storage Management */ -+ struct au_fhsm si_fhsm; -+ -+ /* mount flags */ -+ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ -+ unsigned int si_mntflags; -+ -+ /* external inode number (bitmap and translation table) */ -+ loff_t si_ximaxent; /* max entries in a xino */ -+ -+ struct file *si_xib; -+ struct mutex si_xib_mtx; /* protect xib members */ -+ unsigned long *si_xib_buf; -+ unsigned long si_xib_last_pindex; -+ int si_xib_next_bit; -+ -+ unsigned long si_xino_jiffy; -+ unsigned long si_xino_expire; -+ /* reserved for future use */ -+ /* unsigned long long si_xib_limit; */ /* Max xib file size */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+ /* i_generation */ -+ /* todo: make xigen file an array to support many inode numbers */ -+ struct file *si_xigen; -+ atomic_t si_xigen_next; -+#endif -+ -+ /* dirty trick to support atomic_open */ -+ struct hlist_bl_head si_aopen; -+ -+ /* vdir parameters */ -+ unsigned long si_rdcache; /* max cache time in jiffies */ -+ unsigned int si_rdblk; /* deblk size */ -+ unsigned int si_rdhash; /* hash size */ -+ -+ /* -+ * If the number of whiteouts are larger than si_dirwh, leave all of -+ * them after au_whtmp_ren to reduce the cost of rmdir(2). -+ * future fsck.aufs or kernel thread will remove them later. -+ * Otherwise, remove all whiteouts and the dir in rmdir(2). -+ */ -+ unsigned int si_dirwh; -+ -+ /* pseudo_link list */ -+ struct hlist_bl_head si_plink[AuPlink_NHASH]; -+ wait_queue_head_t si_plink_wq; -+ spinlock_t si_plink_maint_lock; -+ pid_t si_plink_maint_pid; -+ -+ /* file list */ -+ struct hlist_bl_head si_files; -+ -+ /* with/without getattr, brother of sb->s_d_op */ -+ const struct inode_operations *si_iop_array; -+ -+ /* -+ * sysfs and lifetime management. -+ * this is not a small structure and it may be a waste of memory in case -+ * of sysfs is disabled, particularly when many aufs-es are mounted. -+ * but using sysfs is majority. -+ */ -+ struct kobject si_kobj; -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *si_dbgaufs; -+ struct dentry *si_dbgaufs_plink; -+ struct dentry *si_dbgaufs_xib; -+#ifdef CONFIG_AUFS_EXPORT -+ struct dentry *si_dbgaufs_xigen; -+#endif -+#endif -+ -+#ifdef CONFIG_AUFS_SBILIST -+ struct hlist_bl_node si_list; -+#endif -+ -+ /* dirty, necessary for unmounting, sysfs and sysrq */ -+ struct super_block *si_sb; -+}; -+ -+/* sbinfo status flags */ -+/* -+ * set true when refresh_dirs() failed at remount time. -+ * then try refreshing dirs at access time again. -+ * if it is false, refreshing dirs at access time is unnecessary -+ */ -+#define AuSi_FAILED_REFRESH_DIR 1 -+#define AuSi_FHSM (1 << 1) /* fhsm is active now */ -+#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ -+ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuSi_FHSM -+#define AuSi_FHSM 0 -+#endif -+ -+static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, -+ unsigned int flag) -+{ -+ AuRwMustAnyLock(&sbi->si_rwsem); -+ return sbi->au_si_status & flag; -+} -+#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) -+#define au_fset_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status |= AuSi_##name; \ -+} while (0) -+#define au_fclr_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status &= ~AuSi_##name; \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policy to select one among writable branches */ -+#define AuWbrCopyup(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) -+#define AuWbrCreate(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) -+ -+/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ -+#define AuLock_DW 1 /* write-lock dentry */ -+#define AuLock_IR (1 << 1) /* read-lock inode */ -+#define AuLock_IW (1 << 2) /* write-lock inode */ -+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ -+#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ -+ /* except RENAME_EXCHANGE */ -+#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ -+#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ -+#define AuLock_GEN (1 << 7) /* test digen/iigen */ -+#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) -+#define au_fset_lock(flags, name) \ -+ do { (flags) |= AuLock_##name; } while (0) -+#define au_fclr_lock(flags, name) \ -+ do { (flags) &= ~AuLock_##name; } while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* super.c */ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino); -+ -+typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array, -+ unsigned long long max, void *arg); -+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, -+ struct super_block *sb, void *arg); -+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max); -+void au_iarray_free(struct inode **a, unsigned long long max); -+ -+void au_remount_refresh(struct super_block *sb, unsigned int do_idop); -+extern const struct super_operations aufs_sop; -+int au_alloc_root(struct super_block *sb); -+extern struct file_system_type aufs_fs_type; -+ -+/* sbinfo.c */ -+void au_si_free(struct kobject *kobj); -+struct au_sbinfo *au_si_alloc(struct super_block *sb); -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink); -+ -+unsigned int au_sigen_inc(struct super_block *sb); -+aufs_bindex_t au_new_br_id(struct super_block *sb); -+ -+int si_read_lock(struct super_block *sb, int flags); -+int si_write_lock(struct super_block *sb, int flags); -+int aufs_read_lock(struct dentry *dentry, int flags); -+void aufs_read_unlock(struct dentry *dentry, int flags); -+void aufs_write_lock(struct dentry *dentry); -+void aufs_write_unlock(struct dentry *dentry); -+int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags); -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+/* wbr_policy.c */ -+extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; -+extern struct au_wbr_create_operations au_wbr_create_ops[]; -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex); -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop); -+ -+/* mvdown.c */ -+int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *arg); -+ -+#ifdef CONFIG_AUFS_FHSM -+/* fhsm.c */ -+ -+static inline pid_t au_fhsm_pid(struct au_fhsm *fhsm) -+{ -+ pid_t pid; -+ -+ spin_lock(&fhsm->fhsm_spin); -+ pid = fhsm->fhsm_pid; -+ spin_unlock(&fhsm->fhsm_spin); -+ -+ return pid; -+} -+ -+void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force); -+void au_fhsm_wrote_all(struct super_block *sb, int force); -+int au_fhsm_fd(struct super_block *sb, int oflags); -+int au_fhsm_br_alloc(struct au_branch *br); -+void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex); -+void au_fhsm_fin(struct super_block *sb); -+void au_fhsm_init(struct au_sbinfo *sbinfo); -+void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec); -+void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo); -+#else -+AuStubVoid(au_fhsm_wrote, struct super_block *sb, aufs_bindex_t bindex, -+ int force) -+AuStubVoid(au_fhsm_wrote_all, struct super_block *sb, int force) -+AuStub(int, au_fhsm_fd, return -EOPNOTSUPP, struct super_block *sb, int oflags) -+AuStub(pid_t, au_fhsm_pid, return 0, struct au_fhsm *fhsm) -+AuStubInt0(au_fhsm_br_alloc, struct au_branch *br) -+AuStubVoid(au_fhsm_set_bottom, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(au_fhsm_fin, struct super_block *sb) -+AuStubVoid(au_fhsm_init, struct au_sbinfo *sbinfo) -+AuStubVoid(au_fhsm_set, struct au_sbinfo *sbinfo, unsigned int sec) -+AuStubVoid(au_fhsm_show, struct seq_file *seq, struct au_sbinfo *sbinfo) -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_sbinfo *au_sbi(struct super_block *sb) -+{ -+ return sb->s_fs_info; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+int au_test_nfsd(void); -+void au_export_init(struct super_block *sb); -+void au_xigen_inc(struct inode *inode); -+int au_xigen_new(struct inode *inode); -+int au_xigen_set(struct super_block *sb, struct path *path); -+void au_xigen_clr(struct super_block *sb); -+ -+static inline int au_busy_or_stale(void) -+{ -+ if (!au_test_nfsd()) -+ return -EBUSY; -+ return -ESTALE; -+} -+#else -+AuStubInt0(au_test_nfsd, void) -+AuStubVoid(au_export_init, struct super_block *sb) -+AuStubVoid(au_xigen_inc, struct inode *inode) -+AuStubInt0(au_xigen_new, struct inode *inode) -+AuStubInt0(au_xigen_set, struct super_block *sb, struct path *path) -+AuStubVoid(au_xigen_clr, struct super_block *sb) -+AuStub(int, au_busy_or_stale, return -EBUSY, void) -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_SBILIST -+/* module.c */ -+extern struct hlist_bl_head au_sbilist; -+ -+static inline void au_sbilist_init(void) -+{ -+ INIT_HLIST_BL_HEAD(&au_sbilist); -+} -+ -+static inline void au_sbilist_add(struct super_block *sb) -+{ -+ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+static inline void au_sbilist_del(struct super_block *sb) -+{ -+ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); -+} -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+static inline void au_sbilist_lock(void) -+{ -+ hlist_bl_lock(&au_sbilist); -+} -+ -+static inline void au_sbilist_unlock(void) -+{ -+ hlist_bl_unlock(&au_sbilist); -+} -+#define AuGFP_SBILIST GFP_ATOMIC -+#else -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+#else -+AuStubVoid(au_sbilist_init, void) -+AuStubVoid(au_sbilist_add, struct super_block *sb) -+AuStubVoid(au_sbilist_del, struct super_block *sb) -+AuStubVoid(au_sbilist_lock, void) -+AuStubVoid(au_sbilist_unlock, void) -+#define AuGFP_SBILIST GFP_NOFS -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__init' function actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+#ifdef CONFIG_DEBUG_FS -+ sbinfo->si_dbgaufs = NULL; -+ sbinfo->si_dbgaufs_plink = NULL; -+ sbinfo->si_dbgaufs_xib = NULL; -+#ifdef CONFIG_AUFS_EXPORT -+ sbinfo->si_dbgaufs_xigen = NULL; -+#endif -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* current->atomic_flags */ -+/* this value should never corrupt the ones defined in linux/sched.h */ -+#define PFA_AUFS 0x10 -+ -+TASK_PFA_TEST(AUFS, test_aufs) /* task_test_aufs */ -+TASK_PFA_SET(AUFS, aufs) /* task_set_aufs */ -+TASK_PFA_CLEAR(AUFS, aufs) /* task_clear_aufs */ -+ -+static inline int si_pid_test(struct super_block *sb) -+{ -+ return !!task_test_aufs(current); -+} -+ -+static inline void si_pid_clr(struct super_block *sb) -+{ -+ AuDebugOn(!task_test_aufs(current)); -+ task_clear_aufs(current); -+} -+ -+static inline void si_pid_set(struct super_block *sb) -+{ -+ AuDebugOn(task_test_aufs(current)); -+ task_set_aufs(current); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock superblock. mainly for entry point functions */ -+#define __si_read_lock(sb) au_rw_read_lock(&au_sbi(sb)->si_rwsem) -+#define __si_write_lock(sb) au_rw_write_lock(&au_sbi(sb)->si_rwsem) -+#define __si_read_trylock(sb) au_rw_read_trylock(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock(sb) au_rw_write_trylock(&au_sbi(sb)->si_rwsem) -+/* -+#define __si_read_trylock_nested(sb) \ -+ au_rw_read_trylock_nested(&au_sbi(sb)->si_rwsem) -+#define __si_write_trylock_nested(sb) \ -+ au_rw_write_trylock_nested(&au_sbi(sb)->si_rwsem) -+*/ -+ -+#define __si_read_unlock(sb) au_rw_read_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_write_unlock(sb) au_rw_write_unlock(&au_sbi(sb)->si_rwsem) -+#define __si_downgrade_lock(sb) au_rw_dgrade_lock(&au_sbi(sb)->si_rwsem) -+ -+#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) -+#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) -+#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) -+ -+static inline void si_noflush_read_lock(struct super_block *sb) -+{ -+ __si_read_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_read_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_read_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+static inline void si_noflush_write_lock(struct super_block *sb) -+{ -+ __si_write_lock(sb); -+ si_pid_set(sb); -+} -+ -+static inline int si_noflush_write_trylock(struct super_block *sb) -+{ -+ int locked; -+ -+ locked = __si_write_trylock(sb); -+ if (locked) -+ si_pid_set(sb); -+ return locked; -+} -+ -+#if 0 /* reserved */ -+static inline int si_read_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_read_trylock(sb); -+} -+#endif -+ -+static inline void si_read_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_read_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline int si_write_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_write_trylock(sb); -+} -+#endif -+ -+static inline void si_write_unlock(struct super_block *sb) -+{ -+ si_pid_clr(sb); -+ __si_write_unlock(sb); -+} -+ -+#if 0 /* reserved */ -+static inline void si_downgrade_lock(struct super_block *sb) -+{ -+ __si_downgrade_lock(sb); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline aufs_bindex_t au_sbbot(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_bbot; -+} -+ -+static inline unsigned int au_mntflags(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_mntflags; -+} -+ -+static inline unsigned int au_sigen(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_generation; -+} -+ -+static inline struct au_branch *au_sbr(struct super_block *sb, -+ aufs_bindex_t bindex) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_branch[0 + bindex]; -+} -+ -+static inline loff_t au_xi_maxent(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_ximaxent; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_SUPER_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/sysaufs.c linux-5.15.37-aufs/fs/aufs/sysaufs.c ---- linux-5.15.37/fs/aufs/sysaufs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/sysaufs.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,80 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface and lifetime management -+ * they are necessary regardless sysfs is disabled. -+ */ -+ -+#include -+#include "aufs.h" -+ -+unsigned long sysaufs_si_mask; -+struct kset *sysaufs_kset; -+ -+#define AuSiAttr(_name) { \ -+ .attr = { .name = __stringify(_name), .mode = 0444 }, \ -+ .show = sysaufs_si_##_name, \ -+} -+ -+static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); -+struct attribute *sysaufs_si_attrs[] = { -+ &sysaufs_si_attr_xi_path.attr, -+ NULL, -+}; -+ -+static const struct sysfs_ops au_sbi_ops = { -+ .show = sysaufs_si_show -+}; -+ -+static struct kobj_type au_sbi_ktype = { -+ .release = au_si_free, -+ .sysfs_ops = &au_sbi_ops, -+ .default_attrs = sysaufs_si_attrs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ sbinfo->si_kobj.kset = sysaufs_kset; -+ /* cf. sysaufs_name() */ -+ err = kobject_init_and_add -+ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_kset->kobj*/NULL, -+ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); -+ -+ return err; -+} -+ -+void sysaufs_fin(void) -+{ -+ sysfs_remove_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ kset_unregister(sysaufs_kset); -+} -+ -+int __init sysaufs_init(void) -+{ -+ int err; -+ -+ do { -+ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); -+ } while (!sysaufs_si_mask); -+ -+ err = -EINVAL; -+ sysaufs_kset = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); -+ if (unlikely(!sysaufs_kset)) -+ goto out; -+ err = PTR_ERR(sysaufs_kset); -+ if (IS_ERR(sysaufs_kset)) -+ goto out; -+ err = sysfs_create_group(&sysaufs_kset->kobj, sysaufs_attr_group); -+ if (unlikely(err)) -+ kset_unregister(sysaufs_kset); -+ -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/sysaufs.h linux-5.15.37-aufs/fs/aufs/sysaufs.h ---- linux-5.15.37/fs/aufs/sysaufs.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/sysaufs.h 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,89 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface and mount lifetime management -+ */ -+ -+#ifndef __SYSAUFS_H__ -+#define __SYSAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "module.h" -+ -+struct super_block; -+struct au_sbinfo; -+ -+struct sysaufs_si_attr { -+ struct attribute attr; -+ int (*show)(struct seq_file *seq, struct super_block *sb); -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sysaufs.c */ -+extern unsigned long sysaufs_si_mask; -+extern struct kset *sysaufs_kset; -+extern struct attribute *sysaufs_si_attrs[]; -+int sysaufs_si_init(struct au_sbinfo *sbinfo); -+int __init sysaufs_init(void); -+void sysaufs_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* some people doesn't like to show a pointer in kernel */ -+static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) -+{ -+ return sysaufs_si_mask ^ (unsigned long)sbinfo; -+} -+ -+#define SysaufsSiNamePrefix "si_" -+#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) -+static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) -+{ -+ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", -+ sysaufs_si_id(sbinfo)); -+} -+ -+struct au_branch; -+#ifdef CONFIG_SYSFS -+/* sysfs.c */ -+extern struct attribute_group *sysaufs_attr_group; -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf); -+long au_brinfo_ioctl(struct file *file, unsigned long arg); -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg); -+#endif -+ -+void sysaufs_br_init(struct au_branch *br); -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+ -+#define sysaufs_brs_init() do {} while (0) -+ -+#else -+#define sysaufs_attr_group NULL -+ -+AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) -+AuStub(ssize_t, sysaufs_si_show, return 0, struct kobject *kobj, -+ struct attribute *attr, char *buf) -+AuStubVoid(sysaufs_br_init, struct au_branch *br) -+AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+ -+static inline void sysaufs_brs_init(void) -+{ -+ sysaufs_brs = 0; -+} -+ -+#endif /* CONFIG_SYSFS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __SYSAUFS_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/sysfs.c linux-5.15.37-aufs/fs/aufs/sysfs.c ---- linux-5.15.37/fs/aufs/sysfs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/sysfs.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,338 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sysfs interface -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static struct attribute *au_attr[] = { -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group sysaufs_attr_group_body = { -+ .attrs = au_attr -+}; -+ -+struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ err = au_xino_path(seq, au_sbi(sb)->si_xib); -+ seq_putc(seq, '\n'); -+ } -+ return err; -+} -+ -+/* -+ * the lifetime of branch is independent from the entry under sysfs. -+ * sysfs handles the lifetime of the entry, and never call ->show() after it is -+ * unlinked. -+ */ -+static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, -+ aufs_bindex_t bindex, int idx) -+{ -+ int err; -+ struct path path; -+ struct dentry *root; -+ struct au_branch *br; -+ au_br_perm_str_t perm; -+ -+ AuDbg("b%d\n", bindex); -+ -+ err = 0; -+ root = sb->s_root; -+ di_read_lock_parent(root, !AuLock_IR); -+ br = au_sbr(sb, bindex); -+ -+ switch (idx) { -+ case AuBrSysfs_BR: -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(root, bindex); -+ err = au_seq_path(seq, &path); -+ if (!err) { -+ au_optstr_br_perm(&perm, br->br_perm); -+ seq_printf(seq, "=%s\n", perm.a); -+ } -+ break; -+ case AuBrSysfs_BRID: -+ seq_printf(seq, "%d\n", br->br_id); -+ break; -+ } -+ di_read_unlock(root, !AuLock_IR); -+ if (unlikely(err || seq_has_overflowed(seq))) -+ err = -E2BIG; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct seq_file *au_seq(char *p, ssize_t len) -+{ -+ struct seq_file *seq; -+ -+ seq = kzalloc(sizeof(*seq), GFP_NOFS); -+ if (seq) { -+ /* mutex_init(&seq.lock); */ -+ seq->buf = p; -+ seq->size = len; -+ return seq; /* success */ -+ } -+ -+ seq = ERR_PTR(-ENOMEM); -+ return seq; -+} -+ -+#define SysaufsBr_PREFIX "br" -+#define SysaufsBrid_PREFIX "brid" -+ -+/* todo: file size may exceed PAGE_SIZE */ -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ int idx; -+ long l; -+ aufs_bindex_t bbot; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct seq_file *seq; -+ char *name; -+ struct attribute **cattr; -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ sb = sbinfo->si_sb; -+ -+ /* -+ * prevent a race condition between sysfs and aufs. -+ * for instance, sysfs_file_read() calls sysfs_get_active_two() which -+ * prohibits maintaining the sysfs entries. -+ * hew we acquire read lock after sysfs_get_active_two(). -+ * on the other hand, the remount process may maintain the sysfs/aufs -+ * entries after acquiring write lock. -+ * it can cause a deadlock. -+ * simply we gave up processing read here. -+ */ -+ err = -EBUSY; -+ if (unlikely(!si_noflush_read_trylock(sb))) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_unlock; -+ -+ name = (void *)attr->name; -+ cattr = sysaufs_si_attrs; -+ while (*cattr) { -+ if (!strcmp(name, (*cattr)->name)) { -+ err = container_of(*cattr, struct sysaufs_si_attr, attr) -+ ->show(seq, sb); -+ goto out_seq; -+ } -+ cattr++; -+ } -+ -+ if (!strncmp(name, SysaufsBrid_PREFIX, -+ sizeof(SysaufsBrid_PREFIX) - 1)) { -+ idx = AuBrSysfs_BRID; -+ name += sizeof(SysaufsBrid_PREFIX) - 1; -+ } else if (!strncmp(name, SysaufsBr_PREFIX, -+ sizeof(SysaufsBr_PREFIX) - 1)) { -+ idx = AuBrSysfs_BR; -+ name += sizeof(SysaufsBr_PREFIX) - 1; -+ } else -+ BUG(); -+ -+ err = kstrtol(name, 10, &l); -+ if (!err) { -+ bbot = au_sbbot(sb); -+ if (l <= bbot) -+ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx); -+ else -+ err = -ENOENT; -+ } -+ -+out_seq: -+ if (!err) { -+ err = seq->count; -+ /* sysfs limit */ -+ if (unlikely(err == PAGE_SIZE)) -+ err = -EFBIG; -+ } -+ au_kfree_rcu(seq); -+out_unlock: -+ si_read_unlock(sb); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_brinfo(struct super_block *sb, union aufs_brinfo __user *arg) -+{ -+ int err; -+ int16_t brid; -+ aufs_bindex_t bindex, bbot; -+ size_t sz; -+ char *buf; -+ struct seq_file *seq; -+ struct au_branch *br; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ bbot = au_sbbot(sb); -+ err = bbot + 1; -+ if (!arg) -+ goto out; -+ -+ err = -ENOMEM; -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_buf; -+ -+ sz = sizeof(*arg) - offsetof(union aufs_brinfo, path); -+ for (bindex = 0; bindex <= bbot; bindex++, arg++) { -+ /* VERIFY_WRITE */ -+ err = !access_ok(arg, sizeof(*arg)); -+ if (unlikely(err)) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ brid = br->br_id; -+ BUILD_BUG_ON(sizeof(brid) != sizeof(arg->id)); -+ err = __put_user(brid, &arg->id); -+ if (unlikely(err)) -+ break; -+ -+ BUILD_BUG_ON(sizeof(br->br_perm) != sizeof(arg->perm)); -+ err = __put_user(br->br_perm, &arg->perm); -+ if (unlikely(err)) -+ break; -+ -+ err = au_seq_path(seq, &br->br_path); -+ if (unlikely(err)) -+ break; -+ seq_putc(seq, '\0'); -+ if (!seq_has_overflowed(seq)) { -+ err = copy_to_user(arg->path, seq->buf, seq->count); -+ seq->count = 0; -+ if (unlikely(err)) -+ break; -+ } else { -+ err = -E2BIG; -+ goto out_seq; -+ } -+ } -+ if (unlikely(err)) -+ err = -EFAULT; -+ -+out_seq: -+ au_kfree_rcu(seq); -+out_buf: -+ free_page((unsigned long)buf); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+long au_brinfo_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, (void __user *)arg); -+} -+ -+#ifdef CONFIG_COMPAT -+long au_brinfo_compat_ioctl(struct file *file, unsigned long arg) -+{ -+ return au_brinfo(file->f_path.dentry->d_sb, compat_ptr(arg)); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+void sysaufs_br_init(struct au_branch *br) -+{ -+ int i; -+ struct au_brsysfs *br_sysfs; -+ struct attribute *attr; -+ -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ attr = &br_sysfs->attr; -+ sysfs_attr_init(attr); -+ attr->name = br_sysfs->name; -+ attr->mode = 0444; -+ br_sysfs++; -+ } -+} -+ -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_branch *br; -+ struct kobject *kobj; -+ struct au_brsysfs *br_sysfs; -+ int i; -+ aufs_bindex_t bbot; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ sysfs_remove_file(kobj, &br_sysfs->attr); -+ br_sysfs++; -+ } -+ } -+} -+ -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err, i; -+ aufs_bindex_t bbot; -+ struct kobject *kobj; -+ struct au_branch *br; -+ struct au_brsysfs *br_sysfs; -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bbot = au_sbbot(sb); -+ for (; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ br_sysfs = br->br_sysfs; -+ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name), -+ SysaufsBr_PREFIX "%d", bindex); -+ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name), -+ SysaufsBrid_PREFIX "%d", bindex); -+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { -+ err = sysfs_create_file(kobj, &br_sysfs->attr); -+ if (unlikely(err)) -+ pr_warn("failed %s under sysfs(%d)\n", -+ br_sysfs->name, err); -+ br_sysfs++; -+ } -+ } -+} -diff -Nurp linux-5.15.37/fs/aufs/sysrq.c linux-5.15.37-aufs/fs/aufs/sysrq.c ---- linux-5.15.37/fs/aufs/sysrq.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/sysrq.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,136 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * magic sysrq handler -+ */ -+ -+/* #include */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void sysrq_sb(struct super_block *sb) -+{ -+ char *plevel; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct hlist_bl_head *files; -+ struct hlist_bl_node *pos; -+ struct au_finfo *finfo; -+ struct inode *i; -+ -+ plevel = au_plevel; -+ au_plevel = KERN_WARNING; -+ -+ /* since we define pr_fmt, call printk directly */ -+#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str) -+ -+ sbinfo = au_sbi(sb); -+ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); -+ pr("superblock\n"); -+ au_dpri_sb(sb); -+ -+#if 0 /* reserved */ -+ do { -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ -+ err = au_dpages_init(&dpages, GFP_ATOMIC); -+ if (unlikely(err)) -+ break; -+ err = au_dcsub_pages(&dpages, sb->s_root, NULL, NULL); -+ if (!err) -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) -+ au_dpri_dentry(dpage->dentries[j]); -+ } -+ au_dpages_free(&dpages); -+ } while (0); -+#endif -+ -+ pr("isolated inode\n"); -+ spin_lock(&sb->s_inode_list_lock); -+ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { -+ spin_lock(&i->i_lock); -+ if (hlist_empty(&i->i_dentry)) -+ au_dpri_inode(i); -+ spin_unlock(&i->i_lock); -+ } -+ spin_unlock(&sb->s_inode_list_lock); -+ -+ pr("files\n"); -+ files = &au_sbi(sb)->si_files; -+ hlist_bl_lock(files); -+ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { -+ umode_t mode; -+ -+ file = finfo->fi_file; -+ mode = file_inode(file)->i_mode; -+ if (!special_file(mode)) -+ au_dpri_file(file); -+ } -+ hlist_bl_unlock(files); -+ pr("done\n"); -+ -+#undef pr -+ au_plevel = plevel; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* module parameter */ -+static char *aufs_sysrq_key = "a"; -+module_param_named(sysrq, aufs_sysrq_key, charp, 0444); -+MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); -+ -+static void au_sysrq(int key __maybe_unused) -+{ -+ struct au_sbinfo *sbinfo; -+ struct hlist_bl_node *pos; -+ -+ lockdep_off(); -+ au_sbilist_lock(); -+ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) -+ sysrq_sb(sbinfo->si_sb); -+ au_sbilist_unlock(); -+ lockdep_on(); -+} -+ -+static struct sysrq_key_op au_sysrq_op = { -+ .handler = au_sysrq, -+ .help_msg = "Aufs", -+ .action_msg = "Aufs", -+ .enable_mask = SYSRQ_ENABLE_DUMP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_sysrq_init(void) -+{ -+ int err; -+ char key; -+ -+ err = -1; -+ key = *aufs_sysrq_key; -+ if ('a' <= key && key <= 'z') -+ err = register_sysrq_key(key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d, sysrq=%c\n", err, key); -+ return err; -+} -+ -+void au_sysrq_fin(void) -+{ -+ int err; -+ -+ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d (ignored)\n", err); -+} -diff -Nurp linux-5.15.37/fs/aufs/vdir.c linux-5.15.37-aufs/fs/aufs/vdir.c ---- linux-5.15.37/fs/aufs/vdir.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/vdir.c 2022-04-08 20:22:30.615616621 +0300 -@@ -0,0 +1,883 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * virtual or vertical directory -+ */ -+ -+#include -+#include "aufs.h" -+ -+static unsigned int calc_size(int nlen) -+{ -+ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); -+} -+ -+static int set_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) { -+ p->de->de_str.len = 0; -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -1; /* error */ -+} -+ -+/* returns true or false */ -+static int is_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) -+ return !p->de->de_str.len; -+ return 1; -+} -+ -+static unsigned char *last_deblk(struct au_vdir *vdir) -+{ -+ return vdir->vd_deblk[vdir->vd_nblk - 1]; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* estimate the appropriate size for name hash table */ -+unsigned int au_rdhash_est(loff_t sz) -+{ -+ unsigned int n; -+ -+ n = UINT_MAX; -+ sz >>= 10; -+ if (sz < n) -+ n = sz; -+ if (sz < AUFS_RDHASH_DEF) -+ n = AUFS_RDHASH_DEF; -+ /* pr_info("n %u\n", n); */ -+ return n; -+} -+ -+/* -+ * the allocated memory has to be freed by -+ * au_nhash_wh_free() or au_nhash_de_free(). -+ */ -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) -+{ -+ struct hlist_head *head; -+ unsigned int u; -+ size_t sz; -+ -+ sz = sizeof(*nhash->nh_head) * num_hash; -+ head = kmalloc(sz, gfp); -+ if (head) { -+ nhash->nh_num = num_hash; -+ nhash->nh_head = head; -+ for (u = 0; u < num_hash; u++) -+ INIT_HLIST_HEAD(head++); -+ return 0; /* success */ -+ } -+ -+ return -ENOMEM; -+} -+ -+static void nhash_count(struct hlist_head *head) -+{ -+#if 0 /* debugging */ -+ unsigned long n; -+ struct hlist_node *pos; -+ -+ n = 0; -+ hlist_for_each(pos, head) -+ n++; -+ pr_info("%lu\n", n); -+#endif -+} -+ -+static void au_nhash_wh_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_wh *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, wh_hash) -+ au_kfree_rcu(pos); -+} -+ -+static void au_nhash_de_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_dehstr *pos; -+ struct hlist_node *node; -+ -+ hlist_for_each_entry_safe(pos, node, head, hash) -+ au_cache_free_vdir_dehstr(pos); -+} -+ -+static void au_nhash_do_free(struct au_nhash *nhash, -+ void (*free)(struct hlist_head *head)) -+{ -+ unsigned int n; -+ struct hlist_head *head; -+ -+ n = nhash->nh_num; -+ if (!n) -+ return; -+ -+ head = nhash->nh_head; -+ while (n-- > 0) { -+ nhash_count(head); -+ free(head++); -+ } -+ au_kfree_try_rcu(nhash->nh_head); -+} -+ -+void au_nhash_wh_free(struct au_nhash *whlist) -+{ -+ au_nhash_do_free(whlist, au_nhash_wh_do_free); -+} -+ -+static void au_nhash_de_free(struct au_nhash *delist) -+{ -+ au_nhash_do_free(delist, au_nhash_de_do_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit) -+{ -+ int num; -+ unsigned int u, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ -+ num = 0; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (u = 0; u < n; u++, head++) -+ hlist_for_each_entry(pos, head, wh_hash) -+ if (pos->wh_bindex == btgt && ++num > limit) -+ return 1; -+ return 0; -+} -+ -+static struct hlist_head *au_name_hash(struct au_nhash *nhash, -+ unsigned char *name, -+ unsigned int len) -+{ -+ unsigned int v; -+ /* const unsigned int magic_bit = 12; */ -+ -+ AuDebugOn(!nhash->nh_num || !nhash->nh_head); -+ -+ v = 0; -+ if (len > 8) -+ len = 8; -+ while (len--) -+ v += *name++; -+ /* v = hash_long(v, magic_bit); */ -+ v %= nhash->nh_num; -+ return nhash->nh_head + v; -+} -+ -+static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, -+ int nlen) -+{ -+ return str->len == nlen && !memcmp(str->name, name, nlen); -+} -+ -+/* returns found or not */ -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(whlist, name, nlen); -+ hlist_for_each_entry(pos, head, wh_hash) { -+ str = &pos->wh_str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* returns found(true) or not */ -+static int test_known(struct au_nhash *delist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_dehstr *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(delist, name, nlen); -+ hlist_for_each_entry(pos, head, hash) { -+ str = pos->str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, -+ unsigned char d_type) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ wh->wh_ino = ino; -+ wh->wh_type = d_type; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh) -+{ -+ int err; -+ struct au_vdir_destr *str; -+ struct au_vdir_wh *wh; -+ -+ AuDbg("%.*s\n", nlen, name); -+ AuDebugOn(!whlist->nh_num || !whlist->nh_head); -+ -+ err = -ENOMEM; -+ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); -+ if (unlikely(!wh)) -+ goto out; -+ -+ err = 0; -+ wh->wh_bindex = bindex; -+ if (shwh) -+ au_shwh_init_wh(wh, ino, d_type); -+ str = &wh->wh_str; -+ str->len = nlen; -+ memcpy(str->name, name, nlen); -+ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+static int append_deblk(struct au_vdir *vdir) -+{ -+ int err; -+ unsigned long ul; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, deblk_end; -+ unsigned char **o; -+ -+ err = -ENOMEM; -+ o = au_krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!o)) -+ goto out; -+ -+ vdir->vd_deblk = o; -+ p.deblk = kmalloc(deblk_sz, GFP_NOFS); -+ if (p.deblk) { -+ ul = vdir->vd_nblk++; -+ vdir->vd_deblk[ul] = p.deblk; -+ vdir->vd_last.ul = ul; -+ vdir->vd_last.p.deblk = p.deblk; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ } -+ -+out: -+ return err; -+} -+ -+static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, -+ unsigned int d_type, struct au_nhash *delist) -+{ -+ int err; -+ unsigned int sz; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, *room, deblk_end; -+ struct au_vdir_dehstr *dehstr; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ room = &vdir->vd_last.p; -+ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk -+ || !is_deblk_end(room, &deblk_end)); -+ -+ sz = calc_size(nlen); -+ if (unlikely(sz > deblk_end.deblk - room->deblk)) { -+ err = append_deblk(vdir); -+ if (unlikely(err)) -+ goto out; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ /* smp_mb(); */ -+ AuDebugOn(room->deblk != p.deblk); -+ } -+ -+ err = -ENOMEM; -+ dehstr = au_cache_alloc_vdir_dehstr(); -+ if (unlikely(!dehstr)) -+ goto out; -+ -+ dehstr->str = &room->de->de_str; -+ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); -+ room->de->de_ino = ino; -+ room->de->de_type = d_type; -+ room->de->de_str.len = nlen; -+ memcpy(room->de->de_str.name, name, nlen); -+ -+ err = 0; -+ room->deblk += sz; -+ if (unlikely(set_deblk_end(room, &deblk_end))) -+ err = append_deblk(vdir); -+ /* smp_mb(); */ -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_vdir_free(struct au_vdir *vdir) -+{ -+ unsigned char **deblk; -+ -+ deblk = vdir->vd_deblk; -+ while (vdir->vd_nblk--) -+ au_kfree_try_rcu(*deblk++); -+ au_kfree_try_rcu(vdir->vd_deblk); -+ au_cache_free_vdir(vdir); -+} -+ -+static struct au_vdir *alloc_vdir(struct file *file) -+{ -+ struct au_vdir *vdir; -+ struct super_block *sb; -+ int err; -+ -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ err = -ENOMEM; -+ vdir = au_cache_alloc_vdir(); -+ if (unlikely(!vdir)) -+ goto out; -+ -+ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); -+ if (unlikely(!vdir->vd_deblk)) -+ goto out_free; -+ -+ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; -+ if (!vdir->vd_deblk_sz) { -+ /* estimate the appropriate size for deblk */ -+ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); -+ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ -+ } -+ vdir->vd_nblk = 0; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ err = append_deblk(vdir); -+ if (!err) -+ return vdir; /* success */ -+ -+ au_kfree_try_rcu(vdir->vd_deblk); -+ -+out_free: -+ au_cache_free_vdir(vdir); -+out: -+ vdir = ERR_PTR(err); -+ return vdir; -+} -+ -+static int reinit_vdir(struct au_vdir *vdir) -+{ -+ int err; -+ union au_vdir_deblk_p p, deblk_end; -+ -+ while (vdir->vd_nblk > 1) { -+ au_kfree_try_rcu(vdir->vd_deblk[vdir->vd_nblk - 1]); -+ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ -+ vdir->vd_nblk--; -+ } -+ p.deblk = vdir->vd_deblk[0]; -+ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ /* keep vd_dblk_sz */ -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ /* smp_mb(); */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuFillVdir_CALLED 1 -+#define AuFillVdir_WHABLE (1 << 1) -+#define AuFillVdir_SHWH (1 << 2) -+#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) -+#define au_fset_fillvdir(flags, name) \ -+ do { (flags) |= AuFillVdir_##name; } while (0) -+#define au_fclr_fillvdir(flags, name) \ -+ do { (flags) &= ~AuFillVdir_##name; } while (0) -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuFillVdir_SHWH -+#define AuFillVdir_SHWH 0 -+#endif -+ -+struct fillvdir_arg { -+ struct dir_context ctx; -+ struct file *file; -+ struct au_vdir *vdir; -+ struct au_nhash delist; -+ struct au_nhash whlist; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ int err; -+}; -+ -+static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, -+ loff_t offset __maybe_unused, u64 h_ino, -+ unsigned int d_type) -+{ -+ struct fillvdir_arg *arg = container_of(ctx, struct fillvdir_arg, ctx); -+ char *name = (void *)__name; -+ struct super_block *sb; -+ ino_t ino; -+ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); -+ -+ arg->err = 0; -+ sb = arg->file->f_path.dentry->d_sb; -+ au_fset_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (nlen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (test_known(&arg->delist, name, nlen) -+ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already exists or whiteouted */ -+ -+ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); -+ if (!arg->err) { -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ d_type = DT_UNKNOWN; -+ arg->err = append_de(arg->vdir, name, nlen, ino, -+ d_type, &arg->delist); -+ } -+ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { -+ name += AUFS_WH_PFX_LEN; -+ nlen -= AUFS_WH_PFX_LEN; -+ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already whiteouted */ -+ -+ ino = 0; /* just to suppress a warning */ -+ if (shwh) -+ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, -+ &ino); -+ if (!arg->err) { -+ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) -+ d_type = DT_UNKNOWN; -+ arg->err = au_nhash_append_wh -+ (&arg->whlist, name, nlen, ino, d_type, -+ arg->bindex, shwh); -+ } -+ } -+ -+out: -+ if (!arg->err) -+ arg->vdir->vd_jiffy = jiffies; -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, -+ struct au_nhash *whlist, struct au_nhash *delist) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ int err; -+ unsigned int nh, u; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct hlist_node *n; -+ char *p, *o; -+ struct au_vdir_destr *destr; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); -+ -+ err = -ENOMEM; -+ o = p = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ nh = whlist->nh_num; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ for (u = 0; u < nh; u++) { -+ head = whlist->nh_head + u; -+ hlist_for_each_entry_safe(pos, n, head, wh_hash) { -+ destr = &pos->wh_str; -+ memcpy(p, destr->name, destr->len); -+ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, -+ pos->wh_ino, pos->wh_type, delist); -+ if (unlikely(err)) -+ break; -+ } -+ } -+ -+ free_page((unsigned long)o); -+ -+out: -+ AuTraceErr(err); -+ return err; -+#else -+ return 0; -+#endif -+} -+ -+static int au_do_read_vdir(struct fillvdir_arg *arg) -+{ -+ int err; -+ unsigned int rdhash; -+ loff_t offset; -+ aufs_bindex_t bbot, bindex, btop; -+ unsigned char shwh; -+ struct file *hf, *file; -+ struct super_block *sb; -+ -+ file = arg->file; -+ sb = file->f_path.dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); -+ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out_delist; -+ -+ err = 0; -+ arg->flags = 0; -+ shwh = 0; -+ if (au_opt_test(au_mntflags(sb), SHWH)) { -+ shwh = 1; -+ au_fset_fillvdir(arg->flags, SHWH); -+ } -+ btop = au_fbtop(file); -+ bbot = au_fbbot_dir(file); -+ for (bindex = btop; !err && bindex <= bbot; bindex++) { -+ hf = au_hf_dir(file, bindex); -+ if (!hf) -+ continue; -+ -+ offset = vfsub_llseek(hf, 0, SEEK_SET); -+ err = offset; -+ if (unlikely(offset)) -+ break; -+ -+ arg->bindex = bindex; -+ au_fclr_fillvdir(arg->flags, WHABLE); -+ if (shwh -+ || (bindex != bbot -+ && au_br_whable(au_sbr_perm(sb, bindex)))) -+ au_fset_fillvdir(arg->flags, WHABLE); -+ do { -+ arg->err = 0; -+ au_fclr_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_iterate_dir(hf, &arg->ctx); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); -+ -+ /* -+ * dir_relax() may be good for concurrency, but aufs should not -+ * use it since it will cause a lockdep problem. -+ */ -+ } -+ -+ if (!err && shwh) -+ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); -+ -+ au_nhash_wh_free(&arg->whlist); -+ -+out_delist: -+ au_nhash_de_free(&arg->delist); -+out: -+ return err; -+} -+ -+static int read_vdir(struct file *file, int may_read) -+{ -+ int err; -+ unsigned long expire; -+ unsigned char do_read; -+ struct fillvdir_arg arg = { -+ .ctx = { -+ .actor = fillvdir -+ } -+ }; -+ struct inode *inode; -+ struct au_vdir *vdir, *allocated; -+ -+ err = 0; -+ inode = file_inode(file); -+ IMustLock(inode); -+ IiMustWriteLock(inode); -+ SiMustAnyLock(inode->i_sb); -+ -+ allocated = NULL; -+ do_read = 0; -+ expire = au_sbi(inode->i_sb)->si_rdcache; -+ vdir = au_ivdir(inode); -+ if (!vdir) { -+ do_read = 1; -+ vdir = alloc_vdir(file); -+ err = PTR_ERR(vdir); -+ if (IS_ERR(vdir)) -+ goto out; -+ err = 0; -+ allocated = vdir; -+ } else if (may_read -+ && (!inode_eq_iversion(inode, vdir->vd_version) -+ || time_after(jiffies, vdir->vd_jiffy + expire))) { -+ do_read = 1; -+ err = reinit_vdir(vdir); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ if (!do_read) -+ return 0; /* success */ -+ -+ arg.file = file; -+ arg.vdir = vdir; -+ err = au_do_read_vdir(&arg); -+ if (!err) { -+ /* file->f_pos = 0; */ /* todo: ctx->pos? */ -+ vdir->vd_version = inode_query_iversion(inode); -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ if (allocated) -+ au_set_ivdir(inode, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) -+{ -+ int err, rerr; -+ unsigned long ul, n; -+ const unsigned int deblk_sz = src->vd_deblk_sz; -+ -+ AuDebugOn(tgt->vd_nblk != 1); -+ -+ err = -ENOMEM; -+ if (tgt->vd_nblk < src->vd_nblk) { -+ unsigned char **p; -+ -+ p = au_krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, -+ GFP_NOFS, /*may_shrink*/0); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk = p; -+ } -+ -+ if (tgt->vd_deblk_sz != deblk_sz) { -+ unsigned char *p; -+ -+ tgt->vd_deblk_sz = deblk_sz; -+ p = au_krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS, -+ /*may_shrink*/1); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk[0] = p; -+ } -+ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); -+ tgt->vd_version = src->vd_version; -+ tgt->vd_jiffy = src->vd_jiffy; -+ -+ n = src->vd_nblk; -+ for (ul = 1; ul < n; ul++) { -+ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, -+ GFP_NOFS); -+ if (unlikely(!tgt->vd_deblk[ul])) -+ goto out; -+ tgt->vd_nblk++; -+ } -+ tgt->vd_nblk = n; -+ tgt->vd_last.ul = tgt->vd_last.ul; -+ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; -+ tgt->vd_last.p.deblk += src->vd_last.p.deblk -+ - src->vd_deblk[src->vd_last.ul]; -+ /* smp_mb(); */ -+ return 0; /* success */ -+ -+out: -+ rerr = reinit_vdir(tgt); -+ BUG_ON(rerr); -+ return err; -+} -+ -+int au_vdir_init(struct file *file) -+{ -+ int err; -+ struct inode *inode; -+ struct au_vdir *vdir_cache, *allocated; -+ -+ /* test file->f_pos here instead of ctx->pos */ -+ err = read_vdir(file, !file->f_pos); -+ if (unlikely(err)) -+ goto out; -+ -+ allocated = NULL; -+ vdir_cache = au_fvdir_cache(file); -+ if (!vdir_cache) { -+ vdir_cache = alloc_vdir(file); -+ err = PTR_ERR(vdir_cache); -+ if (IS_ERR(vdir_cache)) -+ goto out; -+ allocated = vdir_cache; -+ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { -+ /* test file->f_pos here instead of ctx->pos */ -+ err = reinit_vdir(vdir_cache); -+ if (unlikely(err)) -+ goto out; -+ } else -+ return 0; /* success */ -+ -+ inode = file_inode(file); -+ err = copy_vdir(vdir_cache, au_ivdir(inode)); -+ if (!err) { -+ file->f_version = inode_query_iversion(inode); -+ if (allocated) -+ au_set_fvdir_cache(file, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+out: -+ return err; -+} -+ -+static loff_t calc_offset(struct au_vdir *vdir) -+{ -+ loff_t offset; -+ union au_vdir_deblk_p p; -+ -+ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; -+ offset = vdir->vd_last.p.deblk - p.deblk; -+ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; -+ return offset; -+} -+ -+/* returns true or false */ -+static int seek_vdir(struct file *file, struct dir_context *ctx) -+{ -+ int valid; -+ unsigned int deblk_sz; -+ unsigned long ul, n; -+ loff_t offset; -+ union au_vdir_deblk_p p, deblk_end; -+ struct au_vdir *vdir_cache; -+ -+ valid = 1; -+ vdir_cache = au_fvdir_cache(file); -+ offset = calc_offset(vdir_cache); -+ AuDbg("offset %lld\n", offset); -+ if (ctx->pos == offset) -+ goto out; -+ -+ vdir_cache->vd_last.ul = 0; -+ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; -+ if (!ctx->pos) -+ goto out; -+ -+ valid = 0; -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ ul = div64_u64(ctx->pos, deblk_sz); -+ AuDbg("ul %lu\n", ul); -+ if (ul >= vdir_cache->vd_nblk) -+ goto out; -+ -+ n = vdir_cache->vd_nblk; -+ for (; ul < n; ul++) { -+ p.deblk = vdir_cache->vd_deblk[ul]; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ offset = ul; -+ offset *= deblk_sz; -+ while (!is_deblk_end(&p, &deblk_end) && offset < ctx->pos) { -+ unsigned int l; -+ -+ l = calc_size(p.de->de_str.len); -+ offset += l; -+ p.deblk += l; -+ } -+ if (!is_deblk_end(&p, &deblk_end)) { -+ valid = 1; -+ vdir_cache->vd_last.ul = ul; -+ vdir_cache->vd_last.p = p; -+ break; -+ } -+ } -+ -+out: -+ /* smp_mb(); */ -+ if (!valid) -+ AuDbg("valid %d\n", !valid); -+ return valid; -+} -+ -+int au_vdir_fill_de(struct file *file, struct dir_context *ctx) -+{ -+ unsigned int l, deblk_sz; -+ union au_vdir_deblk_p deblk_end; -+ struct au_vdir *vdir_cache; -+ struct au_vdir_de *de; -+ -+ if (!seek_vdir(file, ctx)) -+ return 0; -+ -+ vdir_cache = au_fvdir_cache(file); -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ while (1) { -+ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ deblk_end.deblk += deblk_sz; -+ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { -+ de = vdir_cache->vd_last.p.de; -+ AuDbg("%.*s, off%lld, i%lu, dt%d\n", -+ de->de_str.len, de->de_str.name, ctx->pos, -+ (unsigned long)de->de_ino, de->de_type); -+ if (unlikely(!dir_emit(ctx, de->de_str.name, -+ de->de_str.len, de->de_ino, -+ de->de_type))) { -+ /* todo: ignore the error caused by udba? */ -+ /* return err; */ -+ return 0; -+ } -+ -+ l = calc_size(de->de_str.len); -+ vdir_cache->vd_last.p.deblk += l; -+ ctx->pos += l; -+ } -+ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { -+ vdir_cache->vd_last.ul++; -+ vdir_cache->vd_last.p.deblk -+ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ ctx->pos = deblk_sz * vdir_cache->vd_last.ul; -+ continue; -+ } -+ break; -+ } -+ -+ /* smp_mb(); */ -+ return 0; -+} -diff -Nurp linux-5.15.37/fs/aufs/vfsub.c linux-5.15.37-aufs/fs/aufs/vfsub.c ---- linux-5.15.37/fs/aufs/vfsub.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/vfsub.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,905 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb) -+{ -+ if (!au_test_fuse(h_sb) || !au_userns) -+ return 0; -+ -+ return is_current_mnt_ns(mnt) ? 0 : -EACCES; -+} -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb) -+{ -+ int err; -+ -+ lockdep_off(); -+ down_read(&h_sb->s_umount); -+ err = sync_filesystem(h_sb); -+ up_read(&h_sb->s_umount); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did) -+{ -+ int err; -+ 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 */ -+ err = 0; -+ if (!did) -+ did = &err; -+ h_sb = h_path->dentry->d_sb; -+ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); -+ if (*did) -+ err = vfsub_getattr(h_path, &st); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct file *vfsub_dentry_open(struct path *path, int flags) -+{ -+ return dentry_open(path, flags /* | __FMODE_NONOTIFY */, -+ current_cred()); -+} -+ -+struct file *vfsub_filp_open(const char *path, int oflags, int mode) -+{ -+ struct file *file; -+ -+ lockdep_off(); -+ file = filp_open(path, -+ oflags /* | __FMODE_NONOTIFY */, -+ mode); -+ lockdep_on(); -+ if (IS_ERR(file)) -+ goto out; -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+out: -+ return file; -+} -+ -+/* -+ * Ideally this function should call VFS:do_last() in order to keep all its -+ * checkings. But it is very hard for aufs to regenerate several VFS internal -+ * structure such as nameidata. This is a second (or third) best approach. -+ * cf. linux/fs/namei.c:do_last(), lookup_open() and atomic_open(). -+ */ -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args) -+{ -+ int err; -+ struct au_branch *br = args->br; -+ struct file *file = args->file; -+ /* copied from linux/fs/namei.c:atomic_open() */ -+ struct dentry *const DENTRY_NOT_SET = (void *)-1UL; -+ -+ IMustLock(dir); -+ AuDebugOn(!dir->i_op->atomic_open); -+ -+ err = au_br_test_oflag(args->open_flag, br); -+ if (unlikely(err)) -+ goto out; -+ -+ au_lcnt_inc(&br->br_nfiles); -+ file->f_path.dentry = DENTRY_NOT_SET; -+ file->f_path.mnt = au_br_mnt(br); -+ AuDbg("%ps\n", dir->i_op->atomic_open); -+ err = dir->i_op->atomic_open(dir, dentry, file, args->open_flag, -+ args->create_mode); -+ if (unlikely(err < 0)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* temporary workaround for nfsv4 branch */ -+ if (au_test_nfs(dir->i_sb)) -+ nfs_mark_for_revalidate(dir); -+ -+ if (file->f_mode & FMODE_CREATED) -+ fsnotify_create(dir, dentry); -+ if (!(file->f_mode & FMODE_OPENED)) { -+ au_lcnt_dec(&br->br_nfiles); -+ goto out; -+ } -+ -+ /* todo: call VFS:may_open() here */ -+ /* todo: ima_file_check() too? */ -+ if (!err && (args->open_flag & __FMODE_EXEC)) -+ err = deny_write_access(file); -+ if (!err) -+ fsnotify_open(file); -+ else -+ au_lcnt_dec(&br->br_nfiles); -+ /* note that the file is created and still opened */ -+ -+out: -+ return err; -+} -+ -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) -+{ -+ int err; -+ -+ err = kern_path(name, flags, path); -+ if (!err && d_is_positive(path->dentry)) -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+struct dentry *vfsub_lookup_one_len_unlocked(const char *name, -+ struct path *ppath, int len) -+{ -+ struct path path; -+ -+ path.dentry = lookup_one_len_unlocked(name, ppath->dentry, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ 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 path *ppath, -+ int len) -+{ -+ struct path path; -+ -+ /* VFS checks it too, but by WARN_ON_ONCE() */ -+ IMustLock(d_inode(ppath->dentry)); -+ -+ path.dentry = lookup_one_len(name, ppath->dentry, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ 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; -+} -+ -+void vfsub_call_lkup_one(void *args) -+{ -+ struct vfsub_lkup_one_args *a = args; -+ *a->errp = vfsub_lkup_one(a->name, a->ppath); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ struct dentry *d; -+ -+ lockdep_off(); -+ d = lock_rename(d1, d2); -+ lockdep_on(); -+ au_hn_suspend(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_suspend(hdir2); -+ -+ return d; -+} -+ -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ au_hn_resume(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_resume(hdir2); -+ lockdep_off(); -+ unlock_rename(d1, d2); -+ lockdep_on(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, 0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_create(userns, dir, path->dentry, mode, want_excl); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_symlink(path, d, symname); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_symlink(userns, dir, path->dentry, symname); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_mknod(userns, dir, path->dentry, mode, dev); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+static int au_test_nlink(struct inode *inode) -+{ -+ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ -+ -+ if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) -+ return 0; -+ return -EMLINK; -+} -+ -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ err = au_test_nlink(d_inode(src_dentry)); -+ if (unlikely(err)) -+ return err; -+ -+ /* we don't call may_linkat() */ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_link(src_dentry, path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_link(src_dentry, userns, dir, path->dentry, delegated_inode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ /* fuse has different memory inode for the same inumber */ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags) -+{ -+ int err; -+ struct renamedata rd; -+ struct path tmp = { -+ .mnt = path->mnt -+ }; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ IMustLock(src_dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ tmp.dentry = src_dentry->d_parent; -+ err = security_path_rename(&tmp, src_dentry, path, d, /*flags*/0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ rd.old_mnt_userns = mnt_user_ns(path->mnt); -+ rd.old_dir = src_dir; -+ rd.old_dentry = src_dentry; -+ rd.new_mnt_userns = rd.old_mnt_userns; -+ rd.new_dir = dir; -+ rd.new_dentry = path->dentry; -+ rd.delegated_inode = delegated_inode; -+ rd.flags = flags; -+ lockdep_off(); -+ err = vfs_rename(&rd); -+ lockdep_on(); -+ if (!err) { -+ int did; -+ -+ tmp.dentry = d->d_parent; -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mkdir(path, d, mode); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_mkdir(userns, dir, path->dentry, mode); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+int vfsub_rmdir(struct inode *dir, struct path *path) -+{ -+ int err; -+ struct dentry *d; -+ struct user_namespace *userns; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_rmdir(path, d); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ userns = mnt_user_ns(path->mnt); -+ -+ lockdep_off(); -+ err = vfs_rmdir(userns, dir, path->dentry); -+ lockdep_on(); -+ if (!err) { -+ struct path tmp = { -+ .dentry = path->dentry->d_parent, -+ .mnt = path->mnt -+ }; -+ -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: support mmap_sem? */ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_read(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_read(file, kbuf, count, ppos); -+ lockdep_on(); -+ AuTraceErr(err); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = vfs_write(file, ubuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ -+ lockdep_off(); -+ err = kernel_write(file, kbuf, count, ppos); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_flush(struct file *file, fl_owner_t id) -+{ -+ int err; -+ -+ err = 0; -+ if (file->f_op->flush) { -+ if (!au_test_nfs(file->f_path.dentry->d_sb)) -+ err = file->f_op->flush(file, id); -+ else { -+ lockdep_off(); -+ err = file->f_op->flush(file, id); -+ lockdep_on(); -+ } -+ if (!err) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); -+ /*ignore*/ -+ } -+ return err; -+} -+ -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx) -+{ -+ int err; -+ -+ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); -+ -+ lockdep_off(); -+ err = iterate_dir(file, ctx); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+ return err; -+} -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_to(in, ppos, pipe, len, flags); -+ lockdep_on(); -+ file_accessed(in); -+ if (err >= 0) -+ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = do_splice_from(pipe, out, ppos, len, flags); -+ lockdep_on(); -+ if (err >= 0) -+ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+int vfsub_fsync(struct file *file, struct path *path, int datasync) -+{ -+ int err; -+ -+ /* file can be NULL */ -+ lockdep_off(); -+ err = vfs_fsync(file, datasync); -+ lockdep_on(); -+ if (!err) { -+ if (!path) { -+ AuDebugOn(!file); -+ path = &file->f_path; -+ } -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ } -+ return err; -+} -+ -+/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file) -+{ -+ int err; -+ struct inode *h_inode; -+ struct super_block *h_sb; -+ struct user_namespace *h_userns; -+ -+ if (!h_file) { -+ err = vfsub_truncate(h_path, length); -+ goto out; -+ } -+ -+ h_inode = d_inode(h_path->dentry); -+ h_sb = h_inode->i_sb; -+ lockdep_off(); -+ sb_start_write(h_sb); -+ lockdep_on(); -+ err = security_path_truncate(h_path); -+ if (!err) { -+ h_userns = mnt_user_ns(h_path->mnt); -+ lockdep_off(); -+ err = do_truncate(h_userns, h_path->dentry, length, attr, -+ h_file); -+ lockdep_on(); -+ } -+ lockdep_off(); -+ sb_end_write(h_sb); -+ lockdep_on(); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_vfsub_mkdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ int mode; -+}; -+ -+static void au_call_vfsub_mkdir(void *args) -+{ -+ struct au_vfsub_mkdir_args *a = args; -+ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); -+} -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err, do_sio, wkq_err; -+ struct user_namespace *userns; -+ -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_mkdir(dir, path, mode); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_mkdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .mode = mode -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+struct au_vfsub_rmdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+}; -+ -+static void au_call_vfsub_rmdir(void *args) -+{ -+ struct au_vfsub_rmdir_args *a = args; -+ *a->errp = vfsub_rmdir(a->dir, a->path); -+} -+ -+int vfsub_sio_rmdir(struct inode *dir, struct path *path) -+{ -+ int err, do_sio, wkq_err; -+ struct user_namespace *userns; -+ -+ userns = mnt_user_ns(path->mnt); -+ do_sio = au_test_h_perm_sio(userns, dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ lockdep_off(); -+ err = vfsub_rmdir(dir, path); -+ lockdep_on(); -+ } else { -+ struct au_vfsub_rmdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct notify_change_args { -+ int *errp; -+ struct path *path; -+ struct iattr *ia; -+ struct inode **delegated_inode; -+}; -+ -+static void call_notify_change(void *args) -+{ -+ struct notify_change_args *a = args; -+ struct inode *h_inode; -+ struct user_namespace *userns; -+ -+ h_inode = d_inode(a->path->dentry); -+ IMustLock(h_inode); -+ -+ *a->errp = -EPERM; -+ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ userns = mnt_user_ns(a->path->mnt); -+ lockdep_off(); -+ *a->errp = notify_change(userns, a->path->dentry, a->ia, -+ a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) -+ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ -+ } -+ AuTraceErr(*a->errp); -+} -+ -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ call_notify_change(&args); -+ -+ return err; -+} -+ -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode) -+{ -+ int err, wkq_err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia, -+ .delegated_inode = delegated_inode -+ }; -+ -+ wkq_err = au_wkq_wait(call_notify_change, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct unlink_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ struct inode **delegated_inode; -+}; -+ -+static void call_unlink(void *args) -+{ -+ struct unlink_args *a = args; -+ struct dentry *d = a->path->dentry; -+ struct inode *h_inode; -+ struct user_namespace *userns; -+ const int stop_sillyrename = (au_test_nfs(d->d_sb) -+ && au_dcount(d) == 1); -+ -+ IMustLock(a->dir); -+ -+ a->path->dentry = d->d_parent; -+ *a->errp = security_path_unlink(a->path, d); -+ a->path->dentry = d; -+ if (unlikely(*a->errp)) -+ return; -+ -+ if (!stop_sillyrename) -+ dget(d); -+ h_inode = NULL; -+ if (d_is_positive(d)) { -+ h_inode = d_inode(d); -+ ihold(h_inode); -+ } -+ -+ userns = mnt_user_ns(a->path->mnt); -+ lockdep_off(); -+ *a->errp = vfs_unlink(userns, a->dir, d, a->delegated_inode); -+ lockdep_on(); -+ if (!*a->errp) { -+ struct path tmp = { -+ .dentry = d->d_parent, -+ .mnt = a->path->mnt -+ }; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+ if (!stop_sillyrename) -+ dput(d); -+ if (h_inode) -+ iput(h_inode); -+ -+ AuTraceErr(*a->errp); -+} -+ -+/* -+ * @dir: must be locked. -+ * @dentry: target dentry. -+ */ -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force) -+{ -+ int err; -+ struct unlink_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .delegated_inode = delegated_inode -+ }; -+ -+ if (!force) -+ call_unlink(&args); -+ else { -+ int wkq_err; -+ -+ wkq_err = au_wkq_wait(call_unlink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/vfsub.h linux-5.15.37-aufs/fs/aufs/vfsub.h ---- linux-5.15.37/fs/aufs/vfsub.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/vfsub.h 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,345 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#ifndef __AUFS_VFSUB_H__ -+#define __AUFS_VFSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+#include "debug.h" -+ -+/* copied from linux/fs/internal.h */ -+/* todo: BAD approach!! */ -+extern void __mnt_drop_write(struct vfsmount *); -+extern struct file *alloc_empty_file(int, const struct cred *); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for lower inode */ -+/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ -+/* reduce? gave up. */ -+enum { -+ AuLsc_I_Begin = I_MUTEX_PARENT2, /* 5 */ -+ AuLsc_I_PARENT, /* lower inode, parent first */ -+ AuLsc_I_PARENT2, /* copyup dirs */ -+ AuLsc_I_PARENT3, /* copyup wh */ -+ AuLsc_I_CHILD, -+ AuLsc_I_CHILD2, -+ AuLsc_I_End -+}; -+ -+/* to debug easier, do not make them inlined functions */ -+#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) -+#define IMustLock(i) AuDebugOn(!inode_is_locked(i)) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void vfsub_drop_nlink(struct inode *inode) -+{ -+ AuDebugOn(!inode->i_nlink); -+ drop_nlink(inode); -+} -+ -+static inline void vfsub_dead_dir(struct inode *inode) -+{ -+ AuDebugOn(!S_ISDIR(inode->i_mode)); -+ inode->i_flags |= S_DEAD; -+ clear_nlink(inode); -+} -+ -+static inline int vfsub_native_ro(struct inode *inode) -+{ -+ return sb_rdonly(inode->i_sb) -+ || IS_RDONLY(inode) -+ /* || IS_APPEND(inode) */ -+ || IS_IMMUTABLE(inode); -+} -+ -+#ifdef CONFIG_AUFS_BR_FUSE -+int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb); -+#else -+AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb); -+#endif -+ -+int vfsub_sync_filesystem(struct super_block *h_sb); -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did); -+struct file *vfsub_dentry_open(struct path *path, int flags); -+struct file *vfsub_filp_open(const char *path, int oflags, int mode); -+struct au_branch; -+struct vfsub_aopen_args { -+ struct file *file; -+ unsigned int open_flag; -+ umode_t create_mode; -+ struct au_branch *br; -+}; -+int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, -+ struct vfsub_aopen_args *args); -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path); -+ -+struct dentry *vfsub_lookup_one_len_unlocked(const char *name, -+ 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 path *ppath; -+}; -+ -+static inline struct dentry *vfsub_lkup_one(struct qstr *name, -+ struct path *ppath) -+{ -+ return vfsub_lookup_one_len(name->name, ppath, name->len); -+} -+ -+void vfsub_call_lkup_one(void *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_mnt_want_write(struct vfsmount *mnt) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = mnt_want_write(mnt); -+ lockdep_on(); -+ return err; -+} -+ -+static inline void vfsub_mnt_drop_write(struct vfsmount *mnt) -+{ -+ lockdep_off(); -+ mnt_drop_write(mnt); -+ lockdep_on(); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_mnt_drop_write_file(struct file *file) -+{ -+ lockdep_off(); -+ mnt_drop_write_file(file); -+ lockdep_on(); -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_hinode; -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode, -+ bool want_excl); -+int vfsub_symlink(struct inode *dir, struct path *path, -+ const char *symname); -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, -+ struct path *path, struct inode **delegated_inode); -+int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, -+ struct inode *hdir, struct path *path, -+ struct inode **delegated_inode, unsigned int flags); -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_rmdir(struct inode *dir, struct path *path); -+ -+/* ---------------------------------------------------------------------- */ -+ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+int vfsub_flush(struct file *file, fl_owner_t id); -+int vfsub_iterate_dir(struct file *file, struct dir_context *ctx); -+ -+static inline loff_t vfsub_f_size_read(struct file *file) -+{ -+ return i_size_read(file_inode(file)); -+} -+ -+static inline unsigned int vfsub_file_flags(struct file *file) -+{ -+ unsigned int flags; -+ -+ spin_lock(&file->f_lock); -+ flags = file->f_flags; -+ spin_unlock(&file->f_lock); -+ -+ return flags; -+} -+ -+static inline int vfsub_file_execed(struct file *file) -+{ -+ /* todo: direct access f_flags */ -+ return !!(vfsub_file_flags(file) & __FMODE_EXEC); -+} -+ -+#if 0 /* reserved */ -+static inline void vfsub_file_accessed(struct file *h_file) -+{ -+ file_accessed(h_file); -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+#if 0 /* reserved */ -+static inline void vfsub_touch_atime(struct vfsmount *h_mnt, -+ struct dentry *h_dentry) -+{ -+ struct path h_path = { -+ .dentry = h_dentry, -+ .mnt = h_mnt -+ }; -+ touch_atime(&h_path); -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+} -+#endif -+ -+static inline int vfsub_update_time(struct inode *h_inode, -+ struct timespec64 *ts, int flags) -+{ -+ return inode_update_time(h_inode, ts, flags); -+ /* no vfsub_update_h_iattr() since we don't have struct path */ -+} -+ -+#ifdef CONFIG_FS_POSIX_ACL -+static inline int vfsub_acl_chmod(struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode) -+{ -+ int err; -+ -+ err = posix_acl_chmod(h_userns, h_inode, h_mode); -+ if (err == -EOPNOTSUPP) -+ err = 0; -+ return err; -+} -+#else -+AuStubInt0(vfsub_acl_chmod, struct user_namespace *h_userns, -+ struct inode *h_inode, umode_t h_mode); -+#endif -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+ -+static inline long vfsub_truncate(struct path *path, loff_t length) -+{ -+ long err; -+ -+ lockdep_off(); -+ err = vfs_truncate(path, length); -+ lockdep_on(); -+ return err; -+} -+ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file); -+int vfsub_fsync(struct file *file, struct path *path, int datasync); -+ -+/* -+ * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such -+ * ioctl. -+ */ -+static inline loff_t vfsub_clone_file_range(struct file *src, struct file *dst, -+ loff_t len) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_clone_file_range(src, 0, dst, 0, len, /*remap_flags*/0); -+ lockdep_on(); -+ -+ return err; -+} -+ -+/* copy_file_range(2) is a systemcall */ -+static inline ssize_t vfsub_copy_file_range(struct file *src, loff_t src_pos, -+ struct file *dst, loff_t dst_pos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t ssz; -+ -+ lockdep_off(); -+ ssz = vfs_copy_file_range(src, src_pos, dst, dst_pos, len, flags); -+ lockdep_on(); -+ -+ return ssz; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) -+{ -+ loff_t err; -+ -+ lockdep_off(); -+ err = vfs_llseek(file, offset, origin); -+ lockdep_on(); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_sio_rmdir(struct inode *dir, struct path *path); -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_notify_change(struct path *path, struct iattr *ia, -+ struct inode **delegated_inode); -+int vfsub_unlink(struct inode *dir, struct path *path, -+ struct inode **delegated_inode, int force); -+ -+static inline int vfsub_getattr(const struct path *path, struct kstat *st) -+{ -+ return vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int vfsub_setxattr(struct user_namespace *userns, -+ struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_setxattr(userns, dentry, name, value, size, flags); -+ lockdep_on(); -+ -+ return err; -+} -+ -+static inline int vfsub_removexattr(struct user_namespace *userns, -+ struct dentry *dentry, const char *name) -+{ -+ int err; -+ -+ lockdep_off(); -+ err = vfs_removexattr(userns, dentry, name); -+ lockdep_on(); -+ -+ return err; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_VFSUB_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/wbr_policy.c linux-5.15.37-aufs/fs/aufs/wbr_policy.c ---- linux-5.15.37/fs/aufs/wbr_policy.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/wbr_policy.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,817 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * policies for selecting one among multiple writable branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* subset of cpup_attr() */ -+static noinline_for_stack -+int au_cpdown_attr(struct path *h_path, struct dentry *h_src) -+{ -+ int err, sbits; -+ struct iattr ia; -+ struct inode *h_isrc; -+ -+ h_isrc = d_inode(h_src); -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; -+ ia.ia_mode = h_isrc->i_mode; -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(d_inode(h_path->dentry), h_isrc->i_flags); -+ /* no delegation since it is just created */ -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); -+ } -+ -+ return err; -+} -+ -+#define AuCpdown_PARENT_OPQ 1 -+#define AuCpdown_WHED (1 << 1) -+#define AuCpdown_MADE_DIR (1 << 2) -+#define AuCpdown_DIROPQ (1 << 3) -+#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) -+#define au_fset_cpdown(flags, name) \ -+ do { (flags) |= AuCpdown_##name; } while (0) -+#define au_fclr_cpdown(flags, name) \ -+ do { (flags) &= ~AuCpdown_##name; } while (0) -+ -+static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, -+ unsigned int *flags) -+{ -+ int err; -+ struct dentry *opq_dentry; -+ -+ opq_dentry = au_diropq_create(dentry, bdst); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ dput(opq_dentry); -+ au_fset_cpdown(*flags, DIROPQ); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, -+ struct inode *dir, aufs_bindex_t bdst) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ -+ br = au_sbr(dentry->d_sb, bdst); -+ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ if (d_is_positive(h_path.dentry)) { -+ h_path.mnt = au_br_mnt(br); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, -+ dentry); -+ } -+ dput(h_path.dentry); -+ -+out: -+ return err; -+} -+ -+static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_pin *pin, -+ struct dentry *h_parent, void *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t bopq, btop; -+ struct path h_path; -+ struct dentry *parent; -+ struct inode *h_dir, *h_inode, *inode, *dir; -+ unsigned int *flags = arg; -+ -+ btop = au_dbtop(dentry); -+ /* dentry is di-locked */ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ h_dir = d_inode(h_parent); -+ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); -+ IMustLock(h_dir); -+ -+ err = au_lkup_neg(dentry, bdst, /*wh*/0); -+ if (unlikely(err < 0)) -+ goto out; -+ h_path.dentry = au_h_dptr(dentry, bdst); -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); -+ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, 0755); -+ if (unlikely(err)) -+ goto out_put; -+ au_fset_cpdown(*flags, MADE_DIR); -+ -+ bopq = au_dbdiropq(dentry); -+ au_fclr_cpdown(*flags, WHED); -+ au_fclr_cpdown(*flags, DIROPQ); -+ if (au_dbwh(dentry) == bdst) -+ au_fset_cpdown(*flags, WHED); -+ if (!au_ftest_cpdown(*flags, PARENT_OPQ) && bopq <= bdst) -+ au_fset_cpdown(*flags, PARENT_OPQ); -+ h_inode = d_inode(h_path.dentry); -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_opq(dentry, bdst, flags); -+ if (unlikely(err)) { -+ inode_unlock(h_inode); -+ goto out_dir; -+ } -+ } -+ -+ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, btop)); -+ inode_unlock(h_inode); -+ if (unlikely(err)) -+ goto out_opq; -+ -+ if (au_ftest_cpdown(*flags, WHED)) { -+ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); -+ if (unlikely(err)) -+ goto out_opq; -+ } -+ -+ inode = d_inode(dentry); -+ if (au_ibbot(inode) < bdst) -+ au_set_ibbot(inode, bdst); -+ au_set_h_iptr(inode, bdst, au_igrab(h_inode), -+ au_hi_flags(inode, /*isdir*/1)); -+ au_fhsm_wrote(dentry->d_sb, bdst, /*force*/0); -+ goto out; /* success */ -+ -+ /* revert */ -+out_opq: -+ if (au_ftest_cpdown(*flags, DIROPQ)) { -+ inode_lock_nested(h_inode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bdst); -+ inode_unlock(h_inode); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing diropq for %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ goto out; -+ } -+ } -+out_dir: -+ if (au_ftest_cpdown(*flags, MADE_DIR)) { -+ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing %pd b%d (%d)\n", -+ dentry, bdst, rerr); -+ err = -EIO; -+ } -+ } -+out_put: -+ au_set_h_dptr(dentry, bdst, NULL); -+ if (au_dbbot(dentry) == bdst) -+ au_update_dbbot(dentry); -+out: -+ dput(parent); -+ return err; -+} -+ -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ unsigned int flags; -+ -+ flags = 0; -+ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &flags); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for create */ -+ -+int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t bopq; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries, *parent, *d; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ parent = dget_parent(dentry); -+ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/0); -+ if (unlikely(err)) -+ goto out_free; -+ -+ err = bindex; -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ d = dentries[j]; -+ di_read_lock_parent2(d, !AuLock_IR); -+ bopq = au_dbdiropq(d); -+ di_read_unlock(d, !AuLock_IR); -+ if (bopq >= 0 && bopq < err) -+ err = bopq; -+ } -+ } -+ -+out_free: -+ dput(parent); -+ au_dpages_free(&dpages); -+out: -+ return err; -+} -+ -+static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) -+ return bindex; -+ return -EROFS; -+} -+ -+/* top down parent */ -+static int au_wbr_create_tdp(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t btop, bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ -+ sb = dentry->d_sb; -+ btop = au_dbtop(dentry); -+ err = btop; -+ if (!au_br_rdonly(au_sbr(sb, btop))) -+ goto out; -+ -+ err = -EROFS; -+ parent = dget_parent(dentry); -+ for (bindex = au_dbtop(parent); bindex < btop; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) { -+ err = au_wbr_bu(sb, btop - 1); -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ } -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* an exception for the policy other than tdp */ -+static int au_wbr_create_exp(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bdiropq; -+ struct dentry *parent; -+ -+ err = -1; -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ bdiropq = au_dbdiropq(parent); -+ if (bwh >= 0) { -+ if (bdiropq >= 0) -+ err = min(bdiropq, bwh); -+ else -+ err = bwh; -+ AuDbg("%d\n", err); -+ } else if (bdiropq >= 0) { -+ err = bdiropq; -+ AuDbg("%d\n", err); -+ } -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) -+ err = -1; -+ -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* round robin */ -+static int au_wbr_create_init_rr(struct super_block *sb) -+{ -+ int err; -+ -+ err = au_wbr_bu(sb, au_sbbot(sb)); -+ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ -+ /* smp_mb(); */ -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_rr(struct dentry *dentry, unsigned int flags) -+{ -+ int err, nbr; -+ unsigned int u; -+ aufs_bindex_t bindex, bbot; -+ struct super_block *sb; -+ atomic_t *next; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ next = &au_sbi(sb)->si_wbr_rr_next; -+ bbot = au_sbbot(sb); -+ nbr = bbot + 1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ if (!au_ftest_wbr(flags, DIR)) { -+ err = atomic_dec_return(next) + 1; -+ /* modulo for 0 is meaningless */ -+ if (unlikely(!err)) -+ err = atomic_dec_return(next) + 1; -+ } else -+ err = atomic_read(next); -+ AuDbg("%d\n", err); -+ u = err; -+ err = u % nbr; -+ AuDbg("%d\n", err); -+ if (!au_br_rdonly(au_sbr(sb, err))) -+ break; -+ err = -EROFS; -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space */ -+static void au_mfs(struct dentry *dentry, struct dentry *parent) -+{ -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ struct dentry *h_parent; -+ aufs_bindex_t bindex, bbot; -+ int err; -+ unsigned long long b, bavail; -+ struct path h_path; -+ /* reduce the stack usage */ -+ struct kstatfs *st; -+ -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) { -+ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); -+ return; -+ } -+ -+ bavail = 0; -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ MtxMustLock(&mfs->mfs_lock); -+ mfs->mfs_bindex = -EROFS; -+ mfs->mfsrr_bytes = 0; -+ if (!parent) { -+ bindex = 0; -+ bbot = au_sbbot(sb); -+ } else { -+ bindex = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ } -+ -+ for (; bindex <= bbot; bindex++) { -+ if (parent) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ } -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ h_path.mnt = au_br_mnt(br); -+ h_path.dentry = h_path.mnt->mnt_root; -+ err = vfs_statfs(&h_path, st); -+ if (unlikely(err)) { -+ AuWarn1("failed statfs, b%d, %d\n", bindex, err); -+ continue; -+ } -+ -+ /* when the available size is equal, select the lower one */ -+ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) -+ || sizeof(b) < sizeof(st->f_bsize)); -+ b = st->f_bavail * st->f_bsize; -+ br->br_wbr->wbr_bytes = b; -+ if (b >= bavail) { -+ bavail = b; -+ mfs->mfs_bindex = bindex; -+ mfs->mfs_jiffy = jiffies; -+ } -+ } -+ -+ mfs->mfsrr_bytes = bavail; -+ AuDbg("b%d\n", mfs->mfs_bindex); -+ au_kfree_rcu(st); -+} -+ -+static int au_wbr_create_mfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct dentry *parent; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ parent = NULL; -+ if (au_ftest_wbr(flags, PARENT)) -+ parent = dget_parent(dentry); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0 -+ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) -+ au_mfs(dentry, parent); -+ mutex_unlock(&mfs->mfs_lock); -+ err = mfs->mfs_bindex; -+ dput(parent); -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfs(struct super_block *sb) -+{ -+ struct au_wbr_mfs *mfs; -+ -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_init(&mfs->mfs_lock); -+ mfs->mfs_jiffy = 0; -+ mfs->mfs_bindex = -EROFS; -+ -+ return 0; -+} -+ -+static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) -+{ -+ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down regardless parent, and then mfs */ -+static int au_wbr_create_tdmfs(struct dentry *dentry, -+ unsigned int flags __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t bwh, btail, bindex, bfound, bmfs; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ struct au_branch *br; -+ struct dentry *parent; -+ -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0) -+ au_mfs(dentry, /*parent*/NULL); -+ watermark = mfs->mfsrr_watermark; -+ bmfs = mfs->mfs_bindex; -+ mutex_unlock(&mfs->mfs_lock); -+ -+ /* another style of au_wbr_create_exp() */ -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ if (bwh >= 0 && bwh < btail) -+ btail = bwh; -+ -+ err = au_wbr_nonopq(dentry, btail); -+ if (unlikely(err < 0)) -+ goto out; -+ btail = err; -+ bfound = -1; -+ for (bindex = 0; bindex <= btail; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ if (br->br_wbr->wbr_bytes > watermark) { -+ bfound = bindex; -+ break; -+ } -+ } -+ err = bfound; -+ if (err < 0) -+ err = bmfs; -+ -+out: -+ dput(parent); -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space and then round robin */ -+static int au_wbr_create_mfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_mfs(dentry, flags); -+ if (err >= 0) { -+ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) -+ err = au_wbr_create_rr(dentry, flags); -+ mutex_unlock(&mfs->mfs_lock); -+ } -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfsrr(struct super_block *sb) -+{ -+ int err; -+ -+ au_wbr_create_init_mfs(sb); /* ignore */ -+ err = au_wbr_create_init_rr(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down parent and most free space */ -+static int au_wbr_create_pmfs(struct dentry *dentry, unsigned int flags) -+{ -+ int err, e2; -+ unsigned long long b; -+ aufs_bindex_t bindex, btop, bbot; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ struct au_branch *br; -+ -+ err = au_wbr_create_tdp(dentry, flags); -+ if (unlikely(err < 0)) -+ goto out; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ bbot = au_dbtaildir(parent); -+ if (btop == bbot) -+ goto out_parent; /* success */ -+ -+ e2 = au_wbr_create_mfs(dentry, flags); -+ if (e2 < 0) -+ goto out_parent; /* success */ -+ -+ /* when the available size is equal, select upper one */ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ b = br->br_wbr->wbr_bytes; -+ AuDbg("b%d, %llu\n", err, b); -+ -+ for (bindex = btop; bindex <= bbot; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { -+ b = br->br_wbr->wbr_bytes; -+ err = bindex; -+ AuDbg("b%d, %llu\n", err, b); -+ } -+ } -+ -+ if (err >= 0) -+ err = au_wbr_nonopq(dentry, err); -+ -+out_parent: -+ dput(parent); -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * - top down parent -+ * - most free space with parent -+ * - most free space round-robin regardless parent -+ */ -+static int au_wbr_create_pmfsrr(struct dentry *dentry, unsigned int flags) -+{ -+ int err; -+ unsigned long long watermark; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_pmfs(dentry, flags | AuWbr_PARENT); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ watermark = mfs->mfsrr_watermark; -+ mutex_unlock(&mfs->mfs_lock); -+ if (br->br_wbr->wbr_bytes < watermark) -+ /* regardless the parent dir */ -+ err = au_wbr_create_mfsrr(dentry, flags); -+ -+out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for copyup */ -+ -+/* top down parent */ -+static int au_wbr_copyup_tdp(struct dentry *dentry) -+{ -+ return au_wbr_create_tdp(dentry, /*flags, anything is ok*/0); -+} -+ -+/* bottom up parent */ -+static int au_wbr_copyup_bup(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bindex, btop; -+ struct dentry *parent, *h_parent; -+ struct super_block *sb; -+ -+ err = -EROFS; -+ sb = dentry->d_sb; -+ parent = dget_parent(dentry); -+ btop = au_dbtop(parent); -+ for (bindex = au_dbtop(dentry); bindex >= btop; bindex--) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || d_is_negative(h_parent)) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) -+ err = au_wbr_bu(sb, btop - 1); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* bottom up */ -+int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop) -+{ -+ int err; -+ -+ err = au_wbr_bu(dentry->d_sb, btop); -+ AuDbg("b%d\n", err); -+ if (err > btop) -+ err = au_wbr_nonopq(dentry, err); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_copyup_bu(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t btop; -+ -+ btop = au_dbtop(dentry); -+ err = au_wbr_do_copyup_bu(dentry, btop); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { -+ [AuWbrCopyup_TDP] = { -+ .copyup = au_wbr_copyup_tdp -+ }, -+ [AuWbrCopyup_BUP] = { -+ .copyup = au_wbr_copyup_bup -+ }, -+ [AuWbrCopyup_BU] = { -+ .copyup = au_wbr_copyup_bu -+ } -+}; -+ -+struct au_wbr_create_operations au_wbr_create_ops[] = { -+ [AuWbrCreate_TDP] = { -+ .create = au_wbr_create_tdp -+ }, -+ [AuWbrCreate_RR] = { -+ .create = au_wbr_create_rr, -+ .init = au_wbr_create_init_rr -+ }, -+ [AuWbrCreate_MFS] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSV] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRR] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRRV] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFS] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_TDMFSV] = { -+ .create = au_wbr_create_tdmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFS] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSV] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRR] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSRRV] = { -+ .create = au_wbr_create_pmfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ } -+}; -diff -Nurp linux-5.15.37/fs/aufs/whout.c linux-5.15.37-aufs/fs/aufs/whout.c ---- linux-5.15.37/fs/aufs/whout.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/whout.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,1059 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#include "aufs.h" -+ -+#define WH_MASK 0444 -+ -+/* -+ * If a directory contains this file, then it is opaque. We start with the -+ * .wh. flag so that it is blocked by lookup. -+ */ -+static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, -+ sizeof(AUFS_WH_DIROPQ) - 1); -+ -+/* -+ * generate whiteout name, which is NOT terminated by NULL. -+ * @name: original d_name.name -+ * @len: original d_name.len -+ * @wh: whiteout qstr -+ * returns zero when succeeds, otherwise error. -+ * succeeded value as wh->name should be freed by kfree(). -+ */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) -+{ -+ char *p; -+ -+ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) -+ return -ENAMETOOLONG; -+ -+ wh->len = name->len + AUFS_WH_PFX_LEN; -+ p = kmalloc(wh->len, GFP_NOFS); -+ wh->name = p; -+ if (p) { -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * 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 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_ppath); -+ else -+ 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) -+ err = 0; -+ goto out; -+ } -+ -+ err = 0; -+ if (d_is_negative(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = 1; -+ if (d_is_reg(wh_dentry)) -+ goto out_wh; /* success */ -+ -+ err = -EIO; -+ AuIOErr("%pd Invalid whiteout entry type 0%o.\n", -+ wh_dentry, d_inode(wh_dentry)->i_mode); -+ -+out_wh: -+ dput(wh_dentry); -+out: -+ return err; -+} -+ -+/* -+ * test if the @h_path->dentry sets opaque or not. -+ */ -+int au_diropq_test(struct user_namespace *h_userns, struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ 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; -+} -+ -+/* -+ * returns a negative dentry whose name is unique and temporary. -+ */ -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix) -+{ -+ struct dentry *dentry; -+ int i; -+ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1], -+ *name, *p; -+ /* 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); -+ -+ name = defname; -+ qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1; -+ if (unlikely(prefix->len > DNAME_INLINE_LEN)) { -+ dentry = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(qs.len > NAME_MAX)) -+ goto out; -+ dentry = ERR_PTR(-ENOMEM); -+ name = kmalloc(qs.len + 1, GFP_NOFS); -+ if (unlikely(!name)) -+ goto out; -+ } -+ -+ /* doubly whiteout-ed */ -+ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); -+ p = name + AUFS_WH_PFX_LEN * 2; -+ memcpy(p, prefix->name, prefix->len); -+ p += prefix->len; -+ *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_ppath); -+ if (IS_ERR(dentry) || d_is_negative(dentry)) -+ goto out_name; -+ dput(dentry); -+ } -+ /* pr_warn("could not get random name\n"); */ -+ dentry = ERR_PTR(-EEXIST); -+ AuDbg("%.*s\n", AuLNPair(&qs)); -+ BUG(); -+ -+out_name: -+ if (name != defname) -+ au_kfree_try_rcu(name); -+out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* -+ * rename the @h_dentry on @br to the whiteouted temporary name. -+ */ -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = au_br_mnt(br) -+ }; -+ struct inode *h_dir, *delegated; -+ struct dentry *h_parent; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ /* under the same dir, no need to lock_rename() */ -+ delegated = NULL; -+ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, &delegated, -+ /*flags*/0); -+ AuTraceErr(err); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal rename\n"); -+ iput(delegated); -+ } -+ dput(h_path.dentry); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * functions for removing a whiteout -+ */ -+ -+static int do_unlink_wh(struct inode *h_dir, struct path *h_path) -+{ -+ int err, force; -+ struct inode *delegated; -+ -+ /* -+ * forces superio when the dir has a sticky bit. -+ * this may be a violation of unix fs semantics. -+ */ -+ force = (h_dir->i_mode & S_ISVTX) -+ && !uid_eq(current_fsuid(), d_inode(h_path->dentry)->i_uid); -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, h_path, &delegated, force); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ return err; -+} -+ -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry) -+{ -+ int err; -+ -+ err = do_unlink_wh(h_dir, h_path); -+ if (!err && dentry) -+ au_set_dbwh(dentry, -1); -+ -+ return err; -+} -+ -+static int unlink_wh_name(struct path *h_ppath, struct qstr *wh) -+{ -+ int err; -+ struct path h_path; -+ -+ err = 0; -+ 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)) { -+ h_path.mnt = h_ppath->mnt; -+ err = do_unlink_wh(d_inode(h_ppath->dentry), &h_path); -+ } -+ dput(h_path.dentry); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * initialize/clean whiteout for a branch -+ */ -+ -+static void au_wh_clean(struct inode *h_dir, struct path *whpath, -+ const int isdir) -+{ -+ int err; -+ struct inode *delegated; -+ -+ if (d_is_negative(whpath->dentry)) -+ return; -+ -+ if (isdir) -+ err = vfsub_rmdir(h_dir, whpath); -+ else { -+ delegated = NULL; -+ err = vfsub_unlink(h_dir, whpath, &delegated, /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } -+ if (unlikely(err)) -+ pr_warn("failed removing %pd (%d), ignored.\n", -+ whpath->dentry, err); -+} -+ -+static int test_linkable(struct dentry *h_root) -+{ -+ struct inode *h_dir = d_inode(h_root); -+ -+ if (h_dir->i_op->link) -+ return 0; -+ -+ pr_err("%pd (%s) doesn't support link(2), use noplink and rw+nolwh\n", -+ h_root, au_sbtype(h_root->d_sb)); -+ return -ENOSYS; /* the branch doesn't have its ->link() */ -+} -+ -+/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ -+static int au_whdir(struct inode *h_dir, struct path *path) -+{ -+ int err; -+ -+ err = -EEXIST; -+ if (d_is_negative(path->dentry)) { -+ int mode = 0700; -+ -+ if (au_test_nfs(path->dentry->d_sb)) -+ mode |= 0111; -+ err = vfsub_mkdir(h_dir, path, mode); -+ } else if (d_is_dir(path->dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd exists\n", path->dentry); -+ -+ return err; -+} -+ -+struct au_wh_base { -+ const struct qstr *name; -+ struct dentry *dentry; -+}; -+ -+static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+} -+ -+/* -+ * returns tri-state, -+ * minus: error, caller should print the message -+ * zero: success -+ * plus: error, caller should NOT print the message -+ */ -+static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = d_inode(h_root); -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * for the moment, aufs supports the branch filesystem which does not support -+ * link(2). testing on FAT which does not support i_op->setattr() fully either, -+ * copyup failed. finally, such filesystem will not be used as the writable -+ * branch. -+ * -+ * returns tri-state, see above. -+ */ -+static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ WbrWhMustWriteLock(wbr); -+ -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ /* -+ * todo: should this create be done in /sbin/mount.aufs helper? -+ */ -+ err = -EEXIST; -+ h_dir = d_inode(h_root); -+ if (d_is_negative(base[AuBrWh_BASE].dentry)) { -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ err = vfsub_create(h_dir, h_path, WH_MASK, /*want_excl*/true); -+ } else if (d_is_reg(base[AuBrWh_BASE].dentry)) -+ err = 0; -+ else -+ pr_err("unknown %pd2 exists\n", base[AuBrWh_BASE].dentry); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); -+ -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+out: -+ return err; -+} -+ -+/* -+ * initialize the whiteout base file/dir for @br. -+ */ -+int au_wh_init(struct au_branch *br, struct super_block *sb) -+{ -+ int err, i; -+ const unsigned char do_plink -+ = !!au_opt_test(au_mntflags(sb), PLINK); -+ struct inode *h_dir; -+ struct path path = br->br_path; -+ struct dentry *h_root = path.dentry; -+ struct au_wbr *wbr = br->br_wbr; -+ static const struct qstr base_name[] = { -+ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, -+ sizeof(AUFS_BASE_NAME) - 1), -+ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, -+ sizeof(AUFS_PLINKDIR_NAME) - 1), -+ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, -+ sizeof(AUFS_ORPHDIR_NAME) - 1) -+ }; -+ struct au_wh_base base[] = { -+ [AuBrWh_BASE] = { -+ .name = base_name + AuBrWh_BASE, -+ .dentry = NULL -+ }, -+ [AuBrWh_PLINK] = { -+ .name = base_name + AuBrWh_PLINK, -+ .dentry = NULL -+ }, -+ [AuBrWh_ORPH] = { -+ .name = base_name + AuBrWh_ORPH, -+ .dentry = NULL -+ } -+ }; -+ -+ if (wbr) -+ WbrWhMustWriteLock(wbr); -+ -+ for (i = 0; i < AuBrWh_Last; i++) { -+ /* doubly whiteouted */ -+ struct dentry *d; -+ -+ d = au_wh_lkup(h_root, (void *)base[i].name, br); -+ err = PTR_ERR(d); -+ if (IS_ERR(d)) -+ goto out; -+ -+ base[i].dentry = d; -+ AuDebugOn(wbr -+ && wbr->wbr_wh[i] -+ && wbr->wbr_wh[i] != base[i].dentry); -+ } -+ -+ if (wbr) -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ -+ err = 0; -+ if (!au_br_writable(br->br_perm)) { -+ h_dir = d_inode(h_root); -+ au_wh_init_ro(h_dir, base, &path); -+ } else if (!au_br_wh_linkable(br->br_perm)) { -+ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } else { -+ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ } -+ goto out; /* success */ -+ -+out_err: -+ pr_err("an error(%d) on the writable branch %pd(%s)\n", -+ err, h_root, au_sbtype(h_root->d_sb)); -+out: -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(base[i].dentry); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * whiteouts are all hard-linked usually. -+ * when its link count reaches a ceiling, we create a new whiteout base -+ * asynchronously. -+ */ -+ -+struct reinit_br_wh { -+ struct super_block *sb; -+ struct au_branch *br; -+}; -+ -+static void reinit_br_wh(void *arg) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct path h_path; -+ struct reinit_br_wh *a = arg; -+ struct au_wbr *wbr; -+ struct inode *dir, *delegated; -+ struct dentry *h_root; -+ struct au_hinode *hdir; -+ -+ err = 0; -+ wbr = a->br->br_wbr; -+ /* big aufs lock */ -+ si_noflush_write_lock(a->sb); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(a->sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ di_read_lock_parent(a->sb->s_root, AuLock_IR); -+ dir = d_inode(a->sb->s_root); -+ hdir = au_hi(dir, bindex); -+ h_root = au_h_dptr(a->sb->s_root, bindex); -+ AuDebugOn(h_root != au_br_dentry(a->br)); -+ -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ wbr_wh_write_lock(wbr); -+ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, -+ h_root, a->br); -+ if (!err) { -+ h_path.dentry = wbr->wbr_whbase; -+ h_path.mnt = au_br_mnt(a->br); -+ delegated = NULL; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, -+ /*force*/0); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ } else { -+ pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); -+ err = 0; -+ } -+ dput(wbr->wbr_whbase); -+ wbr->wbr_whbase = NULL; -+ if (!err) -+ err = au_wh_init(a->br, a->sb); -+ wbr_wh_write_unlock(wbr); -+ au_hn_inode_unlock(hdir); -+ di_read_unlock(a->sb->s_root, AuLock_IR); -+ if (!err) -+ au_fhsm_wrote(a->sb, bindex, /*force*/0); -+ -+out: -+ if (wbr) -+ atomic_dec(&wbr->wbr_wh_running); -+ au_lcnt_dec(&a->br->br_count); -+ si_write_unlock(a->sb); -+ au_nwt_done(&au_sbi(a->sb)->si_nowait); -+ au_kfree_rcu(a); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) -+{ -+ int do_dec, wkq_err; -+ struct reinit_br_wh *arg; -+ -+ do_dec = 1; -+ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) -+ goto out; -+ -+ /* ignore ENOMEM */ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (arg) { -+ /* -+ * dec(wh_running), kfree(arg) and dec(br_count) -+ * in reinit function -+ */ -+ arg->sb = sb; -+ arg->br = br; -+ au_lcnt_inc(&br->br_count); -+ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ do_dec = 0; -+ } -+ -+out: -+ if (do_dec) -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create the whiteout @wh. -+ */ -+static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *wh) -+{ -+ int err; -+ struct path h_path = { -+ .dentry = wh -+ }; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ struct inode *h_dir, *delegated; -+ -+ h_parent = wh->d_parent; /* dir inode is locked */ -+ h_dir = d_inode(h_parent); -+ IMustLock(h_dir); -+ -+ br = au_sbr(sb, bindex); -+ h_path.mnt = au_br_mnt(br); -+ wbr = br->br_wbr; -+ wbr_wh_read_lock(wbr); -+ if (wbr->wbr_whbase) { -+ delegated = NULL; -+ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path, &delegated); -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal link\n"); -+ iput(delegated); -+ } -+ if (!err || err != -EMLINK) -+ goto out; -+ -+ /* link count full. re-initialize br_whbase. */ -+ kick_reinit_br_wh(sb, br); -+ } -+ -+ /* return this error in this context */ -+ err = vfsub_create(h_dir, &h_path, WH_MASK, /*want_excl*/true); -+ if (!err) -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ -+out: -+ wbr_wh_read_unlock(wbr); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create or remove the diropq. -+ */ -+static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ 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_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; -+ -+ if (au_ftest_diropq(flags, CREATE)) { -+ err = link_or_create_wh(sb, bindex, opq_dentry); -+ if (!err) { -+ au_set_dbdiropq(dentry, bindex); -+ goto out; /* success */ -+ } -+ } else { -+ 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); -+ } -+ dput(opq_dentry); -+ opq_dentry = ERR_PTR(err); -+ -+out: -+ return opq_dentry; -+} -+ -+struct do_diropq_args { -+ struct dentry **errp; -+ struct dentry *dentry; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+}; -+ -+static void call_do_diropq(void *args) -+{ -+ struct do_diropq_args *a = args; -+ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); -+} -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *diropq, *h_dentry; -+ struct user_namespace *h_userns; -+ -+ h_userns = au_sbr_userns(dentry->d_sb, bindex); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!au_test_h_perm_sio(h_userns, d_inode(h_dentry), -+ MAY_EXEC | MAY_WRITE)) -+ diropq = do_diropq(dentry, bindex, flags); -+ else { -+ int wkq_err; -+ struct do_diropq_args args = { -+ .errp = &diropq, -+ .dentry = dentry, -+ .bindex = bindex, -+ .flags = flags -+ }; -+ -+ wkq_err = au_wkq_wait(call_do_diropq, &args); -+ if (unlikely(wkq_err)) -+ diropq = ERR_PTR(wkq_err); -+ } -+ -+ return diropq; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * lookup whiteout dentry. -+ * @h_parent: lower parent dentry which must exist and be locked -+ * @base_name: name of dentry which will be whiteouted -+ * returns dentry for whiteout. -+ */ -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br) -+{ -+ 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) { -+ 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; -+} -+ -+/* -+ * link/create a whiteout for @dentry on @bindex. -+ */ -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ int err; -+ -+ sb = dentry->d_sb; -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); -+ if (!IS_ERR(wh_dentry) && d_is_negative(wh_dentry)) { -+ err = link_or_create_wh(sb, bindex, wh_dentry); -+ if (!err) { -+ au_set_dbwh(dentry, bindex); -+ au_fhsm_wrote(sb, bindex, /*force*/0); -+ } else { -+ dput(wh_dentry); -+ wh_dentry = ERR_PTR(err); -+ } -+ } -+ -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Delete all whiteouts in this directory on branch bindex. */ -+static int del_wh_children(struct path *h_path, struct au_nhash *whlist, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ unsigned long ul, n; -+ struct qstr wh_name; -+ char *p; -+ struct hlist_head *head; -+ struct au_vdir_wh *pos; -+ struct au_vdir_destr *str; -+ -+ err = -ENOMEM; -+ p = (void *)__get_free_page(GFP_NOFS); -+ wh_name.name = p; -+ if (unlikely(!wh_name.name)) -+ goto out; -+ -+ err = 0; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; !err && ul < n; ul++, head++) { -+ hlist_for_each_entry(pos, head, wh_hash) { -+ if (pos->wh_bindex != bindex) -+ continue; -+ -+ str = &pos->wh_str; -+ 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_path, &wh_name); -+ if (!err) -+ continue; -+ break; -+ } -+ AuIOErr("whiteout name too long %.*s\n", -+ str->len, str->name); -+ err = -EIO; -+ break; -+ } -+ } -+ free_page((unsigned long)wh_name.name); -+ -+out: -+ return err; -+} -+ -+struct del_wh_children_args { -+ int *errp; -+ struct path *h_path; -+ struct au_nhash *whlist; -+ aufs_bindex_t bindex; -+}; -+ -+static void call_del_wh_children(void *args) -+{ -+ struct del_wh_children_args *a = args; -+ *a->errp = del_wh_children(a->h_path, a->whlist, a->bindex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) -+{ -+ struct au_whtmp_rmdir *whtmp; -+ int err; -+ unsigned int rdhash; -+ -+ SiMustAnyLock(sb); -+ -+ whtmp = kzalloc(sizeof(*whtmp), gfp); -+ if (unlikely(!whtmp)) { -+ whtmp = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ /* no estimation for dir size */ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = AUFS_RDHASH_DEF; -+ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); -+ if (unlikely(err)) { -+ au_kfree_rcu(whtmp); -+ whtmp = ERR_PTR(err); -+ } -+ -+out: -+ return whtmp; -+} -+ -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) -+{ -+ if (whtmp->br) -+ au_lcnt_dec(&whtmp->br->br_count); -+ dput(whtmp->wh_dentry); -+ iput(whtmp->dir); -+ au_nhash_wh_free(&whtmp->whlist); -+ au_kfree_rcu(whtmp); -+} -+ -+/* -+ * rmdir the whiteouted temporary named dir @h_dentry. -+ * @whlist: whiteouted children. -+ */ -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist) -+{ -+ int err; -+ unsigned int h_nlink; -+ struct path wh_path; -+ struct inode *wh_inode, *h_dir; -+ struct au_branch *br; -+ struct user_namespace *h_userns; -+ -+ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ -+ 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); -+ -+ /* -+ * someone else might change some whiteouts while we were sleeping. -+ * 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_path, whlist, bindex); -+ else { -+ int wkq_err; -+ struct del_wh_children_args args = { -+ .errp = &err, -+ .h_path = &wh_path, -+ .whlist = whlist, -+ .bindex = bindex -+ }; -+ -+ wkq_err = au_wkq_wait(call_del_wh_children, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ inode_unlock(wh_inode); -+ -+ if (!err) { -+ h_nlink = h_dir->i_nlink; -+ err = vfsub_rmdir(h_dir, &wh_path); -+ /* some fs doesn't change the parent nlink in some cases */ -+ h_nlink -= h_dir->i_nlink; -+ } -+ -+ if (!err) { -+ if (au_ibtop(dir) == bindex) { -+ /* todo: dir->i_mutex is necessary */ -+ au_cpup_attr_timesizes(dir); -+ if (h_nlink) -+ vfsub_drop_nlink(dir); -+ } -+ return 0; /* success */ -+ } -+ -+ pr_warn("failed removing %pd(%d), ignored\n", wh_dentry, err); -+ return err; -+} -+ -+static void call_rmdir_whtmp(void *args) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct au_whtmp_rmdir *a = args; -+ struct super_block *sb; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ struct au_hinode *hdir; -+ -+ /* rmdir by nfsd may cause deadlock with this i_mutex */ -+ /* inode_lock(a->dir); */ -+ err = -EROFS; -+ sb = a->dir->i_sb; -+ si_read_lock(sb, !AuLock_FLUSH); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ err = -EIO; -+ ii_write_lock_parent(a->dir); -+ h_parent = dget_parent(a->wh_dentry); -+ h_dir = d_inode(h_parent); -+ hdir = au_hi(a->dir, bindex); -+ err = vfsub_mnt_want_write(au_br_mnt(a->br)); -+ if (unlikely(err)) -+ goto out_mnt; -+ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); -+ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, -+ a->br); -+ if (!err) -+ err = au_whtmp_rmdir(a->dir, bindex, a->wh_dentry, &a->whlist); -+ au_hn_inode_unlock(hdir); -+ vfsub_mnt_drop_write(au_br_mnt(a->br)); -+ -+out_mnt: -+ dput(h_parent); -+ ii_write_unlock(a->dir); -+out: -+ /* inode_unlock(a->dir); */ -+ au_whtmp_rmdir_free(a); -+ si_read_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) -+{ -+ int wkq_err; -+ struct super_block *sb; -+ -+ IMustLock(dir); -+ -+ /* all post-process will be done in do_rmdir_whtmp(). */ -+ sb = dir->i_sb; -+ args->dir = au_igrab(dir); -+ args->br = au_sbr(sb, bindex); -+ au_lcnt_inc(&args->br->br_count); -+ args->wh_dentry = dget(wh_dentry); -+ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); -+ if (unlikely(wkq_err)) { -+ pr_warn("rmdir error %pd (%d), ignored\n", wh_dentry, wkq_err); -+ au_whtmp_rmdir_free(args); -+ } -+} -diff -Nurp linux-5.15.37/fs/aufs/whout.h linux-5.15.37-aufs/fs/aufs/whout.h ---- linux-5.15.37/fs/aufs/whout.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/whout.h 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,74 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#ifndef __AUFS_WHOUT_H__ -+#define __AUFS_WHOUT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include "dir.h" -+ -+/* whout.c */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); -+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 path *h_path); -+struct au_branch; -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix); -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry); -+int au_wh_init(struct au_branch *br, struct super_block *sb); -+ -+/* diropq flags */ -+#define AuDiropq_CREATE 1 -+#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) -+#define au_fset_diropq(flags, name) \ -+ do { (flags) |= AuDiropq_##name; } while (0) -+#define au_fclr_diropq(flags, name) \ -+ do { (flags) &= ~AuDiropq_##name; } while (0) -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags); -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br); -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent); -+ -+/* real rmdir for the whiteout-ed dir */ -+struct au_whtmp_rmdir { -+ struct inode *dir; -+ struct au_branch *br; -+ struct dentry *wh_dentry; -+ struct au_nhash whlist; -+}; -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist); -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_diropq_create(struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); -+} -+ -+static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WHOUT_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/wkq.c linux-5.15.37-aufs/fs/aufs/wkq.c ---- linux-5.15.37/fs/aufs/wkq.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/wkq.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,359 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credential scheme -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* internal workqueue named AUFS_WKQ_NAME */ -+ -+static struct workqueue_struct *au_wkq; -+ -+struct au_wkinfo { -+ struct work_struct wk; -+ struct kobject *kobj; -+ -+ unsigned int flags; /* see wkq.h */ -+ -+ au_wkq_func_t func; -+ void *args; -+ -+#ifdef CONFIG_LOCKDEP -+ int dont_check; -+ struct held_lock **hlock; -+#endif -+ -+ struct completion *comp; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * Aufs passes some operations to the workqueue such as the internal copyup. -+ * This scheme looks rather unnatural for LOCKDEP debugging feature, since the -+ * job run by workqueue depends upon the locks acquired in the other task. -+ * Delegating a small operation to the workqueue, aufs passes its lockdep -+ * information too. And the job in the workqueue restores the info in order to -+ * pretend as if it acquired those locks. This is just to make LOCKDEP work -+ * correctly and expectedly. -+ */ -+ -+#ifndef CONFIG_LOCKDEP -+AuStubInt0(au_wkq_lockdep_alloc, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_free, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_pre, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_post, struct au_wkinfo *wkinfo); -+AuStubVoid(au_wkq_lockdep_init, struct au_wkinfo *wkinfo); -+#else -+static void au_wkq_lockdep_init(struct au_wkinfo *wkinfo) -+{ -+ wkinfo->hlock = NULL; -+ wkinfo->dont_check = 0; -+} -+ -+/* -+ * 1: matched -+ * 0: unmatched -+ */ -+static int au_wkq_lockdep_test(struct lock_class_key *key, const char *name) -+{ -+ static DEFINE_SPINLOCK(spin); -+ static struct { -+ char *name; -+ struct lock_class_key *key; -+ } a[] = { -+ { .name = "&sbinfo->si_rwsem" }, -+ { .name = "&finfo->fi_rwsem" }, -+ { .name = "&dinfo->di_rwsem" }, -+ { .name = "&iinfo->ii_rwsem" } -+ }; -+ static int set; -+ int i; -+ -+ /* lockless read from 'set.' see below */ -+ if (set == ARRAY_SIZE(a)) { -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) -+ goto match; -+ goto unmatch; -+ } -+ -+ spin_lock(&spin); -+ if (set) -+ for (i = 0; i < ARRAY_SIZE(a); i++) -+ if (a[i].key == key) { -+ spin_unlock(&spin); -+ goto match; -+ } -+ for (i = 0; i < ARRAY_SIZE(a); i++) { -+ if (a[i].key) { -+ if (unlikely(a[i].key == key)) { /* rare but possible */ -+ spin_unlock(&spin); -+ goto match; -+ } else -+ continue; -+ } -+ if (strstr(a[i].name, name)) { -+ /* -+ * the order of these three lines is important for the -+ * lockless read above. -+ */ -+ a[i].key = key; -+ spin_unlock(&spin); -+ set++; -+ /* AuDbg("%d, %s\n", set, name); */ -+ goto match; -+ } -+ } -+ spin_unlock(&spin); -+ goto unmatch; -+ -+match: -+ return 1; -+unmatch: -+ return 0; -+} -+ -+static int au_wkq_lockdep_alloc(struct au_wkinfo *wkinfo) -+{ -+ int err, n; -+ struct task_struct *curr; -+ struct held_lock **hl, *held_locks, *p; -+ -+ err = 0; -+ curr = current; -+ wkinfo->dont_check = lockdep_recursing(curr); -+ if (wkinfo->dont_check) -+ goto out; -+ n = curr->lockdep_depth; -+ if (!n) -+ goto out; -+ -+ err = -ENOMEM; -+ wkinfo->hlock = kmalloc_array(n + 1, sizeof(*wkinfo->hlock), GFP_NOFS); -+ if (unlikely(!wkinfo->hlock)) -+ goto out; -+ -+ err = 0; -+#if 0 /* left for debugging */ -+ if (0 && au_debug_test()) -+ lockdep_print_held_locks(curr); -+#endif -+ held_locks = curr->held_locks; -+ hl = wkinfo->hlock; -+ while (n--) { -+ p = held_locks++; -+ if (au_wkq_lockdep_test(p->instance->key, p->instance->name)) -+ *hl++ = p; -+ } -+ *hl = NULL; -+ -+out: -+ return err; -+} -+ -+static void au_wkq_lockdep_free(struct au_wkinfo *wkinfo) -+{ -+ au_kfree_try_rcu(wkinfo->hlock); -+} -+ -+static void au_wkq_lockdep_pre(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ int subclass; -+ -+ if (wkinfo->dont_check) -+ lockdep_off(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) { /* assignment */ -+ subclass = lockdep_hlock_class(p)->subclass; -+ /* AuDbg("%s, %d\n", p->instance->name, subclass); */ -+ if (p->read) -+ rwsem_acquire_read(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ else -+ rwsem_acquire(p->instance, subclass, 0, -+ /*p->acquire_ip*/_RET_IP_); -+ } -+} -+ -+static void au_wkq_lockdep_post(struct au_wkinfo *wkinfo) -+{ -+ struct held_lock *p, **hl = wkinfo->hlock; -+ -+ if (wkinfo->dont_check) -+ lockdep_on(); -+ if (!hl) -+ return; -+ while ((p = *hl++)) /* assignment */ -+ rwsem_release(p->instance, /*p->acquire_ip*/_RET_IP_); -+} -+#endif -+ -+static void wkq_func(struct work_struct *wk) -+{ -+ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); -+ -+ AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)); -+ AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); -+ -+ au_wkq_lockdep_pre(wkinfo); -+ wkinfo->func(wkinfo->args); -+ au_wkq_lockdep_post(wkinfo); -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) -+ complete(wkinfo->comp); -+ else { -+ kobject_put(wkinfo->kobj); -+ module_put(THIS_MODULE); /* todo: ?? */ -+ au_kfree_rcu(wkinfo); -+ } -+} -+ -+/* -+ * Since struct completion is large, try allocating it dynamically. -+ */ -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ -+static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) -+{ -+ *comp = kmalloc(sizeof(**comp), GFP_NOFS); -+ if (*comp) { -+ init_completion(*comp); -+ wkinfo->comp = *comp; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+static void au_wkq_comp_free(struct completion *comp) -+{ -+ au_kfree_rcu(comp); -+} -+ -+static void au_wkq_run(struct au_wkinfo *wkinfo) -+{ -+ if (au_ftest_wkq(wkinfo->flags, NEST)) { -+ if (au_wkq_test()) { -+ AuWarn1("wkq from wkq, unless silly-rename on NFS," -+ " due to a dead dir by UDBA," -+ " or async xino write?\n"); -+ AuDebugOn(au_ftest_wkq(wkinfo->flags, WAIT)); -+ } -+ } else -+ au_dbg_verify_kthread(); -+ -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) { -+ INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func); -+ queue_work(au_wkq, &wkinfo->wk); -+ } else { -+ INIT_WORK(&wkinfo->wk, wkq_func); -+ schedule_work(&wkinfo->wk); -+ } -+} -+ -+/* -+ * Be careful. It is easy to make deadlock happen. -+ * processA: lock, wkq and wait -+ * processB: wkq and wait, lock in wkq -+ * --> deadlock -+ */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) -+{ -+ int err; -+ AuWkqCompDeclare(comp); -+ struct au_wkinfo wkinfo = { -+ .flags = flags, -+ .func = func, -+ .args = args -+ }; -+ -+ err = au_wkq_comp_alloc(&wkinfo, &comp); -+ if (unlikely(err)) -+ goto out; -+ err = au_wkq_lockdep_alloc(&wkinfo); -+ if (unlikely(err)) -+ goto out_comp; -+ if (!err) { -+ au_wkq_run(&wkinfo); -+ /* no timeout, no interrupt */ -+ wait_for_completion(wkinfo.comp); -+ } -+ au_wkq_lockdep_free(&wkinfo); -+ -+out_comp: -+ au_wkq_comp_free(comp); -+out: -+ destroy_work_on_stack(&wkinfo.wk); -+ return err; -+} -+ -+/* -+ * Note: dget/dput() in func for aufs dentries are not supported. It will be a -+ * problem in a concurrent umounting. -+ */ -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags) -+{ -+ int err; -+ struct au_wkinfo *wkinfo; -+ -+ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); -+ -+ /* -+ * wkq_func() must free this wkinfo. -+ * it highly depends upon the implementation of workqueue. -+ */ -+ err = 0; -+ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); -+ if (wkinfo) { -+ wkinfo->kobj = &au_sbi(sb)->si_kobj; -+ wkinfo->flags = flags & ~AuWkq_WAIT; -+ wkinfo->func = func; -+ wkinfo->args = args; -+ wkinfo->comp = NULL; -+ au_wkq_lockdep_init(wkinfo); -+ kobject_get(wkinfo->kobj); -+ __module_get(THIS_MODULE); /* todo: ?? */ -+ -+ au_wkq_run(wkinfo); -+ } else { -+ err = -ENOMEM; -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_nwt_init(struct au_nowait_tasks *nwt) -+{ -+ atomic_set(&nwt->nw_len, 0); -+ /* smp_mb(); */ /* atomic_set */ -+ init_waitqueue_head(&nwt->nw_wq); -+} -+ -+void au_wkq_fin(void) -+{ -+ destroy_workqueue(au_wkq); -+} -+ -+int __init au_wkq_init(void) -+{ -+ int err; -+ -+ err = 0; -+ au_wkq = alloc_workqueue(AUFS_WKQ_NAME, 0, WQ_DFL_ACTIVE); -+ if (IS_ERR(au_wkq)) -+ err = PTR_ERR(au_wkq); -+ else if (!au_wkq) -+ err = -ENOMEM; -+ -+ return err; -+} -diff -Nurp linux-5.15.37/fs/aufs/wkq.h linux-5.15.37-aufs/fs/aufs/wkq.h ---- linux-5.15.37/fs/aufs/wkq.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/wkq.h 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,76 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credentials management scheme -+ */ -+ -+#ifndef __AUFS_WKQ_H__ -+#define __AUFS_WKQ_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct super_block; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue -+ */ -+struct au_nowait_tasks { -+ atomic_t nw_len; -+ wait_queue_head_t nw_wq; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+typedef void (*au_wkq_func_t)(void *args); -+ -+/* wkq flags */ -+#define AuWkq_WAIT 1 -+#define AuWkq_NEST (1 << 1) -+#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) -+#define au_fset_wkq(flags, name) \ -+ do { (flags) |= AuWkq_##name; } while (0) -+#define au_fclr_wkq(flags, name) \ -+ do { (flags) &= ~AuWkq_##name; } while (0) -+ -+/* wkq.c */ -+int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args); -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, -+ unsigned int flags); -+void au_nwt_init(struct au_nowait_tasks *nwt); -+int __init au_wkq_init(void); -+void au_wkq_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int au_wkq_test(void) -+{ -+ return current->flags & PF_WQ_WORKER; -+} -+ -+static inline int au_wkq_wait(au_wkq_func_t func, void *args) -+{ -+ return au_wkq_do_wait(AuWkq_WAIT, func, args); -+} -+ -+static inline void au_nwt_done(struct au_nowait_tasks *nwt) -+{ -+ if (atomic_dec_and_test(&nwt->nw_len)) -+ wake_up_all(&nwt->nw_wq); -+} -+ -+static inline int au_nwt_flush(struct au_nowait_tasks *nwt) -+{ -+ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); -+ return 0; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WKQ_H__ */ -diff -Nurp linux-5.15.37/fs/aufs/xattr.c linux-5.15.37-aufs/fs/aufs/xattr.c ---- linux-5.15.37/fs/aufs/xattr.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/xattr.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,355 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2014-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * handling xattr functions -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int au_xattr_ignore(int err, char *name, unsigned int ignore_flags) -+{ -+ if (!ignore_flags) -+ goto out; -+ switch (err) { -+ case -ENOMEM: -+ case -EDQUOT: -+ goto out; -+ } -+ -+ if ((ignore_flags & AuBrAttr_ICEX) == AuBrAttr_ICEX) { -+ err = 0; -+ goto out; -+ } -+ -+#define cmp(brattr, prefix) do { \ -+ if (!strncmp(name, XATTR_##prefix##_PREFIX, \ -+ XATTR_##prefix##_PREFIX_LEN)) { \ -+ if (ignore_flags & AuBrAttr_ICEX_##brattr) \ -+ err = 0; \ -+ goto out; \ -+ } \ -+ } while (0) -+ -+ cmp(SEC, SECURITY); -+ cmp(SYS, SYSTEM); -+ cmp(TR, TRUSTED); -+ cmp(USR, USER); -+#undef cmp -+ -+ if (ignore_flags & AuBrAttr_ICEX_OTH) -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static const int au_xattr_out_of_list = AuBrAttr_ICEX_OTH << 1; -+ -+static int au_do_cpup_xattr(struct path *h_dst, struct path *h_src, -+ char *name, char **buf, unsigned int ignore_flags, -+ unsigned int verbose) -+{ -+ int err; -+ ssize_t ssz; -+ struct inode *h_idst; -+ struct dentry *h_dst_dentry, *h_src_dentry; -+ struct user_namespace *h_dst_userns, *h_src_userns; -+ -+ h_src_userns = mnt_user_ns(h_src->mnt); -+ h_src_dentry = h_src->dentry; -+ ssz = vfs_getxattr_alloc(h_src_userns, h_src_dentry, name, buf, 0, -+ GFP_NOFS); -+ err = ssz; -+ if (unlikely(err <= 0)) { -+ if (err == -ENODATA -+ || (err == -EOPNOTSUPP -+ && ((ignore_flags & au_xattr_out_of_list) -+ || (au_test_nfs_noacl(d_inode(h_src_dentry)) -+ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) -+ || !strcmp(name, -+ XATTR_NAME_POSIX_ACL_DEFAULT)))) -+ )) -+ err = 0; -+ if (err && (verbose || au_debug_test())) -+ pr_err("%s, err %d\n", name, err); -+ goto out; -+ } -+ -+ /* unlock it temporary */ -+ h_dst_userns = mnt_user_ns(h_dst->mnt); -+ h_dst_dentry = h_dst->dentry; -+ h_idst = d_inode(h_dst_dentry); -+ inode_unlock(h_idst); -+ err = vfsub_setxattr(h_dst_userns, h_dst_dentry, name, *buf, ssz, -+ /*flags*/0); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ if (unlikely(err)) { -+ if (verbose || au_debug_test()) -+ pr_err("%s, err %d\n", name, err); -+ err = au_xattr_ignore(err, name, ignore_flags); -+ } -+ -+out: -+ return err; -+} -+ -+int au_cpup_xattr(struct path *h_dst, struct path *h_src, int ignore_flags, -+ unsigned int verbose) -+{ -+ int err, unlocked, acl_access, acl_default; -+ ssize_t ssz; -+ struct dentry *h_dst_dentry, *h_src_dentry; -+ struct inode *h_isrc, *h_idst; -+ char *value, *p, *o, *e; -+ -+ /* try stopping to update the source inode while we are referencing */ -+ /* there should not be the parent-child relationship between them */ -+ h_dst_dentry = h_dst->dentry; -+ h_idst = d_inode(h_dst_dentry); -+ h_src_dentry = h_src->dentry; -+ h_isrc = d_inode(h_src_dentry); -+ inode_unlock(h_idst); -+ inode_lock_shared_nested(h_isrc, AuLsc_I_CHILD); -+ inode_lock_nested(h_idst, AuLsc_I_CHILD2); -+ unlocked = 0; -+ -+ /* some filesystems don't list POSIX ACL, for example tmpfs */ -+ ssz = vfs_listxattr(h_src_dentry, NULL, 0); -+ err = ssz; -+ if (unlikely(err < 0)) { -+ AuTraceErr(err); -+ if (err == -ENODATA -+ || err == -EOPNOTSUPP) -+ err = 0; /* ignore */ -+ goto out; -+ } -+ -+ err = 0; -+ p = NULL; -+ o = NULL; -+ if (ssz) { -+ err = -ENOMEM; -+ p = kmalloc(ssz, GFP_NOFS); -+ o = p; -+ if (unlikely(!p)) -+ goto out; -+ err = vfs_listxattr(h_src_dentry, p, ssz); -+ } -+ inode_unlock_shared(h_isrc); -+ unlocked = 1; -+ AuDbg("err %d, ssz %zd\n", err, ssz); -+ if (unlikely(err < 0)) -+ goto out_free; -+ -+ err = 0; -+ e = p + ssz; -+ value = NULL; -+ acl_access = 0; -+ acl_default = 0; -+ while (!err && p < e) { -+ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, -+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); -+ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, -+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) -+ - 1); -+ err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, -+ verbose); -+ p += strlen(p) + 1; -+ } -+ AuTraceErr(err); -+ ignore_flags |= au_xattr_out_of_list; -+ if (!err && !acl_access) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_ACCESS, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ if (!err && !acl_default) { -+ err = au_do_cpup_xattr(h_dst, h_src, -+ XATTR_NAME_POSIX_ACL_DEFAULT, &value, -+ ignore_flags, verbose); -+ AuTraceErr(err); -+ } -+ -+ au_kfree_try_rcu(value); -+ -+out_free: -+ au_kfree_try_rcu(o); -+out: -+ if (!unlocked) -+ inode_unlock_shared(h_isrc); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_smack_reentering(struct super_block *sb) -+{ -+#if IS_ENABLED(CONFIG_SECURITY_SMACK) || IS_ENABLED(CONFIG_SECURITY_SELINUX) -+ /* -+ * as a part of lookup, smack_d_instantiate() is called, and it calls -+ * i_op->getxattr(). ouch. -+ */ -+ return si_pid_test(sb); -+#else -+ return 0; -+#endif -+} -+ -+enum { -+ AU_XATTR_LIST, -+ AU_XATTR_GET -+}; -+ -+struct au_lgxattr { -+ int type; -+ union { -+ struct { -+ char *list; -+ size_t size; -+ } list; -+ struct { -+ const char *name; -+ void *value; -+ size_t size; -+ } get; -+ } u; -+}; -+ -+static ssize_t au_lgxattr(struct dentry *dentry, struct inode *inode, -+ struct au_lgxattr *arg) -+{ -+ ssize_t err; -+ int reenter; -+ struct path h_path; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ reenter = au_smack_reentering(sb); -+ if (!reenter) { -+ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); -+ if (unlikely(err)) -+ goto out; -+ } -+ err = au_h_path_getattr(dentry, inode, /*force*/1, &h_path, reenter); -+ if (unlikely(err)) -+ goto out_si; -+ if (unlikely(!h_path.dentry)) -+ /* illegally overlapped or something */ -+ goto out_di; /* pretending success */ -+ -+ /* always topmost entry only */ -+ switch (arg->type) { -+ case AU_XATTR_LIST: -+ err = vfs_listxattr(h_path.dentry, -+ arg->u.list.list, arg->u.list.size); -+ break; -+ case AU_XATTR_GET: -+ AuDebugOn(d_is_negative(h_path.dentry)); -+ err = vfs_getxattr(mnt_user_ns(h_path.mnt), h_path.dentry, -+ arg->u.get.name, arg->u.get.value, -+ arg->u.get.size); -+ break; -+ } -+ -+out_di: -+ if (!reenter) -+ di_read_unlock(dentry, AuLock_IR); -+out_si: -+ if (!reenter) -+ si_read_unlock(sb); -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_LIST, -+ .u.list = { -+ .list = list, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, /*inode*/NULL, &arg); -+} -+ -+static ssize_t au_getxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, void *value, size_t size) -+{ -+ struct au_lgxattr arg = { -+ .type = AU_XATTR_GET, -+ .u.get = { -+ .name = name, -+ .value = value, -+ .size = size -+ }, -+ }; -+ -+ return au_lgxattr(dentry, inode, &arg); -+} -+ -+static int au_setxattr(struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ struct au_sxattr arg = { -+ .type = AU_XATTR_SET, -+ .u.set = { -+ .name = name, -+ .value = value, -+ .size = size, -+ .flags = flags -+ }, -+ }; -+ -+ return au_sxattr(dentry, inode, &arg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xattr_get(const struct xattr_handler *handler, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, void *buffer, size_t size) -+{ -+ return au_getxattr(dentry, inode, name, buffer, size); -+} -+ -+static int au_xattr_set(const struct xattr_handler *handler, -+ struct user_namespace *userns, -+ struct dentry *dentry, struct inode *inode, -+ const char *name, const void *value, size_t size, -+ int flags) -+{ -+ return au_setxattr(dentry, inode, name, value, size, flags); -+} -+ -+static const struct xattr_handler au_xattr_handler = { -+ .name = "", -+ .prefix = "", -+ .get = au_xattr_get, -+ .set = au_xattr_set -+}; -+ -+static const struct xattr_handler *au_xattr_handlers[] = { -+#ifdef CONFIG_FS_POSIX_ACL -+ &posix_acl_access_xattr_handler, -+ &posix_acl_default_xattr_handler, -+#endif -+ &au_xattr_handler, /* must be last */ -+ NULL -+}; -+ -+void au_xattr_init(struct super_block *sb) -+{ -+ sb->s_xattr = au_xattr_handlers; -+} -diff -Nurp linux-5.15.37/fs/aufs/xino.c linux-5.15.37-aufs/fs/aufs/xino.c ---- linux-5.15.37/fs/aufs/xino.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/fs/aufs/xino.c 2022-04-08 20:22:30.616616670 +0300 -@@ -0,0 +1,1913 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+/* -+ * external inode number translation table and bitmap -+ * -+ * things to consider -+ * - the lifetime -+ * + au_xino object -+ * + XINO files (xino, xib, xigen) -+ * + dynamic debugfs entries (xiN) -+ * + static debugfs entries (xib, xigen) -+ * + static sysfs entry (xi_path) -+ * - several entry points to handle them. -+ * + mount(2) without xino option (default) -+ * + mount(2) with xino option -+ * + mount(2) with noxino option -+ * + umount(2) -+ * + remount with add/del branches -+ * + remount with xino/noxino options -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+static aufs_bindex_t sbr_find_shared(struct super_block *sb, aufs_bindex_t btop, -+ aufs_bindex_t bbot, -+ struct super_block *h_sb) -+{ -+ /* todo: try binary-search if the branches are many */ -+ for (; btop <= bbot; btop++) -+ if (h_sb == au_sbr_sb(sb, btop)) -+ return btop; -+ return -1; -+} -+ -+/* -+ * find another branch who is on the same filesystem of the specified -+ * branch{@btgt}. search until @bbot. -+ */ -+static aufs_bindex_t is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, -+ aufs_bindex_t bbot) -+{ -+ aufs_bindex_t bindex; -+ struct super_block *tgt_sb; -+ -+ tgt_sb = au_sbr_sb(sb, btgt); -+ bindex = sbr_find_shared(sb, /*btop*/0, btgt - 1, tgt_sb); -+ if (bindex < 0) -+ bindex = sbr_find_shared(sb, btgt + 1, bbot, tgt_sb); -+ -+ return bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * stop unnecessary notify events at creating xino files -+ */ -+ -+aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry) -+{ -+ aufs_bindex_t bfound, bindex, bbot; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ bfound = -1; -+ parent = dentry->d_parent; /* safe d_parent access */ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_dentry(br) == parent) { -+ bfound = bindex; -+ break; -+ } -+ } -+ -+ AuDbg("bfound b%d\n", bfound); -+ return bfound; -+} -+ -+struct au_xino_lock_dir { -+ struct au_hinode *hdir; -+ struct dentry *parent; -+ struct inode *dir; -+}; -+ -+static struct dentry *au_dget_parent_lock(struct dentry *dentry, -+ unsigned int lsc) -+{ -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = d_inode(parent); -+ inode_lock_nested(dir, lsc); -+#if 0 /* it should not happen */ -+ spin_lock(&dentry->d_lock); -+ if (unlikely(dentry->d_parent != parent)) { -+ spin_unlock(&dentry->d_lock); -+ inode_unlock(dir); -+ dput(parent); -+ parent = NULL; -+ goto out; -+ } -+ spin_unlock(&dentry->d_lock); -+ -+out: -+#endif -+ return parent; -+} -+ -+static void au_xino_lock_dir(struct super_block *sb, struct path *xipath, -+ struct au_xino_lock_dir *ldir) -+{ -+ aufs_bindex_t bindex; -+ -+ ldir->hdir = NULL; -+ bindex = au_xi_root(sb, xipath->dentry); -+ if (bindex >= 0) { -+ /* rw branch root */ -+ ldir->hdir = au_hi(d_inode(sb->s_root), bindex); -+ au_hn_inode_lock_nested(ldir->hdir, AuLsc_I_PARENT); -+ } else { -+ /* other */ -+ ldir->parent = au_dget_parent_lock(xipath->dentry, -+ AuLsc_I_PARENT); -+ ldir->dir = d_inode(ldir->parent); -+ } -+} -+ -+static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) -+{ -+ if (ldir->hdir) -+ au_hn_inode_unlock(ldir->hdir); -+ else { -+ inode_unlock(ldir->dir); -+ dput(ldir->parent); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create and set a new xino file -+ */ -+struct file *au_xino_create(struct super_block *sb, char *fpath, int silent, -+ int wbrtop) -+{ -+ struct file *file; -+ struct dentry *h_parent, *d; -+ struct inode *h_dir, *inode; -+ int err; -+ static DEFINE_MUTEX(mtx); -+ -+ /* -+ * at mount-time, and the xino file is the default path, -+ * hnotify is disabled so we have no notify events to ignore. -+ * when a user specified the xino, we cannot get au_hdir to be ignored. -+ */ -+ if (!wbrtop) -+ mutex_lock(&mtx); -+ file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE -+ /* | __FMODE_NONOTIFY */, -+ 0666); -+ if (IS_ERR(file)) { -+ if (!wbrtop) -+ mutex_unlock(&mtx); -+ if (!silent) -+ pr_err("open %s(%ld)\n", fpath, PTR_ERR(file)); -+ return file; -+ } -+ -+ /* keep file count */ -+ err = 0; -+ d = file->f_path.dentry; -+ h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT); -+ if (!wbrtop) -+ mutex_unlock(&mtx); -+ /* mnt_want_write() is unnecessary here */ -+ h_dir = d_inode(h_parent); -+ inode = file_inode(file); -+ /* no delegation since it is just created */ -+ if (inode->i_nlink) -+ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, -+ /*force*/0); -+ inode_unlock(h_dir); -+ dput(h_parent); -+ if (unlikely(err)) { -+ if (!silent) -+ pr_err("unlink %s(%d)\n", fpath, err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(sb && sb == d->d_sb)) { -+ if (!silent) -+ pr_err("%s must be outside\n", fpath); -+ goto out; -+ } -+ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { -+ if (!silent) -+ pr_err("xino doesn't support %s(%s)\n", -+ fpath, au_sbtype(d->d_sb)); -+ goto out; -+ } -+ return file; /* success */ -+ -+out: -+ fput(file); -+ file = ERR_PTR(err); -+ return file; -+} -+ -+/* -+ * create a new xinofile at the same place/path as @base. -+ */ -+struct file *au_xino_create2(struct super_block *sb, struct path *base, -+ struct file *copy_src) -+{ -+ struct file *file; -+ struct dentry *dentry; -+ struct inode *dir, *delegated; -+ struct qstr *name; -+ 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; -+ 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, &ppath, name->len); -+ if (IS_ERR(path.dentry)) { -+ file = (void *)path.dentry; -+ pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry)); -+ goto out; -+ } -+ -+ /* no need to mnt_want_write() since we call dentry_open() later */ -+ err = vfs_create(mnt_user_ns(base->mnt), dir, path.dentry, 0666, NULL); -+ if (unlikely(err)) { -+ file = ERR_PTR(err); -+ pr_err("%pd create err %d\n", dentry, err); -+ goto out_dput; -+ } -+ -+ path.mnt = base->mnt; -+ file = vfsub_dentry_open(&path, -+ O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE -+ /* | __FMODE_NONOTIFY */); -+ if (IS_ERR(file)) { -+ pr_err("%pd open err %ld\n", dentry, PTR_ERR(file)); -+ goto out_dput; -+ } -+ -+ delegated = NULL; -+ err = vfsub_unlink(dir, &file->f_path, &delegated, /*force*/0); -+ au_xino_unlock_dir(&ldir); -+ do_unlock = 0; -+ if (unlikely(err == -EWOULDBLOCK)) { -+ pr_warn("cannot retry for NFSv4 delegation" -+ " for an internal unlink\n"); -+ iput(delegated); -+ } -+ if (unlikely(err)) { -+ pr_err("%pd unlink err %d\n", dentry, err); -+ goto out_fput; -+ } -+ -+ if (copy_src) { -+ /* no one can touch copy_src xino */ -+ err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src)); -+ if (unlikely(err)) { -+ pr_err("%pd copy err %d\n", dentry, err); -+ goto out_fput; -+ } -+ } -+ goto out_dput; /* success */ -+ -+out_fput: -+ fput(file); -+ file = ERR_PTR(err); -+out_dput: -+ dput(path.dentry); -+out: -+ if (do_unlock) -+ au_xino_unlock_dir(&ldir); -+ return file; -+} -+ -+struct file *au_xino_file1(struct au_xino *xi) -+{ -+ struct file *file; -+ unsigned int u, nfile; -+ -+ file = NULL; -+ nfile = xi->xi_nfile; -+ for (u = 0; u < nfile; u++) { -+ file = xi->xi_file[u]; -+ if (file) -+ break; -+ } -+ -+ return file; -+} -+ -+static int au_xino_file_set(struct au_xino *xi, int idx, struct file *file) -+{ -+ int err; -+ struct file *f; -+ void *p; -+ -+ if (file) -+ get_file(file); -+ -+ err = 0; -+ f = NULL; -+ if (idx < xi->xi_nfile) { -+ f = xi->xi_file[idx]; -+ if (f) -+ fput(f); -+ } else { -+ p = au_kzrealloc(xi->xi_file, -+ sizeof(*xi->xi_file) * xi->xi_nfile, -+ sizeof(*xi->xi_file) * (idx + 1), -+ GFP_NOFS, /*may_shrink*/0); -+ if (p) { -+ MtxMustLock(&xi->xi_mtx); -+ xi->xi_file = p; -+ xi->xi_nfile = idx + 1; -+ } else { -+ err = -ENOMEM; -+ if (file) -+ fput(file); -+ goto out; -+ } -+ } -+ xi->xi_file[idx] = file; -+ -+out: -+ return err; -+} -+ -+/* -+ * if @xinew->xi is not set, then create new xigen file. -+ */ -+struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew) -+{ -+ struct file *file; -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ file = au_xino_create2(sb, xinew->base, xinew->copy_src); -+ if (IS_ERR(file)) { -+ err = PTR_ERR(file); -+ pr_err("%s[%d], err %d\n", -+ xinew->xi ? "xino" : "xigen", -+ xinew->idx, err); -+ goto out; -+ } -+ -+ if (xinew->xi) -+ err = au_xino_file_set(xinew->xi, xinew->idx, file); -+ else { -+ BUG(); -+ /* todo: make xigen file an array */ -+ /* err = au_xigen_file_set(sb, xinew->idx, file); */ -+ } -+ fput(file); -+ if (unlikely(err)) -+ file = ERR_PTR(err); -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate xino files -+ */ -+static int au_xino_do_trunc(struct super_block *sb, aufs_bindex_t bindex, -+ int idx, struct kstatfs *st) -+{ -+ int err; -+ blkcnt_t blocks; -+ struct file *file, *new_xino; -+ struct au_xi_new xinew = { -+ .idx = idx -+ }; -+ -+ err = 0; -+ xinew.xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xinew.xi, idx); -+ if (!file) -+ goto out; -+ -+ xinew.base = &file->f_path; -+ err = vfs_statfs(xinew.base, st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ goto out; -+ } -+ -+ blocks = file_inode(file)->i_blocks; -+ pr_info("begin truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)blocks, st->f_bfree, st->f_blocks); -+ -+ xinew.copy_src = file; -+ new_xino = au_xi_new(sb, &xinew); -+ if (IS_ERR(new_xino)) { -+ err = PTR_ERR(new_xino); -+ pr_err("xino(b%d-%d), err %d, ignored\n", bindex, idx, err); -+ goto out; -+ } -+ -+ err = vfs_statfs(&new_xino->f_path, st); -+ if (!err) -+ pr_info("end truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", -+ bindex, idx, (u64)file_inode(new_xino)->i_blocks, -+ st->f_bfree, st->f_blocks); -+ else { -+ AuErr1("statfs err %d, ignored\n", err); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin) -+{ -+ int err, i; -+ unsigned long jiffy; -+ aufs_bindex_t bbot; -+ struct kstatfs *st; -+ struct au_branch *br; -+ struct au_xino *xi; -+ -+ err = -ENOMEM; -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) -+ goto out; -+ -+ err = -EINVAL; -+ bbot = au_sbbot(sb); -+ if (unlikely(bindex < 0 || bbot < bindex)) -+ goto out_st; -+ -+ err = 0; -+ jiffy = jiffies; -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ for (i = idx_begin; !err && i < xi->xi_nfile; i++) -+ err = au_xino_do_trunc(sb, bindex, i, st); -+ if (!err) -+ au_sbi(sb)->si_xino_jiffy = jiffy; -+ -+out_st: -+ au_kfree_rcu(st); -+out: -+ return err; -+} -+ -+struct xino_do_trunc_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ int idx; -+}; -+ -+static void xino_do_trunc(void *_args) -+{ -+ struct xino_do_trunc_args *args = _args; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *dir; -+ int err, idx; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ sb = args->sb; -+ dir = d_inode(sb->s_root); -+ br = args->br; -+ idx = args->idx; -+ -+ si_noflush_write_lock(sb); -+ ii_read_lock_parent(dir); -+ bindex = au_br_index(sb, br->br_id); -+ err = au_xino_trunc(sb, bindex, idx); -+ ii_read_unlock(dir); -+ if (unlikely(err)) -+ pr_warn("err b%d, (%d)\n", bindex, err); -+ atomic_dec(&br->br_xino->xi_truncating); -+ au_lcnt_dec(&br->br_count); -+ si_write_unlock(sb); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ au_kfree_rcu(args); -+} -+ -+/* -+ * returns the index in the xi_file array whose corresponding file is necessary -+ * to truncate, or -1 which means no need to truncate. -+ */ -+static int xino_trunc_test(struct super_block *sb, struct au_branch *br) -+{ -+ int err; -+ unsigned int u; -+ struct kstatfs st; -+ struct au_sbinfo *sbinfo; -+ struct au_xino *xi; -+ struct file *file; -+ -+ /* todo: si_xino_expire and the ratio should be customizable */ -+ sbinfo = au_sbi(sb); -+ if (time_before(jiffies, -+ sbinfo->si_xino_jiffy + sbinfo->si_xino_expire)) -+ return -1; -+ -+ /* truncation border */ -+ xi = br->br_xino; -+ for (u = 0; u < xi->xi_nfile; u++) { -+ file = au_xino_file(xi, u); -+ if (!file) -+ continue; -+ -+ err = vfs_statfs(&file->f_path, &st); -+ if (unlikely(err)) { -+ AuErr1("statfs err %d, ignored\n", err); -+ return -1; -+ } -+ if (div64_u64(st.f_bfree * 100, st.f_blocks) -+ >= AUFS_XINO_DEF_TRUNC) -+ return u; -+ } -+ -+ return -1; -+} -+ -+static void xino_try_trunc(struct super_block *sb, struct au_branch *br) -+{ -+ int idx; -+ struct xino_do_trunc_args *args; -+ int wkq_err; -+ -+ idx = xino_trunc_test(sb, br); -+ if (idx < 0) -+ return; -+ -+ if (atomic_inc_return(&br->br_xino->xi_truncating) > 1) -+ goto out; -+ -+ /* lock and kfree() will be called in trunc_xino() */ -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ goto out; -+ } -+ -+ au_lcnt_inc(&br->br_count); -+ args->sb = sb; -+ args->br = br; -+ args->idx = idx; -+ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb, /*flags*/0); -+ if (!wkq_err) -+ return; /* success */ -+ -+ pr_err("wkq %d\n", wkq_err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(args); -+ -+out: -+ atomic_dec(&br->br_xino->xi_truncating); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xi_calc { -+ int idx; -+ loff_t pos; -+}; -+ -+static void au_xi_calc(struct super_block *sb, ino_t h_ino, -+ struct au_xi_calc *calc) -+{ -+ loff_t maxent; -+ -+ maxent = au_xi_maxent(sb); -+ calc->idx = div64_u64_rem(h_ino, maxent, &calc->pos); -+ calc->pos *= sizeof(ino_t); -+} -+ -+static int au_xino_do_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc) -+{ -+ int err; -+ struct file *file; -+ struct au_xino *xi = br->br_xino; -+ struct au_xi_new xinew = { -+ .xi = xi -+ }; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (!xi) -+ goto out; -+ -+ mutex_lock(&xi->xi_mtx); -+ file = au_xino_file(xi, calc->idx); -+ if (file) -+ goto out_mtx; -+ -+ file = au_xino_file(xi, /*idx*/-1); -+ AuDebugOn(!file); -+ xinew.idx = calc->idx; -+ xinew.base = &file->f_path; -+ /* xinew.copy_src = NULL; */ -+ file = au_xi_new(sb, &xinew); -+ if (IS_ERR(file)) -+ err = PTR_ERR(file); -+ -+out_mtx: -+ mutex_unlock(&xi->xi_mtx); -+out: -+ return err; -+} -+ -+struct au_xino_do_new_async_args { -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ ino_t ino; -+}; -+ -+struct au_xi_writing { -+ struct hlist_bl_node node; -+ ino_t h_ino, ino; -+}; -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino); -+ -+static void au_xino_call_do_new_async(void *args) -+{ -+ struct au_xino_do_new_async_args *a = args; -+ struct au_branch *br; -+ struct super_block *sb; -+ struct au_sbinfo *sbi; -+ struct inode *root; -+ struct file *file; -+ struct au_xi_writing *del, *p; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ int err; -+ -+ br = a->br; -+ sb = a->sb; -+ sbi = au_sbi(sb); -+ si_noflush_read_lock(sb); -+ root = d_inode(sb->s_root); -+ ii_read_lock_child(root); -+ err = au_xino_do_new_async(sb, br, &a->calc); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ file = au_xino_file(br->br_xino, a->calc.idx); -+ AuDebugOn(!file); -+ err = au_xino_do_write(file, &a->calc, a->ino); -+ if (unlikely(err)) { -+ AuIOErr("err %d\n", err); -+ goto out; -+ } -+ -+ del = NULL; -+ hbl = &br->br_xino->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->ino == a->ino) { -+ del = p; -+ hlist_bl_del(&p->node); -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ au_kfree_rcu(del); -+ -+out: -+ au_lcnt_dec(&br->br_count); -+ ii_read_unlock(root); -+ si_read_unlock(sb); -+ au_nwt_done(&sbi->si_nowait); -+ au_kfree_rcu(a); -+} -+ -+/* -+ * create a new xino file asynchronously -+ */ -+static int au_xino_new_async(struct super_block *sb, struct au_branch *br, -+ struct au_xi_calc *calc, ino_t ino) -+{ -+ int err; -+ struct au_xino_do_new_async_args *arg; -+ -+ err = -ENOMEM; -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (unlikely(!arg)) -+ goto out; -+ -+ arg->sb = sb; -+ arg->br = br; -+ arg->calc = *calc; -+ arg->ino = ino; -+ au_lcnt_inc(&br->br_count); -+ err = au_wkq_nowait(au_xino_call_do_new_async, arg, sb, AuWkq_NEST); -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ au_lcnt_dec(&br->br_count); -+ au_kfree_rcu(arg); -+ } -+ -+out: -+ return err; -+} -+ -+/* -+ * read @ino from xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ */ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino) -+{ -+ int err; -+ ssize_t sz; -+ struct au_xi_calc calc; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct au_xino *xi; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos; -+ struct au_xi_writing *p; -+ -+ *ino = 0; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return 0; /* no xino */ -+ -+ err = 0; -+ au_xi_calc(sb, h_ino, &calc); -+ xi = au_sbr(sb, bindex)->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ hbl = &xi->xi_writing; -+ hlist_bl_lock(hbl); -+ au_hbl_for_each(pos, hbl) { -+ p = container_of(pos, struct au_xi_writing, node); -+ if (p->h_ino == h_ino) { -+ AuDbg("hi%llu, i%llu, found\n", -+ (u64)p->h_ino, (u64)p->ino); -+ *ino = p->ino; -+ break; -+ } -+ } -+ hlist_bl_unlock(hbl); -+ return 0; -+ } else if (vfsub_f_size_read(file) < calc.pos + sizeof(*ino)) -+ return 0; /* no xino */ -+ -+ sbinfo = au_sbi(sb); -+ sz = xino_fread(file, ino, sizeof(*ino), &calc.pos); -+ if (sz == sizeof(*ino)) -+ return 0; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xino read error (%zd)\n", sz); -+ } -+ return err; -+} -+ -+static int au_xino_do_write(struct file *file, struct au_xi_calc *calc, -+ ino_t ino) -+{ -+ ssize_t sz; -+ -+ sz = xino_fwrite(file, &ino, sizeof(ino), &calc->pos); -+ if (sz == sizeof(ino)) -+ return 0; /* success */ -+ -+ AuIOErr("write failed (%zd)\n", sz); -+ return -EIO; -+} -+ -+/* -+ * write @ino to the xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ * even if @ino is zero, it is written to the xinofile and means no entry. -+ * if the size of the xino file on a specific filesystem exceeds the watermark, -+ * try truncating it. -+ */ -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino) -+{ -+ int err; -+ unsigned int mnt_flags; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct au_xi_writing *p; -+ -+ SiMustAnyLock(sb); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO)) -+ return 0; -+ -+ au_xi_calc(sb, h_ino, &calc); -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ file = au_xino_file(xi, calc.idx); -+ if (!file) { -+ /* store the inum pair into the list */ -+ p = kmalloc(sizeof(*p), GFP_NOFS | __GFP_NOFAIL); -+ p->h_ino = h_ino; -+ p->ino = ino; -+ au_hbl_add(&p->node, &xi->xi_writing); -+ -+ /* create and write a new xino file asynchronously */ -+ err = au_xino_new_async(sb, br, &calc, ino); -+ if (!err) -+ return 0; /* success */ -+ goto out; -+ } -+ -+ err = au_xino_do_write(file, &calc, ino); -+ if (!err) { -+ br = au_sbr(sb, bindex); -+ if (au_opt_test(mnt_flags, TRUNC_XINO) -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr("write failed (%d)\n", err); -+ return -EIO; -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+/* todo: unnecessary to support mmap_sem since kernel-space? */ -+ssize_t xino_fread(struct file *file, void *kbuf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_read_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fread_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_access(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct xino_fread_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_xino_fread(void *args) -+{ -+ struct xino_fread_args *a = args; -+ *a->errp = xino_fread(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct xino_fread_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ wkq_err = au_wkq_wait(call_xino_fread, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ -+static ssize_t do_xino_fwrite(struct file *file, void *kbuf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int i; -+ const int prevent_endless = 10; -+ -+ i = 0; -+ do { -+ err = vfsub_write_k(file, kbuf, size, pos); -+ if (err == -EINTR -+ && !au_wkq_test() -+ && fatal_signal_pending(current)) { -+ err = xino_fwrite_wkq(file, kbuf, size, pos); -+ BUG_ON(err == -EINTR); -+ } -+ } while (i++ < prevent_endless -+ && (err == -EAGAIN || err == -EINTR)); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_modify(file->f_path.dentry); -+#endif -+ -+ return err; -+} -+ -+struct do_xino_fwrite_args { -+ ssize_t *errp; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_do_xino_fwrite(void *args) -+{ -+ struct do_xino_fwrite_args *a = args; -+ *a->errp = do_xino_fwrite(a->file, a->buf, a->size, a->pos); -+} -+ -+static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ int wkq_err; -+ struct do_xino_fwrite_args args = { -+ .errp = &err, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ /* -+ * it breaks RLIMIT_FSIZE and normal user's limit, -+ * users should care about quota and real 'filesystem full.' -+ */ -+ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ -+ if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) { -+ lockdep_off(); -+ err = do_xino_fwrite(file, buf, size, pos); -+ lockdep_on(); -+ } else { -+ lockdep_off(); -+ err = xino_fwrite_wkq(file, buf, size, pos); -+ lockdep_on(); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * inode number bitmap -+ */ -+static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; -+static ino_t xib_calc_ino(unsigned long pindex, int bit) -+{ -+ ino_t ino; -+ -+ AuDebugOn(bit < 0 || page_bits <= bit); -+ ino = AUFS_FIRST_INO + pindex * page_bits + bit; -+ return ino; -+} -+ -+static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) -+{ -+ AuDebugOn(ino < AUFS_FIRST_INO); -+ ino -= AUFS_FIRST_INO; -+ *pindex = ino / page_bits; -+ *bit = ino % page_bits; -+} -+ -+static int xib_pindex(struct super_block *sb, unsigned long pindex) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct au_sbinfo *sbinfo; -+ struct file *xib; -+ unsigned long *p; -+ -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE -+ || !au_opt_test(sbinfo->si_mntflags, XINO)); -+ -+ if (pindex == sbinfo->si_xib_last_pindex) -+ return 0; -+ -+ xib = sbinfo->si_xib; -+ p = sbinfo->si_xib_buf; -+ pos = sbinfo->si_xib_last_pindex; -+ pos *= PAGE_SIZE; -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) -+ goto out; -+ -+ pos = pindex; -+ pos *= PAGE_SIZE; -+ if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE) -+ sz = xino_fread(xib, p, PAGE_SIZE, &pos); -+ else { -+ memset(p, 0, PAGE_SIZE); -+ sz = xino_fwrite(xib, p, PAGE_SIZE, &pos); -+ } -+ if (sz == PAGE_SIZE) { -+ sbinfo->si_xib_last_pindex = pindex; -+ return 0; /* success */ -+ } -+ -+out: -+ AuIOErr1("write failed (%zd)\n", sz); -+ err = sz; -+ if (sz >= 0) -+ err = -EIO; -+ return err; -+} -+ -+static void au_xib_clear_bit(struct inode *inode) -+{ -+ int err, bit; -+ unsigned long pindex; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(inode->i_nlink); -+ -+ sb = inode->i_sb; -+ xib_calc_bit(inode->i_ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ err = xib_pindex(sb, pindex); -+ if (!err) { -+ clear_bit(bit, sbinfo->si_xib_buf); -+ sbinfo->si_xib_next_bit = bit; -+ } -+ mutex_unlock(&sbinfo->si_xib_mtx); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * truncate a xino bitmap file -+ */ -+ -+/* todo: slow */ -+static int do_xib_restore(struct super_block *sb, struct file *file, void *page) -+{ -+ int err, bit; -+ ssize_t sz; -+ unsigned long pindex; -+ loff_t pos, pend; -+ struct au_sbinfo *sbinfo; -+ ino_t *ino; -+ unsigned long *p; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ pend = vfsub_f_size_read(file); -+ pos = 0; -+ while (pos < pend) { -+ sz = xino_fread(file, page, PAGE_SIZE, &pos); -+ err = sz; -+ if (unlikely(sz <= 0)) -+ goto out; -+ -+ err = 0; -+ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { -+ if (unlikely(*ino < AUFS_FIRST_INO)) -+ continue; -+ -+ xib_calc_bit(*ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ err = xib_pindex(sb, pindex); -+ if (!err) -+ set_bit(bit, p); -+ else -+ goto out; -+ } -+ } -+ -+out: -+ return err; -+} -+ -+static int xib_restore(struct super_block *sb) -+{ -+ int err, i; -+ unsigned int nfile; -+ aufs_bindex_t bindex, bbot; -+ void *page; -+ struct au_branch *br; -+ struct au_xino *xi; -+ struct file *file; -+ -+ err = -ENOMEM; -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ -+ err = 0; -+ bbot = au_sbbot(sb); -+ for (bindex = 0; !err && bindex <= bbot; bindex++) -+ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) { -+ br = au_sbr(sb, bindex); -+ xi = br->br_xino; -+ nfile = xi->xi_nfile; -+ for (i = 0; i < nfile; i++) { -+ file = au_xino_file(xi, i); -+ if (file) -+ err = do_xib_restore(sb, file, page); -+ } -+ } else -+ AuDbg("skip shared b%d\n", bindex); -+ free_page((unsigned long)page); -+ -+out: -+ return err; -+} -+ -+int au_xib_trunc(struct super_block *sb) -+{ -+ int err; -+ ssize_t sz; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ unsigned long *p; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ if (!au_opt_test(sbinfo->si_mntflags, XINO)) -+ goto out; -+ -+ file = sbinfo->si_xib; -+ if (vfsub_f_size_read(file) <= PAGE_SIZE) -+ goto out; -+ -+ file = au_xino_create2(sb, &sbinfo->si_xib->f_path, NULL); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ -+ p = sbinfo->si_xib_buf; -+ memset(p, 0, PAGE_SIZE); -+ pos = 0; -+ sz = xino_fwrite(sbinfo->si_xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) { -+ err = sz; -+ AuIOErr("err %d\n", err); -+ if (sz >= 0) -+ err = -EIO; -+ goto out; -+ } -+ -+ mutex_lock(&sbinfo->si_xib_mtx); -+ /* mnt_want_write() is unnecessary here */ -+ err = xib_restore(sb); -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_xino *au_xino_alloc(unsigned int nfile) -+{ -+ struct au_xino *xi; -+ -+ xi = kzalloc(sizeof(*xi), GFP_NOFS); -+ if (unlikely(!xi)) -+ goto out; -+ xi->xi_nfile = nfile; -+ xi->xi_file = kcalloc(nfile, sizeof(*xi->xi_file), GFP_NOFS); -+ if (unlikely(!xi->xi_file)) -+ goto out_free; -+ -+ xi->xi_nondir.total = 8; /* initial size */ -+ xi->xi_nondir.array = kcalloc(xi->xi_nondir.total, sizeof(ino_t), -+ GFP_NOFS); -+ if (unlikely(!xi->xi_nondir.array)) -+ goto out_file; -+ -+ spin_lock_init(&xi->xi_nondir.spin); -+ init_waitqueue_head(&xi->xi_nondir.wqh); -+ mutex_init(&xi->xi_mtx); -+ INIT_HLIST_BL_HEAD(&xi->xi_writing); -+ atomic_set(&xi->xi_truncating, 0); -+ kref_init(&xi->xi_kref); -+ goto out; /* success */ -+ -+out_file: -+ au_kfree_try_rcu(xi->xi_file); -+out_free: -+ au_kfree_rcu(xi); -+ xi = NULL; -+out: -+ return xi; -+} -+ -+static int au_xino_init(struct au_branch *br, int idx, struct file *file) -+{ -+ int err; -+ struct au_xino *xi; -+ -+ err = 0; -+ xi = au_xino_alloc(idx + 1); -+ if (unlikely(!xi)) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ if (file) -+ get_file(file); -+ xi->xi_file[idx] = file; -+ AuDebugOn(br->br_xino); -+ br->br_xino = xi; -+ -+out: -+ return err; -+} -+ -+static void au_xino_release(struct kref *kref) -+{ -+ struct au_xino *xi; -+ int i; -+ unsigned long ul; -+ struct hlist_bl_head *hbl; -+ struct hlist_bl_node *pos, *n; -+ struct au_xi_writing *p; -+ -+ xi = container_of(kref, struct au_xino, xi_kref); -+ for (i = 0; i < xi->xi_nfile; i++) -+ if (xi->xi_file[i]) -+ fput(xi->xi_file[i]); -+ for (i = xi->xi_nondir.total - 1; i >= 0; i--) -+ AuDebugOn(xi->xi_nondir.array[i]); -+ mutex_destroy(&xi->xi_mtx); -+ hbl = &xi->xi_writing; -+ ul = au_hbl_count(hbl); -+ if (unlikely(ul)) { -+ pr_warn("xi_writing %lu\n", ul); -+ hlist_bl_lock(hbl); -+ hlist_bl_for_each_entry_safe(p, pos, n, hbl, node) { -+ hlist_bl_del(&p->node); -+ /* kmemleak reported au_kfree_rcu() doesn't free it */ -+ kfree(p); -+ } -+ hlist_bl_unlock(hbl); -+ } -+ au_kfree_try_rcu(xi->xi_file); -+ au_kfree_try_rcu(xi->xi_nondir.array); -+ au_kfree_rcu(xi); -+} -+ -+int au_xino_put(struct au_branch *br) -+{ -+ int ret; -+ struct au_xino *xi; -+ -+ ret = 0; -+ xi = br->br_xino; -+ if (xi) { -+ br->br_xino = NULL; -+ ret = kref_put(&xi->xi_kref, au_xino_release); -+ } -+ -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * xino mount option handlers -+ */ -+ -+/* xino bitmap */ -+static void xino_clear_xib(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+} -+ -+static int au_xino_set_xib(struct super_block *sb, struct path *path) -+{ -+ int err; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ struct super_block *xi_sb; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(sb, path, sbinfo->si_xib); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ xi_sb = file_inode(file)->i_sb; -+ sbinfo->si_ximaxent = xi_sb->s_maxbytes; -+ if (unlikely(sbinfo->si_ximaxent < PAGE_SIZE)) { -+ err = -EIO; -+ pr_err("s_maxbytes(%llu) on %s is too small\n", -+ (u64)sbinfo->si_ximaxent, au_sbtype(xi_sb)); -+ goto out_unset; -+ } -+ sbinfo->si_ximaxent /= sizeof(ino_t); -+ -+ err = -ENOMEM; -+ if (!sbinfo->si_xib_buf) -+ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!sbinfo->si_xib_buf)) -+ goto out_unset; -+ -+ sbinfo->si_xib_last_pindex = 0; -+ sbinfo->si_xib_next_bit = 0; -+ if (vfsub_f_size_read(file) < PAGE_SIZE) { -+ pos = 0; -+ err = xino_fwrite(file, sbinfo->si_xib_buf, PAGE_SIZE, &pos); -+ if (unlikely(err != PAGE_SIZE)) -+ goto out_free; -+ } -+ err = 0; -+ goto out; /* success */ -+ -+out_free: -+ if (sbinfo->si_xib_buf) -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+ if (err >= 0) -+ err = -EIO; -+out_unset: -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* xino for each branch */ -+static void xino_clear_br(struct super_block *sb) -+{ -+ aufs_bindex_t bindex, bbot; -+ struct au_branch *br; -+ -+ bbot = au_sbbot(sb); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ AuDebugOn(!br); -+ au_xino_put(br); -+ } -+} -+ -+static void au_xino_set_br_shared(struct super_block *sb, struct au_branch *br, -+ aufs_bindex_t bshared) -+{ -+ struct au_branch *brshared; -+ -+ brshared = au_sbr(sb, bshared); -+ AuDebugOn(!brshared->br_xino); -+ AuDebugOn(!brshared->br_xino->xi_file); -+ if (br->br_xino != brshared->br_xino) { -+ au_xino_get(brshared); -+ au_xino_put(br); -+ br->br_xino = brshared->br_xino; -+ } -+} -+ -+struct au_xino_do_set_br { -+ struct au_branch *br; -+ ino_t h_ino; -+ aufs_bindex_t bshared; -+}; -+ -+static int au_xino_do_set_br(struct super_block *sb, struct path *path, -+ struct au_xino_do_set_br *args) -+{ -+ int err; -+ struct au_xi_calc calc; -+ struct file *file; -+ struct au_branch *br; -+ struct au_xi_new xinew = { -+ .base = path -+ }; -+ -+ br = args->br; -+ xinew.xi = br->br_xino; -+ au_xi_calc(sb, args->h_ino, &calc); -+ xinew.copy_src = au_xino_file(xinew.xi, calc.idx); -+ if (args->bshared >= 0) -+ /* shared xino */ -+ au_xino_set_br_shared(sb, br, args->bshared); -+ else if (!xinew.xi) { -+ /* new xino */ -+ err = au_xino_init(br, calc.idx, xinew.copy_src); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* force re-creating */ -+ xinew.xi = br->br_xino; -+ xinew.idx = calc.idx; -+ mutex_lock(&xinew.xi->xi_mtx); -+ file = au_xi_new(sb, &xinew); -+ mutex_unlock(&xinew.xi->xi_mtx); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ AuDebugOn(!file); -+ -+ err = au_xino_do_write(file, &calc, AUFS_ROOT_INO); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_xino_set_br(struct super_block *sb, struct path *path) -+{ -+ int err; -+ aufs_bindex_t bindex, bbot; -+ struct au_xino_do_set_br args; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ bbot = au_sbbot(sb); -+ inode = d_inode(sb->s_root); -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ args.h_ino = au_h_iptr(inode, bindex)->i_ino; -+ args.br = au_sbr(sb, bindex); -+ args.bshared = is_sb_shared(sb, bindex, bindex - 1); -+ err = au_xino_do_set_br(sb, path, &args); -+ if (unlikely(err)) -+ break; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_xino_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ au_xigen_clr(sb); -+ xino_clear_xib(sb); -+ xino_clear_br(sb); -+ dbgaufs_brs_del(sb, 0); -+ sbinfo = au_sbi(sb); -+ /* lvalue, do not call au_mntflags() */ -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+} -+ -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount) -+{ -+ int err, skip; -+ struct dentry *dentry, *parent, *cur_dentry, *cur_parent; -+ struct qstr *dname, *cur_name; -+ struct file *cur_xino; -+ struct au_sbinfo *sbinfo; -+ struct path *path, *cur_path; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ path = &xiopt->file->f_path; -+ dentry = path->dentry; -+ parent = dget_parent(dentry); -+ if (remount) { -+ skip = 0; -+ cur_xino = sbinfo->si_xib; -+ if (cur_xino) { -+ cur_path = &cur_xino->f_path; -+ cur_dentry = cur_path->dentry; -+ cur_parent = dget_parent(cur_dentry); -+ cur_name = &cur_dentry->d_name; -+ dname = &dentry->d_name; -+ skip = (cur_parent == parent -+ && au_qstreq(dname, cur_name)); -+ dput(cur_parent); -+ } -+ if (skip) -+ goto out; -+ } -+ -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ err = au_xino_set_xib(sb, path); -+ /* si_x{read,write} are set */ -+ if (!err) -+ err = au_xigen_set(sb, path); -+ if (!err) -+ err = au_xino_set_br(sb, path); -+ if (!err) { -+ dbgaufs_brs_add(sb, 0, /*topdown*/1); -+ goto out; /* success */ -+ } -+ -+ /* reset all */ -+ AuIOErr("failed setting xino(%d).\n", err); -+ au_xino_clr(sb); -+ -+out: -+ dput(parent); -+ return err; -+} -+ -+/* -+ * create a xinofile at the default place/path. -+ */ -+struct file *au_xino_def(struct super_block *sb) -+{ -+ struct file *file; -+ char *page, *p; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ struct path path; -+ aufs_bindex_t bbot, bindex, bwr; -+ -+ br = NULL; -+ bbot = au_sbbot(sb); -+ bwr = -1; -+ for (bindex = 0; bindex <= bbot; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm) -+ && !au_test_fs_bad_xino(au_br_sb(br))) { -+ bwr = bindex; -+ break; -+ } -+ } -+ -+ if (bwr >= 0) { -+ file = ERR_PTR(-ENOMEM); -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ path.mnt = au_br_mnt(br); -+ path.dentry = au_h_dptr(sb->s_root, bwr); -+ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); -+ file = (void *)p; -+ if (!IS_ERR(p)) { -+ strcat(p, "/" AUFS_XINO_FNAME); -+ AuDbg("%s\n", p); -+ file = au_xino_create(sb, p, /*silent*/0, /*wbrtop*/1); -+ } -+ free_page((unsigned long)page); -+ } else { -+ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0, -+ /*wbrtop*/0); -+ if (IS_ERR(file)) -+ goto out; -+ h_sb = file->f_path.dentry->d_sb; -+ if (unlikely(au_test_fs_bad_xino(h_sb))) { -+ pr_err("xino doesn't support %s(%s)\n", -+ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); -+ fput(file); -+ file = ERR_PTR(-EINVAL); -+ } -+ } -+ -+out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * initialize the xinofile for the specified branch @br -+ * at the place/path where @base_file indicates. -+ * test whether another branch is on the same filesystem or not, -+ * if found then share the xinofile with another branch. -+ */ -+int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, -+ struct path *base) -+{ -+ int err; -+ struct au_xino_do_set_br args = { -+ .h_ino = h_ino, -+ .br = br -+ }; -+ -+ args.bshared = sbr_find_shared(sb, /*btop*/0, au_sbbot(sb), -+ au_br_sb(br)); -+ err = au_xino_do_set_br(sb, base, &args); -+ if (unlikely(err)) -+ au_xino_put(br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * get an unused inode number from bitmap -+ */ -+ino_t au_xino_new_ino(struct super_block *sb) -+{ -+ ino_t ino; -+ unsigned long *p, pindex, ul, pend; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ int free_bit, err; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return iunique(sb, AUFS_FIRST_INO); -+ -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ free_bit = sbinfo->si_xib_next_bit; -+ if (free_bit < page_bits && !test_bit(free_bit, p)) -+ goto out; /* success */ -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ -+ pindex = sbinfo->si_xib_last_pindex; -+ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ -+ file = sbinfo->si_xib; -+ pend = vfsub_f_size_read(file) / PAGE_SIZE; -+ for (ul = pindex + 1; ul <= pend; ul++) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ BUG(); -+ -+out: -+ set_bit(free_bit, p); -+ sbinfo->si_xib_next_bit = free_bit + 1; -+ pindex = sbinfo->si_xib_last_pindex; -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ ino = xib_calc_ino(pindex, free_bit); -+ AuDbg("i%lu\n", (unsigned long)ino); -+ return ino; -+out_err: -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ AuDbg("i0\n"); -+ return 0; -+} -+ -+/* for s_op->delete_inode() */ -+void au_xino_delete_inode(struct inode *inode, const int unlinked) -+{ -+ int err; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bbot, bi; -+ unsigned char try_trunc; -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ struct au_hinode *hi; -+ struct inode *h_inode; -+ struct au_branch *br; -+ struct au_xi_calc calc; -+ struct file *file; -+ -+ AuDebugOn(au_is_bad_inode(inode)); -+ -+ sb = inode->i_sb; -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO) -+ || inode->i_ino == AUFS_ROOT_INO) -+ return; -+ -+ if (unlinked) { -+ au_xigen_inc(inode); -+ au_xib_clear_bit(inode); -+ } -+ -+ iinfo = au_ii(inode); -+ bindex = iinfo->ii_btop; -+ if (bindex < 0) -+ return; -+ -+ try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO); -+ hi = au_hinode(iinfo, bindex); -+ bbot = iinfo->ii_bbot; -+ for (; bindex <= bbot; bindex++, hi++) { -+ h_inode = hi->hi_inode; -+ if (!h_inode -+ || (!unlinked && h_inode->i_nlink)) -+ continue; -+ -+ /* inode may not be revalidated */ -+ bi = au_br_index(sb, hi->hi_id); -+ if (bi < 0) -+ continue; -+ -+ br = au_sbr(sb, bi); -+ au_xi_calc(sb, h_inode->i_ino, &calc); -+ file = au_xino_file(br->br_xino, calc.idx); -+ if (IS_ERR_OR_NULL(file)) -+ continue; -+ -+ err = au_xino_do_write(file, &calc, /*ino*/0); -+ if (!err && try_trunc -+ && au_test_fs_trunc_xino(au_br_sb(br))) -+ xino_try_trunc(sb, br); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xinondir_find(struct au_xino *xi, ino_t h_ino) -+{ -+ int found, total, i; -+ -+ found = -1; -+ total = xi->xi_nondir.total; -+ for (i = 0; i < total; i++) { -+ if (xi->xi_nondir.array[i] != h_ino) -+ continue; -+ found = i; -+ break; -+ } -+ -+ return found; -+} -+ -+static int au_xinondir_expand(struct au_xino *xi) -+{ -+ int err, sz; -+ ino_t *p; -+ -+ BUILD_BUG_ON(KMALLOC_MAX_SIZE > INT_MAX); -+ -+ err = -ENOMEM; -+ sz = xi->xi_nondir.total * sizeof(ino_t); -+ if (unlikely(sz > KMALLOC_MAX_SIZE / 2)) -+ goto out; -+ p = au_kzrealloc(xi->xi_nondir.array, sz, sz << 1, GFP_ATOMIC, -+ /*may_shrink*/0); -+ if (p) { -+ xi->xi_nondir.array = p; -+ xi->xi_nondir.total <<= 1; -+ AuDbg("xi_nondir.total %d\n", xi->xi_nondir.total); -+ err = 0; -+ } -+ -+out: -+ return err; -+} -+ -+void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, int idx) -+{ -+ struct au_xino *xi; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); -+ xi = au_sbr(sb, bindex)->br_xino; -+ AuDebugOn(idx < 0 || xi->xi_nondir.total <= idx); -+ -+ spin_lock(&xi->xi_nondir.spin); -+ AuDebugOn(xi->xi_nondir.array[idx] != h_ino); -+ xi->xi_nondir.array[idx] = 0; -+ spin_unlock(&xi->xi_nondir.spin); -+ wake_up_all(&xi->xi_nondir.wqh); -+} -+ -+int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ int *idx) -+{ -+ int err, found, empty; -+ struct au_xino *xi; -+ -+ err = 0; -+ *idx = -1; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ goto out; /* no xino */ -+ -+ xi = au_sbr(sb, bindex)->br_xino; -+ -+again: -+ spin_lock(&xi->xi_nondir.spin); -+ found = au_xinondir_find(xi, h_ino); -+ if (found == -1) { -+ empty = au_xinondir_find(xi, /*h_ino*/0); -+ if (empty == -1) { -+ empty = xi->xi_nondir.total; -+ err = au_xinondir_expand(xi); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ xi->xi_nondir.array[empty] = h_ino; -+ *idx = empty; -+ } else { -+ spin_unlock(&xi->xi_nondir.spin); -+ wait_event(xi->xi_nondir.wqh, -+ xi->xi_nondir.array[found] != h_ino); -+ goto again; -+ } -+ -+out_unlock: -+ spin_unlock(&xi->xi_nondir.spin); -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_xino_path(struct seq_file *seq, struct file *file) -+{ -+ int err; -+ -+ err = au_seq_path(seq, &file->f_path); -+ if (unlikely(err)) -+ goto out; -+ -+#define Deleted "\\040(deleted)" -+ seq->count -= sizeof(Deleted) - 1; -+ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, -+ sizeof(Deleted) - 1)); -+#undef Deleted -+ -+out: -+ return err; -+} -diff -Nurp linux-5.15.37/fs/dcache.c linux-5.15.37-aufs/fs/dcache.c ---- linux-5.15.37/fs/dcache.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/dcache.c 2022-04-08 20:22:30.617616719 +0300 -@@ -1345,7 +1345,7 @@ enum d_walk_ret { - * - * The @enter() callbacks are called with d_lock held. - */ --static void d_walk(struct dentry *parent, void *data, -+void d_walk(struct dentry *parent, void *data, - enum d_walk_ret (*enter)(void *, struct dentry *)) - { - struct dentry *this_parent; -diff -Nurp linux-5.15.37/fs/fcntl.c linux-5.15.37-aufs/fs/fcntl.c ---- linux-5.15.37/fs/fcntl.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/fcntl.c 2022-04-08 20:22:30.617616719 +0300 -@@ -33,7 +33,7 @@ - - #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) - --static int setfl(int fd, struct file * filp, unsigned long arg) -+int setfl(int fd, struct file *filp, unsigned long arg) - { - struct inode * inode = file_inode(filp); - int error = 0; -@@ -64,6 +64,8 @@ static int setfl(int fd, struct file * f - - if (filp->f_op->check_flags) - error = filp->f_op->check_flags(arg); -+ if (!error && filp->f_op->setfl) -+ error = filp->f_op->setfl(filp, arg); - if (error) - return error; - -diff -Nurp linux-5.15.37/fs/Kconfig linux-5.15.37-aufs/fs/Kconfig ---- linux-5.15.37/fs/Kconfig 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/Kconfig 2022-04-08 20:22:30.610616377 +0300 -@@ -312,6 +312,7 @@ source "fs/sysv/Kconfig" - source "fs/ufs/Kconfig" - source "fs/erofs/Kconfig" - source "fs/vboxsf/Kconfig" -+source "fs/aufs/Kconfig" - - endif # MISC_FILESYSTEMS - -diff -Nurp linux-5.15.37/fs/Makefile linux-5.15.37-aufs/fs/Makefile ---- linux-5.15.37/fs/Makefile 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/Makefile 2022-04-08 20:22:30.610616377 +0300 -@@ -140,3 +140,4 @@ obj-$(CONFIG_EFIVAR_FS) += efivarfs/ - obj-$(CONFIG_EROFS_FS) += erofs/ - obj-$(CONFIG_VBOXSF_FS) += vboxsf/ - obj-$(CONFIG_ZONEFS_FS) += zonefs/ -+obj-$(CONFIG_AUFS_FS) += aufs/ -diff -Nurp linux-5.15.37/fs/namespace.c linux-5.15.37-aufs/fs/namespace.c ---- linux-5.15.37/fs/namespace.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/namespace.c 2022-04-08 20:22:30.617616719 +0300 -@@ -839,6 +839,12 @@ static inline int check_mnt(struct mount - return mnt->mnt_ns == current->nsproxy->mnt_ns; - } - -+/* for aufs, CONFIG_AUFS_BR_FUSE */ -+int is_current_mnt_ns(struct vfsmount *mnt) -+{ -+ return check_mnt(real_mount(mnt)); -+} -+ - /* - * vfsmount lock must be held for write - */ -diff -Nurp linux-5.15.37/fs/proc/base.c linux-5.15.37-aufs/fs/proc/base.c ---- linux-5.15.37/fs/proc/base.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/proc/base.c 2022-04-08 20:22:30.617616719 +0300 -@@ -2191,7 +2191,7 @@ static int map_files_get_link(struct den - rc = -ENOENT; - vma = find_exact_vma(mm, vm_start, vm_end); - if (vma && vma->vm_file) { -- *path = vma->vm_file->f_path; -+ *path = vma_pr_or_file(vma)->f_path; - path_get(path); - rc = 0; - } -diff -Nurp linux-5.15.37/fs/proc/nommu.c linux-5.15.37-aufs/fs/proc/nommu.c ---- linux-5.15.37/fs/proc/nommu.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/proc/nommu.c 2022-04-08 20:22:30.617616719 +0300 -@@ -40,7 +40,10 @@ static int nommu_region_show(struct seq_ - file = region->vm_file; - - if (file) { -- struct inode *inode = file_inode(region->vm_file); -+ struct inode *inode; -+ -+ file = vmr_pr_or_file(region); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - } -diff -Nurp linux-5.15.37/fs/proc/task_mmu.c linux-5.15.37-aufs/fs/proc/task_mmu.c ---- linux-5.15.37/fs/proc/task_mmu.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/proc/task_mmu.c 2022-04-08 20:22:30.617616719 +0300 -@@ -281,7 +281,10 @@ show_map_vma(struct seq_file *m, struct - const char *name = NULL; - - if (file) { -- struct inode *inode = file_inode(vma->vm_file); -+ struct inode *inode; -+ -+ file = vma_pr_or_file(vma); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; -@@ -1903,7 +1906,7 @@ static int show_numa_map(struct seq_file - struct proc_maps_private *proc_priv = &numa_priv->proc_maps; - struct vm_area_struct *vma = v; - struct numa_maps *md = &numa_priv->md; -- struct file *file = vma->vm_file; -+ struct file *file = vma_pr_or_file(vma); - struct mm_struct *mm = vma->vm_mm; - struct mempolicy *pol; - char buffer[64]; -diff -Nurp linux-5.15.37/fs/proc/task_nommu.c linux-5.15.37-aufs/fs/proc/task_nommu.c ---- linux-5.15.37/fs/proc/task_nommu.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/proc/task_nommu.c 2022-04-08 20:22:30.617616719 +0300 -@@ -155,7 +155,10 @@ static int nommu_vma_show(struct seq_fil - file = vma->vm_file; - - if (file) { -- struct inode *inode = file_inode(vma->vm_file); -+ struct inode *inode; -+ -+ file = vma_pr_or_file(vma); -+ inode = file_inode(file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; - pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; -diff -Nurp linux-5.15.37/fs/splice.c linux-5.15.37-aufs/fs/splice.c ---- linux-5.15.37/fs/splice.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/fs/splice.c 2022-04-08 20:22:30.617616719 +0300 -@@ -759,8 +759,8 @@ static int warn_unsupported(struct file - /* - * Attempt to initiate a splice from pipe to file. - */ --static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -- loff_t *ppos, size_t len, unsigned int flags) -+long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) - { - if (unlikely(!out->f_op->splice_write)) - return warn_unsupported(out, "write"); -@@ -770,9 +770,9 @@ static long do_splice_from(struct pipe_i - /* - * Attempt to initiate a splice from a file to a pipe. - */ --static long do_splice_to(struct file *in, loff_t *ppos, -- struct pipe_inode_info *pipe, size_t len, -- unsigned int flags) -+long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) - { - unsigned int p_space; - int ret; -diff -Nurp linux-5.15.37/include/linux/fs.h linux-5.15.37-aufs/include/linux/fs.h ---- linux-5.15.37/include/linux/fs.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/fs.h 2022-04-08 20:22:30.617616719 +0300 -@@ -1372,6 +1372,7 @@ extern void fasync_free(struct fasync_st - /* can be called from interrupts */ - extern void kill_fasync(struct fasync_struct **, int, int); - -+extern int setfl(int fd, struct file *filp, unsigned long arg); - 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); -@@ -2003,6 +2004,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); -+ int (*setfl)(struct file *, unsigned long); - 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); -@@ -2529,6 +2531,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); -+extern int update_time(struct inode *, struct timespec64 *, int); - - /* /sys/fs */ - extern struct kobject *fs_kobj; -@@ -2707,6 +2710,7 @@ static inline bool sb_is_blkdev_sb(struc - } - - void emergency_thaw_all(void); -+extern int __sync_filesystem(struct super_block *, int); - extern int sync_filesystem(struct super_block *); - extern const struct file_operations def_blk_fops; - extern const struct file_operations def_chr_fops; -diff -Nurp linux-5.15.37/include/linux/lockdep.h linux-5.15.37-aufs/include/linux/lockdep.h ---- linux-5.15.37/include/linux/lockdep.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/lockdep.h 2022-04-08 20:22:30.618616768 +0300 -@@ -248,6 +248,8 @@ static inline int lockdep_match_key(stru - return lock->key == key; - } - -+struct lock_class *lockdep_hlock_class(struct held_lock *hlock); -+ - /* - * Acquire a lock. - * -diff -Nurp linux-5.15.37/include/linux/mm.h linux-5.15.37-aufs/include/linux/mm.h ---- linux-5.15.37/include/linux/mm.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/mm.h 2022-04-08 20:22:30.618616768 +0300 -@@ -1895,6 +1895,43 @@ static inline void unmap_shared_mapping_ - unmap_mapping_range(mapping, holebegin, holelen, 0); - } - -+#if IS_ENABLED(CONFIG_AUFS_FS) -+extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int); -+extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[], -+ int); -+extern void vma_do_get_file(struct vm_area_struct *, const char[], int); -+extern void vma_do_fput(struct vm_area_struct *, const char[], int); -+ -+#define vma_file_update_time(vma) vma_do_file_update_time(vma, __func__, \ -+ __LINE__) -+#define vma_pr_or_file(vma) vma_do_pr_or_file(vma, __func__, \ -+ __LINE__) -+#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__) -+#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__) -+ -+#ifndef CONFIG_MMU -+extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int); -+extern void vmr_do_fput(struct vm_region *, const char[], int); -+ -+#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \ -+ __LINE__) -+#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__) -+#endif /* !CONFIG_MMU */ -+ -+#else -+ -+#define vma_file_update_time(vma) file_update_time((vma)->vm_file) -+#define vma_pr_or_file(vma) (vma)->vm_file -+#define vma_get_file(vma) get_file((vma)->vm_file) -+#define vma_fput(vma) fput((vma)->vm_file) -+ -+#ifndef CONFIG_MMU -+#define vmr_pr_or_file(region) (region)->vm_file -+#define vmr_fput(region) fput((region)->vm_file) -+#endif /* !CONFIG_MMU */ -+ -+#endif /* CONFIG_AUFS_FS */ -+ - extern int access_process_vm(struct task_struct *tsk, unsigned long addr, - void *buf, int len, unsigned int gup_flags); - extern int access_remote_vm(struct mm_struct *mm, unsigned long addr, -diff -Nurp linux-5.15.37/include/linux/mm_types.h linux-5.15.37-aufs/include/linux/mm_types.h ---- linux-5.15.37/include/linux/mm_types.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/mm_types.h 2022-04-08 20:22:30.618616768 +0300 -@@ -344,6 +344,9 @@ 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 */ -+#if IS_ENABLED(CONFIG_AUFS_FS) -+ struct file *vm_prfile; /* the virtual backing file or NULL */ -+#endif - - int vm_usage; /* region usage count (access under nommu_region_sem) */ - bool vm_icache_flushed : 1; /* true if the icache has been flushed for -@@ -440,6 +443,9 @@ 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). */ -+#if IS_ENABLED(CONFIG_AUFS_FS) -+ struct file *vm_prfile; /* shadow of vm_file */ -+#endif - void * vm_private_data; /* was vm_pte (shared mem) */ - - #ifdef CONFIG_SWAP -diff -Nurp linux-5.15.37/include/linux/mnt_namespace.h linux-5.15.37-aufs/include/linux/mnt_namespace.h ---- linux-5.15.37/include/linux/mnt_namespace.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/mnt_namespace.h 2022-04-08 20:22:30.618616768 +0300 -@@ -7,12 +7,15 @@ struct mnt_namespace; - struct fs_struct; - struct user_namespace; - struct ns_common; -+struct vfsmount; - - extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, - struct user_namespace *, struct fs_struct *); - extern void put_mnt_ns(struct mnt_namespace *ns); - extern struct ns_common *from_mnt_ns(struct mnt_namespace *); - -+extern int is_current_mnt_ns(struct vfsmount *mnt); -+ - extern const struct file_operations proc_mounts_operations; - extern const struct file_operations proc_mountinfo_operations; - extern const struct file_operations proc_mountstats_operations; -diff -Nurp linux-5.15.37/include/linux/splice.h linux-5.15.37-aufs/include/linux/splice.h ---- linux-5.15.37/include/linux/splice.h 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/include/linux/splice.h 2022-04-08 20:22:30.618616768 +0300 -@@ -93,4 +93,10 @@ extern void splice_shrink_spd(struct spl - - extern const struct pipe_buf_operations page_cache_pipe_buf_ops; - extern const struct pipe_buf_operations default_pipe_buf_ops; -+ -+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+extern long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); - #endif -diff -Nurp linux-5.15.37/include/uapi/linux/aufs_type.h linux-5.15.37-aufs/include/uapi/linux/aufs_type.h ---- linux-5.15.37/include/uapi/linux/aufs_type.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/include/uapi/linux/aufs_type.h 2022-04-08 20:22:30.618616768 +0300 -@@ -0,0 +1,439 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -+/* -+ * Copyright (C) 2005-2021 Junjiro R. Okajima -+ */ -+ -+#ifndef __AUFS_TYPE_H__ -+#define __AUFS_TYPE_H__ -+ -+#define AUFS_NAME "aufs" -+ -+#ifdef __KERNEL__ -+/* -+ * define it before including all other headers. -+ * sched.h may use pr_* macros before defining "current", so define the -+ * no-current version first, and re-define later. -+ */ -+#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__ -+#include -+#undef pr_fmt -+#define pr_fmt(fmt) \ -+ AUFS_NAME " %s:%d:%.*s[%d]: " fmt, __func__, __LINE__, \ -+ (int)sizeof(current->comm), current->comm, current->pid -+#include -+#else -+#include -+#include -+#include -+#endif /* __KERNEL__ */ -+ -+#define AUFS_VERSION "5.17" -+ -+/* todo? move this to linux-2.6.19/include/magic.h */ -+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef __KERNEL__ -+#ifdef CONFIG_AUFS_BRANCH_MAX_127 -+typedef int8_t aufs_bindex_t; -+#define AUFS_BRANCH_MAX 127 -+#else -+typedef int16_t aufs_bindex_t; -+#ifdef CONFIG_AUFS_BRANCH_MAX_511 -+#define AUFS_BRANCH_MAX 511 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) -+#define AUFS_BRANCH_MAX 1023 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) -+#define AUFS_BRANCH_MAX 32767 -+#endif -+#endif -+ -+#ifndef AUFS_BRANCH_MAX -+#error unknown CONFIG_AUFS_BRANCH_MAX value -+#endif -+#endif /* __KERNEL__ */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AUFS_FSTYPE AUFS_NAME -+ -+#define AUFS_ROOT_INO 2 -+#define AUFS_FIRST_INO 11 -+ -+#define AUFS_WH_PFX ".wh." -+#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) -+#define AUFS_WH_TMP_LEN 4 -+/* a limit for rmdir/rename a dir and copyup */ -+#define AUFS_MAX_NAMELEN (NAME_MAX \ -+ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ -+ - 1 /* dot */\ -+ - AUFS_WH_TMP_LEN) /* hex */ -+#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" -+#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME -+#define AUFS_XINO_DEF_SEC 30 /* seconds */ -+#define AUFS_XINO_DEF_TRUNC 45 /* percentage */ -+#define AUFS_DIRWH_DEF 3 -+#define AUFS_RDCACHE_DEF 10 /* seconds */ -+#define AUFS_RDCACHE_MAX 3600 /* seconds */ -+#define AUFS_RDBLK_DEF 512 /* bytes */ -+#define AUFS_RDHASH_DEF 32 -+#define AUFS_WKQ_NAME AUFS_NAME "d" -+#define AUFS_MFS_DEF_SEC 30 /* seconds */ -+#define AUFS_MFS_MAX_SEC 3600 /* seconds */ -+#define AUFS_FHSM_CACHE_DEF_SEC 30 /* seconds */ -+#define AUFS_PLINK_WARN 50 /* number of plinks in a single bucket */ -+ -+/* pseudo-link maintenace under /proc */ -+#define AUFS_PLINK_MAINT_NAME "plink_maint" -+#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME -+#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME -+ -+/* dirren, renamed dir */ -+#define AUFS_DR_INFO_PFX AUFS_WH_PFX ".dr." -+#define AUFS_DR_BRHINO_NAME AUFS_WH_PFX "hino" -+/* whiteouted doubly */ -+#define AUFS_WH_DR_INFO_PFX AUFS_WH_PFX AUFS_DR_INFO_PFX -+#define AUFS_WH_DR_BRHINO AUFS_WH_PFX AUFS_DR_BRHINO_NAME -+ -+#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ -+#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME -+ -+#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME -+#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" -+#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" -+ -+/* doubly whiteouted */ -+#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME -+#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME -+#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME -+ -+/* branch permissions and attributes */ -+#define AUFS_BRPERM_RW "rw" -+#define AUFS_BRPERM_RO "ro" -+#define AUFS_BRPERM_RR "rr" -+#define AUFS_BRATTR_COO_REG "coo_reg" -+#define AUFS_BRATTR_COO_ALL "coo_all" -+#define AUFS_BRATTR_FHSM "fhsm" -+#define AUFS_BRATTR_UNPIN "unpin" -+#define AUFS_BRATTR_ICEX "icex" -+#define AUFS_BRATTR_ICEX_SEC "icexsec" -+#define AUFS_BRATTR_ICEX_SYS "icexsys" -+#define AUFS_BRATTR_ICEX_TR "icextr" -+#define AUFS_BRATTR_ICEX_USR "icexusr" -+#define AUFS_BRATTR_ICEX_OTH "icexoth" -+#define AUFS_BRRATTR_WH "wh" -+#define AUFS_BRWATTR_NLWH "nolwh" -+#define AUFS_BRWATTR_MOO "moo" -+ -+#define AuBrPerm_RW 1 /* writable, hardlinkable wh */ -+#define AuBrPerm_RO (1 << 1) /* readonly */ -+#define AuBrPerm_RR (1 << 2) /* natively readonly */ -+#define AuBrPerm_Mask (AuBrPerm_RW | AuBrPerm_RO | AuBrPerm_RR) -+ -+#define AuBrAttr_COO_REG (1 << 3) /* copy-up on open */ -+#define AuBrAttr_COO_ALL (1 << 4) -+#define AuBrAttr_COO_Mask (AuBrAttr_COO_REG | AuBrAttr_COO_ALL) -+ -+#define AuBrAttr_FHSM (1 << 5) /* file-based hsm */ -+#define AuBrAttr_UNPIN (1 << 6) /* rename-able top dir of -+ branch. meaningless since -+ linux-3.18-rc1 */ -+ -+/* ignore error in copying XATTR */ -+#define AuBrAttr_ICEX_SEC (1 << 7) -+#define AuBrAttr_ICEX_SYS (1 << 8) -+#define AuBrAttr_ICEX_TR (1 << 9) -+#define AuBrAttr_ICEX_USR (1 << 10) -+#define AuBrAttr_ICEX_OTH (1 << 11) -+#define AuBrAttr_ICEX (AuBrAttr_ICEX_SEC \ -+ | AuBrAttr_ICEX_SYS \ -+ | AuBrAttr_ICEX_TR \ -+ | AuBrAttr_ICEX_USR \ -+ | AuBrAttr_ICEX_OTH) -+ -+#define AuBrRAttr_WH (1 << 12) /* whiteout-able */ -+#define AuBrRAttr_Mask AuBrRAttr_WH -+ -+#define AuBrWAttr_NoLinkWH (1 << 13) /* un-hardlinkable whiteouts */ -+#define AuBrWAttr_MOO (1 << 14) /* move-up on open */ -+#define AuBrWAttr_Mask (AuBrWAttr_NoLinkWH | AuBrWAttr_MOO) -+ -+#define AuBrAttr_CMOO_Mask (AuBrAttr_COO_Mask | AuBrWAttr_MOO) -+ -+/* #warning test userspace */ -+#ifdef __KERNEL__ -+#ifndef CONFIG_AUFS_FHSM -+#undef AuBrAttr_FHSM -+#define AuBrAttr_FHSM 0 -+#endif -+#ifndef CONFIG_AUFS_XATTR -+#undef AuBrAttr_ICEX -+#define AuBrAttr_ICEX 0 -+#undef AuBrAttr_ICEX_SEC -+#define AuBrAttr_ICEX_SEC 0 -+#undef AuBrAttr_ICEX_SYS -+#define AuBrAttr_ICEX_SYS 0 -+#undef AuBrAttr_ICEX_TR -+#define AuBrAttr_ICEX_TR 0 -+#undef AuBrAttr_ICEX_USR -+#define AuBrAttr_ICEX_USR 0 -+#undef AuBrAttr_ICEX_OTH -+#define AuBrAttr_ICEX_OTH 0 -+#endif -+#endif -+ -+/* the longest combination */ -+/* AUFS_BRATTR_ICEX and AUFS_BRATTR_ICEX_TR don't affect here */ -+#define AuBrPermStrSz sizeof(AUFS_BRPERM_RW \ -+ "+" AUFS_BRATTR_COO_REG \ -+ "+" AUFS_BRATTR_FHSM \ -+ "+" AUFS_BRATTR_UNPIN \ -+ "+" AUFS_BRATTR_ICEX_SEC \ -+ "+" AUFS_BRATTR_ICEX_SYS \ -+ "+" AUFS_BRATTR_ICEX_USR \ -+ "+" AUFS_BRATTR_ICEX_OTH \ -+ "+" AUFS_BRWATTR_NLWH) -+ -+typedef struct { -+ char a[AuBrPermStrSz]; -+} au_br_perm_str_t; -+ -+static inline int au_br_writable(int brperm) -+{ -+ return brperm & AuBrPerm_RW; -+} -+ -+static inline int au_br_whable(int brperm) -+{ -+ return brperm & (AuBrPerm_RW | AuBrRAttr_WH); -+} -+ -+static inline int au_br_wh_linkable(int brperm) -+{ -+ return !(brperm & AuBrWAttr_NoLinkWH); -+} -+ -+static inline int au_br_cmoo(int brperm) -+{ -+ return brperm & AuBrAttr_CMOO_Mask; -+} -+ -+static inline int au_br_fhsm(int brperm) -+{ -+ return brperm & AuBrAttr_FHSM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* ioctl */ -+enum { -+ /* readdir in userspace */ -+ AuCtl_RDU, -+ AuCtl_RDU_INO, -+ -+ AuCtl_WBR_FD, /* pathconf wrapper */ -+ AuCtl_IBUSY, /* busy inode */ -+ AuCtl_MVDOWN, /* move-down */ -+ AuCtl_BR, /* info about branches */ -+ AuCtl_FHSM_FD /* connection for fhsm */ -+}; -+ -+/* borrowed from linux/include/linux/kernel.h */ -+#ifndef ALIGN -+#ifdef _GNU_SOURCE -+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -+#else -+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) -+#endif -+#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) -+#endif -+ -+/* borrowed from linux/include/linux/compiler-gcc3.h */ -+#ifndef __aligned -+#define __aligned(x) __attribute__((aligned(x))) -+#endif -+ -+#ifdef __KERNEL__ -+#ifndef __packed -+#define __packed __attribute__((packed)) -+#endif -+#endif -+ -+struct au_rdu_cookie { -+ uint64_t h_pos; -+ int16_t bindex; -+ uint8_t flags; -+ uint8_t pad; -+ uint32_t generation; -+} __aligned(8); -+ -+struct au_rdu_ent { -+ uint64_t ino; -+ int16_t bindex; -+ uint8_t type; -+ uint8_t nlen; -+ uint8_t wh; -+ char name[]; -+} __aligned(8); -+ -+static inline int au_rdu_len(int nlen) -+{ -+ /* include the terminating NULL */ -+ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, -+ sizeof(uint64_t)); -+} -+ -+union au_rdu_ent_ul { -+ struct au_rdu_ent __user *e; -+ uint64_t ul; -+}; -+ -+enum { -+ AufsCtlRduV_SZ, -+ AufsCtlRduV_End -+}; -+ -+struct aufs_rdu { -+ /* input */ -+ union { -+ uint64_t sz; /* AuCtl_RDU */ -+ uint64_t nent; /* AuCtl_RDU_INO */ -+ }; -+ union au_rdu_ent_ul ent; -+ uint16_t verify[AufsCtlRduV_End]; -+ -+ /* input/output */ -+ uint32_t blk; -+ -+ /* output */ -+ union au_rdu_ent_ul tail; -+ /* number of entries which were added in a single call */ -+ uint64_t rent; -+ uint8_t full; -+ uint8_t shwh; -+ -+ struct au_rdu_cookie cookie; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dirren. the branch is identified by the filename who contains this */ -+struct au_drinfo { -+ uint64_t ino; -+ union { -+ uint8_t oldnamelen; -+ uint64_t _padding; -+ }; -+ uint8_t oldname[]; -+} __aligned(8); -+ -+struct au_drinfo_fdata { -+ uint32_t magic; -+ struct au_drinfo drinfo; -+} __aligned(8); -+ -+#define AUFS_DRINFO_MAGIC_V1 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x01) -+/* future */ -+#define AUFS_DRINFO_MAGIC_V2 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x02) -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_wbr_fd { -+ uint32_t oflags; -+ int16_t brid; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct aufs_ibusy { -+ uint64_t ino, h_ino; -+ int16_t bindex; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* error code for move-down */ -+/* the actual message strings are implemented in aufs-util.git */ -+enum { -+ EAU_MVDOWN_OPAQUE = 1, -+ EAU_MVDOWN_WHITEOUT, -+ EAU_MVDOWN_UPPER, -+ EAU_MVDOWN_BOTTOM, -+ EAU_MVDOWN_NOUPPER, -+ EAU_MVDOWN_NOLOWERBR, -+ EAU_Last -+}; -+ -+/* flags for move-down */ -+#define AUFS_MVDOWN_DMSG 1 -+#define AUFS_MVDOWN_OWLOWER (1 << 1) /* overwrite lower */ -+#define AUFS_MVDOWN_KUPPER (1 << 2) /* keep upper */ -+#define AUFS_MVDOWN_ROLOWER (1 << 3) /* do even if lower is RO */ -+#define AUFS_MVDOWN_ROLOWER_R (1 << 4) /* did on lower RO */ -+#define AUFS_MVDOWN_ROUPPER (1 << 5) /* do even if upper is RO */ -+#define AUFS_MVDOWN_ROUPPER_R (1 << 6) /* did on upper RO */ -+#define AUFS_MVDOWN_BRID_UPPER (1 << 7) /* upper brid */ -+#define AUFS_MVDOWN_BRID_LOWER (1 << 8) /* lower brid */ -+#define AUFS_MVDOWN_FHSM_LOWER (1 << 9) /* find fhsm attr for lower */ -+#define AUFS_MVDOWN_STFS (1 << 10) /* req. stfs */ -+#define AUFS_MVDOWN_STFS_FAILED (1 << 11) /* output: stfs is unusable */ -+#define AUFS_MVDOWN_BOTTOM (1 << 12) /* output: no more lowers */ -+ -+/* index for move-down */ -+enum { -+ AUFS_MVDOWN_UPPER, -+ AUFS_MVDOWN_LOWER, -+ AUFS_MVDOWN_NARRAY -+}; -+ -+/* -+ * additional info of move-down -+ * number of free blocks and inodes. -+ * subset of struct kstatfs, but smaller and always 64bit. -+ */ -+struct aufs_stfs { -+ uint64_t f_blocks; -+ uint64_t f_bavail; -+ uint64_t f_files; -+ uint64_t f_ffree; -+}; -+ -+struct aufs_stbr { -+ int16_t brid; /* optional input */ -+ int16_t bindex; /* output */ -+ struct aufs_stfs stfs; /* output when AUFS_MVDOWN_STFS set */ -+} __aligned(8); -+ -+struct aufs_mvdown { -+ uint32_t flags; /* input/output */ -+ struct aufs_stbr stbr[AUFS_MVDOWN_NARRAY]; /* input/output */ -+ int8_t au_errno; /* output */ -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+union aufs_brinfo { -+ /* PATH_MAX may differ between kernel-space and user-space */ -+ char _spacer[4096]; -+ struct { -+ int16_t id; -+ int perm; -+ char path[]; -+ }; -+} __aligned(8); -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuCtlType 'A' -+#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) -+#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) -+#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \ -+ struct aufs_wbr_fd) -+#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) -+#define AUFS_CTL_MVDOWN _IOWR(AuCtlType, AuCtl_MVDOWN, \ -+ struct aufs_mvdown) -+#define AUFS_CTL_BRINFO _IOW(AuCtlType, AuCtl_BR, union aufs_brinfo) -+#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int) -+ -+#endif /* __AUFS_TYPE_H__ */ -diff -Nurp linux-5.15.37/kernel/fork.c linux-5.15.37-aufs/kernel/fork.c ---- linux-5.15.37/kernel/fork.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/kernel/fork.c 2022-04-08 20:22:30.618616768 +0300 -@@ -575,7 +575,7 @@ static __latent_entropy int dup_mmap(str - if (file) { - struct address_space *mapping = file->f_mapping; - -- get_file(file); -+ vma_get_file(tmp); - i_mmap_lock_write(mapping); - if (tmp->vm_flags & VM_SHARED) - mapping_allow_writable(mapping); -diff -Nurp linux-5.15.37/kernel/locking/lockdep.c linux-5.15.37-aufs/kernel/locking/lockdep.c ---- linux-5.15.37/kernel/locking/lockdep.c 2022-04-08 20:07:30.703499501 +0300 -+++ linux-5.15.37-aufs/kernel/locking/lockdep.c 2022-04-08 20:22:30.619616817 +0300 -@@ -187,7 +187,7 @@ unsigned long max_lock_class_idx; - struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; - DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS); - --static inline struct lock_class *hlock_class(struct held_lock *hlock) -+inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) - { - unsigned int class_idx = hlock->class_idx; - -@@ -208,6 +208,7 @@ static inline struct lock_class *hlock_c - */ - return lock_classes + class_idx; - } -+#define hlock_class(hlock) lockdep_hlock_class(hlock) - - #ifdef CONFIG_LOCK_STAT - static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats); -diff -Nurp linux-5.15.37/MAINTAINERS linux-5.15.37-aufs/MAINTAINERS ---- linux-5.15.37/MAINTAINERS 2022-04-08 20:07:30.611494969 +0300 -+++ linux-5.15.37-aufs/MAINTAINERS 2022-04-08 20:22:30.610616377 +0300 -@@ -3235,6 +3235,19 @@ F: include/uapi/linux/audit.h - F: kernel/audit* - F: lib/*audit.c - -+AUFS (advanced multi layered unification filesystem) FILESYSTEM -+M: "J. R. Okajima" -+L: aufs-users@lists.sourceforge.net (members only) -+L: linux-unionfs@vger.kernel.org -+S: Supported -+W: http://aufs.sourceforge.net -+T: git://github.com/sfjro/aufs4-linux.git -+F: Documentation/ABI/testing/debugfs-aufs -+F: Documentation/ABI/testing/sysfs-aufs -+F: Documentation/filesystems/aufs/ -+F: fs/aufs/ -+F: include/uapi/linux/aufs_type.h -+ - AUXILIARY DISPLAY DRIVERS - M: Miguel Ojeda - S: Maintained -diff -Nurp linux-5.15.37/mm/filemap.c linux-5.15.37-aufs/mm/filemap.c ---- linux-5.15.37/mm/filemap.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/mm/filemap.c 2022-04-08 20:22:30.619616817 +0300 -@@ -3350,7 +3350,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); -- file_update_time(vmf->vma->vm_file); -+ vma_file_update_time(vmf->vma); - lock_page(page); - if (page->mapping != mapping) { - unlock_page(page); -diff -Nurp linux-5.15.37/mm/Makefile linux-5.15.37-aufs/mm/Makefile ---- linux-5.15.37/mm/Makefile 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/mm/Makefile 2022-04-08 20:22:30.619616817 +0300 -@@ -132,3 +132,4 @@ obj-$(CONFIG_PAGE_REPORTING) += page_rep - obj-$(CONFIG_IO_MAPPING) += io-mapping.o - obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o - obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o -+obj-$(CONFIG_AUFS_FS:m=y) += prfile.o -diff -Nurp linux-5.15.37/mm/mmap.c linux-5.15.37-aufs/mm/mmap.c ---- linux-5.15.37/mm/mmap.c 2022-04-08 20:07:30.709499796 +0300 -+++ linux-5.15.37-aufs/mm/mmap.c 2022-04-08 20:22:30.619616817 +0300 -@@ -184,7 +184,7 @@ static struct vm_area_struct *remove_vma - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); - if (vma->vm_file) -- fput(vma->vm_file); -+ vma_fput(vma); - mpol_put(vma_policy(vma)); - vm_area_free(vma); - return next; -@@ -953,7 +953,7 @@ again: - if (remove_next) { - if (file) { - uprobe_munmap(next, next->vm_start, next->vm_end); -- fput(file); -+ vma_fput(vma); - } - if (next->anon_vma) - anon_vma_merge(vma, next); -@@ -1879,7 +1879,7 @@ out: - return addr; - - unmap_and_free_vma: -- fput(vma->vm_file); -+ vma_fput(vma); - vma->vm_file = NULL; - - /* Undo any partial mapping done by a device driver. */ -@@ -2737,7 +2737,7 @@ int __split_vma(struct mm_struct *mm, st - goto out_free_mpol; - - if (new->vm_file) -- get_file(new->vm_file); -+ vma_get_file(new); - - if (new->vm_ops && new->vm_ops->open) - new->vm_ops->open(new); -@@ -2756,7 +2756,7 @@ int __split_vma(struct mm_struct *mm, st - if (new->vm_ops && new->vm_ops->close) - new->vm_ops->close(new); - if (new->vm_file) -- fput(new->vm_file); -+ vma_fput(new); - unlink_anon_vmas(new); - out_free_mpol: - mpol_put(vma_policy(new)); -@@ -2951,6 +2951,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsign - unsigned long populate = 0; - unsigned long ret = -EINVAL; - struct file *file; -+#if IS_ENABLED(CONFIG_AUFS_FS) -+ struct file *prfile; -+#endif - - pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n", - current->comm, current->pid); -@@ -3006,10 +3009,34 @@ SYSCALL_DEFINE5(remap_file_pages, unsign - if (vma->vm_flags & VM_LOCKED) - flags |= MAP_LOCKED; - -+#if IS_ENABLED(CONFIG_AUFS_FS) -+ vma_get_file(vma); -+ file = vma->vm_file; -+ prfile = vma->vm_prfile; -+ ret = do_mmap(vma->vm_file, start, size, -+ prot, flags, pgoff, &populate, NULL); -+ if (!IS_ERR_VALUE(ret) && file && prfile) { -+ struct vm_area_struct *new_vma; -+ -+ new_vma = find_vma(mm, ret); -+ if (!new_vma->vm_prfile) -+ new_vma->vm_prfile = prfile; -+ if (new_vma != vma) -+ get_file(prfile); -+ } -+ /* -+ * two fput()s instead of vma_fput(vma), -+ * coz vma may not be available anymore. -+ */ -+ fput(file); -+ if (prfile) -+ fput(prfile); -+#else - file = get_file(vma->vm_file); - ret = do_mmap(vma->vm_file, start, size, - prot, flags, pgoff, &populate, NULL); - fput(file); -+#endif /* CONFIG_AUFS_FS */ - out: - mmap_write_unlock(mm); - if (populate) -@@ -3291,7 +3318,7 @@ struct vm_area_struct *copy_vma(struct v - if (anon_vma_clone(new_vma, vma)) - goto out_free_mempol; - if (new_vma->vm_file) -- get_file(new_vma->vm_file); -+ vma_get_file(new_vma); - if (new_vma->vm_ops && new_vma->vm_ops->open) - new_vma->vm_ops->open(new_vma); - vma_link(mm, new_vma, prev, rb_link, rb_parent); -diff -Nurp linux-5.15.37/mm/nommu.c linux-5.15.37-aufs/mm/nommu.c ---- linux-5.15.37/mm/nommu.c 2022-03-20 22:14:17.000000000 +0200 -+++ linux-5.15.37-aufs/mm/nommu.c 2022-04-08 20:22:30.619616817 +0300 -@@ -522,7 +522,7 @@ static void __put_nommu_region(struct vm - up_write(&nommu_region_sem); - - if (region->vm_file) -- fput(region->vm_file); -+ vmr_fput(region); - - /* IO memory and memory shared directly out of the pagecache - * from ramfs/tmpfs mustn't be released here */ -@@ -654,7 +654,7 @@ static void delete_vma(struct mm_struct - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); - if (vma->vm_file) -- fput(vma->vm_file); -+ vma_fput(vma); - put_nommu_region(vma->vm_region); - vm_area_free(vma); - } -@@ -1174,7 +1174,7 @@ unsigned long do_mmap(struct file *file, - goto error_just_free; - } - } -- fput(region->vm_file); -+ vmr_fput(region); - kmem_cache_free(vm_region_jar, region); - region = pregion; - result = start; -@@ -1251,10 +1251,10 @@ error_just_free: - up_write(&nommu_region_sem); - error: - if (region->vm_file) -- fput(region->vm_file); -+ vmr_fput(region); - kmem_cache_free(vm_region_jar, region); - if (vma->vm_file) -- fput(vma->vm_file); -+ vma_fput(vma); - vm_area_free(vma); - return ret; - -diff -Nurp linux-5.15.37/mm/prfile.c linux-5.15.37-aufs/mm/prfile.c ---- linux-5.15.37/mm/prfile.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.37-aufs/mm/prfile.c 2022-04-08 20:22:30.619616817 +0300 -@@ -0,0 +1,86 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Mainly for aufs which mmap(2) different file and wants to print different -+ * path in /proc/PID/maps. -+ * Call these functions via macros defined in linux/mm.h. -+ * -+ * See Documentation/filesystems/aufs/design/06mmap.txt -+ * -+ * Copyright (c) 2014-2021 Junjro R. Okajima -+ * Copyright (c) 2014 Ian Campbell -+ */ -+ -+#include -+#include -+#include -+ -+/* #define PRFILE_TRACE */ -+static inline void prfile_trace(struct file *f, struct file *pr, -+ const char func[], int line, const char func2[]) -+{ -+#ifdef PRFILE_TRACE -+ if (pr) -+ pr_info("%s:%d: %s, %pD2\n", func, line, func2, f); -+#endif -+} -+ -+void vma_do_file_update_time(struct vm_area_struct *vma, const char func[], -+ int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ file_update_time(f); -+ if (f && pr) -+ file_update_time(pr); -+} -+ -+struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[], -+ int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ return (f && pr) ? pr : f; -+} -+ -+void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ get_file(f); -+ if (f && pr) -+ get_file(pr); -+} -+ -+void vma_do_fput(struct vm_area_struct *vma, const char func[], int line) -+{ -+ struct file *f = vma->vm_file, *pr = vma->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ fput(f); -+ if (f && pr) -+ fput(pr); -+} -+ -+#ifndef CONFIG_MMU -+struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[], -+ int line) -+{ -+ struct file *f = region->vm_file, *pr = region->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ return (f && pr) ? pr : f; -+} -+ -+void vmr_do_fput(struct vm_region *region, const char func[], int line) -+{ -+ struct file *f = region->vm_file, *pr = region->vm_prfile; -+ -+ prfile_trace(f, pr, func, line, __func__); -+ fput(f); -+ if (f && pr) -+ fput(pr); -+} -+#endif /* !CONFIG_MMU */ diff --git a/kernel/tools/perf/files/patches/mageia/fs-procfs-do-not-list-TID-0-in-proc-pid-task.patch b/kernel/tools/perf/files/patches/mageia/fs-procfs-do-not-list-TID-0-in-proc-pid-task.patch deleted file mode 100644 index c366d5b71a..0000000000 --- a/kernel/tools/perf/files/patches/mageia/fs-procfs-do-not-list-TID-0-in-proc-pid-task.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 435664ed44c4a17e6715d007061e2b155d3535c8 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 1 Oct 2021 13:38:15 +1000 -Subject: procfs: do not list TID 0 in /proc//task - -If a task exits concurrently, task_pid_nr_ns may return 0. - -Link: https://lkml.kernel.org/r/8735pn5dx7.fsf@oldenburg.str.redhat.com -Signed-off-by: Florian Weimer -Acked-by: Christian Brauner -Cc: Kees Cook -Cc: "Eric W. Biederman" -Cc: Alexey Dobriyan -Signed-off-by: Andrew Morton -Signed-off-by: Stephen Rothwell ---- - fs/proc/base.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/fs/proc/base.c b/fs/proc/base.c -index 533d5836eb9a4..54f29399088f0 100644 ---- a/fs/proc/base.c -+++ b/fs/proc/base.c -@@ -3800,6 +3800,9 @@ static int proc_task_readdir(struct file *file, struct dir_context *ctx) - char name[10 + 1]; - unsigned int len; - tid = task_pid_nr_ns(task, ns); -+ if (!tid) -+ /* The task has just exited. */ -+ continue; - len = snprintf(name, sizeof(name), "%u", tid); - if (!proc_fill_cache(file, ctx, name, len, - proc_task_instantiate, task, NULL)) { --- -cgit 1.2.3-1.el7 - diff --git a/kernel/tools/perf/files/patches/mageia/hack-broken-rtla-cleaner.patch b/kernel/tools/perf/files/patches/mageia/hack-broken-rtla-cleaner.patch new file mode 100644 index 0000000000..09fb63d82b --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/hack-broken-rtla-cleaner.patch @@ -0,0 +1,17 @@ + tools/tracing/rtla/Makefile | 5 ----- + 1 file changed, 5 deletions(-) + +--- linux-6.1/tools/tracing/rtla/Makefile.orig ++++ linux-6.1/tools/tracing/rtla/Makefile +@@ -124,11 +124,6 @@ install: doc_install + + .PHONY: clean tarball + clean: doc_clean +- @test ! -f rtla || rm rtla +- @test ! -f rtla-static || rm rtla-static +- @test ! -f src/rtla.o || rm src/rtla.o +- @test ! -f $(TARBALL) || rm -f $(TARBALL) +- @rm -rf *~ $(OBJ) *.tar.$(CEXT) + + tarball: clean + rm -rf $(NAME)-$(VERSION) && mkdir $(NAME)-$(VERSION) diff --git a/kernel/tools/perf/files/patches/mageia/iwlwifi-cfg-Add-missing-MODULE_FIRMWARE-for-pnvm.patch b/kernel/tools/perf/files/patches/mageia/iwlwifi-cfg-Add-missing-MODULE_FIRMWARE-for-pnvm.patch new file mode 100644 index 0000000000..713de9712d --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/iwlwifi-cfg-Add-missing-MODULE_FIRMWARE-for-pnvm.patch @@ -0,0 +1,40 @@ +From: Takashi Iwai +Subject: [PATCH] iwlwifi: cfg: Add missing MODULE_FIRMWARE() for *.pnvm +Date: Wed, 5 Apr 2023 08:35:46 +0200 + +A few models require *.pnvm files while we don't declare them via +MODULE_FIRMWARE(). This resulted in the breakage of WiFi on the +system that relies on the information from modinfo (e.g. openSUSE +installer image). + +This patch adds those missing MODULE_FIRMWARE() entries for *.pnvm +files. + +Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1207553 +Signed-off-by: Takashi Iwai +--- + +The fix is obviously ad hoc. + +Here I added the lines with the explicit string since *_PRE definition +contains the tailing dash and can't be used for *.pnvm file. + +Alternatively, we may put a single line + MODULE_FIRMWARE("iwlwifi-*.pnvm"); +to catch all, too. + + drivers/net/wireless/intel/iwlwifi/cfg/22000.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +index 3bdd6774716d..3c6dc3601784 100644 +--- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c ++++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +@@ -426,3 +426,7 @@ + MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); + MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); + MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); ++ ++MODULE_FIRMWARE("iwlwifi-so-a0-gf4-a0.pnvm"); ++MODULE_FIRMWARE("iwlwifi-so-a0-gf-a0.pnvm"); ++MODULE_FIRMWARE("iwlwifi-ty-a0-gf-a0.pnvm"); diff --git a/kernel/tools/perf/files/patches/mageia/lib-zstd-Fix-comment-typo.patch b/kernel/tools/perf/files/patches/mageia/lib-zstd-Fix-comment-typo.patch new file mode 100644 index 0000000000..41837b1014 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/lib-zstd-Fix-comment-typo.patch @@ -0,0 +1,29 @@ +From 19d7df98472851e1d2d11e00c177988d0f49683d Mon Sep 17 00:00:00 2001 +From: Xin Gao +Date: Mon, 17 Oct 2022 15:18:59 -0700 +Subject: [PATCH 4/6] lib: zstd: Fix comment typo + +The double `when' is duplicated in line 999, remove one. + +Signed-off-by: Xin Gao +Signed-off-by: Nick Terrell +--- + lib/zstd/decompress/zstd_decompress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/zstd/decompress/zstd_decompress.c b/lib/zstd/decompress/zstd_decompress.c +index b4d81d84479a..6928e85f9d19 100644 +--- a/lib/zstd/decompress/zstd_decompress.c ++++ b/lib/zstd/decompress/zstd_decompress.c +@@ -996,7 +996,7 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr + size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; } + + /* +- * Similar to ZSTD_nextSrcSizeToDecompress(), but when when a block input can be streamed, ++ * Similar to ZSTD_nextSrcSizeToDecompress(), but when a block input can be streamed, + * we allow taking a partial block as the input. Currently only raw uncompressed blocks can + * be streamed. + * +-- +2.30.6 + diff --git a/kernel/tools/perf/files/patches/mageia/lib-zstd-clean-up-double-word-in-comment.patch b/kernel/tools/perf/files/patches/mageia/lib-zstd-clean-up-double-word-in-comment.patch new file mode 100644 index 0000000000..4290a3c352 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/lib-zstd-clean-up-double-word-in-comment.patch @@ -0,0 +1,38 @@ +From 88a309465b3f05a100c3b81966982c0f9f5d23a6 Mon Sep 17 00:00:00 2001 +From: Tom Rix +Date: Thu, 20 Jan 2022 05:20:06 -0800 +Subject: [PATCH 1/6] lib: zstd: clean up double word in comment. + +Remove the second 'a' and 'into'. + +Signed-off-by: Tom Rix +Signed-off-by: Nick Terrell +--- + include/linux/zstd_lib.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/include/linux/zstd_lib.h b/include/linux/zstd_lib.h +index b8c7dbf98390..6b91758b61af 100644 +--- a/include/linux/zstd_lib.h ++++ b/include/linux/zstd_lib.h +@@ -1330,7 +1330,7 @@ ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, + + /*! ZSTD_mergeBlockDelimiters() : + * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals +- * by merging them into into the literals of the next sequence. ++ * by merging them into the literals of the next sequence. + * + * As such, the final generated result has no explicit representation of block boundaries, + * and the final last literals segment is not represented in the sequences. +@@ -1377,7 +1377,7 @@ ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size + /*! ZSTD_writeSkippableFrame() : + * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. + * +- * Skippable frames begin with a a 4-byte magic number. There are 16 possible choices of magic number, ++ * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, + * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. + * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so + * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. +-- +2.30.6 + diff --git a/kernel/tools/perf/files/patches/mageia/lib-zstd-fix-repeated-words-in-comments.patch b/kernel/tools/perf/files/patches/mageia/lib-zstd-fix-repeated-words-in-comments.patch new file mode 100644 index 0000000000..cce0a6a19e --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/lib-zstd-fix-repeated-words-in-comments.patch @@ -0,0 +1,29 @@ +From 7486f5c6e7b197400678f1bb603ac9e4027fb830 Mon Sep 17 00:00:00 2001 +From: Jilin Yuan +Date: Fri, 2 Sep 2022 09:32:12 +0800 +Subject: [PATCH 3/6] lib: zstd: fix repeated words in comments + +Delete the redundant word 'the'. + +Signed-off-by: Jilin Yuan +Signed-off-by: Nick Terrell +--- + lib/zstd/compress/zstd_compress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/zstd/compress/zstd_compress.c b/lib/zstd/compress/zstd_compress.c +index a4e916008b3a..73fff4c60149 100644 +--- a/lib/zstd/compress/zstd_compress.c ++++ b/lib/zstd/compress/zstd_compress.c +@@ -4441,7 +4441,7 @@ static size_t ZSTD_validateSequence(U32 offCode, U32 matchLength, + size_t posInSrc, U32 windowLog, size_t dictSize, U32 minMatch) { + size_t offsetBound; + U32 windowSize = 1 << windowLog; +- /* posInSrc represents the amount of data the the decoder would decode up to this point. ++ /* posInSrc represents the amount of data the decoder would decode up to this point. + * As long as the amount of data decoded is less than or equal to window size, offsets may be + * larger than the total length of output decoded in order to reference the dict, even larger than + * window size. After output surpasses windowSize, we're limited to windowSize offsets again. +-- +2.30.6 + diff --git a/kernel/tools/perf/files/patches/mageia/mmc-sdio-Add-rename-SDIO-ID-of-the-RTL8723DS-SDIO-wi.patch b/kernel/tools/perf/files/patches/mageia/mmc-sdio-Add-rename-SDIO-ID-of-the-RTL8723DS-SDIO-wi.patch new file mode 100644 index 0000000000..4f38f16dc6 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/mmc-sdio-Add-rename-SDIO-ID-of-the-RTL8723DS-SDIO-wi.patch @@ -0,0 +1,42 @@ +From 09fcdbd28404b7e02cc9fc4862ae5b43b76867c0 Mon Sep 17 00:00:00 2001 +From: Martin Blumenstingl +Date: Mon, 22 May 2023 22:24:24 +0200 +Subject: [PATCH] mmc: sdio: Add/rename SDIO ID of the RTL8723DS SDIO wifi + cards + +RTL8723DS comes in two variant and each of them has their own SDIO ID: +- 0xd723 can connect two antennas. The WiFi part is still 1x1 so the + second antenna can be dedicated to Bluetooth +- 0xd724 can only connect one antenna so it's shared between WiFi and + Bluetooth + +Add a new entry for the single antenna RTL8723DS (0xd724) which can be +found on the MangoPi MQ-Quad. Also rename the existing RTL8723DS entry +(0xd723) so it's name reflects that it's the variant with support for +two antennas. + +Reviewed-by: Ping-Ke Shih +Signed-off-by: Martin Blumenstingl +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20230522202425.1827005-4-martin.blumenstingl@googlemail.com +--- + include/linux/mmc/sdio_ids.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index c653accdc7fd..7fada7a714fe 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h +@@ -121,7 +121,8 @@ + #define SDIO_DEVICE_ID_REALTEK_RTW8822BS 0xb822 + #define SDIO_DEVICE_ID_REALTEK_RTW8821CS 0xc821 + #define SDIO_DEVICE_ID_REALTEK_RTW8822CS 0xc822 +-#define SDIO_DEVICE_ID_REALTEK_RTW8723DS 0xd723 ++#define SDIO_DEVICE_ID_REALTEK_RTW8723DS_2ANT 0xd723 ++#define SDIO_DEVICE_ID_REALTEK_RTW8723DS_1ANT 0xd724 + #define SDIO_DEVICE_ID_REALTEK_RTW8821DS 0xd821 + + #define SDIO_VENDOR_ID_SIANO 0x039a +-- +2.41.0 + diff --git a/kernel/tools/perf/files/patches/mageia/net-wireless-iwlwifi-add-new-pci-id-for-6235.patch b/kernel/tools/perf/files/patches/mageia/net-wireless-iwlwifi-add-new-pci-id-for-6235.patch new file mode 100644 index 0000000000..f34dd94215 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/net-wireless-iwlwifi-add-new-pci-id-for-6235.patch @@ -0,0 +1,31 @@ +From: Alex Hung +Subject: [PATCH] iwlwifi: add new pci id for 6235 +Date: Mon, 22 Mar 2021 01:11:21 -0600 + +lspci output: +Network controller [0280]: Intel Corporation Centrino Advanced-N6235 + [8086:088f] (rev 24) + Subsystem: Intel Corporation Centrino Advanced-N 6235 [8086:526a] + +Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org +Signed-off-by: Alex Hung +--- + drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +index ffaf973..f85fe36 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +@@ -200,6 +200,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { + {IWL_PCI_DEVICE(0x088E, 0x446A, iwl6035_2agn_sff_cfg)}, + {IWL_PCI_DEVICE(0x088E, 0x4860, iwl6035_2agn_cfg)}, + {IWL_PCI_DEVICE(0x088F, 0x5260, iwl6035_2agn_cfg)}, ++ {IWL_PCI_DEVICE(0x088F, 0x526A, iwl6035_2agn_cfg)}, + + /* 105 Series */ + {IWL_PCI_DEVICE(0x0894, 0x0022, iwl105_bgn_cfg)}, +-- +2.7.4 + + diff --git a/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-6.2-git.patch b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-6.2-git.patch new file mode 100644 index 0000000000..e13bb5d884 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-6.2-git.patch @@ -0,0 +1,2377 @@ + + drivers/net/wireless/realtek/rtw88/Kconfig | 47 +++++++++ + drivers/net/wireless/realtek/rtw88/Makefile | 15 +++ + drivers/net/wireless/realtek/rtw88/coex.c | 3 + drivers/net/wireless/realtek/rtw88/debug.c | 15 +++ + drivers/net/wireless/realtek/rtw88/fw.c | 31 +++--- + drivers/net/wireless/realtek/rtw88/fw.h | 11 ++ + drivers/net/wireless/realtek/rtw88/hci.h | 9 - + drivers/net/wireless/realtek/rtw88/mac.c | 21 ++++ + drivers/net/wireless/realtek/rtw88/mac80211.c | 2 + drivers/net/wireless/realtek/rtw88/main.c | 12 +- + drivers/net/wireless/realtek/rtw88/main.h | 12 +- + drivers/net/wireless/realtek/rtw88/phy.c | 6 - + drivers/net/wireless/realtek/rtw88/ps.c | 2 + drivers/net/wireless/realtek/rtw88/reg.h | 1 + drivers/net/wireless/realtek/rtw88/rtw8723d.c | 28 +++++ + drivers/net/wireless/realtek/rtw88/rtw8723d.h | 13 ++ + drivers/net/wireless/realtek/rtw88/rtw8723du.c | 36 +++++++ + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 18 +++ + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 21 ++++ + drivers/net/wireless/realtek/rtw88/rtw8821cu.c | 50 ++++++++++ + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 19 +++ + drivers/net/wireless/realtek/rtw88/rtw8822bu.c | 90 ++++++++++++++++++ + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 24 ++++ + drivers/net/wireless/realtek/rtw88/rtw8822cu.c | 44 ++++++++ + drivers/net/wireless/realtek/rtw88/tx.h | 31 ++++++ + drivers/net/wireless/realtek/rtw88/usb.c | 911 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/net/wireless/realtek/rtw88/usb.h | 107 +++++++++++++++++++++ + drivers/net/wireless/realtek/rtw88/util.c | 103 ++++++++++++++++++++ + drivers/net/wireless/realtek/rtw88/util.h | 12 +- + 29 files changed, 1650 insertions(+), 44 deletions(-) + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/coex.c linux-6.2/drivers/net/wireless/realtek/rtw88/coex.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/coex.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/coex.c 2022-12-24 00:49:25.771376835 +0200 +@@ -633,7 +633,7 @@ static struct sk_buff *rtw_coex_info_req + struct rtw_coex *coex = &rtwdev->coex; + struct sk_buff *skb_resp = NULL; + +- mutex_lock(&coex->mutex); ++ lockdep_assert_held(&rtwdev->mutex); + + rtw_fw_query_bt_mp_info(rtwdev, req); + +@@ -650,7 +650,6 @@ static struct sk_buff *rtw_coex_info_req + } + + out: +- mutex_unlock(&coex->mutex); + return skb_resp; + } + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/debug.c linux-6.2/drivers/net/wireless/realtek/rtw88/debug.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/debug.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/debug.c 2022-12-24 00:49:25.771376835 +0200 +@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struc + addr = debugfs_priv->rf_addr; + mask = debugfs_priv->rf_mask; + ++ mutex_lock(&rtwdev->mutex); + val = rtw_read_rf(rtwdev, path, addr, mask); ++ mutex_unlock(&rtwdev->mutex); + + seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n", + path, addr, mask, val); +@@ -390,7 +392,9 @@ static ssize_t rtw_debugfs_set_h2c(struc + return -EINVAL; + } + ++ mutex_lock(&rtwdev->mutex); + rtw_fw_h2c_cmd_dbg(rtwdev, param); ++ mutex_unlock(&rtwdev->mutex); + + return count; + } +@@ -414,7 +418,9 @@ static ssize_t rtw_debugfs_set_rf_write( + return count; + } + ++ mutex_lock(&rtwdev->mutex); + rtw_write_rf(rtwdev, path, addr, mask, val); ++ mutex_unlock(&rtwdev->mutex); + rtw_dbg(rtwdev, RTW_DBG_DEBUGFS, + "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n", + path, addr, mask, val); +@@ -519,6 +525,8 @@ static int rtw_debug_get_rf_dump(struct + u32 addr, offset, data; + u8 path; + ++ mutex_lock(&rtwdev->mutex); ++ + for (path = 0; path < rtwdev->hal.rf_path_num; path++) { + seq_printf(m, "RF path:%d\n", path); + for (addr = 0; addr < 0x100; addr += 4) { +@@ -533,6 +541,8 @@ static int rtw_debug_get_rf_dump(struct + seq_puts(m, "\n"); + } + ++ mutex_unlock(&rtwdev->mutex); ++ + return 0; + } + +@@ -831,7 +841,9 @@ static int rtw_debugfs_get_coex_info(str + struct rtw_debugfs_priv *debugfs_priv = m->private; + struct rtw_dev *rtwdev = debugfs_priv->rtwdev; + ++ mutex_lock(&rtwdev->mutex); + rtw_coex_display_coex_info(rtwdev, m); ++ mutex_unlock(&rtwdev->mutex); + + return 0; + } +@@ -1026,6 +1038,8 @@ static void dump_gapk_status(struct rtw_ + dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+', + rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]); + ++ mutex_lock(&rtwdev->mutex); ++ + for (path = 0; path < rtwdev->hal.rf_path_num; path++) { + val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK); + seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val); +@@ -1035,6 +1049,7 @@ static void dump_gapk_status(struct rtw_ + txgapk->rf3f_fs[path][i], i); + seq_puts(m, "\n"); + } ++ mutex_unlock(&rtwdev->mutex); + } + + static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v) +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/fw.c linux-6.2/drivers/net/wireless/realtek/rtw88/fw.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/fw.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/fw.c 2022-12-24 00:49:25.771376835 +0200 +@@ -311,10 +311,10 @@ EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); + static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, + u8 *h2c) + { ++ struct rtw_h2c_cmd *h2c_cmd = (struct rtw_h2c_cmd *)h2c; + u8 box; + u8 box_state; + u32 box_reg, box_ex_reg; +- int idx; + int ret; + + rtw_dbg(rtwdev, RTW_DBG_FW, +@@ -322,7 +322,7 @@ static void rtw_fw_send_h2c_command(stru + h2c[3], h2c[2], h2c[1], h2c[0], + h2c[7], h2c[6], h2c[5], h2c[4]); + +- spin_lock(&rtwdev->h2c.lock); ++ lockdep_assert_held(&rtwdev->mutex); + + box = rtwdev->h2c.last_box_num; + switch (box) { +@@ -344,7 +344,7 @@ static void rtw_fw_send_h2c_command(stru + break; + default: + WARN(1, "invalid h2c mail box number\n"); +- goto out; ++ return; + } + + ret = read_poll_timeout_atomic(rtw_read8, box_state, +@@ -353,19 +353,14 @@ static void rtw_fw_send_h2c_command(stru + + if (ret) { + rtw_err(rtwdev, "failed to send h2c command\n"); +- goto out; ++ return; + } + +- for (idx = 0; idx < 4; idx++) +- rtw_write8(rtwdev, box_reg + idx, h2c[idx]); +- for (idx = 0; idx < 4; idx++) +- rtw_write8(rtwdev, box_ex_reg + idx, h2c[idx + 4]); ++ rtw_write32(rtwdev, box_ex_reg, le32_to_cpu(h2c_cmd->msg_ext)); ++ rtw_write32(rtwdev, box_reg, le32_to_cpu(h2c_cmd->msg)); + + if (++rtwdev->h2c.last_box_num >= 4) + rtwdev->h2c.last_box_num = 0; +- +-out: +- spin_unlock(&rtwdev->h2c.lock); + } + + void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c) +@@ -377,15 +372,13 @@ static void rtw_fw_send_h2c_packet(struc + { + int ret; + +- spin_lock(&rtwdev->h2c.lock); ++ lockdep_assert_held(&rtwdev->mutex); + + FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq); + ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE); + if (ret) + rtw_err(rtwdev, "failed to send h2c packet\n"); + rtwdev->h2c.seq++; +- +- spin_unlock(&rtwdev->h2c.lock); + } + + void +@@ -823,6 +816,16 @@ void rtw_fw_set_nlo_info(struct rtw_dev + + rtw_fw_send_h2c_command(rtwdev, h2c_pkt); + } ++ ++void rtw_fw_set_recover_bt_device(struct rtw_dev *rtwdev) ++{ ++ u8 h2c_pkt[H2C_PKT_SIZE] = {0}; ++ ++ SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RECOVER_BT_DEV); ++ SET_RECOVER_BT_DEV_EN(h2c_pkt, 1); ++ ++ rtw_fw_send_h2c_command(rtwdev, h2c_pkt); ++} + + void rtw_fw_set_pg_info(struct rtw_dev *rtwdev) + { +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/fw.h linux-6.2/drivers/net/wireless/realtek/rtw88/fw.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/fw.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/fw.h 2022-12-24 00:49:25.771376835 +0200 +@@ -81,6 +81,11 @@ struct rtw_c2h_adaptivity { + u8 option; + } __packed; + ++struct rtw_h2c_cmd { ++ __le32 msg; ++ __le32 msg_ext; ++} __packed; ++ + enum rtw_rsvd_packet_type { + RSVD_BEACON, + RSVD_DUMMY, +@@ -550,6 +555,8 @@ static inline void rtw_h2c_pkt_set_heade + #define H2C_CMD_AOAC_GLOBAL_INFO 0x82 + #define H2C_CMD_NLO_INFO 0x8C + ++#define H2C_CMD_RECOVER_BT_DEV 0xD1 ++ + #define SET_H2C_CMD_ID_CLASS(h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(7, 0)) + +@@ -749,6 +756,9 @@ static inline void rtw_h2c_pkt_set_heade + #define SET_NLO_LOC_NLO_INFO(h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16)) + ++#define SET_RECOVER_BT_DEV_EN(h2c_pkt, value) \ ++ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8)) ++ + #define GET_FW_DUMP_LEN(_header) \ + le32_get_bits(*((__le32 *)(_header) + 0x00), GENMASK(15, 0)) + #define GET_FW_DUMP_SEQ(_header) \ +@@ -838,6 +848,7 @@ void rtw_fw_set_aoac_global_info_cmd(str + u8 group_key_enc); + + void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable); ++void rtw_fw_set_recover_bt_device(struct rtw_dev *rtwdev); + void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev, + struct cfg80211_ssid *ssid); + void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/hci.h linux-6.2/drivers/net/wireless/realtek/rtw88/hci.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/hci.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/hci.h 2022-12-24 00:49:25.771376835 +0200 +@@ -166,12 +166,11 @@ static inline u32 + rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, + u32 addr, u32 mask) + { +- unsigned long flags; + u32 val; + +- spin_lock_irqsave(&rtwdev->rf_lock, flags); ++ lockdep_assert_held(&rtwdev->mutex); ++ + val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask); +- spin_unlock_irqrestore(&rtwdev->rf_lock, flags); + + return val; + } +@@ -180,11 +179,9 @@ static inline void + rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, + u32 addr, u32 mask, u32 data) + { +- unsigned long flags; ++ lockdep_assert_held(&rtwdev->mutex); + +- spin_lock_irqsave(&rtwdev->rf_lock, flags); + rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data); +- spin_unlock_irqrestore(&rtwdev->rf_lock, flags); + } + + static inline u32 +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/Kconfig linux-6.2/drivers/net/wireless/realtek/rtw88/Kconfig +--- linux-6.1/drivers/net/wireless/realtek/rtw88/Kconfig 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/Kconfig 2022-12-24 00:49:25.770376835 +0200 +@@ -16,6 +16,9 @@ config RTW88_CORE + config RTW88_PCI + tristate + ++config RTW88_USB ++ tristate ++ + config RTW88_8822B + tristate + +@@ -39,6 +42,17 @@ config RTW88_8822BE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822BU ++ tristate "Realtek 8822BU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8822B ++ help ++ Select this option will enable support for 8822BU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_8822CE + tristate "Realtek 8822CE PCI wireless network adapter" + depends on PCI +@@ -50,6 +64,17 @@ config RTW88_8822CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822CU ++ tristate "Realtek 8822CU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8822C ++ help ++ Select this option will enable support for 8822CU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_8723DE + tristate "Realtek 8723DE PCI wireless network adapter" + depends on PCI +@@ -61,6 +86,17 @@ config RTW88_8723DE + + 802.11n PCIe wireless network adapter + ++config RTW88_8723DU ++ tristate "Realtek 8723DU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DU chipset ++ ++ 802.11n USB wireless network adapter ++ + config RTW88_8821CE + tristate "Realtek 8821CE PCI wireless network adapter" + depends on PCI +@@ -72,6 +108,17 @@ config RTW88_8821CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8821CU ++ tristate "Realtek 8821CU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8821C ++ help ++ Select this option will enable support for 8821CU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_DEBUG + bool "Realtek rtw88 debug support" + depends on RTW88_CORE +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/mac80211.c linux-6.2/drivers/net/wireless/realtek/rtw88/mac80211.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/mac80211.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/mac80211.c 2022-12-24 00:49:25.772376835 +0200 +@@ -487,8 +487,8 @@ static int rtw_ops_sta_remove(struct iee + { + struct rtw_dev *rtwdev = hw->priv; + +- rtw_fw_beacon_filter_config(rtwdev, false, vif); + mutex_lock(&rtwdev->mutex); ++ rtw_fw_beacon_filter_config(rtwdev, false, vif); + rtw_sta_remove(rtwdev, sta, true); + mutex_unlock(&rtwdev->mutex); + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/mac.c linux-6.2/drivers/net/wireless/realtek/rtw88/mac.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/mac.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/mac.c 2022-12-24 00:49:25.772376835 +0200 +@@ -906,7 +906,8 @@ out: + return ret; + } + +-int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) ++static ++int _rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) + { + if (rtw_chip_wcpu_11n(rtwdev)) + return __rtw_download_firmware_legacy(rtwdev, fw); +@@ -914,6 +915,21 @@ int rtw_download_firmware(struct rtw_dev + return __rtw_download_firmware(rtwdev, fw); + } + ++int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) ++{ ++ int ret; ++ ++ ret = _rtw_download_firmware(rtwdev, fw); ++ if (ret) ++ return ret; ++ ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && ++ rtwdev->chip->id == RTW_CHIP_TYPE_8821C) ++ rtw_fw_set_recover_bt_device(rtwdev); ++ ++ return 0; ++} ++ + static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues) + { + const struct rtw_rqpn *rqpn = rtwdev->fifo.rqpn; +@@ -1032,6 +1048,9 @@ static int txdma_queue_mapping(struct rt + if (rtw_chip_wcpu_11ac(rtwdev)) + rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); + ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) ++ rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); ++ + return 0; + } + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/main.c linux-6.2/drivers/net/wireless/realtek/rtw88/main.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/main.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/main.c 2022-12-24 00:49:25.772376835 +0200 +@@ -1731,7 +1731,8 @@ static void rtw_load_firmware_cb(const s + update_firmware_info(rtwdev, fw); + complete_all(&fw->completion); + +- rtw_info(rtwdev, "Firmware version %u.%u.%u, H2C version %u\n", ++ rtw_info(rtwdev, "%sFirmware version %u.%u.%u, H2C version %u\n", ++ fw->type == RTW_WOWLAN_FW ? "WOW " : "", + fw->version, fw->sub_version, fw->sub_index, fw->h2c_version); + } + +@@ -1757,6 +1758,7 @@ static int rtw_load_firmware(struct rtw_ + return -ENOENT; + } + ++ fw->type = type; + fw->rtwdev = rtwdev; + init_completion(&fw->completion); + +@@ -1781,6 +1783,10 @@ static int rtw_chip_parameter_setup(stru + rtwdev->hci.rpwm_addr = 0x03d9; + rtwdev->hci.cpwm_addr = 0x03da; + break; ++ case RTW_HCI_TYPE_USB: ++ rtwdev->hci.rpwm_addr = 0xfe58; ++ rtwdev->hci.cpwm_addr = 0xfe57; ++ break; + default: + rtw_err(rtwdev, "unsupported hci type\n"); + return -EINVAL; +@@ -2065,13 +2071,10 @@ int rtw_core_init(struct rtw_dev *rtwdev + skb_queue_head_init(&rtwdev->coex.queue); + skb_queue_head_init(&rtwdev->tx_report.queue); + +- spin_lock_init(&rtwdev->rf_lock); +- spin_lock_init(&rtwdev->h2c.lock); + spin_lock_init(&rtwdev->txq_lock); + spin_lock_init(&rtwdev->tx_report.q_lock); + + mutex_init(&rtwdev->mutex); +- mutex_init(&rtwdev->coex.mutex); + mutex_init(&rtwdev->hal.tx_power_mutex); + + init_waitqueue_head(&rtwdev->coex.wait); +@@ -2143,7 +2146,6 @@ void rtw_core_deinit(struct rtw_dev *rtw + } + + mutex_destroy(&rtwdev->mutex); +- mutex_destroy(&rtwdev->coex.mutex); + mutex_destroy(&rtwdev->hal.tx_power_mutex); + } + EXPORT_SYMBOL(rtw_core_deinit); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/main.h linux-6.2/drivers/net/wireless/realtek/rtw88/main.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/main.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/main.h 2022-12-24 00:49:25.773376835 +0200 +@@ -871,6 +871,10 @@ struct rtw_chip_ops { + bool is_tx2_path); + void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path, + u8 rx_path, bool is_tx2_path); ++ /* for USB/SDIO only */ ++ void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc); + + /* for coex */ + void (*coex_set_init)(struct rtw_dev *rtwdev); +@@ -1501,8 +1505,6 @@ struct rtw_coex_stat { + }; + + struct rtw_coex { +- /* protects coex info request section */ +- struct mutex mutex; + struct sk_buff_head queue; + wait_queue_head_t wait; + +@@ -1851,6 +1853,7 @@ struct rtw_fw_state { + u16 h2c_version; + u32 feature; + u32 feature_ext; ++ enum rtw_fw_type type; + }; + + enum rtw_sar_sources { +@@ -1994,9 +1997,6 @@ struct rtw_dev { + /* ensures exclusive access from mac80211 callbacks */ + struct mutex mutex; + +- /* read/write rf register */ +- spinlock_t rf_lock; +- + /* watch dog every 2 sec */ + struct delayed_work watch_dog_work; + u32 watch_dog_cnt; +@@ -2022,8 +2022,6 @@ struct rtw_dev { + struct { + /* incicate the mail box to use with fw */ + u8 last_box_num; +- /* protect to send h2c to fw */ +- spinlock_t lock; + u32 seq; + } h2c; + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/Makefile linux-6.2/drivers/net/wireless/realtek/rtw88/Makefile +--- linux-6.1/drivers/net/wireless/realtek/rtw88/Makefile 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/Makefile 2022-12-24 00:49:25.770376835 +0200 +@@ -26,23 +26,38 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b + obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o + rtw88_8822be-objs := rtw8822be.o + ++obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o ++rtw88_8822bu-objs := rtw8822bu.o ++ + obj-$(CONFIG_RTW88_8822C) += rtw88_8822c.o + rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o + + obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o + rtw88_8822ce-objs := rtw8822ce.o + ++obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o ++rtw88_8822cu-objs := rtw8822cu.o ++ + obj-$(CONFIG_RTW88_8723D) += rtw88_8723d.o + rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o + + obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o + rtw88_8723de-objs := rtw8723de.o + ++obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o ++rtw88_8723du-objs := rtw8723du.o ++ + obj-$(CONFIG_RTW88_8821C) += rtw88_8821c.o + rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o + + obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o + rtw88_8821ce-objs := rtw8821ce.o + ++obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o ++rtw88_8821cu-objs := rtw8821cu.o ++ + obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o + rtw88_pci-objs := pci.o ++ ++obj-$(CONFIG_RTW88_USB) += rtw88_usb.o ++rtw88_usb-objs := usb.o +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/phy.c linux-6.2/drivers/net/wireless/realtek/rtw88/phy.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/phy.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/phy.c 2022-12-24 00:49:25.773376835 +0200 +@@ -300,7 +300,7 @@ static void rtw_phy_stat_rssi(struct rtw + + data.rtwdev = rtwdev; + data.min_rssi = U8_MAX; +- rtw_iterate_stas_atomic(rtwdev, rtw_phy_stat_rssi_iter, &data); ++ rtw_iterate_stas(rtwdev, rtw_phy_stat_rssi_iter, &data); + + dm_info->pre_min_rssi = dm_info->min_rssi; + dm_info->min_rssi = data.min_rssi; +@@ -544,7 +544,7 @@ static void rtw_phy_ra_info_update(struc + if (rtwdev->watch_dog_cnt & 0x3) + return; + +- rtw_iterate_stas_atomic(rtwdev, rtw_phy_ra_info_update_iter, rtwdev); ++ rtw_iterate_stas(rtwdev, rtw_phy_ra_info_update_iter, rtwdev); + } + + static u32 rtw_phy_get_rrsr_mask(struct rtw_dev *rtwdev, u8 rate_idx) +@@ -597,7 +597,7 @@ static void rtw_phy_rrsr_update(struct r + struct rtw_dm_info *dm_info = &rtwdev->dm_info; + + dm_info->rrsr_mask_min = RRSR_RATE_ORDER_MAX; +- rtw_iterate_stas_atomic(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev); ++ rtw_iterate_stas(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev); + rtw_write32(rtwdev, REG_RRSR, dm_info->rrsr_val_init & dm_info->rrsr_mask_min); + } + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/ps.c linux-6.2/drivers/net/wireless/realtek/rtw88/ps.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/ps.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/ps.c 2022-12-24 00:49:25.773376835 +0200 +@@ -61,7 +61,7 @@ int rtw_leave_ips(struct rtw_dev *rtwdev + return ret; + } + +- rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev); ++ rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev); + + rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE); + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/reg.h linux-6.2/drivers/net/wireless/realtek/rtw88/reg.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/reg.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/reg.h 2022-12-24 00:49:25.773376835 +0200 +@@ -184,6 +184,7 @@ + #define BIT_TXDMA_VIQ_MAP(x) \ + (((x) & BIT_MASK_TXDMA_VIQ_MAP) << BIT_SHIFT_TXDMA_VIQ_MAP) + #define REG_TXDMA_PQ_MAP 0x010C ++#define BIT_RXDMA_ARBBW_EN BIT(0) + #define BIT_SHIFT_TXDMA_BEQ_MAP 8 + #define BIT_MASK_TXDMA_BEQ_MAP 0x3 + #define BIT_TXDMA_BEQ_MAP(x) \ +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723d.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723d.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2022-12-24 00:49:25.773376835 +0200 +@@ -210,6 +210,12 @@ static void rtw8723de_efuse_parsing(stru + ether_addr_copy(efuse->addr, map->e.mac_addr); + } + ++static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse, ++ struct rtw8723d_efuse *map) ++{ ++ ether_addr_copy(efuse->addr, map->u.mac_addr); ++} ++ + static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) + { + struct rtw_efuse *efuse = &rtwdev->efuse; +@@ -239,6 +245,9 @@ static int rtw8723d_read_efuse(struct rt + case RTW_HCI_TYPE_PCIE: + rtw8723de_efuse_parsing(efuse, map); + break; ++ case RTW_HCI_TYPE_USB: ++ rtw8723du_efuse_parsing(efuse, map); ++ break; + default: + /* unsupported now */ + return -ENOTSUPP; +@@ -1945,6 +1954,24 @@ static void rtw8723d_pwr_track(struct rt + dm_info->pwr_trk_triggered = false; + } + ++static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc) ++{ ++ size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ ++ __le16 chksum = 0; ++ __le16 *data = (__le16 *)(txdesc); ++ ++ SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000); ++ ++ while (words--) ++ chksum ^= *data++; ++ ++ chksum = ~chksum; ++ ++ SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum)); ++} ++ + static struct rtw_chip_ops rtw8723d_ops = { + .phy_set_param = rtw8723d_phy_set_param, + .read_efuse = rtw8723d_read_efuse, +@@ -1965,6 +1992,7 @@ static struct rtw_chip_ops rtw8723d_ops + .config_bfee = NULL, + .set_gid_table = NULL, + .cfg_csi_rate = NULL, ++ .fill_txdesc_checksum = rtw8723d_fill_txdesc_checksum, + + .coex_set_init = rtw8723d_coex_cfg_init, + .coex_set_ant_switch = NULL, +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723d.h linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723d.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2022-12-24 00:49:25.773376835 +0200 +@@ -41,6 +41,14 @@ struct rtw8723de_efuse { + u8 sub_device_id[2]; + }; + ++struct rtw8723du_efuse { ++ u8 res4[48]; /* 0xd0 */ ++ u8 vender_id[2]; /* 0x100 */ ++ u8 product_id[2]; /* 0x102 */ ++ u8 usb_option; /* 0x104 */ ++ u8 mac_addr[ETH_ALEN]; /* 0x107 */ ++}; ++ + struct rtw8723d_efuse { + __le16 rtl_id; + u8 rsvd[2]; +@@ -69,7 +77,10 @@ struct rtw8723d_efuse { + u8 rfe_option; + u8 country_code[2]; + u8 res[3]; +- struct rtw8723de_efuse e; ++ union { ++ struct rtw8723de_efuse e; ++ struct rtw8723du_efuse u; ++ }; + }; + + extern const struct rtw_chip_info rtw8723d_hw_spec; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723du.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723du.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8723du.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8723du.c 2022-12-24 00:49:25.773376835 +0200 +@@ -0,0 +1,36 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#include ++#include ++#include "main.h" ++#include "rtw8723d.h" ++#include "usb.h" ++ ++static const struct usb_device_id rtw_8723du_id_table[] = { ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd723, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8723d_hw_spec) }, /* 8723DU 1*1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd611, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8723d_hw_spec) }, /* Edimax EW-7611ULB V2 */ ++ { }, ++}; ++MODULE_DEVICE_TABLE(usb, rtw_8723du_id_table); ++ ++static int rtw8723du_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ return rtw_usb_probe(intf, id); ++} ++ ++static struct usb_driver rtw_8723du_driver = { ++ .name = "rtw_8723du", ++ .id_table = rtw_8723du_id_table, ++ .probe = rtw8723du_probe, ++ .disconnect = rtw_usb_disconnect, ++}; ++module_usb_driver(rtw_8723du_driver); ++ ++MODULE_AUTHOR("Hans Ulli Kroll "); ++MODULE_DESCRIPTION("Realtek 802.11n wireless 8723du driver"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821c.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821c.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2022-12-24 00:49:25.774376835 +0200 +@@ -26,6 +26,12 @@ static void rtw8821ce_efuse_parsing(stru + ether_addr_copy(efuse->addr, map->e.mac_addr); + } + ++static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse, ++ struct rtw8821c_efuse *map) ++{ ++ ether_addr_copy(efuse->addr, map->u.mac_addr); ++} ++ + enum rtw8821ce_rf_set { + SWITCH_TO_BTG, + SWITCH_TO_WLG, +@@ -68,6 +74,9 @@ static int rtw8821c_read_efuse(struct rt + case RTW_HCI_TYPE_PCIE: + rtw8821ce_efuse_parsing(efuse, map); + break; ++ case RTW_HCI_TYPE_USB: ++ rtw8821cu_efuse_parsing(efuse, map); ++ break; + default: + /* unsupported now */ + return -ENOTSUPP; +@@ -1148,6 +1157,13 @@ static void rtw8821c_phy_cck_pd_set(stru + dm_info->cck_pd_default + new_lvl * 2); + } + ++static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc) ++{ ++ fill_txdesc_checksum_common(txdesc, 16); ++} ++ + static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = { + {0x0086, + RTW_PWR_CUT_ALL_MSK, +@@ -1521,6 +1537,7 @@ static const struct rtw_rfe_def rtw8821c + [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), + [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), + [6] = RTW_DEF_RFE(8821c, 0, 0), ++ [34] = RTW_DEF_RFE(8821c, 0, 0), + }; + + static struct rtw_hw_reg rtw8821c_dig[] = { +@@ -1595,6 +1612,7 @@ static struct rtw_chip_ops rtw8821c_ops + .config_bfee = rtw8821c_bf_config_bfee, + .set_gid_table = rtw_bf_set_gid_table, + .cfg_csi_rate = rtw_bf_cfg_csi_rate, ++ .fill_txdesc_checksum = rtw8821c_fill_txdesc_checksum, + + .coex_set_init = rtw8821c_coex_cfg_init, + .coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch, +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821c.h linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821c.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2022-12-24 00:49:25.774376835 +0200 +@@ -9,6 +9,26 @@ + + #define RCR_VHT_ACK BIT(26) + ++struct rtw8821cu_efuse { ++ u8 res4[4]; /* 0xd0 */ ++ u8 usb_optional_function; ++ u8 res5[0x1e]; ++ u8 res6[2]; ++ u8 serial[0x0b]; /* 0xf5 */ ++ u8 vid; /* 0x100 */ ++ u8 res7; ++ u8 pid; ++ u8 res8[4]; ++ u8 mac_addr[ETH_ALEN]; /* 0x107 */ ++ u8 res9[2]; ++ u8 vendor_name[0x07]; ++ u8 res10[2]; ++ u8 device_name[0x14]; ++ u8 res11[0xcf]; ++ u8 package_type; /* 0x1fb */ ++ u8 res12[0x4]; ++}; ++ + struct rtw8821ce_efuse { + u8 mac_addr[ETH_ALEN]; /* 0xd0 */ + u8 vender_id[2]; +@@ -73,6 +93,7 @@ struct rtw8821c_efuse { + u8 res[3]; + union { + struct rtw8821ce_efuse e; ++ struct rtw8821cu_efuse u; + }; + }; + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821cu.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821cu.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8821cu.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8821cu.c 2022-12-24 00:49:25.774376835 +0200 +@@ -0,0 +1,50 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#include ++#include ++#include "main.h" ++#include "rtw8821c.h" ++#include "usb.h" ++ ++static const struct usb_device_id rtw_8821cu_id_table[] = { ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82b, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb820, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc821, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc820, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82a, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82b, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc811, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8811, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2006, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* TOTOLINK A650UA v3 */ ++ {}, ++}; ++MODULE_DEVICE_TABLE(usb, rtw_8821cu_id_table); ++ ++static int rtw_8821cu_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ return rtw_usb_probe(intf, id); ++} ++ ++static struct usb_driver rtw_8821cu_driver = { ++ .name = "rtw_8821cu", ++ .id_table = rtw_8821cu_id_table, ++ .probe = rtw_8821cu_probe, ++ .disconnect = rtw_usb_disconnect, ++}; ++module_usb_driver(rtw_8821cu_driver); ++ ++MODULE_AUTHOR("Hans Ulli Kroll "); ++MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cu driver"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822b.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822b.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2022-12-24 00:49:25.774376835 +0200 +@@ -26,6 +26,12 @@ static void rtw8822be_efuse_parsing(stru + ether_addr_copy(efuse->addr, map->e.mac_addr); + } + ++static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, ++ struct rtw8822b_efuse *map) ++{ ++ ether_addr_copy(efuse->addr, map->u.mac_addr); ++} ++ + static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) + { + struct rtw_efuse *efuse = &rtwdev->efuse; +@@ -56,6 +62,9 @@ static int rtw8822b_read_efuse(struct rt + case RTW_HCI_TYPE_PCIE: + rtw8822be_efuse_parsing(efuse, map); + break; ++ case RTW_HCI_TYPE_USB: ++ rtw8822bu_efuse_parsing(efuse, map); ++ break; + default: + /* unsupported now */ + return -ENOTSUPP; +@@ -1588,6 +1597,15 @@ static void rtw8822b_adaptivity(struct r + rtw_phy_set_edcca_th(rtwdev, l2h, h2l); + } + ++static void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc) ++{ ++ size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ ++ ++ fill_txdesc_checksum_common(txdesc, words); ++} ++ + static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = { + {0x0086, + RTW_PWR_CUT_ALL_MSK, +@@ -2163,6 +2181,7 @@ static struct rtw_chip_ops rtw8822b_ops + .cfg_csi_rate = rtw_bf_cfg_csi_rate, + .adaptivity_init = rtw8822b_adaptivity_init, + .adaptivity = rtw8822b_adaptivity, ++ .fill_txdesc_checksum = rtw8822b_fill_txdesc_checksum, + + .coex_set_init = rtw8822b_coex_cfg_init, + .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch, +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822bu.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822bu.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822bu.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822bu.c 2022-12-24 00:49:25.774376835 +0200 +@@ -0,0 +1,90 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#include ++#include ++#include "main.h" ++#include "rtw8822b.h" ++#include "usb.h" ++ ++static const struct usb_device_id rtw_8822bu_id_table[] = { ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb812, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82c, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2102, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* CCNC */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb822, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822ULC */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xc822, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822UTC */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd822, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xe822, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xf822, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Edimax EW-7822UAD */ ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb81a, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Default ID */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1841, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS AC1300 USB-AC55 B1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x184c, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS U2 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x19aa, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS - USB-AC58 rev A1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1870, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1874, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ASUS */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331e, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Dlink - DWA-181 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331c, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Dlink - DWA-182 - D1 */ ++ {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331f, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec)}, /* Dlink - DWA-183 D Ver */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Linksys WUSB6400M */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0045, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Linksys WUSB3600 v2 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012d, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T3U v1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0138, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T3U Plus v1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0115, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-Link Archer T4U V3 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012e, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0116, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0117, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TP-LINK */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9055, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Netgear A6150 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0025, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Hawking HW12ACU */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x04ca, 0x8602, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* LiteOn */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x808a, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* TRENDnet TEW-808UBM */ ++ {}, ++}; ++MODULE_DEVICE_TABLE(usb, rtw_8822bu_id_table); ++ ++static int rtw8822bu_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ return rtw_usb_probe(intf, id); ++} ++ ++static struct usb_driver rtw_8822bu_driver = { ++ .name = "rtw_8822bu", ++ .id_table = rtw_8822bu_id_table, ++ .probe = rtw8822bu_probe, ++ .disconnect = rtw_usb_disconnect, ++}; ++module_usb_driver(rtw_8822bu_driver); ++ ++MODULE_AUTHOR("Realtek Corporation"); ++MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bu driver"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822c.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822c.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2022-12-24 00:49:25.775376835 +0200 +@@ -29,6 +29,12 @@ static void rtw8822ce_efuse_parsing(stru + ether_addr_copy(efuse->addr, map->e.mac_addr); + } + ++static void rtw8822cu_efuse_parsing(struct rtw_efuse *efuse, ++ struct rtw8822c_efuse *map) ++{ ++ ether_addr_copy(efuse->addr, map->u.mac_addr); ++} ++ + static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) + { + struct rtw_efuse *efuse = &rtwdev->efuse; +@@ -58,6 +64,9 @@ static int rtw8822c_read_efuse(struct rt + case RTW_HCI_TYPE_PCIE: + rtw8822ce_efuse_parsing(efuse, map); + break; ++ case RTW_HCI_TYPE_USB: ++ rtw8822cu_efuse_parsing(efuse, map); ++ break; + default: + /* unsupported now */ + return -ENOTSUPP; +@@ -4557,6 +4566,18 @@ static void rtw8822c_adaptivity(struct r + rtw_phy_set_edcca_th(rtwdev, l2h, h2l); + } + ++static void rtw8822c_fill_txdesc_checksum(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc) ++{ ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ size_t words; ++ ++ words = (pkt_info->pkt_offset * 8 + chip->tx_pkt_desc_sz) / 2; ++ ++ fill_txdesc_checksum_common(txdesc, words); ++} ++ + static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822c[] = { + {0x0086, + RTW_PWR_CUT_ALL_MSK, +@@ -4895,6 +4916,8 @@ static const struct rtw_rfe_def rtw8822c + [0] = RTW_DEF_RFE(8822c, 0, 0), + [1] = RTW_DEF_RFE(8822c, 0, 0), + [2] = RTW_DEF_RFE(8822c, 0, 0), ++ [3] = RTW_DEF_RFE(8822c, 0, 0), ++ [4] = RTW_DEF_RFE(8822c, 0, 0), + [5] = RTW_DEF_RFE(8822c, 0, 5), + [6] = RTW_DEF_RFE(8822c, 0, 0), + }; +@@ -4978,6 +5001,7 @@ static struct rtw_chip_ops rtw8822c_ops + .cfo_track = rtw8822c_cfo_track, + .config_tx_path = rtw8822c_config_tx_path, + .config_txrx_mode = rtw8822c_config_trx_mode, ++ .fill_txdesc_checksum = rtw8822c_fill_txdesc_checksum, + + .coex_set_init = rtw8822c_coex_cfg_init, + .coex_set_ant_switch = NULL, +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822cu.c linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822cu.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 2022-12-24 00:49:25.775376835 +0200 +@@ -0,0 +1,44 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#include ++#include ++#include "main.h" ++#include "rtw8822c.h" ++#include "usb.h" ++ ++static const struct usb_device_id rtw_8822cu_id_table[] = { ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82c, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc812, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82e, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd820, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd82b, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, /* Alpha - Alpha */ ++ {}, ++}; ++MODULE_DEVICE_TABLE(usb, rtw_8822cu_id_table); ++ ++static int rtw8822bu_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ return rtw_usb_probe(intf, id); ++} ++ ++static struct usb_driver rtw_8822cu_driver = { ++ .name = "rtw_8822cu", ++ .id_table = rtw_8822cu_id_table, ++ .probe = rtw8822bu_probe, ++ .disconnect = rtw_usb_disconnect, ++}; ++module_usb_driver(rtw_8822cu_driver); ++ ++MODULE_AUTHOR("Realtek Corporation"); ++MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cu driver"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/tx.h linux-6.2/drivers/net/wireless/realtek/rtw88/tx.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/tx.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/tx.h 2022-12-24 00:49:25.775376835 +0200 +@@ -71,6 +71,14 @@ + le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, BIT(15)) + #define SET_TX_DESC_BT_NULL(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(23)) ++#define SET_TX_DESC_TXDESC_CHECKSUM(txdesc, value) \ ++ le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(15, 0)) ++#define SET_TX_DESC_DMA_TXAGG_NUM(txdesc, value) \ ++ le32p_replace_bits((__le32 *)(txdesc) + 0x07, value, GENMASK(31, 24)) ++#define GET_TX_DESC_PKT_OFFSET(txdesc) \ ++ le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(28, 24)) ++#define GET_TX_DESC_QSEL(txdesc) \ ++ le32_get_bits(*((__le32 *)(txdesc) + 0x01), GENMASK(12, 8)) + + enum rtw_tx_desc_queue_select { + TX_DESC_QSEL_TID0 = 0, +@@ -123,4 +131,27 @@ rtw_tx_write_data_h2c_get(struct rtw_dev + struct rtw_tx_pkt_info *pkt_info, + u8 *buf, u32 size); + ++static inline ++void fill_txdesc_checksum_common(u8 *txdesc, size_t words) ++{ ++ __le16 chksum = 0; ++ __le16 *data = (__le16 *)(txdesc); ++ ++ SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000); ++ ++ while (words--) ++ chksum ^= *data++; ++ ++ SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum)); ++} ++ ++static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *txdesc) ++{ ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ ++ chip->ops->fill_txdesc_checksum(rtwdev, pkt_info, txdesc); ++} ++ + #endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/usb.c linux-6.2/drivers/net/wireless/realtek/rtw88/usb.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/usb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/usb.c 2022-12-24 00:49:25.775376835 +0200 +@@ -0,0 +1,911 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#include ++#include ++#include ++#include "main.h" ++#include "debug.h" ++#include "reg.h" ++#include "tx.h" ++#include "rx.h" ++#include "fw.h" ++#include "ps.h" ++#include "usb.h" ++ ++#define RTW_USB_MAX_RXQ_LEN 512 ++ ++struct rtw_usb_txcb { ++ struct rtw_dev *rtwdev; ++ struct sk_buff_head tx_ack_queue; ++}; ++ ++static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb, ++ struct sk_buff *skb, int agg_num) ++{ ++ struct rtw_dev *rtwdev = rtwusb->rtwdev; ++ struct rtw_tx_pkt_info pkt_info; ++ ++ SET_TX_DESC_DMA_TXAGG_NUM(skb->data, agg_num); ++ pkt_info.pkt_offset = GET_TX_DESC_PKT_OFFSET(skb->data); ++ rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data); ++} ++ ++static u32 rtw_usb_read(struct rtw_dev *rtwdev, u32 addr, u16 len) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ struct usb_device *udev = rtwusb->udev; ++ __le32 *data; ++ unsigned long flags; ++ int idx, ret; ++ static int count; ++ ++ spin_lock_irqsave(&rtwusb->usb_lock, flags); ++ ++ idx = rtwusb->usb_data_index; ++ rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1); ++ ++ spin_unlock_irqrestore(&rtwusb->usb_lock, flags); ++ ++ data = &rtwusb->usb_data[idx]; ++ ++ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), ++ RTW_USB_CMD_REQ, RTW_USB_CMD_READ, addr, ++ RTW_USB_VENQT_CMD_IDX, data, len, 1000); ++ if (ret < 0 && ret != -ENODEV && count++ < 4) ++ rtw_err(rtwdev, "read register 0x%x failed with %d\n", ++ addr, ret); ++ ++ return le32_to_cpu(*data); ++} ++ ++static u8 rtw_usb_read8(struct rtw_dev *rtwdev, u32 addr) ++{ ++ return (u8)rtw_usb_read(rtwdev, addr, 1); ++} ++ ++static u16 rtw_usb_read16(struct rtw_dev *rtwdev, u32 addr) ++{ ++ return (u16)rtw_usb_read(rtwdev, addr, 2); ++} ++ ++static u32 rtw_usb_read32(struct rtw_dev *rtwdev, u32 addr) ++{ ++ return (u32)rtw_usb_read(rtwdev, addr, 4); ++} ++ ++static void rtw_usb_write(struct rtw_dev *rtwdev, u32 addr, u32 val, int len) ++{ ++ struct rtw_usb *rtwusb = (struct rtw_usb *)rtwdev->priv; ++ struct usb_device *udev = rtwusb->udev; ++ unsigned long flags; ++ __le32 *data; ++ int idx, ret; ++ static int count; ++ ++ spin_lock_irqsave(&rtwusb->usb_lock, flags); ++ ++ idx = rtwusb->usb_data_index; ++ rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1); ++ ++ spin_unlock_irqrestore(&rtwusb->usb_lock, flags); ++ ++ data = &rtwusb->usb_data[idx]; ++ ++ *data = cpu_to_le32(val); ++ ++ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE, ++ addr, 0, data, len, 30000); ++ if (ret < 0 && ret != -ENODEV && count++ < 4) ++ rtw_err(rtwdev, "write register 0x%x failed with %d\n", ++ addr, ret); ++} ++ ++static void rtw_usb_write8(struct rtw_dev *rtwdev, u32 addr, u8 val) ++{ ++ rtw_usb_write(rtwdev, addr, val, 1); ++} ++ ++static void rtw_usb_write16(struct rtw_dev *rtwdev, u32 addr, u16 val) ++{ ++ rtw_usb_write(rtwdev, addr, val, 2); ++} ++ ++static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) ++{ ++ rtw_usb_write(rtwdev, addr, val, 4); ++} ++ ++static int rtw_usb_parse(struct rtw_dev *rtwdev, ++ struct usb_interface *interface) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ struct usb_host_interface *host_interface = &interface->altsetting[0]; ++ struct usb_interface_descriptor *interface_desc = &host_interface->desc; ++ struct usb_endpoint_descriptor *endpoint; ++ struct usb_device *usbd = interface_to_usbdev(interface); ++ int num_out_pipes = 0; ++ int i; ++ u8 num; ++ ++ for (i = 0; i < interface_desc->bNumEndpoints; i++) { ++ endpoint = &host_interface->endpoint[i].desc; ++ num = usb_endpoint_num(endpoint); ++ ++ if (usb_endpoint_dir_in(endpoint) && ++ usb_endpoint_xfer_bulk(endpoint)) { ++ if (rtwusb->pipe_in) { ++ rtw_err(rtwdev, "IN pipes overflow\n"); ++ return -EINVAL; ++ } ++ ++ rtwusb->pipe_in = num; ++ } ++ ++ if (usb_endpoint_dir_in(endpoint) && ++ usb_endpoint_xfer_int(endpoint)) { ++ if (rtwusb->pipe_interrupt) { ++ rtw_err(rtwdev, "INT pipes overflow\n"); ++ return -EINVAL; ++ } ++ ++ rtwusb->pipe_interrupt = num; ++ } ++ ++ if (usb_endpoint_dir_out(endpoint) && ++ usb_endpoint_xfer_bulk(endpoint)) { ++ if (num_out_pipes >= ARRAY_SIZE(rtwusb->out_ep)) { ++ rtw_err(rtwdev, "OUT pipes overflow\n"); ++ return -EINVAL; ++ } ++ ++ rtwusb->out_ep[num_out_pipes++] = num; ++ } ++ } ++ ++ switch (usbd->speed) { ++ case USB_SPEED_LOW: ++ case USB_SPEED_FULL: ++ rtwusb->bulkout_size = RTW_USB_FULL_SPEED_BULK_SIZE; ++ break; ++ case USB_SPEED_HIGH: ++ rtwusb->bulkout_size = RTW_USB_HIGH_SPEED_BULK_SIZE; ++ break; ++ case USB_SPEED_SUPER: ++ rtwusb->bulkout_size = RTW_USB_SUPER_SPEED_BULK_SIZE; ++ break; ++ default: ++ rtw_err(rtwdev, "failed to detect usb speed\n"); ++ return -EINVAL; ++ } ++ ++ rtwdev->hci.bulkout_num = num_out_pipes; ++ ++ switch (num_out_pipes) { ++ case 4: ++ case 3: ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 2; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 2; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 2; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 2; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = 1; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = 1; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = 0; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = 0; ++ break; ++ case 2: ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = 1; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = 1; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = 1; ++ rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = 1; ++ break; ++ case 1: ++ break; ++ default: ++ rtw_err(rtwdev, "failed to get out_pipes(%d)\n", num_out_pipes); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static void rtw_usb_write_port_tx_complete(struct urb *urb) ++{ ++ struct rtw_usb_txcb *txcb = urb->context; ++ struct rtw_dev *rtwdev = txcb->rtwdev; ++ struct ieee80211_hw *hw = rtwdev->hw; ++ ++ while (true) { ++ struct sk_buff *skb = skb_dequeue(&txcb->tx_ack_queue); ++ struct ieee80211_tx_info *info; ++ struct rtw_usb_tx_data *tx_data; ++ ++ if (!skb) ++ break; ++ ++ info = IEEE80211_SKB_CB(skb); ++ tx_data = rtw_usb_get_tx_data(skb); ++ ++ /* enqueue to wait for tx report */ ++ if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { ++ rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn); ++ continue; ++ } ++ ++ /* always ACK for others, then they won't be marked as drop */ ++ ieee80211_tx_info_clear_status(info); ++ if (info->flags & IEEE80211_TX_CTL_NO_ACK) ++ info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; ++ else ++ info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ ieee80211_tx_status_irqsafe(hw, skb); ++ } ++ ++ kfree(txcb); ++} ++ ++static int qsel_to_ep(struct rtw_usb *rtwusb, unsigned int qsel) ++{ ++ if (qsel >= ARRAY_SIZE(rtwusb->qsel_to_ep)) ++ return 0; ++ ++ return rtwusb->qsel_to_ep[qsel]; ++} ++ ++static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *skb, ++ usb_complete_t cb, void *context) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ struct usb_device *usbd = rtwusb->udev; ++ struct urb *urb; ++ unsigned int pipe; ++ int ret; ++ int ep = qsel_to_ep(rtwusb, qsel); ++ ++ pipe = usb_sndbulkpipe(usbd, rtwusb->out_ep[ep]); ++ urb = usb_alloc_urb(0, GFP_ATOMIC); ++ if (!urb) ++ return -ENOMEM; ++ ++ usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context); ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ ++ usb_free_urb(urb); ++ ++ return ret; ++} ++ ++static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list) ++{ ++ struct rtw_dev *rtwdev = rtwusb->rtwdev; ++ struct rtw_usb_txcb *txcb; ++ struct sk_buff *skb_head; ++ struct sk_buff *skb_iter; ++ int agg_num = 0; ++ unsigned int align_next = 0; ++ ++ if (skb_queue_empty(list)) ++ return false; ++ ++ txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC); ++ if (!txcb) ++ return false; ++ ++ txcb->rtwdev = rtwdev; ++ skb_queue_head_init(&txcb->tx_ack_queue); ++ ++ skb_iter = skb_dequeue(list); ++ ++ if (skb_queue_empty(list)) { ++ skb_head = skb_iter; ++ goto queue; ++ } ++ ++ skb_head = dev_alloc_skb(RTW_USB_MAX_XMITBUF_SZ); ++ if (!skb_head) { ++ skb_head = skb_iter; ++ goto queue; ++ } ++ ++ while (skb_iter) { ++ unsigned long flags; ++ ++ skb_put(skb_head, align_next); ++ skb_put_data(skb_head, skb_iter->data, skb_iter->len); ++ ++ align_next = ALIGN(skb_iter->len, 8) - skb_iter->len; ++ ++ agg_num++; ++ ++ skb_queue_tail(&txcb->tx_ack_queue, skb_iter); ++ ++ spin_lock_irqsave(&list->lock, flags); ++ ++ skb_iter = skb_peek(list); ++ ++ if (skb_iter && skb_iter->len + skb_head->len <= RTW_USB_MAX_XMITBUF_SZ) ++ __skb_unlink(skb_iter, list); ++ else ++ skb_iter = NULL; ++ spin_unlock_irqrestore(&list->lock, flags); ++ } ++ ++ if (agg_num > 1) ++ rtw_usb_fill_tx_checksum(rtwusb, skb_head, agg_num); ++ ++queue: ++ skb_queue_tail(&txcb->tx_ack_queue, skb_head); ++ ++ rtw_usb_write_port(rtwdev, GET_TX_DESC_QSEL(skb_head->data), skb_head, ++ rtw_usb_write_port_tx_complete, txcb); ++ ++ return true; ++} ++ ++static void rtw_usb_tx_handler(struct work_struct *work) ++{ ++ struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, tx_work); ++ int i, limit; ++ ++ for (i = ARRAY_SIZE(rtwusb->tx_queue) - 1; i >= 0; i--) { ++ for (limit = 0; limit < 200; limit++) { ++ struct sk_buff_head *list = &rtwusb->tx_queue[i]; ++ ++ if (!rtw_usb_tx_agg_skb(rtwusb, list)) ++ break; ++ } ++ } ++} ++ ++static void rtw_usb_tx_queue_purge(struct rtw_usb *rtwusb) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) ++ skb_queue_purge(&rtwusb->tx_queue[i]); ++} ++ ++static void rtw_usb_write_port_complete(struct urb *urb) ++{ ++ struct sk_buff *skb = urb->context; ++ ++ dev_kfree_skb_any(skb); ++} ++ ++static int rtw_usb_write_data(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ u8 *buf) ++{ ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ struct sk_buff *skb; ++ unsigned int desclen, headsize, size; ++ u8 qsel; ++ int ret = 0; ++ ++ size = pkt_info->tx_pkt_size; ++ qsel = pkt_info->qsel; ++ desclen = chip->tx_pkt_desc_sz; ++ headsize = pkt_info->offset ? pkt_info->offset : desclen; ++ ++ skb = dev_alloc_skb(headsize + size); ++ if (unlikely(!skb)) ++ return -ENOMEM; ++ ++ skb_reserve(skb, headsize); ++ skb_put_data(skb, buf, size); ++ skb_push(skb, headsize); ++ memset(skb->data, 0, headsize); ++ rtw_tx_fill_tx_desc(pkt_info, skb); ++ rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); ++ ++ ret = rtw_usb_write_port(rtwdev, qsel, skb, ++ rtw_usb_write_port_complete, skb); ++ if (unlikely(ret)) ++ rtw_err(rtwdev, "failed to do USB write, ret=%d\n", ret); ++ ++ return ret; ++} ++ ++static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, ++ u32 size) ++{ ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ struct rtw_usb *rtwusb; ++ struct rtw_tx_pkt_info pkt_info = {0}; ++ u32 len, desclen; ++ ++ rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ pkt_info.tx_pkt_size = size; ++ pkt_info.qsel = TX_DESC_QSEL_BEACON; ++ ++ desclen = chip->tx_pkt_desc_sz; ++ len = desclen + size; ++ if (len % rtwusb->bulkout_size == 0) { ++ len += RTW_USB_PACKET_OFFSET_SZ; ++ pkt_info.offset = desclen + RTW_USB_PACKET_OFFSET_SZ; ++ pkt_info.pkt_offset = 1; ++ } else { ++ pkt_info.offset = desclen; ++ } ++ ++ return rtw_usb_write_data(rtwdev, &pkt_info, buf); ++} ++ ++static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size) ++{ ++ struct rtw_tx_pkt_info pkt_info = {0}; ++ ++ pkt_info.tx_pkt_size = size; ++ pkt_info.qsel = TX_DESC_QSEL_H2C; ++ ++ return rtw_usb_write_data(rtwdev, &pkt_info, buf); ++} ++ ++static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb) ++{ ++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ __le16 fc = hdr->frame_control; ++ u8 qsel; ++ ++ if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) ++ qsel = TX_DESC_QSEL_MGMT; ++ else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK) ++ qsel = skb->priority; ++ else ++ qsel = TX_DESC_QSEL_BEACON; ++ ++ return qsel; ++} ++ ++static int rtw_usb_tx_write(struct rtw_dev *rtwdev, ++ struct rtw_tx_pkt_info *pkt_info, ++ struct sk_buff *skb) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ struct rtw_usb_tx_data *tx_data; ++ u8 *pkt_desc; ++ int ep; ++ ++ pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz); ++ memset(pkt_desc, 0, chip->tx_pkt_desc_sz); ++ pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb); ++ ep = qsel_to_ep(rtwusb, pkt_info->qsel); ++ rtw_tx_fill_tx_desc(pkt_info, skb); ++ rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data); ++ tx_data = rtw_usb_get_tx_data(skb); ++ tx_data->sn = pkt_info->sn; ++ ++ skb_queue_tail(&rtwusb->tx_queue[ep], skb); ++ ++ return 0; ++} ++ ++static void rtw_usb_tx_kick_off(struct rtw_dev *rtwdev) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ queue_work(rtwusb->txwq, &rtwusb->tx_work); ++} ++ ++static void rtw_usb_rx_handler(struct work_struct *work) ++{ ++ struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work); ++ struct rtw_dev *rtwdev = rtwusb->rtwdev; ++ const struct rtw_chip_info *chip = rtwdev->chip; ++ struct rtw_rx_pkt_stat pkt_stat; ++ struct ieee80211_rx_status rx_status; ++ struct sk_buff *skb; ++ u32 pkt_desc_sz = chip->rx_pkt_desc_sz; ++ u32 pkt_offset; ++ u8 *rx_desc; ++ int limit; ++ ++ for (limit = 0; limit < 200; limit++) { ++ skb = skb_dequeue(&rtwusb->rx_queue); ++ if (!skb) ++ break; ++ ++ rx_desc = skb->data; ++ chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, ++ &rx_status); ++ pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + ++ pkt_stat.shift; ++ ++ if (pkt_stat.is_c2h) { ++ skb_put(skb, pkt_stat.pkt_len + pkt_offset); ++ rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb); ++ continue; ++ } ++ ++ if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) { ++ rtw_err(rtwdev, "failed to get rx_queue, overflow\n"); ++ dev_kfree_skb_any(skb); ++ continue; ++ } ++ ++ skb_put(skb, pkt_stat.pkt_len); ++ skb_reserve(skb, pkt_offset); ++ memcpy(skb->cb, &rx_status, sizeof(rx_status)); ++ ieee80211_rx_irqsafe(rtwdev->hw, skb); ++ } ++} ++ ++static void rtw_usb_read_port_complete(struct urb *urb); ++ ++static void rtw_usb_rx_resubmit(struct rtw_usb *rtwusb, struct rx_usb_ctrl_block *rxcb) ++{ ++ struct rtw_dev *rtwdev = rtwusb->rtwdev; ++ int error; ++ ++ rxcb->rx_skb = alloc_skb(RTW_USB_MAX_RECVBUF_SZ, GFP_ATOMIC); ++ if (!rxcb->rx_skb) ++ return; ++ ++ usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev, ++ usb_rcvbulkpipe(rtwusb->udev, rtwusb->pipe_in), ++ rxcb->rx_skb->data, RTW_USB_MAX_RECVBUF_SZ, ++ rtw_usb_read_port_complete, rxcb); ++ ++ error = usb_submit_urb(rxcb->rx_urb, GFP_ATOMIC); ++ if (error) { ++ kfree_skb(rxcb->rx_skb); ++ if (error != -ENODEV) ++ rtw_err(rtwdev, "Err sending rx data urb %d\n", ++ error); ++ } ++} ++ ++static void rtw_usb_read_port_complete(struct urb *urb) ++{ ++ struct rx_usb_ctrl_block *rxcb = urb->context; ++ struct rtw_dev *rtwdev = rxcb->rtwdev; ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ struct sk_buff *skb = rxcb->rx_skb; ++ ++ if (urb->status == 0) { ++ if (urb->actual_length >= RTW_USB_MAX_RECVBUF_SZ || ++ urb->actual_length < 24) { ++ rtw_err(rtwdev, "failed to get urb length:%d\n", ++ urb->actual_length); ++ if (skb) ++ dev_kfree_skb_any(skb); ++ } else { ++ skb_queue_tail(&rtwusb->rx_queue, skb); ++ queue_work(rtwusb->rxwq, &rtwusb->rx_work); ++ } ++ rtw_usb_rx_resubmit(rtwusb, rxcb); ++ } else { ++ switch (urb->status) { ++ case -EINVAL: ++ case -EPIPE: ++ case -ENODEV: ++ case -ESHUTDOWN: ++ case -ENOENT: ++ case -EPROTO: ++ case -EILSEQ: ++ case -ETIME: ++ case -ECOMM: ++ case -EOVERFLOW: ++ case -EINPROGRESS: ++ break; ++ default: ++ rtw_err(rtwdev, "status %d\n", urb->status); ++ break; ++ } ++ if (skb) ++ dev_kfree_skb_any(skb); ++ } ++} ++ ++static void rtw_usb_cancel_rx_bufs(struct rtw_usb *rtwusb) ++{ ++ struct rx_usb_ctrl_block *rxcb; ++ int i; ++ ++ for (i = 0; i < RTW_USB_RXCB_NUM; i++) { ++ rxcb = &rtwusb->rx_cb[i]; ++ if (rxcb->rx_urb) ++ usb_kill_urb(rxcb->rx_urb); ++ } ++} ++ ++static void rtw_usb_free_rx_bufs(struct rtw_usb *rtwusb) ++{ ++ struct rx_usb_ctrl_block *rxcb; ++ int i; ++ ++ for (i = 0; i < RTW_USB_RXCB_NUM; i++) { ++ rxcb = &rtwusb->rx_cb[i]; ++ if (rxcb->rx_urb) { ++ usb_kill_urb(rxcb->rx_urb); ++ usb_free_urb(rxcb->rx_urb); ++ } ++ } ++} ++ ++static int rtw_usb_alloc_rx_bufs(struct rtw_usb *rtwusb) ++{ ++ int i; ++ ++ for (i = 0; i < RTW_USB_RXCB_NUM; i++) { ++ struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i]; ++ ++ rxcb->n = i; ++ rxcb->rtwdev = rtwusb->rtwdev; ++ rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL); ++ if (!rxcb->rx_urb) ++ goto err; ++ } ++ ++ return 0; ++err: ++ rtw_usb_free_rx_bufs(rtwusb); ++ return -ENOMEM; ++} ++ ++static int rtw_usb_setup(struct rtw_dev *rtwdev) ++{ ++ /* empty function for rtw_hci_ops */ ++ return 0; ++} ++ ++static int rtw_usb_start(struct rtw_dev *rtwdev) ++{ ++ return 0; ++} ++ ++static void rtw_usb_stop(struct rtw_dev *rtwdev) ++{ ++} ++ ++static void rtw_usb_deep_ps(struct rtw_dev *rtwdev, bool enter) ++{ ++ /* empty function for rtw_hci_ops */ ++} ++ ++static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter) ++{ ++ /* empty function for rtw_hci_ops */ ++} ++ ++static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev) ++{ ++ /* empty function for rtw_hci_ops */ ++} ++ ++static struct rtw_hci_ops rtw_usb_ops = { ++ .tx_write = rtw_usb_tx_write, ++ .tx_kick_off = rtw_usb_tx_kick_off, ++ .setup = rtw_usb_setup, ++ .start = rtw_usb_start, ++ .stop = rtw_usb_stop, ++ .deep_ps = rtw_usb_deep_ps, ++ .link_ps = rtw_usb_link_ps, ++ .interface_cfg = rtw_usb_interface_cfg, ++ ++ .write8 = rtw_usb_write8, ++ .write16 = rtw_usb_write16, ++ .write32 = rtw_usb_write32, ++ .read8 = rtw_usb_read8, ++ .read16 = rtw_usb_read16, ++ .read32 = rtw_usb_read32, ++ ++ .write_data_rsvd_page = rtw_usb_write_data_rsvd_page, ++ .write_data_h2c = rtw_usb_write_data_h2c, ++}; ++ ++static int rtw_usb_init_rx(struct rtw_dev *rtwdev) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ int i; ++ ++ rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq"); ++ if (!rtwusb->rxwq) { ++ rtw_err(rtwdev, "failed to create RX work queue\n"); ++ return -ENOMEM; ++ } ++ ++ skb_queue_head_init(&rtwusb->rx_queue); ++ ++ INIT_WORK(&rtwusb->rx_work, rtw_usb_rx_handler); ++ ++ for (i = 0; i < RTW_USB_RXCB_NUM; i++) { ++ struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i]; ++ ++ rtw_usb_rx_resubmit(rtwusb, rxcb); ++ } ++ ++ return 0; ++} ++ ++static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ skb_queue_purge(&rtwusb->rx_queue); ++ ++ flush_workqueue(rtwusb->rxwq); ++ destroy_workqueue(rtwusb->rxwq); ++} ++ ++static int rtw_usb_init_tx(struct rtw_dev *rtwdev) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ int i; ++ ++ rtwusb->txwq = create_singlethread_workqueue("rtw88_usb: tx wq"); ++ if (!rtwusb->txwq) { ++ rtw_err(rtwdev, "failed to create TX work queue\n"); ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) ++ skb_queue_head_init(&rtwusb->tx_queue[i]); ++ ++ INIT_WORK(&rtwusb->tx_work, rtw_usb_tx_handler); ++ ++ return 0; ++} ++ ++static void rtw_usb_deinit_tx(struct rtw_dev *rtwdev) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ rtw_usb_tx_queue_purge(rtwusb); ++ flush_workqueue(rtwusb->txwq); ++ destroy_workqueue(rtwusb->txwq); ++} ++ ++static int rtw_usb_intf_init(struct rtw_dev *rtwdev, ++ struct usb_interface *intf) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ struct usb_device *udev = usb_get_dev(interface_to_usbdev(intf)); ++ int ret; ++ ++ rtwusb->udev = udev; ++ ret = rtw_usb_parse(rtwdev, intf); ++ if (ret) ++ return ret; ++ ++ rtwusb->usb_data = kcalloc(RTW_USB_MAX_RXTX_COUNT, sizeof(u32), ++ GFP_KERNEL); ++ if (!rtwusb->usb_data) ++ return -ENOMEM; ++ ++ usb_set_intfdata(intf, rtwdev->hw); ++ ++ SET_IEEE80211_DEV(rtwdev->hw, &intf->dev); ++ spin_lock_init(&rtwusb->usb_lock); ++ ++ return 0; ++} ++ ++static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev, ++ struct usb_interface *intf) ++{ ++ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ usb_put_dev(rtwusb->udev); ++ usb_set_intfdata(intf, NULL); ++} ++ ++int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ++{ ++ struct rtw_dev *rtwdev; ++ struct ieee80211_hw *hw; ++ struct rtw_usb *rtwusb; ++ int drv_data_size; ++ int ret; ++ ++ drv_data_size = sizeof(struct rtw_dev) + sizeof(struct rtw_usb); ++ hw = ieee80211_alloc_hw(drv_data_size, &rtw_ops); ++ if (!hw) ++ return -ENOMEM; ++ ++ rtwdev = hw->priv; ++ rtwdev->hw = hw; ++ rtwdev->dev = &intf->dev; ++ rtwdev->chip = (struct rtw_chip_info *)id->driver_info; ++ rtwdev->hci.ops = &rtw_usb_ops; ++ rtwdev->hci.type = RTW_HCI_TYPE_USB; ++ ++ rtwusb = rtw_get_usb_priv(rtwdev); ++ rtwusb->rtwdev = rtwdev; ++ ++ ret = rtw_usb_alloc_rx_bufs(rtwusb); ++ if (ret) ++ return ret; ++ ++ ret = rtw_core_init(rtwdev); ++ if (ret) ++ goto err_release_hw; ++ ++ ret = rtw_usb_intf_init(rtwdev, intf); ++ if (ret) { ++ rtw_err(rtwdev, "failed to init USB interface\n"); ++ goto err_deinit_core; ++ } ++ ++ ret = rtw_usb_init_tx(rtwdev); ++ if (ret) { ++ rtw_err(rtwdev, "failed to init USB TX\n"); ++ goto err_destroy_usb; ++ } ++ ++ ret = rtw_usb_init_rx(rtwdev); ++ if (ret) { ++ rtw_err(rtwdev, "failed to init USB RX\n"); ++ goto err_destroy_txwq; ++ } ++ ++ ret = rtw_chip_info_setup(rtwdev); ++ if (ret) { ++ rtw_err(rtwdev, "failed to setup chip information\n"); ++ goto err_destroy_rxwq; ++ } ++ ++ ret = rtw_register_hw(rtwdev, rtwdev->hw); ++ if (ret) { ++ rtw_err(rtwdev, "failed to register hw\n"); ++ goto err_destroy_rxwq; ++ } ++ ++ return 0; ++ ++err_destroy_rxwq: ++ rtw_usb_deinit_rx(rtwdev); ++ ++err_destroy_txwq: ++ rtw_usb_deinit_tx(rtwdev); ++ ++err_destroy_usb: ++ rtw_usb_intf_deinit(rtwdev, intf); ++ ++err_deinit_core: ++ rtw_core_deinit(rtwdev); ++ ++err_release_hw: ++ ieee80211_free_hw(hw); ++ ++ return ret; ++} ++EXPORT_SYMBOL(rtw_usb_probe); ++ ++void rtw_usb_disconnect(struct usb_interface *intf) ++{ ++ struct ieee80211_hw *hw = usb_get_intfdata(intf); ++ struct rtw_dev *rtwdev; ++ struct rtw_usb *rtwusb; ++ ++ if (!hw) ++ return; ++ ++ rtwdev = hw->priv; ++ rtwusb = rtw_get_usb_priv(rtwdev); ++ ++ rtw_usb_cancel_rx_bufs(rtwusb); ++ ++ rtw_unregister_hw(rtwdev, hw); ++ rtw_usb_deinit_tx(rtwdev); ++ rtw_usb_deinit_rx(rtwdev); ++ ++ if (rtwusb->udev->state != USB_STATE_NOTATTACHED) ++ usb_reset_device(rtwusb->udev); ++ ++ rtw_usb_free_rx_bufs(rtwusb); ++ ++ rtw_usb_intf_deinit(rtwdev, intf); ++ rtw_core_deinit(rtwdev); ++ ieee80211_free_hw(hw); ++} ++EXPORT_SYMBOL(rtw_usb_disconnect); ++ ++MODULE_AUTHOR("Realtek Corporation"); ++MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/usb.h linux-6.2/drivers/net/wireless/realtek/rtw88/usb.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/usb.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/usb.h 2022-12-24 00:49:25.775376835 +0200 +@@ -0,0 +1,107 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2018-2019 Realtek Corporation ++ */ ++ ++#ifndef __RTW_USB_H_ ++#define __RTW_USB_H_ ++ ++#define FW_8192C_START_ADDRESS 0x1000 ++#define FW_8192C_END_ADDRESS 0x5fff ++ ++#define RTW_USB_MAX_RXTX_COUNT 128 ++#define RTW_USB_VENQT_MAX_BUF_SIZE 254 ++#define MAX_USBCTRL_VENDORREQ_TIMES 10 ++ ++#define RTW_USB_CMD_READ 0xc0 ++#define RTW_USB_CMD_WRITE 0x40 ++#define RTW_USB_CMD_REQ 0x05 ++ ++#define RTW_USB_VENQT_CMD_IDX 0x00 ++ ++#define RTW_USB_SUPER_SPEED_BULK_SIZE 1024 ++#define RTW_USB_HIGH_SPEED_BULK_SIZE 512 ++#define RTW_USB_FULL_SPEED_BULK_SIZE 64 ++ ++#define RTW_USB_TX_SEL_HQ BIT(0) ++#define RTW_USB_TX_SEL_LQ BIT(1) ++#define RTW_USB_TX_SEL_NQ BIT(2) ++#define RTW_USB_TX_SEL_EQ BIT(3) ++ ++#define RTW_USB_BULK_IN_ADDR 0x80 ++#define RTW_USB_INT_IN_ADDR 0x81 ++ ++#define RTW_USB_HW_QUEUE_ENTRY 8 ++ ++#define RTW_USB_PACKET_OFFSET_SZ 8 ++#define RTW_USB_MAX_XMITBUF_SZ (1024 * 20) ++#define RTW_USB_MAX_RECVBUF_SZ 32768 ++ ++#define RTW_USB_RECVBUFF_ALIGN_SZ 8 ++ ++#define RTW_USB_RXAGG_SIZE 6 ++#define RTW_USB_RXAGG_TIMEOUT 10 ++ ++#define RTW_USB_RXCB_NUM 4 ++ ++#define RTW_USB_EP_MAX 4 ++ ++#define TX_DESC_QSEL_MAX 20 ++ ++#define RTW_USB_VENDOR_ID_REALTEK 0x0bda ++ ++static inline struct rtw_usb *rtw_get_usb_priv(struct rtw_dev *rtwdev) ++{ ++ return (struct rtw_usb *)rtwdev->priv; ++} ++ ++struct rx_usb_ctrl_block { ++ struct rtw_dev *rtwdev; ++ struct urb *rx_urb; ++ struct sk_buff *rx_skb; ++ int n; ++}; ++ ++struct rtw_usb_tx_data { ++ u8 sn; ++}; ++ ++struct rtw_usb { ++ struct rtw_dev *rtwdev; ++ struct usb_device *udev; ++ ++ /* protects usb_data_index */ ++ spinlock_t usb_lock; ++ __le32 *usb_data; ++ unsigned int usb_data_index; ++ ++ u32 bulkout_size; ++ u8 pipe_interrupt; ++ u8 pipe_in; ++ u8 out_ep[RTW_USB_EP_MAX]; ++ u8 qsel_to_ep[TX_DESC_QSEL_MAX]; ++ u8 usb_txagg_num; ++ ++ struct workqueue_struct *txwq, *rxwq; ++ ++ struct sk_buff_head tx_queue[RTW_USB_EP_MAX]; ++ struct work_struct tx_work; ++ ++ struct rx_usb_ctrl_block rx_cb[RTW_USB_RXCB_NUM]; ++ struct sk_buff_head rx_queue; ++ struct work_struct rx_work; ++}; ++ ++static inline struct rtw_usb_tx_data *rtw_usb_get_tx_data(struct sk_buff *skb) ++{ ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ ++ BUILD_BUG_ON(sizeof(struct rtw_usb_tx_data) > ++ sizeof(info->status.status_driver_data)); ++ ++ return (struct rtw_usb_tx_data *)info->status.status_driver_data; ++} ++ ++int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); ++void rtw_usb_disconnect(struct usb_interface *intf); ++ ++#endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/util.c linux-6.2/drivers/net/wireless/realtek/rtw88/util.c +--- linux-6.1/drivers/net/wireless/realtek/rtw88/util.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/util.c 2022-12-24 00:49:25.775376835 +0200 +@@ -105,3 +105,106 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *m + *mcs = rate - DESC_RATEMCS0; + } + } ++ ++struct rtw_stas_entry { ++ struct list_head list; ++ struct ieee80211_sta *sta; ++}; ++ ++struct rtw_iter_stas_data { ++ struct rtw_dev *rtwdev; ++ struct list_head list; ++}; ++ ++static void rtw_collect_sta_iter(void *data, struct ieee80211_sta *sta) ++{ ++ struct rtw_iter_stas_data *iter_stas = data; ++ struct rtw_stas_entry *stas_entry; ++ ++ stas_entry = kmalloc(sizeof(*stas_entry), GFP_ATOMIC); ++ if (!stas_entry) ++ return; ++ ++ stas_entry->sta = sta; ++ list_add_tail(&stas_entry->list, &iter_stas->list); ++} ++ ++void rtw_iterate_stas(struct rtw_dev *rtwdev, ++ void (*iterator)(void *data, ++ struct ieee80211_sta *sta), ++ void *data) ++{ ++ struct rtw_iter_stas_data iter_data; ++ struct rtw_stas_entry *sta_entry, *tmp; ++ ++ /* &rtwdev->mutex makes sure no stations can be removed between ++ * collecting the stations and iterating over them. ++ */ ++ lockdep_assert_held(&rtwdev->mutex); ++ ++ iter_data.rtwdev = rtwdev; ++ INIT_LIST_HEAD(&iter_data.list); ++ ++ ieee80211_iterate_stations_atomic(rtwdev->hw, rtw_collect_sta_iter, ++ &iter_data); ++ ++ list_for_each_entry_safe(sta_entry, tmp, &iter_data.list, ++ list) { ++ list_del_init(&sta_entry->list); ++ iterator(data, sta_entry->sta); ++ kfree(sta_entry); ++ } ++} ++ ++struct rtw_vifs_entry { ++ struct list_head list; ++ struct ieee80211_vif *vif; ++ u8 mac[ETH_ALEN]; ++}; ++ ++struct rtw_iter_vifs_data { ++ struct rtw_dev *rtwdev; ++ struct list_head list; ++}; ++ ++static void rtw_collect_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ++{ ++ struct rtw_iter_vifs_data *iter_stas = data; ++ struct rtw_vifs_entry *vifs_entry; ++ ++ vifs_entry = kmalloc(sizeof(*vifs_entry), GFP_ATOMIC); ++ if (!vifs_entry) ++ return; ++ ++ vifs_entry->vif = vif; ++ ether_addr_copy(vifs_entry->mac, mac); ++ list_add_tail(&vifs_entry->list, &iter_stas->list); ++} ++ ++void rtw_iterate_vifs(struct rtw_dev *rtwdev, ++ void (*iterator)(void *data, u8 *mac, ++ struct ieee80211_vif *vif), ++ void *data) ++{ ++ struct rtw_iter_vifs_data iter_data; ++ struct rtw_vifs_entry *vif_entry, *tmp; ++ ++ /* &rtwdev->mutex makes sure no interfaces can be removed between ++ * collecting the interfaces and iterating over them. ++ */ ++ lockdep_assert_held(&rtwdev->mutex); ++ ++ iter_data.rtwdev = rtwdev; ++ INIT_LIST_HEAD(&iter_data.list); ++ ++ ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, ++ IEEE80211_IFACE_ITER_NORMAL, ++ rtw_collect_vif_iter, &iter_data); ++ ++ list_for_each_entry_safe(vif_entry, tmp, &iter_data.list, ++ list) { ++ list_del_init(&vif_entry->list); ++ iterator(data, vif_entry->mac, vif_entry->vif); ++ kfree(vif_entry); ++ } ++} +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw88/util.h linux-6.2/drivers/net/wireless/realtek/rtw88/util.h +--- linux-6.1/drivers/net/wireless/realtek/rtw88/util.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw88/util.h 2022-12-24 00:49:25.775376835 +0200 +@@ -7,9 +7,6 @@ + + struct rtw_dev; + +-#define rtw_iterate_vifs(rtwdev, iterator, data) \ +- ieee80211_iterate_active_interfaces(rtwdev->hw, \ +- IEEE80211_IFACE_ITER_NORMAL, iterator, data) + #define rtw_iterate_vifs_atomic(rtwdev, iterator, data) \ + ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, \ + IEEE80211_IFACE_ITER_NORMAL, iterator, data) +@@ -20,6 +17,15 @@ struct rtw_dev; + #define rtw_iterate_keys_rcu(rtwdev, vif, iterator, data) \ + ieee80211_iter_keys_rcu((rtwdev)->hw, vif, iterator, data) + ++void rtw_iterate_vifs(struct rtw_dev *rtwdev, ++ void (*iterator)(void *data, u8 *mac, ++ struct ieee80211_vif *vif), ++ void *data); ++void rtw_iterate_stas(struct rtw_dev *rtwdev, ++ void (*iterator)(void *data, ++ struct ieee80211_sta *sta), ++ void *data); ++ + static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr) + { + __le16 fc = hdr->frame_control; diff --git a/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-8723de-alias.patch b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-8723de-alias.patch new file mode 100644 index 0000000000..17540ff279 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-8723de-alias.patch @@ -0,0 +1,14 @@ + +Replace 3rdparty 8723de driver by the new rtw88 driver. + +Add a module alias to keep upgrade path. + +Signed-off-by: Thomas Backlund + +--- a/drivers/net/wireless/realtek/rtw88/rtw8723de.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723de.c +@@ -28,3 +28,4 @@ module_pci_driver(rtw_8723de_driver); + MODULE_AUTHOR("Realtek Corporation"); + MODULE_DESCRIPTION("Realtek 802.11n wireless 8723de driver"); + MODULE_LICENSE("Dual BSD/GPL"); ++MODULE_ALIAS("8723de"); diff --git a/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-r8822be-alias.patch b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-r8822be-alias.patch new file mode 100644 index 0000000000..8e44bd0c73 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw88-add-r8822be-alias.patch @@ -0,0 +1,14 @@ + +The staging driver rtlwifi/r8822be.ko.xz is being replaced by the new rtw88 driver. + +Add a module alias to keep upgrade path. + +Signed-off-by: Thomas Backlund + +--- a/drivers/net/wireless/realtek/rtw88/rtw8822be.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822be.c +@@ -28,3 +28,4 @@ module_pci_driver(rtw_8822be_driver); + MODULE_AUTHOR("Realtek Corporation"); + MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822be driver"); + MODULE_LICENSE("Dual BSD/GPL"); ++MODULE_ALIAS("r8822be"); diff --git a/kernel/tools/perf/files/patches/mageia/net-wireless-rtw89-6.2-git.patch b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw89-6.2-git.patch new file mode 100644 index 0000000000..6941b5b6db --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/net-wireless-rtw89-6.2-git.patch @@ -0,0 +1,40911 @@ + + drivers/net/wireless/realtek/rtw89/Kconfig | 14 + drivers/net/wireless/realtek/rtw89/Makefile | 11 + drivers/net/wireless/realtek/rtw89/chan.c | 40 + drivers/net/wireless/realtek/rtw89/coex.c | 9 + drivers/net/wireless/realtek/rtw89/core.c | 100 + drivers/net/wireless/realtek/rtw89/core.h | 238 + + drivers/net/wireless/realtek/rtw89/debug.c | 1050 +++++++ + drivers/net/wireless/realtek/rtw89/debug.h | 2 + drivers/net/wireless/realtek/rtw89/fw.c | 792 +++++- + drivers/net/wireless/realtek/rtw89/fw.h | 731 +++++ + drivers/net/wireless/realtek/rtw89/mac.c | 764 ++++- + drivers/net/wireless/realtek/rtw89/mac.h | 120 + drivers/net/wireless/realtek/rtw89/mac80211.c | 70 + drivers/net/wireless/realtek/rtw89/pci.c | 41 + drivers/net/wireless/realtek/rtw89/pci.h | 12 + drivers/net/wireless/realtek/rtw89/phy.c | 356 ++ + drivers/net/wireless/realtek/rtw89/phy.h | 87 + drivers/net/wireless/realtek/rtw89/ps.c | 2 + drivers/net/wireless/realtek/rtw89/ps.h | 1 + drivers/net/wireless/realtek/rtw89/reg.h | 466 +++ + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 179 - + drivers/net/wireless/realtek/rtw89/rtw8852a.h | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 2445 ++++++++++++++++++ + drivers/net/wireless/realtek/rtw89/rtw8852b.h | 137 + + drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c | 4174 +++++++++++++++++++++++++++++++ + drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h | 25 + drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c | 794 ++++++ + drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h | 62 + drivers/net/wireless/realtek/rtw89/rtw8852b_table.c |22877 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/net/wireless/realtek/rtw89/rtw8852b_table.h | 30 + drivers/net/wireless/realtek/rtw89/rtw8852be.c | 64 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 232 - + drivers/net/wireless/realtek/rtw89/rtw8852c.h | 1 + drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c | 25 + drivers/net/wireless/realtek/rtw89/rtw8852c_table.c | 988 ++++++- + drivers/net/wireless/realtek/rtw89/txrx.h | 4 + drivers/net/wireless/realtek/rtw89/util.h | 11 + drivers/net/wireless/realtek/rtw89/wow.c | 859 ++++++ + drivers/net/wireless/realtek/rtw89/wow.h | 21 + 39 files changed, 37041 insertions(+), 794 deletions(-) + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/chan.c linux-6.2/drivers/net/wireless/realtek/rtw89/chan.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/chan.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/chan.c 2022-12-24 00:49:25.775376835 +0200 +@@ -4,6 +4,7 @@ + + #include "chan.h" + #include "debug.h" ++#include "util.h" + + static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band, + u8 center_chan) +@@ -108,8 +109,8 @@ bool rtw89_assign_entity_chan(struct rtw + const struct rtw89_chan *new) + { + struct rtw89_hal *hal = &rtwdev->hal; +- struct rtw89_chan *chan = &hal->chan[idx]; +- struct rtw89_chan_rcd *rcd = &hal->chan_rcd[idx]; ++ struct rtw89_chan *chan = &hal->sub[idx].chan; ++ struct rtw89_chan_rcd *rcd = &hal->sub[idx].rcd; + bool band_changed; + + rcd->prev_primary_channel = chan->primary_channel; +@@ -127,7 +128,7 @@ static void __rtw89_config_entity_chande + { + struct rtw89_hal *hal = &rtwdev->hal; + +- hal->chandef[idx] = *chandef; ++ hal->sub[idx].chandef = *chandef; + + if (from_stack) + set_bit(idx, hal->entity_map); +@@ -195,6 +196,7 @@ int rtw89_chanctx_ops_add(struct rtw89_d + rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); + rtw89_set_channel(rtwdev); + cfg->idx = idx; ++ hal->sub[idx].cfg = cfg; + return 0; + } + +@@ -203,8 +205,34 @@ void rtw89_chanctx_ops_remove(struct rtw + { + struct rtw89_hal *hal = &rtwdev->hal; + struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; ++ struct rtw89_vif *rtwvif; ++ u8 drop, roll; + +- clear_bit(cfg->idx, hal->entity_map); ++ drop = cfg->idx; ++ if (drop != RTW89_SUB_ENTITY_0) ++ goto out; ++ ++ roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY, drop + 1); ++ ++ /* Follow rtw89_config_default_chandef() when rtw89_entity_recalc(). */ ++ if (roll == NUM_OF_RTW89_SUB_ENTITY) ++ goto out; ++ ++ /* RTW89_SUB_ENTITY_0 is going to release, and another exists. ++ * Make another roll down to RTW89_SUB_ENTITY_0 to replace. ++ */ ++ hal->sub[roll].cfg->idx = RTW89_SUB_ENTITY_0; ++ hal->sub[RTW89_SUB_ENTITY_0] = hal->sub[roll]; ++ ++ rtw89_for_each_rtwvif(rtwdev, rtwvif) { ++ if (rtwvif->sub_entity_idx == roll) ++ rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0; ++ } ++ ++ drop = roll; ++ ++out: ++ clear_bit(drop, hal->entity_map); + rtw89_set_channel(rtwdev); + } + +@@ -225,6 +253,9 @@ int rtw89_chanctx_ops_assign_vif(struct + struct rtw89_vif *rtwvif, + struct ieee80211_chanctx_conf *ctx) + { ++ struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; ++ ++ rtwvif->sub_entity_idx = cfg->idx; + return 0; + } + +@@ -232,4 +263,5 @@ void rtw89_chanctx_ops_unassign_vif(stru + struct rtw89_vif *rtwvif, + struct ieee80211_chanctx_conf *ctx) + { ++ rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0; + } +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/coex.c linux-6.2/drivers/net/wireless/realtek/rtw89/coex.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/coex.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/coex.c 2022-12-24 00:49:25.776376835 +0200 +@@ -1809,13 +1809,18 @@ static void _set_rf_trx_para(struct rtw8 + struct rtw89_btc_dm *dm = &btc->dm; + struct rtw89_btc_wl_info *wl = &btc->cx.wl; + struct rtw89_btc_bt_info *bt = &btc->cx.bt; ++ struct rtw89_btc_bt_link_info *b = &bt->link_info; + struct rtw89_btc_rf_trx_para para; + u32 wl_stb_chg = 0; + u8 level_id = 0; + + if (!dm->freerun) { +- dm->trx_para_level = 0; +- chip->ops->btc_bt_aci_imp(rtwdev); ++ /* fix LNA2 = level-5 for BT ACI issue at BTG */ ++ if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) || ++ dm->bt_only == 1) ++ dm->trx_para_level = 1; ++ else ++ dm->trx_para_level = 0; + } + + level_id = (u8)dm->trx_para_level; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/core.c linux-6.2/drivers/net/wireless/realtek/rtw89/core.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/core.c 2022-12-31 22:58:05.366710726 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/core.c 2022-12-24 00:49:25.776376835 +0200 +@@ -171,7 +171,7 @@ bool rtw89_ra_report_to_bitrate(struct r + return true; + } + +-static struct ieee80211_supported_band rtw89_sband_2ghz = { ++static const struct ieee80211_supported_band rtw89_sband_2ghz = { + .band = NL80211_BAND_2GHZ, + .channels = rtw89_channels_2ghz, + .n_channels = ARRAY_SIZE(rtw89_channels_2ghz), +@@ -181,7 +181,7 @@ static struct ieee80211_supported_band r + .vht_cap = {0}, + }; + +-static struct ieee80211_supported_band rtw89_sband_5ghz = { ++static const struct ieee80211_supported_band rtw89_sband_5ghz = { + .band = NL80211_BAND_5GHZ, + .channels = rtw89_channels_5ghz, + .n_channels = ARRAY_SIZE(rtw89_channels_5ghz), +@@ -193,7 +193,7 @@ static struct ieee80211_supported_band r + .vht_cap = {0}, + }; + +-static struct ieee80211_supported_band rtw89_sband_6ghz = { ++static const struct ieee80211_supported_band rtw89_sband_6ghz = { + .band = NL80211_BAND_6GHZ, + .channels = rtw89_channels_6ghz, + .n_channels = ARRAY_SIZE(rtw89_channels_6ghz), +@@ -1196,7 +1196,11 @@ static void rtw89_core_parse_phy_status_ + if (phy_ppdu->rate < RTW89_HW_RATE_OFDM6) + return; + /* sign conversion for S(12,2) */ +- cfo = sign_extend32(RTW89_GET_PHY_STS_IE01_CFO(addr), 11); ++ if (rtwdev->chip->cfo_src_fd) ++ cfo = sign_extend32(RTW89_GET_PHY_STS_IE01_FD_CFO(addr), 11); ++ else ++ cfo = sign_extend32(RTW89_GET_PHY_STS_IE01_PREMB_CFO(addr), 11); ++ + rtw89_phy_cfo_parse(rtwdev, cfo, phy_ppdu); + } + +@@ -1255,6 +1259,9 @@ static int rtw89_core_rx_parse_phy_sts(s + if (phy_ppdu->ie < RTW89_CCK_PKT) + return -EINVAL; + ++ if (!phy_ppdu->to_self) ++ return 0; ++ + pos = (u8 *)phy_ppdu->buf + PHY_STS_HDR_LEN; + end = (u8 *)phy_ppdu->buf + phy_ppdu->len; + while (pos < end) { +@@ -1398,6 +1405,9 @@ static void rtw89_vif_rx_stats_iter(void + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + const u8 *bssid = iter_data->bssid; + ++ if (!vif->bss_conf.bssid) ++ return; ++ + if (ieee80211_is_trigger(hdr->frame_control)) { + rtw89_stats_trigger_frame(rtwdev, vif, skb); + return; +@@ -1470,6 +1480,27 @@ static void rtw89_core_hw_to_sband_rate( + rx_status->rate_idx -= 4; + } + ++static void rtw89_core_update_radiotap(struct rtw89_dev *rtwdev, ++ struct sk_buff *skb, ++ struct ieee80211_rx_status *rx_status) ++{ ++ static const struct ieee80211_radiotap_he known_he = { ++ .data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN | ++ IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN), ++ .data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN), ++ }; ++ struct ieee80211_radiotap_he *he; ++ ++ if (!(rtwdev->hw->conf.flags & IEEE80211_CONF_MONITOR)) ++ return; ++ ++ if (rx_status->encoding == RX_ENC_HE) { ++ rx_status->flag |= RX_FLAG_RADIOTAP_HE; ++ he = skb_push(skb, sizeof(*he)); ++ *he = known_he; ++ } ++} ++ + static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev, + struct rtw89_rx_phy_ppdu *phy_ppdu, + struct rtw89_rx_desc_info *desc_info, +@@ -1484,6 +1515,7 @@ static void rtw89_core_rx_to_mac80211(st + + rtw89_core_hw_to_sband_rate(rx_status); + rtw89_core_rx_stats(rtwdev, phy_ppdu, desc_info, skb_ppdu); ++ rtw89_core_update_radiotap(rtwdev, skb_ppdu, rx_status); + /* In low power mode, it does RX in thread context. */ + local_bh_disable(); + ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, napi); +@@ -2201,6 +2233,9 @@ static void rtw89_track_work(struct work + track_work.work); + bool tfc_changed; + ++ if (test_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags)) ++ return; ++ + mutex_lock(&rtwdev->mutex); + + if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags)) +@@ -2227,6 +2262,7 @@ static void rtw89_track_work(struct work + rtw89_phy_ra_update(rtwdev); + rtw89_phy_cfo_track(rtwdev); + rtw89_phy_tx_path_div_track(rtwdev); ++ rtw89_phy_ul_tb_ctrl_track(rtwdev); + + if (rtwdev->lps_enabled && !rtwdev->btc.lps) + rtw89_enter_lps_track(rtwdev); +@@ -2375,6 +2411,8 @@ void rtw89_vif_type_mapping(struct ieee8 + rtwvif->self_role = RTW89_SELF_ROLE_CLIENT; + rtwvif->addr_cam.sec_ent_mode = RTW89_ADDR_CAM_SEC_NORMAL; + break; ++ case NL80211_IFTYPE_MONITOR: ++ break; + default: + WARN_ON(1); + break; +@@ -2410,6 +2448,8 @@ int rtw89_core_sta_add(struct rtw89_dev + } else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { + rtwsta->mac_id = rtw89_core_acquire_bit_map(rtwdev->mac_id_map, + RTW89_MAX_MAC_ID_NUM); ++ if (rtwsta->mac_id == RTW89_MAX_MAC_ID_NUM) ++ return -ENOSPC; + } + + return 0; +@@ -2548,6 +2588,7 @@ int rtw89_core_sta_assoc(struct rtw89_de + rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, + BTC_ROLE_MSTS_STA_CONN_END); + rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template); ++ rtw89_phy_ul_tb_assoc(rtwdev, rtwvif); + } + + return ret; +@@ -2933,6 +2974,41 @@ void rtw89_core_update_beacon_work(struc + mutex_unlock(&rtwdev->mutex); + } + ++int rtw89_wait_for_cond(struct rtw89_wait_info *wait, unsigned int cond) ++{ ++ struct completion *cmpl = &wait->completion; ++ unsigned long timeout; ++ unsigned int cur; ++ ++ cur = atomic_cmpxchg(&wait->cond, RTW89_WAIT_COND_IDLE, cond); ++ if (cur != RTW89_WAIT_COND_IDLE) ++ return -EBUSY; ++ ++ timeout = wait_for_completion_timeout(cmpl, RTW89_WAIT_FOR_COND_TIMEOUT); ++ if (timeout == 0) { ++ atomic_set(&wait->cond, RTW89_WAIT_COND_IDLE); ++ return -ETIMEDOUT; ++ } ++ ++ if (wait->data.err) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++void rtw89_complete_cond(struct rtw89_wait_info *wait, unsigned int cond, ++ const struct rtw89_completion_data *data) ++{ ++ unsigned int cur; ++ ++ cur = atomic_cmpxchg(&wait->cond, cond, RTW89_WAIT_COND_IDLE); ++ if (cur != cond) ++ return; ++ ++ wait->data = *data; ++ complete(&wait->completion); ++} ++ + int rtw89_core_start(struct rtw89_dev *rtwdev) + { + int ret; +@@ -2957,7 +3033,7 @@ int rtw89_core_start(struct rtw89_dev *r + return ret; + + rtw89_phy_init_bb_reg(rtwdev); +- rtw89_phy_init_rf_reg(rtwdev); ++ rtw89_phy_init_rf_reg(rtwdev, false); + + rtw89_btc_ntfy_init(rtwdev, BTC_MODE_NORMAL); + +@@ -3037,6 +3113,7 @@ int rtw89_core_init(struct rtw89_dev *rt + continue; + INIT_LIST_HEAD(&rtwdev->scan_info.pkt_list[band]); + } ++ INIT_LIST_HEAD(&rtwdev->wow.pkt_list); + INIT_WORK(&rtwdev->ba_work, rtw89_core_ba_work); + INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work); + INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work); +@@ -3053,6 +3130,8 @@ int rtw89_core_init(struct rtw89_dev *rt + mutex_init(&rtwdev->rf_mutex); + rtwdev->total_sta_assoc = 0; + ++ rtw89_init_wait(&rtwdev->mcc.wait); ++ + INIT_WORK(&rtwdev->c2h_work, rtw89_fw_c2h_work); + INIT_WORK(&rtwdev->ips_work, rtw89_ips_work); + skb_queue_head_init(&rtwdev->c2h_queue); +@@ -3251,6 +3330,7 @@ static int rtw89_core_register_hw(struct + ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); + ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); + ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); ++ ieee80211_hw_set(hw, WANT_MONITOR_VIF); + + hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | + BIT(NL80211_IFTYPE_AP) | +@@ -3268,6 +3348,10 @@ static int rtw89_core_register_hw(struct + hw->wiphy->max_scan_ssids = RTW89_SCANOFLD_MAX_SSID; + hw->wiphy->max_scan_ie_len = RTW89_SCANOFLD_MAX_IE_LEN; + ++#ifdef CONFIG_PM ++ hw->wiphy->wowlan = rtwdev->chip->wowlan_stub; ++#endif ++ + hw->wiphy->tid_config_support.vif |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); + hw->wiphy->tid_config_support.peer |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); + hw->wiphy->tid_config_support.vif |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); +@@ -3336,6 +3420,7 @@ struct rtw89_dev *rtw89_alloc_ieee80211_ + u32 bus_data_size, + const struct rtw89_chip_info *chip) + { ++ const struct firmware *firmware; + struct ieee80211_hw *hw; + struct rtw89_dev *rtwdev; + struct ieee80211_ops *ops; +@@ -3343,7 +3428,7 @@ struct rtw89_dev *rtw89_alloc_ieee80211_ + u32 early_feat_map = 0; + bool no_chanctx; + +- rtw89_early_fw_feature_recognize(device, chip, &early_feat_map); ++ firmware = rtw89_early_fw_feature_recognize(device, chip, &early_feat_map); + + ops = kmemdup(&rtw89_ops, sizeof(rtw89_ops), GFP_KERNEL); + if (!ops) +@@ -3370,6 +3455,7 @@ struct rtw89_dev *rtw89_alloc_ieee80211_ + rtwdev->dev = device; + rtwdev->ops = ops; + rtwdev->chip = chip; ++ rtwdev->fw.firmware = firmware; + + rtw89_debug(rtwdev, RTW89_DBG_FW, "probe driver %s chanctx\n", + no_chanctx ? "without" : "with"); +@@ -3378,6 +3464,7 @@ struct rtw89_dev *rtw89_alloc_ieee80211_ + + err: + kfree(ops); ++ release_firmware(firmware); + return NULL; + } + EXPORT_SYMBOL(rtw89_alloc_ieee80211_hw); +@@ -3385,6 +3472,7 @@ EXPORT_SYMBOL(rtw89_alloc_ieee80211_hw); + void rtw89_free_ieee80211_hw(struct rtw89_dev *rtwdev) + { + kfree(rtwdev->ops); ++ release_firmware(rtwdev->fw.firmware); + ieee80211_free_hw(rtwdev->hw); + } + EXPORT_SYMBOL(rtw89_free_ieee80211_hw); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/core.h linux-6.2/drivers/net/wireless/realtek/rtw89/core.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/core.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/core.h 2022-12-24 00:49:25.777376835 +0200 +@@ -35,6 +35,7 @@ extern const struct ieee80211_ops rtw89_ + #define RSSI_FACTOR 1 + #define RTW89_RSSI_RAW_TO_DBM(rssi) ((s8)((rssi) >> RSSI_FACTOR) - MAX_RSSI) + #define RTW89_TX_DIV_RSSI_RAW_TH (2 << RSSI_FACTOR) ++#define RTW89_RADIOTAP_ROOM ALIGN(sizeof(struct ieee80211_radiotap_he), 64) + + #define RTW89_HTC_MASK_VARIANT GENMASK(1, 0) + #define RTW89_HTC_VARIANT_HE 3 +@@ -84,6 +85,7 @@ enum rtw89_subband { + RTW89_CH_6G_BAND_IDX7, /* Ultra-high */ + + RTW89_SUBBAND_NR, ++ RTW89_SUBBAND_2GHZ_5GHZ_NR = RTW89_CH_5G_BAND_4 + 1, + }; + + enum rtw89_gain_offset { +@@ -177,7 +179,9 @@ enum rtw89_upd_mode { + RTW89_ROLE_REMOVE, + RTW89_ROLE_TYPE_CHANGE, + RTW89_ROLE_INFO_CHANGE, +- RTW89_ROLE_CON_DISCONN ++ RTW89_ROLE_CON_DISCONN, ++ RTW89_ROLE_BAND_SW, ++ RTW89_ROLE_FW_RESTORE, + }; + + enum rtw89_self_role { +@@ -476,6 +480,20 @@ enum rtw89_regulation_type { + RTW89_REGD_NUM, + }; + ++enum rtw89_fw_pkt_ofld_type { ++ RTW89_PKT_OFLD_TYPE_PROBE_RSP = 0, ++ RTW89_PKT_OFLD_TYPE_PS_POLL = 1, ++ RTW89_PKT_OFLD_TYPE_NULL_DATA = 2, ++ RTW89_PKT_OFLD_TYPE_QOS_NULL = 3, ++ RTW89_PKT_OFLD_TYPE_CTS2SELF = 4, ++ RTW89_PKT_OFLD_TYPE_ARP_RSP = 5, ++ RTW89_PKT_OFLD_TYPE_NDP = 6, ++ RTW89_PKT_OFLD_TYPE_EAPOL_KEY = 7, ++ RTW89_PKT_OFLD_TYPE_SA_QUERY = 8, ++ RTW89_PKT_OFLD_TYPE_PROBE_REQ = 12, ++ RTW89_PKT_OFLD_TYPE_NUM, ++}; ++ + struct rtw89_txpwr_byrate { + s8 cck[RTW89_RATE_CCK_MAX]; + s8 ofdm[RTW89_RATE_OFDM_MAX]; +@@ -490,6 +508,8 @@ enum rtw89_bandwidth_section_num { + RTW89_BW80_SEC_NUM = 2, + }; + ++#define RTW89_TXPWR_LMT_PAGE_SIZE 40 ++ + struct rtw89_txpwr_limit { + s8 cck_20m[RTW89_BF_NUM]; + s8 cck_40m[RTW89_BF_NUM]; +@@ -504,6 +524,8 @@ struct rtw89_txpwr_limit { + + #define RTW89_RU_SEC_NUM 8 + ++#define RTW89_TXPWR_LMT_RU_PAGE_SIZE 24 ++ + struct rtw89_txpwr_limit_ru { + s8 ru26[RTW89_RU_SEC_NUM]; + s8 ru52[RTW89_RU_SEC_NUM]; +@@ -631,6 +653,13 @@ enum rtw89_sc_offset { + RTW89_SC_40_LOWER = 10, + }; + ++enum rtw89_wow_flags { ++ RTW89_WOW_FLAG_EN_MAGIC_PKT, ++ RTW89_WOW_FLAG_EN_REKEY_PKT, ++ RTW89_WOW_FLAG_EN_DISCONNECT, ++ RTW89_WOW_FLAG_NUM, ++}; ++ + struct rtw89_chan { + u8 channel; + u8 primary_channel; +@@ -2192,6 +2221,7 @@ struct rtw89_sta { + + struct rtw89_efuse { + bool valid; ++ bool power_k_valid; + u8 xtal_cap; + u8 addr[ETH_ALEN]; + u8 rfe_type; +@@ -2210,6 +2240,8 @@ struct rtw89_phy_rate_pattern { + struct rtw89_vif { + struct list_head list; + struct rtw89_dev *rtwdev; ++ enum rtw89_sub_entity_idx sub_entity_idx; ++ + u8 mac_id; + u8 port; + u8 mac_addr[ETH_ALEN]; +@@ -2232,6 +2264,8 @@ struct rtw89_vif { + bool wowlan_magic; + bool is_hesta; + bool last_a_ctrl; ++ bool dyn_tb_bedge_en; ++ u8 def_tri_idx; + struct work_struct update_beacon_work; + struct rtw89_addr_cam_entry addr_cam; + struct rtw89_bssid_cam_entry bssid_cam; +@@ -2280,6 +2314,16 @@ struct rtw89_hci_ops { + */ + void (*recovery_start)(struct rtw89_dev *rtwdev); + void (*recovery_complete)(struct rtw89_dev *rtwdev); ++ ++ void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable); ++ void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable); ++ void (*ctrl_trxhci)(struct rtw89_dev *rtwdev, bool enable); ++ int (*poll_txdma_ch)(struct rtw89_dev *rtwdev); ++ void (*clr_idx_all)(struct rtw89_dev *rtwdev); ++ void (*clear)(struct rtw89_dev *rtwdev, struct pci_dev *pdev); ++ void (*disable_intr)(struct rtw89_dev *rtwdev); ++ void (*enable_intr)(struct rtw89_dev *rtwdev); ++ int (*rst_bdram)(struct rtw89_dev *rtwdev); + }; + + struct rtw89_hci_info { +@@ -2357,7 +2401,6 @@ struct rtw89_chip_ops { + void (*btc_set_wl_pri)(struct rtw89_dev *rtwdev, u8 map, bool state); + void (*btc_set_wl_txpwr_ctrl)(struct rtw89_dev *rtwdev, u32 txpwr_val); + s8 (*btc_get_bt_rssi)(struct rtw89_dev *rtwdev, s8 val); +- void (*btc_bt_aci_imp)(struct rtw89_dev *rtwdev); + void (*btc_update_bt_cnt)(struct rtw89_dev *rtwdev); + void (*btc_wl_s1_standby)(struct rtw89_dev *rtwdev, bool state); + void (*btc_set_policy)(struct rtw89_dev *rtwdev, u16 policy_type); +@@ -2384,6 +2427,7 @@ enum rtw89_dma_ch { + enum rtw89_qta_mode { + RTW89_QTA_SCC, + RTW89_QTA_DLFW, ++ RTW89_QTA_WOW, + + /* keep last */ + RTW89_QTA_INVALID, +@@ -2607,6 +2651,11 @@ struct rtw89_dig_regs { + struct rtw89_reg_def p1_s20_pagcugc_en; + }; + ++struct rtw89_phy_ul_tb_info { ++ bool dyn_tb_tri_en; ++ u8 def_if_bandedge; ++}; ++ + struct rtw89_chip_info { + enum rtw89_core_chip_id chip_id; + const struct rtw89_chip_ops *ops; +@@ -2618,10 +2667,13 @@ struct rtw89_chip_info { + u32 rsvd_ple_ofst; + const struct rtw89_hfc_param_ini *hfc_param_ini; + const struct rtw89_dle_mem *dle_mem; ++ u8 wde_qempty_acq_num; ++ u8 wde_qempty_mgq_sel; + u32 rf_base_addr[2]; + u8 support_chanctx_num; + u8 support_bands; + bool support_bw160; ++ bool support_ul_tb_ctrl; + bool hw_sec_hdr; + u8 rf_path_num; + u8 tx_nss; +@@ -2714,11 +2766,13 @@ struct rtw89_chip_info { + u32 c2h_ctrl_reg; + const u32 *c2h_regs; + const struct rtw89_page_regs *page_regs; ++ bool cfo_src_fd; + const struct rtw89_reg_def *dcfo_comp; + u8 dcfo_comp_sft; + const struct rtw89_imr_info *imr_info; + const struct rtw89_rrsr_cfgs *rrsr_cfgs; + u32 dma_ch_mask; ++ const struct wiphy_wowlan_support *wowlan_stub; + }; + + union rtw89_bus_info { +@@ -2760,6 +2814,28 @@ struct rtw89_mac_info { + u8 cpwm_seq_num; + }; + ++#define RTW89_COMPLETION_BUF_SIZE 24 ++#define RTW89_WAIT_COND_IDLE UINT_MAX ++ ++struct rtw89_completion_data { ++ bool err; ++ u8 buf[RTW89_COMPLETION_BUF_SIZE]; ++}; ++ ++struct rtw89_wait_info { ++ atomic_t cond; ++ struct completion completion; ++ struct rtw89_completion_data data; ++}; ++ ++#define RTW89_WAIT_FOR_COND_TIMEOUT msecs_to_jiffies(100) ++ ++static inline void rtw89_init_wait(struct rtw89_wait_info *wait) ++{ ++ init_completion(&wait->completion); ++ atomic_set(&wait->cond, RTW89_WAIT_COND_IDLE); ++} ++ + enum rtw89_fw_type { + RTW89_FW_NORMAL = 1, + RTW89_FW_WOWLAN = 3, +@@ -2879,6 +2955,13 @@ enum rtw89_entity_mode { + RTW89_ENTITY_MODE_SCC, + }; + ++struct rtw89_sub_entity { ++ struct cfg80211_chan_def chandef; ++ struct rtw89_chan chan; ++ struct rtw89_chan_rcd rcd; ++ struct rtw89_chanctx_cfg *cfg; ++}; ++ + struct rtw89_hal { + u32 rx_fltr; + u8 cv; +@@ -2892,13 +2975,10 @@ struct rtw89_hal { + bool support_igi; + + DECLARE_BITMAP(entity_map, NUM_OF_RTW89_SUB_ENTITY); +- struct cfg80211_chan_def chandef[NUM_OF_RTW89_SUB_ENTITY]; ++ struct rtw89_sub_entity sub[NUM_OF_RTW89_SUB_ENTITY]; + + bool entity_active; + enum rtw89_entity_mode entity_mode; +- +- struct rtw89_chan chan[NUM_OF_RTW89_SUB_ENTITY]; +- struct rtw89_chan_rcd chan_rcd[NUM_OF_RTW89_SUB_ENTITY]; + }; + + #define RTW89_MAX_MAC_ID_NUM 128 +@@ -2915,6 +2995,9 @@ enum rtw89_flags { + RTW89_FLAG_LOW_POWER_MODE, + RTW89_FLAG_INACTIVE_PS, + RTW89_FLAG_CRASH_SIMULATING, ++ RTW89_FLAG_WOWLAN, ++ RTW89_FLAG_FORBIDDEN_TRACK_WROK, ++ RTW89_FLAG_CHANGING_INTERFACE, + + NUM_OF_RTW89_FLAGS, + }; +@@ -2943,6 +3026,7 @@ struct rtw89_pkt_drop_params { + u8 port; + u8 mbssid; + bool tf_trs; ++ u32 macid_band_sel[4]; + }; + + struct rtw89_pkt_stat { +@@ -2976,7 +3060,7 @@ struct rtw89_dack_info { + #define RTW89_IQK_CHS_NR 2 + #define RTW89_IQK_PATH_NR 4 + +-struct rtw89_mcc_info { ++struct rtw89_rfk_mcc_info { + u8 ch[RTW89_IQK_CHS_NR]; + u8 band[RTW89_IQK_CHS_NR]; + u8 table_idx; +@@ -3044,6 +3128,7 @@ struct rtw89_dpk_bkup_para { + struct rtw89_dpk_info { + bool is_dpk_enable; + bool is_dpk_reload_en; ++ u8 dpk_gs[RTW89_PHY_MAX]; + u16 dc_i[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM]; + u16 dc_q[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM]; + u8 corr_val[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM]; +@@ -3159,6 +3244,14 @@ struct rtw89_cfo_tracking_info { + u8 lock_cnt; + }; + ++enum rtw89_tssi_alimk_band { ++ TSSI_ALIMK_2G = 0, ++ TSSI_ALIMK_5GL, ++ TSSI_ALIMK_5GM, ++ TSSI_ALIMK_5GH, ++ TSSI_ALIMK_MAX ++}; ++ + /* 2GL, 2GH, 5GL1, 5GH1, 5GM1, 5GM2, 5GH1, 5GH2 */ + #define TSSI_TRIM_CH_GROUP_NUM 8 + #define TSSI_TRIM_CH_GROUP_NUM_6G 16 +@@ -3169,6 +3262,8 @@ struct rtw89_cfo_tracking_info { + #define TSSI_MCS_6G_CH_GROUP_NUM 32 + #define TSSI_MCS_CH_GROUP_NUM \ + (TSSI_MCS_2G_CH_GROUP_NUM + TSSI_MCS_5G_CH_GROUP_NUM) ++#define TSSI_MAX_CH_NUM 67 ++#define TSSI_ALIMK_VALUE_NUM 8 + + struct rtw89_tssi_info { + u8 thermal[RF_PATH_MAX]; +@@ -3181,6 +3276,11 @@ struct rtw89_tssi_info { + bool tssi_tracking_check[RF_PATH_MAX]; + u8 default_txagc_offset[RF_PATH_MAX]; + u32 base_thermal[RF_PATH_MAX]; ++ bool check_backup_aligmk[RF_PATH_MAX][TSSI_MAX_CH_NUM]; ++ u32 alignment_backup_by_ch[RF_PATH_MAX][TSSI_MAX_CH_NUM][TSSI_ALIMK_VALUE_NUM]; ++ u32 alignment_value[RF_PATH_MAX][TSSI_ALIMK_MAX][TSSI_ALIMK_VALUE_NUM]; ++ bool alignment_done[RF_PATH_MAX][TSSI_ALIMK_MAX]; ++ u32 tssi_alimk_time; + }; + + struct rtw89_power_trim_info { +@@ -3421,8 +3521,40 @@ struct rtw89_phy_bb_gain_info { + + struct rtw89_phy_efuse_gain { + bool offset_valid; ++ bool comp_valid; + s8 offset[RF_PATH_MAX][RTW89_GAIN_OFFSET_NR]; /* S(8, 0) */ + s8 offset_base[RTW89_PHY_MAX]; /* S(8, 4) */ ++ s8 rssi_base[RTW89_PHY_MAX]; /* S(8, 4) */ ++ s8 comp[RF_PATH_MAX][RTW89_SUBBAND_NR]; /* S(8, 0) */ ++}; ++ ++#define RTW89_MAX_PATTERN_NUM 18 ++#define RTW89_MAX_PATTERN_MASK_SIZE 4 ++#define RTW89_MAX_PATTERN_SIZE 128 ++ ++struct rtw89_wow_cam_info { ++ bool r_w; ++ u8 idx; ++ u32 mask[RTW89_MAX_PATTERN_MASK_SIZE]; ++ u16 crc; ++ bool negative_pattern_match; ++ bool skip_mac_hdr; ++ bool uc; ++ bool mc; ++ bool bc; ++ bool valid; ++}; ++ ++struct rtw89_wow_param { ++ struct ieee80211_vif *wow_vif; ++ DECLARE_BITMAP(flags, RTW89_WOW_FLAG_NUM); ++ struct rtw89_wow_cam_info patterns[RTW89_MAX_PATTERN_NUM]; ++ u8 pattern_cnt; ++ struct list_head pkt_list; ++}; ++ ++struct rtw89_mcc_info { ++ struct rtw89_wait_info wait; + }; + + struct rtw89_dev { +@@ -3435,6 +3567,7 @@ struct rtw89_dev { + const struct rtw89_chip_info *chip; + const struct rtw89_pci_info *pci_info; + struct rtw89_hal hal; ++ struct rtw89_mcc_info mcc; + struct rtw89_mac_info mac; + struct rtw89_fw_info fw; + struct rtw89_hci_info hci; +@@ -3478,7 +3611,7 @@ struct rtw89_dev { + struct rtw89_dack_info dack; + struct rtw89_iqk_info iqk; + struct rtw89_dpk_info dpk; +- struct rtw89_mcc_info mcc; ++ struct rtw89_rfk_mcc_info rfk_mcc; + struct rtw89_lck_info lck; + struct rtw89_rx_dck_info rx_dck; + bool is_tssi_mode[RF_PATH_MAX]; +@@ -3495,6 +3628,7 @@ struct rtw89_dev { + struct rtw89_phy_ch_info ch_info; + struct rtw89_phy_bb_gain_info bb_gain; + struct rtw89_phy_efuse_gain efuse_gain; ++ struct rtw89_phy_ul_tb_info ul_tb_info; + + struct delayed_work track_work; + struct delayed_work coex_act1_work; +@@ -3513,6 +3647,8 @@ struct rtw89_dev { + enum rtw89_ps_mode ps_mode; + bool lps_enabled; + ++ struct rtw89_wow_param wow; ++ + /* napi structure */ + struct net_device netdev; + struct napi_struct napi; +@@ -3595,6 +3731,66 @@ static inline void rtw89_hci_recovery_co + rtwdev->hci.ops->recovery_complete(rtwdev); + } + ++static inline void rtw89_hci_enable_intr(struct rtw89_dev *rtwdev) ++{ ++ if (rtwdev->hci.ops->enable_intr) ++ rtwdev->hci.ops->enable_intr(rtwdev); ++} ++ ++static inline void rtw89_hci_disable_intr(struct rtw89_dev *rtwdev) ++{ ++ if (rtwdev->hci.ops->disable_intr) ++ rtwdev->hci.ops->disable_intr(rtwdev); ++} ++ ++static inline void rtw89_hci_ctrl_txdma_ch(struct rtw89_dev *rtwdev, bool enable) ++{ ++ if (rtwdev->hci.ops->ctrl_txdma_ch) ++ rtwdev->hci.ops->ctrl_txdma_ch(rtwdev, enable); ++} ++ ++static inline void rtw89_hci_ctrl_txdma_fw_ch(struct rtw89_dev *rtwdev, bool enable) ++{ ++ if (rtwdev->hci.ops->ctrl_txdma_fw_ch) ++ rtwdev->hci.ops->ctrl_txdma_fw_ch(rtwdev, enable); ++} ++ ++static inline void rtw89_hci_ctrl_trxhci(struct rtw89_dev *rtwdev, bool enable) ++{ ++ if (rtwdev->hci.ops->ctrl_trxhci) ++ rtwdev->hci.ops->ctrl_trxhci(rtwdev, enable); ++} ++ ++static inline int rtw89_hci_poll_txdma_ch(struct rtw89_dev *rtwdev) ++{ ++ int ret = 0; ++ ++ if (rtwdev->hci.ops->poll_txdma_ch) ++ ret = rtwdev->hci.ops->poll_txdma_ch(rtwdev); ++ return ret; ++} ++ ++static inline void rtw89_hci_clr_idx_all(struct rtw89_dev *rtwdev) ++{ ++ if (rtwdev->hci.ops->clr_idx_all) ++ rtwdev->hci.ops->clr_idx_all(rtwdev); ++} ++ ++static inline int rtw89_hci_rst_bdram(struct rtw89_dev *rtwdev) ++{ ++ int ret = 0; ++ ++ if (rtwdev->hci.ops->rst_bdram) ++ ret = rtwdev->hci.ops->rst_bdram(rtwdev); ++ return ret; ++} ++ ++static inline void rtw89_hci_clear(struct rtw89_dev *rtwdev, struct pci_dev *pdev) ++{ ++ if (rtwdev->hci.ops->clear) ++ rtwdev->hci.ops->clear(rtwdev, pdev); ++} ++ + static inline u8 rtw89_read8(struct rtw89_dev *rtwdev, u32 addr) + { + return rtwdev->hci.ops->read8(rtwdev, addr); +@@ -3948,7 +4144,7 @@ const struct cfg80211_chan_def *rtw89_ch + { + struct rtw89_hal *hal = &rtwdev->hal; + +- return &hal->chandef[idx]; ++ return &hal->sub[idx].chandef; + } + + static inline +@@ -3957,7 +4153,7 @@ const struct rtw89_chan *rtw89_chan_get( + { + struct rtw89_hal *hal = &rtwdev->hal; + +- return &hal->chan[idx]; ++ return &hal->sub[idx].chan; + } + + static inline +@@ -3966,7 +4162,7 @@ const struct rtw89_chan_rcd *rtw89_chan_ + { + struct rtw89_hal *hal = &rtwdev->hal; + +- return &hal->chan_rcd[idx]; ++ return &hal->sub[idx].rcd; + } + + static inline void rtw89_chip_fem_setup(struct rtw89_dev *rtwdev) +@@ -4221,6 +4417,23 @@ static inline struct rtw89_fw_suit *rtw8 + return &fw_info->normal; + } + ++static inline struct sk_buff *rtw89_alloc_skb_for_rx(struct rtw89_dev *rtwdev, ++ unsigned int length) ++{ ++ struct sk_buff *skb; ++ ++ if (rtwdev->hw->conf.flags & IEEE80211_CONF_MONITOR) { ++ skb = dev_alloc_skb(length + RTW89_RADIOTAP_ROOM); ++ if (!skb) ++ return NULL; ++ ++ skb_reserve(skb, RTW89_RADIOTAP_ROOM); ++ return skb; ++ } ++ ++ return dev_alloc_skb(length); ++} ++ + int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, + struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel); + int rtw89_h2c_tx(struct rtw89_dev *rtwdev, +@@ -4289,6 +4502,9 @@ int rtw89_regd_init(struct rtw89_dev *rt + void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request); + void rtw89_traffic_stats_init(struct rtw89_dev *rtwdev, + struct rtw89_traffic_stats *stats); ++int rtw89_wait_for_cond(struct rtw89_wait_info *wait, unsigned int cond); ++void rtw89_complete_cond(struct rtw89_wait_info *wait, unsigned int cond, ++ const struct rtw89_completion_data *data); + int rtw89_core_start(struct rtw89_dev *rtwdev); + void rtw89_core_stop(struct rtw89_dev *rtwdev); + void rtw89_core_update_beacon_work(struct work_struct *work); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/debug.c linux-6.2/drivers/net/wireless/realtek/rtw89/debug.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/debug.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/debug.c 2022-12-24 00:49:25.778376835 +0200 +@@ -8,6 +8,7 @@ + #include "debug.h" + #include "fw.h" + #include "mac.h" ++#include "pci.h" + #include "ps.h" + #include "reg.h" + #include "sar.h" +@@ -51,6 +52,22 @@ struct rtw89_debugfs_priv { + }; + }; + ++static const u16 rtw89_rate_info_bw_to_mhz_map[] = { ++ [RATE_INFO_BW_20] = 20, ++ [RATE_INFO_BW_40] = 40, ++ [RATE_INFO_BW_80] = 80, ++ [RATE_INFO_BW_160] = 160, ++ [RATE_INFO_BW_320] = 320, ++}; ++ ++static u16 rtw89_rate_info_bw_to_mhz(enum rate_info_bw bw) ++{ ++ if (bw < ARRAY_SIZE(rtw89_rate_info_bw_to_mhz_map)) ++ return rtw89_rate_info_bw_to_mhz_map[bw]; ++ ++ return 0; ++} ++ + static int rtw89_debugfs_single_show(struct seq_file *m, void *v) + { + struct rtw89_debugfs_priv *debugfs_priv = m->private; +@@ -464,7 +481,7 @@ static const struct txpwr_map __txpwr_ma + }; + + static u8 __print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent, +- const u8 *buf, const u8 cur) ++ const s8 *buf, const u8 cur) + { + char *fmt; + +@@ -493,8 +510,9 @@ static int __print_txpwr_map(struct seq_ + const struct txpwr_map *map) + { + u8 fct = rtwdev->chip->txpwr_factor_mac; +- u8 *buf, cur, i; + u32 val, addr; ++ s8 *buf, tmp; ++ u8 cur, i; + int ret; + + buf = vzalloc(map->addr_to - map->addr_from + 4); +@@ -507,8 +525,11 @@ static int __print_txpwr_map(struct seq_ + val = MASKDWORD; + + cur = addr - map->addr_from; +- for (i = 0; i < 4; i++, val >>= 8) +- buf[cur + i] = FIELD_GET(MASKBYTE0, val) >> fct; ++ for (i = 0; i < 4; i++, val >>= 8) { ++ /* signed 7 bits, and reserved BIT(7) */ ++ tmp = sign_extend32(val, 6); ++ buf[cur + i] = tmp >> fct; ++ } + } + + for (cur = 0, i = 0; i < map->size; i++) +@@ -770,13 +791,34 @@ rtw89_debug_priv_mac_mem_dump_get(struct + { + struct rtw89_debugfs_priv *debugfs_priv = m->private; + struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; ++ bool grant_read = false; ++ ++ if (debugfs_priv->mac_mem.sel >= RTW89_MAC_MEM_NUM) ++ return -ENOENT; ++ ++ if (rtwdev->chip->chip_id == RTL8852C) { ++ switch (debugfs_priv->mac_mem.sel) { ++ case RTW89_MAC_MEM_TXD_FIFO_0_V1: ++ case RTW89_MAC_MEM_TXD_FIFO_1_V1: ++ case RTW89_MAC_MEM_TXDATA_FIFO_0: ++ case RTW89_MAC_MEM_TXDATA_FIFO_1: ++ grant_read = true; ++ break; ++ default: ++ break; ++ } ++ } + + mutex_lock(&rtwdev->mutex); + rtw89_leave_ps_mode(rtwdev); ++ if (grant_read) ++ rtw89_write32_set(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO); + rtw89_debug_dump_mac_mem(m, rtwdev, + debugfs_priv->mac_mem.sel, + debugfs_priv->mac_mem.start, + debugfs_priv->mac_mem.len); ++ if (grant_read) ++ rtw89_write32_clr(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO); + mutex_unlock(&rtwdev->mutex); + + return 0; +@@ -947,7 +989,9 @@ static int rtw89_debug_mac_dump_dle_dbg( + static int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev, + struct seq_file *m) + { +- int ret; ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ u32 dmac_err; ++ int i, ret; + + ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL); + if (ret) { +@@ -955,98 +999,347 @@ static int rtw89_debug_mac_dump_dmac_dbg + return ret; + } + +- seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR)); +- seq_printf(m, "[0]R_AX_WDRLS_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR)); +- seq_printf(m, "[1]R_AX_SEC_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_ERR_IMR_ISR)); +- seq_printf(m, "[2.1]R_AX_MPDU_TX_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR)); +- seq_printf(m, "[2.2]R_AX_MPDU_RX_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR)); +- seq_printf(m, "[3]R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR)); +- seq_printf(m, "[4]R_AX_WDE_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); +- seq_printf(m, "[5.1]R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR)); +- seq_printf(m, "[5.2]R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1)); +- seq_printf(m, "[6]R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); +- seq_printf(m, "[7]R_AX_PKTIN_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR)); +- seq_printf(m, "[8.1]R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR)); +- seq_printf(m, "[8.2]R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR)); +- seq_printf(m, "[8.3]R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR)); +- seq_printf(m, "[10]R_AX_CPUIO_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_CPUIO_ERR_ISR)); +- seq_printf(m, "[11.1]R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR)); +- seq_printf(m, "[11.2]R_AX_BBRPT_CHINFO_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR_ISR)); +- seq_printf(m, "[11.3]R_AX_BBRPT_DFS_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR_ISR)); +- seq_printf(m, "[11.4]R_AX_LA_ERRFLAG=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_LA_ERRFLAG)); ++ dmac_err = rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR); ++ seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n", dmac_err); ++ seq_printf(m, "R_AX_DMAC_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_DMAC_ERR_IMR)); ++ ++ if (dmac_err) { ++ seq_printf(m, "R_AX_WDE_ERR_FLAG_CFG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG_NUM1)); ++ seq_printf(m, "R_AX_PLE_ERR_FLAG_CFG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG_NUM1)); ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_PLE_ERRFLAG_MSG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERRFLAG_MSG)); ++ seq_printf(m, "R_AX_WDE_ERRFLAG_MSG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERRFLAG_MSG)); ++ seq_printf(m, "R_AX_PLE_DBGERR_LOCKEN=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_LOCKEN)); ++ seq_printf(m, "R_AX_PLE_DBGERR_STS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_STS)); ++ } ++ } ++ ++ if (dmac_err & B_AX_WDRLS_ERR_FLAG) { ++ seq_printf(m, "R_AX_WDRLS_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDRLS_ERR_IMR)); ++ seq_printf(m, "R_AX_WDRLS_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR)); ++ if (chip->chip_id == RTL8852C) ++ seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX_V1)); ++ else ++ seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX)); ++ } ++ ++ if (dmac_err & B_AX_WSEC_ERR_FLAG) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_SEC_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG_IMR)); ++ seq_printf(m, "R_AX_SEC_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG)); ++ seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); ++ seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); ++ seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); ++ seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); ++ seq_printf(m, "R_AX_SEC_DEBUG1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_DEBUG1)); ++ seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); ++ seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); ++ ++ rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, ++ B_AX_DBG_SEL0, 0x8B); ++ rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, ++ B_AX_DBG_SEL1, 0x8B); ++ rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, ++ B_AX_SEL_0XC0_MASK, 1); ++ for (i = 0; i < 0x10; i++) { ++ rtw89_write32_mask(rtwdev, R_AX_SEC_ENG_CTRL, ++ B_AX_SEC_DBG_PORT_FIELD_MASK, i); ++ seq_printf(m, "sel=%x,R_AX_SEC_DEBUG2=0x%08x\n", ++ i, rtw89_read32(rtwdev, R_AX_SEC_DEBUG2)); ++ } ++ } else { ++ seq_printf(m, "R_AX_SEC_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_DEBUG)); ++ seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); ++ seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); ++ seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); ++ seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); ++ seq_printf(m, "R_AX_SEC_CAM_WDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA)); ++ seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); ++ seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); ++ seq_printf(m, "R_AX_SEC_TRX_PKT_CNT=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT)); ++ seq_printf(m, "R_AX_SEC_TRX_BLK_CNT=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT)); ++ } ++ } ++ ++ if (dmac_err & B_AX_MPDU_ERR_FLAG) { ++ seq_printf(m, "R_AX_MPDU_TX_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_IMR)); ++ seq_printf(m, "R_AX_MPDU_TX_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR)); ++ seq_printf(m, "R_AX_MPDU_RX_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_IMR)); ++ seq_printf(m, "R_AX_MPDU_RX_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR)); ++ } ++ ++ if (dmac_err & B_AX_STA_SCHEDULER_ERR_FLAG) { ++ seq_printf(m, "R_AX_STA_SCHEDULER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_IMR)); ++ seq_printf(m, "R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR)); ++ } ++ ++ if (dmac_err & B_AX_WDE_DLE_ERR_FLAG) { ++ seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); ++ seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); ++ seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); ++ seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); ++ } ++ ++ if (dmac_err & B_AX_TXPKTCTRL_ERR_FLAG) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_IMR)); ++ seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_ISR)); ++ seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_IMR)); ++ seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_ISR)); ++ } else { ++ seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR)); ++ seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1)); ++ } ++ } ++ ++ if (dmac_err & B_AX_PLE_DLE_ERR_FLAG) { ++ seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); ++ seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); ++ seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); ++ seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); ++ seq_printf(m, "R_AX_WD_CPUQ_OP_0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_0)); ++ seq_printf(m, "R_AX_WD_CPUQ_OP_1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_1)); ++ seq_printf(m, "R_AX_WD_CPUQ_OP_2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_2)); ++ seq_printf(m, "R_AX_WD_CPUQ_OP_STATUS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_STATUS)); ++ seq_printf(m, "R_AX_PL_CPUQ_OP_0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_0)); ++ seq_printf(m, "R_AX_PL_CPUQ_OP_1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_1)); ++ seq_printf(m, "R_AX_PL_CPUQ_OP_2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_2)); ++ seq_printf(m, "R_AX_PL_CPUQ_OP_STATUS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_STATUS)); ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_RX_CTRL0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL0)); ++ seq_printf(m, "R_AX_RX_CTRL1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL1)); ++ seq_printf(m, "R_AX_RX_CTRL2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL2)); ++ } else { ++ seq_printf(m, "R_AX_RXDMA_PKT_INFO_0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0)); ++ seq_printf(m, "R_AX_RXDMA_PKT_INFO_1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1)); ++ seq_printf(m, "R_AX_RXDMA_PKT_INFO_2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2)); ++ } ++ } ++ ++ if (dmac_err & B_AX_PKTIN_ERR_FLAG) { ++ seq_printf(m, "R_AX_PKTIN_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR)); ++ seq_printf(m, "R_AX_PKTIN_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR)); ++ } ++ ++ if (dmac_err & B_AX_DISPATCH_ERR_FLAG) { ++ seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_IMR)); ++ seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR)); ++ seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_IMR)); ++ seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR)); ++ seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_IMR)); ++ seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR)); ++ } ++ ++ if (dmac_err & B_AX_BBRPT_ERR_FLAG) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR)); ++ seq_printf(m, "R_AX_BBRPT_COM_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_ISR)); ++ seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); ++ seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); ++ seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); ++ seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); ++ } else { ++ seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR)); ++ seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); ++ seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); ++ seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); ++ seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); ++ } ++ } ++ ++ if (dmac_err & B_AX_HAXIDMA_ERR_FLAG && chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_HAXIDMA_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HAXI_IDCT_MSK)); ++ seq_printf(m, "R_AX_HAXIDMA_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HAXI_IDCT)); ++ } + + return 0; + } + +-static int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev, +- struct seq_file *m) ++static int rtw89_debug_mac_dump_cmac_err(struct rtw89_dev *rtwdev, ++ struct seq_file *m, ++ enum rtw89_mac_idx band) + { ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ u32 offset = 0; ++ u32 cmac_err; + int ret; + +- ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL); ++ ret = rtw89_mac_check_mac_en(rtwdev, band, RTW89_CMAC_SEL); + if (ret) { +- seq_puts(m, "[CMAC] : CMAC 0 not enabled\n"); ++ if (band) ++ seq_puts(m, "[CMAC] : CMAC1 not enabled\n"); ++ else ++ seq_puts(m, "[CMAC] : CMAC0 not enabled\n"); + return ret; + } + +- seq_printf(m, "R_AX_CMAC_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR)); +- seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR)); +- seq_printf(m, "[1]R_AX_PTCL_ISR0=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PTCL_ISR0)); +- seq_printf(m, "[3]R_AX_DLE_CTRL=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_DLE_CTRL)); +- seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR)); +- seq_printf(m, "[5]R_AX_TXPWR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPWR_ISR)); +- seq_printf(m, "[6]R_AX_RMAC_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR)); +- seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR)); ++ if (band) ++ offset = RTW89_MAC_AX_BAND_REG_OFFSET; + +- ret = rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL); +- if (ret) { +- seq_puts(m, "[CMAC] : CMAC 1 not enabled\n"); +- return ret; ++ cmac_err = rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset); ++ seq_printf(m, "R_AX_CMAC_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset)); ++ seq_printf(m, "R_AX_CMAC_FUNC_EN [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_FUNC_EN + offset)); ++ seq_printf(m, "R_AX_CK_EN [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CK_EN + offset)); ++ ++ if (cmac_err & B_AX_SCHEDULE_TOP_ERR_IND) { ++ seq_printf(m, "R_AX_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR + offset)); ++ seq_printf(m, "R_AX_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR + offset)); ++ } ++ ++ if (cmac_err & B_AX_PTCL_TOP_ERR_IND) { ++ seq_printf(m, "R_AX_PTCL_IMR0 [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PTCL_IMR0 + offset)); ++ seq_printf(m, "R_AX_PTCL_ISR0 [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PTCL_ISR0 + offset)); ++ } ++ ++ if (cmac_err & B_AX_DMA_TOP_ERR_IND) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_RX_ERR_FLAG [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG + offset)); ++ seq_printf(m, "R_AX_RX_ERR_FLAG_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG_IMR + offset)); ++ } else { ++ seq_printf(m, "R_AX_DLE_CTRL [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_DLE_CTRL + offset)); ++ } ++ } ++ ++ if (cmac_err & B_AX_DMA_TOP_ERR_IND || cmac_err & B_AX_WMAC_RX_ERR_IND) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_PHYINFO_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR + offset)); ++ seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); ++ } else { ++ seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); ++ } + } + +- seq_printf(m, "R_AX_CMAC_ERR_ISR_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR_C1)); +- seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR_C1)); +- seq_printf(m, "[1]R_AX_PTCL_ISR0_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PTCL_ISR0_C1)); +- seq_printf(m, "[3]R_AX_DLE_CTRL_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_DLE_CTRL_C1)); +- seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR_C1=0x%02x\n", +- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR_C1)); +- seq_printf(m, "[5]R_AX_TXPWR_ISR_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPWR_ISR_C1)); +- seq_printf(m, "[6]R_AX_RMAC_ERR_ISR_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR_C1)); +- seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR_C1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR_C1)); ++ if (cmac_err & B_AX_TXPWR_CTRL_ERR_IND) { ++ seq_printf(m, "R_AX_TXPWR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TXPWR_IMR + offset)); ++ seq_printf(m, "R_AX_TXPWR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TXPWR_ISR + offset)); ++ } ++ ++ if (cmac_err & B_AX_WMAC_TX_ERR_IND) { ++ if (chip->chip_id == RTL8852C) { ++ seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA + offset)); ++ seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA_MASK + offset)); ++ } else { ++ seq_printf(m, "R_AX_TMAC_ERR_IMR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR + offset)); ++ } ++ seq_printf(m, "R_AX_DBGSEL_TRXPTCL [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL + offset)); ++ } ++ ++ seq_printf(m, "R_AX_CMAC_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_ERR_IMR + offset)); ++ ++ return 0; ++} ++ ++static int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev, ++ struct seq_file *m) ++{ ++ rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_0); ++ if (rtwdev->dbcc_en) ++ rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_1); + + return 0; + } +@@ -1073,6 +1366,303 @@ static const struct rtw89_mac_dbg_port_i + .rd_msk = B_AX_PTCL_DBG_INFO_MASK + }; + ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx0_5 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0xD, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx6 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x5, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx7 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x9, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx8 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x3, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx9_C = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x1, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_txD = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx0 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0xB, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx1 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x4, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx3 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x8, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx4 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x7, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx5_8 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x1, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx9 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x3, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_txA_C = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx0 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x8, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx1_2 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx3 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x6, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx4 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx5 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 2, ++ .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_0 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x3, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_1 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x6, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_2 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x0, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p1 = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x8, ++ .end = 0xE, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_stf_ctrl = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x5, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_addr_ctrl = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x6, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_wde_intf = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0xF, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_ple_intf = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x9, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ ++static const struct rtw89_mac_dbg_port_info dbg_port_dspt_flow_ctrl = { ++ .sel_addr = R_AX_DISPATCHER_DBG_PORT, ++ .sel_byte = 1, ++ .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, ++ .srt = 0x0, ++ .end = 0x3, ++ .rd_addr = R_AX_DBG_PORT_SEL, ++ .rd_byte = 4, ++ .rd_msk = B_AX_DEBUG_ST_MASK ++}; ++ + static const struct rtw89_mac_dbg_port_info dbg_port_sch_c0 = { + .sel_addr = R_AX_SCH_DBG_SEL, + .sel_byte = 1, +@@ -1483,7 +2073,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_txdma = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x03, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1494,7 +2084,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_rxdma = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x04, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1505,7 +2095,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cvt = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x01, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1516,7 +2106,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cxpl = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x05, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1527,7 +2117,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_io = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x05, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1538,7 +2128,7 @@ static const struct rtw89_mac_dbg_port_i + static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc = { + .sel_addr = R_AX_PCIE_DBG_CTRL, + .sel_byte = 2, +- .sel_msk = B_AX_DBG_SEL_MASK, ++ .sel_msk = B_AX_PCIE_DBG_SEL_MASK, + .srt = 0x00, + .end = 0x06, + .rd_addr = R_AX_DBG_PORT_SEL, +@@ -1562,6 +2152,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_ + struct rtw89_dev *rtwdev, u32 sel) + { + const struct rtw89_mac_dbg_port_info *info; ++ u32 index; + u32 val32; + u16 val16; + u8 val8; +@@ -1837,6 +2428,235 @@ rtw89_debug_mac_dbg_port_sel(struct seq_ + info = &dbg_port_pktinfo; + seq_puts(m, "Enable pktinfo dump.\n"); + break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX0: ++ rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, ++ B_AX_DBG_SEL0, 0x80); ++ rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, ++ B_AX_SEL_0XC0_MASK, 1); ++ fallthrough; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX1: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX2: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX3: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX4: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX5: ++ info = &dbg_port_dspt_hdt_tx0_5; ++ index = sel - RTW89_DBG_PORT_SEL_DSPT_HDT_TX0; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, index); ++ seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX6: ++ info = &dbg_port_dspt_hdt_tx6; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 6); ++ seq_puts(m, "Enable Dispatcher hdt tx6 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX7: ++ info = &dbg_port_dspt_hdt_tx7; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 7); ++ seq_puts(m, "Enable Dispatcher hdt tx7 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX8: ++ info = &dbg_port_dspt_hdt_tx8; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 8); ++ seq_puts(m, "Enable Dispatcher hdt tx8 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TX9: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TXA: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TXB: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TXC: ++ info = &dbg_port_dspt_hdt_tx9_C; ++ index = sel + 9 - RTW89_DBG_PORT_SEL_DSPT_HDT_TX9; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, index); ++ seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_TXD: ++ info = &dbg_port_dspt_hdt_txD; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 0); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 0xD); ++ seq_puts(m, "Enable Dispatcher hdt txD dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX0: ++ info = &dbg_port_dspt_cdt_tx0; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 0); ++ seq_puts(m, "Enable Dispatcher cdt tx0 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX1: ++ info = &dbg_port_dspt_cdt_tx1; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 1); ++ seq_puts(m, "Enable Dispatcher cdt tx1 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX3: ++ info = &dbg_port_dspt_cdt_tx3; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 3); ++ seq_puts(m, "Enable Dispatcher cdt tx3 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX4: ++ info = &dbg_port_dspt_cdt_tx4; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 4); ++ seq_puts(m, "Enable Dispatcher cdt tx4 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX5: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX6: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX7: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX8: ++ info = &dbg_port_dspt_cdt_tx5_8; ++ index = sel + 5 - RTW89_DBG_PORT_SEL_DSPT_CDT_TX5; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, index); ++ seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TX9: ++ info = &dbg_port_dspt_cdt_tx9; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 9); ++ seq_puts(m, "Enable Dispatcher cdt tx9 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TXA: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TXB: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_TXC: ++ info = &dbg_port_dspt_cdt_txA_C; ++ index = sel + 0xA - RTW89_DBG_PORT_SEL_DSPT_CDT_TXA; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 1); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, index); ++ seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX0: ++ info = &dbg_port_dspt_hdt_rx0; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 2); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 0); ++ seq_puts(m, "Enable Dispatcher hdt rx0 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX1: ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX2: ++ info = &dbg_port_dspt_hdt_rx1_2; ++ index = sel + 1 - RTW89_DBG_PORT_SEL_DSPT_HDT_RX1; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 2); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, index); ++ seq_printf(m, "Enable Dispatcher hdt rx%x dump.\n", index); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX3: ++ info = &dbg_port_dspt_hdt_rx3; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 2); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 3); ++ seq_puts(m, "Enable Dispatcher hdt rx3 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX4: ++ info = &dbg_port_dspt_hdt_rx4; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 2); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 4); ++ seq_puts(m, "Enable Dispatcher hdt rx4 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_HDT_RX5: ++ info = &dbg_port_dspt_hdt_rx5; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 2); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 5); ++ seq_puts(m, "Enable Dispatcher hdt rx5 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_0: ++ info = &dbg_port_dspt_cdt_rx_p0_0; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 3); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 0); ++ seq_puts(m, "Enable Dispatcher cdt rx part0 0 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0: ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_1: ++ info = &dbg_port_dspt_cdt_rx_p0_1; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 3); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 1); ++ seq_puts(m, "Enable Dispatcher cdt rx part0 1 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_2: ++ info = &dbg_port_dspt_cdt_rx_p0_2; ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 3); ++ rtw89_write16_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_CH_SEL_MASK, 2); ++ seq_puts(m, "Enable Dispatcher cdt rx part0 2 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P1: ++ info = &dbg_port_dspt_cdt_rx_p1; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 3); ++ seq_puts(m, "Enable Dispatcher cdt rx part1 dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_STF_CTRL: ++ info = &dbg_port_dspt_stf_ctrl; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 4); ++ seq_puts(m, "Enable Dispatcher stf control dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_ADDR_CTRL: ++ info = &dbg_port_dspt_addr_ctrl; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 5); ++ seq_puts(m, "Enable Dispatcher addr control dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_WDE_INTF: ++ info = &dbg_port_dspt_wde_intf; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 6); ++ seq_puts(m, "Enable Dispatcher wde interface dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_PLE_INTF: ++ info = &dbg_port_dspt_ple_intf; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 7); ++ seq_puts(m, "Enable Dispatcher ple interface dump.\n"); ++ break; ++ case RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL: ++ info = &dbg_port_dspt_flow_ctrl; ++ rtw89_write8_mask(rtwdev, info->sel_addr, ++ B_AX_DISPATCHER_INTN_SEL_MASK, 8); ++ seq_puts(m, "Enable Dispatcher flow control dump.\n"); ++ break; + case RTW89_DBG_PORT_SEL_PCIE_TXDMA: + info = &dbg_port_pcie_txdma; + val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); +@@ -1889,7 +2709,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_ + info = &dbg_port_pcie_misc2; + val16 = rtw89_read16(rtwdev, R_AX_PCIE_DBG_CTRL); + val16 = u16_replace_bits(val16, PCIE_MISC2_DBG_SEL, +- B_AX_DBG_SEL_MASK); ++ B_AX_PCIE_DBG_SEL_MASK); + rtw89_write16(rtwdev, R_AX_PCIE_DBG_CTRL, val16); + seq_puts(m, "Enable pcie misc2 dump.\n"); + break; +@@ -1915,6 +2735,10 @@ static bool is_dbg_port_valid(struct rtw + sel >= RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG && + sel <= RTW89_DBG_PORT_SEL_PKTINFO) + return false; ++ if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL) && ++ sel >= RTW89_DBG_PORT_SEL_DSPT_HDT_TX0 && ++ sel <= RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL) ++ return false; + if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL) && + sel >= RTW89_DBG_PORT_SEL_PTCL_C0 && + sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C0) +@@ -1985,6 +2809,50 @@ static int rtw89_debug_mac_dbg_port_dump + case_DBG_SEL(PLE_QUEMGN_QLNKTBL); + case_DBG_SEL(PLE_QUEMGN_QEMPTY); + case_DBG_SEL(PKTINFO); ++ case_DBG_SEL(DSPT_HDT_TX0); ++ case_DBG_SEL(DSPT_HDT_TX1); ++ case_DBG_SEL(DSPT_HDT_TX2); ++ case_DBG_SEL(DSPT_HDT_TX3); ++ case_DBG_SEL(DSPT_HDT_TX4); ++ case_DBG_SEL(DSPT_HDT_TX5); ++ case_DBG_SEL(DSPT_HDT_TX6); ++ case_DBG_SEL(DSPT_HDT_TX7); ++ case_DBG_SEL(DSPT_HDT_TX8); ++ case_DBG_SEL(DSPT_HDT_TX9); ++ case_DBG_SEL(DSPT_HDT_TXA); ++ case_DBG_SEL(DSPT_HDT_TXB); ++ case_DBG_SEL(DSPT_HDT_TXC); ++ case_DBG_SEL(DSPT_HDT_TXD); ++ case_DBG_SEL(DSPT_HDT_TXE); ++ case_DBG_SEL(DSPT_HDT_TXF); ++ case_DBG_SEL(DSPT_CDT_TX0); ++ case_DBG_SEL(DSPT_CDT_TX1); ++ case_DBG_SEL(DSPT_CDT_TX3); ++ case_DBG_SEL(DSPT_CDT_TX4); ++ case_DBG_SEL(DSPT_CDT_TX5); ++ case_DBG_SEL(DSPT_CDT_TX6); ++ case_DBG_SEL(DSPT_CDT_TX7); ++ case_DBG_SEL(DSPT_CDT_TX8); ++ case_DBG_SEL(DSPT_CDT_TX9); ++ case_DBG_SEL(DSPT_CDT_TXA); ++ case_DBG_SEL(DSPT_CDT_TXB); ++ case_DBG_SEL(DSPT_CDT_TXC); ++ case_DBG_SEL(DSPT_HDT_RX0); ++ case_DBG_SEL(DSPT_HDT_RX1); ++ case_DBG_SEL(DSPT_HDT_RX2); ++ case_DBG_SEL(DSPT_HDT_RX3); ++ case_DBG_SEL(DSPT_HDT_RX4); ++ case_DBG_SEL(DSPT_HDT_RX5); ++ case_DBG_SEL(DSPT_CDT_RX_P0); ++ case_DBG_SEL(DSPT_CDT_RX_P0_0); ++ case_DBG_SEL(DSPT_CDT_RX_P0_1); ++ case_DBG_SEL(DSPT_CDT_RX_P0_2); ++ case_DBG_SEL(DSPT_CDT_RX_P1); ++ case_DBG_SEL(DSPT_STF_CTRL); ++ case_DBG_SEL(DSPT_ADDR_CTRL); ++ case_DBG_SEL(DSPT_WDE_INTF); ++ case_DBG_SEL(DSPT_PLE_INTF); ++ case_DBG_SEL(DSPT_FLOW_CTRL); + case_DBG_SEL(PCIE_TXDMA); + case_DBG_SEL(PCIE_RXDMA); + case_DBG_SEL(PCIE_CVT); +@@ -2354,6 +3222,7 @@ static void rtw89_sta_info_get_iter(void + else + seq_printf(m, "Legacy %d", rate->legacy); + seq_printf(m, "%s", rtwsta->ra_report.might_fallback_legacy ? " FB_G" : ""); ++ seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(rate->bw)); + seq_printf(m, "\t(hw_rate=0x%x)", rtwsta->ra_report.hw_rate); + seq_printf(m, "\t==> agg_wait=%d (%d)\n", rtwsta->max_agg_wait, + sta->deflink.agg.max_rc_amsdu_len); +@@ -2379,6 +3248,7 @@ static void rtw89_sta_info_get_iter(void + he_gi_str[rate->he_gi] : "N/A"); + break; + } ++ seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(status->bw)); + seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate); + + rssi = ewma_rssi_read(&rtwsta->avg_rssi); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/debug.h linux-6.2/drivers/net/wireless/realtek/rtw89/debug.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/debug.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/debug.h 2022-12-24 00:49:25.778376835 +0200 +@@ -26,6 +26,8 @@ enum rtw89_debug_mask { + RTW89_DBG_HW_SCAN = BIT(15), + RTW89_DBG_SAR = BIT(16), + RTW89_DBG_STATE = BIT(17), ++ RTW89_DBG_WOW = BIT(18), ++ RTW89_DBG_UL_TB = BIT(19), + + RTW89_DBG_UNEXP = BIT(31), + }; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/fw.c linux-6.2/drivers/net/wireless/realtek/rtw89/fw.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/fw.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/fw.c 2022-12-24 00:49:25.778376835 +0200 +@@ -11,6 +11,9 @@ + #include "phy.h" + #include "reg.h" + ++static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev, ++ struct sk_buff *skb); ++ + static struct sk_buff *rtw89_fw_h2c_alloc_skb(struct rtw89_dev *rtwdev, u32 len, + bool header) + { +@@ -85,15 +88,31 @@ static int rtw89_fw_hdr_parser(struct rt + { + struct rtw89_fw_hdr_section_info *section_info; + const u8 *fw_end = fw + len; ++ const u8 *fwdynhdr; + const u8 *bin; ++ u32 base_hdr_len; + u32 i; + + if (!info) + return -EINVAL; + + info->section_num = GET_FW_HDR_SEC_NUM(fw); +- info->hdr_len = RTW89_FW_HDR_SIZE + +- info->section_num * RTW89_FW_SECTION_HDR_SIZE; ++ base_hdr_len = RTW89_FW_HDR_SIZE + ++ info->section_num * RTW89_FW_SECTION_HDR_SIZE; ++ info->dynamic_hdr_en = GET_FW_HDR_DYN_HDR(fw); ++ ++ if (info->dynamic_hdr_en) { ++ info->hdr_len = GET_FW_HDR_LEN(fw); ++ info->dynamic_hdr_len = info->hdr_len - base_hdr_len; ++ fwdynhdr = fw + base_hdr_len; ++ if (GET_FW_DYNHDR_LEN(fwdynhdr) != info->dynamic_hdr_len) { ++ rtw89_err(rtwdev, "[ERR]invalid fw dynamic header len\n"); ++ return -EINVAL; ++ } ++ } else { ++ info->hdr_len = base_hdr_len; ++ info->dynamic_hdr_len = 0; ++ } + + bin = fw + info->hdr_len; + +@@ -254,29 +273,42 @@ static void rtw89_fw_recognize_features( + } + } + +-void rtw89_early_fw_feature_recognize(struct device *device, +- const struct rtw89_chip_info *chip, +- u32 *early_feat_map) +-{ +- union { +- struct rtw89_mfw_hdr mfw_hdr; +- u8 fw_hdr[RTW89_FW_HDR_SIZE]; +- } buf = {}; ++const struct firmware * ++rtw89_early_fw_feature_recognize(struct device *device, ++ const struct rtw89_chip_info *chip, ++ u32 *early_feat_map) ++{ ++ union rtw89_compat_fw_hdr buf = {}; + const struct firmware *firmware; ++ bool full_req = false; + u32 ver_code; + int ret; + int i; + +- ret = request_partial_firmware_into_buf(&firmware, chip->fw_name, +- device, &buf, sizeof(buf), 0); ++ /* If SECURITY_LOADPIN_ENFORCE is enabled, reading partial files will ++ * be denied (-EPERM). Then, we don't get right firmware things as ++ * expected. So, in this case, we have to request full firmware here. ++ */ ++ if (IS_ENABLED(CONFIG_SECURITY_LOADPIN_ENFORCE)) ++ full_req = true; ++ ++ if (full_req) ++ ret = request_firmware(&firmware, chip->fw_name, device); ++ else ++ ret = request_partial_firmware_into_buf(&firmware, chip->fw_name, ++ device, &buf, sizeof(buf), ++ 0); ++ + if (ret) { + dev_err(device, "failed to early request firmware: %d\n", ret); +- return; ++ return NULL; + } + +- ver_code = buf.mfw_hdr.sig != RTW89_MFW_SIG ? +- RTW89_FW_HDR_VER_CODE(&buf.fw_hdr) : +- RTW89_MFW_HDR_VER_CODE(&buf.mfw_hdr); ++ if (full_req) ++ ver_code = rtw89_compat_fw_hdr_ver_code(firmware->data); ++ else ++ ver_code = rtw89_compat_fw_hdr_ver_code(&buf); ++ + if (!ver_code) + goto out; + +@@ -291,7 +323,11 @@ void rtw89_early_fw_feature_recognize(st + } + + out: ++ if (full_req) ++ return firmware; ++ + release_firmware(firmware); ++ return NULL; + } + + int rtw89_fw_recognize(struct rtw89_dev *rtwdev) +@@ -515,6 +551,11 @@ int rtw89_fw_download(struct rtw89_dev * + u8 val; + int ret; + ++ rtw89_mac_disable_cpu(rtwdev); ++ ret = rtw89_mac_enable_cpu(rtwdev, 0, true); ++ if (ret) ++ return ret; ++ + if (!fw || !len) { + rtw89_err(rtwdev, "fw type %d isn't recognized\n", type); + return -ENOENT; +@@ -534,7 +575,7 @@ int rtw89_fw_download(struct rtw89_dev * + goto fwdl_err; + } + +- ret = rtw89_fw_download_hdr(rtwdev, fw, info.hdr_len); ++ ret = rtw89_fw_download_hdr(rtwdev, fw, info.hdr_len - info.dynamic_hdr_len); + if (ret) { + ret = -EBUSY; + goto fwdl_err; +@@ -593,6 +634,13 @@ int rtw89_load_firmware(struct rtw89_dev + fw->rtwdev = rtwdev; + init_completion(&fw->completion); + ++ if (fw->firmware) { ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "full firmware has been early requested\n"); ++ complete_all(&fw->completion); ++ return 0; ++ } ++ + ret = request_firmware_nowait(THIS_MODULE, true, fw_name, rtwdev->dev, + GFP_KERNEL, fw, rtw89_load_firmware_cb); + if (ret) { +@@ -609,8 +657,14 @@ void rtw89_unload_firmware(struct rtw89_ + + rtw89_wait_firmware_completion(rtwdev); + +- if (fw->firmware) ++ if (fw->firmware) { + release_firmware(fw->firmware); ++ ++ /* assign NULL back in case rtw89_free_ieee80211_hw() ++ * try to release the same one again. ++ */ ++ fw->firmware = NULL; ++ } + } + + #define H2C_CAM_LEN 60 +@@ -848,6 +902,56 @@ fail: + return ret; + } + ++static int rtw89_fw_h2c_add_wow_fw_ofld(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ enum rtw89_fw_pkt_ofld_type type, ++ u8 *id) ++{ ++ struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_pktofld_info *info; ++ struct sk_buff *skb; ++ int ret; ++ ++ info = kzalloc(sizeof(*info), GFP_KERNEL); ++ if (!info) ++ return -ENOMEM; ++ ++ switch (type) { ++ case RTW89_PKT_OFLD_TYPE_PS_POLL: ++ skb = ieee80211_pspoll_get(rtwdev->hw, vif); ++ break; ++ case RTW89_PKT_OFLD_TYPE_PROBE_RSP: ++ skb = ieee80211_proberesp_get(rtwdev->hw, vif); ++ break; ++ case RTW89_PKT_OFLD_TYPE_NULL_DATA: ++ skb = ieee80211_nullfunc_get(rtwdev->hw, vif, -1, false); ++ break; ++ case RTW89_PKT_OFLD_TYPE_QOS_NULL: ++ skb = ieee80211_nullfunc_get(rtwdev->hw, vif, -1, true); ++ break; ++ default: ++ goto err; ++ } ++ ++ if (!skb) ++ goto err; ++ ++ list_add_tail(&info->list, &rtw_wow->pkt_list); ++ ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb); ++ kfree_skb(skb); ++ ++ if (ret) ++ return ret; ++ ++ *id = info->id; ++ return 0; ++ ++err: ++ kfree(info); ++ return -ENOMEM; ++} ++ + #define H2C_GENERAL_PKT_LEN 6 + #define H2C_GENERAL_PKT_ID_UND 0xff + int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid) +@@ -2192,7 +2296,7 @@ fail: + int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev) + { + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); +- struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; ++ struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; + struct rtw89_fw_h2c_rf_get_mccch *mccch; + struct sk_buff *skb; + int ret; +@@ -2205,10 +2309,10 @@ int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw8 + skb_put(skb, sizeof(*mccch)); + mccch = (struct rtw89_fw_h2c_rf_get_mccch *)skb->data; + +- mccch->ch_0 = cpu_to_le32(mcc_info->ch[0]); +- mccch->ch_1 = cpu_to_le32(mcc_info->ch[1]); +- mccch->band_0 = cpu_to_le32(mcc_info->band[0]); +- mccch->band_1 = cpu_to_le32(mcc_info->band[1]); ++ mccch->ch_0 = cpu_to_le32(rfk_mcc->ch[0]); ++ mccch->ch_1 = cpu_to_le32(rfk_mcc->ch[1]); ++ mccch->band_0 = cpu_to_le32(rfk_mcc->band[0]); ++ mccch->band_1 = cpu_to_le32(rfk_mcc->band[1]); + mccch->current_channel = cpu_to_le32(chan->channel); + mccch->current_band_type = cpu_to_le32(chan->band_type); + +@@ -2311,8 +2415,43 @@ void rtw89_fw_free_all_early_h2c(struct + mutex_unlock(&rtwdev->mutex); + } + ++static void rtw89_fw_c2h_parse_attr(struct sk_buff *c2h) ++{ ++ struct rtw89_fw_c2h_attr *attr = RTW89_SKB_C2H_CB(c2h); ++ ++ attr->category = RTW89_GET_C2H_CATEGORY(c2h->data); ++ attr->class = RTW89_GET_C2H_CLASS(c2h->data); ++ attr->func = RTW89_GET_C2H_FUNC(c2h->data); ++ attr->len = RTW89_GET_C2H_LEN(c2h->data); ++} ++ ++static bool rtw89_fw_c2h_chk_atomic(struct rtw89_dev *rtwdev, ++ struct sk_buff *c2h) ++{ ++ struct rtw89_fw_c2h_attr *attr = RTW89_SKB_C2H_CB(c2h); ++ u8 category = attr->category; ++ u8 class = attr->class; ++ u8 func = attr->func; ++ ++ switch (category) { ++ default: ++ return false; ++ case RTW89_C2H_CAT_MAC: ++ return rtw89_mac_c2h_chk_atomic(rtwdev, class, func); ++ } ++} ++ + void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h) + { ++ rtw89_fw_c2h_parse_attr(c2h); ++ if (!rtw89_fw_c2h_chk_atomic(rtwdev, c2h)) ++ goto enqueue; ++ ++ rtw89_fw_c2h_cmd_handle(rtwdev, c2h); ++ dev_kfree_skb_any(c2h); ++ return; ++ ++enqueue: + skb_queue_tail(&rtwdev->c2h_queue, c2h); + ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); + } +@@ -2320,10 +2459,11 @@ void rtw89_fw_c2h_irqsafe(struct rtw89_d + static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev, + struct sk_buff *skb) + { +- u8 category = RTW89_GET_C2H_CATEGORY(skb->data); +- u8 class = RTW89_GET_C2H_CLASS(skb->data); +- u8 func = RTW89_GET_C2H_FUNC(skb->data); +- u16 len = RTW89_GET_C2H_LEN(skb->data); ++ struct rtw89_fw_c2h_attr *attr = RTW89_SKB_C2H_CB(skb); ++ u8 category = attr->category; ++ u8 class = attr->class; ++ u8 func = attr->func; ++ u16 len = attr->len; + bool dump = true; + + if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags)) +@@ -2565,6 +2705,9 @@ static void rtw89_hw_scan_add_chan(struc + struct rtw89_mac_chinfo *ch_info) + { + struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; ++ struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; ++ struct cfg80211_scan_request *req = rtwvif->scan_req; + struct rtw89_pktofld_info *info; + u8 band, probe_count = 0; + +@@ -2576,13 +2719,13 @@ static void rtw89_hw_scan_add_chan(struc + ch_info->tx_pwr_idx = 0; + ch_info->tx_null = false; + ch_info->pause_data = false; ++ ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE; + + if (ssid_num) { + ch_info->num_pkt = ssid_num; + band = rtw89_hw_to_nl80211_band(ch_info->ch_band); + + list_for_each_entry(info, &scan_info->pkt_list[band], list) { +- ch_info->probe_id = info->id; + ch_info->pkt_id[probe_count] = info->id; + if (++probe_count >= ssid_num) + break; +@@ -2591,9 +2734,16 @@ static void rtw89_hw_scan_add_chan(struc + rtw89_err(rtwdev, "SSID num differs from list len\n"); + } + ++ if (ch_info->ch_band == RTW89_BAND_6G) { ++ if (ssid_num == 1 && req->ssids[0].ssid_len == 0) { ++ ch_info->tx_pkt = false; ++ if (!req->duration_mandatory) ++ ch_info->period -= RTW89_DWELL_TIME; ++ } ++ } ++ + switch (chan_type) { + case RTW89_CHAN_OPERATE: +- ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE; + ch_info->central_ch = scan_info->op_chan; + ch_info->pri_ch = scan_info->op_pri_ch; + ch_info->ch_band = scan_info->op_band; +@@ -2602,8 +2752,9 @@ static void rtw89_hw_scan_add_chan(struc + ch_info->num_pkt = 0; + break; + case RTW89_CHAN_DFS: +- ch_info->period = max_t(u8, ch_info->period, +- RTW89_DFS_CHAN_TIME); ++ if (ch_info->ch_band != RTW89_BAND_6G) ++ ch_info->period = max_t(u8, ch_info->period, ++ RTW89_DFS_CHAN_TIME); + ch_info->dwell_time = RTW89_DWELL_TIME; + break; + case RTW89_CHAN_ACTIVE: +@@ -2637,8 +2788,13 @@ static int rtw89_hw_scan_add_chan_list(s + goto out; + } + +- ch_info->period = req->duration_mandatory ? +- req->duration : RTW89_CHANNEL_TIME; ++ if (req->duration_mandatory) ++ ch_info->period = req->duration; ++ else if (channel->band == NL80211_BAND_6GHZ) ++ ch_info->period = RTW89_CHANNEL_TIME_6G + RTW89_DWELL_TIME; ++ else ++ ch_info->period = RTW89_CHANNEL_TIME; ++ + ch_info->ch_band = rtw89_nl80211_to_hw_band(channel->band); + ch_info->central_ch = channel->hw_value; + ch_info->pri_ch = channel->hw_value; +@@ -2757,6 +2913,7 @@ void rtw89_hw_scan_complete(struct rtw89 + + if (rtwvif->net_type != RTW89_NET_TYPE_NO_LINK) + rtw89_store_op_chan(rtwdev, false); ++ rtw89_set_channel(rtwdev); + } + + void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif) +@@ -2862,6 +3019,7 @@ int rtw89_fw_h2c_pkt_drop(struct rtw89_d + case RTW89_PKT_DROP_SEL_MACID_BK_ONCE: + case RTW89_PKT_DROP_SEL_MACID_VI_ONCE: + case RTW89_PKT_DROP_SEL_MACID_VO_ONCE: ++ case RTW89_PKT_DROP_SEL_BAND_ONCE: + break; + default: + rtw89_debug(rtwdev, RTW89_DBG_FW, +@@ -2877,6 +3035,14 @@ int rtw89_fw_h2c_pkt_drop(struct rtw89_d + RTW89_SET_FWCMD_PKT_DROP_PORT(skb->data, params->port); + RTW89_SET_FWCMD_PKT_DROP_MBSSID(skb->data, params->mbssid); + RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(skb->data, params->tf_trs); ++ RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(skb->data, ++ params->macid_band_sel[0]); ++ RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(skb->data, ++ params->macid_band_sel[1]); ++ RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(skb->data, ++ params->macid_band_sel[2]); ++ RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(skb->data, ++ params->macid_band_sel[3]); + + rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, + H2C_CAT_MAC, +@@ -2896,3 +3062,563 @@ fail: + dev_kfree_skb_any(skb); + return ret; + } ++ ++#define H2C_KEEP_ALIVE_LEN 4 ++int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, ++ bool enable) ++{ ++ struct sk_buff *skb; ++ u8 pkt_id = 0; ++ int ret; ++ ++ if (enable) { ++ ret = rtw89_fw_h2c_add_wow_fw_ofld(rtwdev, rtwvif, ++ RTW89_PKT_OFLD_TYPE_NULL_DATA, &pkt_id); ++ if (ret) ++ return -EPERM; ++ } ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_KEEP_ALIVE_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, "failed to alloc skb for keep alive\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_KEEP_ALIVE_LEN); ++ ++ RTW89_SET_KEEP_ALIVE_ENABLE(skb->data, enable); ++ RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(skb->data, pkt_id); ++ RTW89_SET_KEEP_ALIVE_PERIOD(skb->data, 5); ++ RTW89_SET_KEEP_ALIVE_MACID(skb->data, rtwvif->mac_id); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MAC_WOW, ++ H2C_FUNC_KEEP_ALIVE, 0, 1, ++ H2C_KEEP_ALIVE_LEN); ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ goto fail; ++ } ++ ++ return 0; ++ ++fail: ++ dev_kfree_skb_any(skb); ++ ++ return ret; ++} ++ ++#define H2C_DISCONNECT_DETECT_LEN 8 ++int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, bool enable) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct sk_buff *skb; ++ u8 macid = rtwvif->mac_id; ++ int ret; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_DISCONNECT_DETECT_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, "failed to alloc skb for keep alive\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_DISCONNECT_DETECT_LEN); ++ ++ if (test_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) { ++ RTW89_SET_DISCONNECT_DETECT_ENABLE(skb->data, enable); ++ RTW89_SET_DISCONNECT_DETECT_DISCONNECT(skb->data, !enable); ++ RTW89_SET_DISCONNECT_DETECT_MAC_ID(skb->data, macid); ++ RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(skb->data, 100); ++ RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(skb->data, 5); ++ } ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MAC_WOW, ++ H2C_FUNC_DISCONNECT_DETECT, 0, 1, ++ H2C_DISCONNECT_DETECT_LEN); ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ goto fail; ++ } ++ ++ return 0; ++ ++fail: ++ dev_kfree_skb_any(skb); ++ ++ return ret; ++} ++ ++#define H2C_WOW_GLOBAL_LEN 8 ++int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, ++ bool enable) ++{ ++ struct sk_buff *skb; ++ u8 macid = rtwvif->mac_id; ++ int ret; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WOW_GLOBAL_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, "failed to alloc skb for keep alive\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_WOW_GLOBAL_LEN); ++ ++ RTW89_SET_WOW_GLOBAL_ENABLE(skb->data, enable); ++ RTW89_SET_WOW_GLOBAL_MAC_ID(skb->data, macid); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MAC_WOW, ++ H2C_FUNC_WOW_GLOBAL, 0, 1, ++ H2C_WOW_GLOBAL_LEN); ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ goto fail; ++ } ++ ++ return 0; ++ ++fail: ++ dev_kfree_skb_any(skb); ++ ++ return ret; ++} ++ ++#define H2C_WAKEUP_CTRL_LEN 4 ++int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ bool enable) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct sk_buff *skb; ++ u8 macid = rtwvif->mac_id; ++ int ret; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WAKEUP_CTRL_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, "failed to alloc skb for keep alive\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_WAKEUP_CTRL_LEN); ++ ++ if (rtw_wow->pattern_cnt) ++ RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(skb->data, enable); ++ if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) ++ RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(skb->data, enable); ++ if (test_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags)) ++ RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(skb->data, enable); ++ ++ RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(skb->data, macid); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MAC_WOW, ++ H2C_FUNC_WAKEUP_CTRL, 0, 1, ++ H2C_WAKEUP_CTRL_LEN); ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ goto fail; ++ } ++ ++ return 0; ++ ++fail: ++ dev_kfree_skb_any(skb); ++ ++ return ret; ++} ++ ++#define H2C_WOW_CAM_UPD_LEN 24 ++int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev, ++ struct rtw89_wow_cam_info *cam_info) ++{ ++ struct sk_buff *skb; ++ int ret; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_WOW_CAM_UPD_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, "failed to alloc skb for keep alive\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_WOW_CAM_UPD_LEN); ++ ++ RTW89_SET_WOW_CAM_UPD_R_W(skb->data, cam_info->r_w); ++ RTW89_SET_WOW_CAM_UPD_IDX(skb->data, cam_info->idx); ++ if (cam_info->valid) { ++ RTW89_SET_WOW_CAM_UPD_WKFM1(skb->data, cam_info->mask[0]); ++ RTW89_SET_WOW_CAM_UPD_WKFM2(skb->data, cam_info->mask[1]); ++ RTW89_SET_WOW_CAM_UPD_WKFM3(skb->data, cam_info->mask[2]); ++ RTW89_SET_WOW_CAM_UPD_WKFM4(skb->data, cam_info->mask[3]); ++ RTW89_SET_WOW_CAM_UPD_CRC(skb->data, cam_info->crc); ++ RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(skb->data, ++ cam_info->negative_pattern_match); ++ RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(skb->data, ++ cam_info->skip_mac_hdr); ++ RTW89_SET_WOW_CAM_UPD_UC(skb->data, cam_info->uc); ++ RTW89_SET_WOW_CAM_UPD_MC(skb->data, cam_info->mc); ++ RTW89_SET_WOW_CAM_UPD_BC(skb->data, cam_info->bc); ++ } ++ RTW89_SET_WOW_CAM_UPD_VALID(skb->data, cam_info->valid); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MAC_WOW, ++ H2C_FUNC_WOW_CAM_UPD, 0, 1, ++ H2C_WOW_CAM_UPD_LEN); ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ goto fail; ++ } ++ ++ return 0; ++fail: ++ dev_kfree_skb_any(skb); ++ ++ return ret; ++} ++ ++static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb, ++ struct rtw89_wait_info *wait, unsigned int cond) ++{ ++ int ret; ++ ++ ret = rtw89_h2c_tx(rtwdev, skb, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to send h2c\n"); ++ dev_kfree_skb_any(skb); ++ return -EBUSY; ++ } ++ ++ return rtw89_wait_for_cond(wait, cond); ++} ++ ++#define H2C_ADD_MCC_LEN 16 ++int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_add_req *p) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_ADD_MCC_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for add mcc\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_ADD_MCC_LEN); ++ RTW89_SET_FWCMD_ADD_MCC_MACID(skb->data, p->macid); ++ RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(skb->data, p->central_ch_seg0); ++ RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(skb->data, p->central_ch_seg1); ++ RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(skb->data, p->primary_ch); ++ RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(skb->data, p->bandwidth); ++ RTW89_SET_FWCMD_ADD_MCC_GROUP(skb->data, p->group); ++ RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(skb->data, p->c2h_rpt); ++ RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(skb->data, p->dis_tx_null); ++ RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(skb->data, p->dis_sw_retry); ++ RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(skb->data, p->in_curr_ch); ++ RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(skb->data, p->sw_retry_count); ++ RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(skb->data, p->tx_null_early); ++ RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(skb->data, p->btc_in_2g); ++ RTW89_SET_FWCMD_ADD_MCC_PTA_EN(skb->data, p->pta_en); ++ RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(skb->data, p->rfk_by_pass); ++ RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(skb->data, p->ch_band_type); ++ RTW89_SET_FWCMD_ADD_MCC_DURATION(skb->data, p->duration); ++ RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(skb->data, p->courtesy_en); ++ RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(skb->data, p->courtesy_num); ++ RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(skb->data, p->courtesy_target); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_ADD_MCC, 0, 0, ++ H2C_ADD_MCC_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_ADD_MCC); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_START_MCC_LEN 12 ++int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_start_req *p) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_START_MCC_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for start mcc\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_START_MCC_LEN); ++ RTW89_SET_FWCMD_START_MCC_GROUP(skb->data, p->group); ++ RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(skb->data, p->btc_in_group); ++ RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(skb->data, p->old_group_action); ++ RTW89_SET_FWCMD_START_MCC_OLD_GROUP(skb->data, p->old_group); ++ RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(skb->data, p->notify_cnt); ++ RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(skb->data, p->notify_rxdbg_en); ++ RTW89_SET_FWCMD_START_MCC_MACID(skb->data, p->macid); ++ RTW89_SET_FWCMD_START_MCC_TSF_LOW(skb->data, p->tsf_low); ++ RTW89_SET_FWCMD_START_MCC_TSF_HIGH(skb->data, p->tsf_high); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_START_MCC, 0, 0, ++ H2C_START_MCC_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_START_MCC); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_STOP_MCC_LEN 4 ++int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid, ++ bool prev_groups) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_STOP_MCC_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for stop mcc\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_STOP_MCC_LEN); ++ RTW89_SET_FWCMD_STOP_MCC_MACID(skb->data, macid); ++ RTW89_SET_FWCMD_STOP_MCC_GROUP(skb->data, group); ++ RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(skb->data, prev_groups); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_STOP_MCC, 0, 0, ++ H2C_STOP_MCC_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_STOP_MCC); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_DEL_MCC_GROUP_LEN 4 ++int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group, ++ bool prev_groups) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_DEL_MCC_GROUP_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for del mcc group\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_DEL_MCC_GROUP_LEN); ++ RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(skb->data, group); ++ RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(skb->data, prev_groups); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_DEL_MCC_GROUP, 0, 0, ++ H2C_DEL_MCC_GROUP_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_DEL_MCC_GROUP); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_RESET_MCC_GROUP_LEN 4 ++int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_RESET_MCC_GROUP_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for reset mcc group\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_RESET_MCC_GROUP_LEN); ++ RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(skb->data, group); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_RESET_MCC_GROUP, 0, 0, ++ H2C_RESET_MCC_GROUP_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_RESET_MCC_GROUP); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_MCC_REQ_TSF_LEN 4 ++int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_tsf_req *req, ++ struct rtw89_mac_mcc_tsf_rpt *rpt) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct rtw89_mac_mcc_tsf_rpt *tmp; ++ struct sk_buff *skb; ++ unsigned int cond; ++ int ret; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_REQ_TSF_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for mcc req tsf\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_MCC_REQ_TSF_LEN); ++ RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(skb->data, req->group); ++ RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(skb->data, req->macid_x); ++ RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(skb->data, req->macid_y); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_MCC_REQ_TSF, 0, 0, ++ H2C_MCC_REQ_TSF_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(req->group, H2C_FUNC_MCC_REQ_TSF); ++ ret = rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++ if (ret) ++ return ret; ++ ++ tmp = (struct rtw89_mac_mcc_tsf_rpt *)wait->data.buf; ++ *rpt = *tmp; ++ ++ return 0; ++} ++ ++#define H2C_MCC_MACID_BITMAP_DSC_LEN 4 ++int rtw89_fw_h2c_mcc_macid_bitamp(struct rtw89_dev *rtwdev, u8 group, u8 macid, ++ u8 *bitmap) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ u8 map_len; ++ u8 h2c_len; ++ ++ BUILD_BUG_ON(RTW89_MAX_MAC_ID_NUM % 8); ++ map_len = RTW89_MAX_MAC_ID_NUM / 8; ++ h2c_len = H2C_MCC_MACID_BITMAP_DSC_LEN + map_len; ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, h2c_len); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for mcc macid bitmap\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, h2c_len); ++ RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(skb->data, group); ++ RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(skb->data, macid); ++ RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(skb->data, map_len); ++ RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(skb->data, bitmap, map_len); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_MCC_MACID_BITMAP, 0, 0, ++ h2c_len); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_MCC_MACID_BITMAP); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_MCC_SYNC_LEN 4 ++int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source, ++ u8 target, u8 offset) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_SYNC_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for mcc sync\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_MCC_SYNC_LEN); ++ RTW89_SET_FWCMD_MCC_SYNC_GROUP(skb->data, group); ++ RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(skb->data, source); ++ RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(skb->data, target); ++ RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(skb->data, offset); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_MCC_SYNC, 0, 0, ++ H2C_MCC_SYNC_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_MCC_SYNC); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} ++ ++#define H2C_MCC_SET_DURATION_LEN 20 ++int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_duration *p) ++{ ++ struct rtw89_wait_info *wait = &rtwdev->mcc.wait; ++ struct sk_buff *skb; ++ unsigned int cond; ++ ++ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_MCC_SET_DURATION_LEN); ++ if (!skb) { ++ rtw89_err(rtwdev, ++ "failed to alloc skb for mcc set duration\n"); ++ return -ENOMEM; ++ } ++ ++ skb_put(skb, H2C_MCC_SET_DURATION_LEN); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(skb->data, p->group); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(skb->data, p->btc_in_group); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(skb->data, p->start_macid); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(skb->data, p->macid_x); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(skb->data, p->macid_y); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(skb->data, ++ p->start_tsf_low); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(skb->data, ++ p->start_tsf_high); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(skb->data, p->duration_x); ++ RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(skb->data, p->duration_y); ++ ++ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ++ H2C_CAT_MAC, ++ H2C_CL_MCC, ++ H2C_FUNC_MCC_SET_DURATION, 0, 0, ++ H2C_MCC_SET_DURATION_LEN); ++ ++ cond = RTW89_MCC_WAIT_COND(p->group, H2C_FUNC_MCC_SET_DURATION); ++ return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond); ++} +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/fw.h linux-6.2/drivers/net/wireless/realtek/rtw89/fw.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/fw.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/fw.h 2022-12-24 00:49:25.778376835 +0200 +@@ -176,6 +176,8 @@ struct rtw89_fw_hdr_section_info { + struct rtw89_fw_bin_info { + u8 section_num; + u32 hdr_len; ++ bool dynamic_hdr_en; ++ u32 dynamic_hdr_len; + struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM]; + }; + +@@ -197,6 +199,7 @@ struct rtw89_h2creg_sch_tx_en { + + #define RTW89_H2C_MAX_SIZE 2048 + #define RTW89_CHANNEL_TIME 45 ++#define RTW89_CHANNEL_TIME_6G 20 + #define RTW89_DFS_CHAN_TIME 105 + #define RTW89_OFF_CHAN_TIME 100 + #define RTW89_DWELL_TIME 20 +@@ -494,6 +497,8 @@ static inline void RTW89_SET_EDCA_PARAM( + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(23, 16)) + #define GET_FW_HDR_SUBINDEX(fwhdr) \ + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(31, 24)) ++#define GET_FW_HDR_LEN(fwhdr) \ ++ le32_get_bits(*((const __le32 *)(fwhdr) + 3), GENMASK(23, 16)) + #define GET_FW_HDR_MONTH(fwhdr) \ + le32_get_bits(*((const __le32 *)(fwhdr) + 4), GENMASK(7, 0)) + #define GET_FW_HDR_DATE(fwhdr) \ +@@ -506,8 +511,16 @@ static inline void RTW89_SET_EDCA_PARAM( + le32_get_bits(*((const __le32 *)(fwhdr) + 5), GENMASK(31, 0)) + #define GET_FW_HDR_SEC_NUM(fwhdr) \ + le32_get_bits(*((const __le32 *)(fwhdr) + 6), GENMASK(15, 8)) ++#define GET_FW_HDR_DYN_HDR(fwhdr) \ ++ le32_get_bits(*((const __le32 *)(fwhdr) + 7), BIT(16)) + #define GET_FW_HDR_CMD_VERSERION(fwhdr) \ + le32_get_bits(*((const __le32 *)(fwhdr) + 7), GENMASK(31, 24)) ++ ++#define GET_FW_DYNHDR_LEN(fwdynhdr) \ ++ le32_get_bits(*((const __le32 *)(fwdynhdr)), GENMASK(31, 0)) ++#define GET_FW_DYNHDR_COUNT(fwdynhdr) \ ++ le32_get_bits(*((const __le32 *)(fwdynhdr) + 1), GENMASK(31, 0)) ++ + static inline void SET_FW_HDR_PART_SIZE(void *fwhdr, u32 val) + { + le32p_replace_bits((__le32 *)fwhdr + 7, val, GENMASK(15, 0)); +@@ -1860,6 +1873,231 @@ static inline void RTW89_SET_FWCMD_PKT_D + le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8)); + } + ++static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_KEEP_ALIVE_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_KEEP_ALIVE_PERIOD(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(24, 16)); ++} ++ ++static inline void RTW89_SET_KEEP_ALIVE_MACID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(0)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_EN(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(1)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_DISCONNECT(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(2)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_MAC_ID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_LIMIT(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(0)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_DROP_ALL_PKT(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(1)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_RX_PARSE_AFTER_WAKE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(2)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_WAKE_BAR_PULLED(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(3)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_MAC_ID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_PAIRWISE_SEC_ALGO(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_GROUP_SEC_ALGO(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_WOW_GLOBAL_REMOTECTRL_INFO_CONTENT(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(0)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(1)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_HW_UNICAST_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(2)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_FW_UNICAST_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(3)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(4)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_REKEYP_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(5)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_EAP_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(6)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_ALL_DATA_ENABLE(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(7)); ++} ++ ++static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, BIT(0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 3, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_WKFM4(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 4, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_CRC(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, GENMASK(15, 0)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(22)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(23)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_UC(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(24)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_MC(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(25)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_BC(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(26)); ++} ++ ++static inline void RTW89_SET_WOW_CAM_UPD_VALID(void *h2c, u32 val) ++{ ++ le32p_replace_bits((__le32 *)h2c + 5, val, BIT(31)); ++} ++ + enum rtw89_btc_btf_h2c_class { + BTFC_SET = 0x10, + BTFC_GET = 0x11, +@@ -2529,6 +2767,355 @@ static inline void RTW89_SET_FWCMD_TSF32 + le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 16)); + } + ++enum rtw89_fw_mcc_c2h_rpt_cfg { ++ RTW89_FW_MCC_C2H_RPT_OFF = 0, ++ RTW89_FW_MCC_C2H_RPT_FAIL_ONLY = 1, ++ RTW89_FW_MCC_C2H_RPT_ALL = 2, ++}; ++ ++struct rtw89_fw_mcc_add_req { ++ u8 macid; ++ u8 central_ch_seg0; ++ u8 central_ch_seg1; ++ u8 primary_ch; ++ enum rtw89_bandwidth bandwidth: 4; ++ u32 group: 2; ++ u32 c2h_rpt: 2; ++ u32 dis_tx_null: 1; ++ u32 dis_sw_retry: 1; ++ u32 in_curr_ch: 1; ++ u32 sw_retry_count: 3; ++ u32 tx_null_early: 4; ++ u32 btc_in_2g: 1; ++ u32 pta_en: 1; ++ u32 rfk_by_pass: 1; ++ u32 ch_band_type: 2; ++ u32 rsvd0: 9; ++ u32 duration; ++ u8 courtesy_en; ++ u8 courtesy_num; ++ u8 courtesy_target; ++ u8 rsvd1; ++}; ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_MACID(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(3, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(5, 4)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 6)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(8)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(9)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(10)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(13, 11)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(17, 14)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(18)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_PTA_EN(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(19)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, BIT(20)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(22, 21)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_DURATION(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 3, val, BIT(0)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(23, 16)); ++} ++ ++struct rtw89_fw_mcc_start_req { ++ u32 group: 2; ++ u32 btc_in_group: 1; ++ u32 old_group_action: 2; ++ u32 old_group: 2; ++ u32 rsvd0: 9; ++ u32 notify_cnt: 3; ++ u32 rsvd1: 2; ++ u32 notify_rxdbg_en: 1; ++ u32 rsvd2: 2; ++ u32 macid: 8; ++ u32 tsf_low; ++ u32 tsf_high; ++}; ++ ++static inline void RTW89_SET_FWCMD_START_MCC_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, BIT(2)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 3)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(6, 5)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(18, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, BIT(21)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_MACID(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_TSF_LOW(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_START_MCC_TSF_HIGH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_STOP_MCC_MACID(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_STOP_MCC_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(9, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, BIT(10)); ++} ++ ++static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, BIT(2)); ++} ++ ++static inline void RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++struct rtw89_fw_mcc_tsf_req { ++ u8 group: 2; ++ u8 rsvd0: 6; ++ u8 macid_x; ++ u8 macid_y; ++ u8 rsvd1; ++}; ++ ++static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(void *cmd, ++ u8 *bitmap, u8 len) ++{ ++ memcpy((__le32 *)cmd + 1, bitmap, len); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SYNC_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); ++} ++ ++struct rtw89_fw_mcc_duration { ++ u32 group: 2; ++ u32 btc_in_group: 1; ++ u32 rsvd0: 5; ++ u32 start_macid: 8; ++ u32 macid_x: 8; ++ u32 macid_y: 8; ++ u32 start_tsf_low; ++ u32 start_tsf_high; ++ u32 duration_x; ++ u32 duration_y; ++}; ++ ++static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, BIT(2)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); ++} ++ ++static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0)); ++} ++ ++static ++inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(void *cmd, u32 val) ++{ ++ le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0)); ++} ++ + #define RTW89_C2H_HEADER_LEN 8 + + #define RTW89_GET_C2H_CATEGORY(c2h) \ +@@ -2540,6 +3127,20 @@ static inline void RTW89_SET_FWCMD_TSF32 + #define RTW89_GET_C2H_LEN(c2h) \ + le32_get_bits(*((const __le32 *)(c2h) + 1), GENMASK(13, 0)) + ++struct rtw89_fw_c2h_attr { ++ u8 category; ++ u8 class; ++ u8 func; ++ u16 len; ++}; ++ ++static inline struct rtw89_fw_c2h_attr *RTW89_SKB_C2H_CB(struct sk_buff *skb) ++{ ++ static_assert(sizeof(skb->cb) >= sizeof(struct rtw89_fw_c2h_attr)); ++ ++ return (struct rtw89_fw_c2h_attr *)skb->cb; ++} ++ + #define RTW89_GET_C2H_LOG_SRT_PRT(c2h) (char *)((__le32 *)(c2h) + 2) + #define RTW89_GET_C2H_LOG_LEN(len) ((len) - RTW89_C2H_HEADER_LEN) + +@@ -2607,6 +3208,55 @@ static inline void RTW89_SET_FWCMD_TSF32 + #define RTW89_GET_MAC_C2H_SCANOFLD_BAND(c2h) \ + le32_get_bits(*((const __le32 *)(c2h) + 5), GENMASK(25, 24)) + ++#define RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(1, 0)) ++#define RTW89_GET_MAC_C2H_MCC_RCV_ACK_H2C_FUNC(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(15, 8)) ++ ++#define RTW89_GET_MAC_C2H_MCC_REQ_ACK_GROUP(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(1, 0)) ++#define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_RETURN(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(7, 2)) ++#define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_FUNC(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(15, 8)) ++ ++struct rtw89_mac_mcc_tsf_rpt { ++ u32 macid_x; ++ u32 macid_y; ++ u32 tsf_x_low; ++ u32 tsf_x_high; ++ u32 tsf_y_low; ++ u32 tsf_y_high; ++}; ++ ++static_assert(sizeof(struct rtw89_mac_mcc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE); ++ ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_X(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(7, 0)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_Y(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(15, 8)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_GROUP(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(17, 16)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_X(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 1), GENMASK(31, 0)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_X(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 0)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_Y(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0)) ++#define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_Y(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0)) ++ ++#define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_STATUS(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(5, 0)) ++#define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_GROUP(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(7, 6)) ++#define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_MACID(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h)), GENMASK(15, 8)) ++#define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_LOW(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 1), GENMASK(31, 0)) ++#define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_HIGH(c2h) \ ++ le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 0)) ++ + #define RTW89_FW_HDR_SIZE 32 + #define RTW89_FW_SECTION_HDR_SIZE 16 + +@@ -2641,6 +3291,21 @@ struct fwcmd_hdr { + __le32 hdr1; + }; + ++union rtw89_compat_fw_hdr { ++ struct rtw89_mfw_hdr mfw_hdr; ++ u8 fw_hdr[RTW89_FW_HDR_SIZE]; ++}; ++ ++static inline u32 rtw89_compat_fw_hdr_ver_code(const void *fw_buf) ++{ ++ const union rtw89_compat_fw_hdr *compat = (typeof(compat))fw_buf; ++ ++ if (compat->mfw_hdr.sig == RTW89_MFW_SIG) ++ return RTW89_MFW_HDR_VER_CODE(&compat->mfw_hdr); ++ else ++ return RTW89_FW_HDR_VER_CODE(&compat->fw_hdr); ++} ++ + #define RTW89_H2C_RF_PAGE_SIZE 500 + #define RTW89_H2C_RF_PAGE_NUM 3 + struct rtw89_fw_h2c_rf_reg_info { +@@ -2676,6 +3341,14 @@ struct rtw89_fw_h2c_rf_reg_info { + #define H2C_FUNC_LOG_CFG 0x0 + #define H2C_FUNC_MAC_GENERAL_PKT 0x1 + ++/* CLASS 1 - WOW */ ++#define H2C_CL_MAC_WOW 0x1 ++#define H2C_FUNC_KEEP_ALIVE 0x0 ++#define H2C_FUNC_DISCONNECT_DETECT 0x1 ++#define H2C_FUNC_WOW_GLOBAL 0x2 ++#define H2C_FUNC_WAKEUP_CTRL 0x8 ++#define H2C_FUNC_WOW_CAM_UPD 0xC ++ + /* CLASS 2 - PS */ + #define H2C_CL_MAC_PS 0x2 + #define H2C_FUNC_MAC_LPS_PARM 0x0 +@@ -2720,6 +3393,25 @@ struct rtw89_fw_h2c_rf_reg_info { + #define H2C_CL_BA_CAM 0xc + #define H2C_FUNC_MAC_BA_CAM 0x0 + ++/* CLASS 14 - MCC */ ++#define H2C_CL_MCC 0xe ++enum rtw89_mcc_h2c_func { ++ H2C_FUNC_ADD_MCC = 0x0, ++ H2C_FUNC_START_MCC = 0x1, ++ H2C_FUNC_STOP_MCC = 0x2, ++ H2C_FUNC_DEL_MCC_GROUP = 0x3, ++ H2C_FUNC_RESET_MCC_GROUP = 0x4, ++ H2C_FUNC_MCC_REQ_TSF = 0x5, ++ H2C_FUNC_MCC_MACID_BITMAP = 0x6, ++ H2C_FUNC_MCC_SYNC = 0x7, ++ H2C_FUNC_MCC_SET_DURATION = 0x8, ++ ++ NUM_OF_RTW89_MCC_H2C_FUNC, ++}; ++ ++#define RTW89_MCC_WAIT_COND(group, func) \ ++ ((group) * NUM_OF_RTW89_MCC_H2C_FUNC + (func)) ++ + #define H2C_CAT_OUTSRC 0x2 + + #define H2C_CL_OUTSRC_RA 0x1 +@@ -2752,9 +3444,10 @@ struct rtw89_fw_h2c_rf_get_mccch { + + int rtw89_fw_check_rdy(struct rtw89_dev *rtwdev); + int rtw89_fw_recognize(struct rtw89_dev *rtwdev); +-void rtw89_early_fw_feature_recognize(struct device *device, +- const struct rtw89_chip_info *chip, +- u32 *early_feat_map); ++const struct firmware * ++rtw89_early_fw_feature_recognize(struct device *device, ++ const struct rtw89_chip_info *chip, ++ u32 *early_feat_map); + int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type); + int rtw89_load_firmware(struct rtw89_dev *rtwdev); + void rtw89_unload_firmware(struct rtw89_dev *rtwdev); +@@ -2845,6 +3538,38 @@ int rtw89_fw_h2c_p2p_act(struct rtw89_de + u8 act, u8 noa_id); + int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, + bool en); ++int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, ++ bool enable); ++int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, bool enable); ++int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, ++ bool enable); ++int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, bool enable); ++int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, ++ bool enable); ++int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, bool enable); ++int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev, ++ struct rtw89_wow_cam_info *cam_info); ++int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_add_req *p); ++int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_start_req *p); ++int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid, ++ bool prev_groups); ++int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group, ++ bool prev_groups); ++int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group); ++int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_tsf_req *req, ++ struct rtw89_mac_mcc_tsf_rpt *rpt); ++int rtw89_fw_h2c_mcc_macid_bitamp(struct rtw89_dev *rtwdev, u8 group, u8 macid, ++ u8 *bitmap); ++int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source, ++ u8 target, u8 offset); ++int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev, ++ const struct rtw89_fw_mcc_duration *p); + + static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev) + { +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/Kconfig linux-6.2/drivers/net/wireless/realtek/rtw89/Kconfig +--- linux-6.1/drivers/net/wireless/realtek/rtw89/Kconfig 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/Kconfig 2022-12-24 00:49:25.775376835 +0200 +@@ -19,6 +19,9 @@ config RTW89_PCI + config RTW89_8852A + tristate + ++config RTW89_8852B ++ tristate ++ + config RTW89_8852C + tristate + +@@ -33,6 +36,17 @@ config RTW89_8852AE + + 802.11ax PCIe wireless network (Wi-Fi 6) adapter + ++config RTW89_8852BE ++ tristate "Realtek 8852BE PCI wireless network (Wi-Fi 6) adapter" ++ depends on PCI ++ select RTW89_CORE ++ select RTW89_PCI ++ select RTW89_8852B ++ help ++ Select this option will enable support for 8852BE chipset ++ ++ 802.11ax PCIe wireless network (Wi-Fi 6) adapter ++ + config RTW89_8852CE + tristate "Realtek 8852CE PCI wireless network (Wi-Fi 6E) adapter" + depends on PCI +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/mac80211.c linux-6.2/drivers/net/wireless/realtek/rtw89/mac80211.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/mac80211.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/mac80211.c 2022-12-24 00:49:25.779376835 +0200 +@@ -14,6 +14,7 @@ + #include "sar.h" + #include "ser.h" + #include "util.h" ++#include "wow.h" + + static void rtw89_ops_tx(struct ieee80211_hw *hw, + struct ieee80211_tx_control *control, +@@ -124,18 +125,21 @@ static int rtw89_ops_add_interface(struc + RTW89_PORT_NUM); + if (rtwvif->port == RTW89_PORT_NUM) { + ret = -ENOSPC; ++ list_del_init(&rtwvif->list); + goto out; + } + + rtwvif->bcn_hit_cond = 0; + rtwvif->mac_idx = RTW89_MAC_0; + rtwvif->phy_idx = RTW89_PHY_0; ++ rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0; + rtwvif->hit_rule = 0; + ether_addr_copy(rtwvif->mac_addr, vif->addr); + + ret = rtw89_mac_add_vif(rtwdev, rtwvif); + if (ret) { + rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port); ++ list_del_init(&rtwvif->list); + goto out; + } + +@@ -173,6 +177,9 @@ static int rtw89_ops_change_interface(st + enum nl80211_iftype type, bool p2p) + { + struct rtw89_dev *rtwdev = hw->priv; ++ int ret; ++ ++ set_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags); + + rtw89_debug(rtwdev, RTW89_DBG_STATE, "change vif %pM (%d)->(%d), p2p (%d)->(%d)\n", + vif->addr, vif->type, type, vif->p2p, p2p); +@@ -182,7 +189,13 @@ static int rtw89_ops_change_interface(st + vif->type = type; + vif->p2p = p2p; + +- return rtw89_ops_add_interface(hw, vif); ++ ret = rtw89_ops_add_interface(hw, vif); ++ if (ret) ++ rtw89_warn(rtwdev, "failed to change interface %d\n", ret); ++ ++ clear_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags); ++ ++ return ret; + } + + static void rtw89_ops_configure_filter(struct ieee80211_hw *hw, +@@ -443,6 +456,7 @@ void rtw89_ops_stop_ap(struct ieee80211_ + struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; + + mutex_lock(&rtwdev->mutex); ++ rtw89_mac_stop_ap(rtwdev, rtwvif); + rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, NULL); + rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true); + mutex_unlock(&rtwdev->mutex); +@@ -916,6 +930,55 @@ static int rtw89_ops_set_tid_config(stru + return 0; + } + ++#ifdef CONFIG_PM ++static int rtw89_ops_suspend(struct ieee80211_hw *hw, ++ struct cfg80211_wowlan *wowlan) ++{ ++ struct rtw89_dev *rtwdev = hw->priv; ++ int ret; ++ ++ set_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags); ++ cancel_delayed_work_sync(&rtwdev->track_work); ++ ++ mutex_lock(&rtwdev->mutex); ++ ret = rtw89_wow_suspend(rtwdev, wowlan); ++ mutex_unlock(&rtwdev->mutex); ++ ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to suspend for wow %d\n", ret); ++ clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static int rtw89_ops_resume(struct ieee80211_hw *hw) ++{ ++ struct rtw89_dev *rtwdev = hw->priv; ++ int ret; ++ ++ mutex_lock(&rtwdev->mutex); ++ ret = rtw89_wow_resume(rtwdev); ++ if (ret) ++ rtw89_warn(rtwdev, "failed to resume for wow %d\n", ret); ++ mutex_unlock(&rtwdev->mutex); ++ ++ clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags); ++ ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work, ++ RTW89_TRACK_WORK_PERIOD); ++ ++ return ret ? 1 : 0; ++} ++ ++static void rtw89_ops_set_wakeup(struct ieee80211_hw *hw, bool enabled) ++{ ++ struct rtw89_dev *rtwdev = hw->priv; ++ ++ device_set_wakeup_enable(rtwdev->dev, enabled); ++} ++#endif ++ + const struct ieee80211_ops rtw89_ops = { + .tx = rtw89_ops_tx, + .wake_tx_queue = rtw89_ops_wake_tx_queue, +@@ -953,5 +1016,10 @@ const struct ieee80211_ops rtw89_ops = { + .set_sar_specs = rtw89_ops_set_sar_specs, + .sta_rc_update = rtw89_ops_sta_rc_update, + .set_tid_config = rtw89_ops_set_tid_config, ++#ifdef CONFIG_PM ++ .suspend = rtw89_ops_suspend, ++ .resume = rtw89_ops_resume, ++ .set_wakeup = rtw89_ops_set_wakeup, ++#endif + }; + EXPORT_SYMBOL(rtw89_ops); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/mac.c linux-6.2/drivers/net/wireless/realtek/rtw89/mac.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/mac.c 2022-12-31 22:58:05.367710726 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/mac.c 2022-12-24 00:49:25.779376835 +0200 +@@ -7,6 +7,7 @@ + #include "debug.h" + #include "fw.h" + #include "mac.h" ++#include "pci.h" + #include "ps.h" + #include "reg.h" + #include "util.h" +@@ -31,6 +32,8 @@ const u32 rtw89_mac_mem_base_addrs[RTW89 + [RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR, + [RTW89_MAC_MEM_CPU_LOCAL] = CPU_LOCAL_BASE_ADDR, + [RTW89_MAC_MEM_BSSID_CAM] = BSSID_CAM_BASE_ADDR, ++ [RTW89_MAC_MEM_TXD_FIFO_0_V1] = TXD_FIFO_0_BASE_ADDR_V1, ++ [RTW89_MAC_MEM_TXD_FIFO_1_V1] = TXD_FIFO_1_BASE_ADDR_V1, + }; + + static void rtw89_mac_mem_write(struct rtw89_dev *rtwdev, u32 offset, +@@ -272,106 +275,163 @@ static void rtw89_mac_dump_l0_to_l1(stru + } + } + +-static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev, +- enum mac_ax_err_info err) ++static void rtw89_mac_dump_dmac_err_status(struct rtw89_dev *rtwdev) + { +- u32 dmac_err, cmac_err; ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ u32 dmac_err; ++ int i, ret; + +- if (err != MAC_AX_ERR_L1_ERR_DMAC && +- err != MAC_AX_ERR_L0_PROMOTE_TO_L1 && +- err != MAC_AX_ERR_L0_ERR_CMAC0 && +- err != MAC_AX_ERR_L0_ERR_CMAC1) ++ ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL); ++ if (ret) { ++ rtw89_warn(rtwdev, "[DMAC] : DMAC not enabled\n"); + return; ++ } + +- rtw89_info(rtwdev, "--->\nerr=0x%x\n", err); +- rtw89_info(rtwdev, "R_AX_SER_DBG_INFO =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SER_DBG_INFO)); +- +- cmac_err = rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR); +- rtw89_info(rtwdev, "R_AX_CMAC_ERR_ISR =0x%08x\n", cmac_err); + dmac_err = rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR); +- rtw89_info(rtwdev, "R_AX_DMAC_ERR_ISR =0x%08x\n", dmac_err); ++ rtw89_info(rtwdev, "R_AX_DMAC_ERR_ISR=0x%08x\n", dmac_err); ++ rtw89_info(rtwdev, "R_AX_DMAC_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_DMAC_ERR_IMR)); + + if (dmac_err) { +- rtw89_info(rtwdev, "R_AX_WDE_ERR_FLAG_CFG =0x%08x ", +- rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG)); +- rtw89_info(rtwdev, "R_AX_PLE_ERR_FLAG_CFG =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG)); ++ rtw89_info(rtwdev, "R_AX_WDE_ERR_FLAG_CFG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG_NUM1)); ++ rtw89_info(rtwdev, "R_AX_PLE_ERR_FLAG_CFG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG_NUM1)); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_PLE_ERRFLAG_MSG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_ERRFLAG_MSG)); ++ rtw89_info(rtwdev, "R_AX_WDE_ERRFLAG_MSG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_WDE_ERRFLAG_MSG)); ++ rtw89_info(rtwdev, "R_AX_PLE_DBGERR_LOCKEN=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_LOCKEN)); ++ rtw89_info(rtwdev, "R_AX_PLE_DBGERR_STS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_STS)); ++ } + } + + if (dmac_err & B_AX_WDRLS_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_WDRLS_ERR_IMR =0x%08x ", ++ rtw89_info(rtwdev, "R_AX_WDRLS_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDRLS_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_WDRLS_ERR_ISR =0x%08x\n", ++ rtw89_info(rtwdev, "R_AX_WDRLS_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR)); ++ if (chip->chip_id == RTL8852C) ++ rtw89_info(rtwdev, "R_AX_RPQ_RXBD_IDX=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX_V1)); ++ else ++ rtw89_info(rtwdev, "R_AX_RPQ_RXBD_IDX=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX)); + } + + if (dmac_err & B_AX_WSEC_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_SEC_ERR_IMR_ISR =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_DEBUG)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D00 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D04 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D10 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D14 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D18 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D20 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D24 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D28 =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT)); +- rtw89_info(rtwdev, "SEC_local_Register 0x9D2C =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT)); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_SEC_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG_IMR)); ++ rtw89_info(rtwdev, "R_AX_SEC_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG)); ++ rtw89_info(rtwdev, "R_AX_SEC_ENG_CTRL=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); ++ rtw89_info(rtwdev, "R_AX_SEC_MPDU_PROC=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); ++ rtw89_info(rtwdev, "R_AX_SEC_CAM_ACCESS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); ++ rtw89_info(rtwdev, "R_AX_SEC_CAM_RDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); ++ rtw89_info(rtwdev, "R_AX_SEC_DEBUG1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_DEBUG1)); ++ rtw89_info(rtwdev, "R_AX_SEC_TX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); ++ rtw89_info(rtwdev, "R_AX_SEC_RX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); ++ ++ rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, ++ B_AX_DBG_SEL0, 0x8B); ++ rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, ++ B_AX_DBG_SEL1, 0x8B); ++ rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, ++ B_AX_SEL_0XC0_MASK, 1); ++ for (i = 0; i < 0x10; i++) { ++ rtw89_write32_mask(rtwdev, R_AX_SEC_ENG_CTRL, ++ B_AX_SEC_DBG_PORT_FIELD_MASK, i); ++ rtw89_info(rtwdev, "sel=%x,R_AX_SEC_DEBUG2=0x%08x\n", ++ i, rtw89_read32(rtwdev, R_AX_SEC_DEBUG2)); ++ } ++ } else { ++ rtw89_info(rtwdev, "R_AX_SEC_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_DEBUG)); ++ rtw89_info(rtwdev, "R_AX_SEC_ENG_CTRL=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); ++ rtw89_info(rtwdev, "R_AX_SEC_MPDU_PROC=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); ++ rtw89_info(rtwdev, "R_AX_SEC_CAM_ACCESS=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); ++ rtw89_info(rtwdev, "R_AX_SEC_CAM_RDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); ++ rtw89_info(rtwdev, "R_AX_SEC_CAM_WDATA=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA)); ++ rtw89_info(rtwdev, "R_AX_SEC_TX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); ++ rtw89_info(rtwdev, "R_AX_SEC_RX_DEBUG=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); ++ rtw89_info(rtwdev, "R_AX_SEC_TRX_PKT_CNT=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT)); ++ rtw89_info(rtwdev, "R_AX_SEC_TRX_BLK_CNT=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT)); ++ } + } + + if (dmac_err & B_AX_MPDU_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_MPDU_TX_ERR_IMR =0x%08x ", ++ rtw89_info(rtwdev, "R_AX_MPDU_TX_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_MPDU_TX_ERR_ISR =0x%08x\n", ++ rtw89_info(rtwdev, "R_AX_MPDU_TX_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR)); +- rtw89_info(rtwdev, "R_AX_MPDU_RX_ERR_IMR =0x%08x ", ++ rtw89_info(rtwdev, "R_AX_MPDU_RX_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_MPDU_RX_ERR_ISR =0x%08x\n", ++ rtw89_info(rtwdev, "R_AX_MPDU_RX_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR)); + } + + if (dmac_err & B_AX_STA_SCHEDULER_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_STA_SCHEDULER_ERR_IMR =0x%08x ", ++ rtw89_info(rtwdev, "R_AX_STA_SCHEDULER_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_STA_SCHEDULER_ERR_ISR= 0x%08x\n", ++ rtw89_info(rtwdev, "R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR)); + } + + if (dmac_err & B_AX_WDE_DLE_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_WDE_ERR_IMR=0x%08x ", ++ rtw89_info(rtwdev, "R_AX_WDE_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); + rtw89_info(rtwdev, "R_AX_WDE_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); +- rtw89_info(rtwdev, "R_AX_PLE_ERR_IMR=0x%08x ", ++ rtw89_info(rtwdev, "R_AX_PLE_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); + rtw89_info(rtwdev, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); +- dump_err_status_dispatcher(rtwdev); + } + + if (dmac_err & B_AX_TXPKTCTRL_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR)); +- rtw89_info(rtwdev, "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1)); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_B0_ERRFLAG_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_IMR)); ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_B0_ERRFLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_ISR)); ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_B1_ERRFLAG_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_IMR)); ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_B1_ERRFLAG_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_ISR)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR)); ++ rtw89_info(rtwdev, "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1)); ++ } + } + + if (dmac_err & B_AX_PLE_DLE_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_WDE_ERR_IMR=0x%08x ", ++ rtw89_info(rtwdev, "R_AX_WDE_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); + rtw89_info(rtwdev, "R_AX_WDE_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); +- rtw89_info(rtwdev, "R_AX_PLE_ERR_IMR=0x%08x ", ++ rtw89_info(rtwdev, "R_AX_PLE_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); + rtw89_info(rtwdev, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); +@@ -391,86 +451,190 @@ static void rtw89_mac_dump_err_status(st + rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_2)); + rtw89_info(rtwdev, "R_AX_PL_CPUQ_OP_STATUS=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_STATUS)); +- rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_0=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0)); +- rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_1=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1)); +- rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_2=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2)); +- dump_err_status_dispatcher(rtwdev); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_RX_CTRL0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL0)); ++ rtw89_info(rtwdev, "R_AX_RX_CTRL1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL1)); ++ rtw89_info(rtwdev, "R_AX_RX_CTRL2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RX_CTRL2)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_0=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0)); ++ rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_1=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1)); ++ rtw89_info(rtwdev, "R_AX_RXDMA_PKT_INFO_2=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2)); ++ } + } + + if (dmac_err & B_AX_PKTIN_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_PKTIN_ERR_IMR =0x%08x ", +- rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_PKTIN_ERR_ISR =0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR)); +- rtw89_info(rtwdev, "R_AX_PKTIN_ERR_IMR =0x%08x ", ++ rtw89_info(rtwdev, "R_AX_PKTIN_ERR_IMR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_PKTIN_ERR_ISR =0x%08x\n", ++ rtw89_info(rtwdev, "R_AX_PKTIN_ERR_ISR=0x%08x\n", + rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR)); + } + +- if (dmac_err & B_AX_DISPATCH_ERR_FLAG) +- dump_err_status_dispatcher(rtwdev); ++ if (dmac_err & B_AX_DISPATCH_ERR_FLAG) { ++ rtw89_info(rtwdev, "R_AX_HOST_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_CPU_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_OTHER_DISPATCHER_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR)); ++ } ++ ++ if (dmac_err & B_AX_BBRPT_ERR_FLAG) { ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_BBRPT_COM_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_COM_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); ++ rtw89_info(rtwdev, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); ++ } ++ } + +- if (dmac_err & B_AX_DLE_CPUIO_ERR_FLAG) { +- rtw89_info(rtwdev, "R_AX_CPUIO_ERR_IMR=0x%08x ", +- rtw89_read32(rtwdev, R_AX_CPUIO_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_CPUIO_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_CPUIO_ERR_ISR)); ++ if (dmac_err & B_AX_HAXIDMA_ERR_FLAG && chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_HAXIDMA_ERR_IMR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HAXI_IDCT_MSK)); ++ rtw89_info(rtwdev, "R_AX_HAXIDMA_ERR_ISR=0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_HAXI_IDCT)); + } ++} + +- if (dmac_err & BIT(11)) { +- rtw89_info(rtwdev, "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR)); ++static void rtw89_mac_dump_cmac_err_status(struct rtw89_dev *rtwdev, ++ u8 band) ++{ ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ u32 offset = 0; ++ u32 cmac_err; ++ int ret; ++ ++ ret = rtw89_mac_check_mac_en(rtwdev, band, RTW89_CMAC_SEL); ++ if (ret) { ++ if (band) ++ rtw89_warn(rtwdev, "[CMAC] : CMAC1 not enabled\n"); ++ else ++ rtw89_warn(rtwdev, "[CMAC] : CMAC0 not enabled\n"); ++ return; + } + ++ if (band) ++ offset = RTW89_MAC_AX_BAND_REG_OFFSET; ++ ++ cmac_err = rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset); ++ rtw89_info(rtwdev, "R_AX_CMAC_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset)); ++ rtw89_info(rtwdev, "R_AX_CMAC_FUNC_EN [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_FUNC_EN + offset)); ++ rtw89_info(rtwdev, "R_AX_CK_EN [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CK_EN + offset)); ++ + if (cmac_err & B_AX_SCHEDULE_TOP_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_SCHEDULE_ERR_IMR=0x%08x ", +- rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR)); +- rtw89_info(rtwdev, "R_AX_SCHEDULE_ERR_ISR=0x%04x\n", +- rtw89_read16(rtwdev, R_AX_SCHEDULE_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR + offset)); ++ rtw89_info(rtwdev, "R_AX_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR + offset)); + } + + if (cmac_err & B_AX_PTCL_TOP_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_PTCL_IMR0=0x%08x ", +- rtw89_read32(rtwdev, R_AX_PTCL_IMR0)); +- rtw89_info(rtwdev, "R_AX_PTCL_ISR0=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PTCL_ISR0)); ++ rtw89_info(rtwdev, "R_AX_PTCL_IMR0 [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PTCL_IMR0 + offset)); ++ rtw89_info(rtwdev, "R_AX_PTCL_ISR0 [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PTCL_ISR0 + offset)); + } + + if (cmac_err & B_AX_DMA_TOP_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_DLE_CTRL=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_DLE_CTRL)); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_RX_ERR_FLAG [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG + offset)); ++ rtw89_info(rtwdev, "R_AX_RX_ERR_FLAG_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG_IMR + offset)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_DLE_CTRL [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_DLE_CTRL + offset)); ++ } + } + +- if (cmac_err & B_AX_PHYINTF_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_PHYINFO_ERR_IMR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR)); ++ if (cmac_err & B_AX_DMA_TOP_ERR_IND || cmac_err & B_AX_WMAC_RX_ERR_IND) { ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_PHYINFO_ERR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR + offset)); ++ rtw89_info(rtwdev, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); ++ } + } + + if (cmac_err & B_AX_TXPWR_CTRL_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_TXPWR_IMR=0x%08x ", +- rtw89_read32(rtwdev, R_AX_TXPWR_IMR)); +- rtw89_info(rtwdev, "R_AX_TXPWR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_TXPWR_ISR)); +- } +- +- if (cmac_err & B_AX_WMAC_RX_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_DBGSEL_TRXPTCL=0x%08x ", +- rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL)); +- rtw89_info(rtwdev, "R_AX_PHYINFO_ERR_ISR=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR)); ++ rtw89_info(rtwdev, "R_AX_TXPWR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TXPWR_IMR + offset)); ++ rtw89_info(rtwdev, "R_AX_TXPWR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TXPWR_ISR + offset)); + } + + if (cmac_err & B_AX_WMAC_TX_ERR_IND) { +- rtw89_info(rtwdev, "R_AX_TMAC_ERR_IMR_ISR=0x%08x ", +- rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR)); +- rtw89_info(rtwdev, "R_AX_DBGSEL_TRXPTCL=0x%08x\n", +- rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL)); ++ if (chip->chip_id == RTL8852C) { ++ rtw89_info(rtwdev, "R_AX_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA + offset)); ++ rtw89_info(rtwdev, "R_AX_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA_MASK + offset)); ++ } else { ++ rtw89_info(rtwdev, "R_AX_TMAC_ERR_IMR_ISR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR + offset)); ++ } ++ rtw89_info(rtwdev, "R_AX_DBGSEL_TRXPTCL [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL + offset)); + } + ++ rtw89_info(rtwdev, "R_AX_CMAC_ERR_IMR [%d]=0x%08x\n", band, ++ rtw89_read32(rtwdev, R_AX_CMAC_ERR_IMR + offset)); ++} ++ ++static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev, ++ enum mac_ax_err_info err) ++{ ++ if (err != MAC_AX_ERR_L1_ERR_DMAC && ++ err != MAC_AX_ERR_L0_PROMOTE_TO_L1 && ++ err != MAC_AX_ERR_L0_ERR_CMAC0 && ++ err != MAC_AX_ERR_L0_ERR_CMAC1) ++ return; ++ ++ rtw89_info(rtwdev, "--->\nerr=0x%x\n", err); ++ rtw89_info(rtwdev, "R_AX_SER_DBG_INFO =0x%08x\n", ++ rtw89_read32(rtwdev, R_AX_SER_DBG_INFO)); ++ ++ rtw89_mac_dump_dmac_err_status(rtwdev); ++ rtw89_mac_dump_cmac_err_status(rtwdev, RTW89_MAC_0); ++ if (rtwdev->dbcc_en) ++ rtw89_mac_dump_cmac_err_status(rtwdev, RTW89_MAC_1); ++ + rtwdev->hci.ops->dump_err_status(rtwdev); + + if (err == MAC_AX_ERR_L0_PROMOTE_TO_L1) +@@ -1304,6 +1468,8 @@ const struct rtw89_mac_size_set rtw89_ma + .ple_qt47 = {525, 0, 32, 20, 1034, 13, 1199, 0, 1053, 62, 160, 1037,}, + /* PCIE 64 */ + .ple_qt58 = {147, 0, 16, 20, 157, 13, 229, 0, 172, 14, 24, 0,}, ++ /* 8852A PCIE WOW */ ++ .ple_qt_52a_wow = {264, 0, 32, 20, 64, 13, 1005, 0, 64, 128, 120,}, + }; + EXPORT_SYMBOL(rtw89_mac_size); + +@@ -1331,6 +1497,60 @@ static const struct rtw89_dle_mem *get_d + return cfg; + } + ++static bool mac_is_txq_empty(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_mac_dle_dfi_qempty qempty; ++ u32 qnum, qtmp, val32, msk32; ++ int i, j, ret; ++ ++ qnum = rtwdev->chip->wde_qempty_acq_num; ++ qempty.dle_type = DLE_CTRL_TYPE_WDE; ++ ++ for (i = 0; i < qnum; i++) { ++ qempty.grpsel = i; ++ ret = dle_dfi_qempty(rtwdev, &qempty); ++ if (ret) { ++ rtw89_warn(rtwdev, "dle dfi acq empty %d\n", ret); ++ return false; ++ } ++ qtmp = qempty.qempty; ++ for (j = 0 ; j < QEMP_ACQ_GRP_MACID_NUM; j++) { ++ val32 = FIELD_GET(QEMP_ACQ_GRP_QSEL_MASK, qtmp); ++ if (val32 != QEMP_ACQ_GRP_QSEL_MASK) ++ return false; ++ qtmp >>= QEMP_ACQ_GRP_QSEL_SH; ++ } ++ } ++ ++ qempty.grpsel = rtwdev->chip->wde_qempty_mgq_sel; ++ ret = dle_dfi_qempty(rtwdev, &qempty); ++ if (ret) { ++ rtw89_warn(rtwdev, "dle dfi mgq empty %d\n", ret); ++ return false; ++ } ++ msk32 = B_CMAC0_MGQ_NORMAL | B_CMAC0_MGQ_NO_PWRSAV | B_CMAC0_CPUMGQ; ++ if ((qempty.qempty & msk32) != msk32) ++ return false; ++ ++ if (rtwdev->dbcc_en) { ++ msk32 |= B_CMAC1_MGQ_NORMAL | B_CMAC1_MGQ_NO_PWRSAV | B_CMAC1_CPUMGQ; ++ if ((qempty.qempty & msk32) != msk32) ++ return false; ++ } ++ ++ msk32 = B_AX_WDE_EMPTY_QTA_DMAC_WLAN_CPU | B_AX_WDE_EMPTY_QTA_DMAC_DATA_CPU | ++ B_AX_PLE_EMPTY_QTA_DMAC_WLAN_CPU | B_AX_PLE_EMPTY_QTA_DMAC_H2C | ++ B_AX_WDE_EMPTY_QUE_OTHERS | B_AX_PLE_EMPTY_QUE_DMAC_MPDU_TX | ++ B_AX_WDE_EMPTY_QTA_DMAC_CPUIO | B_AX_PLE_EMPTY_QTA_DMAC_CPUIO | ++ B_AX_WDE_EMPTY_QUE_DMAC_PKTIN | B_AX_WDE_EMPTY_QTA_DMAC_HIF | ++ B_AX_PLE_EMPTY_QUE_DMAC_SEC_TX | B_AX_WDE_EMPTY_QTA_DMAC_PKTIN | ++ B_AX_PLE_EMPTY_QTA_DMAC_B0_TXPL | B_AX_PLE_EMPTY_QTA_DMAC_B1_TXPL | ++ B_AX_PLE_EMPTY_QTA_DMAC_MPDU_TX; ++ val32 = rtw89_read32(rtwdev, R_AX_DLE_EMPTY0); ++ ++ return (val32 & msk32) == msk32; ++} ++ + static inline u32 dle_used_size(const struct rtw89_dle_size *wde, + const struct rtw89_dle_size *ple) + { +@@ -1474,8 +1694,48 @@ static void ple_quota_cfg(struct rtw89_d + SET_QUOTA(tx_rpt, PLE, 11); + } + ++int rtw89_mac_resize_ple_rx_quota(struct rtw89_dev *rtwdev, bool wow) ++{ ++ const struct rtw89_ple_quota *min_cfg, *max_cfg; ++ const struct rtw89_dle_mem *cfg; ++ u32 val; ++ ++ if (rtwdev->chip->chip_id == RTL8852C) ++ return 0; ++ ++ if (rtwdev->mac.qta_mode != RTW89_QTA_SCC) { ++ rtw89_err(rtwdev, "[ERR]support SCC mode only\n"); ++ return -EINVAL; ++ } ++ ++ if (wow) ++ cfg = get_dle_mem_cfg(rtwdev, RTW89_QTA_WOW); ++ else ++ cfg = get_dle_mem_cfg(rtwdev, RTW89_QTA_SCC); ++ if (!cfg) { ++ rtw89_err(rtwdev, "[ERR]get_dle_mem_cfg\n"); ++ return -EINVAL; ++ } ++ ++ min_cfg = cfg->ple_min_qt; ++ max_cfg = cfg->ple_max_qt; ++ SET_QUOTA(cma0_dma, PLE, 6); ++ SET_QUOTA(cma1_dma, PLE, 7); ++ ++ return 0; ++} + #undef SET_QUOTA + ++void rtw89_mac_hw_mgnt_sec(struct rtw89_dev *rtwdev, bool enable) ++{ ++ u32 msk32 = B_AX_UC_MGNT_DEC | B_AX_BMC_MGNT_DEC; ++ ++ if (enable) ++ rtw89_write32_set(rtwdev, R_AX_SEC_ENG_CTRL, msk32); ++ else ++ rtw89_write32_clr(rtwdev, R_AX_SEC_ENG_CTRL, msk32); ++} ++ + static void dle_quota_cfg(struct rtw89_dev *rtwdev, + const struct rtw89_dle_mem *cfg, + u16 ext_wde_min_qt_wcpu) +@@ -1825,10 +2085,10 @@ static int scheduler_init(struct rtw89_d + return 0; + } + +-static int rtw89_mac_typ_fltr_opt(struct rtw89_dev *rtwdev, +- enum rtw89_machdr_frame_type type, +- enum rtw89_mac_fwd_target fwd_target, +- u8 mac_idx) ++int rtw89_mac_typ_fltr_opt(struct rtw89_dev *rtwdev, ++ enum rtw89_machdr_frame_type type, ++ enum rtw89_mac_fwd_target fwd_target, ++ u8 mac_idx) + { + u32 reg; + u32 val; +@@ -3112,7 +3372,7 @@ static void rtw89_disable_fw_watchdog(st + rtw89_mac_mem_write(rtwdev, R_AX_WDT_STATUS, val32, RTW89_MAC_MEM_CPU_LOCAL); + } + +-static void rtw89_mac_disable_cpu(struct rtw89_dev *rtwdev) ++void rtw89_mac_disable_cpu(struct rtw89_dev *rtwdev) + { + clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags); + +@@ -3127,8 +3387,7 @@ static void rtw89_mac_disable_cpu(struct + rtw89_write32_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); + } + +-static int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, +- bool dlfw) ++int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw) + { + u32 val; + int ret; +@@ -3267,11 +3526,6 @@ int rtw89_mac_partial_init(struct rtw89_ + return ret; + } + +- rtw89_mac_disable_cpu(rtwdev); +- ret = rtw89_mac_enable_cpu(rtwdev, 0, true); +- if (ret) +- return ret; +- + ret = rtw89_fw_download(rtwdev, RTW89_FW_NORMAL); + if (ret) + return ret; +@@ -3346,6 +3600,13 @@ int rtw89_mac_set_macid_pause(struct rtw + u8 grp = macid >> 5; + int ret; + ++ /* If this is called by change_interface() in the case of P2P, it could ++ * be power-off, so ignore this operation. ++ */ ++ if (test_bit(RTW89_FLAG_CHANGING_INTERFACE, rtwdev->flags) && ++ !test_bit(RTW89_FLAG_POWERON, rtwdev->flags)) ++ return 0; ++ + ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_CMAC_SEL); + if (ret) + return ret; +@@ -3616,11 +3877,16 @@ static void rtw89_mac_port_cfg_hiq_drop( + } + + static void rtw89_mac_port_cfg_func_en(struct rtw89_dev *rtwdev, +- struct rtw89_vif *rtwvif) ++ struct rtw89_vif *rtwvif, bool enable) + { + const struct rtw89_port_reg *p = &rtw_port_base; + +- rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg, B_AX_PORT_FUNC_EN); ++ if (enable) ++ rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg, ++ B_AX_PORT_FUNC_EN); ++ else ++ rtw89_write32_port_clr(rtwdev, rtwvif, p->port_cfg, ++ B_AX_PORT_FUNC_EN); + } + + static void rtw89_mac_port_cfg_bcn_early(struct rtw89_dev *rtwdev, +@@ -3652,6 +3918,49 @@ static void rtw89_mac_port_cfg_tbtt_shif + B_AX_TBTT_SHIFT_OFST_MASK, val); + } + ++static void rtw89_mac_port_tsf_sync(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ struct rtw89_vif *rtwvif_src, u8 offset, ++ int *n_offset) ++{ ++ u32 val, reg; ++ ++ if (rtwvif->net_type != RTW89_NET_TYPE_AP_MODE || rtwvif == rtwvif_src) ++ return; ++ ++ /* adjust offset randomly to avoid beacon conflict */ ++ offset = offset - offset / 4 + get_random_u32() % (offset / 2); ++ val = RTW89_PORT_OFFSET_MS_TO_32US((*n_offset)++, offset); ++ reg = rtw89_mac_reg_by_idx(R_AX_PORT0_TSF_SYNC + rtwvif->port * 4, ++ rtwvif->mac_idx); ++ ++ rtw89_write32_mask(rtwdev, reg, B_AX_SYNC_PORT_SRC, rtwvif_src->port); ++ rtw89_write32_mask(rtwdev, reg, B_AX_SYNC_PORT_OFFSET_VAL, val); ++ rtw89_write32_set(rtwdev, reg, B_AX_SYNC_NOW); ++} ++ ++static void rtw89_mac_port_tsf_resync_all(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_vif *src = NULL, *tmp; ++ u8 offset = 100, vif_aps = 0; ++ int n_offset = 1; ++ ++ rtw89_for_each_rtwvif(rtwdev, tmp) { ++ if (!src || tmp->net_type == RTW89_NET_TYPE_INFRA) ++ src = tmp; ++ if (tmp->net_type == RTW89_NET_TYPE_AP_MODE) ++ vif_aps++; ++ } ++ ++ if (vif_aps == 0) ++ return; ++ ++ offset /= (vif_aps + 1); ++ ++ rtw89_for_each_rtwvif(rtwdev, tmp) ++ rtw89_mac_port_tsf_sync(rtwdev, tmp, src, offset, &n_offset); ++} ++ + int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) + { + int ret; +@@ -3671,6 +3980,10 @@ int rtw89_mac_vif_init(struct rtw89_dev + if (ret) + return ret; + ++ ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true); ++ if (ret) ++ return ret; ++ + ret = rtw89_cam_init(rtwdev, rtwvif); + if (ret) + return ret; +@@ -3729,7 +4042,8 @@ int rtw89_mac_port_update(struct rtw89_d + rtw89_mac_port_cfg_tbtt_shift(rtwdev, rtwvif); + rtw89_mac_port_cfg_bss_color(rtwdev, rtwvif); + rtw89_mac_port_cfg_mbssid(rtwdev, rtwvif); +- rtw89_mac_port_cfg_func_en(rtwdev, rtwvif); ++ rtw89_mac_port_cfg_func_en(rtwdev, rtwvif, true); ++ rtw89_mac_port_tsf_resync_all(rtwdev); + fsleep(BCN_ERLY_SET_DLY); + rtw89_mac_port_cfg_bcn_early(rtwdev, rtwvif); + +@@ -3780,6 +4094,11 @@ void rtw89_mac_set_he_obss_narrow_bw_ru( + rtw89_write32_set(rtwdev, reg, B_AX_RXTRIG_RU26_DIS); + } + ++void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) ++{ ++ rtw89_mac_port_cfg_func_en(rtwdev, rtwvif, false); ++} ++ + int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) + { + int ret; +@@ -3926,6 +4245,164 @@ rtw89_mac_c2h_tsf32_toggle_rpt(struct rt + { + } + ++static void ++rtw89_mac_c2h_mcc_rcv_ack(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) ++{ ++ u8 group = RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h->data); ++ u8 func = RTW89_GET_MAC_C2H_MCC_RCV_ACK_H2C_FUNC(c2h->data); ++ ++ switch (func) { ++ case H2C_FUNC_ADD_MCC: ++ case H2C_FUNC_START_MCC: ++ case H2C_FUNC_STOP_MCC: ++ case H2C_FUNC_DEL_MCC_GROUP: ++ case H2C_FUNC_RESET_MCC_GROUP: ++ case H2C_FUNC_MCC_REQ_TSF: ++ case H2C_FUNC_MCC_MACID_BITMAP: ++ case H2C_FUNC_MCC_SYNC: ++ case H2C_FUNC_MCC_SET_DURATION: ++ break; ++ default: ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "invalid MCC C2H RCV ACK: func %d\n", func); ++ return; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "MCC C2H RCV ACK: group %d, func %d\n", group, func); ++} ++ ++static void ++rtw89_mac_c2h_mcc_req_ack(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) ++{ ++ u8 group = RTW89_GET_MAC_C2H_MCC_REQ_ACK_GROUP(c2h->data); ++ u8 func = RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_FUNC(c2h->data); ++ u8 retcode = RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_RETURN(c2h->data); ++ struct rtw89_completion_data data = {}; ++ unsigned int cond; ++ bool next = false; ++ ++ switch (func) { ++ case H2C_FUNC_MCC_REQ_TSF: ++ next = true; ++ break; ++ case H2C_FUNC_MCC_MACID_BITMAP: ++ case H2C_FUNC_MCC_SYNC: ++ case H2C_FUNC_MCC_SET_DURATION: ++ break; ++ case H2C_FUNC_ADD_MCC: ++ case H2C_FUNC_START_MCC: ++ case H2C_FUNC_STOP_MCC: ++ case H2C_FUNC_DEL_MCC_GROUP: ++ case H2C_FUNC_RESET_MCC_GROUP: ++ default: ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "invalid MCC C2H REQ ACK: func %d\n", func); ++ return; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "MCC C2H REQ ACK: group %d, func %d, return code %d\n", ++ group, func, retcode); ++ ++ if (!retcode && next) ++ return; ++ ++ data.err = !!retcode; ++ cond = RTW89_MCC_WAIT_COND(group, func); ++ rtw89_complete_cond(&rtwdev->mcc.wait, cond, &data); ++} ++ ++static void ++rtw89_mac_c2h_mcc_tsf_rpt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) ++{ ++ u8 group = RTW89_GET_MAC_C2H_MCC_TSF_RPT_GROUP(c2h->data); ++ struct rtw89_completion_data data = {}; ++ struct rtw89_mac_mcc_tsf_rpt *rpt; ++ unsigned int cond; ++ ++ rpt = (struct rtw89_mac_mcc_tsf_rpt *)data.buf; ++ rpt->macid_x = RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_X(c2h->data); ++ rpt->macid_y = RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_Y(c2h->data); ++ rpt->tsf_x_low = RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_X(c2h->data); ++ rpt->tsf_x_high = RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_X(c2h->data); ++ rpt->tsf_y_low = RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_Y(c2h->data); ++ rpt->tsf_y_high = RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_Y(c2h->data); ++ ++ cond = RTW89_MCC_WAIT_COND(group, H2C_FUNC_MCC_REQ_TSF); ++ rtw89_complete_cond(&rtwdev->mcc.wait, cond, &data); ++} ++ ++static void ++rtw89_mac_c2h_mcc_status_rpt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) ++{ ++ u8 group = RTW89_GET_MAC_C2H_MCC_STATUS_RPT_GROUP(c2h->data); ++ u8 macid = RTW89_GET_MAC_C2H_MCC_STATUS_RPT_MACID(c2h->data); ++ u8 status = RTW89_GET_MAC_C2H_MCC_STATUS_RPT_STATUS(c2h->data); ++ u32 tsf_low = RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_LOW(c2h->data); ++ u32 tsf_high = RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_HIGH(c2h->data); ++ struct rtw89_completion_data data = {}; ++ unsigned int cond; ++ bool rsp = true; ++ bool err; ++ u8 func; ++ ++ switch (status) { ++ case RTW89_MAC_MCC_ADD_ROLE_OK: ++ case RTW89_MAC_MCC_ADD_ROLE_FAIL: ++ func = H2C_FUNC_ADD_MCC; ++ err = status == RTW89_MAC_MCC_ADD_ROLE_FAIL; ++ break; ++ case RTW89_MAC_MCC_START_GROUP_OK: ++ case RTW89_MAC_MCC_START_GROUP_FAIL: ++ func = H2C_FUNC_START_MCC; ++ err = status == RTW89_MAC_MCC_START_GROUP_FAIL; ++ break; ++ case RTW89_MAC_MCC_STOP_GROUP_OK: ++ case RTW89_MAC_MCC_STOP_GROUP_FAIL: ++ func = H2C_FUNC_STOP_MCC; ++ err = status == RTW89_MAC_MCC_STOP_GROUP_FAIL; ++ break; ++ case RTW89_MAC_MCC_DEL_GROUP_OK: ++ case RTW89_MAC_MCC_DEL_GROUP_FAIL: ++ func = H2C_FUNC_DEL_MCC_GROUP; ++ err = status == RTW89_MAC_MCC_DEL_GROUP_FAIL; ++ break; ++ case RTW89_MAC_MCC_RESET_GROUP_OK: ++ case RTW89_MAC_MCC_RESET_GROUP_FAIL: ++ func = H2C_FUNC_RESET_MCC_GROUP; ++ err = status == RTW89_MAC_MCC_RESET_GROUP_FAIL; ++ break; ++ case RTW89_MAC_MCC_SWITCH_CH_OK: ++ case RTW89_MAC_MCC_SWITCH_CH_FAIL: ++ case RTW89_MAC_MCC_TXNULL0_OK: ++ case RTW89_MAC_MCC_TXNULL0_FAIL: ++ case RTW89_MAC_MCC_TXNULL1_OK: ++ case RTW89_MAC_MCC_TXNULL1_FAIL: ++ case RTW89_MAC_MCC_SWITCH_EARLY: ++ case RTW89_MAC_MCC_TBTT: ++ case RTW89_MAC_MCC_DURATION_START: ++ case RTW89_MAC_MCC_DURATION_END: ++ rsp = false; ++ break; ++ default: ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "invalid MCC C2H STS RPT: status %d\n", status); ++ return; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_FW, ++ "MCC C2H STS RPT: group %d, macid %d, status %d, tsf {%d, %d}\n", ++ group, macid, status, tsf_low, tsf_high); ++ ++ if (!rsp) ++ return; ++ ++ data.err = err; ++ cond = RTW89_MCC_WAIT_COND(group, func); ++ rtw89_complete_cond(&rtwdev->mcc.wait, cond, &data); ++} ++ + static + void (* const rtw89_mac_c2h_ofld_handler[])(struct rtw89_dev *rtwdev, + struct sk_buff *c2h, u32 len) = { +@@ -3947,6 +4424,25 @@ void (* const rtw89_mac_c2h_info_handler + [RTW89_MAC_C2H_FUNC_BCN_CNT] = rtw89_mac_c2h_bcn_cnt, + }; + ++static ++void (* const rtw89_mac_c2h_mcc_handler[])(struct rtw89_dev *rtwdev, ++ struct sk_buff *c2h, u32 len) = { ++ [RTW89_MAC_C2H_FUNC_MCC_RCV_ACK] = rtw89_mac_c2h_mcc_rcv_ack, ++ [RTW89_MAC_C2H_FUNC_MCC_REQ_ACK] = rtw89_mac_c2h_mcc_req_ack, ++ [RTW89_MAC_C2H_FUNC_MCC_TSF_RPT] = rtw89_mac_c2h_mcc_tsf_rpt, ++ [RTW89_MAC_C2H_FUNC_MCC_STATUS_RPT] = rtw89_mac_c2h_mcc_status_rpt, ++}; ++ ++bool rtw89_mac_c2h_chk_atomic(struct rtw89_dev *rtwdev, u8 class, u8 func) ++{ ++ switch (class) { ++ default: ++ return false; ++ case RTW89_MAC_C2H_CLASS_MCC: ++ return true; ++ } ++} ++ + void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, + u32 len, u8 class, u8 func) + { +@@ -3962,6 +4458,10 @@ void rtw89_mac_c2h_handle(struct rtw89_d + if (func < RTW89_MAC_C2H_FUNC_OFLD_MAX) + handler = rtw89_mac_c2h_ofld_handler[func]; + break; ++ case RTW89_MAC_C2H_CLASS_MCC: ++ if (func < NUM_OF_RTW89_MAC_C2H_FUNC_MCC) ++ handler = rtw89_mac_c2h_mcc_handler[func]; ++ break; + case RTW89_MAC_C2H_CLASS_FWDBG: + return; + default: +@@ -4817,6 +5317,7 @@ int rtw89_mac_read_xtal_si(struct rtw89_ + + return 0; + } ++EXPORT_SYMBOL(rtw89_mac_read_xtal_si); + + static + void rtw89_mac_pkt_drop_sta(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta) +@@ -4862,3 +5363,24 @@ void rtw89_mac_pkt_drop_vif(struct rtw89 + rtw89_mac_pkt_drop_vif_iter, + rtwvif); + } ++ ++int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev, ++ enum rtw89_mac_idx band) ++{ ++ struct rtw89_pkt_drop_params params = {0}; ++ bool empty; ++ int i, ret = 0, try_cnt = 3; ++ ++ params.mac_band = band; ++ params.sel = RTW89_PKT_DROP_SEL_BAND_ONCE; ++ ++ for (i = 0; i < try_cnt; i++) { ++ ret = read_poll_timeout(mac_is_txq_empty, empty, empty, 50, ++ 50000, false, rtwdev); ++ if (ret) ++ rtw89_fw_h2c_pkt_drop(rtwdev, ¶ms); ++ else ++ return 0; ++ } ++ return ret; ++} +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/mac.h linux-6.2/drivers/net/wireless/realtek/rtw89/mac.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/mac.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/mac.h 2022-12-24 00:49:25.779376835 +0200 +@@ -168,6 +168,8 @@ enum rtw89_mac_ax_l0_to_l1_event { + MAC_AX_L0_TO_L1_EVENT_MAX = 15, + }; + ++#define RTW89_PORT_OFFSET_MS_TO_32US(n, shift_ms) ((n) * (shift_ms) * 1000 / 32) ++ + enum rtw89_mac_dbg_port_sel { + /* CMAC 0 related */ + RTW89_DBG_PORT_SEL_PTCL_C0 = 0, +@@ -211,6 +213,51 @@ enum rtw89_mac_dbg_port_sel { + RTW89_DBG_PORT_SEL_PLE_QUEMGN_QLNKTBL, + RTW89_DBG_PORT_SEL_PLE_QUEMGN_QEMPTY, + RTW89_DBG_PORT_SEL_PKTINFO, ++ /* DISPATCHER related */ ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX0, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX1, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX2, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX3, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX4, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX5, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX6, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX7, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX8, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TX9, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXA, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXB, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXC, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXD, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXE, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_TXF, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX0, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX1, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX3, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX4, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX5, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX6, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX7, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX8, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TX9, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TXA, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TXB, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_TXC, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX0, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX1, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX2, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX3, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX4, ++ RTW89_DBG_PORT_SEL_DSPT_HDT_RX5, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_0, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_1, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_2, ++ RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P1, ++ RTW89_DBG_PORT_SEL_DSPT_STF_CTRL, ++ RTW89_DBG_PORT_SEL_DSPT_ADDR_CTRL, ++ RTW89_DBG_PORT_SEL_DSPT_WDE_INTF, ++ RTW89_DBG_PORT_SEL_DSPT_PLE_INTF, ++ RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL, + /* PCIE related */ + RTW89_DBG_PORT_SEL_PCIE_TXDMA, + RTW89_DBG_PORT_SEL_PCIE_RXDMA, +@@ -245,6 +292,8 @@ enum rtw89_mac_dbg_port_sel { + #define BCN_IE_CAM1_BASE_ADDR 0x188A0000 + #define TXD_FIFO_0_BASE_ADDR 0x18856200 + #define TXD_FIFO_1_BASE_ADDR 0x188A1080 ++#define TXD_FIFO_0_BASE_ADDR_V1 0x18856400 /* for 8852C */ ++#define TXD_FIFO_1_BASE_ADDR_V1 0x188A1080 /* for 8852C */ + #define TXDATA_FIFO_0_BASE_ADDR 0x18856000 + #define TXDATA_FIFO_1_BASE_ADDR 0x188A1000 + #define CPU_LOCAL_BASE_ADDR 0x18003000 +@@ -271,6 +320,8 @@ enum rtw89_mac_mem_sel { + RTW89_MAC_MEM_TXDATA_FIFO_1, + RTW89_MAC_MEM_CPU_LOCAL, + RTW89_MAC_MEM_BSSID_CAM, ++ RTW89_MAC_MEM_TXD_FIFO_0_V1, ++ RTW89_MAC_MEM_TXD_FIFO_1_V1, + + /* keep last */ + RTW89_MAC_MEM_NUM, +@@ -319,6 +370,15 @@ enum rtw89_mac_c2h_info_func { + RTW89_MAC_C2H_FUNC_INFO_MAX, + }; + ++enum rtw89_mac_c2h_mcc_func { ++ RTW89_MAC_C2H_FUNC_MCC_RCV_ACK = 0, ++ RTW89_MAC_C2H_FUNC_MCC_REQ_ACK = 1, ++ RTW89_MAC_C2H_FUNC_MCC_TSF_RPT = 2, ++ RTW89_MAC_C2H_FUNC_MCC_STATUS_RPT = 3, ++ ++ NUM_OF_RTW89_MAC_C2H_FUNC_MCC, ++}; ++ + enum rtw89_mac_c2h_class { + RTW89_MAC_C2H_CLASS_INFO, + RTW89_MAC_C2H_CLASS_OFLD, +@@ -329,6 +389,31 @@ enum rtw89_mac_c2h_class { + RTW89_MAC_C2H_CLASS_MAX, + }; + ++enum rtw89_mac_mcc_status { ++ RTW89_MAC_MCC_ADD_ROLE_OK = 0, ++ RTW89_MAC_MCC_START_GROUP_OK = 1, ++ RTW89_MAC_MCC_STOP_GROUP_OK = 2, ++ RTW89_MAC_MCC_DEL_GROUP_OK = 3, ++ RTW89_MAC_MCC_RESET_GROUP_OK = 4, ++ RTW89_MAC_MCC_SWITCH_CH_OK = 5, ++ RTW89_MAC_MCC_TXNULL0_OK = 6, ++ RTW89_MAC_MCC_TXNULL1_OK = 7, ++ ++ RTW89_MAC_MCC_SWITCH_EARLY = 10, ++ RTW89_MAC_MCC_TBTT = 11, ++ RTW89_MAC_MCC_DURATION_START = 12, ++ RTW89_MAC_MCC_DURATION_END = 13, ++ ++ RTW89_MAC_MCC_ADD_ROLE_FAIL = 20, ++ RTW89_MAC_MCC_START_GROUP_FAIL = 21, ++ RTW89_MAC_MCC_STOP_GROUP_FAIL = 22, ++ RTW89_MAC_MCC_DEL_GROUP_FAIL = 23, ++ RTW89_MAC_MCC_RESET_GROUP_FAIL = 24, ++ RTW89_MAC_MCC_SWITCH_CH_FAIL = 25, ++ RTW89_MAC_MCC_TXNULL0_FAIL = 26, ++ RTW89_MAC_MCC_TXNULL1_FAIL = 27, ++}; ++ + struct rtw89_mac_ax_coex { + #define RTW89_MAC_AX_COEX_RTK_MODE 0 + #define RTW89_MAC_AX_COEX_CSR_MODE 1 +@@ -391,6 +476,7 @@ enum rtw89_mac_bf_rrsc_rate { + #define ACCESS_CMAC(_addr) \ + ({typeof(_addr) __addr = (_addr); \ + __addr >= R_AX_CMAC_REG_START && __addr <= R_AX_CMAC_REG_END; }) ++#define RTW89_MAC_AX_BAND_REG_OFFSET 0x2000 + + #define PTCL_IDLE_POLL_CNT 10000 + #define SW_CVR_DUR_US 8 +@@ -416,6 +502,17 @@ enum rtw89_mac_bf_rrsc_rate { + #define S_AX_PLE_PAGE_SEL_128 1 + #define S_AX_PLE_PAGE_SEL_256 2 + ++#define B_CMAC0_MGQ_NORMAL BIT(2) ++#define B_CMAC0_MGQ_NO_PWRSAV BIT(3) ++#define B_CMAC0_CPUMGQ BIT(4) ++#define B_CMAC1_MGQ_NORMAL BIT(10) ++#define B_CMAC1_MGQ_NO_PWRSAV BIT(11) ++#define B_CMAC1_CPUMGQ BIT(12) ++ ++#define QEMP_ACQ_GRP_MACID_NUM 8 ++#define QEMP_ACQ_GRP_QSEL_SH 4 ++#define QEMP_ACQ_GRP_QSEL_MASK 0xF ++ + #define SDIO_LOCAL_BASE_ADDR 0x80000000 + + #define PWR_CMD_WRITE 0 +@@ -715,6 +812,7 @@ struct rtw89_mac_size_set { + const struct rtw89_ple_quota ple_qt46; + const struct rtw89_ple_quota ple_qt47; + const struct rtw89_ple_quota ple_qt58; ++ const struct rtw89_ple_quota ple_qt_52a_wow; + }; + + extern const struct rtw89_mac_size_set rtw89_mac_size; +@@ -810,7 +908,10 @@ int rtw89_mac_add_vif(struct rtw89_dev * + int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); + void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev, + struct ieee80211_vif *vif); ++void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); + int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif); ++void rtw89_mac_disable_cpu(struct rtw89_dev *rtwdev); ++int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw); + int rtw89_mac_enable_bb_rf(struct rtw89_dev *rtwdev); + int rtw89_mac_disable_bb_rf(struct rtw89_dev *rtwdev); + +@@ -830,6 +931,7 @@ static inline int rtw89_chip_disable_bb_ + + u32 rtw89_mac_get_err_status(struct rtw89_dev *rtwdev); + int rtw89_mac_set_err_status(struct rtw89_dev *rtwdev, u32 err); ++bool rtw89_mac_c2h_chk_atomic(struct rtw89_dev *rtwdev, u8 class, u8 func); + void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, + u32 len, u8 class, u8 func); + int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev); +@@ -962,6 +1064,16 @@ static inline void rtw89_mac_ctrl_hci_dm + B_AX_HCI_TXDMA_EN | B_AX_HCI_RXDMA_EN); + } + ++static inline bool rtw89_mac_get_power_state(struct rtw89_dev *rtwdev) ++{ ++ u32 val; ++ ++ val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, ++ B_AX_WLMAC_PWR_STE_MASK); ++ ++ return !!val; ++} ++ + int rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, + bool resume, u32 tx_time); + int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, +@@ -1010,6 +1122,7 @@ enum rtw89_mac_xtal_si_offset { + #define XTAL_SI_PON_EI BIT(1) + #define XTAL_SI_PON_WEI BIT(0) + XTAL_SI_SRAM_CTRL = 0xA1, ++#define XTAL_SI_SRAM_DIS BIT(1) + #define FULL_BIT_MASK GENMASK(7, 0) + }; + +@@ -1019,5 +1132,12 @@ void rtw89_mac_pkt_drop_vif(struct rtw89 + u16 rtw89_mac_dle_buf_req(struct rtw89_dev *rtwdev, u16 buf_len, bool wd); + int rtw89_mac_set_cpuio(struct rtw89_dev *rtwdev, + struct rtw89_cpuio_ctrl *ctrl_para, bool wd); ++int rtw89_mac_typ_fltr_opt(struct rtw89_dev *rtwdev, ++ enum rtw89_machdr_frame_type type, ++ enum rtw89_mac_fwd_target fwd_target, u8 mac_idx); ++int rtw89_mac_resize_ple_rx_quota(struct rtw89_dev *rtwdev, bool wow); ++int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev, ++ enum rtw89_mac_idx band); ++void rtw89_mac_hw_mgnt_sec(struct rtw89_dev *rtwdev, bool wow); + + #endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/Makefile linux-6.2/drivers/net/wireless/realtek/rtw89/Makefile +--- linux-6.1/drivers/net/wireless/realtek/rtw89/Makefile 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/Makefile 2022-12-24 00:49:25.775376835 +0200 +@@ -15,6 +15,8 @@ rtw89_core-y += core.o \ + chan.o \ + ser.o + ++rtw89_core-$(CONFIG_PM) += wow.o ++ + obj-$(CONFIG_RTW89_8852A) += rtw89_8852a.o + rtw89_8852a-objs := rtw8852a.o \ + rtw8852a_table.o \ +@@ -24,6 +26,15 @@ rtw89_8852a-objs := rtw8852a.o \ + obj-$(CONFIG_RTW89_8852AE) += rtw89_8852ae.o + rtw89_8852ae-objs := rtw8852ae.o + ++obj-$(CONFIG_RTW89_8852B) += rtw89_8852b.o ++rtw89_8852b-objs := rtw8852b.o \ ++ rtw8852b_table.o \ ++ rtw8852b_rfk.o \ ++ rtw8852b_rfk_table.o ++ ++obj-$(CONFIG_RTW89_8852BE) += rtw89_8852be.o ++rtw89_8852be-objs := rtw8852be.o ++ + obj-$(CONFIG_RTW89_8852C) += rtw89_8852c.o + rtw89_8852c-objs := rtw8852c.o \ + rtw8852c_table.o \ +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/pci.c linux-6.2/drivers/net/wireless/realtek/rtw89/pci.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/pci.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/pci.c 2022-12-24 00:49:25.780376835 +0200 +@@ -186,6 +186,17 @@ static void rtw89_pci_ctrl_txdma_ch_pcie + } + } + ++static void rtw89_pci_ctrl_txdma_fw_ch_pcie(struct rtw89_dev *rtwdev, bool enable) ++{ ++ const struct rtw89_pci_info *info = rtwdev->pci_info; ++ const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1; ++ ++ if (enable) ++ rtw89_write32_clr(rtwdev, dma_stop1->addr, B_AX_STOP_CH12); ++ else ++ rtw89_write32_set(rtwdev, dma_stop1->addr, B_AX_STOP_CH12); ++} ++ + static bool + rtw89_skb_put_rx_data(struct rtw89_dev *rtwdev, bool fs, bool ls, + struct sk_buff *new, +@@ -256,7 +267,7 @@ static u32 rtw89_pci_rxbd_deliver_skbs(s + + rtw89_core_query_rxdesc(rtwdev, desc_info, skb->data, rxinfo_size); + +- new = dev_alloc_skb(desc_info->pkt_size); ++ new = rtw89_alloc_skb_for_rx(rtwdev, desc_info->pkt_size); + if (!new) + goto err_sync_device; + +@@ -960,8 +971,10 @@ static u32 __rtw89_pci_check_and_reclaim + struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; + struct rtw89_pci_tx_ring *tx_ring = &rtwpci->tx_rings[txch]; + struct rtw89_pci_tx_wd_ring *wd_ring = &tx_ring->wd_ring; ++ const struct rtw89_chip_info *chip = rtwdev->chip; + u32 bd_cnt, wd_cnt, min_cnt = 0; + struct rtw89_pci_rx_ring *rx_ring; ++ enum rtw89_debug_mask debug_mask; + u32 cnt; + + rx_ring = &rtwpci->rx_rings[RTW89_RXCH_RPQ]; +@@ -985,10 +998,20 @@ static u32 __rtw89_pci_check_and_reclaim + bd_cnt = rtw89_pci_get_avail_txbd_num(tx_ring); + wd_cnt = wd_ring->curr_num; + min_cnt = min(bd_cnt, wd_cnt); +- if (min_cnt == 0) +- rtw89_debug(rtwdev, rtwpci->low_power ? RTW89_DBG_TXRX : RTW89_DBG_UNEXP, ++ if (min_cnt == 0) { ++ /* This message can be frequently shown in low power mode or ++ * high traffic with 8852B, and we have recognized it as normal ++ * behavior, so print with mask RTW89_DBG_TXRX in these situations. ++ */ ++ if (rtwpci->low_power || chip->chip_id == RTL8852B) ++ debug_mask = RTW89_DBG_TXRX; ++ else ++ debug_mask = RTW89_DBG_UNEXP; ++ ++ rtw89_debug(rtwdev, debug_mask, + "still no tx resource after reclaim: wd_cnt=%d bd_cnt=%d\n", + wd_cnt, bd_cnt); ++ } + + out_unlock: + spin_unlock_bh(&rtwpci->trx_lock); +@@ -2513,7 +2536,7 @@ static int rtw89_pci_ops_mac_pre_init(st + + /* disable all channels except to FW CMD channel to download firmware */ + rtw89_pci_ctrl_txdma_ch_pcie(rtwdev, false); +- rtw89_write32_clr(rtwdev, info->dma_stop1.addr, B_AX_STOP_CH12); ++ rtw89_pci_ctrl_txdma_fw_ch_pcie(rtwdev, true); + + /* start DMA activities */ + rtw89_pci_ctrl_dma_all(rtwdev, true); +@@ -3771,6 +3794,16 @@ static const struct rtw89_hci_ops rtw89_ + + .recovery_start = rtw89_pci_ops_recovery_start, + .recovery_complete = rtw89_pci_ops_recovery_complete, ++ ++ .ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_pcie, ++ .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_pcie, ++ .ctrl_trxhci = rtw89_pci_ctrl_dma_trx, ++ .poll_txdma_ch = rtw89_poll_txdma_ch_idle_pcie, ++ .clr_idx_all = rtw89_pci_clr_idx_all, ++ .clear = rtw89_pci_clear_resource, ++ .disable_intr = rtw89_pci_disable_intr_lock, ++ .enable_intr = rtw89_pci_enable_intr_lock, ++ .rst_bdram = rtw89_pci_rst_bdram_pcie, + }; + + int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/pci.h linux-6.2/drivers/net/wireless/realtek/rtw89/pci.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/pci.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/pci.h 2022-12-24 00:49:25.780376835 +0200 +@@ -202,6 +202,18 @@ + #define B_AX_RXP1DMA_INT BIT(1) + #define B_AX_RXDMA_INT BIT(0) + ++#define R_AX_HAXI_IDCT_MSK 0x10B8 ++#define B_AX_TXBD_LEN0_ERR_IDCT_MSK BIT(3) ++#define B_AX_TXBD_4KBOUND_ERR_IDCT_MSK BIT(2) ++#define B_AX_RXMDA_STUCK_IDCT_MSK BIT(1) ++#define B_AX_TXMDA_STUCK_IDCT_MSK BIT(0) ++ ++#define R_AX_HAXI_IDCT 0x10BC ++#define B_AX_TXBD_LEN0_ERR_IDCT BIT(3) ++#define B_AX_TXBD_4KBOUND_ERR_IDCT BIT(2) ++#define B_AX_RXMDA_STUCK_IDCT BIT(1) ++#define B_AX_TXMDA_STUCK_IDCT BIT(0) ++ + #define R_AX_HAXI_HIMR10 0x11E0 + #define B_AX_TXDMA_CH11_INT_EN_V1 BIT(1) + #define B_AX_TXDMA_CH10_INT_EN_V1 BIT(0) +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/phy.c linux-6.2/drivers/net/wireless/realtek/rtw89/phy.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/phy.c 2022-12-31 22:58:05.367710726 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/phy.c 2022-12-24 00:49:25.781376835 +0200 +@@ -2,6 +2,7 @@ + /* Copyright(c) 2019-2020 Realtek Corporation + */ + ++#include "coex.h" + #include "debug.h" + #include "fw.h" + #include "mac.h" +@@ -9,7 +10,7 @@ + #include "ps.h" + #include "reg.h" + #include "sar.h" +-#include "coex.h" ++#include "util.h" + + static u16 get_max_amsdu_len(struct rtw89_dev *rtwdev, + const struct rtw89_ra_report *report) +@@ -801,6 +802,11 @@ bool rtw89_phy_write_rf_v1(struct rtw89_ + } + EXPORT_SYMBOL(rtw89_phy_write_rf_v1); + ++static bool rtw89_chip_rf_v1(struct rtw89_dev *rtwdev) ++{ ++ return rtwdev->chip->ops->write_rf == rtw89_phy_write_rf_v1; ++} ++ + static void rtw89_phy_bb_reset(struct rtw89_dev *rtwdev, + enum rtw89_phy_idx phy_idx) + { +@@ -1036,6 +1042,7 @@ static void rtw89_phy_config_bb_gain(str + { + const struct rtw89_chip_info *chip = rtwdev->chip; + union rtw89_phy_bb_gain_arg arg = { .addr = reg->addr }; ++ struct rtw89_efuse *efuse = &rtwdev->efuse; + + if (arg.gain_band >= RTW89_BB_GAIN_BAND_NR) + return; +@@ -1061,6 +1068,11 @@ static void rtw89_phy_config_bb_gain(str + case 3: + rtw89_phy_cfg_bb_gain_op1db(rtwdev, arg, reg->data); + break; ++ case 4: ++ /* This cfg_type is only used by rfe_type >= 50 with eFEM */ ++ if (efuse->rfe_type < 50) ++ break; ++ fallthrough; + default: + rtw89_warn(rtwdev, + "bb gain {0x%x:0x%x} with unknown cfg type: %d\n", +@@ -1117,6 +1129,24 @@ out: + return ret; + } + ++static void rtw89_phy_config_rf_reg_noio(struct rtw89_dev *rtwdev, ++ const struct rtw89_reg2_def *reg, ++ enum rtw89_rf_path rf_path, ++ void *extra_data) ++{ ++ u32 addr = reg->addr; ++ ++ if (addr == 0xfe || addr == 0xfd || addr == 0xfc || addr == 0xfb || ++ addr == 0xfa || addr == 0xf9) ++ return; ++ ++ if (rtw89_chip_rf_v1(rtwdev) && addr < 0x100) ++ return; ++ ++ rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path, ++ (struct rtw89_fw_h2c_rf_reg_info *)extra_data); ++} ++ + static void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev, + const struct rtw89_reg2_def *reg, + enum rtw89_rf_path rf_path, +@@ -1329,7 +1359,7 @@ static u32 rtw89_phy_nctl_poll(struct rt + return rtw89_phy_read32(rtwdev, 0x8080); + } + +-void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev) ++void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev, bool noio) + { + void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg, + enum rtw89_rf_path rf_path, void *data); +@@ -1345,7 +1375,11 @@ void rtw89_phy_init_rf_reg(struct rtw89_ + for (path = RF_PATH_A; path < chip->rf_path_num; path++) { + rf_table = chip->rf_table[path]; + rf_reg_info->rf_path = rf_table->rf_path; +- config = rf_table->config ? rf_table->config : rtw89_phy_config_rf_reg; ++ if (noio) ++ config = rtw89_phy_config_rf_reg_noio; ++ else ++ config = rf_table->config ? rf_table->config : ++ rtw89_phy_config_rf_reg; + rtw89_phy_init_reg(rtwdev, rf_table, config, (void *)rf_reg_info); + if (rtw89_phy_config_rf_reg_fw(rtwdev, rf_reg_info)) + rtw89_warn(rtwdev, "rf path %d reg h2c config failed\n", +@@ -1362,13 +1396,15 @@ static void rtw89_phy_init_rf_nctl(struc + int ret; + + /* IQK/DPK clock & reset */ +- rtw89_phy_write32_set(rtwdev, 0x0c60, 0x3); +- rtw89_phy_write32_set(rtwdev, 0x0c6c, 0x1); +- rtw89_phy_write32_set(rtwdev, 0x58ac, 0x8000000); +- rtw89_phy_write32_set(rtwdev, 0x78ac, 0x8000000); ++ rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, 0x3); ++ rtw89_phy_write32_set(rtwdev, R_GNT_BT_WGT_EN, 0x1); ++ rtw89_phy_write32_set(rtwdev, R_P0_PATH_RST, 0x8000000); ++ rtw89_phy_write32_set(rtwdev, R_P1_PATH_RST, 0x8000000); ++ if (chip->chip_id == RTL8852B) ++ rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, 0x2); + + /* check 0x8080 */ +- rtw89_phy_write32(rtwdev, 0x8000, 0x8); ++ rtw89_phy_write32(rtwdev, R_NCTL_CFG, 0x8); + + ret = read_poll_timeout(rtw89_phy_nctl_poll, val, val == 0x4, 10, + 1000, false, rtwdev); +@@ -1419,6 +1455,15 @@ void rtw89_phy_write32_idx(struct rtw89_ + } + EXPORT_SYMBOL(rtw89_phy_write32_idx); + ++u32 rtw89_phy_read32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, ++ enum rtw89_phy_idx phy_idx) ++{ ++ if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) ++ addr += rtw89_phy0_phy1_offset(rtwdev, addr); ++ return rtw89_phy_read32_mask(rtwdev, addr, mask); ++} ++EXPORT_SYMBOL(rtw89_phy_read32_idx); ++ + void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask, + u32 val) + { +@@ -1443,23 +1488,21 @@ void rtw89_phy_write_reg3_tbl(struct rtw + } + EXPORT_SYMBOL(rtw89_phy_write_reg3_tbl); + +-const u8 rtw89_rs_idx_max[] = { ++static const u8 rtw89_rs_idx_max[] = { + [RTW89_RS_CCK] = RTW89_RATE_CCK_MAX, + [RTW89_RS_OFDM] = RTW89_RATE_OFDM_MAX, + [RTW89_RS_MCS] = RTW89_RATE_MCS_MAX, + [RTW89_RS_HEDCM] = RTW89_RATE_HEDCM_MAX, + [RTW89_RS_OFFSET] = RTW89_RATE_OFFSET_MAX, + }; +-EXPORT_SYMBOL(rtw89_rs_idx_max); + +-const u8 rtw89_rs_nss_max[] = { ++static const u8 rtw89_rs_nss_max[] = { + [RTW89_RS_CCK] = 1, + [RTW89_RS_OFDM] = 1, + [RTW89_RS_MCS] = RTW89_NSS_MAX, + [RTW89_RS_HEDCM] = RTW89_NSS_HEDCM_MAX, + [RTW89_RS_OFFSET] = 1, + }; +-EXPORT_SYMBOL(rtw89_rs_nss_max); + + static const u8 _byr_of_rs[] = { + [RTW89_RS_CCK] = offsetof(struct rtw89_txpwr_byrate, cck), +@@ -1501,6 +1544,7 @@ EXPORT_SYMBOL(rtw89_phy_load_txpwr_byrat + (txpwr_rf) >> (__c->txpwr_factor_rf - __c->txpwr_factor_mac); \ + }) + ++static + s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band, + const struct rtw89_rate_desc *rate_desc) + { +@@ -1523,7 +1567,6 @@ s8 rtw89_phy_read_txpwr_byrate(struct rt + + return _phy_txpwr_rf_to_mac(rtwdev, byr[idx]); + } +-EXPORT_SYMBOL(rtw89_phy_read_txpwr_byrate); + + static u8 rtw89_channel_6g_to_idx(struct rtw89_dev *rtwdev, u8 channel_6g) + { +@@ -1783,6 +1826,7 @@ static void rtw89_phy_fill_txpwr_limit_1 + lmt->mcs_40m_2p5[i] = min_t(s8, val_2p5_n[i], val_2p5_p[i]); + } + ++static + void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev, + const struct rtw89_chan *chan, + struct rtw89_txpwr_limit *lmt, +@@ -1813,7 +1857,6 @@ void rtw89_phy_fill_txpwr_limit(struct r + break; + } + } +-EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit); + + static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev, u8 band, + u8 ru, u8 ntx, u8 ch) +@@ -1962,6 +2005,7 @@ rtw89_phy_fill_txpwr_limit_ru_160m(struc + } + } + ++static + void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev, + const struct rtw89_chan *chan, + struct rtw89_txpwr_limit_ru *lmt_ru, +@@ -1992,7 +2036,161 @@ void rtw89_phy_fill_txpwr_limit_ru(struc + break; + } + } +-EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit_ru); ++ ++void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ static const u8 rs[] = { ++ RTW89_RS_CCK, ++ RTW89_RS_OFDM, ++ RTW89_RS_MCS, ++ RTW89_RS_HEDCM, ++ }; ++ struct rtw89_rate_desc cur; ++ u8 band = chan->band_type; ++ u8 ch = chan->channel; ++ u32 addr, val; ++ s8 v[4] = {}; ++ u8 i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, ++ "[TXPWR] set txpwr byrate with ch=%d\n", ch); ++ ++ BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_CCK] % 4); ++ BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_OFDM] % 4); ++ BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_MCS] % 4); ++ BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_HEDCM] % 4); ++ ++ addr = R_AX_PWR_BY_RATE; ++ for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) { ++ for (i = 0; i < ARRAY_SIZE(rs); i++) { ++ if (cur.nss >= rtw89_rs_nss_max[rs[i]]) ++ continue; ++ ++ cur.rs = rs[i]; ++ for (cur.idx = 0; cur.idx < rtw89_rs_idx_max[rs[i]]; ++ cur.idx++) { ++ v[cur.idx % 4] = ++ rtw89_phy_read_txpwr_byrate(rtwdev, ++ band, ++ &cur); ++ ++ if ((cur.idx + 1) % 4) ++ continue; ++ ++ val = FIELD_PREP(GENMASK(7, 0), v[0]) | ++ FIELD_PREP(GENMASK(15, 8), v[1]) | ++ FIELD_PREP(GENMASK(23, 16), v[2]) | ++ FIELD_PREP(GENMASK(31, 24), v[3]); ++ ++ rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, ++ val); ++ addr += 4; ++ } ++ } ++ } ++} ++EXPORT_SYMBOL(rtw89_phy_set_txpwr_byrate); ++ ++void rtw89_phy_set_txpwr_offset(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ struct rtw89_rate_desc desc = { ++ .nss = RTW89_NSS_1, ++ .rs = RTW89_RS_OFFSET, ++ }; ++ u8 band = chan->band_type; ++ s8 v[RTW89_RATE_OFFSET_MAX] = {}; ++ u32 val; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n"); ++ ++ for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++) ++ v[desc.idx] = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc); ++ ++ BUILD_BUG_ON(RTW89_RATE_OFFSET_MAX != 5); ++ val = FIELD_PREP(GENMASK(3, 0), v[0]) | ++ FIELD_PREP(GENMASK(7, 4), v[1]) | ++ FIELD_PREP(GENMASK(11, 8), v[2]) | ++ FIELD_PREP(GENMASK(15, 12), v[3]) | ++ FIELD_PREP(GENMASK(19, 16), v[4]); ++ ++ rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL, ++ GENMASK(19, 0), val); ++} ++EXPORT_SYMBOL(rtw89_phy_set_txpwr_offset); ++ ++void rtw89_phy_set_txpwr_limit(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ struct rtw89_txpwr_limit lmt; ++ u8 ch = chan->channel; ++ u8 bw = chan->band_width; ++ const s8 *ptr; ++ u32 addr, val; ++ u8 i, j; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, ++ "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw); ++ ++ BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit) != ++ RTW89_TXPWR_LMT_PAGE_SIZE); ++ ++ addr = R_AX_PWR_LMT; ++ for (i = 0; i < RTW89_NTX_NUM; i++) { ++ rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt, i); ++ ++ ptr = (s8 *)&lmt; ++ for (j = 0; j < RTW89_TXPWR_LMT_PAGE_SIZE; ++ j += 4, addr += 4, ptr += 4) { ++ val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | ++ FIELD_PREP(GENMASK(15, 8), ptr[1]) | ++ FIELD_PREP(GENMASK(23, 16), ptr[2]) | ++ FIELD_PREP(GENMASK(31, 24), ptr[3]); ++ ++ rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); ++ } ++ } ++} ++EXPORT_SYMBOL(rtw89_phy_set_txpwr_limit); ++ ++void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ struct rtw89_txpwr_limit_ru lmt_ru; ++ u8 ch = chan->channel; ++ u8 bw = chan->band_width; ++ const s8 *ptr; ++ u32 addr, val; ++ u8 i, j; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, ++ "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw); ++ ++ BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit_ru) != ++ RTW89_TXPWR_LMT_RU_PAGE_SIZE); ++ ++ addr = R_AX_PWR_RU_LMT; ++ for (i = 0; i < RTW89_NTX_NUM; i++) { ++ rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru, i); ++ ++ ptr = (s8 *)&lmt_ru; ++ for (j = 0; j < RTW89_TXPWR_LMT_RU_PAGE_SIZE; ++ j += 4, addr += 4, ptr += 4) { ++ val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | ++ FIELD_PREP(GENMASK(15, 8), ptr[1]) | ++ FIELD_PREP(GENMASK(23, 16), ptr[2]) | ++ FIELD_PREP(GENMASK(31, 24), ptr[3]); ++ ++ rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); ++ } ++ } ++} ++EXPORT_SYMBOL(rtw89_phy_set_txpwr_limit_ru); + + struct rtw89_phy_iter_ra_data { + struct rtw89_dev *rtwdev; +@@ -2106,6 +2304,10 @@ void rtw89_phy_c2h_handle(struct rtw89_d + if (func < RTW89_PHY_C2H_FUNC_RA_MAX) + handler = rtw89_phy_c2h_ra_handler[func]; + break; ++ case RTW89_PHY_C2H_CLASS_DM: ++ if (func == RTW89_PHY_C2H_DM_FUNC_LOWRT_RTY) ++ return; ++ fallthrough; + default: + rtw89_info(rtwdev, "c2h class %d not support\n", class); + return; +@@ -2593,6 +2795,129 @@ void rtw89_phy_cfo_parse(struct rtw89_de + cfo->packet_count++; + } + ++void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) ++{ ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; ++ ++ if (!chip->support_ul_tb_ctrl) ++ return; ++ ++ rtwvif->def_tri_idx = ++ rtw89_phy_read32_mask(rtwdev, R_DCFO_OPT, B_TXSHAPE_TRIANGULAR_CFG); ++ ++ if (chip->chip_id == RTL8852B && rtwdev->hal.cv > CHIP_CBV) ++ rtwvif->dyn_tb_bedge_en = false; ++ else if (chan->band_type >= RTW89_BAND_5G && ++ chan->band_width >= RTW89_CHANNEL_WIDTH_40) ++ rtwvif->dyn_tb_bedge_en = true; ++ else ++ rtwvif->dyn_tb_bedge_en = false; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] def_if_bandedge=%d, def_tri_idx=%d\n", ++ ul_tb_info->def_if_bandedge, rtwvif->def_tri_idx); ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] dyn_tb_begde_en=%d, dyn_tb_tri_en=%d\n", ++ rtwvif->dyn_tb_bedge_en, ul_tb_info->dyn_tb_tri_en); ++} ++ ++struct rtw89_phy_ul_tb_check_data { ++ bool valid; ++ bool high_tf_client; ++ bool low_tf_client; ++ bool dyn_tb_bedge_en; ++ u8 def_tri_idx; ++}; ++ ++static ++void rtw89_phy_ul_tb_ctrl_check(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ struct rtw89_phy_ul_tb_check_data *ul_tb_data) ++{ ++ struct rtw89_traffic_stats *stats = &rtwdev->stats; ++ struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); ++ ++ if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION) ++ return; ++ ++ if (!vif->cfg.assoc) ++ return; ++ ++ if (stats->rx_tf_periodic > UL_TB_TF_CNT_L2H_TH) ++ ul_tb_data->high_tf_client = true; ++ else if (stats->rx_tf_periodic < UL_TB_TF_CNT_H2L_TH) ++ ul_tb_data->low_tf_client = true; ++ ++ ul_tb_data->valid = true; ++ ul_tb_data->def_tri_idx = rtwvif->def_tri_idx; ++ ul_tb_data->dyn_tb_bedge_en = rtwvif->dyn_tb_bedge_en; ++} ++ ++void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev) ++{ ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; ++ struct rtw89_phy_ul_tb_check_data ul_tb_data = {}; ++ struct rtw89_vif *rtwvif; ++ ++ if (!chip->support_ul_tb_ctrl) ++ return; ++ ++ if (rtwdev->total_sta_assoc != 1) ++ return; ++ ++ rtw89_for_each_rtwvif(rtwdev, rtwvif) ++ rtw89_phy_ul_tb_ctrl_check(rtwdev, rtwvif, &ul_tb_data); ++ ++ if (!ul_tb_data.valid) ++ return; ++ ++ if (ul_tb_data.dyn_tb_bedge_en) { ++ if (ul_tb_data.high_tf_client) { ++ rtw89_phy_write32_mask(rtwdev, R_BANDEDGE, B_BANDEDGE_EN, 0); ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] Turn off if_bandedge\n"); ++ } else if (ul_tb_data.low_tf_client) { ++ rtw89_phy_write32_mask(rtwdev, R_BANDEDGE, B_BANDEDGE_EN, ++ ul_tb_info->def_if_bandedge); ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] Set to default if_bandedge = %d\n", ++ ul_tb_info->def_if_bandedge); ++ } ++ } ++ ++ if (ul_tb_info->dyn_tb_tri_en) { ++ if (ul_tb_data.high_tf_client) { ++ rtw89_phy_write32_mask(rtwdev, R_DCFO_OPT, ++ B_TXSHAPE_TRIANGULAR_CFG, 0); ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] Turn off Tx triangle\n"); ++ } else if (ul_tb_data.low_tf_client) { ++ rtw89_phy_write32_mask(rtwdev, R_DCFO_OPT, ++ B_TXSHAPE_TRIANGULAR_CFG, ++ ul_tb_data.def_tri_idx); ++ rtw89_debug(rtwdev, RTW89_DBG_UL_TB, ++ "[ULTB] Set to default tx_shap_idx = %d\n", ++ ul_tb_data.def_tri_idx); ++ } ++ } ++} ++ ++static void rtw89_phy_ul_tb_info_init(struct rtw89_dev *rtwdev) ++{ ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; ++ ++ if (!chip->support_ul_tb_ctrl) ++ return; ++ ++ ul_tb_info->dyn_tb_tri_en = true; ++ ul_tb_info->def_if_bandedge = ++ rtw89_phy_read32_mask(rtwdev, R_BANDEDGE, B_BANDEDGE_EN); ++} ++ + static void rtw89_phy_stat_thermal_update(struct rtw89_dev *rtwdev) + { + struct rtw89_phy_stat *phystat = &rtwdev->phystat; +@@ -3779,6 +4104,7 @@ void rtw89_phy_dm_init(struct rtw89_dev + rtw89_physts_parsing_init(rtwdev); + rtw89_phy_dig_init(rtwdev); + rtw89_phy_cfo_init(rtwdev); ++ rtw89_phy_ul_tb_info_init(rtwdev); + + rtw89_phy_init_rf_nctl(rtwdev); + rtw89_chip_rfk_init(rtwdev); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/phy.h linux-6.2/drivers/net/wireless/realtek/rtw89/phy.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/phy.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/phy.h 2022-12-24 00:49:25.781376835 +0200 +@@ -64,6 +64,9 @@ + #define MAX_CFO_TOLERANCE 30 + #define CFO_TF_CNT_TH 300 + ++#define UL_TB_TF_CNT_L2H_TH 100 ++#define UL_TB_TF_CNT_H2L_TH 70 ++ + #define CCX_MAX_PERIOD 2097 + #define CCX_MAX_PERIOD_UNIT 32 + #define MS_TO_4US_RATIO 250 +@@ -114,6 +117,15 @@ enum rtw89_phy_c2h_ra_func { + RTW89_PHY_C2H_FUNC_RA_MAX, + }; + ++enum rtw89_phy_c2h_dm_func { ++ RTW89_PHY_C2H_DM_FUNC_FW_TEST, ++ RTW89_PHY_C2H_DM_FUNC_FW_TRIG_TX_RPT, ++ RTW89_PHY_C2H_DM_FUNC_SIGB, ++ RTW89_PHY_C2H_DM_FUNC_LOWRT_RTY, ++ RTW89_PHY_C2H_DM_FUNC_MCC_DIG, ++ RTW89_PHY_C2H_DM_FUNC_NUM, ++}; ++ + enum rtw89_phy_c2h_class { + RTW89_PHY_C2H_CLASS_RUA, + RTW89_PHY_C2H_CLASS_RA, +@@ -317,9 +329,6 @@ struct rtw89_nbi_reg_def { + struct rtw89_reg_def notch2_en; + }; + +-extern const u8 rtw89_rs_idx_max[RTW89_RS_MAX]; +-extern const u8 rtw89_rs_nss_max[RTW89_RS_MAX]; +- + static inline void rtw89_phy_write8(struct rtw89_dev *rtwdev, + u32 addr, u8 data) + { +@@ -377,6 +386,50 @@ static inline u32 rtw89_phy_read32_mask( + return rtw89_read32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask); + } + ++static inline ++enum rtw89_gain_offset rtw89_subband_to_gain_offset_band_of_ofdm(enum rtw89_subband subband) ++{ ++ switch (subband) { ++ default: ++ case RTW89_CH_2G: ++ return RTW89_GAIN_OFFSET_2G_OFDM; ++ case RTW89_CH_5G_BAND_1: ++ return RTW89_GAIN_OFFSET_5G_LOW; ++ case RTW89_CH_5G_BAND_3: ++ return RTW89_GAIN_OFFSET_5G_MID; ++ case RTW89_CH_5G_BAND_4: ++ return RTW89_GAIN_OFFSET_5G_HIGH; ++ } ++} ++ ++static inline ++enum rtw89_phy_bb_gain_band rtw89_subband_to_bb_gain_band(enum rtw89_subband subband) ++{ ++ switch (subband) { ++ default: ++ case RTW89_CH_2G: ++ return RTW89_BB_GAIN_BAND_2G; ++ case RTW89_CH_5G_BAND_1: ++ return RTW89_BB_GAIN_BAND_5G_L; ++ case RTW89_CH_5G_BAND_3: ++ return RTW89_BB_GAIN_BAND_5G_M; ++ case RTW89_CH_5G_BAND_4: ++ return RTW89_BB_GAIN_BAND_5G_H; ++ case RTW89_CH_6G_BAND_IDX0: ++ case RTW89_CH_6G_BAND_IDX1: ++ return RTW89_BB_GAIN_BAND_6G_L; ++ case RTW89_CH_6G_BAND_IDX2: ++ case RTW89_CH_6G_BAND_IDX3: ++ return RTW89_BB_GAIN_BAND_6G_M; ++ case RTW89_CH_6G_BAND_IDX4: ++ case RTW89_CH_6G_BAND_IDX5: ++ return RTW89_BB_GAIN_BAND_6G_H; ++ case RTW89_CH_6G_BAND_IDX6: ++ case RTW89_CH_6G_BAND_IDX7: ++ return RTW89_BB_GAIN_BAND_6G_UH; ++ } ++} ++ + enum rtw89_rfk_flag { + RTW89_RFK_F_WRF = 0, + RTW89_RFK_F_WM = 1, +@@ -450,7 +503,7 @@ bool rtw89_phy_write_rf(struct rtw89_dev + bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, + u32 addr, u32 mask, u32 data); + void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev); +-void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev); ++void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev, bool noio); + void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev, + const struct rtw89_reg2_def *reg, + enum rtw89_rf_path rf_path, +@@ -458,20 +511,24 @@ void rtw89_phy_config_rf_reg_v1(struct r + void rtw89_phy_dm_init(struct rtw89_dev *rtwdev); + void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, + u32 data, enum rtw89_phy_idx phy_idx); ++u32 rtw89_phy_read32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, ++ enum rtw89_phy_idx phy_idx); + void rtw89_phy_load_txpwr_byrate(struct rtw89_dev *rtwdev, + const struct rtw89_txpwr_table *tbl); +-s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band, +- const struct rtw89_rate_desc *rate_desc); +-void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- struct rtw89_txpwr_limit *lmt, +- u8 ntx); +-void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- struct rtw89_txpwr_limit_ru *lmt_ru, +- u8 ntx); + s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev, u8 band, + u8 bw, u8 ntx, u8 rs, u8 bf, u8 ch); ++void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx); ++void rtw89_phy_set_txpwr_offset(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx); ++void rtw89_phy_set_txpwr_limit(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx); ++void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx); + void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta); + void rtw89_phy_ra_update(struct rtw89_dev *rtwdev); + void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta, +@@ -496,5 +553,7 @@ void rtw89_phy_set_bss_color(struct rtw8 + void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev, + enum rtw89_mac_idx mac_idx, + enum rtw89_tssi_bandedge_cfg bandedge_cfg); ++void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); ++void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev); + + #endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/ps.c linux-6.2/drivers/net/wireless/realtek/rtw89/ps.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/ps.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/ps.c 2022-12-24 00:49:25.781376835 +0200 +@@ -59,7 +59,7 @@ static void rtw89_ps_power_mode_change(s + rtw89_mac_power_mode_change(rtwdev, enter); + } + +-static void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) ++void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) + { + if (rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT) + return; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/ps.h linux-6.2/drivers/net/wireless/realtek/rtw89/ps.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/ps.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/ps.h 2022-12-24 00:49:25.781376835 +0200 +@@ -8,6 +8,7 @@ + void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); + void rtw89_leave_lps(struct rtw89_dev *rtwdev); + void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev); ++void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); + void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev); + void rtw89_enter_ips(struct rtw89_dev *rtwdev); + void rtw89_leave_ips(struct rtw89_dev *rtwdev); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/reg.h linux-6.2/drivers/net/wireless/realtek/rtw89/reg.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/reg.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/reg.h 2022-12-24 00:49:25.781376835 +0200 +@@ -34,6 +34,9 @@ + #define R_AX_SYS_CLK_CTRL 0x0008 + #define B_AX_CPU_CLK_EN BIT(14) + ++#define R_AX_SYS_SWR_CTRL1 0x0010 ++#define B_AX_SYM_CTRL_SPS_PWMFREQ BIT(10) ++ + #define R_AX_SYS_ADIE_PAD_PWR_CTRL 0x0018 + #define B_AX_SYM_PADPDN_WL_PTA_1P3 BIT(6) + #define B_AX_SYM_PADPDN_WL_RFC_1P3 BIT(5) +@@ -42,6 +45,9 @@ + #define B_AX_R_DIS_PRST BIT(6) + #define B_AX_WLOCK_1C_BIT6 BIT(5) + ++#define R_AX_AFE_LDO_CTRL 0x0020 ++#define B_AX_AON_OFF_PC_EN BIT(23) ++ + #define R_AX_EFUSE_CTRL_1 0x0038 + #define B_AX_EF_PGPD_MASK GENMASK(30, 28) + #define B_AX_EF_RDT BIT(27) +@@ -118,6 +124,9 @@ + #define B_AX_R_AX_BG_LPF BIT(2) + #define B_AX_R_AX_BG GENMASK(1, 0) + ++#define R_AX_HCI_LDO_CTRL 0x007A ++#define B_AX_R_AX_VADJ_MASK GENMASK(3, 0) ++ + #define R_AX_PLATFORM_ENABLE 0x0088 + #define B_AX_AXIDMA_EN BIT(3) + #define B_AX_WCPU_EN BIT(1) +@@ -125,6 +134,7 @@ + + #define R_AX_WLLPS_CTRL 0x0090 + #define B_AX_DIS_WLBT_LPSEN_LOPC BIT(1) ++#define SW_LPS_OPTION 0x0001A0B2 + + #define R_AX_SCOREBOARD 0x00AC + #define B_AX_TOGGLE BIT(31) +@@ -229,6 +239,13 @@ + + #define R_AX_GPIO0_7_FUNC_SEL 0x02D0 + ++#define R_AX_EECS_EESK_FUNC_SEL 0x02D8 ++#define B_AX_PINMUX_EESK_FUNC_SEL_MASK GENMASK(7, 4) ++ ++#define R_AX_LED1_FUNC_SEL 0x02DC ++#define B_AX_PINMUX_EESK_FUNC_SEL_V1_MASK GENMASK(27, 24) ++#define PINMUX_EESK_FUNC_SEL_BT_LOG 0x1 ++ + #define R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN 0x02E4 + #define B_AX_LED1_PULL_LOW_EN BIT(18) + #define B_AX_EESK_PULL_LOW_EN BIT(17) +@@ -249,6 +266,10 @@ + #define B_AX_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2) + #define B_AX_PCIE_HCISYS_PWR_STE_MASK GENMASK(1, 0) + ++#define R_AX_SPS_DIG_OFF_CTRL0 0x0400 ++#define B_AX_C3_L1_MASK GENMASK(5, 4) ++#define B_AX_C1_L1_MASK GENMASK(1, 0) ++ + #define R_AX_AFE_OFF_CTRL1 0x0444 + #define B_AX_S1_LDO_VSEL_F_MASK GENMASK(25, 24) + #define B_AX_S1_LDO2PWRCUT_F BIT(23) +@@ -305,8 +326,7 @@ + + #define R_AX_PCIE_DBG_CTRL 0x11C0 + #define B_AX_DBG_DUMMY_MASK GENMASK(23, 16) +-#define B_AX_DBG_SEL_MASK GENMASK(15, 13) +-#define B_AX_PCIE_DBG_SEL BIT(12) ++#define B_AX_PCIE_DBG_SEL_MASK GENMASK(15, 13) + #define B_AX_MRD_TIMEOUT_EN BIT(10) + #define B_AX_ASFF_FULL_NO_STK BIT(1) + #define B_AX_EN_STUCK_DBG BIT(0) +@@ -445,6 +465,7 @@ + #define B_AX_DISPATCHER_EN BIT(18) + #define B_AX_BBRPT_EN BIT(17) + #define B_AX_MAC_SEC_EN BIT(16) ++#define B_AX_DMACREG_GCKEN BIT(15) + #define B_AX_MAC_UN_EN BIT(15) + #define B_AX_H_AXIDMA_EN BIT(14) + +@@ -523,6 +544,19 @@ + #define B_AX_WDE_EMPTY_QUE_CMAC0_MBH BIT(1) + #define B_AX_WDE_EMPTY_QUE_CMAC0_ALL_AC BIT(0) + ++#define R_AX_DLE_EMPTY1 0x8434 ++#define B_AX_PLE_EMPTY_QTA_DMAC_WDRLS BIT(20) ++#define B_AX_PLE_EMPTY_QTA_CMAC1_DMA_BBRPT BIT(19) ++#define B_AX_PLE_EMPTY_QTA_CMAC1_DMA_RX BIT(18) ++#define B_AX_PLE_EMPTY_QTA_CMAC0_DMA_RX BIT(17) ++#define B_AX_PLE_EMPTY_QTA_DMAC_C2H BIT(16) ++#define B_AX_PLE_EMPTY_QUE_DMAC_PLRLS BIT(5) ++#define B_AX_PLE_EMPTY_QUE_DMAC_CPUIO BIT(4) ++#define B_AX_PLE_EMPTY_QUE_DMAC_SEC_RX BIT(3) ++#define B_AX_PLE_EMPTY_QUE_DMAC_MPDU_RX BIT(2) ++#define B_AX_PLE_EMPTY_QUE_DMAC_HDP BIT(1) ++#define B_AX_WDE_EMPTY_QUE_DMAC_WDRLS BIT(0) ++ + #define R_AX_DMAC_ERR_IMR 0x8520 + #define B_AX_DLE_CPUIO_ERR_INT_EN BIT(10) + #define B_AX_APB_BRIDGE_ERR_INT_EN BIT(9) +@@ -539,6 +573,10 @@ + #define DMAC_ERR_IMR_DIS 0 + + #define R_AX_DMAC_ERR_ISR 0x8524 ++#define B_AX_HAXIDMA_ERR_FLAG BIT(14) ++#define B_AX_PAXIDMA_ERR_FLAG BIT(13) ++#define B_AX_HCI_BUF_ERR_FLAG BIT(12) ++#define B_AX_BBRPT_ERR_FLAG BIT(11) + #define B_AX_DLE_CPUIO_ERR_FLAG BIT(10) + #define B_AX_APB_BRIDGE_ERR_FLAG BIT(9) + #define B_AX_DISPATCH_ERR_FLAG BIT(8) +@@ -917,6 +955,14 @@ + B_AX_STF_OQT_OVERFLOW_ERR_INT_EN | \ + B_AX_STF_OQT_UNDERFLOW_ERR_INT_EN) + ++#define R_AX_DISPATCHER_DBG_PORT 0x8860 ++#define B_AX_DISPATCHER_DBG_SEL_MASK GENMASK(11, 8) ++#define B_AX_DISPATCHER_INTN_SEL_MASK GENMASK(7, 4) ++#define B_AX_DISPATCHER_CH_SEL_MASK GENMASK(3, 0) ++ ++#define R_AX_RX_FUNCTION_STOP 0x8920 ++#define B_AX_HDR_RX_STOP BIT(0) ++ + #define R_AX_HCI_FC_CTRL 0x8A00 + #define B_AX_HCI_FC_CH12_FULL_COND_MASK GENMASK(11, 10) + #define B_AX_HCI_FC_WP_CH811_FULL_COND_MASK GENMASK(9, 8) +@@ -998,7 +1044,13 @@ + #define R_AX_WDE_ERRFLAG_MSG 0x8C30 + #define B_AX_WDE_ERR_FLAG_MSG_MASK GENMASK(31, 0) + +-#define R_AX_WDE_ERR_FLAG_CFG 0x8C34 ++#define R_AX_WDE_ERR_FLAG_CFG_NUM1 0x8C34 ++#define B_AX_WDE_ERR_FLAG_NUM1_VLD BIT(31) ++#define B_AX_WDE_ERR_FLAG_NUM1_MSTIDX_MASK GENMASK(27, 24) ++#define B_AX_WDE_ERR_FLAG_NUM1_ISRIDX_MASK GENMASK(20, 16) ++#define B_AX_WDE_DATCHN_FRZTMR_MODE BIT(2) ++#define B_AX_WDE_QUEMGN_FRZTMR_MODE BIT(1) ++#define B_AX_WDE_BUFMGN_FRZTMR_MODE BIT(0) + + #define R_AX_WDE_ERR_IMR 0x8C38 + #define B_AX_WDE_DATCHN_RRDY_ERR_INT_EN BIT(27) +@@ -1182,7 +1234,59 @@ + #define B_AX_PLE_START_BOUND_MASK GENMASK(13, 8) + #define B_AX_PLE_PAGE_SEL_MASK GENMASK(1, 0) + #define B_AX_PLE_FREE_PAGE_NUM_MASK GENMASK(28, 16) +-#define R_AX_PLE_ERR_FLAG_CFG 0x9034 ++ ++#define R_AX_PLE_DBGERR_LOCKEN 0x9020 ++#define B_AX_PLE_LOCKEN_DLEPIF07 BIT(7) ++#define B_AX_PLE_LOCKEN_DLEPIF06 BIT(6) ++#define B_AX_PLE_LOCKEN_DLEPIF05 BIT(5) ++#define B_AX_PLE_LOCKEN_DLEPIF04 BIT(4) ++#define B_AX_PLE_LOCKEN_DLEPIF03 BIT(3) ++#define B_AX_PLE_LOCKEN_DLEPIF02 BIT(2) ++#define B_AX_PLE_LOCKEN_DLEPIF01 BIT(1) ++#define B_AX_PLE_LOCKEN_DLEPIF00 BIT(0) ++ ++#define R_AX_PLE_DBGERR_STS 0x9024 ++#define B_AX_PLE_LOCKON_DLEPIF07 BIT(7) ++#define B_AX_PLE_LOCKON_DLEPIF06 BIT(6) ++#define B_AX_PLE_LOCKON_DLEPIF05 BIT(5) ++#define B_AX_PLE_LOCKON_DLEPIF04 BIT(4) ++#define B_AX_PLE_LOCKON_DLEPIF03 BIT(3) ++#define B_AX_PLE_LOCKON_DLEPIF02 BIT(2) ++#define B_AX_PLE_LOCKON_DLEPIF01 BIT(1) ++#define B_AX_PLE_LOCKON_DLEPIF00 BIT(0) ++ ++#define R_AX_PLE_ERR_FLAG_CFG_NUM1 0x9034 ++#define B_AX_PLE_ERR_FLAG_NUM1_VLD BIT(31) ++#define B_AX_PLE_ERR_FLAG_NUM1_MSTIDX_MASK GENMASK(27, 24) ++#define B_AX_PLE_ERR_FLAG_NUM1_ISRIDX_MASK GENMASK(20, 16) ++#define B_AX_PLE_DATCHN_FRZTMR_MODE BIT(2) ++#define B_AX_PLE_QUEMGN_FRZTMR_MODE BIT(1) ++#define B_AX_PLE_BUFMGN_FRZTMR_MODE BIT(0) ++ ++#define R_AX_PLE_ERRFLAG_MSG 0x9030 ++#define B_AX_PLE_ERR_FLAG_MSG_MASK GENMASK(31, 0) ++#define B_AX_PLE_DATCHN_CAMREQ_ERR_INT_EN BIT(29) ++#define B_AX_PLE_DATCHN_ADRERR_ERR_INT_EN BIT(28) ++#define B_AX_PLE_BUFMGN_FRZTO_ERR_INT_EN_V1 BIT(9) ++#define B_AX_PLE_GETNPG_PGOFST_ERR_INT_EN_V1 BIT(8) ++#define B_AX_PLE_GETNPG_STRPG_ERR_INT_EN_V1 BIT(7) ++#define B_AX_PLE_BUFREQ_SRCHTAILPG_ERR_INT_EN_V1 BIT(6) ++#define B_AX_PLE_BUFRTN_SIZE_ERR_INT_EN_V1 BIT(5) ++#define B_AX_PLE_BUFRTN_INVLD_PKTID_ERR_INT_EN_V1 BIT(4) ++#define B_AX_PLE_BUFREQ_UNAVAL_ERR_INT_EN_V1 BIT(3) ++#define B_AX_PLE_BUFREQ_SIZELMT_INT_EN BIT(2) ++#define B_AX_PLE_BUFREQ_SIZE0_INT_EN BIT(1) ++#define B_AX_PLE_DATCHN_CAMREQ_ERR BIT(29) ++#define B_AX_PLE_DATCHN_ADRERR_ERR BIT(28) ++#define B_AX_PLE_BUFMGN_FRZTO_ERR_V1 BIT(9) ++#define B_AX_PLE_GETNPG_PGOFST_ERR_V1 BIT(8) ++#define B_AX_PLE_GETNPG_STRPG_ERR_V1 BIT(7) ++#define B_AX_PLE_BUFREQ_SRCHTAILPG_ERR_V1 BIT(6) ++#define B_AX_PLE_BUFRTN_SIZE_ERR_V1 BIT(5) ++#define B_AX_PLE_BUFRTN_INVLD_PKTID_ERR_V1 BIT(4) ++#define B_AX_PLE_BUFREQ_UNAVAL_ERR_V1 BIT(3) ++#define B_AX_PLE_BUFREQ_SIZELMT_ERR BIT(2) ++#define B_AX_PLE_BUFREQ_SIZE0_ERR BIT(1) + + #define R_AX_PLE_ERR_IMR 0x9038 + #define B_AX_PLE_DATCHN_RRDY_ERR_INT_EN BIT(27) +@@ -1393,6 +1497,19 @@ + #define B_AX_BBRPT_COM_NULL_PLPKTID_ERR BIT(16) + #define B_AX_BBRPT_COM_NULL_PLPKTID_ERR_INT_EN BIT(0) + ++#define R_AX_BBRPT_COM_ERR_ISR 0x960C ++#define B_AX_BBRPT_COM_NULL_PLPKTID_ERR_INT_V1 BIT(0) ++ ++#define R_AX_BBRPT_CHINFO_ERR_ISR 0x962C ++#define B_AX_BBPRT_CHIF_TO_ERR_V1 BIT(7) ++#define B_AX_BBPRT_CHIF_NULL_ERR_V1 BIT(6) ++#define B_AX_BBPRT_CHIF_LEFT2_ERR_V1 BIT(5) ++#define B_AX_BBPRT_CHIF_LEFT1_ERR_V1 BIT(4) ++#define B_AX_BBPRT_CHIF_HDRL_ERR_V1 BIT(3) ++#define B_AX_BBPRT_CHIF_BOVF_ERR_V1 BIT(2) ++#define B_AX_BBPRT_CHIF_OVF_ERR_V1 BIT(1) ++#define B_AX_BBPRT_CHIF_BB_TO_ERR_V1 BIT(0) ++ + #define R_AX_BBRPT_CHINFO_ERR_IMR 0x9628 + #define B_AX_BBPRT_CHIF_TO_ERR_INT_EN BIT(7) + #define B_AX_BBPRT_CHIF_NULL_ERR_INT_EN BIT(6) +@@ -1444,6 +1561,9 @@ + #define B_AX_BBRPT_DFS_TO_ERR BIT(16) + #define B_AX_BBRPT_DFS_TO_ERR_INT_EN BIT(0) + ++#define R_AX_BBRPT_DFS_ERR_ISR 0x963C ++#define B_AX_BBRPT_DFS_TO_ERR_V1 BIT(0) ++ + #define R_AX_LA_ERRFLAG 0x966C + #define B_AX_LA_ISR_DATA_LOSS_ERR BIT(16) + #define B_AX_LA_IMR_DATA_LOSS_ERR BIT(0) +@@ -1535,6 +1655,8 @@ + #define R_AX_ACTION_FWD0 0x9C04 + #define TRXCFG_MPDU_PROC_ACT_FRWD 0x02A95A95 + ++#define R_AX_ACTION_FWD1 0x9C08 ++ + #define R_AX_TF_FWD 0x9C14 + #define TRXCFG_MPDU_PROC_TF_FRWD 0x0000AA55 + +@@ -1546,6 +1668,9 @@ + #define R_AX_CUT_AMSDU_CTRL 0x9C40 + #define TRXCFG_MPDU_PROC_CUT_CTRL 0x010E05F0 + ++#define R_AX_WOW_CTRL 0x9C50 ++#define B_AX_WOW_WOWEN BIT(1) ++ + #define R_AX_MPDU_RX_ERR_ISR 0x9CF0 + #define R_AX_MPDU_RX_ERR_IMR 0x9CF4 + #define B_AX_RPT_ERR_INT_EN BIT(3) +@@ -1554,6 +1679,7 @@ + #define B_AX_MPDU_RX_IMR_SET_V1 B_AX_RPT_ERR_INT_EN + + #define R_AX_SEC_ENG_CTRL 0x9D00 ++#define B_AX_SEC_DBG_PORT_FIELD_MASK GENMASK(19, 16) + #define B_AX_TX_PARTIAL_MODE BIT(11) + #define B_AX_CLK_EN_CGCMP BIT(10) + #define B_AX_CLK_EN_WAPI BIT(9) +@@ -1583,12 +1709,21 @@ + #define R_AX_SEC_TX_DEBUG 0x9D20 + #define R_AX_SEC_RX_DEBUG 0x9D24 + #define R_AX_SEC_TRX_PKT_CNT 0x9D28 ++ ++#define R_AX_SEC_DEBUG2 0x9D28 ++#define B_AX_DBG_READ_SH 2 ++#define B_AX_DBG_READ_MSK 0x3fffffff ++ + #define R_AX_SEC_TRX_BLK_CNT 0x9D2C + + #define R_AX_SEC_ERROR_FLAG_IMR 0x9D2C + #define B_AX_RX_HANG_IMR BIT(1) + #define B_AX_TX_HANG_IMR BIT(0) + ++#define R_AX_SEC_ERROR_FLAG 0x9D30 ++#define B_AX_RX_HANG_ERROR_V1 BIT(1) ++#define B_AX_TX_HANG_ERROR_V1 BIT(0) ++ + #define R_AX_SS_CTRL 0x9E10 + #define B_AX_SS_INIT_DONE_1 BIT(31) + #define B_AX_SS_WARM_INIT_FLG BIT(29) +@@ -1723,6 +1858,28 @@ + B_AX_B0_IMR_ERR_PRELD_RLSPKTSZERR | \ + B_AX_B0_IMR_ERR_PRELD_ENTNUMCFG) + ++#define R_AX_TXPKTCTL_B0_ERRFLAG_ISR 0x9F7C ++#define B_AX_B0_ISR_ERR_PRELD_EVT3 BIT(23) ++#define B_AX_B0_ISR_ERR_PRELD_EVT2 BIT(22) ++#define B_AX_B0_ISR_ERR_PRELD_ENTNUMCFG BIT(21) ++#define B_AX_B0_ISR_ERR_PRELD_RLSPKTSZERR BIT(20) ++#define B_AX_B0_ISR_ERR_MPDUIF_ERR1 BIT(19) ++#define B_AX_B0_ISR_ERR_MPDUIF_DATAERR BIT(18) ++#define B_AX_B0_ISR_ERR_MPDUINFO_ERR1 BIT(17) ++#define B_AX_B0_ISR_ERR_MPDUINFO_RECFG BIT(16) ++#define B_AX_B0_ISR_ERR_CMDPSR_TBLSZ BIT(11) ++#define B_AX_B0_ISR_ERR_CMDPSR_FRZTO BIT(10) ++#define B_AX_B0_ISR_ERR_CMDPSR_CMDTYPE BIT(9) ++#define B_AX_B0_ISR_ERR_CMDPSR_1STCMDERR BIT(8) ++#define B_AX_B0_ISR_ERR_USRCTL_EVT7 BIT(7) ++#define B_AX_B0_ISR_ERR_USRCTL_EVT6 BIT(6) ++#define B_AX_B0_ISR_ERR_USRCTL_EVT5 BIT(5) ++#define B_AX_B0_ISR_ERR_USRCTL_EVT4 BIT(4) ++#define B_AX_B0_ISR_ERR_USRCTL_RLSBMPLEN BIT(3) ++#define B_AX_B0_ISR_ERR_USRCTL_RDNRLSCMD BIT(2) ++#define B_AX_B0_ISR_ERR_USRCTL_NOINIT BIT(1) ++#define B_AX_B0_ISR_ERR_USRCTL_REINIT BIT(0) ++ + #define R_AX_TXPKTCTL_B1_PRELD_CFG0 0x9F88 + #define B_AX_B1_PRELD_FEN BIT(31) + #define B_AX_B1_PRELD_USEMAXSZ_MASK GENMASK(25, 16) +@@ -1770,6 +1927,28 @@ + B_AX_B1_IMR_ERR_PRELD_RLSPKTSZERR | \ + B_AX_B1_IMR_ERR_PRELD_ENTNUMCFG) + ++#define R_AX_TXPKTCTL_B1_ERRFLAG_ISR 0x9FBC ++#define B_AX_B1_ISR_ERR_PRELD_EVT3 BIT(23) ++#define B_AX_B1_ISR_ERR_PRELD_EVT2 BIT(22) ++#define B_AX_B1_ISR_ERR_PRELD_ENTNUMCFG BIT(21) ++#define B_AX_B1_ISR_ERR_PRELD_RLSPKTSZERR BIT(20) ++#define B_AX_B1_ISR_ERR_MPDUIF_ERR1 BIT(19) ++#define B_AX_B1_ISR_ERR_MPDUIF_DATAERR BIT(18) ++#define B_AX_B1_ISR_ERR_MPDUINFO_ERR1 BIT(17) ++#define B_AX_B1_ISR_ERR_MPDUINFO_RECFG BIT(16) ++#define B_AX_B1_ISR_ERR_CMDPSR_TBLSZ BIT(11) ++#define B_AX_B1_ISR_ERR_CMDPSR_FRZTO BIT(10) ++#define B_AX_B1_ISR_ERR_CMDPSR_CMDTYPE BIT(9) ++#define B_AX_B1_ISR_ERR_CMDPSR_1STCMDERR BIT(8) ++#define B_AX_B1_ISR_ERR_USRCTL_EVT7 BIT(7) ++#define B_AX_B1_ISR_ERR_USRCTL_EVT6 BIT(6) ++#define B_AX_B1_ISR_ERR_USRCTL_EVT5 BIT(5) ++#define B_AX_B1_ISR_ERR_USRCTL_EVT4 BIT(4) ++#define B_AX_B1_ISR_ERR_USRCTL_RLSBMPLEN BIT(3) ++#define B_AX_B1_ISR_ERR_USRCTL_RDNRLSCMD BIT(2) ++#define B_AX_B1_ISR_ERR_USRCTL_NOINIT BIT(1) ++#define B_AX_B1_ISR_ERR_USRCTL_REINIT BIT(0) ++ + #define R_AX_AFE_CTRL1 0x0024 + + #define B_AX_R_SYM_WLCMAC1_P4_PC_EN BIT(4) +@@ -1869,6 +2048,23 @@ + #define B_AX_PTCL_TOP_ERR_IND BIT(1) + #define B_AX_SCHEDULE_TOP_ERR_IND BIT(0) + ++#define R_AX_PORT0_TSF_SYNC 0xC2A0 ++#define R_AX_PORT0_TSF_SYNC_C1 0xE2A0 ++#define R_AX_PORT1_TSF_SYNC 0xC2A4 ++#define R_AX_PORT1_TSF_SYNC_C1 0xE2A4 ++#define R_AX_PORT2_TSF_SYNC 0xC2A8 ++#define R_AX_PORT2_TSF_SYNC_C1 0xE2A8 ++#define R_AX_PORT3_TSF_SYNC 0xC2AC ++#define R_AX_PORT3_TSF_SYNC_C1 0xE2AC ++#define R_AX_PORT4_TSF_SYNC 0xC2B0 ++#define R_AX_PORT4_TSF_SYNC_C1 0xE2B0 ++#define B_AX_SYNC_NOW BIT(30) ++#define B_AX_SYNC_ONCE BIT(29) ++#define B_AX_SYNC_AUTO BIT(28) ++#define B_AX_SYNC_PORT_SRC GENMASK(26, 24) ++#define B_AX_SYNC_PORT_OFFSET_SIGN BIT(18) ++#define B_AX_SYNC_PORT_OFFSET_VAL GENMASK(17, 0) ++ + #define R_AX_MACID_SLEEP_0 0xC2C0 + #define R_AX_MACID_SLEEP_0_C1 0xE2C0 + #define B_AX_MACID31_0_SLEEP_SH 0 +@@ -2338,6 +2534,41 @@ + #define B_AX_DLE_IMR_SET (B_AX_RXSTS_FSM_HANG_ERROR_IMR | \ + B_AX_RXDATA_FSM_HANG_ERROR_IMR) + ++#define R_AX_RX_ERR_FLAG 0xC800 ++#define R_AX_RX_ERR_FLAG_C1 0xE800 ++#define B_AX_RX_GET_NO_PAGE_ERR BIT(31) ++#define B_AX_RX_GET_NULL_PKT_ERR BIT(30) ++#define B_AX_RX_RU0_FSM_HANG_ERR BIT(29) ++#define B_AX_RX_RU1_FSM_HANG_ERR BIT(28) ++#define B_AX_RX_RU2_FSM_HANG_ERR BIT(27) ++#define B_AX_RX_RU3_FSM_HANG_ERR BIT(26) ++#define B_AX_RX_RU4_FSM_HANG_ERR BIT(25) ++#define B_AX_RX_RU5_FSM_HANG_ERR BIT(24) ++#define B_AX_RX_RU6_FSM_HANG_ERR BIT(23) ++#define B_AX_RX_RU7_FSM_HANG_ERR BIT(22) ++#define B_AX_RX_RXSTS_FSM_HANG_ERR BIT(21) ++#define B_AX_RX_CSI_FSM_HANG_ERR BIT(20) ++#define B_AX_RX_TXRPT_FSM_HANG_ERR BIT(19) ++#define B_AX_RX_F2PCMD_FSM_HANG_ERR BIT(18) ++#define B_AX_RX_RU0_ZERO_LEN_ERR BIT(17) ++#define B_AX_RX_RU1_ZERO_LEN_ERR BIT(16) ++#define B_AX_RX_RU2_ZERO_LEN_ERR BIT(15) ++#define B_AX_RX_RU3_ZERO_LEN_ERR BIT(14) ++#define B_AX_RX_RU4_ZERO_LEN_ERR BIT(13) ++#define B_AX_RX_RU5_ZERO_LEN_ERR BIT(12) ++#define B_AX_RX_RU6_ZERO_LEN_ERR BIT(11) ++#define B_AX_RX_RU7_ZERO_LEN_ERR BIT(10) ++#define B_AX_RX_RXSTS_ZERO_LEN_ERR BIT(9) ++#define B_AX_RX_CSI_ZERO_LEN_ERR BIT(8) ++#define B_AX_PLE_DATA_OPT_FSM_HANG BIT(7) ++#define B_AX_PLE_RXDATA_REQ_BUF_FSM_HANG BIT(6) ++#define B_AX_PLE_TXRPT_REQ_BUF_FSM_HANG BIT(5) ++#define B_AX_PLE_WD_OPT_FSM_HANG BIT(4) ++#define B_AX_PLE_ENQ_FSM_HANG BIT(3) ++#define B_AX_RXDATA_ENQUE_ORDER_ERR BIT(2) ++#define B_AX_RXSTS_ENQUE_ORDER_ERR BIT(1) ++#define B_AX_RX_CSI_PKT_NUM_ERR BIT(0) ++ + #define R_AX_RXDMA_CTRL_0 0xC804 + #define R_AX_RXDMA_CTRL_0_C1 0xE804 + #define B_AX_RXDMA_DBGOUT_EN BIT(31) +@@ -2360,6 +2591,49 @@ + B_AX_RU2_PTR_FULL_MODE | B_AX_RU3_PTR_FULL_MODE | \ + B_AX_CSI_PTR_FULL_MODE | B_AX_RXSTS_PTR_FULL_MODE) + ++#define R_AX_RX_CTRL0 0xC808 ++#define R_AX_RX_CTRL0_C1 0xE808 ++#define B_AX_DLE_CLOCK_FORCE_V1 BIT(31) ++#define B_AX_TXDMA_CLOCK_FORCE_V1 BIT(30) ++#define B_AX_RXDMA_CLOCK_FORCE_V1 BIT(29) ++#define B_AX_RXDMA_DEFAULT_PAGE_V1_MASK GENMASK(28, 24) ++#define B_AX_RXDMA_CSI_TGT_QUEID_MASK GENMASK(23, 18) ++#define B_AX_RXDMA_CSI_TGT_PRID_MASK GENMASK(17, 15) ++#define B_AX_RXDMA_DIS_CSI_RELEASE_V1 BIT(14) ++#define B_AX_CSI_PTR_FULL_MODE_V1 BIT(13) ++#define B_AX_RXDATA_PTR_FULL_MODE BIT(12) ++#define B_AX_RXSTS_PTR_FULL_MODE_V1 BIT(11) ++#define B_AX_TXRPT_FULL_RSV_DEPTH_V1_MASK GENMASK(10, 8) ++#define B_AX_RXDATA_FULL_RSV_DEPTH_MASK GENMASK(7, 5) ++#define B_AX_RXSTS_FULL_RSV_DEPTH_V1_MASK GENMASK(4, 2) ++#define B_AX_ORDER_FIFO_MASK GENMASK(1, 0) ++ ++#define R_AX_RX_CTRL1 0xC80C ++#define R_AX_RX_CTRL1_C1 0xE80C ++#define B_AX_RXDMA_TXRPT_QUEUE_ID_SW_EN BIT(31) ++#define B_AX_RXDMA_TXRPT_QUEUE_ID_SW_V1_MASK GENMASK(30, 25) ++#define B_AX_RXDMA_F2PCMD_QUEUE_ID_SW_EN BIT(24) ++#define B_AX_RXDMA_F2PCMD_QUEUE_ID_SW_V1_MASK GENMASK(23, 18) ++#define B_AX_RXDMA_TXRPT_QUEUE_ID_TGT_SW_EN BIT(17) ++#define B_AX_RXDMA_TXRPT_QUEUE_ID_TGT_SW_1_MASK GENMASK(16, 11) ++#define B_AX_RXDMA_F2PCMD_QUEUE_ID_TGT_SW_EN BIT(10) ++#define B_AX_RXDMA_F2PCMD_QUEUE_ID_TGT_SW_1_MASK GENMASK(9, 4) ++#define B_AX_ORDER_FIFO_OUT BIT(3) ++#define B_AX_ORDER_FIFO_EMPTY BIT(2) ++#define B_AX_DBG_SEL_MASK GENMASK(1, 0) ++ ++#define R_AX_RX_CTRL2 0xC810 ++#define R_AX_RX_CTRL2_C1 0xE810 ++#define B_AX_DLE_WDE_STATE_V1_MASK GENMASK(31, 30) ++#define B_AX_DLE_PLE_STATE_V1_MASK GENMASK(29, 28) ++#define B_AX_DLE_REQ_BUF_STATE_MASK GENMASK(27, 26) ++#define B_AX_DLE_ENQ_STATE_V1 BIT(25) ++#define B_AX_RX_DBG_SEL_MASK GENMASK(24, 19) ++#define B_AX_MACRX_CS_MASK GENMASK(18, 14) ++#define B_AX_RXSTS_CS_MASK GENMASK(13, 9) ++#define B_AX_ERR_INDICATOR BIT(5) ++#define B_AX_TXRPT_CS_MASK GENMASK(4, 0) ++ + #define R_AX_RXDMA_PKT_INFO_0 0xC814 + #define R_AX_RXDMA_PKT_INFO_1 0xC818 + #define R_AX_RXDMA_PKT_INFO_2 0xC81C +@@ -2667,6 +2941,18 @@ + B_AX_TMAC_MIMO_CTRL | \ + B_AX_RMAC_FTM) + ++#define R_AX_TRXPTCL_ERROR_INDICA 0xCCC0 ++#define R_AX_TRXPTCL_ERROR_INDICA_C1 0xECC0 ++#define B_AX_FTM_ERROR_FLAG_CLR BIT(8) ++#define B_AX_CSI_ERROR_FLAG_CLR BIT(7) ++#define B_AX_MIMOCTRL_ERROR_FLAG_CLR BIT(6) ++#define B_AX_RXTB_ERROR_FLAG_CLR BIT(5) ++#define B_AX_HWSIGB_GEN_ERROR_FLAG_CLR BIT(4) ++#define B_AX_TXPLCP_ERROR_FLAG_CLR BIT(3) ++#define B_AX_RESP_ERROR_FLAG_CLR BIT(2) ++#define B_AX_TXCTL_ERROR_FLAG_CLR BIT(1) ++#define B_AX_MACTX_ERROR_FLAG_CLR BIT(0) ++ + #define R_AX_WMAC_TX_TF_INFO_0 0xCCD0 + #define R_AX_WMAC_TX_TF_INFO_0_C1 0xECD0 + #define B_AX_WMAC_TX_TF_INFO_SEL_MASK GENMASK(2, 0) +@@ -2991,6 +3277,7 @@ + + #define R_AX_PWR_RATE_CTRL 0xD200 + #define R_AX_PWR_RATE_CTRL_C1 0xF200 ++#define B_AX_PWR_REF GENMASK(27, 10) + #define B_AX_FORCE_PWR_BY_RATE_EN BIT(9) + #define B_AX_FORCE_PWR_BY_RATE_VALUE_MASK GENMASK(8, 0) + +@@ -3128,6 +3415,7 @@ + #define BTC_BREAK_PARAM 0xf0ffffff + + #define R_BTC_BT_COEX_MSK_TABLE 0xDA30 ++#define B_BTC_PRI_MASK_RXCCK_V1 BIT(28) + #define B_BTC_PRI_MASK_TX_RESP_V1 BIT(3) + + #define R_AX_BT_COEX_CFG_2 0xDA34 +@@ -3271,8 +3559,10 @@ + #define RR_MOD_IQK GENMASK(19, 4) + #define RR_MOD_DPK GENMASK(19, 5) + #define RR_MOD_MASK GENMASK(19, 16) ++#define RR_MOD_RGM GENMASK(13, 4) + #define RR_MOD_V_DOWN 0x0 + #define RR_MOD_V_STANDBY 0x1 ++#define RR_TXAGC 0x10001 + #define RR_MOD_V_TX 0x2 + #define RR_MOD_V_RX 0x3 + #define RR_MOD_V_TXIQK 0x4 +@@ -3308,6 +3598,10 @@ + #define CFGCH_BAND1_2G 0 + #define CFGCH_BAND1_5G 1 + #define CFGCH_BAND1_6G 3 ++#define RR_CFGCH_POW_LCK BIT(15) ++#define RR_CFGCH_TRX_AH BIT(14) ++#define RR_CFGCH_BCN BIT(13) ++#define RR_CFGCH_BW2 BIT(12) + #define RR_CFGCH_BAND0 GENMASK(9, 8) + #define CFGCH_BAND0_2G 0 + #define CFGCH_BAND0_5G 1 +@@ -3340,6 +3634,7 @@ + #define RR_RXK_PLLEN BIT(5) + #define RR_LUTWA 0x33 + #define RR_LUTWA_MASK GENMASK(9, 0) ++#define RR_LUTWA_M1 GENMASK(7, 0) + #define RR_LUTWA_M2 GENMASK(4, 0) + #define RR_LUTWD1 0x3e + #define RR_LUTWD0 0x3f +@@ -3359,6 +3654,8 @@ + #define RR_TXGA_TRK_EN BIT(7) + #define RR_TXGA_LOK_EXT GENMASK(4, 0) + #define RR_TXGA_LOK_EN BIT(0) ++#define RR_TXGA_V1 0x10055 ++#define RR_TXGA_V1_TRK_EN BIT(7) + #define RR_GAINTX 0x56 + #define RR_GAINTX_ALL GENMASK(15, 0) + #define RR_GAINTX_PAD GENMASK(9, 5) +@@ -3387,6 +3684,8 @@ + #define RR_TXA2_LDO GENMASK(19, 16) + #define RR_TRXIQ 0x66 + #define RR_RSV6 0x6d ++#define RR_TXVBUF 0x7c ++#define RR_TXVBUF_DACEN BIT(5) + #define RR_TXPOW 0x7f + #define RR_TXPOW_TXA BIT(8) + #define RR_TXPOW_TXAS BIT(7) +@@ -3397,6 +3696,7 @@ + #define RR_RXBB_VOBUF GENMASK(15, 12) + #define RR_RXBB_C2G GENMASK(16, 10) + #define RR_RXBB_C1G GENMASK(9, 8) ++#define RR_RXBB_FATT GENMASK(7, 0) + #define RR_RXBB_ATTR GENMASK(7, 4) + #define RR_RXBB_ATTC GENMASK(2, 0) + #define RR_RXG 0x84 +@@ -3407,10 +3707,14 @@ + #define RR_RXAE_IQKMOD GENMASK(3, 0) + #define RR_RXA 0x8a + #define RR_RXA_DPK GENMASK(9, 8) ++#define RR_RXA_LNA 0x8b + #define RR_RXA2 0x8c ++#define RR_RAA2_SWATT GENMASK(15, 9) + #define RR_RXA2_C1 GENMASK(12, 10) + #define RR_RXA2_C2 GENMASK(9, 3) ++#define RR_RXA2_CC2 GENMASK(8, 7) + #define RR_RXA2_IATT GENMASK(7, 4) ++#define RR_RXA2_HATT GENMASK(6, 0) + #define RR_RXA2_ATT GENMASK(3, 0) + #define RR_RXIQGEN 0x8d + #define RR_RXIQGEN_ATTL GENMASK(12, 8) +@@ -3422,6 +3726,7 @@ + #define RR_RXBB2_IDAC GENMASK(11, 9) + #define RR_RXBB2_EBW GENMASK(6, 5) + #define RR_XALNA2 0x90 ++#define RR_XALNA2_SW2 GENMASK(9, 8) + #define RR_XALNA2_SW GENMASK(1, 0) + #define RR_DCK 0x92 + #define RR_DCK_DONE GENMASK(7, 5) +@@ -3439,18 +3744,36 @@ + #define RR_IQGEN_BIAS GENMASK(11, 8) + #define RR_TXIQK 0x98 + #define RR_TXIQK_ATT2 GENMASK(15, 12) ++#define RR_TXIQK_ATT1 GENMASK(6, 0) + #define RR_TIA 0x9e + #define RR_TIA_N6 BIT(8) + #define RR_MIXER 0x9f + #define RR_MIXER_GN GENMASK(4, 3) ++#define RR_POW 0xa0 ++#define RR_POW_SYN GENMASK(3, 2) + #define RR_LOGEN 0xa3 + #define RR_LOGEN_RPT GENMASK(19, 16) ++#define RR_SX 0xaf ++#define RR_LDO 0xb1 ++#define RR_LDO_SEL GENMASK(8, 6) ++#define RR_VCO 0xb2 ++#define RR_LPF 0xb7 ++#define RR_LPF_BUSY BIT(8) + #define RR_XTALX2 0xb8 + #define RR_MALSEL 0xbe ++#define RR_SYNFB 0xc5 ++#define RR_SYNFB_LK BIT(15) ++#define RR_LCKST 0xcf ++#define RR_LCKST_BIN BIT(0) + #define RR_LCK_TRG 0xd3 + #define RR_LCK_TRGSEL BIT(8) ++#define RR_MMD 0xd5 ++#define RR_MMD_RST_EN BIT(8) ++#define RR_MMD_RST_SYN BIT(6) + #define RR_IQKPLL 0xdc + #define RR_IQKPLL_MOD GENMASK(9, 8) ++#define RR_SYNLUT 0xdd ++#define RR_SYNLUT_MOD BIT(4) + #define RR_RCKD 0xde + #define RR_RCKD_POW GENMASK(19, 13) + #define RR_RCKD_BW BIT(2) +@@ -3479,11 +3802,14 @@ + #define B_ANAPAR_ADCCLK BIT(30) + #define B_ANAPAR_FLTRST BIT(22) + #define B_ANAPAR_CRXBB GENMASK(18, 16) ++#define B_ANAPAR_EN BIT(16) + #define B_ANAPAR_14 GENMASK(15, 0) + #define R_RFE_E_A2 0x0334 + #define R_RFE_O_SEL_A2 0x0338 + #define R_RFE_SEL0_A2 0x033C + #define R_RFE_SEL32_A2 0x0340 ++#define R_CIRST 0x035c ++#define B_CIRST_SYN GENMASK(11, 10) + #define R_SWSI_DATA_V1 0x0370 + #define B_SWSI_DATA_VAL_V1 GENMASK(19, 0) + #define B_SWSI_DATA_ADDR_V1 GENMASK(27, 20) +@@ -3619,6 +3945,10 @@ + #define R_P0_RFMODE 0x12AC + #define B_P0_RFMODE_ORI_TXRX_FTM_TX GENMASK(31, 4) + #define B_P0_RFMODE_MUX GENMASK(11, 4) ++#define R_P0_RFMODE_ORI_RX 0x12AC ++#define B_P0_RFMODE_ORI_RX_ALL GENMASK(23, 12) ++#define R_P0_RFMODE_FTM_RX 0x12B0 ++#define B_P0_RFMODE_FTM_RX GENMASK(11, 0) + #define R_P0_NRBW 0x12B8 + #define B_P0_NRBW_DBG BIT(30) + #define R_S0_RXDC 0x12D4 +@@ -3671,6 +4001,9 @@ + #define B_TXAGC_TP GENMASK(2, 0) + #define R_TSSI_THER 0x1C10 + #define B_TSSI_THER GENMASK(29, 24) ++#define R_TSSI_CWRPT 0x1C18 ++#define B_TSSI_CWRPT_RDY BIT(16) ++#define B_TSSI_CWRPT GENMASK(8, 0) + #define R_TXAGC_BTP 0x1CA0 + #define B_TXAGC_BTP GENMASK(31, 24) + #define R_TXAGC_BB 0x1C60 +@@ -3712,6 +4045,8 @@ + #define B_RXCCA_DIS_V1 BIT(0) + #define R_RXSC 0x237C + #define B_RXSC_EN BIT(0) ++#define R_RX_RPL_OFST 0x23AC ++#define B_RX_RPL_OFST_CCK_MASK GENMASK(6, 0) + #define R_RXSCOBC 0x23B0 + #define B_RXSCOBC_TH GENMASK(18, 0) + #define R_RXSCOCCK 0x23B4 +@@ -3725,9 +4060,18 @@ + #define B_P1_EN_SOUND_WO_NDP BIT(1) + #define R_S1_HW_SI_DIS 0x3200 + #define B_S1_HW_SI_DIS_W_R_TRIG GENMASK(30, 28) ++#define R_P1_RXCK 0x32A0 ++#define B_P1_RXCK_BW3 BIT(30) ++#define B_P1_TXCK_ALL GENMASK(19, 12) ++#define B_P1_RXCK_ON BIT(19) ++#define B_P1_RXCK_VAL GENMASK(18, 16) + #define R_P1_RFMODE 0x32AC + #define B_P1_RFMODE_ORI_TXRX_FTM_TX GENMASK(31, 4) + #define B_P1_RFMODE_MUX GENMASK(11, 4) ++#define R_P1_RFMODE_ORI_RX 0x32AC ++#define B_P1_RFMODE_ORI_RX_ALL GENMASK(23, 12) ++#define R_P1_RFMODE_FTM_RX 0x32B0 ++#define B_P1_RFMODE_FTM_RX GENMASK(11, 0) + #define R_P1_DBGMOD 0x32B8 + #define B_P1_DBGMOD_ON BIT(30) + #define R_S1_RXDC 0x32D4 +@@ -3761,7 +4105,10 @@ + #define R_T2F_GI_COMB 0x4424 + #define B_T2F_GI_COMB_EN BIT(2) + #define R_BT_DYN_DC_EST_EN 0x441C ++#define R_BT_DYN_DC_EST_EN_V1 0x4420 + #define B_BT_DYN_DC_EST_EN_MSK BIT(31) ++#define R_ASSIGN_SBD_OPT_V1 0x4440 ++#define B_ASSIGN_SBD_OPT_EN_V1 BIT(31) + #define R_ASSIGN_SBD_OPT 0x4450 + #define B_ASSIGN_SBD_OPT_EN BIT(24) + #define R_DCFO_COMP_S0 0x448C +@@ -3770,8 +4117,12 @@ + #define B_DCFO_WEIGHT_MSK GENMASK(27, 24) + #define R_DCFO_OPT 0x4494 + #define B_DCFO_OPT_EN BIT(29) ++#define B_TXSHAPE_TRIANGULAR_CFG GENMASK(25, 24) + #define R_BANDEDGE 0x4498 + #define B_BANDEDGE_EN BIT(30) ++#define R_DPD_BF 0x44a0 ++#define B_DPD_BF_OFDM GENMASK(16, 12) ++#define B_DPD_BF_SCA GENMASK(6, 0) + #define R_TXPATH_SEL 0x458C + #define B_TXPATH_SEL_MSK GENMASK(31, 28) + #define R_TXPWR 0x4594 +@@ -3902,6 +4253,8 @@ + #define R_P1_NBIIDX 0x4770 + #define B_P1_NBIIDX_VAL GENMASK(11, 0) + #define B_P1_NBIIDX_NOTCH_EN BIT(12) ++#define R_PKT_CTRL 0x47D4 ++#define B_PKT_POP_EN BIT(8) + #define R_SEG0R_PD 0x481C + #define R_SEG0R_PD_V1 0x4860 + #define B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1 BIT(30) +@@ -3910,20 +4263,42 @@ + #define R_2P4G_BAND 0x4970 + #define B_2P4G_BAND_SEL BIT(1) + #define R_FC0_BW 0x4974 +-#define B_FC0_BW_INV GENMASK(6, 0) ++#define R_FC0_BW_V1 0x49C0 + #define B_FC0_BW_SET GENMASK(31, 30) + #define B_ANT_RX_BT_SEG0 GENMASK(25, 22) + #define B_ANT_RX_1RCCA_SEG1 GENMASK(21, 18) + #define B_ANT_RX_1RCCA_SEG0 GENMASK(17, 14) ++#define B_FC0_BW_INV GENMASK(6, 0) + #define R_CHBW_MOD 0x4978 ++#define R_CHBW_MOD_V1 0x49C4 + #define B_BT_SHARE BIT(14) + #define B_CHBW_MOD_SBW GENMASK(13, 12) + #define B_CHBW_MOD_PRICH GENMASK(11, 8) + #define B_ANT_RX_SEG0 GENMASK(3, 0) ++#define R_P0_RPL1 0x49B0 ++#define B_P0_RPL1_41_MASK GENMASK(31, 24) ++#define B_P0_RPL1_40_MASK GENMASK(23, 16) ++#define B_P0_RPL1_20_MASK GENMASK(15, 8) ++#define B_P0_RPL1_MASK (B_P0_RPL1_41_MASK | B_P0_RPL1_40_MASK | B_P0_RPL1_20_MASK) ++#define B_P0_RPL1_SHIFT 8 ++#define B_P0_RPL1_BIAS_MASK GENMASK(7, 0) ++#define R_P0_RPL2 0x49B4 ++#define B_P0_RTL2_8A_MASK GENMASK(31, 24) ++#define B_P0_RTL2_81_MASK GENMASK(23, 16) ++#define B_P0_RTL2_80_MASK GENMASK(15, 8) ++#define B_P0_RTL2_42_MASK GENMASK(7, 0) ++#define R_P0_RPL3 0x49B8 ++#define B_P0_RTL3_89_MASK GENMASK(31, 24) ++#define B_P0_RTL3_84_MASK GENMASK(23, 16) ++#define B_P0_RTL3_83_MASK GENMASK(15, 8) ++#define B_P0_RTL3_82_MASK GENMASK(7, 0) + #define R_PD_BOOST_EN 0x49E8 + #define B_PD_BOOST_EN BIT(7) + #define R_P1_BACKOFF_IBADC_V1 0x49F0 + #define B_P1_BACKOFF_IBADC_V1 GENMASK(31, 26) ++#define R_P1_RPL1 0x4A00 ++#define R_P1_RPL2 0x4A04 ++#define R_P1_RPL3 0x4A08 + #define R_BK_FC0_INV_V1 0x4A1C + #define B_BK_FC0_INV_MSK_V1 GENMASK(18, 0) + #define R_CCK_FC0_INV_V1 0x4A20 +@@ -3934,8 +4309,10 @@ + #define B_P1_AGC_EN BIT(31) + #define R_PATH1_TIA_INIT_V1 0x4AA8 + #define B_PATH1_TIA_INIT_IDX_MSK_V1 BIT(9) ++#define R_P0_AGC_RSVD 0x4ACC + #define R_PATH0_RXBB_V1 0x4AD4 + #define B_PATH0_RXBB_MSK_V1 GENMASK(31, 0) ++#define R_P1_AGC_RSVD 0x4AD8 + #define R_PATH1_RXBB_V1 0x4AE0 + #define B_PATH1_RXBB_MSK_V1 GENMASK(31, 0) + #define R_PATH0_BT_BACKOFF_V1 0x4AE4 +@@ -3951,6 +4328,7 @@ + #define B_PATH0_NOTCH2_EN BIT(12) + #define B_PATH0_NOTCH2_VAL GENMASK(11, 0) + #define R_PATH0_5MDET 0x4C4C ++#define R_PATH0_5MDET_V1 0x46F8 + #define B_PATH0_5MDET_EN BIT(12) + #define B_PATH0_5MDET_SB2 BIT(8) + #define B_PATH0_5MDET_SB0 BIT(6) +@@ -3964,6 +4342,7 @@ + #define B_PATH1_NOTCH2_EN BIT(12) + #define B_PATH1_NOTCH2_VAL GENMASK(11, 0) + #define R_PATH1_5MDET 0x4D10 ++#define R_PATH1_5MDET_V1 0x47B8 + #define B_PATH1_5MDET_EN BIT(12) + #define B_PATH1_5MDET_SB2 BIT(8) + #define B_PATH1_5MDET_SB0 BIT(6) +@@ -3992,6 +4371,20 @@ + #define B_CFO_COMP_VALID_BIT BIT(29) + #define B_CFO_COMP_WEIGHT_MSK GENMASK(27, 24) + #define B_CFO_COMP_VAL_MSK GENMASK(11, 0) ++#define R_TSSI_PA_K1 0x5600 ++#define R_TSSI_PA_K2 0x5604 ++#define R_P0_TSSI_ALIM1 0x5630 ++#define B_P0_TSSI_ALIM1 GENMASK(29, 0) ++#define B_P0_TSSI_ALIM11 GENMASK(29, 20) ++#define B_P0_TSSI_ALIM12 GENMASK(19, 10) ++#define B_P0_TSSI_ALIM13 GENMASK(9, 0) ++#define R_P0_TSSI_ALIM3 0x5634 ++#define B_P0_TSSI_ALIM31 GENMASK(9, 0) ++#define R_TSSI_PA_K5 0x5638 ++#define R_P0_TSSI_ALIM2 0x563c ++#define B_P0_TSSI_ALIM2 GENMASK(29, 0) ++#define R_P0_TSSI_ALIM4 0x5640 ++#define R_TSSI_PA_K8 0x5644 + #define R_UPD_CLK 0x5670 + #define B_DAC_VAL BIT(31) + #define B_ACK_VAL GENMASK(30, 29) +@@ -4003,6 +4396,11 @@ + #define B_TXPWRB_VAL GENMASK(27, 19) + #define R_DPD_OFT_EN 0x5800 + #define B_DPD_OFT_EN BIT(28) ++#define B_DPD_TSSI_CW GENMASK(26, 18) ++#define B_DPD_PWR_CW GENMASK(17, 9) ++#define B_DPD_REF GENMASK(8, 0) ++#define R_P0_TSSIC 0x5814 ++#define B_P0_TSSIC_BYPASS BIT(11) + #define R_DPD_OFT_ADDR 0x5804 + #define B_DPD_OFT_ADDR GENMASK(31, 27) + #define R_TXPWRB_H 0x580c +@@ -4011,13 +4409,18 @@ + #define B_P0_TMETER GENMASK(15, 10) + #define B_P0_TMETER_DIS BIT(16) + #define B_P0_TMETER_TRK BIT(24) ++#define R_P1_TSSIC 0x7814 ++#define B_P1_TSSIC_BYPASS BIT(11) + #define R_P0_TSSI_TRK 0x5818 + #define B_P0_TSSI_TRK_EN BIT(30) ++#define B_P0_TSSI_RFC GENMASK(28, 27) + #define B_P0_TSSI_OFT_EN BIT(28) + #define B_P0_TSSI_OFT GENMASK(7, 0) + #define R_P0_TSSI_AVG 0x5820 ++#define B_P0_TSSI_EN BIT(31) + #define B_P0_TSSI_AVG GENMASK(15, 12) + #define R_P0_RFCTM 0x5864 ++#define B_P0_RFCTM_EN BIT(29) + #define B_P0_RFCTM_VAL GENMASK(25, 20) + #define R_P0_RFCTM_RDY BIT(26) + #define R_P0_TRSW 0x5868 +@@ -4030,13 +4433,16 @@ + #define B_P0_RFM_TX_OPT BIT(6) + #define B_P0_RFM_BT_EN BIT(5) + #define B_P0_RFM_OUT GENMASK(4, 0) ++#define R_P0_PATH_RST 0x58AC + #define R_P0_TXDPD 0x58D4 + #define B_P0_TXDPD GENMASK(31, 28) + #define R_P0_TXPW_RSTB 0x58DC + #define B_P0_TXPW_RSTB_MANON BIT(30) + #define B_P0_TXPW_RSTB_TSSI BIT(31) + #define R_P0_TSSI_MV_AVG 0x58E4 ++#define B_P0_TSSI_MV_MIX GENMASK(19, 11) + #define B_P0_TSSI_MV_AVG GENMASK(13, 11) ++#define B_P0_TSSI_MV_CLR BIT(14) + #define R_TXGAIN_SCALE 0x58F0 + #define B_TXGAIN_SCALE_EN BIT(19) + #define B_TXGAIN_SCALE_OFT GENMASK(31, 24) +@@ -4061,24 +4467,41 @@ + #define B_S0_DACKQ8_K GENMASK(15, 8) + #define R_RPL_BIAS_COMP1 0x6DF0 + #define B_RPL_BIAS_COMP1_MASK GENMASK(7, 0) ++#define R_P1_TSSI_ALIM1 0x7630 ++#define B_P1_TSSI_ALIM1 GENMASK(29, 0) ++#define B_P1_TSSI_ALIM11 GENMASK(29, 20) ++#define B_P1_TSSI_ALIM12 GENMASK(19, 10) ++#define B_P1_TSSI_ALIM13 GENMASK(9, 0) ++#define R_P1_TSSI_ALIM3 0x7634 ++#define B_P1_TSSI_ALIM31 GENMASK(9, 0) ++#define R_P1_TSSI_ALIM2 0x763c ++#define B_P1_TSSI_ALIM2 GENMASK(29, 0) ++#define R_P1_TSSIC 0x7814 ++#define B_P1_TSSIC_BYPASS BIT(11) + #define R_P1_TMETER 0x7810 + #define B_P1_TMETER GENMASK(15, 10) + #define B_P1_TMETER_DIS BIT(16) + #define B_P1_TMETER_TRK BIT(24) + #define R_P1_TSSI_TRK 0x7818 + #define B_P1_TSSI_TRK_EN BIT(30) ++#define B_P1_TSSI_RFC GENMASK(28, 27) + #define B_P1_TSSI_OFT_EN BIT(28) + #define B_P1_TSSI_OFT GENMASK(7, 0) + #define R_P1_TSSI_AVG 0x7820 ++#define B_P1_TSSI_EN BIT(31) + #define B_P1_TSSI_AVG GENMASK(15, 12) + #define R_P1_RFCTM 0x7864 + #define R_P1_RFCTM_RDY BIT(26) + #define B_P1_RFCTM_VAL GENMASK(25, 20) ++#define B_P1_RFCTM_DEL GENMASK(19, 11) ++#define R_P1_PATH_RST 0x78AC + #define R_P1_TXPW_RSTB 0x78DC + #define B_P1_TXPW_RSTB_MANON BIT(30) + #define B_P1_TXPW_RSTB_TSSI BIT(31) + #define R_P1_TSSI_MV_AVG 0x78E4 ++#define B_P1_TSSI_MV_MIX GENMASK(19, 11) + #define B_P1_TSSI_MV_AVG GENMASK(13, 11) ++#define B_P1_TSSI_MV_CLR BIT(14) + #define R_TSSI_THOF 0x7C00 + #define R_S1_DACKI 0x7E00 + #define B_S1_DACKI_AR GENMASK(31, 28) +@@ -4148,6 +4571,7 @@ + #define B_KPATH_CFG_ED GENMASK(21, 20) + #define R_KIP_RPT1 0x80D4 + #define B_KIP_RPT1_SEL GENMASK(21, 16) ++#define B_KIP_RPT1_SEL_V1 GENMASK(19, 16) + #define R_SRAM_IQRX 0x80D8 + #define R_GAPK 0x80E0 + #define B_GAPK_ADR BIT(0) +@@ -4169,12 +4593,14 @@ + #define B_PRT_COM_GL GENMASK(7, 4) + #define B_PRT_COM_CORI GENMASK(7, 0) + #define B_PRT_COM_RXBB GENMASK(5, 0) ++#define B_PRT_COM_RXBB_V1 GENMASK(4, 0) + #define B_PRT_COM_DONE BIT(0) + #define R_COEF_SEL 0x8104 + #define B_COEF_SEL_IQC BIT(0) + #define B_COEF_SEL_MDPD BIT(8) + #define R_CFIR_SYS 0x8120 + #define R_IQK_RES 0x8124 ++#define B_IQK_RES_K BIT(28) + #define B_IQK_RES_TXCFIR GENMASK(11, 8) + #define B_IQK_RES_RXCFIR GENMASK(3, 0) + #define R_TXIQC 0x8138 +@@ -4206,13 +4632,18 @@ + #define B_DPD_LBK BIT(7) + #define R_DPD_CH0 0x81AC + #define R_DPD_BND 0x81B4 ++#define B_DPD_BND_1 GENMASK(24, 16) ++#define B_DPD_BND_0 GENMASK(8, 0) + #define R_DPD_CH0A 0x81BC + #define B_DPD_MEN GENMASK(31, 28) + #define B_DPD_ORDER GENMASK(26, 24) ++#define B_DPD_ORDER_V1 GENMASK(26, 25) ++#define B_DPD_CFG GENMASK(22, 0) + #define B_DPD_SEL GENMASK(13, 8) + #define R_TXAGC_RFK 0x81C4 + #define B_TXAGC_RFK_CH0 GENMASK(5, 0) + #define R_DPD_COM 0x81C8 ++#define B_DPD_COM_OF BIT(15) + #define R_KIP_IQP 0x81CC + #define B_KIP_IQP_SW GENMASK(13, 12) + #define B_KIP_IQP_IQSW GENMASK(5, 0) +@@ -4231,6 +4662,9 @@ + #define B_RPT_PER_TSSI GENMASK(28, 16) + #define B_RPT_PER_OF GENMASK(15, 8) + #define B_RPT_PER_TH GENMASK(5, 0) ++#define R_IQRSN 0x8220 ++#define B_IQRSN_K1 BIT(28) ++#define B_IQRSN_K2 BIT(16) + #define R_RXCFIR_P0C0 0x8D40 + #define R_RXCFIR_P0C1 0x8D84 + #define R_RXCFIR_P0C2 0x8DC8 +@@ -4288,6 +4722,8 @@ + #define B_DACK_S0P3_OK BIT(2) + #define R_DACK_DADCK01 0xC084 + #define B_DACK_DADCK01 GENMASK(31, 24) ++#define R_DRCK_FH 0xC094 ++#define B_DRCK_LAT BIT(9) + #define R_DRCK 0xC0C4 + #define B_DRCK_IDLE BIT(9) + #define B_DRCK_EN BIT(6) +@@ -4295,15 +4731,29 @@ + #define R_DRCK_RES 0xC0C8 + #define B_DRCK_RES GENMASK(19, 15) + #define B_DRCK_POL BIT(3) ++#define R_DRCK_V1 0xC0CC ++#define B_DRCK_V1_SEL BIT(9) ++#define B_DRCK_V1_KICK BIT(6) ++#define B_DRCK_V1_CV GENMASK(4, 0) ++#define R_DRCK_RS 0xC0D0 ++#define B_DRCK_RS_LPS GENMASK(19, 15) ++#define B_DRCK_RS_DONE BIT(3) + #define R_PATH0_SAMPL_DLY_T_V1 0xC0D4 + #define B_PATH0_SAMPL_DLY_T_MSK_V1 GENMASK(27, 26) + #define R_P0_CFCH_BW0 0xC0D4 + #define B_P0_CFCH_BW0 GENMASK(27, 26) + #define R_P0_CFCH_BW1 0xC0D8 ++#define B_P0_CFCH_EX BIT(13) + #define B_P0_CFCH_BW1 GENMASK(8, 5) ++#define R_ADDCK0D 0xC0F0 ++#define B_ADDCK0D_VAL2 GENMASK(31, 26) ++#define B_ADDCK0D_VAL GENMASK(25, 16) + #define R_ADDCK0 0xC0F4 ++#define B_ADDCK0_TRG BIT(11) + #define B_ADDCK0 GENMASK(9, 8) ++#define B_ADDCK0_MAN GENMASK(5, 4) + #define B_ADDCK0_EN BIT(4) ++#define B_ADDCK0_VAL GENMASK(3, 0) + #define B_ADDCK0_RST BIT(2) + #define R_ADDCK0_RL 0xC0F8 + #define B_ADDCK0_RLS GENMASK(29, 28) +@@ -4343,9 +4793,15 @@ + #define R_PATH0_BW_SEL_V1 0xC0D8 + #define B_PATH0_BW_SEL_MSK_V1 GENMASK(8, 5) + #define R_PATH1_BW_SEL_V1 0xC1D8 ++#define B_PATH1_BW_SEL_EX BIT(13) + #define B_PATH1_BW_SEL_MSK_V1 GENMASK(8, 5) ++#define R_ADDCK1D 0xC1F0 ++#define B_ADDCK1D_VAL2 GENMASK(31, 26) ++#define B_ADDCK1D_VAL GENMASK(25, 16) + #define R_ADDCK1 0xC1F4 ++#define B_ADDCK1_TRG BIT(11) + #define B_ADDCK1 GENMASK(9, 8) ++#define B_ADDCK1_MAN GENMASK(5, 4) + #define B_ADDCK1_EN BIT(4) + #define B_ADDCK1_RST BIT(2) + #define R_ADDCK1_RL 0xC1F8 +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852a.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852a.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852a.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852a.c 2022-12-24 00:49:25.782376835 +0200 +@@ -48,6 +48,10 @@ static const struct rtw89_dle_mem rtw885 + &rtw89_mac_size.ple_size0, &rtw89_mac_size.wde_qt0, + &rtw89_mac_size.wde_qt0, &rtw89_mac_size.ple_qt4, + &rtw89_mac_size.ple_qt5}, ++ [RTW89_QTA_WOW] = {RTW89_QTA_WOW, &rtw89_mac_size.wde_size0, ++ &rtw89_mac_size.ple_size0, &rtw89_mac_size.wde_qt0, ++ &rtw89_mac_size.wde_qt0, &rtw89_mac_size.ple_qt4, ++ &rtw89_mac_size.ple_qt_52a_wow}, + [RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size4, + &rtw89_mac_size.ple_size4, &rtw89_mac_size.wde_qt4, + &rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13, +@@ -1410,151 +1414,14 @@ static void rtw8852a_set_txpwr_ref(struc + phy_idx); + } + +-static void rtw8852a_set_txpwr_byrate(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +- u8 band = chan->band_type; +- u8 ch = chan->channel; +- static const u8 rs[] = { +- RTW89_RS_CCK, +- RTW89_RS_OFDM, +- RTW89_RS_MCS, +- RTW89_RS_HEDCM, +- }; +- s8 tmp; +- u8 i, j; +- u32 val, shf, addr = R_AX_PWR_BY_RATE; +- struct rtw89_rate_desc cur; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr byrate with ch=%d\n", ch); +- +- for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) { +- for (i = 0; i < ARRAY_SIZE(rs); i++) { +- if (cur.nss >= rtw89_rs_nss_max[rs[i]]) +- continue; +- +- val = 0; +- cur.rs = rs[i]; +- +- for (j = 0; j < rtw89_rs_idx_max[rs[i]]; j++) { +- cur.idx = j; +- shf = (j % 4) * 8; +- tmp = rtw89_phy_read_txpwr_byrate(rtwdev, band, +- &cur); +- val |= (tmp << shf); +- +- if ((j + 1) % 4) +- continue; +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- val = 0; +- addr += 4; +- } +- } +- } +-} +- +-static void rtw8852a_set_txpwr_offset(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +- u8 band = chan->band_type; +- struct rtw89_rate_desc desc = { +- .nss = RTW89_NSS_1, +- .rs = RTW89_RS_OFFSET, +- }; +- u32 val = 0; +- s8 v; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n"); +- +- for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++) { +- v = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc); +- val |= ((v & 0xf) << (4 * desc.idx)); +- } +- +- rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL, +- GENMASK(19, 0), val); +-} +- +-static void rtw8852a_set_txpwr_limit(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +-#define __MAC_TXPWR_LMT_PAGE_SIZE 40 +- u8 ch = chan->channel; +- u8 bw = chan->band_width; +- struct rtw89_txpwr_limit lmt[NTX_NUM_8852A]; +- u32 addr, val; +- const s8 *ptr; +- u8 i, j; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw); +- +- for (i = 0; i < NTX_NUM_8852A; i++) { +- rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt[i], i); +- +- for (j = 0; j < __MAC_TXPWR_LMT_PAGE_SIZE; j += 4) { +- addr = R_AX_PWR_LMT + j + __MAC_TXPWR_LMT_PAGE_SIZE * i; +- ptr = (s8 *)&lmt[i] + j; +- +- val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | +- FIELD_PREP(GENMASK(15, 8), ptr[1]) | +- FIELD_PREP(GENMASK(23, 16), ptr[2]) | +- FIELD_PREP(GENMASK(31, 24), ptr[3]); +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- } +- } +-#undef __MAC_TXPWR_LMT_PAGE_SIZE +-} +- +-static void rtw8852a_set_txpwr_limit_ru(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +-#define __MAC_TXPWR_LMT_RU_PAGE_SIZE 24 +- u8 ch = chan->channel; +- u8 bw = chan->band_width; +- struct rtw89_txpwr_limit_ru lmt_ru[NTX_NUM_8852A]; +- u32 addr, val; +- const s8 *ptr; +- u8 i, j; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw); +- +- for (i = 0; i < NTX_NUM_8852A; i++) { +- rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru[i], i); +- +- for (j = 0; j < __MAC_TXPWR_LMT_RU_PAGE_SIZE; j += 4) { +- addr = R_AX_PWR_RU_LMT + j + +- __MAC_TXPWR_LMT_RU_PAGE_SIZE * i; +- ptr = (s8 *)&lmt_ru[i] + j; +- +- val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | +- FIELD_PREP(GENMASK(15, 8), ptr[1]) | +- FIELD_PREP(GENMASK(23, 16), ptr[2]) | +- FIELD_PREP(GENMASK(31, 24), ptr[3]); +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- } +- } +- +-#undef __MAC_TXPWR_LMT_RU_PAGE_SIZE +-} +- + static void rtw8852a_set_txpwr(struct rtw89_dev *rtwdev, + const struct rtw89_chan *chan, + enum rtw89_phy_idx phy_idx) + { +- rtw8852a_set_txpwr_byrate(rtwdev, chan, phy_idx); +- rtw8852a_set_txpwr_offset(rtwdev, chan, phy_idx); +- rtw8852a_set_txpwr_limit(rtwdev, chan, phy_idx); +- rtw8852a_set_txpwr_limit_ru(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx); + } + + static void rtw8852a_set_txpwr_ctrl(struct rtw89_dev *rtwdev, +@@ -2008,19 +1875,6 @@ static struct rtw89_btc_fbtc_mreg rtw89_ + }; + + static +-void rtw8852a_btc_bt_aci_imp(struct rtw89_dev *rtwdev) +-{ +- struct rtw89_btc *btc = &rtwdev->btc; +- struct rtw89_btc_dm *dm = &btc->dm; +- struct rtw89_btc_bt_info *bt = &btc->cx.bt; +- struct rtw89_btc_bt_link_info *b = &bt->link_info; +- +- /* fix LNA2 = level-5 for BT ACI issue at BTG */ +- if (btc->dm.wl_btg_rx && b->profile_cnt.now != 0) +- dm->trx_para_level = 1; +-} +- +-static + void rtw8852a_btc_update_bt_cnt(struct rtw89_dev *rtwdev) + { + struct rtw89_btc *btc = &rtwdev->btc; +@@ -2136,6 +1990,15 @@ static void rtw8852a_query_ppdu(struct r + rtw8852a_fill_freq_with_ppdu(rtwdev, phy_ppdu, status); + } + ++#ifdef CONFIG_PM ++static const struct wiphy_wowlan_support rtw_wowlan_stub_8852a = { ++ .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT, ++ .n_patterns = RTW89_MAX_PATTERN_NUM, ++ .pattern_max_len = RTW89_MAX_PATTERN_SIZE, ++ .pattern_min_len = 1, ++}; ++#endif ++ + static const struct rtw89_chip_ops rtw8852a_chip_ops = { + .enable_bb_rf = rtw89_mac_enable_bb_rf, + .disable_bb_rf = rtw89_mac_disable_bb_rf, +@@ -2178,7 +2041,6 @@ static const struct rtw89_chip_ops rtw88 + .btc_set_wl_pri = rtw8852a_btc_set_wl_pri, + .btc_set_wl_txpwr_ctrl = rtw8852a_btc_set_wl_txpwr_ctrl, + .btc_get_bt_rssi = rtw8852a_btc_get_bt_rssi, +- .btc_bt_aci_imp = rtw8852a_btc_bt_aci_imp, + .btc_update_bt_cnt = rtw8852a_btc_update_bt_cnt, + .btc_wl_s1_standby = rtw8852a_btc_wl_s1_standby, + .btc_set_wl_rx_gain = rtw8852a_btc_set_wl_rx_gain, +@@ -2196,6 +2058,8 @@ const struct rtw89_chip_info rtw8852a_ch + .rsvd_ple_ofst = 0x6f800, + .hfc_param_ini = rtw8852a_hfc_param_ini_pcie, + .dle_mem = rtw8852a_dle_mem_pcie, ++ .wde_qempty_acq_num = 16, ++ .wde_qempty_mgq_sel = 16, + .rf_base_addr = {0xc000, 0xd000}, + .pwr_on_seq = pwr_on_seq_8852a, + .pwr_off_seq = pwr_off_seq_8852a, +@@ -2218,6 +2082,7 @@ const struct rtw89_chip_info rtw8852a_ch + .support_bands = BIT(NL80211_BAND_2GHZ) | + BIT(NL80211_BAND_5GHZ), + .support_bw160 = false, ++ .support_ul_tb_ctrl = false, + .hw_sec_hdr = false, + .rf_path_num = 2, + .tx_nss = 2, +@@ -2279,11 +2144,15 @@ const struct rtw89_chip_info rtw8852a_ch + .c2h_ctrl_reg = R_AX_C2HREG_CTRL, + .c2h_regs = rtw8852a_c2h_regs, + .page_regs = &rtw8852a_page_regs, ++ .cfo_src_fd = false, + .dcfo_comp = &rtw8852a_dcfo_comp, + .dcfo_comp_sft = 3, + .imr_info = &rtw8852a_imr_info, + .rrsr_cfgs = &rtw8852a_rrsr_cfgs, + .dma_ch_mask = 0, ++#ifdef CONFIG_PM ++ .wowlan_stub = &rtw_wowlan_stub_8852a, ++#endif + }; + EXPORT_SYMBOL(rtw8852a_chip_info); + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852a.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852a.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852a.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852a.h 2022-12-24 00:49:25.782376835 +0200 +@@ -8,7 +8,6 @@ + #include "core.h" + + #define RF_PATH_NUM_8852A 2 +-#define NTX_NUM_8852A 2 + + enum rtw8852a_pmac_mode { + NONE_TEST, +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b.c 2022-12-24 00:49:25.782376835 +0200 +@@ -2,9 +2,46 @@ + /* Copyright(c) 2019-2022 Realtek Corporation + */ + +-#include "core.h" ++#include "coex.h" ++#include "fw.h" + #include "mac.h" ++#include "phy.h" + #include "reg.h" ++#include "rtw8852b.h" ++#include "rtw8852b_rfk.h" ++#include "rtw8852b_table.h" ++#include "txrx.h" ++ ++static const struct rtw89_hfc_ch_cfg rtw8852b_hfc_chcfg_pcie[] = { ++ {5, 343, grp_0}, /* ACH 0 */ ++ {5, 343, grp_0}, /* ACH 1 */ ++ {5, 343, grp_0}, /* ACH 2 */ ++ {5, 343, grp_0}, /* ACH 3 */ ++ {0, 0, grp_0}, /* ACH 4 */ ++ {0, 0, grp_0}, /* ACH 5 */ ++ {0, 0, grp_0}, /* ACH 6 */ ++ {0, 0, grp_0}, /* ACH 7 */ ++ {4, 344, grp_0}, /* B0MGQ */ ++ {4, 344, grp_0}, /* B0HIQ */ ++ {0, 0, grp_0}, /* B1MGQ */ ++ {0, 0, grp_0}, /* B1HIQ */ ++ {40, 0, 0} /* FWCMDQ */ ++}; ++ ++static const struct rtw89_hfc_pub_cfg rtw8852b_hfc_pubcfg_pcie = { ++ 448, /* Group 0 */ ++ 0, /* Group 1 */ ++ 448, /* Public Max */ ++ 0 /* WP threshold */ ++}; ++ ++static const struct rtw89_hfc_param_ini rtw8852b_hfc_param_ini_pcie[] = { ++ [RTW89_QTA_SCC] = {rtw8852b_hfc_chcfg_pcie, &rtw8852b_hfc_pubcfg_pcie, ++ &rtw89_mac_size.hfc_preccfg_pcie, RTW89_HCIFC_POH}, ++ [RTW89_QTA_DLFW] = {NULL, NULL, &rtw89_mac_size.hfc_preccfg_pcie, ++ RTW89_HCIFC_POH}, ++ [RTW89_QTA_INVALID] = {NULL}, ++}; + + static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = { + [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size6, +@@ -19,6 +56,2275 @@ static const struct rtw89_dle_mem rtw885 + NULL}, + }; + ++static const struct rtw89_reg3_def rtw8852b_pmac_ht20_mcs7_tbl[] = { ++ {0x4580, 0x0000ffff, 0x0}, ++ {0x4580, 0xffff0000, 0x0}, ++ {0x4584, 0x0000ffff, 0x0}, ++ {0x4584, 0xffff0000, 0x0}, ++ {0x4580, 0x0000ffff, 0x1}, ++ {0x4578, 0x00ffffff, 0x2018b}, ++ {0x4570, 0x03ffffff, 0x7}, ++ {0x4574, 0x03ffffff, 0x32407}, ++ {0x45b8, 0x00000010, 0x0}, ++ {0x45b8, 0x00000100, 0x0}, ++ {0x45b8, 0x00000080, 0x0}, ++ {0x45b8, 0x00000008, 0x0}, ++ {0x45a0, 0x0000ff00, 0x0}, ++ {0x45a0, 0xff000000, 0x1}, ++ {0x45a4, 0x0000ff00, 0x2}, ++ {0x45a4, 0xff000000, 0x3}, ++ {0x45b8, 0x00000020, 0x0}, ++ {0x4568, 0xe0000000, 0x0}, ++ {0x45b8, 0x00000002, 0x1}, ++ {0x456c, 0xe0000000, 0x0}, ++ {0x45b4, 0x00006000, 0x0}, ++ {0x45b4, 0x00001800, 0x1}, ++ {0x45b8, 0x00000040, 0x0}, ++ {0x45b8, 0x00000004, 0x0}, ++ {0x45b8, 0x00000200, 0x0}, ++ {0x4598, 0xf8000000, 0x0}, ++ {0x45b8, 0x00100000, 0x0}, ++ {0x45a8, 0x00000fc0, 0x0}, ++ {0x45b8, 0x00200000, 0x0}, ++ {0x45b0, 0x00000038, 0x0}, ++ {0x45b0, 0x000001c0, 0x0}, ++ {0x45a0, 0x000000ff, 0x0}, ++ {0x45b8, 0x00400000, 0x0}, ++ {0x4590, 0x000007ff, 0x0}, ++ {0x45b0, 0x00000e00, 0x0}, ++ {0x45ac, 0x0000001f, 0x0}, ++ {0x45b8, 0x00800000, 0x0}, ++ {0x45a8, 0x0003f000, 0x0}, ++ {0x45b8, 0x01000000, 0x0}, ++ {0x45b0, 0x00007000, 0x0}, ++ {0x45b0, 0x00038000, 0x0}, ++ {0x45a0, 0x00ff0000, 0x0}, ++ {0x45b8, 0x02000000, 0x0}, ++ {0x4590, 0x003ff800, 0x0}, ++ {0x45b0, 0x001c0000, 0x0}, ++ {0x45ac, 0x000003e0, 0x0}, ++ {0x45b8, 0x04000000, 0x0}, ++ {0x45a8, 0x00fc0000, 0x0}, ++ {0x45b8, 0x08000000, 0x0}, ++ {0x45b0, 0x00e00000, 0x0}, ++ {0x45b0, 0x07000000, 0x0}, ++ {0x45a4, 0x000000ff, 0x0}, ++ {0x45b8, 0x10000000, 0x0}, ++ {0x4594, 0x000007ff, 0x0}, ++ {0x45b0, 0x38000000, 0x0}, ++ {0x45ac, 0x00007c00, 0x0}, ++ {0x45b8, 0x20000000, 0x0}, ++ {0x45a8, 0x3f000000, 0x0}, ++ {0x45b8, 0x40000000, 0x0}, ++ {0x45b4, 0x00000007, 0x0}, ++ {0x45b4, 0x00000038, 0x0}, ++ {0x45a4, 0x00ff0000, 0x0}, ++ {0x45b8, 0x80000000, 0x0}, ++ {0x4594, 0x003ff800, 0x0}, ++ {0x45b4, 0x000001c0, 0x0}, ++ {0x4598, 0xf8000000, 0x0}, ++ {0x45b8, 0x00100000, 0x0}, ++ {0x45a8, 0x00000fc0, 0x7}, ++ {0x45b8, 0x00200000, 0x0}, ++ {0x45b0, 0x00000038, 0x0}, ++ {0x45b0, 0x000001c0, 0x0}, ++ {0x45a0, 0x000000ff, 0x0}, ++ {0x45b4, 0x06000000, 0x0}, ++ {0x45b0, 0x00000007, 0x0}, ++ {0x45b8, 0x00080000, 0x0}, ++ {0x45a8, 0x0000003f, 0x0}, ++ {0x457c, 0xffe00000, 0x1}, ++ {0x4530, 0xffffffff, 0x0}, ++ {0x4588, 0x00003fff, 0x0}, ++ {0x4598, 0x000001ff, 0x0}, ++ {0x4534, 0xffffffff, 0x0}, ++ {0x4538, 0xffffffff, 0x0}, ++ {0x453c, 0xffffffff, 0x0}, ++ {0x4588, 0x0fffc000, 0x0}, ++ {0x4598, 0x0003fe00, 0x0}, ++ {0x4540, 0xffffffff, 0x0}, ++ {0x4544, 0xffffffff, 0x0}, ++ {0x4548, 0xffffffff, 0x0}, ++ {0x458c, 0x00003fff, 0x0}, ++ {0x4598, 0x07fc0000, 0x0}, ++ {0x454c, 0xffffffff, 0x0}, ++ {0x4550, 0xffffffff, 0x0}, ++ {0x4554, 0xffffffff, 0x0}, ++ {0x458c, 0x0fffc000, 0x0}, ++ {0x459c, 0x000001ff, 0x0}, ++ {0x4558, 0xffffffff, 0x0}, ++ {0x455c, 0xffffffff, 0x0}, ++ {0x4530, 0xffffffff, 0x4e790001}, ++ {0x4588, 0x00003fff, 0x0}, ++ {0x4598, 0x000001ff, 0x1}, ++ {0x4534, 0xffffffff, 0x0}, ++ {0x4538, 0xffffffff, 0x4b}, ++ {0x45ac, 0x38000000, 0x7}, ++ {0x4588, 0xf0000000, 0x0}, ++ {0x459c, 0x7e000000, 0x0}, ++ {0x45b8, 0x00040000, 0x0}, ++ {0x45b8, 0x00020000, 0x0}, ++ {0x4590, 0xffc00000, 0x0}, ++ {0x45b8, 0x00004000, 0x0}, ++ {0x4578, 0xff000000, 0x0}, ++ {0x45b8, 0x00000400, 0x0}, ++ {0x45b8, 0x00000800, 0x0}, ++ {0x45b8, 0x00001000, 0x0}, ++ {0x45b8, 0x00002000, 0x0}, ++ {0x45b4, 0x00018000, 0x0}, ++ {0x45ac, 0x07800000, 0x0}, ++ {0x45b4, 0x00000600, 0x2}, ++ {0x459c, 0x0001fe00, 0x80}, ++ {0x45ac, 0x00078000, 0x3}, ++ {0x459c, 0x01fe0000, 0x1}, ++}; ++ ++static const struct rtw89_reg3_def rtw8852b_btc_preagc_en_defs[] = { ++ {0x46D0, GENMASK(1, 0), 0x3}, ++ {0x4790, GENMASK(1, 0), 0x3}, ++ {0x4AD4, GENMASK(31, 0), 0xf}, ++ {0x4AE0, GENMASK(31, 0), 0xf}, ++ {0x4688, GENMASK(31, 24), 0x80}, ++ {0x476C, GENMASK(31, 24), 0x80}, ++ {0x4694, GENMASK(7, 0), 0x80}, ++ {0x4694, GENMASK(15, 8), 0x80}, ++ {0x4778, GENMASK(7, 0), 0x80}, ++ {0x4778, GENMASK(15, 8), 0x80}, ++ {0x4AE4, GENMASK(23, 0), 0x780D1E}, ++ {0x4AEC, GENMASK(23, 0), 0x780D1E}, ++ {0x469C, GENMASK(31, 26), 0x34}, ++ {0x49F0, GENMASK(31, 26), 0x34}, ++}; ++ ++static DECLARE_PHY_REG3_TBL(rtw8852b_btc_preagc_en_defs); ++ ++static const struct rtw89_reg3_def rtw8852b_btc_preagc_dis_defs[] = { ++ {0x46D0, GENMASK(1, 0), 0x0}, ++ {0x4790, GENMASK(1, 0), 0x0}, ++ {0x4AD4, GENMASK(31, 0), 0x60}, ++ {0x4AE0, GENMASK(31, 0), 0x60}, ++ {0x4688, GENMASK(31, 24), 0x1a}, ++ {0x476C, GENMASK(31, 24), 0x1a}, ++ {0x4694, GENMASK(7, 0), 0x2a}, ++ {0x4694, GENMASK(15, 8), 0x2a}, ++ {0x4778, GENMASK(7, 0), 0x2a}, ++ {0x4778, GENMASK(15, 8), 0x2a}, ++ {0x4AE4, GENMASK(23, 0), 0x79E99E}, ++ {0x4AEC, GENMASK(23, 0), 0x79E99E}, ++ {0x469C, GENMASK(31, 26), 0x26}, ++ {0x49F0, GENMASK(31, 26), 0x26}, ++}; ++ ++static DECLARE_PHY_REG3_TBL(rtw8852b_btc_preagc_dis_defs); ++ ++static const u32 rtw8852b_h2c_regs[RTW89_H2CREG_MAX] = { ++ R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1, R_AX_H2CREG_DATA2, ++ R_AX_H2CREG_DATA3 ++}; ++ ++static const u32 rtw8852b_c2h_regs[RTW89_C2HREG_MAX] = { ++ R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1, R_AX_C2HREG_DATA2, ++ R_AX_C2HREG_DATA3 ++}; ++ ++static const struct rtw89_page_regs rtw8852b_page_regs = { ++ .hci_fc_ctrl = R_AX_HCI_FC_CTRL, ++ .ch_page_ctrl = R_AX_CH_PAGE_CTRL, ++ .ach_page_ctrl = R_AX_ACH0_PAGE_CTRL, ++ .ach_page_info = R_AX_ACH0_PAGE_INFO, ++ .pub_page_info3 = R_AX_PUB_PAGE_INFO3, ++ .pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1, ++ .pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2, ++ .pub_page_info1 = R_AX_PUB_PAGE_INFO1, ++ .pub_page_info2 = R_AX_PUB_PAGE_INFO2, ++ .wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1, ++ .wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2, ++ .wp_page_info1 = R_AX_WP_PAGE_INFO1, ++}; ++ ++static const struct rtw89_reg_def rtw8852b_dcfo_comp = { ++ R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK ++}; ++ ++static const struct rtw89_imr_info rtw8852b_imr_info = { ++ .wdrls_imr_set = B_AX_WDRLS_IMR_SET, ++ .wsec_imr_reg = R_AX_SEC_DEBUG, ++ .wsec_imr_set = B_AX_IMR_ERROR, ++ .mpdu_tx_imr_set = 0, ++ .mpdu_rx_imr_set = 0, ++ .sta_sch_imr_set = B_AX_STA_SCHEDULER_IMR_SET, ++ .txpktctl_imr_b0_reg = R_AX_TXPKTCTL_ERR_IMR_ISR, ++ .txpktctl_imr_b0_clr = B_AX_TXPKTCTL_IMR_B0_CLR, ++ .txpktctl_imr_b0_set = B_AX_TXPKTCTL_IMR_B0_SET, ++ .txpktctl_imr_b1_reg = R_AX_TXPKTCTL_ERR_IMR_ISR_B1, ++ .txpktctl_imr_b1_clr = B_AX_TXPKTCTL_IMR_B1_CLR, ++ .txpktctl_imr_b1_set = B_AX_TXPKTCTL_IMR_B1_SET, ++ .wde_imr_clr = B_AX_WDE_IMR_CLR, ++ .wde_imr_set = B_AX_WDE_IMR_SET, ++ .ple_imr_clr = B_AX_PLE_IMR_CLR, ++ .ple_imr_set = B_AX_PLE_IMR_SET, ++ .host_disp_imr_clr = B_AX_HOST_DISP_IMR_CLR, ++ .host_disp_imr_set = B_AX_HOST_DISP_IMR_SET, ++ .cpu_disp_imr_clr = B_AX_CPU_DISP_IMR_CLR, ++ .cpu_disp_imr_set = B_AX_CPU_DISP_IMR_SET, ++ .other_disp_imr_clr = B_AX_OTHER_DISP_IMR_CLR, ++ .other_disp_imr_set = 0, ++ .bbrpt_com_err_imr_reg = R_AX_BBRPT_COM_ERR_IMR_ISR, ++ .bbrpt_chinfo_err_imr_reg = R_AX_BBRPT_CHINFO_ERR_IMR_ISR, ++ .bbrpt_err_imr_set = 0, ++ .bbrpt_dfs_err_imr_reg = R_AX_BBRPT_DFS_ERR_IMR_ISR, ++ .ptcl_imr_clr = B_AX_PTCL_IMR_CLR_ALL, ++ .ptcl_imr_set = B_AX_PTCL_IMR_SET, ++ .cdma_imr_0_reg = R_AX_DLE_CTRL, ++ .cdma_imr_0_clr = B_AX_DLE_IMR_CLR, ++ .cdma_imr_0_set = B_AX_DLE_IMR_SET, ++ .cdma_imr_1_reg = 0, ++ .cdma_imr_1_clr = 0, ++ .cdma_imr_1_set = 0, ++ .phy_intf_imr_reg = R_AX_PHYINFO_ERR_IMR, ++ .phy_intf_imr_clr = 0, ++ .phy_intf_imr_set = 0, ++ .rmac_imr_reg = R_AX_RMAC_ERR_ISR, ++ .rmac_imr_clr = B_AX_RMAC_IMR_CLR, ++ .rmac_imr_set = B_AX_RMAC_IMR_SET, ++ .tmac_imr_reg = R_AX_TMAC_ERR_IMR_ISR, ++ .tmac_imr_clr = B_AX_TMAC_IMR_CLR, ++ .tmac_imr_set = B_AX_TMAC_IMR_SET, ++}; ++ ++static const struct rtw89_rrsr_cfgs rtw8852b_rrsr_cfgs = { ++ .ref_rate = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_REF_RATE_SEL, 0}, ++ .rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2}, ++}; ++ ++static const struct rtw89_dig_regs rtw8852b_dig_regs = { ++ .seg0_pd_reg = R_SEG0R_PD_V1, ++ .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK, ++ .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1, ++ .p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK}, ++ .p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK}, ++ .p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1}, ++ .p1_tia_init = {R_PATH1_TIA_INIT_V1, B_PATH1_TIA_INIT_IDX_MSK_V1}, ++ .p0_rxb_init = {R_PATH0_RXB_INIT_V1, B_PATH0_RXB_INIT_IDX_MSK_V1}, ++ .p1_rxb_init = {R_PATH1_RXB_INIT_V1, B_PATH1_RXB_INIT_IDX_MSK_V1}, ++ .p0_p20_pagcugc_en = {R_PATH0_P20_FOLLOW_BY_PAGCUGC_V2, ++ B_PATH0_P20_FOLLOW_BY_PAGCUGC_EN_MSK}, ++ .p0_s20_pagcugc_en = {R_PATH0_S20_FOLLOW_BY_PAGCUGC_V2, ++ B_PATH0_S20_FOLLOW_BY_PAGCUGC_EN_MSK}, ++ .p1_p20_pagcugc_en = {R_PATH1_P20_FOLLOW_BY_PAGCUGC_V2, ++ B_PATH1_P20_FOLLOW_BY_PAGCUGC_EN_MSK}, ++ .p1_s20_pagcugc_en = {R_PATH1_S20_FOLLOW_BY_PAGCUGC_V2, ++ B_PATH1_S20_FOLLOW_BY_PAGCUGC_EN_MSK}, ++}; ++ ++static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_ul[] = { ++ {255, 0, 0, 7}, /* 0 -> original */ ++ {255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */ ++ {255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* 3- >reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* the below id is for non-shared-antenna free-run */ ++ {6, 1, 0, 7}, ++ {13, 1, 0, 7}, ++ {13, 1, 0, 7} ++}; ++ ++static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_dl[] = { ++ {255, 0, 0, 7}, /* 0 -> original */ ++ {255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* 3- >reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */ ++ {255, 0, 0, 7}, /* the below id is for non-shared-antenna free-run */ ++ {255, 1, 0, 7}, ++ {255, 1, 0, 7}, ++ {255, 1, 0, 7} ++}; ++ ++static const struct rtw89_btc_fbtc_mreg rtw89_btc_8852b_mon_reg[] = { ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda24), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda28), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda2c), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda30), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda4c), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda10), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda20), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda34), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xcef4), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0x8424), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd200), ++ RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd220), ++ RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x980), ++ RTW89_DEF_FBTC_MREG(REG_BT_MODEM, 4, 0x178), ++}; ++ ++static const u8 rtw89_btc_8852b_wl_rssi_thres[BTC_WL_RSSI_THMAX] = {70, 60, 50, 40}; ++static const u8 rtw89_btc_8852b_bt_rssi_thres[BTC_BT_RSSI_THMAX] = {50, 40, 30, 20}; ++ ++static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev) ++{ ++ u32 val32; ++ u32 ret; ++ ++ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN | ++ B_AX_AFSM_PCIE_SUS_EN); ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_DIS_WLBT_PDNSUSEN_SOPC); ++ rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_DIS_WLBT_LPSEN_LOPC); ++ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APDM_HPDN); ++ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS); ++ ++ ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_RDY_SYSPWR, ++ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_set(rtwdev, R_AX_AFE_LDO_CTRL, B_AX_AON_OFF_PC_EN); ++ ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_AON_OFF_PC_EN, ++ 1000, 20000, false, rtwdev, R_AX_AFE_LDO_CTRL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_OFF_CTRL0, B_AX_C1_L1_MASK, 0x1); ++ rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_OFF_CTRL0, B_AX_C3_L1_MASK, 0x3); ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON); ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC); ++ ++ ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFN_ONMAC), ++ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL); ++ if (ret) ++ return ret; ++ ++ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); ++ rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); ++ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); ++ rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); ++ ++ rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); ++ rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1); ++ ++ rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3); ++ ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, ++ XTAL_SI_GND_SHDN_WL, XTAL_SI_GND_SHDN_WL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3); ++ ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, ++ XTAL_SI_SHDN_WL, XTAL_SI_SHDN_WL); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI, ++ XTAL_SI_OFF_WEI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_EI, ++ XTAL_SI_OFF_EI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_RFC2RF); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_WEI, ++ XTAL_SI_PON_WEI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_EI, ++ XTAL_SI_PON_EI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SRAM2RFC); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_SRAM_CTRL, 0, XTAL_SI_SRAM_DIS); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_2, 0, XTAL_SI_LDO_LPS); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_4, 0, XTAL_SI_LPS_CAP); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); ++ rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_ISO_EB2CORE); ++ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B15); ++ ++ fsleep(1000); ++ ++ rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14); ++ rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); ++ ++ if (!rtwdev->efuse.valid || rtwdev->efuse.power_k_valid) ++ goto func_en; ++ ++ rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9); ++ rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA); ++ ++ if (rtwdev->hal.cv == CHIP_CBV) { ++ rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); ++ rtw89_write16_mask(rtwdev, R_AX_HCI_LDO_CTRL, B_AX_R_AX_VADJ_MASK, 0xA); ++ rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); ++ } ++ ++func_en: ++ rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN, ++ B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN | ++ B_AX_WD_RLS_EN | B_AX_DLE_WDE_EN | B_AX_TXPKT_CTRL_EN | ++ B_AX_STA_SCH_EN | B_AX_DLE_PLE_EN | B_AX_PKT_BUF_EN | ++ B_AX_DMAC_TBL_EN | B_AX_PKT_IN_EN | B_AX_DLE_CPUIO_EN | ++ B_AX_DISPATCHER_EN | B_AX_BBRPT_EN | B_AX_MAC_SEC_EN | ++ B_AX_DMACREG_GCKEN); ++ rtw89_write32_set(rtwdev, R_AX_CMAC_FUNC_EN, ++ B_AX_CMAC_EN | B_AX_CMAC_TXEN | B_AX_CMAC_RXEN | ++ B_AX_FORCE_CMACREG_GCKEN | B_AX_PHYINTF_EN | B_AX_CMAC_DMA_EN | ++ B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN | B_AX_TMAC_EN | ++ B_AX_RMAC_EN); ++ ++ rtw89_write32_mask(rtwdev, R_AX_EECS_EESK_FUNC_SEL, B_AX_PINMUX_EESK_FUNC_SEL_MASK, ++ PINMUX_EESK_FUNC_SEL_BT_LOG); ++ ++ return 0; ++} ++ ++static int rtw8852b_pwr_off_func(struct rtw89_dev *rtwdev) ++{ ++ u32 val32; ++ u32 ret; ++ ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF, ++ XTAL_SI_RFC2RF); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S1, 0, XTAL_SI_RF10); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC, ++ XTAL_SI_SRAM2RFC); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI); ++ if (ret) ++ return ret; ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON); ++ rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB); ++ rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3); ++ ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SHDN_WL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3); ++ ++ ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_GND_SHDN_WL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC); ++ ++ ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC), ++ 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL); ++ if (ret) ++ return ret; ++ ++ rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION); ++ rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ); ++ rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3); ++ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS); ++ ++ return 0; ++} ++ ++static void rtw8852be_efuse_parsing(struct rtw89_efuse *efuse, ++ struct rtw8852b_efuse *map) ++{ ++ ether_addr_copy(efuse->addr, map->e.mac_addr); ++ efuse->rfe_type = map->rfe_type; ++ efuse->xtal_cap = map->xtal_k; ++} ++ ++static void rtw8852b_efuse_parsing_tssi(struct rtw89_dev *rtwdev, ++ struct rtw8852b_efuse *map) ++{ ++ struct rtw89_tssi_info *tssi = &rtwdev->tssi; ++ struct rtw8852b_tssi_offset *ofst[] = {&map->path_a_tssi, &map->path_b_tssi}; ++ u8 i, j; ++ ++ tssi->thermal[RF_PATH_A] = map->path_a_therm; ++ tssi->thermal[RF_PATH_B] = map->path_b_therm; ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ memcpy(tssi->tssi_cck[i], ofst[i]->cck_tssi, ++ sizeof(ofst[i]->cck_tssi)); ++ ++ for (j = 0; j < TSSI_CCK_CH_GROUP_NUM; j++) ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][EFUSE] path=%d cck[%d]=0x%x\n", ++ i, j, tssi->tssi_cck[i][j]); ++ ++ memcpy(tssi->tssi_mcs[i], ofst[i]->bw40_tssi, ++ sizeof(ofst[i]->bw40_tssi)); ++ memcpy(tssi->tssi_mcs[i] + TSSI_MCS_2G_CH_GROUP_NUM, ++ ofst[i]->bw40_1s_tssi_5g, sizeof(ofst[i]->bw40_1s_tssi_5g)); ++ ++ for (j = 0; j < TSSI_MCS_CH_GROUP_NUM; j++) ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][EFUSE] path=%d mcs[%d]=0x%x\n", ++ i, j, tssi->tssi_mcs[i][j]); ++ } ++} ++ ++static bool _decode_efuse_gain(u8 data, s8 *high, s8 *low) ++{ ++ if (high) ++ *high = sign_extend32(FIELD_GET(GENMASK(7, 4), data), 3); ++ if (low) ++ *low = sign_extend32(FIELD_GET(GENMASK(3, 0), data), 3); ++ ++ return data != 0xff; ++} ++ ++static void rtw8852b_efuse_parsing_gain_offset(struct rtw89_dev *rtwdev, ++ struct rtw8852b_efuse *map) ++{ ++ struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain; ++ bool valid = false; ++ ++ valid |= _decode_efuse_gain(map->rx_gain_2g_cck, ++ &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_CCK], ++ &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_CCK]); ++ valid |= _decode_efuse_gain(map->rx_gain_2g_ofdm, ++ &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_OFDM], ++ &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_OFDM]); ++ valid |= _decode_efuse_gain(map->rx_gain_5g_low, ++ &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_LOW], ++ &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_LOW]); ++ valid |= _decode_efuse_gain(map->rx_gain_5g_mid, ++ &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_MID], ++ &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_MID]); ++ valid |= _decode_efuse_gain(map->rx_gain_5g_high, ++ &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_HIGH], ++ &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_HIGH]); ++ ++ gain->offset_valid = valid; ++} ++ ++static int rtw8852b_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map) ++{ ++ struct rtw89_efuse *efuse = &rtwdev->efuse; ++ struct rtw8852b_efuse *map; ++ ++ map = (struct rtw8852b_efuse *)log_map; ++ ++ efuse->country_code[0] = map->country_code[0]; ++ efuse->country_code[1] = map->country_code[1]; ++ rtw8852b_efuse_parsing_tssi(rtwdev, map); ++ rtw8852b_efuse_parsing_gain_offset(rtwdev, map); ++ ++ switch (rtwdev->hci.type) { ++ case RTW89_HCI_TYPE_PCIE: ++ rtw8852be_efuse_parsing(efuse, map); ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type); ++ ++ return 0; ++} ++ ++static void rtw8852b_phycap_parsing_power_cal(struct rtw89_dev *rtwdev, u8 *phycap_map) ++{ ++#define PWR_K_CHK_OFFSET 0x5E9 ++#define PWR_K_CHK_VALUE 0xAA ++ u32 offset = PWR_K_CHK_OFFSET - rtwdev->chip->phycap_addr; ++ ++ if (phycap_map[offset] == PWR_K_CHK_VALUE) ++ rtwdev->efuse.power_k_valid = true; ++} ++ ++static void rtw8852b_phycap_parsing_tssi(struct rtw89_dev *rtwdev, u8 *phycap_map) ++{ ++ struct rtw89_tssi_info *tssi = &rtwdev->tssi; ++ static const u32 tssi_trim_addr[RF_PATH_NUM_8852B] = {0x5D6, 0x5AB}; ++ u32 addr = rtwdev->chip->phycap_addr; ++ bool pg = false; ++ u32 ofst; ++ u8 i, j; ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++) { ++ /* addrs are in decreasing order */ ++ ofst = tssi_trim_addr[i] - addr - j; ++ tssi->tssi_trim[i][j] = phycap_map[ofst]; ++ ++ if (phycap_map[ofst] != 0xff) ++ pg = true; ++ } ++ } ++ ++ if (!pg) { ++ memset(tssi->tssi_trim, 0, sizeof(tssi->tssi_trim)); ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM] no PG, set all trim info to 0\n"); ++ } ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) ++ for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++) ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] path=%d idx=%d trim=0x%x addr=0x%x\n", ++ i, j, tssi->tssi_trim[i][j], ++ tssi_trim_addr[i] - j); ++} ++ ++static void rtw8852b_phycap_parsing_thermal_trim(struct rtw89_dev *rtwdev, ++ u8 *phycap_map) ++{ ++ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim; ++ static const u32 thm_trim_addr[RF_PATH_NUM_8852B] = {0x5DF, 0x5DC}; ++ u32 addr = rtwdev->chip->phycap_addr; ++ u8 i; ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ info->thermal_trim[i] = phycap_map[thm_trim_addr[i] - addr]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[THERMAL][TRIM] path=%d thermal_trim=0x%x\n", ++ i, info->thermal_trim[i]); ++ ++ if (info->thermal_trim[i] != 0xff) ++ info->pg_thermal_trim = true; ++ } ++} ++ ++static void rtw8852b_thermal_trim(struct rtw89_dev *rtwdev) ++{ ++#define __thm_setting(raw) \ ++({ \ ++ u8 __v = (raw); \ ++ ((__v & 0x1) << 3) | ((__v & 0x1f) >> 1); \ ++}) ++ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim; ++ u8 i, val; ++ ++ if (!info->pg_thermal_trim) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[THERMAL][TRIM] no PG, do nothing\n"); ++ ++ return; ++ } ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ val = __thm_setting(info->thermal_trim[i]); ++ rtw89_write_rf(rtwdev, i, RR_TM2, RR_TM2_OFF, val); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[THERMAL][TRIM] path=%d thermal_setting=0x%x\n", ++ i, val); ++ } ++#undef __thm_setting ++} ++ ++static void rtw8852b_phycap_parsing_pa_bias_trim(struct rtw89_dev *rtwdev, ++ u8 *phycap_map) ++{ ++ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim; ++ static const u32 pabias_trim_addr[RF_PATH_NUM_8852B] = {0x5DE, 0x5DB}; ++ u32 addr = rtwdev->chip->phycap_addr; ++ u8 i; ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ info->pa_bias_trim[i] = phycap_map[pabias_trim_addr[i] - addr]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[PA_BIAS][TRIM] path=%d pa_bias_trim=0x%x\n", ++ i, info->pa_bias_trim[i]); ++ ++ if (info->pa_bias_trim[i] != 0xff) ++ info->pg_pa_bias_trim = true; ++ } ++} ++ ++static void rtw8852b_pa_bias_trim(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_power_trim_info *info = &rtwdev->pwr_trim; ++ u8 pabias_2g, pabias_5g; ++ u8 i; ++ ++ if (!info->pg_pa_bias_trim) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[PA_BIAS][TRIM] no PG, do nothing\n"); ++ ++ return; ++ } ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ pabias_2g = FIELD_GET(GENMASK(3, 0), info->pa_bias_trim[i]); ++ pabias_5g = FIELD_GET(GENMASK(7, 4), info->pa_bias_trim[i]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[PA_BIAS][TRIM] path=%d 2G=0x%x 5G=0x%x\n", ++ i, pabias_2g, pabias_5g); ++ ++ rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXG, pabias_2g); ++ rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXA, pabias_5g); ++ } ++} ++ ++static void rtw8852b_phycap_parsing_gain_comp(struct rtw89_dev *rtwdev, u8 *phycap_map) ++{ ++ static const u32 comp_addrs[][RTW89_SUBBAND_2GHZ_5GHZ_NR] = { ++ {0x5BB, 0x5BA, 0, 0x5B9, 0x5B8}, ++ {0x590, 0x58F, 0, 0x58E, 0x58D}, ++ }; ++ struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain; ++ u32 phycap_addr = rtwdev->chip->phycap_addr; ++ bool valid = false; ++ int path, i; ++ u8 data; ++ ++ for (path = 0; path < 2; path++) ++ for (i = 0; i < RTW89_SUBBAND_2GHZ_5GHZ_NR; i++) { ++ if (comp_addrs[path][i] == 0) ++ continue; ++ ++ data = phycap_map[comp_addrs[path][i] - phycap_addr]; ++ valid |= _decode_efuse_gain(data, NULL, ++ &gain->comp[path][i]); ++ } ++ ++ gain->comp_valid = valid; ++} ++ ++static int rtw8852b_read_phycap(struct rtw89_dev *rtwdev, u8 *phycap_map) ++{ ++ rtw8852b_phycap_parsing_power_cal(rtwdev, phycap_map); ++ rtw8852b_phycap_parsing_tssi(rtwdev, phycap_map); ++ rtw8852b_phycap_parsing_thermal_trim(rtwdev, phycap_map); ++ rtw8852b_phycap_parsing_pa_bias_trim(rtwdev, phycap_map); ++ rtw8852b_phycap_parsing_gain_comp(rtwdev, phycap_map); ++ ++ return 0; ++} ++ ++static void rtw8852b_power_trim(struct rtw89_dev *rtwdev) ++{ ++ rtw8852b_thermal_trim(rtwdev); ++ rtw8852b_pa_bias_trim(rtwdev); ++} ++ ++static void rtw8852b_set_channel_mac(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ u8 mac_idx) ++{ ++ u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx); ++ u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx); ++ u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx); ++ u8 txsc20 = 0, txsc40 = 0; ++ ++ switch (chan->band_width) { ++ case RTW89_CHANNEL_WIDTH_80: ++ txsc40 = rtw89_phy_get_txsc(rtwdev, chan, RTW89_CHANNEL_WIDTH_40); ++ fallthrough; ++ case RTW89_CHANNEL_WIDTH_40: ++ txsc20 = rtw89_phy_get_txsc(rtwdev, chan, RTW89_CHANNEL_WIDTH_20); ++ break; ++ default: ++ break; ++ } ++ ++ switch (chan->band_width) { ++ case RTW89_CHANNEL_WIDTH_80: ++ rtw89_write8_mask(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK, BIT(1)); ++ rtw89_write32(rtwdev, sub_carr, txsc20 | (txsc40 << 4)); ++ break; ++ case RTW89_CHANNEL_WIDTH_40: ++ rtw89_write8_mask(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK, BIT(0)); ++ rtw89_write32(rtwdev, sub_carr, txsc20); ++ break; ++ case RTW89_CHANNEL_WIDTH_20: ++ rtw89_write8_clr(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK); ++ rtw89_write32(rtwdev, sub_carr, 0); ++ break; ++ default: ++ break; ++ } ++ ++ if (chan->channel > 14) { ++ rtw89_write8_clr(rtwdev, chk_rate, B_AX_BAND_MODE); ++ rtw89_write8_set(rtwdev, chk_rate, ++ B_AX_CHECK_CCK_EN | B_AX_RTS_LIMIT_IN_OFDM6); ++ } else { ++ rtw89_write8_set(rtwdev, chk_rate, B_AX_BAND_MODE); ++ rtw89_write8_clr(rtwdev, chk_rate, ++ B_AX_CHECK_CCK_EN | B_AX_RTS_LIMIT_IN_OFDM6); ++ } ++} ++ ++static const u32 rtw8852b_sco_barker_threshold[14] = { ++ 0x1cfea, 0x1d0e1, 0x1d1d7, 0x1d2cd, 0x1d3c3, 0x1d4b9, 0x1d5b0, 0x1d6a6, ++ 0x1d79c, 0x1d892, 0x1d988, 0x1da7f, 0x1db75, 0x1ddc4 ++}; ++ ++static const u32 rtw8852b_sco_cck_threshold[14] = { ++ 0x27de3, 0x27f35, 0x28088, 0x281da, 0x2832d, 0x2847f, 0x285d2, 0x28724, ++ 0x28877, 0x289c9, 0x28b1c, 0x28c6e, 0x28dc1, 0x290ed ++}; ++ ++static void rtw8852b_ctrl_sco_cck(struct rtw89_dev *rtwdev, u8 primary_ch) ++{ ++ u8 ch_element = primary_ch - 1; ++ ++ rtw89_phy_write32_mask(rtwdev, R_RXSCOBC, B_RXSCOBC_TH, ++ rtw8852b_sco_barker_threshold[ch_element]); ++ rtw89_phy_write32_mask(rtwdev, R_RXSCOCCK, B_RXSCOCCK_TH, ++ rtw8852b_sco_cck_threshold[ch_element]); ++} ++ ++static u8 rtw8852b_sco_mapping(u8 central_ch) ++{ ++ if (central_ch == 1) ++ return 109; ++ else if (central_ch >= 2 && central_ch <= 6) ++ return 108; ++ else if (central_ch >= 7 && central_ch <= 10) ++ return 107; ++ else if (central_ch >= 11 && central_ch <= 14) ++ return 106; ++ else if (central_ch == 36 || central_ch == 38) ++ return 51; ++ else if (central_ch >= 40 && central_ch <= 58) ++ return 50; ++ else if (central_ch >= 60 && central_ch <= 64) ++ return 49; ++ else if (central_ch == 100 || central_ch == 102) ++ return 48; ++ else if (central_ch >= 104 && central_ch <= 126) ++ return 47; ++ else if (central_ch >= 128 && central_ch <= 151) ++ return 46; ++ else if (central_ch >= 153 && central_ch <= 177) ++ return 45; ++ else ++ return 0; ++} ++ ++struct rtw8852b_bb_gain { ++ u32 gain_g[BB_PATH_NUM_8852B]; ++ u32 gain_a[BB_PATH_NUM_8852B]; ++ u32 gain_mask; ++}; ++ ++static const struct rtw8852b_bb_gain bb_gain_lna[LNA_GAIN_NUM] = { ++ { .gain_g = {0x4678, 0x475C}, .gain_a = {0x45DC, 0x4740}, ++ .gain_mask = 0x00ff0000 }, ++ { .gain_g = {0x4678, 0x475C}, .gain_a = {0x45DC, 0x4740}, ++ .gain_mask = 0xff000000 }, ++ { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744}, ++ .gain_mask = 0x000000ff }, ++ { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744}, ++ .gain_mask = 0x0000ff00 }, ++ { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744}, ++ .gain_mask = 0x00ff0000 }, ++ { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744}, ++ .gain_mask = 0xff000000 }, ++ { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748}, ++ .gain_mask = 0x000000ff }, ++}; ++ ++static const struct rtw8852b_bb_gain bb_gain_tia[TIA_GAIN_NUM] = { ++ { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748}, ++ .gain_mask = 0x00ff0000 }, ++ { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748}, ++ .gain_mask = 0xff000000 }, ++}; ++ ++static void rtw8852b_set_gain_error(struct rtw89_dev *rtwdev, ++ enum rtw89_subband subband, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; ++ u8 gain_band = rtw89_subband_to_bb_gain_band(subband); ++ s32 val; ++ u32 reg; ++ u32 mask; ++ int i; ++ ++ for (i = 0; i < LNA_GAIN_NUM; i++) { ++ if (subband == RTW89_CH_2G) ++ reg = bb_gain_lna[i].gain_g[path]; ++ else ++ reg = bb_gain_lna[i].gain_a[path]; ++ ++ mask = bb_gain_lna[i].gain_mask; ++ val = gain->lna_gain[gain_band][path][i]; ++ rtw89_phy_write32_mask(rtwdev, reg, mask, val); ++ } ++ ++ for (i = 0; i < TIA_GAIN_NUM; i++) { ++ if (subband == RTW89_CH_2G) ++ reg = bb_gain_tia[i].gain_g[path]; ++ else ++ reg = bb_gain_tia[i].gain_a[path]; ++ ++ mask = bb_gain_tia[i].gain_mask; ++ val = gain->tia_gain[gain_band][path][i]; ++ rtw89_phy_write32_mask(rtwdev, reg, mask, val); ++ } ++} ++ ++static void rtw8852b_set_gain_offset(struct rtw89_dev *rtwdev, ++ enum rtw89_subband subband, ++ enum rtw89_phy_idx phy_idx) ++{ ++ static const u32 gain_err_addr[2] = {R_P0_AGC_RSVD, R_P1_AGC_RSVD}; ++ static const u32 rssi_ofst_addr[2] = {R_PATH0_G_TIA1_LNA6_OP1DB_V1, ++ R_PATH1_G_TIA1_LNA6_OP1DB_V1}; ++ struct rtw89_hal *hal = &rtwdev->hal; ++ struct rtw89_phy_efuse_gain *efuse_gain = &rtwdev->efuse_gain; ++ enum rtw89_gain_offset gain_ofdm_band; ++ s32 offset_a, offset_b; ++ s32 offset_ofdm, offset_cck; ++ s32 tmp; ++ u8 path; ++ ++ if (!efuse_gain->comp_valid) ++ goto next; ++ ++ for (path = RF_PATH_A; path < BB_PATH_NUM_8852B; path++) { ++ tmp = efuse_gain->comp[path][subband]; ++ tmp = clamp_t(s32, tmp << 2, S8_MIN, S8_MAX); ++ rtw89_phy_write32_mask(rtwdev, gain_err_addr[path], MASKBYTE0, tmp); ++ } ++ ++next: ++ if (!efuse_gain->offset_valid) ++ return; ++ ++ gain_ofdm_band = rtw89_subband_to_gain_offset_band_of_ofdm(subband); ++ ++ offset_a = -efuse_gain->offset[RF_PATH_A][gain_ofdm_band]; ++ offset_b = -efuse_gain->offset[RF_PATH_B][gain_ofdm_band]; ++ ++ tmp = -((offset_a << 2) + (efuse_gain->offset_base[RTW89_PHY_0] >> 2)); ++ tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX); ++ rtw89_phy_write32_mask(rtwdev, rssi_ofst_addr[RF_PATH_A], B_PATH0_R_G_OFST_MASK, tmp); ++ ++ tmp = -((offset_b << 2) + (efuse_gain->offset_base[RTW89_PHY_0] >> 2)); ++ tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX); ++ rtw89_phy_write32_mask(rtwdev, rssi_ofst_addr[RF_PATH_B], B_PATH0_R_G_OFST_MASK, tmp); ++ ++ if (hal->antenna_rx == RF_B) { ++ offset_ofdm = -efuse_gain->offset[RF_PATH_B][gain_ofdm_band]; ++ offset_cck = -efuse_gain->offset[RF_PATH_B][0]; ++ } else { ++ offset_ofdm = -efuse_gain->offset[RF_PATH_A][gain_ofdm_band]; ++ offset_cck = -efuse_gain->offset[RF_PATH_A][0]; ++ } ++ ++ tmp = (offset_ofdm << 4) + efuse_gain->offset_base[RTW89_PHY_0]; ++ tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX); ++ rtw89_phy_write32_idx(rtwdev, R_P0_RPL1, B_P0_RPL1_BIAS_MASK, tmp, phy_idx); ++ ++ tmp = (offset_ofdm << 4) + efuse_gain->rssi_base[RTW89_PHY_0]; ++ tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RPL1, B_P0_RPL1_BIAS_MASK, tmp, phy_idx); ++ ++ if (subband == RTW89_CH_2G) { ++ tmp = (offset_cck << 3) + (efuse_gain->offset_base[RTW89_PHY_0] >> 1); ++ tmp = clamp_t(s32, tmp, S8_MIN >> 1, S8_MAX >> 1); ++ rtw89_phy_write32_mask(rtwdev, R_RX_RPL_OFST, ++ B_RX_RPL_OFST_CCK_MASK, tmp); ++ } ++} ++ ++static ++void rtw8852b_set_rxsc_rpl_comp(struct rtw89_dev *rtwdev, enum rtw89_subband subband) ++{ ++ const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; ++ u8 band = rtw89_subband_to_bb_gain_band(subband); ++ u32 val; ++ ++ val = FIELD_PREP(B_P0_RPL1_20_MASK, (gain->rpl_ofst_20[band][RF_PATH_A] + ++ gain->rpl_ofst_20[band][RF_PATH_B]) / 2) | ++ FIELD_PREP(B_P0_RPL1_40_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][0] + ++ gain->rpl_ofst_40[band][RF_PATH_B][0]) / 2) | ++ FIELD_PREP(B_P0_RPL1_41_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][1] + ++ gain->rpl_ofst_40[band][RF_PATH_B][1]) / 2); ++ val >>= B_P0_RPL1_SHIFT; ++ rtw89_phy_write32_mask(rtwdev, R_P0_RPL1, B_P0_RPL1_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RPL1, B_P0_RPL1_MASK, val); ++ ++ val = FIELD_PREP(B_P0_RTL2_42_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][2] + ++ gain->rpl_ofst_40[band][RF_PATH_B][2]) / 2) | ++ FIELD_PREP(B_P0_RTL2_80_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][0] + ++ gain->rpl_ofst_80[band][RF_PATH_B][0]) / 2) | ++ FIELD_PREP(B_P0_RTL2_81_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][1] + ++ gain->rpl_ofst_80[band][RF_PATH_B][1]) / 2) | ++ FIELD_PREP(B_P0_RTL2_8A_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][10] + ++ gain->rpl_ofst_80[band][RF_PATH_B][10]) / 2); ++ rtw89_phy_write32(rtwdev, R_P0_RPL2, val); ++ rtw89_phy_write32(rtwdev, R_P1_RPL2, val); ++ ++ val = FIELD_PREP(B_P0_RTL3_82_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][2] + ++ gain->rpl_ofst_80[band][RF_PATH_B][2]) / 2) | ++ FIELD_PREP(B_P0_RTL3_83_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][3] + ++ gain->rpl_ofst_80[band][RF_PATH_B][3]) / 2) | ++ FIELD_PREP(B_P0_RTL3_84_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][4] + ++ gain->rpl_ofst_80[band][RF_PATH_B][4]) / 2) | ++ FIELD_PREP(B_P0_RTL3_89_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][9] + ++ gain->rpl_ofst_80[band][RF_PATH_B][9]) / 2); ++ rtw89_phy_write32(rtwdev, R_P0_RPL3, val); ++ rtw89_phy_write32(rtwdev, R_P1_RPL3, val); ++} ++ ++static void rtw8852b_ctrl_ch(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ u8 central_ch = chan->channel; ++ u8 subband = chan->subband_type; ++ u8 sco_comp; ++ bool is_2g = central_ch <= 14; ++ ++ /* Path A */ ++ if (is_2g) ++ rtw89_phy_write32_idx(rtwdev, R_PATH0_BAND_SEL_V1, ++ B_PATH0_BAND_SEL_MSK_V1, 1, phy_idx); ++ else ++ rtw89_phy_write32_idx(rtwdev, R_PATH0_BAND_SEL_V1, ++ B_PATH0_BAND_SEL_MSK_V1, 0, phy_idx); ++ ++ /* Path B */ ++ if (is_2g) ++ rtw89_phy_write32_idx(rtwdev, R_PATH1_BAND_SEL_V1, ++ B_PATH1_BAND_SEL_MSK_V1, 1, phy_idx); ++ else ++ rtw89_phy_write32_idx(rtwdev, R_PATH1_BAND_SEL_V1, ++ B_PATH1_BAND_SEL_MSK_V1, 0, phy_idx); ++ ++ /* SCO compensate FC setting */ ++ sco_comp = rtw8852b_sco_mapping(central_ch); ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_INV, sco_comp, phy_idx); ++ ++ if (chan->band_type == RTW89_BAND_6G) ++ return; ++ ++ /* CCK parameters */ ++ if (central_ch == 14) { ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR0, B_TXFIR_C01, 0x3b13ff); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR2, B_TXFIR_C23, 0x1c42de); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR4, B_TXFIR_C45, 0xfdb0ad); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR6, B_TXFIR_C67, 0xf60f6e); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR8, B_TXFIR_C89, 0xfd8f92); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRA, B_TXFIR_CAB, 0x2d011); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRC, B_TXFIR_CCD, 0x1c02c); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRE, B_TXFIR_CEF, 0xfff00a); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR0, B_TXFIR_C01, 0x3d23ff); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR2, B_TXFIR_C23, 0x29b354); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR4, B_TXFIR_C45, 0xfc1c8); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR6, B_TXFIR_C67, 0xfdb053); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIR8, B_TXFIR_C89, 0xf86f9a); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRA, B_TXFIR_CAB, 0xfaef92); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRC, B_TXFIR_CCD, 0xfe5fcc); ++ rtw89_phy_write32_mask(rtwdev, R_TXFIRE, B_TXFIR_CEF, 0xffdff5); ++ } ++ ++ rtw8852b_set_gain_error(rtwdev, subband, RF_PATH_A); ++ rtw8852b_set_gain_error(rtwdev, subband, RF_PATH_B); ++ rtw8852b_set_gain_offset(rtwdev, subband, phy_idx); ++ rtw8852b_set_rxsc_rpl_comp(rtwdev, subband); ++} ++ ++static void rtw8852b_bw_setting(struct rtw89_dev *rtwdev, u8 bw, u8 path) ++{ ++ static const u32 adc_sel[2] = {0xC0EC, 0xC1EC}; ++ static const u32 wbadc_sel[2] = {0xC0E4, 0xC1E4}; ++ ++ switch (bw) { ++ case RTW89_CHANNEL_WIDTH_5: ++ rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x1); ++ rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x0); ++ break; ++ case RTW89_CHANNEL_WIDTH_10: ++ rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x2); ++ rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x1); ++ break; ++ case RTW89_CHANNEL_WIDTH_20: ++ rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0); ++ rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2); ++ break; ++ case RTW89_CHANNEL_WIDTH_40: ++ rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0); ++ rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2); ++ break; ++ case RTW89_CHANNEL_WIDTH_80: ++ rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0); ++ rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2); ++ break; ++ default: ++ rtw89_warn(rtwdev, "Fail to set ADC\n"); ++ } ++} ++ ++static void rtw8852b_ctrl_bw(struct rtw89_dev *rtwdev, u8 pri_ch, u8 bw, ++ enum rtw89_phy_idx phy_idx) ++{ ++ u32 rx_path_0; ++ ++ switch (bw) { ++ case RTW89_CHANNEL_WIDTH_5: ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x1, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx); ++ ++ /*Set RF mode at 3 */ ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ break; ++ case RTW89_CHANNEL_WIDTH_10: ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x2, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx); ++ ++ /*Set RF mode at 3 */ ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ break; ++ case RTW89_CHANNEL_WIDTH_20: ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx); ++ ++ /*Set RF mode at 3 */ ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ break; ++ case RTW89_CHANNEL_WIDTH_40: ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x1, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, ++ pri_ch, phy_idx); ++ ++ /*Set RF mode at 3 */ ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx); ++ /*CCK primary channel */ ++ if (pri_ch == RTW89_SC_20_UPPER) ++ rtw89_phy_write32_mask(rtwdev, R_RXSC, B_RXSC_EN, 1); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_RXSC, B_RXSC_EN, 0); ++ ++ break; ++ case RTW89_CHANNEL_WIDTH_80: ++ rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x2, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, ++ pri_ch, phy_idx); ++ ++ /*Set RF mode at A */ ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0xaaa, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0xaaa, phy_idx); ++ break; ++ default: ++ rtw89_warn(rtwdev, "Fail to switch bw (bw:%d, pri ch:%d)\n", bw, ++ pri_ch); ++ } ++ ++ rtw8852b_bw_setting(rtwdev, bw, RF_PATH_A); ++ rtw8852b_bw_setting(rtwdev, bw, RF_PATH_B); ++ ++ rx_path_0 = rtw89_phy_read32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, ++ phy_idx); ++ if (rx_path_0 == 0x1) ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX, ++ B_P1_RFMODE_ORI_RX_ALL, 0x111, phy_idx); ++ else if (rx_path_0 == 0x2) ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX, ++ B_P0_RFMODE_ORI_RX_ALL, 0x111, phy_idx); ++} ++ ++static void rtw8852b_ctrl_cck_en(struct rtw89_dev *rtwdev, bool cck_en) ++{ ++ if (cck_en) { ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_ENABLE_CCK, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_ENABLE_CCK, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 1); ++ } ++} ++ ++static void rtw8852b_5m_mask(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ u8 pri_ch = chan->primary_channel; ++ bool mask_5m_low; ++ bool mask_5m_en; ++ ++ switch (chan->band_width) { ++ case RTW89_CHANNEL_WIDTH_40: ++ /* Prich=1: Mask 5M High, Prich=2: Mask 5M Low */ ++ mask_5m_en = true; ++ mask_5m_low = pri_ch == 2; ++ break; ++ case RTW89_CHANNEL_WIDTH_80: ++ /* Prich=3: Mask 5M High, Prich=4: Mask 5M Low, Else: Disable */ ++ mask_5m_en = pri_ch == 3 || pri_ch == 4; ++ mask_5m_low = pri_ch == 4; ++ break; ++ default: ++ mask_5m_en = false; ++ break; ++ } ++ ++ if (!mask_5m_en) { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x0); ++ rtw89_phy_write32_idx(rtwdev, R_ASSIGN_SBD_OPT_V1, ++ B_ASSIGN_SBD_OPT_EN_V1, 0x0, phy_idx); ++ return; ++ } ++ ++ if (mask_5m_low) { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_TH, 0x4); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB2, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB0, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_TH, 0x4); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB2, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB0, 0x1); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_TH, 0x4); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB2, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB0, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_TH, 0x4); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB2, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB0, 0x0); ++ } ++ rtw89_phy_write32_idx(rtwdev, R_ASSIGN_SBD_OPT_V1, ++ B_ASSIGN_SBD_OPT_EN_V1, 0x1, phy_idx); ++} ++ ++static void rtw8852b_bb_reset_all(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx); ++ fsleep(1); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx); ++} ++ ++static void rtw8852b_bb_reset_en(struct rtw89_dev *rtwdev, enum rtw89_band band, ++ enum rtw89_phy_idx phy_idx, bool en) ++{ ++ if (en) { ++ rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, ++ B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, ++ B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx); ++ if (band == RTW89_BAND_2G) ++ rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1); ++ rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, ++ B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx); ++ rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, ++ B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx); ++ fsleep(1); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx); ++ } ++} ++ ++static void rtw8852b_bb_reset(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw89_phy_write32_set(rtwdev, R_P0_TXPW_RSTB, B_P0_TXPW_RSTB_MANON); ++ rtw89_phy_write32_set(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN); ++ rtw89_phy_write32_set(rtwdev, R_P1_TXPW_RSTB, B_P1_TXPW_RSTB_MANON); ++ rtw89_phy_write32_set(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN); ++ rtw8852b_bb_reset_all(rtwdev, phy_idx); ++ rtw89_phy_write32_clr(rtwdev, R_P0_TXPW_RSTB, B_P0_TXPW_RSTB_MANON); ++ rtw89_phy_write32_clr(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN); ++ rtw89_phy_write32_clr(rtwdev, R_P1_TXPW_RSTB, B_P1_TXPW_RSTB_MANON); ++ rtw89_phy_write32_clr(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN); ++} ++ ++static void rtw8852b_bb_macid_ctrl_init(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx) ++{ ++ u32 addr; ++ ++ for (addr = R_AX_PWR_MACID_LMT_TABLE0; ++ addr <= R_AX_PWR_MACID_LMT_TABLE127; addr += 4) ++ rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, 0); ++} ++ ++static void rtw8852b_bb_sethw(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain; ++ ++ rtw89_phy_write32_clr(rtwdev, R_P0_EN_SOUND_WO_NDP, B_P0_EN_SOUND_WO_NDP); ++ rtw89_phy_write32_clr(rtwdev, R_P1_EN_SOUND_WO_NDP, B_P1_EN_SOUND_WO_NDP); ++ ++ rtw8852b_bb_macid_ctrl_init(rtwdev, RTW89_PHY_0); ++ ++ /* read these registers after loading BB parameters */ ++ gain->offset_base[RTW89_PHY_0] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_RPL1, B_P0_RPL1_BIAS_MASK); ++ gain->rssi_base[RTW89_PHY_0] = ++ rtw89_phy_read32_mask(rtwdev, R_P1_RPL1, B_P0_RPL1_BIAS_MASK); ++} ++ ++static void rtw8852b_bb_set_pop(struct rtw89_dev *rtwdev) ++{ ++ if (rtwdev->hw->conf.flags & IEEE80211_CONF_MONITOR) ++ rtw89_phy_write32_clr(rtwdev, R_PKT_CTRL, B_PKT_POP_EN); ++} ++ ++static void rtw8852b_set_channel_bb(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ bool cck_en = chan->channel <= 14; ++ u8 pri_ch_idx = chan->pri_ch_idx; ++ ++ if (cck_en) ++ rtw8852b_ctrl_sco_cck(rtwdev, chan->primary_channel); ++ ++ rtw8852b_ctrl_ch(rtwdev, chan, phy_idx); ++ rtw8852b_ctrl_bw(rtwdev, pri_ch_idx, chan->band_width, phy_idx); ++ rtw8852b_ctrl_cck_en(rtwdev, cck_en); ++ if (chan->band_type == RTW89_BAND_5G) { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1, ++ B_PATH0_BT_SHARE_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1, ++ B_PATH0_BTG_PATH_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1, ++ B_PATH1_BT_SHARE_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1, ++ B_PATH1_BTG_PATH_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1, ++ B_BT_DYN_DC_EST_EN_MSK, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x0); ++ } ++ rtw89_phy_write32_mask(rtwdev, R_MAC_PIN_SEL, B_CH_IDX_SEG0, ++ chan->primary_channel); ++ rtw8852b_5m_mask(rtwdev, chan, phy_idx); ++ rtw8852b_bb_set_pop(rtwdev); ++ rtw8852b_bb_reset_all(rtwdev, phy_idx); ++} ++ ++static void rtw8852b_set_channel(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_mac_idx mac_idx, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw8852b_set_channel_mac(rtwdev, chan, mac_idx); ++ rtw8852b_set_channel_bb(rtwdev, chan, phy_idx); ++ rtw8852b_set_channel_rf(rtwdev, chan, phy_idx); ++} ++ ++static void rtw8852b_tssi_cont_en(struct rtw89_dev *rtwdev, bool en, ++ enum rtw89_rf_path path) ++{ ++ static const u32 tssi_trk[2] = {R_P0_TSSI_TRK, R_P1_TSSI_TRK}; ++ static const u32 ctrl_bbrst[2] = {R_P0_TXPW_RSTB, R_P1_TXPW_RSTB}; ++ ++ if (en) { ++ rtw89_phy_write32_mask(rtwdev, ctrl_bbrst[path], B_P0_TXPW_RSTB_MANON, 0x0); ++ rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x0); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, ctrl_bbrst[path], B_P0_TXPW_RSTB_MANON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x1); ++ } ++} ++ ++static void rtw8852b_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, ++ u8 phy_idx) ++{ ++ if (!rtwdev->dbcc_en) { ++ rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_A); ++ rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_B); ++ } else { ++ if (phy_idx == RTW89_PHY_0) ++ rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_A); ++ else ++ rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_B); ++ } ++} ++ ++static void rtw8852b_adc_en(struct rtw89_dev *rtwdev, bool en) ++{ ++ if (en) ++ rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0xf); ++} ++ ++static void rtw8852b_set_channel_help(struct rtw89_dev *rtwdev, bool enter, ++ struct rtw89_channel_help_params *p, ++ const struct rtw89_chan *chan, ++ enum rtw89_mac_idx mac_idx, ++ enum rtw89_phy_idx phy_idx) ++{ ++ if (enter) { ++ rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL); ++ rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); ++ rtw8852b_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0); ++ rtw8852b_adc_en(rtwdev, false); ++ fsleep(40); ++ rtw8852b_bb_reset_en(rtwdev, chan->band_type, phy_idx, false); ++ } else { ++ rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true); ++ rtw8852b_adc_en(rtwdev, true); ++ rtw8852b_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0); ++ rtw8852b_bb_reset_en(rtwdev, chan->band_type, phy_idx, true); ++ rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en); ++ } ++} ++ ++static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev) ++{ ++ rtwdev->is_tssi_mode[RF_PATH_A] = false; ++ rtwdev->is_tssi_mode[RF_PATH_B] = false; ++ ++ rtw8852b_dpk_init(rtwdev); ++ rtw8852b_rck(rtwdev); ++ rtw8852b_dack(rtwdev); ++ rtw8852b_rx_dck(rtwdev, RTW89_PHY_0); ++} ++ ++static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev) ++{ ++ enum rtw89_phy_idx phy_idx = RTW89_PHY_0; ++ ++ rtw8852b_rx_dck(rtwdev, phy_idx); ++ rtw8852b_iqk(rtwdev, phy_idx); ++ rtw8852b_tssi(rtwdev, phy_idx, true); ++ rtw8852b_dpk(rtwdev, phy_idx); ++} ++ ++static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw8852b_tssi_scan(rtwdev, phy_idx); ++} ++ ++static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, bool start) ++{ ++ rtw8852b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0); ++} ++ ++static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev) ++{ ++ rtw8852b_dpk_track(rtwdev); ++} ++ ++static u32 rtw8852b_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx, s16 ref) ++{ ++ const u16 tssi_16dbm_cw = 0x12c; ++ const u8 base_cw_0db = 0x27; ++ const s8 ofst_int = 0; ++ s16 pwr_s10_3; ++ s16 rf_pwr_cw; ++ u16 bb_pwr_cw; ++ u32 pwr_cw; ++ u32 tssi_ofst_cw; ++ ++ pwr_s10_3 = (ref << 1) + (s16)(ofst_int) + (s16)(base_cw_0db << 3); ++ bb_pwr_cw = FIELD_GET(GENMASK(2, 0), pwr_s10_3); ++ rf_pwr_cw = FIELD_GET(GENMASK(8, 3), pwr_s10_3); ++ rf_pwr_cw = clamp_t(s16, rf_pwr_cw, 15, 63); ++ pwr_cw = (rf_pwr_cw << 3) | bb_pwr_cw; ++ ++ tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3)); ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, ++ "[TXPWR] tssi_ofst_cw=%d rf_cw=0x%x bb_cw=0x%x\n", ++ tssi_ofst_cw, rf_pwr_cw, bb_pwr_cw); ++ ++ return FIELD_PREP(B_DPD_TSSI_CW, tssi_ofst_cw) | ++ FIELD_PREP(B_DPD_PWR_CW, pwr_cw) | ++ FIELD_PREP(B_DPD_REF, ref); ++} ++ ++static void rtw8852b_set_txpwr_ref(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx) ++{ ++ static const u32 addr[RF_PATH_NUM_8852B] = {0x5800, 0x7800}; ++ const u32 mask = B_DPD_TSSI_CW | B_DPD_PWR_CW | B_DPD_REF; ++ const u8 ofst_ofdm = 0x4; ++ const u8 ofst_cck = 0x8; ++ const s16 ref_ofdm = 0; ++ const s16 ref_cck = 0; ++ u32 val; ++ u8 i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr reference\n"); ++ ++ rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_CTRL, ++ B_AX_PWR_REF, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n"); ++ val = rtw8852b_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm); ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) ++ rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val, ++ phy_idx); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb cck txpwr ref\n"); ++ val = rtw8852b_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck); ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) ++ rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val, ++ phy_idx); ++} ++ ++static void rtw8852b_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev, ++ u8 tx_shape_idx, ++ enum rtw89_phy_idx phy_idx) ++{ ++#define __DFIR_CFG_ADDR(i) (R_TXFIR0 + ((i) << 2)) ++#define __DFIR_CFG_MASK 0xffffffff ++#define __DFIR_CFG_NR 8 ++#define __DECL_DFIR_PARAM(_name, _val...) \ ++ static const u32 param_ ## _name[] = {_val}; \ ++ static_assert(ARRAY_SIZE(param_ ## _name) == __DFIR_CFG_NR) ++ ++ __DECL_DFIR_PARAM(flat, ++ 0x023D23FF, 0x0029B354, 0x000FC1C8, 0x00FDB053, ++ 0x00F86F9A, 0x06FAEF92, 0x00FE5FCC, 0x00FFDFF5); ++ __DECL_DFIR_PARAM(sharp, ++ 0x023D83FF, 0x002C636A, 0x0013F204, 0x00008090, ++ 0x00F87FB0, 0x06F99F83, 0x00FDBFBA, 0x00003FF5); ++ __DECL_DFIR_PARAM(sharp_14, ++ 0x023B13FF, 0x001C42DE, 0x00FDB0AD, 0x00F60F6E, ++ 0x00FD8F92, 0x0602D011, 0x0001C02C, 0x00FFF00A); ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 ch = chan->channel; ++ const u32 *param; ++ u32 addr; ++ int i; ++ ++ if (ch > 14) { ++ rtw89_warn(rtwdev, ++ "set tx shape dfir by unknown ch: %d on 2G\n", ch); ++ return; ++ } ++ ++ if (ch == 14) ++ param = param_sharp_14; ++ else ++ param = tx_shape_idx == 0 ? param_flat : param_sharp; ++ ++ for (i = 0; i < __DFIR_CFG_NR; i++) { ++ addr = __DFIR_CFG_ADDR(i); ++ rtw89_debug(rtwdev, RTW89_DBG_TXPWR, ++ "set tx shape dfir: 0x%x: 0x%x\n", addr, param[i]); ++ rtw89_phy_write32_idx(rtwdev, addr, __DFIR_CFG_MASK, param[i], ++ phy_idx); ++ } ++ ++#undef __DECL_DFIR_PARAM ++#undef __DFIR_CFG_NR ++#undef __DFIR_CFG_MASK ++#undef __DECL_CFG_ADDR ++} ++ ++static void rtw8852b_set_tx_shape(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ u8 band = chan->band_type; ++ u8 regd = rtw89_regd_get(rtwdev, band); ++ u8 tx_shape_cck = rtw89_8852b_tx_shape[band][RTW89_RS_CCK][regd]; ++ u8 tx_shape_ofdm = rtw89_8852b_tx_shape[band][RTW89_RS_OFDM][regd]; ++ ++ if (band == RTW89_BAND_2G) ++ rtw8852b_bb_set_tx_shape_dfir(rtwdev, tx_shape_cck, phy_idx); ++ ++ rtw89_phy_write32_mask(rtwdev, R_DCFO_OPT, B_TXSHAPE_TRIANGULAR_CFG, ++ tx_shape_ofdm); ++} ++ ++static void rtw8852b_set_txpwr(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx); ++ rtw8852b_set_tx_shape(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx); ++} ++ ++static void rtw8852b_set_txpwr_ctrl(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw8852b_set_txpwr_ref(rtwdev, phy_idx); ++} ++ ++static ++void rtw8852b_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev, ++ s8 pw_ofst, enum rtw89_mac_idx mac_idx) ++{ ++ u32 reg; ++ ++ if (pw_ofst < -16 || pw_ofst > 15) { ++ rtw89_warn(rtwdev, "[ULTB] Err pwr_offset=%d\n", pw_ofst); ++ return; ++ } ++ ++ reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx); ++ rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN); ++ ++ reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); ++ rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst); ++ ++ pw_ofst = max_t(s8, pw_ofst - 3, -16); ++ reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); ++ rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst); ++} ++ ++static int ++rtw8852b_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ int ret; ++ ++ ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_UL_CTRL2, 0x07763333); ++ if (ret) ++ return ret; ++ ++ ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_COEXT_CTRL, 0x01ebf000); ++ if (ret) ++ return ret; ++ ++ ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_UL_CTRL0, 0x0002f8ff); ++ if (ret) ++ return ret; ++ ++ rtw8852b_set_txpwr_ul_tb_offset(rtwdev, 0, phy_idx == RTW89_PHY_1 ? ++ RTW89_MAC_1 : RTW89_MAC_0); ++ ++ return 0; ++} ++ ++void rtw8852b_bb_set_plcp_tx(struct rtw89_dev *rtwdev) ++{ ++ const struct rtw89_reg3_def *def = rtw8852b_pmac_ht20_mcs7_tbl; ++ u8 i; ++ ++ for (i = 0; i < ARRAY_SIZE(rtw8852b_pmac_ht20_mcs7_tbl); i++, def++) ++ rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); ++} ++ ++static void rtw8852b_stop_pmac_tx(struct rtw89_dev *rtwdev, ++ struct rtw8852b_bb_pmac_info *tx_info, ++ enum rtw89_phy_idx idx) ++{ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC Stop Tx"); ++ if (tx_info->mode == CONT_TX) ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_CTX_EN, 0, idx); ++ else if (tx_info->mode == PKTS_TX) ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_PTX_EN, 0, idx); ++} ++ ++static void rtw8852b_start_pmac_tx(struct rtw89_dev *rtwdev, ++ struct rtw8852b_bb_pmac_info *tx_info, ++ enum rtw89_phy_idx idx) ++{ ++ enum rtw8852b_pmac_mode mode = tx_info->mode; ++ u32 pkt_cnt = tx_info->tx_cnt; ++ u16 period = tx_info->period; ++ ++ if (mode == CONT_TX && !tx_info->is_cck) { ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_CTX_EN, 1, idx); ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CTx Start"); ++ } else if (mode == PKTS_TX) { ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_PTX_EN, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, ++ B_PMAC_TX_PRD_MSK, period, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CNT, B_PMAC_TX_CNT_MSK, ++ pkt_cnt, idx); ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC PTx Start"); ++ } ++ ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CTRL, B_PMAC_TXEN_DIS, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CTRL, B_PMAC_TXEN_DIS, 0, idx); ++} ++ ++void rtw8852b_bb_set_pmac_tx(struct rtw89_dev *rtwdev, ++ struct rtw8852b_bb_pmac_info *tx_info, ++ enum rtw89_phy_idx idx) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ ++ if (!tx_info->en_pmac_tx) { ++ rtw8852b_stop_pmac_tx(rtwdev, tx_info, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0, idx); ++ if (chan->band_type == RTW89_BAND_2G) ++ rtw89_phy_write32_clr(rtwdev, R_RXCCA, B_RXCCA_DIS); ++ return; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC Tx Enable"); ++ ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_TXEN, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_RXEN, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_RX_CFG1, B_PMAC_OPT1_MSK, 0x3f, idx); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 1, idx); ++ rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS); ++ rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, idx); ++ ++ rtw8852b_start_pmac_tx(rtwdev, tx_info, idx); ++} ++ ++void rtw8852b_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable, ++ u16 tx_cnt, u16 period, u16 tx_time, ++ enum rtw89_phy_idx idx) ++{ ++ struct rtw8852b_bb_pmac_info tx_info = {0}; ++ ++ tx_info.en_pmac_tx = enable; ++ tx_info.is_cck = 0; ++ tx_info.mode = PKTS_TX; ++ tx_info.tx_cnt = tx_cnt; ++ tx_info.period = period; ++ tx_info.tx_time = tx_time; ++ ++ rtw8852b_bb_set_pmac_tx(rtwdev, &tx_info, idx); ++} ++ ++void rtw8852b_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm, ++ enum rtw89_phy_idx idx) ++{ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CFG Tx PWR = %d", pwr_dbm); ++ ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, pwr_dbm, idx); ++} ++ ++void rtw8852b_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path) ++{ ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 7, RTW89_PHY_0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CFG Tx Path = %d", tx_path); ++ ++ if (tx_path == RF_PATH_A) { ++ rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 1); ++ rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0); ++ } else if (tx_path == RF_PATH_B) { ++ rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 2); ++ rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0); ++ } else if (tx_path == RF_PATH_AB) { ++ rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 3); ++ rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 4); ++ } else { ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "Error Tx Path"); ++ } ++} ++ ++void rtw8852b_bb_tx_mode_switch(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx idx, u8 mode) ++{ ++ if (mode != 0) ++ return; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "Tx mode switch"); ++ ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_TXEN, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_RXEN, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_RX_CFG1, B_PMAC_OPT1_MSK, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_PMAC_RXMOD, B_PMAC_RXMOD_MSK, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_DPD_EN, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 0, idx); ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 0, idx); ++} ++ ++void rtw8852b_bb_backup_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx, ++ struct rtw8852b_bb_tssi_bak *bak) ++{ ++ s32 tmp; ++ ++ bak->tx_path = rtw89_phy_read32_idx(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, idx); ++ bak->rx_path = rtw89_phy_read32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, idx); ++ bak->p0_rfmode = rtw89_phy_read32_idx(rtwdev, R_P0_RFMODE, MASKDWORD, idx); ++ bak->p0_rfmode_ftm = rtw89_phy_read32_idx(rtwdev, R_P0_RFMODE_FTM_RX, MASKDWORD, idx); ++ bak->p1_rfmode = rtw89_phy_read32_idx(rtwdev, R_P1_RFMODE, MASKDWORD, idx); ++ bak->p1_rfmode_ftm = rtw89_phy_read32_idx(rtwdev, R_P1_RFMODE_FTM_RX, MASKDWORD, idx); ++ tmp = rtw89_phy_read32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, idx); ++ bak->tx_pwr = sign_extend32(tmp, 8); ++} ++ ++void rtw8852b_bb_restore_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx, ++ const struct rtw8852b_bb_tssi_bak *bak) ++{ ++ rtw89_phy_write32_idx(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, bak->tx_path, idx); ++ if (bak->tx_path == RF_AB) ++ rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0x4); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0x0); ++ rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, bak->rx_path, idx); ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 1, idx); ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE, MASKDWORD, bak->p0_rfmode, idx); ++ rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_FTM_RX, MASKDWORD, bak->p0_rfmode_ftm, idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE, MASKDWORD, bak->p1_rfmode, idx); ++ rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_FTM_RX, MASKDWORD, bak->p1_rfmode_ftm, idx); ++ rtw89_phy_write32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, bak->tx_pwr, idx); ++} ++ ++static void rtw8852b_bb_ctrl_btc_preagc(struct rtw89_dev *rtwdev, bool bt_en) ++{ ++ rtw89_phy_write_reg3_tbl(rtwdev, bt_en ? &rtw8852b_btc_preagc_en_defs_tbl : ++ &rtw8852b_btc_preagc_dis_defs_tbl); ++} ++ ++static void rtw8852b_ctrl_btg(struct rtw89_dev *rtwdev, bool btg) ++{ ++ if (btg) { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1, ++ B_PATH0_BT_SHARE_V1, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1, ++ B_PATH0_BTG_PATH_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_G_LNA6_OP1DB_V1, ++ B_PATH1_G_LNA6_OP1DB_V1, 0x20); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_G_TIA0_LNA6_OP1DB_V1, ++ B_PATH1_G_TIA0_LNA6_OP1DB_V1, 0x30); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1, ++ B_PATH1_BT_SHARE_V1, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1, ++ B_PATH1_BTG_PATH_V1, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PMAC_GNT, B_PMAC_GNT_P1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x2); ++ rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1, ++ B_BT_DYN_DC_EST_EN_MSK, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x1); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1, ++ B_PATH0_BT_SHARE_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1, ++ B_PATH0_BTG_PATH_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_G_LNA6_OP1DB_V1, ++ B_PATH1_G_LNA6_OP1DB_V1, 0x1a); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_G_TIA0_LNA6_OP1DB_V1, ++ B_PATH1_G_TIA0_LNA6_OP1DB_V1, 0x2a); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1, ++ B_PATH1_BT_SHARE_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1, ++ B_PATH1_BTG_PATH_V1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PMAC_GNT, B_PMAC_GNT_P1, 0xc); ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1, ++ B_BT_DYN_DC_EST_EN_MSK, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x0); ++ } ++} ++ ++void rtw8852b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path_bit rx_path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u32 rst_mask0; ++ u32 rst_mask1; ++ ++ if (rx_path == RF_A) { ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 1); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 1); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0); ++ } else if (rx_path == RF_B) { ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 2); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 2); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 2); ++ rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0); ++ } else if (rx_path == RF_AB) { ++ rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 3); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 3); ++ rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 3); ++ rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 1); ++ } ++ ++ rtw8852b_set_gain_offset(rtwdev, chan->subband_type, RTW89_PHY_0); ++ ++ if (chan->band_type == RTW89_BAND_2G && ++ (rx_path == RF_B || rx_path == RF_AB)) ++ rtw8852b_ctrl_btg(rtwdev, true); ++ else ++ rtw8852b_ctrl_btg(rtwdev, false); ++ ++ rst_mask0 = B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI; ++ rst_mask1 = B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI; ++ if (rx_path == RF_A) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB, rst_mask0, 1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB, rst_mask0, 3); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB, rst_mask1, 1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB, rst_mask1, 3); ++ } ++} ++ ++static void rtw8852b_bb_ctrl_rf_mode_rx_path(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path_bit rx_path) ++{ ++ if (rx_path == RF_A) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE, ++ B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1233312); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX, ++ B_P0_RFMODE_FTM_RX, 0x333); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE, ++ B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1111111); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX, ++ B_P1_RFMODE_FTM_RX, 0x111); ++ } else if (rx_path == RF_B) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE, ++ B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1111111); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX, ++ B_P0_RFMODE_FTM_RX, 0x111); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE, ++ B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1233312); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX, ++ B_P1_RFMODE_FTM_RX, 0x333); ++ } else if (rx_path == RF_AB) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE, ++ B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1233312); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX, ++ B_P0_RFMODE_FTM_RX, 0x333); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE, ++ B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1233312); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX, ++ B_P1_RFMODE_FTM_RX, 0x333); ++ } ++} ++ ++static void rtw8852b_bb_cfg_txrx_path(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_hal *hal = &rtwdev->hal; ++ enum rtw89_rf_path_bit rx_path = hal->antenna_rx ? hal->antenna_rx : RF_AB; ++ ++ rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path); ++ rtw8852b_bb_ctrl_rf_mode_rx_path(rtwdev, rx_path); ++ ++ if (rtwdev->hal.rx_nss == 1) { ++ rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 1); ++ rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 1); ++ } ++ ++ rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 0x0, RTW89_PHY_0); ++} ++ ++static u8 rtw8852b_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path) ++{ ++ if (rtwdev->is_tssi_mode[rf_path]) { ++ u32 addr = 0x1c10 + (rf_path << 13); ++ ++ return rtw89_phy_read32_mask(rtwdev, addr, 0x3F000000); ++ } ++ ++ rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x1); ++ rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x0); ++ rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x1); ++ ++ fsleep(200); ++ ++ return rtw89_read_rf(rtwdev, rf_path, RR_TM, RR_TM_VAL); ++} ++ ++static void rtw8852b_btc_set_rfe(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_btc *btc = &rtwdev->btc; ++ struct rtw89_btc_module *module = &btc->mdinfo; ++ ++ module->rfe_type = rtwdev->efuse.rfe_type; ++ module->cv = rtwdev->hal.cv; ++ module->bt_solo = 0; ++ module->switch_type = BTC_SWITCH_INTERNAL; ++ ++ if (module->rfe_type > 0) ++ module->ant.num = module->rfe_type % 2 ? 2 : 3; ++ else ++ module->ant.num = 2; ++ ++ module->ant.diversity = 0; ++ module->ant.isolation = 10; ++ ++ if (module->ant.num == 3) { ++ module->ant.type = BTC_ANT_DEDICATED; ++ module->bt_pos = BTC_BT_ALONE; ++ } else { ++ module->ant.type = BTC_ANT_SHARED; ++ module->bt_pos = BTC_BT_BTG; ++ } ++} ++ ++static ++void rtw8852b_set_trx_mask(struct rtw89_dev *rtwdev, u8 path, u8 group, u32 val) ++{ ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x20000); ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, group); ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, val); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0); ++} ++ ++static void rtw8852b_btc_init_cfg(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_btc *btc = &rtwdev->btc; ++ struct rtw89_btc_module *module = &btc->mdinfo; ++ const struct rtw89_chip_info *chip = rtwdev->chip; ++ const struct rtw89_mac_ax_coex coex_params = { ++ .pta_mode = RTW89_MAC_AX_COEX_RTK_MODE, ++ .direction = RTW89_MAC_AX_COEX_INNER, ++ }; ++ ++ /* PTA init */ ++ rtw89_mac_coex_init(rtwdev, &coex_params); ++ ++ /* set WL Tx response = Hi-Pri */ ++ chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_TX_RESP, true); ++ chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_BEACON, true); ++ ++ /* set rf gnt debug off */ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_WLSEL, RFREG_MASK, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_WLSEL, RFREG_MASK, 0x0); ++ ++ /* set WL Tx thru in TRX mask table if GNT_WL = 0 && BT_S1 = ss group */ ++ if (module->ant.type == BTC_ANT_SHARED) { ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_SS_GROUP, 0x5ff); ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_SS_GROUP, 0x5ff); ++ /* set path-A(S0) Tx/Rx no-mask if GNT_WL=0 && BT_S1=tx group */ ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_TX_GROUP, 0x5ff); ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_TX_GROUP, 0x55f); ++ } else { /* set WL Tx stb if GNT_WL = 0 && BT_S1 = ss group for 3-ant */ ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_SS_GROUP, 0x5df); ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_SS_GROUP, 0x5df); ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_TX_GROUP, 0x5ff); ++ rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_TX_GROUP, 0x5ff); ++ } ++ ++ /* set PTA break table */ ++ rtw89_write32(rtwdev, R_BTC_BREAK_TABLE, BTC_BREAK_PARAM); ++ ++ /* enable BT counter 0xda40[16,2] = 2b'11 */ ++ rtw89_write32_set(rtwdev, R_AX_CSR_MODE, B_AX_BT_CNT_RST | B_AX_STATIS_BT_EN); ++ btc->cx.wl.status.map.init_ok = true; ++} ++ ++static ++void rtw8852b_btc_set_wl_pri(struct rtw89_dev *rtwdev, u8 map, bool state) ++{ ++ u32 bitmap; ++ u32 reg; ++ ++ switch (map) { ++ case BTC_PRI_MASK_TX_RESP: ++ reg = R_BTC_BT_COEX_MSK_TABLE; ++ bitmap = B_BTC_PRI_MASK_TX_RESP_V1; ++ break; ++ case BTC_PRI_MASK_BEACON: ++ reg = R_AX_WL_PRI_MSK; ++ bitmap = B_AX_PTA_WL_PRI_MASK_BCNQ; ++ break; ++ case BTC_PRI_MASK_RX_CCK: ++ reg = R_BTC_BT_COEX_MSK_TABLE; ++ bitmap = B_BTC_PRI_MASK_RXCCK_V1; ++ break; ++ default: ++ return; ++ } ++ ++ if (state) ++ rtw89_write32_set(rtwdev, reg, bitmap); ++ else ++ rtw89_write32_clr(rtwdev, reg, bitmap); ++} ++ ++union rtw8852b_btc_wl_txpwr_ctrl { ++ u32 txpwr_val; ++ struct { ++ union { ++ u16 ctrl_all_time; ++ struct { ++ s16 data:9; ++ u16 rsvd:6; ++ u16 flag:1; ++ } all_time; ++ }; ++ union { ++ u16 ctrl_gnt_bt; ++ struct { ++ s16 data:9; ++ u16 rsvd:7; ++ } gnt_bt; ++ }; ++ }; ++} __packed; ++ ++static void ++rtw8852b_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val) ++{ ++ union rtw8852b_btc_wl_txpwr_ctrl arg = { .txpwr_val = txpwr_val }; ++ s32 val; ++ ++#define __write_ctrl(_reg, _msk, _val, _en, _cond) \ ++do { \ ++ u32 _wrt = FIELD_PREP(_msk, _val); \ ++ BUILD_BUG_ON(!!(_msk & _en)); \ ++ if (_cond) \ ++ _wrt |= _en; \ ++ else \ ++ _wrt &= ~_en; \ ++ rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, _reg, \ ++ _msk | _en, _wrt); \ ++} while (0) ++ ++ switch (arg.ctrl_all_time) { ++ case 0xffff: ++ val = 0; ++ break; ++ default: ++ val = arg.all_time.data; ++ break; ++ } ++ ++ __write_ctrl(R_AX_PWR_RATE_CTRL, B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, ++ val, B_AX_FORCE_PWR_BY_RATE_EN, ++ arg.ctrl_all_time != 0xffff); ++ ++ switch (arg.ctrl_gnt_bt) { ++ case 0xffff: ++ val = 0; ++ break; ++ default: ++ val = arg.gnt_bt.data; ++ break; ++ } ++ ++ __write_ctrl(R_AX_PWR_COEXT_CTRL, B_AX_TXAGC_BT_MASK, val, ++ B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); ++ ++#undef __write_ctrl ++} ++ ++static ++s8 rtw8852b_btc_get_bt_rssi(struct rtw89_dev *rtwdev, s8 val) ++{ ++ return clamp_t(s8, val, -100, 0) + 100; ++} ++ ++static ++void rtw8852b_btc_update_bt_cnt(struct rtw89_dev *rtwdev) ++{ ++ /* Feature move to firmware */ ++} ++ ++static void rtw8852b_btc_wl_s1_standby(struct rtw89_dev *rtwdev, bool state) ++{ ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x80000); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD1, RFREG_MASK, 0x31); ++ ++ /* set WL standby = Rx for GNT_BT_Tx = 1->0 settle issue */ ++ if (state) ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x579); ++ else ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x20); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0); ++} ++ ++static void rtw8852b_btc_set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level) ++{ ++} ++ ++static void rtw8852b_fill_freq_with_ppdu(struct rtw89_dev *rtwdev, ++ struct rtw89_rx_phy_ppdu *phy_ppdu, ++ struct ieee80211_rx_status *status) ++{ ++ u16 chan = phy_ppdu->chan_idx; ++ u8 band; ++ ++ if (chan == 0) ++ return; ++ ++ band = chan <= 14 ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; ++ status->freq = ieee80211_channel_to_frequency(chan, band); ++ status->band = band; ++} ++ ++static void rtw8852b_query_ppdu(struct rtw89_dev *rtwdev, ++ struct rtw89_rx_phy_ppdu *phy_ppdu, ++ struct ieee80211_rx_status *status) ++{ ++ u8 path; ++ u8 *rx_power = phy_ppdu->rssi; ++ ++ status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B])); ++ for (path = 0; path < rtwdev->chip->rf_path_num; path++) { ++ status->chains |= BIT(path); ++ status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]); ++ } ++ if (phy_ppdu->valid) ++ rtw8852b_fill_freq_with_ppdu(rtwdev, phy_ppdu, status); ++} ++ + static int rtw8852b_mac_enable_bb_rf(struct rtw89_dev *rtwdev) + { + int ret; +@@ -75,13 +2381,150 @@ static int rtw8852b_mac_disable_bb_rf(st + static const struct rtw89_chip_ops rtw8852b_chip_ops = { + .enable_bb_rf = rtw8852b_mac_enable_bb_rf, + .disable_bb_rf = rtw8852b_mac_disable_bb_rf, ++ .bb_reset = rtw8852b_bb_reset, ++ .bb_sethw = rtw8852b_bb_sethw, ++ .read_rf = rtw89_phy_read_rf_v1, ++ .write_rf = rtw89_phy_write_rf_v1, ++ .set_channel = rtw8852b_set_channel, ++ .set_channel_help = rtw8852b_set_channel_help, ++ .read_efuse = rtw8852b_read_efuse, ++ .read_phycap = rtw8852b_read_phycap, ++ .fem_setup = NULL, ++ .rfk_init = rtw8852b_rfk_init, ++ .rfk_channel = rtw8852b_rfk_channel, ++ .rfk_band_changed = rtw8852b_rfk_band_changed, ++ .rfk_scan = rtw8852b_rfk_scan, ++ .rfk_track = rtw8852b_rfk_track, ++ .power_trim = rtw8852b_power_trim, ++ .set_txpwr = rtw8852b_set_txpwr, ++ .set_txpwr_ctrl = rtw8852b_set_txpwr_ctrl, ++ .init_txpwr_unit = rtw8852b_init_txpwr_unit, ++ .get_thermal = rtw8852b_get_thermal, ++ .ctrl_btg = rtw8852b_ctrl_btg, ++ .query_ppdu = rtw8852b_query_ppdu, ++ .bb_ctrl_btc_preagc = rtw8852b_bb_ctrl_btc_preagc, ++ .cfg_txrx_path = rtw8852b_bb_cfg_txrx_path, ++ .set_txpwr_ul_tb_offset = rtw8852b_set_txpwr_ul_tb_offset, ++ .pwr_on_func = rtw8852b_pwr_on_func, ++ .pwr_off_func = rtw8852b_pwr_off_func, ++ .fill_txdesc = rtw89_core_fill_txdesc, ++ .fill_txdesc_fwcmd = rtw89_core_fill_txdesc, ++ .cfg_ctrl_path = rtw89_mac_cfg_ctrl_path, ++ .mac_cfg_gnt = rtw89_mac_cfg_gnt, ++ .stop_sch_tx = rtw89_mac_stop_sch_tx, ++ .resume_sch_tx = rtw89_mac_resume_sch_tx, ++ .h2c_dctl_sec_cam = NULL, ++ ++ .btc_set_rfe = rtw8852b_btc_set_rfe, ++ .btc_init_cfg = rtw8852b_btc_init_cfg, ++ .btc_set_wl_pri = rtw8852b_btc_set_wl_pri, ++ .btc_set_wl_txpwr_ctrl = rtw8852b_btc_set_wl_txpwr_ctrl, ++ .btc_get_bt_rssi = rtw8852b_btc_get_bt_rssi, ++ .btc_update_bt_cnt = rtw8852b_btc_update_bt_cnt, ++ .btc_wl_s1_standby = rtw8852b_btc_wl_s1_standby, ++ .btc_set_wl_rx_gain = rtw8852b_btc_set_wl_rx_gain, ++ .btc_set_policy = rtw89_btc_set_policy, + }; + + const struct rtw89_chip_info rtw8852b_chip_info = { + .chip_id = RTL8852B, ++ .ops = &rtw8852b_chip_ops, ++ .fw_name = "rtw89/rtw8852b_fw.bin", + .fifo_size = 196608, + .dle_scc_rsvd_size = 98304, ++ .max_amsdu_limit = 3500, ++ .dis_2g_40m_ul_ofdma = true, ++ .rsvd_ple_ofst = 0x2f800, ++ .hfc_param_ini = rtw8852b_hfc_param_ini_pcie, + .dle_mem = rtw8852b_dle_mem_pcie, ++ .rf_base_addr = {0xe000, 0xf000}, ++ .pwr_on_seq = NULL, ++ .pwr_off_seq = NULL, ++ .bb_table = &rtw89_8852b_phy_bb_table, ++ .bb_gain_table = &rtw89_8852b_phy_bb_gain_table, ++ .rf_table = {&rtw89_8852b_phy_radioa_table, ++ &rtw89_8852b_phy_radiob_table,}, ++ .nctl_table = &rtw89_8852b_phy_nctl_table, ++ .byr_table = &rtw89_8852b_byr_table, ++ .txpwr_lmt_2g = &rtw89_8852b_txpwr_lmt_2g, ++ .txpwr_lmt_5g = &rtw89_8852b_txpwr_lmt_5g, ++ .txpwr_lmt_ru_2g = &rtw89_8852b_txpwr_lmt_ru_2g, ++ .txpwr_lmt_ru_5g = &rtw89_8852b_txpwr_lmt_ru_5g, ++ .txpwr_factor_rf = 2, ++ .txpwr_factor_mac = 1, ++ .dig_table = NULL, ++ .dig_regs = &rtw8852b_dig_regs, ++ .tssi_dbw_table = NULL, ++ .support_chanctx_num = 0, ++ .support_bands = BIT(NL80211_BAND_2GHZ) | ++ BIT(NL80211_BAND_5GHZ), ++ .support_bw160 = false, ++ .support_ul_tb_ctrl = true, ++ .hw_sec_hdr = false, ++ .rf_path_num = 2, ++ .tx_nss = 2, ++ .rx_nss = 2, ++ .acam_num = 128, ++ .bcam_num = 10, ++ .scam_num = 128, ++ .bacam_num = 2, ++ .bacam_dynamic_num = 4, ++ .bacam_v1 = false, ++ .sec_ctrl_efuse_size = 4, ++ .physical_efuse_size = 1216, ++ .logical_efuse_size = 2048, ++ .limit_efuse_size = 1280, ++ .dav_phy_efuse_size = 96, ++ .dav_log_efuse_size = 16, ++ .phycap_addr = 0x580, ++ .phycap_size = 128, ++ .para_ver = 0, ++ .wlcx_desired = 0x05050000, ++ .btcx_desired = 0x5, ++ .scbd = 0x1, ++ .mailbox = 0x1, ++ .btc_fwinfo_buf = 1024, ++ ++ .fcxbtcrpt_ver = 1, ++ .fcxtdma_ver = 1, ++ .fcxslots_ver = 1, ++ .fcxcysta_ver = 2, ++ .fcxstep_ver = 2, ++ .fcxnullsta_ver = 1, ++ .fcxmreg_ver = 1, ++ .fcxgpiodbg_ver = 1, ++ .fcxbtver_ver = 1, ++ .fcxbtscan_ver = 1, ++ .fcxbtafh_ver = 1, ++ .fcxbtdevinfo_ver = 1, ++ .afh_guard_ch = 6, ++ .wl_rssi_thres = rtw89_btc_8852b_wl_rssi_thres, ++ .bt_rssi_thres = rtw89_btc_8852b_bt_rssi_thres, ++ .rssi_tol = 2, ++ .mon_reg_num = ARRAY_SIZE(rtw89_btc_8852b_mon_reg), ++ .mon_reg = rtw89_btc_8852b_mon_reg, ++ .rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852b_rf_ul), ++ .rf_para_ulink = rtw89_btc_8852b_rf_ul, ++ .rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852b_rf_dl), ++ .rf_para_dlink = rtw89_btc_8852b_rf_dl, ++ .ps_mode_supported = BIT(RTW89_PS_MODE_RFOFF) | ++ BIT(RTW89_PS_MODE_CLK_GATED) | ++ BIT(RTW89_PS_MODE_PWR_GATED), ++ .low_power_hci_modes = 0, ++ .h2c_cctl_func_id = H2C_FUNC_MAC_CCTLINFO_UD, ++ .hci_func_en_addr = R_AX_HCI_FUNC_EN, ++ .h2c_desc_size = sizeof(struct rtw89_txwd_body), ++ .txwd_body_size = sizeof(struct rtw89_txwd_body), ++ .h2c_ctrl_reg = R_AX_H2CREG_CTRL, ++ .h2c_regs = rtw8852b_h2c_regs, ++ .c2h_ctrl_reg = R_AX_C2HREG_CTRL, ++ .c2h_regs = rtw8852b_c2h_regs, ++ .page_regs = &rtw8852b_page_regs, ++ .cfo_src_fd = true, ++ .dcfo_comp = &rtw8852b_dcfo_comp, ++ .dcfo_comp_sft = 3, ++ .imr_info = &rtw8852b_imr_info, ++ .rrsr_cfgs = &rtw8852b_rrsr_cfgs, + .dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) | + BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) | + BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI), +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852be.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852be.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852be.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852be.c 2022-12-24 00:49:25.785376835 +0200 +@@ -7,18 +7,82 @@ + + #include "pci.h" + #include "reg.h" ++#include "rtw8852b.h" + + static const struct rtw89_pci_info rtw8852b_pci_info = { ++ .txbd_trunc_mode = MAC_AX_BD_TRUNC, ++ .rxbd_trunc_mode = MAC_AX_BD_TRUNC, ++ .rxbd_mode = MAC_AX_RXBD_PKT, ++ .tag_mode = MAC_AX_TAG_MULTI, ++ .tx_burst = MAC_AX_TX_BURST_2048B, ++ .rx_burst = MAC_AX_RX_BURST_128B, ++ .wd_dma_idle_intvl = MAC_AX_WD_DMA_INTVL_256NS, ++ .wd_dma_act_intvl = MAC_AX_WD_DMA_INTVL_256NS, ++ .multi_tag_num = MAC_AX_TAG_NUM_8, ++ .lbc_en = MAC_AX_PCIE_ENABLE, ++ .lbc_tmr = MAC_AX_LBC_TMR_2MS, ++ .autok_en = MAC_AX_PCIE_DISABLE, ++ .io_rcy_en = MAC_AX_PCIE_DISABLE, ++ .io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS, ++ ++ .init_cfg_reg = R_AX_PCIE_INIT_CFG1, ++ .txhci_en_bit = B_AX_TXHCI_EN, ++ .rxhci_en_bit = B_AX_RXHCI_EN, ++ .rxbd_mode_bit = B_AX_RXBD_MODE, ++ .exp_ctrl_reg = R_AX_PCIE_EXP_CTRL, ++ .max_tag_num_mask = B_AX_MAX_TAG_NUM, ++ .rxbd_rwptr_clr_reg = R_AX_RXBD_RWPTR_CLR, ++ .txbd_rwptr_clr2_reg = 0, + .dma_stop1 = {R_AX_PCIE_DMA_STOP1, B_AX_TX_STOP1_MASK_V1}, + .dma_stop2 = {0}, + .dma_busy1 = {R_AX_PCIE_DMA_BUSY1, DMA_BUSY1_CHECK_V1}, + .dma_busy2_reg = 0, + .dma_busy3_reg = R_AX_PCIE_DMA_BUSY1, + ++ .rpwm_addr = R_AX_PCIE_HRPWM, ++ .cpwm_addr = R_AX_CPWM, + .tx_dma_ch_mask = BIT(RTW89_TXCH_ACH4) | BIT(RTW89_TXCH_ACH5) | + BIT(RTW89_TXCH_ACH6) | BIT(RTW89_TXCH_ACH7) | + BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11), ++ .bd_idx_addr_low_power = NULL, ++ .dma_addr_set = &rtw89_pci_ch_dma_addr_set, ++ ++ .ltr_set = rtw89_pci_ltr_set, ++ .fill_txaddr_info = rtw89_pci_fill_txaddr_info, ++ .config_intr_mask = rtw89_pci_config_intr_mask, ++ .enable_intr = rtw89_pci_enable_intr, ++ .disable_intr = rtw89_pci_disable_intr, ++ .recognize_intrs = rtw89_pci_recognize_intrs, ++}; ++ ++static const struct rtw89_driver_info rtw89_8852be_info = { ++ .chip = &rtw8852b_chip_info, ++ .bus = { ++ .pci = &rtw8852b_pci_info, ++ }, ++}; ++ ++static const struct pci_device_id rtw89_8852be_id_table[] = { ++ { ++ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb852), ++ .driver_data = (kernel_ulong_t)&rtw89_8852be_info, ++ }, ++ { ++ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb85b), ++ .driver_data = (kernel_ulong_t)&rtw89_8852be_info, ++ }, ++ {}, ++}; ++MODULE_DEVICE_TABLE(pci, rtw89_8852be_id_table); ++ ++static struct pci_driver rtw89_8852be_driver = { ++ .name = "rtw89_8852be", ++ .id_table = rtw89_8852be_id_table, ++ .probe = rtw89_pci_probe, ++ .remove = rtw89_pci_remove, ++ .driver.pm = &rtw89_pm_ops, + }; ++module_pci_driver(rtw89_8852be_driver); + + MODULE_AUTHOR("Realtek Corporation"); + MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BE driver"); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b.h 2022-12-24 00:49:25.782376835 +0200 +@@ -0,0 +1,137 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2019-2022 Realtek Corporation ++ */ ++ ++#ifndef __RTW89_8852B_H__ ++#define __RTW89_8852B_H__ ++ ++#include "core.h" ++ ++#define RF_PATH_NUM_8852B 2 ++#define BB_PATH_NUM_8852B 2 ++ ++enum rtw8852b_pmac_mode { ++ NONE_TEST, ++ PKTS_TX, ++ PKTS_RX, ++ CONT_TX ++}; ++ ++struct rtw8852b_u_efuse { ++ u8 rsvd[0x88]; ++ u8 mac_addr[ETH_ALEN]; ++}; ++ ++struct rtw8852b_e_efuse { ++ u8 mac_addr[ETH_ALEN]; ++}; ++ ++struct rtw8852b_tssi_offset { ++ u8 cck_tssi[TSSI_CCK_CH_GROUP_NUM]; ++ u8 bw40_tssi[TSSI_MCS_2G_CH_GROUP_NUM]; ++ u8 rsvd[7]; ++ u8 bw40_1s_tssi_5g[TSSI_MCS_5G_CH_GROUP_NUM]; ++} __packed; ++ ++struct rtw8852b_efuse { ++ u8 rsvd[0x210]; ++ struct rtw8852b_tssi_offset path_a_tssi; ++ u8 rsvd1[10]; ++ struct rtw8852b_tssi_offset path_b_tssi; ++ u8 rsvd2[94]; ++ u8 channel_plan; ++ u8 xtal_k; ++ u8 rsvd3; ++ u8 iqk_lck; ++ u8 rsvd4[5]; ++ u8 reg_setting:2; ++ u8 tx_diversity:1; ++ u8 rx_diversity:2; ++ u8 ac_mode:1; ++ u8 module_type:2; ++ u8 rsvd5; ++ u8 shared_ant:1; ++ u8 coex_type:3; ++ u8 ant_iso:1; ++ u8 radio_on_off:1; ++ u8 rsvd6:2; ++ u8 eeprom_version; ++ u8 customer_id; ++ u8 tx_bb_swing_2g; ++ u8 tx_bb_swing_5g; ++ u8 tx_cali_pwr_trk_mode; ++ u8 trx_path_selection; ++ u8 rfe_type; ++ u8 country_code[2]; ++ u8 rsvd7[3]; ++ u8 path_a_therm; ++ u8 path_b_therm; ++ u8 rsvd8[2]; ++ u8 rx_gain_2g_ofdm; ++ u8 rsvd9; ++ u8 rx_gain_2g_cck; ++ u8 rsvd10; ++ u8 rx_gain_5g_low; ++ u8 rsvd11; ++ u8 rx_gain_5g_mid; ++ u8 rsvd12; ++ u8 rx_gain_5g_high; ++ u8 rsvd13[35]; ++ u8 path_a_cck_pwr_idx[6]; ++ u8 path_a_bw40_1tx_pwr_idx[5]; ++ u8 path_a_ofdm_1tx_pwr_idx_diff:4; ++ u8 path_a_bw20_1tx_pwr_idx_diff:4; ++ u8 path_a_bw20_2tx_pwr_idx_diff:4; ++ u8 path_a_bw40_2tx_pwr_idx_diff:4; ++ u8 path_a_cck_2tx_pwr_idx_diff:4; ++ u8 path_a_ofdm_2tx_pwr_idx_diff:4; ++ u8 rsvd14[0xf2]; ++ union { ++ struct rtw8852b_u_efuse u; ++ struct rtw8852b_e_efuse e; ++ }; ++} __packed; ++ ++struct rtw8852b_bb_pmac_info { ++ u8 en_pmac_tx:1; ++ u8 is_cck:1; ++ u8 mode:3; ++ u8 rsvd:3; ++ u16 tx_cnt; ++ u16 period; ++ u16 tx_time; ++ u8 duty_cycle; ++}; ++ ++struct rtw8852b_bb_tssi_bak { ++ u8 tx_path; ++ u8 rx_path; ++ u32 p0_rfmode; ++ u32 p0_rfmode_ftm; ++ u32 p1_rfmode; ++ u32 p1_rfmode_ftm; ++ s16 tx_pwr; /* S9 */ ++}; ++ ++extern const struct rtw89_chip_info rtw8852b_chip_info; ++ ++void rtw8852b_bb_set_plcp_tx(struct rtw89_dev *rtwdev); ++void rtw8852b_bb_set_pmac_tx(struct rtw89_dev *rtwdev, ++ struct rtw8852b_bb_pmac_info *tx_info, ++ enum rtw89_phy_idx idx); ++void rtw8852b_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable, ++ u16 tx_cnt, u16 period, u16 tx_time, ++ enum rtw89_phy_idx idx); ++void rtw8852b_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm, ++ enum rtw89_phy_idx idx); ++void rtw8852b_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path); ++void rtw8852b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path_bit rx_path); ++void rtw8852b_bb_tx_mode_switch(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx idx, u8 mode); ++void rtw8852b_bb_backup_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx, ++ struct rtw8852b_bb_tssi_bak *bak); ++void rtw8852b_bb_restore_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx, ++ const struct rtw8852b_bb_tssi_bak *bak); ++ ++#endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c 2022-12-24 00:49:25.783376835 +0200 +@@ -0,0 +1,4174 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2019-2022 Realtek Corporation ++ */ ++ ++#include "coex.h" ++#include "debug.h" ++#include "mac.h" ++#include "phy.h" ++#include "reg.h" ++#include "rtw8852b.h" ++#include "rtw8852b_rfk.h" ++#include "rtw8852b_rfk_table.h" ++#include "rtw8852b_table.h" ++ ++#define RTW8852B_RXDCK_VER 0x1 ++#define RTW8852B_IQK_VER 0x2a ++#define RTW8852B_IQK_SS 2 ++#define RTW8852B_RXK_GROUP_NR 4 ++#define RTW8852B_TSSI_PATH_NR 2 ++#define RTW8852B_RF_REL_VERSION 34 ++#define RTW8852B_DPK_VER 0x0d ++#define RTW8852B_DPK_RF_PATH 2 ++#define RTW8852B_DPK_KIP_REG_NUM 2 ++ ++#define _TSSI_DE_MASK GENMASK(21, 12) ++#define ADDC_T_AVG 100 ++#define DPK_TXAGC_LOWER 0x2e ++#define DPK_TXAGC_UPPER 0x3f ++#define DPK_TXAGC_INVAL 0xff ++#define RFREG_MASKRXBB 0x003e0 ++#define RFREG_MASKMODE 0xf0000 ++ ++enum rtw8852b_dpk_id { ++ LBK_RXIQK = 0x06, ++ SYNC = 0x10, ++ MDPK_IDL = 0x11, ++ MDPK_MPA = 0x12, ++ GAIN_LOSS = 0x13, ++ GAIN_CAL = 0x14, ++ DPK_RXAGC = 0x15, ++ KIP_PRESET = 0x16, ++ KIP_RESTORE = 0x17, ++ DPK_TXAGC = 0x19, ++ D_KIP_PRESET = 0x28, ++ D_TXAGC = 0x29, ++ D_RXAGC = 0x2a, ++ D_SYNC = 0x2b, ++ D_GAIN_LOSS = 0x2c, ++ D_MDPK_IDL = 0x2d, ++ D_GAIN_NORM = 0x2f, ++ D_KIP_THERMAL = 0x30, ++ D_KIP_RESTORE = 0x31 ++}; ++ ++enum dpk_agc_step { ++ DPK_AGC_STEP_SYNC_DGAIN, ++ DPK_AGC_STEP_GAIN_ADJ, ++ DPK_AGC_STEP_GAIN_LOSS_IDX, ++ DPK_AGC_STEP_GL_GT_CRITERION, ++ DPK_AGC_STEP_GL_LT_CRITERION, ++ DPK_AGC_STEP_SET_TX_GAIN, ++}; ++ ++enum rtw8852b_iqk_type { ++ ID_TXAGC = 0x0, ++ ID_FLOK_COARSE = 0x1, ++ ID_FLOK_FINE = 0x2, ++ ID_TXK = 0x3, ++ ID_RXAGC = 0x4, ++ ID_RXK = 0x5, ++ ID_NBTXK = 0x6, ++ ID_NBRXK = 0x7, ++ ID_FLOK_VBUFFER = 0x8, ++ ID_A_FLOK_COARSE = 0x9, ++ ID_G_FLOK_COARSE = 0xa, ++ ID_A_FLOK_FINE = 0xb, ++ ID_G_FLOK_FINE = 0xc, ++ ID_IQK_RESTORE = 0x10, ++}; ++ ++static const u32 _tssi_trigger[RTW8852B_TSSI_PATH_NR] = {0x5820, 0x7820}; ++static const u32 _tssi_cw_rpt_addr[RTW8852B_TSSI_PATH_NR] = {0x1c18, 0x3c18}; ++static const u32 _tssi_cw_default_addr[RTW8852B_TSSI_PATH_NR][4] = { ++ {0x5634, 0x5630, 0x5630, 0x5630}, ++ {0x7634, 0x7630, 0x7630, 0x7630} }; ++static const u32 _tssi_cw_default_mask[4] = { ++ 0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff}; ++static const u32 _tssi_de_cck_long[RF_PATH_NUM_8852B] = {0x5858, 0x7858}; ++static const u32 _tssi_de_cck_short[RF_PATH_NUM_8852B] = {0x5860, 0x7860}; ++static const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852B] = {0x5838, 0x7838}; ++static const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852B] = {0x5840, 0x7840}; ++static const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852B] = {0x5848, 0x7848}; ++static const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852B] = {0x5850, 0x7850}; ++static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852B] = {0x5828, 0x7828}; ++static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852B] = {0x5830, 0x7830}; ++static const u32 _a_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x190, 0x198, 0x350, 0x352}; ++static const u32 _a_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x0f, 0x0f, 0x3f, 0x7f}; ++static const u32 _a_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x1, 0x0, 0x0}; ++static const u32 _g_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x212, 0x21c, 0x350, 0x360}; ++static const u32 _g_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x00, 0x00, 0x28, 0x5f}; ++static const u32 _g_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x2, 0x1}; ++static const u32 _a_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0}; ++static const u32 _a_track_range[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x6, 0x6}; ++static const u32 _a_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e}; ++static const u32 _a_itqt[RTW8852B_RXK_GROUP_NR] = {0x12, 0x12, 0x12, 0x1b}; ++static const u32 _g_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0}; ++static const u32 _g_track_range[RTW8852B_RXK_GROUP_NR] = {0x4, 0x4, 0x6, 0x6}; ++static const u32 _g_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e}; ++static const u32 _g_itqt[RTW8852B_RXK_GROUP_NR] = {0x09, 0x12, 0x1b, 0x24}; ++ ++static const u32 rtw8852b_backup_bb_regs[] = {0x2344, 0x5800, 0x7800}; ++static const u32 rtw8852b_backup_rf_regs[] = { ++ 0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x1e, 0x0, 0x2, 0x5, 0x10005 ++}; ++ ++#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852b_backup_bb_regs) ++#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852b_backup_rf_regs) ++ ++static const struct rtw89_reg3_def rtw8852b_set_nondbcc_path01[] = { ++ {0x20fc, 0xffff0000, 0x0303}, ++ {0x5864, 0x18000000, 0x3}, ++ {0x7864, 0x18000000, 0x3}, ++ {0x12b8, 0x40000000, 0x1}, ++ {0x32b8, 0x40000000, 0x1}, ++ {0x030c, 0xff000000, 0x13}, ++ {0x032c, 0xffff0000, 0x0041}, ++ {0x12b8, 0x10000000, 0x1}, ++ {0x58c8, 0x01000000, 0x1}, ++ {0x78c8, 0x01000000, 0x1}, ++ {0x5864, 0xc0000000, 0x3}, ++ {0x7864, 0xc0000000, 0x3}, ++ {0x2008, 0x01ffffff, 0x1ffffff}, ++ {0x0c1c, 0x00000004, 0x1}, ++ {0x0700, 0x08000000, 0x1}, ++ {0x0c70, 0x000003ff, 0x3ff}, ++ {0x0c60, 0x00000003, 0x3}, ++ {0x0c6c, 0x00000001, 0x1}, ++ {0x58ac, 0x08000000, 0x1}, ++ {0x78ac, 0x08000000, 0x1}, ++ {0x0c3c, 0x00000200, 0x1}, ++ {0x2344, 0x80000000, 0x1}, ++ {0x4490, 0x80000000, 0x1}, ++ {0x12a0, 0x00007000, 0x7}, ++ {0x12a0, 0x00008000, 0x1}, ++ {0x12a0, 0x00070000, 0x3}, ++ {0x12a0, 0x00080000, 0x1}, ++ {0x32a0, 0x00070000, 0x3}, ++ {0x32a0, 0x00080000, 0x1}, ++ {0x0700, 0x01000000, 0x1}, ++ {0x0700, 0x06000000, 0x2}, ++ {0x20fc, 0xffff0000, 0x3333}, ++}; ++ ++static const struct rtw89_reg3_def rtw8852b_restore_nondbcc_path01[] = { ++ {0x20fc, 0xffff0000, 0x0303}, ++ {0x12b8, 0x40000000, 0x0}, ++ {0x32b8, 0x40000000, 0x0}, ++ {0x5864, 0xc0000000, 0x0}, ++ {0x7864, 0xc0000000, 0x0}, ++ {0x2008, 0x01ffffff, 0x0000000}, ++ {0x0c1c, 0x00000004, 0x0}, ++ {0x0700, 0x08000000, 0x0}, ++ {0x0c70, 0x0000001f, 0x03}, ++ {0x0c70, 0x000003e0, 0x03}, ++ {0x12a0, 0x000ff000, 0x00}, ++ {0x32a0, 0x000ff000, 0x00}, ++ {0x0700, 0x07000000, 0x0}, ++ {0x20fc, 0xffff0000, 0x0000}, ++ {0x58c8, 0x01000000, 0x0}, ++ {0x78c8, 0x01000000, 0x0}, ++ {0x0c3c, 0x00000200, 0x0}, ++ {0x2344, 0x80000000, 0x0}, ++}; ++ ++static void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) ++{ ++ u32 i; ++ ++ for (i = 0; i < BACKUP_BB_REGS_NR; i++) { ++ backup_bb_reg_val[i] = ++ rtw89_phy_read32_mask(rtwdev, rtw8852b_backup_bb_regs[i], ++ MASKDWORD); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]backup bb reg : %x, value =%x\n", ++ rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]); ++ } ++} ++ ++static void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], ++ u8 rf_path) ++{ ++ u32 i; ++ ++ for (i = 0; i < BACKUP_RF_REGS_NR; i++) { ++ backup_rf_reg_val[i] = ++ rtw89_read_rf(rtwdev, rf_path, ++ rtw8852b_backup_rf_regs[i], RFREG_MASK); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]backup rf S%d reg : %x, value =%x\n", rf_path, ++ rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]); ++ } ++} ++ ++static void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev, ++ const u32 backup_bb_reg_val[]) ++{ ++ u32 i; ++ ++ for (i = 0; i < BACKUP_BB_REGS_NR; i++) { ++ rtw89_phy_write32_mask(rtwdev, rtw8852b_backup_bb_regs[i], ++ MASKDWORD, backup_bb_reg_val[i]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]restore bb reg : %x, value =%x\n", ++ rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]); ++ } ++} ++ ++static void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev, ++ const u32 backup_rf_reg_val[], u8 rf_path) ++{ ++ u32 i; ++ ++ for (i = 0; i < BACKUP_RF_REGS_NR; i++) { ++ rtw89_write_rf(rtwdev, rf_path, rtw8852b_backup_rf_regs[i], ++ RFREG_MASK, backup_rf_reg_val[i]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path, ++ rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]); ++ } ++} ++ ++static void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path, bool is_bybb) ++{ ++ if (is_bybb) ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); ++ else ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); ++} ++ ++static void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path, bool is_bybb) ++{ ++ if (is_bybb) ++ rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); ++ else ++ rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); ++} ++ ++static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path) ++{ ++ bool fail = true; ++ u32 val; ++ int ret; ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, ++ 1, 8200, false, rtwdev, 0xbff8, MASKBYTE0); ++ if (ret) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n"); ++ ++ udelay(200); ++ ++ if (!ret) ++ fail = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret); ++ val = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8008 = 0x%x\n", path, val); ++ ++ return fail; ++} ++ ++static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ u8 val; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n", ++ rtwdev->dbcc_en, phy_idx); ++ ++ if (!rtwdev->dbcc_en) { ++ val = RF_AB; ++ } else { ++ if (phy_idx == RTW89_PHY_0) ++ val = RF_A; ++ else ++ val = RF_B; ++ } ++ return val; ++} ++ ++static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); ++ mdelay(1); ++} ++ ++static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ u8 path, dck_tune; ++ u32 rf_reg5; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n", ++ RTW8852B_RXDCK_VER, rtwdev->hal.cv); ++ ++ for (path = 0; path < RF_PATH_NUM_8852B; path++) { ++ rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); ++ dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE); ++ ++ if (rtwdev->is_tssi_mode[path]) ++ rtw89_phy_write32_mask(rtwdev, ++ R_P0_TSSI_TRK + (path << 13), ++ B_P0_TSSI_TRK_EN, 0x1); ++ ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); ++ _set_rx_dck(rtwdev, phy, path); ++ rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune); ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); ++ ++ if (rtwdev->is_tssi_mode[path]) ++ rtw89_phy_write32_mask(rtwdev, ++ R_P0_TSSI_TRK + (path << 13), ++ B_P0_TSSI_TRK_EN, 0x0); ++ } ++} ++ ++static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) ++{ ++ u32 rf_reg5; ++ u32 rck_val; ++ u32 val; ++ int ret; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); ++ ++ rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); ++ ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n", ++ rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); ++ ++ /* RCK trigger */ ++ rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); ++ ++ ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30, ++ false, rtwdev, path, RR_RCKS, BIT(3)); ++ ++ rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n", ++ rck_val, ret); ++ ++ rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n", ++ rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK)); ++} ++ ++static void _afe_init(struct rtw89_dev *rtwdev) ++{ ++ rtw89_write32(rtwdev, R_AX_PHYREG_SET, 0xf); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_afe_init_defs_tbl); ++} ++ ++static void _drck(struct rtw89_dev *rtwdev) ++{ ++ u32 rck_d; ++ u32 val; ++ int ret; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n"); ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x1); ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, ++ false, rtwdev, R_DRCK_RS, B_DRCK_RS_DONE); ++ if (ret) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n"); ++ ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0); ++ rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RS, B_DRCK_RS_LPS); ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_SEL, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_CV, rck_d); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0cc = 0x%x\n", ++ rtw89_phy_read32_mask(rtwdev, R_DRCK_V1, MASKDWORD)); ++} ++ ++static void _addck_backup(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0); ++ dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0); ++ dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1); ++ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0); ++ dack->addck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0); ++ dack->addck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1); ++} ++ ++static void _addck_reload(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ ++ /* S0 */ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL, dack->addck_d[0][0]); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_VAL, dack->addck_d[0][1] >> 6); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL2, dack->addck_d[0][1] & 0x3f); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x3); ++ ++ /* S1 */ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL, dack->addck_d[1][0]); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK0_VAL, dack->addck_d[1][1] >> 6); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL2, dack->addck_d[1][1] & 0x3f); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x3); ++} ++ ++static void _dack_backup_s0(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ u8 i; ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); ++ ++ for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { ++ rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i); ++ dack->msbk_d[0][0][i] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0); ++ rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i); ++ dack->msbk_d[0][1][i] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1); ++ } ++ ++ dack->biask_d[0][0] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00); ++ dack->biask_d[0][1] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01); ++ ++ dack->dadck_d[0][0] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00); ++ dack->dadck_d[0][1] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01); ++} ++ ++static void _dack_backup_s1(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ u8 i; ++ ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); ++ ++ for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { ++ rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i); ++ dack->msbk_d[1][0][i] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S); ++ rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i); ++ dack->msbk_d[1][1][i] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S); ++ } ++ ++ dack->biask_d[1][0] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10); ++ dack->biask_d[1][1] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11); ++ ++ dack->dadck_d[1][0] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10); ++ dack->dadck_d[1][1] = ++ rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11); ++} ++ ++static void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) ++{ ++ s32 dc_re = 0, dc_im = 0; ++ u32 tmp; ++ u32 i; ++ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_check_addc_defs_a_tbl, ++ &rtw8852b_check_addc_defs_b_tbl); ++ ++ for (i = 0; i < ADDC_T_AVG; i++) { ++ tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD); ++ dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11); ++ dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11); ++ } ++ ++ dc_re /= ADDC_T_AVG; ++ dc_im /= ADDC_T_AVG; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im); ++} ++ ++static void _addck(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ u32 val; ++ int ret; ++ ++ /* S0 */ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x30, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n"); ++ _check_addc(rtwdev, RF_PATH_A); ++ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1); ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, ++ false, rtwdev, R_ADDCKR0, BIT(0)); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); ++ dack->addck_timeout[0] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n"); ++ _check_addc(rtwdev, RF_PATH_A); ++ ++ rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); ++ ++ /* S1 */ ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n"); ++ _check_addc(rtwdev, RF_PATH_B); ++ ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1); ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, ++ false, rtwdev, R_ADDCKR1, BIT(0)); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n"); ++ dack->addck_timeout[1] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n"); ++ _check_addc(rtwdev, RF_PATH_B); ++ ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); ++} ++ ++static void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_check_dadc_en_defs_a_tbl, ++ &rtw8852b_check_dadc_en_defs_b_tbl); ++ ++ _check_addc(rtwdev, path); ++ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_check_dadc_dis_defs_a_tbl, ++ &rtw8852b_check_dadc_dis_defs_b_tbl); ++} ++ ++static bool _dack_s0_check_done(struct rtw89_dev *rtwdev, bool part1) ++{ ++ if (part1) { ++ if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 || ++ rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0) ++ return false; ++ } else { ++ if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 || ++ rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0) ++ return false; ++ } ++ ++ return true; ++} ++ ++static void _dack_s0(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ bool done; ++ int ret; ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_1_defs_tbl); ++ ++ ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000, ++ false, rtwdev, true); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n"); ++ dack->msbk_timeout[0] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_2_defs_tbl); ++ ++ ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000, ++ false, rtwdev, false); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n"); ++ dack->dadck_timeout[0] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_3_defs_tbl); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n"); ++ ++ _dack_backup_s0(rtwdev); ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); ++} ++ ++static bool _dack_s1_check_done(struct rtw89_dev *rtwdev, bool part1) ++{ ++ if (part1) { ++ if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 && ++ rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0) ++ return false; ++ } else { ++ if (rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK_S1P2_OK) == 0 && ++ rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK_S1P3_OK) == 0) ++ return false; ++ } ++ ++ return true; ++} ++ ++static void _dack_s1(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ bool done; ++ int ret; ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_1_defs_tbl); ++ ++ ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000, ++ false, rtwdev, true); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n"); ++ dack->msbk_timeout[1] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_2_defs_tbl); ++ ++ ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000, ++ false, rtwdev, false); ++ if (ret) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n"); ++ dack->dadck_timeout[1] = true; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_3_defs_tbl); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n"); ++ ++ _check_dadc(rtwdev, RF_PATH_B); ++ _dack_backup_s1(rtwdev); ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); ++} ++ ++static void _dack(struct rtw89_dev *rtwdev) ++{ ++ _dack_s0(rtwdev); ++ _dack_s1(rtwdev); ++} ++ ++static void _dack_dump(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ u8 i; ++ u8 t; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", ++ dack->addck_d[0][0], dack->addck_d[0][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n", ++ dack->addck_d[1][0], dack->addck_d[1][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", ++ dack->dadck_d[0][0], dack->dadck_d[0][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n", ++ dack->dadck_d[1][0], dack->dadck_d[1][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", ++ dack->biask_d[0][0], dack->biask_d[0][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n", ++ dack->biask_d[1][0], dack->biask_d[1][1]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); ++ for (i = 0; i < 0x10; i++) { ++ t = dack->msbk_d[0][0][i]; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); ++ for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { ++ t = dack->msbk_d[0][1][i]; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n"); ++ for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { ++ t = dack->msbk_d[1][0][i]; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n"); ++ for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { ++ t = dack->msbk_d[1][1][i]; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); ++ } ++} ++ ++static void _dac_cal(struct rtw89_dev *rtwdev, bool force) ++{ ++ struct rtw89_dack_info *dack = &rtwdev->dack; ++ u32 rf0_0, rf1_0; ++ ++ dack->dack_done = false; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x1\n"); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); ++ ++ rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK); ++ rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK); ++ _afe_init(rtwdev); ++ _drck(rtwdev); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1); ++ _addck(rtwdev); ++ _addck_backup(rtwdev); ++ _addck_reload(rtwdev); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0); ++ _dack(rtwdev); ++ _dack_dump(rtwdev); ++ dack->dack_done = true; ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1); ++ dack->dack_cnt++; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); ++} ++ ++static void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u32 tmp; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1); ++ tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); ++ rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1); ++ tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); ++ rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); ++ break; ++ default: ++ break; ++ } ++} ++ ++static bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, ++ u8 path, u8 ktype) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u32 iqk_cmd; ++ bool fail; ++ ++ switch (ktype) { ++ case ID_FLOK_COARSE: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ iqk_cmd = 0x108 | (1 << (4 + path)); ++ break; ++ case ID_FLOK_FINE: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ iqk_cmd = 0x208 | (1 << (4 + path)); ++ break; ++ case ID_FLOK_VBUFFER: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ iqk_cmd = 0x308 | (1 << (4 + path)); ++ break; ++ case ID_TXK: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ iqk_cmd = 0x008 | (1 << (path + 4)) | ++ (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8); ++ break; ++ case ID_RXAGC: ++ iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1); ++ break; ++ case ID_RXK: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ iqk_cmd = 0x008 | (1 << (path + 4)) | ++ (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8); ++ break; ++ case ID_NBTXK: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x011); ++ iqk_cmd = 0x308 | (1 << (4 + path)); ++ break; ++ case ID_NBRXK: ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); ++ iqk_cmd = 0x608 | (1 << (4 + path)); ++ break; ++ default: ++ return false; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); ++ udelay(1); ++ fail = _iqk_check_cal(rtwdev, path); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ ++ return fail; ++} ++ ++static bool _rxk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, ++ u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool kfail = false; ++ bool fail; ++ u8 gp; ++ ++ for (gp = 0; gp < RTW8852B_RXK_GROUP_NR; gp++) { ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, ++ _g_idxrxgain[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, ++ _g_idxattc2[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, ++ _g_idxattc1[gp]); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, ++ _a_idxrxgain[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, ++ _a_idxattc2[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, ++ _a_idxattc1[gp]); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_SEL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_SET, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_GP_V1, gp); ++ fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, ++ BIT(16 + gp + path * 4), fail); ++ kfail |= fail; ++ } ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); ++ ++ if (kfail) { ++ iqk_info->nb_rxcfir[path] = 0x40000002; ++ rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), ++ B_IQK_RES_RXCFIR, 0x0); ++ iqk_info->is_wb_rxiqk[path] = false; ++ } else { ++ iqk_info->nb_rxcfir[path] = 0x40000000; ++ rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), ++ B_IQK_RES_RXCFIR, 0x5); ++ iqk_info->is_wb_rxiqk[path] = true; ++ } ++ ++ return kfail; ++} ++ ++static bool _iqk_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, ++ u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ const u8 gp = 0x3; ++ bool kfail = false; ++ bool fail; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, ++ _g_idxrxgain[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, ++ _g_idxattc2[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, ++ _g_idxattc1[gp]); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, ++ _a_idxrxgain[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, ++ _a_idxattc2[gp]); ++ rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, ++ _a_idxattc1[gp]); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP_V1, gp); ++ rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); ++ udelay(1); ++ ++ fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail); ++ kfail |= fail; ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); ++ ++ if (!kfail) ++ iqk_info->nb_rxcfir[path] = ++ rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD) | 0x2; ++ else ++ iqk_info->nb_rxcfir[path] = 0x40000002; ++ ++ return kfail; ++} ++ ++static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ ++ if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x2); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x2); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1); ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x0); ++ } ++} ++ ++static bool _txk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool kfail = false; ++ bool fail; ++ u8 gp; ++ ++ for (gp = 0x0; gp < RTW8852B_RXK_GROUP_NR; gp++) { ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, ++ _g_power_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, ++ _g_track_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, ++ _g_gain_bb[gp]); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), ++ MASKDWORD, _g_itqt[gp]); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, ++ _a_power_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, ++ _a_track_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, ++ _a_gain_bb[gp]); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), ++ MASKDWORD, _a_itqt[gp]); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_SEL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_SET, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_G2, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), ++ B_CFIR_LUT_GP, gp); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); ++ fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, ++ BIT(8 + gp + path * 4), fail); ++ kfail |= fail; ++ } ++ ++ if (kfail) { ++ iqk_info->nb_txcfir[path] = 0x40000002; ++ rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), ++ B_IQK_RES_TXCFIR, 0x0); ++ iqk_info->is_wb_txiqk[path] = false; ++ } else { ++ iqk_info->nb_txcfir[path] = 0x40000000; ++ rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), ++ B_IQK_RES_TXCFIR, 0x5); ++ iqk_info->is_wb_txiqk[path] = true; ++ } ++ ++ return kfail; ++} ++ ++static bool _iqk_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool kfail; ++ u8 gp = 0x3; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, ++ _g_power_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, ++ _g_track_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, ++ _g_gain_bb[gp]); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), ++ MASKDWORD, _g_itqt[gp]); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, ++ _a_power_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, ++ _a_track_range[gp]); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, ++ _a_gain_bb[gp]); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), ++ MASKDWORD, _a_itqt[gp]); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G2, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); ++ kfail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); ++ ++ if (!kfail) ++ iqk_info->nb_txcfir[path] = ++ rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), ++ MASKDWORD) | 0x2; ++ else ++ iqk_info->nb_txcfir[path] = 0x40000002; ++ ++ return kfail; ++} ++ ++static void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias); ++ ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2); ++ if (iqk_info->iqk_band[path] == RTW89_BAND_2G) ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0); ++ else ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TXVBUF, RR_TXVBUF_DACEN, 0x1); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x7c = %x\n", path, ++ rtw89_read_rf(rtwdev, path, RR_TXVBUF, RFREG_MASK)); ++} ++ ++static bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool is_fail1, is_fail2; ++ u32 vbuff_i; ++ u32 vbuff_q; ++ u32 core_i; ++ u32 core_q; ++ u32 tmp; ++ u8 ch; ++ ++ tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK); ++ core_i = FIELD_GET(RR_TXMO_COI, tmp); ++ core_q = FIELD_GET(RR_TXMO_COQ, tmp); ++ ch = (iqk_info->iqk_times / 2) % RTW89_IQK_CHS_NR; ++ ++ if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d) ++ is_fail1 = true; ++ else ++ is_fail1 = false; ++ ++ iqk_info->lok_idac[ch][path] = tmp; ++ ++ tmp = rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK); ++ vbuff_i = FIELD_GET(RR_LOKVB_COI, tmp); ++ vbuff_q = FIELD_GET(RR_LOKVB_COQ, tmp); ++ ++ if (vbuff_i < 0x2 || vbuff_i > 0x3d || vbuff_q < 0x2 || vbuff_q > 0x3d) ++ is_fail2 = true; ++ else ++ is_fail2 = false; ++ ++ iqk_info->lok_vbuf[ch][path] = tmp; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[IQK]S%x, lok_idac[%x][%x] = 0x%x\n", path, ch, path, ++ iqk_info->lok_idac[ch][path]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[IQK]S%x, lok_vbuf[%x][%x] = 0x%x\n", path, ch, path, ++ iqk_info->lok_vbuf[ch][path]); ++ ++ return is_fail1 | is_fail2; ++} ++ ++static bool _iqk_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool tmp; ++ ++ rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4); ++ break; ++ default: ++ break; ++ } ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9); ++ tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE); ++ iqk_info->lok_cor_fail[0][path] = tmp; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24); ++ tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9); ++ rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); ++ tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE); ++ iqk_info->lok_fin_fail[0][path] = tmp; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); ++ break; ++ default: ++ break; ++ } ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24); ++ _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); ++ ++ return _lok_finetune_check(rtwdev, path); ++} ++ ++static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ ++ switch (iqk_info->iqk_band[path]) { ++ case RTW89_BAND_2G: ++ rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW2, 0x00); ++ rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); ++ udelay(1); ++ break; ++ case RTW89_BAND_5G: ++ rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00); ++ rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); ++ udelay(1); ++ break; ++ default: ++ break; ++ } ++} ++ ++static void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path) ++{ ++ rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001); ++ udelay(1); ++ rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); ++} ++ ++static void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u32 tmp; ++ bool flag; ++ ++ iqk_info->thermal[path] = ++ ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); ++ iqk_info->thermal_rek_en = false; ++ ++ flag = iqk_info->lok_cor_fail[0][path]; ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FCOR << (path * 4), flag); ++ flag = iqk_info->lok_fin_fail[0][path]; ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FFIN << (path * 4), flag); ++ flag = iqk_info->iqk_tx_fail[0][path]; ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FTX << (path * 4), flag); ++ flag = iqk_info->iqk_rx_fail[0][path]; ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_F_RX << (path * 4), flag); ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD); ++ iqk_info->bp_iqkenable[path] = tmp; ++ tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); ++ iqk_info->bp_txkresult[path] = tmp; ++ tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD); ++ iqk_info->bp_rxkresult[path] = tmp; ++ ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, iqk_info->iqk_times); ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, B_IQKINF_FAIL << (path * 4)); ++ if (tmp) ++ iqk_info->iqk_fail_cnt++; ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_FCNT << (path * 4), ++ iqk_info->iqk_fail_cnt); ++} ++ ++static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool lok_is_fail = false; ++ const int try = 3; ++ u8 ibias = 0x1; ++ u8 i; ++ ++ _iqk_txclk_setting(rtwdev, path); ++ ++ /* LOK */ ++ for (i = 0; i < try; i++) { ++ _lok_res_table(rtwdev, path, ibias++); ++ _iqk_txk_setting(rtwdev, path); ++ lok_is_fail = _iqk_lok(rtwdev, phy_idx, path); ++ if (!lok_is_fail) ++ break; ++ } ++ ++ if (lok_is_fail) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] LOK (%d) fail\n", path); ++ ++ /* TXK */ ++ if (iqk_info->is_nbiqk) ++ iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path); ++ else ++ iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path); ++ ++ /* RX */ ++ _iqk_rxclk_setting(rtwdev, path); ++ _iqk_rxk_setting(rtwdev, path); ++ if (iqk_info->is_nbiqk) ++ iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path); ++ else ++ iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path); ++ ++ _iqk_info_iqk(rtwdev, phy_idx, path); ++} ++ ++static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u32 reg_rf18; ++ u32 reg_35c; ++ u8 idx; ++ u8 get_empty_table = false; ++ ++ for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { ++ if (iqk_info->iqk_mcc_ch[idx][path] == 0) { ++ get_empty_table = true; ++ break; ++ } ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx); ++ ++ if (!get_empty_table) { ++ idx = iqk_info->iqk_table_idx[path] + 1; ++ if (idx > 1) ++ idx = 0; ++ } ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx); ++ ++ reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); ++ reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN); ++ ++ iqk_info->iqk_band[path] = chan->band_type; ++ iqk_info->iqk_bw[path] = chan->band_width; ++ iqk_info->iqk_ch[path] = chan->channel; ++ iqk_info->iqk_mcc_ch[idx][path] = chan->channel; ++ iqk_info->iqk_table_idx[path] = idx; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n", ++ path, reg_rf18, idx); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n", ++ path, reg_rf18); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n", ++ iqk_info->iqk_times, idx); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n", ++ idx, path, iqk_info->iqk_mcc_ch[idx][path]); ++ ++ if (reg_35c == 0x01) ++ iqk_info->syn1to2 = 0x1; ++ else ++ iqk_info->syn1to2 = 0x0; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[IQK]S%x, iqk_info->syn1to2= 0x%x\n", path, ++ iqk_info->syn1to2); ++ ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852B_IQK_VER); ++ /* 2GHz/5GHz/6GHz = 0/1/2 */ ++ rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BAND << (path * 16), ++ iqk_info->iqk_band[path]); ++ /* 20/40/80 = 0/1/2 */ ++ rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BW << (path * 16), ++ iqk_info->iqk_bw[path]); ++ rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_CH << (path * 16), ++ iqk_info->iqk_ch[path]); ++} ++ ++static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ _iqk_by_path(rtwdev, phy_idx, path); ++} ++ ++static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ bool fail; ++ ++ rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, ++ iqk_info->nb_txcfir[path]); ++ rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, ++ iqk_info->nb_rxcfir[path]); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, ++ 0x00000e19 + (path << 4)); ++ fail = _iqk_check_cal(rtwdev, path); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s result =%x\n", __func__, fail); ++ ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS, B_IQK_RES_K, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K1, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3); ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); ++} ++ ++static void _iqk_afebb_restore(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ const struct rtw89_reg3_def *def; ++ int size; ++ u8 kpath; ++ int i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__); ++ ++ kpath = _kpath(rtwdev, phy_idx); ++ ++ switch (kpath) { ++ case RF_A: ++ case RF_B: ++ return; ++ default: ++ size = ARRAY_SIZE(rtw8852b_restore_nondbcc_path01); ++ def = rtw8852b_restore_nondbcc_path01; ++ break; ++ } ++ ++ for (i = 0; i < size; i++, def++) ++ rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); ++} ++ ++static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u8 idx; ++ ++ idx = iqk_info->iqk_table_idx[path]; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (3)idx = %x\n", idx); ++ ++ rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx); ++ ++ rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x54 = 0x%x\n", path, 1 << path, ++ rtw89_phy_read32_mask(rtwdev, R_CFIR_LUT + (path << 8), MASKDWORD)); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x04 = 0x%x\n", path, 1 << path, ++ rtw89_phy_read32_mask(rtwdev, R_COEF_SEL + (path << 8), MASKDWORD)); ++} ++ ++static void _iqk_macbb_setting(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ const struct rtw89_reg3_def *def; ++ int size; ++ u8 kpath; ++ int i; ++ ++ kpath = _kpath(rtwdev, phy_idx); ++ ++ switch (kpath) { ++ case RF_A: ++ case RF_B: ++ return; ++ default: ++ size = ARRAY_SIZE(rtw8852b_set_nondbcc_path01); ++ def = rtw8852b_set_nondbcc_path01; ++ break; ++ } ++ ++ for (i = 0; i < size; i++, def++) ++ rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); ++} ++ ++static void _iqk_init(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u8 idx, path; ++ ++ rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0); ++ if (iqk_info->is_iqk_init) ++ return; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); ++ iqk_info->is_iqk_init = true; ++ iqk_info->is_nbiqk = false; ++ iqk_info->iqk_fft_en = false; ++ iqk_info->iqk_sram_en = false; ++ iqk_info->iqk_cfir_en = false; ++ iqk_info->iqk_xym_en = false; ++ iqk_info->thermal_rek_en = false; ++ iqk_info->iqk_times = 0x0; ++ ++ for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { ++ iqk_info->iqk_channel[idx] = 0x0; ++ for (path = 0; path < RTW8852B_IQK_SS; path++) { ++ iqk_info->lok_cor_fail[idx][path] = false; ++ iqk_info->lok_fin_fail[idx][path] = false; ++ iqk_info->iqk_tx_fail[idx][path] = false; ++ iqk_info->iqk_rx_fail[idx][path] = false; ++ iqk_info->iqk_mcc_ch[idx][path] = 0x0; ++ iqk_info->iqk_table_idx[path] = 0x0; ++ } ++ } ++} ++ ++static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) ++{ ++ u32 rf_mode; ++ u8 path; ++ int ret; ++ ++ for (path = 0; path < RF_PATH_MAX; path++) { ++ if (!(kpath & BIT(path))) ++ continue; ++ ++ ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, ++ rf_mode != 2, 2, 5000, false, ++ rtwdev, path, RR_MOD, RR_MOD_MASK); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret); ++ } ++} ++ ++static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx, ++ bool is_pause) ++{ ++ if (!is_pause) ++ return; ++ ++ _wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx)); ++} ++ ++static void _doiqk(struct rtw89_dev *rtwdev, bool force, ++ enum rtw89_phy_idx phy_idx, u8 path) ++{ ++ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; ++ u32 backup_bb_val[BACKUP_BB_REGS_NR]; ++ u32 backup_rf_val[RTW8852B_IQK_SS][BACKUP_RF_REGS_NR]; ++ u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[IQK]==========IQK strat!!!!!==========\n"); ++ iqk_info->iqk_times++; ++ iqk_info->kcount = 0; ++ iqk_info->version = RTW8852B_IQK_VER; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); ++ _iqk_get_ch_info(rtwdev, phy_idx, path); ++ ++ _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); ++ _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); ++ _iqk_macbb_setting(rtwdev, phy_idx, path); ++ _iqk_preset(rtwdev, path); ++ _iqk_start_iqk(rtwdev, phy_idx, path); ++ _iqk_restore(rtwdev, path); ++ _iqk_afebb_restore(rtwdev, phy_idx, path); ++ _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); ++ _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); ++} ++ ++static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) ++{ ++ u8 kpath = _kpath(rtwdev, phy_idx); ++ ++ switch (kpath) { ++ case RF_A: ++ _doiqk(rtwdev, force, phy_idx, RF_PATH_A); ++ break; ++ case RF_B: ++ _doiqk(rtwdev, force, phy_idx, RF_PATH_B); ++ break; ++ case RF_AB: ++ _doiqk(rtwdev, force, phy_idx, RF_PATH_A); ++ _doiqk(rtwdev, force, phy_idx, RF_PATH_B); ++ break; ++ default: ++ break; ++ } ++} ++ ++static void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 reg[], ++ u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path) ++{ ++ u8 i; ++ ++ for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) { ++ reg_bkup[path][i] = ++ rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", ++ reg[i] + (path << 8), reg_bkup[path][i]); ++ } ++} ++ ++static void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 reg[], ++ const u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path) ++{ ++ u8 i; ++ ++ for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) { ++ rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD, ++ reg_bkup[path][i]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n", ++ reg[i] + (path << 8), reg_bkup[path][i]); ++ } ++} ++ ++static u8 _dpk_order_convert(struct rtw89_dev *rtwdev) ++{ ++ u8 order; ++ u8 val; ++ ++ order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP); ++ val = 0x3 >> order; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val); ++ ++ return val; ++} ++ ++static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ u8 val, kidx = dpk->cur_idx[path]; ++ ++ val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok; ++ ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), ++ MASKBYTE3, _dpk_order_convert(rtwdev) << 1 | val); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, ++ kidx, dpk->is_dpk_enable && !off ? "enable" : "disable"); ++} ++ ++static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, enum rtw8852b_dpk_id id) ++{ ++ u16 dpk_cmd; ++ u32 val; ++ int ret; ++ ++ dpk_cmd = (id << 8) | (0x19 + (path << 4)); ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, ++ 1, 20000, false, ++ rtwdev, 0xbff8, MASKBYTE0); ++ if (ret) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n"); ++ ++ udelay(1); ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000); ++ ++ ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, ++ 1, 2000, false, ++ rtwdev, 0x80fc, MASKLWORD); ++ if (ret) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n"); ++ ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] one-shot for %s = 0x%x\n", ++ id == 0x06 ? "LBK_RXIQK" : ++ id == 0x10 ? "SYNC" : ++ id == 0x11 ? "MDPK_IDL" : ++ id == 0x12 ? "MDPK_MPA" : ++ id == 0x13 ? "GAIN_LOSS" : ++ id == 0x14 ? "PWR_CAL" : ++ id == 0x15 ? "DPK_RXAGC" : ++ id == 0x16 ? "KIP_PRESET" : ++ id == 0x17 ? "KIP_RESTORE" : "DPK_TXAGC", ++ dpk_cmd); ++} ++ ++static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3); ++ _set_rx_dck(rtwdev, phy, path); ++} ++ ++static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ ++ u8 kidx = dpk->cur_idx[path]; ++ ++ dpk->bp[path][kidx].band = chan->band_type; ++ dpk->bp[path][kidx].ch = chan->channel; ++ dpk->bp[path][kidx].bw = chan->band_width; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", ++ path, dpk->cur_idx[path], phy, ++ rtwdev->is_tssi_mode[path] ? "on" : "off", ++ rtwdev->dbcc_en ? "on" : "off", ++ dpk->bp[path][kidx].band == 0 ? "2G" : ++ dpk->bp[path][kidx].band == 1 ? "5G" : "6G", ++ dpk->bp[path][kidx].ch, ++ dpk->bp[path][kidx].bw == 0 ? "20M" : ++ dpk->bp[path][kidx].bw == 1 ? "40M" : "80M"); ++} ++ ++static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kpath) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl); ++ ++ if (chan->band_width == RTW89_CHANNEL_WIDTH_80) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x1); ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); ++} ++ ++static void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kpath) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); ++ ++ if (chan->band_width == RTW89_CHANNEL_WIDTH_80) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x0); ++ } ++} ++ ++static void _dpk_tssi_pause(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path, bool is_pause) ++{ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), ++ B_P0_TSSI_TRK_EN, is_pause); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, ++ is_pause ? "pause" : "resume"); ++} ++ ++static void _dpk_kip_restore(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_kip_defs_tbl); ++ ++ if (rtwdev->hal.cv > CHIP_CAV) ++ rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), B_DPD_COM_OF, 0x1); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); ++} ++ ++static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ u8 cur_rxbb; ++ u32 tmp; ++ ++ cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB); ++ ++ rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0); ++ ++ tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); ++ rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd); ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1); ++ ++ if (cur_rxbb >= 0x11) ++ rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13); ++ else if (cur_rxbb <= 0xa) ++ rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00); ++ else ++ rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05); ++ ++ rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014); ++ udelay(70); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025); ++ ++ _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path, ++ rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD)); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5); ++} ++ ++static void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ ++ rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0); ++ rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); ++ ++ udelay(200); ++ ++ dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n", ++ dpk->bp[path][kidx].ther_dpk); ++} ++ ++static void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain, ++ enum rtw89_rf_path path, u8 kidx) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ ++ if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { ++ rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); ++ rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2); ++ rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); ++ } else { ++ rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); ++ rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5); ++ rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC); ++ rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0); ++ rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800); ++ } ++ ++ rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1); ++ rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] ARF 0x0/0x11/0x1a = 0x%x/ 0x%x/ 0x%x\n", ++ rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK), ++ rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK), ++ rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK)); ++} ++ ++static void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path, bool is_bypass) ++{ ++ if (is_bypass) { ++ rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), ++ B_RXIQC_BYPASS2, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), ++ B_RXIQC_BYPASS, 0x1); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path, ++ rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), ++ MASKDWORD)); ++ } else { ++ rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2); ++ rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path, ++ rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), ++ MASKDWORD)); ++ } ++} ++ ++static ++void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ ++ if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) ++ rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F); ++ else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) ++ rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n", ++ dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : ++ dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); ++} ++ ++static void _dpk_table_select(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path, u8 kidx, u8 gain) ++{ ++ u8 val; ++ ++ val = 0x80 + kidx * 0x20 + gain * 0x10; ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx, ++ gain, val); ++} ++ ++static bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) ++{ ++#define DPK_SYNC_TH_DC_I 200 ++#define DPK_SYNC_TH_DC_Q 200 ++#define DPK_SYNC_TH_CORR 170 ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ u16 dc_i, dc_q; ++ u8 corr_val, corr_idx; ++ ++ rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL); ++ ++ corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI); ++ corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] S%d Corr_idx / Corr_val = %d / %d\n", ++ path, corr_idx, corr_val); ++ ++ dpk->corr_idx[path][kidx] = corr_idx; ++ dpk->corr_val[path][kidx] = corr_val; ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); ++ ++ dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); ++ dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); ++ ++ dc_i = abs(sign_extend32(dc_i, 11)); ++ dc_q = abs(sign_extend32(dc_q, 11)); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n", ++ path, dc_i, dc_q); ++ ++ dpk->dc_i[path][kidx] = dc_i; ++ dpk->dc_q[path][kidx] = dc_q; ++ ++ if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q || ++ corr_val < DPK_SYNC_TH_CORR) ++ return true; ++ else ++ return false; ++} ++ ++static bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx) ++{ ++ _dpk_one_shot(rtwdev, phy, path, SYNC); ++ ++ return _dpk_sync_check(rtwdev, path, kidx); ++} ++ ++static u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) ++{ ++ u16 dgain; ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); ++ ++ dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain); ++ ++ return dgain; ++} ++ ++static s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain) ++{ ++ static const u16 bnd[15] = { ++ 0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556, ++ 0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220 ++ }; ++ s8 offset; ++ ++ if (dgain >= bnd[0]) ++ offset = 0x6; ++ else if (bnd[0] > dgain && dgain >= bnd[1]) ++ offset = 0x6; ++ else if (bnd[1] > dgain && dgain >= bnd[2]) ++ offset = 0x5; ++ else if (bnd[2] > dgain && dgain >= bnd[3]) ++ offset = 0x4; ++ else if (bnd[3] > dgain && dgain >= bnd[4]) ++ offset = 0x3; ++ else if (bnd[4] > dgain && dgain >= bnd[5]) ++ offset = 0x2; ++ else if (bnd[5] > dgain && dgain >= bnd[6]) ++ offset = 0x1; ++ else if (bnd[6] > dgain && dgain >= bnd[7]) ++ offset = 0x0; ++ else if (bnd[7] > dgain && dgain >= bnd[8]) ++ offset = 0xff; ++ else if (bnd[8] > dgain && dgain >= bnd[9]) ++ offset = 0xfe; ++ else if (bnd[9] > dgain && dgain >= bnd[10]) ++ offset = 0xfd; ++ else if (bnd[10] > dgain && dgain >= bnd[11]) ++ offset = 0xfc; ++ else if (bnd[11] > dgain && dgain >= bnd[12]) ++ offset = 0xfb; ++ else if (bnd[12] > dgain && dgain >= bnd[13]) ++ offset = 0xfa; ++ else if (bnd[13] > dgain && dgain >= bnd[14]) ++ offset = 0xf9; ++ else if (bnd[14] > dgain) ++ offset = 0xf8; ++ else ++ offset = 0x0; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset); ++ ++ return offset; ++} ++ ++static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) ++{ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); ++ ++ return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); ++} ++ ++static void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx) ++{ ++ _dpk_table_select(rtwdev, path, kidx, 1); ++ _dpk_one_shot(rtwdev, phy, path, GAIN_LOSS); ++} ++ ++static void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx) ++{ ++ _dpk_tpg_sel(rtwdev, path, kidx); ++ _dpk_one_shot(rtwdev, phy, path, KIP_PRESET); ++} ++ ++static void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev, ++ enum rtw89_rf_path path) ++{ ++ rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a); ++ rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n"); ++} ++ ++static void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 txagc) ++{ ++ rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, txagc); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ _dpk_one_shot(rtwdev, phy, path, DPK_TXAGC); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc); ++} ++ ++static void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ u32 tmp; ++ ++ tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, tmp); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ++ _dpk_one_shot(rtwdev, phy, path, DPK_RXAGC); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL_V1, 0x8); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] set RXBB = 0x%x (RF0x0[9:5] = 0x%x)\n", ++ rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB_V1), ++ rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB)); ++} ++ ++static u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, s8 gain_offset) ++{ ++ u8 txagc; ++ ++ txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK); ++ ++ if (txagc - gain_offset < DPK_TXAGC_LOWER) ++ txagc = DPK_TXAGC_LOWER; ++ else if (txagc - gain_offset > DPK_TXAGC_UPPER) ++ txagc = DPK_TXAGC_UPPER; ++ else ++ txagc = txagc - gain_offset; ++ ++ _dpk_kip_set_txagc(rtwdev, phy, path, txagc); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n", ++ gain_offset, txagc); ++ return txagc; ++} ++ ++static bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) ++{ ++ u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; ++ u8 i; ++ ++ rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08); ++ ++ if (is_check) { ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); ++ val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); ++ val1_i = abs(sign_extend32(val1_i, 11)); ++ val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); ++ val1_q = abs(sign_extend32(val1_q, 11)); ++ ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); ++ val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); ++ val2_i = abs(sign_extend32(val2_i, 11)); ++ val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); ++ val2_q = abs(sign_extend32(val2_q, 11)); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", ++ phy_div(val1_i * val1_i + val1_q * val1_q, ++ val2_i * val2_i + val2_q * val2_q)); ++ } else { ++ for (i = 0; i < 32; i++) { ++ rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] PAS_Read[%02d]= 0x%08x\n", i, ++ rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); ++ } ++ } ++ ++ if (val1_i * val1_i + val1_q * val1_q >= ++ (val2_i * val2_i + val2_q * val2_q) * 8 / 5) ++ return true; ++ ++ return false; ++} ++ ++static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx, u8 init_txagc, ++ bool loss_only) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 step = DPK_AGC_STEP_SYNC_DGAIN; ++ u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0; ++ u8 goout = 0, agc_cnt = 0, limited_rxbb = 0; ++ u16 dgain = 0; ++ s8 offset; ++ int limit = 200; ++ ++ tmp_txagc = init_txagc; ++ ++ do { ++ switch (step) { ++ case DPK_AGC_STEP_SYNC_DGAIN: ++ if (_dpk_sync(rtwdev, phy, path, kidx)) { ++ tmp_txagc = 0xff; ++ goout = 1; ++ break; ++ } ++ ++ dgain = _dpk_dgain_read(rtwdev); ++ ++ if (loss_only == 1 || limited_rxbb == 1) ++ step = DPK_AGC_STEP_GAIN_LOSS_IDX; ++ else ++ step = DPK_AGC_STEP_GAIN_ADJ; ++ break; ++ ++ case DPK_AGC_STEP_GAIN_ADJ: ++ tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, ++ RFREG_MASKRXBB); ++ offset = _dpk_dgain_mapping(rtwdev, dgain); ++ ++ if (tmp_rxbb + offset > 0x1f) { ++ tmp_rxbb = 0x1f; ++ limited_rxbb = 1; ++ } else if (tmp_rxbb + offset < 0) { ++ tmp_rxbb = 0; ++ limited_rxbb = 1; ++ } else { ++ tmp_rxbb = tmp_rxbb + offset; ++ } ++ ++ rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB, ++ tmp_rxbb); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb); ++ if (offset || agc_cnt == 0) { ++ if (chan->band_width < RTW89_CHANNEL_WIDTH_80) ++ _dpk_bypass_rxcfir(rtwdev, path, true); ++ else ++ _dpk_lbk_rxiqk(rtwdev, phy, path); ++ } ++ if (dgain > 1922 || dgain < 342) ++ step = DPK_AGC_STEP_SYNC_DGAIN; ++ else ++ step = DPK_AGC_STEP_GAIN_LOSS_IDX; ++ ++ agc_cnt++; ++ break; ++ ++ case DPK_AGC_STEP_GAIN_LOSS_IDX: ++ _dpk_gainloss(rtwdev, phy, path, kidx); ++ tmp_gl_idx = _dpk_gainloss_read(rtwdev); ++ ++ if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) || ++ tmp_gl_idx >= 7) ++ step = DPK_AGC_STEP_GL_GT_CRITERION; ++ else if (tmp_gl_idx == 0) ++ step = DPK_AGC_STEP_GL_LT_CRITERION; ++ else ++ step = DPK_AGC_STEP_SET_TX_GAIN; ++ break; ++ ++ case DPK_AGC_STEP_GL_GT_CRITERION: ++ if (tmp_txagc == 0x2e) { ++ goout = 1; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Txagc@lower bound!!\n"); ++ } else { ++ tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0x3); ++ } ++ step = DPK_AGC_STEP_GAIN_LOSS_IDX; ++ agc_cnt++; ++ break; ++ ++ case DPK_AGC_STEP_GL_LT_CRITERION: ++ if (tmp_txagc == 0x3f) { ++ goout = 1; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Txagc@upper bound!!\n"); ++ } else { ++ tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0xfe); ++ } ++ step = DPK_AGC_STEP_GAIN_LOSS_IDX; ++ agc_cnt++; ++ break; ++ case DPK_AGC_STEP_SET_TX_GAIN: ++ tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_gl_idx); ++ goout = 1; ++ agc_cnt++; ++ break; ++ ++ default: ++ goout = 1; ++ break; ++ } ++ } while (!goout && agc_cnt < 6 && limit-- > 0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc, ++ tmp_rxbb); ++ ++ return tmp_txagc; ++} ++ ++static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order) ++{ ++ switch (order) { ++ case 0: ++ rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); ++ rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3); ++ rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1); ++ break; ++ case 1: ++ rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); ++ rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); ++ rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); ++ break; ++ case 2: ++ rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); ++ rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); ++ rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); ++ break; ++ default: ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Wrong MDPD order!!(0x%x)\n", order); ++ break; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Set MDPD order to 0x%x for IDL\n", order); ++} ++ ++static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx, u8 gain) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ ++ if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 && ++ dpk->bp[path][kidx].band == RTW89_BAND_5G) ++ _dpk_set_mdpd_para(rtwdev, 0x2); ++ else ++ _dpk_set_mdpd_para(rtwdev, 0x0); ++ ++ _dpk_one_shot(rtwdev, phy, path, MDPK_IDL); ++} ++ ++static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ const u16 pwsf = 0x78; ++ u8 gs = dpk->dpk_gs[phy]; ++ ++ rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), ++ B_COEF_SEL_MDPD, kidx); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc, ++ pwsf, gs); ++ ++ dpk->bp[path][kidx].txagc_dpk = txagc; ++ rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8), ++ 0x3F << ((gain << 3) + (kidx << 4)), txagc); ++ ++ dpk->bp[path][kidx].pwsf = pwsf; ++ rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), ++ 0x1FF << (gain << 4), pwsf); ++ ++ rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0); ++ ++ dpk->bp[path][kidx].gs = gs; ++ if (dpk->dpk_gs[phy] == 0x7f) ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), ++ MASKDWORD, 0x007f7f7f); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), ++ MASKDWORD, 0x005b5b5b); ++ ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), ++ B_DPD_ORDER_V1, _dpk_order_convert(rtwdev)); ++ rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0); ++} ++ ++static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ bool is_reload = false; ++ u8 idx, cur_band, cur_ch; ++ ++ cur_band = chan->band_type; ++ cur_ch = chan->channel; ++ ++ for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) { ++ if (cur_band != dpk->bp[path][idx].band || ++ cur_ch != dpk->bp[path][idx].ch) ++ continue; ++ ++ rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), ++ B_COEF_SEL_MDPD, idx); ++ dpk->cur_idx[path] = idx; ++ is_reload = true; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] reload S%d[%d] success\n", path, idx); ++ } ++ ++ return is_reload; ++} ++ ++static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u8 gain) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ u8 txagc = 0x38, kidx = dpk->cur_idx[path]; ++ bool is_fail = false; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx); ++ ++ _rfk_rf_direct_cntrl(rtwdev, path, false); ++ _rfk_drf_direct_cntrl(rtwdev, path, false); ++ ++ _dpk_kip_pwr_clk_on(rtwdev, path); ++ _dpk_kip_set_txagc(rtwdev, phy, path, txagc); ++ _dpk_rf_setting(rtwdev, gain, path, kidx); ++ _dpk_rx_dck(rtwdev, phy, path); ++ ++ _dpk_kip_preset(rtwdev, phy, path, kidx); ++ _dpk_kip_set_rxagc(rtwdev, phy, path); ++ _dpk_table_select(rtwdev, path, kidx, gain); ++ ++ txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust txagc = 0x%x\n", txagc); ++ ++ if (txagc == 0xff) { ++ is_fail = true; ++ } else { ++ _dpk_get_thermal(rtwdev, kidx, path); ++ ++ _dpk_idl_mpa(rtwdev, phy, path, kidx, gain); ++ ++ rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); ++ ++ _dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc); ++ } ++ ++ if (!is_fail) ++ dpk->bp[path][kidx].path_ok = true; ++ else ++ dpk->bp[path][kidx].path_ok = false; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx, ++ is_fail ? "Check" : "Success"); ++ ++ return is_fail; ++} ++ ++static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force, ++ enum rtw89_phy_idx phy, u8 kpath) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120}; ++ u32 kip_bkup[RTW8852B_DPK_RF_PATH][RTW8852B_DPK_KIP_REG_NUM] = {}; ++ u32 backup_rf_val[RTW8852B_DPK_RF_PATH][BACKUP_RF_REGS_NR]; ++ u32 backup_bb_val[BACKUP_BB_REGS_NR]; ++ bool is_fail = true, reloaded[RTW8852B_DPK_RF_PATH] = {}; ++ u8 path; ++ ++ if (dpk->is_dpk_reload_en) { ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { ++ reloaded[path] = _dpk_reload_check(rtwdev, phy, path); ++ if (!reloaded[path] && dpk->bp[path][0].ch) ++ dpk->cur_idx[path] = !dpk->cur_idx[path]; ++ else ++ _dpk_onoff(rtwdev, path, false); ++ } ++ } else { ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) ++ dpk->cur_idx[path] = 0; ++ } ++ ++ _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); ++ ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { ++ _dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path); ++ _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); ++ _dpk_information(rtwdev, phy, path); ++ if (rtwdev->is_tssi_mode[path]) ++ _dpk_tssi_pause(rtwdev, path, true); ++ } ++ ++ _dpk_bb_afe_setting(rtwdev, phy, path, kpath); ++ ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { ++ is_fail = _dpk_main(rtwdev, phy, path, 1); ++ _dpk_onoff(rtwdev, path, is_fail); ++ } ++ ++ _dpk_bb_afe_restore(rtwdev, phy, path, kpath); ++ _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); ++ ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { ++ _dpk_kip_restore(rtwdev, path); ++ _dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path); ++ _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); ++ if (rtwdev->is_tssi_mode[path]) ++ _dpk_tssi_pause(rtwdev, path, false); ++ } ++} ++ ++static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_fem_info *fem = &rtwdev->fem; ++ ++ if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Skip DPK due to 2G_ext_PA exist!!\n"); ++ return true; ++ } else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Skip DPK due to 5G_ext_PA exist!!\n"); ++ return true; ++ } else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] Skip DPK due to 6G_ext_PA exist!!\n"); ++ return true; ++ } ++ ++ return false; ++} ++ ++static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ u8 path, kpath; ++ ++ kpath = _kpath(rtwdev, phy); ++ ++ for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { ++ if (kpath & BIT(path)) ++ _dpk_onoff(rtwdev, path, true); ++ } ++} ++ ++static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force) ++{ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n", ++ RTW8852B_DPK_VER, rtwdev->hal.cv, ++ RTW8852B_RF_REL_VERSION); ++ ++ if (_dpk_bypass_check(rtwdev, phy)) ++ _dpk_force_bypass(rtwdev, phy); ++ else ++ _dpk_cal_select(rtwdev, force, phy, RF_AB); ++} ++ ++static void _dpk_track(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst; ++ s8 delta_ther[2] = {}; ++ u8 trk_idx, txagc_rf; ++ u8 path, kidx; ++ u16 pwsf[2]; ++ u8 cur_ther; ++ u32 tmp; ++ ++ for (path = 0; path < RF_PATH_NUM_8852B; path++) { ++ kidx = dpk->cur_idx[path]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", ++ path, kidx, dpk->bp[path][kidx].ch); ++ ++ cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] thermal now = %d\n", cur_ther); ++ ++ if (dpk->bp[path][kidx].ch && cur_ther) ++ delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther; ++ ++ if (dpk->bp[path][kidx].band == RTW89_BAND_2G) ++ delta_ther[path] = delta_ther[path] * 3 / 2; ++ else ++ delta_ther[path] = delta_ther[path] * 5 / 2; ++ ++ txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), ++ 0x0000003f); ++ ++ if (rtwdev->is_tssi_mode[path]) { ++ trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n", ++ txagc_rf, trk_idx); ++ ++ txagc_bb = ++ rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), ++ MASKBYTE2); ++ txagc_bb_tp = ++ rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13), ++ B_TXAGC_TP); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", ++ txagc_bb_tp, txagc_bb); ++ ++ txagc_ofst = ++ rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), ++ MASKBYTE3); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n", ++ txagc_ofst, delta_ther[path]); ++ tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8), ++ B_DPD_COM_OF); ++ if (tmp == 0x1) { ++ txagc_ofst = 0; ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] HW txagc offset mode\n"); ++ } ++ ++ if (txagc_rf && cur_ther) ++ ini_diff = txagc_ofst + (delta_ther[path]); ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, ++ R_P0_TXDPD + (path << 13), ++ B_P0_TXDPD); ++ if (tmp == 0x0) { ++ pwsf[0] = dpk->bp[path][kidx].pwsf + ++ txagc_bb_tp - txagc_bb + ini_diff; ++ pwsf[1] = dpk->bp[path][kidx].pwsf + ++ txagc_bb_tp - txagc_bb + ini_diff; ++ } else { ++ pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff; ++ pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff; ++ } ++ ++ } else { ++ pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; ++ pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; ++ } ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS); ++ if (!tmp && txagc_rf) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, ++ "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n", ++ pwsf[0], pwsf[1]); ++ ++ rtw89_phy_write32_mask(rtwdev, ++ R_DPD_BND + (path << 8) + (kidx << 2), ++ B_DPD_BND_0, pwsf[0]); ++ rtw89_phy_write32_mask(rtwdev, ++ R_DPD_BND + (path << 8) + (kidx << 2), ++ B_DPD_BND_1, pwsf[1]); ++ } ++ } ++} ++ ++static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ struct rtw89_dpk_info *dpk = &rtwdev->dpk; ++ u8 tx_scale, ofdm_bkof, path, kpath; ++ ++ kpath = _kpath(rtwdev, phy); ++ ++ ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM); ++ tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA); ++ ++ if (ofdm_bkof + tx_scale >= 44) { ++ /* move dpd backoff to bb, and set dpd backoff to 0 */ ++ dpk->dpk_gs[phy] = 0x7f; ++ for (path = 0; path < RF_PATH_NUM_8852B; path++) { ++ if (!(kpath & BIT(path))) ++ continue; ++ ++ rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8), ++ B_DPD_CFG, 0x7f7f7f); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK] Set S%d DPD backoff to 0dB\n", path); ++ } ++ } else { ++ dpk->dpk_gs[phy] = 0x5b; ++ } ++} ++ ++static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ enum rtw89_band band = chan->band_type; ++ ++ if (band == RTW89_BAND_2G) ++ rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1); ++ else ++ rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1); ++} ++ ++static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ enum rtw89_band band = chan->band_type; ++ ++ rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl); ++ ++ if (path == RF_PATH_A) ++ rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, ++ &rtw8852b_tssi_sys_a_defs_2g_tbl, ++ &rtw8852b_tssi_sys_a_defs_5g_tbl); ++ else ++ rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, ++ &rtw8852b_tssi_sys_b_defs_2g_tbl, ++ &rtw8852b_tssi_sys_b_defs_5g_tbl); ++} ++ ++static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_tssi_init_txpwr_defs_a_tbl, ++ &rtw8852b_tssi_init_txpwr_defs_b_tbl); ++} ++ ++static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl, ++ &rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl); ++} ++ ++static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_tssi_dck_defs_a_tbl, ++ &rtw8852b_tssi_dck_defs_b_tbl); ++} ++ ++static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++#define RTW8852B_TSSI_GET_VAL(ptr, idx) \ ++({ \ ++ s8 *__ptr = (ptr); \ ++ u8 __idx = (idx), __i, __v; \ ++ u32 __val = 0; \ ++ for (__i = 0; __i < 4; __i++) { \ ++ __v = (__ptr[__idx + __i]); \ ++ __val |= (__v << (8 * __i)); \ ++ } \ ++ __val; \ ++}) ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 ch = chan->channel; ++ u8 subband = chan->subband_type; ++ const s8 *thm_up_a = NULL; ++ const s8 *thm_down_a = NULL; ++ const s8 *thm_up_b = NULL; ++ const s8 *thm_down_b = NULL; ++ u8 thermal = 0xff; ++ s8 thm_ofst[64] = {0}; ++ u32 tmp = 0; ++ u8 i, j; ++ ++ switch (subband) { ++ default: ++ case RTW89_CH_2G: ++ thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_p; ++ thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_n; ++ thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_p; ++ thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_n; ++ break; ++ case RTW89_CH_5G_BAND_1: ++ thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[0]; ++ thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[0]; ++ thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[0]; ++ thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[0]; ++ break; ++ case RTW89_CH_5G_BAND_3: ++ thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[1]; ++ thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[1]; ++ thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[1]; ++ thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[1]; ++ break; ++ case RTW89_CH_5G_BAND_4: ++ thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[2]; ++ thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[2]; ++ thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[2]; ++ thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[2]; ++ break; ++ } ++ ++ if (path == RF_PATH_A) { ++ thermal = tssi_info->thermal[RF_PATH_A]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); ++ ++ if (thermal == 0xff) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); ++ ++ for (i = 0; i < 64; i += 4) { ++ rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] write 0x%x val=0x%08x\n", ++ R_P0_TSSI_BASE + i, 0x0); ++ } ++ ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, ++ thermal); ++ ++ i = 0; ++ for (j = 0; j < 32; j++) ++ thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? ++ -thm_down_a[i++] : ++ -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; ++ ++ i = 1; ++ for (j = 63; j >= 32; j--) ++ thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? ++ thm_up_a[i++] : ++ thm_up_a[DELTA_SWINGIDX_SIZE - 1]; ++ ++ for (i = 0; i < 64; i += 4) { ++ tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i); ++ rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] write 0x%x val=0x%08x\n", ++ 0x5c00 + i, tmp); ++ } ++ } ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); ++ ++ } else { ++ thermal = tssi_info->thermal[RF_PATH_B]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1); ++ ++ if (thermal == 0xff) { ++ rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32); ++ ++ for (i = 0; i < 64; i += 4) { ++ rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] write 0x%x val=0x%08x\n", ++ 0x7c00 + i, 0x0); ++ } ++ ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, ++ thermal); ++ ++ i = 0; ++ for (j = 0; j < 32; j++) ++ thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? ++ -thm_down_b[i++] : ++ -thm_down_b[DELTA_SWINGIDX_SIZE - 1]; ++ ++ i = 1; ++ for (j = 63; j >= 32; j--) ++ thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? ++ thm_up_b[i++] : ++ thm_up_b[DELTA_SWINGIDX_SIZE - 1]; ++ ++ for (i = 0; i < 64; i += 4) { ++ tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i); ++ rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] write 0x%x val=0x%08x\n", ++ 0x7c00 + i, tmp); ++ } ++ } ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0); ++ } ++#undef RTW8852B_TSSI_GET_VAL ++} ++ ++static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_tssi_dac_gain_defs_a_tbl, ++ &rtw8852b_tssi_dac_gain_defs_b_tbl); ++} ++ ++static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ enum rtw89_band band = chan->band_type; ++ ++ if (path == RF_PATH_A) ++ rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, ++ &rtw8852b_tssi_slope_a_defs_2g_tbl, ++ &rtw8852b_tssi_slope_a_defs_5g_tbl); ++ else ++ rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, ++ &rtw8852b_tssi_slope_b_defs_2g_tbl, ++ &rtw8852b_tssi_slope_b_defs_5g_tbl); ++} ++ ++static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, bool all) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ enum rtw89_band band = chan->band_type; ++ const struct rtw89_rfk_tbl *tbl = NULL; ++ u8 ch = chan->channel; ++ ++ if (path == RF_PATH_A) { ++ if (band == RTW89_BAND_2G) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_a_2g_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_a_2g_part_defs_tbl; ++ } else if (ch >= 36 && ch <= 64) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_a_5g1_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_a_5g1_part_defs_tbl; ++ } else if (ch >= 100 && ch <= 144) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_a_5g2_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_a_5g2_part_defs_tbl; ++ } else if (ch >= 149 && ch <= 177) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_a_5g3_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_a_5g3_part_defs_tbl; ++ } ++ } else { ++ if (ch >= 1 && ch <= 14) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_b_2g_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_b_2g_part_defs_tbl; ++ } else if (ch >= 36 && ch <= 64) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_b_5g1_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_b_5g1_part_defs_tbl; ++ } else if (ch >= 100 && ch <= 144) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_b_5g2_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_b_5g2_part_defs_tbl; ++ } else if (ch >= 149 && ch <= 177) { ++ if (all) ++ tbl = &rtw8852b_tssi_align_b_5g3_all_defs_tbl; ++ else ++ tbl = &rtw8852b_tssi_align_b_5g3_part_defs_tbl; ++ } ++ } ++ ++ if (tbl) ++ rtw89_rfk_parser(rtwdev, tbl); ++} ++ ++static void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, ++ &rtw8852b_tssi_slope_defs_a_tbl, ++ &rtw8852b_tssi_slope_defs_b_tbl); ++} ++ ++static void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ if (path == RF_PATH_A) ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0); ++} ++ ++static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s path=%d\n", __func__, ++ path); ++ ++ if (path == RF_PATH_A) ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_MIX, 0x010); ++ else ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_RFCTM_DEL, 0x010); ++} ++ ++static void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ u8 i; ++ ++ for (i = 0; i < RF_PATH_NUM_8852B; i++) { ++ _tssi_set_tssi_track(rtwdev, phy, i); ++ _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i); ++ ++ if (i == RF_PATH_A) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, ++ B_P0_TSSI_MV_CLR, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, ++ B_P0_TSSI_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, ++ B_P0_TSSI_EN, 0x1); ++ rtw89_write_rf(rtwdev, i, RR_TXGA_V1, ++ RR_TXGA_V1_TRK_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, ++ B_P0_TSSI_RFC, 0x3); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, ++ B_P0_TSSI_OFT, 0xc0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, ++ B_P0_TSSI_OFT_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, ++ B_P0_TSSI_OFT_EN, 0x1); ++ ++ rtwdev->is_tssi_mode[RF_PATH_A] = true; ++ } else { ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, ++ B_P1_TSSI_MV_CLR, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, ++ B_P1_TSSI_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, ++ B_P1_TSSI_EN, 0x1); ++ rtw89_write_rf(rtwdev, i, RR_TXGA_V1, ++ RR_TXGA_V1_TRK_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, ++ B_P1_TSSI_RFC, 0x3); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, ++ B_P1_TSSI_OFT, 0xc0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, ++ B_P1_TSSI_OFT_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, ++ B_P1_TSSI_OFT_EN, 0x1); ++ ++ rtwdev->is_tssi_mode[RF_PATH_B] = true; ++ } ++ } ++} ++ ++static void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1); ++ ++ rtwdev->is_tssi_mode[RF_PATH_A] = false; ++ rtwdev->is_tssi_mode[RF_PATH_B] = false; ++} ++ ++static u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) ++{ ++ switch (ch) { ++ case 1 ... 2: ++ return 0; ++ case 3 ... 5: ++ return 1; ++ case 6 ... 8: ++ return 2; ++ case 9 ... 11: ++ return 3; ++ case 12 ... 13: ++ return 4; ++ case 14: ++ return 5; ++ } ++ ++ return 0; ++} ++ ++#define TSSI_EXTRA_GROUP_BIT (BIT(31)) ++#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) ++#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) ++#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) ++#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) ++ ++static u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) ++{ ++ switch (ch) { ++ case 1 ... 2: ++ return 0; ++ case 3 ... 5: ++ return 1; ++ case 6 ... 8: ++ return 2; ++ case 9 ... 11: ++ return 3; ++ case 12 ... 14: ++ return 4; ++ case 36 ... 40: ++ return 5; ++ case 41 ... 43: ++ return TSSI_EXTRA_GROUP(5); ++ case 44 ... 48: ++ return 6; ++ case 49 ... 51: ++ return TSSI_EXTRA_GROUP(6); ++ case 52 ... 56: ++ return 7; ++ case 57 ... 59: ++ return TSSI_EXTRA_GROUP(7); ++ case 60 ... 64: ++ return 8; ++ case 100 ... 104: ++ return 9; ++ case 105 ... 107: ++ return TSSI_EXTRA_GROUP(9); ++ case 108 ... 112: ++ return 10; ++ case 113 ... 115: ++ return TSSI_EXTRA_GROUP(10); ++ case 116 ... 120: ++ return 11; ++ case 121 ... 123: ++ return TSSI_EXTRA_GROUP(11); ++ case 124 ... 128: ++ return 12; ++ case 129 ... 131: ++ return TSSI_EXTRA_GROUP(12); ++ case 132 ... 136: ++ return 13; ++ case 137 ... 139: ++ return TSSI_EXTRA_GROUP(13); ++ case 140 ... 144: ++ return 14; ++ case 149 ... 153: ++ return 15; ++ case 154 ... 156: ++ return TSSI_EXTRA_GROUP(15); ++ case 157 ... 161: ++ return 16; ++ case 162 ... 164: ++ return TSSI_EXTRA_GROUP(16); ++ case 165 ... 169: ++ return 17; ++ case 170 ... 172: ++ return TSSI_EXTRA_GROUP(17); ++ case 173 ... 177: ++ return 18; ++ } ++ ++ return 0; ++} ++ ++static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) ++{ ++ switch (ch) { ++ case 1 ... 8: ++ return 0; ++ case 9 ... 14: ++ return 1; ++ case 36 ... 48: ++ return 2; ++ case 52 ... 64: ++ return 3; ++ case 100 ... 112: ++ return 4; ++ case 116 ... 128: ++ return 5; ++ case 132 ... 144: ++ return 6; ++ case 149 ... 177: ++ return 7; ++ } ++ ++ return 0; ++} ++ ++static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 ch = chan->channel; ++ u32 gidx, gidx_1st, gidx_2nd; ++ s8 de_1st; ++ s8 de_2nd; ++ s8 val; ++ ++ gidx = _tssi_get_ofdm_group(rtwdev, ch); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx); ++ ++ if (IS_TSSI_EXTRA_GROUP(gidx)) { ++ gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); ++ gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); ++ de_1st = tssi_info->tssi_mcs[path][gidx_1st]; ++ de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; ++ val = (de_1st + de_2nd) / 2; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", ++ path, val, de_1st, de_2nd); ++ } else { ++ val = tssi_info->tssi_mcs[path][gidx]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); ++ } ++ ++ return val; ++} ++ ++static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 ch = chan->channel; ++ u32 tgidx, tgidx_1st, tgidx_2nd; ++ s8 tde_1st; ++ s8 tde_2nd; ++ s8 val; ++ ++ tgidx = _tssi_get_trim_group(rtwdev, ch); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", ++ path, tgidx); ++ ++ if (IS_TSSI_EXTRA_GROUP(tgidx)) { ++ tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); ++ tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); ++ tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; ++ tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; ++ val = (tde_1st + tde_2nd) / 2; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", ++ path, val, tde_1st, tde_2nd); ++ } else { ++ val = tssi_info->tssi_trim[path][tgidx]; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", ++ path, val); ++ } ++ ++ return val; ++} ++ ++static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 ch = chan->channel; ++ u8 gidx; ++ s8 ofdm_de; ++ s8 trim_de; ++ s32 val; ++ u32 i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", ++ phy, ch); ++ ++ for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) { ++ gidx = _tssi_get_cck_group(rtwdev, ch); ++ trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); ++ val = tssi_info->tssi_cck[i][gidx] + trim_de; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", ++ i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); ++ ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", ++ _tssi_de_cck_long[i], ++ rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i], ++ _TSSI_DE_MASK)); ++ ++ ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); ++ trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); ++ val = ofdm_de + trim_de; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", ++ i, ofdm_de, trim_de); ++ ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val); ++ rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, ++ "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", ++ _tssi_de_mcs_20m[i], ++ rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i], ++ _TSSI_DE_MASK)); ++ } ++} ++ ++static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) ++{ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n" ++ "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n", ++ R_TSSI_PA_K1 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD), ++ R_TSSI_PA_K2 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD), ++ R_P0_TSSI_ALIM1 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD), ++ R_P0_TSSI_ALIM3 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD), ++ R_TSSI_PA_K5 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD), ++ R_P0_TSSI_ALIM2 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD), ++ R_P0_TSSI_ALIM4 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD), ++ R_TSSI_PA_K8 + (path << 13), ++ rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD)); ++} ++ ++static void _tssi_alimentk_done(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, enum rtw89_rf_path path) ++{ ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 channel = chan->channel; ++ u8 band; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======>%s phy=%d path=%d\n", __func__, phy, path); ++ ++ if (channel >= 1 && channel <= 14) ++ band = TSSI_ALIMK_2G; ++ else if (channel >= 36 && channel <= 64) ++ band = TSSI_ALIMK_5GL; ++ else if (channel >= 100 && channel <= 144) ++ band = TSSI_ALIMK_5GM; ++ else if (channel >= 149 && channel <= 177) ++ band = TSSI_ALIMK_5GH; ++ else ++ band = TSSI_ALIMK_2G; ++ ++ if (tssi_info->alignment_done[path][band]) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, ++ tssi_info->alignment_value[path][band][0]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, ++ tssi_info->alignment_value[path][band][1]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, ++ tssi_info->alignment_value[path][band][2]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, ++ tssi_info->alignment_value[path][band][3]); ++ } ++ ++ _tssi_alimentk_dump_result(rtwdev, path); ++} ++ ++static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm, ++ u8 enable) ++{ ++ enum rtw89_rf_path_bit rx_path; ++ ++ if (path == RF_PATH_A) ++ rx_path = RF_A; ++ else if (path == RF_PATH_B) ++ rx_path = RF_B; ++ else if (path == RF_PATH_AB) ++ rx_path = RF_AB; ++ else ++ rx_path = RF_ABCD; /* don't change path, but still set others */ ++ ++ if (enable) { ++ rtw8852b_bb_set_plcp_tx(rtwdev); ++ rtw8852b_bb_cfg_tx_path(rtwdev, path); ++ rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path); ++ rtw8852b_bb_set_power(rtwdev, pwr_dbm, phy); ++ } ++ ++ rtw8852b_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy); ++} ++ ++static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, const u32 reg[], ++ u32 reg_backup[], u32 reg_num) ++{ ++ u32 i; ++ ++ for (i = 0; i < reg_num; i++) { ++ reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i], ++ reg_backup[i]); ++ } ++} ++ ++static void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, const u32 reg[], ++ u32 reg_backup[], u32 reg_num) ++ ++{ ++ u32 i; ++ ++ for (i = 0; i < reg_num; i++) { ++ rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i], ++ reg_backup[i]); ++ } ++} ++ ++static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel) ++{ ++ u8 channel_index; ++ ++ if (channel >= 1 && channel <= 14) ++ channel_index = channel - 1; ++ else if (channel >= 36 && channel <= 64) ++ channel_index = (channel - 36) / 2 + 14; ++ else if (channel >= 100 && channel <= 144) ++ channel_index = ((channel - 100) / 2) + 15 + 14; ++ else if (channel >= 149 && channel <= 177) ++ channel_index = ((channel - 149) / 2) + 38 + 14; ++ else ++ channel_index = 0; ++ ++ return channel_index; ++} ++ ++static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path, const s16 *power, ++ u32 *tssi_cw_rpt) ++{ ++ u32 tx_counter, tx_counter_tmp; ++ const int retry = 100; ++ u32 tmp; ++ int j, k; ++ ++ for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) { ++ rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1); ++ ++ tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] 0x%x = 0x%08x path=%d\n", ++ _tssi_trigger[path], tmp, path); ++ ++ if (j == 0) ++ _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true); ++ else ++ _tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true); ++ ++ tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); ++ tx_counter_tmp -= tx_counter; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] First HWTXcounter=%d path=%d\n", ++ tx_counter_tmp, path); ++ ++ for (k = 0; k < retry; k++) { ++ tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], ++ B_TSSI_CWRPT_RDY); ++ if (tmp) ++ break; ++ ++ udelay(30); ++ ++ tx_counter_tmp = ++ rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); ++ tx_counter_tmp -= tx_counter; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n", ++ k, tx_counter_tmp, path); ++ } ++ ++ if (k >= retry) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n", ++ k, path); ++ ++ _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); ++ return false; ++ } ++ ++ tssi_cw_rpt[j] = ++ rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], B_TSSI_CWRPT); ++ ++ _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); ++ ++ tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); ++ tx_counter_tmp -= tx_counter; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] Final HWTXcounter=%d path=%d\n", ++ tx_counter_tmp, path); ++ } ++ ++ return true; ++} ++ ++static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_rf_path path) ++{ ++ static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4, ++ 0x78e4, 0x49c0, 0x0d18, 0x0d80}; ++ static const s16 power_2g[4] = {48, 20, 4, 4}; ++ static const s16 power_5g[4] = {48, 20, 4, 4}; ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3; ++ u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0}; ++ u8 channel = chan->channel; ++ u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel); ++ struct rtw8852b_bb_tssi_bak tssi_bak; ++ s32 aliment_diff, tssi_cw_default; ++ u32 start_time, finish_time; ++ u32 bb_reg_backup[8] = {0}; ++ const s16 *power; ++ u8 band; ++ bool ok; ++ u32 tmp; ++ u8 j; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======> %s channel=%d path=%d\n", __func__, channel, ++ path); ++ ++ if (tssi_info->check_backup_aligmk[path][ch_idx]) { ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, ++ tssi_info->alignment_backup_by_ch[path][ch_idx][0]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, ++ tssi_info->alignment_backup_by_ch[path][ch_idx][1]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, ++ tssi_info->alignment_backup_by_ch[path][ch_idx][2]); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, ++ tssi_info->alignment_backup_by_ch[path][ch_idx][3]); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======> %s Reload TSSI Alignment !!!\n", __func__); ++ _tssi_alimentk_dump_result(rtwdev, path); ++ return; ++ } ++ ++ start_time = ktime_get_ns(); ++ ++ if (chan->band_type == RTW89_BAND_2G) ++ power = power_2g; ++ else ++ power = power_5g; ++ ++ if (channel >= 1 && channel <= 14) ++ band = TSSI_ALIMK_2G; ++ else if (channel >= 36 && channel <= 64) ++ band = TSSI_ALIMK_5GL; ++ else if (channel >= 100 && channel <= 144) ++ band = TSSI_ALIMK_5GM; ++ else if (channel >= 149 && channel <= 177) ++ band = TSSI_ALIMK_5GH; ++ else ++ band = TSSI_ALIMK_2G; ++ ++ rtw8852b_bb_backup_tssi(rtwdev, phy, &tssi_bak); ++ _tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup)); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2); ++ ++ ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt); ++ if (!ok) ++ goto out; ++ ++ for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] power[%d]=%d tssi_cw_rpt[%d]=%d\n", j, ++ power[j], j, tssi_cw_rpt[j]); ++ } ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1], ++ _tssi_cw_default_mask[1]); ++ tssi_cw_default = sign_extend32(tmp, 8); ++ tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) - ++ tssi_cw_rpt[1] + tssi_cw_default; ++ aliment_diff = tssi_alim_offset_1 - tssi_cw_default; ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2], ++ _tssi_cw_default_mask[2]); ++ tssi_cw_default = sign_extend32(tmp, 8); ++ tssi_alim_offset_2 = tssi_cw_default + aliment_diff; ++ ++ tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3], ++ _tssi_cw_default_mask[3]); ++ tssi_cw_default = sign_extend32(tmp, 8); ++ tssi_alim_offset_3 = tssi_cw_default + aliment_diff; ++ ++ if (path == RF_PATH_A) { ++ tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | ++ FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | ++ FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12), ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13)); ++ } else { ++ tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | ++ FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | ++ FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31), ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11), ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12), ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13)); ++ } ++ ++ tssi_info->alignment_done[path][band] = true; ++ tssi_info->alignment_value[path][band][0] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); ++ tssi_info->alignment_value[path][band][1] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); ++ tssi_info->alignment_value[path][band][2] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); ++ tssi_info->alignment_value[path][band][3] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); ++ ++ tssi_info->check_backup_aligmk[path][ch_idx] = true; ++ tssi_info->alignment_backup_by_ch[path][ch_idx][0] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); ++ tssi_info->alignment_backup_by_ch[path][ch_idx][1] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); ++ tssi_info->alignment_backup_by_ch[path][ch_idx][2] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); ++ tssi_info->alignment_backup_by_ch[path][ch_idx][3] = ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n", ++ path, band, R_P0_TSSI_ALIM1 + (path << 13), ++ tssi_info->alignment_value[path][band][0]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n", ++ path, band, R_P0_TSSI_ALIM3 + (path << 13), ++ tssi_info->alignment_value[path][band][1]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n", ++ path, band, R_P0_TSSI_ALIM2 + (path << 13), ++ tssi_info->alignment_value[path][band][2]); ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n", ++ path, band, R_P0_TSSI_ALIM4 + (path << 13), ++ tssi_info->alignment_value[path][band][3]); ++ ++out: ++ _tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup)); ++ rtw8852b_bb_restore_tssi(rtwdev, phy, &tssi_bak); ++ rtw8852b_bb_tx_mode_switch(rtwdev, phy, 0); ++ ++ finish_time = ktime_get_ns(); ++ tssi_info->tssi_alimk_time += finish_time - start_time; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[TSSI PA K] %s processing time = %d ms\n", __func__, ++ tssi_info->tssi_alimk_time); ++} ++ ++void rtw8852b_dpk_init(struct rtw89_dev *rtwdev) ++{ ++ _set_dpd_backoff(rtwdev, RTW89_PHY_0); ++} ++ ++void rtw8852b_rck(struct rtw89_dev *rtwdev) ++{ ++ u8 path; ++ ++ for (path = 0; path < RF_PATH_NUM_8852B; path++) ++ _rck(rtwdev, path); ++} ++ ++void rtw8852b_dack(struct rtw89_dev *rtwdev) ++{ ++ u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0); ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START); ++ _dac_cal(rtwdev, false); ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP); ++} ++ ++void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); ++ u32 tx_en; ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); ++ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); ++ _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); ++ ++ _iqk_init(rtwdev); ++ _iqk(rtwdev, phy_idx, false); ++ ++ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); ++} ++ ++void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); ++ u32 tx_en; ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); ++ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); ++ _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); ++ ++ _rx_dck(rtwdev, phy_idx); ++ ++ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); ++} ++ ++void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) ++{ ++ u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); ++ u32 tx_en; ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); ++ rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); ++ _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); ++ ++ rtwdev->dpk.is_dpk_enable = true; ++ rtwdev->dpk.is_dpk_reload_en = false; ++ _dpk(rtwdev, phy_idx, false); ++ ++ rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); ++} ++ ++void rtw8852b_dpk_track(struct rtw89_dev *rtwdev) ++{ ++ _dpk_track(rtwdev); ++} ++ ++void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en) ++{ ++ u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB); ++ u32 tx_en; ++ u8 i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy); ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); ++ ++ _tssi_disable(rtwdev, phy); ++ ++ for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) { ++ _tssi_rf_setting(rtwdev, phy, i); ++ _tssi_set_sys(rtwdev, phy, i); ++ _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); ++ _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); ++ _tssi_set_dck(rtwdev, phy, i); ++ _tssi_set_tmeter_tbl(rtwdev, phy, i); ++ _tssi_set_dac_gain_tbl(rtwdev, phy, i); ++ _tssi_slope_cal_org(rtwdev, phy, i); ++ _tssi_alignment_default(rtwdev, phy, i, true); ++ _tssi_set_tssi_slope(rtwdev, phy, i); ++ ++ rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); ++ _tmac_tx_pause(rtwdev, phy, true); ++ if (hwtx_en) ++ _tssi_alimentk(rtwdev, phy, i); ++ _tmac_tx_pause(rtwdev, phy, false); ++ rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en); ++ } ++ ++ _tssi_enable(rtwdev, phy); ++ _tssi_set_efuse_to_de(rtwdev, phy); ++ ++ rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); ++} ++ ++void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; ++ u8 channel = chan->channel; ++ u8 band; ++ u32 i; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======>%s phy=%d channel=%d\n", __func__, phy, channel); ++ ++ if (channel >= 1 && channel <= 14) ++ band = TSSI_ALIMK_2G; ++ else if (channel >= 36 && channel <= 64) ++ band = TSSI_ALIMK_5GL; ++ else if (channel >= 100 && channel <= 144) ++ band = TSSI_ALIMK_5GM; ++ else if (channel >= 149 && channel <= 177) ++ band = TSSI_ALIMK_5GH; ++ else ++ band = TSSI_ALIMK_2G; ++ ++ _tssi_disable(rtwdev, phy); ++ ++ for (i = RF_PATH_A; i < RTW8852B_TSSI_PATH_NR; i++) { ++ _tssi_rf_setting(rtwdev, phy, i); ++ _tssi_set_sys(rtwdev, phy, i); ++ _tssi_set_tmeter_tbl(rtwdev, phy, i); ++ ++ if (tssi_info->alignment_done[i][band]) ++ _tssi_alimentk_done(rtwdev, phy, i); ++ else ++ _tssi_alignment_default(rtwdev, phy, i, true); ++ } ++ ++ _tssi_enable(rtwdev, phy); ++ _tssi_set_efuse_to_de(rtwdev, phy); ++} ++ ++static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, bool enable) ++{ ++ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); ++ u8 channel = chan->channel; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n", ++ __func__, channel); ++ ++ if (enable) { ++ if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) ++ rtw8852b_tssi(rtwdev, phy, true); ++ return; ++ } ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", ++ __func__, ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); ++ ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT, 0xc0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0); ++ rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1); ++ ++ _tssi_alimentk_done(rtwdev, phy, RF_PATH_A); ++ _tssi_alimentk_done(rtwdev, phy, RF_PATH_B); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", ++ __func__, ++ rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), ++ rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "======> %s SCAN_END\n", __func__); ++} ++ ++void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start, ++ enum rtw89_phy_idx phy_idx) ++{ ++ if (scan_start) ++ rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true); ++ else ++ rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false); ++} ++ ++static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, ++ enum rtw89_bandwidth bw, bool dav) ++{ ++ u32 rf_reg18; ++ u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); ++ ++ rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); ++ if (rf_reg18 == INV_RF_DATA) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]Invalid RF_0x18 for Path-%d\n", path); ++ return; ++ } ++ rf_reg18 &= ~RR_CFGCH_BW; ++ ++ switch (bw) { ++ case RTW89_CHANNEL_WIDTH_5: ++ case RTW89_CHANNEL_WIDTH_10: ++ case RTW89_CHANNEL_WIDTH_20: ++ rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M); ++ break; ++ case RTW89_CHANNEL_WIDTH_40: ++ rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M); ++ break; ++ case RTW89_CHANNEL_WIDTH_80: ++ rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M); ++ break; ++ default: ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n"); ++ } ++ ++ rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | ++ RR_CFGCH_BW2) & RFREG_MASK; ++ rf_reg18 |= RR_CFGCH_BW2; ++ rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n", ++ bw, path, reg18_addr, ++ rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); ++} ++ ++static void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_bandwidth bw) ++{ ++ _bw_setting(rtwdev, RF_PATH_A, bw, true); ++ _bw_setting(rtwdev, RF_PATH_B, bw, true); ++ _bw_setting(rtwdev, RF_PATH_A, bw, false); ++ _bw_setting(rtwdev, RF_PATH_B, bw, false); ++} ++ ++static bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val) ++{ ++ u32 bak; ++ u32 tmp; ++ int ret; ++ ++ bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val); ++ ++ ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000, ++ false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY); ++ if (ret) ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n"); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak); ++ ++ return !!ret; ++} ++ ++static void _lck_check(struct rtw89_dev *rtwdev) ++{ ++ u32 tmp; ++ ++ if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n"); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0); ++ } ++ ++ udelay(10); ++ ++ if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n"); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); ++ tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); ++ _set_s0_arfc18(rtwdev, tmp); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); ++ } ++ ++ if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n"); ++ ++ tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp); ++ tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0); ++ ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); ++ tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); ++ _set_s0_arfc18(rtwdev, tmp); ++ rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n", ++ rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK), ++ rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK)); ++ } ++} ++ ++static void _set_ch(struct rtw89_dev *rtwdev, u32 val) ++{ ++ bool timeout; ++ ++ timeout = _set_s0_arfc18(rtwdev, val); ++ if (!timeout) ++ _lck_check(rtwdev); ++} ++ ++static void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, ++ u8 central_ch, bool dav) ++{ ++ u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; ++ bool is_2g_ch = central_ch <= 14; ++ u32 rf_reg18; ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); ++ ++ rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); ++ rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | ++ RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH); ++ rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch); ++ ++ if (!is_2g_ch) ++ rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) | ++ FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G); ++ ++ rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | ++ RR_CFGCH_BW2) & RFREG_MASK; ++ rf_reg18 |= RR_CFGCH_BW2; ++ ++ if (path == RF_PATH_A && dav) ++ _set_ch(rtwdev, rf_reg18); ++ else ++ rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); ++ ++ rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0); ++ rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, ++ "[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n", ++ central_ch, path, reg18_addr, ++ rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); ++} ++ ++static void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch) ++{ ++ _ch_setting(rtwdev, RF_PATH_A, central_ch, true); ++ _ch_setting(rtwdev, RF_PATH_B, central_ch, true); ++ _ch_setting(rtwdev, RF_PATH_A, central_ch, false); ++ _ch_setting(rtwdev, RF_PATH_B, central_ch, false); ++} ++ ++static void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw, ++ enum rtw89_rf_path path) ++{ ++ rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1); ++ rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12); ++ ++ if (bw == RTW89_CHANNEL_WIDTH_20) ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b); ++ else if (bw == RTW89_CHANNEL_WIDTH_40) ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13); ++ else if (bw == RTW89_CHANNEL_WIDTH_80) ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb); ++ else ++ rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3); ++ ++ rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path, ++ rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB)); ++ ++ rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0); ++} ++ ++static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, ++ enum rtw89_bandwidth bw) ++{ ++ u8 kpath, path; ++ ++ kpath = _kpath(rtwdev, phy); ++ ++ for (path = 0; path < RF_PATH_NUM_8852B; path++) { ++ if (!(kpath & BIT(path))) ++ continue; ++ ++ _set_rxbb_bw(rtwdev, bw, path); ++ } ++} ++ ++static void rtw8852b_ctrl_bw_ch(struct rtw89_dev *rtwdev, ++ enum rtw89_phy_idx phy, u8 central_ch, ++ enum rtw89_band band, enum rtw89_bandwidth bw) ++{ ++ _ctrl_ch(rtwdev, central_ch); ++ _ctrl_bw(rtwdev, phy, bw); ++ _rxbb_bw(rtwdev, phy, bw); ++} ++ ++void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx) ++{ ++ rtw8852b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type, ++ chan->band_width); ++} +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h 2022-12-24 00:49:25.783376835 +0200 +@@ -0,0 +1,25 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2019-2022 Realtek Corporation ++ */ ++ ++#ifndef __RTW89_8852B_RFK_H__ ++#define __RTW89_8852B_RFK_H__ ++ ++#include "core.h" ++ ++void rtw8852b_rck(struct rtw89_dev *rtwdev); ++void rtw8852b_dack(struct rtw89_dev *rtwdev); ++void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx); ++void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx); ++void rtw8852b_dpk_init(struct rtw89_dev *rtwdev); ++void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy); ++void rtw8852b_dpk_track(struct rtw89_dev *rtwdev); ++void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en); ++void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy); ++void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start, ++ enum rtw89_phy_idx phy_idx); ++void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev, ++ const struct rtw89_chan *chan, ++ enum rtw89_phy_idx phy_idx); ++ ++#endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c 2022-12-24 00:49:25.783376835 +0200 +@@ -0,0 +1,794 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2019-2020 Realtek Corporation ++ */ ++ ++#include "rtw8852b_rfk_table.h" ++ ++static const struct rtw89_reg5_def rtw8852b_afe_init_defs[] = { ++ RTW89_DECL_RFK_WM(0xC0D4, 0xffffffff, 0x4486888c), ++ RTW89_DECL_RFK_WM(0xC0D8, 0xffffffff, 0xc6ba10e0), ++ RTW89_DECL_RFK_WM(0xc0dc, 0xffffffff, 0x30c52868), ++ RTW89_DECL_RFK_WM(0xc0e0, 0xffffffff, 0x05008128), ++ RTW89_DECL_RFK_WM(0xc0e4, 0xffffffff, 0x0000272b), ++ RTW89_DECL_RFK_WM(0xC1D4, 0xffffffff, 0x4486888c), ++ RTW89_DECL_RFK_WM(0xC1D8, 0xffffffff, 0xc6ba10e0), ++ RTW89_DECL_RFK_WM(0xc1dc, 0xffffffff, 0x30c52868), ++ RTW89_DECL_RFK_WM(0xc1e0, 0xffffffff, 0x05008128), ++ RTW89_DECL_RFK_WM(0xc1e4, 0xffffffff, 0x0000272b), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_afe_init_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_check_addc_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x20f4, BIT(24), 0x0), ++ RTW89_DECL_RFK_WM(0x20f8, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x20f0, 0xff0000, 0x1), ++ RTW89_DECL_RFK_WM(0x20f0, 0xf00, 0x2), ++ RTW89_DECL_RFK_WM(0x20f0, 0xf, 0x0), ++ RTW89_DECL_RFK_WM(0x20f0, 0xc0, 0x2), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_addc_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_check_addc_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x20f4, BIT(24), 0x0), ++ RTW89_DECL_RFK_WM(0x20f8, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x20f0, 0xff0000, 0x1), ++ RTW89_DECL_RFK_WM(0x20f0, 0xf00, 0x2), ++ RTW89_DECL_RFK_WM(0x20f0, 0xf, 0x0), ++ RTW89_DECL_RFK_WM(0x20f0, 0xc0, 0x3), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_addc_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_check_dadc_en_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x032C, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0xf), ++ RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0x3), ++ RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x0), ++ RTW89_DECL_RFK_WM(0x12dc, BIT(0), 0x1), ++ RTW89_DECL_RFK_WM(0x12e8, BIT(2), 0x1), ++ RTW89_DECL_RFK_WRF(RF_PATH_A, 0x8f, BIT(13), 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_en_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_check_dadc_en_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x032C, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0xf), ++ RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0x3), ++ RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x0), ++ RTW89_DECL_RFK_WM(0x32dc, BIT(0), 0x1), ++ RTW89_DECL_RFK_WM(0x32e8, BIT(2), 0x1), ++ RTW89_DECL_RFK_WRF(RF_PATH_B, 0x8f, BIT(13), 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_en_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_check_dadc_dis_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x12dc, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0x12e8, BIT(2), 0x0), ++ RTW89_DECL_RFK_WRF(RF_PATH_A, 0x8f, BIT(13), 0x0), ++ RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_dis_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_check_dadc_dis_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x32dc, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0x32e8, BIT(2), 0x0), ++ RTW89_DECL_RFK_WRF(RF_PATH_B, 0x8f, BIT(13), 0x0), ++ RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_dis_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s0_1_defs[] = { ++ RTW89_DECL_RFK_WM(0x12A0, BIT(15), 0x1), ++ RTW89_DECL_RFK_WM(0x12A0, 0x00007000, 0x3), ++ RTW89_DECL_RFK_WM(0x12B8, BIT(30), 0x1), ++ RTW89_DECL_RFK_WM(0x030C, BIT(28), 0x1), ++ RTW89_DECL_RFK_WM(0x032C, 0x80000000, 0x0), ++ RTW89_DECL_RFK_WM(0xC0D8, BIT(16), 0x1), ++ RTW89_DECL_RFK_WM(0xc0dc, 0x0c000000, 0x3), ++ RTW89_DECL_RFK_WM(0xC004, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0xc024, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0xC004, 0x3ff00000, 0x30), ++ RTW89_DECL_RFK_WM(0xC004, 0xc0000000, 0x0), ++ RTW89_DECL_RFK_WM(0xC004, BIT(17), 0x1), ++ RTW89_DECL_RFK_WM(0xc024, BIT(17), 0x1), ++ RTW89_DECL_RFK_WM(0xc00c, BIT(2), 0x0), ++ RTW89_DECL_RFK_WM(0xc02c, BIT(2), 0x0), ++ RTW89_DECL_RFK_WM(0xC004, BIT(0), 0x1), ++ RTW89_DECL_RFK_WM(0xc024, BIT(0), 0x1), ++ RTW89_DECL_RFK_DELAY(1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_1_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s0_2_defs[] = { ++ RTW89_DECL_RFK_WM(0xc0dc, 0x0c000000, 0x0), ++ RTW89_DECL_RFK_WM(0xc00c, BIT(2), 0x1), ++ RTW89_DECL_RFK_WM(0xc02c, BIT(2), 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_2_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s0_3_defs[] = { ++ RTW89_DECL_RFK_WM(0xC004, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0xc024, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0xC0D8, BIT(16), 0x0), ++ RTW89_DECL_RFK_WM(0x12A0, BIT(15), 0x0), ++ RTW89_DECL_RFK_WM(0x12A0, 0x00007000, 0x7), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_3_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s1_1_defs[] = { ++ RTW89_DECL_RFK_WM(0x32a0, BIT(15), 0x1), ++ RTW89_DECL_RFK_WM(0x32a0, 0x7000, 0x3), ++ RTW89_DECL_RFK_WM(0x32B8, BIT(30), 0x1), ++ RTW89_DECL_RFK_WM(0x030C, BIT(28), 0x1), ++ RTW89_DECL_RFK_WM(0x032C, 0x80000000, 0x0), ++ RTW89_DECL_RFK_WM(0xC1D8, BIT(16), 0x1), ++ RTW89_DECL_RFK_WM(0xc1dc, 0x0c000000, 0x3), ++ RTW89_DECL_RFK_WM(0xc104, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0xc124, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0xc104, 0x3ff00000, 0x30), ++ RTW89_DECL_RFK_WM(0xc104, 0xc0000000, 0x0), ++ RTW89_DECL_RFK_WM(0xc104, BIT(17), 0x1), ++ RTW89_DECL_RFK_WM(0xc124, BIT(17), 0x1), ++ RTW89_DECL_RFK_WM(0xc10c, BIT(2), 0x0), ++ RTW89_DECL_RFK_WM(0xc12c, BIT(2), 0x0), ++ RTW89_DECL_RFK_WM(0xc104, BIT(0), 0x1), ++ RTW89_DECL_RFK_WM(0xc124, BIT(0), 0x1), ++ RTW89_DECL_RFK_DELAY(1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_1_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s1_2_defs[] = { ++ RTW89_DECL_RFK_WM(0xc1dc, 0x0c000000, 0x0), ++ RTW89_DECL_RFK_WM(0xc10c, BIT(2), 0x1), ++ RTW89_DECL_RFK_WM(0xc12c, BIT(2), 0x1), ++ RTW89_DECL_RFK_DELAY(1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_2_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dack_s1_3_defs[] = { ++ RTW89_DECL_RFK_WM(0xc104, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0xc124, BIT(0), 0x0), ++ RTW89_DECL_RFK_WM(0xC1D8, BIT(16), 0x0), ++ RTW89_DECL_RFK_WM(0x32a0, BIT(15), 0x0), ++ RTW89_DECL_RFK_WM(0x32a0, 0x7000, 0x7), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_3_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dpk_afe_defs[] = { ++ RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0303), ++ RTW89_DECL_RFK_WM(0x12b8, BIT(30), 0x1), ++ RTW89_DECL_RFK_WM(0x32b8, BIT(30), 0x1), ++ RTW89_DECL_RFK_WM(0x030c, 0xff000000, 0x13), ++ RTW89_DECL_RFK_WM(0x032c, 0xffff0000, 0x0041), ++ RTW89_DECL_RFK_WM(0x12b8, BIT(28), 0x1), ++ RTW89_DECL_RFK_WM(0x58c8, BIT(24), 0x1), ++ RTW89_DECL_RFK_WM(0x78c8, BIT(24), 0x1), ++ RTW89_DECL_RFK_WM(0x5864, 0xc0000000, 0x3), ++ RTW89_DECL_RFK_WM(0x7864, 0xc0000000, 0x3), ++ RTW89_DECL_RFK_WM(0x2008, 0x01FFFFFF, 0x1ffffff), ++ RTW89_DECL_RFK_WM(0x0c1c, BIT(2), 0x1), ++ RTW89_DECL_RFK_WM(0x0700, BIT(27), 0x1), ++ RTW89_DECL_RFK_WM(0x0c70, 0x000003FF, 0x3ff), ++ RTW89_DECL_RFK_WM(0x0c60, 0x00000003, 0x3), ++ RTW89_DECL_RFK_WM(0x0c6c, BIT(0), 0x1), ++ RTW89_DECL_RFK_WM(0x58ac, BIT(27), 0x1), ++ RTW89_DECL_RFK_WM(0x78ac, BIT(27), 0x1), ++ RTW89_DECL_RFK_WM(0x0c3c, BIT(9), 0x1), ++ RTW89_DECL_RFK_WM(0x2344, BIT(31), 0x1), ++ RTW89_DECL_RFK_WM(0x4490, BIT(31), 0x1), ++ RTW89_DECL_RFK_WM(0x12a0, 0x000ff000, 0xbf), ++ RTW89_DECL_RFK_WM(0x32a0, 0x000f0000, 0xb), ++ RTW89_DECL_RFK_WM(0x0700, 0x07000000, 0x5), ++ RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x3333), ++ RTW89_DECL_RFK_WM(0x580c, BIT(15), 0x1), ++ RTW89_DECL_RFK_WM(0x5800, 0x0000ffff, 0x0000), ++ RTW89_DECL_RFK_WM(0x780c, BIT(15), 0x1), ++ RTW89_DECL_RFK_WM(0x7800, 0x0000ffff, 0x0000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_afe_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dpk_afe_restore_defs[] = { ++ RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0303), ++ RTW89_DECL_RFK_WM(0x12b8, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0x32b8, BIT(30), 0x0), ++ RTW89_DECL_RFK_WM(0x5864, 0xc0000000, 0x0), ++ RTW89_DECL_RFK_WM(0x7864, 0xc0000000, 0x0), ++ RTW89_DECL_RFK_WM(0x2008, 0x01FFFFFF, 0x0), ++ RTW89_DECL_RFK_WM(0x0c1c, BIT(2), 0x0), ++ RTW89_DECL_RFK_WM(0x0700, BIT(27), 0x0), ++ RTW89_DECL_RFK_WM(0x0c70, 0x000003FF, 0x63), ++ RTW89_DECL_RFK_WM(0x12a0, 0x000FF000, 0x00), ++ RTW89_DECL_RFK_WM(0x32a0, 0x000FF000, 0x00), ++ RTW89_DECL_RFK_WM(0x0700, 0x07000000, 0x0), ++ RTW89_DECL_RFK_WM(0x5864, BIT(29), 0x0), ++ RTW89_DECL_RFK_WM(0x7864, BIT(29), 0x0), ++ RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0000), ++ RTW89_DECL_RFK_WM(0x58c8, BIT(24), 0x0), ++ RTW89_DECL_RFK_WM(0x78c8, BIT(24), 0x0), ++ RTW89_DECL_RFK_WM(0x0c3c, BIT(9), 0x0), ++ RTW89_DECL_RFK_WM(0x580c, BIT(15), 0x0), ++ RTW89_DECL_RFK_WM(0x58e4, 0x18000000, 0x1), ++ RTW89_DECL_RFK_WM(0x58e4, 0x18000000, 0x2), ++ RTW89_DECL_RFK_WM(0x780c, BIT(15), 0x0), ++ RTW89_DECL_RFK_WM(0x78e4, 0x18000000, 0x1), ++ RTW89_DECL_RFK_WM(0x78e4, 0x18000000, 0x2), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_afe_restore_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_dpk_kip_defs[] = { ++ RTW89_DECL_RFK_WM(0x8008, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x8088, 0xffffffff, 0x80000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_kip_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_sys_defs[] = { ++ RTW89_DECL_RFK_WM(0x12a8, 0x0000000f, 0x5), ++ RTW89_DECL_RFK_WM(0x32a8, 0x0000000f, 0x5), ++ RTW89_DECL_RFK_WM(0x12bc, 0x000ffff0, 0x5555), ++ RTW89_DECL_RFK_WM(0x32bc, 0x000ffff0, 0x5555), ++ RTW89_DECL_RFK_WM(0x0300, 0xff000000, 0x16), ++ RTW89_DECL_RFK_WM(0x0304, 0x000000ff, 0x19), ++ RTW89_DECL_RFK_WM(0x0314, 0xffff0000, 0x2041), ++ RTW89_DECL_RFK_WM(0x0318, 0xffffffff, 0x2041), ++ RTW89_DECL_RFK_WM(0x0318, 0xffffffff, 0x20012041), ++ RTW89_DECL_RFK_WM(0x0020, 0x00006000, 0x3), ++ RTW89_DECL_RFK_WM(0x0024, 0x00006000, 0x3), ++ RTW89_DECL_RFK_WM(0x0704, 0xffff0000, 0x601e), ++ RTW89_DECL_RFK_WM(0x2704, 0xffff0000, 0x601e), ++ RTW89_DECL_RFK_WM(0x0700, 0xf0000000, 0x4), ++ RTW89_DECL_RFK_WM(0x2700, 0xf0000000, 0x4), ++ RTW89_DECL_RFK_WM(0x0650, 0x3c000000, 0x0), ++ RTW89_DECL_RFK_WM(0x2650, 0x3c000000, 0x0), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_sys_a_defs_2g[] = { ++ RTW89_DECL_RFK_WM(0x120c, 0x000000ff, 0x33), ++ RTW89_DECL_RFK_WM(0x12c0, 0x0ff00000, 0x33), ++ RTW89_DECL_RFK_WM(0x58f8, 0x40000000, 0x1), ++ RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1e), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_a_defs_2g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_sys_a_defs_5g[] = { ++ RTW89_DECL_RFK_WM(0x120c, 0x000000ff, 0x44), ++ RTW89_DECL_RFK_WM(0x12c0, 0x0ff00000, 0x44), ++ RTW89_DECL_RFK_WM(0x58f8, 0x40000000, 0x0), ++ RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1d), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_a_defs_5g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_sys_b_defs_2g[] = { ++ RTW89_DECL_RFK_WM(0x32c0, 0x0ff00000, 0x33), ++ RTW89_DECL_RFK_WM(0x320c, 0x000000ff, 0x33), ++ RTW89_DECL_RFK_WM(0x78f8, 0x40000000, 0x1), ++ RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1e), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_b_defs_2g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_sys_b_defs_5g[] = { ++ RTW89_DECL_RFK_WM(0x32c0, 0x0ff00000, 0x44), ++ RTW89_DECL_RFK_WM(0x320c, 0x000000ff, 0x44), ++ RTW89_DECL_RFK_WM(0x78f8, 0x40000000, 0x0), ++ RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1d), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_b_defs_5g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x566c, 0x00001000, 0x0), ++ RTW89_DECL_RFK_WM(0x5800, 0xffffffff, 0x003f807f), ++ RTW89_DECL_RFK_WM(0x580c, 0x0000007f, 0x40), ++ RTW89_DECL_RFK_WM(0x580c, 0x0fffff00, 0x00040), ++ RTW89_DECL_RFK_WM(0x5810, 0xffffffff, 0x59010000), ++ RTW89_DECL_RFK_WM(0x5814, 0x01ffffff, 0x002d000), ++ RTW89_DECL_RFK_WM(0x5814, 0xf8000000, 0x00), ++ RTW89_DECL_RFK_WM(0x5818, 0xffffffff, 0x002c1800), ++ RTW89_DECL_RFK_WM(0x581c, 0x3fffffff, 0x1dc80280), ++ RTW89_DECL_RFK_WM(0x5820, 0xffffffff, 0x00002080), ++ RTW89_DECL_RFK_WM(0x580c, 0x10000000, 0x1), ++ RTW89_DECL_RFK_WM(0x580c, 0x40000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5834, 0x3fffffff, 0x000115f2), ++ RTW89_DECL_RFK_WM(0x5838, 0x7fffffff, 0x0000121), ++ RTW89_DECL_RFK_WM(0x5854, 0x3fffffff, 0x000115f2), ++ RTW89_DECL_RFK_WM(0x5858, 0x7fffffff, 0x0000121), ++ RTW89_DECL_RFK_WM(0x5860, 0x80000000, 0x0), ++ RTW89_DECL_RFK_WM(0x5864, 0x07ffffff, 0x00801ff), ++ RTW89_DECL_RFK_WM(0x5898, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x589c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x58a4, 0x000000ff, 0x16), ++ RTW89_DECL_RFK_WM(0x58b0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x58b4, 0x7fffffff, 0x0a002000), ++ RTW89_DECL_RFK_WM(0x58b8, 0x7fffffff, 0x00007628), ++ RTW89_DECL_RFK_WM(0x58bc, 0x07ffffff, 0x7a7807f), ++ RTW89_DECL_RFK_WM(0x58c0, 0xfffe0000, 0x003f), ++ RTW89_DECL_RFK_WM(0x58c4, 0xffffffff, 0x0003ffff), ++ RTW89_DECL_RFK_WM(0x58c8, 0x00ffffff, 0x000000), ++ RTW89_DECL_RFK_WM(0x58c8, 0xf0000000, 0x0), ++ RTW89_DECL_RFK_WM(0x58cc, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x58d0, 0x07ffffff, 0x2008101), ++ RTW89_DECL_RFK_WM(0x58d4, 0x000000ff, 0x00), ++ RTW89_DECL_RFK_WM(0x58d4, 0x0003fe00, 0x0ff), ++ RTW89_DECL_RFK_WM(0x58d4, 0x07fc0000, 0x100), ++ RTW89_DECL_RFK_WM(0x58d8, 0xffffffff, 0x8008016c), ++ RTW89_DECL_RFK_WM(0x58dc, 0x0001ffff, 0x0807f), ++ RTW89_DECL_RFK_WM(0x58dc, 0xfff00000, 0x800), ++ RTW89_DECL_RFK_WM(0x58f0, 0x0003ffff, 0x001ff), ++ RTW89_DECL_RFK_WM(0x58f4, 0x000fffff, 0x000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x566c, 0x00001000, 0x0), ++ RTW89_DECL_RFK_WM(0x7800, 0xffffffff, 0x003f807f), ++ RTW89_DECL_RFK_WM(0x780c, 0x0000007f, 0x40), ++ RTW89_DECL_RFK_WM(0x780c, 0x0fffff00, 0x00040), ++ RTW89_DECL_RFK_WM(0x7810, 0xffffffff, 0x59010000), ++ RTW89_DECL_RFK_WM(0x7814, 0x01ffffff, 0x002d000), ++ RTW89_DECL_RFK_WM(0x7814, 0xf8000000, 0x00), ++ RTW89_DECL_RFK_WM(0x7818, 0xffffffff, 0x002c1800), ++ RTW89_DECL_RFK_WM(0x781c, 0x3fffffff, 0x1dc80280), ++ RTW89_DECL_RFK_WM(0x7820, 0xffffffff, 0x00002080), ++ RTW89_DECL_RFK_WM(0x780c, 0x10000000, 0x1), ++ RTW89_DECL_RFK_WM(0x780c, 0x40000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7834, 0x3fffffff, 0x000115f2), ++ RTW89_DECL_RFK_WM(0x7838, 0x7fffffff, 0x0000121), ++ RTW89_DECL_RFK_WM(0x7854, 0x3fffffff, 0x000115f2), ++ RTW89_DECL_RFK_WM(0x7858, 0x7fffffff, 0x0000121), ++ RTW89_DECL_RFK_WM(0x7860, 0x80000000, 0x0), ++ RTW89_DECL_RFK_WM(0x7864, 0x07ffffff, 0x00801ff), ++ RTW89_DECL_RFK_WM(0x7898, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x789c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x78a4, 0x000000ff, 0x16), ++ RTW89_DECL_RFK_WM(0x78b0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x78b4, 0x7fffffff, 0x0a002000), ++ RTW89_DECL_RFK_WM(0x78b8, 0x7fffffff, 0x00007628), ++ RTW89_DECL_RFK_WM(0x78bc, 0x07ffffff, 0x7a7807f), ++ RTW89_DECL_RFK_WM(0x78c0, 0xfffe0000, 0x003f), ++ RTW89_DECL_RFK_WM(0x78c4, 0xffffffff, 0x0003ffff), ++ RTW89_DECL_RFK_WM(0x78c8, 0x00ffffff, 0x000000), ++ RTW89_DECL_RFK_WM(0x78c8, 0xf0000000, 0x0), ++ RTW89_DECL_RFK_WM(0x78cc, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x78d0, 0x07ffffff, 0x2008101), ++ RTW89_DECL_RFK_WM(0x78d4, 0x000000ff, 0x00), ++ RTW89_DECL_RFK_WM(0x78d4, 0x0003fe00, 0x0ff), ++ RTW89_DECL_RFK_WM(0x78d4, 0x07fc0000, 0x100), ++ RTW89_DECL_RFK_WM(0x78d8, 0xffffffff, 0x8008016c), ++ RTW89_DECL_RFK_WM(0x78dc, 0x0001ffff, 0x0807f), ++ RTW89_DECL_RFK_WM(0x78dc, 0xfff00000, 0x800), ++ RTW89_DECL_RFK_WM(0x78f0, 0x0003ffff, 0x001ff), ++ RTW89_DECL_RFK_WM(0x78f4, 0x000fffff, 0x000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_he_tb_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x58a0, 0xffffffff, 0x000000fe), ++ RTW89_DECL_RFK_WM(0x58e4, 0x0000007f, 0x1f), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_he_tb_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_he_tb_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x78a0, 0xffffffff, 0x000000fe), ++ RTW89_DECL_RFK_WM(0x78e4, 0x0000007f, 0x1f), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_he_tb_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_dck_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x580c, 0x0fff0000, 0x000), ++ RTW89_DECL_RFK_WM(0x5814, 0x003ff000, 0x0ef), ++ RTW89_DECL_RFK_WM(0x5814, 0x18000000, 0x0), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dck_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_dck_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x780c, 0x0fff0000, 0x000), ++ RTW89_DECL_RFK_WM(0x7814, 0x003ff000, 0x0ef), ++ RTW89_DECL_RFK_WM(0x7814, 0x18000000, 0x0), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dck_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_dac_gain_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x58b0, 0x00000400, 0x1), ++ RTW89_DECL_RFK_WM(0x58b0, 0x00000fff, 0x000), ++ RTW89_DECL_RFK_WM(0x58b0, 0x00000800, 0x1), ++ RTW89_DECL_RFK_WM(0x5a00, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a04, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a08, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a0c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a10, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a14, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a18, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a1c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a20, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a24, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a28, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a2c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a30, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a34, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a38, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a3c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a40, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a44, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a48, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a4c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a50, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a54, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a58, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a5c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a60, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a64, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a68, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a6c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a70, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a74, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a78, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a7c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a80, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a84, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a88, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a8c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a90, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a94, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a98, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5a9c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5aa0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5aa4, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5aa8, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5aac, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5ab0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5ab4, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5ab8, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5abc, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5ac0, 0xffffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dac_gain_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_dac_gain_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x78b0, 0x00000fff, 0x000), ++ RTW89_DECL_RFK_WM(0x78b0, 0x00000800, 0x1), ++ RTW89_DECL_RFK_WM(0x7a00, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a04, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a08, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a0c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a10, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a14, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a18, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a1c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a20, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a24, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a28, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a2c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a30, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a34, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a38, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a3c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a40, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a44, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a48, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a4c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a50, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a54, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a58, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a5c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a60, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a64, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a68, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a6c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a70, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a74, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a78, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a7c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a80, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a84, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a88, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a8c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a90, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a94, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a98, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7a9c, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7aa0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7aa4, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7aa8, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7aac, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7ab0, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7ab4, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7ab8, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7abc, 0xffffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7ac0, 0xffffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dac_gain_defs_b); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_a_defs_2g[] = { ++ RTW89_DECL_RFK_WM(0x5608, 0x07ffffff, 0x0801008), ++ RTW89_DECL_RFK_WM(0x560c, 0x07ffffff, 0x0201020), ++ RTW89_DECL_RFK_WM(0x5610, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x5614, 0x07ffffff, 0x0804008), ++ RTW89_DECL_RFK_WM(0x5618, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x561c, 0x000001ff, 0x008), ++ RTW89_DECL_RFK_WM(0x561c, 0xffff0000, 0x0808), ++ RTW89_DECL_RFK_WM(0x5620, 0xffffffff, 0x08081e28), ++ RTW89_DECL_RFK_WM(0x5624, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x5628, 0xffffffff, 0x08081e28), ++ RTW89_DECL_RFK_WM(0x562c, 0x0000ffff, 0x0808), ++ RTW89_DECL_RFK_WM(0x581c, 0x00100000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_a_defs_2g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_a_defs_5g[] = { ++ RTW89_DECL_RFK_WM(0x5608, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x560c, 0x07ffffff, 0x0201020), ++ RTW89_DECL_RFK_WM(0x5610, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x5614, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x5618, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x561c, 0x000001ff, 0x008), ++ RTW89_DECL_RFK_WM(0x561c, 0xffff0000, 0x0808), ++ RTW89_DECL_RFK_WM(0x5620, 0xffffffff, 0x08081e08), ++ RTW89_DECL_RFK_WM(0x5624, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x5628, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x562c, 0x0000ffff, 0x0808), ++ RTW89_DECL_RFK_WM(0x581c, 0x00100000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_a_defs_5g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_b_defs_2g[] = { ++ RTW89_DECL_RFK_WM(0x7608, 0x07ffffff, 0x0801008), ++ RTW89_DECL_RFK_WM(0x760c, 0x07ffffff, 0x0201020), ++ RTW89_DECL_RFK_WM(0x7610, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x7614, 0x07ffffff, 0x0804008), ++ RTW89_DECL_RFK_WM(0x7618, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x761c, 0x000001ff, 0x008), ++ RTW89_DECL_RFK_WM(0x761c, 0xffff0000, 0x0808), ++ RTW89_DECL_RFK_WM(0x7620, 0xffffffff, 0x08081e28), ++ RTW89_DECL_RFK_WM(0x7624, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x7628, 0xffffffff, 0x08081e28), ++ RTW89_DECL_RFK_WM(0x762c, 0x0000ffff, 0x0808), ++ RTW89_DECL_RFK_WM(0x781c, 0x00100000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_b_defs_2g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_b_defs_5g[] = { ++ RTW89_DECL_RFK_WM(0x7608, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x760c, 0x07ffffff, 0x0201020), ++ RTW89_DECL_RFK_WM(0x7610, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x7614, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x7618, 0x07ffffff, 0x0201008), ++ RTW89_DECL_RFK_WM(0x761c, 0x000001ff, 0x008), ++ RTW89_DECL_RFK_WM(0x761c, 0xffff0000, 0x0808), ++ RTW89_DECL_RFK_WM(0x7620, 0xffffffff, 0x08081e08), ++ RTW89_DECL_RFK_WM(0x7624, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x7628, 0xffffffff, 0x08080808), ++ RTW89_DECL_RFK_WM(0x762c, 0x0000ffff, 0x0808), ++ RTW89_DECL_RFK_WM(0x781c, 0x00100000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_b_defs_5g); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_2g_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01ef27af), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000075), ++ RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x017f13ae), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x0000006e), ++ RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_2g_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_2g_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01ef27af), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000075), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x017f13ae), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x0000006e), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_2g_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g1_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x016037e7), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x0000006f), ++ RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g1_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g1_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x016037e7), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x0000006f), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g1_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g2_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01f053f1), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070), ++ RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g2_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g2_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01f053f1), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g2_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g3_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01c047ee), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070), ++ RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g3_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g3_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01c047ee), ++ RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070), ++ RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g3_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_2g_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x01ff2bb5), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000078), ++ RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x018f2bb0), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000072), ++ RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_2g_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_2g_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x01ff2bb5), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000078), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x018f2bb0), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000072), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_2g_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g1_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g1_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g1_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g1_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g2_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x013027e6), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g2_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g2_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x013027e6), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g2_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g3_all_defs[] = { ++ RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721), ++ RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101), ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g3_all_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g3_part_defs[] = { ++ RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da), ++ RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069), ++ RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000), ++ RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g3_part_defs); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_defs_a[] = { ++ RTW89_DECL_RFK_WM(0x5814, 0x00000800, 0x1), ++ RTW89_DECL_RFK_WM(0x581c, 0x20000000, 0x1), ++ RTW89_DECL_RFK_WM(0x5814, 0x20000000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_defs_a); ++ ++static const struct rtw89_reg5_def rtw8852b_tssi_slope_defs_b[] = { ++ RTW89_DECL_RFK_WM(0x7814, 0x00000800, 0x1), ++ RTW89_DECL_RFK_WM(0x781c, 0x20000000, 0x1), ++ RTW89_DECL_RFK_WM(0x7814, 0x20000000, 0x1), ++}; ++ ++RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_defs_b); +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h 2022-12-24 00:49:25.783376835 +0200 +@@ -0,0 +1,62 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2019-2020 Realtek Corporation ++ */ ++ ++#ifndef __RTW89_8852B_RFK_TABLE_H__ ++#define __RTW89_8852B_RFK_TABLE_H__ ++ ++#include "phy.h" ++ ++extern const struct rtw89_rfk_tbl rtw8852b_afe_init_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_addc_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_addc_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_en_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_en_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_dis_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_dis_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_1_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_2_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_3_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_1_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_2_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_3_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dpk_afe_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dpk_afe_restore_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_dpk_kip_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_a_defs_2g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_a_defs_5g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_b_defs_2g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_b_defs_5g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_dck_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_dck_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_dac_gain_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_dac_gain_defs_b_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_a_defs_2g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_a_defs_5g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_b_defs_2g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_b_defs_5g_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_2g_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_2g_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g1_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g1_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g2_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g2_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g3_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g3_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_2g_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_2g_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g1_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g1_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g2_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g2_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g3_all_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g3_part_defs_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_defs_a_tbl; ++extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_defs_b_tbl; ++ ++#endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c 2022-12-24 00:49:25.785376835 +0200 +@@ -0,0 +1,22877 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2019-2020 Realtek Corporation ++ */ ++ ++#include "phy.h" ++#include "reg.h" ++#include "rtw8852b_table.h" ++ ++static const struct rtw89_reg2_def rtw89_8852b_phy_bb_regs[] = { ++ {0x704, 0x601E0100}, ++ {0x4000, 0x00000000}, ++ {0x4004, 0xCA014000}, ++ {0x4008, 0xC751D4F0}, ++ {0x400C, 0x44511475}, ++ {0x4010, 0x00000000}, ++ {0x4014, 0x00000000}, ++ {0x4018, 0x4F4C084B}, ++ {0x401C, 0x084A4E52}, ++ {0x4020, 0x4D504E4B}, ++ {0x4024, 0x4F4C0849}, ++ {0x4028, 0x08484C50}, ++ {0x402C, 0x4C50504C}, ++ {0x4030, 0x5454084A}, ++ {0x4034, 0x084B5654}, ++ {0x4038, 0x6A6C605A}, ++ {0x403C, 0x4C4C084C}, ++ {0x4040, 0x084B4E4D}, ++ {0x4044, 0x4E4C4B4B}, ++ {0x4048, 0x4B4B084A}, ++ {0x404C, 0x084A4E4C}, ++ {0x4050, 0x514F4C4A}, ++ {0x4054, 0x524E084A}, ++ {0x4058, 0x084A5154}, ++ {0x405C, 0x53555554}, ++ {0x4060, 0x45450845}, ++ {0x4064, 0x08454144}, ++ {0x4068, 0x40434445}, ++ {0x406C, 0x44450845}, ++ {0x4070, 0x08444043}, ++ {0x4074, 0x42434444}, ++ {0x4078, 0x46450844}, ++ {0x407C, 0x08444843}, ++ {0x4080, 0x4B4E4A47}, ++ {0x4084, 0x4F4C084B}, ++ {0x4088, 0x084A4E52}, ++ {0x408C, 0x4D504E4B}, ++ {0x4090, 0x4F4C0849}, ++ {0x4094, 0x08484C50}, ++ {0x4098, 0x4C50504C}, ++ {0x409C, 0x5454084A}, ++ {0x40A0, 0x084B5654}, ++ {0x40A4, 0x6A6C605A}, ++ {0x40A8, 0x4C4C084C}, ++ {0x40AC, 0x084B4E4D}, ++ {0x40B0, 0x4E4C4B4B}, ++ {0x40B4, 0x4B4B084A}, ++ {0x40B8, 0x084A4E4C}, ++ {0x40BC, 0x514F4C4A}, ++ {0x40C0, 0x524E084A}, ++ {0x40C4, 0x084A5154}, ++ {0x40C8, 0x53555554}, ++ {0x40CC, 0x45450845}, ++ {0x40D0, 0x08454144}, ++ {0x40D4, 0x40434445}, ++ {0x40D8, 0x44450845}, ++ {0x40DC, 0x08444043}, ++ {0x40E0, 0x42434444}, ++ {0x40E4, 0x46450844}, ++ {0x40E8, 0x08444843}, ++ {0x40EC, 0x4B4E4A47}, ++ {0x40F0, 0x00000000}, ++ {0x40F4, 0x00000006}, ++ {0x40F8, 0x00000000}, ++ {0x40FC, 0x8C30C30C}, ++ {0x4100, 0x4C30C30C}, ++ {0x4104, 0x0C30C30C}, ++ {0x4108, 0x0C30C30C}, ++ {0x410C, 0x0C30C30C}, ++ {0x4110, 0x0C30C30C}, ++ {0x4114, 0x28A28A28}, ++ {0x4118, 0x28A28A28}, ++ {0x411C, 0x28A28A28}, ++ {0x4120, 0x28A28A28}, ++ {0x4124, 0x28A28A28}, ++ {0x4128, 0x28A28A28}, ++ {0x412C, 0x06666666}, ++ {0x4130, 0x33333333}, ++ {0x4134, 0x33333333}, ++ {0x4138, 0x33333333}, ++ {0x413C, 0x00000031}, ++ {0x4140, 0x5100600A}, ++ {0x4144, 0x18363113}, ++ {0x4148, 0x1D976DDC}, ++ {0x414C, 0x1C072DD7}, ++ {0x4150, 0x1127CDF4}, ++ {0x4154, 0x1E37BDF1}, ++ {0x4158, 0x1FB7F1D6}, ++ {0x415C, 0x1EA7DDF9}, ++ {0x4160, 0x1FE445DD}, ++ {0x4164, 0x1F97F1FE}, ++ {0x4168, 0x1FF781ED}, ++ {0x416C, 0x1FA7F5FE}, ++ {0x4170, 0x1E07B913}, ++ {0x4174, 0x1FD7FDFF}, ++ {0x4178, 0x1E17B9FA}, ++ {0x417C, 0x19A66914}, ++ {0x4180, 0x10F65598}, ++ {0x4184, 0x14A5A111}, ++ {0x4188, 0x1D3765DB}, ++ {0x418C, 0x17C685CA}, ++ {0x4190, 0x1107C5F3}, ++ {0x4194, 0x1B5785EB}, ++ {0x4198, 0x1F97ED8F}, ++ {0x419C, 0x1BC7A5F3}, ++ {0x41A0, 0x1FE43595}, ++ {0x41A4, 0x1EB7D9FC}, ++ {0x41A8, 0x1FE65DBE}, ++ {0x41AC, 0x1EC7D9FC}, ++ {0x41B0, 0x1976FCFF}, ++ {0x41B4, 0x1F77F5FF}, ++ {0x41B8, 0x1976FDEC}, ++ {0x41BC, 0x198664EF}, ++ {0x41C0, 0x11062D93}, ++ {0x41C4, 0x10C4E910}, ++ {0x41C8, 0x1CA759DB}, ++ {0x41CC, 0x1335A9B5}, ++ {0x41D0, 0x1097B9F3}, ++ {0x41D4, 0x17B72DE1}, ++ {0x41D8, 0x1F67ED42}, ++ {0x41DC, 0x18074DE9}, ++ {0x41E0, 0x1FD40547}, ++ {0x41E4, 0x1D57ADF9}, ++ {0x41E8, 0x1FE52182}, ++ {0x41EC, 0x1D67B1F9}, ++ {0x41F0, 0x14860CE1}, ++ {0x41F4, 0x1EC7E9FE}, ++ {0x41F8, 0x14860DD6}, ++ {0x41FC, 0x195664C7}, ++ {0x4200, 0x0005E58A}, ++ {0x4204, 0x00000000}, ++ {0x4208, 0x00000000}, ++ {0x420C, 0x7A000000}, ++ {0x4210, 0x0F9F3D7A}, ++ {0x4214, 0x0040817C}, ++ {0x4218, 0x00E10204}, ++ {0x421C, 0x227D94CD}, ++ {0x4220, 0x08028A28}, ++ {0x4224, 0x00000210}, ++ {0x4228, 0x04688000}, ++ {0x4A48, 0x00000002}, ++ {0x422C, 0x0060B002}, ++ {0x4230, 0x9A8249A8}, ++ {0x4234, 0x26A1469E}, ++ {0x4238, 0x2099A824}, ++ {0x423C, 0x2359461C}, ++ {0x4240, 0x1631A675}, ++ {0x4244, 0x2C6B1D63}, ++ {0x4248, 0x0000000E}, ++ {0x424C, 0x00000001}, ++ {0x4250, 0x00000001}, ++ {0x4254, 0x00000000}, ++ {0x4258, 0x00000000}, ++ {0x425C, 0x00000000}, ++ {0x4260, 0x0020000C}, ++ {0x4264, 0x00000000}, ++ {0x4268, 0x00000000}, ++ {0x426C, 0x0418317C}, ++ {0x4270, 0x2B33135C}, ++ {0x4274, 0x00000002}, ++ {0x4278, 0x00000000}, ++ {0x427C, 0x00000000}, ++ {0x4280, 0x00000000}, ++ {0x4284, 0x00000000}, ++ {0x4288, 0x00000000}, ++ {0x428C, 0x00000000}, ++ {0x4290, 0x00000000}, ++ {0x4294, 0x00000000}, ++ {0x4298, 0x00000000}, ++ {0x429C, 0x84026000}, ++ {0x42A0, 0x0051AC20}, ++ {0x4A24, 0x0010C040}, ++ {0x42A4, 0x02024008}, ++ {0x42A8, 0x00000000}, ++ {0x42AC, 0x00000000}, ++ {0x42B0, 0x22CE803C}, ++ {0x42B4, 0x32000000}, ++ {0x42B8, 0x996FD67D}, ++ {0x42BC, 0xBD67D67D}, ++ {0x42C0, 0x7D67D65B}, ++ {0x42C4, 0x28029F59}, ++ {0x42C8, 0x00280280}, ++ {0x42CC, 0x00000000}, ++ {0x42D0, 0x00000000}, ++ {0x42D4, 0x00000003}, ++ {0x42D8, 0x00000001}, ++ {0x42DC, 0x61861800}, ++ {0x42E0, 0x830C30C3}, ++ {0x42E4, 0xC30C30C3}, ++ {0x42E8, 0x830C30C3}, ++ {0x42EC, 0x451450C3}, ++ {0x42F0, 0x05145145}, ++ {0x42F4, 0x05145145}, ++ {0x42F8, 0x05145145}, ++ {0x42FC, 0x0F0C3145}, ++ {0x4300, 0x030C30CF}, ++ {0x4304, 0x030C30C3}, ++ {0x4308, 0x030CF3C3}, ++ {0x430C, 0x030C30C3}, ++ {0x4310, 0x0F3CF3C3}, ++ {0x4314, 0x0F3CF3CF}, ++ {0x4318, 0x0F3CF3CF}, ++ {0x431C, 0x0F3CF3CF}, ++ {0x4320, 0x0F3CF3CF}, ++ {0x4324, 0x030C10C3}, ++ {0x4328, 0x051430C3}, ++ {0x432C, 0x051490CB}, ++ {0x4330, 0x030CD151}, ++ {0x4334, 0x050C50C7}, ++ {0x4338, 0x051492CB}, ++ {0x433C, 0x05145145}, ++ {0x4340, 0x05145145}, ++ {0x4344, 0x05145145}, ++ {0x4348, 0x05145145}, ++ {0x434C, 0x090CD3CF}, ++ {0x4350, 0x071491C5}, ++ {0x4354, 0x073CF143}, ++ {0x4358, 0x071431C3}, ++ {0x435C, 0x0F3CF1C5}, ++ {0x4360, 0x0F3CF3CF}, ++ {0x4364, 0x0F3CF3CF}, ++ {0x4368, 0x0F3CF3CF}, ++ {0x436C, 0x0F3CF3CF}, ++ {0x4370, 0x090C91CF}, ++ {0x4374, 0x11243143}, ++ {0x4378, 0x9777A777}, ++ {0x437C, 0xBB7BAC95}, ++ {0x4380, 0xB667B889}, ++ {0x4384, 0x7B9B8899}, ++ {0x4388, 0x7A5567C8}, ++ {0x438C, 0x2278CCCC}, ++ {0x4390, 0x7C222222}, ++ {0x4394, 0x0000069B}, ++ {0x4398, 0x001CCCCC}, ++ {0x4AAC, 0xCCCCC88C}, ++ {0x4AB0, 0x0000AACC}, ++ {0x439C, 0x00000000}, ++ {0x43A0, 0x00000008}, ++ {0x43A4, 0x00000000}, ++ {0x43A8, 0x00000000}, ++ {0x43AC, 0x00000000}, ++ {0x43B0, 0x10000000}, ++ {0x43B4, 0x00401001}, ++ {0x43B8, 0x00061003}, ++ {0x43BC, 0x000024D8}, ++ {0x43C0, 0x00000000}, ++ {0x43C4, 0x10000020}, ++ {0x43C8, 0x20000200}, ++ {0x43CC, 0x00000000}, ++ {0x43D0, 0x04000000}, ++ {0x43D4, 0x44000100}, ++ {0x43D8, 0x60804060}, ++ {0x43DC, 0x44204210}, ++ {0x43E0, 0x82108082}, ++ {0x43E4, 0x82108402}, ++ {0x43E8, 0xC8082108}, ++ {0x43EC, 0xC8202084}, ++ {0x43F0, 0x44208208}, ++ {0x43F4, 0x84108204}, ++ {0x43F8, 0xD0108104}, ++ {0x43FC, 0xF8210108}, ++ {0x4400, 0x6431E930}, ++ {0x4404, 0x02309468}, ++ {0x4408, 0x10C61C22}, ++ {0x440C, 0x02109469}, ++ {0x4410, 0x10C61C22}, ++ {0x4414, 0x00041049}, ++ {0x4A4C, 0x00060581}, ++ {0x4418, 0x00000000}, ++ {0x441C, 0x00000000}, ++ {0x4420, 0x6C000000}, ++ {0x4424, 0xB0200020}, ++ {0x4428, 0x00001FF0}, ++ {0x442C, 0x00000000}, ++ {0x4430, 0x00000000}, ++ {0x4434, 0x00000000}, ++ {0x4438, 0x00000000}, ++ {0x443C, 0x190642D0}, ++ {0x4440, 0xA80668A0}, ++ {0x4444, 0x60900820}, ++ {0x4448, 0x9F28518C}, ++ {0x444C, 0x32488A62}, ++ {0x4450, 0x9C6E36DC}, ++ {0x4454, 0x0000F52B}, ++ {0x4458, 0x00000000}, ++ {0x445C, 0x4801442E}, ++ {0x4460, 0x0051A0B8}, ++ {0x4464, 0x00000000}, ++ {0x4468, 0x00000000}, ++ {0x446C, 0x00000000}, ++ {0x4470, 0x00000000}, ++ {0x4474, 0x00000000}, ++ {0x4478, 0x00000000}, ++ {0x447C, 0x00000000}, ++ {0x4480, 0x2A0A6040}, ++ {0x4484, 0x0A0A6829}, ++ {0x4488, 0x00000004}, ++ {0x448C, 0x00000000}, ++ {0x4490, 0x80000000}, ++ {0x4494, 0x10000000}, ++ {0x4498, 0xE0000000}, ++ {0x4AB4, 0x00000000}, ++ {0x449C, 0x0000001E}, ++ {0x44A0, 0x02B2C3A6}, ++ {0x44A4, 0x00000400}, ++ {0x44A8, 0x00000001}, ++ {0x44AC, 0x000190C0}, ++ {0x44B0, 0x00000000}, ++ {0x44B4, 0x00000000}, ++ {0x44B8, 0x00000000}, ++ {0x44BC, 0x00000000}, ++ {0x44C0, 0x00000000}, ++ {0x44C4, 0x00000000}, ++ {0x44C8, 0x00000000}, ++ {0x44CC, 0x00000000}, ++ {0x44D0, 0x00000000}, ++ {0x44D4, 0x00000000}, ++ {0x44D8, 0x00000000}, ++ {0x44DC, 0x00000000}, ++ {0x44E0, 0x00000000}, ++ {0x44E4, 0x00000000}, ++ {0x44E8, 0x00000000}, ++ {0x44EC, 0x00000000}, ++ {0x44F0, 0x00000000}, ++ {0x44F4, 0x00000000}, ++ {0x44F8, 0x00000000}, ++ {0x44FC, 0x00000000}, ++ {0x4500, 0x00000000}, ++ {0x4504, 0x00000000}, ++ {0x4508, 0x00000000}, ++ {0x450C, 0x00000000}, ++ {0x4510, 0x00000000}, ++ {0x4514, 0x00000000}, ++ {0x4518, 0x00000000}, ++ {0x451C, 0x00000000}, ++ {0x4520, 0x00000000}, ++ {0x4524, 0x00000000}, ++ {0x4528, 0x00000000}, ++ {0x452C, 0x00000000}, ++ {0x4530, 0x4E830171}, ++ {0x4534, 0x00000870}, ++ {0x4538, 0x000000FF}, ++ {0x453C, 0x00000000}, ++ {0x4540, 0x00000000}, ++ {0x4544, 0x00000000}, ++ {0x4548, 0x00000000}, ++ {0x454C, 0x00000000}, ++ {0x4550, 0x00000000}, ++ {0x4554, 0x00000000}, ++ {0x4558, 0x00000000}, ++ {0x455C, 0x00000000}, ++ {0x4560, 0x40000000}, ++ {0x4564, 0x40000000}, ++ {0x4568, 0x00000000}, ++ {0x456C, 0x20000000}, ++ {0x4570, 0x04F040BB}, ++ {0x4574, 0x000E53FF}, ++ {0x4578, 0x000205CB}, ++ {0x457C, 0x00200000}, ++ {0x4580, 0x00000040}, ++ {0x4584, 0x00000000}, ++ {0x4588, 0x00000017}, ++ {0x458C, 0x30000000}, ++ {0x4590, 0x00000000}, ++ {0x4594, 0x00000000}, ++ {0x4598, 0x00000001}, ++ {0x459C, 0x0003FE00}, ++ {0x45A0, 0x00000086}, ++ {0x45A4, 0x00000000}, ++ {0x45A8, 0xC00001C0}, ++ {0x45AC, 0x78038000}, ++ {0x45B0, 0x8000004A}, ++ {0x45B4, 0x04094800}, ++ {0x45B8, 0x00280002}, ++ {0x45BC, 0x06748790}, ++ {0x45C0, 0x80000000}, ++ {0x45C4, 0x00000000}, ++ {0x45C8, 0x00000000}, ++ {0x45CC, 0x00558670}, ++ {0x45D0, 0x002883F0}, ++ {0x45D4, 0x00090120}, ++ {0x45D8, 0x00000000}, ++ {0x45E0, 0xA3A6D3C4}, ++ {0x45E4, 0xAB27B126}, ++ {0x45E8, 0x00006778}, ++ {0x45F4, 0x000001B5}, ++ {0x45EC, 0x11110F0A}, ++ {0x45F0, 0x00000003}, ++ {0x4A0C, 0x0000000A}, ++ {0x45F8, 0x0058BC3F}, ++ {0x45FC, 0x00000003}, ++ {0x462C, 0x00000020}, ++ {0x4600, 0x000003D9}, ++ {0x45F0, 0x00000004}, ++ {0x4604, 0x002B1CB0}, ++ {0x4A50, 0xC0000000}, ++ {0x4A54, 0x00001000}, ++ {0x4A58, 0x00000000}, ++ {0x4A18, 0x00000024}, ++ {0x4608, 0x00000001}, ++ {0x460C, 0x00000000}, ++ {0x4A10, 0x00000001}, ++ {0x4610, 0x00000001}, ++ {0x4614, 0x16E5298F}, ++ {0x4618, 0x18C6294A}, ++ {0x461C, 0x0E06318A}, ++ {0x4620, 0x0E539CE5}, ++ {0x4624, 0x00019287}, ++ {0x4A14, 0x000000BF}, ++ {0x4628, 0x00000001}, ++ {0x4630, 0x000001AA}, ++ {0x4A18, 0x00001900}, ++ {0x4A1C, 0x000002A6}, ++ {0x4634, 0x000000A3}, ++ {0x4A20, 0x00000086}, ++ {0x4638, 0x01986456}, ++ {0x49F8, 0x00000000}, ++ {0x463C, 0x00000000}, ++ {0x4640, 0x00000000}, ++ {0x4644, 0x00C8CC00}, ++ {0x4648, 0xC400B6B6}, ++ {0x464C, 0xDC400FC0}, ++ {0x4A8C, 0x00000110}, ++ {0x4650, 0x08882550}, ++ {0x4654, 0x08CC2660}, ++ {0x4658, 0x09102660}, ++ {0x465C, 0x00000154}, ++ {0x45DC, 0xC39E38E8}, ++ {0x4660, 0x452607E6}, ++ {0x4664, 0x6750DC65}, ++ {0x4668, 0xF3F0F1ED}, ++ {0x466C, 0x30141506}, ++ {0x4670, 0x2C2B2B2B}, ++ {0x4674, 0x2C2C2C2C}, ++ {0x4678, 0xDDB738E8}, ++ {0x467C, 0x543618FB}, ++ {0x4680, 0x4F31DC6F}, ++ {0x4684, 0xFBEBDA00}, ++ {0x4688, 0x1A10FF04}, ++ {0x468C, 0x282A3000}, ++ {0x4690, 0x2A29292A}, ++ {0x4694, 0x04FA2A2A}, ++ {0x4698, 0xEE0F04D1}, ++ {0x469C, 0x99E91436}, ++ {0x46A0, 0x0701E79E}, ++ {0x46A4, 0x08D77CFF}, ++ {0x46A8, 0x2212FF14}, ++ {0x46AC, 0x60322437}, ++ {0x46B0, 0x63666666}, ++ {0x46B4, 0x35374425}, ++ {0x46B8, 0x35883042}, ++ {0x46BC, 0x5177C252}, ++ {0x4720, 0x7FFFFD63}, ++ {0x4724, 0xB58D11FF}, ++ {0x4728, 0x07FFFFFF}, ++ {0x472C, 0x0E7893B6}, ++ {0x4730, 0xE0391201}, ++ {0x4734, 0x00000020}, ++ {0x4738, 0x8325C500}, ++ {0x473C, 0x00000B7F}, ++ {0x46C0, 0x00000000}, ++ {0x46C4, 0x00000000}, ++ {0x46C8, 0x00000219}, ++ {0x46CC, 0x00000000}, ++ {0x46D0, 0x00000000}, ++ {0x46D4, 0x00000001}, ++ {0x46D8, 0x00000001}, ++ {0x46DC, 0x00000000}, ++ {0x46E0, 0x00000000}, ++ {0x46E4, 0x00000151}, ++ {0x46E8, 0x00000498}, ++ {0x46EC, 0x00000498}, ++ {0x46F0, 0x00000000}, ++ {0x46F4, 0x00000000}, ++ {0x46F8, 0x00001146}, ++ {0x46FC, 0x00000000}, ++ {0x4700, 0x00000000}, ++ {0x4704, 0x00C8CC00}, ++ {0x4708, 0xC400B6B6}, ++ {0x470C, 0xDC400FC0}, ++ {0x4A90, 0x00000110}, ++ {0x4710, 0x08882550}, ++ {0x4714, 0x08CC2660}, ++ {0x4718, 0x09102660}, ++ {0x471C, 0x00000154}, ++ {0x4740, 0xC69F38E8}, ++ {0x4744, 0x462709E9}, ++ {0x4748, 0x6750DC67}, ++ {0x474C, 0xF3F0F1ED}, ++ {0x4750, 0x30141506}, ++ {0x4754, 0x2C2B2B2B}, ++ {0x4758, 0x2C2C2C2C}, ++ {0x475C, 0xE0B738E8}, ++ {0x4760, 0x52381BFE}, ++ {0x4764, 0x5031DC6C}, ++ {0x4768, 0xFBEBDA00}, ++ {0x476C, 0x1A10FF04}, ++ {0x4770, 0x282A3000}, ++ {0x4774, 0x2A29292A}, ++ {0x4778, 0x04FA2A2A}, ++ {0x477C, 0xEE0F04D1}, ++ {0x49F0, 0x99E91436}, ++ {0x49F4, 0x0701E79E}, ++ {0x49FC, 0x08D77CFF}, ++ {0x4A5C, 0x2212FF14}, ++ {0x4A60, 0x60322437}, ++ {0x4A64, 0x63666666}, ++ {0x4A68, 0x35374425}, ++ {0x4A6C, 0x35883042}, ++ {0x4A70, 0x5177C252}, ++ {0x4A74, 0x7FFFFD63}, ++ {0x4A78, 0xB58D11FF}, ++ {0x4A7C, 0x07FFFFFF}, ++ {0x4A80, 0x0E7893B6}, ++ {0x4A9C, 0xE0391201}, ++ {0x4AA0, 0x00000020}, ++ {0x4AA4, 0x8325C500}, ++ {0x4AA8, 0x00000B7F}, ++ {0x4780, 0x00000000}, ++ {0x4784, 0x00000000}, ++ {0x4788, 0x00000219}, ++ {0x478C, 0x00000000}, ++ {0x4790, 0x00000000}, ++ {0x4794, 0x00000001}, ++ {0x4798, 0x00000001}, ++ {0x479C, 0x00000000}, ++ {0x47A0, 0x00000000}, ++ {0x47A4, 0x00000151}, ++ {0x47A8, 0x00000498}, ++ {0x47AC, 0x00000498}, ++ {0x47B0, 0x00000000}, ++ {0x47B4, 0x00000000}, ++ {0x47B8, 0x00001146}, ++ {0x47BC, 0x00000002}, ++ {0x47C0, 0x00000002}, ++ {0x47C4, 0x00000000}, ++ {0x47C8, 0xA32103FE}, ++ {0x47CC, 0xB20A5328}, ++ {0x47D0, 0xC686314F}, ++ {0x47D4, 0x000005D7}, ++ {0x47D8, 0x009B902A}, ++ {0x47DC, 0x009B902A}, ++ {0x47E0, 0x98682C18}, ++ {0x47E4, 0x6308C4C1}, ++ {0x47E8, 0x6248C631}, ++ {0x47EC, 0x922A8253}, ++ {0x47F0, 0x00000005}, ++ {0x47F4, 0x00001759}, ++ {0x47F8, 0x4BB02000}, ++ {0x47FC, 0x831408BE}, ++ {0x4A84, 0x000000E9}, ++ {0x4800, 0x9ABBCACB}, ++ {0x4804, 0x56767578}, ++ {0x4808, 0xBCCBBB13}, ++ {0x480C, 0x7889989B}, ++ {0x4810, 0xBBB0F455}, ++ {0x4814, 0x777BBBBB}, ++ {0x4818, 0x15277777}, ++ {0x481C, 0x27039CE9}, ++ {0x4820, 0x42424432}, ++ {0x4824, 0x36058342}, ++ {0x4828, 0x00000006}, ++ {0x482C, 0x00000005}, ++ {0x4830, 0x00000005}, ++ {0x4834, 0xC7013016}, ++ {0x4838, 0x84413016}, ++ {0x483C, 0x84413016}, ++ {0x4840, 0x8C413016}, ++ {0x4844, 0x8C40B028}, ++ {0x4848, 0x3140B028}, ++ {0x484C, 0x2940B028}, ++ {0x4850, 0x8440B028}, ++ {0x4854, 0x2318C610}, ++ {0x4858, 0x45344753}, ++ {0x485C, 0x236A6A88}, ++ {0x4860, 0xAC8DF814}, ++ {0x4864, 0x08877ACB}, ++ {0x4868, 0x000107AA}, ++ {0x4A94, 0x00000000}, ++ {0x486C, 0xBCEB4A14}, ++ {0x4870, 0x000A3A4A}, ++ {0x4874, 0xBCEB4A14}, ++ {0x4878, 0x000A3A4A}, ++ {0x487C, 0xBCBDBD85}, ++ {0x4880, 0x0CABB99A}, ++ {0x4884, 0x38384242}, ++ {0x4888, 0x0086102E}, ++ {0x488C, 0xCA24C82A}, ++ {0x4890, 0x00008A62}, ++ {0x4894, 0x00000008}, ++ {0x4898, 0x009B902A}, ++ {0x489C, 0x009B902A}, ++ {0x48A0, 0x98682C18}, ++ {0x48A4, 0x6308C4C1}, ++ {0x48A8, 0x6248C631}, ++ {0x48AC, 0x922A8253}, ++ {0x48B0, 0x00000005}, ++ {0x48B4, 0x00001759}, ++ {0x48B8, 0x4BA02000}, ++ {0x48BC, 0x831408BE}, ++ {0x4A88, 0x000000E9}, ++ {0x48C0, 0x9898A8BB}, ++ {0x48C4, 0x54535368}, ++ {0x48C8, 0x99999B13}, ++ {0x48CC, 0x55555899}, ++ {0x48D0, 0xBBB07453}, ++ {0x48D4, 0x777BBBBB}, ++ {0x48D8, 0x15277777}, ++ {0x48DC, 0x27039CE9}, ++ {0x48E0, 0x31413432}, ++ {0x48E4, 0x36058342}, ++ {0x48E8, 0x00000006}, ++ {0x48EC, 0x00000005}, ++ {0x48F0, 0x00000005}, ++ {0x48F4, 0xC7013016}, ++ {0x48F8, 0x84413016}, ++ {0x48FC, 0x84413016}, ++ {0x4900, 0x8C413016}, ++ {0x4904, 0x8C40B028}, ++ {0x4908, 0x3140B028}, ++ {0x490C, 0x2940B028}, ++ {0x4910, 0x8440B028}, ++ {0x4914, 0x2318C610}, ++ {0x4918, 0x45334753}, ++ {0x491C, 0x236A6A88}, ++ {0x4920, 0xAC8DF814}, ++ {0x4924, 0x08877ACB}, ++ {0x4928, 0x000007AA}, ++ {0x4A98, 0x00000000}, ++ {0x492C, 0xBCEB4A14}, ++ {0x4930, 0x000A3A4A}, ++ {0x4934, 0xBCEB4A14}, ++ {0x4938, 0x000A3A4A}, ++ {0x493C, 0x9A8A8A85}, ++ {0x4940, 0x0CA3B99A}, ++ {0x4944, 0x38384242}, ++ {0x4948, 0x8086102E}, ++ {0x494C, 0xCA24C82A}, ++ {0x4950, 0x00008A62}, ++ {0x4954, 0x00000008}, ++ {0x4958, 0x80040000}, ++ {0x495C, 0x80040000}, ++ {0x4960, 0xFE800000}, ++ {0x4964, 0x834C0000}, ++ {0x4968, 0x00000000}, ++ {0x496C, 0x00000000}, ++ {0x4970, 0x00000000}, ++ {0x4974, 0x00000000}, ++ {0x4978, 0x00000000}, ++ {0x497C, 0x00000000}, ++ {0x4980, 0x40000000}, ++ {0x4984, 0x00000000}, ++ {0x4988, 0x00000000}, ++ {0x498C, 0x00000000}, ++ {0x4990, 0x00000000}, ++ {0x4994, 0x04065800}, ++ {0x4998, 0x02004080}, ++ {0x499C, 0x0E1E3E05}, ++ {0x49A0, 0x0A163068}, ++ {0x49A4, 0x00206040}, ++ {0x49A8, 0x02020202}, ++ {0x49AC, 0x00002020}, ++ {0x49B0, 0xF8F8F418}, ++ {0x49B4, 0xF8E8F8F8}, ++ {0x49B8, 0xF80808E8}, ++ {0x4A00, 0xF8F8FA00}, ++ {0x4A04, 0xFAFAFAF8}, ++ {0x4A08, 0xFAFAFAFA}, ++ {0x4A28, 0xFAFAFAFA}, ++ {0x4A2C, 0xFAFAFAFA}, ++ {0x4A30, 0xFAFAFAFA}, ++ {0x4A34, 0xFAFAFAFA}, ++ {0x4A38, 0xFAFAFAFA}, ++ {0x4A3C, 0xFAFAFAFA}, ++ {0x4A40, 0xFAFAFAFA}, ++ {0x4A44, 0x0000FAFA}, ++ {0x49BC, 0x00000000}, ++ {0x49C0, 0x800CD62D}, ++ {0x49C4, 0x00000103}, ++ {0x49C8, 0x00000000}, ++ {0x49CC, 0x00000000}, ++ {0x49D0, 0x00000000}, ++ {0x49D4, 0x00000000}, ++ {0x49D8, 0x00000000}, ++ {0x49DC, 0x00000000}, ++ {0x49E0, 0x00000000}, ++ {0x49E4, 0x00000000}, ++ {0x49E8, 0x00000000}, ++ {0x49EC, 0x00000000}, ++ {0x994, 0x00000010}, ++ {0x904, 0x00000005}, ++ {0xC3C, 0x2840E1BF}, ++ {0xC40, 0x00000000}, ++ {0xC44, 0x00000007}, ++ {0xC48, 0x410E4000}, ++ {0xC54, 0x1EE14368}, ++ {0xC58, 0x41000000}, ++ {0x730, 0x00000002}, ++ {0xC60, 0x017FFFF2}, ++ {0xC64, 0x0010A130}, ++ {0xC68, 0x10000050}, ++ {0xC6C, 0x10001021}, ++ {0x708, 0x00000000}, ++ {0x884, 0x0043F01D}, ++ {0x704, 0x601E0100}, ++ {0x710, 0xEF810000}, ++ {0x704, 0x601E0100}, ++ {0xD40, 0xF64FA0F7}, ++ {0xD44, 0x0400063F}, ++ {0xD48, 0x0003FF7F}, ++ {0xD4C, 0x00000000}, ++ {0xD50, 0xF64FA0F7}, ++ {0xD54, 0x04100437}, ++ {0xD58, 0x0000FF7F}, ++ {0xD5C, 0x00000000}, ++ {0xD60, 0x00000000}, ++ {0xD64, 0x00000000}, ++ {0xD70, 0x00000015}, ++ {0xD90, 0x000003FF}, ++ {0xD94, 0x00000000}, ++ {0xD98, 0x0000003F}, ++ {0xD9C, 0x00000000}, ++ {0xDA0, 0x000003FE}, ++ {0xDA4, 0x00000000}, ++ {0xDA8, 0x0000003F}, ++ {0xDAC, 0x00000000}, ++ {0xD00, 0x77777777}, ++ {0xD04, 0xBBBBBBBB}, ++ {0xD08, 0xBBBBBBBB}, ++ {0xD0C, 0x00000070}, ++ {0xD10, 0x20110900}, ++ {0xD10, 0x20110FFF}, ++ {0xD78, 0x00000001}, ++ {0xD7C, 0x001D050E}, ++ {0xD84, 0x00004207}, ++ {0xD18, 0x50209900}, ++ {0xD80, 0x00804100}, ++ {0x718, 0x1333233F}, ++ {0x604, 0x041E1E1E}, ++ {0x714, 0x00010000}, ++ {0x586C, 0x000000F0}, ++ {0x586C, 0x000000E0}, ++ {0x586C, 0x000000D0}, ++ {0x586C, 0x000000C0}, ++ {0x586C, 0x000000B0}, ++ {0x586C, 0x000000A0}, ++ {0x586C, 0x00000090}, ++ {0x586C, 0x00000080}, ++ {0x586C, 0x00000070}, ++ {0x586C, 0x00000060}, ++ {0x586C, 0x00000050}, ++ {0x586C, 0x00000040}, ++ {0x586C, 0x00000030}, ++ {0x586C, 0x00000020}, ++ {0x586C, 0x00000010}, ++ {0x586C, 0x00000000}, ++ {0x786C, 0x000000F0}, ++ {0x786C, 0x000000E0}, ++ {0x786C, 0x000000D0}, ++ {0x786C, 0x000000C0}, ++ {0x786C, 0x000000B0}, ++ {0x786C, 0x000000A0}, ++ {0x786C, 0x00000090}, ++ {0x786C, 0x00000080}, ++ {0x786C, 0x00000070}, ++ {0x786C, 0x00000060}, ++ {0x786C, 0x00000050}, ++ {0x786C, 0x00000040}, ++ {0x786C, 0x00000030}, ++ {0x786C, 0x00000020}, ++ {0x786C, 0x00000010}, ++ {0x786C, 0x00000000}, ++ {0xC0D4, 0x4486888C}, ++ {0xC0D8, 0xC6BA10E1}, ++ {0xC0DC, 0x30C52868}, ++ {0xC0E0, 0x05008128}, ++ {0xC0E4, 0x0000A72B}, ++ {0xC1D4, 0x4486888C}, ++ {0xC1D8, 0xC6BA10E1}, ++ {0xC1DC, 0x30C52868}, ++ {0xC1E0, 0x05008128}, ++ {0xC1E4, 0x0000A72B}, ++ {0xC0EC, 0x00000000}, ++ {0xC0E4, 0x0000272B}, ++ {0xC1EC, 0x00000000}, ++ {0xC1E4, 0x0000272B}, ++ {0x334, 0xFFFFFFFF}, ++ {0x33C, 0x55000000}, ++ {0x340, 0x00005555}, ++ {0x724, 0x00111200}, ++ {0x5868, 0xA9550000}, ++ {0x5870, 0x33221100}, ++ {0x5874, 0x77665544}, ++ {0x5878, 0xBBAA9988}, ++ {0x587C, 0xFFEEDDCC}, ++ {0x5880, 0x76543210}, ++ {0x5884, 0xFEDCBA98}, ++ {0x5888, 0x00000000}, ++ {0x588C, 0x00000000}, ++ {0x5894, 0x00000008}, ++ {0x7868, 0xA9550000}, ++ {0x7870, 0x33221100}, ++ {0x7874, 0x77665544}, ++ {0x7878, 0xBBAA9988}, ++ {0x787C, 0xFFEEDDCC}, ++ {0x7880, 0x76543210}, ++ {0x7884, 0xFEDCBA98}, ++ {0x7888, 0x00000000}, ++ {0x788C, 0x00000000}, ++ {0x7894, 0x00000008}, ++ {0x650, 0x00200888}, ++ {0x710, 0xF3810000}, ++ {0x020, 0x0000F381}, ++ {0x024, 0x0000F381}, ++ {0x000, 0xC580801E}, ++ {0xC70, 0x00000400}, ++ {0x980, 0x10002250}, ++ {0x988, 0x3C3C4107}, ++ {0x994, 0x00000010}, ++ {0x2994, 0x00000010}, ++ {0x000, 0x0580801F}, ++ {0x240C, 0x00000000}, ++ {0x640, 0x140A141E}, ++ {0x640, 0x1414141E}, ++ {0x640, 0x1414141E}, ++ {0x644, 0x3414283C}, ++ {0x644, 0x3425283C}, ++ {0x644, 0x3426283C}, ++ {0x2640, 0x140A141E}, ++ {0x2640, 0x1414141E}, ++ {0x2640, 0x1414141E}, ++ {0x2644, 0x3414283C}, ++ {0x2644, 0x3425283C}, ++ {0x2644, 0x3425183C}, ++ {0x2300, 0x02748790}, ++ {0x2304, 0x00558670}, ++ {0x2308, 0x002883F0}, ++ {0x230C, 0x00090120}, ++ {0x2310, 0x00000000}, ++ {0x2314, 0x06000000}, ++ {0x2318, 0x00000000}, ++ {0x231C, 0x00000000}, ++ {0x2320, 0x03020100}, ++ {0x2324, 0x07060504}, ++ {0x2328, 0x0B0A0908}, ++ {0x232C, 0x0F0E0D0C}, ++ {0x2330, 0x13121110}, ++ {0x2334, 0x17161514}, ++ {0x2338, 0x0C700022}, ++ {0x233C, 0x0A0529D0}, ++ {0x2340, 0x000529D0}, ++ {0x2344, 0x0006318A}, ++ {0x2348, 0xB7E6318A}, ++ {0x234C, 0x80039C00}, ++ {0x2350, 0x80039C00}, ++ {0x2354, 0x0005298F}, ++ {0x2358, 0x0015296E}, ++ {0x235C, 0x0C07FC31}, ++ {0x2360, 0x0219AAAE}, ++ {0x2364, 0xE4F624C3}, ++ {0x2368, 0x53626F15}, ++ {0x236C, 0x48000000}, ++ {0x2370, 0x48000000}, ++ {0x2374, 0x07540000}, ++ {0x2378, 0x202401B9}, ++ {0x237C, 0x00F7000E}, ++ {0x2380, 0x0F0A1111}, ++ {0x2384, 0x30D9000F}, ++ {0x2388, 0x0200EA02}, ++ {0x238C, 0x003CB061}, ++ {0x2390, 0x69C00000}, ++ {0x2394, 0x00000000}, ++ {0x2398, 0x000000F0}, ++ {0x239C, 0x0001FFFF}, ++ {0x23A0, 0x00C80064}, ++ {0x23A4, 0x0190012C}, ++ {0x23A8, 0x001917BE}, ++ {0x23AC, 0x0B30880C}, ++ {0x23B0, 0x9281CE00}, ++ {0x23B4, 0x7F027C00}, ++ {0x704, 0x601E0102}, ++ {0x704, 0x601E0102}, ++ {0x5864, 0x080801FF}, ++ {0x7864, 0x080801FF}, ++ {0xC60, 0x017FFFF3}, ++ {0x58AC, 0x08000000}, ++ {0x78AC, 0x08000000}, ++ {0x8088, 0x007F0000}, ++ {0x81A4, 0x003F3A00}, ++ {0x81B4, 0x0100007F}, ++ {0x81C0, 0x0060010B}, ++ {0x81A0, 0x00000010}, ++ {0x8138, 0x00000002}, ++ {0x82A4, 0x003F3A00}, ++ {0x82B4, 0x0100007F}, ++ {0x82C0, 0x0060010B}, ++ {0x82A0, 0x00000010}, ++ {0x81A0, 0x00000010}, ++ {0x8238, 0x00000002}, ++ {0x8088, 0x00000000}, ++ {0x8020, 0x00000000}, ++ {0x8120, 0x00000000}, ++ {0x8220, 0x00000000}, ++ {0x8124, 0x00000F0F}, ++ {0x8224, 0x00000F0F}, ++ {0x5864, 0x180801FF}, ++ {0x7864, 0x180801FF}, ++ {0xC60, 0x017FFFF3}, ++ {0xC70, 0x00000600}, ++ {0xC70, 0x00000660}, ++ {0x58AC, 0x08000000}, ++ {0x78AC, 0x08000000}, ++ {0x8120, 0x10000000}, ++ {0x8120, 0x10030000}, ++ {0x8124, 0x00000F0F}, ++ {0x8124, 0x00000F0F}, ++ {0x8224, 0x00000F0F}, ++ {0x8224, 0x00000F0F}, ++ {0x8220, 0x10000000}, ++ {0x8220, 0x10030000}, ++ {0x704, 0x601E0100}, ++ {0x5864, 0x100801FF}, ++ {0x7864, 0x100801FF}, ++ {0x5864, 0x180801FF}, ++ {0x7864, 0x180801FF}, ++ {0x58D4, 0x7401FE00}, ++ {0x78D4, 0x7401FE00}, ++ {0x58F0, 0x400401FF}, ++ {0x78F0, 0x400401FF}, ++ {0x58F0, 0x400401FF}, ++ {0x78F0, 0x400401FF}, ++ {0x704, 0x601E0102}, ++ {0xC7C, 0x0020BFE0}, ++ {0x58C0, 0x00FE0000}, ++ {0x58FC, 0x00000000}, ++ {0x566C, 0x00000005}, ++ {0x566C, 0x00001005}, ++ {0x78C0, 0x00FE0000}, ++ {0x78FC, 0x00000000}, ++ {0x700, 0x00000030}, ++ {0x704, 0x601E0102}, ++ {0x704, 0x601E0100}, ++ {0x704, 0x601E0502}, ++ {0x20FC, 0x00000000}, ++ {0x20F8, 0x00000000}, ++ {0x20F0, 0x00000000}, ++ {0x9C0, 0x00000001}, ++ {0x9C0, 0x00000000}, ++ {0x9C0, 0x00000001}, ++ {0x9C0, 0x00000000}, ++ {0x4AE8, 0x00000744}, ++ {0x4AF0, 0x00000744}, ++ {0x1010, 0x00000010}, ++ {0x3010, 0x00000010}, ++ {0x4AD4, 0x00000040}, ++ {0x4AE0, 0x00000040}, ++ {0x4AE4, 0x0079E99E}, ++ {0x4AEC, 0x0079E99E}, ++ {0x300, 0xF30CE31C}, ++ {0x304, 0x13EF1F19}, ++ {0x308, 0x0C0CF3F3}, ++ {0x30C, 0x0C0C0C0C}, ++ {0x310, 0x80496000}, ++ {0x314, 0x0041E000}, ++ {0x318, 0x20022042}, ++ {0x31C, 0x20448009}, ++ {0x320, 0x00010031}, ++ {0x324, 0xE000E000}, ++ {0x328, 0xE000E000}, ++ {0x32C, 0xE000E000}, ++ {0x12BC, 0x10104041}, ++ {0x12C0, 0x14411111}, ++ {0x32BC, 0x10104041}, ++ {0x32C0, 0x14411111}, ++ {0x010, 0x0005FFFF}, ++ {0x028, 0x0000F381}, ++ {0x02C, 0x0000F381}, ++ {0x620, 0x00141230}, ++ {0x704, 0x601C05FF}, ++ {0x720, 0x20000000}, ++ {0x738, 0x004100CC}, ++ {0x12A0, 0x24903056}, ++ {0x12AC, 0x12333121}, ++ {0x12B8, 0x30020000}, ++ {0x12E4, 0x30D52A68}, ++ {0x2000, 0x50BBBF04}, ++ {0x32A0, 0x24903056}, ++ {0x32AC, 0x12333121}, ++ {0x32B8, 0x30020000}, ++ {0x32E4, 0x30D52A68}, ++ {0x5800, 0x03FF807F}, ++ {0x5804, 0x04237040}, ++ {0x5808, 0x04237040}, ++ {0x7800, 0x03FF807F}, ++ {0x7804, 0x04237040}, ++ {0x7808, 0x04237040}, ++ {0x73C, 0x00000002}, ++ {0x74C, 0x00000001}, ++ {0x748, 0x00000002}, ++ {0x5818, 0x082C1800}, ++ {0x7818, 0x082C1800}, ++ {0x624, 0x0101030A}, ++ {0xC14, 0x85010000}, ++ {0xDD4, 0x00000001}, ++ {0x241C, 0x00000001}, ++ {0x1200, 0x00010142}, ++ {0x3200, 0x00010142}, ++ {0xC0F8, 0x00000001}, ++ {0xC1F8, 0x00000001}, ++ {0x35C, 0x000004C4}, ++ {0x0F0, 0x00000002}, ++ {0x0F4, 0x00000028}, ++ {0x0F8, 0x20220408}, ++}; ++ ++static const struct rtw89_reg2_def rtw89_8852b_phy_bb_reg_gain[] = { ++ {0x000, 0x18FBDDB7}, ++ {0x001, 0x006F5436}, ++ {0x002, 0x00004F31}, ++ {0x100, 0x1BFEE0B7}, ++ {0x101, 0x006C5238}, ++ {0x102, 0x00005031}, ++ {0x10000, 0x07E6C39E}, ++ {0x10001, 0x00654526}, ++ {0x10002, 0x00006750}, ++ {0x10100, 0x09E9C69F}, ++ {0x10101, 0x00674627}, ++ {0x10102, 0x00006750}, ++ {0x20000, 0x06E8C49F}, ++ {0x20001, 0x00654526}, ++ {0x20002, 0x00006750}, ++ {0x20100, 0x07E9C6A0}, ++ {0x20101, 0x00674728}, ++ {0x20102, 0x00006850}, ++ {0x30000, 0x04E5C39D}, ++ {0x30001, 0x00634325}, ++ {0x30002, 0x00006750}, ++ {0x30100, 0x06E9C69F}, ++ {0x30101, 0x00654527}, ++ {0x30102, 0x00006750}, ++ {0x1000000, 0x000000F4}, ++ {0x1000010, 0x000000F8}, ++ {0x1000011, 0x0000F8F8}, ++ {0x1000100, 0x000000F8}, ++ {0x1000110, 0x00000000}, ++ {0x1000111, 0x00000000}, ++ {0x1010000, 0x000000F4}, ++ {0x1010010, 0x000000F8}, ++ {0x1010011, 0x0000F8F8}, ++ {0x1010020, 0x000000F8}, ++ {0x1010021, 0x0808E8E8}, ++ {0x1010029, 0x0000F8F8}, ++ {0x1010100, 0x000000F4}, ++ {0x1010110, 0x000000F8}, ++ {0x1010111, 0x0000F8F8}, ++ {0x1010120, 0x000000F8}, ++ {0x1010121, 0x0808E8E8}, ++ {0x1010129, 0x0000F8F8}, ++ {0x1020000, 0x000000F4}, ++ {0x1020010, 0x000000F8}, ++ {0x1020011, 0x0000F8F8}, ++ {0x1020020, 0x000000F8}, ++ {0x1020021, 0x0808E8E8}, ++ {0x1020029, 0x0000F8F8}, ++ {0x1020100, 0x000000F4}, ++ {0x1020110, 0x000000F8}, ++ {0x1020111, 0x0000F8F8}, ++ {0x1020120, 0x000000F8}, ++ {0x1020121, 0x0808E8E8}, ++ {0x1020129, 0x0000F8F8}, ++ {0x1030000, 0x000000F4}, ++ {0x1030010, 0x000000F8}, ++ {0x1030011, 0x0000F8F8}, ++ {0x1030020, 0x000000F8}, ++ {0x1030021, 0x0808E8E8}, ++ {0x1030029, 0x0000F8F8}, ++ {0x1030100, 0x000000F4}, ++ {0x1030110, 0x000000F8}, ++ {0x1030111, 0x0000F8F8}, ++ {0x1030120, 0x000000F8}, ++ {0x1030121, 0x0808E8E8}, ++ {0x1030129, 0x0000F8F8}, ++}; ++ ++static const struct rtw89_reg2_def rtw89_8852b_phy_radioa_regs[] = { ++ {0xF0010000, 0x00000000}, ++ {0xF0020000, 0x00000001}, ++ {0xF0010001, 0x00000002}, ++ {0xF0020001, 0x00000003}, ++ {0xF0030001, 0x00000004}, ++ {0xF0040001, 0x00000005}, ++ {0xF0050001, 0x00000006}, ++ {0xF0060001, 0x00000007}, ++ {0xF0070001, 0x00000008}, ++ {0xF0080001, 0x00000009}, ++ {0xF0290001, 0x0000000A}, ++ {0xF02B0001, 0x0000000B}, ++ {0x005, 0x00000000}, ++ {0x000, 0x00030000}, ++ {0x10000, 0x00030000}, ++ {0x018, 0x00011124}, ++ {0x10018, 0x00011124}, ++ {0x000, 0x00033C00}, ++ {0x10000, 0x00033C00}, ++ {0x01A, 0x00040004}, ++ {0x011, 0x00014073}, ++ {0x067, 0x00000070}, ++ {0x059, 0x000A0000}, ++ {0x066, 0x00000100}, ++ {0x057, 0x0000D589}, ++ {0x05A, 0x0007FFFF}, ++ {0x0A4, 0x0006FF12}, ++ {0x043, 0x00005000}, ++ {0x0E1, 0x00000001}, ++ {0x0DD, 0x000001A0}, ++ {0x0CA, 0x00002000}, ++ {0x0D3, 0x00000003}, ++ {0x0B3, 0x0004EFE0}, ++ {0x0B4, 0x0007C07E}, ++ {0x0B5, 0x0003A701}, ++ {0x0B6, 0x000581E0}, ++ {0x0B7, 0x00001A0A}, ++ {0x0BB, 0x000C7000}, ++ {0x0ED, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000543}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000542}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000541}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000521}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00000343}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00000342}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000341}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000321}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x000005C3}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x000005C2}, ++ {0x033, 0x0000000A}, ++ {0x03F, 0x000005C1}, ++ {0x033, 0x0000000B}, ++ {0x03F, 0x000005A1}, ++ {0x033, 0x0000000C}, ++ {0x03F, 0x000002C3}, ++ {0x033, 0x0000000D}, ++ {0x03F, 0x000002C2}, ++ {0x033, 0x0000000E}, ++ {0x03F, 0x000002C1}, ++ {0x033, 0x0000000F}, ++ {0x03F, 0x000002A1}, ++ {0x0ED, 0x00000000}, ++ {0x0ED, 0x00002000}, ++ {0x033, 0x00000002}, ++ {0x03D, 0x0004A883}, ++ {0x03E, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000006}, ++ {0x03D, 0x0004A883}, ++ {0x03E, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x0ED, 0x00000000}, ++ {0x018, 0x00001001}, ++ {0x10018, 0x00001001}, ++ {0x002, 0x0000000D}, ++ {0x10002, 0x0000000D}, ++ {0x0EE, 0x00000004}, ++ {0x033, 0x0000000B}, ++ {0x03F, 0x0000000B}, ++ {0x033, 0x0000000C}, ++ {0x03F, 0x00000012}, ++ {0x033, 0x0000000D}, ++ {0x03F, 0x00000019}, ++ {0x0EE, 0x00000000}, ++ {0x08F, 0x000D0F7A}, ++ {0x0EF, 0x00080000}, ++ {0x033, 0x00000008}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000034C0}, ++ {0x033, 0x0000000A}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000035D0}, ++ {0x033, 0x0000000B}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000035C8}, ++ {0x033, 0x0000008A}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000035F7}, ++ {0x0EF, 0x00000000}, ++ {0x08D, 0x000CC800}, ++ {0x0EF, 0x00004000}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00090600}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000A3500}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000A3400}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00008B00}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00001B00}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00003A00}, ++ {0x033, 0x0000000F}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x0000000E}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x0000000D}, ++ {0x03F, 0x00090600}, ++ {0x033, 0x0000000C}, ++ {0x03F, 0x000A3500}, ++ {0x033, 0x0000000B}, ++ {0x03F, 0x000A3400}, ++ {0x033, 0x0000000A}, ++ {0x03F, 0x00008B00}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x00001B00}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00003A00}, ++ {0x0EF, 0x00000000}, ++ {0x0EE, 0x00000010}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00000001}, ++ {0x0EE, 0x00000000}, ++ {0x0EF, 0x00001000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000017}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00008000}, ++ {0x033, 0x00000000}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000001}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000002}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000003}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000004}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000005}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000006}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000008}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000009}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000000A}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000000B}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x0000000C}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x0000000D}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x0000000E}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000010}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000011}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000012}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000013}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000014}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000015}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000016}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000020}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000021}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000022}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000023}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000024}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000025}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000026}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000028}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000029}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000002A}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000002B}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x0000002C}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x0000002D}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x0000002E}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000030}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000031}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000032}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000033}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000034}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000035}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000036}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00000100}, ++ {0x033, 0x00000000}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000001}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000002}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00004376}, ++ {0x033, 0x00000004}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000005}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00004376}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00004376}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00004376}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x00004376}, ++ {0x033, 0x0000000A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000010}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000011}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000012}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000013}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000014}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000015}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000016}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000017}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000020}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000021}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000022}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000023}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000024}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000025}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000026}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000027}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004386}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004396}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x067, 0x00008072}, ++ {0x0EF, 0x00000010}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000ED5}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000FC7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000783}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00000973}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00000762}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000762}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00000080}, ++ {0x033, 0x00000000}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000001}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000002}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000003}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000004}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000005}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000006}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000007}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000008}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000009}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000010}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000011}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000012}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000013}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023958}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000014}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000015}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000016}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000017}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000018}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000019}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001A}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001B}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001C}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001D}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000020}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000021}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000022}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000023}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000024}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000025}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000026}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000027}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000028}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000029}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002C}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002D}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000030}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000031}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000032}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000033}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000034}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000035}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000036}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000037}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000038}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000039}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026858}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000003A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000003B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00023A58}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x0002C758}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x0EE, 0x00000800}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000005}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000007}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000006}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000007}, ++ {0x0EE, 0x00000000}, ++ {0x0EE, 0x00001000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00003000}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00003001}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00003003}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00003007}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x0000300F}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x0000310F}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x0000330F}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x0000330F}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00003000}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x00003001}, ++ {0x033, 0x0000000A}, ++ {0x03F, 0x00003003}, ++ {0x033, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00003103}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00002307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xB0000000, 0x00000000}, ++ {0x0EE, 0x00000000}, ++ {0x0EE, 0x00000200}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000005}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000007}, ++ {0x0EE, 0x00000000}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000004}, ++ {0x03D, 0x00000078}, ++ {0x03E, 0x00080000}, ++ {0x03F, 0x00000000}, ++ {0x033, 0x00000005}, ++ {0x03D, 0x0000007B}, ++ {0x03E, 0x00020000}, ++ {0x03F, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x0DE, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x033, 0x00000000}, ++ {0x008, 0x00060280}, ++ {0x009, 0x00030400}, ++ {0x0EF, 0x00000000}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000200}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x0000007F}, ++ {0x0EF, 0x00000000}, ++ {0x06E, 0x00077A18}, ++ {0x06F, 0x00077A18}, ++ {0x06D, 0x00000C31}, ++ {0x0EF, 0x00020000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000005FF}, ++ {0x0EF, 0x00000000}, ++ {0x005, 0x00000001}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0xA0000000, 0x00000000}, ++ {0x094, 0x000001FC}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00002000}, ++ {0x10033, 0x00000080}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000081}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000082}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000083}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000084}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000085}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000086}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000087}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000088}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000089}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000090}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A2}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A3}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C2}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C3}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00004000}, ++ {0x10033, 0x00000080}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x00000081}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x00000082}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x00000083}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x00000084}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000085}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000086}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000087}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000088}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000089}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000090}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000091}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A0}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x000000A1}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x000000A2}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x000000A3}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x000000A4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C0}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x000000C1}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x000000C2}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x000000C3}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x000000C4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00002000}, ++ {0x10033, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0x10033, 0x00000001}, ++ {0x1003F, 0x000000F3}, ++ {0x10033, 0x00000002}, ++ {0x1003F, 0x000000F0}, ++ {0x10033, 0x00000003}, ++ {0x1003F, 0x000000ED}, ++ {0x10033, 0x00000004}, ++ {0x1003F, 0x000000EA}, ++ {0x10033, 0x00000005}, ++ {0x1003F, 0x000000E7}, ++ {0x10033, 0x00000006}, ++ {0x1003F, 0x000000A6}, ++ {0x10033, 0x00000007}, ++ {0x1003F, 0x000000A3}, ++ {0x10033, 0x00000008}, ++ {0x1003F, 0x00000063}, ++ {0x10033, 0x00000009}, ++ {0x1003F, 0x00000060}, ++ {0x10033, 0x0000000A}, ++ {0x1003F, 0x00000023}, ++ {0x10033, 0x0000000B}, ++ {0x1003F, 0x00000020}, ++ {0x10033, 0x0000000C}, ++ {0x1003F, 0x0000001D}, ++ {0x10033, 0x0000000D}, ++ {0x1003F, 0x0000001A}, ++ {0x10033, 0x0000000E}, ++ {0x1003F, 0x00000017}, ++ {0x10033, 0x0000000F}, ++ {0x1003F, 0x00000014}, ++ {0x10033, 0x00000010}, ++ {0x1003F, 0x00000011}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00004000}, ++ {0x10033, 0x00000000}, ++ {0x1003F, 0x000001AF}, ++ {0x10033, 0x00000001}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x00000002}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x00000003}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x00000004}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x00000005}, ++ {0x1003F, 0x0000015F}, ++ {0x10033, 0x00000006}, ++ {0x1003F, 0x00000159}, ++ {0x10033, 0x00000007}, ++ {0x1003F, 0x0000011F}, ++ {0x10033, 0x00000008}, ++ {0x1003F, 0x00000119}, ++ {0x10033, 0x00000009}, ++ {0x1003F, 0x000000DF}, ++ {0x10033, 0x0000000A}, ++ {0x1003F, 0x000000D9}, ++ {0x10033, 0x0000000B}, ++ {0x1003F, 0x0000009F}, ++ {0x10033, 0x0000000C}, ++ {0x1003F, 0x00000099}, ++ {0x10033, 0x0000000D}, ++ {0x1003F, 0x0000005F}, ++ {0x10033, 0x0000000E}, ++ {0x1003F, 0x00000059}, ++ {0x10033, 0x0000000F}, ++ {0x1003F, 0x0000001F}, ++ {0x10033, 0x00000010}, ++ {0x1003F, 0x00000019}, ++ {0x10033, 0x00000011}, ++ {0x1003F, 0x00000013}, ++ {0x100EE, 0x00000000}, ++ {0x10005, 0x00000001}, ++ {0x09F, 0x00000032}, ++}; ++ ++static const struct rtw89_reg2_def rtw89_8852b_phy_radiob_regs[] = { ++ {0xF0010000, 0x00000000}, ++ {0xF0020000, 0x00000001}, ++ {0xF0010001, 0x00000002}, ++ {0xF0020001, 0x00000003}, ++ {0xF0030001, 0x00000004}, ++ {0xF0040001, 0x00000005}, ++ {0xF0050001, 0x00000006}, ++ {0xF0060001, 0x00000007}, ++ {0xF0070001, 0x00000008}, ++ {0xF0080001, 0x00000009}, ++ {0xF0290001, 0x0000000A}, ++ {0xF02B0001, 0x0000000B}, ++ {0x005, 0x00000000}, ++ {0x000, 0x00030000}, ++ {0x10000, 0x00030000}, ++ {0x018, 0x00011124}, ++ {0x10018, 0x00011124}, ++ {0x000, 0x00033C00}, ++ {0x10000, 0x00033C00}, ++ {0x01A, 0x00040004}, ++ {0x011, 0x00014073}, ++ {0x067, 0x00000070}, ++ {0x059, 0x000A0000}, ++ {0x066, 0x00000100}, ++ {0x05A, 0x0007F000}, ++ {0x0A4, 0x0006FF12}, ++ {0x043, 0x00005000}, ++ {0x0E1, 0x00000001}, ++ {0x0DD, 0x000001A0}, ++ {0x0CA, 0x00002000}, ++ {0x0D3, 0x00000003}, ++ {0x0B3, 0x0004EFE0}, ++ {0x0B4, 0x0007C03E}, ++ {0x0B5, 0x0003A201}, ++ {0x0BB, 0x000C7000}, ++ {0x0ED, 0x00002000}, ++ {0x033, 0x00000002}, ++ {0x03D, 0x0004A883}, ++ {0x03E, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000006}, ++ {0x03D, 0x0004A883}, ++ {0x03E, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x0ED, 0x00000000}, ++ {0x018, 0x00001001}, ++ {0x10018, 0x00001001}, ++ {0x002, 0x0000000D}, ++ {0x10002, 0x0000000D}, ++ {0x0EE, 0x00000004}, ++ {0x033, 0x0000000B}, ++ {0x03F, 0x0000000B}, ++ {0x033, 0x0000000C}, ++ {0x03F, 0x00000012}, ++ {0x033, 0x0000000D}, ++ {0x03F, 0x00000019}, ++ {0x0EE, 0x00000000}, ++ {0x08F, 0x000D0F7A}, ++ {0x0EF, 0x00080000}, ++ {0x033, 0x00000008}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D30}, ++ {0xA0000000, 0x00000000}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000034C0}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D74}, ++ {0xA0000000, 0x00000000}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000035D0}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D72}, ++ {0xA0000000, 0x00000000}, ++ {0x03E, 0x000000C4}, ++ {0x03F, 0x000035C8}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000008A}, ++ {0x03E, 0x00000031}, ++ {0x03F, 0x00000D7D}, ++ {0x0EF, 0x00000000}, ++ {0x08D, 0x000CC800}, ++ {0x0EF, 0x00004000}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00090600}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000A3500}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000A3400}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00008B00}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00001B00}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00003A00}, ++ {0x033, 0x0000000F}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x0000000E}, ++ {0x03F, 0x00000700}, ++ {0x033, 0x0000000D}, ++ {0x03F, 0x00090600}, ++ {0x033, 0x0000000C}, ++ {0x03F, 0x000A3500}, ++ {0x033, 0x0000000B}, ++ {0x03F, 0x000A3400}, ++ {0x033, 0x0000000A}, ++ {0x03F, 0x00008B00}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x00001B00}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00003A00}, ++ {0x033, 0x00000017}, ++ {0x03F, 0x00000705}, ++ {0x033, 0x00000016}, ++ {0x03F, 0x00000705}, ++ {0x033, 0x00000015}, ++ {0x03F, 0x00090605}, ++ {0x033, 0x00000014}, ++ {0x03F, 0x000A3505}, ++ {0x033, 0x00000013}, ++ {0x03F, 0x000A3405}, ++ {0x033, 0x00000012}, ++ {0x03F, 0x00008B05}, ++ {0x033, 0x00000011}, ++ {0x03F, 0x00001B05}, ++ {0x033, 0x00000010}, ++ {0x03F, 0x00003A05}, ++ {0x0EF, 0x00000000}, ++ {0x0EE, 0x00000010}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00000001}, ++ {0x0EE, 0x00000000}, ++ {0x0EF, 0x00001000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x033, 0x00000001}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000002}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000015}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000003}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000005}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000007}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00008000}, ++ {0x033, 0x00000000}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000001}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000002}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000003}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000004}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000005}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000006}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000008}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000009}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000000A}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000000B}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x0000000C}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x0000000D}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x0000000E}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000010}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000011}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000012}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000013}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000014}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000015}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000016}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000020}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000021}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000022}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000023}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000024}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000025}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000026}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000028}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000029}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000002A}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x0000002B}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x0000002C}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x0000002D}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x0000002E}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x033, 0x00000030}, ++ {0x03E, 0x00004FC0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000031}, ++ {0x03E, 0x000046C0}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000032}, ++ {0x03E, 0x00004240}, ++ {0x03F, 0x00000087}, ++ {0x033, 0x00000033}, ++ {0x03E, 0x00008010}, ++ {0x03F, 0x00000147}, ++ {0x033, 0x00000034}, ++ {0x03E, 0x0000A048}, ++ {0x03F, 0x0000004F}, ++ {0x033, 0x00000035}, ++ {0x03E, 0x0000A030}, ++ {0x03F, 0x0000005F}, ++ {0x033, 0x00000036}, ++ {0x03E, 0x0000A000}, ++ {0x03F, 0x0000009F}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00000100}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00004346}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00004346}, ++ {0x033, 0x00000003}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00004346}, ++ {0x033, 0x00000005}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004317}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000006}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000007}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000008}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000009}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004376}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x000043A6}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000010}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000011}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000012}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000013}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000014}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000015}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000016}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000017}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000020}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000021}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004347}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000022}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00004346}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00004366}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000023}, ++ {0x03F, 0x00004386}, ++ {0x033, 0x00000024}, ++ {0x03F, 0x00004386}, ++ {0x033, 0x00000025}, ++ {0x03F, 0x00004386}, ++ {0x033, 0x00000026}, ++ {0x03F, 0x00004386}, ++ {0x033, 0x00000027}, ++ {0x03F, 0x00004386}, ++ {0x0EF, 0x00000000}, ++ {0x067, 0x00008072}, ++ {0x0EF, 0x00000010}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000ED5}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000FC5}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000A93}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00000973}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00000761}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000761}, ++ {0x0EF, 0x00000000}, ++ {0x0EF, 0x00000080}, ++ {0x033, 0x00000000}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000001}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000002}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000003}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000004}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000005}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000006}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000007}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000008}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000009}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000010}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000011}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000012}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000013}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020758}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000014}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000015}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000016}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000017}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000018}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000019}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001A}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001B}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001C}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001D}, ++ {0x03E, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000001F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000020}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000021}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000022}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000023}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000024}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000025}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000026}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000027}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000028}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000029}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002C}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002D}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002E}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000002F}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000030}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000031}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000032}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000033}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000034}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000035}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000036}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000037}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000038}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000039}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022658}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00026458}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000003A}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00022858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000003B}, ++ {0x03E, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00020858}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00027558}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x0EE, 0x00000800}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000005}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000007}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x00000006}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x00000007}, ++ {0x0EE, 0x00000000}, ++ {0x0EE, 0x00001000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00003000}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00003001}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00003003}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00003007}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x0000300F}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x0000310F}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x0000330F}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x0000330F}, ++ {0x033, 0x00000008}, ++ {0x03F, 0x00003000}, ++ {0x033, 0x00000009}, ++ {0x03F, 0x00003001}, ++ {0x033, 0x0000000A}, ++ {0x03F, 0x00003003}, ++ {0x033, 0x0000000B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003007}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00003103}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003107}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00003307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00002307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00001307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x0000000F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xA0000000, 0x00000000}, ++ {0x03F, 0x00000307}, ++ {0xB0000000, 0x00000000}, ++ {0x0EE, 0x00000000}, ++ {0x0EE, 0x00000200}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x00000001}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x00000003}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x00000005}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x00000007}, ++ {0x0EE, 0x00000000}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x0EC, 0x00000100}, ++ {0xB0000000, 0x00000000}, ++ {0x033, 0x00000004}, ++ {0x03D, 0x00000078}, ++ {0x03E, 0x00080000}, ++ {0x03F, 0x00000000}, ++ {0x033, 0x00000005}, ++ {0x03D, 0x0000007B}, ++ {0x03E, 0x00020000}, ++ {0x03F, 0x00000000}, ++ {0x0EC, 0x00000000}, ++ {0x0DE, 0x00000000}, ++ {0x0EF, 0x00000000}, ++ {0x033, 0x00000000}, ++ {0x008, 0x00060280}, ++ {0x009, 0x00030400}, ++ {0x0EF, 0x00000000}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000013F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FB}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x0EF, 0x00000400}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x000001FF}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x000001F7}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x000000FF}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x000000FF}, ++ {0xB0000000, 0x00000000}, ++ {0x0EF, 0x00000200}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000001}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000002}, ++ {0x03F, 0x0000017F}, ++ {0x033, 0x00000003}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000004}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000005}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000006}, ++ {0x03F, 0x0000007F}, ++ {0x033, 0x00000007}, ++ {0x03F, 0x0000007F}, ++ {0x0EF, 0x00000000}, ++ {0x06E, 0x00077A18}, ++ {0x06F, 0x00077A18}, ++ {0x06D, 0x00000C31}, ++ {0x0EF, 0x00020000}, ++ {0x033, 0x00000000}, ++ {0x03F, 0x000005FF}, ++ {0x0EF, 0x00000000}, ++ {0x005, 0x00000001}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x094, 0x000000FC}, ++ {0xA0000000, 0x00000000}, ++ {0x094, 0x000001FC}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00002000}, ++ {0x10033, 0x00000080}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000081}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000082}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000083}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000084}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000085}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000086}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000087}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000088}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000089}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000090}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A2}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A3}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000FB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C2}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F5}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000F0}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C3}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000F2}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000ED}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000EA}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000EC}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000E7}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000AB}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A6}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000A8}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000A3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000068}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000063}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000065}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000060}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000002B}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000026}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000028}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000023}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000025}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000020}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000022}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000001A}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001C}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000017}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000014}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00004000}, ++ {0x10033, 0x00000080}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x00000081}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x00000082}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x00000083}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x00000084}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000085}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000086}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000087}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000088}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000089}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008A}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008B}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008C}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008D}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008E}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x0000008F}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000090}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x00000091}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A0}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x000000A1}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x000000A2}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x000000A3}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x000000A4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000A9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000AF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000B1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C0}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x000000C1}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x000000C2}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x000000C3}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x000000C4}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000158}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000191}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C5}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000011F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000018B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C6}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000119}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000014D}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C7}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000010B}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C8}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000DF}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000C9}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000009F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D9}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CA}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x000000D3}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CB}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000005F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000099}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CC}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000093}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CD}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000001F}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000059}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CE}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000053}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000CF}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000019}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D0}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x00000013}, ++ {0xB0000000, 0x00000000}, ++ {0x10033, 0x000000D1}, ++ {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90040001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90050001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90060001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90070001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90080001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x90290001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0x902b0001, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x1003F, 0x00000007}, ++ {0xA0000000, 0x00000000}, ++ {0x1003F, 0x0000000D}, ++ {0xB0000000, 0x00000000}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00002000}, ++ {0x10033, 0x00000000}, ++ {0x1003F, 0x000000F6}, ++ {0x10033, 0x00000001}, ++ {0x1003F, 0x000000F3}, ++ {0x10033, 0x00000002}, ++ {0x1003F, 0x000000F0}, ++ {0x10033, 0x00000003}, ++ {0x1003F, 0x000000ED}, ++ {0x10033, 0x00000004}, ++ {0x1003F, 0x000000EA}, ++ {0x10033, 0x00000005}, ++ {0x1003F, 0x000000E7}, ++ {0x10033, 0x00000006}, ++ {0x1003F, 0x000000A6}, ++ {0x10033, 0x00000007}, ++ {0x1003F, 0x000000A3}, ++ {0x10033, 0x00000008}, ++ {0x1003F, 0x00000063}, ++ {0x10033, 0x00000009}, ++ {0x1003F, 0x00000060}, ++ {0x10033, 0x0000000A}, ++ {0x1003F, 0x00000023}, ++ {0x10033, 0x0000000B}, ++ {0x1003F, 0x00000020}, ++ {0x10033, 0x0000000C}, ++ {0x1003F, 0x0000001D}, ++ {0x10033, 0x0000000D}, ++ {0x1003F, 0x0000001A}, ++ {0x10033, 0x0000000E}, ++ {0x1003F, 0x00000017}, ++ {0x10033, 0x0000000F}, ++ {0x1003F, 0x00000014}, ++ {0x10033, 0x00000010}, ++ {0x1003F, 0x00000011}, ++ {0x100EE, 0x00000000}, ++ {0x100EE, 0x00004000}, ++ {0x10033, 0x00000000}, ++ {0x1003F, 0x000001AF}, ++ {0x10033, 0x00000001}, ++ {0x1003F, 0x000001A9}, ++ {0x10033, 0x00000002}, ++ {0x1003F, 0x000001A3}, ++ {0x10033, 0x00000003}, ++ {0x1003F, 0x0000019D}, ++ {0x10033, 0x00000004}, ++ {0x1003F, 0x00000197}, ++ {0x10033, 0x00000005}, ++ {0x1003F, 0x0000015F}, ++ {0x10033, 0x00000006}, ++ {0x1003F, 0x00000159}, ++ {0x10033, 0x00000007}, ++ {0x1003F, 0x0000011F}, ++ {0x10033, 0x00000008}, ++ {0x1003F, 0x00000119}, ++ {0x10033, 0x00000009}, ++ {0x1003F, 0x000000DF}, ++ {0x10033, 0x0000000A}, ++ {0x1003F, 0x000000D9}, ++ {0x10033, 0x0000000B}, ++ {0x1003F, 0x0000009F}, ++ {0x10033, 0x0000000C}, ++ {0x1003F, 0x00000099}, ++ {0x10033, 0x0000000D}, ++ {0x1003F, 0x0000005F}, ++ {0x10033, 0x0000000E}, ++ {0x1003F, 0x00000059}, ++ {0x10033, 0x0000000F}, ++ {0x1003F, 0x0000001F}, ++ {0x10033, 0x00000010}, ++ {0x1003F, 0x00000019}, ++ {0x10033, 0x00000011}, ++ {0x1003F, 0x00000013}, ++ {0x100EE, 0x00000000}, ++ {0x10005, 0x00000001}, ++ {0x09F, 0x00000032}, ++}; ++ ++static const struct rtw89_reg2_def rtw89_8852b_phy_nctl_regs[] = { ++ {0x8000, 0x00000008}, ++ {0x8008, 0x00000000}, ++ {0x8004, 0xf0862966}, ++ {0x800c, 0x78000000}, ++ {0x8010, 0x88015000}, ++ {0x8014, 0x80010100}, ++ {0x8018, 0x10010100}, ++ {0x801c, 0xa210bc00}, ++ {0x8020, 0x000403e0}, ++ {0x8024, 0x00072160}, ++ {0x8028, 0x00180e00}, ++ {0x8030, 0x400000c0}, ++ {0x8034, 0x11000830}, ++ {0x8038, 0x00000009}, ++ {0x803c, 0x00000008}, ++ {0x8040, 0x00000046}, ++ {0x8044, 0x0010001f}, ++ {0x8048, 0xf0000003}, ++ {0x804c, 0x62ac6162}, ++ {0x8050, 0xf2acf162}, ++ {0x8054, 0x62ac6162}, ++ {0x8058, 0xf2acf162}, ++ {0x805c, 0x150c0b02}, ++ {0x8060, 0x150c0b02}, ++ {0x8064, 0x2aa00047}, ++ {0x8074, 0x80000000}, ++ {0x807c, 0x000000ee}, ++ {0x8088, 0x80000000}, ++ {0x8098, 0x0000ff00}, ++ {0x809c, 0x0000001f}, ++ {0x80a0, 0x00010300}, ++ {0x80b8, 0x00001000}, ++ {0x80b0, 0x00000000}, ++ {0x80d0, 0x00000000}, ++ {0x80ec, 0x00000002}, ++ {0x810c, 0x33112200}, ++ {0x8110, 0x33112200}, ++ {0x8114, 0x00000000}, ++ {0x8120, 0x10010000}, ++ {0x8124, 0x00000000}, ++ {0x812c, 0x0000c000}, ++ {0x8138, 0x40000000}, ++ {0x813c, 0x40000000}, ++ {0x8140, 0x00000000}, ++ {0x8144, 0x0b040b03}, ++ {0x8148, 0x0a050b04}, ++ {0x814c, 0x0a050b04}, ++ {0x8150, 0xe4e40000}, ++ {0x8158, 0xffffffff}, ++ {0x815c, 0xffffffff}, ++ {0x8160, 0xffffffff}, ++ {0x8164, 0xffffffff}, ++ {0x8168, 0xffffffff}, ++ {0x816c, 0x1fffffff}, ++ {0x81a0, 0x00000000}, ++ {0x81ac, 0x003f2e2e}, ++ {0x81b0, 0x003f2e2e}, ++ {0x81bc, 0x005b5b5b}, ++ {0x81c0, 0x005b5b5b}, ++ {0x81b4, 0x00600060}, ++ {0x81b8, 0x00600060}, ++ {0x81cc, 0x00000000}, ++ {0x81dc, 0x00000002}, ++ {0x81e0, 0x00000000}, ++ {0x81e4, 0x00000001}, ++ {0x820c, 0x33112200}, ++ {0x8210, 0x33112200}, ++ {0x8214, 0x00000000}, ++ {0x8220, 0x10010000}, ++ {0x8224, 0x00000000}, ++ {0x822c, 0x0000d000}, ++ {0x8238, 0x40000000}, ++ {0x823c, 0x40000000}, ++ {0x8240, 0x00000000}, ++ {0x8244, 0x0b040b03}, ++ {0x8248, 0x0a050b04}, ++ {0x824c, 0x0a050b04}, ++ {0x8250, 0xe4e40000}, ++ {0x8258, 0xffffffff}, ++ {0x825c, 0xffffffff}, ++ {0x8260, 0xffffffff}, ++ {0x8264, 0xffffffff}, ++ {0x8268, 0xffffffff}, ++ {0x826c, 0x1fffffff}, ++ {0x82a0, 0x00000000}, ++ {0x82ac, 0x003f2e2e}, ++ {0x82b0, 0x003f2e2e}, ++ {0x82bc, 0x005b5b5b}, ++ {0x82c0, 0x005b5b5b}, ++ {0x82b4, 0x00600060}, ++ {0x82b8, 0x00600060}, ++ {0x82cc, 0x00000000}, ++ {0x82dc, 0x00000002}, ++ {0x82e0, 0x00100000}, ++ {0x82e4, 0x00000001}, ++ {0x81d8, 0x00000001}, ++ {0x82d8, 0x00000001}, ++ {0x8d00, 0x00000000}, ++ {0x8d04, 0x00000000}, ++ {0x8d08, 0x00000000}, ++ {0x8d0c, 0x00000000}, ++ {0x8d10, 0x00000000}, ++ {0x8d14, 0x00000000}, ++ {0x8d18, 0x00000000}, ++ {0x8d1c, 0x00000000}, ++ {0x8d20, 0x00000000}, ++ {0x8d24, 0x00000000}, ++ {0x8d28, 0x00000000}, ++ {0x8d2c, 0x00000000}, ++ {0x8d30, 0x00000000}, ++ {0x8d34, 0x00000000}, ++ {0x8d38, 0x00000000}, ++ {0x8d3c, 0x00000000}, ++ {0x8d40, 0x00000000}, ++ {0x8d44, 0x00000000}, ++ {0x8d48, 0x00000000}, ++ {0x8d4c, 0x00000000}, ++ {0x8d50, 0x00000000}, ++ {0x8d54, 0x00000000}, ++ {0x8d58, 0x00000000}, ++ {0x8d5c, 0x00000000}, ++ {0x8d60, 0x00000000}, ++ {0x8d64, 0x00000000}, ++ {0x8d68, 0x00000000}, ++ {0x8d6c, 0x00000000}, ++ {0x8d70, 0x00000000}, ++ {0x8d74, 0x00000000}, ++ {0x8d78, 0x00000000}, ++ {0x8d7c, 0x00000000}, ++ {0x8d80, 0x00000000}, ++ {0x8d84, 0x00000000}, ++ {0x8d88, 0x00000000}, ++ {0x8d8c, 0x00000000}, ++ {0x8d90, 0x00000000}, ++ {0x8d94, 0x00000000}, ++ {0x8d98, 0x00000000}, ++ {0x8d9c, 0x00000000}, ++ {0x8da0, 0x00000000}, ++ {0x8da4, 0x00000000}, ++ {0x8da8, 0x00000000}, ++ {0x8dac, 0x00000000}, ++ {0x8db0, 0x00000000}, ++ {0x8db4, 0x00000000}, ++ {0x8db8, 0x00000000}, ++ {0x8dbc, 0x00000000}, ++ {0x8dc0, 0x00000000}, ++ {0x8dc4, 0x00000000}, ++ {0x8dc8, 0x00000000}, ++ {0x8dcc, 0x00000000}, ++ {0x8dd0, 0x00000000}, ++ {0x8dd4, 0x00000000}, ++ {0x8dd8, 0x00000000}, ++ {0x8ddc, 0x00000000}, ++ {0x8de0, 0x00000000}, ++ {0x8de4, 0x00000000}, ++ {0x8de8, 0x00000000}, ++ {0x8dec, 0x00000000}, ++ {0x8df0, 0x00000000}, ++ {0x8df4, 0x00000000}, ++ {0x8df8, 0x00000000}, ++ {0x8dfc, 0x00000000}, ++ {0x8e00, 0x00000000}, ++ {0x8e04, 0x00000000}, ++ {0x8e08, 0x00000000}, ++ {0x8e0c, 0x00000000}, ++ {0x8e10, 0x00000000}, ++ {0x8e14, 0x00000000}, ++ {0x8e18, 0x00000000}, ++ {0x8e1c, 0x00000000}, ++ {0x8e20, 0x00000000}, ++ {0x8e24, 0x00000000}, ++ {0x8e28, 0x00000000}, ++ {0x8e2c, 0x00000000}, ++ {0x8e30, 0x00000000}, ++ {0x8e34, 0x00000000}, ++ {0x8e38, 0x00000000}, ++ {0x8e3c, 0x00000000}, ++ {0x8e40, 0x00000000}, ++ {0x8e44, 0x00000000}, ++ {0x8e48, 0x00000000}, ++ {0x8e4c, 0x00000000}, ++ {0x8e50, 0x00000000}, ++ {0x8e54, 0x00000000}, ++ {0x8e58, 0x00000000}, ++ {0x8e5c, 0x00000000}, ++ {0x8e60, 0x00000000}, ++ {0x8e64, 0x00000000}, ++ {0x8e68, 0x00000000}, ++ {0x8e6c, 0x00000000}, ++ {0x8e70, 0x00000000}, ++ {0x8e74, 0x00000000}, ++ {0x8e78, 0x00000000}, ++ {0x8e7c, 0x00000000}, ++ {0x8e80, 0x00000000}, ++ {0x8e84, 0x00000000}, ++ {0x8e88, 0x00000000}, ++ {0x8e8c, 0x00000000}, ++ {0x8e90, 0x00000000}, ++ {0x8e94, 0x00000000}, ++ {0x8e98, 0x00000000}, ++ {0x8e9c, 0x00000000}, ++ {0x8ea0, 0x00000000}, ++ {0x8ea4, 0x00000000}, ++ {0x8ea8, 0x00000000}, ++ {0x8eac, 0x00000000}, ++ {0x8eb0, 0x00000000}, ++ {0x8eb4, 0x00000000}, ++ {0x8eb8, 0x00000000}, ++ {0x8ebc, 0x00000000}, ++ {0x8ec0, 0x00000000}, ++ {0x8ec4, 0x00000000}, ++ {0x8ec8, 0x00000000}, ++ {0x8ecc, 0x00000000}, ++ {0x8ed0, 0x00000000}, ++ {0x8ed4, 0x00000000}, ++ {0x8ed8, 0x00000000}, ++ {0x8edc, 0x00000000}, ++ {0x8ee0, 0x00000000}, ++ {0x8ee4, 0x00000000}, ++ {0x8ee8, 0x00000000}, ++ {0x8eec, 0x00000000}, ++ {0x8ef0, 0x00000000}, ++ {0x8ef4, 0x00000000}, ++ {0x8ef8, 0x00000000}, ++ {0x8efc, 0x00000000}, ++ {0x8f00, 0x00000000}, ++ {0x8f04, 0x00000000}, ++ {0x8f08, 0x00000000}, ++ {0x8f0c, 0x00000000}, ++ {0x8f10, 0x00000000}, ++ {0x8f14, 0x00000000}, ++ {0x8f18, 0x00000000}, ++ {0x8f1c, 0x00000000}, ++ {0x8f20, 0x00000000}, ++ {0x8f24, 0x00000000}, ++ {0x8f28, 0x00000000}, ++ {0x8f2c, 0x00000000}, ++ {0x8f30, 0x00000000}, ++ {0x8f34, 0x00000000}, ++ {0x8f38, 0x00000000}, ++ {0x8f3c, 0x00000000}, ++ {0x8f40, 0x00000000}, ++ {0x8f44, 0x00000000}, ++ {0x8f48, 0x00000000}, ++ {0x8f4c, 0x00000000}, ++ {0x8f50, 0x00000000}, ++ {0x8f54, 0x00000000}, ++ {0x8f58, 0x00000000}, ++ {0x8f5c, 0x00000000}, ++ {0x8f60, 0x00000000}, ++ {0x8f64, 0x00000000}, ++ {0x8f68, 0x00000000}, ++ {0x8f6c, 0x00000000}, ++ {0x8f70, 0x00000000}, ++ {0x8f74, 0x00000000}, ++ {0x8f78, 0x00000000}, ++ {0x8f7c, 0x00000000}, ++ {0x8f80, 0x00000000}, ++ {0x8f84, 0x00000000}, ++ {0x8f88, 0x00000000}, ++ {0x8f8c, 0x00000000}, ++ {0x8f90, 0x00000000}, ++ {0x8f94, 0x00000000}, ++ {0x8f98, 0x00000000}, ++ {0x8f9c, 0x00000000}, ++ {0x8fa0, 0x00000000}, ++ {0x8fa4, 0x00000000}, ++ {0x8fa8, 0x00000000}, ++ {0x8fac, 0x00000000}, ++ {0x8fb0, 0x00000000}, ++ {0x8fb4, 0x00000000}, ++ {0x8fb8, 0x00000000}, ++ {0x8fbc, 0x00000000}, ++ {0x8fc0, 0x00000000}, ++ {0x8fc4, 0x00000000}, ++ {0x8fc8, 0x00000000}, ++ {0x8fcc, 0x00000000}, ++ {0x8fd0, 0x00000000}, ++ {0x8fd4, 0x00000000}, ++ {0x8fd8, 0x00000000}, ++ {0x8fdc, 0x00000000}, ++ {0x8fe0, 0x00000000}, ++ {0x8fe4, 0x00000000}, ++ {0x8fe8, 0x00000000}, ++ {0x8fec, 0x00000000}, ++ {0x8ff0, 0x00000000}, ++ {0x8ff4, 0x00000000}, ++ {0x8ff8, 0x00000000}, ++ {0x8ffc, 0x00000000}, ++ {0x9000, 0x00000000}, ++ {0x9004, 0x00000000}, ++ {0x9008, 0x00000000}, ++ {0x900c, 0x00000000}, ++ {0x9010, 0x00000000}, ++ {0x9014, 0x00000000}, ++ {0x9018, 0x00000000}, ++ {0x901c, 0x00000000}, ++ {0x9020, 0x00000000}, ++ {0x9024, 0x00000000}, ++ {0x9028, 0x00000000}, ++ {0x902c, 0x00000000}, ++ {0x9030, 0x00000000}, ++ {0x9034, 0x00000000}, ++ {0x9038, 0x00000000}, ++ {0x903c, 0x00000000}, ++ {0x9040, 0x00000000}, ++ {0x9044, 0x00000000}, ++ {0x9048, 0x00000000}, ++ {0x904c, 0x00000000}, ++ {0x9050, 0x00000000}, ++ {0x9054, 0x00000000}, ++ {0x9058, 0x00000000}, ++ {0x905c, 0x00000000}, ++ {0x9060, 0x00000000}, ++ {0x9064, 0x00000000}, ++ {0x9068, 0x00000000}, ++ {0x906c, 0x00000000}, ++ {0x9070, 0x00000000}, ++ {0x9074, 0x00000000}, ++ {0x9078, 0x00000000}, ++ {0x907c, 0x00000000}, ++ {0x9080, 0x00000000}, ++ {0x9084, 0x00000000}, ++ {0x9088, 0x00000000}, ++ {0x908c, 0x00000000}, ++ {0x9090, 0x00000000}, ++ {0x9094, 0x00000000}, ++ {0x9098, 0x00000000}, ++ {0x909c, 0x00000000}, ++ {0x90a0, 0x00000000}, ++ {0x90a4, 0x00000000}, ++ {0x90a8, 0x00000000}, ++ {0x90ac, 0x00000000}, ++ {0x90b0, 0x00000000}, ++ {0x90b4, 0x00000000}, ++ {0x90b8, 0x00000000}, ++ {0x90bc, 0x00000000}, ++ {0x9100, 0x00000000}, ++ {0x9104, 0x00000000}, ++ {0x9108, 0x00000000}, ++ {0x910c, 0x00000000}, ++ {0x9110, 0x00000000}, ++ {0x9114, 0x00000000}, ++ {0x9118, 0x00000000}, ++ {0x911c, 0x00000000}, ++ {0x9120, 0x00000000}, ++ {0x9124, 0x00000000}, ++ {0x9128, 0x00000000}, ++ {0x912c, 0x00000000}, ++ {0x9130, 0x00000000}, ++ {0x9134, 0x00000000}, ++ {0x9138, 0x00000000}, ++ {0x913c, 0x00000000}, ++ {0x9140, 0x00000000}, ++ {0x9144, 0x00000000}, ++ {0x9148, 0x00000000}, ++ {0x914c, 0x00000000}, ++ {0x9150, 0x00000000}, ++ {0x9154, 0x00000000}, ++ {0x9158, 0x00000000}, ++ {0x915c, 0x00000000}, ++ {0x9160, 0x00000000}, ++ {0x9164, 0x00000000}, ++ {0x9168, 0x00000000}, ++ {0x916c, 0x00000000}, ++ {0x9170, 0x00000000}, ++ {0x9174, 0x00000000}, ++ {0x9178, 0x00000000}, ++ {0x917c, 0x00000000}, ++ {0x9180, 0x00000000}, ++ {0x9184, 0x00000000}, ++ {0x9188, 0x00000000}, ++ {0x918c, 0x00000000}, ++ {0x9190, 0x00000000}, ++ {0x9194, 0x00000000}, ++ {0x9198, 0x00000000}, ++ {0x919c, 0x00000000}, ++ {0x91a0, 0x00000000}, ++ {0x91a4, 0x00000000}, ++ {0x91a8, 0x00000000}, ++ {0x91ac, 0x00000000}, ++ {0x91b0, 0x00000000}, ++ {0x91b4, 0x00000000}, ++ {0x91b8, 0x00000000}, ++ {0x91bc, 0x00000000}, ++ {0x91c0, 0x00000000}, ++ {0x91c4, 0x00000000}, ++ {0x91c8, 0x00000000}, ++ {0x91cc, 0x00000000}, ++ {0x91d0, 0x00000000}, ++ {0x91d4, 0x00000000}, ++ {0x91d8, 0x00000000}, ++ {0x91dc, 0x00000000}, ++ {0x91e0, 0x00000000}, ++ {0x91e4, 0x00000000}, ++ {0x91e8, 0x00000000}, ++ {0x91ec, 0x00000000}, ++ {0x91f0, 0x00000000}, ++ {0x91f4, 0x00000000}, ++ {0x91f8, 0x00000000}, ++ {0x91fc, 0x00000000}, ++ {0x9200, 0x00000000}, ++ {0x9204, 0x00000000}, ++ {0x9208, 0x00000000}, ++ {0x920c, 0x00000000}, ++ {0x9210, 0x00000000}, ++ {0x9214, 0x00000000}, ++ {0x9218, 0x00000000}, ++ {0x921c, 0x00000000}, ++ {0x9220, 0x00000000}, ++ {0x9224, 0x00000000}, ++ {0x9228, 0x00000000}, ++ {0x922c, 0x00000000}, ++ {0x9230, 0x00000000}, ++ {0x9234, 0x00000000}, ++ {0x9238, 0x00000000}, ++ {0x923c, 0x00000000}, ++ {0x9240, 0x00000000}, ++ {0x9244, 0x00000000}, ++ {0x9248, 0x00000000}, ++ {0x924c, 0x00000000}, ++ {0x9250, 0x00000000}, ++ {0x9254, 0x00000000}, ++ {0x9258, 0x00000000}, ++ {0x925c, 0x00000000}, ++ {0x9260, 0x00000000}, ++ {0x9264, 0x00000000}, ++ {0x9268, 0x00000000}, ++ {0x926c, 0x00000000}, ++ {0x9270, 0x00000000}, ++ {0x9274, 0x00000000}, ++ {0x9278, 0x00000000}, ++ {0x927c, 0x00000000}, ++ {0x9280, 0x00000000}, ++ {0x9284, 0x00000000}, ++ {0x9288, 0x00000000}, ++ {0x928c, 0x00000000}, ++ {0x9290, 0x00000000}, ++ {0x9294, 0x00000000}, ++ {0x9298, 0x00000000}, ++ {0x929c, 0x00000000}, ++ {0x92a0, 0x00000000}, ++ {0x92a4, 0x00000000}, ++ {0x92a8, 0x00000000}, ++ {0x92ac, 0x00000000}, ++ {0x92b0, 0x00000000}, ++ {0x92b4, 0x00000000}, ++ {0x92b8, 0x00000000}, ++ {0x92bc, 0x00000000}, ++ {0x92c0, 0x00000000}, ++ {0x92c4, 0x00000000}, ++ {0x92c8, 0x00000000}, ++ {0x92cc, 0x00000000}, ++ {0x92d0, 0x00000000}, ++ {0x92d4, 0x00000000}, ++ {0x92d8, 0x00000000}, ++ {0x92dc, 0x00000000}, ++ {0x92e0, 0x00000000}, ++ {0x92e4, 0x00000000}, ++ {0x92e8, 0x00000000}, ++ {0x92ec, 0x00000000}, ++ {0x92f0, 0x00000000}, ++ {0x92f4, 0x00000000}, ++ {0x92f8, 0x00000000}, ++ {0x92fc, 0x00000000}, ++ {0x9300, 0x00000000}, ++ {0x9304, 0x00000000}, ++ {0x9308, 0x00000000}, ++ {0x930c, 0x00000000}, ++ {0x9310, 0x00000000}, ++ {0x9314, 0x00000000}, ++ {0x9318, 0x00000000}, ++ {0x931c, 0x00000000}, ++ {0x9320, 0x00000000}, ++ {0x9324, 0x00000000}, ++ {0x9328, 0x00000000}, ++ {0x932c, 0x00000000}, ++ {0x9330, 0x00000000}, ++ {0x9334, 0x00000000}, ++ {0x9338, 0x00000000}, ++ {0x933c, 0x00000000}, ++ {0x9340, 0x00000000}, ++ {0x9344, 0x00000000}, ++ {0x9348, 0x00000000}, ++ {0x934c, 0x00000000}, ++ {0x9350, 0x00000000}, ++ {0x9354, 0x00000000}, ++ {0x9358, 0x00000000}, ++ {0x935c, 0x00000000}, ++ {0x9360, 0x00000000}, ++ {0x9364, 0x00000000}, ++ {0x9368, 0x00000000}, ++ {0x936c, 0x00000000}, ++ {0x9370, 0x00000000}, ++ {0x9374, 0x00000000}, ++ {0x9378, 0x00000000}, ++ {0x937c, 0x00000000}, ++ {0x9380, 0x00000000}, ++ {0x9384, 0x00000000}, ++ {0x9388, 0x00000000}, ++ {0x938c, 0x00000000}, ++ {0x9390, 0x00000000}, ++ {0x9394, 0x00000000}, ++ {0x9398, 0x00000000}, ++ {0x939c, 0x00000000}, ++ {0x93a0, 0x00000000}, ++ {0x93a4, 0x00000000}, ++ {0x93a8, 0x00000000}, ++ {0x93ac, 0x00000000}, ++ {0x93b0, 0x00000000}, ++ {0x93b4, 0x00000000}, ++ {0x93b8, 0x00000000}, ++ {0x93bc, 0x00000000}, ++ {0x93c0, 0x00000000}, ++ {0x93c4, 0x00000000}, ++ {0x93c8, 0x00000000}, ++ {0x93cc, 0x00000000}, ++ {0x93d0, 0x00000000}, ++ {0x93d4, 0x00000000}, ++ {0x93d8, 0x00000000}, ++ {0x93dc, 0x00000000}, ++ {0x93e0, 0x00000000}, ++ {0x93e4, 0x00000000}, ++ {0x93e8, 0x00000000}, ++ {0x93ec, 0x00000000}, ++ {0x93f0, 0x00000000}, ++ {0x93f4, 0x00000000}, ++ {0x93f8, 0x00000000}, ++ {0x93fc, 0x00000000}, ++ {0x9400, 0x00000000}, ++ {0x9404, 0x00000000}, ++ {0x9408, 0x00000000}, ++ {0x940c, 0x00000000}, ++ {0x9410, 0x00000000}, ++ {0x9414, 0x00000000}, ++ {0x9418, 0x00000000}, ++ {0x941c, 0x00000000}, ++ {0x9420, 0x00000000}, ++ {0x9424, 0x00000000}, ++ {0x9428, 0x00000000}, ++ {0x942c, 0x00000000}, ++ {0x9430, 0x00000000}, ++ {0x9434, 0x00000000}, ++ {0x9438, 0x00000000}, ++ {0x943c, 0x00000000}, ++ {0x9440, 0x00000000}, ++ {0x9444, 0x00000000}, ++ {0x9448, 0x00000000}, ++ {0x944c, 0x00000000}, ++ {0x9450, 0x00000000}, ++ {0x9454, 0x00000000}, ++ {0x9458, 0x00000000}, ++ {0x945c, 0x00000000}, ++ {0x9460, 0x00000000}, ++ {0x9464, 0x00000000}, ++ {0x9468, 0x00000000}, ++ {0x946c, 0x00000000}, ++ {0x9470, 0x00000000}, ++ {0x9474, 0x00000000}, ++ {0x9478, 0x00000000}, ++ {0x947c, 0x00000000}, ++ {0x9480, 0x00000000}, ++ {0x9484, 0x00000000}, ++ {0x9488, 0x00000000}, ++ {0x948c, 0x00000000}, ++ {0x9490, 0x00000000}, ++ {0x9494, 0x00000000}, ++ {0x9498, 0x00000000}, ++ {0x949c, 0x00000000}, ++ {0x94a0, 0x00000000}, ++ {0x94a4, 0x00000000}, ++ {0x94a8, 0x00000000}, ++ {0x94ac, 0x00000000}, ++ {0x94b0, 0x00000000}, ++ {0x94b4, 0x00000000}, ++ {0x94b8, 0x00000000}, ++ {0x94bc, 0x00000000}, ++ {0xa220, 0x00000000}, ++ {0xa224, 0x00000000}, ++ {0xa228, 0x00000000}, ++ {0xa22c, 0x00000000}, ++ {0xa230, 0x00000000}, ++ {0xa234, 0x00000000}, ++ {0xa238, 0x00000000}, ++ {0xa23c, 0x00000000}, ++ {0xa240, 0x00000000}, ++ {0xa244, 0x00000000}, ++ {0xa248, 0x00000000}, ++ {0xa24c, 0x00000000}, ++ {0xa250, 0x00000000}, ++ {0xa254, 0x00000000}, ++ {0xa258, 0x00000000}, ++ {0xa25c, 0x00000000}, ++ {0xa260, 0x00000000}, ++ {0xa264, 0x00000000}, ++ {0xa268, 0x00000000}, ++ {0xa26c, 0x00000000}, ++ {0xa270, 0x00000000}, ++ {0xa274, 0x00000000}, ++ {0xa278, 0x00000000}, ++ {0xa27c, 0x00000000}, ++ {0xa280, 0x00000000}, ++ {0xa284, 0x00000000}, ++ {0xa288, 0x00000000}, ++ {0xa28c, 0x00000000}, ++ {0xa290, 0x00000000}, ++ {0xa294, 0x00000000}, ++ {0xa298, 0x00000000}, ++ {0xa29c, 0x00000000}, ++ {0xa2a0, 0x00000000}, ++ {0xa2a4, 0x00000000}, ++ {0xa2a8, 0x00000000}, ++ {0xa2ac, 0x00000000}, ++ {0xa2b0, 0x00000000}, ++ {0xa2b4, 0x00000000}, ++ {0xa2b8, 0x00000000}, ++ {0xa2bc, 0x00000000}, ++ {0xa2c0, 0x00000000}, ++ {0xa2c4, 0x00000000}, ++ {0xa2c8, 0x00000000}, ++ {0xa2cc, 0x00000000}, ++ {0xa2d0, 0x00000000}, ++ {0xa2d4, 0x00000000}, ++ {0xa2d8, 0x00000000}, ++ {0xa2dc, 0x00000000}, ++ {0xa2e0, 0x00000000}, ++ {0xa2e4, 0x00000000}, ++ {0xa2e8, 0x00000000}, ++ {0xa2ec, 0x00000000}, ++ {0xa2f0, 0x00000000}, ++ {0xa2f4, 0x00000000}, ++ {0xa2f8, 0x00000000}, ++ {0xa2fc, 0x00000000}, ++ {0xa300, 0x00000000}, ++ {0xa304, 0x00000000}, ++ {0xa308, 0x00000000}, ++ {0xa30c, 0x00000000}, ++ {0xa310, 0x00000000}, ++ {0xa314, 0x00000000}, ++ {0xa318, 0x00000000}, ++ {0xa31c, 0x00000000}, ++ {0xa320, 0x00000000}, ++ {0xa324, 0x00000000}, ++ {0xa328, 0x00000000}, ++ {0xa32c, 0x00000000}, ++ {0xa330, 0x00000000}, ++ {0xa334, 0x00000000}, ++ {0xa338, 0x00000000}, ++ {0xa33c, 0x00000000}, ++ {0xa340, 0x00000000}, ++ {0xa344, 0x00000000}, ++ {0xa348, 0x00000000}, ++ {0xa34c, 0x00000000}, ++ {0xa350, 0x00000000}, ++ {0xa354, 0x00000000}, ++ {0xa358, 0x00000000}, ++ {0xa35c, 0x00000000}, ++ {0xa360, 0x00000000}, ++ {0xa364, 0x00000000}, ++ {0xa368, 0x00000000}, ++ {0xa36c, 0x00000000}, ++ {0xa370, 0x00000000}, ++ {0xa374, 0x00000000}, ++ {0xa378, 0x00000000}, ++ {0xa37c, 0x00000000}, ++ {0xa380, 0x00000000}, ++ {0xa384, 0x00000000}, ++ {0xa388, 0x00000000}, ++ {0xa38c, 0x00000000}, ++ {0xa390, 0x00000000}, ++ {0xa394, 0x00000000}, ++ {0xa398, 0x00000000}, ++ {0xa39c, 0x00000000}, ++ {0xa3a0, 0x00000000}, ++ {0xa3a4, 0x00000000}, ++ {0xa3a8, 0x00000000}, ++ {0xa3ac, 0x00000000}, ++ {0xa3b0, 0x00000000}, ++ {0xa3b4, 0x00000000}, ++ {0xa3b8, 0x00000000}, ++ {0xa3bc, 0x00000000}, ++ {0xa620, 0x00000000}, ++ {0xa624, 0x00000000}, ++ {0xa628, 0x00000000}, ++ {0xa62c, 0x00000000}, ++ {0xa630, 0x00000000}, ++ {0xa634, 0x00000000}, ++ {0xa638, 0x00000000}, ++ {0xa63c, 0x00000000}, ++ {0xa640, 0x00000000}, ++ {0xa644, 0x00000000}, ++ {0xa648, 0x00000000}, ++ {0xa64c, 0x00000000}, ++ {0xa650, 0x00000000}, ++ {0xa654, 0x00000000}, ++ {0xa658, 0x00000000}, ++ {0xa65c, 0x00000000}, ++ {0xa660, 0x00000000}, ++ {0xa664, 0x00000000}, ++ {0xa668, 0x00000000}, ++ {0xa66c, 0x00000000}, ++ {0xa670, 0x00000000}, ++ {0xa674, 0x00000000}, ++ {0xa678, 0x00000000}, ++ {0xa67c, 0x00000000}, ++ {0xa680, 0x00000000}, ++ {0xa684, 0x00000000}, ++ {0xa688, 0x00000000}, ++ {0xa68c, 0x00000000}, ++ {0xa690, 0x00000000}, ++ {0xa694, 0x00000000}, ++ {0xa698, 0x00000000}, ++ {0xa69c, 0x00000000}, ++ {0xa6a0, 0x00000000}, ++ {0xa6a4, 0x00000000}, ++ {0xa6a8, 0x00000000}, ++ {0xa6ac, 0x00000000}, ++ {0xa6b0, 0x00000000}, ++ {0xa6b4, 0x00000000}, ++ {0xa6b8, 0x00000000}, ++ {0xa6bc, 0x00000000}, ++ {0xa6c0, 0x00000000}, ++ {0xa6c4, 0x00000000}, ++ {0xa6c8, 0x00000000}, ++ {0xa6cc, 0x00000000}, ++ {0xa6d0, 0x00000000}, ++ {0xa6d4, 0x00000000}, ++ {0xa6d8, 0x00000000}, ++ {0xa6dc, 0x00000000}, ++ {0xa6e0, 0x00000000}, ++ {0xa6e4, 0x00000000}, ++ {0xa6e8, 0x00000000}, ++ {0xa6ec, 0x00000000}, ++ {0xa6f0, 0x00000000}, ++ {0xa6f4, 0x00000000}, ++ {0xa6f8, 0x00000000}, ++ {0xa6fc, 0x00000000}, ++ {0xa700, 0x00000000}, ++ {0xa704, 0x00000000}, ++ {0xa708, 0x00000000}, ++ {0xa70c, 0x00000000}, ++ {0xa710, 0x00000000}, ++ {0xa714, 0x00000000}, ++ {0xa718, 0x00000000}, ++ {0xa71c, 0x00000000}, ++ {0xa720, 0x00000000}, ++ {0xa724, 0x00000000}, ++ {0xa728, 0x00000000}, ++ {0xa72c, 0x00000000}, ++ {0xa730, 0x00000000}, ++ {0xa734, 0x00000000}, ++ {0xa738, 0x00000000}, ++ {0xa73c, 0x00000000}, ++ {0xa740, 0x00000000}, ++ {0xa744, 0x00000000}, ++ {0xa748, 0x00000000}, ++ {0xa74c, 0x00000000}, ++ {0xa750, 0x00000000}, ++ {0xa754, 0x00000000}, ++ {0xa758, 0x00000000}, ++ {0xa75c, 0x00000000}, ++ {0xa760, 0x00000000}, ++ {0xa764, 0x00000000}, ++ {0xa768, 0x00000000}, ++ {0xa76c, 0x00000000}, ++ {0xa770, 0x00000000}, ++ {0xa774, 0x00000000}, ++ {0xa778, 0x00000000}, ++ {0xa77c, 0x00000000}, ++ {0xa780, 0x00000000}, ++ {0xa784, 0x00000000}, ++ {0xa788, 0x00000000}, ++ {0xa78c, 0x00000000}, ++ {0xa790, 0x00000000}, ++ {0xa794, 0x00000000}, ++ {0xa798, 0x00000000}, ++ {0xa79c, 0x00000000}, ++ {0xa7a0, 0x00000000}, ++ {0xa7a4, 0x00000000}, ++ {0xa7a8, 0x00000000}, ++ {0xa7ac, 0x00000000}, ++ {0xa7b0, 0x00000000}, ++ {0xa7b4, 0x00000000}, ++ {0xa7b8, 0x00000000}, ++ {0xa7bc, 0x00000000}, ++ {0x81d8, 0x00000000}, ++ {0x82d8, 0x00000000}, ++ {0x9f04, 0x2b251f19}, ++ {0x9f08, 0x433d3731}, ++ {0x9f0c, 0x5b554f49}, ++ {0x9f10, 0x736d6761}, ++ {0x9f14, 0x7f7f7f79}, ++ {0x9f18, 0x120f7f7f}, ++ {0x9f1c, 0x1e1b1815}, ++ {0x9f20, 0x2a272421}, ++ {0x9f24, 0x3633302d}, ++ {0x9f28, 0x3f3f3c39}, ++ {0x9f2c, 0x3f3f3f3f}, ++ {0x8008, 0x00000080}, ++ {0x8088, 0x807f030a}, ++ {0x80c8, 0x708f0bf1}, ++ {0x80c8, 0x708e0aa5}, ++ {0x80c8, 0x708d097d}, ++ {0x80c8, 0x708c0875}, ++ {0x80c8, 0x708b0789}, ++ {0x80c8, 0x708a06b7}, ++ {0x80c8, 0x708905fc}, ++ {0x80c8, 0x70880556}, ++ {0x80c8, 0x708704c1}, ++ {0x80c8, 0x7086043d}, ++ {0x80c8, 0x708503c7}, ++ {0x80c8, 0x7084035e}, ++ {0x80c8, 0x708302ac}, ++ {0x80c8, 0x70820262}, ++ {0x80c8, 0x70810220}, ++ {0x80c8, 0x70800000}, ++ {0x80c8, 0x7090011f}, ++ {0x80c8, 0x7010011f}, ++ {0x8088, 0x80000000}, ++ {0x8008, 0x00000000}, ++ {0x8088, 0x00000110}, ++ {0x8000, 0x00000008}, ++ {0x8080, 0x00000005}, ++ {0x8500, 0x80000008}, ++ {0x8504, 0x43000004}, ++ {0x8508, 0x4b044a00}, ++ {0x850c, 0x40098604}, ++ {0x8510, 0x0004e020}, ++ {0x8514, 0x87044b05}, ++ {0x8518, 0xe020400b}, ++ {0x851c, 0x4b000004}, ++ {0x8520, 0x21e07410}, ++ {0x8524, 0x74300000}, ++ {0x8528, 0x43800004}, ++ {0x852c, 0x4c000007}, ++ {0x8530, 0x43000004}, ++ {0x8534, 0x42fe5700}, ++ {0x8538, 0x42004000}, ++ {0x853c, 0x30005055}, ++ {0x8540, 0xa50fb41a}, ++ {0x8544, 0xf11ce3c7}, ++ {0x8548, 0xf31cf21c}, ++ {0x854c, 0xf61cf41c}, ++ {0x8550, 0xf91cf81c}, ++ {0x8554, 0xfb1cfa1c}, ++ {0x8558, 0xfd1cfc1c}, ++ {0x855c, 0xff1cfe1c}, ++ {0x8560, 0xf11cf01c}, ++ {0x8564, 0xf31cf21c}, ++ {0x8568, 0xf51cf41c}, ++ {0x856c, 0xf71cf61c}, ++ {0x8570, 0xf91cf81c}, ++ {0x8574, 0xe3c7a504}, ++ {0x8578, 0xf11af01a}, ++ {0x857c, 0x30580001}, ++ {0x8580, 0x30b030c9}, ++ {0x8584, 0x30ff30fc}, ++ {0x8588, 0x310f3102}, ++ {0x858c, 0x3148311c}, ++ {0x8590, 0x31603158}, ++ {0x8594, 0x30c7320e}, ++ {0x8598, 0x32293225}, ++ {0x859c, 0x32433242}, ++ {0x85a0, 0x3286327a}, ++ {0x85a4, 0x329d328a}, ++ {0x85a8, 0x32aa32a8}, ++ {0x85ac, 0x320331c5}, ++ {0x85b0, 0x7410e2c1}, ++ {0x85b4, 0x020020a8}, ++ {0x85b8, 0x2098140f}, ++ {0x85bc, 0x140f0200}, ++ {0x85c0, 0x02002088}, ++ {0x85c4, 0x7430140f}, ++ {0x85c8, 0x5b10e31c}, ++ {0x85cc, 0x20a87410}, ++ {0x85d0, 0x140f0201}, ++ {0x85d4, 0x00002080}, ++ {0x85d8, 0x5507140f}, ++ {0x85dc, 0x5c065661}, ++ {0x85e0, 0x7410e308}, ++ {0x85e4, 0x02002088}, ++ {0x85e8, 0x5517140f}, ++ {0x85ec, 0x7410e308}, ++ {0x85f0, 0x020020a8}, ++ {0x85f4, 0x5517140f}, ++ {0x85f8, 0x5c025641}, ++ {0x85fc, 0x7410e308}, ++ {0x8600, 0x00002080}, ++ {0x8604, 0x1407140f}, ++ {0x8608, 0xe3085507}, ++ {0x860c, 0x7508e2b4}, ++ {0x8610, 0xe312468e}, ++ {0x8614, 0x5b10e0f4}, ++ {0x8618, 0x20a87410}, ++ {0x861c, 0x140f0201}, ++ {0x8620, 0x00002090}, ++ {0x8624, 0x5507140f}, ++ {0x8628, 0x5c065661}, ++ {0x862c, 0x7410e308}, ++ {0x8630, 0x02002098}, ++ {0x8634, 0x5517140f}, ++ {0x8638, 0x7410e308}, ++ {0x863c, 0x020020a8}, ++ {0x8640, 0x5517140f}, ++ {0x8644, 0x5c025641}, ++ {0x8648, 0x7410e308}, ++ {0x864c, 0x00002090}, ++ {0x8650, 0x5507140f}, ++ {0x8654, 0x7509e308}, ++ {0x8658, 0xe3124696}, ++ {0x865c, 0x0001e0f4}, ++ {0x8660, 0x74105b10}, ++ {0x8664, 0x000020a0}, ++ {0x8668, 0x5507140f}, ++ {0x866c, 0xe3085601}, ++ {0x8670, 0x20a87410}, ++ {0x8674, 0x140f0200}, ++ {0x8678, 0xe3085517}, ++ {0x867c, 0x750ae2b4}, ++ {0x8680, 0xe3124686}, ++ {0x8684, 0x5500e0f4}, ++ {0x8688, 0x5501e304}, ++ {0x868c, 0xe2c10001}, ++ {0x8690, 0x5b10e31c}, ++ {0x8694, 0x20807410}, ++ {0x8698, 0x140f0000}, ++ {0x869c, 0x02002098}, ++ {0x86a0, 0xf204140f}, ++ {0x86a4, 0x020020a8}, ++ {0x86a8, 0x5507140f}, ++ {0x86ac, 0xe3085601}, ++ {0x86b0, 0x20887410}, ++ {0x86b4, 0x140f0200}, ++ {0x86b8, 0xe3085517}, ++ {0x86bc, 0x7508e2b4}, ++ {0x86c0, 0xe312468e}, ++ {0x86c4, 0x7410e0f4}, ++ {0x86c8, 0x00002090}, ++ {0x86cc, 0x5507140f}, ++ {0x86d0, 0x7410e308}, ++ {0x86d4, 0x02002098}, ++ {0x86d8, 0x5517140f}, ++ {0x86dc, 0x7509e308}, ++ {0x86e0, 0xe3124696}, ++ {0x86e4, 0x0001e0f4}, ++ {0x86e8, 0x74207900}, ++ {0x86ec, 0x57005710}, ++ {0x86f0, 0x9700140f}, ++ {0x86f4, 0x00017430}, ++ {0x86f8, 0xe31ce2c1}, ++ {0x86fc, 0xe2ca0001}, ++ {0x8700, 0x0001e34b}, ++ {0x8704, 0x312ae2c1}, ++ {0x8708, 0xe3ba0023}, ++ {0x870c, 0x54ed0002}, ++ {0x8710, 0x00230baa}, ++ {0x8714, 0x0002e3ba}, ++ {0x8718, 0xe2b9e367}, ++ {0x871c, 0xe2c10001}, ++ {0x8720, 0x00223125}, ++ {0x8724, 0x0002e3ba}, ++ {0x8728, 0x0baa54ec}, ++ {0x872c, 0xe3ba0022}, ++ {0x8730, 0xe3670002}, ++ {0x8734, 0x0001e2b9}, ++ {0x8738, 0x0baae2c1}, ++ {0x873c, 0x6d0f6c67}, ++ {0x8740, 0xe3bae31c}, ++ {0x8744, 0xe31c6c8b}, ++ {0x8748, 0x0bace3ba}, ++ {0x874c, 0x6d0f6cb3}, ++ {0x8750, 0xe3bae31c}, ++ {0x8754, 0x6cdb0bad}, ++ {0x8758, 0xe31c6d0f}, ++ {0x875c, 0x6cf7e3ba}, ++ {0x8760, 0xe31c6d0f}, ++ {0x8764, 0x6c09e3ba}, ++ {0x8768, 0xe31c6d00}, ++ {0x876c, 0x6c25e3ba}, ++ {0x8770, 0xe3bae31c}, ++ {0x8774, 0x6c4df8ca}, ++ {0x8778, 0xe3bae31c}, ++ {0x877c, 0x6c75f9d3}, ++ {0x8780, 0xe3bae31c}, ++ {0x8784, 0xe31c6c99}, ++ {0x8788, 0xe367e3ba}, ++ {0x878c, 0x0001e2b9}, ++ {0x8790, 0x4380e2ca}, ++ {0x8794, 0x43006344}, ++ {0x8798, 0x00223188}, ++ {0x879c, 0x0002e3bf}, ++ {0x87a0, 0x0baa54ec}, ++ {0x87a4, 0xe3bf0022}, ++ {0x87a8, 0xe3670002}, ++ {0x87ac, 0x0001e2c5}, ++ {0x87b0, 0x4380e2ca}, ++ {0x87b4, 0x43006344}, ++ {0x87b8, 0xe367317b}, ++ {0x87bc, 0x0001e2c5}, ++ {0x87c0, 0x4380e2ca}, ++ {0x87c4, 0x4300634d}, ++ {0x87c8, 0x74100ba6}, ++ {0x87cc, 0x000921e8}, ++ {0x87d0, 0x6f0f6e67}, ++ {0x87d4, 0xe3bfe34b}, ++ {0x87d8, 0x000a21e8}, ++ {0x87dc, 0xe34b6e77}, ++ {0x87e0, 0x21e8e3bf}, ++ {0x87e4, 0x6e8b000b}, ++ {0x87e8, 0xe3bfe34b}, ++ {0x87ec, 0x000c21e8}, ++ {0x87f0, 0xe34b6e9f}, ++ {0x87f4, 0x0baae3bf}, ++ {0x87f8, 0x21e87410}, ++ {0x87fc, 0x6eb3000d}, ++ {0x8800, 0xe34b6f0f}, ++ {0x8804, 0x21e8e3bf}, ++ {0x8808, 0x6ec7000e}, ++ {0x880c, 0xe3bfe34b}, ++ {0x8810, 0x74100bac}, ++ {0x8814, 0x000f21e8}, ++ {0x8818, 0x6f0f6edb}, ++ {0x881c, 0xe3bfe34b}, ++ {0x8820, 0x001021e8}, ++ {0x8824, 0xe34b6eef}, ++ {0x8828, 0xe3bfe3bf}, ++ {0x882c, 0x001321e8}, ++ {0x8830, 0x6f006e11}, ++ {0x8834, 0xe3bfe34b}, ++ {0x8838, 0x21e8e3bf}, ++ {0x883c, 0x6e250014}, ++ {0x8840, 0xe3bfe34b}, ++ {0x8844, 0x21e8fbab}, ++ {0x8848, 0x6e390015}, ++ {0x884c, 0xe3bfe34b}, ++ {0x8850, 0x001621e8}, ++ {0x8854, 0xe34b6e4d}, ++ {0x8858, 0xfcb0e3bf}, ++ {0x885c, 0x001721e8}, ++ {0x8860, 0xe34b6e61}, ++ {0x8864, 0x21e8e3bf}, ++ {0x8868, 0x6e750018}, ++ {0x886c, 0xe3bfe34b}, ++ {0x8870, 0x001921e8}, ++ {0x8874, 0xe34b6e89}, ++ {0x8878, 0x21e8e3bf}, ++ {0x887c, 0x6e99001a}, ++ {0x8880, 0xe3bfe34b}, ++ {0x8884, 0xe2c5e367}, ++ {0x8888, 0x00040001}, ++ {0x888c, 0x42fc0004}, ++ {0x8890, 0x60010007}, ++ {0x8894, 0x42000004}, ++ {0x8898, 0x62200007}, ++ {0x889c, 0x00046200}, ++ {0x88a0, 0x5b005501}, ++ {0x88a4, 0x5b40e304}, ++ {0x88a8, 0x00076605}, ++ {0x88ac, 0x63006200}, ++ {0x88b0, 0x0004e388}, ++ {0x88b4, 0x0a010900}, ++ {0x88b8, 0x0d000b40}, ++ {0x88bc, 0x00320e01}, ++ {0x88c0, 0x95090004}, ++ {0x88c4, 0x790442fb}, ++ {0x88c8, 0x43804200}, ++ {0x88cc, 0x4d010007}, ++ {0x88d0, 0x43000004}, ++ {0x88d4, 0x05620007}, ++ {0x88d8, 0x961d05a3}, ++ {0x88dc, 0x0004e388}, ++ {0x88e0, 0x0007e304}, ++ {0x88e4, 0x07a306a2}, ++ {0x88e8, 0x0004e388}, ++ {0x88ec, 0xe378e304}, ++ {0x88f0, 0xe3800002}, ++ {0x88f4, 0x00074380}, ++ {0x88f8, 0x00044d00}, ++ {0x88fc, 0x42fe4300}, ++ {0x8900, 0x42007900}, ++ {0x8904, 0x00040001}, ++ {0x8908, 0x000742fc}, ++ {0x890c, 0x00046003}, ++ {0x8910, 0x31cc4200}, ++ {0x8914, 0x06a20007}, ++ {0x8918, 0x31f807a3}, ++ {0x891c, 0x77000005}, ++ {0x8920, 0x52000007}, ++ {0x8924, 0x42fe0004}, ++ {0x8928, 0x60000007}, ++ {0x892c, 0x42000004}, ++ {0x8930, 0x60004380}, ++ {0x8934, 0x62016100}, ++ {0x8938, 0x00056310}, ++ {0x893c, 0x55004100}, ++ {0x8940, 0x5c020007}, ++ {0x8944, 0x43000004}, ++ {0x8948, 0xe2d70001}, ++ {0x894c, 0x73000005}, ++ {0x8950, 0xe2d70001}, ++ {0x8954, 0x5d000006}, ++ {0x8958, 0x42f70004}, ++ {0x895c, 0x6c000005}, ++ {0x8960, 0x42000004}, ++ {0x8964, 0x0004e2de}, ++ {0x8968, 0x00074380}, ++ {0x896c, 0x4a004e00}, ++ {0x8970, 0x00064c00}, ++ {0x8974, 0x60007f00}, ++ {0x8978, 0x00046f00}, ++ {0x897c, 0x00054300}, ++ {0x8980, 0x00017300}, ++ {0x8984, 0xe2d70001}, ++ {0x8988, 0x5d010006}, ++ {0x898c, 0x61006002}, ++ {0x8990, 0x00055601}, ++ {0x8994, 0xe2e27710}, ++ {0x8998, 0x73000005}, ++ {0x899c, 0x43800004}, ++ {0x89a0, 0x5e010007}, ++ {0x89a4, 0x4d205e00}, ++ {0x89a8, 0x4a084e20}, ++ {0x89ac, 0x4c3f4960}, ++ {0x89b0, 0x00064301}, ++ {0x89b4, 0x63807f01}, ++ {0x89b8, 0x00046010}, ++ {0x89bc, 0x00064300}, ++ {0x89c0, 0x00077402}, ++ {0x89c4, 0x40004001}, ++ {0x89c8, 0x0006ab00}, ++ {0x89cc, 0x00077404}, ++ {0x89d0, 0x40004001}, ++ {0x89d4, 0x0004ab00}, ++ {0x89d8, 0x00074380}, ++ {0x89dc, 0x4e004d00}, ++ {0x89e0, 0x4c004a00}, ++ {0x89e4, 0x00064300}, ++ {0x89e8, 0x63007f00}, ++ {0x89ec, 0x00046000}, ++ {0x89f0, 0x00014300}, ++ {0x89f4, 0x73800005}, ++ {0x89f8, 0x42fe0004}, ++ {0x89fc, 0x6c010005}, ++ {0x8a00, 0x000514c8}, ++ {0x8a04, 0x00046c00}, ++ {0x8a08, 0x00014200}, ++ {0x8a0c, 0x0005e2ce}, ++ {0x8a10, 0x00017300}, ++ {0x8a14, 0x00040006}, ++ {0x8a18, 0x42fa4380}, ++ {0x8a1c, 0x42007c05}, ++ {0x8a20, 0x7c5b0006}, ++ {0x8a24, 0x7e5b7d5b}, ++ {0x8a28, 0x00077f00}, ++ {0x8a2c, 0x415b405b}, ++ {0x8a30, 0x4300425b}, ++ {0x8a34, 0x43000004}, ++ {0x8a38, 0x00040001}, ++ {0x8a3c, 0x60004380}, ++ {0x8a40, 0x62016100}, ++ {0x8a44, 0x42fa6310}, ++ {0x8a48, 0x42007c00}, ++ {0x8a4c, 0x00014300}, ++ {0x8a50, 0x0001e2e5}, ++ {0x8a54, 0x55000007}, ++ {0x8a58, 0x74200004}, ++ {0x8a5c, 0x79017711}, ++ {0x8a60, 0x57005710}, ++ {0x8a64, 0x00019700}, ++ {0x8a68, 0x4e004f02}, ++ {0x8a6c, 0x52015302}, ++ {0x8a70, 0x43800001}, ++ {0x8a74, 0x78006505}, ++ {0x8a78, 0x7a007900}, ++ {0x8a7c, 0x43007b00}, ++ {0x8a80, 0x43800001}, ++ {0x8a84, 0x43006500}, ++ {0x8a88, 0x43800001}, ++ {0x8a8c, 0x7c006405}, ++ {0x8a90, 0x00014300}, ++ {0x8a94, 0x64004380}, ++ {0x8a98, 0x00014300}, ++ {0x8a9c, 0x74200004}, ++ {0x8aa0, 0x0005e392}, ++ {0x8aa4, 0x73807388}, ++ {0x8aa8, 0xe3a08f00}, ++ {0x8aac, 0xe3920001}, ++ {0x8ab0, 0x73810005}, ++ {0x8ab4, 0x93007380}, ++ {0x8ab8, 0x0001e3a0}, ++ {0x8abc, 0xe2e5e3a7}, ++ {0x8ac0, 0x0001e3ae}, ++ {0x8ac4, 0xe3aee3a7}, ++ {0x8ac8, 0x00040001}, ++ {0x8acc, 0x24207410}, ++ {0x8ad0, 0x14c80000}, ++ {0x8ad4, 0x00002428}, ++ {0x8ad8, 0x1a4215f4}, ++ {0x8adc, 0x74300008}, ++ {0x8ae0, 0x43800001}, ++ {0x8ae4, 0x7a907b48}, ++ {0x8ae8, 0x78027900}, ++ {0x8aec, 0x55034300}, ++ {0x8af0, 0x43803308}, ++ {0x8af4, 0x7a807b38}, ++ {0x8af8, 0x55134300}, ++ {0x8afc, 0x43803308}, ++ {0x8b00, 0x7a007b40}, ++ {0x8b04, 0x55234300}, ++ {0x8b08, 0x74007401}, ++ {0x8b0c, 0x00018e00}, ++ {0x8b10, 0x52300007}, ++ {0x8b14, 0x74310004}, ++ {0x8b18, 0x8e007430}, ++ {0x8b1c, 0x52200007}, ++ {0x8b20, 0x00010004}, ++ {0x8b24, 0x57005702}, ++ {0x8b28, 0x00018e00}, ++ {0x8b2c, 0x561042ef}, ++ {0x8b30, 0x42005600}, ++ {0x8b34, 0x00018c00}, ++ {0x8b38, 0x4e004f78}, ++ {0x8b3c, 0x52015388}, ++ {0x8b40, 0xe32b5b20}, ++ {0x8b44, 0x54005480}, ++ {0x8b48, 0x54005481}, ++ {0x8b4c, 0x54005482}, ++ {0x8b50, 0xbf1de336}, ++ {0x8b54, 0xe2f13010}, ++ {0x8b58, 0xe2ffe2f9}, ++ {0x8b5c, 0xe3b3e312}, ++ {0x8b60, 0xe3085523}, ++ {0x8b64, 0xe3125525}, ++ {0x8b68, 0x0001e3b3}, ++ {0x8b6c, 0x54c054bf}, ++ {0x8b70, 0x54c154a3}, ++ {0x8b74, 0x4c1854a4}, ++ {0x8b78, 0x54c2bf07}, ++ {0x8b7c, 0xbf0454a4}, ++ {0x8b80, 0x54a354c1}, ++ {0x8b84, 0xe3c4bf01}, ++ {0x8b88, 0x000154df}, ++ {0x8b8c, 0x54e554bf}, ++ {0x8b90, 0x54df050a}, ++ {0x8b94, 0x16570001}, ++ {0x8b98, 0x74307b80}, ++ {0x8b9c, 0x7f404380}, ++ {0x8ba0, 0x7d007e00}, ++ {0x8ba4, 0x43007c02}, ++ {0x8ba8, 0x55015b40}, ++ {0x8bac, 0xe3165c01}, ++ {0x8bb0, 0x54005480}, ++ {0x8bb4, 0x54005481}, ++ {0x8bb8, 0x54005482}, ++ {0x8bbc, 0x74107b00}, ++ {0x8bc0, 0xbfe5e336}, ++ {0x8bc4, 0x56103010}, ++ {0x8bc8, 0x8c005600}, ++ {0x8bcc, 0x57040001}, ++ {0x8bd0, 0x8e005700}, ++ {0x8bd4, 0x57005708}, ++ {0x8bd8, 0x57818e00}, ++ {0x8bdc, 0x8e005780}, ++ {0x8be0, 0x00074380}, ++ {0x8be4, 0x5c005c01}, ++ {0x8be8, 0x00041403}, ++ {0x8bec, 0x00014300}, ++ {0x8bf0, 0x0007427f}, ++ {0x8bf4, 0x62006280}, ++ {0x8bf8, 0x00049200}, ++ {0x8bfc, 0x00014200}, ++ {0x8c00, 0x0007427f}, ++ {0x8c04, 0x63146394}, ++ {0x8c08, 0x00049200}, ++ {0x8c0c, 0x00014200}, ++ {0x8c10, 0x42fe0004}, ++ {0x8c14, 0x42007901}, ++ {0x8c18, 0x14037420}, ++ {0x8c1c, 0x57005710}, ++ {0x8c20, 0x0001140f}, ++ {0x8c24, 0x56010006}, ++ {0x8c28, 0x54005502}, ++ {0x8c2c, 0x7f000005}, ++ {0x8c30, 0x77107e12}, ++ {0x8c34, 0x75007600}, ++ {0x8c38, 0x00047400}, ++ {0x8c3c, 0x00014270}, ++ {0x8c40, 0x42000004}, ++ {0x8c44, 0x77000005}, ++ {0x8c48, 0x56000006}, ++ {0x8c4c, 0x00060001}, ++ {0x8c50, 0x5f005f80}, ++ {0x8c54, 0x00059900}, ++ {0x8c58, 0x00017300}, ++ {0x8c5c, 0x63800006}, ++ {0x8c60, 0x98006300}, ++ {0x8c64, 0x549f0001}, ++ {0x8c68, 0x5c015400}, ++ {0x8c6c, 0x540054df}, ++ {0x8c70, 0x00015c02}, ++ {0x8c74, 0x07145c01}, ++ {0x8c78, 0x5c025400}, ++ {0x8c7c, 0x5c020001}, ++ {0x8c80, 0x54000714}, ++ {0x8c84, 0x00015c01}, ++ {0x8c88, 0x4c184c98}, ++ {0x8c8c, 0x00040001}, ++ {0x8c90, 0x74305c02}, ++ {0x8c94, 0x0c010901}, ++ {0x8c98, 0x00050ba6}, ++ {0x8c9c, 0x00077780}, ++ {0x8ca0, 0x00045220}, ++ {0x8ca4, 0x60084380}, ++ {0x8ca8, 0x6200610a}, ++ {0x8cac, 0x000763ce}, ++ {0x8cb0, 0x00045c00}, ++ {0x8cb4, 0x00014300}, ++ {0x8080, 0x00000004}, ++ {0x8080, 0x00000000}, ++ {0x8088, 0x00000000}, ++}; ++ ++static const struct rtw89_txpwr_byrate_cfg rtw89_8852b_txpwr_byrate[] = { ++ { 0, 0, 0, 0, 4, 0x50505050, }, ++ { 0, 0, 1, 0, 4, 0x50505050, }, ++ { 0, 0, 1, 4, 4, 0x484c5050, }, ++ { 0, 0, 2, 0, 4, 0x50505050, }, ++ { 0, 0, 2, 4, 4, 0x44484c50, }, ++ { 0, 0, 2, 8, 4, 0x34383c40, }, ++ { 0, 0, 3, 0, 4, 0x50505050, }, ++ { 0, 1, 2, 0, 4, 0x50505050, }, ++ { 0, 1, 2, 4, 4, 0x44484c50, }, ++ { 0, 1, 2, 8, 4, 0x34383c40, }, ++ { 0, 1, 3, 0, 4, 0x50505050, }, ++ { 0, 0, 4, 1, 4, 0x00000000, }, ++ { 0, 0, 4, 0, 1, 0x00000000, }, ++ { 1, 0, 1, 0, 4, 0x50505050, }, ++ { 1, 0, 1, 4, 4, 0x484c5050, }, ++ { 1, 0, 2, 0, 4, 0x50505050, }, ++ { 1, 0, 2, 4, 4, 0x44484c50, }, ++ { 1, 0, 2, 8, 4, 0x34383c40, }, ++ { 1, 0, 3, 0, 4, 0x50505050, }, ++ { 1, 1, 2, 0, 4, 0x50505050, }, ++ { 1, 1, 2, 4, 4, 0x44484c50, }, ++ { 1, 1, 2, 8, 4, 0x34383c40, }, ++ { 1, 1, 3, 0, 4, 0x50505050, }, ++ { 1, 0, 4, 0, 4, 0x00000000, }, ++}; ++ ++static const s8 _txpwr_track_delta_swingidx_5gb_n[][DELTA_SWINGIDX_SIZE] = { ++ {0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, ++ 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8}, ++ {0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, ++ 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}, ++ {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, ++ 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12}, ++}; ++ ++static const s8 _txpwr_track_delta_swingidx_5gb_p[][DELTA_SWINGIDX_SIZE] = { ++ {0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, ++ 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}, ++ {0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, ++ 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8}, ++ {0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, ++ 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9}, ++}; ++ ++static const s8 _txpwr_track_delta_swingidx_5ga_n[][DELTA_SWINGIDX_SIZE] = { ++ {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, ++ 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4}, ++ {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}, ++ {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}, ++}; ++ ++static const s8 _txpwr_track_delta_swingidx_5ga_p[][DELTA_SWINGIDX_SIZE] = { ++ {0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, ++ 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7}, ++ {0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, ++ 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9}, ++ {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, ++ 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9}, ++}; ++ ++static const s8 _txpwr_track_delta_swingidx_2gb_n[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2}; ++ ++static const s8 _txpwr_track_delta_swingidx_2gb_p[] = { ++ 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, ++ 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6}; ++ ++static const s8 _txpwr_track_delta_swingidx_2ga_n[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ++ ++static const s8 _txpwr_track_delta_swingidx_2ga_p[] = { ++ 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, ++ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5}; ++ ++static const s8 _txpwr_track_delta_swingidx_2g_cck_b_n[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; ++ ++static const s8 _txpwr_track_delta_swingidx_2g_cck_b_p[] = { ++ 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, ++ 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6}; ++ ++static const s8 _txpwr_track_delta_swingidx_2g_cck_a_n[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2, -2, ++ -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -3}; ++ ++static const s8 _txpwr_track_delta_swingidx_2g_cck_a_p[] = { ++ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; ++ ++const u8 rtw89_8852b_tx_shape[RTW89_BAND_MAX][RTW89_RS_TX_SHAPE_NUM] ++ [RTW89_REGD_NUM] = { ++ [0][0][RTW89_ACMA] = 0, ++ [0][0][RTW89_CHILE] = 0, ++ [0][0][RTW89_CN] = 0, ++ [0][0][RTW89_ETSI] = 0, ++ [0][0][RTW89_FCC] = 1, ++ [0][0][RTW89_IC] = 1, ++ [0][0][RTW89_KCC] = 0, ++ [0][0][RTW89_MEXICO] = 1, ++ [0][0][RTW89_MKK] = 0, ++ [0][0][RTW89_QATAR] = 0, ++ [0][0][RTW89_UK] = 0, ++ [0][0][RTW89_UKRAINE] = 0, ++ [0][1][RTW89_ACMA] = 0, ++ [0][1][RTW89_CHILE] = 0, ++ [0][1][RTW89_CN] = 0, ++ [0][1][RTW89_ETSI] = 0, ++ [0][1][RTW89_FCC] = 3, ++ [0][1][RTW89_IC] = 3, ++ [0][1][RTW89_KCC] = 0, ++ [0][1][RTW89_MEXICO] = 3, ++ [0][1][RTW89_MKK] = 0, ++ [0][1][RTW89_QATAR] = 0, ++ [0][1][RTW89_UK] = 0, ++ [0][1][RTW89_UKRAINE] = 0, ++ [1][1][RTW89_ACMA] = 0, ++ [1][1][RTW89_CHILE] = 0, ++ [1][1][RTW89_CN] = 0, ++ [1][1][RTW89_ETSI] = 0, ++ [1][1][RTW89_FCC] = 3, ++ [1][1][RTW89_IC] = 3, ++ [1][1][RTW89_KCC] = 0, ++ [1][1][RTW89_MEXICO] = 3, ++ [1][1][RTW89_MKK] = 0, ++ [1][1][RTW89_QATAR] = 0, ++ [1][1][RTW89_UK] = 0, ++ [1][1][RTW89_UKRAINE] = 0, ++}; ++ ++const s8 rtw89_8852b_txpwr_lmt_2g[RTW89_2G_BW_NUM][RTW89_NTX_NUM] ++ [RTW89_RS_LMT_NUM][RTW89_BF_NUM] ++ [RTW89_REGD_NUM][RTW89_2G_CH_NUM] = { ++ [0][0][0][0][RTW89_WW][0] = 58, ++ [0][0][0][0][RTW89_WW][1] = 58, ++ [0][0][0][0][RTW89_WW][2] = 58, ++ [0][0][0][0][RTW89_WW][3] = 58, ++ [0][0][0][0][RTW89_WW][4] = 58, ++ [0][0][0][0][RTW89_WW][5] = 58, ++ [0][0][0][0][RTW89_WW][6] = 58, ++ [0][0][0][0][RTW89_WW][7] = 58, ++ [0][0][0][0][RTW89_WW][8] = 58, ++ [0][0][0][0][RTW89_WW][9] = 58, ++ [0][0][0][0][RTW89_WW][10] = 58, ++ [0][0][0][0][RTW89_WW][11] = 58, ++ [0][0][0][0][RTW89_WW][12] = 56, ++ [0][0][0][0][RTW89_WW][13] = 76, ++ [0][1][0][0][RTW89_WW][0] = 46, ++ [0][1][0][0][RTW89_WW][1] = 46, ++ [0][1][0][0][RTW89_WW][2] = 46, ++ [0][1][0][0][RTW89_WW][3] = 46, ++ [0][1][0][0][RTW89_WW][4] = 46, ++ [0][1][0][0][RTW89_WW][5] = 46, ++ [0][1][0][0][RTW89_WW][6] = 46, ++ [0][1][0][0][RTW89_WW][7] = 46, ++ [0][1][0][0][RTW89_WW][8] = 46, ++ [0][1][0][0][RTW89_WW][9] = 46, ++ [0][1][0][0][RTW89_WW][10] = 46, ++ [0][1][0][0][RTW89_WW][11] = 46, ++ [0][1][0][0][RTW89_WW][12] = 42, ++ [0][1][0][0][RTW89_WW][13] = 64, ++ [1][0][0][0][RTW89_WW][0] = 0, ++ [1][0][0][0][RTW89_WW][1] = 0, ++ [1][0][0][0][RTW89_WW][2] = 50, ++ [1][0][0][0][RTW89_WW][3] = 50, ++ [1][0][0][0][RTW89_WW][4] = 50, ++ [1][0][0][0][RTW89_WW][5] = 58, ++ [1][0][0][0][RTW89_WW][6] = 50, ++ [1][0][0][0][RTW89_WW][7] = 50, ++ [1][0][0][0][RTW89_WW][8] = 50, ++ [1][0][0][0][RTW89_WW][9] = 42, ++ [1][0][0][0][RTW89_WW][10] = 30, ++ [1][0][0][0][RTW89_WW][11] = 0, ++ [1][0][0][0][RTW89_WW][12] = 0, ++ [1][0][0][0][RTW89_WW][13] = 0, ++ [1][1][0][0][RTW89_WW][0] = 0, ++ [1][1][0][0][RTW89_WW][1] = 0, ++ [1][1][0][0][RTW89_WW][2] = 46, ++ [1][1][0][0][RTW89_WW][3] = 46, ++ [1][1][0][0][RTW89_WW][4] = 46, ++ [1][1][0][0][RTW89_WW][5] = 46, ++ [1][1][0][0][RTW89_WW][6] = 34, ++ [1][1][0][0][RTW89_WW][7] = 34, ++ [1][1][0][0][RTW89_WW][8] = 34, ++ [1][1][0][0][RTW89_WW][9] = 30, ++ [1][1][0][0][RTW89_WW][10] = 30, ++ [1][1][0][0][RTW89_WW][11] = 0, ++ [1][1][0][0][RTW89_WW][12] = 0, ++ [1][1][0][0][RTW89_WW][13] = 0, ++ [0][0][1][0][RTW89_WW][0] = 58, ++ [0][0][1][0][RTW89_WW][1] = 58, ++ [0][0][1][0][RTW89_WW][2] = 58, ++ [0][0][1][0][RTW89_WW][3] = 58, ++ [0][0][1][0][RTW89_WW][4] = 58, ++ [0][0][1][0][RTW89_WW][5] = 58, ++ [0][0][1][0][RTW89_WW][6] = 58, ++ [0][0][1][0][RTW89_WW][7] = 58, ++ [0][0][1][0][RTW89_WW][8] = 58, ++ [0][0][1][0][RTW89_WW][9] = 58, ++ [0][0][1][0][RTW89_WW][10] = 58, ++ [0][0][1][0][RTW89_WW][11] = 54, ++ [0][0][1][0][RTW89_WW][12] = 50, ++ [0][0][1][0][RTW89_WW][13] = 0, ++ [0][1][1][0][RTW89_WW][0] = 46, ++ [0][1][1][0][RTW89_WW][1] = 46, ++ [0][1][1][0][RTW89_WW][2] = 46, ++ [0][1][1][0][RTW89_WW][3] = 46, ++ [0][1][1][0][RTW89_WW][4] = 46, ++ [0][1][1][0][RTW89_WW][5] = 46, ++ [0][1][1][0][RTW89_WW][6] = 46, ++ [0][1][1][0][RTW89_WW][7] = 46, ++ [0][1][1][0][RTW89_WW][8] = 46, ++ [0][1][1][0][RTW89_WW][9] = 46, ++ [0][1][1][0][RTW89_WW][10] = 46, ++ [0][1][1][0][RTW89_WW][11] = 46, ++ [0][1][1][0][RTW89_WW][12] = 42, ++ [0][1][1][0][RTW89_WW][13] = 0, ++ [0][0][2][0][RTW89_WW][0] = 58, ++ [0][0][2][0][RTW89_WW][1] = 58, ++ [0][0][2][0][RTW89_WW][2] = 58, ++ [0][0][2][0][RTW89_WW][3] = 58, ++ [0][0][2][0][RTW89_WW][4] = 58, ++ [0][0][2][0][RTW89_WW][5] = 58, ++ [0][0][2][0][RTW89_WW][6] = 58, ++ [0][0][2][0][RTW89_WW][7] = 58, ++ [0][0][2][0][RTW89_WW][8] = 58, ++ [0][0][2][0][RTW89_WW][9] = 58, ++ [0][0][2][0][RTW89_WW][10] = 58, ++ [0][0][2][0][RTW89_WW][11] = 54, ++ [0][0][2][0][RTW89_WW][12] = 50, ++ [0][0][2][0][RTW89_WW][13] = 0, ++ [0][1][2][0][RTW89_WW][0] = 46, ++ [0][1][2][0][RTW89_WW][1] = 46, ++ [0][1][2][0][RTW89_WW][2] = 46, ++ [0][1][2][0][RTW89_WW][3] = 46, ++ [0][1][2][0][RTW89_WW][4] = 46, ++ [0][1][2][0][RTW89_WW][5] = 46, ++ [0][1][2][0][RTW89_WW][6] = 46, ++ [0][1][2][0][RTW89_WW][7] = 46, ++ [0][1][2][0][RTW89_WW][8] = 46, ++ [0][1][2][0][RTW89_WW][9] = 46, ++ [0][1][2][0][RTW89_WW][10] = 46, ++ [0][1][2][0][RTW89_WW][11] = 46, ++ [0][1][2][0][RTW89_WW][12] = 42, ++ [0][1][2][0][RTW89_WW][13] = 0, ++ [0][1][2][1][RTW89_WW][0] = 34, ++ [0][1][2][1][RTW89_WW][1] = 34, ++ [0][1][2][1][RTW89_WW][2] = 34, ++ [0][1][2][1][RTW89_WW][3] = 34, ++ [0][1][2][1][RTW89_WW][4] = 34, ++ [0][1][2][1][RTW89_WW][5] = 34, ++ [0][1][2][1][RTW89_WW][6] = 34, ++ [0][1][2][1][RTW89_WW][7] = 34, ++ [0][1][2][1][RTW89_WW][8] = 34, ++ [0][1][2][1][RTW89_WW][9] = 34, ++ [0][1][2][1][RTW89_WW][10] = 34, ++ [0][1][2][1][RTW89_WW][11] = 34, ++ [0][1][2][1][RTW89_WW][12] = 34, ++ [0][1][2][1][RTW89_WW][13] = 0, ++ [1][0][2][0][RTW89_WW][0] = 0, ++ [1][0][2][0][RTW89_WW][1] = 0, ++ [1][0][2][0][RTW89_WW][2] = 58, ++ [1][0][2][0][RTW89_WW][3] = 58, ++ [1][0][2][0][RTW89_WW][4] = 58, ++ [1][0][2][0][RTW89_WW][5] = 58, ++ [1][0][2][0][RTW89_WW][6] = 58, ++ [1][0][2][0][RTW89_WW][7] = 58, ++ [1][0][2][0][RTW89_WW][8] = 58, ++ [1][0][2][0][RTW89_WW][9] = 58, ++ [1][0][2][0][RTW89_WW][10] = 58, ++ [1][0][2][0][RTW89_WW][11] = 0, ++ [1][0][2][0][RTW89_WW][12] = 0, ++ [1][0][2][0][RTW89_WW][13] = 0, ++ [1][1][2][0][RTW89_WW][0] = 0, ++ [1][1][2][0][RTW89_WW][1] = 0, ++ [1][1][2][0][RTW89_WW][2] = 46, ++ [1][1][2][0][RTW89_WW][3] = 46, ++ [1][1][2][0][RTW89_WW][4] = 46, ++ [1][1][2][0][RTW89_WW][5] = 46, ++ [1][1][2][0][RTW89_WW][6] = 46, ++ [1][1][2][0][RTW89_WW][7] = 46, ++ [1][1][2][0][RTW89_WW][8] = 46, ++ [1][1][2][0][RTW89_WW][9] = 42, ++ [1][1][2][0][RTW89_WW][10] = 38, ++ [1][1][2][0][RTW89_WW][11] = 0, ++ [1][1][2][0][RTW89_WW][12] = 0, ++ [1][1][2][0][RTW89_WW][13] = 0, ++ [1][1][2][1][RTW89_WW][0] = 0, ++ [1][1][2][1][RTW89_WW][1] = 0, ++ [1][1][2][1][RTW89_WW][2] = 34, ++ [1][1][2][1][RTW89_WW][3] = 34, ++ [1][1][2][1][RTW89_WW][4] = 34, ++ [1][1][2][1][RTW89_WW][5] = 34, ++ [1][1][2][1][RTW89_WW][6] = 34, ++ [1][1][2][1][RTW89_WW][7] = 34, ++ [1][1][2][1][RTW89_WW][8] = 34, ++ [1][1][2][1][RTW89_WW][9] = 34, ++ [1][1][2][1][RTW89_WW][10] = 34, ++ [1][1][2][1][RTW89_WW][11] = 0, ++ [1][1][2][1][RTW89_WW][12] = 0, ++ [1][1][2][1][RTW89_WW][13] = 0, ++ [0][0][0][0][RTW89_FCC][0] = 78, ++ [0][0][0][0][RTW89_ETSI][0] = 58, ++ [0][0][0][0][RTW89_MKK][0] = 68, ++ [0][0][0][0][RTW89_IC][0] = 78, ++ [0][0][0][0][RTW89_KCC][0] = 68, ++ [0][0][0][0][RTW89_ACMA][0] = 58, ++ [0][0][0][0][RTW89_CHILE][0] = 64, ++ [0][0][0][0][RTW89_UKRAINE][0] = 58, ++ [0][0][0][0][RTW89_MEXICO][0] = 78, ++ [0][0][0][0][RTW89_CN][0] = 58, ++ [0][0][0][0][RTW89_QATAR][0] = 58, ++ [0][0][0][0][RTW89_UK][0] = 58, ++ [0][0][0][0][RTW89_FCC][1] = 78, ++ [0][0][0][0][RTW89_ETSI][1] = 58, ++ [0][0][0][0][RTW89_MKK][1] = 68, ++ [0][0][0][0][RTW89_IC][1] = 78, ++ [0][0][0][0][RTW89_KCC][1] = 68, ++ [0][0][0][0][RTW89_ACMA][1] = 58, ++ [0][0][0][0][RTW89_CHILE][1] = 64, ++ [0][0][0][0][RTW89_UKRAINE][1] = 58, ++ [0][0][0][0][RTW89_MEXICO][1] = 78, ++ [0][0][0][0][RTW89_CN][1] = 58, ++ [0][0][0][0][RTW89_QATAR][1] = 58, ++ [0][0][0][0][RTW89_UK][1] = 58, ++ [0][0][0][0][RTW89_FCC][2] = 78, ++ [0][0][0][0][RTW89_ETSI][2] = 58, ++ [0][0][0][0][RTW89_MKK][2] = 68, ++ [0][0][0][0][RTW89_IC][2] = 78, ++ [0][0][0][0][RTW89_KCC][2] = 68, ++ [0][0][0][0][RTW89_ACMA][2] = 58, ++ [0][0][0][0][RTW89_CHILE][2] = 64, ++ [0][0][0][0][RTW89_UKRAINE][2] = 58, ++ [0][0][0][0][RTW89_MEXICO][2] = 78, ++ [0][0][0][0][RTW89_CN][2] = 58, ++ [0][0][0][0][RTW89_QATAR][2] = 58, ++ [0][0][0][0][RTW89_UK][2] = 58, ++ [0][0][0][0][RTW89_FCC][3] = 78, ++ [0][0][0][0][RTW89_ETSI][3] = 58, ++ [0][0][0][0][RTW89_MKK][3] = 68, ++ [0][0][0][0][RTW89_IC][3] = 78, ++ [0][0][0][0][RTW89_KCC][3] = 68, ++ [0][0][0][0][RTW89_ACMA][3] = 58, ++ [0][0][0][0][RTW89_CHILE][3] = 64, ++ [0][0][0][0][RTW89_UKRAINE][3] = 58, ++ [0][0][0][0][RTW89_MEXICO][3] = 78, ++ [0][0][0][0][RTW89_CN][3] = 58, ++ [0][0][0][0][RTW89_QATAR][3] = 58, ++ [0][0][0][0][RTW89_UK][3] = 58, ++ [0][0][0][0][RTW89_FCC][4] = 78, ++ [0][0][0][0][RTW89_ETSI][4] = 58, ++ [0][0][0][0][RTW89_MKK][4] = 68, ++ [0][0][0][0][RTW89_IC][4] = 78, ++ [0][0][0][0][RTW89_KCC][4] = 70, ++ [0][0][0][0][RTW89_ACMA][4] = 58, ++ [0][0][0][0][RTW89_CHILE][4] = 64, ++ [0][0][0][0][RTW89_UKRAINE][4] = 58, ++ [0][0][0][0][RTW89_MEXICO][4] = 78, ++ [0][0][0][0][RTW89_CN][4] = 58, ++ [0][0][0][0][RTW89_QATAR][4] = 58, ++ [0][0][0][0][RTW89_UK][4] = 58, ++ [0][0][0][0][RTW89_FCC][5] = 78, ++ [0][0][0][0][RTW89_ETSI][5] = 58, ++ [0][0][0][0][RTW89_MKK][5] = 68, ++ [0][0][0][0][RTW89_IC][5] = 78, ++ [0][0][0][0][RTW89_KCC][5] = 70, ++ [0][0][0][0][RTW89_ACMA][5] = 58, ++ [0][0][0][0][RTW89_CHILE][5] = 64, ++ [0][0][0][0][RTW89_UKRAINE][5] = 58, ++ [0][0][0][0][RTW89_MEXICO][5] = 78, ++ [0][0][0][0][RTW89_CN][5] = 58, ++ [0][0][0][0][RTW89_QATAR][5] = 58, ++ [0][0][0][0][RTW89_UK][5] = 58, ++ [0][0][0][0][RTW89_FCC][6] = 78, ++ [0][0][0][0][RTW89_ETSI][6] = 58, ++ [0][0][0][0][RTW89_MKK][6] = 68, ++ [0][0][0][0][RTW89_IC][6] = 78, ++ [0][0][0][0][RTW89_KCC][6] = 70, ++ [0][0][0][0][RTW89_ACMA][6] = 58, ++ [0][0][0][0][RTW89_CHILE][6] = 64, ++ [0][0][0][0][RTW89_UKRAINE][6] = 58, ++ [0][0][0][0][RTW89_MEXICO][6] = 78, ++ [0][0][0][0][RTW89_CN][6] = 58, ++ [0][0][0][0][RTW89_QATAR][6] = 58, ++ [0][0][0][0][RTW89_UK][6] = 58, ++ [0][0][0][0][RTW89_FCC][7] = 78, ++ [0][0][0][0][RTW89_ETSI][7] = 58, ++ [0][0][0][0][RTW89_MKK][7] = 68, ++ [0][0][0][0][RTW89_IC][7] = 78, ++ [0][0][0][0][RTW89_KCC][7] = 70, ++ [0][0][0][0][RTW89_ACMA][7] = 58, ++ [0][0][0][0][RTW89_CHILE][7] = 64, ++ [0][0][0][0][RTW89_UKRAINE][7] = 58, ++ [0][0][0][0][RTW89_MEXICO][7] = 78, ++ [0][0][0][0][RTW89_CN][7] = 58, ++ [0][0][0][0][RTW89_QATAR][7] = 58, ++ [0][0][0][0][RTW89_UK][7] = 58, ++ [0][0][0][0][RTW89_FCC][8] = 78, ++ [0][0][0][0][RTW89_ETSI][8] = 58, ++ [0][0][0][0][RTW89_MKK][8] = 68, ++ [0][0][0][0][RTW89_IC][8] = 78, ++ [0][0][0][0][RTW89_KCC][8] = 70, ++ [0][0][0][0][RTW89_ACMA][8] = 58, ++ [0][0][0][0][RTW89_CHILE][8] = 64, ++ [0][0][0][0][RTW89_UKRAINE][8] = 58, ++ [0][0][0][0][RTW89_MEXICO][8] = 78, ++ [0][0][0][0][RTW89_CN][8] = 58, ++ [0][0][0][0][RTW89_QATAR][8] = 58, ++ [0][0][0][0][RTW89_UK][8] = 58, ++ [0][0][0][0][RTW89_FCC][9] = 78, ++ [0][0][0][0][RTW89_ETSI][9] = 58, ++ [0][0][0][0][RTW89_MKK][9] = 68, ++ [0][0][0][0][RTW89_IC][9] = 78, ++ [0][0][0][0][RTW89_KCC][9] = 70, ++ [0][0][0][0][RTW89_ACMA][9] = 58, ++ [0][0][0][0][RTW89_CHILE][9] = 64, ++ [0][0][0][0][RTW89_UKRAINE][9] = 58, ++ [0][0][0][0][RTW89_MEXICO][9] = 78, ++ [0][0][0][0][RTW89_CN][9] = 58, ++ [0][0][0][0][RTW89_QATAR][9] = 58, ++ [0][0][0][0][RTW89_UK][9] = 58, ++ [0][0][0][0][RTW89_FCC][10] = 78, ++ [0][0][0][0][RTW89_ETSI][10] = 58, ++ [0][0][0][0][RTW89_MKK][10] = 68, ++ [0][0][0][0][RTW89_IC][10] = 78, ++ [0][0][0][0][RTW89_KCC][10] = 70, ++ [0][0][0][0][RTW89_ACMA][10] = 58, ++ [0][0][0][0][RTW89_CHILE][10] = 66, ++ [0][0][0][0][RTW89_UKRAINE][10] = 58, ++ [0][0][0][0][RTW89_MEXICO][10] = 78, ++ [0][0][0][0][RTW89_CN][10] = 58, ++ [0][0][0][0][RTW89_QATAR][10] = 58, ++ [0][0][0][0][RTW89_UK][10] = 58, ++ [0][0][0][0][RTW89_FCC][11] = 70, ++ [0][0][0][0][RTW89_ETSI][11] = 58, ++ [0][0][0][0][RTW89_MKK][11] = 68, ++ [0][0][0][0][RTW89_IC][11] = 70, ++ [0][0][0][0][RTW89_KCC][11] = 70, ++ [0][0][0][0][RTW89_ACMA][11] = 58, ++ [0][0][0][0][RTW89_CHILE][11] = 64, ++ [0][0][0][0][RTW89_UKRAINE][11] = 58, ++ [0][0][0][0][RTW89_MEXICO][11] = 70, ++ [0][0][0][0][RTW89_CN][11] = 58, ++ [0][0][0][0][RTW89_QATAR][11] = 58, ++ [0][0][0][0][RTW89_UK][11] = 58, ++ [0][0][0][0][RTW89_FCC][12] = 56, ++ [0][0][0][0][RTW89_ETSI][12] = 58, ++ [0][0][0][0][RTW89_MKK][12] = 68, ++ [0][0][0][0][RTW89_IC][12] = 56, ++ [0][0][0][0][RTW89_KCC][12] = 70, ++ [0][0][0][0][RTW89_ACMA][12] = 58, ++ [0][0][0][0][RTW89_CHILE][12] = 56, ++ [0][0][0][0][RTW89_UKRAINE][12] = 58, ++ [0][0][0][0][RTW89_MEXICO][12] = 56, ++ [0][0][0][0][RTW89_CN][12] = 58, ++ [0][0][0][0][RTW89_QATAR][12] = 58, ++ [0][0][0][0][RTW89_UK][12] = 58, ++ [0][0][0][0][RTW89_FCC][13] = 127, ++ [0][0][0][0][RTW89_ETSI][13] = 127, ++ [0][0][0][0][RTW89_MKK][13] = 76, ++ [0][0][0][0][RTW89_IC][13] = 127, ++ [0][0][0][0][RTW89_KCC][13] = 127, ++ [0][0][0][0][RTW89_ACMA][13] = 127, ++ [0][0][0][0][RTW89_CHILE][13] = 127, ++ [0][0][0][0][RTW89_UKRAINE][13] = 127, ++ [0][0][0][0][RTW89_MEXICO][13] = 127, ++ [0][0][0][0][RTW89_CN][13] = 127, ++ [0][0][0][0][RTW89_QATAR][13] = 127, ++ [0][0][0][0][RTW89_UK][13] = 127, ++ [0][1][0][0][RTW89_FCC][0] = 74, ++ [0][1][0][0][RTW89_ETSI][0] = 46, ++ [0][1][0][0][RTW89_MKK][0] = 56, ++ [0][1][0][0][RTW89_IC][0] = 74, ++ [0][1][0][0][RTW89_KCC][0] = 58, ++ [0][1][0][0][RTW89_ACMA][0] = 46, ++ [0][1][0][0][RTW89_CHILE][0] = 50, ++ [0][1][0][0][RTW89_UKRAINE][0] = 46, ++ [0][1][0][0][RTW89_MEXICO][0] = 74, ++ [0][1][0][0][RTW89_CN][0] = 46, ++ [0][1][0][0][RTW89_QATAR][0] = 46, ++ [0][1][0][0][RTW89_UK][0] = 46, ++ [0][1][0][0][RTW89_FCC][1] = 74, ++ [0][1][0][0][RTW89_ETSI][1] = 46, ++ [0][1][0][0][RTW89_MKK][1] = 56, ++ [0][1][0][0][RTW89_IC][1] = 74, ++ [0][1][0][0][RTW89_KCC][1] = 58, ++ [0][1][0][0][RTW89_ACMA][1] = 46, ++ [0][1][0][0][RTW89_CHILE][1] = 50, ++ [0][1][0][0][RTW89_UKRAINE][1] = 46, ++ [0][1][0][0][RTW89_MEXICO][1] = 74, ++ [0][1][0][0][RTW89_CN][1] = 46, ++ [0][1][0][0][RTW89_QATAR][1] = 46, ++ [0][1][0][0][RTW89_UK][1] = 46, ++ [0][1][0][0][RTW89_FCC][2] = 74, ++ [0][1][0][0][RTW89_ETSI][2] = 46, ++ [0][1][0][0][RTW89_MKK][2] = 56, ++ [0][1][0][0][RTW89_IC][2] = 74, ++ [0][1][0][0][RTW89_KCC][2] = 58, ++ [0][1][0][0][RTW89_ACMA][2] = 46, ++ [0][1][0][0][RTW89_CHILE][2] = 50, ++ [0][1][0][0][RTW89_UKRAINE][2] = 46, ++ [0][1][0][0][RTW89_MEXICO][2] = 74, ++ [0][1][0][0][RTW89_CN][2] = 46, ++ [0][1][0][0][RTW89_QATAR][2] = 46, ++ [0][1][0][0][RTW89_UK][2] = 46, ++ [0][1][0][0][RTW89_FCC][3] = 74, ++ [0][1][0][0][RTW89_ETSI][3] = 46, ++ [0][1][0][0][RTW89_MKK][3] = 56, ++ [0][1][0][0][RTW89_IC][3] = 74, ++ [0][1][0][0][RTW89_KCC][3] = 58, ++ [0][1][0][0][RTW89_ACMA][3] = 46, ++ [0][1][0][0][RTW89_CHILE][3] = 50, ++ [0][1][0][0][RTW89_UKRAINE][3] = 46, ++ [0][1][0][0][RTW89_MEXICO][3] = 74, ++ [0][1][0][0][RTW89_CN][3] = 46, ++ [0][1][0][0][RTW89_QATAR][3] = 46, ++ [0][1][0][0][RTW89_UK][3] = 46, ++ [0][1][0][0][RTW89_FCC][4] = 74, ++ [0][1][0][0][RTW89_ETSI][4] = 46, ++ [0][1][0][0][RTW89_MKK][4] = 56, ++ [0][1][0][0][RTW89_IC][4] = 74, ++ [0][1][0][0][RTW89_KCC][4] = 56, ++ [0][1][0][0][RTW89_ACMA][4] = 46, ++ [0][1][0][0][RTW89_CHILE][4] = 50, ++ [0][1][0][0][RTW89_UKRAINE][4] = 46, ++ [0][1][0][0][RTW89_MEXICO][4] = 74, ++ [0][1][0][0][RTW89_CN][4] = 46, ++ [0][1][0][0][RTW89_QATAR][4] = 46, ++ [0][1][0][0][RTW89_UK][4] = 46, ++ [0][1][0][0][RTW89_FCC][5] = 74, ++ [0][1][0][0][RTW89_ETSI][5] = 46, ++ [0][1][0][0][RTW89_MKK][5] = 56, ++ [0][1][0][0][RTW89_IC][5] = 74, ++ [0][1][0][0][RTW89_KCC][5] = 56, ++ [0][1][0][0][RTW89_ACMA][5] = 46, ++ [0][1][0][0][RTW89_CHILE][5] = 50, ++ [0][1][0][0][RTW89_UKRAINE][5] = 46, ++ [0][1][0][0][RTW89_MEXICO][5] = 74, ++ [0][1][0][0][RTW89_CN][5] = 46, ++ [0][1][0][0][RTW89_QATAR][5] = 46, ++ [0][1][0][0][RTW89_UK][5] = 46, ++ [0][1][0][0][RTW89_FCC][6] = 74, ++ [0][1][0][0][RTW89_ETSI][6] = 46, ++ [0][1][0][0][RTW89_MKK][6] = 56, ++ [0][1][0][0][RTW89_IC][6] = 74, ++ [0][1][0][0][RTW89_KCC][6] = 56, ++ [0][1][0][0][RTW89_ACMA][6] = 46, ++ [0][1][0][0][RTW89_CHILE][6] = 52, ++ [0][1][0][0][RTW89_UKRAINE][6] = 46, ++ [0][1][0][0][RTW89_MEXICO][6] = 74, ++ [0][1][0][0][RTW89_CN][6] = 46, ++ [0][1][0][0][RTW89_QATAR][6] = 46, ++ [0][1][0][0][RTW89_UK][6] = 46, ++ [0][1][0][0][RTW89_FCC][7] = 74, ++ [0][1][0][0][RTW89_ETSI][7] = 46, ++ [0][1][0][0][RTW89_MKK][7] = 56, ++ [0][1][0][0][RTW89_IC][7] = 74, ++ [0][1][0][0][RTW89_KCC][7] = 56, ++ [0][1][0][0][RTW89_ACMA][7] = 46, ++ [0][1][0][0][RTW89_CHILE][7] = 50, ++ [0][1][0][0][RTW89_UKRAINE][7] = 46, ++ [0][1][0][0][RTW89_MEXICO][7] = 74, ++ [0][1][0][0][RTW89_CN][7] = 46, ++ [0][1][0][0][RTW89_QATAR][7] = 46, ++ [0][1][0][0][RTW89_UK][7] = 46, ++ [0][1][0][0][RTW89_FCC][8] = 74, ++ [0][1][0][0][RTW89_ETSI][8] = 46, ++ [0][1][0][0][RTW89_MKK][8] = 56, ++ [0][1][0][0][RTW89_IC][8] = 74, ++ [0][1][0][0][RTW89_KCC][8] = 56, ++ [0][1][0][0][RTW89_ACMA][8] = 46, ++ [0][1][0][0][RTW89_CHILE][8] = 50, ++ [0][1][0][0][RTW89_UKRAINE][8] = 46, ++ [0][1][0][0][RTW89_MEXICO][8] = 74, ++ [0][1][0][0][RTW89_CN][8] = 46, ++ [0][1][0][0][RTW89_QATAR][8] = 46, ++ [0][1][0][0][RTW89_UK][8] = 46, ++ [0][1][0][0][RTW89_FCC][9] = 74, ++ [0][1][0][0][RTW89_ETSI][9] = 46, ++ [0][1][0][0][RTW89_MKK][9] = 56, ++ [0][1][0][0][RTW89_IC][9] = 74, ++ [0][1][0][0][RTW89_KCC][9] = 54, ++ [0][1][0][0][RTW89_ACMA][9] = 46, ++ [0][1][0][0][RTW89_CHILE][9] = 50, ++ [0][1][0][0][RTW89_UKRAINE][9] = 46, ++ [0][1][0][0][RTW89_MEXICO][9] = 74, ++ [0][1][0][0][RTW89_CN][9] = 46, ++ [0][1][0][0][RTW89_QATAR][9] = 46, ++ [0][1][0][0][RTW89_UK][9] = 46, ++ [0][1][0][0][RTW89_FCC][10] = 74, ++ [0][1][0][0][RTW89_ETSI][10] = 46, ++ [0][1][0][0][RTW89_MKK][10] = 56, ++ [0][1][0][0][RTW89_IC][10] = 74, ++ [0][1][0][0][RTW89_KCC][10] = 54, ++ [0][1][0][0][RTW89_ACMA][10] = 46, ++ [0][1][0][0][RTW89_CHILE][10] = 52, ++ [0][1][0][0][RTW89_UKRAINE][10] = 46, ++ [0][1][0][0][RTW89_MEXICO][10] = 74, ++ [0][1][0][0][RTW89_CN][10] = 46, ++ [0][1][0][0][RTW89_QATAR][10] = 46, ++ [0][1][0][0][RTW89_UK][10] = 46, ++ [0][1][0][0][RTW89_FCC][11] = 54, ++ [0][1][0][0][RTW89_ETSI][11] = 46, ++ [0][1][0][0][RTW89_MKK][11] = 56, ++ [0][1][0][0][RTW89_IC][11] = 54, ++ [0][1][0][0][RTW89_KCC][11] = 54, ++ [0][1][0][0][RTW89_ACMA][11] = 46, ++ [0][1][0][0][RTW89_CHILE][11] = 50, ++ [0][1][0][0][RTW89_UKRAINE][11] = 46, ++ [0][1][0][0][RTW89_MEXICO][11] = 54, ++ [0][1][0][0][RTW89_CN][11] = 46, ++ [0][1][0][0][RTW89_QATAR][11] = 46, ++ [0][1][0][0][RTW89_UK][11] = 46, ++ [0][1][0][0][RTW89_FCC][12] = 42, ++ [0][1][0][0][RTW89_ETSI][12] = 46, ++ [0][1][0][0][RTW89_MKK][12] = 56, ++ [0][1][0][0][RTW89_IC][12] = 42, ++ [0][1][0][0][RTW89_KCC][12] = 54, ++ [0][1][0][0][RTW89_ACMA][12] = 46, ++ [0][1][0][0][RTW89_CHILE][12] = 42, ++ [0][1][0][0][RTW89_UKRAINE][12] = 46, ++ [0][1][0][0][RTW89_MEXICO][12] = 42, ++ [0][1][0][0][RTW89_CN][12] = 46, ++ [0][1][0][0][RTW89_QATAR][12] = 46, ++ [0][1][0][0][RTW89_UK][12] = 46, ++ [0][1][0][0][RTW89_FCC][13] = 127, ++ [0][1][0][0][RTW89_ETSI][13] = 127, ++ [0][1][0][0][RTW89_MKK][13] = 64, ++ [0][1][0][0][RTW89_IC][13] = 127, ++ [0][1][0][0][RTW89_KCC][13] = 127, ++ [0][1][0][0][RTW89_ACMA][13] = 127, ++ [0][1][0][0][RTW89_CHILE][13] = 127, ++ [0][1][0][0][RTW89_UKRAINE][13] = 127, ++ [0][1][0][0][RTW89_MEXICO][13] = 127, ++ [0][1][0][0][RTW89_CN][13] = 127, ++ [0][1][0][0][RTW89_QATAR][13] = 127, ++ [0][1][0][0][RTW89_UK][13] = 127, ++ [1][0][0][0][RTW89_FCC][0] = 127, ++ [1][0][0][0][RTW89_ETSI][0] = 127, ++ [1][0][0][0][RTW89_MKK][0] = 127, ++ [1][0][0][0][RTW89_IC][0] = 127, ++ [1][0][0][0][RTW89_KCC][0] = 127, ++ [1][0][0][0][RTW89_ACMA][0] = 127, ++ [1][0][0][0][RTW89_CHILE][0] = 127, ++ [1][0][0][0][RTW89_UKRAINE][0] = 127, ++ [1][0][0][0][RTW89_MEXICO][0] = 127, ++ [1][0][0][0][RTW89_CN][0] = 127, ++ [1][0][0][0][RTW89_QATAR][0] = 127, ++ [1][0][0][0][RTW89_UK][0] = 127, ++ [1][0][0][0][RTW89_FCC][1] = 127, ++ [1][0][0][0][RTW89_ETSI][1] = 127, ++ [1][0][0][0][RTW89_MKK][1] = 127, ++ [1][0][0][0][RTW89_IC][1] = 127, ++ [1][0][0][0][RTW89_KCC][1] = 127, ++ [1][0][0][0][RTW89_ACMA][1] = 127, ++ [1][0][0][0][RTW89_CHILE][1] = 127, ++ [1][0][0][0][RTW89_UKRAINE][1] = 127, ++ [1][0][0][0][RTW89_MEXICO][1] = 127, ++ [1][0][0][0][RTW89_CN][1] = 127, ++ [1][0][0][0][RTW89_QATAR][1] = 127, ++ [1][0][0][0][RTW89_UK][1] = 127, ++ [1][0][0][0][RTW89_FCC][2] = 50, ++ [1][0][0][0][RTW89_ETSI][2] = 58, ++ [1][0][0][0][RTW89_MKK][2] = 76, ++ [1][0][0][0][RTW89_IC][2] = 50, ++ [1][0][0][0][RTW89_KCC][2] = 70, ++ [1][0][0][0][RTW89_ACMA][2] = 58, ++ [1][0][0][0][RTW89_CHILE][2] = 62, ++ [1][0][0][0][RTW89_UKRAINE][2] = 58, ++ [1][0][0][0][RTW89_MEXICO][2] = 50, ++ [1][0][0][0][RTW89_CN][2] = 58, ++ [1][0][0][0][RTW89_QATAR][2] = 58, ++ [1][0][0][0][RTW89_UK][2] = 58, ++ [1][0][0][0][RTW89_FCC][3] = 50, ++ [1][0][0][0][RTW89_ETSI][3] = 58, ++ [1][0][0][0][RTW89_MKK][3] = 76, ++ [1][0][0][0][RTW89_IC][3] = 50, ++ [1][0][0][0][RTW89_KCC][3] = 70, ++ [1][0][0][0][RTW89_ACMA][3] = 58, ++ [1][0][0][0][RTW89_CHILE][3] = 62, ++ [1][0][0][0][RTW89_UKRAINE][3] = 58, ++ [1][0][0][0][RTW89_MEXICO][3] = 50, ++ [1][0][0][0][RTW89_CN][3] = 58, ++ [1][0][0][0][RTW89_QATAR][3] = 58, ++ [1][0][0][0][RTW89_UK][3] = 58, ++ [1][0][0][0][RTW89_FCC][4] = 50, ++ [1][0][0][0][RTW89_ETSI][4] = 58, ++ [1][0][0][0][RTW89_MKK][4] = 76, ++ [1][0][0][0][RTW89_IC][4] = 50, ++ [1][0][0][0][RTW89_KCC][4] = 70, ++ [1][0][0][0][RTW89_ACMA][4] = 58, ++ [1][0][0][0][RTW89_CHILE][4] = 62, ++ [1][0][0][0][RTW89_UKRAINE][4] = 58, ++ [1][0][0][0][RTW89_MEXICO][4] = 50, ++ [1][0][0][0][RTW89_CN][4] = 58, ++ [1][0][0][0][RTW89_QATAR][4] = 58, ++ [1][0][0][0][RTW89_UK][4] = 58, ++ [1][0][0][0][RTW89_FCC][5] = 66, ++ [1][0][0][0][RTW89_ETSI][5] = 58, ++ [1][0][0][0][RTW89_MKK][5] = 76, ++ [1][0][0][0][RTW89_IC][5] = 66, ++ [1][0][0][0][RTW89_KCC][5] = 70, ++ [1][0][0][0][RTW89_ACMA][5] = 58, ++ [1][0][0][0][RTW89_CHILE][5] = 62, ++ [1][0][0][0][RTW89_UKRAINE][5] = 58, ++ [1][0][0][0][RTW89_MEXICO][5] = 66, ++ [1][0][0][0][RTW89_CN][5] = 58, ++ [1][0][0][0][RTW89_QATAR][5] = 58, ++ [1][0][0][0][RTW89_UK][5] = 58, ++ [1][0][0][0][RTW89_FCC][6] = 50, ++ [1][0][0][0][RTW89_ETSI][6] = 58, ++ [1][0][0][0][RTW89_MKK][6] = 76, ++ [1][0][0][0][RTW89_IC][6] = 50, ++ [1][0][0][0][RTW89_KCC][6] = 70, ++ [1][0][0][0][RTW89_ACMA][6] = 58, ++ [1][0][0][0][RTW89_CHILE][6] = 62, ++ [1][0][0][0][RTW89_UKRAINE][6] = 58, ++ [1][0][0][0][RTW89_MEXICO][6] = 50, ++ [1][0][0][0][RTW89_CN][6] = 58, ++ [1][0][0][0][RTW89_QATAR][6] = 58, ++ [1][0][0][0][RTW89_UK][6] = 58, ++ [1][0][0][0][RTW89_FCC][7] = 50, ++ [1][0][0][0][RTW89_ETSI][7] = 58, ++ [1][0][0][0][RTW89_MKK][7] = 76, ++ [1][0][0][0][RTW89_IC][7] = 50, ++ [1][0][0][0][RTW89_KCC][7] = 70, ++ [1][0][0][0][RTW89_ACMA][7] = 58, ++ [1][0][0][0][RTW89_CHILE][7] = 62, ++ [1][0][0][0][RTW89_UKRAINE][7] = 58, ++ [1][0][0][0][RTW89_MEXICO][7] = 50, ++ [1][0][0][0][RTW89_CN][7] = 58, ++ [1][0][0][0][RTW89_QATAR][7] = 58, ++ [1][0][0][0][RTW89_UK][7] = 58, ++ [1][0][0][0][RTW89_FCC][8] = 50, ++ [1][0][0][0][RTW89_ETSI][8] = 58, ++ [1][0][0][0][RTW89_MKK][8] = 76, ++ [1][0][0][0][RTW89_IC][8] = 50, ++ [1][0][0][0][RTW89_KCC][8] = 70, ++ [1][0][0][0][RTW89_ACMA][8] = 58, ++ [1][0][0][0][RTW89_CHILE][8] = 62, ++ [1][0][0][0][RTW89_UKRAINE][8] = 58, ++ [1][0][0][0][RTW89_MEXICO][8] = 50, ++ [1][0][0][0][RTW89_CN][8] = 58, ++ [1][0][0][0][RTW89_QATAR][8] = 58, ++ [1][0][0][0][RTW89_UK][8] = 58, ++ [1][0][0][0][RTW89_FCC][9] = 42, ++ [1][0][0][0][RTW89_ETSI][9] = 58, ++ [1][0][0][0][RTW89_MKK][9] = 76, ++ [1][0][0][0][RTW89_IC][9] = 42, ++ [1][0][0][0][RTW89_KCC][9] = 70, ++ [1][0][0][0][RTW89_ACMA][9] = 58, ++ [1][0][0][0][RTW89_CHILE][9] = 42, ++ [1][0][0][0][RTW89_UKRAINE][9] = 58, ++ [1][0][0][0][RTW89_MEXICO][9] = 42, ++ [1][0][0][0][RTW89_CN][9] = 58, ++ [1][0][0][0][RTW89_QATAR][9] = 58, ++ [1][0][0][0][RTW89_UK][9] = 58, ++ [1][0][0][0][RTW89_FCC][10] = 30, ++ [1][0][0][0][RTW89_ETSI][10] = 58, ++ [1][0][0][0][RTW89_MKK][10] = 72, ++ [1][0][0][0][RTW89_IC][10] = 30, ++ [1][0][0][0][RTW89_KCC][10] = 70, ++ [1][0][0][0][RTW89_ACMA][10] = 58, ++ [1][0][0][0][RTW89_CHILE][10] = 30, ++ [1][0][0][0][RTW89_UKRAINE][10] = 58, ++ [1][0][0][0][RTW89_MEXICO][10] = 30, ++ [1][0][0][0][RTW89_CN][10] = 58, ++ [1][0][0][0][RTW89_QATAR][10] = 58, ++ [1][0][0][0][RTW89_UK][10] = 58, ++ [1][0][0][0][RTW89_FCC][11] = 127, ++ [1][0][0][0][RTW89_ETSI][11] = 127, ++ [1][0][0][0][RTW89_MKK][11] = 127, ++ [1][0][0][0][RTW89_IC][11] = 127, ++ [1][0][0][0][RTW89_KCC][11] = 127, ++ [1][0][0][0][RTW89_ACMA][11] = 127, ++ [1][0][0][0][RTW89_CHILE][11] = 127, ++ [1][0][0][0][RTW89_UKRAINE][11] = 127, ++ [1][0][0][0][RTW89_MEXICO][11] = 127, ++ [1][0][0][0][RTW89_CN][11] = 127, ++ [1][0][0][0][RTW89_QATAR][11] = 127, ++ [1][0][0][0][RTW89_UK][11] = 127, ++ [1][0][0][0][RTW89_FCC][12] = 127, ++ [1][0][0][0][RTW89_ETSI][12] = 127, ++ [1][0][0][0][RTW89_MKK][12] = 127, ++ [1][0][0][0][RTW89_IC][12] = 127, ++ [1][0][0][0][RTW89_KCC][12] = 127, ++ [1][0][0][0][RTW89_ACMA][12] = 127, ++ [1][0][0][0][RTW89_CHILE][12] = 127, ++ [1][0][0][0][RTW89_UKRAINE][12] = 127, ++ [1][0][0][0][RTW89_MEXICO][12] = 127, ++ [1][0][0][0][RTW89_CN][12] = 127, ++ [1][0][0][0][RTW89_QATAR][12] = 127, ++ [1][0][0][0][RTW89_UK][12] = 127, ++ [1][0][0][0][RTW89_FCC][13] = 127, ++ [1][0][0][0][RTW89_ETSI][13] = 127, ++ [1][0][0][0][RTW89_MKK][13] = 127, ++ [1][0][0][0][RTW89_IC][13] = 127, ++ [1][0][0][0][RTW89_KCC][13] = 127, ++ [1][0][0][0][RTW89_ACMA][13] = 127, ++ [1][0][0][0][RTW89_CHILE][13] = 127, ++ [1][0][0][0][RTW89_UKRAINE][13] = 127, ++ [1][0][0][0][RTW89_MEXICO][13] = 127, ++ [1][0][0][0][RTW89_CN][13] = 127, ++ [1][0][0][0][RTW89_QATAR][13] = 127, ++ [1][0][0][0][RTW89_UK][13] = 127, ++ [1][1][0][0][RTW89_FCC][0] = 127, ++ [1][1][0][0][RTW89_ETSI][0] = 127, ++ [1][1][0][0][RTW89_MKK][0] = 127, ++ [1][1][0][0][RTW89_IC][0] = 127, ++ [1][1][0][0][RTW89_KCC][0] = 127, ++ [1][1][0][0][RTW89_ACMA][0] = 127, ++ [1][1][0][0][RTW89_CHILE][0] = 127, ++ [1][1][0][0][RTW89_UKRAINE][0] = 127, ++ [1][1][0][0][RTW89_MEXICO][0] = 127, ++ [1][1][0][0][RTW89_CN][0] = 127, ++ [1][1][0][0][RTW89_QATAR][0] = 127, ++ [1][1][0][0][RTW89_UK][0] = 127, ++ [1][1][0][0][RTW89_FCC][1] = 127, ++ [1][1][0][0][RTW89_ETSI][1] = 127, ++ [1][1][0][0][RTW89_MKK][1] = 127, ++ [1][1][0][0][RTW89_IC][1] = 127, ++ [1][1][0][0][RTW89_KCC][1] = 127, ++ [1][1][0][0][RTW89_ACMA][1] = 127, ++ [1][1][0][0][RTW89_CHILE][1] = 127, ++ [1][1][0][0][RTW89_UKRAINE][1] = 127, ++ [1][1][0][0][RTW89_MEXICO][1] = 127, ++ [1][1][0][0][RTW89_CN][1] = 127, ++ [1][1][0][0][RTW89_QATAR][1] = 127, ++ [1][1][0][0][RTW89_UK][1] = 127, ++ [1][1][0][0][RTW89_FCC][2] = 46, ++ [1][1][0][0][RTW89_ETSI][2] = 46, ++ [1][1][0][0][RTW89_MKK][2] = 64, ++ [1][1][0][0][RTW89_IC][2] = 46, ++ [1][1][0][0][RTW89_KCC][2] = 58, ++ [1][1][0][0][RTW89_ACMA][2] = 46, ++ [1][1][0][0][RTW89_CHILE][2] = 50, ++ [1][1][0][0][RTW89_UKRAINE][2] = 46, ++ [1][1][0][0][RTW89_MEXICO][2] = 46, ++ [1][1][0][0][RTW89_CN][2] = 46, ++ [1][1][0][0][RTW89_QATAR][2] = 46, ++ [1][1][0][0][RTW89_UK][2] = 46, ++ [1][1][0][0][RTW89_FCC][3] = 46, ++ [1][1][0][0][RTW89_ETSI][3] = 46, ++ [1][1][0][0][RTW89_MKK][3] = 64, ++ [1][1][0][0][RTW89_IC][3] = 46, ++ [1][1][0][0][RTW89_KCC][3] = 58, ++ [1][1][0][0][RTW89_ACMA][3] = 46, ++ [1][1][0][0][RTW89_CHILE][3] = 50, ++ [1][1][0][0][RTW89_UKRAINE][3] = 46, ++ [1][1][0][0][RTW89_MEXICO][3] = 46, ++ [1][1][0][0][RTW89_CN][3] = 46, ++ [1][1][0][0][RTW89_QATAR][3] = 46, ++ [1][1][0][0][RTW89_UK][3] = 46, ++ [1][1][0][0][RTW89_FCC][4] = 46, ++ [1][1][0][0][RTW89_ETSI][4] = 46, ++ [1][1][0][0][RTW89_MKK][4] = 64, ++ [1][1][0][0][RTW89_IC][4] = 46, ++ [1][1][0][0][RTW89_KCC][4] = 58, ++ [1][1][0][0][RTW89_ACMA][4] = 46, ++ [1][1][0][0][RTW89_CHILE][4] = 50, ++ [1][1][0][0][RTW89_UKRAINE][4] = 46, ++ [1][1][0][0][RTW89_MEXICO][4] = 46, ++ [1][1][0][0][RTW89_CN][4] = 46, ++ [1][1][0][0][RTW89_QATAR][4] = 46, ++ [1][1][0][0][RTW89_UK][4] = 46, ++ [1][1][0][0][RTW89_FCC][5] = 62, ++ [1][1][0][0][RTW89_ETSI][5] = 46, ++ [1][1][0][0][RTW89_MKK][5] = 64, ++ [1][1][0][0][RTW89_IC][5] = 62, ++ [1][1][0][0][RTW89_KCC][5] = 58, ++ [1][1][0][0][RTW89_ACMA][5] = 46, ++ [1][1][0][0][RTW89_CHILE][5] = 50, ++ [1][1][0][0][RTW89_UKRAINE][5] = 46, ++ [1][1][0][0][RTW89_MEXICO][5] = 62, ++ [1][1][0][0][RTW89_CN][5] = 46, ++ [1][1][0][0][RTW89_QATAR][5] = 46, ++ [1][1][0][0][RTW89_UK][5] = 46, ++ [1][1][0][0][RTW89_FCC][6] = 34, ++ [1][1][0][0][RTW89_ETSI][6] = 46, ++ [1][1][0][0][RTW89_MKK][6] = 64, ++ [1][1][0][0][RTW89_IC][6] = 34, ++ [1][1][0][0][RTW89_KCC][6] = 58, ++ [1][1][0][0][RTW89_ACMA][6] = 46, ++ [1][1][0][0][RTW89_CHILE][6] = 50, ++ [1][1][0][0][RTW89_UKRAINE][6] = 46, ++ [1][1][0][0][RTW89_MEXICO][6] = 34, ++ [1][1][0][0][RTW89_CN][6] = 46, ++ [1][1][0][0][RTW89_QATAR][6] = 46, ++ [1][1][0][0][RTW89_UK][6] = 46, ++ [1][1][0][0][RTW89_FCC][7] = 34, ++ [1][1][0][0][RTW89_ETSI][7] = 46, ++ [1][1][0][0][RTW89_MKK][7] = 64, ++ [1][1][0][0][RTW89_IC][7] = 34, ++ [1][1][0][0][RTW89_KCC][7] = 58, ++ [1][1][0][0][RTW89_ACMA][7] = 46, ++ [1][1][0][0][RTW89_CHILE][7] = 50, ++ [1][1][0][0][RTW89_UKRAINE][7] = 46, ++ [1][1][0][0][RTW89_MEXICO][7] = 34, ++ [1][1][0][0][RTW89_CN][7] = 46, ++ [1][1][0][0][RTW89_QATAR][7] = 46, ++ [1][1][0][0][RTW89_UK][7] = 46, ++ [1][1][0][0][RTW89_FCC][8] = 34, ++ [1][1][0][0][RTW89_ETSI][8] = 46, ++ [1][1][0][0][RTW89_MKK][8] = 64, ++ [1][1][0][0][RTW89_IC][8] = 34, ++ [1][1][0][0][RTW89_KCC][8] = 58, ++ [1][1][0][0][RTW89_ACMA][8] = 46, ++ [1][1][0][0][RTW89_CHILE][8] = 50, ++ [1][1][0][0][RTW89_UKRAINE][8] = 46, ++ [1][1][0][0][RTW89_MEXICO][8] = 34, ++ [1][1][0][0][RTW89_CN][8] = 46, ++ [1][1][0][0][RTW89_QATAR][8] = 46, ++ [1][1][0][0][RTW89_UK][8] = 46, ++ [1][1][0][0][RTW89_FCC][9] = 30, ++ [1][1][0][0][RTW89_ETSI][9] = 46, ++ [1][1][0][0][RTW89_MKK][9] = 64, ++ [1][1][0][0][RTW89_IC][9] = 30, ++ [1][1][0][0][RTW89_KCC][9] = 58, ++ [1][1][0][0][RTW89_ACMA][9] = 46, ++ [1][1][0][0][RTW89_CHILE][9] = 30, ++ [1][1][0][0][RTW89_UKRAINE][9] = 46, ++ [1][1][0][0][RTW89_MEXICO][9] = 30, ++ [1][1][0][0][RTW89_CN][9] = 46, ++ [1][1][0][0][RTW89_QATAR][9] = 46, ++ [1][1][0][0][RTW89_UK][9] = 46, ++ [1][1][0][0][RTW89_FCC][10] = 30, ++ [1][1][0][0][RTW89_ETSI][10] = 46, ++ [1][1][0][0][RTW89_MKK][10] = 64, ++ [1][1][0][0][RTW89_IC][10] = 30, ++ [1][1][0][0][RTW89_KCC][10] = 58, ++ [1][1][0][0][RTW89_ACMA][10] = 46, ++ [1][1][0][0][RTW89_CHILE][10] = 30, ++ [1][1][0][0][RTW89_UKRAINE][10] = 46, ++ [1][1][0][0][RTW89_MEXICO][10] = 30, ++ [1][1][0][0][RTW89_CN][10] = 46, ++ [1][1][0][0][RTW89_QATAR][10] = 46, ++ [1][1][0][0][RTW89_UK][10] = 46, ++ [1][1][0][0][RTW89_FCC][11] = 127, ++ [1][1][0][0][RTW89_ETSI][11] = 127, ++ [1][1][0][0][RTW89_MKK][11] = 127, ++ [1][1][0][0][RTW89_IC][11] = 127, ++ [1][1][0][0][RTW89_KCC][11] = 127, ++ [1][1][0][0][RTW89_ACMA][11] = 127, ++ [1][1][0][0][RTW89_CHILE][11] = 127, ++ [1][1][0][0][RTW89_UKRAINE][11] = 127, ++ [1][1][0][0][RTW89_MEXICO][11] = 127, ++ [1][1][0][0][RTW89_CN][11] = 127, ++ [1][1][0][0][RTW89_QATAR][11] = 127, ++ [1][1][0][0][RTW89_UK][11] = 127, ++ [1][1][0][0][RTW89_FCC][12] = 127, ++ [1][1][0][0][RTW89_ETSI][12] = 127, ++ [1][1][0][0][RTW89_MKK][12] = 127, ++ [1][1][0][0][RTW89_IC][12] = 127, ++ [1][1][0][0][RTW89_KCC][12] = 127, ++ [1][1][0][0][RTW89_ACMA][12] = 127, ++ [1][1][0][0][RTW89_CHILE][12] = 127, ++ [1][1][0][0][RTW89_UKRAINE][12] = 127, ++ [1][1][0][0][RTW89_MEXICO][12] = 127, ++ [1][1][0][0][RTW89_CN][12] = 127, ++ [1][1][0][0][RTW89_QATAR][12] = 127, ++ [1][1][0][0][RTW89_UK][12] = 127, ++ [1][1][0][0][RTW89_FCC][13] = 127, ++ [1][1][0][0][RTW89_ETSI][13] = 127, ++ [1][1][0][0][RTW89_MKK][13] = 127, ++ [1][1][0][0][RTW89_IC][13] = 127, ++ [1][1][0][0][RTW89_KCC][13] = 127, ++ [1][1][0][0][RTW89_ACMA][13] = 127, ++ [1][1][0][0][RTW89_CHILE][13] = 127, ++ [1][1][0][0][RTW89_UKRAINE][13] = 127, ++ [1][1][0][0][RTW89_MEXICO][13] = 127, ++ [1][1][0][0][RTW89_CN][13] = 127, ++ [1][1][0][0][RTW89_QATAR][13] = 127, ++ [1][1][0][0][RTW89_UK][13] = 127, ++ [0][0][1][0][RTW89_FCC][0] = 76, ++ [0][0][1][0][RTW89_ETSI][0] = 58, ++ [0][0][1][0][RTW89_MKK][0] = 74, ++ [0][0][1][0][RTW89_IC][0] = 76, ++ [0][0][1][0][RTW89_KCC][0] = 76, ++ [0][0][1][0][RTW89_ACMA][0] = 58, ++ [0][0][1][0][RTW89_CHILE][0] = 66, ++ [0][0][1][0][RTW89_UKRAINE][0] = 58, ++ [0][0][1][0][RTW89_MEXICO][0] = 76, ++ [0][0][1][0][RTW89_CN][0] = 58, ++ [0][0][1][0][RTW89_QATAR][0] = 58, ++ [0][0][1][0][RTW89_UK][0] = 58, ++ [0][0][1][0][RTW89_FCC][1] = 76, ++ [0][0][1][0][RTW89_ETSI][1] = 58, ++ [0][0][1][0][RTW89_MKK][1] = 76, ++ [0][0][1][0][RTW89_IC][1] = 76, ++ [0][0][1][0][RTW89_KCC][1] = 76, ++ [0][0][1][0][RTW89_ACMA][1] = 58, ++ [0][0][1][0][RTW89_CHILE][1] = 66, ++ [0][0][1][0][RTW89_UKRAINE][1] = 58, ++ [0][0][1][0][RTW89_MEXICO][1] = 76, ++ [0][0][1][0][RTW89_CN][1] = 58, ++ [0][0][1][0][RTW89_QATAR][1] = 58, ++ [0][0][1][0][RTW89_UK][1] = 58, ++ [0][0][1][0][RTW89_FCC][2] = 78, ++ [0][0][1][0][RTW89_ETSI][2] = 58, ++ [0][0][1][0][RTW89_MKK][2] = 76, ++ [0][0][1][0][RTW89_IC][2] = 78, ++ [0][0][1][0][RTW89_KCC][2] = 76, ++ [0][0][1][0][RTW89_ACMA][2] = 58, ++ [0][0][1][0][RTW89_CHILE][2] = 66, ++ [0][0][1][0][RTW89_UKRAINE][2] = 58, ++ [0][0][1][0][RTW89_MEXICO][2] = 78, ++ [0][0][1][0][RTW89_CN][2] = 58, ++ [0][0][1][0][RTW89_QATAR][2] = 58, ++ [0][0][1][0][RTW89_UK][2] = 58, ++ [0][0][1][0][RTW89_FCC][3] = 78, ++ [0][0][1][0][RTW89_ETSI][3] = 58, ++ [0][0][1][0][RTW89_MKK][3] = 76, ++ [0][0][1][0][RTW89_IC][3] = 78, ++ [0][0][1][0][RTW89_KCC][3] = 76, ++ [0][0][1][0][RTW89_ACMA][3] = 58, ++ [0][0][1][0][RTW89_CHILE][3] = 66, ++ [0][0][1][0][RTW89_UKRAINE][3] = 58, ++ [0][0][1][0][RTW89_MEXICO][3] = 78, ++ [0][0][1][0][RTW89_CN][3] = 58, ++ [0][0][1][0][RTW89_QATAR][3] = 58, ++ [0][0][1][0][RTW89_UK][3] = 58, ++ [0][0][1][0][RTW89_FCC][4] = 78, ++ [0][0][1][0][RTW89_ETSI][4] = 58, ++ [0][0][1][0][RTW89_MKK][4] = 76, ++ [0][0][1][0][RTW89_IC][4] = 78, ++ [0][0][1][0][RTW89_KCC][4] = 76, ++ [0][0][1][0][RTW89_ACMA][4] = 58, ++ [0][0][1][0][RTW89_CHILE][4] = 66, ++ [0][0][1][0][RTW89_UKRAINE][4] = 58, ++ [0][0][1][0][RTW89_MEXICO][4] = 78, ++ [0][0][1][0][RTW89_CN][4] = 58, ++ [0][0][1][0][RTW89_QATAR][4] = 58, ++ [0][0][1][0][RTW89_UK][4] = 58, ++ [0][0][1][0][RTW89_FCC][5] = 78, ++ [0][0][1][0][RTW89_ETSI][5] = 58, ++ [0][0][1][0][RTW89_MKK][5] = 76, ++ [0][0][1][0][RTW89_IC][5] = 78, ++ [0][0][1][0][RTW89_KCC][5] = 76, ++ [0][0][1][0][RTW89_ACMA][5] = 58, ++ [0][0][1][0][RTW89_CHILE][5] = 66, ++ [0][0][1][0][RTW89_UKRAINE][5] = 58, ++ [0][0][1][0][RTW89_MEXICO][5] = 78, ++ [0][0][1][0][RTW89_CN][5] = 58, ++ [0][0][1][0][RTW89_QATAR][5] = 58, ++ [0][0][1][0][RTW89_UK][5] = 58, ++ [0][0][1][0][RTW89_FCC][6] = 78, ++ [0][0][1][0][RTW89_ETSI][6] = 58, ++ [0][0][1][0][RTW89_MKK][6] = 76, ++ [0][0][1][0][RTW89_IC][6] = 78, ++ [0][0][1][0][RTW89_KCC][6] = 76, ++ [0][0][1][0][RTW89_ACMA][6] = 58, ++ [0][0][1][0][RTW89_CHILE][6] = 66, ++ [0][0][1][0][RTW89_UKRAINE][6] = 58, ++ [0][0][1][0][RTW89_MEXICO][6] = 78, ++ [0][0][1][0][RTW89_CN][6] = 58, ++ [0][0][1][0][RTW89_QATAR][6] = 58, ++ [0][0][1][0][RTW89_UK][6] = 58, ++ [0][0][1][0][RTW89_FCC][7] = 78, ++ [0][0][1][0][RTW89_ETSI][7] = 58, ++ [0][0][1][0][RTW89_MKK][7] = 76, ++ [0][0][1][0][RTW89_IC][7] = 78, ++ [0][0][1][0][RTW89_KCC][7] = 76, ++ [0][0][1][0][RTW89_ACMA][7] = 58, ++ [0][0][1][0][RTW89_CHILE][7] = 66, ++ [0][0][1][0][RTW89_UKRAINE][7] = 58, ++ [0][0][1][0][RTW89_MEXICO][7] = 78, ++ [0][0][1][0][RTW89_CN][7] = 58, ++ [0][0][1][0][RTW89_QATAR][7] = 58, ++ [0][0][1][0][RTW89_UK][7] = 58, ++ [0][0][1][0][RTW89_FCC][8] = 78, ++ [0][0][1][0][RTW89_ETSI][8] = 58, ++ [0][0][1][0][RTW89_MKK][8] = 76, ++ [0][0][1][0][RTW89_IC][8] = 78, ++ [0][0][1][0][RTW89_KCC][8] = 76, ++ [0][0][1][0][RTW89_ACMA][8] = 58, ++ [0][0][1][0][RTW89_CHILE][8] = 66, ++ [0][0][1][0][RTW89_UKRAINE][8] = 58, ++ [0][0][1][0][RTW89_MEXICO][8] = 78, ++ [0][0][1][0][RTW89_CN][8] = 58, ++ [0][0][1][0][RTW89_QATAR][8] = 58, ++ [0][0][1][0][RTW89_UK][8] = 58, ++ [0][0][1][0][RTW89_FCC][9] = 74, ++ [0][0][1][0][RTW89_ETSI][9] = 58, ++ [0][0][1][0][RTW89_MKK][9] = 76, ++ [0][0][1][0][RTW89_IC][9] = 74, ++ [0][0][1][0][RTW89_KCC][9] = 76, ++ [0][0][1][0][RTW89_ACMA][9] = 58, ++ [0][0][1][0][RTW89_CHILE][9] = 66, ++ [0][0][1][0][RTW89_UKRAINE][9] = 58, ++ [0][0][1][0][RTW89_MEXICO][9] = 74, ++ [0][0][1][0][RTW89_CN][9] = 58, ++ [0][0][1][0][RTW89_QATAR][9] = 58, ++ [0][0][1][0][RTW89_UK][9] = 58, ++ [0][0][1][0][RTW89_FCC][10] = 74, ++ [0][0][1][0][RTW89_ETSI][10] = 58, ++ [0][0][1][0][RTW89_MKK][10] = 76, ++ [0][0][1][0][RTW89_IC][10] = 74, ++ [0][0][1][0][RTW89_KCC][10] = 76, ++ [0][0][1][0][RTW89_ACMA][10] = 58, ++ [0][0][1][0][RTW89_CHILE][10] = 66, ++ [0][0][1][0][RTW89_UKRAINE][10] = 58, ++ [0][0][1][0][RTW89_MEXICO][10] = 74, ++ [0][0][1][0][RTW89_CN][10] = 58, ++ [0][0][1][0][RTW89_QATAR][10] = 58, ++ [0][0][1][0][RTW89_UK][10] = 58, ++ [0][0][1][0][RTW89_FCC][11] = 54, ++ [0][0][1][0][RTW89_ETSI][11] = 58, ++ [0][0][1][0][RTW89_MKK][11] = 76, ++ [0][0][1][0][RTW89_IC][11] = 54, ++ [0][0][1][0][RTW89_KCC][11] = 76, ++ [0][0][1][0][RTW89_ACMA][11] = 58, ++ [0][0][1][0][RTW89_CHILE][11] = 54, ++ [0][0][1][0][RTW89_UKRAINE][11] = 58, ++ [0][0][1][0][RTW89_MEXICO][11] = 54, ++ [0][0][1][0][RTW89_CN][11] = 58, ++ [0][0][1][0][RTW89_QATAR][11] = 58, ++ [0][0][1][0][RTW89_UK][11] = 58, ++ [0][0][1][0][RTW89_FCC][12] = 50, ++ [0][0][1][0][RTW89_ETSI][12] = 58, ++ [0][0][1][0][RTW89_MKK][12] = 76, ++ [0][0][1][0][RTW89_IC][12] = 50, ++ [0][0][1][0][RTW89_KCC][12] = 76, ++ [0][0][1][0][RTW89_ACMA][12] = 58, ++ [0][0][1][0][RTW89_CHILE][12] = 50, ++ [0][0][1][0][RTW89_UKRAINE][12] = 58, ++ [0][0][1][0][RTW89_MEXICO][12] = 50, ++ [0][0][1][0][RTW89_CN][12] = 58, ++ [0][0][1][0][RTW89_QATAR][12] = 58, ++ [0][0][1][0][RTW89_UK][12] = 58, ++ [0][0][1][0][RTW89_FCC][13] = 127, ++ [0][0][1][0][RTW89_ETSI][13] = 127, ++ [0][0][1][0][RTW89_MKK][13] = 127, ++ [0][0][1][0][RTW89_IC][13] = 127, ++ [0][0][1][0][RTW89_KCC][13] = 127, ++ [0][0][1][0][RTW89_ACMA][13] = 127, ++ [0][0][1][0][RTW89_CHILE][13] = 127, ++ [0][0][1][0][RTW89_UKRAINE][13] = 127, ++ [0][0][1][0][RTW89_MEXICO][13] = 127, ++ [0][0][1][0][RTW89_CN][13] = 127, ++ [0][0][1][0][RTW89_QATAR][13] = 127, ++ [0][0][1][0][RTW89_UK][13] = 127, ++ [0][1][1][0][RTW89_FCC][0] = 62, ++ [0][1][1][0][RTW89_ETSI][0] = 46, ++ [0][1][1][0][RTW89_MKK][0] = 64, ++ [0][1][1][0][RTW89_IC][0] = 62, ++ [0][1][1][0][RTW89_KCC][0] = 66, ++ [0][1][1][0][RTW89_ACMA][0] = 46, ++ [0][1][1][0][RTW89_CHILE][0] = 50, ++ [0][1][1][0][RTW89_UKRAINE][0] = 46, ++ [0][1][1][0][RTW89_MEXICO][0] = 62, ++ [0][1][1][0][RTW89_CN][0] = 46, ++ [0][1][1][0][RTW89_QATAR][0] = 46, ++ [0][1][1][0][RTW89_UK][0] = 46, ++ [0][1][1][0][RTW89_FCC][1] = 62, ++ [0][1][1][0][RTW89_ETSI][1] = 46, ++ [0][1][1][0][RTW89_MKK][1] = 64, ++ [0][1][1][0][RTW89_IC][1] = 62, ++ [0][1][1][0][RTW89_KCC][1] = 66, ++ [0][1][1][0][RTW89_ACMA][1] = 46, ++ [0][1][1][0][RTW89_CHILE][1] = 50, ++ [0][1][1][0][RTW89_UKRAINE][1] = 46, ++ [0][1][1][0][RTW89_MEXICO][1] = 62, ++ [0][1][1][0][RTW89_CN][1] = 46, ++ [0][1][1][0][RTW89_QATAR][1] = 46, ++ [0][1][1][0][RTW89_UK][1] = 46, ++ [0][1][1][0][RTW89_FCC][2] = 66, ++ [0][1][1][0][RTW89_ETSI][2] = 46, ++ [0][1][1][0][RTW89_MKK][2] = 64, ++ [0][1][1][0][RTW89_IC][2] = 66, ++ [0][1][1][0][RTW89_KCC][2] = 66, ++ [0][1][1][0][RTW89_ACMA][2] = 46, ++ [0][1][1][0][RTW89_CHILE][2] = 50, ++ [0][1][1][0][RTW89_UKRAINE][2] = 46, ++ [0][1][1][0][RTW89_MEXICO][2] = 66, ++ [0][1][1][0][RTW89_CN][2] = 46, ++ [0][1][1][0][RTW89_QATAR][2] = 46, ++ [0][1][1][0][RTW89_UK][2] = 46, ++ [0][1][1][0][RTW89_FCC][3] = 70, ++ [0][1][1][0][RTW89_ETSI][3] = 46, ++ [0][1][1][0][RTW89_MKK][3] = 64, ++ [0][1][1][0][RTW89_IC][3] = 70, ++ [0][1][1][0][RTW89_KCC][3] = 66, ++ [0][1][1][0][RTW89_ACMA][3] = 46, ++ [0][1][1][0][RTW89_CHILE][3] = 50, ++ [0][1][1][0][RTW89_UKRAINE][3] = 46, ++ [0][1][1][0][RTW89_MEXICO][3] = 70, ++ [0][1][1][0][RTW89_CN][3] = 46, ++ [0][1][1][0][RTW89_QATAR][3] = 46, ++ [0][1][1][0][RTW89_UK][3] = 46, ++ [0][1][1][0][RTW89_FCC][4] = 78, ++ [0][1][1][0][RTW89_ETSI][4] = 46, ++ [0][1][1][0][RTW89_MKK][4] = 64, ++ [0][1][1][0][RTW89_IC][4] = 78, ++ [0][1][1][0][RTW89_KCC][4] = 64, ++ [0][1][1][0][RTW89_ACMA][4] = 46, ++ [0][1][1][0][RTW89_CHILE][4] = 50, ++ [0][1][1][0][RTW89_UKRAINE][4] = 46, ++ [0][1][1][0][RTW89_MEXICO][4] = 78, ++ [0][1][1][0][RTW89_CN][4] = 46, ++ [0][1][1][0][RTW89_QATAR][4] = 46, ++ [0][1][1][0][RTW89_UK][4] = 46, ++ [0][1][1][0][RTW89_FCC][5] = 78, ++ [0][1][1][0][RTW89_ETSI][5] = 46, ++ [0][1][1][0][RTW89_MKK][5] = 64, ++ [0][1][1][0][RTW89_IC][5] = 78, ++ [0][1][1][0][RTW89_KCC][5] = 64, ++ [0][1][1][0][RTW89_ACMA][5] = 46, ++ [0][1][1][0][RTW89_CHILE][5] = 50, ++ [0][1][1][0][RTW89_UKRAINE][5] = 46, ++ [0][1][1][0][RTW89_MEXICO][5] = 78, ++ [0][1][1][0][RTW89_CN][5] = 46, ++ [0][1][1][0][RTW89_QATAR][5] = 46, ++ [0][1][1][0][RTW89_UK][5] = 46, ++ [0][1][1][0][RTW89_FCC][6] = 78, ++ [0][1][1][0][RTW89_ETSI][6] = 46, ++ [0][1][1][0][RTW89_MKK][6] = 64, ++ [0][1][1][0][RTW89_IC][6] = 78, ++ [0][1][1][0][RTW89_KCC][6] = 64, ++ [0][1][1][0][RTW89_ACMA][6] = 46, ++ [0][1][1][0][RTW89_CHILE][6] = 50, ++ [0][1][1][0][RTW89_UKRAINE][6] = 46, ++ [0][1][1][0][RTW89_MEXICO][6] = 78, ++ [0][1][1][0][RTW89_CN][6] = 46, ++ [0][1][1][0][RTW89_QATAR][6] = 46, ++ [0][1][1][0][RTW89_UK][6] = 46, ++ [0][1][1][0][RTW89_FCC][7] = 70, ++ [0][1][1][0][RTW89_ETSI][7] = 46, ++ [0][1][1][0][RTW89_MKK][7] = 64, ++ [0][1][1][0][RTW89_IC][7] = 70, ++ [0][1][1][0][RTW89_KCC][7] = 64, ++ [0][1][1][0][RTW89_ACMA][7] = 46, ++ [0][1][1][0][RTW89_CHILE][7] = 50, ++ [0][1][1][0][RTW89_UKRAINE][7] = 46, ++ [0][1][1][0][RTW89_MEXICO][7] = 70, ++ [0][1][1][0][RTW89_CN][7] = 46, ++ [0][1][1][0][RTW89_QATAR][7] = 46, ++ [0][1][1][0][RTW89_UK][7] = 46, ++ [0][1][1][0][RTW89_FCC][8] = 66, ++ [0][1][1][0][RTW89_ETSI][8] = 46, ++ [0][1][1][0][RTW89_MKK][8] = 64, ++ [0][1][1][0][RTW89_IC][8] = 66, ++ [0][1][1][0][RTW89_KCC][8] = 64, ++ [0][1][1][0][RTW89_ACMA][8] = 46, ++ [0][1][1][0][RTW89_CHILE][8] = 50, ++ [0][1][1][0][RTW89_UKRAINE][8] = 46, ++ [0][1][1][0][RTW89_MEXICO][8] = 66, ++ [0][1][1][0][RTW89_CN][8] = 46, ++ [0][1][1][0][RTW89_QATAR][8] = 46, ++ [0][1][1][0][RTW89_UK][8] = 46, ++ [0][1][1][0][RTW89_FCC][9] = 62, ++ [0][1][1][0][RTW89_ETSI][9] = 46, ++ [0][1][1][0][RTW89_MKK][9] = 64, ++ [0][1][1][0][RTW89_IC][9] = 62, ++ [0][1][1][0][RTW89_KCC][9] = 64, ++ [0][1][1][0][RTW89_ACMA][9] = 46, ++ [0][1][1][0][RTW89_CHILE][9] = 50, ++ [0][1][1][0][RTW89_UKRAINE][9] = 46, ++ [0][1][1][0][RTW89_MEXICO][9] = 62, ++ [0][1][1][0][RTW89_CN][9] = 46, ++ [0][1][1][0][RTW89_QATAR][9] = 46, ++ [0][1][1][0][RTW89_UK][9] = 46, ++ [0][1][1][0][RTW89_FCC][10] = 62, ++ [0][1][1][0][RTW89_ETSI][10] = 46, ++ [0][1][1][0][RTW89_MKK][10] = 64, ++ [0][1][1][0][RTW89_IC][10] = 62, ++ [0][1][1][0][RTW89_KCC][10] = 64, ++ [0][1][1][0][RTW89_ACMA][10] = 46, ++ [0][1][1][0][RTW89_CHILE][10] = 52, ++ [0][1][1][0][RTW89_UKRAINE][10] = 46, ++ [0][1][1][0][RTW89_MEXICO][10] = 62, ++ [0][1][1][0][RTW89_CN][10] = 46, ++ [0][1][1][0][RTW89_QATAR][10] = 46, ++ [0][1][1][0][RTW89_UK][10] = 46, ++ [0][1][1][0][RTW89_FCC][11] = 46, ++ [0][1][1][0][RTW89_ETSI][11] = 46, ++ [0][1][1][0][RTW89_MKK][11] = 64, ++ [0][1][1][0][RTW89_IC][11] = 46, ++ [0][1][1][0][RTW89_KCC][11] = 64, ++ [0][1][1][0][RTW89_ACMA][11] = 46, ++ [0][1][1][0][RTW89_CHILE][11] = 46, ++ [0][1][1][0][RTW89_UKRAINE][11] = 46, ++ [0][1][1][0][RTW89_MEXICO][11] = 46, ++ [0][1][1][0][RTW89_CN][11] = 46, ++ [0][1][1][0][RTW89_QATAR][11] = 46, ++ [0][1][1][0][RTW89_UK][11] = 46, ++ [0][1][1][0][RTW89_FCC][12] = 42, ++ [0][1][1][0][RTW89_ETSI][12] = 46, ++ [0][1][1][0][RTW89_MKK][12] = 64, ++ [0][1][1][0][RTW89_IC][12] = 42, ++ [0][1][1][0][RTW89_KCC][12] = 64, ++ [0][1][1][0][RTW89_ACMA][12] = 46, ++ [0][1][1][0][RTW89_CHILE][12] = 42, ++ [0][1][1][0][RTW89_UKRAINE][12] = 46, ++ [0][1][1][0][RTW89_MEXICO][12] = 42, ++ [0][1][1][0][RTW89_CN][12] = 46, ++ [0][1][1][0][RTW89_QATAR][12] = 46, ++ [0][1][1][0][RTW89_UK][12] = 46, ++ [0][1][1][0][RTW89_FCC][13] = 127, ++ [0][1][1][0][RTW89_ETSI][13] = 127, ++ [0][1][1][0][RTW89_MKK][13] = 127, ++ [0][1][1][0][RTW89_IC][13] = 127, ++ [0][1][1][0][RTW89_KCC][13] = 127, ++ [0][1][1][0][RTW89_ACMA][13] = 127, ++ [0][1][1][0][RTW89_CHILE][13] = 127, ++ [0][1][1][0][RTW89_UKRAINE][13] = 127, ++ [0][1][1][0][RTW89_MEXICO][13] = 127, ++ [0][1][1][0][RTW89_CN][13] = 127, ++ [0][1][1][0][RTW89_QATAR][13] = 127, ++ [0][1][1][0][RTW89_UK][13] = 127, ++ [0][0][2][0][RTW89_FCC][0] = 76, ++ [0][0][2][0][RTW89_ETSI][0] = 58, ++ [0][0][2][0][RTW89_MKK][0] = 76, ++ [0][0][2][0][RTW89_IC][0] = 76, ++ [0][0][2][0][RTW89_KCC][0] = 76, ++ [0][0][2][0][RTW89_ACMA][0] = 58, ++ [0][0][2][0][RTW89_CHILE][0] = 66, ++ [0][0][2][0][RTW89_UKRAINE][0] = 58, ++ [0][0][2][0][RTW89_MEXICO][0] = 76, ++ [0][0][2][0][RTW89_CN][0] = 58, ++ [0][0][2][0][RTW89_QATAR][0] = 58, ++ [0][0][2][0][RTW89_UK][0] = 58, ++ [0][0][2][0][RTW89_FCC][1] = 76, ++ [0][0][2][0][RTW89_ETSI][1] = 58, ++ [0][0][2][0][RTW89_MKK][1] = 76, ++ [0][0][2][0][RTW89_IC][1] = 76, ++ [0][0][2][0][RTW89_KCC][1] = 76, ++ [0][0][2][0][RTW89_ACMA][1] = 58, ++ [0][0][2][0][RTW89_CHILE][1] = 66, ++ [0][0][2][0][RTW89_UKRAINE][1] = 58, ++ [0][0][2][0][RTW89_MEXICO][1] = 76, ++ [0][0][2][0][RTW89_CN][1] = 58, ++ [0][0][2][0][RTW89_QATAR][1] = 58, ++ [0][0][2][0][RTW89_UK][1] = 58, ++ [0][0][2][0][RTW89_FCC][2] = 78, ++ [0][0][2][0][RTW89_ETSI][2] = 58, ++ [0][0][2][0][RTW89_MKK][2] = 76, ++ [0][0][2][0][RTW89_IC][2] = 78, ++ [0][0][2][0][RTW89_KCC][2] = 76, ++ [0][0][2][0][RTW89_ACMA][2] = 58, ++ [0][0][2][0][RTW89_CHILE][2] = 66, ++ [0][0][2][0][RTW89_UKRAINE][2] = 58, ++ [0][0][2][0][RTW89_MEXICO][2] = 78, ++ [0][0][2][0][RTW89_CN][2] = 58, ++ [0][0][2][0][RTW89_QATAR][2] = 58, ++ [0][0][2][0][RTW89_UK][2] = 58, ++ [0][0][2][0][RTW89_FCC][3] = 78, ++ [0][0][2][0][RTW89_ETSI][3] = 58, ++ [0][0][2][0][RTW89_MKK][3] = 76, ++ [0][0][2][0][RTW89_IC][3] = 78, ++ [0][0][2][0][RTW89_KCC][3] = 76, ++ [0][0][2][0][RTW89_ACMA][3] = 58, ++ [0][0][2][0][RTW89_CHILE][3] = 66, ++ [0][0][2][0][RTW89_UKRAINE][3] = 58, ++ [0][0][2][0][RTW89_MEXICO][3] = 78, ++ [0][0][2][0][RTW89_CN][3] = 58, ++ [0][0][2][0][RTW89_QATAR][3] = 58, ++ [0][0][2][0][RTW89_UK][3] = 58, ++ [0][0][2][0][RTW89_FCC][4] = 78, ++ [0][0][2][0][RTW89_ETSI][4] = 58, ++ [0][0][2][0][RTW89_MKK][4] = 76, ++ [0][0][2][0][RTW89_IC][4] = 78, ++ [0][0][2][0][RTW89_KCC][4] = 76, ++ [0][0][2][0][RTW89_ACMA][4] = 58, ++ [0][0][2][0][RTW89_CHILE][4] = 66, ++ [0][0][2][0][RTW89_UKRAINE][4] = 58, ++ [0][0][2][0][RTW89_MEXICO][4] = 78, ++ [0][0][2][0][RTW89_CN][4] = 58, ++ [0][0][2][0][RTW89_QATAR][4] = 58, ++ [0][0][2][0][RTW89_UK][4] = 58, ++ [0][0][2][0][RTW89_FCC][5] = 78, ++ [0][0][2][0][RTW89_ETSI][5] = 58, ++ [0][0][2][0][RTW89_MKK][5] = 76, ++ [0][0][2][0][RTW89_IC][5] = 78, ++ [0][0][2][0][RTW89_KCC][5] = 76, ++ [0][0][2][0][RTW89_ACMA][5] = 58, ++ [0][0][2][0][RTW89_CHILE][5] = 66, ++ [0][0][2][0][RTW89_UKRAINE][5] = 58, ++ [0][0][2][0][RTW89_MEXICO][5] = 78, ++ [0][0][2][0][RTW89_CN][5] = 58, ++ [0][0][2][0][RTW89_QATAR][5] = 58, ++ [0][0][2][0][RTW89_UK][5] = 58, ++ [0][0][2][0][RTW89_FCC][6] = 78, ++ [0][0][2][0][RTW89_ETSI][6] = 58, ++ [0][0][2][0][RTW89_MKK][6] = 76, ++ [0][0][2][0][RTW89_IC][6] = 78, ++ [0][0][2][0][RTW89_KCC][6] = 76, ++ [0][0][2][0][RTW89_ACMA][6] = 58, ++ [0][0][2][0][RTW89_CHILE][6] = 66, ++ [0][0][2][0][RTW89_UKRAINE][6] = 58, ++ [0][0][2][0][RTW89_MEXICO][6] = 78, ++ [0][0][2][0][RTW89_CN][6] = 58, ++ [0][0][2][0][RTW89_QATAR][6] = 58, ++ [0][0][2][0][RTW89_UK][6] = 58, ++ [0][0][2][0][RTW89_FCC][7] = 78, ++ [0][0][2][0][RTW89_ETSI][7] = 58, ++ [0][0][2][0][RTW89_MKK][7] = 76, ++ [0][0][2][0][RTW89_IC][7] = 78, ++ [0][0][2][0][RTW89_KCC][7] = 76, ++ [0][0][2][0][RTW89_ACMA][7] = 58, ++ [0][0][2][0][RTW89_CHILE][7] = 66, ++ [0][0][2][0][RTW89_UKRAINE][7] = 58, ++ [0][0][2][0][RTW89_MEXICO][7] = 78, ++ [0][0][2][0][RTW89_CN][7] = 58, ++ [0][0][2][0][RTW89_QATAR][7] = 58, ++ [0][0][2][0][RTW89_UK][7] = 58, ++ [0][0][2][0][RTW89_FCC][8] = 76, ++ [0][0][2][0][RTW89_ETSI][8] = 58, ++ [0][0][2][0][RTW89_MKK][8] = 76, ++ [0][0][2][0][RTW89_IC][8] = 76, ++ [0][0][2][0][RTW89_KCC][8] = 76, ++ [0][0][2][0][RTW89_ACMA][8] = 58, ++ [0][0][2][0][RTW89_CHILE][8] = 66, ++ [0][0][2][0][RTW89_UKRAINE][8] = 58, ++ [0][0][2][0][RTW89_MEXICO][8] = 76, ++ [0][0][2][0][RTW89_CN][8] = 58, ++ [0][0][2][0][RTW89_QATAR][8] = 58, ++ [0][0][2][0][RTW89_UK][8] = 58, ++ [0][0][2][0][RTW89_FCC][9] = 72, ++ [0][0][2][0][RTW89_ETSI][9] = 58, ++ [0][0][2][0][RTW89_MKK][9] = 76, ++ [0][0][2][0][RTW89_IC][9] = 72, ++ [0][0][2][0][RTW89_KCC][9] = 76, ++ [0][0][2][0][RTW89_ACMA][9] = 58, ++ [0][0][2][0][RTW89_CHILE][9] = 66, ++ [0][0][2][0][RTW89_UKRAINE][9] = 58, ++ [0][0][2][0][RTW89_MEXICO][9] = 72, ++ [0][0][2][0][RTW89_CN][9] = 58, ++ [0][0][2][0][RTW89_QATAR][9] = 58, ++ [0][0][2][0][RTW89_UK][9] = 58, ++ [0][0][2][0][RTW89_FCC][10] = 72, ++ [0][0][2][0][RTW89_ETSI][10] = 58, ++ [0][0][2][0][RTW89_MKK][10] = 76, ++ [0][0][2][0][RTW89_IC][10] = 72, ++ [0][0][2][0][RTW89_KCC][10] = 76, ++ [0][0][2][0][RTW89_ACMA][10] = 58, ++ [0][0][2][0][RTW89_CHILE][10] = 66, ++ [0][0][2][0][RTW89_UKRAINE][10] = 58, ++ [0][0][2][0][RTW89_MEXICO][10] = 72, ++ [0][0][2][0][RTW89_CN][10] = 58, ++ [0][0][2][0][RTW89_QATAR][10] = 58, ++ [0][0][2][0][RTW89_UK][10] = 58, ++ [0][0][2][0][RTW89_FCC][11] = 54, ++ [0][0][2][0][RTW89_ETSI][11] = 58, ++ [0][0][2][0][RTW89_MKK][11] = 76, ++ [0][0][2][0][RTW89_IC][11] = 54, ++ [0][0][2][0][RTW89_KCC][11] = 76, ++ [0][0][2][0][RTW89_ACMA][11] = 58, ++ [0][0][2][0][RTW89_CHILE][11] = 54, ++ [0][0][2][0][RTW89_UKRAINE][11] = 58, ++ [0][0][2][0][RTW89_MEXICO][11] = 54, ++ [0][0][2][0][RTW89_CN][11] = 58, ++ [0][0][2][0][RTW89_QATAR][11] = 58, ++ [0][0][2][0][RTW89_UK][11] = 58, ++ [0][0][2][0][RTW89_FCC][12] = 50, ++ [0][0][2][0][RTW89_ETSI][12] = 58, ++ [0][0][2][0][RTW89_MKK][12] = 76, ++ [0][0][2][0][RTW89_IC][12] = 50, ++ [0][0][2][0][RTW89_KCC][12] = 76, ++ [0][0][2][0][RTW89_ACMA][12] = 58, ++ [0][0][2][0][RTW89_CHILE][12] = 50, ++ [0][0][2][0][RTW89_UKRAINE][12] = 58, ++ [0][0][2][0][RTW89_MEXICO][12] = 50, ++ [0][0][2][0][RTW89_CN][12] = 58, ++ [0][0][2][0][RTW89_QATAR][12] = 58, ++ [0][0][2][0][RTW89_UK][12] = 58, ++ [0][0][2][0][RTW89_FCC][13] = 127, ++ [0][0][2][0][RTW89_ETSI][13] = 127, ++ [0][0][2][0][RTW89_MKK][13] = 127, ++ [0][0][2][0][RTW89_IC][13] = 127, ++ [0][0][2][0][RTW89_KCC][13] = 127, ++ [0][0][2][0][RTW89_ACMA][13] = 127, ++ [0][0][2][0][RTW89_CHILE][13] = 127, ++ [0][0][2][0][RTW89_UKRAINE][13] = 127, ++ [0][0][2][0][RTW89_MEXICO][13] = 127, ++ [0][0][2][0][RTW89_CN][13] = 127, ++ [0][0][2][0][RTW89_QATAR][13] = 127, ++ [0][0][2][0][RTW89_UK][13] = 127, ++ [0][1][2][0][RTW89_FCC][0] = 58, ++ [0][1][2][0][RTW89_ETSI][0] = 46, ++ [0][1][2][0][RTW89_MKK][0] = 66, ++ [0][1][2][0][RTW89_IC][0] = 58, ++ [0][1][2][0][RTW89_KCC][0] = 62, ++ [0][1][2][0][RTW89_ACMA][0] = 46, ++ [0][1][2][0][RTW89_CHILE][0] = 50, ++ [0][1][2][0][RTW89_UKRAINE][0] = 46, ++ [0][1][2][0][RTW89_MEXICO][0] = 58, ++ [0][1][2][0][RTW89_CN][0] = 46, ++ [0][1][2][0][RTW89_QATAR][0] = 46, ++ [0][1][2][0][RTW89_UK][0] = 46, ++ [0][1][2][0][RTW89_FCC][1] = 58, ++ [0][1][2][0][RTW89_ETSI][1] = 46, ++ [0][1][2][0][RTW89_MKK][1] = 66, ++ [0][1][2][0][RTW89_IC][1] = 58, ++ [0][1][2][0][RTW89_KCC][1] = 62, ++ [0][1][2][0][RTW89_ACMA][1] = 46, ++ [0][1][2][0][RTW89_CHILE][1] = 50, ++ [0][1][2][0][RTW89_UKRAINE][1] = 46, ++ [0][1][2][0][RTW89_MEXICO][1] = 58, ++ [0][1][2][0][RTW89_CN][1] = 46, ++ [0][1][2][0][RTW89_QATAR][1] = 46, ++ [0][1][2][0][RTW89_UK][1] = 46, ++ [0][1][2][0][RTW89_FCC][2] = 62, ++ [0][1][2][0][RTW89_ETSI][2] = 46, ++ [0][1][2][0][RTW89_MKK][2] = 66, ++ [0][1][2][0][RTW89_IC][2] = 62, ++ [0][1][2][0][RTW89_KCC][2] = 62, ++ [0][1][2][0][RTW89_ACMA][2] = 46, ++ [0][1][2][0][RTW89_CHILE][2] = 50, ++ [0][1][2][0][RTW89_UKRAINE][2] = 46, ++ [0][1][2][0][RTW89_MEXICO][2] = 62, ++ [0][1][2][0][RTW89_CN][2] = 46, ++ [0][1][2][0][RTW89_QATAR][2] = 46, ++ [0][1][2][0][RTW89_UK][2] = 46, ++ [0][1][2][0][RTW89_FCC][3] = 66, ++ [0][1][2][0][RTW89_ETSI][3] = 46, ++ [0][1][2][0][RTW89_MKK][3] = 66, ++ [0][1][2][0][RTW89_IC][3] = 66, ++ [0][1][2][0][RTW89_KCC][3] = 62, ++ [0][1][2][0][RTW89_ACMA][3] = 46, ++ [0][1][2][0][RTW89_CHILE][3] = 50, ++ [0][1][2][0][RTW89_UKRAINE][3] = 46, ++ [0][1][2][0][RTW89_MEXICO][3] = 66, ++ [0][1][2][0][RTW89_CN][3] = 46, ++ [0][1][2][0][RTW89_QATAR][3] = 46, ++ [0][1][2][0][RTW89_UK][3] = 46, ++ [0][1][2][0][RTW89_FCC][4] = 72, ++ [0][1][2][0][RTW89_ETSI][4] = 46, ++ [0][1][2][0][RTW89_MKK][4] = 66, ++ [0][1][2][0][RTW89_IC][4] = 72, ++ [0][1][2][0][RTW89_KCC][4] = 62, ++ [0][1][2][0][RTW89_ACMA][4] = 46, ++ [0][1][2][0][RTW89_CHILE][4] = 50, ++ [0][1][2][0][RTW89_UKRAINE][4] = 46, ++ [0][1][2][0][RTW89_MEXICO][4] = 72, ++ [0][1][2][0][RTW89_CN][4] = 46, ++ [0][1][2][0][RTW89_QATAR][4] = 46, ++ [0][1][2][0][RTW89_UK][4] = 46, ++ [0][1][2][0][RTW89_FCC][5] = 78, ++ [0][1][2][0][RTW89_ETSI][5] = 46, ++ [0][1][2][0][RTW89_MKK][5] = 66, ++ [0][1][2][0][RTW89_IC][5] = 78, ++ [0][1][2][0][RTW89_KCC][5] = 62, ++ [0][1][2][0][RTW89_ACMA][5] = 46, ++ [0][1][2][0][RTW89_CHILE][5] = 50, ++ [0][1][2][0][RTW89_UKRAINE][5] = 46, ++ [0][1][2][0][RTW89_MEXICO][5] = 78, ++ [0][1][2][0][RTW89_CN][5] = 46, ++ [0][1][2][0][RTW89_QATAR][5] = 46, ++ [0][1][2][0][RTW89_UK][5] = 46, ++ [0][1][2][0][RTW89_FCC][6] = 74, ++ [0][1][2][0][RTW89_ETSI][6] = 46, ++ [0][1][2][0][RTW89_MKK][6] = 66, ++ [0][1][2][0][RTW89_IC][6] = 74, ++ [0][1][2][0][RTW89_KCC][6] = 62, ++ [0][1][2][0][RTW89_ACMA][6] = 46, ++ [0][1][2][0][RTW89_CHILE][6] = 50, ++ [0][1][2][0][RTW89_UKRAINE][6] = 46, ++ [0][1][2][0][RTW89_MEXICO][6] = 74, ++ [0][1][2][0][RTW89_CN][6] = 46, ++ [0][1][2][0][RTW89_QATAR][6] = 46, ++ [0][1][2][0][RTW89_UK][6] = 46, ++ [0][1][2][0][RTW89_FCC][7] = 66, ++ [0][1][2][0][RTW89_ETSI][7] = 46, ++ [0][1][2][0][RTW89_MKK][7] = 66, ++ [0][1][2][0][RTW89_IC][7] = 66, ++ [0][1][2][0][RTW89_KCC][7] = 62, ++ [0][1][2][0][RTW89_ACMA][7] = 46, ++ [0][1][2][0][RTW89_CHILE][7] = 50, ++ [0][1][2][0][RTW89_UKRAINE][7] = 46, ++ [0][1][2][0][RTW89_MEXICO][7] = 66, ++ [0][1][2][0][RTW89_CN][7] = 46, ++ [0][1][2][0][RTW89_QATAR][7] = 46, ++ [0][1][2][0][RTW89_UK][7] = 46, ++ [0][1][2][0][RTW89_FCC][8] = 62, ++ [0][1][2][0][RTW89_ETSI][8] = 46, ++ [0][1][2][0][RTW89_MKK][8] = 66, ++ [0][1][2][0][RTW89_IC][8] = 62, ++ [0][1][2][0][RTW89_KCC][8] = 62, ++ [0][1][2][0][RTW89_ACMA][8] = 46, ++ [0][1][2][0][RTW89_CHILE][8] = 50, ++ [0][1][2][0][RTW89_UKRAINE][8] = 46, ++ [0][1][2][0][RTW89_MEXICO][8] = 62, ++ [0][1][2][0][RTW89_CN][8] = 46, ++ [0][1][2][0][RTW89_QATAR][8] = 46, ++ [0][1][2][0][RTW89_UK][8] = 46, ++ [0][1][2][0][RTW89_FCC][9] = 58, ++ [0][1][2][0][RTW89_ETSI][9] = 46, ++ [0][1][2][0][RTW89_MKK][9] = 66, ++ [0][1][2][0][RTW89_IC][9] = 58, ++ [0][1][2][0][RTW89_KCC][9] = 60, ++ [0][1][2][0][RTW89_ACMA][9] = 46, ++ [0][1][2][0][RTW89_CHILE][9] = 50, ++ [0][1][2][0][RTW89_UKRAINE][9] = 46, ++ [0][1][2][0][RTW89_MEXICO][9] = 58, ++ [0][1][2][0][RTW89_CN][9] = 46, ++ [0][1][2][0][RTW89_QATAR][9] = 46, ++ [0][1][2][0][RTW89_UK][9] = 46, ++ [0][1][2][0][RTW89_FCC][10] = 58, ++ [0][1][2][0][RTW89_ETSI][10] = 46, ++ [0][1][2][0][RTW89_MKK][10] = 66, ++ [0][1][2][0][RTW89_IC][10] = 58, ++ [0][1][2][0][RTW89_KCC][10] = 60, ++ [0][1][2][0][RTW89_ACMA][10] = 46, ++ [0][1][2][0][RTW89_CHILE][10] = 50, ++ [0][1][2][0][RTW89_UKRAINE][10] = 46, ++ [0][1][2][0][RTW89_MEXICO][10] = 58, ++ [0][1][2][0][RTW89_CN][10] = 46, ++ [0][1][2][0][RTW89_QATAR][10] = 46, ++ [0][1][2][0][RTW89_UK][10] = 46, ++ [0][1][2][0][RTW89_FCC][11] = 46, ++ [0][1][2][0][RTW89_ETSI][11] = 46, ++ [0][1][2][0][RTW89_MKK][11] = 66, ++ [0][1][2][0][RTW89_IC][11] = 46, ++ [0][1][2][0][RTW89_KCC][11] = 60, ++ [0][1][2][0][RTW89_ACMA][11] = 46, ++ [0][1][2][0][RTW89_CHILE][11] = 46, ++ [0][1][2][0][RTW89_UKRAINE][11] = 46, ++ [0][1][2][0][RTW89_MEXICO][11] = 46, ++ [0][1][2][0][RTW89_CN][11] = 46, ++ [0][1][2][0][RTW89_QATAR][11] = 46, ++ [0][1][2][0][RTW89_UK][11] = 46, ++ [0][1][2][0][RTW89_FCC][12] = 42, ++ [0][1][2][0][RTW89_ETSI][12] = 46, ++ [0][1][2][0][RTW89_MKK][12] = 66, ++ [0][1][2][0][RTW89_IC][12] = 42, ++ [0][1][2][0][RTW89_KCC][12] = 60, ++ [0][1][2][0][RTW89_ACMA][12] = 46, ++ [0][1][2][0][RTW89_CHILE][12] = 42, ++ [0][1][2][0][RTW89_UKRAINE][12] = 46, ++ [0][1][2][0][RTW89_MEXICO][12] = 42, ++ [0][1][2][0][RTW89_CN][12] = 46, ++ [0][1][2][0][RTW89_QATAR][12] = 46, ++ [0][1][2][0][RTW89_UK][12] = 46, ++ [0][1][2][0][RTW89_FCC][13] = 127, ++ [0][1][2][0][RTW89_ETSI][13] = 127, ++ [0][1][2][0][RTW89_MKK][13] = 127, ++ [0][1][2][0][RTW89_IC][13] = 127, ++ [0][1][2][0][RTW89_KCC][13] = 127, ++ [0][1][2][0][RTW89_ACMA][13] = 127, ++ [0][1][2][0][RTW89_CHILE][13] = 127, ++ [0][1][2][0][RTW89_UKRAINE][13] = 127, ++ [0][1][2][0][RTW89_MEXICO][13] = 127, ++ [0][1][2][0][RTW89_CN][13] = 127, ++ [0][1][2][0][RTW89_QATAR][13] = 127, ++ [0][1][2][0][RTW89_UK][13] = 127, ++ [0][1][2][1][RTW89_FCC][0] = 58, ++ [0][1][2][1][RTW89_ETSI][0] = 34, ++ [0][1][2][1][RTW89_MKK][0] = 66, ++ [0][1][2][1][RTW89_IC][0] = 58, ++ [0][1][2][1][RTW89_KCC][0] = 62, ++ [0][1][2][1][RTW89_ACMA][0] = 34, ++ [0][1][2][1][RTW89_CHILE][0] = 42, ++ [0][1][2][1][RTW89_UKRAINE][0] = 34, ++ [0][1][2][1][RTW89_MEXICO][0] = 58, ++ [0][1][2][1][RTW89_CN][0] = 34, ++ [0][1][2][1][RTW89_QATAR][0] = 34, ++ [0][1][2][1][RTW89_UK][0] = 34, ++ [0][1][2][1][RTW89_FCC][1] = 58, ++ [0][1][2][1][RTW89_ETSI][1] = 34, ++ [0][1][2][1][RTW89_MKK][1] = 66, ++ [0][1][2][1][RTW89_IC][1] = 58, ++ [0][1][2][1][RTW89_KCC][1] = 62, ++ [0][1][2][1][RTW89_ACMA][1] = 34, ++ [0][1][2][1][RTW89_CHILE][1] = 40, ++ [0][1][2][1][RTW89_UKRAINE][1] = 34, ++ [0][1][2][1][RTW89_MEXICO][1] = 58, ++ [0][1][2][1][RTW89_CN][1] = 34, ++ [0][1][2][1][RTW89_QATAR][1] = 34, ++ [0][1][2][1][RTW89_UK][1] = 34, ++ [0][1][2][1][RTW89_FCC][2] = 62, ++ [0][1][2][1][RTW89_ETSI][2] = 34, ++ [0][1][2][1][RTW89_MKK][2] = 66, ++ [0][1][2][1][RTW89_IC][2] = 62, ++ [0][1][2][1][RTW89_KCC][2] = 62, ++ [0][1][2][1][RTW89_ACMA][2] = 34, ++ [0][1][2][1][RTW89_CHILE][2] = 40, ++ [0][1][2][1][RTW89_UKRAINE][2] = 34, ++ [0][1][2][1][RTW89_MEXICO][2] = 62, ++ [0][1][2][1][RTW89_CN][2] = 34, ++ [0][1][2][1][RTW89_QATAR][2] = 34, ++ [0][1][2][1][RTW89_UK][2] = 34, ++ [0][1][2][1][RTW89_FCC][3] = 66, ++ [0][1][2][1][RTW89_ETSI][3] = 34, ++ [0][1][2][1][RTW89_MKK][3] = 66, ++ [0][1][2][1][RTW89_IC][3] = 66, ++ [0][1][2][1][RTW89_KCC][3] = 62, ++ [0][1][2][1][RTW89_ACMA][3] = 34, ++ [0][1][2][1][RTW89_CHILE][3] = 40, ++ [0][1][2][1][RTW89_UKRAINE][3] = 34, ++ [0][1][2][1][RTW89_MEXICO][3] = 66, ++ [0][1][2][1][RTW89_CN][3] = 34, ++ [0][1][2][1][RTW89_QATAR][3] = 34, ++ [0][1][2][1][RTW89_UK][3] = 34, ++ [0][1][2][1][RTW89_FCC][4] = 72, ++ [0][1][2][1][RTW89_ETSI][4] = 34, ++ [0][1][2][1][RTW89_MKK][4] = 66, ++ [0][1][2][1][RTW89_IC][4] = 72, ++ [0][1][2][1][RTW89_KCC][4] = 62, ++ [0][1][2][1][RTW89_ACMA][4] = 34, ++ [0][1][2][1][RTW89_CHILE][4] = 40, ++ [0][1][2][1][RTW89_UKRAINE][4] = 34, ++ [0][1][2][1][RTW89_MEXICO][4] = 72, ++ [0][1][2][1][RTW89_CN][4] = 34, ++ [0][1][2][1][RTW89_QATAR][4] = 34, ++ [0][1][2][1][RTW89_UK][4] = 34, ++ [0][1][2][1][RTW89_FCC][5] = 78, ++ [0][1][2][1][RTW89_ETSI][5] = 34, ++ [0][1][2][1][RTW89_MKK][5] = 66, ++ [0][1][2][1][RTW89_IC][5] = 78, ++ [0][1][2][1][RTW89_KCC][5] = 62, ++ [0][1][2][1][RTW89_ACMA][5] = 34, ++ [0][1][2][1][RTW89_CHILE][5] = 42, ++ [0][1][2][1][RTW89_UKRAINE][5] = 34, ++ [0][1][2][1][RTW89_MEXICO][5] = 78, ++ [0][1][2][1][RTW89_CN][5] = 34, ++ [0][1][2][1][RTW89_QATAR][5] = 34, ++ [0][1][2][1][RTW89_UK][5] = 34, ++ [0][1][2][1][RTW89_FCC][6] = 74, ++ [0][1][2][1][RTW89_ETSI][6] = 34, ++ [0][1][2][1][RTW89_MKK][6] = 66, ++ [0][1][2][1][RTW89_IC][6] = 74, ++ [0][1][2][1][RTW89_KCC][6] = 62, ++ [0][1][2][1][RTW89_ACMA][6] = 34, ++ [0][1][2][1][RTW89_CHILE][6] = 40, ++ [0][1][2][1][RTW89_UKRAINE][6] = 34, ++ [0][1][2][1][RTW89_MEXICO][6] = 74, ++ [0][1][2][1][RTW89_CN][6] = 34, ++ [0][1][2][1][RTW89_QATAR][6] = 34, ++ [0][1][2][1][RTW89_UK][6] = 34, ++ [0][1][2][1][RTW89_FCC][7] = 66, ++ [0][1][2][1][RTW89_ETSI][7] = 34, ++ [0][1][2][1][RTW89_MKK][7] = 66, ++ [0][1][2][1][RTW89_IC][7] = 66, ++ [0][1][2][1][RTW89_KCC][7] = 62, ++ [0][1][2][1][RTW89_ACMA][7] = 34, ++ [0][1][2][1][RTW89_CHILE][7] = 40, ++ [0][1][2][1][RTW89_UKRAINE][7] = 34, ++ [0][1][2][1][RTW89_MEXICO][7] = 66, ++ [0][1][2][1][RTW89_CN][7] = 34, ++ [0][1][2][1][RTW89_QATAR][7] = 34, ++ [0][1][2][1][RTW89_UK][7] = 34, ++ [0][1][2][1][RTW89_FCC][8] = 62, ++ [0][1][2][1][RTW89_ETSI][8] = 34, ++ [0][1][2][1][RTW89_MKK][8] = 66, ++ [0][1][2][1][RTW89_IC][8] = 62, ++ [0][1][2][1][RTW89_KCC][8] = 62, ++ [0][1][2][1][RTW89_ACMA][8] = 34, ++ [0][1][2][1][RTW89_CHILE][8] = 40, ++ [0][1][2][1][RTW89_UKRAINE][8] = 34, ++ [0][1][2][1][RTW89_MEXICO][8] = 62, ++ [0][1][2][1][RTW89_CN][8] = 34, ++ [0][1][2][1][RTW89_QATAR][8] = 34, ++ [0][1][2][1][RTW89_UK][8] = 34, ++ [0][1][2][1][RTW89_FCC][9] = 58, ++ [0][1][2][1][RTW89_ETSI][9] = 34, ++ [0][1][2][1][RTW89_MKK][9] = 66, ++ [0][1][2][1][RTW89_IC][9] = 58, ++ [0][1][2][1][RTW89_KCC][9] = 60, ++ [0][1][2][1][RTW89_ACMA][9] = 34, ++ [0][1][2][1][RTW89_CHILE][9] = 40, ++ [0][1][2][1][RTW89_UKRAINE][9] = 34, ++ [0][1][2][1][RTW89_MEXICO][9] = 58, ++ [0][1][2][1][RTW89_CN][9] = 34, ++ [0][1][2][1][RTW89_QATAR][9] = 34, ++ [0][1][2][1][RTW89_UK][9] = 34, ++ [0][1][2][1][RTW89_FCC][10] = 58, ++ [0][1][2][1][RTW89_ETSI][10] = 34, ++ [0][1][2][1][RTW89_MKK][10] = 66, ++ [0][1][2][1][RTW89_IC][10] = 58, ++ [0][1][2][1][RTW89_KCC][10] = 60, ++ [0][1][2][1][RTW89_ACMA][10] = 34, ++ [0][1][2][1][RTW89_CHILE][10] = 40, ++ [0][1][2][1][RTW89_UKRAINE][10] = 34, ++ [0][1][2][1][RTW89_MEXICO][10] = 58, ++ [0][1][2][1][RTW89_CN][10] = 34, ++ [0][1][2][1][RTW89_QATAR][10] = 34, ++ [0][1][2][1][RTW89_UK][10] = 34, ++ [0][1][2][1][RTW89_FCC][11] = 46, ++ [0][1][2][1][RTW89_ETSI][11] = 34, ++ [0][1][2][1][RTW89_MKK][11] = 66, ++ [0][1][2][1][RTW89_IC][11] = 46, ++ [0][1][2][1][RTW89_KCC][11] = 60, ++ [0][1][2][1][RTW89_ACMA][11] = 34, ++ [0][1][2][1][RTW89_CHILE][11] = 40, ++ [0][1][2][1][RTW89_UKRAINE][11] = 34, ++ [0][1][2][1][RTW89_MEXICO][11] = 46, ++ [0][1][2][1][RTW89_CN][11] = 34, ++ [0][1][2][1][RTW89_QATAR][11] = 34, ++ [0][1][2][1][RTW89_UK][11] = 34, ++ [0][1][2][1][RTW89_FCC][12] = 42, ++ [0][1][2][1][RTW89_ETSI][12] = 34, ++ [0][1][2][1][RTW89_MKK][12] = 66, ++ [0][1][2][1][RTW89_IC][12] = 42, ++ [0][1][2][1][RTW89_KCC][12] = 60, ++ [0][1][2][1][RTW89_ACMA][12] = 34, ++ [0][1][2][1][RTW89_CHILE][12] = 40, ++ [0][1][2][1][RTW89_UKRAINE][12] = 34, ++ [0][1][2][1][RTW89_MEXICO][12] = 42, ++ [0][1][2][1][RTW89_CN][12] = 34, ++ [0][1][2][1][RTW89_QATAR][12] = 34, ++ [0][1][2][1][RTW89_UK][12] = 34, ++ [0][1][2][1][RTW89_FCC][13] = 127, ++ [0][1][2][1][RTW89_ETSI][13] = 127, ++ [0][1][2][1][RTW89_MKK][13] = 127, ++ [0][1][2][1][RTW89_IC][13] = 127, ++ [0][1][2][1][RTW89_KCC][13] = 127, ++ [0][1][2][1][RTW89_ACMA][13] = 127, ++ [0][1][2][1][RTW89_CHILE][13] = 127, ++ [0][1][2][1][RTW89_UKRAINE][13] = 127, ++ [0][1][2][1][RTW89_MEXICO][13] = 127, ++ [0][1][2][1][RTW89_CN][13] = 127, ++ [0][1][2][1][RTW89_QATAR][13] = 127, ++ [0][1][2][1][RTW89_UK][13] = 127, ++ [1][0][2][0][RTW89_FCC][0] = 127, ++ [1][0][2][0][RTW89_ETSI][0] = 127, ++ [1][0][2][0][RTW89_MKK][0] = 127, ++ [1][0][2][0][RTW89_IC][0] = 127, ++ [1][0][2][0][RTW89_KCC][0] = 127, ++ [1][0][2][0][RTW89_ACMA][0] = 127, ++ [1][0][2][0][RTW89_CHILE][0] = 127, ++ [1][0][2][0][RTW89_UKRAINE][0] = 127, ++ [1][0][2][0][RTW89_MEXICO][0] = 127, ++ [1][0][2][0][RTW89_CN][0] = 127, ++ [1][0][2][0][RTW89_QATAR][0] = 127, ++ [1][0][2][0][RTW89_UK][0] = 127, ++ [1][0][2][0][RTW89_FCC][1] = 127, ++ [1][0][2][0][RTW89_ETSI][1] = 127, ++ [1][0][2][0][RTW89_MKK][1] = 127, ++ [1][0][2][0][RTW89_IC][1] = 127, ++ [1][0][2][0][RTW89_KCC][1] = 127, ++ [1][0][2][0][RTW89_ACMA][1] = 127, ++ [1][0][2][0][RTW89_CHILE][1] = 127, ++ [1][0][2][0][RTW89_UKRAINE][1] = 127, ++ [1][0][2][0][RTW89_MEXICO][1] = 127, ++ [1][0][2][0][RTW89_CN][1] = 127, ++ [1][0][2][0][RTW89_QATAR][1] = 127, ++ [1][0][2][0][RTW89_UK][1] = 127, ++ [1][0][2][0][RTW89_FCC][2] = 70, ++ [1][0][2][0][RTW89_ETSI][2] = 58, ++ [1][0][2][0][RTW89_MKK][2] = 74, ++ [1][0][2][0][RTW89_IC][2] = 70, ++ [1][0][2][0][RTW89_KCC][2] = 74, ++ [1][0][2][0][RTW89_ACMA][2] = 58, ++ [1][0][2][0][RTW89_CHILE][2] = 66, ++ [1][0][2][0][RTW89_UKRAINE][2] = 58, ++ [1][0][2][0][RTW89_MEXICO][2] = 70, ++ [1][0][2][0][RTW89_CN][2] = 58, ++ [1][0][2][0][RTW89_QATAR][2] = 58, ++ [1][0][2][0][RTW89_UK][2] = 58, ++ [1][0][2][0][RTW89_FCC][3] = 70, ++ [1][0][2][0][RTW89_ETSI][3] = 58, ++ [1][0][2][0][RTW89_MKK][3] = 74, ++ [1][0][2][0][RTW89_IC][3] = 70, ++ [1][0][2][0][RTW89_KCC][3] = 74, ++ [1][0][2][0][RTW89_ACMA][3] = 58, ++ [1][0][2][0][RTW89_CHILE][3] = 66, ++ [1][0][2][0][RTW89_UKRAINE][3] = 58, ++ [1][0][2][0][RTW89_MEXICO][3] = 70, ++ [1][0][2][0][RTW89_CN][3] = 58, ++ [1][0][2][0][RTW89_QATAR][3] = 58, ++ [1][0][2][0][RTW89_UK][3] = 58, ++ [1][0][2][0][RTW89_FCC][4] = 72, ++ [1][0][2][0][RTW89_ETSI][4] = 58, ++ [1][0][2][0][RTW89_MKK][4] = 74, ++ [1][0][2][0][RTW89_IC][4] = 72, ++ [1][0][2][0][RTW89_KCC][4] = 74, ++ [1][0][2][0][RTW89_ACMA][4] = 58, ++ [1][0][2][0][RTW89_CHILE][4] = 66, ++ [1][0][2][0][RTW89_UKRAINE][4] = 58, ++ [1][0][2][0][RTW89_MEXICO][4] = 72, ++ [1][0][2][0][RTW89_CN][4] = 58, ++ [1][0][2][0][RTW89_QATAR][4] = 58, ++ [1][0][2][0][RTW89_UK][4] = 58, ++ [1][0][2][0][RTW89_FCC][5] = 72, ++ [1][0][2][0][RTW89_ETSI][5] = 58, ++ [1][0][2][0][RTW89_MKK][5] = 74, ++ [1][0][2][0][RTW89_IC][5] = 72, ++ [1][0][2][0][RTW89_KCC][5] = 74, ++ [1][0][2][0][RTW89_ACMA][5] = 58, ++ [1][0][2][0][RTW89_CHILE][5] = 66, ++ [1][0][2][0][RTW89_UKRAINE][5] = 58, ++ [1][0][2][0][RTW89_MEXICO][5] = 72, ++ [1][0][2][0][RTW89_CN][5] = 58, ++ [1][0][2][0][RTW89_QATAR][5] = 58, ++ [1][0][2][0][RTW89_UK][5] = 58, ++ [1][0][2][0][RTW89_FCC][6] = 72, ++ [1][0][2][0][RTW89_ETSI][6] = 58, ++ [1][0][2][0][RTW89_MKK][6] = 74, ++ [1][0][2][0][RTW89_IC][6] = 72, ++ [1][0][2][0][RTW89_KCC][6] = 74, ++ [1][0][2][0][RTW89_ACMA][6] = 58, ++ [1][0][2][0][RTW89_CHILE][6] = 66, ++ [1][0][2][0][RTW89_UKRAINE][6] = 58, ++ [1][0][2][0][RTW89_MEXICO][6] = 72, ++ [1][0][2][0][RTW89_CN][6] = 58, ++ [1][0][2][0][RTW89_QATAR][6] = 58, ++ [1][0][2][0][RTW89_UK][6] = 58, ++ [1][0][2][0][RTW89_FCC][7] = 68, ++ [1][0][2][0][RTW89_ETSI][7] = 58, ++ [1][0][2][0][RTW89_MKK][7] = 74, ++ [1][0][2][0][RTW89_IC][7] = 68, ++ [1][0][2][0][RTW89_KCC][7] = 74, ++ [1][0][2][0][RTW89_ACMA][7] = 58, ++ [1][0][2][0][RTW89_CHILE][7] = 66, ++ [1][0][2][0][RTW89_UKRAINE][7] = 58, ++ [1][0][2][0][RTW89_MEXICO][7] = 68, ++ [1][0][2][0][RTW89_CN][7] = 58, ++ [1][0][2][0][RTW89_QATAR][7] = 58, ++ [1][0][2][0][RTW89_UK][7] = 58, ++ [1][0][2][0][RTW89_FCC][8] = 68, ++ [1][0][2][0][RTW89_ETSI][8] = 58, ++ [1][0][2][0][RTW89_MKK][8] = 74, ++ [1][0][2][0][RTW89_IC][8] = 68, ++ [1][0][2][0][RTW89_KCC][8] = 74, ++ [1][0][2][0][RTW89_ACMA][8] = 58, ++ [1][0][2][0][RTW89_CHILE][8] = 66, ++ [1][0][2][0][RTW89_UKRAINE][8] = 58, ++ [1][0][2][0][RTW89_MEXICO][8] = 68, ++ [1][0][2][0][RTW89_CN][8] = 58, ++ [1][0][2][0][RTW89_QATAR][8] = 58, ++ [1][0][2][0][RTW89_UK][8] = 58, ++ [1][0][2][0][RTW89_FCC][9] = 68, ++ [1][0][2][0][RTW89_ETSI][9] = 58, ++ [1][0][2][0][RTW89_MKK][9] = 74, ++ [1][0][2][0][RTW89_IC][9] = 68, ++ [1][0][2][0][RTW89_KCC][9] = 74, ++ [1][0][2][0][RTW89_ACMA][9] = 58, ++ [1][0][2][0][RTW89_CHILE][9] = 66, ++ [1][0][2][0][RTW89_UKRAINE][9] = 58, ++ [1][0][2][0][RTW89_MEXICO][9] = 68, ++ [1][0][2][0][RTW89_CN][9] = 58, ++ [1][0][2][0][RTW89_QATAR][9] = 58, ++ [1][0][2][0][RTW89_UK][9] = 58, ++ [1][0][2][0][RTW89_FCC][10] = 66, ++ [1][0][2][0][RTW89_ETSI][10] = 58, ++ [1][0][2][0][RTW89_MKK][10] = 74, ++ [1][0][2][0][RTW89_IC][10] = 66, ++ [1][0][2][0][RTW89_KCC][10] = 74, ++ [1][0][2][0][RTW89_ACMA][10] = 58, ++ [1][0][2][0][RTW89_CHILE][10] = 66, ++ [1][0][2][0][RTW89_UKRAINE][10] = 58, ++ [1][0][2][0][RTW89_MEXICO][10] = 66, ++ [1][0][2][0][RTW89_CN][10] = 58, ++ [1][0][2][0][RTW89_QATAR][10] = 58, ++ [1][0][2][0][RTW89_UK][10] = 58, ++ [1][0][2][0][RTW89_FCC][11] = 127, ++ [1][0][2][0][RTW89_ETSI][11] = 127, ++ [1][0][2][0][RTW89_MKK][11] = 127, ++ [1][0][2][0][RTW89_IC][11] = 127, ++ [1][0][2][0][RTW89_KCC][11] = 127, ++ [1][0][2][0][RTW89_ACMA][11] = 127, ++ [1][0][2][0][RTW89_CHILE][11] = 127, ++ [1][0][2][0][RTW89_UKRAINE][11] = 127, ++ [1][0][2][0][RTW89_MEXICO][11] = 127, ++ [1][0][2][0][RTW89_CN][11] = 127, ++ [1][0][2][0][RTW89_QATAR][11] = 127, ++ [1][0][2][0][RTW89_UK][11] = 127, ++ [1][0][2][0][RTW89_FCC][12] = 127, ++ [1][0][2][0][RTW89_ETSI][12] = 127, ++ [1][0][2][0][RTW89_MKK][12] = 127, ++ [1][0][2][0][RTW89_IC][12] = 127, ++ [1][0][2][0][RTW89_KCC][12] = 127, ++ [1][0][2][0][RTW89_ACMA][12] = 127, ++ [1][0][2][0][RTW89_CHILE][12] = 127, ++ [1][0][2][0][RTW89_UKRAINE][12] = 127, ++ [1][0][2][0][RTW89_MEXICO][12] = 127, ++ [1][0][2][0][RTW89_CN][12] = 127, ++ [1][0][2][0][RTW89_QATAR][12] = 127, ++ [1][0][2][0][RTW89_UK][12] = 127, ++ [1][0][2][0][RTW89_FCC][13] = 127, ++ [1][0][2][0][RTW89_ETSI][13] = 127, ++ [1][0][2][0][RTW89_MKK][13] = 127, ++ [1][0][2][0][RTW89_IC][13] = 127, ++ [1][0][2][0][RTW89_KCC][13] = 127, ++ [1][0][2][0][RTW89_ACMA][13] = 127, ++ [1][0][2][0][RTW89_CHILE][13] = 127, ++ [1][0][2][0][RTW89_UKRAINE][13] = 127, ++ [1][0][2][0][RTW89_MEXICO][13] = 127, ++ [1][0][2][0][RTW89_CN][13] = 127, ++ [1][0][2][0][RTW89_QATAR][13] = 127, ++ [1][0][2][0][RTW89_UK][13] = 127, ++ [1][1][2][0][RTW89_FCC][0] = 127, ++ [1][1][2][0][RTW89_ETSI][0] = 127, ++ [1][1][2][0][RTW89_MKK][0] = 127, ++ [1][1][2][0][RTW89_IC][0] = 127, ++ [1][1][2][0][RTW89_KCC][0] = 127, ++ [1][1][2][0][RTW89_ACMA][0] = 127, ++ [1][1][2][0][RTW89_CHILE][0] = 127, ++ [1][1][2][0][RTW89_UKRAINE][0] = 127, ++ [1][1][2][0][RTW89_MEXICO][0] = 127, ++ [1][1][2][0][RTW89_CN][0] = 127, ++ [1][1][2][0][RTW89_QATAR][0] = 127, ++ [1][1][2][0][RTW89_UK][0] = 127, ++ [1][1][2][0][RTW89_FCC][1] = 127, ++ [1][1][2][0][RTW89_ETSI][1] = 127, ++ [1][1][2][0][RTW89_MKK][1] = 127, ++ [1][1][2][0][RTW89_IC][1] = 127, ++ [1][1][2][0][RTW89_KCC][1] = 127, ++ [1][1][2][0][RTW89_ACMA][1] = 127, ++ [1][1][2][0][RTW89_CHILE][1] = 127, ++ [1][1][2][0][RTW89_UKRAINE][1] = 127, ++ [1][1][2][0][RTW89_MEXICO][1] = 127, ++ [1][1][2][0][RTW89_CN][1] = 127, ++ [1][1][2][0][RTW89_QATAR][1] = 127, ++ [1][1][2][0][RTW89_UK][1] = 127, ++ [1][1][2][0][RTW89_FCC][2] = 54, ++ [1][1][2][0][RTW89_ETSI][2] = 46, ++ [1][1][2][0][RTW89_MKK][2] = 66, ++ [1][1][2][0][RTW89_IC][2] = 54, ++ [1][1][2][0][RTW89_KCC][2] = 62, ++ [1][1][2][0][RTW89_ACMA][2] = 46, ++ [1][1][2][0][RTW89_CHILE][2] = 52, ++ [1][1][2][0][RTW89_UKRAINE][2] = 46, ++ [1][1][2][0][RTW89_MEXICO][2] = 54, ++ [1][1][2][0][RTW89_CN][2] = 46, ++ [1][1][2][0][RTW89_QATAR][2] = 46, ++ [1][1][2][0][RTW89_UK][2] = 46, ++ [1][1][2][0][RTW89_FCC][3] = 54, ++ [1][1][2][0][RTW89_ETSI][3] = 46, ++ [1][1][2][0][RTW89_MKK][3] = 66, ++ [1][1][2][0][RTW89_IC][3] = 54, ++ [1][1][2][0][RTW89_KCC][3] = 62, ++ [1][1][2][0][RTW89_ACMA][3] = 46, ++ [1][1][2][0][RTW89_CHILE][3] = 52, ++ [1][1][2][0][RTW89_UKRAINE][3] = 46, ++ [1][1][2][0][RTW89_MEXICO][3] = 54, ++ [1][1][2][0][RTW89_CN][3] = 46, ++ [1][1][2][0][RTW89_QATAR][3] = 46, ++ [1][1][2][0][RTW89_UK][3] = 46, ++ [1][1][2][0][RTW89_FCC][4] = 58, ++ [1][1][2][0][RTW89_ETSI][4] = 46, ++ [1][1][2][0][RTW89_MKK][4] = 66, ++ [1][1][2][0][RTW89_IC][4] = 58, ++ [1][1][2][0][RTW89_KCC][4] = 62, ++ [1][1][2][0][RTW89_ACMA][4] = 46, ++ [1][1][2][0][RTW89_CHILE][4] = 52, ++ [1][1][2][0][RTW89_UKRAINE][4] = 46, ++ [1][1][2][0][RTW89_MEXICO][4] = 58, ++ [1][1][2][0][RTW89_CN][4] = 46, ++ [1][1][2][0][RTW89_QATAR][4] = 46, ++ [1][1][2][0][RTW89_UK][4] = 46, ++ [1][1][2][0][RTW89_FCC][5] = 66, ++ [1][1][2][0][RTW89_ETSI][5] = 46, ++ [1][1][2][0][RTW89_MKK][5] = 66, ++ [1][1][2][0][RTW89_IC][5] = 66, ++ [1][1][2][0][RTW89_KCC][5] = 62, ++ [1][1][2][0][RTW89_ACMA][5] = 46, ++ [1][1][2][0][RTW89_CHILE][5] = 54, ++ [1][1][2][0][RTW89_UKRAINE][5] = 46, ++ [1][1][2][0][RTW89_MEXICO][5] = 66, ++ [1][1][2][0][RTW89_CN][5] = 46, ++ [1][1][2][0][RTW89_QATAR][5] = 46, ++ [1][1][2][0][RTW89_UK][5] = 46, ++ [1][1][2][0][RTW89_FCC][6] = 58, ++ [1][1][2][0][RTW89_ETSI][6] = 46, ++ [1][1][2][0][RTW89_MKK][6] = 66, ++ [1][1][2][0][RTW89_IC][6] = 58, ++ [1][1][2][0][RTW89_KCC][6] = 62, ++ [1][1][2][0][RTW89_ACMA][6] = 46, ++ [1][1][2][0][RTW89_CHILE][6] = 52, ++ [1][1][2][0][RTW89_UKRAINE][6] = 46, ++ [1][1][2][0][RTW89_MEXICO][6] = 58, ++ [1][1][2][0][RTW89_CN][6] = 46, ++ [1][1][2][0][RTW89_QATAR][6] = 46, ++ [1][1][2][0][RTW89_UK][6] = 46, ++ [1][1][2][0][RTW89_FCC][7] = 54, ++ [1][1][2][0][RTW89_ETSI][7] = 46, ++ [1][1][2][0][RTW89_MKK][7] = 66, ++ [1][1][2][0][RTW89_IC][7] = 54, ++ [1][1][2][0][RTW89_KCC][7] = 62, ++ [1][1][2][0][RTW89_ACMA][7] = 46, ++ [1][1][2][0][RTW89_CHILE][7] = 52, ++ [1][1][2][0][RTW89_UKRAINE][7] = 46, ++ [1][1][2][0][RTW89_MEXICO][7] = 54, ++ [1][1][2][0][RTW89_CN][7] = 46, ++ [1][1][2][0][RTW89_QATAR][7] = 46, ++ [1][1][2][0][RTW89_UK][7] = 46, ++ [1][1][2][0][RTW89_FCC][8] = 54, ++ [1][1][2][0][RTW89_ETSI][8] = 46, ++ [1][1][2][0][RTW89_MKK][8] = 66, ++ [1][1][2][0][RTW89_IC][8] = 54, ++ [1][1][2][0][RTW89_KCC][8] = 62, ++ [1][1][2][0][RTW89_ACMA][8] = 46, ++ [1][1][2][0][RTW89_CHILE][8] = 52, ++ [1][1][2][0][RTW89_UKRAINE][8] = 46, ++ [1][1][2][0][RTW89_MEXICO][8] = 54, ++ [1][1][2][0][RTW89_CN][8] = 46, ++ [1][1][2][0][RTW89_QATAR][8] = 46, ++ [1][1][2][0][RTW89_UK][8] = 46, ++ [1][1][2][0][RTW89_FCC][9] = 42, ++ [1][1][2][0][RTW89_ETSI][9] = 46, ++ [1][1][2][0][RTW89_MKK][9] = 66, ++ [1][1][2][0][RTW89_IC][9] = 42, ++ [1][1][2][0][RTW89_KCC][9] = 62, ++ [1][1][2][0][RTW89_ACMA][9] = 46, ++ [1][1][2][0][RTW89_CHILE][9] = 42, ++ [1][1][2][0][RTW89_UKRAINE][9] = 46, ++ [1][1][2][0][RTW89_MEXICO][9] = 42, ++ [1][1][2][0][RTW89_CN][9] = 46, ++ [1][1][2][0][RTW89_QATAR][9] = 46, ++ [1][1][2][0][RTW89_UK][9] = 46, ++ [1][1][2][0][RTW89_FCC][10] = 38, ++ [1][1][2][0][RTW89_ETSI][10] = 46, ++ [1][1][2][0][RTW89_MKK][10] = 66, ++ [1][1][2][0][RTW89_IC][10] = 38, ++ [1][1][2][0][RTW89_KCC][10] = 62, ++ [1][1][2][0][RTW89_ACMA][10] = 46, ++ [1][1][2][0][RTW89_CHILE][10] = 38, ++ [1][1][2][0][RTW89_UKRAINE][10] = 46, ++ [1][1][2][0][RTW89_MEXICO][10] = 38, ++ [1][1][2][0][RTW89_CN][10] = 46, ++ [1][1][2][0][RTW89_QATAR][10] = 46, ++ [1][1][2][0][RTW89_UK][10] = 46, ++ [1][1][2][0][RTW89_FCC][11] = 127, ++ [1][1][2][0][RTW89_ETSI][11] = 127, ++ [1][1][2][0][RTW89_MKK][11] = 127, ++ [1][1][2][0][RTW89_IC][11] = 127, ++ [1][1][2][0][RTW89_KCC][11] = 127, ++ [1][1][2][0][RTW89_ACMA][11] = 127, ++ [1][1][2][0][RTW89_CHILE][11] = 127, ++ [1][1][2][0][RTW89_UKRAINE][11] = 127, ++ [1][1][2][0][RTW89_MEXICO][11] = 127, ++ [1][1][2][0][RTW89_CN][11] = 127, ++ [1][1][2][0][RTW89_QATAR][11] = 127, ++ [1][1][2][0][RTW89_UK][11] = 127, ++ [1][1][2][0][RTW89_FCC][12] = 127, ++ [1][1][2][0][RTW89_ETSI][12] = 127, ++ [1][1][2][0][RTW89_MKK][12] = 127, ++ [1][1][2][0][RTW89_IC][12] = 127, ++ [1][1][2][0][RTW89_KCC][12] = 127, ++ [1][1][2][0][RTW89_ACMA][12] = 127, ++ [1][1][2][0][RTW89_CHILE][12] = 127, ++ [1][1][2][0][RTW89_UKRAINE][12] = 127, ++ [1][1][2][0][RTW89_MEXICO][12] = 127, ++ [1][1][2][0][RTW89_CN][12] = 127, ++ [1][1][2][0][RTW89_QATAR][12] = 127, ++ [1][1][2][0][RTW89_UK][12] = 127, ++ [1][1][2][0][RTW89_FCC][13] = 127, ++ [1][1][2][0][RTW89_ETSI][13] = 127, ++ [1][1][2][0][RTW89_MKK][13] = 127, ++ [1][1][2][0][RTW89_IC][13] = 127, ++ [1][1][2][0][RTW89_KCC][13] = 127, ++ [1][1][2][0][RTW89_ACMA][13] = 127, ++ [1][1][2][0][RTW89_CHILE][13] = 127, ++ [1][1][2][0][RTW89_UKRAINE][13] = 127, ++ [1][1][2][0][RTW89_MEXICO][13] = 127, ++ [1][1][2][0][RTW89_CN][13] = 127, ++ [1][1][2][0][RTW89_QATAR][13] = 127, ++ [1][1][2][0][RTW89_UK][13] = 127, ++ [1][1][2][1][RTW89_FCC][0] = 127, ++ [1][1][2][1][RTW89_ETSI][0] = 127, ++ [1][1][2][1][RTW89_MKK][0] = 127, ++ [1][1][2][1][RTW89_IC][0] = 127, ++ [1][1][2][1][RTW89_KCC][0] = 127, ++ [1][1][2][1][RTW89_ACMA][0] = 127, ++ [1][1][2][1][RTW89_CHILE][0] = 127, ++ [1][1][2][1][RTW89_UKRAINE][0] = 127, ++ [1][1][2][1][RTW89_MEXICO][0] = 127, ++ [1][1][2][1][RTW89_CN][0] = 127, ++ [1][1][2][1][RTW89_QATAR][0] = 127, ++ [1][1][2][1][RTW89_UK][0] = 127, ++ [1][1][2][1][RTW89_FCC][1] = 127, ++ [1][1][2][1][RTW89_ETSI][1] = 127, ++ [1][1][2][1][RTW89_MKK][1] = 127, ++ [1][1][2][1][RTW89_IC][1] = 127, ++ [1][1][2][1][RTW89_KCC][1] = 127, ++ [1][1][2][1][RTW89_ACMA][1] = 127, ++ [1][1][2][1][RTW89_CHILE][1] = 127, ++ [1][1][2][1][RTW89_UKRAINE][1] = 127, ++ [1][1][2][1][RTW89_MEXICO][1] = 127, ++ [1][1][2][1][RTW89_CN][1] = 127, ++ [1][1][2][1][RTW89_QATAR][1] = 127, ++ [1][1][2][1][RTW89_UK][1] = 127, ++ [1][1][2][1][RTW89_FCC][2] = 54, ++ [1][1][2][1][RTW89_ETSI][2] = 34, ++ [1][1][2][1][RTW89_MKK][2] = 66, ++ [1][1][2][1][RTW89_IC][2] = 54, ++ [1][1][2][1][RTW89_KCC][2] = 62, ++ [1][1][2][1][RTW89_ACMA][2] = 34, ++ [1][1][2][1][RTW89_CHILE][2] = 42, ++ [1][1][2][1][RTW89_UKRAINE][2] = 34, ++ [1][1][2][1][RTW89_MEXICO][2] = 54, ++ [1][1][2][1][RTW89_CN][2] = 34, ++ [1][1][2][1][RTW89_QATAR][2] = 34, ++ [1][1][2][1][RTW89_UK][2] = 34, ++ [1][1][2][1][RTW89_FCC][3] = 54, ++ [1][1][2][1][RTW89_ETSI][3] = 34, ++ [1][1][2][1][RTW89_MKK][3] = 66, ++ [1][1][2][1][RTW89_IC][3] = 54, ++ [1][1][2][1][RTW89_KCC][3] = 62, ++ [1][1][2][1][RTW89_ACMA][3] = 34, ++ [1][1][2][1][RTW89_CHILE][3] = 42, ++ [1][1][2][1][RTW89_UKRAINE][3] = 34, ++ [1][1][2][1][RTW89_MEXICO][3] = 54, ++ [1][1][2][1][RTW89_CN][3] = 34, ++ [1][1][2][1][RTW89_QATAR][3] = 34, ++ [1][1][2][1][RTW89_UK][3] = 34, ++ [1][1][2][1][RTW89_FCC][4] = 58, ++ [1][1][2][1][RTW89_ETSI][4] = 34, ++ [1][1][2][1][RTW89_MKK][4] = 66, ++ [1][1][2][1][RTW89_IC][4] = 58, ++ [1][1][2][1][RTW89_KCC][4] = 62, ++ [1][1][2][1][RTW89_ACMA][4] = 34, ++ [1][1][2][1][RTW89_CHILE][4] = 42, ++ [1][1][2][1][RTW89_UKRAINE][4] = 34, ++ [1][1][2][1][RTW89_MEXICO][4] = 58, ++ [1][1][2][1][RTW89_CN][4] = 34, ++ [1][1][2][1][RTW89_QATAR][4] = 34, ++ [1][1][2][1][RTW89_UK][4] = 34, ++ [1][1][2][1][RTW89_FCC][5] = 66, ++ [1][1][2][1][RTW89_ETSI][5] = 34, ++ [1][1][2][1][RTW89_MKK][5] = 66, ++ [1][1][2][1][RTW89_IC][5] = 66, ++ [1][1][2][1][RTW89_KCC][5] = 62, ++ [1][1][2][1][RTW89_ACMA][5] = 34, ++ [1][1][2][1][RTW89_CHILE][5] = 42, ++ [1][1][2][1][RTW89_UKRAINE][5] = 34, ++ [1][1][2][1][RTW89_MEXICO][5] = 66, ++ [1][1][2][1][RTW89_CN][5] = 34, ++ [1][1][2][1][RTW89_QATAR][5] = 34, ++ [1][1][2][1][RTW89_UK][5] = 34, ++ [1][1][2][1][RTW89_FCC][6] = 58, ++ [1][1][2][1][RTW89_ETSI][6] = 34, ++ [1][1][2][1][RTW89_MKK][6] = 66, ++ [1][1][2][1][RTW89_IC][6] = 58, ++ [1][1][2][1][RTW89_KCC][6] = 62, ++ [1][1][2][1][RTW89_ACMA][6] = 34, ++ [1][1][2][1][RTW89_CHILE][6] = 42, ++ [1][1][2][1][RTW89_UKRAINE][6] = 34, ++ [1][1][2][1][RTW89_MEXICO][6] = 58, ++ [1][1][2][1][RTW89_CN][6] = 34, ++ [1][1][2][1][RTW89_QATAR][6] = 34, ++ [1][1][2][1][RTW89_UK][6] = 34, ++ [1][1][2][1][RTW89_FCC][7] = 54, ++ [1][1][2][1][RTW89_ETSI][7] = 34, ++ [1][1][2][1][RTW89_MKK][7] = 66, ++ [1][1][2][1][RTW89_IC][7] = 54, ++ [1][1][2][1][RTW89_KCC][7] = 62, ++ [1][1][2][1][RTW89_ACMA][7] = 34, ++ [1][1][2][1][RTW89_CHILE][7] = 42, ++ [1][1][2][1][RTW89_UKRAINE][7] = 34, ++ [1][1][2][1][RTW89_MEXICO][7] = 54, ++ [1][1][2][1][RTW89_CN][7] = 34, ++ [1][1][2][1][RTW89_QATAR][7] = 34, ++ [1][1][2][1][RTW89_UK][7] = 34, ++ [1][1][2][1][RTW89_FCC][8] = 54, ++ [1][1][2][1][RTW89_ETSI][8] = 34, ++ [1][1][2][1][RTW89_MKK][8] = 66, ++ [1][1][2][1][RTW89_IC][8] = 54, ++ [1][1][2][1][RTW89_KCC][8] = 62, ++ [1][1][2][1][RTW89_ACMA][8] = 34, ++ [1][1][2][1][RTW89_CHILE][8] = 42, ++ [1][1][2][1][RTW89_UKRAINE][8] = 34, ++ [1][1][2][1][RTW89_MEXICO][8] = 54, ++ [1][1][2][1][RTW89_CN][8] = 34, ++ [1][1][2][1][RTW89_QATAR][8] = 34, ++ [1][1][2][1][RTW89_UK][8] = 34, ++ [1][1][2][1][RTW89_FCC][9] = 42, ++ [1][1][2][1][RTW89_ETSI][9] = 34, ++ [1][1][2][1][RTW89_MKK][9] = 66, ++ [1][1][2][1][RTW89_IC][9] = 42, ++ [1][1][2][1][RTW89_KCC][9] = 62, ++ [1][1][2][1][RTW89_ACMA][9] = 34, ++ [1][1][2][1][RTW89_CHILE][9] = 42, ++ [1][1][2][1][RTW89_UKRAINE][9] = 34, ++ [1][1][2][1][RTW89_MEXICO][9] = 42, ++ [1][1][2][1][RTW89_CN][9] = 34, ++ [1][1][2][1][RTW89_QATAR][9] = 34, ++ [1][1][2][1][RTW89_UK][9] = 34, ++ [1][1][2][1][RTW89_FCC][10] = 38, ++ [1][1][2][1][RTW89_ETSI][10] = 34, ++ [1][1][2][1][RTW89_MKK][10] = 66, ++ [1][1][2][1][RTW89_IC][10] = 38, ++ [1][1][2][1][RTW89_KCC][10] = 62, ++ [1][1][2][1][RTW89_ACMA][10] = 34, ++ [1][1][2][1][RTW89_CHILE][10] = 38, ++ [1][1][2][1][RTW89_UKRAINE][10] = 34, ++ [1][1][2][1][RTW89_MEXICO][10] = 38, ++ [1][1][2][1][RTW89_CN][10] = 34, ++ [1][1][2][1][RTW89_QATAR][10] = 34, ++ [1][1][2][1][RTW89_UK][10] = 34, ++ [1][1][2][1][RTW89_FCC][11] = 127, ++ [1][1][2][1][RTW89_ETSI][11] = 127, ++ [1][1][2][1][RTW89_MKK][11] = 127, ++ [1][1][2][1][RTW89_IC][11] = 127, ++ [1][1][2][1][RTW89_KCC][11] = 127, ++ [1][1][2][1][RTW89_ACMA][11] = 127, ++ [1][1][2][1][RTW89_CHILE][11] = 127, ++ [1][1][2][1][RTW89_UKRAINE][11] = 127, ++ [1][1][2][1][RTW89_MEXICO][11] = 127, ++ [1][1][2][1][RTW89_CN][11] = 127, ++ [1][1][2][1][RTW89_QATAR][11] = 127, ++ [1][1][2][1][RTW89_UK][11] = 127, ++ [1][1][2][1][RTW89_FCC][12] = 127, ++ [1][1][2][1][RTW89_ETSI][12] = 127, ++ [1][1][2][1][RTW89_MKK][12] = 127, ++ [1][1][2][1][RTW89_IC][12] = 127, ++ [1][1][2][1][RTW89_KCC][12] = 127, ++ [1][1][2][1][RTW89_ACMA][12] = 127, ++ [1][1][2][1][RTW89_CHILE][12] = 127, ++ [1][1][2][1][RTW89_UKRAINE][12] = 127, ++ [1][1][2][1][RTW89_MEXICO][12] = 127, ++ [1][1][2][1][RTW89_CN][12] = 127, ++ [1][1][2][1][RTW89_QATAR][12] = 127, ++ [1][1][2][1][RTW89_UK][12] = 127, ++ [1][1][2][1][RTW89_FCC][13] = 127, ++ [1][1][2][1][RTW89_ETSI][13] = 127, ++ [1][1][2][1][RTW89_MKK][13] = 127, ++ [1][1][2][1][RTW89_IC][13] = 127, ++ [1][1][2][1][RTW89_KCC][13] = 127, ++ [1][1][2][1][RTW89_ACMA][13] = 127, ++ [1][1][2][1][RTW89_CHILE][13] = 127, ++ [1][1][2][1][RTW89_UKRAINE][13] = 127, ++ [1][1][2][1][RTW89_MEXICO][13] = 127, ++ [1][1][2][1][RTW89_CN][13] = 127, ++ [1][1][2][1][RTW89_QATAR][13] = 127, ++ [1][1][2][1][RTW89_UK][13] = 127, ++}; ++ ++const s8 rtw89_8852b_txpwr_lmt_5g[RTW89_5G_BW_NUM][RTW89_NTX_NUM] ++ [RTW89_RS_LMT_NUM][RTW89_BF_NUM] ++ [RTW89_REGD_NUM][RTW89_5G_CH_NUM] = { ++ [0][0][1][0][RTW89_WW][0] = 42, ++ [0][0][1][0][RTW89_WW][2] = 42, ++ [0][0][1][0][RTW89_WW][4] = 42, ++ [0][0][1][0][RTW89_WW][6] = 42, ++ [0][0][1][0][RTW89_WW][8] = 52, ++ [0][0][1][0][RTW89_WW][10] = 52, ++ [0][0][1][0][RTW89_WW][12] = 52, ++ [0][0][1][0][RTW89_WW][14] = 52, ++ [0][0][1][0][RTW89_WW][15] = 52, ++ [0][0][1][0][RTW89_WW][17] = 52, ++ [0][0][1][0][RTW89_WW][19] = 52, ++ [0][0][1][0][RTW89_WW][21] = 52, ++ [0][0][1][0][RTW89_WW][23] = 52, ++ [0][0][1][0][RTW89_WW][25] = 52, ++ [0][0][1][0][RTW89_WW][27] = 52, ++ [0][0][1][0][RTW89_WW][29] = 52, ++ [0][0][1][0][RTW89_WW][31] = 52, ++ [0][0][1][0][RTW89_WW][33] = 52, ++ [0][0][1][0][RTW89_WW][35] = 52, ++ [0][0][1][0][RTW89_WW][37] = 68, ++ [0][0][1][0][RTW89_WW][38] = 28, ++ [0][0][1][0][RTW89_WW][40] = 28, ++ [0][0][1][0][RTW89_WW][42] = 28, ++ [0][0][1][0][RTW89_WW][44] = 28, ++ [0][0][1][0][RTW89_WW][46] = 28, ++ [0][0][1][0][RTW89_WW][48] = 78, ++ [0][0][1][0][RTW89_WW][50] = 78, ++ [0][0][1][0][RTW89_WW][52] = 78, ++ [0][1][1][0][RTW89_WW][0] = 30, ++ [0][1][1][0][RTW89_WW][2] = 32, ++ [0][1][1][0][RTW89_WW][4] = 30, ++ [0][1][1][0][RTW89_WW][6] = 30, ++ [0][1][1][0][RTW89_WW][8] = 40, ++ [0][1][1][0][RTW89_WW][10] = 40, ++ [0][1][1][0][RTW89_WW][12] = 40, ++ [0][1][1][0][RTW89_WW][14] = 40, ++ [0][1][1][0][RTW89_WW][15] = 40, ++ [0][1][1][0][RTW89_WW][17] = 40, ++ [0][1][1][0][RTW89_WW][19] = 40, ++ [0][1][1][0][RTW89_WW][21] = 40, ++ [0][1][1][0][RTW89_WW][23] = 40, ++ [0][1][1][0][RTW89_WW][25] = 40, ++ [0][1][1][0][RTW89_WW][27] = 40, ++ [0][1][1][0][RTW89_WW][29] = 40, ++ [0][1][1][0][RTW89_WW][31] = 40, ++ [0][1][1][0][RTW89_WW][33] = 40, ++ [0][1][1][0][RTW89_WW][35] = 40, ++ [0][1][1][0][RTW89_WW][37] = 50, ++ [0][1][1][0][RTW89_WW][38] = 16, ++ [0][1][1][0][RTW89_WW][40] = 16, ++ [0][1][1][0][RTW89_WW][42] = 16, ++ [0][1][1][0][RTW89_WW][44] = 16, ++ [0][1][1][0][RTW89_WW][46] = 16, ++ [0][1][1][0][RTW89_WW][48] = 56, ++ [0][1][1][0][RTW89_WW][50] = 56, ++ [0][1][1][0][RTW89_WW][52] = 56, ++ [0][0][2][0][RTW89_WW][0] = 42, ++ [0][0][2][0][RTW89_WW][2] = 42, ++ [0][0][2][0][RTW89_WW][4] = 42, ++ [0][0][2][0][RTW89_WW][6] = 42, ++ [0][0][2][0][RTW89_WW][8] = 52, ++ [0][0][2][0][RTW89_WW][10] = 52, ++ [0][0][2][0][RTW89_WW][12] = 52, ++ [0][0][2][0][RTW89_WW][14] = 52, ++ [0][0][2][0][RTW89_WW][15] = 52, ++ [0][0][2][0][RTW89_WW][17] = 52, ++ [0][0][2][0][RTW89_WW][19] = 52, ++ [0][0][2][0][RTW89_WW][21] = 52, ++ [0][0][2][0][RTW89_WW][23] = 52, ++ [0][0][2][0][RTW89_WW][25] = 52, ++ [0][0][2][0][RTW89_WW][27] = 52, ++ [0][0][2][0][RTW89_WW][29] = 52, ++ [0][0][2][0][RTW89_WW][31] = 52, ++ [0][0][2][0][RTW89_WW][33] = 52, ++ [0][0][2][0][RTW89_WW][35] = 52, ++ [0][0][2][0][RTW89_WW][37] = 64, ++ [0][0][2][0][RTW89_WW][38] = 28, ++ [0][0][2][0][RTW89_WW][40] = 28, ++ [0][0][2][0][RTW89_WW][42] = 28, ++ [0][0][2][0][RTW89_WW][44] = 28, ++ [0][0][2][0][RTW89_WW][46] = 28, ++ [0][0][2][0][RTW89_WW][48] = 78, ++ [0][0][2][0][RTW89_WW][50] = 78, ++ [0][0][2][0][RTW89_WW][52] = 78, ++ [0][1][2][0][RTW89_WW][0] = 30, ++ [0][1][2][0][RTW89_WW][2] = 30, ++ [0][1][2][0][RTW89_WW][4] = 30, ++ [0][1][2][0][RTW89_WW][6] = 30, ++ [0][1][2][0][RTW89_WW][8] = 40, ++ [0][1][2][0][RTW89_WW][10] = 40, ++ [0][1][2][0][RTW89_WW][12] = 40, ++ [0][1][2][0][RTW89_WW][14] = 40, ++ [0][1][2][0][RTW89_WW][15] = 40, ++ [0][1][2][0][RTW89_WW][17] = 40, ++ [0][1][2][0][RTW89_WW][19] = 40, ++ [0][1][2][0][RTW89_WW][21] = 40, ++ [0][1][2][0][RTW89_WW][23] = 40, ++ [0][1][2][0][RTW89_WW][25] = 40, ++ [0][1][2][0][RTW89_WW][27] = 40, ++ [0][1][2][0][RTW89_WW][29] = 40, ++ [0][1][2][0][RTW89_WW][31] = 40, ++ [0][1][2][0][RTW89_WW][33] = 40, ++ [0][1][2][0][RTW89_WW][35] = 40, ++ [0][1][2][0][RTW89_WW][37] = 50, ++ [0][1][2][0][RTW89_WW][38] = 16, ++ [0][1][2][0][RTW89_WW][40] = 16, ++ [0][1][2][0][RTW89_WW][42] = 16, ++ [0][1][2][0][RTW89_WW][44] = 16, ++ [0][1][2][0][RTW89_WW][46] = 16, ++ [0][1][2][0][RTW89_WW][48] = 58, ++ [0][1][2][0][RTW89_WW][50] = 58, ++ [0][1][2][0][RTW89_WW][52] = 58, ++ [0][1][2][1][RTW89_WW][0] = 14, ++ [0][1][2][1][RTW89_WW][2] = 14, ++ [0][1][2][1][RTW89_WW][4] = 14, ++ [0][1][2][1][RTW89_WW][6] = 14, ++ [0][1][2][1][RTW89_WW][8] = 28, ++ [0][1][2][1][RTW89_WW][10] = 28, ++ [0][1][2][1][RTW89_WW][12] = 28, ++ [0][1][2][1][RTW89_WW][14] = 28, ++ [0][1][2][1][RTW89_WW][15] = 28, ++ [0][1][2][1][RTW89_WW][17] = 28, ++ [0][1][2][1][RTW89_WW][19] = 28, ++ [0][1][2][1][RTW89_WW][21] = 28, ++ [0][1][2][1][RTW89_WW][23] = 28, ++ [0][1][2][1][RTW89_WW][25] = 28, ++ [0][1][2][1][RTW89_WW][27] = 28, ++ [0][1][2][1][RTW89_WW][29] = 28, ++ [0][1][2][1][RTW89_WW][31] = 28, ++ [0][1][2][1][RTW89_WW][33] = 28, ++ [0][1][2][1][RTW89_WW][35] = 28, ++ [0][1][2][1][RTW89_WW][37] = 36, ++ [0][1][2][1][RTW89_WW][38] = 4, ++ [0][1][2][1][RTW89_WW][40] = 4, ++ [0][1][2][1][RTW89_WW][42] = 4, ++ [0][1][2][1][RTW89_WW][44] = 4, ++ [0][1][2][1][RTW89_WW][46] = 4, ++ [0][1][2][1][RTW89_WW][48] = 58, ++ [0][1][2][1][RTW89_WW][50] = 58, ++ [0][1][2][1][RTW89_WW][52] = 58, ++ [1][0][2][0][RTW89_WW][1] = 42, ++ [1][0][2][0][RTW89_WW][5] = 42, ++ [1][0][2][0][RTW89_WW][9] = 52, ++ [1][0][2][0][RTW89_WW][13] = 52, ++ [1][0][2][0][RTW89_WW][16] = 52, ++ [1][0][2][0][RTW89_WW][20] = 52, ++ [1][0][2][0][RTW89_WW][24] = 52, ++ [1][0][2][0][RTW89_WW][28] = 52, ++ [1][0][2][0][RTW89_WW][32] = 52, ++ [1][0][2][0][RTW89_WW][36] = 64, ++ [1][0][2][0][RTW89_WW][39] = 28, ++ [1][0][2][0][RTW89_WW][43] = 28, ++ [1][0][2][0][RTW89_WW][47] = 78, ++ [1][0][2][0][RTW89_WW][51] = 70, ++ [1][1][2][0][RTW89_WW][1] = 30, ++ [1][1][2][0][RTW89_WW][5] = 30, ++ [1][1][2][0][RTW89_WW][9] = 40, ++ [1][1][2][0][RTW89_WW][13] = 40, ++ [1][1][2][0][RTW89_WW][16] = 40, ++ [1][1][2][0][RTW89_WW][20] = 40, ++ [1][1][2][0][RTW89_WW][24] = 40, ++ [1][1][2][0][RTW89_WW][28] = 40, ++ [1][1][2][0][RTW89_WW][32] = 40, ++ [1][1][2][0][RTW89_WW][36] = 50, ++ [1][1][2][0][RTW89_WW][39] = 16, ++ [1][1][2][0][RTW89_WW][43] = 16, ++ [1][1][2][0][RTW89_WW][47] = 68, ++ [1][1][2][0][RTW89_WW][51] = 66, ++ [1][1][2][1][RTW89_WW][1] = 16, ++ [1][1][2][1][RTW89_WW][5] = 16, ++ [1][1][2][1][RTW89_WW][9] = 28, ++ [1][1][2][1][RTW89_WW][13] = 28, ++ [1][1][2][1][RTW89_WW][16] = 28, ++ [1][1][2][1][RTW89_WW][20] = 28, ++ [1][1][2][1][RTW89_WW][24] = 28, ++ [1][1][2][1][RTW89_WW][28] = 28, ++ [1][1][2][1][RTW89_WW][32] = 28, ++ [1][1][2][1][RTW89_WW][36] = 36, ++ [1][1][2][1][RTW89_WW][39] = 4, ++ [1][1][2][1][RTW89_WW][43] = 4, ++ [1][1][2][1][RTW89_WW][47] = 68, ++ [1][1][2][1][RTW89_WW][51] = 66, ++ [2][0][2][0][RTW89_WW][3] = 42, ++ [2][0][2][0][RTW89_WW][11] = 52, ++ [2][0][2][0][RTW89_WW][18] = 52, ++ [2][0][2][0][RTW89_WW][26] = 52, ++ [2][0][2][0][RTW89_WW][34] = 64, ++ [2][0][2][0][RTW89_WW][41] = 28, ++ [2][0][2][0][RTW89_WW][49] = 64, ++ [2][1][2][0][RTW89_WW][3] = 28, ++ [2][1][2][0][RTW89_WW][11] = 40, ++ [2][1][2][0][RTW89_WW][18] = 40, ++ [2][1][2][0][RTW89_WW][26] = 40, ++ [2][1][2][0][RTW89_WW][34] = 50, ++ [2][1][2][0][RTW89_WW][41] = 16, ++ [2][1][2][0][RTW89_WW][49] = 58, ++ [2][1][2][1][RTW89_WW][3] = 16, ++ [2][1][2][1][RTW89_WW][11] = 28, ++ [2][1][2][1][RTW89_WW][18] = 28, ++ [2][1][2][1][RTW89_WW][26] = 28, ++ [2][1][2][1][RTW89_WW][34] = 34, ++ [2][1][2][1][RTW89_WW][41] = 4, ++ [2][1][2][1][RTW89_WW][49] = 58, ++ [0][0][1][0][RTW89_FCC][0] = 78, ++ [0][0][1][0][RTW89_ETSI][0] = 58, ++ [0][0][1][0][RTW89_MKK][0] = 60, ++ [0][0][1][0][RTW89_IC][0] = 60, ++ [0][0][1][0][RTW89_KCC][0] = 76, ++ [0][0][1][0][RTW89_ACMA][0] = 58, ++ [0][0][1][0][RTW89_CHILE][0] = 42, ++ [0][0][1][0][RTW89_UKRAINE][0] = 52, ++ [0][0][1][0][RTW89_MEXICO][0] = 62, ++ [0][0][1][0][RTW89_CN][0] = 58, ++ [0][0][1][0][RTW89_QATAR][0] = 58, ++ [0][0][1][0][RTW89_UK][0] = 58, ++ [0][0][1][0][RTW89_FCC][2] = 78, ++ [0][0][1][0][RTW89_ETSI][2] = 58, ++ [0][0][1][0][RTW89_MKK][2] = 60, ++ [0][0][1][0][RTW89_IC][2] = 60, ++ [0][0][1][0][RTW89_KCC][2] = 76, ++ [0][0][1][0][RTW89_ACMA][2] = 58, ++ [0][0][1][0][RTW89_CHILE][2] = 42, ++ [0][0][1][0][RTW89_UKRAINE][2] = 52, ++ [0][0][1][0][RTW89_MEXICO][2] = 62, ++ [0][0][1][0][RTW89_CN][2] = 58, ++ [0][0][1][0][RTW89_QATAR][2] = 58, ++ [0][0][1][0][RTW89_UK][2] = 58, ++ [0][0][1][0][RTW89_FCC][4] = 78, ++ [0][0][1][0][RTW89_ETSI][4] = 58, ++ [0][0][1][0][RTW89_MKK][4] = 60, ++ [0][0][1][0][RTW89_IC][4] = 60, ++ [0][0][1][0][RTW89_KCC][4] = 76, ++ [0][0][1][0][RTW89_ACMA][4] = 58, ++ [0][0][1][0][RTW89_CHILE][4] = 42, ++ [0][0][1][0][RTW89_UKRAINE][4] = 52, ++ [0][0][1][0][RTW89_MEXICO][4] = 62, ++ [0][0][1][0][RTW89_CN][4] = 58, ++ [0][0][1][0][RTW89_QATAR][4] = 58, ++ [0][0][1][0][RTW89_UK][4] = 58, ++ [0][0][1][0][RTW89_FCC][6] = 78, ++ [0][0][1][0][RTW89_ETSI][6] = 58, ++ [0][0][1][0][RTW89_MKK][6] = 60, ++ [0][0][1][0][RTW89_IC][6] = 60, ++ [0][0][1][0][RTW89_KCC][6] = 50, ++ [0][0][1][0][RTW89_ACMA][6] = 58, ++ [0][0][1][0][RTW89_CHILE][6] = 42, ++ [0][0][1][0][RTW89_UKRAINE][6] = 52, ++ [0][0][1][0][RTW89_MEXICO][6] = 62, ++ [0][0][1][0][RTW89_CN][6] = 58, ++ [0][0][1][0][RTW89_QATAR][6] = 58, ++ [0][0][1][0][RTW89_UK][6] = 58, ++ [0][0][1][0][RTW89_FCC][8] = 78, ++ [0][0][1][0][RTW89_ETSI][8] = 58, ++ [0][0][1][0][RTW89_MKK][8] = 62, ++ [0][0][1][0][RTW89_IC][8] = 64, ++ [0][0][1][0][RTW89_KCC][8] = 70, ++ [0][0][1][0][RTW89_ACMA][8] = 58, ++ [0][0][1][0][RTW89_CHILE][8] = 66, ++ [0][0][1][0][RTW89_UKRAINE][8] = 52, ++ [0][0][1][0][RTW89_MEXICO][8] = 78, ++ [0][0][1][0][RTW89_CN][8] = 58, ++ [0][0][1][0][RTW89_QATAR][8] = 58, ++ [0][0][1][0][RTW89_UK][8] = 58, ++ [0][0][1][0][RTW89_FCC][10] = 78, ++ [0][0][1][0][RTW89_ETSI][10] = 58, ++ [0][0][1][0][RTW89_MKK][10] = 62, ++ [0][0][1][0][RTW89_IC][10] = 64, ++ [0][0][1][0][RTW89_KCC][10] = 70, ++ [0][0][1][0][RTW89_ACMA][10] = 58, ++ [0][0][1][0][RTW89_CHILE][10] = 66, ++ [0][0][1][0][RTW89_UKRAINE][10] = 52, ++ [0][0][1][0][RTW89_MEXICO][10] = 78, ++ [0][0][1][0][RTW89_CN][10] = 58, ++ [0][0][1][0][RTW89_QATAR][10] = 58, ++ [0][0][1][0][RTW89_UK][10] = 58, ++ [0][0][1][0][RTW89_FCC][12] = 78, ++ [0][0][1][0][RTW89_ETSI][12] = 58, ++ [0][0][1][0][RTW89_MKK][12] = 62, ++ [0][0][1][0][RTW89_IC][12] = 64, ++ [0][0][1][0][RTW89_KCC][12] = 74, ++ [0][0][1][0][RTW89_ACMA][12] = 58, ++ [0][0][1][0][RTW89_CHILE][12] = 66, ++ [0][0][1][0][RTW89_UKRAINE][12] = 52, ++ [0][0][1][0][RTW89_MEXICO][12] = 78, ++ [0][0][1][0][RTW89_CN][12] = 58, ++ [0][0][1][0][RTW89_QATAR][12] = 58, ++ [0][0][1][0][RTW89_UK][12] = 58, ++ [0][0][1][0][RTW89_FCC][14] = 78, ++ [0][0][1][0][RTW89_ETSI][14] = 58, ++ [0][0][1][0][RTW89_MKK][14] = 60, ++ [0][0][1][0][RTW89_IC][14] = 64, ++ [0][0][1][0][RTW89_KCC][14] = 74, ++ [0][0][1][0][RTW89_ACMA][14] = 58, ++ [0][0][1][0][RTW89_CHILE][14] = 66, ++ [0][0][1][0][RTW89_UKRAINE][14] = 52, ++ [0][0][1][0][RTW89_MEXICO][14] = 78, ++ [0][0][1][0][RTW89_CN][14] = 58, ++ [0][0][1][0][RTW89_QATAR][14] = 58, ++ [0][0][1][0][RTW89_UK][14] = 58, ++ [0][0][1][0][RTW89_FCC][15] = 76, ++ [0][0][1][0][RTW89_ETSI][15] = 58, ++ [0][0][1][0][RTW89_MKK][15] = 76, ++ [0][0][1][0][RTW89_IC][15] = 76, ++ [0][0][1][0][RTW89_KCC][15] = 74, ++ [0][0][1][0][RTW89_ACMA][15] = 58, ++ [0][0][1][0][RTW89_CHILE][15] = 66, ++ [0][0][1][0][RTW89_UKRAINE][15] = 52, ++ [0][0][1][0][RTW89_MEXICO][15] = 76, ++ [0][0][1][0][RTW89_CN][15] = 127, ++ [0][0][1][0][RTW89_QATAR][15] = 58, ++ [0][0][1][0][RTW89_UK][15] = 58, ++ [0][0][1][0][RTW89_FCC][17] = 78, ++ [0][0][1][0][RTW89_ETSI][17] = 58, ++ [0][0][1][0][RTW89_MKK][17] = 76, ++ [0][0][1][0][RTW89_IC][17] = 78, ++ [0][0][1][0][RTW89_KCC][17] = 74, ++ [0][0][1][0][RTW89_ACMA][17] = 58, ++ [0][0][1][0][RTW89_CHILE][17] = 66, ++ [0][0][1][0][RTW89_UKRAINE][17] = 52, ++ [0][0][1][0][RTW89_MEXICO][17] = 78, ++ [0][0][1][0][RTW89_CN][17] = 127, ++ [0][0][1][0][RTW89_QATAR][17] = 58, ++ [0][0][1][0][RTW89_UK][17] = 58, ++ [0][0][1][0][RTW89_FCC][19] = 78, ++ [0][0][1][0][RTW89_ETSI][19] = 58, ++ [0][0][1][0][RTW89_MKK][19] = 76, ++ [0][0][1][0][RTW89_IC][19] = 78, ++ [0][0][1][0][RTW89_KCC][19] = 74, ++ [0][0][1][0][RTW89_ACMA][19] = 58, ++ [0][0][1][0][RTW89_CHILE][19] = 66, ++ [0][0][1][0][RTW89_UKRAINE][19] = 52, ++ [0][0][1][0][RTW89_MEXICO][19] = 78, ++ [0][0][1][0][RTW89_CN][19] = 127, ++ [0][0][1][0][RTW89_QATAR][19] = 58, ++ [0][0][1][0][RTW89_UK][19] = 58, ++ [0][0][1][0][RTW89_FCC][21] = 78, ++ [0][0][1][0][RTW89_ETSI][21] = 58, ++ [0][0][1][0][RTW89_MKK][21] = 76, ++ [0][0][1][0][RTW89_IC][21] = 78, ++ [0][0][1][0][RTW89_KCC][21] = 74, ++ [0][0][1][0][RTW89_ACMA][21] = 58, ++ [0][0][1][0][RTW89_CHILE][21] = 68, ++ [0][0][1][0][RTW89_UKRAINE][21] = 52, ++ [0][0][1][0][RTW89_MEXICO][21] = 78, ++ [0][0][1][0][RTW89_CN][21] = 127, ++ [0][0][1][0][RTW89_QATAR][21] = 58, ++ [0][0][1][0][RTW89_UK][21] = 58, ++ [0][0][1][0][RTW89_FCC][23] = 78, ++ [0][0][1][0][RTW89_ETSI][23] = 58, ++ [0][0][1][0][RTW89_MKK][23] = 76, ++ [0][0][1][0][RTW89_IC][23] = 78, ++ [0][0][1][0][RTW89_KCC][23] = 74, ++ [0][0][1][0][RTW89_ACMA][23] = 58, ++ [0][0][1][0][RTW89_CHILE][23] = 68, ++ [0][0][1][0][RTW89_UKRAINE][23] = 52, ++ [0][0][1][0][RTW89_MEXICO][23] = 78, ++ [0][0][1][0][RTW89_CN][23] = 127, ++ [0][0][1][0][RTW89_QATAR][23] = 58, ++ [0][0][1][0][RTW89_UK][23] = 58, ++ [0][0][1][0][RTW89_FCC][25] = 78, ++ [0][0][1][0][RTW89_ETSI][25] = 58, ++ [0][0][1][0][RTW89_MKK][25] = 76, ++ [0][0][1][0][RTW89_IC][25] = 127, ++ [0][0][1][0][RTW89_KCC][25] = 74, ++ [0][0][1][0][RTW89_ACMA][25] = 127, ++ [0][0][1][0][RTW89_CHILE][25] = 68, ++ [0][0][1][0][RTW89_UKRAINE][25] = 52, ++ [0][0][1][0][RTW89_MEXICO][25] = 78, ++ [0][0][1][0][RTW89_CN][25] = 127, ++ [0][0][1][0][RTW89_QATAR][25] = 58, ++ [0][0][1][0][RTW89_UK][25] = 58, ++ [0][0][1][0][RTW89_FCC][27] = 78, ++ [0][0][1][0][RTW89_ETSI][27] = 58, ++ [0][0][1][0][RTW89_MKK][27] = 76, ++ [0][0][1][0][RTW89_IC][27] = 127, ++ [0][0][1][0][RTW89_KCC][27] = 74, ++ [0][0][1][0][RTW89_ACMA][27] = 127, ++ [0][0][1][0][RTW89_CHILE][27] = 66, ++ [0][0][1][0][RTW89_UKRAINE][27] = 52, ++ [0][0][1][0][RTW89_MEXICO][27] = 78, ++ [0][0][1][0][RTW89_CN][27] = 127, ++ [0][0][1][0][RTW89_QATAR][27] = 58, ++ [0][0][1][0][RTW89_UK][27] = 58, ++ [0][0][1][0][RTW89_FCC][29] = 78, ++ [0][0][1][0][RTW89_ETSI][29] = 58, ++ [0][0][1][0][RTW89_MKK][29] = 76, ++ [0][0][1][0][RTW89_IC][29] = 127, ++ [0][0][1][0][RTW89_KCC][29] = 74, ++ [0][0][1][0][RTW89_ACMA][29] = 127, ++ [0][0][1][0][RTW89_CHILE][29] = 66, ++ [0][0][1][0][RTW89_UKRAINE][29] = 52, ++ [0][0][1][0][RTW89_MEXICO][29] = 78, ++ [0][0][1][0][RTW89_CN][29] = 127, ++ [0][0][1][0][RTW89_QATAR][29] = 58, ++ [0][0][1][0][RTW89_UK][29] = 58, ++ [0][0][1][0][RTW89_FCC][31] = 78, ++ [0][0][1][0][RTW89_ETSI][31] = 58, ++ [0][0][1][0][RTW89_MKK][31] = 76, ++ [0][0][1][0][RTW89_IC][31] = 78, ++ [0][0][1][0][RTW89_KCC][31] = 72, ++ [0][0][1][0][RTW89_ACMA][31] = 58, ++ [0][0][1][0][RTW89_CHILE][31] = 66, ++ [0][0][1][0][RTW89_UKRAINE][31] = 52, ++ [0][0][1][0][RTW89_MEXICO][31] = 78, ++ [0][0][1][0][RTW89_CN][31] = 127, ++ [0][0][1][0][RTW89_QATAR][31] = 58, ++ [0][0][1][0][RTW89_UK][31] = 58, ++ [0][0][1][0][RTW89_FCC][33] = 78, ++ [0][0][1][0][RTW89_ETSI][33] = 58, ++ [0][0][1][0][RTW89_MKK][33] = 76, ++ [0][0][1][0][RTW89_IC][33] = 78, ++ [0][0][1][0][RTW89_KCC][33] = 72, ++ [0][0][1][0][RTW89_ACMA][33] = 58, ++ [0][0][1][0][RTW89_CHILE][33] = 66, ++ [0][0][1][0][RTW89_UKRAINE][33] = 52, ++ [0][0][1][0][RTW89_MEXICO][33] = 78, ++ [0][0][1][0][RTW89_CN][33] = 127, ++ [0][0][1][0][RTW89_QATAR][33] = 58, ++ [0][0][1][0][RTW89_UK][33] = 58, ++ [0][0][1][0][RTW89_FCC][35] = 70, ++ [0][0][1][0][RTW89_ETSI][35] = 58, ++ [0][0][1][0][RTW89_MKK][35] = 76, ++ [0][0][1][0][RTW89_IC][35] = 70, ++ [0][0][1][0][RTW89_KCC][35] = 72, ++ [0][0][1][0][RTW89_ACMA][35] = 58, ++ [0][0][1][0][RTW89_CHILE][35] = 66, ++ [0][0][1][0][RTW89_UKRAINE][35] = 52, ++ [0][0][1][0][RTW89_MEXICO][35] = 70, ++ [0][0][1][0][RTW89_CN][35] = 127, ++ [0][0][1][0][RTW89_QATAR][35] = 58, ++ [0][0][1][0][RTW89_UK][35] = 58, ++ [0][0][1][0][RTW89_FCC][37] = 78, ++ [0][0][1][0][RTW89_ETSI][37] = 127, ++ [0][0][1][0][RTW89_MKK][37] = 76, ++ [0][0][1][0][RTW89_IC][37] = 78, ++ [0][0][1][0][RTW89_KCC][37] = 72, ++ [0][0][1][0][RTW89_ACMA][37] = 76, ++ [0][0][1][0][RTW89_CHILE][37] = 68, ++ [0][0][1][0][RTW89_UKRAINE][37] = 127, ++ [0][0][1][0][RTW89_MEXICO][37] = 78, ++ [0][0][1][0][RTW89_CN][37] = 127, ++ [0][0][1][0][RTW89_QATAR][37] = 127, ++ [0][0][1][0][RTW89_UK][37] = 76, ++ [0][0][1][0][RTW89_FCC][38] = 78, ++ [0][0][1][0][RTW89_ETSI][38] = 28, ++ [0][0][1][0][RTW89_MKK][38] = 127, ++ [0][0][1][0][RTW89_IC][38] = 78, ++ [0][0][1][0][RTW89_KCC][38] = 74, ++ [0][0][1][0][RTW89_ACMA][38] = 76, ++ [0][0][1][0][RTW89_CHILE][38] = 68, ++ [0][0][1][0][RTW89_UKRAINE][38] = 28, ++ [0][0][1][0][RTW89_MEXICO][38] = 78, ++ [0][0][1][0][RTW89_CN][38] = 76, ++ [0][0][1][0][RTW89_QATAR][38] = 28, ++ [0][0][1][0][RTW89_UK][38] = 58, ++ [0][0][1][0][RTW89_FCC][40] = 78, ++ [0][0][1][0][RTW89_ETSI][40] = 28, ++ [0][0][1][0][RTW89_MKK][40] = 127, ++ [0][0][1][0][RTW89_IC][40] = 78, ++ [0][0][1][0][RTW89_KCC][40] = 74, ++ [0][0][1][0][RTW89_ACMA][40] = 76, ++ [0][0][1][0][RTW89_CHILE][40] = 68, ++ [0][0][1][0][RTW89_UKRAINE][40] = 28, ++ [0][0][1][0][RTW89_MEXICO][40] = 78, ++ [0][0][1][0][RTW89_CN][40] = 76, ++ [0][0][1][0][RTW89_QATAR][40] = 28, ++ [0][0][1][0][RTW89_UK][40] = 58, ++ [0][0][1][0][RTW89_FCC][42] = 78, ++ [0][0][1][0][RTW89_ETSI][42] = 28, ++ [0][0][1][0][RTW89_MKK][42] = 127, ++ [0][0][1][0][RTW89_IC][42] = 78, ++ [0][0][1][0][RTW89_KCC][42] = 74, ++ [0][0][1][0][RTW89_ACMA][42] = 76, ++ [0][0][1][0][RTW89_CHILE][42] = 66, ++ [0][0][1][0][RTW89_UKRAINE][42] = 28, ++ [0][0][1][0][RTW89_MEXICO][42] = 78, ++ [0][0][1][0][RTW89_CN][42] = 76, ++ [0][0][1][0][RTW89_QATAR][42] = 28, ++ [0][0][1][0][RTW89_UK][42] = 58, ++ [0][0][1][0][RTW89_FCC][44] = 78, ++ [0][0][1][0][RTW89_ETSI][44] = 28, ++ [0][0][1][0][RTW89_MKK][44] = 127, ++ [0][0][1][0][RTW89_IC][44] = 78, ++ [0][0][1][0][RTW89_KCC][44] = 74, ++ [0][0][1][0][RTW89_ACMA][44] = 76, ++ [0][0][1][0][RTW89_CHILE][44] = 68, ++ [0][0][1][0][RTW89_UKRAINE][44] = 28, ++ [0][0][1][0][RTW89_MEXICO][44] = 78, ++ [0][0][1][0][RTW89_CN][44] = 76, ++ [0][0][1][0][RTW89_QATAR][44] = 28, ++ [0][0][1][0][RTW89_UK][44] = 58, ++ [0][0][1][0][RTW89_FCC][46] = 78, ++ [0][0][1][0][RTW89_ETSI][46] = 28, ++ [0][0][1][0][RTW89_MKK][46] = 127, ++ [0][0][1][0][RTW89_IC][46] = 78, ++ [0][0][1][0][RTW89_KCC][46] = 74, ++ [0][0][1][0][RTW89_ACMA][46] = 76, ++ [0][0][1][0][RTW89_CHILE][46] = 68, ++ [0][0][1][0][RTW89_UKRAINE][46] = 28, ++ [0][0][1][0][RTW89_MEXICO][46] = 78, ++ [0][0][1][0][RTW89_CN][46] = 76, ++ [0][0][1][0][RTW89_QATAR][46] = 28, ++ [0][0][1][0][RTW89_UK][46] = 58, ++ [0][0][1][0][RTW89_FCC][48] = 78, ++ [0][0][1][0][RTW89_ETSI][48] = 127, ++ [0][0][1][0][RTW89_MKK][48] = 127, ++ [0][0][1][0][RTW89_IC][48] = 127, ++ [0][0][1][0][RTW89_KCC][48] = 127, ++ [0][0][1][0][RTW89_ACMA][48] = 127, ++ [0][0][1][0][RTW89_CHILE][48] = 127, ++ [0][0][1][0][RTW89_UKRAINE][48] = 127, ++ [0][0][1][0][RTW89_MEXICO][48] = 127, ++ [0][0][1][0][RTW89_CN][48] = 127, ++ [0][0][1][0][RTW89_QATAR][48] = 127, ++ [0][0][1][0][RTW89_UK][48] = 127, ++ [0][0][1][0][RTW89_FCC][50] = 78, ++ [0][0][1][0][RTW89_ETSI][50] = 127, ++ [0][0][1][0][RTW89_MKK][50] = 127, ++ [0][0][1][0][RTW89_IC][50] = 127, ++ [0][0][1][0][RTW89_KCC][50] = 127, ++ [0][0][1][0][RTW89_ACMA][50] = 127, ++ [0][0][1][0][RTW89_CHILE][50] = 127, ++ [0][0][1][0][RTW89_UKRAINE][50] = 127, ++ [0][0][1][0][RTW89_MEXICO][50] = 127, ++ [0][0][1][0][RTW89_CN][50] = 127, ++ [0][0][1][0][RTW89_QATAR][50] = 127, ++ [0][0][1][0][RTW89_UK][50] = 127, ++ [0][0][1][0][RTW89_FCC][52] = 78, ++ [0][0][1][0][RTW89_ETSI][52] = 127, ++ [0][0][1][0][RTW89_MKK][52] = 127, ++ [0][0][1][0][RTW89_IC][52] = 127, ++ [0][0][1][0][RTW89_KCC][52] = 127, ++ [0][0][1][0][RTW89_ACMA][52] = 127, ++ [0][0][1][0][RTW89_CHILE][52] = 127, ++ [0][0][1][0][RTW89_UKRAINE][52] = 127, ++ [0][0][1][0][RTW89_MEXICO][52] = 127, ++ [0][0][1][0][RTW89_CN][52] = 127, ++ [0][0][1][0][RTW89_QATAR][52] = 127, ++ [0][0][1][0][RTW89_UK][52] = 127, ++ [0][1][1][0][RTW89_FCC][0] = 68, ++ [0][1][1][0][RTW89_ETSI][0] = 46, ++ [0][1][1][0][RTW89_MKK][0] = 48, ++ [0][1][1][0][RTW89_IC][0] = 40, ++ [0][1][1][0][RTW89_KCC][0] = 64, ++ [0][1][1][0][RTW89_ACMA][0] = 46, ++ [0][1][1][0][RTW89_CHILE][0] = 30, ++ [0][1][1][0][RTW89_UKRAINE][0] = 40, ++ [0][1][1][0][RTW89_MEXICO][0] = 50, ++ [0][1][1][0][RTW89_CN][0] = 46, ++ [0][1][1][0][RTW89_QATAR][0] = 46, ++ [0][1][1][0][RTW89_UK][0] = 46, ++ [0][1][1][0][RTW89_FCC][2] = 68, ++ [0][1][1][0][RTW89_ETSI][2] = 46, ++ [0][1][1][0][RTW89_MKK][2] = 48, ++ [0][1][1][0][RTW89_IC][2] = 40, ++ [0][1][1][0][RTW89_KCC][2] = 64, ++ [0][1][1][0][RTW89_ACMA][2] = 46, ++ [0][1][1][0][RTW89_CHILE][2] = 32, ++ [0][1][1][0][RTW89_UKRAINE][2] = 40, ++ [0][1][1][0][RTW89_MEXICO][2] = 50, ++ [0][1][1][0][RTW89_CN][2] = 46, ++ [0][1][1][0][RTW89_QATAR][2] = 46, ++ [0][1][1][0][RTW89_UK][2] = 46, ++ [0][1][1][0][RTW89_FCC][4] = 68, ++ [0][1][1][0][RTW89_ETSI][4] = 46, ++ [0][1][1][0][RTW89_MKK][4] = 48, ++ [0][1][1][0][RTW89_IC][4] = 40, ++ [0][1][1][0][RTW89_KCC][4] = 64, ++ [0][1][1][0][RTW89_ACMA][4] = 46, ++ [0][1][1][0][RTW89_CHILE][4] = 30, ++ [0][1][1][0][RTW89_UKRAINE][4] = 40, ++ [0][1][1][0][RTW89_MEXICO][4] = 50, ++ [0][1][1][0][RTW89_CN][4] = 46, ++ [0][1][1][0][RTW89_QATAR][4] = 46, ++ [0][1][1][0][RTW89_UK][4] = 46, ++ [0][1][1][0][RTW89_FCC][6] = 68, ++ [0][1][1][0][RTW89_ETSI][6] = 46, ++ [0][1][1][0][RTW89_MKK][6] = 48, ++ [0][1][1][0][RTW89_IC][6] = 40, ++ [0][1][1][0][RTW89_KCC][6] = 38, ++ [0][1][1][0][RTW89_ACMA][6] = 46, ++ [0][1][1][0][RTW89_CHILE][6] = 30, ++ [0][1][1][0][RTW89_UKRAINE][6] = 40, ++ [0][1][1][0][RTW89_MEXICO][6] = 50, ++ [0][1][1][0][RTW89_CN][6] = 46, ++ [0][1][1][0][RTW89_QATAR][6] = 46, ++ [0][1][1][0][RTW89_UK][6] = 46, ++ [0][1][1][0][RTW89_FCC][8] = 68, ++ [0][1][1][0][RTW89_ETSI][8] = 46, ++ [0][1][1][0][RTW89_MKK][8] = 48, ++ [0][1][1][0][RTW89_IC][8] = 52, ++ [0][1][1][0][RTW89_KCC][8] = 64, ++ [0][1][1][0][RTW89_ACMA][8] = 46, ++ [0][1][1][0][RTW89_CHILE][8] = 52, ++ [0][1][1][0][RTW89_UKRAINE][8] = 40, ++ [0][1][1][0][RTW89_MEXICO][8] = 68, ++ [0][1][1][0][RTW89_CN][8] = 46, ++ [0][1][1][0][RTW89_QATAR][8] = 46, ++ [0][1][1][0][RTW89_UK][8] = 46, ++ [0][1][1][0][RTW89_FCC][10] = 68, ++ [0][1][1][0][RTW89_ETSI][10] = 46, ++ [0][1][1][0][RTW89_MKK][10] = 48, ++ [0][1][1][0][RTW89_IC][10] = 52, ++ [0][1][1][0][RTW89_KCC][10] = 64, ++ [0][1][1][0][RTW89_ACMA][10] = 46, ++ [0][1][1][0][RTW89_CHILE][10] = 52, ++ [0][1][1][0][RTW89_UKRAINE][10] = 40, ++ [0][1][1][0][RTW89_MEXICO][10] = 68, ++ [0][1][1][0][RTW89_CN][10] = 46, ++ [0][1][1][0][RTW89_QATAR][10] = 46, ++ [0][1][1][0][RTW89_UK][10] = 46, ++ [0][1][1][0][RTW89_FCC][12] = 68, ++ [0][1][1][0][RTW89_ETSI][12] = 46, ++ [0][1][1][0][RTW89_MKK][12] = 48, ++ [0][1][1][0][RTW89_IC][12] = 52, ++ [0][1][1][0][RTW89_KCC][12] = 64, ++ [0][1][1][0][RTW89_ACMA][12] = 46, ++ [0][1][1][0][RTW89_CHILE][12] = 52, ++ [0][1][1][0][RTW89_UKRAINE][12] = 40, ++ [0][1][1][0][RTW89_MEXICO][12] = 68, ++ [0][1][1][0][RTW89_CN][12] = 46, ++ [0][1][1][0][RTW89_QATAR][12] = 46, ++ [0][1][1][0][RTW89_UK][12] = 46, ++ [0][1][1][0][RTW89_FCC][14] = 68, ++ [0][1][1][0][RTW89_ETSI][14] = 46, ++ [0][1][1][0][RTW89_MKK][14] = 48, ++ [0][1][1][0][RTW89_IC][14] = 52, ++ [0][1][1][0][RTW89_KCC][14] = 64, ++ [0][1][1][0][RTW89_ACMA][14] = 46, ++ [0][1][1][0][RTW89_CHILE][14] = 52, ++ [0][1][1][0][RTW89_UKRAINE][14] = 40, ++ [0][1][1][0][RTW89_MEXICO][14] = 68, ++ [0][1][1][0][RTW89_CN][14] = 46, ++ [0][1][1][0][RTW89_QATAR][14] = 46, ++ [0][1][1][0][RTW89_UK][14] = 46, ++ [0][1][1][0][RTW89_FCC][15] = 66, ++ [0][1][1][0][RTW89_ETSI][15] = 46, ++ [0][1][1][0][RTW89_MKK][15] = 68, ++ [0][1][1][0][RTW89_IC][15] = 66, ++ [0][1][1][0][RTW89_KCC][15] = 62, ++ [0][1][1][0][RTW89_ACMA][15] = 46, ++ [0][1][1][0][RTW89_CHILE][15] = 48, ++ [0][1][1][0][RTW89_UKRAINE][15] = 40, ++ [0][1][1][0][RTW89_MEXICO][15] = 66, ++ [0][1][1][0][RTW89_CN][15] = 127, ++ [0][1][1][0][RTW89_QATAR][15] = 46, ++ [0][1][1][0][RTW89_UK][15] = 46, ++ [0][1][1][0][RTW89_FCC][17] = 68, ++ [0][1][1][0][RTW89_ETSI][17] = 46, ++ [0][1][1][0][RTW89_MKK][17] = 70, ++ [0][1][1][0][RTW89_IC][17] = 68, ++ [0][1][1][0][RTW89_KCC][17] = 62, ++ [0][1][1][0][RTW89_ACMA][17] = 46, ++ [0][1][1][0][RTW89_CHILE][17] = 48, ++ [0][1][1][0][RTW89_UKRAINE][17] = 40, ++ [0][1][1][0][RTW89_MEXICO][17] = 68, ++ [0][1][1][0][RTW89_CN][17] = 127, ++ [0][1][1][0][RTW89_QATAR][17] = 46, ++ [0][1][1][0][RTW89_UK][17] = 46, ++ [0][1][1][0][RTW89_FCC][19] = 68, ++ [0][1][1][0][RTW89_ETSI][19] = 46, ++ [0][1][1][0][RTW89_MKK][19] = 70, ++ [0][1][1][0][RTW89_IC][19] = 68, ++ [0][1][1][0][RTW89_KCC][19] = 62, ++ [0][1][1][0][RTW89_ACMA][19] = 46, ++ [0][1][1][0][RTW89_CHILE][19] = 48, ++ [0][1][1][0][RTW89_UKRAINE][19] = 40, ++ [0][1][1][0][RTW89_MEXICO][19] = 68, ++ [0][1][1][0][RTW89_CN][19] = 127, ++ [0][1][1][0][RTW89_QATAR][19] = 46, ++ [0][1][1][0][RTW89_UK][19] = 46, ++ [0][1][1][0][RTW89_FCC][21] = 68, ++ [0][1][1][0][RTW89_ETSI][21] = 46, ++ [0][1][1][0][RTW89_MKK][21] = 70, ++ [0][1][1][0][RTW89_IC][21] = 68, ++ [0][1][1][0][RTW89_KCC][21] = 62, ++ [0][1][1][0][RTW89_ACMA][21] = 46, ++ [0][1][1][0][RTW89_CHILE][21] = 48, ++ [0][1][1][0][RTW89_UKRAINE][21] = 40, ++ [0][1][1][0][RTW89_MEXICO][21] = 68, ++ [0][1][1][0][RTW89_CN][21] = 127, ++ [0][1][1][0][RTW89_QATAR][21] = 46, ++ [0][1][1][0][RTW89_UK][21] = 46, ++ [0][1][1][0][RTW89_FCC][23] = 68, ++ [0][1][1][0][RTW89_ETSI][23] = 46, ++ [0][1][1][0][RTW89_MKK][23] = 70, ++ [0][1][1][0][RTW89_IC][23] = 68, ++ [0][1][1][0][RTW89_KCC][23] = 62, ++ [0][1][1][0][RTW89_ACMA][23] = 46, ++ [0][1][1][0][RTW89_CHILE][23] = 48, ++ [0][1][1][0][RTW89_UKRAINE][23] = 40, ++ [0][1][1][0][RTW89_MEXICO][23] = 68, ++ [0][1][1][0][RTW89_CN][23] = 127, ++ [0][1][1][0][RTW89_QATAR][23] = 46, ++ [0][1][1][0][RTW89_UK][23] = 46, ++ [0][1][1][0][RTW89_FCC][25] = 68, ++ [0][1][1][0][RTW89_ETSI][25] = 46, ++ [0][1][1][0][RTW89_MKK][25] = 68, ++ [0][1][1][0][RTW89_IC][25] = 127, ++ [0][1][1][0][RTW89_KCC][25] = 62, ++ [0][1][1][0][RTW89_ACMA][25] = 127, ++ [0][1][1][0][RTW89_CHILE][25] = 48, ++ [0][1][1][0][RTW89_UKRAINE][25] = 40, ++ [0][1][1][0][RTW89_MEXICO][25] = 68, ++ [0][1][1][0][RTW89_CN][25] = 127, ++ [0][1][1][0][RTW89_QATAR][25] = 46, ++ [0][1][1][0][RTW89_UK][25] = 46, ++ [0][1][1][0][RTW89_FCC][27] = 68, ++ [0][1][1][0][RTW89_ETSI][27] = 46, ++ [0][1][1][0][RTW89_MKK][27] = 70, ++ [0][1][1][0][RTW89_IC][27] = 127, ++ [0][1][1][0][RTW89_KCC][27] = 62, ++ [0][1][1][0][RTW89_ACMA][27] = 127, ++ [0][1][1][0][RTW89_CHILE][27] = 50, ++ [0][1][1][0][RTW89_UKRAINE][27] = 40, ++ [0][1][1][0][RTW89_MEXICO][27] = 68, ++ [0][1][1][0][RTW89_CN][27] = 127, ++ [0][1][1][0][RTW89_QATAR][27] = 46, ++ [0][1][1][0][RTW89_UK][27] = 46, ++ [0][1][1][0][RTW89_FCC][29] = 68, ++ [0][1][1][0][RTW89_ETSI][29] = 46, ++ [0][1][1][0][RTW89_MKK][29] = 70, ++ [0][1][1][0][RTW89_IC][29] = 127, ++ [0][1][1][0][RTW89_KCC][29] = 62, ++ [0][1][1][0][RTW89_ACMA][29] = 127, ++ [0][1][1][0][RTW89_CHILE][29] = 50, ++ [0][1][1][0][RTW89_UKRAINE][29] = 40, ++ [0][1][1][0][RTW89_MEXICO][29] = 68, ++ [0][1][1][0][RTW89_CN][29] = 127, ++ [0][1][1][0][RTW89_QATAR][29] = 46, ++ [0][1][1][0][RTW89_UK][29] = 46, ++ [0][1][1][0][RTW89_FCC][31] = 68, ++ [0][1][1][0][RTW89_ETSI][31] = 46, ++ [0][1][1][0][RTW89_MKK][31] = 70, ++ [0][1][1][0][RTW89_IC][31] = 68, ++ [0][1][1][0][RTW89_KCC][31] = 62, ++ [0][1][1][0][RTW89_ACMA][31] = 46, ++ [0][1][1][0][RTW89_CHILE][31] = 50, ++ [0][1][1][0][RTW89_UKRAINE][31] = 40, ++ [0][1][1][0][RTW89_MEXICO][31] = 68, ++ [0][1][1][0][RTW89_CN][31] = 127, ++ [0][1][1][0][RTW89_QATAR][31] = 46, ++ [0][1][1][0][RTW89_UK][31] = 46, ++ [0][1][1][0][RTW89_FCC][33] = 68, ++ [0][1][1][0][RTW89_ETSI][33] = 46, ++ [0][1][1][0][RTW89_MKK][33] = 70, ++ [0][1][1][0][RTW89_IC][33] = 68, ++ [0][1][1][0][RTW89_KCC][33] = 62, ++ [0][1][1][0][RTW89_ACMA][33] = 46, ++ [0][1][1][0][RTW89_CHILE][33] = 50, ++ [0][1][1][0][RTW89_UKRAINE][33] = 40, ++ [0][1][1][0][RTW89_MEXICO][33] = 68, ++ [0][1][1][0][RTW89_CN][33] = 127, ++ [0][1][1][0][RTW89_QATAR][33] = 46, ++ [0][1][1][0][RTW89_UK][33] = 46, ++ [0][1][1][0][RTW89_FCC][35] = 66, ++ [0][1][1][0][RTW89_ETSI][35] = 46, ++ [0][1][1][0][RTW89_MKK][35] = 70, ++ [0][1][1][0][RTW89_IC][35] = 66, ++ [0][1][1][0][RTW89_KCC][35] = 62, ++ [0][1][1][0][RTW89_ACMA][35] = 46, ++ [0][1][1][0][RTW89_CHILE][35] = 50, ++ [0][1][1][0][RTW89_UKRAINE][35] = 40, ++ [0][1][1][0][RTW89_MEXICO][35] = 66, ++ [0][1][1][0][RTW89_CN][35] = 127, ++ [0][1][1][0][RTW89_QATAR][35] = 46, ++ [0][1][1][0][RTW89_UK][35] = 46, ++ [0][1][1][0][RTW89_FCC][37] = 68, ++ [0][1][1][0][RTW89_ETSI][37] = 127, ++ [0][1][1][0][RTW89_MKK][37] = 70, ++ [0][1][1][0][RTW89_IC][37] = 68, ++ [0][1][1][0][RTW89_KCC][37] = 62, ++ [0][1][1][0][RTW89_ACMA][37] = 70, ++ [0][1][1][0][RTW89_CHILE][37] = 50, ++ [0][1][1][0][RTW89_UKRAINE][37] = 127, ++ [0][1][1][0][RTW89_MEXICO][37] = 68, ++ [0][1][1][0][RTW89_CN][37] = 127, ++ [0][1][1][0][RTW89_QATAR][37] = 127, ++ [0][1][1][0][RTW89_UK][37] = 76, ++ [0][1][1][0][RTW89_FCC][38] = 78, ++ [0][1][1][0][RTW89_ETSI][38] = 16, ++ [0][1][1][0][RTW89_MKK][38] = 127, ++ [0][1][1][0][RTW89_IC][38] = 78, ++ [0][1][1][0][RTW89_KCC][38] = 60, ++ [0][1][1][0][RTW89_ACMA][38] = 72, ++ [0][1][1][0][RTW89_CHILE][38] = 48, ++ [0][1][1][0][RTW89_UKRAINE][38] = 16, ++ [0][1][1][0][RTW89_MEXICO][38] = 78, ++ [0][1][1][0][RTW89_CN][38] = 76, ++ [0][1][1][0][RTW89_QATAR][38] = 16, ++ [0][1][1][0][RTW89_UK][38] = 46, ++ [0][1][1][0][RTW89_FCC][40] = 78, ++ [0][1][1][0][RTW89_ETSI][40] = 16, ++ [0][1][1][0][RTW89_MKK][40] = 127, ++ [0][1][1][0][RTW89_IC][40] = 78, ++ [0][1][1][0][RTW89_KCC][40] = 60, ++ [0][1][1][0][RTW89_ACMA][40] = 72, ++ [0][1][1][0][RTW89_CHILE][40] = 48, ++ [0][1][1][0][RTW89_UKRAINE][40] = 16, ++ [0][1][1][0][RTW89_MEXICO][40] = 78, ++ [0][1][1][0][RTW89_CN][40] = 76, ++ [0][1][1][0][RTW89_QATAR][40] = 16, ++ [0][1][1][0][RTW89_UK][40] = 46, ++ [0][1][1][0][RTW89_FCC][42] = 78, ++ [0][1][1][0][RTW89_ETSI][42] = 16, ++ [0][1][1][0][RTW89_MKK][42] = 127, ++ [0][1][1][0][RTW89_IC][42] = 78, ++ [0][1][1][0][RTW89_KCC][42] = 60, ++ [0][1][1][0][RTW89_ACMA][42] = 76, ++ [0][1][1][0][RTW89_CHILE][42] = 48, ++ [0][1][1][0][RTW89_UKRAINE][42] = 16, ++ [0][1][1][0][RTW89_MEXICO][42] = 78, ++ [0][1][1][0][RTW89_CN][42] = 76, ++ [0][1][1][0][RTW89_QATAR][42] = 16, ++ [0][1][1][0][RTW89_UK][42] = 46, ++ [0][1][1][0][RTW89_FCC][44] = 78, ++ [0][1][1][0][RTW89_ETSI][44] = 16, ++ [0][1][1][0][RTW89_MKK][44] = 127, ++ [0][1][1][0][RTW89_IC][44] = 78, ++ [0][1][1][0][RTW89_KCC][44] = 60, ++ [0][1][1][0][RTW89_ACMA][44] = 76, ++ [0][1][1][0][RTW89_CHILE][44] = 48, ++ [0][1][1][0][RTW89_UKRAINE][44] = 16, ++ [0][1][1][0][RTW89_MEXICO][44] = 78, ++ [0][1][1][0][RTW89_CN][44] = 76, ++ [0][1][1][0][RTW89_QATAR][44] = 16, ++ [0][1][1][0][RTW89_UK][44] = 46, ++ [0][1][1][0][RTW89_FCC][46] = 78, ++ [0][1][1][0][RTW89_ETSI][46] = 16, ++ [0][1][1][0][RTW89_MKK][46] = 127, ++ [0][1][1][0][RTW89_IC][46] = 78, ++ [0][1][1][0][RTW89_KCC][46] = 60, ++ [0][1][1][0][RTW89_ACMA][46] = 76, ++ [0][1][1][0][RTW89_CHILE][46] = 48, ++ [0][1][1][0][RTW89_UKRAINE][46] = 16, ++ [0][1][1][0][RTW89_MEXICO][46] = 78, ++ [0][1][1][0][RTW89_CN][46] = 76, ++ [0][1][1][0][RTW89_QATAR][46] = 16, ++ [0][1][1][0][RTW89_UK][46] = 46, ++ [0][1][1][0][RTW89_FCC][48] = 56, ++ [0][1][1][0][RTW89_ETSI][48] = 127, ++ [0][1][1][0][RTW89_MKK][48] = 127, ++ [0][1][1][0][RTW89_IC][48] = 127, ++ [0][1][1][0][RTW89_KCC][48] = 127, ++ [0][1][1][0][RTW89_ACMA][48] = 127, ++ [0][1][1][0][RTW89_CHILE][48] = 127, ++ [0][1][1][0][RTW89_UKRAINE][48] = 127, ++ [0][1][1][0][RTW89_MEXICO][48] = 127, ++ [0][1][1][0][RTW89_CN][48] = 127, ++ [0][1][1][0][RTW89_QATAR][48] = 127, ++ [0][1][1][0][RTW89_UK][48] = 127, ++ [0][1][1][0][RTW89_FCC][50] = 56, ++ [0][1][1][0][RTW89_ETSI][50] = 127, ++ [0][1][1][0][RTW89_MKK][50] = 127, ++ [0][1][1][0][RTW89_IC][50] = 127, ++ [0][1][1][0][RTW89_KCC][50] = 127, ++ [0][1][1][0][RTW89_ACMA][50] = 127, ++ [0][1][1][0][RTW89_CHILE][50] = 127, ++ [0][1][1][0][RTW89_UKRAINE][50] = 127, ++ [0][1][1][0][RTW89_MEXICO][50] = 127, ++ [0][1][1][0][RTW89_CN][50] = 127, ++ [0][1][1][0][RTW89_QATAR][50] = 127, ++ [0][1][1][0][RTW89_UK][50] = 127, ++ [0][1][1][0][RTW89_FCC][52] = 56, ++ [0][1][1][0][RTW89_ETSI][52] = 127, ++ [0][1][1][0][RTW89_MKK][52] = 127, ++ [0][1][1][0][RTW89_IC][52] = 127, ++ [0][1][1][0][RTW89_KCC][52] = 127, ++ [0][1][1][0][RTW89_ACMA][52] = 127, ++ [0][1][1][0][RTW89_CHILE][52] = 127, ++ [0][1][1][0][RTW89_UKRAINE][52] = 127, ++ [0][1][1][0][RTW89_MEXICO][52] = 127, ++ [0][1][1][0][RTW89_CN][52] = 127, ++ [0][1][1][0][RTW89_QATAR][52] = 127, ++ [0][1][1][0][RTW89_UK][52] = 127, ++ [0][0][2][0][RTW89_FCC][0] = 78, ++ [0][0][2][0][RTW89_ETSI][0] = 60, ++ [0][0][2][0][RTW89_MKK][0] = 62, ++ [0][0][2][0][RTW89_IC][0] = 64, ++ [0][0][2][0][RTW89_KCC][0] = 74, ++ [0][0][2][0][RTW89_ACMA][0] = 60, ++ [0][0][2][0][RTW89_CHILE][0] = 42, ++ [0][0][2][0][RTW89_UKRAINE][0] = 52, ++ [0][0][2][0][RTW89_MEXICO][0] = 62, ++ [0][0][2][0][RTW89_CN][0] = 60, ++ [0][0][2][0][RTW89_QATAR][0] = 60, ++ [0][0][2][0][RTW89_UK][0] = 60, ++ [0][0][2][0][RTW89_FCC][2] = 78, ++ [0][0][2][0][RTW89_ETSI][2] = 60, ++ [0][0][2][0][RTW89_MKK][2] = 62, ++ [0][0][2][0][RTW89_IC][2] = 64, ++ [0][0][2][0][RTW89_KCC][2] = 74, ++ [0][0][2][0][RTW89_ACMA][2] = 60, ++ [0][0][2][0][RTW89_CHILE][2] = 42, ++ [0][0][2][0][RTW89_UKRAINE][2] = 52, ++ [0][0][2][0][RTW89_MEXICO][2] = 62, ++ [0][0][2][0][RTW89_CN][2] = 60, ++ [0][0][2][0][RTW89_QATAR][2] = 60, ++ [0][0][2][0][RTW89_UK][2] = 60, ++ [0][0][2][0][RTW89_FCC][4] = 78, ++ [0][0][2][0][RTW89_ETSI][4] = 60, ++ [0][0][2][0][RTW89_MKK][4] = 62, ++ [0][0][2][0][RTW89_IC][4] = 64, ++ [0][0][2][0][RTW89_KCC][4] = 74, ++ [0][0][2][0][RTW89_ACMA][4] = 60, ++ [0][0][2][0][RTW89_CHILE][4] = 42, ++ [0][0][2][0][RTW89_UKRAINE][4] = 52, ++ [0][0][2][0][RTW89_MEXICO][4] = 62, ++ [0][0][2][0][RTW89_CN][4] = 60, ++ [0][0][2][0][RTW89_QATAR][4] = 60, ++ [0][0][2][0][RTW89_UK][4] = 60, ++ [0][0][2][0][RTW89_FCC][6] = 78, ++ [0][0][2][0][RTW89_ETSI][6] = 60, ++ [0][0][2][0][RTW89_MKK][6] = 62, ++ [0][0][2][0][RTW89_IC][6] = 64, ++ [0][0][2][0][RTW89_KCC][6] = 50, ++ [0][0][2][0][RTW89_ACMA][6] = 60, ++ [0][0][2][0][RTW89_CHILE][6] = 42, ++ [0][0][2][0][RTW89_UKRAINE][6] = 52, ++ [0][0][2][0][RTW89_MEXICO][6] = 62, ++ [0][0][2][0][RTW89_CN][6] = 60, ++ [0][0][2][0][RTW89_QATAR][6] = 60, ++ [0][0][2][0][RTW89_UK][6] = 60, ++ [0][0][2][0][RTW89_FCC][8] = 78, ++ [0][0][2][0][RTW89_ETSI][8] = 60, ++ [0][0][2][0][RTW89_MKK][8] = 62, ++ [0][0][2][0][RTW89_IC][8] = 64, ++ [0][0][2][0][RTW89_KCC][8] = 74, ++ [0][0][2][0][RTW89_ACMA][8] = 60, ++ [0][0][2][0][RTW89_CHILE][8] = 66, ++ [0][0][2][0][RTW89_UKRAINE][8] = 52, ++ [0][0][2][0][RTW89_MEXICO][8] = 78, ++ [0][0][2][0][RTW89_CN][8] = 60, ++ [0][0][2][0][RTW89_QATAR][8] = 60, ++ [0][0][2][0][RTW89_UK][8] = 60, ++ [0][0][2][0][RTW89_FCC][10] = 78, ++ [0][0][2][0][RTW89_ETSI][10] = 60, ++ [0][0][2][0][RTW89_MKK][10] = 62, ++ [0][0][2][0][RTW89_IC][10] = 64, ++ [0][0][2][0][RTW89_KCC][10] = 74, ++ [0][0][2][0][RTW89_ACMA][10] = 60, ++ [0][0][2][0][RTW89_CHILE][10] = 66, ++ [0][0][2][0][RTW89_UKRAINE][10] = 52, ++ [0][0][2][0][RTW89_MEXICO][10] = 78, ++ [0][0][2][0][RTW89_CN][10] = 60, ++ [0][0][2][0][RTW89_QATAR][10] = 60, ++ [0][0][2][0][RTW89_UK][10] = 60, ++ [0][0][2][0][RTW89_FCC][12] = 78, ++ [0][0][2][0][RTW89_ETSI][12] = 60, ++ [0][0][2][0][RTW89_MKK][12] = 62, ++ [0][0][2][0][RTW89_IC][12] = 64, ++ [0][0][2][0][RTW89_KCC][12] = 74, ++ [0][0][2][0][RTW89_ACMA][12] = 60, ++ [0][0][2][0][RTW89_CHILE][12] = 66, ++ [0][0][2][0][RTW89_UKRAINE][12] = 52, ++ [0][0][2][0][RTW89_MEXICO][12] = 78, ++ [0][0][2][0][RTW89_CN][12] = 60, ++ [0][0][2][0][RTW89_QATAR][12] = 60, ++ [0][0][2][0][RTW89_UK][12] = 60, ++ [0][0][2][0][RTW89_FCC][14] = 78, ++ [0][0][2][0][RTW89_ETSI][14] = 60, ++ [0][0][2][0][RTW89_MKK][14] = 62, ++ [0][0][2][0][RTW89_IC][14] = 64, ++ [0][0][2][0][RTW89_KCC][14] = 74, ++ [0][0][2][0][RTW89_ACMA][14] = 60, ++ [0][0][2][0][RTW89_CHILE][14] = 66, ++ [0][0][2][0][RTW89_UKRAINE][14] = 52, ++ [0][0][2][0][RTW89_MEXICO][14] = 78, ++ [0][0][2][0][RTW89_CN][14] = 60, ++ [0][0][2][0][RTW89_QATAR][14] = 60, ++ [0][0][2][0][RTW89_UK][14] = 60, ++ [0][0][2][0][RTW89_FCC][15] = 74, ++ [0][0][2][0][RTW89_ETSI][15] = 60, ++ [0][0][2][0][RTW89_MKK][15] = 76, ++ [0][0][2][0][RTW89_IC][15] = 74, ++ [0][0][2][0][RTW89_KCC][15] = 74, ++ [0][0][2][0][RTW89_ACMA][15] = 60, ++ [0][0][2][0][RTW89_CHILE][15] = 64, ++ [0][0][2][0][RTW89_UKRAINE][15] = 52, ++ [0][0][2][0][RTW89_MEXICO][15] = 74, ++ [0][0][2][0][RTW89_CN][15] = 127, ++ [0][0][2][0][RTW89_QATAR][15] = 60, ++ [0][0][2][0][RTW89_UK][15] = 60, ++ [0][0][2][0][RTW89_FCC][17] = 78, ++ [0][0][2][0][RTW89_ETSI][17] = 60, ++ [0][0][2][0][RTW89_MKK][17] = 76, ++ [0][0][2][0][RTW89_IC][17] = 78, ++ [0][0][2][0][RTW89_KCC][17] = 74, ++ [0][0][2][0][RTW89_ACMA][17] = 60, ++ [0][0][2][0][RTW89_CHILE][17] = 64, ++ [0][0][2][0][RTW89_UKRAINE][17] = 52, ++ [0][0][2][0][RTW89_MEXICO][17] = 78, ++ [0][0][2][0][RTW89_CN][17] = 127, ++ [0][0][2][0][RTW89_QATAR][17] = 60, ++ [0][0][2][0][RTW89_UK][17] = 60, ++ [0][0][2][0][RTW89_FCC][19] = 78, ++ [0][0][2][0][RTW89_ETSI][19] = 60, ++ [0][0][2][0][RTW89_MKK][19] = 76, ++ [0][0][2][0][RTW89_IC][19] = 78, ++ [0][0][2][0][RTW89_KCC][19] = 74, ++ [0][0][2][0][RTW89_ACMA][19] = 60, ++ [0][0][2][0][RTW89_CHILE][19] = 64, ++ [0][0][2][0][RTW89_UKRAINE][19] = 52, ++ [0][0][2][0][RTW89_MEXICO][19] = 78, ++ [0][0][2][0][RTW89_CN][19] = 127, ++ [0][0][2][0][RTW89_QATAR][19] = 60, ++ [0][0][2][0][RTW89_UK][19] = 60, ++ [0][0][2][0][RTW89_FCC][21] = 78, ++ [0][0][2][0][RTW89_ETSI][21] = 60, ++ [0][0][2][0][RTW89_MKK][21] = 76, ++ [0][0][2][0][RTW89_IC][21] = 78, ++ [0][0][2][0][RTW89_KCC][21] = 74, ++ [0][0][2][0][RTW89_ACMA][21] = 60, ++ [0][0][2][0][RTW89_CHILE][21] = 66, ++ [0][0][2][0][RTW89_UKRAINE][21] = 52, ++ [0][0][2][0][RTW89_MEXICO][21] = 78, ++ [0][0][2][0][RTW89_CN][21] = 127, ++ [0][0][2][0][RTW89_QATAR][21] = 60, ++ [0][0][2][0][RTW89_UK][21] = 60, ++ [0][0][2][0][RTW89_FCC][23] = 78, ++ [0][0][2][0][RTW89_ETSI][23] = 60, ++ [0][0][2][0][RTW89_MKK][23] = 76, ++ [0][0][2][0][RTW89_IC][23] = 78, ++ [0][0][2][0][RTW89_KCC][23] = 74, ++ [0][0][2][0][RTW89_ACMA][23] = 60, ++ [0][0][2][0][RTW89_CHILE][23] = 66, ++ [0][0][2][0][RTW89_UKRAINE][23] = 52, ++ [0][0][2][0][RTW89_MEXICO][23] = 78, ++ [0][0][2][0][RTW89_CN][23] = 127, ++ [0][0][2][0][RTW89_QATAR][23] = 60, ++ [0][0][2][0][RTW89_UK][23] = 60, ++ [0][0][2][0][RTW89_FCC][25] = 78, ++ [0][0][2][0][RTW89_ETSI][25] = 60, ++ [0][0][2][0][RTW89_MKK][25] = 76, ++ [0][0][2][0][RTW89_IC][25] = 127, ++ [0][0][2][0][RTW89_KCC][25] = 74, ++ [0][0][2][0][RTW89_ACMA][25] = 127, ++ [0][0][2][0][RTW89_CHILE][25] = 66, ++ [0][0][2][0][RTW89_UKRAINE][25] = 52, ++ [0][0][2][0][RTW89_MEXICO][25] = 78, ++ [0][0][2][0][RTW89_CN][25] = 127, ++ [0][0][2][0][RTW89_QATAR][25] = 60, ++ [0][0][2][0][RTW89_UK][25] = 60, ++ [0][0][2][0][RTW89_FCC][27] = 78, ++ [0][0][2][0][RTW89_ETSI][27] = 60, ++ [0][0][2][0][RTW89_MKK][27] = 76, ++ [0][0][2][0][RTW89_IC][27] = 127, ++ [0][0][2][0][RTW89_KCC][27] = 74, ++ [0][0][2][0][RTW89_ACMA][27] = 127, ++ [0][0][2][0][RTW89_CHILE][27] = 64, ++ [0][0][2][0][RTW89_UKRAINE][27] = 52, ++ [0][0][2][0][RTW89_MEXICO][27] = 78, ++ [0][0][2][0][RTW89_CN][27] = 127, ++ [0][0][2][0][RTW89_QATAR][27] = 60, ++ [0][0][2][0][RTW89_UK][27] = 60, ++ [0][0][2][0][RTW89_FCC][29] = 78, ++ [0][0][2][0][RTW89_ETSI][29] = 60, ++ [0][0][2][0][RTW89_MKK][29] = 76, ++ [0][0][2][0][RTW89_IC][29] = 127, ++ [0][0][2][0][RTW89_KCC][29] = 74, ++ [0][0][2][0][RTW89_ACMA][29] = 127, ++ [0][0][2][0][RTW89_CHILE][29] = 64, ++ [0][0][2][0][RTW89_UKRAINE][29] = 52, ++ [0][0][2][0][RTW89_MEXICO][29] = 78, ++ [0][0][2][0][RTW89_CN][29] = 127, ++ [0][0][2][0][RTW89_QATAR][29] = 60, ++ [0][0][2][0][RTW89_UK][29] = 60, ++ [0][0][2][0][RTW89_FCC][31] = 78, ++ [0][0][2][0][RTW89_ETSI][31] = 60, ++ [0][0][2][0][RTW89_MKK][31] = 76, ++ [0][0][2][0][RTW89_IC][31] = 78, ++ [0][0][2][0][RTW89_KCC][31] = 74, ++ [0][0][2][0][RTW89_ACMA][31] = 60, ++ [0][0][2][0][RTW89_CHILE][31] = 64, ++ [0][0][2][0][RTW89_UKRAINE][31] = 52, ++ [0][0][2][0][RTW89_MEXICO][31] = 78, ++ [0][0][2][0][RTW89_CN][31] = 127, ++ [0][0][2][0][RTW89_QATAR][31] = 60, ++ [0][0][2][0][RTW89_UK][31] = 60, ++ [0][0][2][0][RTW89_FCC][33] = 78, ++ [0][0][2][0][RTW89_ETSI][33] = 60, ++ [0][0][2][0][RTW89_MKK][33] = 76, ++ [0][0][2][0][RTW89_IC][33] = 78, ++ [0][0][2][0][RTW89_KCC][33] = 74, ++ [0][0][2][0][RTW89_ACMA][33] = 60, ++ [0][0][2][0][RTW89_CHILE][33] = 64, ++ [0][0][2][0][RTW89_UKRAINE][33] = 52, ++ [0][0][2][0][RTW89_MEXICO][33] = 78, ++ [0][0][2][0][RTW89_CN][33] = 127, ++ [0][0][2][0][RTW89_QATAR][33] = 60, ++ [0][0][2][0][RTW89_UK][33] = 60, ++ [0][0][2][0][RTW89_FCC][35] = 70, ++ [0][0][2][0][RTW89_ETSI][35] = 60, ++ [0][0][2][0][RTW89_MKK][35] = 76, ++ [0][0][2][0][RTW89_IC][35] = 70, ++ [0][0][2][0][RTW89_KCC][35] = 74, ++ [0][0][2][0][RTW89_ACMA][35] = 60, ++ [0][0][2][0][RTW89_CHILE][35] = 64, ++ [0][0][2][0][RTW89_UKRAINE][35] = 52, ++ [0][0][2][0][RTW89_MEXICO][35] = 70, ++ [0][0][2][0][RTW89_CN][35] = 127, ++ [0][0][2][0][RTW89_QATAR][35] = 60, ++ [0][0][2][0][RTW89_UK][35] = 60, ++ [0][0][2][0][RTW89_FCC][37] = 78, ++ [0][0][2][0][RTW89_ETSI][37] = 127, ++ [0][0][2][0][RTW89_MKK][37] = 76, ++ [0][0][2][0][RTW89_IC][37] = 78, ++ [0][0][2][0][RTW89_KCC][37] = 74, ++ [0][0][2][0][RTW89_ACMA][37] = 76, ++ [0][0][2][0][RTW89_CHILE][37] = 64, ++ [0][0][2][0][RTW89_UKRAINE][37] = 127, ++ [0][0][2][0][RTW89_MEXICO][37] = 78, ++ [0][0][2][0][RTW89_CN][37] = 127, ++ [0][0][2][0][RTW89_QATAR][37] = 127, ++ [0][0][2][0][RTW89_UK][37] = 74, ++ [0][0][2][0][RTW89_FCC][38] = 78, ++ [0][0][2][0][RTW89_ETSI][38] = 28, ++ [0][0][2][0][RTW89_MKK][38] = 127, ++ [0][0][2][0][RTW89_IC][38] = 78, ++ [0][0][2][0][RTW89_KCC][38] = 72, ++ [0][0][2][0][RTW89_ACMA][38] = 76, ++ [0][0][2][0][RTW89_CHILE][38] = 64, ++ [0][0][2][0][RTW89_UKRAINE][38] = 28, ++ [0][0][2][0][RTW89_MEXICO][38] = 78, ++ [0][0][2][0][RTW89_CN][38] = 76, ++ [0][0][2][0][RTW89_QATAR][38] = 28, ++ [0][0][2][0][RTW89_UK][38] = 60, ++ [0][0][2][0][RTW89_FCC][40] = 78, ++ [0][0][2][0][RTW89_ETSI][40] = 28, ++ [0][0][2][0][RTW89_MKK][40] = 127, ++ [0][0][2][0][RTW89_IC][40] = 78, ++ [0][0][2][0][RTW89_KCC][40] = 72, ++ [0][0][2][0][RTW89_ACMA][40] = 76, ++ [0][0][2][0][RTW89_CHILE][40] = 64, ++ [0][0][2][0][RTW89_UKRAINE][40] = 28, ++ [0][0][2][0][RTW89_MEXICO][40] = 78, ++ [0][0][2][0][RTW89_CN][40] = 76, ++ [0][0][2][0][RTW89_QATAR][40] = 28, ++ [0][0][2][0][RTW89_UK][40] = 60, ++ [0][0][2][0][RTW89_FCC][42] = 78, ++ [0][0][2][0][RTW89_ETSI][42] = 28, ++ [0][0][2][0][RTW89_MKK][42] = 127, ++ [0][0][2][0][RTW89_IC][42] = 78, ++ [0][0][2][0][RTW89_KCC][42] = 72, ++ [0][0][2][0][RTW89_ACMA][42] = 76, ++ [0][0][2][0][RTW89_CHILE][42] = 64, ++ [0][0][2][0][RTW89_UKRAINE][42] = 28, ++ [0][0][2][0][RTW89_MEXICO][42] = 78, ++ [0][0][2][0][RTW89_CN][42] = 76, ++ [0][0][2][0][RTW89_QATAR][42] = 28, ++ [0][0][2][0][RTW89_UK][42] = 60, ++ [0][0][2][0][RTW89_FCC][44] = 78, ++ [0][0][2][0][RTW89_ETSI][44] = 28, ++ [0][0][2][0][RTW89_MKK][44] = 127, ++ [0][0][2][0][RTW89_IC][44] = 78, ++ [0][0][2][0][RTW89_KCC][44] = 72, ++ [0][0][2][0][RTW89_ACMA][44] = 76, ++ [0][0][2][0][RTW89_CHILE][44] = 66, ++ [0][0][2][0][RTW89_UKRAINE][44] = 28, ++ [0][0][2][0][RTW89_MEXICO][44] = 78, ++ [0][0][2][0][RTW89_CN][44] = 76, ++ [0][0][2][0][RTW89_QATAR][44] = 28, ++ [0][0][2][0][RTW89_UK][44] = 60, ++ [0][0][2][0][RTW89_FCC][46] = 78, ++ [0][0][2][0][RTW89_ETSI][46] = 28, ++ [0][0][2][0][RTW89_MKK][46] = 127, ++ [0][0][2][0][RTW89_IC][46] = 78, ++ [0][0][2][0][RTW89_KCC][46] = 72, ++ [0][0][2][0][RTW89_ACMA][46] = 76, ++ [0][0][2][0][RTW89_CHILE][46] = 66, ++ [0][0][2][0][RTW89_UKRAINE][46] = 28, ++ [0][0][2][0][RTW89_MEXICO][46] = 78, ++ [0][0][2][0][RTW89_CN][46] = 76, ++ [0][0][2][0][RTW89_QATAR][46] = 28, ++ [0][0][2][0][RTW89_UK][46] = 60, ++ [0][0][2][0][RTW89_FCC][48] = 78, ++ [0][0][2][0][RTW89_ETSI][48] = 127, ++ [0][0][2][0][RTW89_MKK][48] = 127, ++ [0][0][2][0][RTW89_IC][48] = 127, ++ [0][0][2][0][RTW89_KCC][48] = 127, ++ [0][0][2][0][RTW89_ACMA][48] = 127, ++ [0][0][2][0][RTW89_CHILE][48] = 127, ++ [0][0][2][0][RTW89_UKRAINE][48] = 127, ++ [0][0][2][0][RTW89_MEXICO][48] = 127, ++ [0][0][2][0][RTW89_CN][48] = 127, ++ [0][0][2][0][RTW89_QATAR][48] = 127, ++ [0][0][2][0][RTW89_UK][48] = 127, ++ [0][0][2][0][RTW89_FCC][50] = 78, ++ [0][0][2][0][RTW89_ETSI][50] = 127, ++ [0][0][2][0][RTW89_MKK][50] = 127, ++ [0][0][2][0][RTW89_IC][50] = 127, ++ [0][0][2][0][RTW89_KCC][50] = 127, ++ [0][0][2][0][RTW89_ACMA][50] = 127, ++ [0][0][2][0][RTW89_CHILE][50] = 127, ++ [0][0][2][0][RTW89_UKRAINE][50] = 127, ++ [0][0][2][0][RTW89_MEXICO][50] = 127, ++ [0][0][2][0][RTW89_CN][50] = 127, ++ [0][0][2][0][RTW89_QATAR][50] = 127, ++ [0][0][2][0][RTW89_UK][50] = 127, ++ [0][0][2][0][RTW89_FCC][52] = 78, ++ [0][0][2][0][RTW89_ETSI][52] = 127, ++ [0][0][2][0][RTW89_MKK][52] = 127, ++ [0][0][2][0][RTW89_IC][52] = 127, ++ [0][0][2][0][RTW89_KCC][52] = 127, ++ [0][0][2][0][RTW89_ACMA][52] = 127, ++ [0][0][2][0][RTW89_CHILE][52] = 127, ++ [0][0][2][0][RTW89_UKRAINE][52] = 127, ++ [0][0][2][0][RTW89_MEXICO][52] = 127, ++ [0][0][2][0][RTW89_CN][52] = 127, ++ [0][0][2][0][RTW89_QATAR][52] = 127, ++ [0][0][2][0][RTW89_UK][52] = 127, ++ [0][1][2][0][RTW89_FCC][0] = 70, ++ [0][1][2][0][RTW89_ETSI][0] = 48, ++ [0][1][2][0][RTW89_MKK][0] = 50, ++ [0][1][2][0][RTW89_IC][0] = 42, ++ [0][1][2][0][RTW89_KCC][0] = 62, ++ [0][1][2][0][RTW89_ACMA][0] = 48, ++ [0][1][2][0][RTW89_CHILE][0] = 30, ++ [0][1][2][0][RTW89_UKRAINE][0] = 40, ++ [0][1][2][0][RTW89_MEXICO][0] = 50, ++ [0][1][2][0][RTW89_CN][0] = 48, ++ [0][1][2][0][RTW89_QATAR][0] = 48, ++ [0][1][2][0][RTW89_UK][0] = 48, ++ [0][1][2][0][RTW89_FCC][2] = 70, ++ [0][1][2][0][RTW89_ETSI][2] = 48, ++ [0][1][2][0][RTW89_MKK][2] = 50, ++ [0][1][2][0][RTW89_IC][2] = 42, ++ [0][1][2][0][RTW89_KCC][2] = 62, ++ [0][1][2][0][RTW89_ACMA][2] = 48, ++ [0][1][2][0][RTW89_CHILE][2] = 30, ++ [0][1][2][0][RTW89_UKRAINE][2] = 40, ++ [0][1][2][0][RTW89_MEXICO][2] = 50, ++ [0][1][2][0][RTW89_CN][2] = 48, ++ [0][1][2][0][RTW89_QATAR][2] = 48, ++ [0][1][2][0][RTW89_UK][2] = 48, ++ [0][1][2][0][RTW89_FCC][4] = 70, ++ [0][1][2][0][RTW89_ETSI][4] = 48, ++ [0][1][2][0][RTW89_MKK][4] = 50, ++ [0][1][2][0][RTW89_IC][4] = 42, ++ [0][1][2][0][RTW89_KCC][4] = 62, ++ [0][1][2][0][RTW89_ACMA][4] = 48, ++ [0][1][2][0][RTW89_CHILE][4] = 30, ++ [0][1][2][0][RTW89_UKRAINE][4] = 40, ++ [0][1][2][0][RTW89_MEXICO][4] = 50, ++ [0][1][2][0][RTW89_CN][4] = 48, ++ [0][1][2][0][RTW89_QATAR][4] = 48, ++ [0][1][2][0][RTW89_UK][4] = 48, ++ [0][1][2][0][RTW89_FCC][6] = 70, ++ [0][1][2][0][RTW89_ETSI][6] = 48, ++ [0][1][2][0][RTW89_MKK][6] = 50, ++ [0][1][2][0][RTW89_IC][6] = 42, ++ [0][1][2][0][RTW89_KCC][6] = 34, ++ [0][1][2][0][RTW89_ACMA][6] = 48, ++ [0][1][2][0][RTW89_CHILE][6] = 30, ++ [0][1][2][0][RTW89_UKRAINE][6] = 40, ++ [0][1][2][0][RTW89_MEXICO][6] = 50, ++ [0][1][2][0][RTW89_CN][6] = 48, ++ [0][1][2][0][RTW89_QATAR][6] = 48, ++ [0][1][2][0][RTW89_UK][6] = 48, ++ [0][1][2][0][RTW89_FCC][8] = 70, ++ [0][1][2][0][RTW89_ETSI][8] = 48, ++ [0][1][2][0][RTW89_MKK][8] = 50, ++ [0][1][2][0][RTW89_IC][8] = 52, ++ [0][1][2][0][RTW89_KCC][8] = 62, ++ [0][1][2][0][RTW89_ACMA][8] = 48, ++ [0][1][2][0][RTW89_CHILE][8] = 50, ++ [0][1][2][0][RTW89_UKRAINE][8] = 40, ++ [0][1][2][0][RTW89_MEXICO][8] = 70, ++ [0][1][2][0][RTW89_CN][8] = 48, ++ [0][1][2][0][RTW89_QATAR][8] = 48, ++ [0][1][2][0][RTW89_UK][8] = 48, ++ [0][1][2][0][RTW89_FCC][10] = 70, ++ [0][1][2][0][RTW89_ETSI][10] = 48, ++ [0][1][2][0][RTW89_MKK][10] = 50, ++ [0][1][2][0][RTW89_IC][10] = 52, ++ [0][1][2][0][RTW89_KCC][10] = 62, ++ [0][1][2][0][RTW89_ACMA][10] = 48, ++ [0][1][2][0][RTW89_CHILE][10] = 50, ++ [0][1][2][0][RTW89_UKRAINE][10] = 40, ++ [0][1][2][0][RTW89_MEXICO][10] = 70, ++ [0][1][2][0][RTW89_CN][10] = 48, ++ [0][1][2][0][RTW89_QATAR][10] = 48, ++ [0][1][2][0][RTW89_UK][10] = 48, ++ [0][1][2][0][RTW89_FCC][12] = 70, ++ [0][1][2][0][RTW89_ETSI][12] = 48, ++ [0][1][2][0][RTW89_MKK][12] = 50, ++ [0][1][2][0][RTW89_IC][12] = 52, ++ [0][1][2][0][RTW89_KCC][12] = 62, ++ [0][1][2][0][RTW89_ACMA][12] = 48, ++ [0][1][2][0][RTW89_CHILE][12] = 50, ++ [0][1][2][0][RTW89_UKRAINE][12] = 40, ++ [0][1][2][0][RTW89_MEXICO][12] = 70, ++ [0][1][2][0][RTW89_CN][12] = 48, ++ [0][1][2][0][RTW89_QATAR][12] = 48, ++ [0][1][2][0][RTW89_UK][12] = 48, ++ [0][1][2][0][RTW89_FCC][14] = 70, ++ [0][1][2][0][RTW89_ETSI][14] = 48, ++ [0][1][2][0][RTW89_MKK][14] = 50, ++ [0][1][2][0][RTW89_IC][14] = 52, ++ [0][1][2][0][RTW89_KCC][14] = 62, ++ [0][1][2][0][RTW89_ACMA][14] = 48, ++ [0][1][2][0][RTW89_CHILE][14] = 50, ++ [0][1][2][0][RTW89_UKRAINE][14] = 40, ++ [0][1][2][0][RTW89_MEXICO][14] = 70, ++ [0][1][2][0][RTW89_CN][14] = 48, ++ [0][1][2][0][RTW89_QATAR][14] = 48, ++ [0][1][2][0][RTW89_UK][14] = 48, ++ [0][1][2][0][RTW89_FCC][15] = 68, ++ [0][1][2][0][RTW89_ETSI][15] = 48, ++ [0][1][2][0][RTW89_MKK][15] = 70, ++ [0][1][2][0][RTW89_IC][15] = 68, ++ [0][1][2][0][RTW89_KCC][15] = 62, ++ [0][1][2][0][RTW89_ACMA][15] = 48, ++ [0][1][2][0][RTW89_CHILE][15] = 48, ++ [0][1][2][0][RTW89_UKRAINE][15] = 40, ++ [0][1][2][0][RTW89_MEXICO][15] = 68, ++ [0][1][2][0][RTW89_CN][15] = 127, ++ [0][1][2][0][RTW89_QATAR][15] = 48, ++ [0][1][2][0][RTW89_UK][15] = 48, ++ [0][1][2][0][RTW89_FCC][17] = 70, ++ [0][1][2][0][RTW89_ETSI][17] = 48, ++ [0][1][2][0][RTW89_MKK][17] = 70, ++ [0][1][2][0][RTW89_IC][17] = 70, ++ [0][1][2][0][RTW89_KCC][17] = 62, ++ [0][1][2][0][RTW89_ACMA][17] = 48, ++ [0][1][2][0][RTW89_CHILE][17] = 48, ++ [0][1][2][0][RTW89_UKRAINE][17] = 40, ++ [0][1][2][0][RTW89_MEXICO][17] = 70, ++ [0][1][2][0][RTW89_CN][17] = 127, ++ [0][1][2][0][RTW89_QATAR][17] = 48, ++ [0][1][2][0][RTW89_UK][17] = 48, ++ [0][1][2][0][RTW89_FCC][19] = 70, ++ [0][1][2][0][RTW89_ETSI][19] = 48, ++ [0][1][2][0][RTW89_MKK][19] = 70, ++ [0][1][2][0][RTW89_IC][19] = 70, ++ [0][1][2][0][RTW89_KCC][19] = 62, ++ [0][1][2][0][RTW89_ACMA][19] = 48, ++ [0][1][2][0][RTW89_CHILE][19] = 48, ++ [0][1][2][0][RTW89_UKRAINE][19] = 40, ++ [0][1][2][0][RTW89_MEXICO][19] = 70, ++ [0][1][2][0][RTW89_CN][19] = 127, ++ [0][1][2][0][RTW89_QATAR][19] = 48, ++ [0][1][2][0][RTW89_UK][19] = 48, ++ [0][1][2][0][RTW89_FCC][21] = 70, ++ [0][1][2][0][RTW89_ETSI][21] = 48, ++ [0][1][2][0][RTW89_MKK][21] = 70, ++ [0][1][2][0][RTW89_IC][21] = 70, ++ [0][1][2][0][RTW89_KCC][21] = 62, ++ [0][1][2][0][RTW89_ACMA][21] = 48, ++ [0][1][2][0][RTW89_CHILE][21] = 48, ++ [0][1][2][0][RTW89_UKRAINE][21] = 40, ++ [0][1][2][0][RTW89_MEXICO][21] = 70, ++ [0][1][2][0][RTW89_CN][21] = 127, ++ [0][1][2][0][RTW89_QATAR][21] = 48, ++ [0][1][2][0][RTW89_UK][21] = 48, ++ [0][1][2][0][RTW89_FCC][23] = 70, ++ [0][1][2][0][RTW89_ETSI][23] = 48, ++ [0][1][2][0][RTW89_MKK][23] = 70, ++ [0][1][2][0][RTW89_IC][23] = 70, ++ [0][1][2][0][RTW89_KCC][23] = 62, ++ [0][1][2][0][RTW89_ACMA][23] = 48, ++ [0][1][2][0][RTW89_CHILE][23] = 48, ++ [0][1][2][0][RTW89_UKRAINE][23] = 40, ++ [0][1][2][0][RTW89_MEXICO][23] = 70, ++ [0][1][2][0][RTW89_CN][23] = 127, ++ [0][1][2][0][RTW89_QATAR][23] = 48, ++ [0][1][2][0][RTW89_UK][23] = 48, ++ [0][1][2][0][RTW89_FCC][25] = 70, ++ [0][1][2][0][RTW89_ETSI][25] = 48, ++ [0][1][2][0][RTW89_MKK][25] = 70, ++ [0][1][2][0][RTW89_IC][25] = 127, ++ [0][1][2][0][RTW89_KCC][25] = 62, ++ [0][1][2][0][RTW89_ACMA][25] = 127, ++ [0][1][2][0][RTW89_CHILE][25] = 48, ++ [0][1][2][0][RTW89_UKRAINE][25] = 40, ++ [0][1][2][0][RTW89_MEXICO][25] = 70, ++ [0][1][2][0][RTW89_CN][25] = 127, ++ [0][1][2][0][RTW89_QATAR][25] = 48, ++ [0][1][2][0][RTW89_UK][25] = 48, ++ [0][1][2][0][RTW89_FCC][27] = 70, ++ [0][1][2][0][RTW89_ETSI][27] = 48, ++ [0][1][2][0][RTW89_MKK][27] = 70, ++ [0][1][2][0][RTW89_IC][27] = 127, ++ [0][1][2][0][RTW89_KCC][27] = 62, ++ [0][1][2][0][RTW89_ACMA][27] = 127, ++ [0][1][2][0][RTW89_CHILE][27] = 50, ++ [0][1][2][0][RTW89_UKRAINE][27] = 40, ++ [0][1][2][0][RTW89_MEXICO][27] = 70, ++ [0][1][2][0][RTW89_CN][27] = 127, ++ [0][1][2][0][RTW89_QATAR][27] = 48, ++ [0][1][2][0][RTW89_UK][27] = 48, ++ [0][1][2][0][RTW89_FCC][29] = 70, ++ [0][1][2][0][RTW89_ETSI][29] = 48, ++ [0][1][2][0][RTW89_MKK][29] = 70, ++ [0][1][2][0][RTW89_IC][29] = 127, ++ [0][1][2][0][RTW89_KCC][29] = 62, ++ [0][1][2][0][RTW89_ACMA][29] = 127, ++ [0][1][2][0][RTW89_CHILE][29] = 50, ++ [0][1][2][0][RTW89_UKRAINE][29] = 40, ++ [0][1][2][0][RTW89_MEXICO][29] = 70, ++ [0][1][2][0][RTW89_CN][29] = 127, ++ [0][1][2][0][RTW89_QATAR][29] = 48, ++ [0][1][2][0][RTW89_UK][29] = 48, ++ [0][1][2][0][RTW89_FCC][31] = 70, ++ [0][1][2][0][RTW89_ETSI][31] = 48, ++ [0][1][2][0][RTW89_MKK][31] = 70, ++ [0][1][2][0][RTW89_IC][31] = 70, ++ [0][1][2][0][RTW89_KCC][31] = 62, ++ [0][1][2][0][RTW89_ACMA][31] = 48, ++ [0][1][2][0][RTW89_CHILE][31] = 50, ++ [0][1][2][0][RTW89_UKRAINE][31] = 40, ++ [0][1][2][0][RTW89_MEXICO][31] = 70, ++ [0][1][2][0][RTW89_CN][31] = 127, ++ [0][1][2][0][RTW89_QATAR][31] = 48, ++ [0][1][2][0][RTW89_UK][31] = 48, ++ [0][1][2][0][RTW89_FCC][33] = 70, ++ [0][1][2][0][RTW89_ETSI][33] = 48, ++ [0][1][2][0][RTW89_MKK][33] = 70, ++ [0][1][2][0][RTW89_IC][33] = 70, ++ [0][1][2][0][RTW89_KCC][33] = 62, ++ [0][1][2][0][RTW89_ACMA][33] = 48, ++ [0][1][2][0][RTW89_CHILE][33] = 50, ++ [0][1][2][0][RTW89_UKRAINE][33] = 40, ++ [0][1][2][0][RTW89_MEXICO][33] = 70, ++ [0][1][2][0][RTW89_CN][33] = 127, ++ [0][1][2][0][RTW89_QATAR][33] = 48, ++ [0][1][2][0][RTW89_UK][33] = 48, ++ [0][1][2][0][RTW89_FCC][35] = 66, ++ [0][1][2][0][RTW89_ETSI][35] = 48, ++ [0][1][2][0][RTW89_MKK][35] = 70, ++ [0][1][2][0][RTW89_IC][35] = 66, ++ [0][1][2][0][RTW89_KCC][35] = 62, ++ [0][1][2][0][RTW89_ACMA][35] = 48, ++ [0][1][2][0][RTW89_CHILE][35] = 50, ++ [0][1][2][0][RTW89_UKRAINE][35] = 40, ++ [0][1][2][0][RTW89_MEXICO][35] = 66, ++ [0][1][2][0][RTW89_CN][35] = 127, ++ [0][1][2][0][RTW89_QATAR][35] = 48, ++ [0][1][2][0][RTW89_UK][35] = 48, ++ [0][1][2][0][RTW89_FCC][37] = 70, ++ [0][1][2][0][RTW89_ETSI][37] = 127, ++ [0][1][2][0][RTW89_MKK][37] = 70, ++ [0][1][2][0][RTW89_IC][37] = 70, ++ [0][1][2][0][RTW89_KCC][37] = 62, ++ [0][1][2][0][RTW89_ACMA][37] = 70, ++ [0][1][2][0][RTW89_CHILE][37] = 50, ++ [0][1][2][0][RTW89_UKRAINE][37] = 127, ++ [0][1][2][0][RTW89_MEXICO][37] = 70, ++ [0][1][2][0][RTW89_CN][37] = 127, ++ [0][1][2][0][RTW89_QATAR][37] = 127, ++ [0][1][2][0][RTW89_UK][37] = 76, ++ [0][1][2][0][RTW89_FCC][38] = 78, ++ [0][1][2][0][RTW89_ETSI][38] = 16, ++ [0][1][2][0][RTW89_MKK][38] = 127, ++ [0][1][2][0][RTW89_IC][38] = 78, ++ [0][1][2][0][RTW89_KCC][38] = 62, ++ [0][1][2][0][RTW89_ACMA][38] = 74, ++ [0][1][2][0][RTW89_CHILE][38] = 50, ++ [0][1][2][0][RTW89_UKRAINE][38] = 16, ++ [0][1][2][0][RTW89_MEXICO][38] = 78, ++ [0][1][2][0][RTW89_CN][38] = 76, ++ [0][1][2][0][RTW89_QATAR][38] = 16, ++ [0][1][2][0][RTW89_UK][38] = 48, ++ [0][1][2][0][RTW89_FCC][40] = 78, ++ [0][1][2][0][RTW89_ETSI][40] = 16, ++ [0][1][2][0][RTW89_MKK][40] = 127, ++ [0][1][2][0][RTW89_IC][40] = 78, ++ [0][1][2][0][RTW89_KCC][40] = 62, ++ [0][1][2][0][RTW89_ACMA][40] = 74, ++ [0][1][2][0][RTW89_CHILE][40] = 50, ++ [0][1][2][0][RTW89_UKRAINE][40] = 16, ++ [0][1][2][0][RTW89_MEXICO][40] = 78, ++ [0][1][2][0][RTW89_CN][40] = 76, ++ [0][1][2][0][RTW89_QATAR][40] = 16, ++ [0][1][2][0][RTW89_UK][40] = 48, ++ [0][1][2][0][RTW89_FCC][42] = 78, ++ [0][1][2][0][RTW89_ETSI][42] = 16, ++ [0][1][2][0][RTW89_MKK][42] = 127, ++ [0][1][2][0][RTW89_IC][42] = 78, ++ [0][1][2][0][RTW89_KCC][42] = 62, ++ [0][1][2][0][RTW89_ACMA][42] = 76, ++ [0][1][2][0][RTW89_CHILE][42] = 52, ++ [0][1][2][0][RTW89_UKRAINE][42] = 16, ++ [0][1][2][0][RTW89_MEXICO][42] = 78, ++ [0][1][2][0][RTW89_CN][42] = 76, ++ [0][1][2][0][RTW89_QATAR][42] = 16, ++ [0][1][2][0][RTW89_UK][42] = 48, ++ [0][1][2][0][RTW89_FCC][44] = 78, ++ [0][1][2][0][RTW89_ETSI][44] = 16, ++ [0][1][2][0][RTW89_MKK][44] = 127, ++ [0][1][2][0][RTW89_IC][44] = 78, ++ [0][1][2][0][RTW89_KCC][44] = 62, ++ [0][1][2][0][RTW89_ACMA][44] = 76, ++ [0][1][2][0][RTW89_CHILE][44] = 52, ++ [0][1][2][0][RTW89_UKRAINE][44] = 16, ++ [0][1][2][0][RTW89_MEXICO][44] = 78, ++ [0][1][2][0][RTW89_CN][44] = 76, ++ [0][1][2][0][RTW89_QATAR][44] = 16, ++ [0][1][2][0][RTW89_UK][44] = 48, ++ [0][1][2][0][RTW89_FCC][46] = 78, ++ [0][1][2][0][RTW89_ETSI][46] = 16, ++ [0][1][2][0][RTW89_MKK][46] = 127, ++ [0][1][2][0][RTW89_IC][46] = 78, ++ [0][1][2][0][RTW89_KCC][46] = 62, ++ [0][1][2][0][RTW89_ACMA][46] = 76, ++ [0][1][2][0][RTW89_CHILE][46] = 52, ++ [0][1][2][0][RTW89_UKRAINE][46] = 16, ++ [0][1][2][0][RTW89_MEXICO][46] = 78, ++ [0][1][2][0][RTW89_CN][46] = 76, ++ [0][1][2][0][RTW89_QATAR][46] = 16, ++ [0][1][2][0][RTW89_UK][46] = 48, ++ [0][1][2][0][RTW89_FCC][48] = 58, ++ [0][1][2][0][RTW89_ETSI][48] = 127, ++ [0][1][2][0][RTW89_MKK][48] = 127, ++ [0][1][2][0][RTW89_IC][48] = 127, ++ [0][1][2][0][RTW89_KCC][48] = 127, ++ [0][1][2][0][RTW89_ACMA][48] = 127, ++ [0][1][2][0][RTW89_CHILE][48] = 127, ++ [0][1][2][0][RTW89_UKRAINE][48] = 127, ++ [0][1][2][0][RTW89_MEXICO][48] = 127, ++ [0][1][2][0][RTW89_CN][48] = 127, ++ [0][1][2][0][RTW89_QATAR][48] = 127, ++ [0][1][2][0][RTW89_UK][48] = 127, ++ [0][1][2][0][RTW89_FCC][50] = 58, ++ [0][1][2][0][RTW89_ETSI][50] = 127, ++ [0][1][2][0][RTW89_MKK][50] = 127, ++ [0][1][2][0][RTW89_IC][50] = 127, ++ [0][1][2][0][RTW89_KCC][50] = 127, ++ [0][1][2][0][RTW89_ACMA][50] = 127, ++ [0][1][2][0][RTW89_CHILE][50] = 127, ++ [0][1][2][0][RTW89_UKRAINE][50] = 127, ++ [0][1][2][0][RTW89_MEXICO][50] = 127, ++ [0][1][2][0][RTW89_CN][50] = 127, ++ [0][1][2][0][RTW89_QATAR][50] = 127, ++ [0][1][2][0][RTW89_UK][50] = 127, ++ [0][1][2][0][RTW89_FCC][52] = 58, ++ [0][1][2][0][RTW89_ETSI][52] = 127, ++ [0][1][2][0][RTW89_MKK][52] = 127, ++ [0][1][2][0][RTW89_IC][52] = 127, ++ [0][1][2][0][RTW89_KCC][52] = 127, ++ [0][1][2][0][RTW89_ACMA][52] = 127, ++ [0][1][2][0][RTW89_CHILE][52] = 127, ++ [0][1][2][0][RTW89_UKRAINE][52] = 127, ++ [0][1][2][0][RTW89_MEXICO][52] = 127, ++ [0][1][2][0][RTW89_CN][52] = 127, ++ [0][1][2][0][RTW89_QATAR][52] = 127, ++ [0][1][2][0][RTW89_UK][52] = 127, ++ [0][1][2][1][RTW89_FCC][0] = 68, ++ [0][1][2][1][RTW89_ETSI][0] = 36, ++ [0][1][2][1][RTW89_MKK][0] = 50, ++ [0][1][2][1][RTW89_IC][0] = 40, ++ [0][1][2][1][RTW89_KCC][0] = 62, ++ [0][1][2][1][RTW89_ACMA][0] = 36, ++ [0][1][2][1][RTW89_CHILE][0] = 14, ++ [0][1][2][1][RTW89_UKRAINE][0] = 28, ++ [0][1][2][1][RTW89_MEXICO][0] = 50, ++ [0][1][2][1][RTW89_CN][0] = 36, ++ [0][1][2][1][RTW89_QATAR][0] = 36, ++ [0][1][2][1][RTW89_UK][0] = 36, ++ [0][1][2][1][RTW89_FCC][2] = 68, ++ [0][1][2][1][RTW89_ETSI][2] = 36, ++ [0][1][2][1][RTW89_MKK][2] = 50, ++ [0][1][2][1][RTW89_IC][2] = 40, ++ [0][1][2][1][RTW89_KCC][2] = 62, ++ [0][1][2][1][RTW89_ACMA][2] = 36, ++ [0][1][2][1][RTW89_CHILE][2] = 14, ++ [0][1][2][1][RTW89_UKRAINE][2] = 28, ++ [0][1][2][1][RTW89_MEXICO][2] = 50, ++ [0][1][2][1][RTW89_CN][2] = 36, ++ [0][1][2][1][RTW89_QATAR][2] = 36, ++ [0][1][2][1][RTW89_UK][2] = 36, ++ [0][1][2][1][RTW89_FCC][4] = 68, ++ [0][1][2][1][RTW89_ETSI][4] = 36, ++ [0][1][2][1][RTW89_MKK][4] = 50, ++ [0][1][2][1][RTW89_IC][4] = 40, ++ [0][1][2][1][RTW89_KCC][4] = 62, ++ [0][1][2][1][RTW89_ACMA][4] = 36, ++ [0][1][2][1][RTW89_CHILE][4] = 14, ++ [0][1][2][1][RTW89_UKRAINE][4] = 28, ++ [0][1][2][1][RTW89_MEXICO][4] = 50, ++ [0][1][2][1][RTW89_CN][4] = 36, ++ [0][1][2][1][RTW89_QATAR][4] = 36, ++ [0][1][2][1][RTW89_UK][4] = 36, ++ [0][1][2][1][RTW89_FCC][6] = 68, ++ [0][1][2][1][RTW89_ETSI][6] = 36, ++ [0][1][2][1][RTW89_MKK][6] = 50, ++ [0][1][2][1][RTW89_IC][6] = 40, ++ [0][1][2][1][RTW89_KCC][6] = 34, ++ [0][1][2][1][RTW89_ACMA][6] = 36, ++ [0][1][2][1][RTW89_CHILE][6] = 14, ++ [0][1][2][1][RTW89_UKRAINE][6] = 28, ++ [0][1][2][1][RTW89_MEXICO][6] = 50, ++ [0][1][2][1][RTW89_CN][6] = 36, ++ [0][1][2][1][RTW89_QATAR][6] = 36, ++ [0][1][2][1][RTW89_UK][6] = 36, ++ [0][1][2][1][RTW89_FCC][8] = 68, ++ [0][1][2][1][RTW89_ETSI][8] = 36, ++ [0][1][2][1][RTW89_MKK][8] = 50, ++ [0][1][2][1][RTW89_IC][8] = 40, ++ [0][1][2][1][RTW89_KCC][8] = 62, ++ [0][1][2][1][RTW89_ACMA][8] = 36, ++ [0][1][2][1][RTW89_CHILE][8] = 36, ++ [0][1][2][1][RTW89_UKRAINE][8] = 28, ++ [0][1][2][1][RTW89_MEXICO][8] = 68, ++ [0][1][2][1][RTW89_CN][8] = 36, ++ [0][1][2][1][RTW89_QATAR][8] = 36, ++ [0][1][2][1][RTW89_UK][8] = 36, ++ [0][1][2][1][RTW89_FCC][10] = 68, ++ [0][1][2][1][RTW89_ETSI][10] = 36, ++ [0][1][2][1][RTW89_MKK][10] = 50, ++ [0][1][2][1][RTW89_IC][10] = 40, ++ [0][1][2][1][RTW89_KCC][10] = 62, ++ [0][1][2][1][RTW89_ACMA][10] = 36, ++ [0][1][2][1][RTW89_CHILE][10] = 36, ++ [0][1][2][1][RTW89_UKRAINE][10] = 28, ++ [0][1][2][1][RTW89_MEXICO][10] = 68, ++ [0][1][2][1][RTW89_CN][10] = 36, ++ [0][1][2][1][RTW89_QATAR][10] = 36, ++ [0][1][2][1][RTW89_UK][10] = 36, ++ [0][1][2][1][RTW89_FCC][12] = 68, ++ [0][1][2][1][RTW89_ETSI][12] = 36, ++ [0][1][2][1][RTW89_MKK][12] = 50, ++ [0][1][2][1][RTW89_IC][12] = 40, ++ [0][1][2][1][RTW89_KCC][12] = 62, ++ [0][1][2][1][RTW89_ACMA][12] = 36, ++ [0][1][2][1][RTW89_CHILE][12] = 36, ++ [0][1][2][1][RTW89_UKRAINE][12] = 28, ++ [0][1][2][1][RTW89_MEXICO][12] = 68, ++ [0][1][2][1][RTW89_CN][12] = 36, ++ [0][1][2][1][RTW89_QATAR][12] = 36, ++ [0][1][2][1][RTW89_UK][12] = 36, ++ [0][1][2][1][RTW89_FCC][14] = 68, ++ [0][1][2][1][RTW89_ETSI][14] = 36, ++ [0][1][2][1][RTW89_MKK][14] = 50, ++ [0][1][2][1][RTW89_IC][14] = 40, ++ [0][1][2][1][RTW89_KCC][14] = 62, ++ [0][1][2][1][RTW89_ACMA][14] = 36, ++ [0][1][2][1][RTW89_CHILE][14] = 36, ++ [0][1][2][1][RTW89_UKRAINE][14] = 28, ++ [0][1][2][1][RTW89_MEXICO][14] = 68, ++ [0][1][2][1][RTW89_CN][14] = 36, ++ [0][1][2][1][RTW89_QATAR][14] = 36, ++ [0][1][2][1][RTW89_UK][14] = 36, ++ [0][1][2][1][RTW89_FCC][15] = 68, ++ [0][1][2][1][RTW89_ETSI][15] = 36, ++ [0][1][2][1][RTW89_MKK][15] = 70, ++ [0][1][2][1][RTW89_IC][15] = 68, ++ [0][1][2][1][RTW89_KCC][15] = 62, ++ [0][1][2][1][RTW89_ACMA][15] = 36, ++ [0][1][2][1][RTW89_CHILE][15] = 36, ++ [0][1][2][1][RTW89_UKRAINE][15] = 28, ++ [0][1][2][1][RTW89_MEXICO][15] = 68, ++ [0][1][2][1][RTW89_CN][15] = 127, ++ [0][1][2][1][RTW89_QATAR][15] = 36, ++ [0][1][2][1][RTW89_UK][15] = 36, ++ [0][1][2][1][RTW89_FCC][17] = 68, ++ [0][1][2][1][RTW89_ETSI][17] = 36, ++ [0][1][2][1][RTW89_MKK][17] = 70, ++ [0][1][2][1][RTW89_IC][17] = 68, ++ [0][1][2][1][RTW89_KCC][17] = 62, ++ [0][1][2][1][RTW89_ACMA][17] = 36, ++ [0][1][2][1][RTW89_CHILE][17] = 36, ++ [0][1][2][1][RTW89_UKRAINE][17] = 28, ++ [0][1][2][1][RTW89_MEXICO][17] = 68, ++ [0][1][2][1][RTW89_CN][17] = 127, ++ [0][1][2][1][RTW89_QATAR][17] = 36, ++ [0][1][2][1][RTW89_UK][17] = 36, ++ [0][1][2][1][RTW89_FCC][19] = 68, ++ [0][1][2][1][RTW89_ETSI][19] = 36, ++ [0][1][2][1][RTW89_MKK][19] = 70, ++ [0][1][2][1][RTW89_IC][19] = 68, ++ [0][1][2][1][RTW89_KCC][19] = 62, ++ [0][1][2][1][RTW89_ACMA][19] = 36, ++ [0][1][2][1][RTW89_CHILE][19] = 36, ++ [0][1][2][1][RTW89_UKRAINE][19] = 28, ++ [0][1][2][1][RTW89_MEXICO][19] = 68, ++ [0][1][2][1][RTW89_CN][19] = 127, ++ [0][1][2][1][RTW89_QATAR][19] = 36, ++ [0][1][2][1][RTW89_UK][19] = 36, ++ [0][1][2][1][RTW89_FCC][21] = 68, ++ [0][1][2][1][RTW89_ETSI][21] = 36, ++ [0][1][2][1][RTW89_MKK][21] = 70, ++ [0][1][2][1][RTW89_IC][21] = 68, ++ [0][1][2][1][RTW89_KCC][21] = 62, ++ [0][1][2][1][RTW89_ACMA][21] = 36, ++ [0][1][2][1][RTW89_CHILE][21] = 36, ++ [0][1][2][1][RTW89_UKRAINE][21] = 28, ++ [0][1][2][1][RTW89_MEXICO][21] = 68, ++ [0][1][2][1][RTW89_CN][21] = 127, ++ [0][1][2][1][RTW89_QATAR][21] = 36, ++ [0][1][2][1][RTW89_UK][21] = 36, ++ [0][1][2][1][RTW89_FCC][23] = 68, ++ [0][1][2][1][RTW89_ETSI][23] = 36, ++ [0][1][2][1][RTW89_MKK][23] = 70, ++ [0][1][2][1][RTW89_IC][23] = 68, ++ [0][1][2][1][RTW89_KCC][23] = 62, ++ [0][1][2][1][RTW89_ACMA][23] = 36, ++ [0][1][2][1][RTW89_CHILE][23] = 36, ++ [0][1][2][1][RTW89_UKRAINE][23] = 28, ++ [0][1][2][1][RTW89_MEXICO][23] = 68, ++ [0][1][2][1][RTW89_CN][23] = 127, ++ [0][1][2][1][RTW89_QATAR][23] = 36, ++ [0][1][2][1][RTW89_UK][23] = 36, ++ [0][1][2][1][RTW89_FCC][25] = 66, ++ [0][1][2][1][RTW89_ETSI][25] = 36, ++ [0][1][2][1][RTW89_MKK][25] = 70, ++ [0][1][2][1][RTW89_IC][25] = 127, ++ [0][1][2][1][RTW89_KCC][25] = 62, ++ [0][1][2][1][RTW89_ACMA][25] = 127, ++ [0][1][2][1][RTW89_CHILE][25] = 36, ++ [0][1][2][1][RTW89_UKRAINE][25] = 28, ++ [0][1][2][1][RTW89_MEXICO][25] = 66, ++ [0][1][2][1][RTW89_CN][25] = 127, ++ [0][1][2][1][RTW89_QATAR][25] = 36, ++ [0][1][2][1][RTW89_UK][25] = 36, ++ [0][1][2][1][RTW89_FCC][27] = 66, ++ [0][1][2][1][RTW89_ETSI][27] = 36, ++ [0][1][2][1][RTW89_MKK][27] = 70, ++ [0][1][2][1][RTW89_IC][27] = 127, ++ [0][1][2][1][RTW89_KCC][27] = 62, ++ [0][1][2][1][RTW89_ACMA][27] = 127, ++ [0][1][2][1][RTW89_CHILE][27] = 36, ++ [0][1][2][1][RTW89_UKRAINE][27] = 28, ++ [0][1][2][1][RTW89_MEXICO][27] = 66, ++ [0][1][2][1][RTW89_CN][27] = 127, ++ [0][1][2][1][RTW89_QATAR][27] = 36, ++ [0][1][2][1][RTW89_UK][27] = 36, ++ [0][1][2][1][RTW89_FCC][29] = 66, ++ [0][1][2][1][RTW89_ETSI][29] = 36, ++ [0][1][2][1][RTW89_MKK][29] = 70, ++ [0][1][2][1][RTW89_IC][29] = 127, ++ [0][1][2][1][RTW89_KCC][29] = 62, ++ [0][1][2][1][RTW89_ACMA][29] = 127, ++ [0][1][2][1][RTW89_CHILE][29] = 36, ++ [0][1][2][1][RTW89_UKRAINE][29] = 28, ++ [0][1][2][1][RTW89_MEXICO][29] = 66, ++ [0][1][2][1][RTW89_CN][29] = 127, ++ [0][1][2][1][RTW89_QATAR][29] = 36, ++ [0][1][2][1][RTW89_UK][29] = 36, ++ [0][1][2][1][RTW89_FCC][31] = 66, ++ [0][1][2][1][RTW89_ETSI][31] = 36, ++ [0][1][2][1][RTW89_MKK][31] = 70, ++ [0][1][2][1][RTW89_IC][31] = 66, ++ [0][1][2][1][RTW89_KCC][31] = 62, ++ [0][1][2][1][RTW89_ACMA][31] = 36, ++ [0][1][2][1][RTW89_CHILE][31] = 36, ++ [0][1][2][1][RTW89_UKRAINE][31] = 28, ++ [0][1][2][1][RTW89_MEXICO][31] = 66, ++ [0][1][2][1][RTW89_CN][31] = 127, ++ [0][1][2][1][RTW89_QATAR][31] = 36, ++ [0][1][2][1][RTW89_UK][31] = 36, ++ [0][1][2][1][RTW89_FCC][33] = 66, ++ [0][1][2][1][RTW89_ETSI][33] = 36, ++ [0][1][2][1][RTW89_MKK][33] = 70, ++ [0][1][2][1][RTW89_IC][33] = 66, ++ [0][1][2][1][RTW89_KCC][33] = 62, ++ [0][1][2][1][RTW89_ACMA][33] = 36, ++ [0][1][2][1][RTW89_CHILE][33] = 36, ++ [0][1][2][1][RTW89_UKRAINE][33] = 28, ++ [0][1][2][1][RTW89_MEXICO][33] = 66, ++ [0][1][2][1][RTW89_CN][33] = 127, ++ [0][1][2][1][RTW89_QATAR][33] = 36, ++ [0][1][2][1][RTW89_UK][33] = 36, ++ [0][1][2][1][RTW89_FCC][35] = 66, ++ [0][1][2][1][RTW89_ETSI][35] = 36, ++ [0][1][2][1][RTW89_MKK][35] = 70, ++ [0][1][2][1][RTW89_IC][35] = 66, ++ [0][1][2][1][RTW89_KCC][35] = 62, ++ [0][1][2][1][RTW89_ACMA][35] = 36, ++ [0][1][2][1][RTW89_CHILE][35] = 36, ++ [0][1][2][1][RTW89_UKRAINE][35] = 28, ++ [0][1][2][1][RTW89_MEXICO][35] = 66, ++ [0][1][2][1][RTW89_CN][35] = 127, ++ [0][1][2][1][RTW89_QATAR][35] = 36, ++ [0][1][2][1][RTW89_UK][35] = 36, ++ [0][1][2][1][RTW89_FCC][37] = 68, ++ [0][1][2][1][RTW89_ETSI][37] = 127, ++ [0][1][2][1][RTW89_MKK][37] = 70, ++ [0][1][2][1][RTW89_IC][37] = 68, ++ [0][1][2][1][RTW89_KCC][37] = 62, ++ [0][1][2][1][RTW89_ACMA][37] = 70, ++ [0][1][2][1][RTW89_CHILE][37] = 36, ++ [0][1][2][1][RTW89_UKRAINE][37] = 127, ++ [0][1][2][1][RTW89_MEXICO][37] = 68, ++ [0][1][2][1][RTW89_CN][37] = 127, ++ [0][1][2][1][RTW89_QATAR][37] = 127, ++ [0][1][2][1][RTW89_UK][37] = 62, ++ [0][1][2][1][RTW89_FCC][38] = 78, ++ [0][1][2][1][RTW89_ETSI][38] = 4, ++ [0][1][2][1][RTW89_MKK][38] = 127, ++ [0][1][2][1][RTW89_IC][38] = 78, ++ [0][1][2][1][RTW89_KCC][38] = 62, ++ [0][1][2][1][RTW89_ACMA][38] = 74, ++ [0][1][2][1][RTW89_CHILE][38] = 36, ++ [0][1][2][1][RTW89_UKRAINE][38] = 4, ++ [0][1][2][1][RTW89_MEXICO][38] = 78, ++ [0][1][2][1][RTW89_CN][38] = 72, ++ [0][1][2][1][RTW89_QATAR][38] = 4, ++ [0][1][2][1][RTW89_UK][38] = 36, ++ [0][1][2][1][RTW89_FCC][40] = 78, ++ [0][1][2][1][RTW89_ETSI][40] = 4, ++ [0][1][2][1][RTW89_MKK][40] = 127, ++ [0][1][2][1][RTW89_IC][40] = 78, ++ [0][1][2][1][RTW89_KCC][40] = 62, ++ [0][1][2][1][RTW89_ACMA][40] = 74, ++ [0][1][2][1][RTW89_CHILE][40] = 36, ++ [0][1][2][1][RTW89_UKRAINE][40] = 4, ++ [0][1][2][1][RTW89_MEXICO][40] = 78, ++ [0][1][2][1][RTW89_CN][40] = 72, ++ [0][1][2][1][RTW89_QATAR][40] = 4, ++ [0][1][2][1][RTW89_UK][40] = 36, ++ [0][1][2][1][RTW89_FCC][42] = 78, ++ [0][1][2][1][RTW89_ETSI][42] = 4, ++ [0][1][2][1][RTW89_MKK][42] = 127, ++ [0][1][2][1][RTW89_IC][42] = 78, ++ [0][1][2][1][RTW89_KCC][42] = 62, ++ [0][1][2][1][RTW89_ACMA][42] = 76, ++ [0][1][2][1][RTW89_CHILE][42] = 36, ++ [0][1][2][1][RTW89_UKRAINE][42] = 4, ++ [0][1][2][1][RTW89_MEXICO][42] = 78, ++ [0][1][2][1][RTW89_CN][42] = 72, ++ [0][1][2][1][RTW89_QATAR][42] = 4, ++ [0][1][2][1][RTW89_UK][42] = 36, ++ [0][1][2][1][RTW89_FCC][44] = 78, ++ [0][1][2][1][RTW89_ETSI][44] = 4, ++ [0][1][2][1][RTW89_MKK][44] = 127, ++ [0][1][2][1][RTW89_IC][44] = 78, ++ [0][1][2][1][RTW89_KCC][44] = 62, ++ [0][1][2][1][RTW89_ACMA][44] = 76, ++ [0][1][2][1][RTW89_CHILE][44] = 36, ++ [0][1][2][1][RTW89_UKRAINE][44] = 4, ++ [0][1][2][1][RTW89_MEXICO][44] = 78, ++ [0][1][2][1][RTW89_CN][44] = 76, ++ [0][1][2][1][RTW89_QATAR][44] = 4, ++ [0][1][2][1][RTW89_UK][44] = 36, ++ [0][1][2][1][RTW89_FCC][46] = 78, ++ [0][1][2][1][RTW89_ETSI][46] = 4, ++ [0][1][2][1][RTW89_MKK][46] = 127, ++ [0][1][2][1][RTW89_IC][46] = 78, ++ [0][1][2][1][RTW89_KCC][46] = 62, ++ [0][1][2][1][RTW89_ACMA][46] = 76, ++ [0][1][2][1][RTW89_CHILE][46] = 36, ++ [0][1][2][1][RTW89_UKRAINE][46] = 4, ++ [0][1][2][1][RTW89_MEXICO][46] = 78, ++ [0][1][2][1][RTW89_CN][46] = 76, ++ [0][1][2][1][RTW89_QATAR][46] = 4, ++ [0][1][2][1][RTW89_UK][46] = 36, ++ [0][1][2][1][RTW89_FCC][48] = 58, ++ [0][1][2][1][RTW89_ETSI][48] = 127, ++ [0][1][2][1][RTW89_MKK][48] = 127, ++ [0][1][2][1][RTW89_IC][48] = 127, ++ [0][1][2][1][RTW89_KCC][48] = 127, ++ [0][1][2][1][RTW89_ACMA][48] = 127, ++ [0][1][2][1][RTW89_CHILE][48] = 127, ++ [0][1][2][1][RTW89_UKRAINE][48] = 127, ++ [0][1][2][1][RTW89_MEXICO][48] = 127, ++ [0][1][2][1][RTW89_CN][48] = 127, ++ [0][1][2][1][RTW89_QATAR][48] = 127, ++ [0][1][2][1][RTW89_UK][48] = 127, ++ [0][1][2][1][RTW89_FCC][50] = 58, ++ [0][1][2][1][RTW89_ETSI][50] = 127, ++ [0][1][2][1][RTW89_MKK][50] = 127, ++ [0][1][2][1][RTW89_IC][50] = 127, ++ [0][1][2][1][RTW89_KCC][50] = 127, ++ [0][1][2][1][RTW89_ACMA][50] = 127, ++ [0][1][2][1][RTW89_CHILE][50] = 127, ++ [0][1][2][1][RTW89_UKRAINE][50] = 127, ++ [0][1][2][1][RTW89_MEXICO][50] = 127, ++ [0][1][2][1][RTW89_CN][50] = 127, ++ [0][1][2][1][RTW89_QATAR][50] = 127, ++ [0][1][2][1][RTW89_UK][50] = 127, ++ [0][1][2][1][RTW89_FCC][52] = 58, ++ [0][1][2][1][RTW89_ETSI][52] = 127, ++ [0][1][2][1][RTW89_MKK][52] = 127, ++ [0][1][2][1][RTW89_IC][52] = 127, ++ [0][1][2][1][RTW89_KCC][52] = 127, ++ [0][1][2][1][RTW89_ACMA][52] = 127, ++ [0][1][2][1][RTW89_CHILE][52] = 127, ++ [0][1][2][1][RTW89_UKRAINE][52] = 127, ++ [0][1][2][1][RTW89_MEXICO][52] = 127, ++ [0][1][2][1][RTW89_CN][52] = 127, ++ [0][1][2][1][RTW89_QATAR][52] = 127, ++ [0][1][2][1][RTW89_UK][52] = 127, ++ [1][0][2][0][RTW89_FCC][1] = 66, ++ [1][0][2][0][RTW89_ETSI][1] = 64, ++ [1][0][2][0][RTW89_MKK][1] = 62, ++ [1][0][2][0][RTW89_IC][1] = 64, ++ [1][0][2][0][RTW89_KCC][1] = 70, ++ [1][0][2][0][RTW89_ACMA][1] = 64, ++ [1][0][2][0][RTW89_CHILE][1] = 42, ++ [1][0][2][0][RTW89_UKRAINE][1] = 52, ++ [1][0][2][0][RTW89_MEXICO][1] = 62, ++ [1][0][2][0][RTW89_CN][1] = 62, ++ [1][0][2][0][RTW89_QATAR][1] = 64, ++ [1][0][2][0][RTW89_UK][1] = 64, ++ [1][0][2][0][RTW89_FCC][5] = 78, ++ [1][0][2][0][RTW89_ETSI][5] = 64, ++ [1][0][2][0][RTW89_MKK][5] = 62, ++ [1][0][2][0][RTW89_IC][5] = 64, ++ [1][0][2][0][RTW89_KCC][5] = 66, ++ [1][0][2][0][RTW89_ACMA][5] = 64, ++ [1][0][2][0][RTW89_CHILE][5] = 42, ++ [1][0][2][0][RTW89_UKRAINE][5] = 52, ++ [1][0][2][0][RTW89_MEXICO][5] = 62, ++ [1][0][2][0][RTW89_CN][5] = 62, ++ [1][0][2][0][RTW89_QATAR][5] = 64, ++ [1][0][2][0][RTW89_UK][5] = 64, ++ [1][0][2][0][RTW89_FCC][9] = 78, ++ [1][0][2][0][RTW89_ETSI][9] = 64, ++ [1][0][2][0][RTW89_MKK][9] = 62, ++ [1][0][2][0][RTW89_IC][9] = 64, ++ [1][0][2][0][RTW89_KCC][9] = 74, ++ [1][0][2][0][RTW89_ACMA][9] = 64, ++ [1][0][2][0][RTW89_CHILE][9] = 66, ++ [1][0][2][0][RTW89_UKRAINE][9] = 52, ++ [1][0][2][0][RTW89_MEXICO][9] = 78, ++ [1][0][2][0][RTW89_CN][9] = 62, ++ [1][0][2][0][RTW89_QATAR][9] = 64, ++ [1][0][2][0][RTW89_UK][9] = 64, ++ [1][0][2][0][RTW89_FCC][13] = 66, ++ [1][0][2][0][RTW89_ETSI][13] = 64, ++ [1][0][2][0][RTW89_MKK][13] = 62, ++ [1][0][2][0][RTW89_IC][13] = 64, ++ [1][0][2][0][RTW89_KCC][13] = 68, ++ [1][0][2][0][RTW89_ACMA][13] = 64, ++ [1][0][2][0][RTW89_CHILE][13] = 66, ++ [1][0][2][0][RTW89_UKRAINE][13] = 52, ++ [1][0][2][0][RTW89_MEXICO][13] = 66, ++ [1][0][2][0][RTW89_CN][13] = 62, ++ [1][0][2][0][RTW89_QATAR][13] = 64, ++ [1][0][2][0][RTW89_UK][13] = 64, ++ [1][0][2][0][RTW89_FCC][16] = 64, ++ [1][0][2][0][RTW89_ETSI][16] = 64, ++ [1][0][2][0][RTW89_MKK][16] = 74, ++ [1][0][2][0][RTW89_IC][16] = 64, ++ [1][0][2][0][RTW89_KCC][16] = 70, ++ [1][0][2][0][RTW89_ACMA][16] = 64, ++ [1][0][2][0][RTW89_CHILE][16] = 64, ++ [1][0][2][0][RTW89_UKRAINE][16] = 52, ++ [1][0][2][0][RTW89_MEXICO][16] = 64, ++ [1][0][2][0][RTW89_CN][16] = 127, ++ [1][0][2][0][RTW89_QATAR][16] = 64, ++ [1][0][2][0][RTW89_UK][16] = 64, ++ [1][0][2][0][RTW89_FCC][20] = 78, ++ [1][0][2][0][RTW89_ETSI][20] = 64, ++ [1][0][2][0][RTW89_MKK][20] = 74, ++ [1][0][2][0][RTW89_IC][20] = 78, ++ [1][0][2][0][RTW89_KCC][20] = 70, ++ [1][0][2][0][RTW89_ACMA][20] = 64, ++ [1][0][2][0][RTW89_CHILE][20] = 62, ++ [1][0][2][0][RTW89_UKRAINE][20] = 52, ++ [1][0][2][0][RTW89_MEXICO][20] = 78, ++ [1][0][2][0][RTW89_CN][20] = 127, ++ [1][0][2][0][RTW89_QATAR][20] = 64, ++ [1][0][2][0][RTW89_UK][20] = 64, ++ [1][0][2][0][RTW89_FCC][24] = 78, ++ [1][0][2][0][RTW89_ETSI][24] = 64, ++ [1][0][2][0][RTW89_MKK][24] = 74, ++ [1][0][2][0][RTW89_IC][24] = 127, ++ [1][0][2][0][RTW89_KCC][24] = 70, ++ [1][0][2][0][RTW89_ACMA][24] = 127, ++ [1][0][2][0][RTW89_CHILE][24] = 62, ++ [1][0][2][0][RTW89_UKRAINE][24] = 52, ++ [1][0][2][0][RTW89_MEXICO][24] = 78, ++ [1][0][2][0][RTW89_CN][24] = 127, ++ [1][0][2][0][RTW89_QATAR][24] = 64, ++ [1][0][2][0][RTW89_UK][24] = 64, ++ [1][0][2][0][RTW89_FCC][28] = 78, ++ [1][0][2][0][RTW89_ETSI][28] = 64, ++ [1][0][2][0][RTW89_MKK][28] = 74, ++ [1][0][2][0][RTW89_IC][28] = 127, ++ [1][0][2][0][RTW89_KCC][28] = 74, ++ [1][0][2][0][RTW89_ACMA][28] = 127, ++ [1][0][2][0][RTW89_CHILE][28] = 64, ++ [1][0][2][0][RTW89_UKRAINE][28] = 52, ++ [1][0][2][0][RTW89_MEXICO][28] = 78, ++ [1][0][2][0][RTW89_CN][28] = 127, ++ [1][0][2][0][RTW89_QATAR][28] = 64, ++ [1][0][2][0][RTW89_UK][28] = 64, ++ [1][0][2][0][RTW89_FCC][32] = 76, ++ [1][0][2][0][RTW89_ETSI][32] = 64, ++ [1][0][2][0][RTW89_MKK][32] = 74, ++ [1][0][2][0][RTW89_IC][32] = 76, ++ [1][0][2][0][RTW89_KCC][32] = 74, ++ [1][0][2][0][RTW89_ACMA][32] = 64, ++ [1][0][2][0][RTW89_CHILE][32] = 64, ++ [1][0][2][0][RTW89_UKRAINE][32] = 52, ++ [1][0][2][0][RTW89_MEXICO][32] = 76, ++ [1][0][2][0][RTW89_CN][32] = 127, ++ [1][0][2][0][RTW89_QATAR][32] = 64, ++ [1][0][2][0][RTW89_UK][32] = 64, ++ [1][0][2][0][RTW89_FCC][36] = 78, ++ [1][0][2][0][RTW89_ETSI][36] = 127, ++ [1][0][2][0][RTW89_MKK][36] = 74, ++ [1][0][2][0][RTW89_IC][36] = 78, ++ [1][0][2][0][RTW89_KCC][36] = 74, ++ [1][0][2][0][RTW89_ACMA][36] = 74, ++ [1][0][2][0][RTW89_CHILE][36] = 64, ++ [1][0][2][0][RTW89_UKRAINE][36] = 127, ++ [1][0][2][0][RTW89_MEXICO][36] = 78, ++ [1][0][2][0][RTW89_CN][36] = 127, ++ [1][0][2][0][RTW89_QATAR][36] = 127, ++ [1][0][2][0][RTW89_UK][36] = 74, ++ [1][0][2][0][RTW89_FCC][39] = 78, ++ [1][0][2][0][RTW89_ETSI][39] = 28, ++ [1][0][2][0][RTW89_MKK][39] = 127, ++ [1][0][2][0][RTW89_IC][39] = 78, ++ [1][0][2][0][RTW89_KCC][39] = 74, ++ [1][0][2][0][RTW89_ACMA][39] = 74, ++ [1][0][2][0][RTW89_CHILE][39] = 64, ++ [1][0][2][0][RTW89_UKRAINE][39] = 28, ++ [1][0][2][0][RTW89_MEXICO][39] = 78, ++ [1][0][2][0][RTW89_CN][39] = 70, ++ [1][0][2][0][RTW89_QATAR][39] = 28, ++ [1][0][2][0][RTW89_UK][39] = 64, ++ [1][0][2][0][RTW89_FCC][43] = 78, ++ [1][0][2][0][RTW89_ETSI][43] = 28, ++ [1][0][2][0][RTW89_MKK][43] = 127, ++ [1][0][2][0][RTW89_IC][43] = 78, ++ [1][0][2][0][RTW89_KCC][43] = 74, ++ [1][0][2][0][RTW89_ACMA][43] = 74, ++ [1][0][2][0][RTW89_CHILE][43] = 64, ++ [1][0][2][0][RTW89_UKRAINE][43] = 28, ++ [1][0][2][0][RTW89_MEXICO][43] = 78, ++ [1][0][2][0][RTW89_CN][43] = 74, ++ [1][0][2][0][RTW89_QATAR][43] = 28, ++ [1][0][2][0][RTW89_UK][43] = 62, ++ [1][0][2][0][RTW89_FCC][47] = 78, ++ [1][0][2][0][RTW89_ETSI][47] = 127, ++ [1][0][2][0][RTW89_MKK][47] = 127, ++ [1][0][2][0][RTW89_IC][47] = 127, ++ [1][0][2][0][RTW89_KCC][47] = 127, ++ [1][0][2][0][RTW89_ACMA][47] = 127, ++ [1][0][2][0][RTW89_CHILE][47] = 127, ++ [1][0][2][0][RTW89_UKRAINE][47] = 127, ++ [1][0][2][0][RTW89_MEXICO][47] = 127, ++ [1][0][2][0][RTW89_CN][47] = 127, ++ [1][0][2][0][RTW89_QATAR][47] = 127, ++ [1][0][2][0][RTW89_UK][47] = 127, ++ [1][0][2][0][RTW89_FCC][51] = 70, ++ [1][0][2][0][RTW89_ETSI][51] = 127, ++ [1][0][2][0][RTW89_MKK][51] = 127, ++ [1][0][2][0][RTW89_IC][51] = 127, ++ [1][0][2][0][RTW89_KCC][51] = 127, ++ [1][0][2][0][RTW89_ACMA][51] = 127, ++ [1][0][2][0][RTW89_CHILE][51] = 127, ++ [1][0][2][0][RTW89_UKRAINE][51] = 127, ++ [1][0][2][0][RTW89_MEXICO][51] = 127, ++ [1][0][2][0][RTW89_CN][51] = 127, ++ [1][0][2][0][RTW89_QATAR][51] = 127, ++ [1][0][2][0][RTW89_UK][51] = 127, ++ [1][1][2][0][RTW89_FCC][1] = 62, ++ [1][1][2][0][RTW89_ETSI][1] = 52, ++ [1][1][2][0][RTW89_MKK][1] = 50, ++ [1][1][2][0][RTW89_IC][1] = 52, ++ [1][1][2][0][RTW89_KCC][1] = 58, ++ [1][1][2][0][RTW89_ACMA][1] = 52, ++ [1][1][2][0][RTW89_CHILE][1] = 30, ++ [1][1][2][0][RTW89_UKRAINE][1] = 40, ++ [1][1][2][0][RTW89_MEXICO][1] = 50, ++ [1][1][2][0][RTW89_CN][1] = 50, ++ [1][1][2][0][RTW89_QATAR][1] = 52, ++ [1][1][2][0][RTW89_UK][1] = 52, ++ [1][1][2][0][RTW89_FCC][5] = 76, ++ [1][1][2][0][RTW89_ETSI][5] = 52, ++ [1][1][2][0][RTW89_MKK][5] = 50, ++ [1][1][2][0][RTW89_IC][5] = 52, ++ [1][1][2][0][RTW89_KCC][5] = 48, ++ [1][1][2][0][RTW89_ACMA][5] = 52, ++ [1][1][2][0][RTW89_CHILE][5] = 30, ++ [1][1][2][0][RTW89_UKRAINE][5] = 40, ++ [1][1][2][0][RTW89_MEXICO][5] = 50, ++ [1][1][2][0][RTW89_CN][5] = 50, ++ [1][1][2][0][RTW89_QATAR][5] = 52, ++ [1][1][2][0][RTW89_UK][5] = 52, ++ [1][1][2][0][RTW89_FCC][9] = 76, ++ [1][1][2][0][RTW89_ETSI][9] = 52, ++ [1][1][2][0][RTW89_MKK][9] = 50, ++ [1][1][2][0][RTW89_IC][9] = 52, ++ [1][1][2][0][RTW89_KCC][9] = 60, ++ [1][1][2][0][RTW89_ACMA][9] = 52, ++ [1][1][2][0][RTW89_CHILE][9] = 50, ++ [1][1][2][0][RTW89_UKRAINE][9] = 40, ++ [1][1][2][0][RTW89_MEXICO][9] = 76, ++ [1][1][2][0][RTW89_CN][9] = 50, ++ [1][1][2][0][RTW89_QATAR][9] = 52, ++ [1][1][2][0][RTW89_UK][9] = 52, ++ [1][1][2][0][RTW89_FCC][13] = 62, ++ [1][1][2][0][RTW89_ETSI][13] = 52, ++ [1][1][2][0][RTW89_MKK][13] = 50, ++ [1][1][2][0][RTW89_IC][13] = 52, ++ [1][1][2][0][RTW89_KCC][13] = 58, ++ [1][1][2][0][RTW89_ACMA][13] = 52, ++ [1][1][2][0][RTW89_CHILE][13] = 48, ++ [1][1][2][0][RTW89_UKRAINE][13] = 40, ++ [1][1][2][0][RTW89_MEXICO][13] = 62, ++ [1][1][2][0][RTW89_CN][13] = 50, ++ [1][1][2][0][RTW89_QATAR][13] = 52, ++ [1][1][2][0][RTW89_UK][13] = 52, ++ [1][1][2][0][RTW89_FCC][16] = 56, ++ [1][1][2][0][RTW89_ETSI][16] = 52, ++ [1][1][2][0][RTW89_MKK][16] = 70, ++ [1][1][2][0][RTW89_IC][16] = 56, ++ [1][1][2][0][RTW89_KCC][16] = 58, ++ [1][1][2][0][RTW89_ACMA][16] = 52, ++ [1][1][2][0][RTW89_CHILE][16] = 48, ++ [1][1][2][0][RTW89_UKRAINE][16] = 40, ++ [1][1][2][0][RTW89_MEXICO][16] = 56, ++ [1][1][2][0][RTW89_CN][16] = 127, ++ [1][1][2][0][RTW89_QATAR][16] = 52, ++ [1][1][2][0][RTW89_UK][16] = 52, ++ [1][1][2][0][RTW89_FCC][20] = 76, ++ [1][1][2][0][RTW89_ETSI][20] = 52, ++ [1][1][2][0][RTW89_MKK][20] = 70, ++ [1][1][2][0][RTW89_IC][20] = 76, ++ [1][1][2][0][RTW89_KCC][20] = 58, ++ [1][1][2][0][RTW89_ACMA][20] = 52, ++ [1][1][2][0][RTW89_CHILE][20] = 50, ++ [1][1][2][0][RTW89_UKRAINE][20] = 40, ++ [1][1][2][0][RTW89_MEXICO][20] = 76, ++ [1][1][2][0][RTW89_CN][20] = 127, ++ [1][1][2][0][RTW89_QATAR][20] = 52, ++ [1][1][2][0][RTW89_UK][20] = 52, ++ [1][1][2][0][RTW89_FCC][24] = 76, ++ [1][1][2][0][RTW89_ETSI][24] = 52, ++ [1][1][2][0][RTW89_MKK][24] = 70, ++ [1][1][2][0][RTW89_IC][24] = 127, ++ [1][1][2][0][RTW89_KCC][24] = 58, ++ [1][1][2][0][RTW89_ACMA][24] = 127, ++ [1][1][2][0][RTW89_CHILE][24] = 50, ++ [1][1][2][0][RTW89_UKRAINE][24] = 40, ++ [1][1][2][0][RTW89_MEXICO][24] = 76, ++ [1][1][2][0][RTW89_CN][24] = 127, ++ [1][1][2][0][RTW89_QATAR][24] = 52, ++ [1][1][2][0][RTW89_UK][24] = 52, ++ [1][1][2][0][RTW89_FCC][28] = 76, ++ [1][1][2][0][RTW89_ETSI][28] = 52, ++ [1][1][2][0][RTW89_MKK][28] = 70, ++ [1][1][2][0][RTW89_IC][28] = 127, ++ [1][1][2][0][RTW89_KCC][28] = 60, ++ [1][1][2][0][RTW89_ACMA][28] = 127, ++ [1][1][2][0][RTW89_CHILE][28] = 48, ++ [1][1][2][0][RTW89_UKRAINE][28] = 40, ++ [1][1][2][0][RTW89_MEXICO][28] = 76, ++ [1][1][2][0][RTW89_CN][28] = 127, ++ [1][1][2][0][RTW89_QATAR][28] = 52, ++ [1][1][2][0][RTW89_UK][28] = 52, ++ [1][1][2][0][RTW89_FCC][32] = 68, ++ [1][1][2][0][RTW89_ETSI][32] = 52, ++ [1][1][2][0][RTW89_MKK][32] = 70, ++ [1][1][2][0][RTW89_IC][32] = 68, ++ [1][1][2][0][RTW89_KCC][32] = 60, ++ [1][1][2][0][RTW89_ACMA][32] = 52, ++ [1][1][2][0][RTW89_CHILE][32] = 48, ++ [1][1][2][0][RTW89_UKRAINE][32] = 40, ++ [1][1][2][0][RTW89_MEXICO][32] = 68, ++ [1][1][2][0][RTW89_CN][32] = 127, ++ [1][1][2][0][RTW89_QATAR][32] = 52, ++ [1][1][2][0][RTW89_UK][32] = 52, ++ [1][1][2][0][RTW89_FCC][36] = 76, ++ [1][1][2][0][RTW89_ETSI][36] = 127, ++ [1][1][2][0][RTW89_MKK][36] = 70, ++ [1][1][2][0][RTW89_IC][36] = 76, ++ [1][1][2][0][RTW89_KCC][36] = 60, ++ [1][1][2][0][RTW89_ACMA][36] = 74, ++ [1][1][2][0][RTW89_CHILE][36] = 50, ++ [1][1][2][0][RTW89_UKRAINE][36] = 127, ++ [1][1][2][0][RTW89_MEXICO][36] = 76, ++ [1][1][2][0][RTW89_CN][36] = 127, ++ [1][1][2][0][RTW89_QATAR][36] = 127, ++ [1][1][2][0][RTW89_UK][36] = 74, ++ [1][1][2][0][RTW89_FCC][39] = 78, ++ [1][1][2][0][RTW89_ETSI][39] = 16, ++ [1][1][2][0][RTW89_MKK][39] = 127, ++ [1][1][2][0][RTW89_IC][39] = 78, ++ [1][1][2][0][RTW89_KCC][39] = 58, ++ [1][1][2][0][RTW89_ACMA][39] = 72, ++ [1][1][2][0][RTW89_CHILE][39] = 52, ++ [1][1][2][0][RTW89_UKRAINE][39] = 16, ++ [1][1][2][0][RTW89_MEXICO][39] = 78, ++ [1][1][2][0][RTW89_CN][39] = 70, ++ [1][1][2][0][RTW89_QATAR][39] = 16, ++ [1][1][2][0][RTW89_UK][39] = 52, ++ [1][1][2][0][RTW89_FCC][43] = 78, ++ [1][1][2][0][RTW89_ETSI][43] = 16, ++ [1][1][2][0][RTW89_MKK][43] = 127, ++ [1][1][2][0][RTW89_IC][43] = 78, ++ [1][1][2][0][RTW89_KCC][43] = 58, ++ [1][1][2][0][RTW89_ACMA][43] = 74, ++ [1][1][2][0][RTW89_CHILE][43] = 52, ++ [1][1][2][0][RTW89_UKRAINE][43] = 16, ++ [1][1][2][0][RTW89_MEXICO][43] = 78, ++ [1][1][2][0][RTW89_CN][43] = 74, ++ [1][1][2][0][RTW89_QATAR][43] = 16, ++ [1][1][2][0][RTW89_UK][43] = 52, ++ [1][1][2][0][RTW89_FCC][47] = 68, ++ [1][1][2][0][RTW89_ETSI][47] = 127, ++ [1][1][2][0][RTW89_MKK][47] = 127, ++ [1][1][2][0][RTW89_IC][47] = 127, ++ [1][1][2][0][RTW89_KCC][47] = 127, ++ [1][1][2][0][RTW89_ACMA][47] = 127, ++ [1][1][2][0][RTW89_CHILE][47] = 127, ++ [1][1][2][0][RTW89_UKRAINE][47] = 127, ++ [1][1][2][0][RTW89_MEXICO][47] = 127, ++ [1][1][2][0][RTW89_CN][47] = 127, ++ [1][1][2][0][RTW89_QATAR][47] = 127, ++ [1][1][2][0][RTW89_UK][47] = 127, ++ [1][1][2][0][RTW89_FCC][51] = 66, ++ [1][1][2][0][RTW89_ETSI][51] = 127, ++ [1][1][2][0][RTW89_MKK][51] = 127, ++ [1][1][2][0][RTW89_IC][51] = 127, ++ [1][1][2][0][RTW89_KCC][51] = 127, ++ [1][1][2][0][RTW89_ACMA][51] = 127, ++ [1][1][2][0][RTW89_CHILE][51] = 127, ++ [1][1][2][0][RTW89_UKRAINE][51] = 127, ++ [1][1][2][0][RTW89_MEXICO][51] = 127, ++ [1][1][2][0][RTW89_CN][51] = 127, ++ [1][1][2][0][RTW89_QATAR][51] = 127, ++ [1][1][2][0][RTW89_UK][51] = 127, ++ [1][1][2][1][RTW89_FCC][1] = 62, ++ [1][1][2][1][RTW89_ETSI][1] = 40, ++ [1][1][2][1][RTW89_MKK][1] = 50, ++ [1][1][2][1][RTW89_IC][1] = 40, ++ [1][1][2][1][RTW89_KCC][1] = 58, ++ [1][1][2][1][RTW89_ACMA][1] = 40, ++ [1][1][2][1][RTW89_CHILE][1] = 16, ++ [1][1][2][1][RTW89_UKRAINE][1] = 28, ++ [1][1][2][1][RTW89_MEXICO][1] = 50, ++ [1][1][2][1][RTW89_CN][1] = 38, ++ [1][1][2][1][RTW89_QATAR][1] = 40, ++ [1][1][2][1][RTW89_UK][1] = 40, ++ [1][1][2][1][RTW89_FCC][5] = 68, ++ [1][1][2][1][RTW89_ETSI][5] = 40, ++ [1][1][2][1][RTW89_MKK][5] = 50, ++ [1][1][2][1][RTW89_IC][5] = 40, ++ [1][1][2][1][RTW89_KCC][5] = 48, ++ [1][1][2][1][RTW89_ACMA][5] = 40, ++ [1][1][2][1][RTW89_CHILE][5] = 16, ++ [1][1][2][1][RTW89_UKRAINE][5] = 28, ++ [1][1][2][1][RTW89_MEXICO][5] = 50, ++ [1][1][2][1][RTW89_CN][5] = 38, ++ [1][1][2][1][RTW89_QATAR][5] = 40, ++ [1][1][2][1][RTW89_UK][5] = 40, ++ [1][1][2][1][RTW89_FCC][9] = 68, ++ [1][1][2][1][RTW89_ETSI][9] = 40, ++ [1][1][2][1][RTW89_MKK][9] = 50, ++ [1][1][2][1][RTW89_IC][9] = 40, ++ [1][1][2][1][RTW89_KCC][9] = 60, ++ [1][1][2][1][RTW89_ACMA][9] = 40, ++ [1][1][2][1][RTW89_CHILE][9] = 36, ++ [1][1][2][1][RTW89_UKRAINE][9] = 28, ++ [1][1][2][1][RTW89_MEXICO][9] = 68, ++ [1][1][2][1][RTW89_CN][9] = 38, ++ [1][1][2][1][RTW89_QATAR][9] = 40, ++ [1][1][2][1][RTW89_UK][9] = 40, ++ [1][1][2][1][RTW89_FCC][13] = 62, ++ [1][1][2][1][RTW89_ETSI][13] = 40, ++ [1][1][2][1][RTW89_MKK][13] = 50, ++ [1][1][2][1][RTW89_IC][13] = 40, ++ [1][1][2][1][RTW89_KCC][13] = 58, ++ [1][1][2][1][RTW89_ACMA][13] = 40, ++ [1][1][2][1][RTW89_CHILE][13] = 36, ++ [1][1][2][1][RTW89_UKRAINE][13] = 28, ++ [1][1][2][1][RTW89_MEXICO][13] = 62, ++ [1][1][2][1][RTW89_CN][13] = 38, ++ [1][1][2][1][RTW89_QATAR][13] = 40, ++ [1][1][2][1][RTW89_UK][13] = 40, ++ [1][1][2][1][RTW89_FCC][16] = 56, ++ [1][1][2][1][RTW89_ETSI][16] = 40, ++ [1][1][2][1][RTW89_MKK][16] = 70, ++ [1][1][2][1][RTW89_IC][16] = 56, ++ [1][1][2][1][RTW89_KCC][16] = 58, ++ [1][1][2][1][RTW89_ACMA][16] = 40, ++ [1][1][2][1][RTW89_CHILE][16] = 36, ++ [1][1][2][1][RTW89_UKRAINE][16] = 28, ++ [1][1][2][1][RTW89_MEXICO][16] = 56, ++ [1][1][2][1][RTW89_CN][16] = 127, ++ [1][1][2][1][RTW89_QATAR][16] = 40, ++ [1][1][2][1][RTW89_UK][16] = 40, ++ [1][1][2][1][RTW89_FCC][20] = 68, ++ [1][1][2][1][RTW89_ETSI][20] = 40, ++ [1][1][2][1][RTW89_MKK][20] = 70, ++ [1][1][2][1][RTW89_IC][20] = 68, ++ [1][1][2][1][RTW89_KCC][20] = 58, ++ [1][1][2][1][RTW89_ACMA][20] = 40, ++ [1][1][2][1][RTW89_CHILE][20] = 36, ++ [1][1][2][1][RTW89_UKRAINE][20] = 28, ++ [1][1][2][1][RTW89_MEXICO][20] = 68, ++ [1][1][2][1][RTW89_CN][20] = 127, ++ [1][1][2][1][RTW89_QATAR][20] = 40, ++ [1][1][2][1][RTW89_UK][20] = 40, ++ [1][1][2][1][RTW89_FCC][24] = 68, ++ [1][1][2][1][RTW89_ETSI][24] = 40, ++ [1][1][2][1][RTW89_MKK][24] = 70, ++ [1][1][2][1][RTW89_IC][24] = 127, ++ [1][1][2][1][RTW89_KCC][24] = 58, ++ [1][1][2][1][RTW89_ACMA][24] = 127, ++ [1][1][2][1][RTW89_CHILE][24] = 36, ++ [1][1][2][1][RTW89_UKRAINE][24] = 28, ++ [1][1][2][1][RTW89_MEXICO][24] = 68, ++ [1][1][2][1][RTW89_CN][24] = 127, ++ [1][1][2][1][RTW89_QATAR][24] = 40, ++ [1][1][2][1][RTW89_UK][24] = 40, ++ [1][1][2][1][RTW89_FCC][28] = 68, ++ [1][1][2][1][RTW89_ETSI][28] = 40, ++ [1][1][2][1][RTW89_MKK][28] = 70, ++ [1][1][2][1][RTW89_IC][28] = 127, ++ [1][1][2][1][RTW89_KCC][28] = 60, ++ [1][1][2][1][RTW89_ACMA][28] = 127, ++ [1][1][2][1][RTW89_CHILE][28] = 36, ++ [1][1][2][1][RTW89_UKRAINE][28] = 28, ++ [1][1][2][1][RTW89_MEXICO][28] = 68, ++ [1][1][2][1][RTW89_CN][28] = 127, ++ [1][1][2][1][RTW89_QATAR][28] = 40, ++ [1][1][2][1][RTW89_UK][28] = 40, ++ [1][1][2][1][RTW89_FCC][32] = 68, ++ [1][1][2][1][RTW89_ETSI][32] = 40, ++ [1][1][2][1][RTW89_MKK][32] = 70, ++ [1][1][2][1][RTW89_IC][32] = 68, ++ [1][1][2][1][RTW89_KCC][32] = 60, ++ [1][1][2][1][RTW89_ACMA][32] = 40, ++ [1][1][2][1][RTW89_CHILE][32] = 36, ++ [1][1][2][1][RTW89_UKRAINE][32] = 28, ++ [1][1][2][1][RTW89_MEXICO][32] = 68, ++ [1][1][2][1][RTW89_CN][32] = 127, ++ [1][1][2][1][RTW89_QATAR][32] = 40, ++ [1][1][2][1][RTW89_UK][32] = 40, ++ [1][1][2][1][RTW89_FCC][36] = 68, ++ [1][1][2][1][RTW89_ETSI][36] = 127, ++ [1][1][2][1][RTW89_MKK][36] = 70, ++ [1][1][2][1][RTW89_IC][36] = 68, ++ [1][1][2][1][RTW89_KCC][36] = 60, ++ [1][1][2][1][RTW89_ACMA][36] = 70, ++ [1][1][2][1][RTW89_CHILE][36] = 36, ++ [1][1][2][1][RTW89_UKRAINE][36] = 127, ++ [1][1][2][1][RTW89_MEXICO][36] = 68, ++ [1][1][2][1][RTW89_CN][36] = 127, ++ [1][1][2][1][RTW89_QATAR][36] = 127, ++ [1][1][2][1][RTW89_UK][36] = 62, ++ [1][1][2][1][RTW89_FCC][39] = 78, ++ [1][1][2][1][RTW89_ETSI][39] = 4, ++ [1][1][2][1][RTW89_MKK][39] = 127, ++ [1][1][2][1][RTW89_IC][39] = 78, ++ [1][1][2][1][RTW89_KCC][39] = 58, ++ [1][1][2][1][RTW89_ACMA][39] = 72, ++ [1][1][2][1][RTW89_CHILE][39] = 36, ++ [1][1][2][1][RTW89_UKRAINE][39] = 4, ++ [1][1][2][1][RTW89_MEXICO][39] = 78, ++ [1][1][2][1][RTW89_CN][39] = 70, ++ [1][1][2][1][RTW89_QATAR][39] = 4, ++ [1][1][2][1][RTW89_UK][39] = 40, ++ [1][1][2][1][RTW89_FCC][43] = 78, ++ [1][1][2][1][RTW89_ETSI][43] = 4, ++ [1][1][2][1][RTW89_MKK][43] = 127, ++ [1][1][2][1][RTW89_IC][43] = 78, ++ [1][1][2][1][RTW89_KCC][43] = 58, ++ [1][1][2][1][RTW89_ACMA][43] = 74, ++ [1][1][2][1][RTW89_CHILE][43] = 36, ++ [1][1][2][1][RTW89_UKRAINE][43] = 4, ++ [1][1][2][1][RTW89_MEXICO][43] = 78, ++ [1][1][2][1][RTW89_CN][43] = 74, ++ [1][1][2][1][RTW89_QATAR][43] = 4, ++ [1][1][2][1][RTW89_UK][43] = 40, ++ [1][1][2][1][RTW89_FCC][47] = 68, ++ [1][1][2][1][RTW89_ETSI][47] = 127, ++ [1][1][2][1][RTW89_MKK][47] = 127, ++ [1][1][2][1][RTW89_IC][47] = 127, ++ [1][1][2][1][RTW89_KCC][47] = 127, ++ [1][1][2][1][RTW89_ACMA][47] = 127, ++ [1][1][2][1][RTW89_CHILE][47] = 127, ++ [1][1][2][1][RTW89_UKRAINE][47] = 127, ++ [1][1][2][1][RTW89_MEXICO][47] = 127, ++ [1][1][2][1][RTW89_CN][47] = 127, ++ [1][1][2][1][RTW89_QATAR][47] = 127, ++ [1][1][2][1][RTW89_UK][47] = 127, ++ [1][1][2][1][RTW89_FCC][51] = 66, ++ [1][1][2][1][RTW89_ETSI][51] = 127, ++ [1][1][2][1][RTW89_MKK][51] = 127, ++ [1][1][2][1][RTW89_IC][51] = 127, ++ [1][1][2][1][RTW89_KCC][51] = 127, ++ [1][1][2][1][RTW89_ACMA][51] = 127, ++ [1][1][2][1][RTW89_CHILE][51] = 127, ++ [1][1][2][1][RTW89_UKRAINE][51] = 127, ++ [1][1][2][1][RTW89_MEXICO][51] = 127, ++ [1][1][2][1][RTW89_CN][51] = 127, ++ [1][1][2][1][RTW89_QATAR][51] = 127, ++ [1][1][2][1][RTW89_UK][51] = 127, ++ [2][0][2][0][RTW89_FCC][3] = 64, ++ [2][0][2][0][RTW89_ETSI][3] = 64, ++ [2][0][2][0][RTW89_MKK][3] = 64, ++ [2][0][2][0][RTW89_IC][3] = 62, ++ [2][0][2][0][RTW89_KCC][3] = 68, ++ [2][0][2][0][RTW89_ACMA][3] = 64, ++ [2][0][2][0][RTW89_CHILE][3] = 42, ++ [2][0][2][0][RTW89_UKRAINE][3] = 52, ++ [2][0][2][0][RTW89_MEXICO][3] = 62, ++ [2][0][2][0][RTW89_CN][3] = 62, ++ [2][0][2][0][RTW89_QATAR][3] = 64, ++ [2][0][2][0][RTW89_UK][3] = 64, ++ [2][0][2][0][RTW89_FCC][11] = 66, ++ [2][0][2][0][RTW89_ETSI][11] = 64, ++ [2][0][2][0][RTW89_MKK][11] = 64, ++ [2][0][2][0][RTW89_IC][11] = 64, ++ [2][0][2][0][RTW89_KCC][11] = 70, ++ [2][0][2][0][RTW89_ACMA][11] = 64, ++ [2][0][2][0][RTW89_CHILE][11] = 66, ++ [2][0][2][0][RTW89_UKRAINE][11] = 52, ++ [2][0][2][0][RTW89_MEXICO][11] = 66, ++ [2][0][2][0][RTW89_CN][11] = 62, ++ [2][0][2][0][RTW89_QATAR][11] = 64, ++ [2][0][2][0][RTW89_UK][11] = 64, ++ [2][0][2][0][RTW89_FCC][18] = 62, ++ [2][0][2][0][RTW89_ETSI][18] = 64, ++ [2][0][2][0][RTW89_MKK][18] = 70, ++ [2][0][2][0][RTW89_IC][18] = 62, ++ [2][0][2][0][RTW89_KCC][18] = 64, ++ [2][0][2][0][RTW89_ACMA][18] = 64, ++ [2][0][2][0][RTW89_CHILE][18] = 64, ++ [2][0][2][0][RTW89_UKRAINE][18] = 52, ++ [2][0][2][0][RTW89_MEXICO][18] = 62, ++ [2][0][2][0][RTW89_CN][18] = 127, ++ [2][0][2][0][RTW89_QATAR][18] = 64, ++ [2][0][2][0][RTW89_UK][18] = 64, ++ [2][0][2][0][RTW89_FCC][26] = 74, ++ [2][0][2][0][RTW89_ETSI][26] = 64, ++ [2][0][2][0][RTW89_MKK][26] = 70, ++ [2][0][2][0][RTW89_IC][26] = 127, ++ [2][0][2][0][RTW89_KCC][26] = 70, ++ [2][0][2][0][RTW89_ACMA][26] = 127, ++ [2][0][2][0][RTW89_CHILE][26] = 64, ++ [2][0][2][0][RTW89_UKRAINE][26] = 52, ++ [2][0][2][0][RTW89_MEXICO][26] = 74, ++ [2][0][2][0][RTW89_CN][26] = 127, ++ [2][0][2][0][RTW89_QATAR][26] = 64, ++ [2][0][2][0][RTW89_UK][26] = 64, ++ [2][0][2][0][RTW89_FCC][34] = 74, ++ [2][0][2][0][RTW89_ETSI][34] = 127, ++ [2][0][2][0][RTW89_MKK][34] = 70, ++ [2][0][2][0][RTW89_IC][34] = 74, ++ [2][0][2][0][RTW89_KCC][34] = 70, ++ [2][0][2][0][RTW89_ACMA][34] = 70, ++ [2][0][2][0][RTW89_CHILE][34] = 64, ++ [2][0][2][0][RTW89_UKRAINE][34] = 127, ++ [2][0][2][0][RTW89_MEXICO][34] = 74, ++ [2][0][2][0][RTW89_CN][34] = 127, ++ [2][0][2][0][RTW89_QATAR][34] = 127, ++ [2][0][2][0][RTW89_UK][34] = 70, ++ [2][0][2][0][RTW89_FCC][41] = 74, ++ [2][0][2][0][RTW89_ETSI][41] = 28, ++ [2][0][2][0][RTW89_MKK][41] = 127, ++ [2][0][2][0][RTW89_IC][41] = 74, ++ [2][0][2][0][RTW89_KCC][41] = 66, ++ [2][0][2][0][RTW89_ACMA][41] = 70, ++ [2][0][2][0][RTW89_CHILE][41] = 64, ++ [2][0][2][0][RTW89_UKRAINE][41] = 28, ++ [2][0][2][0][RTW89_MEXICO][41] = 74, ++ [2][0][2][0][RTW89_CN][41] = 70, ++ [2][0][2][0][RTW89_QATAR][41] = 28, ++ [2][0][2][0][RTW89_UK][41] = 64, ++ [2][0][2][0][RTW89_FCC][49] = 64, ++ [2][0][2][0][RTW89_ETSI][49] = 127, ++ [2][0][2][0][RTW89_MKK][49] = 127, ++ [2][0][2][0][RTW89_IC][49] = 127, ++ [2][0][2][0][RTW89_KCC][49] = 127, ++ [2][0][2][0][RTW89_ACMA][49] = 127, ++ [2][0][2][0][RTW89_CHILE][49] = 127, ++ [2][0][2][0][RTW89_UKRAINE][49] = 127, ++ [2][0][2][0][RTW89_MEXICO][49] = 127, ++ [2][0][2][0][RTW89_CN][49] = 127, ++ [2][0][2][0][RTW89_QATAR][49] = 127, ++ [2][0][2][0][RTW89_UK][49] = 127, ++ [2][1][2][0][RTW89_FCC][3] = 56, ++ [2][1][2][0][RTW89_ETSI][3] = 52, ++ [2][1][2][0][RTW89_MKK][3] = 52, ++ [2][1][2][0][RTW89_IC][3] = 52, ++ [2][1][2][0][RTW89_KCC][3] = 54, ++ [2][1][2][0][RTW89_ACMA][3] = 52, ++ [2][1][2][0][RTW89_CHILE][3] = 28, ++ [2][1][2][0][RTW89_UKRAINE][3] = 40, ++ [2][1][2][0][RTW89_MEXICO][3] = 50, ++ [2][1][2][0][RTW89_CN][3] = 50, ++ [2][1][2][0][RTW89_QATAR][3] = 52, ++ [2][1][2][0][RTW89_UK][3] = 52, ++ [2][1][2][0][RTW89_FCC][11] = 62, ++ [2][1][2][0][RTW89_ETSI][11] = 52, ++ [2][1][2][0][RTW89_MKK][11] = 52, ++ [2][1][2][0][RTW89_IC][11] = 52, ++ [2][1][2][0][RTW89_KCC][11] = 56, ++ [2][1][2][0][RTW89_ACMA][11] = 52, ++ [2][1][2][0][RTW89_CHILE][11] = 52, ++ [2][1][2][0][RTW89_UKRAINE][11] = 40, ++ [2][1][2][0][RTW89_MEXICO][11] = 62, ++ [2][1][2][0][RTW89_CN][11] = 50, ++ [2][1][2][0][RTW89_QATAR][11] = 52, ++ [2][1][2][0][RTW89_UK][11] = 52, ++ [2][1][2][0][RTW89_FCC][18] = 56, ++ [2][1][2][0][RTW89_ETSI][18] = 52, ++ [2][1][2][0][RTW89_MKK][18] = 70, ++ [2][1][2][0][RTW89_IC][18] = 56, ++ [2][1][2][0][RTW89_KCC][18] = 58, ++ [2][1][2][0][RTW89_ACMA][18] = 52, ++ [2][1][2][0][RTW89_CHILE][18] = 48, ++ [2][1][2][0][RTW89_UKRAINE][18] = 40, ++ [2][1][2][0][RTW89_MEXICO][18] = 56, ++ [2][1][2][0][RTW89_CN][18] = 127, ++ [2][1][2][0][RTW89_QATAR][18] = 52, ++ [2][1][2][0][RTW89_UK][18] = 52, ++ [2][1][2][0][RTW89_FCC][26] = 70, ++ [2][1][2][0][RTW89_ETSI][26] = 52, ++ [2][1][2][0][RTW89_MKK][26] = 70, ++ [2][1][2][0][RTW89_IC][26] = 127, ++ [2][1][2][0][RTW89_KCC][26] = 56, ++ [2][1][2][0][RTW89_ACMA][26] = 127, ++ [2][1][2][0][RTW89_CHILE][26] = 50, ++ [2][1][2][0][RTW89_UKRAINE][26] = 40, ++ [2][1][2][0][RTW89_MEXICO][26] = 70, ++ [2][1][2][0][RTW89_CN][26] = 127, ++ [2][1][2][0][RTW89_QATAR][26] = 52, ++ [2][1][2][0][RTW89_UK][26] = 52, ++ [2][1][2][0][RTW89_FCC][34] = 74, ++ [2][1][2][0][RTW89_ETSI][34] = 127, ++ [2][1][2][0][RTW89_MKK][34] = 70, ++ [2][1][2][0][RTW89_IC][34] = 74, ++ [2][1][2][0][RTW89_KCC][34] = 56, ++ [2][1][2][0][RTW89_ACMA][34] = 70, ++ [2][1][2][0][RTW89_CHILE][34] = 50, ++ [2][1][2][0][RTW89_UKRAINE][34] = 127, ++ [2][1][2][0][RTW89_MEXICO][34] = 74, ++ [2][1][2][0][RTW89_CN][34] = 127, ++ [2][1][2][0][RTW89_QATAR][34] = 127, ++ [2][1][2][0][RTW89_UK][34] = 68, ++ [2][1][2][0][RTW89_FCC][41] = 74, ++ [2][1][2][0][RTW89_ETSI][41] = 16, ++ [2][1][2][0][RTW89_MKK][41] = 127, ++ [2][1][2][0][RTW89_IC][41] = 74, ++ [2][1][2][0][RTW89_KCC][41] = 56, ++ [2][1][2][0][RTW89_ACMA][41] = 70, ++ [2][1][2][0][RTW89_CHILE][41] = 50, ++ [2][1][2][0][RTW89_UKRAINE][41] = 16, ++ [2][1][2][0][RTW89_MEXICO][41] = 74, ++ [2][1][2][0][RTW89_CN][41] = 70, ++ [2][1][2][0][RTW89_QATAR][41] = 16, ++ [2][1][2][0][RTW89_UK][41] = 52, ++ [2][1][2][0][RTW89_FCC][49] = 58, ++ [2][1][2][0][RTW89_ETSI][49] = 127, ++ [2][1][2][0][RTW89_MKK][49] = 127, ++ [2][1][2][0][RTW89_IC][49] = 127, ++ [2][1][2][0][RTW89_KCC][49] = 127, ++ [2][1][2][0][RTW89_ACMA][49] = 127, ++ [2][1][2][0][RTW89_CHILE][49] = 127, ++ [2][1][2][0][RTW89_UKRAINE][49] = 127, ++ [2][1][2][0][RTW89_MEXICO][49] = 127, ++ [2][1][2][0][RTW89_CN][49] = 127, ++ [2][1][2][0][RTW89_QATAR][49] = 127, ++ [2][1][2][0][RTW89_UK][49] = 127, ++ [2][1][2][1][RTW89_FCC][3] = 56, ++ [2][1][2][1][RTW89_ETSI][3] = 40, ++ [2][1][2][1][RTW89_MKK][3] = 52, ++ [2][1][2][1][RTW89_IC][3] = 40, ++ [2][1][2][1][RTW89_KCC][3] = 54, ++ [2][1][2][1][RTW89_ACMA][3] = 40, ++ [2][1][2][1][RTW89_CHILE][3] = 16, ++ [2][1][2][1][RTW89_UKRAINE][3] = 28, ++ [2][1][2][1][RTW89_MEXICO][3] = 50, ++ [2][1][2][1][RTW89_CN][3] = 38, ++ [2][1][2][1][RTW89_QATAR][3] = 40, ++ [2][1][2][1][RTW89_UK][3] = 40, ++ [2][1][2][1][RTW89_FCC][11] = 62, ++ [2][1][2][1][RTW89_ETSI][11] = 40, ++ [2][1][2][1][RTW89_MKK][11] = 52, ++ [2][1][2][1][RTW89_IC][11] = 40, ++ [2][1][2][1][RTW89_KCC][11] = 56, ++ [2][1][2][1][RTW89_ACMA][11] = 40, ++ [2][1][2][1][RTW89_CHILE][11] = 34, ++ [2][1][2][1][RTW89_UKRAINE][11] = 28, ++ [2][1][2][1][RTW89_MEXICO][11] = 62, ++ [2][1][2][1][RTW89_CN][11] = 38, ++ [2][1][2][1][RTW89_QATAR][11] = 40, ++ [2][1][2][1][RTW89_UK][11] = 40, ++ [2][1][2][1][RTW89_FCC][18] = 56, ++ [2][1][2][1][RTW89_ETSI][18] = 40, ++ [2][1][2][1][RTW89_MKK][18] = 70, ++ [2][1][2][1][RTW89_IC][18] = 56, ++ [2][1][2][1][RTW89_KCC][18] = 58, ++ [2][1][2][1][RTW89_ACMA][18] = 40, ++ [2][1][2][1][RTW89_CHILE][18] = 34, ++ [2][1][2][1][RTW89_UKRAINE][18] = 28, ++ [2][1][2][1][RTW89_MEXICO][18] = 56, ++ [2][1][2][1][RTW89_CN][18] = 127, ++ [2][1][2][1][RTW89_QATAR][18] = 40, ++ [2][1][2][1][RTW89_UK][18] = 40, ++ [2][1][2][1][RTW89_FCC][26] = 68, ++ [2][1][2][1][RTW89_ETSI][26] = 40, ++ [2][1][2][1][RTW89_MKK][26] = 70, ++ [2][1][2][1][RTW89_IC][26] = 127, ++ [2][1][2][1][RTW89_KCC][26] = 56, ++ [2][1][2][1][RTW89_ACMA][26] = 127, ++ [2][1][2][1][RTW89_CHILE][26] = 34, ++ [2][1][2][1][RTW89_UKRAINE][26] = 28, ++ [2][1][2][1][RTW89_MEXICO][26] = 68, ++ [2][1][2][1][RTW89_CN][26] = 127, ++ [2][1][2][1][RTW89_QATAR][26] = 40, ++ [2][1][2][1][RTW89_UK][26] = 40, ++ [2][1][2][1][RTW89_FCC][34] = 68, ++ [2][1][2][1][RTW89_ETSI][34] = 127, ++ [2][1][2][1][RTW89_MKK][34] = 70, ++ [2][1][2][1][RTW89_IC][34] = 68, ++ [2][1][2][1][RTW89_KCC][34] = 56, ++ [2][1][2][1][RTW89_ACMA][34] = 70, ++ [2][1][2][1][RTW89_CHILE][34] = 34, ++ [2][1][2][1][RTW89_UKRAINE][34] = 127, ++ [2][1][2][1][RTW89_MEXICO][34] = 68, ++ [2][1][2][1][RTW89_CN][34] = 127, ++ [2][1][2][1][RTW89_QATAR][34] = 127, ++ [2][1][2][1][RTW89_UK][34] = 56, ++ [2][1][2][1][RTW89_FCC][41] = 74, ++ [2][1][2][1][RTW89_ETSI][41] = 4, ++ [2][1][2][1][RTW89_MKK][41] = 127, ++ [2][1][2][1][RTW89_IC][41] = 74, ++ [2][1][2][1][RTW89_KCC][41] = 56, ++ [2][1][2][1][RTW89_ACMA][41] = 70, ++ [2][1][2][1][RTW89_CHILE][41] = 36, ++ [2][1][2][1][RTW89_UKRAINE][41] = 4, ++ [2][1][2][1][RTW89_MEXICO][41] = 74, ++ [2][1][2][1][RTW89_CN][41] = 70, ++ [2][1][2][1][RTW89_QATAR][41] = 4, ++ [2][1][2][1][RTW89_UK][41] = 38, ++ [2][1][2][1][RTW89_FCC][49] = 58, ++ [2][1][2][1][RTW89_ETSI][49] = 127, ++ [2][1][2][1][RTW89_MKK][49] = 127, ++ [2][1][2][1][RTW89_IC][49] = 127, ++ [2][1][2][1][RTW89_KCC][49] = 127, ++ [2][1][2][1][RTW89_ACMA][49] = 127, ++ [2][1][2][1][RTW89_CHILE][49] = 127, ++ [2][1][2][1][RTW89_UKRAINE][49] = 127, ++ [2][1][2][1][RTW89_MEXICO][49] = 127, ++ [2][1][2][1][RTW89_CN][49] = 127, ++ [2][1][2][1][RTW89_QATAR][49] = 127, ++ [2][1][2][1][RTW89_UK][49] = 127, ++}; ++ ++const s8 rtw89_8852b_txpwr_lmt_ru_2g[RTW89_RU_NUM][RTW89_NTX_NUM] ++ [RTW89_REGD_NUM][RTW89_2G_CH_NUM] = { ++ [0][0][RTW89_WW][0] = 32, ++ [0][0][RTW89_WW][1] = 32, ++ [0][0][RTW89_WW][2] = 32, ++ [0][0][RTW89_WW][3] = 32, ++ [0][0][RTW89_WW][4] = 32, ++ [0][0][RTW89_WW][5] = 32, ++ [0][0][RTW89_WW][6] = 32, ++ [0][0][RTW89_WW][7] = 32, ++ [0][0][RTW89_WW][8] = 32, ++ [0][0][RTW89_WW][9] = 32, ++ [0][0][RTW89_WW][10] = 32, ++ [0][0][RTW89_WW][11] = 32, ++ [0][0][RTW89_WW][12] = 32, ++ [0][0][RTW89_WW][13] = 0, ++ [0][1][RTW89_WW][0] = 20, ++ [0][1][RTW89_WW][1] = 22, ++ [0][1][RTW89_WW][2] = 22, ++ [0][1][RTW89_WW][3] = 22, ++ [0][1][RTW89_WW][4] = 22, ++ [0][1][RTW89_WW][5] = 22, ++ [0][1][RTW89_WW][6] = 22, ++ [0][1][RTW89_WW][7] = 22, ++ [0][1][RTW89_WW][8] = 22, ++ [0][1][RTW89_WW][9] = 22, ++ [0][1][RTW89_WW][10] = 22, ++ [0][1][RTW89_WW][11] = 22, ++ [0][1][RTW89_WW][12] = 20, ++ [0][1][RTW89_WW][13] = 0, ++ [1][0][RTW89_WW][0] = 42, ++ [1][0][RTW89_WW][1] = 44, ++ [1][0][RTW89_WW][2] = 44, ++ [1][0][RTW89_WW][3] = 44, ++ [1][0][RTW89_WW][4] = 44, ++ [1][0][RTW89_WW][5] = 44, ++ [1][0][RTW89_WW][6] = 44, ++ [1][0][RTW89_WW][7] = 44, ++ [1][0][RTW89_WW][8] = 44, ++ [1][0][RTW89_WW][9] = 44, ++ [1][0][RTW89_WW][10] = 44, ++ [1][0][RTW89_WW][11] = 44, ++ [1][0][RTW89_WW][12] = 38, ++ [1][0][RTW89_WW][13] = 0, ++ [1][1][RTW89_WW][0] = 32, ++ [1][1][RTW89_WW][1] = 32, ++ [1][1][RTW89_WW][2] = 32, ++ [1][1][RTW89_WW][3] = 32, ++ [1][1][RTW89_WW][4] = 32, ++ [1][1][RTW89_WW][5] = 32, ++ [1][1][RTW89_WW][6] = 32, ++ [1][1][RTW89_WW][7] = 32, ++ [1][1][RTW89_WW][8] = 32, ++ [1][1][RTW89_WW][9] = 32, ++ [1][1][RTW89_WW][10] = 32, ++ [1][1][RTW89_WW][11] = 32, ++ [1][1][RTW89_WW][12] = 32, ++ [1][1][RTW89_WW][13] = 0, ++ [2][0][RTW89_WW][0] = 56, ++ [2][0][RTW89_WW][1] = 56, ++ [2][0][RTW89_WW][2] = 56, ++ [2][0][RTW89_WW][3] = 56, ++ [2][0][RTW89_WW][4] = 56, ++ [2][0][RTW89_WW][5] = 56, ++ [2][0][RTW89_WW][6] = 56, ++ [2][0][RTW89_WW][7] = 56, ++ [2][0][RTW89_WW][8] = 56, ++ [2][0][RTW89_WW][9] = 56, ++ [2][0][RTW89_WW][10] = 56, ++ [2][0][RTW89_WW][11] = 50, ++ [2][0][RTW89_WW][12] = 46, ++ [2][0][RTW89_WW][13] = 0, ++ [2][1][RTW89_WW][0] = 44, ++ [2][1][RTW89_WW][1] = 44, ++ [2][1][RTW89_WW][2] = 44, ++ [2][1][RTW89_WW][3] = 44, ++ [2][1][RTW89_WW][4] = 44, ++ [2][1][RTW89_WW][5] = 44, ++ [2][1][RTW89_WW][6] = 44, ++ [2][1][RTW89_WW][7] = 44, ++ [2][1][RTW89_WW][8] = 44, ++ [2][1][RTW89_WW][9] = 44, ++ [2][1][RTW89_WW][10] = 44, ++ [2][1][RTW89_WW][11] = 38, ++ [2][1][RTW89_WW][12] = 34, ++ [2][1][RTW89_WW][13] = 0, ++ [0][0][RTW89_FCC][0] = 68, ++ [0][0][RTW89_ETSI][0] = 32, ++ [0][0][RTW89_MKK][0] = 42, ++ [0][0][RTW89_IC][0] = 68, ++ [0][0][RTW89_KCC][0] = 44, ++ [0][0][RTW89_ACMA][0] = 32, ++ [0][0][RTW89_CHILE][0] = 66, ++ [0][0][RTW89_UKRAINE][0] = 32, ++ [0][0][RTW89_MEXICO][0] = 68, ++ [0][0][RTW89_CN][0] = 32, ++ [0][0][RTW89_QATAR][0] = 32, ++ [0][0][RTW89_UK][0] = 32, ++ [0][0][RTW89_FCC][1] = 68, ++ [0][0][RTW89_ETSI][1] = 32, ++ [0][0][RTW89_MKK][1] = 42, ++ [0][0][RTW89_IC][1] = 68, ++ [0][0][RTW89_KCC][1] = 44, ++ [0][0][RTW89_ACMA][1] = 32, ++ [0][0][RTW89_CHILE][1] = 64, ++ [0][0][RTW89_UKRAINE][1] = 32, ++ [0][0][RTW89_MEXICO][1] = 68, ++ [0][0][RTW89_CN][1] = 32, ++ [0][0][RTW89_QATAR][1] = 32, ++ [0][0][RTW89_UK][1] = 32, ++ [0][0][RTW89_FCC][2] = 72, ++ [0][0][RTW89_ETSI][2] = 32, ++ [0][0][RTW89_MKK][2] = 42, ++ [0][0][RTW89_IC][2] = 72, ++ [0][0][RTW89_KCC][2] = 44, ++ [0][0][RTW89_ACMA][2] = 32, ++ [0][0][RTW89_CHILE][2] = 64, ++ [0][0][RTW89_UKRAINE][2] = 32, ++ [0][0][RTW89_MEXICO][2] = 72, ++ [0][0][RTW89_CN][2] = 32, ++ [0][0][RTW89_QATAR][2] = 32, ++ [0][0][RTW89_UK][2] = 32, ++ [0][0][RTW89_FCC][3] = 76, ++ [0][0][RTW89_ETSI][3] = 32, ++ [0][0][RTW89_MKK][3] = 42, ++ [0][0][RTW89_IC][3] = 76, ++ [0][0][RTW89_KCC][3] = 44, ++ [0][0][RTW89_ACMA][3] = 32, ++ [0][0][RTW89_CHILE][3] = 64, ++ [0][0][RTW89_UKRAINE][3] = 32, ++ [0][0][RTW89_MEXICO][3] = 76, ++ [0][0][RTW89_CN][3] = 32, ++ [0][0][RTW89_QATAR][3] = 32, ++ [0][0][RTW89_UK][3] = 32, ++ [0][0][RTW89_FCC][4] = 76, ++ [0][0][RTW89_ETSI][4] = 32, ++ [0][0][RTW89_MKK][4] = 42, ++ [0][0][RTW89_IC][4] = 76, ++ [0][0][RTW89_KCC][4] = 44, ++ [0][0][RTW89_ACMA][4] = 32, ++ [0][0][RTW89_CHILE][4] = 64, ++ [0][0][RTW89_UKRAINE][4] = 32, ++ [0][0][RTW89_MEXICO][4] = 76, ++ [0][0][RTW89_CN][4] = 32, ++ [0][0][RTW89_QATAR][4] = 32, ++ [0][0][RTW89_UK][4] = 32, ++ [0][0][RTW89_FCC][5] = 84, ++ [0][0][RTW89_ETSI][5] = 32, ++ [0][0][RTW89_MKK][5] = 42, ++ [0][0][RTW89_IC][5] = 84, ++ [0][0][RTW89_KCC][5] = 44, ++ [0][0][RTW89_ACMA][5] = 32, ++ [0][0][RTW89_CHILE][5] = 64, ++ [0][0][RTW89_UKRAINE][5] = 32, ++ [0][0][RTW89_MEXICO][5] = 84, ++ [0][0][RTW89_CN][5] = 32, ++ [0][0][RTW89_QATAR][5] = 32, ++ [0][0][RTW89_UK][5] = 32, ++ [0][0][RTW89_FCC][6] = 74, ++ [0][0][RTW89_ETSI][6] = 32, ++ [0][0][RTW89_MKK][6] = 42, ++ [0][0][RTW89_IC][6] = 74, ++ [0][0][RTW89_KCC][6] = 44, ++ [0][0][RTW89_ACMA][6] = 32, ++ [0][0][RTW89_CHILE][6] = 64, ++ [0][0][RTW89_UKRAINE][6] = 32, ++ [0][0][RTW89_MEXICO][6] = 74, ++ [0][0][RTW89_CN][6] = 32, ++ [0][0][RTW89_QATAR][6] = 32, ++ [0][0][RTW89_UK][6] = 32, ++ [0][0][RTW89_FCC][7] = 74, ++ [0][0][RTW89_ETSI][7] = 32, ++ [0][0][RTW89_MKK][7] = 42, ++ [0][0][RTW89_IC][7] = 74, ++ [0][0][RTW89_KCC][7] = 44, ++ [0][0][RTW89_ACMA][7] = 32, ++ [0][0][RTW89_CHILE][7] = 64, ++ [0][0][RTW89_UKRAINE][7] = 32, ++ [0][0][RTW89_MEXICO][7] = 74, ++ [0][0][RTW89_CN][7] = 32, ++ [0][0][RTW89_QATAR][7] = 32, ++ [0][0][RTW89_UK][7] = 32, ++ [0][0][RTW89_FCC][8] = 70, ++ [0][0][RTW89_ETSI][8] = 32, ++ [0][0][RTW89_MKK][8] = 42, ++ [0][0][RTW89_IC][8] = 70, ++ [0][0][RTW89_KCC][8] = 44, ++ [0][0][RTW89_ACMA][8] = 32, ++ [0][0][RTW89_CHILE][8] = 64, ++ [0][0][RTW89_UKRAINE][8] = 32, ++ [0][0][RTW89_MEXICO][8] = 70, ++ [0][0][RTW89_CN][8] = 32, ++ [0][0][RTW89_QATAR][8] = 32, ++ [0][0][RTW89_UK][8] = 32, ++ [0][0][RTW89_FCC][9] = 66, ++ [0][0][RTW89_ETSI][9] = 32, ++ [0][0][RTW89_MKK][9] = 42, ++ [0][0][RTW89_IC][9] = 66, ++ [0][0][RTW89_KCC][9] = 42, ++ [0][0][RTW89_ACMA][9] = 32, ++ [0][0][RTW89_CHILE][9] = 64, ++ [0][0][RTW89_UKRAINE][9] = 32, ++ [0][0][RTW89_MEXICO][9] = 66, ++ [0][0][RTW89_CN][9] = 32, ++ [0][0][RTW89_QATAR][9] = 32, ++ [0][0][RTW89_UK][9] = 32, ++ [0][0][RTW89_FCC][10] = 66, ++ [0][0][RTW89_ETSI][10] = 32, ++ [0][0][RTW89_MKK][10] = 42, ++ [0][0][RTW89_IC][10] = 66, ++ [0][0][RTW89_KCC][10] = 42, ++ [0][0][RTW89_ACMA][10] = 32, ++ [0][0][RTW89_CHILE][10] = 66, ++ [0][0][RTW89_UKRAINE][10] = 32, ++ [0][0][RTW89_MEXICO][10] = 66, ++ [0][0][RTW89_CN][10] = 32, ++ [0][0][RTW89_QATAR][10] = 32, ++ [0][0][RTW89_UK][10] = 32, ++ [0][0][RTW89_FCC][11] = 50, ++ [0][0][RTW89_ETSI][11] = 32, ++ [0][0][RTW89_MKK][11] = 42, ++ [0][0][RTW89_IC][11] = 50, ++ [0][0][RTW89_KCC][11] = 42, ++ [0][0][RTW89_ACMA][11] = 32, ++ [0][0][RTW89_CHILE][11] = 64, ++ [0][0][RTW89_UKRAINE][11] = 32, ++ [0][0][RTW89_MEXICO][11] = 50, ++ [0][0][RTW89_CN][11] = 32, ++ [0][0][RTW89_QATAR][11] = 32, ++ [0][0][RTW89_UK][11] = 32, ++ [0][0][RTW89_FCC][12] = 32, ++ [0][0][RTW89_ETSI][12] = 32, ++ [0][0][RTW89_MKK][12] = 42, ++ [0][0][RTW89_IC][12] = 32, ++ [0][0][RTW89_KCC][12] = 42, ++ [0][0][RTW89_ACMA][12] = 32, ++ [0][0][RTW89_CHILE][12] = 64, ++ [0][0][RTW89_UKRAINE][12] = 32, ++ [0][0][RTW89_MEXICO][12] = 32, ++ [0][0][RTW89_CN][12] = 32, ++ [0][0][RTW89_QATAR][12] = 32, ++ [0][0][RTW89_UK][12] = 32, ++ [0][0][RTW89_FCC][13] = 127, ++ [0][0][RTW89_ETSI][13] = 127, ++ [0][0][RTW89_MKK][13] = 127, ++ [0][0][RTW89_IC][13] = 127, ++ [0][0][RTW89_KCC][13] = 127, ++ [0][0][RTW89_ACMA][13] = 127, ++ [0][0][RTW89_CHILE][13] = 127, ++ [0][0][RTW89_UKRAINE][13] = 127, ++ [0][0][RTW89_MEXICO][13] = 127, ++ [0][0][RTW89_CN][13] = 127, ++ [0][0][RTW89_QATAR][13] = 127, ++ [0][0][RTW89_UK][13] = 127, ++ [0][1][RTW89_FCC][0] = 54, ++ [0][1][RTW89_ETSI][0] = 20, ++ [0][1][RTW89_MKK][0] = 32, ++ [0][1][RTW89_IC][0] = 54, ++ [0][1][RTW89_KCC][0] = 32, ++ [0][1][RTW89_ACMA][0] = 20, ++ [0][1][RTW89_CHILE][0] = 50, ++ [0][1][RTW89_UKRAINE][0] = 20, ++ [0][1][RTW89_MEXICO][0] = 54, ++ [0][1][RTW89_CN][0] = 20, ++ [0][1][RTW89_QATAR][0] = 20, ++ [0][1][RTW89_UK][0] = 20, ++ [0][1][RTW89_FCC][1] = 54, ++ [0][1][RTW89_ETSI][1] = 22, ++ [0][1][RTW89_MKK][1] = 32, ++ [0][1][RTW89_IC][1] = 54, ++ [0][1][RTW89_KCC][1] = 32, ++ [0][1][RTW89_ACMA][1] = 22, ++ [0][1][RTW89_CHILE][1] = 50, ++ [0][1][RTW89_UKRAINE][1] = 22, ++ [0][1][RTW89_MEXICO][1] = 54, ++ [0][1][RTW89_CN][1] = 22, ++ [0][1][RTW89_QATAR][1] = 22, ++ [0][1][RTW89_UK][1] = 22, ++ [0][1][RTW89_FCC][2] = 58, ++ [0][1][RTW89_ETSI][2] = 22, ++ [0][1][RTW89_MKK][2] = 32, ++ [0][1][RTW89_IC][2] = 58, ++ [0][1][RTW89_KCC][2] = 32, ++ [0][1][RTW89_ACMA][2] = 22, ++ [0][1][RTW89_CHILE][2] = 50, ++ [0][1][RTW89_UKRAINE][2] = 22, ++ [0][1][RTW89_MEXICO][2] = 58, ++ [0][1][RTW89_CN][2] = 22, ++ [0][1][RTW89_QATAR][2] = 22, ++ [0][1][RTW89_UK][2] = 22, ++ [0][1][RTW89_FCC][3] = 62, ++ [0][1][RTW89_ETSI][3] = 22, ++ [0][1][RTW89_MKK][3] = 32, ++ [0][1][RTW89_IC][3] = 62, ++ [0][1][RTW89_KCC][3] = 32, ++ [0][1][RTW89_ACMA][3] = 22, ++ [0][1][RTW89_CHILE][3] = 50, ++ [0][1][RTW89_UKRAINE][3] = 22, ++ [0][1][RTW89_MEXICO][3] = 62, ++ [0][1][RTW89_CN][3] = 22, ++ [0][1][RTW89_QATAR][3] = 22, ++ [0][1][RTW89_UK][3] = 22, ++ [0][1][RTW89_FCC][4] = 66, ++ [0][1][RTW89_ETSI][4] = 22, ++ [0][1][RTW89_MKK][4] = 32, ++ [0][1][RTW89_IC][4] = 66, ++ [0][1][RTW89_KCC][4] = 30, ++ [0][1][RTW89_ACMA][4] = 22, ++ [0][1][RTW89_CHILE][4] = 50, ++ [0][1][RTW89_UKRAINE][4] = 22, ++ [0][1][RTW89_MEXICO][4] = 66, ++ [0][1][RTW89_CN][4] = 22, ++ [0][1][RTW89_QATAR][4] = 22, ++ [0][1][RTW89_UK][4] = 22, ++ [0][1][RTW89_FCC][5] = 74, ++ [0][1][RTW89_ETSI][5] = 22, ++ [0][1][RTW89_MKK][5] = 32, ++ [0][1][RTW89_IC][5] = 74, ++ [0][1][RTW89_KCC][5] = 30, ++ [0][1][RTW89_ACMA][5] = 22, ++ [0][1][RTW89_CHILE][5] = 52, ++ [0][1][RTW89_UKRAINE][5] = 22, ++ [0][1][RTW89_MEXICO][5] = 74, ++ [0][1][RTW89_CN][5] = 22, ++ [0][1][RTW89_QATAR][5] = 22, ++ [0][1][RTW89_UK][5] = 22, ++ [0][1][RTW89_FCC][6] = 66, ++ [0][1][RTW89_ETSI][6] = 22, ++ [0][1][RTW89_MKK][6] = 30, ++ [0][1][RTW89_IC][6] = 66, ++ [0][1][RTW89_KCC][6] = 30, ++ [0][1][RTW89_ACMA][6] = 22, ++ [0][1][RTW89_CHILE][6] = 50, ++ [0][1][RTW89_UKRAINE][6] = 22, ++ [0][1][RTW89_MEXICO][6] = 66, ++ [0][1][RTW89_CN][6] = 22, ++ [0][1][RTW89_QATAR][6] = 22, ++ [0][1][RTW89_UK][6] = 22, ++ [0][1][RTW89_FCC][7] = 62, ++ [0][1][RTW89_ETSI][7] = 22, ++ [0][1][RTW89_MKK][7] = 32, ++ [0][1][RTW89_IC][7] = 62, ++ [0][1][RTW89_KCC][7] = 30, ++ [0][1][RTW89_ACMA][7] = 22, ++ [0][1][RTW89_CHILE][7] = 50, ++ [0][1][RTW89_UKRAINE][7] = 22, ++ [0][1][RTW89_MEXICO][7] = 62, ++ [0][1][RTW89_CN][7] = 22, ++ [0][1][RTW89_QATAR][7] = 22, ++ [0][1][RTW89_UK][7] = 22, ++ [0][1][RTW89_FCC][8] = 58, ++ [0][1][RTW89_ETSI][8] = 22, ++ [0][1][RTW89_MKK][8] = 32, ++ [0][1][RTW89_IC][8] = 58, ++ [0][1][RTW89_KCC][8] = 30, ++ [0][1][RTW89_ACMA][8] = 22, ++ [0][1][RTW89_CHILE][8] = 50, ++ [0][1][RTW89_UKRAINE][8] = 22, ++ [0][1][RTW89_MEXICO][8] = 58, ++ [0][1][RTW89_CN][8] = 22, ++ [0][1][RTW89_QATAR][8] = 22, ++ [0][1][RTW89_UK][8] = 22, ++ [0][1][RTW89_FCC][9] = 54, ++ [0][1][RTW89_ETSI][9] = 22, ++ [0][1][RTW89_MKK][9] = 32, ++ [0][1][RTW89_IC][9] = 54, ++ [0][1][RTW89_KCC][9] = 30, ++ [0][1][RTW89_ACMA][9] = 22, ++ [0][1][RTW89_CHILE][9] = 50, ++ [0][1][RTW89_UKRAINE][9] = 22, ++ [0][1][RTW89_MEXICO][9] = 54, ++ [0][1][RTW89_CN][9] = 22, ++ [0][1][RTW89_QATAR][9] = 22, ++ [0][1][RTW89_UK][9] = 22, ++ [0][1][RTW89_FCC][10] = 54, ++ [0][1][RTW89_ETSI][10] = 22, ++ [0][1][RTW89_MKK][10] = 32, ++ [0][1][RTW89_IC][10] = 54, ++ [0][1][RTW89_KCC][10] = 30, ++ [0][1][RTW89_ACMA][10] = 22, ++ [0][1][RTW89_CHILE][10] = 50, ++ [0][1][RTW89_UKRAINE][10] = 22, ++ [0][1][RTW89_MEXICO][10] = 54, ++ [0][1][RTW89_CN][10] = 22, ++ [0][1][RTW89_QATAR][10] = 22, ++ [0][1][RTW89_UK][10] = 22, ++ [0][1][RTW89_FCC][11] = 38, ++ [0][1][RTW89_ETSI][11] = 22, ++ [0][1][RTW89_MKK][11] = 32, ++ [0][1][RTW89_IC][11] = 38, ++ [0][1][RTW89_KCC][11] = 30, ++ [0][1][RTW89_ACMA][11] = 22, ++ [0][1][RTW89_CHILE][11] = 50, ++ [0][1][RTW89_UKRAINE][11] = 22, ++ [0][1][RTW89_MEXICO][11] = 38, ++ [0][1][RTW89_CN][11] = 22, ++ [0][1][RTW89_QATAR][11] = 22, ++ [0][1][RTW89_UK][11] = 22, ++ [0][1][RTW89_FCC][12] = 30, ++ [0][1][RTW89_ETSI][12] = 20, ++ [0][1][RTW89_MKK][12] = 30, ++ [0][1][RTW89_IC][12] = 30, ++ [0][1][RTW89_KCC][12] = 30, ++ [0][1][RTW89_ACMA][12] = 20, ++ [0][1][RTW89_CHILE][12] = 50, ++ [0][1][RTW89_UKRAINE][12] = 20, ++ [0][1][RTW89_MEXICO][12] = 30, ++ [0][1][RTW89_CN][12] = 20, ++ [0][1][RTW89_QATAR][12] = 20, ++ [0][1][RTW89_UK][12] = 20, ++ [0][1][RTW89_FCC][13] = 127, ++ [0][1][RTW89_ETSI][13] = 127, ++ [0][1][RTW89_MKK][13] = 127, ++ [0][1][RTW89_IC][13] = 127, ++ [0][1][RTW89_KCC][13] = 127, ++ [0][1][RTW89_ACMA][13] = 127, ++ [0][1][RTW89_CHILE][13] = 127, ++ [0][1][RTW89_UKRAINE][13] = 127, ++ [0][1][RTW89_MEXICO][13] = 127, ++ [0][1][RTW89_CN][13] = 127, ++ [0][1][RTW89_QATAR][13] = 127, ++ [0][1][RTW89_UK][13] = 127, ++ [1][0][RTW89_FCC][0] = 72, ++ [1][0][RTW89_ETSI][0] = 42, ++ [1][0][RTW89_MKK][0] = 52, ++ [1][0][RTW89_IC][0] = 72, ++ [1][0][RTW89_KCC][0] = 52, ++ [1][0][RTW89_ACMA][0] = 42, ++ [1][0][RTW89_CHILE][0] = 68, ++ [1][0][RTW89_UKRAINE][0] = 42, ++ [1][0][RTW89_MEXICO][0] = 72, ++ [1][0][RTW89_CN][0] = 42, ++ [1][0][RTW89_QATAR][0] = 42, ++ [1][0][RTW89_UK][0] = 42, ++ [1][0][RTW89_FCC][1] = 72, ++ [1][0][RTW89_ETSI][1] = 44, ++ [1][0][RTW89_MKK][1] = 52, ++ [1][0][RTW89_IC][1] = 72, ++ [1][0][RTW89_KCC][1] = 52, ++ [1][0][RTW89_ACMA][1] = 44, ++ [1][0][RTW89_CHILE][1] = 68, ++ [1][0][RTW89_UKRAINE][1] = 44, ++ [1][0][RTW89_MEXICO][1] = 72, ++ [1][0][RTW89_CN][1] = 44, ++ [1][0][RTW89_QATAR][1] = 44, ++ [1][0][RTW89_UK][1] = 44, ++ [1][0][RTW89_FCC][2] = 76, ++ [1][0][RTW89_ETSI][2] = 44, ++ [1][0][RTW89_MKK][2] = 52, ++ [1][0][RTW89_IC][2] = 76, ++ [1][0][RTW89_KCC][2] = 52, ++ [1][0][RTW89_ACMA][2] = 44, ++ [1][0][RTW89_CHILE][2] = 68, ++ [1][0][RTW89_UKRAINE][2] = 44, ++ [1][0][RTW89_MEXICO][2] = 76, ++ [1][0][RTW89_CN][2] = 44, ++ [1][0][RTW89_QATAR][2] = 44, ++ [1][0][RTW89_UK][2] = 44, ++ [1][0][RTW89_FCC][3] = 78, ++ [1][0][RTW89_ETSI][3] = 44, ++ [1][0][RTW89_MKK][3] = 52, ++ [1][0][RTW89_IC][3] = 78, ++ [1][0][RTW89_KCC][3] = 52, ++ [1][0][RTW89_ACMA][3] = 44, ++ [1][0][RTW89_CHILE][3] = 68, ++ [1][0][RTW89_UKRAINE][3] = 44, ++ [1][0][RTW89_MEXICO][3] = 78, ++ [1][0][RTW89_CN][3] = 44, ++ [1][0][RTW89_QATAR][3] = 44, ++ [1][0][RTW89_UK][3] = 44, ++ [1][0][RTW89_FCC][4] = 78, ++ [1][0][RTW89_ETSI][4] = 44, ++ [1][0][RTW89_MKK][4] = 52, ++ [1][0][RTW89_IC][4] = 78, ++ [1][0][RTW89_KCC][4] = 52, ++ [1][0][RTW89_ACMA][4] = 44, ++ [1][0][RTW89_CHILE][4] = 68, ++ [1][0][RTW89_UKRAINE][4] = 44, ++ [1][0][RTW89_MEXICO][4] = 78, ++ [1][0][RTW89_CN][4] = 44, ++ [1][0][RTW89_QATAR][4] = 44, ++ [1][0][RTW89_UK][4] = 44, ++ [1][0][RTW89_FCC][5] = 84, ++ [1][0][RTW89_ETSI][5] = 44, ++ [1][0][RTW89_MKK][5] = 52, ++ [1][0][RTW89_IC][5] = 84, ++ [1][0][RTW89_KCC][5] = 52, ++ [1][0][RTW89_ACMA][5] = 44, ++ [1][0][RTW89_CHILE][5] = 68, ++ [1][0][RTW89_UKRAINE][5] = 44, ++ [1][0][RTW89_MEXICO][5] = 84, ++ [1][0][RTW89_CN][5] = 44, ++ [1][0][RTW89_QATAR][5] = 44, ++ [1][0][RTW89_UK][5] = 44, ++ [1][0][RTW89_FCC][6] = 72, ++ [1][0][RTW89_ETSI][6] = 44, ++ [1][0][RTW89_MKK][6] = 52, ++ [1][0][RTW89_IC][6] = 72, ++ [1][0][RTW89_KCC][6] = 52, ++ [1][0][RTW89_ACMA][6] = 44, ++ [1][0][RTW89_CHILE][6] = 68, ++ [1][0][RTW89_UKRAINE][6] = 44, ++ [1][0][RTW89_MEXICO][6] = 72, ++ [1][0][RTW89_CN][6] = 44, ++ [1][0][RTW89_QATAR][6] = 44, ++ [1][0][RTW89_UK][6] = 44, ++ [1][0][RTW89_FCC][7] = 72, ++ [1][0][RTW89_ETSI][7] = 44, ++ [1][0][RTW89_MKK][7] = 52, ++ [1][0][RTW89_IC][7] = 72, ++ [1][0][RTW89_KCC][7] = 52, ++ [1][0][RTW89_ACMA][7] = 44, ++ [1][0][RTW89_CHILE][7] = 68, ++ [1][0][RTW89_UKRAINE][7] = 44, ++ [1][0][RTW89_MEXICO][7] = 72, ++ [1][0][RTW89_CN][7] = 44, ++ [1][0][RTW89_QATAR][7] = 44, ++ [1][0][RTW89_UK][7] = 44, ++ [1][0][RTW89_FCC][8] = 72, ++ [1][0][RTW89_ETSI][8] = 44, ++ [1][0][RTW89_MKK][8] = 52, ++ [1][0][RTW89_IC][8] = 72, ++ [1][0][RTW89_KCC][8] = 52, ++ [1][0][RTW89_ACMA][8] = 44, ++ [1][0][RTW89_CHILE][8] = 68, ++ [1][0][RTW89_UKRAINE][8] = 44, ++ [1][0][RTW89_MEXICO][8] = 72, ++ [1][0][RTW89_CN][8] = 44, ++ [1][0][RTW89_QATAR][8] = 44, ++ [1][0][RTW89_UK][8] = 44, ++ [1][0][RTW89_FCC][9] = 68, ++ [1][0][RTW89_ETSI][9] = 44, ++ [1][0][RTW89_MKK][9] = 52, ++ [1][0][RTW89_IC][9] = 68, ++ [1][0][RTW89_KCC][9] = 52, ++ [1][0][RTW89_ACMA][9] = 44, ++ [1][0][RTW89_CHILE][9] = 68, ++ [1][0][RTW89_UKRAINE][9] = 44, ++ [1][0][RTW89_MEXICO][9] = 68, ++ [1][0][RTW89_CN][9] = 44, ++ [1][0][RTW89_QATAR][9] = 44, ++ [1][0][RTW89_UK][9] = 44, ++ [1][0][RTW89_FCC][10] = 68, ++ [1][0][RTW89_ETSI][10] = 44, ++ [1][0][RTW89_MKK][10] = 52, ++ [1][0][RTW89_IC][10] = 68, ++ [1][0][RTW89_KCC][10] = 52, ++ [1][0][RTW89_ACMA][10] = 44, ++ [1][0][RTW89_CHILE][10] = 70, ++ [1][0][RTW89_UKRAINE][10] = 44, ++ [1][0][RTW89_MEXICO][10] = 68, ++ [1][0][RTW89_CN][10] = 44, ++ [1][0][RTW89_QATAR][10] = 44, ++ [1][0][RTW89_UK][10] = 44, ++ [1][0][RTW89_FCC][11] = 50, ++ [1][0][RTW89_ETSI][11] = 44, ++ [1][0][RTW89_MKK][11] = 52, ++ [1][0][RTW89_IC][11] = 50, ++ [1][0][RTW89_KCC][11] = 52, ++ [1][0][RTW89_ACMA][11] = 44, ++ [1][0][RTW89_CHILE][11] = 68, ++ [1][0][RTW89_UKRAINE][11] = 44, ++ [1][0][RTW89_MEXICO][11] = 50, ++ [1][0][RTW89_CN][11] = 44, ++ [1][0][RTW89_QATAR][11] = 44, ++ [1][0][RTW89_UK][11] = 44, ++ [1][0][RTW89_FCC][12] = 38, ++ [1][0][RTW89_ETSI][12] = 42, ++ [1][0][RTW89_MKK][12] = 52, ++ [1][0][RTW89_IC][12] = 38, ++ [1][0][RTW89_KCC][12] = 52, ++ [1][0][RTW89_ACMA][12] = 42, ++ [1][0][RTW89_CHILE][12] = 68, ++ [1][0][RTW89_UKRAINE][12] = 42, ++ [1][0][RTW89_MEXICO][12] = 38, ++ [1][0][RTW89_CN][12] = 42, ++ [1][0][RTW89_QATAR][12] = 42, ++ [1][0][RTW89_UK][12] = 42, ++ [1][0][RTW89_FCC][13] = 127, ++ [1][0][RTW89_ETSI][13] = 127, ++ [1][0][RTW89_MKK][13] = 127, ++ [1][0][RTW89_IC][13] = 127, ++ [1][0][RTW89_KCC][13] = 127, ++ [1][0][RTW89_ACMA][13] = 127, ++ [1][0][RTW89_CHILE][13] = 127, ++ [1][0][RTW89_UKRAINE][13] = 127, ++ [1][0][RTW89_MEXICO][13] = 127, ++ [1][0][RTW89_CN][13] = 127, ++ [1][0][RTW89_QATAR][13] = 127, ++ [1][0][RTW89_UK][13] = 127, ++ [1][1][RTW89_FCC][0] = 54, ++ [1][1][RTW89_ETSI][0] = 32, ++ [1][1][RTW89_MKK][0] = 40, ++ [1][1][RTW89_IC][0] = 54, ++ [1][1][RTW89_KCC][0] = 40, ++ [1][1][RTW89_ACMA][0] = 32, ++ [1][1][RTW89_CHILE][0] = 54, ++ [1][1][RTW89_UKRAINE][0] = 32, ++ [1][1][RTW89_MEXICO][0] = 54, ++ [1][1][RTW89_CN][0] = 32, ++ [1][1][RTW89_QATAR][0] = 32, ++ [1][1][RTW89_UK][0] = 32, ++ [1][1][RTW89_FCC][1] = 54, ++ [1][1][RTW89_ETSI][1] = 32, ++ [1][1][RTW89_MKK][1] = 40, ++ [1][1][RTW89_IC][1] = 54, ++ [1][1][RTW89_KCC][1] = 40, ++ [1][1][RTW89_ACMA][1] = 32, ++ [1][1][RTW89_CHILE][1] = 54, ++ [1][1][RTW89_UKRAINE][1] = 32, ++ [1][1][RTW89_MEXICO][1] = 54, ++ [1][1][RTW89_CN][1] = 32, ++ [1][1][RTW89_QATAR][1] = 32, ++ [1][1][RTW89_UK][1] = 32, ++ [1][1][RTW89_FCC][2] = 58, ++ [1][1][RTW89_ETSI][2] = 32, ++ [1][1][RTW89_MKK][2] = 40, ++ [1][1][RTW89_IC][2] = 58, ++ [1][1][RTW89_KCC][2] = 40, ++ [1][1][RTW89_ACMA][2] = 32, ++ [1][1][RTW89_CHILE][2] = 54, ++ [1][1][RTW89_UKRAINE][2] = 32, ++ [1][1][RTW89_MEXICO][2] = 58, ++ [1][1][RTW89_CN][2] = 32, ++ [1][1][RTW89_QATAR][2] = 32, ++ [1][1][RTW89_UK][2] = 32, ++ [1][1][RTW89_FCC][3] = 62, ++ [1][1][RTW89_ETSI][3] = 32, ++ [1][1][RTW89_MKK][3] = 40, ++ [1][1][RTW89_IC][3] = 62, ++ [1][1][RTW89_KCC][3] = 40, ++ [1][1][RTW89_ACMA][3] = 32, ++ [1][1][RTW89_CHILE][3] = 54, ++ [1][1][RTW89_UKRAINE][3] = 32, ++ [1][1][RTW89_MEXICO][3] = 62, ++ [1][1][RTW89_CN][3] = 32, ++ [1][1][RTW89_QATAR][3] = 32, ++ [1][1][RTW89_UK][3] = 32, ++ [1][1][RTW89_FCC][4] = 66, ++ [1][1][RTW89_ETSI][4] = 32, ++ [1][1][RTW89_MKK][4] = 40, ++ [1][1][RTW89_IC][4] = 66, ++ [1][1][RTW89_KCC][4] = 40, ++ [1][1][RTW89_ACMA][4] = 32, ++ [1][1][RTW89_CHILE][4] = 54, ++ [1][1][RTW89_UKRAINE][4] = 32, ++ [1][1][RTW89_MEXICO][4] = 66, ++ [1][1][RTW89_CN][4] = 32, ++ [1][1][RTW89_QATAR][4] = 32, ++ [1][1][RTW89_UK][4] = 32, ++ [1][1][RTW89_FCC][5] = 74, ++ [1][1][RTW89_ETSI][5] = 32, ++ [1][1][RTW89_MKK][5] = 40, ++ [1][1][RTW89_IC][5] = 74, ++ [1][1][RTW89_KCC][5] = 40, ++ [1][1][RTW89_ACMA][5] = 32, ++ [1][1][RTW89_CHILE][5] = 54, ++ [1][1][RTW89_UKRAINE][5] = 32, ++ [1][1][RTW89_MEXICO][5] = 74, ++ [1][1][RTW89_CN][5] = 32, ++ [1][1][RTW89_QATAR][5] = 32, ++ [1][1][RTW89_UK][5] = 32, ++ [1][1][RTW89_FCC][6] = 66, ++ [1][1][RTW89_ETSI][6] = 32, ++ [1][1][RTW89_MKK][6] = 40, ++ [1][1][RTW89_IC][6] = 66, ++ [1][1][RTW89_KCC][6] = 40, ++ [1][1][RTW89_ACMA][6] = 32, ++ [1][1][RTW89_CHILE][6] = 54, ++ [1][1][RTW89_UKRAINE][6] = 32, ++ [1][1][RTW89_MEXICO][6] = 66, ++ [1][1][RTW89_CN][6] = 32, ++ [1][1][RTW89_QATAR][6] = 32, ++ [1][1][RTW89_UK][6] = 32, ++ [1][1][RTW89_FCC][7] = 62, ++ [1][1][RTW89_ETSI][7] = 32, ++ [1][1][RTW89_MKK][7] = 40, ++ [1][1][RTW89_IC][7] = 62, ++ [1][1][RTW89_KCC][7] = 40, ++ [1][1][RTW89_ACMA][7] = 32, ++ [1][1][RTW89_CHILE][7] = 54, ++ [1][1][RTW89_UKRAINE][7] = 32, ++ [1][1][RTW89_MEXICO][7] = 62, ++ [1][1][RTW89_CN][7] = 32, ++ [1][1][RTW89_QATAR][7] = 32, ++ [1][1][RTW89_UK][7] = 32, ++ [1][1][RTW89_FCC][8] = 58, ++ [1][1][RTW89_ETSI][8] = 32, ++ [1][1][RTW89_MKK][8] = 40, ++ [1][1][RTW89_IC][8] = 58, ++ [1][1][RTW89_KCC][8] = 40, ++ [1][1][RTW89_ACMA][8] = 32, ++ [1][1][RTW89_CHILE][8] = 54, ++ [1][1][RTW89_UKRAINE][8] = 32, ++ [1][1][RTW89_MEXICO][8] = 58, ++ [1][1][RTW89_CN][8] = 32, ++ [1][1][RTW89_QATAR][8] = 32, ++ [1][1][RTW89_UK][8] = 32, ++ [1][1][RTW89_FCC][9] = 54, ++ [1][1][RTW89_ETSI][9] = 32, ++ [1][1][RTW89_MKK][9] = 40, ++ [1][1][RTW89_IC][9] = 54, ++ [1][1][RTW89_KCC][9] = 40, ++ [1][1][RTW89_ACMA][9] = 32, ++ [1][1][RTW89_CHILE][9] = 54, ++ [1][1][RTW89_UKRAINE][9] = 32, ++ [1][1][RTW89_MEXICO][9] = 54, ++ [1][1][RTW89_CN][9] = 32, ++ [1][1][RTW89_QATAR][9] = 32, ++ [1][1][RTW89_UK][9] = 32, ++ [1][1][RTW89_FCC][10] = 54, ++ [1][1][RTW89_ETSI][10] = 32, ++ [1][1][RTW89_MKK][10] = 40, ++ [1][1][RTW89_IC][10] = 54, ++ [1][1][RTW89_KCC][10] = 40, ++ [1][1][RTW89_ACMA][10] = 32, ++ [1][1][RTW89_CHILE][10] = 54, ++ [1][1][RTW89_UKRAINE][10] = 32, ++ [1][1][RTW89_MEXICO][10] = 54, ++ [1][1][RTW89_CN][10] = 32, ++ [1][1][RTW89_QATAR][10] = 32, ++ [1][1][RTW89_UK][10] = 32, ++ [1][1][RTW89_FCC][11] = 38, ++ [1][1][RTW89_ETSI][11] = 32, ++ [1][1][RTW89_MKK][11] = 40, ++ [1][1][RTW89_IC][11] = 38, ++ [1][1][RTW89_KCC][11] = 40, ++ [1][1][RTW89_ACMA][11] = 32, ++ [1][1][RTW89_CHILE][11] = 54, ++ [1][1][RTW89_UKRAINE][11] = 32, ++ [1][1][RTW89_MEXICO][11] = 38, ++ [1][1][RTW89_CN][11] = 32, ++ [1][1][RTW89_QATAR][11] = 32, ++ [1][1][RTW89_UK][11] = 32, ++ [1][1][RTW89_FCC][12] = 32, ++ [1][1][RTW89_ETSI][12] = 32, ++ [1][1][RTW89_MKK][12] = 40, ++ [1][1][RTW89_IC][12] = 32, ++ [1][1][RTW89_KCC][12] = 40, ++ [1][1][RTW89_ACMA][12] = 32, ++ [1][1][RTW89_CHILE][12] = 54, ++ [1][1][RTW89_UKRAINE][12] = 32, ++ [1][1][RTW89_MEXICO][12] = 32, ++ [1][1][RTW89_CN][12] = 32, ++ [1][1][RTW89_QATAR][12] = 32, ++ [1][1][RTW89_UK][12] = 32, ++ [1][1][RTW89_FCC][13] = 127, ++ [1][1][RTW89_ETSI][13] = 127, ++ [1][1][RTW89_MKK][13] = 127, ++ [1][1][RTW89_IC][13] = 127, ++ [1][1][RTW89_KCC][13] = 127, ++ [1][1][RTW89_ACMA][13] = 127, ++ [1][1][RTW89_CHILE][13] = 127, ++ [1][1][RTW89_UKRAINE][13] = 127, ++ [1][1][RTW89_MEXICO][13] = 127, ++ [1][1][RTW89_CN][13] = 127, ++ [1][1][RTW89_QATAR][13] = 127, ++ [1][1][RTW89_UK][13] = 127, ++ [2][0][RTW89_FCC][0] = 72, ++ [2][0][RTW89_ETSI][0] = 56, ++ [2][0][RTW89_MKK][0] = 64, ++ [2][0][RTW89_IC][0] = 72, ++ [2][0][RTW89_KCC][0] = 66, ++ [2][0][RTW89_ACMA][0] = 56, ++ [2][0][RTW89_CHILE][0] = 68, ++ [2][0][RTW89_UKRAINE][0] = 56, ++ [2][0][RTW89_MEXICO][0] = 72, ++ [2][0][RTW89_CN][0] = 56, ++ [2][0][RTW89_QATAR][0] = 56, ++ [2][0][RTW89_UK][0] = 56, ++ [2][0][RTW89_FCC][1] = 72, ++ [2][0][RTW89_ETSI][1] = 56, ++ [2][0][RTW89_MKK][1] = 64, ++ [2][0][RTW89_IC][1] = 72, ++ [2][0][RTW89_KCC][1] = 66, ++ [2][0][RTW89_ACMA][1] = 56, ++ [2][0][RTW89_CHILE][1] = 68, ++ [2][0][RTW89_UKRAINE][1] = 56, ++ [2][0][RTW89_MEXICO][1] = 72, ++ [2][0][RTW89_CN][1] = 56, ++ [2][0][RTW89_QATAR][1] = 56, ++ [2][0][RTW89_UK][1] = 56, ++ [2][0][RTW89_FCC][2] = 74, ++ [2][0][RTW89_ETSI][2] = 56, ++ [2][0][RTW89_MKK][2] = 64, ++ [2][0][RTW89_IC][2] = 74, ++ [2][0][RTW89_KCC][2] = 66, ++ [2][0][RTW89_ACMA][2] = 56, ++ [2][0][RTW89_CHILE][2] = 68, ++ [2][0][RTW89_UKRAINE][2] = 56, ++ [2][0][RTW89_MEXICO][2] = 74, ++ [2][0][RTW89_CN][2] = 56, ++ [2][0][RTW89_QATAR][2] = 56, ++ [2][0][RTW89_UK][2] = 56, ++ [2][0][RTW89_FCC][3] = 74, ++ [2][0][RTW89_ETSI][3] = 56, ++ [2][0][RTW89_MKK][3] = 64, ++ [2][0][RTW89_IC][3] = 74, ++ [2][0][RTW89_KCC][3] = 66, ++ [2][0][RTW89_ACMA][3] = 56, ++ [2][0][RTW89_CHILE][3] = 68, ++ [2][0][RTW89_UKRAINE][3] = 56, ++ [2][0][RTW89_MEXICO][3] = 74, ++ [2][0][RTW89_CN][3] = 56, ++ [2][0][RTW89_QATAR][3] = 56, ++ [2][0][RTW89_UK][3] = 56, ++ [2][0][RTW89_FCC][4] = 74, ++ [2][0][RTW89_ETSI][4] = 56, ++ [2][0][RTW89_MKK][4] = 64, ++ [2][0][RTW89_IC][4] = 74, ++ [2][0][RTW89_KCC][4] = 66, ++ [2][0][RTW89_ACMA][4] = 56, ++ [2][0][RTW89_CHILE][4] = 68, ++ [2][0][RTW89_UKRAINE][4] = 56, ++ [2][0][RTW89_MEXICO][4] = 74, ++ [2][0][RTW89_CN][4] = 56, ++ [2][0][RTW89_QATAR][4] = 56, ++ [2][0][RTW89_UK][4] = 56, ++ [2][0][RTW89_FCC][5] = 84, ++ [2][0][RTW89_ETSI][5] = 56, ++ [2][0][RTW89_MKK][5] = 64, ++ [2][0][RTW89_IC][5] = 84, ++ [2][0][RTW89_KCC][5] = 66, ++ [2][0][RTW89_ACMA][5] = 56, ++ [2][0][RTW89_CHILE][5] = 70, ++ [2][0][RTW89_UKRAINE][5] = 56, ++ [2][0][RTW89_MEXICO][5] = 84, ++ [2][0][RTW89_CN][5] = 56, ++ [2][0][RTW89_QATAR][5] = 56, ++ [2][0][RTW89_UK][5] = 56, ++ [2][0][RTW89_FCC][6] = 70, ++ [2][0][RTW89_ETSI][6] = 56, ++ [2][0][RTW89_MKK][6] = 64, ++ [2][0][RTW89_IC][6] = 70, ++ [2][0][RTW89_KCC][6] = 66, ++ [2][0][RTW89_ACMA][6] = 56, ++ [2][0][RTW89_CHILE][6] = 68, ++ [2][0][RTW89_UKRAINE][6] = 56, ++ [2][0][RTW89_MEXICO][6] = 70, ++ [2][0][RTW89_CN][6] = 56, ++ [2][0][RTW89_QATAR][6] = 56, ++ [2][0][RTW89_UK][6] = 56, ++ [2][0][RTW89_FCC][7] = 70, ++ [2][0][RTW89_ETSI][7] = 56, ++ [2][0][RTW89_MKK][7] = 64, ++ [2][0][RTW89_IC][7] = 70, ++ [2][0][RTW89_KCC][7] = 66, ++ [2][0][RTW89_ACMA][7] = 56, ++ [2][0][RTW89_CHILE][7] = 68, ++ [2][0][RTW89_UKRAINE][7] = 56, ++ [2][0][RTW89_MEXICO][7] = 70, ++ [2][0][RTW89_CN][7] = 56, ++ [2][0][RTW89_QATAR][7] = 56, ++ [2][0][RTW89_UK][7] = 56, ++ [2][0][RTW89_FCC][8] = 70, ++ [2][0][RTW89_ETSI][8] = 56, ++ [2][0][RTW89_MKK][8] = 64, ++ [2][0][RTW89_IC][8] = 70, ++ [2][0][RTW89_KCC][8] = 66, ++ [2][0][RTW89_ACMA][8] = 56, ++ [2][0][RTW89_CHILE][8] = 68, ++ [2][0][RTW89_UKRAINE][8] = 56, ++ [2][0][RTW89_MEXICO][8] = 70, ++ [2][0][RTW89_CN][8] = 56, ++ [2][0][RTW89_QATAR][8] = 56, ++ [2][0][RTW89_UK][8] = 56, ++ [2][0][RTW89_FCC][9] = 68, ++ [2][0][RTW89_ETSI][9] = 56, ++ [2][0][RTW89_MKK][9] = 64, ++ [2][0][RTW89_IC][9] = 68, ++ [2][0][RTW89_KCC][9] = 66, ++ [2][0][RTW89_ACMA][9] = 56, ++ [2][0][RTW89_CHILE][9] = 68, ++ [2][0][RTW89_UKRAINE][9] = 56, ++ [2][0][RTW89_MEXICO][9] = 68, ++ [2][0][RTW89_CN][9] = 56, ++ [2][0][RTW89_QATAR][9] = 56, ++ [2][0][RTW89_UK][9] = 56, ++ [2][0][RTW89_FCC][10] = 68, ++ [2][0][RTW89_ETSI][10] = 56, ++ [2][0][RTW89_MKK][10] = 64, ++ [2][0][RTW89_IC][10] = 68, ++ [2][0][RTW89_KCC][10] = 66, ++ [2][0][RTW89_ACMA][10] = 56, ++ [2][0][RTW89_CHILE][10] = 68, ++ [2][0][RTW89_UKRAINE][10] = 56, ++ [2][0][RTW89_MEXICO][10] = 68, ++ [2][0][RTW89_CN][10] = 56, ++ [2][0][RTW89_QATAR][10] = 56, ++ [2][0][RTW89_UK][10] = 56, ++ [2][0][RTW89_FCC][11] = 50, ++ [2][0][RTW89_ETSI][11] = 56, ++ [2][0][RTW89_MKK][11] = 64, ++ [2][0][RTW89_IC][11] = 50, ++ [2][0][RTW89_KCC][11] = 66, ++ [2][0][RTW89_ACMA][11] = 56, ++ [2][0][RTW89_CHILE][11] = 68, ++ [2][0][RTW89_UKRAINE][11] = 56, ++ [2][0][RTW89_MEXICO][11] = 50, ++ [2][0][RTW89_CN][11] = 56, ++ [2][0][RTW89_QATAR][11] = 56, ++ [2][0][RTW89_UK][11] = 56, ++ [2][0][RTW89_FCC][12] = 46, ++ [2][0][RTW89_ETSI][12] = 56, ++ [2][0][RTW89_MKK][12] = 64, ++ [2][0][RTW89_IC][12] = 46, ++ [2][0][RTW89_KCC][12] = 66, ++ [2][0][RTW89_ACMA][12] = 56, ++ [2][0][RTW89_CHILE][12] = 68, ++ [2][0][RTW89_UKRAINE][12] = 56, ++ [2][0][RTW89_MEXICO][12] = 46, ++ [2][0][RTW89_CN][12] = 56, ++ [2][0][RTW89_QATAR][12] = 56, ++ [2][0][RTW89_UK][12] = 56, ++ [2][0][RTW89_FCC][13] = 127, ++ [2][0][RTW89_ETSI][13] = 127, ++ [2][0][RTW89_MKK][13] = 127, ++ [2][0][RTW89_IC][13] = 127, ++ [2][0][RTW89_KCC][13] = 127, ++ [2][0][RTW89_ACMA][13] = 127, ++ [2][0][RTW89_CHILE][13] = 127, ++ [2][0][RTW89_UKRAINE][13] = 127, ++ [2][0][RTW89_MEXICO][13] = 127, ++ [2][0][RTW89_CN][13] = 127, ++ [2][0][RTW89_QATAR][13] = 127, ++ [2][0][RTW89_UK][13] = 127, ++ [2][1][RTW89_FCC][0] = 54, ++ [2][1][RTW89_ETSI][0] = 44, ++ [2][1][RTW89_MKK][0] = 52, ++ [2][1][RTW89_IC][0] = 54, ++ [2][1][RTW89_KCC][0] = 54, ++ [2][1][RTW89_ACMA][0] = 44, ++ [2][1][RTW89_CHILE][0] = 58, ++ [2][1][RTW89_UKRAINE][0] = 44, ++ [2][1][RTW89_MEXICO][0] = 54, ++ [2][1][RTW89_CN][0] = 44, ++ [2][1][RTW89_QATAR][0] = 44, ++ [2][1][RTW89_UK][0] = 44, ++ [2][1][RTW89_FCC][1] = 54, ++ [2][1][RTW89_ETSI][1] = 44, ++ [2][1][RTW89_MKK][1] = 52, ++ [2][1][RTW89_IC][1] = 54, ++ [2][1][RTW89_KCC][1] = 54, ++ [2][1][RTW89_ACMA][1] = 44, ++ [2][1][RTW89_CHILE][1] = 56, ++ [2][1][RTW89_UKRAINE][1] = 44, ++ [2][1][RTW89_MEXICO][1] = 54, ++ [2][1][RTW89_CN][1] = 44, ++ [2][1][RTW89_QATAR][1] = 44, ++ [2][1][RTW89_UK][1] = 44, ++ [2][1][RTW89_FCC][2] = 58, ++ [2][1][RTW89_ETSI][2] = 44, ++ [2][1][RTW89_MKK][2] = 52, ++ [2][1][RTW89_IC][2] = 58, ++ [2][1][RTW89_KCC][2] = 54, ++ [2][1][RTW89_ACMA][2] = 44, ++ [2][1][RTW89_CHILE][2] = 56, ++ [2][1][RTW89_UKRAINE][2] = 44, ++ [2][1][RTW89_MEXICO][2] = 58, ++ [2][1][RTW89_CN][2] = 44, ++ [2][1][RTW89_QATAR][2] = 44, ++ [2][1][RTW89_UK][2] = 44, ++ [2][1][RTW89_FCC][3] = 62, ++ [2][1][RTW89_ETSI][3] = 44, ++ [2][1][RTW89_MKK][3] = 52, ++ [2][1][RTW89_IC][3] = 62, ++ [2][1][RTW89_KCC][3] = 54, ++ [2][1][RTW89_ACMA][3] = 44, ++ [2][1][RTW89_CHILE][3] = 56, ++ [2][1][RTW89_UKRAINE][3] = 44, ++ [2][1][RTW89_MEXICO][3] = 62, ++ [2][1][RTW89_CN][3] = 44, ++ [2][1][RTW89_QATAR][3] = 44, ++ [2][1][RTW89_UK][3] = 44, ++ [2][1][RTW89_FCC][4] = 64, ++ [2][1][RTW89_ETSI][4] = 44, ++ [2][1][RTW89_MKK][4] = 52, ++ [2][1][RTW89_IC][4] = 64, ++ [2][1][RTW89_KCC][4] = 52, ++ [2][1][RTW89_ACMA][4] = 44, ++ [2][1][RTW89_CHILE][4] = 56, ++ [2][1][RTW89_UKRAINE][4] = 44, ++ [2][1][RTW89_MEXICO][4] = 64, ++ [2][1][RTW89_CN][4] = 44, ++ [2][1][RTW89_QATAR][4] = 44, ++ [2][1][RTW89_UK][4] = 44, ++ [2][1][RTW89_FCC][5] = 80, ++ [2][1][RTW89_ETSI][5] = 44, ++ [2][1][RTW89_MKK][5] = 52, ++ [2][1][RTW89_IC][5] = 80, ++ [2][1][RTW89_KCC][5] = 52, ++ [2][1][RTW89_ACMA][5] = 44, ++ [2][1][RTW89_CHILE][5] = 56, ++ [2][1][RTW89_UKRAINE][5] = 44, ++ [2][1][RTW89_MEXICO][5] = 80, ++ [2][1][RTW89_CN][5] = 44, ++ [2][1][RTW89_QATAR][5] = 44, ++ [2][1][RTW89_UK][5] = 44, ++ [2][1][RTW89_FCC][6] = 62, ++ [2][1][RTW89_ETSI][6] = 44, ++ [2][1][RTW89_MKK][6] = 52, ++ [2][1][RTW89_IC][6] = 62, ++ [2][1][RTW89_KCC][6] = 52, ++ [2][1][RTW89_ACMA][6] = 44, ++ [2][1][RTW89_CHILE][6] = 56, ++ [2][1][RTW89_UKRAINE][6] = 44, ++ [2][1][RTW89_MEXICO][6] = 62, ++ [2][1][RTW89_CN][6] = 44, ++ [2][1][RTW89_QATAR][6] = 44, ++ [2][1][RTW89_UK][6] = 44, ++ [2][1][RTW89_FCC][7] = 62, ++ [2][1][RTW89_ETSI][7] = 44, ++ [2][1][RTW89_MKK][7] = 52, ++ [2][1][RTW89_IC][7] = 62, ++ [2][1][RTW89_KCC][7] = 52, ++ [2][1][RTW89_ACMA][7] = 44, ++ [2][1][RTW89_CHILE][7] = 56, ++ [2][1][RTW89_UKRAINE][7] = 44, ++ [2][1][RTW89_MEXICO][7] = 62, ++ [2][1][RTW89_CN][7] = 44, ++ [2][1][RTW89_QATAR][7] = 44, ++ [2][1][RTW89_UK][7] = 44, ++ [2][1][RTW89_FCC][8] = 58, ++ [2][1][RTW89_ETSI][8] = 44, ++ [2][1][RTW89_MKK][8] = 52, ++ [2][1][RTW89_IC][8] = 58, ++ [2][1][RTW89_KCC][8] = 52, ++ [2][1][RTW89_ACMA][8] = 44, ++ [2][1][RTW89_CHILE][8] = 56, ++ [2][1][RTW89_UKRAINE][8] = 44, ++ [2][1][RTW89_MEXICO][8] = 58, ++ [2][1][RTW89_CN][8] = 44, ++ [2][1][RTW89_QATAR][8] = 44, ++ [2][1][RTW89_UK][8] = 44, ++ [2][1][RTW89_FCC][9] = 54, ++ [2][1][RTW89_ETSI][9] = 44, ++ [2][1][RTW89_MKK][9] = 52, ++ [2][1][RTW89_IC][9] = 54, ++ [2][1][RTW89_KCC][9] = 54, ++ [2][1][RTW89_ACMA][9] = 44, ++ [2][1][RTW89_CHILE][9] = 56, ++ [2][1][RTW89_UKRAINE][9] = 44, ++ [2][1][RTW89_MEXICO][9] = 54, ++ [2][1][RTW89_CN][9] = 44, ++ [2][1][RTW89_QATAR][9] = 44, ++ [2][1][RTW89_UK][9] = 44, ++ [2][1][RTW89_FCC][10] = 54, ++ [2][1][RTW89_ETSI][10] = 44, ++ [2][1][RTW89_MKK][10] = 52, ++ [2][1][RTW89_IC][10] = 54, ++ [2][1][RTW89_KCC][10] = 54, ++ [2][1][RTW89_ACMA][10] = 44, ++ [2][1][RTW89_CHILE][10] = 56, ++ [2][1][RTW89_UKRAINE][10] = 44, ++ [2][1][RTW89_MEXICO][10] = 54, ++ [2][1][RTW89_CN][10] = 44, ++ [2][1][RTW89_QATAR][10] = 44, ++ [2][1][RTW89_UK][10] = 44, ++ [2][1][RTW89_FCC][11] = 38, ++ [2][1][RTW89_ETSI][11] = 44, ++ [2][1][RTW89_MKK][11] = 52, ++ [2][1][RTW89_IC][11] = 38, ++ [2][1][RTW89_KCC][11] = 54, ++ [2][1][RTW89_ACMA][11] = 44, ++ [2][1][RTW89_CHILE][11] = 56, ++ [2][1][RTW89_UKRAINE][11] = 44, ++ [2][1][RTW89_MEXICO][11] = 38, ++ [2][1][RTW89_CN][11] = 44, ++ [2][1][RTW89_QATAR][11] = 44, ++ [2][1][RTW89_UK][11] = 44, ++ [2][1][RTW89_FCC][12] = 34, ++ [2][1][RTW89_ETSI][12] = 42, ++ [2][1][RTW89_MKK][12] = 52, ++ [2][1][RTW89_IC][12] = 34, ++ [2][1][RTW89_KCC][12] = 54, ++ [2][1][RTW89_ACMA][12] = 42, ++ [2][1][RTW89_CHILE][12] = 56, ++ [2][1][RTW89_UKRAINE][12] = 42, ++ [2][1][RTW89_MEXICO][12] = 34, ++ [2][1][RTW89_CN][12] = 42, ++ [2][1][RTW89_QATAR][12] = 42, ++ [2][1][RTW89_UK][12] = 42, ++ [2][1][RTW89_FCC][13] = 127, ++ [2][1][RTW89_ETSI][13] = 127, ++ [2][1][RTW89_MKK][13] = 127, ++ [2][1][RTW89_IC][13] = 127, ++ [2][1][RTW89_KCC][13] = 127, ++ [2][1][RTW89_ACMA][13] = 127, ++ [2][1][RTW89_CHILE][13] = 127, ++ [2][1][RTW89_UKRAINE][13] = 127, ++ [2][1][RTW89_MEXICO][13] = 127, ++ [2][1][RTW89_CN][13] = 127, ++ [2][1][RTW89_QATAR][13] = 127, ++ [2][1][RTW89_UK][13] = 127, ++}; ++ ++const s8 rtw89_8852b_txpwr_lmt_ru_5g[RTW89_RU_NUM][RTW89_NTX_NUM] ++ [RTW89_REGD_NUM][RTW89_5G_CH_NUM] = { ++ [0][0][RTW89_WW][0] = 24, ++ [0][0][RTW89_WW][2] = 24, ++ [0][0][RTW89_WW][4] = 24, ++ [0][0][RTW89_WW][6] = 12, ++ [0][0][RTW89_WW][8] = 24, ++ [0][0][RTW89_WW][10] = 24, ++ [0][0][RTW89_WW][12] = 24, ++ [0][0][RTW89_WW][14] = 24, ++ [0][0][RTW89_WW][15] = 24, ++ [0][0][RTW89_WW][17] = 24, ++ [0][0][RTW89_WW][19] = 24, ++ [0][0][RTW89_WW][21] = 24, ++ [0][0][RTW89_WW][23] = 24, ++ [0][0][RTW89_WW][25] = 24, ++ [0][0][RTW89_WW][27] = 24, ++ [0][0][RTW89_WW][29] = 24, ++ [0][0][RTW89_WW][31] = 24, ++ [0][0][RTW89_WW][33] = 24, ++ [0][0][RTW89_WW][35] = 24, ++ [0][0][RTW89_WW][37] = 44, ++ [0][0][RTW89_WW][38] = 26, ++ [0][0][RTW89_WW][40] = 26, ++ [0][0][RTW89_WW][42] = 26, ++ [0][0][RTW89_WW][44] = 26, ++ [0][0][RTW89_WW][46] = 26, ++ [0][0][RTW89_WW][48] = 32, ++ [0][0][RTW89_WW][50] = 32, ++ [0][0][RTW89_WW][52] = 32, ++ [0][1][RTW89_WW][0] = 0, ++ [0][1][RTW89_WW][2] = 4, ++ [0][1][RTW89_WW][4] = 0, ++ [0][1][RTW89_WW][6] = 0, ++ [0][1][RTW89_WW][8] = 12, ++ [0][1][RTW89_WW][10] = 12, ++ [0][1][RTW89_WW][12] = 12, ++ [0][1][RTW89_WW][14] = 12, ++ [0][1][RTW89_WW][15] = 12, ++ [0][1][RTW89_WW][17] = 12, ++ [0][1][RTW89_WW][19] = 12, ++ [0][1][RTW89_WW][21] = 12, ++ [0][1][RTW89_WW][23] = 12, ++ [0][1][RTW89_WW][25] = 12, ++ [0][1][RTW89_WW][27] = 12, ++ [0][1][RTW89_WW][29] = 12, ++ [0][1][RTW89_WW][31] = 12, ++ [0][1][RTW89_WW][33] = 12, ++ [0][1][RTW89_WW][35] = 12, ++ [0][1][RTW89_WW][37] = 30, ++ [0][1][RTW89_WW][38] = 14, ++ [0][1][RTW89_WW][40] = 14, ++ [0][1][RTW89_WW][42] = 14, ++ [0][1][RTW89_WW][44] = 14, ++ [0][1][RTW89_WW][46] = 14, ++ [0][1][RTW89_WW][48] = 20, ++ [0][1][RTW89_WW][50] = 20, ++ [0][1][RTW89_WW][52] = 20, ++ [1][0][RTW89_WW][0] = 34, ++ [1][0][RTW89_WW][2] = 34, ++ [1][0][RTW89_WW][4] = 34, ++ [1][0][RTW89_WW][6] = 26, ++ [1][0][RTW89_WW][8] = 34, ++ [1][0][RTW89_WW][10] = 34, ++ [1][0][RTW89_WW][12] = 34, ++ [1][0][RTW89_WW][14] = 34, ++ [1][0][RTW89_WW][15] = 34, ++ [1][0][RTW89_WW][17] = 34, ++ [1][0][RTW89_WW][19] = 34, ++ [1][0][RTW89_WW][21] = 34, ++ [1][0][RTW89_WW][23] = 34, ++ [1][0][RTW89_WW][25] = 34, ++ [1][0][RTW89_WW][27] = 34, ++ [1][0][RTW89_WW][29] = 34, ++ [1][0][RTW89_WW][31] = 34, ++ [1][0][RTW89_WW][33] = 34, ++ [1][0][RTW89_WW][35] = 34, ++ [1][0][RTW89_WW][37] = 52, ++ [1][0][RTW89_WW][38] = 28, ++ [1][0][RTW89_WW][40] = 28, ++ [1][0][RTW89_WW][42] = 28, ++ [1][0][RTW89_WW][44] = 28, ++ [1][0][RTW89_WW][46] = 28, ++ [1][0][RTW89_WW][48] = 44, ++ [1][0][RTW89_WW][50] = 44, ++ [1][0][RTW89_WW][52] = 44, ++ [1][1][RTW89_WW][0] = 10, ++ [1][1][RTW89_WW][2] = 14, ++ [1][1][RTW89_WW][4] = 10, ++ [1][1][RTW89_WW][6] = 10, ++ [1][1][RTW89_WW][8] = 20, ++ [1][1][RTW89_WW][10] = 20, ++ [1][1][RTW89_WW][12] = 22, ++ [1][1][RTW89_WW][14] = 22, ++ [1][1][RTW89_WW][15] = 22, ++ [1][1][RTW89_WW][17] = 22, ++ [1][1][RTW89_WW][19] = 22, ++ [1][1][RTW89_WW][21] = 22, ++ [1][1][RTW89_WW][23] = 22, ++ [1][1][RTW89_WW][25] = 22, ++ [1][1][RTW89_WW][27] = 22, ++ [1][1][RTW89_WW][29] = 22, ++ [1][1][RTW89_WW][31] = 22, ++ [1][1][RTW89_WW][33] = 22, ++ [1][1][RTW89_WW][35] = 22, ++ [1][1][RTW89_WW][37] = 38, ++ [1][1][RTW89_WW][38] = 16, ++ [1][1][RTW89_WW][40] = 16, ++ [1][1][RTW89_WW][42] = 16, ++ [1][1][RTW89_WW][44] = 16, ++ [1][1][RTW89_WW][46] = 16, ++ [1][1][RTW89_WW][48] = 32, ++ [1][1][RTW89_WW][50] = 32, ++ [1][1][RTW89_WW][52] = 32, ++ [2][0][RTW89_WW][0] = 44, ++ [2][0][RTW89_WW][2] = 44, ++ [2][0][RTW89_WW][4] = 44, ++ [2][0][RTW89_WW][6] = 38, ++ [2][0][RTW89_WW][8] = 48, ++ [2][0][RTW89_WW][10] = 48, ++ [2][0][RTW89_WW][12] = 46, ++ [2][0][RTW89_WW][14] = 46, ++ [2][0][RTW89_WW][15] = 48, ++ [2][0][RTW89_WW][17] = 48, ++ [2][0][RTW89_WW][19] = 48, ++ [2][0][RTW89_WW][21] = 48, ++ [2][0][RTW89_WW][23] = 48, ++ [2][0][RTW89_WW][25] = 48, ++ [2][0][RTW89_WW][27] = 48, ++ [2][0][RTW89_WW][29] = 48, ++ [2][0][RTW89_WW][31] = 48, ++ [2][0][RTW89_WW][33] = 48, ++ [2][0][RTW89_WW][35] = 48, ++ [2][0][RTW89_WW][37] = 64, ++ [2][0][RTW89_WW][38] = 28, ++ [2][0][RTW89_WW][40] = 28, ++ [2][0][RTW89_WW][42] = 28, ++ [2][0][RTW89_WW][44] = 28, ++ [2][0][RTW89_WW][46] = 28, ++ [2][0][RTW89_WW][48] = 56, ++ [2][0][RTW89_WW][50] = 56, ++ [2][0][RTW89_WW][52] = 56, ++ [2][1][RTW89_WW][0] = 20, ++ [2][1][RTW89_WW][2] = 18, ++ [2][1][RTW89_WW][4] = 22, ++ [2][1][RTW89_WW][6] = 22, ++ [2][1][RTW89_WW][8] = 34, ++ [2][1][RTW89_WW][10] = 34, ++ [2][1][RTW89_WW][12] = 36, ++ [2][1][RTW89_WW][14] = 36, ++ [2][1][RTW89_WW][15] = 36, ++ [2][1][RTW89_WW][17] = 36, ++ [2][1][RTW89_WW][19] = 36, ++ [2][1][RTW89_WW][21] = 36, ++ [2][1][RTW89_WW][23] = 36, ++ [2][1][RTW89_WW][25] = 36, ++ [2][1][RTW89_WW][27] = 36, ++ [2][1][RTW89_WW][29] = 36, ++ [2][1][RTW89_WW][31] = 36, ++ [2][1][RTW89_WW][33] = 36, ++ [2][1][RTW89_WW][35] = 36, ++ [2][1][RTW89_WW][37] = 48, ++ [2][1][RTW89_WW][38] = 16, ++ [2][1][RTW89_WW][40] = 16, ++ [2][1][RTW89_WW][42] = 16, ++ [2][1][RTW89_WW][44] = 16, ++ [2][1][RTW89_WW][46] = 16, ++ [2][1][RTW89_WW][48] = 44, ++ [2][1][RTW89_WW][50] = 44, ++ [2][1][RTW89_WW][52] = 44, ++ [0][0][RTW89_FCC][0] = 52, ++ [0][0][RTW89_ETSI][0] = 24, ++ [0][0][RTW89_MKK][0] = 26, ++ [0][0][RTW89_IC][0] = 24, ++ [0][0][RTW89_KCC][0] = 44, ++ [0][0][RTW89_ACMA][0] = 24, ++ [0][0][RTW89_CHILE][0] = 40, ++ [0][0][RTW89_UKRAINE][0] = 24, ++ [0][0][RTW89_MEXICO][0] = 52, ++ [0][0][RTW89_CN][0] = 24, ++ [0][0][RTW89_QATAR][0] = 24, ++ [0][0][RTW89_UK][0] = 24, ++ [0][0][RTW89_FCC][2] = 52, ++ [0][0][RTW89_ETSI][2] = 24, ++ [0][0][RTW89_MKK][2] = 26, ++ [0][0][RTW89_IC][2] = 24, ++ [0][0][RTW89_KCC][2] = 44, ++ [0][0][RTW89_ACMA][2] = 24, ++ [0][0][RTW89_CHILE][2] = 38, ++ [0][0][RTW89_UKRAINE][2] = 24, ++ [0][0][RTW89_MEXICO][2] = 52, ++ [0][0][RTW89_CN][2] = 24, ++ [0][0][RTW89_QATAR][2] = 24, ++ [0][0][RTW89_UK][2] = 24, ++ [0][0][RTW89_FCC][4] = 52, ++ [0][0][RTW89_ETSI][4] = 24, ++ [0][0][RTW89_MKK][4] = 26, ++ [0][0][RTW89_IC][4] = 24, ++ [0][0][RTW89_KCC][4] = 44, ++ [0][0][RTW89_ACMA][4] = 24, ++ [0][0][RTW89_CHILE][4] = 38, ++ [0][0][RTW89_UKRAINE][4] = 24, ++ [0][0][RTW89_MEXICO][4] = 52, ++ [0][0][RTW89_CN][4] = 24, ++ [0][0][RTW89_QATAR][4] = 24, ++ [0][0][RTW89_UK][4] = 24, ++ [0][0][RTW89_FCC][6] = 52, ++ [0][0][RTW89_ETSI][6] = 24, ++ [0][0][RTW89_MKK][6] = 26, ++ [0][0][RTW89_IC][6] = 24, ++ [0][0][RTW89_KCC][6] = 12, ++ [0][0][RTW89_ACMA][6] = 24, ++ [0][0][RTW89_CHILE][6] = 40, ++ [0][0][RTW89_UKRAINE][6] = 24, ++ [0][0][RTW89_MEXICO][6] = 52, ++ [0][0][RTW89_CN][6] = 24, ++ [0][0][RTW89_QATAR][6] = 24, ++ [0][0][RTW89_UK][6] = 24, ++ [0][0][RTW89_FCC][8] = 52, ++ [0][0][RTW89_ETSI][8] = 24, ++ [0][0][RTW89_MKK][8] = 26, ++ [0][0][RTW89_IC][8] = 52, ++ [0][0][RTW89_KCC][8] = 46, ++ [0][0][RTW89_ACMA][8] = 24, ++ [0][0][RTW89_CHILE][8] = 64, ++ [0][0][RTW89_UKRAINE][8] = 24, ++ [0][0][RTW89_MEXICO][8] = 52, ++ [0][0][RTW89_CN][8] = 24, ++ [0][0][RTW89_QATAR][8] = 24, ++ [0][0][RTW89_UK][8] = 24, ++ [0][0][RTW89_FCC][10] = 52, ++ [0][0][RTW89_ETSI][10] = 24, ++ [0][0][RTW89_MKK][10] = 26, ++ [0][0][RTW89_IC][10] = 52, ++ [0][0][RTW89_KCC][10] = 46, ++ [0][0][RTW89_ACMA][10] = 24, ++ [0][0][RTW89_CHILE][10] = 64, ++ [0][0][RTW89_UKRAINE][10] = 24, ++ [0][0][RTW89_MEXICO][10] = 52, ++ [0][0][RTW89_CN][10] = 24, ++ [0][0][RTW89_QATAR][10] = 24, ++ [0][0][RTW89_UK][10] = 24, ++ [0][0][RTW89_FCC][12] = 52, ++ [0][0][RTW89_ETSI][12] = 24, ++ [0][0][RTW89_MKK][12] = 24, ++ [0][0][RTW89_IC][12] = 52, ++ [0][0][RTW89_KCC][12] = 42, ++ [0][0][RTW89_ACMA][12] = 24, ++ [0][0][RTW89_CHILE][12] = 64, ++ [0][0][RTW89_UKRAINE][12] = 24, ++ [0][0][RTW89_MEXICO][12] = 52, ++ [0][0][RTW89_CN][12] = 24, ++ [0][0][RTW89_QATAR][12] = 24, ++ [0][0][RTW89_UK][12] = 24, ++ [0][0][RTW89_FCC][14] = 52, ++ [0][0][RTW89_ETSI][14] = 24, ++ [0][0][RTW89_MKK][14] = 24, ++ [0][0][RTW89_IC][14] = 52, ++ [0][0][RTW89_KCC][14] = 42, ++ [0][0][RTW89_ACMA][14] = 24, ++ [0][0][RTW89_CHILE][14] = 64, ++ [0][0][RTW89_UKRAINE][14] = 24, ++ [0][0][RTW89_MEXICO][14] = 52, ++ [0][0][RTW89_CN][14] = 24, ++ [0][0][RTW89_QATAR][14] = 24, ++ [0][0][RTW89_UK][14] = 24, ++ [0][0][RTW89_FCC][15] = 52, ++ [0][0][RTW89_ETSI][15] = 24, ++ [0][0][RTW89_MKK][15] = 46, ++ [0][0][RTW89_IC][15] = 52, ++ [0][0][RTW89_KCC][15] = 44, ++ [0][0][RTW89_ACMA][15] = 24, ++ [0][0][RTW89_CHILE][15] = 60, ++ [0][0][RTW89_UKRAINE][15] = 24, ++ [0][0][RTW89_MEXICO][15] = 52, ++ [0][0][RTW89_CN][15] = 127, ++ [0][0][RTW89_QATAR][15] = 24, ++ [0][0][RTW89_UK][15] = 24, ++ [0][0][RTW89_FCC][17] = 52, ++ [0][0][RTW89_ETSI][17] = 24, ++ [0][0][RTW89_MKK][17] = 48, ++ [0][0][RTW89_IC][17] = 52, ++ [0][0][RTW89_KCC][17] = 44, ++ [0][0][RTW89_ACMA][17] = 24, ++ [0][0][RTW89_CHILE][17] = 60, ++ [0][0][RTW89_UKRAINE][17] = 24, ++ [0][0][RTW89_MEXICO][17] = 52, ++ [0][0][RTW89_CN][17] = 127, ++ [0][0][RTW89_QATAR][17] = 24, ++ [0][0][RTW89_UK][17] = 24, ++ [0][0][RTW89_FCC][19] = 52, ++ [0][0][RTW89_ETSI][19] = 24, ++ [0][0][RTW89_MKK][19] = 48, ++ [0][0][RTW89_IC][19] = 52, ++ [0][0][RTW89_KCC][19] = 44, ++ [0][0][RTW89_ACMA][19] = 24, ++ [0][0][RTW89_CHILE][19] = 60, ++ [0][0][RTW89_UKRAINE][19] = 24, ++ [0][0][RTW89_MEXICO][19] = 52, ++ [0][0][RTW89_CN][19] = 127, ++ [0][0][RTW89_QATAR][19] = 24, ++ [0][0][RTW89_UK][19] = 24, ++ [0][0][RTW89_FCC][21] = 52, ++ [0][0][RTW89_ETSI][21] = 24, ++ [0][0][RTW89_MKK][21] = 48, ++ [0][0][RTW89_IC][21] = 52, ++ [0][0][RTW89_KCC][21] = 44, ++ [0][0][RTW89_ACMA][21] = 24, ++ [0][0][RTW89_CHILE][21] = 62, ++ [0][0][RTW89_UKRAINE][21] = 24, ++ [0][0][RTW89_MEXICO][21] = 52, ++ [0][0][RTW89_CN][21] = 127, ++ [0][0][RTW89_QATAR][21] = 24, ++ [0][0][RTW89_UK][21] = 24, ++ [0][0][RTW89_FCC][23] = 52, ++ [0][0][RTW89_ETSI][23] = 24, ++ [0][0][RTW89_MKK][23] = 48, ++ [0][0][RTW89_IC][23] = 52, ++ [0][0][RTW89_KCC][23] = 44, ++ [0][0][RTW89_ACMA][23] = 24, ++ [0][0][RTW89_CHILE][23] = 62, ++ [0][0][RTW89_UKRAINE][23] = 24, ++ [0][0][RTW89_MEXICO][23] = 52, ++ [0][0][RTW89_CN][23] = 127, ++ [0][0][RTW89_QATAR][23] = 24, ++ [0][0][RTW89_UK][23] = 24, ++ [0][0][RTW89_FCC][25] = 52, ++ [0][0][RTW89_ETSI][25] = 24, ++ [0][0][RTW89_MKK][25] = 48, ++ [0][0][RTW89_IC][25] = 127, ++ [0][0][RTW89_KCC][25] = 44, ++ [0][0][RTW89_ACMA][25] = 127, ++ [0][0][RTW89_CHILE][25] = 62, ++ [0][0][RTW89_UKRAINE][25] = 24, ++ [0][0][RTW89_MEXICO][25] = 52, ++ [0][0][RTW89_CN][25] = 127, ++ [0][0][RTW89_QATAR][25] = 24, ++ [0][0][RTW89_UK][25] = 24, ++ [0][0][RTW89_FCC][27] = 52, ++ [0][0][RTW89_ETSI][27] = 24, ++ [0][0][RTW89_MKK][27] = 48, ++ [0][0][RTW89_IC][27] = 127, ++ [0][0][RTW89_KCC][27] = 44, ++ [0][0][RTW89_ACMA][27] = 127, ++ [0][0][RTW89_CHILE][27] = 62, ++ [0][0][RTW89_UKRAINE][27] = 24, ++ [0][0][RTW89_MEXICO][27] = 52, ++ [0][0][RTW89_CN][27] = 127, ++ [0][0][RTW89_QATAR][27] = 24, ++ [0][0][RTW89_UK][27] = 24, ++ [0][0][RTW89_FCC][29] = 52, ++ [0][0][RTW89_ETSI][29] = 24, ++ [0][0][RTW89_MKK][29] = 48, ++ [0][0][RTW89_IC][29] = 127, ++ [0][0][RTW89_KCC][29] = 44, ++ [0][0][RTW89_ACMA][29] = 127, ++ [0][0][RTW89_CHILE][29] = 60, ++ [0][0][RTW89_UKRAINE][29] = 24, ++ [0][0][RTW89_MEXICO][29] = 52, ++ [0][0][RTW89_CN][29] = 127, ++ [0][0][RTW89_QATAR][29] = 24, ++ [0][0][RTW89_UK][29] = 24, ++ [0][0][RTW89_FCC][31] = 52, ++ [0][0][RTW89_ETSI][31] = 24, ++ [0][0][RTW89_MKK][31] = 48, ++ [0][0][RTW89_IC][31] = 52, ++ [0][0][RTW89_KCC][31] = 44, ++ [0][0][RTW89_ACMA][31] = 24, ++ [0][0][RTW89_CHILE][31] = 60, ++ [0][0][RTW89_UKRAINE][31] = 24, ++ [0][0][RTW89_MEXICO][31] = 52, ++ [0][0][RTW89_CN][31] = 127, ++ [0][0][RTW89_QATAR][31] = 24, ++ [0][0][RTW89_UK][31] = 24, ++ [0][0][RTW89_FCC][33] = 52, ++ [0][0][RTW89_ETSI][33] = 24, ++ [0][0][RTW89_MKK][33] = 48, ++ [0][0][RTW89_IC][33] = 52, ++ [0][0][RTW89_KCC][33] = 44, ++ [0][0][RTW89_ACMA][33] = 24, ++ [0][0][RTW89_CHILE][33] = 60, ++ [0][0][RTW89_UKRAINE][33] = 24, ++ [0][0][RTW89_MEXICO][33] = 52, ++ [0][0][RTW89_CN][33] = 127, ++ [0][0][RTW89_QATAR][33] = 24, ++ [0][0][RTW89_UK][33] = 24, ++ [0][0][RTW89_FCC][35] = 52, ++ [0][0][RTW89_ETSI][35] = 24, ++ [0][0][RTW89_MKK][35] = 48, ++ [0][0][RTW89_IC][35] = 52, ++ [0][0][RTW89_KCC][35] = 44, ++ [0][0][RTW89_ACMA][35] = 24, ++ [0][0][RTW89_CHILE][35] = 60, ++ [0][0][RTW89_UKRAINE][35] = 24, ++ [0][0][RTW89_MEXICO][35] = 52, ++ [0][0][RTW89_CN][35] = 127, ++ [0][0][RTW89_QATAR][35] = 24, ++ [0][0][RTW89_UK][35] = 24, ++ [0][0][RTW89_FCC][37] = 52, ++ [0][0][RTW89_ETSI][37] = 127, ++ [0][0][RTW89_MKK][37] = 44, ++ [0][0][RTW89_IC][37] = 52, ++ [0][0][RTW89_KCC][37] = 44, ++ [0][0][RTW89_ACMA][37] = 52, ++ [0][0][RTW89_CHILE][37] = 62, ++ [0][0][RTW89_UKRAINE][37] = 127, ++ [0][0][RTW89_MEXICO][37] = 52, ++ [0][0][RTW89_CN][37] = 127, ++ [0][0][RTW89_QATAR][37] = 127, ++ [0][0][RTW89_UK][37] = 56, ++ [0][0][RTW89_FCC][38] = 84, ++ [0][0][RTW89_ETSI][38] = 28, ++ [0][0][RTW89_MKK][38] = 127, ++ [0][0][RTW89_IC][38] = 84, ++ [0][0][RTW89_KCC][38] = 44, ++ [0][0][RTW89_ACMA][38] = 84, ++ [0][0][RTW89_CHILE][38] = 60, ++ [0][0][RTW89_UKRAINE][38] = 28, ++ [0][0][RTW89_MEXICO][38] = 84, ++ [0][0][RTW89_CN][38] = 62, ++ [0][0][RTW89_QATAR][38] = 28, ++ [0][0][RTW89_UK][38] = 26, ++ [0][0][RTW89_FCC][40] = 84, ++ [0][0][RTW89_ETSI][40] = 28, ++ [0][0][RTW89_MKK][40] = 127, ++ [0][0][RTW89_IC][40] = 84, ++ [0][0][RTW89_KCC][40] = 44, ++ [0][0][RTW89_ACMA][40] = 84, ++ [0][0][RTW89_CHILE][40] = 60, ++ [0][0][RTW89_UKRAINE][40] = 28, ++ [0][0][RTW89_MEXICO][40] = 84, ++ [0][0][RTW89_CN][40] = 62, ++ [0][0][RTW89_QATAR][40] = 28, ++ [0][0][RTW89_UK][40] = 26, ++ [0][0][RTW89_FCC][42] = 84, ++ [0][0][RTW89_ETSI][42] = 28, ++ [0][0][RTW89_MKK][42] = 127, ++ [0][0][RTW89_IC][42] = 84, ++ [0][0][RTW89_KCC][42] = 44, ++ [0][0][RTW89_ACMA][42] = 84, ++ [0][0][RTW89_CHILE][42] = 64, ++ [0][0][RTW89_UKRAINE][42] = 28, ++ [0][0][RTW89_MEXICO][42] = 84, ++ [0][0][RTW89_CN][42] = 62, ++ [0][0][RTW89_QATAR][42] = 28, ++ [0][0][RTW89_UK][42] = 26, ++ [0][0][RTW89_FCC][44] = 84, ++ [0][0][RTW89_ETSI][44] = 28, ++ [0][0][RTW89_MKK][44] = 127, ++ [0][0][RTW89_IC][44] = 84, ++ [0][0][RTW89_KCC][44] = 44, ++ [0][0][RTW89_ACMA][44] = 84, ++ [0][0][RTW89_CHILE][44] = 60, ++ [0][0][RTW89_UKRAINE][44] = 28, ++ [0][0][RTW89_MEXICO][44] = 84, ++ [0][0][RTW89_CN][44] = 62, ++ [0][0][RTW89_QATAR][44] = 28, ++ [0][0][RTW89_UK][44] = 26, ++ [0][0][RTW89_FCC][46] = 84, ++ [0][0][RTW89_ETSI][46] = 28, ++ [0][0][RTW89_MKK][46] = 127, ++ [0][0][RTW89_IC][46] = 84, ++ [0][0][RTW89_KCC][46] = 44, ++ [0][0][RTW89_ACMA][46] = 84, ++ [0][0][RTW89_CHILE][46] = 60, ++ [0][0][RTW89_UKRAINE][46] = 28, ++ [0][0][RTW89_MEXICO][46] = 84, ++ [0][0][RTW89_CN][46] = 62, ++ [0][0][RTW89_QATAR][46] = 28, ++ [0][0][RTW89_UK][46] = 26, ++ [0][0][RTW89_FCC][48] = 32, ++ [0][0][RTW89_ETSI][48] = 127, ++ [0][0][RTW89_MKK][48] = 127, ++ [0][0][RTW89_IC][48] = 127, ++ [0][0][RTW89_KCC][48] = 127, ++ [0][0][RTW89_ACMA][48] = 127, ++ [0][0][RTW89_CHILE][48] = 127, ++ [0][0][RTW89_UKRAINE][48] = 127, ++ [0][0][RTW89_MEXICO][48] = 127, ++ [0][0][RTW89_CN][48] = 127, ++ [0][0][RTW89_QATAR][48] = 127, ++ [0][0][RTW89_UK][48] = 127, ++ [0][0][RTW89_FCC][50] = 32, ++ [0][0][RTW89_ETSI][50] = 127, ++ [0][0][RTW89_MKK][50] = 127, ++ [0][0][RTW89_IC][50] = 127, ++ [0][0][RTW89_KCC][50] = 127, ++ [0][0][RTW89_ACMA][50] = 127, ++ [0][0][RTW89_CHILE][50] = 127, ++ [0][0][RTW89_UKRAINE][50] = 127, ++ [0][0][RTW89_MEXICO][50] = 127, ++ [0][0][RTW89_CN][50] = 127, ++ [0][0][RTW89_QATAR][50] = 127, ++ [0][0][RTW89_UK][50] = 127, ++ [0][0][RTW89_FCC][52] = 32, ++ [0][0][RTW89_ETSI][52] = 127, ++ [0][0][RTW89_MKK][52] = 127, ++ [0][0][RTW89_IC][52] = 127, ++ [0][0][RTW89_KCC][52] = 127, ++ [0][0][RTW89_ACMA][52] = 127, ++ [0][0][RTW89_CHILE][52] = 127, ++ [0][0][RTW89_UKRAINE][52] = 127, ++ [0][0][RTW89_MEXICO][52] = 127, ++ [0][0][RTW89_CN][52] = 127, ++ [0][0][RTW89_QATAR][52] = 127, ++ [0][0][RTW89_UK][52] = 127, ++ [0][1][RTW89_FCC][0] = 34, ++ [0][1][RTW89_ETSI][0] = 12, ++ [0][1][RTW89_MKK][0] = 12, ++ [0][1][RTW89_IC][0] = 0, ++ [0][1][RTW89_KCC][0] = 28, ++ [0][1][RTW89_ACMA][0] = 12, ++ [0][1][RTW89_CHILE][0] = 14, ++ [0][1][RTW89_UKRAINE][0] = 12, ++ [0][1][RTW89_MEXICO][0] = 34, ++ [0][1][RTW89_CN][0] = 12, ++ [0][1][RTW89_QATAR][0] = 12, ++ [0][1][RTW89_UK][0] = 12, ++ [0][1][RTW89_FCC][2] = 38, ++ [0][1][RTW89_ETSI][2] = 12, ++ [0][1][RTW89_MKK][2] = 12, ++ [0][1][RTW89_IC][2] = 4, ++ [0][1][RTW89_KCC][2] = 28, ++ [0][1][RTW89_ACMA][2] = 12, ++ [0][1][RTW89_CHILE][2] = 12, ++ [0][1][RTW89_UKRAINE][2] = 12, ++ [0][1][RTW89_MEXICO][2] = 38, ++ [0][1][RTW89_CN][2] = 12, ++ [0][1][RTW89_QATAR][2] = 12, ++ [0][1][RTW89_UK][2] = 12, ++ [0][1][RTW89_FCC][4] = 34, ++ [0][1][RTW89_ETSI][4] = 12, ++ [0][1][RTW89_MKK][4] = 14, ++ [0][1][RTW89_IC][4] = 0, ++ [0][1][RTW89_KCC][4] = 28, ++ [0][1][RTW89_ACMA][4] = 12, ++ [0][1][RTW89_CHILE][4] = 12, ++ [0][1][RTW89_UKRAINE][4] = 12, ++ [0][1][RTW89_MEXICO][4] = 34, ++ [0][1][RTW89_CN][4] = 12, ++ [0][1][RTW89_QATAR][4] = 12, ++ [0][1][RTW89_UK][4] = 12, ++ [0][1][RTW89_FCC][6] = 34, ++ [0][1][RTW89_ETSI][6] = 12, ++ [0][1][RTW89_MKK][6] = 14, ++ [0][1][RTW89_IC][6] = 0, ++ [0][1][RTW89_KCC][6] = 2, ++ [0][1][RTW89_ACMA][6] = 12, ++ [0][1][RTW89_CHILE][6] = 12, ++ [0][1][RTW89_UKRAINE][6] = 12, ++ [0][1][RTW89_MEXICO][6] = 34, ++ [0][1][RTW89_CN][6] = 12, ++ [0][1][RTW89_QATAR][6] = 12, ++ [0][1][RTW89_UK][6] = 12, ++ [0][1][RTW89_FCC][8] = 34, ++ [0][1][RTW89_ETSI][8] = 12, ++ [0][1][RTW89_MKK][8] = 14, ++ [0][1][RTW89_IC][8] = 34, ++ [0][1][RTW89_KCC][8] = 30, ++ [0][1][RTW89_ACMA][8] = 12, ++ [0][1][RTW89_CHILE][8] = 50, ++ [0][1][RTW89_UKRAINE][8] = 12, ++ [0][1][RTW89_MEXICO][8] = 34, ++ [0][1][RTW89_CN][8] = 12, ++ [0][1][RTW89_QATAR][8] = 12, ++ [0][1][RTW89_UK][8] = 12, ++ [0][1][RTW89_FCC][10] = 34, ++ [0][1][RTW89_ETSI][10] = 12, ++ [0][1][RTW89_MKK][10] = 14, ++ [0][1][RTW89_IC][10] = 34, ++ [0][1][RTW89_KCC][10] = 30, ++ [0][1][RTW89_ACMA][10] = 12, ++ [0][1][RTW89_CHILE][10] = 50, ++ [0][1][RTW89_UKRAINE][10] = 12, ++ [0][1][RTW89_MEXICO][10] = 34, ++ [0][1][RTW89_CN][10] = 12, ++ [0][1][RTW89_QATAR][10] = 12, ++ [0][1][RTW89_UK][10] = 12, ++ [0][1][RTW89_FCC][12] = 38, ++ [0][1][RTW89_ETSI][12] = 12, ++ [0][1][RTW89_MKK][12] = 12, ++ [0][1][RTW89_IC][12] = 38, ++ [0][1][RTW89_KCC][12] = 30, ++ [0][1][RTW89_ACMA][12] = 12, ++ [0][1][RTW89_CHILE][12] = 50, ++ [0][1][RTW89_UKRAINE][12] = 12, ++ [0][1][RTW89_MEXICO][12] = 38, ++ [0][1][RTW89_CN][12] = 12, ++ [0][1][RTW89_QATAR][12] = 12, ++ [0][1][RTW89_UK][12] = 12, ++ [0][1][RTW89_FCC][14] = 34, ++ [0][1][RTW89_ETSI][14] = 12, ++ [0][1][RTW89_MKK][14] = 12, ++ [0][1][RTW89_IC][14] = 34, ++ [0][1][RTW89_KCC][14] = 30, ++ [0][1][RTW89_ACMA][14] = 12, ++ [0][1][RTW89_CHILE][14] = 48, ++ [0][1][RTW89_UKRAINE][14] = 12, ++ [0][1][RTW89_MEXICO][14] = 34, ++ [0][1][RTW89_CN][14] = 12, ++ [0][1][RTW89_QATAR][14] = 12, ++ [0][1][RTW89_UK][14] = 12, ++ [0][1][RTW89_FCC][15] = 34, ++ [0][1][RTW89_ETSI][15] = 12, ++ [0][1][RTW89_MKK][15] = 32, ++ [0][1][RTW89_IC][15] = 34, ++ [0][1][RTW89_KCC][15] = 30, ++ [0][1][RTW89_ACMA][15] = 12, ++ [0][1][RTW89_CHILE][15] = 52, ++ [0][1][RTW89_UKRAINE][15] = 12, ++ [0][1][RTW89_MEXICO][15] = 34, ++ [0][1][RTW89_CN][15] = 127, ++ [0][1][RTW89_QATAR][15] = 12, ++ [0][1][RTW89_UK][15] = 12, ++ [0][1][RTW89_FCC][17] = 34, ++ [0][1][RTW89_ETSI][17] = 12, ++ [0][1][RTW89_MKK][17] = 34, ++ [0][1][RTW89_IC][17] = 34, ++ [0][1][RTW89_KCC][17] = 30, ++ [0][1][RTW89_ACMA][17] = 12, ++ [0][1][RTW89_CHILE][17] = 52, ++ [0][1][RTW89_UKRAINE][17] = 12, ++ [0][1][RTW89_MEXICO][17] = 34, ++ [0][1][RTW89_CN][17] = 127, ++ [0][1][RTW89_QATAR][17] = 12, ++ [0][1][RTW89_UK][17] = 12, ++ [0][1][RTW89_FCC][19] = 38, ++ [0][1][RTW89_ETSI][19] = 12, ++ [0][1][RTW89_MKK][19] = 34, ++ [0][1][RTW89_IC][19] = 38, ++ [0][1][RTW89_KCC][19] = 30, ++ [0][1][RTW89_ACMA][19] = 12, ++ [0][1][RTW89_CHILE][19] = 52, ++ [0][1][RTW89_UKRAINE][19] = 12, ++ [0][1][RTW89_MEXICO][19] = 38, ++ [0][1][RTW89_CN][19] = 127, ++ [0][1][RTW89_QATAR][19] = 12, ++ [0][1][RTW89_UK][19] = 12, ++ [0][1][RTW89_FCC][21] = 38, ++ [0][1][RTW89_ETSI][21] = 12, ++ [0][1][RTW89_MKK][21] = 34, ++ [0][1][RTW89_IC][21] = 38, ++ [0][1][RTW89_KCC][21] = 30, ++ [0][1][RTW89_ACMA][21] = 12, ++ [0][1][RTW89_CHILE][21] = 52, ++ [0][1][RTW89_UKRAINE][21] = 12, ++ [0][1][RTW89_MEXICO][21] = 38, ++ [0][1][RTW89_CN][21] = 127, ++ [0][1][RTW89_QATAR][21] = 12, ++ [0][1][RTW89_UK][21] = 12, ++ [0][1][RTW89_FCC][23] = 38, ++ [0][1][RTW89_ETSI][23] = 12, ++ [0][1][RTW89_MKK][23] = 34, ++ [0][1][RTW89_IC][23] = 38, ++ [0][1][RTW89_KCC][23] = 30, ++ [0][1][RTW89_ACMA][23] = 12, ++ [0][1][RTW89_CHILE][23] = 52, ++ [0][1][RTW89_UKRAINE][23] = 12, ++ [0][1][RTW89_MEXICO][23] = 38, ++ [0][1][RTW89_CN][23] = 127, ++ [0][1][RTW89_QATAR][23] = 12, ++ [0][1][RTW89_UK][23] = 12, ++ [0][1][RTW89_FCC][25] = 38, ++ [0][1][RTW89_ETSI][25] = 12, ++ [0][1][RTW89_MKK][25] = 34, ++ [0][1][RTW89_IC][25] = 127, ++ [0][1][RTW89_KCC][25] = 30, ++ [0][1][RTW89_ACMA][25] = 127, ++ [0][1][RTW89_CHILE][25] = 52, ++ [0][1][RTW89_UKRAINE][25] = 12, ++ [0][1][RTW89_MEXICO][25] = 38, ++ [0][1][RTW89_CN][25] = 127, ++ [0][1][RTW89_QATAR][25] = 12, ++ [0][1][RTW89_UK][25] = 12, ++ [0][1][RTW89_FCC][27] = 38, ++ [0][1][RTW89_ETSI][27] = 12, ++ [0][1][RTW89_MKK][27] = 34, ++ [0][1][RTW89_IC][27] = 127, ++ [0][1][RTW89_KCC][27] = 30, ++ [0][1][RTW89_ACMA][27] = 127, ++ [0][1][RTW89_CHILE][27] = 52, ++ [0][1][RTW89_UKRAINE][27] = 12, ++ [0][1][RTW89_MEXICO][27] = 38, ++ [0][1][RTW89_CN][27] = 127, ++ [0][1][RTW89_QATAR][27] = 12, ++ [0][1][RTW89_UK][27] = 12, ++ [0][1][RTW89_FCC][29] = 38, ++ [0][1][RTW89_ETSI][29] = 12, ++ [0][1][RTW89_MKK][29] = 34, ++ [0][1][RTW89_IC][29] = 127, ++ [0][1][RTW89_KCC][29] = 30, ++ [0][1][RTW89_ACMA][29] = 127, ++ [0][1][RTW89_CHILE][29] = 52, ++ [0][1][RTW89_UKRAINE][29] = 12, ++ [0][1][RTW89_MEXICO][29] = 38, ++ [0][1][RTW89_CN][29] = 127, ++ [0][1][RTW89_QATAR][29] = 12, ++ [0][1][RTW89_UK][29] = 12, ++ [0][1][RTW89_FCC][31] = 38, ++ [0][1][RTW89_ETSI][31] = 12, ++ [0][1][RTW89_MKK][31] = 34, ++ [0][1][RTW89_IC][31] = 34, ++ [0][1][RTW89_KCC][31] = 30, ++ [0][1][RTW89_ACMA][31] = 12, ++ [0][1][RTW89_CHILE][31] = 52, ++ [0][1][RTW89_UKRAINE][31] = 12, ++ [0][1][RTW89_MEXICO][31] = 38, ++ [0][1][RTW89_CN][31] = 127, ++ [0][1][RTW89_QATAR][31] = 12, ++ [0][1][RTW89_UK][31] = 12, ++ [0][1][RTW89_FCC][33] = 34, ++ [0][1][RTW89_ETSI][33] = 12, ++ [0][1][RTW89_MKK][33] = 34, ++ [0][1][RTW89_IC][33] = 34, ++ [0][1][RTW89_KCC][33] = 30, ++ [0][1][RTW89_ACMA][33] = 12, ++ [0][1][RTW89_CHILE][33] = 52, ++ [0][1][RTW89_UKRAINE][33] = 12, ++ [0][1][RTW89_MEXICO][33] = 34, ++ [0][1][RTW89_CN][33] = 127, ++ [0][1][RTW89_QATAR][33] = 12, ++ [0][1][RTW89_UK][33] = 12, ++ [0][1][RTW89_FCC][35] = 34, ++ [0][1][RTW89_ETSI][35] = 12, ++ [0][1][RTW89_MKK][35] = 34, ++ [0][1][RTW89_IC][35] = 34, ++ [0][1][RTW89_KCC][35] = 30, ++ [0][1][RTW89_ACMA][35] = 12, ++ [0][1][RTW89_CHILE][35] = 52, ++ [0][1][RTW89_UKRAINE][35] = 12, ++ [0][1][RTW89_MEXICO][35] = 34, ++ [0][1][RTW89_CN][35] = 127, ++ [0][1][RTW89_QATAR][35] = 12, ++ [0][1][RTW89_UK][35] = 12, ++ [0][1][RTW89_FCC][37] = 38, ++ [0][1][RTW89_ETSI][37] = 127, ++ [0][1][RTW89_MKK][37] = 34, ++ [0][1][RTW89_IC][37] = 38, ++ [0][1][RTW89_KCC][37] = 30, ++ [0][1][RTW89_ACMA][37] = 38, ++ [0][1][RTW89_CHILE][37] = 52, ++ [0][1][RTW89_UKRAINE][37] = 127, ++ [0][1][RTW89_MEXICO][37] = 38, ++ [0][1][RTW89_CN][37] = 127, ++ [0][1][RTW89_QATAR][37] = 127, ++ [0][1][RTW89_UK][37] = 44, ++ [0][1][RTW89_FCC][38] = 82, ++ [0][1][RTW89_ETSI][38] = 16, ++ [0][1][RTW89_MKK][38] = 127, ++ [0][1][RTW89_IC][38] = 82, ++ [0][1][RTW89_KCC][38] = 30, ++ [0][1][RTW89_ACMA][38] = 84, ++ [0][1][RTW89_CHILE][38] = 52, ++ [0][1][RTW89_UKRAINE][38] = 16, ++ [0][1][RTW89_MEXICO][38] = 82, ++ [0][1][RTW89_CN][38] = 50, ++ [0][1][RTW89_QATAR][38] = 16, ++ [0][1][RTW89_UK][38] = 14, ++ [0][1][RTW89_FCC][40] = 82, ++ [0][1][RTW89_ETSI][40] = 16, ++ [0][1][RTW89_MKK][40] = 127, ++ [0][1][RTW89_IC][40] = 82, ++ [0][1][RTW89_KCC][40] = 30, ++ [0][1][RTW89_ACMA][40] = 84, ++ [0][1][RTW89_CHILE][40] = 52, ++ [0][1][RTW89_UKRAINE][40] = 16, ++ [0][1][RTW89_MEXICO][40] = 82, ++ [0][1][RTW89_CN][40] = 50, ++ [0][1][RTW89_QATAR][40] = 16, ++ [0][1][RTW89_UK][40] = 14, ++ [0][1][RTW89_FCC][42] = 82, ++ [0][1][RTW89_ETSI][42] = 16, ++ [0][1][RTW89_MKK][42] = 127, ++ [0][1][RTW89_IC][42] = 82, ++ [0][1][RTW89_KCC][42] = 30, ++ [0][1][RTW89_ACMA][42] = 84, ++ [0][1][RTW89_CHILE][42] = 54, ++ [0][1][RTW89_UKRAINE][42] = 16, ++ [0][1][RTW89_MEXICO][42] = 82, ++ [0][1][RTW89_CN][42] = 50, ++ [0][1][RTW89_QATAR][42] = 16, ++ [0][1][RTW89_UK][42] = 14, ++ [0][1][RTW89_FCC][44] = 82, ++ [0][1][RTW89_ETSI][44] = 16, ++ [0][1][RTW89_MKK][44] = 127, ++ [0][1][RTW89_IC][44] = 82, ++ [0][1][RTW89_KCC][44] = 30, ++ [0][1][RTW89_ACMA][44] = 84, ++ [0][1][RTW89_CHILE][44] = 54, ++ [0][1][RTW89_UKRAINE][44] = 16, ++ [0][1][RTW89_MEXICO][44] = 82, ++ [0][1][RTW89_CN][44] = 50, ++ [0][1][RTW89_QATAR][44] = 16, ++ [0][1][RTW89_UK][44] = 14, ++ [0][1][RTW89_FCC][46] = 82, ++ [0][1][RTW89_ETSI][46] = 16, ++ [0][1][RTW89_MKK][46] = 127, ++ [0][1][RTW89_IC][46] = 82, ++ [0][1][RTW89_KCC][46] = 30, ++ [0][1][RTW89_ACMA][46] = 84, ++ [0][1][RTW89_CHILE][46] = 54, ++ [0][1][RTW89_UKRAINE][46] = 16, ++ [0][1][RTW89_MEXICO][46] = 82, ++ [0][1][RTW89_CN][46] = 50, ++ [0][1][RTW89_QATAR][46] = 16, ++ [0][1][RTW89_UK][46] = 14, ++ [0][1][RTW89_FCC][48] = 20, ++ [0][1][RTW89_ETSI][48] = 127, ++ [0][1][RTW89_MKK][48] = 127, ++ [0][1][RTW89_IC][48] = 127, ++ [0][1][RTW89_KCC][48] = 127, ++ [0][1][RTW89_ACMA][48] = 127, ++ [0][1][RTW89_CHILE][48] = 127, ++ [0][1][RTW89_UKRAINE][48] = 127, ++ [0][1][RTW89_MEXICO][48] = 127, ++ [0][1][RTW89_CN][48] = 127, ++ [0][1][RTW89_QATAR][48] = 127, ++ [0][1][RTW89_UK][48] = 127, ++ [0][1][RTW89_FCC][50] = 20, ++ [0][1][RTW89_ETSI][50] = 127, ++ [0][1][RTW89_MKK][50] = 127, ++ [0][1][RTW89_IC][50] = 127, ++ [0][1][RTW89_KCC][50] = 127, ++ [0][1][RTW89_ACMA][50] = 127, ++ [0][1][RTW89_CHILE][50] = 127, ++ [0][1][RTW89_UKRAINE][50] = 127, ++ [0][1][RTW89_MEXICO][50] = 127, ++ [0][1][RTW89_CN][50] = 127, ++ [0][1][RTW89_QATAR][50] = 127, ++ [0][1][RTW89_UK][50] = 127, ++ [0][1][RTW89_FCC][52] = 20, ++ [0][1][RTW89_ETSI][52] = 127, ++ [0][1][RTW89_MKK][52] = 127, ++ [0][1][RTW89_IC][52] = 127, ++ [0][1][RTW89_KCC][52] = 127, ++ [0][1][RTW89_ACMA][52] = 127, ++ [0][1][RTW89_CHILE][52] = 127, ++ [0][1][RTW89_UKRAINE][52] = 127, ++ [0][1][RTW89_MEXICO][52] = 127, ++ [0][1][RTW89_CN][52] = 127, ++ [0][1][RTW89_QATAR][52] = 127, ++ [0][1][RTW89_UK][52] = 127, ++ [1][0][RTW89_FCC][0] = 62, ++ [1][0][RTW89_ETSI][0] = 34, ++ [1][0][RTW89_MKK][0] = 36, ++ [1][0][RTW89_IC][0] = 36, ++ [1][0][RTW89_KCC][0] = 52, ++ [1][0][RTW89_ACMA][0] = 34, ++ [1][0][RTW89_CHILE][0] = 40, ++ [1][0][RTW89_UKRAINE][0] = 34, ++ [1][0][RTW89_MEXICO][0] = 62, ++ [1][0][RTW89_CN][0] = 34, ++ [1][0][RTW89_QATAR][0] = 34, ++ [1][0][RTW89_UK][0] = 34, ++ [1][0][RTW89_FCC][2] = 62, ++ [1][0][RTW89_ETSI][2] = 34, ++ [1][0][RTW89_MKK][2] = 36, ++ [1][0][RTW89_IC][2] = 36, ++ [1][0][RTW89_KCC][2] = 52, ++ [1][0][RTW89_ACMA][2] = 34, ++ [1][0][RTW89_CHILE][2] = 42, ++ [1][0][RTW89_UKRAINE][2] = 34, ++ [1][0][RTW89_MEXICO][2] = 62, ++ [1][0][RTW89_CN][2] = 34, ++ [1][0][RTW89_QATAR][2] = 34, ++ [1][0][RTW89_UK][2] = 34, ++ [1][0][RTW89_FCC][4] = 62, ++ [1][0][RTW89_ETSI][4] = 34, ++ [1][0][RTW89_MKK][4] = 34, ++ [1][0][RTW89_IC][4] = 36, ++ [1][0][RTW89_KCC][4] = 52, ++ [1][0][RTW89_ACMA][4] = 34, ++ [1][0][RTW89_CHILE][4] = 42, ++ [1][0][RTW89_UKRAINE][4] = 34, ++ [1][0][RTW89_MEXICO][4] = 62, ++ [1][0][RTW89_CN][4] = 34, ++ [1][0][RTW89_QATAR][4] = 34, ++ [1][0][RTW89_UK][4] = 34, ++ [1][0][RTW89_FCC][6] = 62, ++ [1][0][RTW89_ETSI][6] = 34, ++ [1][0][RTW89_MKK][6] = 34, ++ [1][0][RTW89_IC][6] = 36, ++ [1][0][RTW89_KCC][6] = 26, ++ [1][0][RTW89_ACMA][6] = 34, ++ [1][0][RTW89_CHILE][6] = 42, ++ [1][0][RTW89_UKRAINE][6] = 34, ++ [1][0][RTW89_MEXICO][6] = 62, ++ [1][0][RTW89_CN][6] = 34, ++ [1][0][RTW89_QATAR][6] = 34, ++ [1][0][RTW89_UK][6] = 34, ++ [1][0][RTW89_FCC][8] = 62, ++ [1][0][RTW89_ETSI][8] = 34, ++ [1][0][RTW89_MKK][8] = 36, ++ [1][0][RTW89_IC][8] = 62, ++ [1][0][RTW89_KCC][8] = 54, ++ [1][0][RTW89_ACMA][8] = 34, ++ [1][0][RTW89_CHILE][8] = 64, ++ [1][0][RTW89_UKRAINE][8] = 34, ++ [1][0][RTW89_MEXICO][8] = 62, ++ [1][0][RTW89_CN][8] = 34, ++ [1][0][RTW89_QATAR][8] = 34, ++ [1][0][RTW89_UK][8] = 34, ++ [1][0][RTW89_FCC][10] = 62, ++ [1][0][RTW89_ETSI][10] = 34, ++ [1][0][RTW89_MKK][10] = 36, ++ [1][0][RTW89_IC][10] = 62, ++ [1][0][RTW89_KCC][10] = 54, ++ [1][0][RTW89_ACMA][10] = 34, ++ [1][0][RTW89_CHILE][10] = 64, ++ [1][0][RTW89_UKRAINE][10] = 34, ++ [1][0][RTW89_MEXICO][10] = 62, ++ [1][0][RTW89_CN][10] = 34, ++ [1][0][RTW89_QATAR][10] = 34, ++ [1][0][RTW89_UK][10] = 34, ++ [1][0][RTW89_FCC][12] = 64, ++ [1][0][RTW89_ETSI][12] = 34, ++ [1][0][RTW89_MKK][12] = 36, ++ [1][0][RTW89_IC][12] = 64, ++ [1][0][RTW89_KCC][12] = 54, ++ [1][0][RTW89_ACMA][12] = 34, ++ [1][0][RTW89_CHILE][12] = 64, ++ [1][0][RTW89_UKRAINE][12] = 34, ++ [1][0][RTW89_MEXICO][12] = 64, ++ [1][0][RTW89_CN][12] = 34, ++ [1][0][RTW89_QATAR][12] = 34, ++ [1][0][RTW89_UK][12] = 34, ++ [1][0][RTW89_FCC][14] = 62, ++ [1][0][RTW89_ETSI][14] = 34, ++ [1][0][RTW89_MKK][14] = 36, ++ [1][0][RTW89_IC][14] = 62, ++ [1][0][RTW89_KCC][14] = 54, ++ [1][0][RTW89_ACMA][14] = 34, ++ [1][0][RTW89_CHILE][14] = 64, ++ [1][0][RTW89_UKRAINE][14] = 34, ++ [1][0][RTW89_MEXICO][14] = 62, ++ [1][0][RTW89_CN][14] = 34, ++ [1][0][RTW89_QATAR][14] = 34, ++ [1][0][RTW89_UK][14] = 34, ++ [1][0][RTW89_FCC][15] = 62, ++ [1][0][RTW89_ETSI][15] = 34, ++ [1][0][RTW89_MKK][15] = 54, ++ [1][0][RTW89_IC][15] = 62, ++ [1][0][RTW89_KCC][15] = 54, ++ [1][0][RTW89_ACMA][15] = 34, ++ [1][0][RTW89_CHILE][15] = 62, ++ [1][0][RTW89_UKRAINE][15] = 34, ++ [1][0][RTW89_MEXICO][15] = 62, ++ [1][0][RTW89_CN][15] = 127, ++ [1][0][RTW89_QATAR][15] = 34, ++ [1][0][RTW89_UK][15] = 34, ++ [1][0][RTW89_FCC][17] = 62, ++ [1][0][RTW89_ETSI][17] = 34, ++ [1][0][RTW89_MKK][17] = 58, ++ [1][0][RTW89_IC][17] = 62, ++ [1][0][RTW89_KCC][17] = 54, ++ [1][0][RTW89_ACMA][17] = 34, ++ [1][0][RTW89_CHILE][17] = 62, ++ [1][0][RTW89_UKRAINE][17] = 34, ++ [1][0][RTW89_MEXICO][17] = 62, ++ [1][0][RTW89_CN][17] = 127, ++ [1][0][RTW89_QATAR][17] = 34, ++ [1][0][RTW89_UK][17] = 34, ++ [1][0][RTW89_FCC][19] = 62, ++ [1][0][RTW89_ETSI][19] = 34, ++ [1][0][RTW89_MKK][19] = 58, ++ [1][0][RTW89_IC][19] = 62, ++ [1][0][RTW89_KCC][19] = 54, ++ [1][0][RTW89_ACMA][19] = 34, ++ [1][0][RTW89_CHILE][19] = 62, ++ [1][0][RTW89_UKRAINE][19] = 34, ++ [1][0][RTW89_MEXICO][19] = 62, ++ [1][0][RTW89_CN][19] = 127, ++ [1][0][RTW89_QATAR][19] = 34, ++ [1][0][RTW89_UK][19] = 34, ++ [1][0][RTW89_FCC][21] = 62, ++ [1][0][RTW89_ETSI][21] = 34, ++ [1][0][RTW89_MKK][21] = 58, ++ [1][0][RTW89_IC][21] = 62, ++ [1][0][RTW89_KCC][21] = 54, ++ [1][0][RTW89_ACMA][21] = 34, ++ [1][0][RTW89_CHILE][21] = 64, ++ [1][0][RTW89_UKRAINE][21] = 34, ++ [1][0][RTW89_MEXICO][21] = 62, ++ [1][0][RTW89_CN][21] = 127, ++ [1][0][RTW89_QATAR][21] = 34, ++ [1][0][RTW89_UK][21] = 34, ++ [1][0][RTW89_FCC][23] = 62, ++ [1][0][RTW89_ETSI][23] = 34, ++ [1][0][RTW89_MKK][23] = 58, ++ [1][0][RTW89_IC][23] = 62, ++ [1][0][RTW89_KCC][23] = 54, ++ [1][0][RTW89_ACMA][23] = 34, ++ [1][0][RTW89_CHILE][23] = 64, ++ [1][0][RTW89_UKRAINE][23] = 34, ++ [1][0][RTW89_MEXICO][23] = 62, ++ [1][0][RTW89_CN][23] = 127, ++ [1][0][RTW89_QATAR][23] = 34, ++ [1][0][RTW89_UK][23] = 34, ++ [1][0][RTW89_FCC][25] = 62, ++ [1][0][RTW89_ETSI][25] = 34, ++ [1][0][RTW89_MKK][25] = 58, ++ [1][0][RTW89_IC][25] = 127, ++ [1][0][RTW89_KCC][25] = 54, ++ [1][0][RTW89_ACMA][25] = 127, ++ [1][0][RTW89_CHILE][25] = 64, ++ [1][0][RTW89_UKRAINE][25] = 34, ++ [1][0][RTW89_MEXICO][25] = 62, ++ [1][0][RTW89_CN][25] = 127, ++ [1][0][RTW89_QATAR][25] = 34, ++ [1][0][RTW89_UK][25] = 34, ++ [1][0][RTW89_FCC][27] = 62, ++ [1][0][RTW89_ETSI][27] = 34, ++ [1][0][RTW89_MKK][27] = 58, ++ [1][0][RTW89_IC][27] = 127, ++ [1][0][RTW89_KCC][27] = 54, ++ [1][0][RTW89_ACMA][27] = 127, ++ [1][0][RTW89_CHILE][27] = 64, ++ [1][0][RTW89_UKRAINE][27] = 34, ++ [1][0][RTW89_MEXICO][27] = 62, ++ [1][0][RTW89_CN][27] = 127, ++ [1][0][RTW89_QATAR][27] = 34, ++ [1][0][RTW89_UK][27] = 34, ++ [1][0][RTW89_FCC][29] = 62, ++ [1][0][RTW89_ETSI][29] = 34, ++ [1][0][RTW89_MKK][29] = 58, ++ [1][0][RTW89_IC][29] = 127, ++ [1][0][RTW89_KCC][29] = 54, ++ [1][0][RTW89_ACMA][29] = 127, ++ [1][0][RTW89_CHILE][29] = 66, ++ [1][0][RTW89_UKRAINE][29] = 34, ++ [1][0][RTW89_MEXICO][29] = 62, ++ [1][0][RTW89_CN][29] = 127, ++ [1][0][RTW89_QATAR][29] = 34, ++ [1][0][RTW89_UK][29] = 34, ++ [1][0][RTW89_FCC][31] = 62, ++ [1][0][RTW89_ETSI][31] = 34, ++ [1][0][RTW89_MKK][31] = 58, ++ [1][0][RTW89_IC][31] = 62, ++ [1][0][RTW89_KCC][31] = 54, ++ [1][0][RTW89_ACMA][31] = 34, ++ [1][0][RTW89_CHILE][31] = 66, ++ [1][0][RTW89_UKRAINE][31] = 34, ++ [1][0][RTW89_MEXICO][31] = 62, ++ [1][0][RTW89_CN][31] = 127, ++ [1][0][RTW89_QATAR][31] = 34, ++ [1][0][RTW89_UK][31] = 34, ++ [1][0][RTW89_FCC][33] = 62, ++ [1][0][RTW89_ETSI][33] = 34, ++ [1][0][RTW89_MKK][33] = 58, ++ [1][0][RTW89_IC][33] = 62, ++ [1][0][RTW89_KCC][33] = 54, ++ [1][0][RTW89_ACMA][33] = 34, ++ [1][0][RTW89_CHILE][33] = 66, ++ [1][0][RTW89_UKRAINE][33] = 34, ++ [1][0][RTW89_MEXICO][33] = 62, ++ [1][0][RTW89_CN][33] = 127, ++ [1][0][RTW89_QATAR][33] = 34, ++ [1][0][RTW89_UK][33] = 34, ++ [1][0][RTW89_FCC][35] = 62, ++ [1][0][RTW89_ETSI][35] = 34, ++ [1][0][RTW89_MKK][35] = 58, ++ [1][0][RTW89_IC][35] = 62, ++ [1][0][RTW89_KCC][35] = 54, ++ [1][0][RTW89_ACMA][35] = 34, ++ [1][0][RTW89_CHILE][35] = 66, ++ [1][0][RTW89_UKRAINE][35] = 34, ++ [1][0][RTW89_MEXICO][35] = 62, ++ [1][0][RTW89_CN][35] = 127, ++ [1][0][RTW89_QATAR][35] = 34, ++ [1][0][RTW89_UK][35] = 34, ++ [1][0][RTW89_FCC][37] = 64, ++ [1][0][RTW89_ETSI][37] = 127, ++ [1][0][RTW89_MKK][37] = 52, ++ [1][0][RTW89_IC][37] = 64, ++ [1][0][RTW89_KCC][37] = 54, ++ [1][0][RTW89_ACMA][37] = 64, ++ [1][0][RTW89_CHILE][37] = 64, ++ [1][0][RTW89_UKRAINE][37] = 127, ++ [1][0][RTW89_MEXICO][37] = 64, ++ [1][0][RTW89_CN][37] = 127, ++ [1][0][RTW89_QATAR][37] = 127, ++ [1][0][RTW89_UK][37] = 66, ++ [1][0][RTW89_FCC][38] = 84, ++ [1][0][RTW89_ETSI][38] = 28, ++ [1][0][RTW89_MKK][38] = 127, ++ [1][0][RTW89_IC][38] = 84, ++ [1][0][RTW89_KCC][38] = 56, ++ [1][0][RTW89_ACMA][38] = 84, ++ [1][0][RTW89_CHILE][38] = 64, ++ [1][0][RTW89_UKRAINE][38] = 28, ++ [1][0][RTW89_MEXICO][38] = 84, ++ [1][0][RTW89_CN][38] = 74, ++ [1][0][RTW89_QATAR][38] = 28, ++ [1][0][RTW89_UK][38] = 38, ++ [1][0][RTW89_FCC][40] = 84, ++ [1][0][RTW89_ETSI][40] = 28, ++ [1][0][RTW89_MKK][40] = 127, ++ [1][0][RTW89_IC][40] = 84, ++ [1][0][RTW89_KCC][40] = 56, ++ [1][0][RTW89_ACMA][40] = 84, ++ [1][0][RTW89_CHILE][40] = 64, ++ [1][0][RTW89_UKRAINE][40] = 28, ++ [1][0][RTW89_MEXICO][40] = 84, ++ [1][0][RTW89_CN][40] = 74, ++ [1][0][RTW89_QATAR][40] = 28, ++ [1][0][RTW89_UK][40] = 38, ++ [1][0][RTW89_FCC][42] = 84, ++ [1][0][RTW89_ETSI][42] = 28, ++ [1][0][RTW89_MKK][42] = 127, ++ [1][0][RTW89_IC][42] = 84, ++ [1][0][RTW89_KCC][42] = 56, ++ [1][0][RTW89_ACMA][42] = 84, ++ [1][0][RTW89_CHILE][42] = 64, ++ [1][0][RTW89_UKRAINE][42] = 28, ++ [1][0][RTW89_MEXICO][42] = 84, ++ [1][0][RTW89_CN][42] = 74, ++ [1][0][RTW89_QATAR][42] = 28, ++ [1][0][RTW89_UK][42] = 38, ++ [1][0][RTW89_FCC][44] = 84, ++ [1][0][RTW89_ETSI][44] = 28, ++ [1][0][RTW89_MKK][44] = 127, ++ [1][0][RTW89_IC][44] = 84, ++ [1][0][RTW89_KCC][44] = 56, ++ [1][0][RTW89_ACMA][44] = 84, ++ [1][0][RTW89_CHILE][44] = 64, ++ [1][0][RTW89_UKRAINE][44] = 28, ++ [1][0][RTW89_MEXICO][44] = 84, ++ [1][0][RTW89_CN][44] = 74, ++ [1][0][RTW89_QATAR][44] = 28, ++ [1][0][RTW89_UK][44] = 38, ++ [1][0][RTW89_FCC][46] = 84, ++ [1][0][RTW89_ETSI][46] = 28, ++ [1][0][RTW89_MKK][46] = 127, ++ [1][0][RTW89_IC][46] = 84, ++ [1][0][RTW89_KCC][46] = 56, ++ [1][0][RTW89_ACMA][46] = 84, ++ [1][0][RTW89_CHILE][46] = 64, ++ [1][0][RTW89_UKRAINE][46] = 28, ++ [1][0][RTW89_MEXICO][46] = 84, ++ [1][0][RTW89_CN][46] = 74, ++ [1][0][RTW89_QATAR][46] = 28, ++ [1][0][RTW89_UK][46] = 38, ++ [1][0][RTW89_FCC][48] = 44, ++ [1][0][RTW89_ETSI][48] = 127, ++ [1][0][RTW89_MKK][48] = 127, ++ [1][0][RTW89_IC][48] = 127, ++ [1][0][RTW89_KCC][48] = 127, ++ [1][0][RTW89_ACMA][48] = 127, ++ [1][0][RTW89_CHILE][48] = 127, ++ [1][0][RTW89_UKRAINE][48] = 127, ++ [1][0][RTW89_MEXICO][48] = 127, ++ [1][0][RTW89_CN][48] = 127, ++ [1][0][RTW89_QATAR][48] = 127, ++ [1][0][RTW89_UK][48] = 127, ++ [1][0][RTW89_FCC][50] = 44, ++ [1][0][RTW89_ETSI][50] = 127, ++ [1][0][RTW89_MKK][50] = 127, ++ [1][0][RTW89_IC][50] = 127, ++ [1][0][RTW89_KCC][50] = 127, ++ [1][0][RTW89_ACMA][50] = 127, ++ [1][0][RTW89_CHILE][50] = 127, ++ [1][0][RTW89_UKRAINE][50] = 127, ++ [1][0][RTW89_MEXICO][50] = 127, ++ [1][0][RTW89_CN][50] = 127, ++ [1][0][RTW89_QATAR][50] = 127, ++ [1][0][RTW89_UK][50] = 127, ++ [1][0][RTW89_FCC][52] = 44, ++ [1][0][RTW89_ETSI][52] = 127, ++ [1][0][RTW89_MKK][52] = 127, ++ [1][0][RTW89_IC][52] = 127, ++ [1][0][RTW89_KCC][52] = 127, ++ [1][0][RTW89_ACMA][52] = 127, ++ [1][0][RTW89_CHILE][52] = 127, ++ [1][0][RTW89_UKRAINE][52] = 127, ++ [1][0][RTW89_MEXICO][52] = 127, ++ [1][0][RTW89_CN][52] = 127, ++ [1][0][RTW89_QATAR][52] = 127, ++ [1][0][RTW89_UK][52] = 127, ++ [1][1][RTW89_FCC][0] = 42, ++ [1][1][RTW89_ETSI][0] = 22, ++ [1][1][RTW89_MKK][0] = 22, ++ [1][1][RTW89_IC][0] = 10, ++ [1][1][RTW89_KCC][0] = 36, ++ [1][1][RTW89_ACMA][0] = 22, ++ [1][1][RTW89_CHILE][0] = 22, ++ [1][1][RTW89_UKRAINE][0] = 22, ++ [1][1][RTW89_MEXICO][0] = 42, ++ [1][1][RTW89_CN][0] = 22, ++ [1][1][RTW89_QATAR][0] = 22, ++ [1][1][RTW89_UK][0] = 22, ++ [1][1][RTW89_FCC][2] = 44, ++ [1][1][RTW89_ETSI][2] = 22, ++ [1][1][RTW89_MKK][2] = 22, ++ [1][1][RTW89_IC][2] = 14, ++ [1][1][RTW89_KCC][2] = 36, ++ [1][1][RTW89_ACMA][2] = 22, ++ [1][1][RTW89_CHILE][2] = 22, ++ [1][1][RTW89_UKRAINE][2] = 22, ++ [1][1][RTW89_MEXICO][2] = 44, ++ [1][1][RTW89_CN][2] = 22, ++ [1][1][RTW89_QATAR][2] = 22, ++ [1][1][RTW89_UK][2] = 22, ++ [1][1][RTW89_FCC][4] = 42, ++ [1][1][RTW89_ETSI][4] = 22, ++ [1][1][RTW89_MKK][4] = 20, ++ [1][1][RTW89_IC][4] = 10, ++ [1][1][RTW89_KCC][4] = 36, ++ [1][1][RTW89_ACMA][4] = 22, ++ [1][1][RTW89_CHILE][4] = 20, ++ [1][1][RTW89_UKRAINE][4] = 22, ++ [1][1][RTW89_MEXICO][4] = 42, ++ [1][1][RTW89_CN][4] = 22, ++ [1][1][RTW89_QATAR][4] = 22, ++ [1][1][RTW89_UK][4] = 22, ++ [1][1][RTW89_FCC][6] = 42, ++ [1][1][RTW89_ETSI][6] = 22, ++ [1][1][RTW89_MKK][6] = 20, ++ [1][1][RTW89_IC][6] = 10, ++ [1][1][RTW89_KCC][6] = 10, ++ [1][1][RTW89_ACMA][6] = 22, ++ [1][1][RTW89_CHILE][6] = 20, ++ [1][1][RTW89_UKRAINE][6] = 22, ++ [1][1][RTW89_MEXICO][6] = 42, ++ [1][1][RTW89_CN][6] = 22, ++ [1][1][RTW89_QATAR][6] = 22, ++ [1][1][RTW89_UK][6] = 22, ++ [1][1][RTW89_FCC][8] = 44, ++ [1][1][RTW89_ETSI][8] = 22, ++ [1][1][RTW89_MKK][8] = 20, ++ [1][1][RTW89_IC][8] = 44, ++ [1][1][RTW89_KCC][8] = 36, ++ [1][1][RTW89_ACMA][8] = 22, ++ [1][1][RTW89_CHILE][8] = 54, ++ [1][1][RTW89_UKRAINE][8] = 22, ++ [1][1][RTW89_MEXICO][8] = 44, ++ [1][1][RTW89_CN][8] = 22, ++ [1][1][RTW89_QATAR][8] = 22, ++ [1][1][RTW89_UK][8] = 22, ++ [1][1][RTW89_FCC][10] = 44, ++ [1][1][RTW89_ETSI][10] = 22, ++ [1][1][RTW89_MKK][10] = 20, ++ [1][1][RTW89_IC][10] = 44, ++ [1][1][RTW89_KCC][10] = 36, ++ [1][1][RTW89_ACMA][10] = 22, ++ [1][1][RTW89_CHILE][10] = 54, ++ [1][1][RTW89_UKRAINE][10] = 22, ++ [1][1][RTW89_MEXICO][10] = 44, ++ [1][1][RTW89_CN][10] = 22, ++ [1][1][RTW89_QATAR][10] = 22, ++ [1][1][RTW89_UK][10] = 22, ++ [1][1][RTW89_FCC][12] = 46, ++ [1][1][RTW89_ETSI][12] = 22, ++ [1][1][RTW89_MKK][12] = 22, ++ [1][1][RTW89_IC][12] = 46, ++ [1][1][RTW89_KCC][12] = 40, ++ [1][1][RTW89_ACMA][12] = 22, ++ [1][1][RTW89_CHILE][12] = 52, ++ [1][1][RTW89_UKRAINE][12] = 22, ++ [1][1][RTW89_MEXICO][12] = 46, ++ [1][1][RTW89_CN][12] = 22, ++ [1][1][RTW89_QATAR][12] = 22, ++ [1][1][RTW89_UK][12] = 22, ++ [1][1][RTW89_FCC][14] = 42, ++ [1][1][RTW89_ETSI][14] = 22, ++ [1][1][RTW89_MKK][14] = 22, ++ [1][1][RTW89_IC][14] = 40, ++ [1][1][RTW89_KCC][14] = 40, ++ [1][1][RTW89_ACMA][14] = 22, ++ [1][1][RTW89_CHILE][14] = 54, ++ [1][1][RTW89_UKRAINE][14] = 22, ++ [1][1][RTW89_MEXICO][14] = 42, ++ [1][1][RTW89_CN][14] = 22, ++ [1][1][RTW89_QATAR][14] = 22, ++ [1][1][RTW89_UK][14] = 22, ++ [1][1][RTW89_FCC][15] = 42, ++ [1][1][RTW89_ETSI][15] = 22, ++ [1][1][RTW89_MKK][15] = 42, ++ [1][1][RTW89_IC][15] = 42, ++ [1][1][RTW89_KCC][15] = 38, ++ [1][1][RTW89_ACMA][15] = 22, ++ [1][1][RTW89_CHILE][15] = 54, ++ [1][1][RTW89_UKRAINE][15] = 22, ++ [1][1][RTW89_MEXICO][15] = 42, ++ [1][1][RTW89_CN][15] = 127, ++ [1][1][RTW89_QATAR][15] = 22, ++ [1][1][RTW89_UK][15] = 22, ++ [1][1][RTW89_FCC][17] = 42, ++ [1][1][RTW89_ETSI][17] = 22, ++ [1][1][RTW89_MKK][17] = 44, ++ [1][1][RTW89_IC][17] = 42, ++ [1][1][RTW89_KCC][17] = 38, ++ [1][1][RTW89_ACMA][17] = 22, ++ [1][1][RTW89_CHILE][17] = 54, ++ [1][1][RTW89_UKRAINE][17] = 22, ++ [1][1][RTW89_MEXICO][17] = 42, ++ [1][1][RTW89_CN][17] = 127, ++ [1][1][RTW89_QATAR][17] = 22, ++ [1][1][RTW89_UK][17] = 22, ++ [1][1][RTW89_FCC][19] = 42, ++ [1][1][RTW89_ETSI][19] = 22, ++ [1][1][RTW89_MKK][19] = 44, ++ [1][1][RTW89_IC][19] = 42, ++ [1][1][RTW89_KCC][19] = 38, ++ [1][1][RTW89_ACMA][19] = 22, ++ [1][1][RTW89_CHILE][19] = 54, ++ [1][1][RTW89_UKRAINE][19] = 22, ++ [1][1][RTW89_MEXICO][19] = 42, ++ [1][1][RTW89_CN][19] = 127, ++ [1][1][RTW89_QATAR][19] = 22, ++ [1][1][RTW89_UK][19] = 22, ++ [1][1][RTW89_FCC][21] = 42, ++ [1][1][RTW89_ETSI][21] = 22, ++ [1][1][RTW89_MKK][21] = 44, ++ [1][1][RTW89_IC][21] = 42, ++ [1][1][RTW89_KCC][21] = 38, ++ [1][1][RTW89_ACMA][21] = 22, ++ [1][1][RTW89_CHILE][21] = 54, ++ [1][1][RTW89_UKRAINE][21] = 22, ++ [1][1][RTW89_MEXICO][21] = 42, ++ [1][1][RTW89_CN][21] = 127, ++ [1][1][RTW89_QATAR][21] = 22, ++ [1][1][RTW89_UK][21] = 22, ++ [1][1][RTW89_FCC][23] = 42, ++ [1][1][RTW89_ETSI][23] = 22, ++ [1][1][RTW89_MKK][23] = 44, ++ [1][1][RTW89_IC][23] = 42, ++ [1][1][RTW89_KCC][23] = 38, ++ [1][1][RTW89_ACMA][23] = 22, ++ [1][1][RTW89_CHILE][23] = 54, ++ [1][1][RTW89_UKRAINE][23] = 22, ++ [1][1][RTW89_MEXICO][23] = 42, ++ [1][1][RTW89_CN][23] = 127, ++ [1][1][RTW89_QATAR][23] = 22, ++ [1][1][RTW89_UK][23] = 22, ++ [1][1][RTW89_FCC][25] = 42, ++ [1][1][RTW89_ETSI][25] = 22, ++ [1][1][RTW89_MKK][25] = 44, ++ [1][1][RTW89_IC][25] = 127, ++ [1][1][RTW89_KCC][25] = 38, ++ [1][1][RTW89_ACMA][25] = 127, ++ [1][1][RTW89_CHILE][25] = 54, ++ [1][1][RTW89_UKRAINE][25] = 22, ++ [1][1][RTW89_MEXICO][25] = 42, ++ [1][1][RTW89_CN][25] = 127, ++ [1][1][RTW89_QATAR][25] = 22, ++ [1][1][RTW89_UK][25] = 22, ++ [1][1][RTW89_FCC][27] = 42, ++ [1][1][RTW89_ETSI][27] = 22, ++ [1][1][RTW89_MKK][27] = 44, ++ [1][1][RTW89_IC][27] = 127, ++ [1][1][RTW89_KCC][27] = 38, ++ [1][1][RTW89_ACMA][27] = 127, ++ [1][1][RTW89_CHILE][27] = 54, ++ [1][1][RTW89_UKRAINE][27] = 22, ++ [1][1][RTW89_MEXICO][27] = 42, ++ [1][1][RTW89_CN][27] = 127, ++ [1][1][RTW89_QATAR][27] = 22, ++ [1][1][RTW89_UK][27] = 22, ++ [1][1][RTW89_FCC][29] = 42, ++ [1][1][RTW89_ETSI][29] = 22, ++ [1][1][RTW89_MKK][29] = 44, ++ [1][1][RTW89_IC][29] = 127, ++ [1][1][RTW89_KCC][29] = 38, ++ [1][1][RTW89_ACMA][29] = 127, ++ [1][1][RTW89_CHILE][29] = 54, ++ [1][1][RTW89_UKRAINE][29] = 22, ++ [1][1][RTW89_MEXICO][29] = 42, ++ [1][1][RTW89_CN][29] = 127, ++ [1][1][RTW89_QATAR][29] = 22, ++ [1][1][RTW89_UK][29] = 22, ++ [1][1][RTW89_FCC][31] = 42, ++ [1][1][RTW89_ETSI][31] = 22, ++ [1][1][RTW89_MKK][31] = 44, ++ [1][1][RTW89_IC][31] = 38, ++ [1][1][RTW89_KCC][31] = 38, ++ [1][1][RTW89_ACMA][31] = 22, ++ [1][1][RTW89_CHILE][31] = 54, ++ [1][1][RTW89_UKRAINE][31] = 22, ++ [1][1][RTW89_MEXICO][31] = 42, ++ [1][1][RTW89_CN][31] = 127, ++ [1][1][RTW89_QATAR][31] = 22, ++ [1][1][RTW89_UK][31] = 22, ++ [1][1][RTW89_FCC][33] = 40, ++ [1][1][RTW89_ETSI][33] = 22, ++ [1][1][RTW89_MKK][33] = 44, ++ [1][1][RTW89_IC][33] = 38, ++ [1][1][RTW89_KCC][33] = 38, ++ [1][1][RTW89_ACMA][33] = 22, ++ [1][1][RTW89_CHILE][33] = 54, ++ [1][1][RTW89_UKRAINE][33] = 22, ++ [1][1][RTW89_MEXICO][33] = 40, ++ [1][1][RTW89_CN][33] = 127, ++ [1][1][RTW89_QATAR][33] = 22, ++ [1][1][RTW89_UK][33] = 22, ++ [1][1][RTW89_FCC][35] = 40, ++ [1][1][RTW89_ETSI][35] = 22, ++ [1][1][RTW89_MKK][35] = 44, ++ [1][1][RTW89_IC][35] = 38, ++ [1][1][RTW89_KCC][35] = 38, ++ [1][1][RTW89_ACMA][35] = 22, ++ [1][1][RTW89_CHILE][35] = 54, ++ [1][1][RTW89_UKRAINE][35] = 22, ++ [1][1][RTW89_MEXICO][35] = 40, ++ [1][1][RTW89_CN][35] = 127, ++ [1][1][RTW89_QATAR][35] = 22, ++ [1][1][RTW89_UK][35] = 22, ++ [1][1][RTW89_FCC][37] = 48, ++ [1][1][RTW89_ETSI][37] = 127, ++ [1][1][RTW89_MKK][37] = 42, ++ [1][1][RTW89_IC][37] = 48, ++ [1][1][RTW89_KCC][37] = 38, ++ [1][1][RTW89_ACMA][37] = 48, ++ [1][1][RTW89_CHILE][37] = 54, ++ [1][1][RTW89_UKRAINE][37] = 127, ++ [1][1][RTW89_MEXICO][37] = 48, ++ [1][1][RTW89_CN][37] = 127, ++ [1][1][RTW89_QATAR][37] = 127, ++ [1][1][RTW89_UK][37] = 54, ++ [1][1][RTW89_FCC][38] = 84, ++ [1][1][RTW89_ETSI][38] = 16, ++ [1][1][RTW89_MKK][38] = 127, ++ [1][1][RTW89_IC][38] = 84, ++ [1][1][RTW89_KCC][38] = 38, ++ [1][1][RTW89_ACMA][38] = 82, ++ [1][1][RTW89_CHILE][38] = 54, ++ [1][1][RTW89_UKRAINE][38] = 16, ++ [1][1][RTW89_MEXICO][38] = 84, ++ [1][1][RTW89_CN][38] = 62, ++ [1][1][RTW89_QATAR][38] = 16, ++ [1][1][RTW89_UK][38] = 26, ++ [1][1][RTW89_FCC][40] = 84, ++ [1][1][RTW89_ETSI][40] = 16, ++ [1][1][RTW89_MKK][40] = 127, ++ [1][1][RTW89_IC][40] = 84, ++ [1][1][RTW89_KCC][40] = 38, ++ [1][1][RTW89_ACMA][40] = 82, ++ [1][1][RTW89_CHILE][40] = 54, ++ [1][1][RTW89_UKRAINE][40] = 16, ++ [1][1][RTW89_MEXICO][40] = 84, ++ [1][1][RTW89_CN][40] = 62, ++ [1][1][RTW89_QATAR][40] = 16, ++ [1][1][RTW89_UK][40] = 26, ++ [1][1][RTW89_FCC][42] = 84, ++ [1][1][RTW89_ETSI][42] = 16, ++ [1][1][RTW89_MKK][42] = 127, ++ [1][1][RTW89_IC][42] = 84, ++ [1][1][RTW89_KCC][42] = 38, ++ [1][1][RTW89_ACMA][42] = 84, ++ [1][1][RTW89_CHILE][42] = 54, ++ [1][1][RTW89_UKRAINE][42] = 16, ++ [1][1][RTW89_MEXICO][42] = 84, ++ [1][1][RTW89_CN][42] = 62, ++ [1][1][RTW89_QATAR][42] = 16, ++ [1][1][RTW89_UK][42] = 26, ++ [1][1][RTW89_FCC][44] = 84, ++ [1][1][RTW89_ETSI][44] = 16, ++ [1][1][RTW89_MKK][44] = 127, ++ [1][1][RTW89_IC][44] = 84, ++ [1][1][RTW89_KCC][44] = 38, ++ [1][1][RTW89_ACMA][44] = 84, ++ [1][1][RTW89_CHILE][44] = 56, ++ [1][1][RTW89_UKRAINE][44] = 16, ++ [1][1][RTW89_MEXICO][44] = 84, ++ [1][1][RTW89_CN][44] = 62, ++ [1][1][RTW89_QATAR][44] = 16, ++ [1][1][RTW89_UK][44] = 26, ++ [1][1][RTW89_FCC][46] = 84, ++ [1][1][RTW89_ETSI][46] = 16, ++ [1][1][RTW89_MKK][46] = 127, ++ [1][1][RTW89_IC][46] = 84, ++ [1][1][RTW89_KCC][46] = 38, ++ [1][1][RTW89_ACMA][46] = 84, ++ [1][1][RTW89_CHILE][46] = 56, ++ [1][1][RTW89_UKRAINE][46] = 16, ++ [1][1][RTW89_MEXICO][46] = 84, ++ [1][1][RTW89_CN][46] = 62, ++ [1][1][RTW89_QATAR][46] = 16, ++ [1][1][RTW89_UK][46] = 26, ++ [1][1][RTW89_FCC][48] = 32, ++ [1][1][RTW89_ETSI][48] = 127, ++ [1][1][RTW89_MKK][48] = 127, ++ [1][1][RTW89_IC][48] = 127, ++ [1][1][RTW89_KCC][48] = 127, ++ [1][1][RTW89_ACMA][48] = 127, ++ [1][1][RTW89_CHILE][48] = 127, ++ [1][1][RTW89_UKRAINE][48] = 127, ++ [1][1][RTW89_MEXICO][48] = 127, ++ [1][1][RTW89_CN][48] = 127, ++ [1][1][RTW89_QATAR][48] = 127, ++ [1][1][RTW89_UK][48] = 127, ++ [1][1][RTW89_FCC][50] = 32, ++ [1][1][RTW89_ETSI][50] = 127, ++ [1][1][RTW89_MKK][50] = 127, ++ [1][1][RTW89_IC][50] = 127, ++ [1][1][RTW89_KCC][50] = 127, ++ [1][1][RTW89_ACMA][50] = 127, ++ [1][1][RTW89_CHILE][50] = 127, ++ [1][1][RTW89_UKRAINE][50] = 127, ++ [1][1][RTW89_MEXICO][50] = 127, ++ [1][1][RTW89_CN][50] = 127, ++ [1][1][RTW89_QATAR][50] = 127, ++ [1][1][RTW89_UK][50] = 127, ++ [1][1][RTW89_FCC][52] = 32, ++ [1][1][RTW89_ETSI][52] = 127, ++ [1][1][RTW89_MKK][52] = 127, ++ [1][1][RTW89_IC][52] = 127, ++ [1][1][RTW89_KCC][52] = 127, ++ [1][1][RTW89_ACMA][52] = 127, ++ [1][1][RTW89_CHILE][52] = 127, ++ [1][1][RTW89_UKRAINE][52] = 127, ++ [1][1][RTW89_MEXICO][52] = 127, ++ [1][1][RTW89_CN][52] = 127, ++ [1][1][RTW89_QATAR][52] = 127, ++ [1][1][RTW89_UK][52] = 127, ++ [2][0][RTW89_FCC][0] = 70, ++ [2][0][RTW89_ETSI][0] = 48, ++ [2][0][RTW89_MKK][0] = 48, ++ [2][0][RTW89_IC][0] = 46, ++ [2][0][RTW89_KCC][0] = 66, ++ [2][0][RTW89_ACMA][0] = 48, ++ [2][0][RTW89_CHILE][0] = 44, ++ [2][0][RTW89_UKRAINE][0] = 48, ++ [2][0][RTW89_MEXICO][0] = 64, ++ [2][0][RTW89_CN][0] = 48, ++ [2][0][RTW89_QATAR][0] = 48, ++ [2][0][RTW89_UK][0] = 48, ++ [2][0][RTW89_FCC][2] = 70, ++ [2][0][RTW89_ETSI][2] = 48, ++ [2][0][RTW89_MKK][2] = 48, ++ [2][0][RTW89_IC][2] = 46, ++ [2][0][RTW89_KCC][2] = 66, ++ [2][0][RTW89_ACMA][2] = 48, ++ [2][0][RTW89_CHILE][2] = 44, ++ [2][0][RTW89_UKRAINE][2] = 48, ++ [2][0][RTW89_MEXICO][2] = 64, ++ [2][0][RTW89_CN][2] = 48, ++ [2][0][RTW89_QATAR][2] = 48, ++ [2][0][RTW89_UK][2] = 48, ++ [2][0][RTW89_FCC][4] = 70, ++ [2][0][RTW89_ETSI][4] = 48, ++ [2][0][RTW89_MKK][4] = 48, ++ [2][0][RTW89_IC][4] = 46, ++ [2][0][RTW89_KCC][4] = 66, ++ [2][0][RTW89_ACMA][4] = 48, ++ [2][0][RTW89_CHILE][4] = 44, ++ [2][0][RTW89_UKRAINE][4] = 48, ++ [2][0][RTW89_MEXICO][4] = 64, ++ [2][0][RTW89_CN][4] = 48, ++ [2][0][RTW89_QATAR][4] = 48, ++ [2][0][RTW89_UK][4] = 48, ++ [2][0][RTW89_FCC][6] = 70, ++ [2][0][RTW89_ETSI][6] = 48, ++ [2][0][RTW89_MKK][6] = 48, ++ [2][0][RTW89_IC][6] = 46, ++ [2][0][RTW89_KCC][6] = 38, ++ [2][0][RTW89_ACMA][6] = 48, ++ [2][0][RTW89_CHILE][6] = 44, ++ [2][0][RTW89_UKRAINE][6] = 48, ++ [2][0][RTW89_MEXICO][6] = 64, ++ [2][0][RTW89_CN][6] = 48, ++ [2][0][RTW89_QATAR][6] = 48, ++ [2][0][RTW89_UK][6] = 48, ++ [2][0][RTW89_FCC][8] = 70, ++ [2][0][RTW89_ETSI][8] = 48, ++ [2][0][RTW89_MKK][8] = 48, ++ [2][0][RTW89_IC][8] = 66, ++ [2][0][RTW89_KCC][8] = 64, ++ [2][0][RTW89_ACMA][8] = 48, ++ [2][0][RTW89_CHILE][8] = 66, ++ [2][0][RTW89_UKRAINE][8] = 48, ++ [2][0][RTW89_MEXICO][8] = 70, ++ [2][0][RTW89_CN][8] = 48, ++ [2][0][RTW89_QATAR][8] = 48, ++ [2][0][RTW89_UK][8] = 48, ++ [2][0][RTW89_FCC][10] = 70, ++ [2][0][RTW89_ETSI][10] = 48, ++ [2][0][RTW89_MKK][10] = 48, ++ [2][0][RTW89_IC][10] = 66, ++ [2][0][RTW89_KCC][10] = 64, ++ [2][0][RTW89_ACMA][10] = 48, ++ [2][0][RTW89_CHILE][10] = 66, ++ [2][0][RTW89_UKRAINE][10] = 48, ++ [2][0][RTW89_MEXICO][10] = 70, ++ [2][0][RTW89_CN][10] = 48, ++ [2][0][RTW89_QATAR][10] = 48, ++ [2][0][RTW89_UK][10] = 48, ++ [2][0][RTW89_FCC][12] = 70, ++ [2][0][RTW89_ETSI][12] = 48, ++ [2][0][RTW89_MKK][12] = 46, ++ [2][0][RTW89_IC][12] = 66, ++ [2][0][RTW89_KCC][12] = 64, ++ [2][0][RTW89_ACMA][12] = 48, ++ [2][0][RTW89_CHILE][12] = 66, ++ [2][0][RTW89_UKRAINE][12] = 48, ++ [2][0][RTW89_MEXICO][12] = 70, ++ [2][0][RTW89_CN][12] = 48, ++ [2][0][RTW89_QATAR][12] = 48, ++ [2][0][RTW89_UK][12] = 48, ++ [2][0][RTW89_FCC][14] = 70, ++ [2][0][RTW89_ETSI][14] = 48, ++ [2][0][RTW89_MKK][14] = 46, ++ [2][0][RTW89_IC][14] = 66, ++ [2][0][RTW89_KCC][14] = 64, ++ [2][0][RTW89_ACMA][14] = 48, ++ [2][0][RTW89_CHILE][14] = 66, ++ [2][0][RTW89_UKRAINE][14] = 48, ++ [2][0][RTW89_MEXICO][14] = 70, ++ [2][0][RTW89_CN][14] = 48, ++ [2][0][RTW89_QATAR][14] = 48, ++ [2][0][RTW89_UK][14] = 48, ++ [2][0][RTW89_FCC][15] = 70, ++ [2][0][RTW89_ETSI][15] = 48, ++ [2][0][RTW89_MKK][15] = 68, ++ [2][0][RTW89_IC][15] = 70, ++ [2][0][RTW89_KCC][15] = 64, ++ [2][0][RTW89_ACMA][15] = 48, ++ [2][0][RTW89_CHILE][15] = 62, ++ [2][0][RTW89_UKRAINE][15] = 48, ++ [2][0][RTW89_MEXICO][15] = 70, ++ [2][0][RTW89_CN][15] = 127, ++ [2][0][RTW89_QATAR][15] = 48, ++ [2][0][RTW89_UK][15] = 48, ++ [2][0][RTW89_FCC][17] = 70, ++ [2][0][RTW89_ETSI][17] = 48, ++ [2][0][RTW89_MKK][17] = 70, ++ [2][0][RTW89_IC][17] = 70, ++ [2][0][RTW89_KCC][17] = 64, ++ [2][0][RTW89_ACMA][17] = 48, ++ [2][0][RTW89_CHILE][17] = 62, ++ [2][0][RTW89_UKRAINE][17] = 48, ++ [2][0][RTW89_MEXICO][17] = 70, ++ [2][0][RTW89_CN][17] = 127, ++ [2][0][RTW89_QATAR][17] = 48, ++ [2][0][RTW89_UK][17] = 48, ++ [2][0][RTW89_FCC][19] = 70, ++ [2][0][RTW89_ETSI][19] = 48, ++ [2][0][RTW89_MKK][19] = 70, ++ [2][0][RTW89_IC][19] = 70, ++ [2][0][RTW89_KCC][19] = 64, ++ [2][0][RTW89_ACMA][19] = 48, ++ [2][0][RTW89_CHILE][19] = 62, ++ [2][0][RTW89_UKRAINE][19] = 48, ++ [2][0][RTW89_MEXICO][19] = 70, ++ [2][0][RTW89_CN][19] = 127, ++ [2][0][RTW89_QATAR][19] = 48, ++ [2][0][RTW89_UK][19] = 48, ++ [2][0][RTW89_FCC][21] = 70, ++ [2][0][RTW89_ETSI][21] = 48, ++ [2][0][RTW89_MKK][21] = 70, ++ [2][0][RTW89_IC][21] = 70, ++ [2][0][RTW89_KCC][21] = 64, ++ [2][0][RTW89_ACMA][21] = 48, ++ [2][0][RTW89_CHILE][21] = 64, ++ [2][0][RTW89_UKRAINE][21] = 48, ++ [2][0][RTW89_MEXICO][21] = 70, ++ [2][0][RTW89_CN][21] = 127, ++ [2][0][RTW89_QATAR][21] = 48, ++ [2][0][RTW89_UK][21] = 48, ++ [2][0][RTW89_FCC][23] = 70, ++ [2][0][RTW89_ETSI][23] = 48, ++ [2][0][RTW89_MKK][23] = 70, ++ [2][0][RTW89_IC][23] = 70, ++ [2][0][RTW89_KCC][23] = 64, ++ [2][0][RTW89_ACMA][23] = 48, ++ [2][0][RTW89_CHILE][23] = 64, ++ [2][0][RTW89_UKRAINE][23] = 48, ++ [2][0][RTW89_MEXICO][23] = 70, ++ [2][0][RTW89_CN][23] = 127, ++ [2][0][RTW89_QATAR][23] = 48, ++ [2][0][RTW89_UK][23] = 48, ++ [2][0][RTW89_FCC][25] = 70, ++ [2][0][RTW89_ETSI][25] = 48, ++ [2][0][RTW89_MKK][25] = 70, ++ [2][0][RTW89_IC][25] = 127, ++ [2][0][RTW89_KCC][25] = 64, ++ [2][0][RTW89_ACMA][25] = 127, ++ [2][0][RTW89_CHILE][25] = 64, ++ [2][0][RTW89_UKRAINE][25] = 48, ++ [2][0][RTW89_MEXICO][25] = 70, ++ [2][0][RTW89_CN][25] = 127, ++ [2][0][RTW89_QATAR][25] = 48, ++ [2][0][RTW89_UK][25] = 48, ++ [2][0][RTW89_FCC][27] = 70, ++ [2][0][RTW89_ETSI][27] = 48, ++ [2][0][RTW89_MKK][27] = 70, ++ [2][0][RTW89_IC][27] = 127, ++ [2][0][RTW89_KCC][27] = 64, ++ [2][0][RTW89_ACMA][27] = 127, ++ [2][0][RTW89_CHILE][27] = 64, ++ [2][0][RTW89_UKRAINE][27] = 48, ++ [2][0][RTW89_MEXICO][27] = 70, ++ [2][0][RTW89_CN][27] = 127, ++ [2][0][RTW89_QATAR][27] = 48, ++ [2][0][RTW89_UK][27] = 48, ++ [2][0][RTW89_FCC][29] = 70, ++ [2][0][RTW89_ETSI][29] = 48, ++ [2][0][RTW89_MKK][29] = 70, ++ [2][0][RTW89_IC][29] = 127, ++ [2][0][RTW89_KCC][29] = 64, ++ [2][0][RTW89_ACMA][29] = 127, ++ [2][0][RTW89_CHILE][29] = 66, ++ [2][0][RTW89_UKRAINE][29] = 48, ++ [2][0][RTW89_MEXICO][29] = 70, ++ [2][0][RTW89_CN][29] = 127, ++ [2][0][RTW89_QATAR][29] = 48, ++ [2][0][RTW89_UK][29] = 48, ++ [2][0][RTW89_FCC][31] = 70, ++ [2][0][RTW89_ETSI][31] = 48, ++ [2][0][RTW89_MKK][31] = 70, ++ [2][0][RTW89_IC][31] = 72, ++ [2][0][RTW89_KCC][31] = 64, ++ [2][0][RTW89_ACMA][31] = 48, ++ [2][0][RTW89_CHILE][31] = 66, ++ [2][0][RTW89_UKRAINE][31] = 48, ++ [2][0][RTW89_MEXICO][31] = 70, ++ [2][0][RTW89_CN][31] = 127, ++ [2][0][RTW89_QATAR][31] = 48, ++ [2][0][RTW89_UK][31] = 48, ++ [2][0][RTW89_FCC][33] = 72, ++ [2][0][RTW89_ETSI][33] = 48, ++ [2][0][RTW89_MKK][33] = 70, ++ [2][0][RTW89_IC][33] = 72, ++ [2][0][RTW89_KCC][33] = 64, ++ [2][0][RTW89_ACMA][33] = 48, ++ [2][0][RTW89_CHILE][33] = 66, ++ [2][0][RTW89_UKRAINE][33] = 48, ++ [2][0][RTW89_MEXICO][33] = 72, ++ [2][0][RTW89_CN][33] = 127, ++ [2][0][RTW89_QATAR][33] = 48, ++ [2][0][RTW89_UK][33] = 48, ++ [2][0][RTW89_FCC][35] = 72, ++ [2][0][RTW89_ETSI][35] = 48, ++ [2][0][RTW89_MKK][35] = 70, ++ [2][0][RTW89_IC][35] = 72, ++ [2][0][RTW89_KCC][35] = 64, ++ [2][0][RTW89_ACMA][35] = 48, ++ [2][0][RTW89_CHILE][35] = 66, ++ [2][0][RTW89_UKRAINE][35] = 48, ++ [2][0][RTW89_MEXICO][35] = 72, ++ [2][0][RTW89_CN][35] = 127, ++ [2][0][RTW89_QATAR][35] = 48, ++ [2][0][RTW89_UK][35] = 48, ++ [2][0][RTW89_FCC][37] = 70, ++ [2][0][RTW89_ETSI][37] = 127, ++ [2][0][RTW89_MKK][37] = 66, ++ [2][0][RTW89_IC][37] = 70, ++ [2][0][RTW89_KCC][37] = 64, ++ [2][0][RTW89_ACMA][37] = 76, ++ [2][0][RTW89_CHILE][37] = 66, ++ [2][0][RTW89_UKRAINE][37] = 127, ++ [2][0][RTW89_MEXICO][37] = 70, ++ [2][0][RTW89_CN][37] = 127, ++ [2][0][RTW89_QATAR][37] = 127, ++ [2][0][RTW89_UK][37] = 76, ++ [2][0][RTW89_FCC][38] = 84, ++ [2][0][RTW89_ETSI][38] = 28, ++ [2][0][RTW89_MKK][38] = 127, ++ [2][0][RTW89_IC][38] = 84, ++ [2][0][RTW89_KCC][38] = 66, ++ [2][0][RTW89_ACMA][38] = 84, ++ [2][0][RTW89_CHILE][38] = 64, ++ [2][0][RTW89_UKRAINE][38] = 28, ++ [2][0][RTW89_MEXICO][38] = 84, ++ [2][0][RTW89_CN][38] = 76, ++ [2][0][RTW89_QATAR][38] = 28, ++ [2][0][RTW89_UK][38] = 50, ++ [2][0][RTW89_FCC][40] = 84, ++ [2][0][RTW89_ETSI][40] = 28, ++ [2][0][RTW89_MKK][40] = 127, ++ [2][0][RTW89_IC][40] = 84, ++ [2][0][RTW89_KCC][40] = 66, ++ [2][0][RTW89_ACMA][40] = 84, ++ [2][0][RTW89_CHILE][40] = 64, ++ [2][0][RTW89_UKRAINE][40] = 28, ++ [2][0][RTW89_MEXICO][40] = 84, ++ [2][0][RTW89_CN][40] = 76, ++ [2][0][RTW89_QATAR][40] = 28, ++ [2][0][RTW89_UK][40] = 50, ++ [2][0][RTW89_FCC][42] = 84, ++ [2][0][RTW89_ETSI][42] = 28, ++ [2][0][RTW89_MKK][42] = 127, ++ [2][0][RTW89_IC][42] = 84, ++ [2][0][RTW89_KCC][42] = 66, ++ [2][0][RTW89_ACMA][42] = 84, ++ [2][0][RTW89_CHILE][42] = 66, ++ [2][0][RTW89_UKRAINE][42] = 28, ++ [2][0][RTW89_MEXICO][42] = 84, ++ [2][0][RTW89_CN][42] = 76, ++ [2][0][RTW89_QATAR][42] = 28, ++ [2][0][RTW89_UK][42] = 50, ++ [2][0][RTW89_FCC][44] = 84, ++ [2][0][RTW89_ETSI][44] = 28, ++ [2][0][RTW89_MKK][44] = 127, ++ [2][0][RTW89_IC][44] = 84, ++ [2][0][RTW89_KCC][44] = 66, ++ [2][0][RTW89_ACMA][44] = 84, ++ [2][0][RTW89_CHILE][44] = 64, ++ [2][0][RTW89_UKRAINE][44] = 28, ++ [2][0][RTW89_MEXICO][44] = 84, ++ [2][0][RTW89_CN][44] = 76, ++ [2][0][RTW89_QATAR][44] = 28, ++ [2][0][RTW89_UK][44] = 50, ++ [2][0][RTW89_FCC][46] = 84, ++ [2][0][RTW89_ETSI][46] = 28, ++ [2][0][RTW89_MKK][46] = 127, ++ [2][0][RTW89_IC][46] = 84, ++ [2][0][RTW89_KCC][46] = 66, ++ [2][0][RTW89_ACMA][46] = 84, ++ [2][0][RTW89_CHILE][46] = 64, ++ [2][0][RTW89_UKRAINE][46] = 28, ++ [2][0][RTW89_MEXICO][46] = 84, ++ [2][0][RTW89_CN][46] = 76, ++ [2][0][RTW89_QATAR][46] = 28, ++ [2][0][RTW89_UK][46] = 50, ++ [2][0][RTW89_FCC][48] = 56, ++ [2][0][RTW89_ETSI][48] = 127, ++ [2][0][RTW89_MKK][48] = 127, ++ [2][0][RTW89_IC][48] = 127, ++ [2][0][RTW89_KCC][48] = 127, ++ [2][0][RTW89_ACMA][48] = 127, ++ [2][0][RTW89_CHILE][48] = 127, ++ [2][0][RTW89_UKRAINE][48] = 127, ++ [2][0][RTW89_MEXICO][48] = 127, ++ [2][0][RTW89_CN][48] = 127, ++ [2][0][RTW89_QATAR][48] = 127, ++ [2][0][RTW89_UK][48] = 127, ++ [2][0][RTW89_FCC][50] = 56, ++ [2][0][RTW89_ETSI][50] = 127, ++ [2][0][RTW89_MKK][50] = 127, ++ [2][0][RTW89_IC][50] = 127, ++ [2][0][RTW89_KCC][50] = 127, ++ [2][0][RTW89_ACMA][50] = 127, ++ [2][0][RTW89_CHILE][50] = 127, ++ [2][0][RTW89_UKRAINE][50] = 127, ++ [2][0][RTW89_MEXICO][50] = 127, ++ [2][0][RTW89_CN][50] = 127, ++ [2][0][RTW89_QATAR][50] = 127, ++ [2][0][RTW89_UK][50] = 127, ++ [2][0][RTW89_FCC][52] = 56, ++ [2][0][RTW89_ETSI][52] = 127, ++ [2][0][RTW89_MKK][52] = 127, ++ [2][0][RTW89_IC][52] = 127, ++ [2][0][RTW89_KCC][52] = 127, ++ [2][0][RTW89_ACMA][52] = 127, ++ [2][0][RTW89_CHILE][52] = 127, ++ [2][0][RTW89_UKRAINE][52] = 127, ++ [2][0][RTW89_MEXICO][52] = 127, ++ [2][0][RTW89_CN][52] = 127, ++ [2][0][RTW89_QATAR][52] = 127, ++ [2][0][RTW89_UK][52] = 127, ++ [2][1][RTW89_FCC][0] = 50, ++ [2][1][RTW89_ETSI][0] = 36, ++ [2][1][RTW89_MKK][0] = 36, ++ [2][1][RTW89_IC][0] = 20, ++ [2][1][RTW89_KCC][0] = 46, ++ [2][1][RTW89_ACMA][0] = 36, ++ [2][1][RTW89_CHILE][0] = 32, ++ [2][1][RTW89_UKRAINE][0] = 36, ++ [2][1][RTW89_MEXICO][0] = 52, ++ [2][1][RTW89_CN][0] = 36, ++ [2][1][RTW89_QATAR][0] = 36, ++ [2][1][RTW89_UK][0] = 36, ++ [2][1][RTW89_FCC][2] = 50, ++ [2][1][RTW89_ETSI][2] = 36, ++ [2][1][RTW89_MKK][2] = 36, ++ [2][1][RTW89_IC][2] = 18, ++ [2][1][RTW89_KCC][2] = 46, ++ [2][1][RTW89_ACMA][2] = 36, ++ [2][1][RTW89_CHILE][2] = 32, ++ [2][1][RTW89_UKRAINE][2] = 36, ++ [2][1][RTW89_MEXICO][2] = 52, ++ [2][1][RTW89_CN][2] = 36, ++ [2][1][RTW89_QATAR][2] = 36, ++ [2][1][RTW89_UK][2] = 36, ++ [2][1][RTW89_FCC][4] = 50, ++ [2][1][RTW89_ETSI][4] = 36, ++ [2][1][RTW89_MKK][4] = 36, ++ [2][1][RTW89_IC][4] = 22, ++ [2][1][RTW89_KCC][4] = 46, ++ [2][1][RTW89_ACMA][4] = 36, ++ [2][1][RTW89_CHILE][4] = 30, ++ [2][1][RTW89_UKRAINE][4] = 36, ++ [2][1][RTW89_MEXICO][4] = 52, ++ [2][1][RTW89_CN][4] = 36, ++ [2][1][RTW89_QATAR][4] = 36, ++ [2][1][RTW89_UK][4] = 36, ++ [2][1][RTW89_FCC][6] = 50, ++ [2][1][RTW89_ETSI][6] = 36, ++ [2][1][RTW89_MKK][6] = 36, ++ [2][1][RTW89_IC][6] = 22, ++ [2][1][RTW89_KCC][6] = 22, ++ [2][1][RTW89_ACMA][6] = 36, ++ [2][1][RTW89_CHILE][6] = 30, ++ [2][1][RTW89_UKRAINE][6] = 36, ++ [2][1][RTW89_MEXICO][6] = 52, ++ [2][1][RTW89_CN][6] = 36, ++ [2][1][RTW89_QATAR][6] = 36, ++ [2][1][RTW89_UK][6] = 36, ++ [2][1][RTW89_FCC][8] = 50, ++ [2][1][RTW89_ETSI][8] = 36, ++ [2][1][RTW89_MKK][8] = 34, ++ [2][1][RTW89_IC][8] = 50, ++ [2][1][RTW89_KCC][8] = 48, ++ [2][1][RTW89_ACMA][8] = 36, ++ [2][1][RTW89_CHILE][8] = 54, ++ [2][1][RTW89_UKRAINE][8] = 36, ++ [2][1][RTW89_MEXICO][8] = 50, ++ [2][1][RTW89_CN][8] = 36, ++ [2][1][RTW89_QATAR][8] = 36, ++ [2][1][RTW89_UK][8] = 36, ++ [2][1][RTW89_FCC][10] = 50, ++ [2][1][RTW89_ETSI][10] = 36, ++ [2][1][RTW89_MKK][10] = 34, ++ [2][1][RTW89_IC][10] = 50, ++ [2][1][RTW89_KCC][10] = 48, ++ [2][1][RTW89_ACMA][10] = 36, ++ [2][1][RTW89_CHILE][10] = 54, ++ [2][1][RTW89_UKRAINE][10] = 36, ++ [2][1][RTW89_MEXICO][10] = 50, ++ [2][1][RTW89_CN][10] = 36, ++ [2][1][RTW89_QATAR][10] = 36, ++ [2][1][RTW89_UK][10] = 36, ++ [2][1][RTW89_FCC][12] = 52, ++ [2][1][RTW89_ETSI][12] = 36, ++ [2][1][RTW89_MKK][12] = 36, ++ [2][1][RTW89_IC][12] = 52, ++ [2][1][RTW89_KCC][12] = 48, ++ [2][1][RTW89_ACMA][12] = 36, ++ [2][1][RTW89_CHILE][12] = 54, ++ [2][1][RTW89_UKRAINE][12] = 36, ++ [2][1][RTW89_MEXICO][12] = 52, ++ [2][1][RTW89_CN][12] = 36, ++ [2][1][RTW89_QATAR][12] = 36, ++ [2][1][RTW89_UK][12] = 36, ++ [2][1][RTW89_FCC][14] = 52, ++ [2][1][RTW89_ETSI][14] = 36, ++ [2][1][RTW89_MKK][14] = 36, ++ [2][1][RTW89_IC][14] = 52, ++ [2][1][RTW89_KCC][14] = 48, ++ [2][1][RTW89_ACMA][14] = 36, ++ [2][1][RTW89_CHILE][14] = 54, ++ [2][1][RTW89_UKRAINE][14] = 36, ++ [2][1][RTW89_MEXICO][14] = 52, ++ [2][1][RTW89_CN][14] = 36, ++ [2][1][RTW89_QATAR][14] = 36, ++ [2][1][RTW89_UK][14] = 36, ++ [2][1][RTW89_FCC][15] = 50, ++ [2][1][RTW89_ETSI][15] = 36, ++ [2][1][RTW89_MKK][15] = 54, ++ [2][1][RTW89_IC][15] = 50, ++ [2][1][RTW89_KCC][15] = 48, ++ [2][1][RTW89_ACMA][15] = 36, ++ [2][1][RTW89_CHILE][15] = 56, ++ [2][1][RTW89_UKRAINE][15] = 36, ++ [2][1][RTW89_MEXICO][15] = 50, ++ [2][1][RTW89_CN][15] = 127, ++ [2][1][RTW89_QATAR][15] = 36, ++ [2][1][RTW89_UK][15] = 36, ++ [2][1][RTW89_FCC][17] = 50, ++ [2][1][RTW89_ETSI][17] = 36, ++ [2][1][RTW89_MKK][17] = 56, ++ [2][1][RTW89_IC][17] = 50, ++ [2][1][RTW89_KCC][17] = 48, ++ [2][1][RTW89_ACMA][17] = 36, ++ [2][1][RTW89_CHILE][17] = 56, ++ [2][1][RTW89_UKRAINE][17] = 36, ++ [2][1][RTW89_MEXICO][17] = 50, ++ [2][1][RTW89_CN][17] = 127, ++ [2][1][RTW89_QATAR][17] = 36, ++ [2][1][RTW89_UK][17] = 36, ++ [2][1][RTW89_FCC][19] = 50, ++ [2][1][RTW89_ETSI][19] = 36, ++ [2][1][RTW89_MKK][19] = 56, ++ [2][1][RTW89_IC][19] = 50, ++ [2][1][RTW89_KCC][19] = 48, ++ [2][1][RTW89_ACMA][19] = 36, ++ [2][1][RTW89_CHILE][19] = 56, ++ [2][1][RTW89_UKRAINE][19] = 36, ++ [2][1][RTW89_MEXICO][19] = 50, ++ [2][1][RTW89_CN][19] = 127, ++ [2][1][RTW89_QATAR][19] = 36, ++ [2][1][RTW89_UK][19] = 36, ++ [2][1][RTW89_FCC][21] = 50, ++ [2][1][RTW89_ETSI][21] = 36, ++ [2][1][RTW89_MKK][21] = 56, ++ [2][1][RTW89_IC][21] = 50, ++ [2][1][RTW89_KCC][21] = 48, ++ [2][1][RTW89_ACMA][21] = 36, ++ [2][1][RTW89_CHILE][21] = 58, ++ [2][1][RTW89_UKRAINE][21] = 36, ++ [2][1][RTW89_MEXICO][21] = 50, ++ [2][1][RTW89_CN][21] = 127, ++ [2][1][RTW89_QATAR][21] = 36, ++ [2][1][RTW89_UK][21] = 36, ++ [2][1][RTW89_FCC][23] = 50, ++ [2][1][RTW89_ETSI][23] = 36, ++ [2][1][RTW89_MKK][23] = 56, ++ [2][1][RTW89_IC][23] = 50, ++ [2][1][RTW89_KCC][23] = 48, ++ [2][1][RTW89_ACMA][23] = 36, ++ [2][1][RTW89_CHILE][23] = 58, ++ [2][1][RTW89_UKRAINE][23] = 36, ++ [2][1][RTW89_MEXICO][23] = 50, ++ [2][1][RTW89_CN][23] = 127, ++ [2][1][RTW89_QATAR][23] = 36, ++ [2][1][RTW89_UK][23] = 36, ++ [2][1][RTW89_FCC][25] = 50, ++ [2][1][RTW89_ETSI][25] = 36, ++ [2][1][RTW89_MKK][25] = 56, ++ [2][1][RTW89_IC][25] = 127, ++ [2][1][RTW89_KCC][25] = 48, ++ [2][1][RTW89_ACMA][25] = 127, ++ [2][1][RTW89_CHILE][25] = 58, ++ [2][1][RTW89_UKRAINE][25] = 36, ++ [2][1][RTW89_MEXICO][25] = 50, ++ [2][1][RTW89_CN][25] = 127, ++ [2][1][RTW89_QATAR][25] = 36, ++ [2][1][RTW89_UK][25] = 36, ++ [2][1][RTW89_FCC][27] = 50, ++ [2][1][RTW89_ETSI][27] = 36, ++ [2][1][RTW89_MKK][27] = 56, ++ [2][1][RTW89_IC][27] = 127, ++ [2][1][RTW89_KCC][27] = 48, ++ [2][1][RTW89_ACMA][27] = 127, ++ [2][1][RTW89_CHILE][27] = 58, ++ [2][1][RTW89_UKRAINE][27] = 36, ++ [2][1][RTW89_MEXICO][27] = 50, ++ [2][1][RTW89_CN][27] = 127, ++ [2][1][RTW89_QATAR][27] = 36, ++ [2][1][RTW89_UK][27] = 36, ++ [2][1][RTW89_FCC][29] = 50, ++ [2][1][RTW89_ETSI][29] = 36, ++ [2][1][RTW89_MKK][29] = 56, ++ [2][1][RTW89_IC][29] = 127, ++ [2][1][RTW89_KCC][29] = 48, ++ [2][1][RTW89_ACMA][29] = 127, ++ [2][1][RTW89_CHILE][29] = 56, ++ [2][1][RTW89_UKRAINE][29] = 36, ++ [2][1][RTW89_MEXICO][29] = 50, ++ [2][1][RTW89_CN][29] = 127, ++ [2][1][RTW89_QATAR][29] = 36, ++ [2][1][RTW89_UK][29] = 36, ++ [2][1][RTW89_FCC][31] = 50, ++ [2][1][RTW89_ETSI][31] = 36, ++ [2][1][RTW89_MKK][31] = 56, ++ [2][1][RTW89_IC][31] = 50, ++ [2][1][RTW89_KCC][31] = 48, ++ [2][1][RTW89_ACMA][31] = 36, ++ [2][1][RTW89_CHILE][31] = 56, ++ [2][1][RTW89_UKRAINE][31] = 36, ++ [2][1][RTW89_MEXICO][31] = 50, ++ [2][1][RTW89_CN][31] = 127, ++ [2][1][RTW89_QATAR][31] = 36, ++ [2][1][RTW89_UK][31] = 36, ++ [2][1][RTW89_FCC][33] = 50, ++ [2][1][RTW89_ETSI][33] = 36, ++ [2][1][RTW89_MKK][33] = 56, ++ [2][1][RTW89_IC][33] = 50, ++ [2][1][RTW89_KCC][33] = 48, ++ [2][1][RTW89_ACMA][33] = 36, ++ [2][1][RTW89_CHILE][33] = 56, ++ [2][1][RTW89_UKRAINE][33] = 36, ++ [2][1][RTW89_MEXICO][33] = 50, ++ [2][1][RTW89_CN][33] = 127, ++ [2][1][RTW89_QATAR][33] = 36, ++ [2][1][RTW89_UK][33] = 36, ++ [2][1][RTW89_FCC][35] = 50, ++ [2][1][RTW89_ETSI][35] = 36, ++ [2][1][RTW89_MKK][35] = 56, ++ [2][1][RTW89_IC][35] = 50, ++ [2][1][RTW89_KCC][35] = 48, ++ [2][1][RTW89_ACMA][35] = 36, ++ [2][1][RTW89_CHILE][35] = 56, ++ [2][1][RTW89_UKRAINE][35] = 36, ++ [2][1][RTW89_MEXICO][35] = 50, ++ [2][1][RTW89_CN][35] = 127, ++ [2][1][RTW89_QATAR][35] = 36, ++ [2][1][RTW89_UK][35] = 36, ++ [2][1][RTW89_FCC][37] = 50, ++ [2][1][RTW89_ETSI][37] = 127, ++ [2][1][RTW89_MKK][37] = 54, ++ [2][1][RTW89_IC][37] = 50, ++ [2][1][RTW89_KCC][37] = 48, ++ [2][1][RTW89_ACMA][37] = 60, ++ [2][1][RTW89_CHILE][37] = 56, ++ [2][1][RTW89_UKRAINE][37] = 127, ++ [2][1][RTW89_MEXICO][37] = 50, ++ [2][1][RTW89_CN][37] = 127, ++ [2][1][RTW89_QATAR][37] = 127, ++ [2][1][RTW89_UK][37] = 66, ++ [2][1][RTW89_FCC][38] = 84, ++ [2][1][RTW89_ETSI][38] = 16, ++ [2][1][RTW89_MKK][38] = 127, ++ [2][1][RTW89_IC][38] = 84, ++ [2][1][RTW89_KCC][38] = 48, ++ [2][1][RTW89_ACMA][38] = 84, ++ [2][1][RTW89_CHILE][38] = 58, ++ [2][1][RTW89_UKRAINE][38] = 16, ++ [2][1][RTW89_MEXICO][38] = 84, ++ [2][1][RTW89_CN][38] = 64, ++ [2][1][RTW89_QATAR][38] = 16, ++ [2][1][RTW89_UK][38] = 38, ++ [2][1][RTW89_FCC][40] = 84, ++ [2][1][RTW89_ETSI][40] = 16, ++ [2][1][RTW89_MKK][40] = 127, ++ [2][1][RTW89_IC][40] = 84, ++ [2][1][RTW89_KCC][40] = 48, ++ [2][1][RTW89_ACMA][40] = 84, ++ [2][1][RTW89_CHILE][40] = 58, ++ [2][1][RTW89_UKRAINE][40] = 16, ++ [2][1][RTW89_MEXICO][40] = 84, ++ [2][1][RTW89_CN][40] = 64, ++ [2][1][RTW89_QATAR][40] = 16, ++ [2][1][RTW89_UK][40] = 38, ++ [2][1][RTW89_FCC][42] = 84, ++ [2][1][RTW89_ETSI][42] = 16, ++ [2][1][RTW89_MKK][42] = 127, ++ [2][1][RTW89_IC][42] = 84, ++ [2][1][RTW89_KCC][42] = 48, ++ [2][1][RTW89_ACMA][42] = 84, ++ [2][1][RTW89_CHILE][42] = 58, ++ [2][1][RTW89_UKRAINE][42] = 16, ++ [2][1][RTW89_MEXICO][42] = 84, ++ [2][1][RTW89_CN][42] = 64, ++ [2][1][RTW89_QATAR][42] = 16, ++ [2][1][RTW89_UK][42] = 38, ++ [2][1][RTW89_FCC][44] = 84, ++ [2][1][RTW89_ETSI][44] = 16, ++ [2][1][RTW89_MKK][44] = 127, ++ [2][1][RTW89_IC][44] = 84, ++ [2][1][RTW89_KCC][44] = 48, ++ [2][1][RTW89_ACMA][44] = 84, ++ [2][1][RTW89_CHILE][44] = 58, ++ [2][1][RTW89_UKRAINE][44] = 16, ++ [2][1][RTW89_MEXICO][44] = 84, ++ [2][1][RTW89_CN][44] = 64, ++ [2][1][RTW89_QATAR][44] = 16, ++ [2][1][RTW89_UK][44] = 38, ++ [2][1][RTW89_FCC][46] = 84, ++ [2][1][RTW89_ETSI][46] = 16, ++ [2][1][RTW89_MKK][46] = 127, ++ [2][1][RTW89_IC][46] = 84, ++ [2][1][RTW89_KCC][46] = 48, ++ [2][1][RTW89_ACMA][46] = 84, ++ [2][1][RTW89_CHILE][46] = 58, ++ [2][1][RTW89_UKRAINE][46] = 16, ++ [2][1][RTW89_MEXICO][46] = 84, ++ [2][1][RTW89_CN][46] = 64, ++ [2][1][RTW89_QATAR][46] = 16, ++ [2][1][RTW89_UK][46] = 38, ++ [2][1][RTW89_FCC][48] = 44, ++ [2][1][RTW89_ETSI][48] = 127, ++ [2][1][RTW89_MKK][48] = 127, ++ [2][1][RTW89_IC][48] = 127, ++ [2][1][RTW89_KCC][48] = 127, ++ [2][1][RTW89_ACMA][48] = 127, ++ [2][1][RTW89_CHILE][48] = 127, ++ [2][1][RTW89_UKRAINE][48] = 127, ++ [2][1][RTW89_MEXICO][48] = 127, ++ [2][1][RTW89_CN][48] = 127, ++ [2][1][RTW89_QATAR][48] = 127, ++ [2][1][RTW89_UK][48] = 127, ++ [2][1][RTW89_FCC][50] = 44, ++ [2][1][RTW89_ETSI][50] = 127, ++ [2][1][RTW89_MKK][50] = 127, ++ [2][1][RTW89_IC][50] = 127, ++ [2][1][RTW89_KCC][50] = 127, ++ [2][1][RTW89_ACMA][50] = 127, ++ [2][1][RTW89_CHILE][50] = 127, ++ [2][1][RTW89_UKRAINE][50] = 127, ++ [2][1][RTW89_MEXICO][50] = 127, ++ [2][1][RTW89_CN][50] = 127, ++ [2][1][RTW89_QATAR][50] = 127, ++ [2][1][RTW89_UK][50] = 127, ++ [2][1][RTW89_FCC][52] = 44, ++ [2][1][RTW89_ETSI][52] = 127, ++ [2][1][RTW89_MKK][52] = 127, ++ [2][1][RTW89_IC][52] = 127, ++ [2][1][RTW89_KCC][52] = 127, ++ [2][1][RTW89_ACMA][52] = 127, ++ [2][1][RTW89_CHILE][52] = 127, ++ [2][1][RTW89_UKRAINE][52] = 127, ++ [2][1][RTW89_MEXICO][52] = 127, ++ [2][1][RTW89_CN][52] = 127, ++ [2][1][RTW89_QATAR][52] = 127, ++ [2][1][RTW89_UK][52] = 127, ++}; ++ ++const struct rtw89_phy_table rtw89_8852b_phy_bb_table = { ++ .regs = rtw89_8852b_phy_bb_regs, ++ .n_regs = ARRAY_SIZE(rtw89_8852b_phy_bb_regs), ++ .rf_path = 0, /* don't care */ ++}; ++ ++const struct rtw89_phy_table rtw89_8852b_phy_bb_gain_table = { ++ .regs = rtw89_8852b_phy_bb_reg_gain, ++ .n_regs = ARRAY_SIZE(rtw89_8852b_phy_bb_reg_gain), ++ .rf_path = 0, /* don't care */ ++}; ++ ++const struct rtw89_phy_table rtw89_8852b_phy_radioa_table = { ++ .regs = rtw89_8852b_phy_radioa_regs, ++ .n_regs = ARRAY_SIZE(rtw89_8852b_phy_radioa_regs), ++ .rf_path = RF_PATH_A, ++ .config = rtw89_phy_config_rf_reg_v1, ++}; ++ ++const struct rtw89_phy_table rtw89_8852b_phy_radiob_table = { ++ .regs = rtw89_8852b_phy_radiob_regs, ++ .n_regs = ARRAY_SIZE(rtw89_8852b_phy_radiob_regs), ++ .rf_path = RF_PATH_B, ++ .config = rtw89_phy_config_rf_reg_v1, ++}; ++ ++const struct rtw89_phy_table rtw89_8852b_phy_nctl_table = { ++ .regs = rtw89_8852b_phy_nctl_regs, ++ .n_regs = ARRAY_SIZE(rtw89_8852b_phy_nctl_regs), ++ .rf_path = 0, /* don't care */ ++}; ++ ++const struct rtw89_txpwr_table rtw89_8852b_byr_table = { ++ .data = rtw89_8852b_txpwr_byrate, ++ .size = ARRAY_SIZE(rtw89_8852b_txpwr_byrate), ++ .load = rtw89_phy_load_txpwr_byrate, ++}; ++ ++const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg = { ++ .delta_swingidx_5gb_n = _txpwr_track_delta_swingidx_5gb_n, ++ .delta_swingidx_5gb_p = _txpwr_track_delta_swingidx_5gb_p, ++ .delta_swingidx_5ga_n = _txpwr_track_delta_swingidx_5ga_n, ++ .delta_swingidx_5ga_p = _txpwr_track_delta_swingidx_5ga_p, ++ .delta_swingidx_2gb_n = _txpwr_track_delta_swingidx_2gb_n, ++ .delta_swingidx_2gb_p = _txpwr_track_delta_swingidx_2gb_p, ++ .delta_swingidx_2ga_n = _txpwr_track_delta_swingidx_2ga_n, ++ .delta_swingidx_2ga_p = _txpwr_track_delta_swingidx_2ga_p, ++ .delta_swingidx_2g_cck_b_n = _txpwr_track_delta_swingidx_2g_cck_b_n, ++ .delta_swingidx_2g_cck_b_p = _txpwr_track_delta_swingidx_2g_cck_b_p, ++ .delta_swingidx_2g_cck_a_n = _txpwr_track_delta_swingidx_2g_cck_a_n, ++ .delta_swingidx_2g_cck_a_p = _txpwr_track_delta_swingidx_2g_cck_a_p, ++}; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h 2022-12-24 00:49:25.785376835 +0200 +@@ -0,0 +1,30 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2019-2020 Realtek Corporation ++ */ ++ ++#ifndef __RTW89_8852B_TABLE_H__ ++#define __RTW89_8852B_TABLE_H__ ++ ++#include "core.h" ++ ++extern const struct rtw89_phy_table rtw89_8852b_phy_bb_table; ++extern const struct rtw89_phy_table rtw89_8852b_phy_bb_gain_table; ++extern const struct rtw89_phy_table rtw89_8852b_phy_radioa_table; ++extern const struct rtw89_phy_table rtw89_8852b_phy_radiob_table; ++extern const struct rtw89_phy_table rtw89_8852b_phy_nctl_table; ++extern const struct rtw89_txpwr_table rtw89_8852b_byr_table; ++extern const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg; ++extern const u8 rtw89_8852b_tx_shape[RTW89_BAND_MAX][RTW89_RS_TX_SHAPE_NUM] ++ [RTW89_REGD_NUM]; ++extern const s8 rtw89_8852b_txpwr_lmt_2g[RTW89_2G_BW_NUM][RTW89_NTX_NUM] ++ [RTW89_RS_LMT_NUM][RTW89_BF_NUM] ++ [RTW89_REGD_NUM][RTW89_2G_CH_NUM]; ++extern const s8 rtw89_8852b_txpwr_lmt_5g[RTW89_5G_BW_NUM][RTW89_NTX_NUM] ++ [RTW89_RS_LMT_NUM][RTW89_BF_NUM] ++ [RTW89_REGD_NUM][RTW89_5G_CH_NUM]; ++extern const s8 rtw89_8852b_txpwr_lmt_ru_2g[RTW89_RU_NUM][RTW89_NTX_NUM] ++ [RTW89_REGD_NUM][RTW89_2G_CH_NUM]; ++extern const s8 rtw89_8852b_txpwr_lmt_ru_5g[RTW89_RU_NUM][RTW89_NTX_NUM] ++ [RTW89_REGD_NUM][RTW89_5G_CH_NUM]; ++ ++#endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c.c 2022-12-24 00:49:25.785376835 +0200 +@@ -273,6 +273,9 @@ static int rtw8852c_pwr_on_func(struct r + B_AX_CMAC_DMA_EN | B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN | + B_AX_TMAC_EN | B_AX_RMAC_EN); + ++ rtw89_write32_mask(rtwdev, R_AX_LED1_FUNC_SEL, B_AX_PINMUX_EESK_FUNC_SEL_V1_MASK, ++ PINMUX_EESK_FUNC_SEL_BT_LOG); ++ + return 0; + } + +@@ -785,40 +788,12 @@ static const struct rtw8852c_bb_gain_op1 + .mask_tia0_lna6 = 0xff000000, + }; + +-static enum rtw89_phy_bb_gain_band +-rtw8852c_mapping_gain_band(enum rtw89_subband subband) +-{ +- switch (subband) { +- default: +- case RTW89_CH_2G: +- return RTW89_BB_GAIN_BAND_2G; +- case RTW89_CH_5G_BAND_1: +- return RTW89_BB_GAIN_BAND_5G_L; +- case RTW89_CH_5G_BAND_3: +- return RTW89_BB_GAIN_BAND_5G_M; +- case RTW89_CH_5G_BAND_4: +- return RTW89_BB_GAIN_BAND_5G_H; +- case RTW89_CH_6G_BAND_IDX0: +- case RTW89_CH_6G_BAND_IDX1: +- return RTW89_BB_GAIN_BAND_6G_L; +- case RTW89_CH_6G_BAND_IDX2: +- case RTW89_CH_6G_BAND_IDX3: +- return RTW89_BB_GAIN_BAND_6G_M; +- case RTW89_CH_6G_BAND_IDX4: +- case RTW89_CH_6G_BAND_IDX5: +- return RTW89_BB_GAIN_BAND_6G_H; +- case RTW89_CH_6G_BAND_IDX6: +- case RTW89_CH_6G_BAND_IDX7: +- return RTW89_BB_GAIN_BAND_6G_UH; +- } +-} +- + static void rtw8852c_set_gain_error(struct rtw89_dev *rtwdev, + enum rtw89_subband subband, + enum rtw89_rf_path path) + { + const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; +- u8 gain_band = rtw8852c_mapping_gain_band(subband); ++ u8 gain_band = rtw89_subband_to_bb_gain_band(subband); + s32 val; + u32 reg; + u32 mask; +@@ -976,21 +951,7 @@ static void rtw8852c_set_gain_offset(str + rtw89_phy_write32_mask(rtwdev, R_RPL_OFST, B_RPL_OFST_MASK, tmp & 0x7f); + } + +- switch (chan->subband_type) { +- default: +- case RTW89_CH_2G: +- gain_band = RTW89_GAIN_OFFSET_2G_OFDM; +- break; +- case RTW89_CH_5G_BAND_1: +- gain_band = RTW89_GAIN_OFFSET_5G_LOW; +- break; +- case RTW89_CH_5G_BAND_3: +- gain_band = RTW89_GAIN_OFFSET_5G_MID; +- break; +- case RTW89_CH_5G_BAND_4: +- gain_band = RTW89_GAIN_OFFSET_5G_HIGH; +- break; +- } ++ gain_band = rtw89_subband_to_gain_offset_band_of_ofdm(chan->subband_type); + + offset_q0 = -efuse_gain->offset[path][gain_band]; + offset_base_q4 = efuse_gain->offset_base[phy_idx]; +@@ -1722,12 +1683,12 @@ static void rtw8852c_set_channel_bb(stru + const struct rtw89_chan *chan, + enum rtw89_phy_idx phy_idx) + { ++ static const u32 ru_alloc_msk[2] = {B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY0, ++ B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY1}; + struct rtw89_hal *hal = &rtwdev->hal; + bool cck_en = chan->band_type == RTW89_BAND_2G; + u8 pri_ch_idx = chan->pri_ch_idx; + u32 mask, reg; +- u32 ru_alloc_msk[2] = {B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY0, +- B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY1}; + u8 ntx_path; + + if (chan->band_type == RTW89_BAND_2G) +@@ -1871,11 +1832,11 @@ static void rtw8852c_set_channel_help(st + + static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev) + { +- struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; ++ struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; + + rtwdev->is_tssi_mode[RF_PATH_A] = false; + rtwdev->is_tssi_mode[RF_PATH_B] = false; +- memset(mcc_info, 0, sizeof(*mcc_info)); ++ memset(rfk_mcc, 0, sizeof(*rfk_mcc)); + rtw8852c_lck_init(rtwdev); + + rtw8852c_rck(rtwdev); +@@ -2006,75 +1967,6 @@ static void rtw8852c_set_txpwr_ref(struc + phy_idx); + } + +-static void rtw8852c_set_txpwr_byrate(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +- u8 band = chan->band_type; +- u8 ch = chan->channel; +- static const u8 rs[] = { +- RTW89_RS_CCK, +- RTW89_RS_OFDM, +- RTW89_RS_MCS, +- RTW89_RS_HEDCM, +- }; +- s8 tmp; +- u8 i, j; +- u32 val, shf, addr = R_AX_PWR_BY_RATE; +- struct rtw89_rate_desc cur; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr byrate with ch=%d\n", ch); +- +- for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) { +- for (i = 0; i < ARRAY_SIZE(rs); i++) { +- if (cur.nss >= rtw89_rs_nss_max[rs[i]]) +- continue; +- +- val = 0; +- cur.rs = rs[i]; +- +- for (j = 0; j < rtw89_rs_idx_max[rs[i]]; j++) { +- cur.idx = j; +- shf = (j % 4) * 8; +- tmp = rtw89_phy_read_txpwr_byrate(rtwdev, band, +- &cur); +- val |= (tmp << shf); +- +- if ((j + 1) % 4) +- continue; +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- val = 0; +- addr += 4; +- } +- } +- } +-} +- +-static void rtw8852c_set_txpwr_offset(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +- u8 band = chan->band_type; +- struct rtw89_rate_desc desc = { +- .nss = RTW89_NSS_1, +- .rs = RTW89_RS_OFFSET, +- }; +- u32 val = 0; +- s8 v; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n"); +- +- for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++) { +- v = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc); +- val |= ((v & 0xf) << (4 * desc.idx)); +- } +- +- rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL, +- GENMASK(19, 0), val); +-} +- + static void rtw8852c_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev, + u8 tx_shape_idx, + enum rtw89_phy_idx phy_idx) +@@ -2147,83 +2039,15 @@ static void rtw8852c_set_tx_shape(struct + tx_shape_ofdm); + } + +-static void rtw8852c_set_txpwr_limit(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +-#define __MAC_TXPWR_LMT_PAGE_SIZE 40 +- u8 ch = chan->channel; +- u8 bw = chan->band_width; +- struct rtw89_txpwr_limit lmt[NTX_NUM_8852C]; +- u32 addr, val; +- const s8 *ptr; +- u8 i, j; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw); +- +- for (i = 0; i < NTX_NUM_8852C; i++) { +- rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt[i], i); +- +- for (j = 0; j < __MAC_TXPWR_LMT_PAGE_SIZE; j += 4) { +- addr = R_AX_PWR_LMT + j + __MAC_TXPWR_LMT_PAGE_SIZE * i; +- ptr = (s8 *)&lmt[i] + j; +- +- val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | +- FIELD_PREP(GENMASK(15, 8), ptr[1]) | +- FIELD_PREP(GENMASK(23, 16), ptr[2]) | +- FIELD_PREP(GENMASK(31, 24), ptr[3]); +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- } +- } +-#undef __MAC_TXPWR_LMT_PAGE_SIZE +-} +- +-static void rtw8852c_set_txpwr_limit_ru(struct rtw89_dev *rtwdev, +- const struct rtw89_chan *chan, +- enum rtw89_phy_idx phy_idx) +-{ +-#define __MAC_TXPWR_LMT_RU_PAGE_SIZE 24 +- u8 ch = chan->channel; +- u8 bw = chan->band_width; +- struct rtw89_txpwr_limit_ru lmt_ru[NTX_NUM_8852C]; +- u32 addr, val; +- const s8 *ptr; +- u8 i, j; +- +- rtw89_debug(rtwdev, RTW89_DBG_TXPWR, +- "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw); +- +- for (i = 0; i < NTX_NUM_8852C; i++) { +- rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru[i], i); +- +- for (j = 0; j < __MAC_TXPWR_LMT_RU_PAGE_SIZE; j += 4) { +- addr = R_AX_PWR_RU_LMT + j + +- __MAC_TXPWR_LMT_RU_PAGE_SIZE * i; +- ptr = (s8 *)&lmt_ru[i] + j; +- +- val = FIELD_PREP(GENMASK(7, 0), ptr[0]) | +- FIELD_PREP(GENMASK(15, 8), ptr[1]) | +- FIELD_PREP(GENMASK(23, 16), ptr[2]) | +- FIELD_PREP(GENMASK(31, 24), ptr[3]); +- +- rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); +- } +- } +- +-#undef __MAC_TXPWR_LMT_RU_PAGE_SIZE +-} +- + static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev, + const struct rtw89_chan *chan, + enum rtw89_phy_idx phy_idx) + { +- rtw8852c_set_txpwr_byrate(rtwdev, chan, phy_idx); +- rtw8852c_set_txpwr_offset(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx); + rtw8852c_set_tx_shape(rtwdev, chan, phy_idx); +- rtw8852c_set_txpwr_limit(rtwdev, chan, phy_idx); +- rtw8852c_set_txpwr_limit_ru(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx); ++ rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx); + } + + static void rtw8852c_set_txpwr_ctrl(struct rtw89_dev *rtwdev, +@@ -2819,19 +2643,6 @@ static const struct rtw89_btc_fbtc_mreg + }; + + static +-void rtw8852c_btc_bt_aci_imp(struct rtw89_dev *rtwdev) +-{ +- struct rtw89_btc *btc = &rtwdev->btc; +- struct rtw89_btc_dm *dm = &btc->dm; +- struct rtw89_btc_bt_info *bt = &btc->cx.bt; +- struct rtw89_btc_bt_link_info *b = &bt->link_info; +- +- /* fix LNA2 = level-5 for BT ACI issue at BTG */ +- if (btc->dm.wl_btg_rx && b->profile_cnt.now != 0) +- dm->trx_para_level = 1; +-} +- +-static + void rtw8852c_btc_update_bt_cnt(struct rtw89_dev *rtwdev) + { + /* Feature move to firmware */ +@@ -2985,6 +2796,15 @@ static int rtw8852c_mac_disable_bb_rf(st + return 0; + } + ++#ifdef CONFIG_PM ++static const struct wiphy_wowlan_support rtw_wowlan_stub_8852c = { ++ .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT, ++ .n_patterns = RTW89_MAX_PATTERN_NUM, ++ .pattern_max_len = RTW89_MAX_PATTERN_SIZE, ++ .pattern_min_len = 1, ++}; ++#endif ++ + static const struct rtw89_chip_ops rtw8852c_chip_ops = { + .enable_bb_rf = rtw8852c_mac_enable_bb_rf, + .disable_bb_rf = rtw8852c_mac_disable_bb_rf, +@@ -3027,7 +2847,6 @@ static const struct rtw89_chip_ops rtw88 + .btc_set_wl_pri = rtw8852c_btc_set_wl_pri, + .btc_set_wl_txpwr_ctrl = rtw8852c_btc_set_wl_txpwr_ctrl, + .btc_get_bt_rssi = rtw8852c_btc_get_bt_rssi, +- .btc_bt_aci_imp = rtw8852c_btc_bt_aci_imp, + .btc_update_bt_cnt = rtw8852c_btc_update_bt_cnt, + .btc_wl_s1_standby = rtw8852c_btc_wl_s1_standby, + .btc_set_wl_rx_gain = rtw8852c_btc_set_wl_rx_gain, +@@ -3045,6 +2864,8 @@ const struct rtw89_chip_info rtw8852c_ch + .rsvd_ple_ofst = 0x6f800, + .hfc_param_ini = rtw8852c_hfc_param_ini_pcie, + .dle_mem = rtw8852c_dle_mem_pcie, ++ .wde_qempty_acq_num = 16, ++ .wde_qempty_mgq_sel = 16, + .rf_base_addr = {0xe000, 0xf000}, + .pwr_on_seq = NULL, + .pwr_off_seq = NULL, +@@ -3070,6 +2891,7 @@ const struct rtw89_chip_info rtw8852c_ch + BIT(NL80211_BAND_5GHZ) | + BIT(NL80211_BAND_6GHZ), + .support_bw160 = true, ++ .support_ul_tb_ctrl = false, + .hw_sec_hdr = true, + .rf_path_num = 2, + .tx_nss = 2, +@@ -3132,11 +2954,15 @@ const struct rtw89_chip_info rtw8852c_ch + .c2h_ctrl_reg = R_AX_C2HREG_CTRL_V1, + .c2h_regs = rtw8852c_c2h_regs, + .page_regs = &rtw8852c_page_regs, ++ .cfo_src_fd = false, + .dcfo_comp = &rtw8852c_dcfo_comp, + .dcfo_comp_sft = 5, + .imr_info = &rtw8852c_imr_info, + .rrsr_cfgs = &rtw8852c_rrsr_cfgs, + .dma_ch_mask = 0, ++#ifdef CONFIG_PM ++ .wowlan_stub = &rtw_wowlan_stub_8852c, ++#endif + }; + EXPORT_SYMBOL(rtw8852c_chip_info); + +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c.h linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c.h 2022-12-24 00:49:25.786376835 +0200 +@@ -9,7 +9,6 @@ + + #define RF_PATH_NUM_8852C 2 + #define BB_PATH_NUM_8852C 2 +-#define NTX_NUM_8852C 2 + + struct rtw8852c_u_efuse { + u8 rsvd[0x38]; +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c 2022-12-24 00:49:25.786376835 +0200 +@@ -22,8 +22,7 @@ static const u32 _tssi_de_mcs_5m[RF_PATH + static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852C] = {0x5830, 0x7830}; + + static const u32 rtw8852c_backup_bb_regs[] = { +- 0x813c, 0x8124, 0x8120, 0xc0d4, 0xc0d8, 0xc0e8, 0x823c, 0x8224, 0x8220, +- 0xc1d4, 0xc1d8, 0xc1e8 ++ 0x8120, 0xc0d4, 0xc0d8, 0xc0e8, 0x8220, 0xc1d4, 0xc1d8, 0xc1e8 + }; + + static const u32 rtw8852c_backup_rf_regs[] = { +@@ -1031,9 +1030,9 @@ static bool _iqk_nbtxk(struct rtw89_dev + + static bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path) + { +- struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; ++ struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; + struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; +- u8 idx = mcc_info->table_idx; ++ u8 idx = rfk_mcc->table_idx; + bool is_fail1, is_fail2; + u32 val; + u32 core_i; +@@ -1376,10 +1375,10 @@ static void _iqk_afebb_restore(struct rt + + static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) + { +- struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; ++ struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; + u8 idx = 0; + +- idx = mcc_info->table_idx; ++ idx = rfk_mcc->table_idx; + rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx); + rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx); + rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); +@@ -1667,7 +1666,7 @@ static u8 _dpk_one_shot(struct rtw89_dev + + ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, + 10, 20000, false, rtwdev, 0xbff8, MASKBYTE0); +- mdelay(10); ++ udelay(10); + rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0); + + rtw89_debug(rtwdev, RTW89_DBG_RFK, +@@ -3825,20 +3824,20 @@ void rtw8852c_set_channel_rf(struct rtw8 + void rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) + { + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); +- struct rtw89_mcc_info *mcc_info = &rtwdev->mcc; +- u8 idx = mcc_info->table_idx; ++ struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; ++ u8 idx = rfk_mcc->table_idx; + int i; + + for (i = 0; i < RTW89_IQK_CHS_NR; i++) { +- if (mcc_info->ch[idx] == 0) ++ if (rfk_mcc->ch[idx] == 0) + break; + if (++idx >= RTW89_IQK_CHS_NR) + idx = 0; + } + +- mcc_info->table_idx = idx; +- mcc_info->ch[idx] = chan->channel; +- mcc_info->band[idx] = chan->band_type; ++ rfk_mcc->table_idx = idx; ++ rfk_mcc->ch[idx] = chan->channel; ++ rfk_mcc->band[idx] = chan->band_type; + } + + void rtw8852c_rck(struct rtw89_dev *rtwdev) +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c_table.c linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c_table.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/rtw8852c_table.c 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/rtw8852c_table.c 2022-12-24 00:49:25.786376835 +0200 +@@ -10,6 +10,8 @@ static const struct rtw89_reg2_def rtw89 + {0xF0FF0000, 0x00000000}, + {0xF03300FF, 0x00000001}, + {0xF03400FF, 0x00000002}, ++ {0xF03500FF, 0x00000003}, ++ {0xF03600FF, 0x00000004}, + {0x70C, 0x00000020}, + {0x704, 0x601E0100}, + {0x4000, 0x00000000}, +@@ -200,7 +202,7 @@ static const struct rtw89_reg2_def rtw89 + {0x4264, 0x00000000}, + {0x4268, 0x00000000}, + {0x426C, 0x0418317C}, +- {0x46C0, 0x00000001}, ++ {0x46C0, 0x00000000}, + {0x4270, 0x00D6135C}, + {0x46C4, 0x00000033}, + {0x4274, 0x00000000}, +@@ -342,7 +344,7 @@ static const struct rtw89_reg2_def rtw89 + {0x442C, 0x00000000}, + {0x4430, 0x00000000}, + {0x4434, 0x00000000}, +- {0x4438, 0x590642D0}, ++ {0x4438, 0x59096398}, + {0x443C, 0x398668A0}, + {0x4440, 0x6C100808}, + {0x4444, 0x4A145344}, +@@ -566,9 +568,9 @@ static const struct rtw89_reg2_def rtw89 + {0x4BA8, 0x002B6456}, + {0x45E0, 0x00000000}, + {0x45E4, 0x00000000}, +- {0x45E8, 0x00E2E1E1}, ++ {0x45E8, 0x00C8E1E1}, + {0x45EC, 0xCBCBB6B6}, +- {0x45F0, 0x59100FCA}, ++ {0x45F0, 0x5F900FCA}, + {0x4BAC, 0x12CAB6DE}, + {0x4BB0, 0x00001110}, + {0x45F4, 0x08882550}, +@@ -584,9 +586,17 @@ static const struct rtw89_reg2_def rtw89 + {0x4660, 0x41250EF4}, + {0x4664, 0x6750E458}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x45DC, 0xE1CB38E8}, +- {0x4660, 0x4A2E1800}, +- {0x4664, 0x6750E462}, ++ {0x45DC, 0xD1B942F4}, ++ {0x4660, 0x41250EF4}, ++ {0x4664, 0x6750E458}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x45DC, 0xD1B942F4}, ++ {0x4660, 0x41250EF4}, ++ {0x4664, 0x6750E458}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x45DC, 0xD1B942F4}, ++ {0x4660, 0x41250EF4}, ++ {0x4664, 0x6750E458}, + {0xA0000000, 0x00000000}, + {0x45DC, 0xE1CB38E8}, + {0x4660, 0x4A2E1800}, +@@ -603,7 +613,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4688, 0x1A10FF04}, + {0x468C, 0x282A3000}, + {0x4690, 0x2A29292A}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4694, 0x04FA2A2A}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4694, 0x04FA2A2A}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4694, 0x06FA2A2A}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4694, 0x04FA2A2A}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x4694, 0x04FA2A2A}, ++ {0xA0000000, 0x00000000}, ++ {0x4694, 0x04FA2A2A}, ++ {0xB0000000, 0x00000000}, + {0x4698, 0xEE0F04D1}, + {0x469C, 0x89291436}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, +@@ -612,6 +634,10 @@ static const struct rtw89_reg2_def rtw89 + {0x46A0, 0x0701E79E}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x46A0, 0x0701E79E}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46A0, 0x0701E79E}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46A0, 0x0701E79E}, + {0xA0000000, 0x00000000}, + {0x46A0, 0x0701E79E}, + {0xB0000000, 0x00000000}, +@@ -620,11 +646,17 @@ static const struct rtw89_reg2_def rtw89 + {0x46A8, 0x2212FF14}, + {0x46AC, 0x60423537}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46A8, 0x649EFF14}, ++ {0x46AC, 0xA1B37C4E}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x46A8, 0x4D1E7F14}, + {0x46AC, 0x60B37C4E}, +- {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x46A8, 0x2212FF14}, +- {0x46AC, 0x60423537}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46A8, 0x649EFF14}, ++ {0x46AC, 0xA1B37C4E}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46A8, 0x649EFF14}, ++ {0x46AC, 0xA1B37C4E}, + {0xA0000000, 0x00000000}, + {0x46A8, 0x2212FF14}, + {0x46AC, 0x60423537}, +@@ -637,11 +669,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4720, 0x3FFFFD63}, + {0x4724, 0xB58D11FF}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x46BC, 0x5107C252}, +- {0x4720, 0x27795843}, ++ {0x46BC, 0x510FC252}, ++ {0x4720, 0x27795303}, + {0x4724, 0xB58D11F5}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x46BC, 0x5107C252}, ++ {0x46BC, 0x510FC252}, ++ {0x4720, 0x27795843}, ++ {0x4724, 0xB58D11F5}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46BC, 0x510FC252}, ++ {0x4720, 0x27795303}, ++ {0x4724, 0xB58D11F5}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x46BC, 0x510FC252}, + {0x4720, 0x27795303}, + {0x4724, 0xB58D11F5}, + {0xA0000000, 0x00000000}, +@@ -656,11 +696,17 @@ static const struct rtw89_reg2_def rtw89 + {0x4734, 0x00000020}, + {0x4738, 0x8325C500}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4734, 0x003D4C20}, ++ {0x4734, 0x003D5420}, + {0x4738, 0x8F25C500}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4734, 0x003D4C20}, ++ {0x4738, 0x8F25C500}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4734, 0x003D5420}, ++ {0x4738, 0x8F25C500}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x4734, 0x003D5420}, +- {0x4738, 0x8725C500}, ++ {0x4738, 0x8F25C500}, + {0xA0000000, 0x00000000}, + {0x4734, 0x00000020}, + {0x4738, 0x8325C500}, +@@ -678,8 +724,14 @@ static const struct rtw89_reg2_def rtw89 + {0x4BB4, 0x05EBC8AF}, + {0x4BB8, 0x99543D24}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4BB4, 0xFBD5B89F}, +- {0x4BB8, 0x99563918}, ++ {0x4BB4, 0x05EBC8AF}, ++ {0x4BB8, 0x99543D24}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4BB4, 0x05EBC8AF}, ++ {0x4BB8, 0x99543D24}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4BB4, 0x05EBC8AF}, ++ {0x4BB8, 0x99543D24}, + {0xA0000000, 0x00000000}, + {0x4BB4, 0xFBD5B89F}, + {0x4BB8, 0x99563918}, +@@ -729,10 +781,10 @@ static const struct rtw89_reg2_def rtw89 + {0x4C58, 0x00001146}, + {0x4C5C, 0x00000000}, + {0x4C60, 0x00000000}, +- {0x4C64, 0xE2E1E1DE}, ++ {0x4C64, 0xC8E1E1DE}, + {0x4C68, 0xB6B600B6}, + {0x4C6C, 0xCACBCBCA}, +- {0x4C70, 0x8091010F}, ++ {0x4C70, 0x80F9010F}, + {0x4C74, 0x00000B11}, + {0x46C8, 0x08882550}, + {0x46CC, 0x08CC2660}, +@@ -747,9 +799,17 @@ static const struct rtw89_reg2_def rtw89 + {0x4744, 0x412504E8}, + {0x4748, 0x6850E459}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4740, 0xE4CD38E8}, +- {0x4744, 0x4C321B04}, +- {0x4748, 0x6750E466}, ++ {0x4740, 0xC5AD42F4}, ++ {0x4744, 0x412504E8}, ++ {0x4748, 0x6850E459}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4740, 0xC5AD42F4}, ++ {0x4744, 0x412504E8}, ++ {0x4748, 0x6850E459}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4740, 0xC5AD42F4}, ++ {0x4744, 0x412504E8}, ++ {0x4748, 0x6850E459}, + {0xA0000000, 0x00000000}, + {0x4740, 0xE4CD38E8}, + {0x4744, 0x4C321B04}, +@@ -766,7 +826,19 @@ static const struct rtw89_reg2_def rtw89 + {0x476C, 0x1A10FF04}, + {0x4770, 0x282A3000}, + {0x4774, 0x2A29292A}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x4778, 0x04FA2A2A}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4778, 0x04FA2A2A}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4778, 0x06FA2A2A}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4778, 0x04FA2A2A}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4778, 0x04FA2A2A}, ++ {0xA0000000, 0x00000000}, ++ {0x4778, 0x04FA2A2A}, ++ {0xB0000000, 0x00000000}, + {0x477C, 0xEE0F04D1}, + {0x49F0, 0x89291436}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, +@@ -775,6 +847,10 @@ static const struct rtw89_reg2_def rtw89 + {0x49F4, 0x0701E79E}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x49F4, 0x0701E79E}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x49F4, 0x0701E79E}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x49F4, 0x0701E79E}, + {0xA0000000, 0x00000000}, + {0x49F4, 0x0701E79E}, + {0xB0000000, 0x00000000}, +@@ -783,11 +859,17 @@ static const struct rtw89_reg2_def rtw89 + {0x4A5C, 0x2212FF14}, + {0x4A60, 0x60423537}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4A5C, 0x649EFF14}, ++ {0x4A60, 0xA1B37C4E}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x4A5C, 0x4D1E7F14}, + {0x4A60, 0x60B37C4E}, +- {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4A5C, 0x2212FF14}, +- {0x4A60, 0x60423537}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4A5C, 0x649EFF14}, ++ {0x4A60, 0xA1B37C4E}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4A5C, 0x649EFF14}, ++ {0x4A60, 0xA1B37C4E}, + {0xA0000000, 0x00000000}, + {0x4A5C, 0x2212FF14}, + {0x4A60, 0x60423537}, +@@ -800,11 +882,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4A74, 0x3FFFFD63}, + {0x4A78, 0xB58D11FF}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4A70, 0x5107C252}, +- {0x4A74, 0x27795843}, ++ {0x4A70, 0x510FC252}, ++ {0x4A74, 0x27795303}, + {0x4A78, 0xB58D11F5}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4A70, 0x5107C252}, ++ {0x4A70, 0x510FC252}, ++ {0x4A74, 0x27795843}, ++ {0x4A78, 0xB58D11F5}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4A70, 0x510FC252}, ++ {0x4A74, 0x27795303}, ++ {0x4A78, 0xB58D11F5}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4A70, 0x510FC252}, + {0x4A74, 0x27795303}, + {0x4A78, 0xB58D11F5}, + {0xA0000000, 0x00000000}, +@@ -819,11 +909,17 @@ static const struct rtw89_reg2_def rtw89 + {0x4AA0, 0x00000020}, + {0x4AA4, 0x8325C500}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4AA0, 0x003D4C20}, ++ {0x4AA0, 0x003D5420}, + {0x4AA4, 0x8F25C500}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4AA0, 0x003D4C20}, ++ {0x4AA4, 0x8F25C500}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4AA0, 0x003D5420}, ++ {0x4AA4, 0x8F25C500}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x4AA0, 0x003D5420}, +- {0x4AA4, 0x8725C500}, ++ {0x4AA4, 0x8F25C500}, + {0xA0000000, 0x00000000}, + {0x4AA0, 0x00000020}, + {0x4AA4, 0x8325C500}, +@@ -841,8 +937,14 @@ static const struct rtw89_reg2_def rtw89 + {0x4C78, 0x07ECC9B0}, + {0x4C7C, 0x995B4126}, + {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x4C78, 0xFBD5B89F}, +- {0x4C7C, 0x99563918}, ++ {0x4C78, 0x07ECC9B0}, ++ {0x4C7C, 0x995B4126}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4C78, 0x07ECC9B0}, ++ {0x4C7C, 0x995B4126}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4C78, 0x07ECC9B0}, ++ {0x4C7C, 0x995B4126}, + {0xA0000000, 0x00000000}, + {0x4C78, 0xFBD5B89F}, + {0x4C7C, 0x99563918}, +@@ -907,17 +1009,46 @@ static const struct rtw89_reg2_def rtw89 + {0x47B4, 0x00000005}, + {0x4D2C, 0x0008C0C1}, + {0x47B8, 0x00001759}, +- {0x47BC, 0x4B702400}, +- {0x47C0, 0x831508BA}, ++ {0x47BC, 0x4B002402}, ++ {0x47C0, 0x831508BC}, + {0x4A14, 0x000000E9}, +- {0x4D30, 0x00000001}, ++ {0x4D30, 0x00000000}, + {0x4E94, 0x000000FC}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x47C4, 0x9ABBCACB}, ++ {0x47C8, 0x56767578}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x47C4, 0x9ABBCACB}, ++ {0x47C8, 0x56767578}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x47C4, 0x9ABBCACB}, ++ {0x47C8, 0x56767578}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x47C4, 0x9ABBCACB}, ++ {0x47C8, 0x56767578}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x47C4, 0x9ABBCACB}, ++ {0x47C8, 0x56767578}, ++ {0xA0000000, 0x00000000}, + {0x47C4, 0x9ABBCACB}, + {0x47C8, 0x56767578}, ++ {0xB0000000, 0x00000000}, + {0x47CC, 0xBBCCBBB3}, + {0x47D0, 0x57889989}, + {0x47D4, 0x00000F45}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4D34, 0x7BB167AB}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4D34, 0x7BB1579A}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4D34, 0x7BB167AB}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4D34, 0x7BB1579A}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4D34, 0x7BB1579A}, ++ {0xA0000000, 0x00000000}, + {0x4D34, 0x7BB167AB}, ++ {0xB0000000, 0x00000000}, + {0x4D38, 0xBBBBBB05}, + {0x4D3C, 0x777777BB}, + {0x4D40, 0x00015277}, +@@ -942,7 +1073,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4D48, 0x8C413016}, + {0x4D4C, 0xA140B028}, + {0x4D50, 0x00150A31}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x481C, 0x576DF814}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x481C, 0x576DF814}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x481C, 0x576BF814}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x481C, 0x576DF814}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x481C, 0x576DF814}, ++ {0xA0000000, 0x00000000}, ++ {0x481C, 0x576DF814}, ++ {0xB0000000, 0x00000000}, + {0x4820, 0xA08877AC}, + {0x4824, 0x0000007A}, + {0x4D54, 0x00001184}, +@@ -967,7 +1110,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4D78, 0x994C1502}, + {0x4D7C, 0x00017912}, + {0x4EDC, 0x00000001}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x484C, 0x0000CA62}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x484C, 0x00008A62}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x484C, 0x0000CA62}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, + {0x484C, 0x00008A62}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x484C, 0x00008A62}, ++ {0xA0000000, 0x00000000}, ++ {0x484C, 0x0000CA62}, ++ {0xB0000000, 0x00000000}, + {0x4D80, 0x00000002}, + {0x4850, 0x00000008}, + {0x4854, 0x009B902A}, +@@ -1014,7 +1169,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4DA0, 0x8C413016}, + {0x4DA4, 0xA140B028}, + {0x4DA8, 0x00150A31}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x48D4, 0x576DF814}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x48D4, 0x576BF814}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x48D4, 0x576BF814}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x48D4, 0x576BF814}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x48D4, 0x576BF814}, ++ {0xA0000000, 0x00000000}, + {0x48D4, 0x576DF814}, ++ {0xB0000000, 0x00000000}, + {0x48D8, 0xA08877AC}, + {0x48DC, 0x0000007A}, + {0x4DAC, 0x00001184}, +@@ -1039,7 +1206,19 @@ static const struct rtw89_reg2_def rtw89 + {0x4DD0, 0x994C1502}, + {0x4DD4, 0x00017912}, + {0x4EE4, 0x00000001}, +- {0x4904, 0x00008A62}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0xA0000000, 0x00000000}, ++ {0x4904, 0x0000CA62}, ++ {0xB0000000, 0x00000000}, + {0x4DD8, 0x00000002}, + {0x4908, 0x00000008}, + {0x490C, 0x80040000}, +@@ -1096,8 +1275,8 @@ static const struct rtw89_reg2_def rtw89 + {0x4988, 0x00000000}, + {0x498C, 0x00000000}, + {0x4E34, 0x00FC0000}, +- {0x4E38, 0x0000F800}, +- {0x4E3C, 0x00000001}, ++ {0x4E38, 0x00000000}, ++ {0x4E3C, 0x00000003}, + {0x4990, 0x00000000}, + {0x4994, 0x00000000}, + {0x4998, 0x00000000}, +@@ -1134,7 +1313,7 @@ static const struct rtw89_reg2_def rtw89 + {0x710, 0xEF810000}, + {0xC54, 0x1AE1436A}, + {0xC58, 0x41000000}, +- {0xC68, 0x10000050}, ++ {0xC68, 0x90000050}, + {0xC6C, 0x20061020}, + {0x704, 0x601E0100}, + {0xC74, 0x00000000}, +@@ -1225,12 +1404,12 @@ static const struct rtw89_reg2_def rtw89 + {0x328, 0xE000E000}, + {0x32C, 0x0041E000}, + {0x35C, 0x000004C4}, +- {0xC0D4, 0xA7C41460}, ++ {0xC0D4, 0xA7441460}, + {0xC0D8, 0xC6BA7F67}, + {0xC0DC, 0x30C52868}, + {0xC0E0, 0x75008128}, + {0xC0E4, 0x0000272B}, +- {0xC1D4, 0xA7C41460}, ++ {0xC1D4, 0xA7441460}, + {0xC1D8, 0xC6BA7F67}, + {0xC1DC, 0x30C52868}, + {0xC1E0, 0x75008128}, +@@ -1290,7 +1469,7 @@ static const struct rtw89_reg2_def rtw89 + {0xC8C, 0x02F2FC08}, + {0xC70, 0x071BFC00}, + {0x980, 0x10002251}, +- {0x988, 0x3C3C4107}, ++ {0x988, 0x3C3C8107}, + {0x904, 0x00000005}, + {0x994, 0x00000010}, + {0x000, 0x0580801F}, +@@ -1359,7 +1538,19 @@ static const struct rtw89_reg2_def rtw89 + {0x2310, 0xBC80536C}, + {0x2314, 0x0363A0F3}, + {0x2318, 0x000000BB}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x724, 0x00111200}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x724, 0x20111100}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x724, 0x20111100}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x724, 0x01100100}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x724, 0x01100100}, ++ {0xA0000000, 0x00000000}, + {0x724, 0x00111200}, ++ {0xB0000000, 0x00000000}, + {0x704, 0x601E0D00}, + {0xC78, 0xBFFFFFFF}, + {0x704, 0x601E0D02}, +@@ -1393,7 +1584,7 @@ static const struct rtw89_reg2_def rtw89 + {0xC60, 0x017FFFF3}, + {0xC70, 0x071BFE00}, + {0xC70, 0x071BFE60}, +- {0xC6C, 0x20061021}, ++ {0xC6C, 0x26061021}, + {0x58AC, 0x08000000}, + {0x78AC, 0x08000000}, + {0x8120, 0x10000000}, +@@ -1452,7 +1643,7 @@ static const struct rtw89_reg2_def rtw89 + {0x12A0, 0x24903056}, + {0x12AC, 0x12333121}, + {0x12B8, 0x30020000}, +- {0x2000, 0x18BBBF84}, ++ {0x2000, 0x20BBBF04}, + {0x2C14, 0x85000005}, + {0x3200, 0x00010142}, + {0x32A0, 0x24903056}, +@@ -1469,7 +1660,21 @@ static const struct rtw89_reg2_def rtw89 + {0x76C8, 0x0E800400}, + {0x984, 0x000000E0}, + {0x2008, 0x000FFFFF}, ++ {0x1210, 0x8049E304}, ++ {0x3210, 0x8049E304}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x58B0, 0x00000800}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x58B0, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x58B0, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x58B0, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x58B0, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x58B0, 0x00000800}, ++ {0xB0000000, 0x00000000}, + {0x5A00, 0x00000000}, + {0x5A04, 0x00000000}, + {0x5A08, 0x00000000}, +@@ -1479,7 +1684,19 @@ static const struct rtw89_reg2_def rtw89 + {0x5A18, 0x00000000}, + {0x5A1C, 0x00000000}, + {0x5A20, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x5A24, 0x00050000}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A24, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A24, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A24, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A24, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x5A24, 0x00050000}, ++ {0xB0000000, 0x00000000}, + {0x5A28, 0x00000000}, + {0x5A2C, 0x00000000}, + {0x5A30, 0x00000000}, +@@ -1487,14 +1704,38 @@ static const struct rtw89_reg2_def rtw89 + {0x5A38, 0x00000000}, + {0x5A3C, 0x00000000}, + {0x5A40, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A44, 0x00000005}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A44, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A44, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A44, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A44, 0x00000000}, ++ {0xA0000000, 0x00000000}, + {0x5A44, 0x00000005}, ++ {0xB0000000, 0x00000000}, + {0x5A48, 0x00000000}, + {0x5A4C, 0x00000000}, + {0x5A50, 0x00000000}, + {0x5A54, 0x00000000}, + {0x5A58, 0x00000000}, + {0x5A5C, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x5A60, 0x00050000}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A60, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A60, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A60, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5A60, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x5A60, 0x00050000}, ++ {0xB0000000, 0x00000000}, + {0x5A64, 0x00000000}, + {0x5A68, 0x00000000}, + {0x5A6C, 0x00000000}, +@@ -1514,12 +1755,49 @@ static const struct rtw89_reg2_def rtw89 + {0x5AA4, 0x00000000}, + {0x5AA8, 0x00000000}, + {0x5AAC, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x5AB0, 0x00050005}, + {0x5AB4, 0x00050005}, + {0x5AB8, 0x00050005}, + {0x5ABC, 0x00050005}, + {0x5AC0, 0x00000005}, + {0x78B0, 0x00000800}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5AB0, 0x00000000}, ++ {0x5AB4, 0x00000000}, ++ {0x5AB8, 0x00000000}, ++ {0x5ABC, 0x00000000}, ++ {0x5AC0, 0x00000000}, ++ {0x78B0, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5AB0, 0x00000000}, ++ {0x5AB4, 0x00000000}, ++ {0x5AB8, 0x00000000}, ++ {0x5ABC, 0x00000000}, ++ {0x5AC0, 0x00000000}, ++ {0x78B0, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5AB0, 0x00000000}, ++ {0x5AB4, 0x00000000}, ++ {0x5AB8, 0x00000000}, ++ {0x5ABC, 0x00000000}, ++ {0x5AC0, 0x00000000}, ++ {0x78B0, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x5AB0, 0x00000000}, ++ {0x5AB4, 0x00000000}, ++ {0x5AB8, 0x00000000}, ++ {0x5ABC, 0x00000000}, ++ {0x5AC0, 0x00000000}, ++ {0x78B0, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x5AB0, 0x00050005}, ++ {0x5AB4, 0x00050005}, ++ {0x5AB8, 0x00050005}, ++ {0x5ABC, 0x00050005}, ++ {0x5AC0, 0x00000005}, ++ {0x78B0, 0x00000800}, ++ {0xB0000000, 0x00000000}, + {0x7A00, 0x00000000}, + {0x7A04, 0x00000000}, + {0x7A08, 0x00000000}, +@@ -1529,7 +1807,19 @@ static const struct rtw89_reg2_def rtw89 + {0x7A18, 0x00000000}, + {0x7A1C, 0x00000000}, + {0x7A20, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x7A24, 0x00050000}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A24, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A24, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A24, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A24, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x7A24, 0x00050000}, ++ {0xB0000000, 0x00000000}, + {0x7A28, 0x00000000}, + {0x7A2C, 0x00000000}, + {0x7A30, 0x00000000}, +@@ -1537,14 +1827,38 @@ static const struct rtw89_reg2_def rtw89 + {0x7A38, 0x00000000}, + {0x7A3C, 0x00000000}, + {0x7A40, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x7A44, 0x00000005}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A44, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A44, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A44, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A44, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x7A44, 0x00000005}, ++ {0xB0000000, 0x00000000}, + {0x7A48, 0x00000000}, + {0x7A4C, 0x00000000}, + {0x7A50, 0x00000000}, + {0x7A54, 0x00000000}, + {0x7A58, 0x00000000}, + {0x7A5C, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A60, 0x00050000}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A60, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A60, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A60, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7A60, 0x00000000}, ++ {0xA0000000, 0x00000000}, + {0x7A60, 0x00050000}, ++ {0xB0000000, 0x00000000}, + {0x7A64, 0x00000000}, + {0x7A68, 0x00000000}, + {0x7A6C, 0x00000000}, +@@ -1564,143 +1878,223 @@ static const struct rtw89_reg2_def rtw89 + {0x7AA4, 0x00000000}, + {0x7AA8, 0x00000000}, + {0x7AAC, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x7AB0, 0x00050005}, + {0x7AB4, 0x00050005}, + {0x7AB8, 0x00050005}, + {0x7ABC, 0x00050005}, + {0x7AC0, 0x00000005}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7AB0, 0x00000000}, ++ {0x7AB4, 0x00000000}, ++ {0x7AB8, 0x00000000}, ++ {0x7ABC, 0x00000000}, ++ {0x7AC0, 0x00000000}, ++ {0x903400ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7AB0, 0x00000000}, ++ {0x7AB4, 0x00000000}, ++ {0x7AB8, 0x00000000}, ++ {0x7ABC, 0x00000000}, ++ {0x7AC0, 0x00000000}, ++ {0x903500ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7AB0, 0x00000000}, ++ {0x7AB4, 0x00000000}, ++ {0x7AB8, 0x00000000}, ++ {0x7ABC, 0x00000000}, ++ {0x7AC0, 0x00000000}, ++ {0x903600ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x7AB0, 0x00000000}, ++ {0x7AB4, 0x00000000}, ++ {0x7AB8, 0x00000000}, ++ {0x7ABC, 0x00000000}, ++ {0x7AC0, 0x00000000}, ++ {0xA0000000, 0x00000000}, ++ {0x7AB0, 0x00050005}, ++ {0x7AB4, 0x00050005}, ++ {0x7AB8, 0x00050005}, ++ {0x7ABC, 0x00050005}, ++ {0x7AC0, 0x00000005}, ++ {0xB0000000, 0x00000000}, + {0x0F0, 0x00010000}, +- {0x0F4, 0x00000018}, +- {0x0F8, 0x20220120}, ++ {0x0F4, 0x00000028}, ++ {0x0F8, 0x20220610}, + }; + + static const struct rtw89_reg2_def rtw89_8852c_phy_bb_reg_gain[] = { + {0xF0FF0000, 0x00000000}, + {0xF03300FF, 0x00000001}, +- {0x000, 0x01E3C39F}, +- {0x001, 0x00694727}, +- {0x002, 0x00005536}, +- {0x100, 0x02E3C39F}, +- {0x101, 0x0069472A}, ++ {0x000, 0x0EEECAA6}, ++ {0x001, 0x006C4B2C}, ++ {0x002, 0x00005636}, ++ {0x100, 0x0DEFCAA9}, ++ {0x101, 0x00694B2C}, + {0x102, 0x00005536}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x10000, 0x1A02E1C9}, + {0x10001, 0x00644A30}, + {0x10002, 0x00006750}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x10000, 0x0EF4D1B9}, +- {0x10001, 0x00584125}, +- {0x10002, 0x00006750}, ++ {0x10000, 0x0BF1CEB6}, ++ {0x10001, 0x00434328}, ++ {0x10002, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x10000, 0x1A02E1C9}, +- {0x10001, 0x00644A30}, +- {0x10002, 0x00006750}, ++ {0x10000, 0x1D08E8D0}, ++ {0x10001, 0x00644C32}, ++ {0x10002, 0x00006650}, + {0xB0000000, 0x00000000}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x10100, 0x1901E1C8}, + {0x10101, 0x0061482D}, + {0x10102, 0x00006750}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x10100, 0x04E8C5AD}, +- {0x10101, 0x00594125}, +- {0x10102, 0x00006850}, ++ {0x10100, 0x0BF0CEB8}, ++ {0x10101, 0x00424227}, ++ {0x10102, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x10100, 0x1901E1C8}, +- {0x10101, 0x0061482D}, +- {0x10102, 0x00006750}, ++ {0x10100, 0x1F0AECD5}, ++ {0x10101, 0x00634B31}, ++ {0x10102, 0x00006550}, + {0xB0000000, 0x00000000}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x20000, 0x1601E2CA}, + {0x20001, 0x005D452A}, + {0x20002, 0x00006750}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x20000, 0x0EF4D3BB}, +- {0x20001, 0x00563F25}, +- {0x20002, 0x00006850}, ++ {0x20000, 0x0EF5D3BB}, ++ {0x20001, 0x00454529}, ++ {0x20002, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x20000, 0x1601E2CA}, +- {0x20001, 0x005D452A}, +- {0x20002, 0x00006750}, ++ {0x20000, 0x1904E6CE}, ++ {0x20001, 0x0060482D}, ++ {0x20002, 0x00006650}, + {0xB0000000, 0x00000000}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x20100, 0x1901E1C8}, + {0x20101, 0x0061482D}, + {0x20102, 0x00006750}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x20100, 0x0BF1CFB7}, +- {0x20101, 0x00574025}, +- {0x20102, 0x00006750}, ++ {0x20100, 0x12F8D7C1}, ++ {0x20101, 0x004A4A2E}, ++ {0x20102, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x20100, 0x1901E1C8}, ++ {0x20100, 0x1F0AECD5}, + {0x20101, 0x0061482D}, +- {0x20102, 0x00006750}, ++ {0x20102, 0x00006550}, + {0xB0000000, 0x00000000}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x30000, 0x1700E1CA}, + {0x30001, 0x005E472B}, + {0x30002, 0x00006750}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x30000, 0x05EFCEB7}, +- {0x30001, 0x004B351A}, +- {0x30002, 0x00006850}, ++ {0x30000, 0x0DF6D5BE}, ++ {0x30001, 0x00414126}, ++ {0x30002, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x30000, 0x1700E1CA}, +- {0x30001, 0x005E472B}, +- {0x30002, 0x00006750}, ++ {0x30000, 0x14FEE0CA}, ++ {0x30001, 0x005C4328}, ++ {0x30002, 0x00006650}, + {0xB0000000, 0x00000000}, + {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x30100, 0x14FEE0C9}, + {0x30101, 0x00594428}, + {0x30102, 0x00006650}, + {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, +- {0x30100, 0x0CF2D1B9}, +- {0x30101, 0x00563F24}, +- {0x30102, 0x00006750}, ++ {0x30100, 0x0EF5D5C0}, ++ {0x30101, 0x0045452A}, ++ {0x30102, 0x00005050}, + {0xA0000000, 0x00000000}, +- {0x30100, 0x14FEE0C9}, +- {0x30101, 0x00594428}, ++ {0x30100, 0x1F0AECD8}, ++ {0x30101, 0x00654C31}, + {0x30102, 0x00006650}, + {0xB0000000, 0x00000000}, +- {0x40000, 0x13FCDDC8}, +- {0x40001, 0x005D4328}, +- {0x40002, 0x00006850}, +- {0x40100, 0x14FEE3CF}, +- {0x40101, 0x00583E24}, +- {0x40102, 0x00006850}, +- {0x50000, 0x0DF4D6C6}, +- {0x50001, 0x00604227}, +- {0x50002, 0x00006850}, +- {0x50100, 0x1903E7D5}, +- {0x50101, 0x0061462B}, +- {0x50102, 0x00006850}, +- {0x60000, 0x0FF5D7C6}, +- {0x60001, 0x005D4429}, +- {0x60002, 0x00006850}, +- {0x60100, 0x12FADECF}, +- {0x60101, 0x005B4126}, +- {0x60102, 0x00006850}, +- {0x70000, 0x09F1D2C3}, +- {0x70001, 0x00554026}, +- {0x70002, 0x00006750}, +- {0x70100, 0x0CF5DACC}, +- {0x70101, 0x00563E25}, +- {0x70102, 0x00006750}, ++ {0x40000, 0x15FEE0CB}, ++ {0x40001, 0x0060462B}, ++ {0x40002, 0x00006450}, ++ {0x40100, 0x1902E5D2}, ++ {0x40101, 0x0063482E}, ++ {0x40102, 0x00006450}, ++ {0x50000, 0x1C04E6D3}, ++ {0x50001, 0x006B5034}, ++ {0x50002, 0x00006450}, ++ {0x50100, 0x2009EDDB}, ++ {0x50101, 0x006B5035}, ++ {0x50102, 0x00006450}, ++ {0x60000, 0x16FEE1CF}, ++ {0x60001, 0x00634A2E}, ++ {0x60002, 0x00006550}, ++ {0x60100, 0x14FDE2D2}, ++ {0x60101, 0x005E4429}, ++ {0x60102, 0x00006450}, ++ {0x70000, 0x0BF3D6C6}, ++ {0x70001, 0x00573F24}, ++ {0x70002, 0x00006550}, ++ {0x70100, 0x08F0D6C7}, ++ {0x70101, 0x0052391E}, ++ {0x70102, 0x00006450}, + {0x2000000, 0x02E4C4A0}, + {0x2000001, 0x006A4828}, + {0x2000100, 0x02E4C5A1}, + {0x2000101, 0x00664629}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2010000, 0x05EBC8AF}, + {0x2010001, 0x00543D24}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2010000, 0x08EDCAB2}, ++ {0x2010001, 0x00434327}, ++ {0xA0000000, 0x00000000}, ++ {0x2010000, 0x05EBC8AF}, ++ {0x2010001, 0x00543D24}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2010100, 0x07ECC9B0}, + {0x2010101, 0x005B4126}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2010100, 0x08ECCBB2}, ++ {0x2010101, 0x003C3C20}, ++ {0xA0000000, 0x00000000}, ++ {0x2010100, 0x07ECC9B0}, ++ {0x2010101, 0x005B4126}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2020000, 0x05EDCCB2}, + {0x2020001, 0x004D361C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2020000, 0x0CF4D2BA}, ++ {0x2020001, 0x00404025}, ++ {0xA0000000, 0x00000000}, ++ {0x2020000, 0x05EDCCB2}, ++ {0x2020001, 0x004D361C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2020100, 0x06ECCBB2}, + {0x2020101, 0x00553D22}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2020100, 0x09EECDB8}, ++ {0x2020101, 0x00444428}, ++ {0xA0000000, 0x00000000}, ++ {0x2020100, 0x06ECCBB2}, ++ {0x2020101, 0x00553D22}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2030000, 0x02ECCCB3}, + {0x2030001, 0x00483118}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2030000, 0x0DF8D6BF}, ++ {0x2030001, 0x003F3F24}, ++ {0xA0000000, 0x00000000}, ++ {0x2030000, 0x02ECCCB3}, ++ {0x2030001, 0x00483118}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x2030100, 0x04ECCCB2}, + {0x2030101, 0x004F381C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x2030100, 0x08EFCDBA}, ++ {0x2030101, 0x00414126}, ++ {0xA0000000, 0x00000000}, ++ {0x2030100, 0x04ECCCB2}, ++ {0x2030101, 0x004F381C}, ++ {0xB0000000, 0x00000000}, + {0x3000000, 0x00000000}, + {0x3000001, 0x00000000}, + {0x3000002, 0x00000000}, +@@ -1709,30 +2103,102 @@ static const struct rtw89_reg2_def rtw89 + {0x3000101, 0x00000000}, + {0x3000102, 0x00000000}, + {0x3000103, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3010000, 0x0E0CFB0A}, ++ {0x3010001, 0x00100F06}, ++ {0x3010002, 0x34333333}, ++ {0x3010003, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3010000, 0x0E0CFB0A}, ++ {0x3010001, 0x00100F06}, ++ {0x3010002, 0x34333327}, ++ {0x3010003, 0x3434343C}, ++ {0xA0000000, 0x00000000}, + {0x3010000, 0x0E0CFB0A}, + {0x3010001, 0x00100F06}, + {0x3010002, 0x34333333}, + {0x3010003, 0x3434343C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x3010100, 0x0E0CFB0A}, + {0x3010101, 0x00100F06}, + {0x3010102, 0x34333333}, + {0x3010103, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3010100, 0x0E0CFB0A}, ++ {0x3010101, 0x00100F06}, ++ {0x3010102, 0x34333327}, ++ {0x3010103, 0x3434343C}, ++ {0xA0000000, 0x00000000}, ++ {0x3010100, 0x0E0CFB0A}, ++ {0x3010101, 0x00100F06}, ++ {0x3010102, 0x34333333}, ++ {0x3010103, 0x3434343C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x3020000, 0x0E0CFB0A}, + {0x3020001, 0x00100F06}, + {0x3020002, 0x34333333}, + {0x3020003, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3020000, 0x0E0CFB0A}, ++ {0x3020001, 0x00100F06}, ++ {0x3020002, 0x34333327}, ++ {0x3020003, 0x3434343C}, ++ {0xA0000000, 0x00000000}, ++ {0x3020000, 0x0E0CFB0A}, ++ {0x3020001, 0x00100F06}, ++ {0x3020002, 0x34333333}, ++ {0x3020003, 0x3434343C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x3020100, 0x0E0CFB0A}, + {0x3020101, 0x00100F06}, + {0x3020102, 0x34333333}, + {0x3020103, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3020100, 0x0E0CFB0A}, ++ {0x3020101, 0x00100F06}, ++ {0x3020102, 0x34333327}, ++ {0x3020103, 0x3434343C}, ++ {0xA0000000, 0x00000000}, ++ {0x3020100, 0x0E0CFB0A}, ++ {0x3020101, 0x00100F06}, ++ {0x3020102, 0x34333333}, ++ {0x3020103, 0x3434343C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x3030000, 0x0E0CFB0A}, + {0x3030001, 0x00100F06}, + {0x3030002, 0x34333333}, + {0x3030003, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3030000, 0x0E0CFB0A}, ++ {0x3030001, 0x00100F06}, ++ {0x3030002, 0x34333327}, ++ {0x3030003, 0x3434343C}, ++ {0xA0000000, 0x00000000}, ++ {0x3030000, 0x0E0CFB0A}, ++ {0x3030001, 0x00100F06}, ++ {0x3030002, 0x34333333}, ++ {0x3030003, 0x3434343C}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, + {0x3030100, 0x0E0CFB0A}, + {0x3030101, 0x00100F06}, + {0x3030102, 0x34333333}, + {0x3030103, 0x3434343C}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x3030100, 0x0E0CFB0A}, ++ {0x3030101, 0x00100F06}, ++ {0x3030102, 0x34333327}, ++ {0x3030103, 0x3434343C}, ++ {0xA0000000, 0x00000000}, ++ {0x3030100, 0x0E0CFB0A}, ++ {0x3030101, 0x00100F06}, ++ {0x3030102, 0x34333333}, ++ {0x3030103, 0x3434343C}, ++ {0xB0000000, 0x00000000}, + {0x3040000, 0x0E0CFB0A}, + {0x3040001, 0x00100F06}, + {0x3040002, 0x343B3333}, +@@ -1765,6 +2231,310 @@ static const struct rtw89_reg2_def rtw89 + {0x3070101, 0x00100F06}, + {0x3070102, 0x3C3B3333}, + {0x3070103, 0x34343C3C}, ++ {0x4000000, 0x00000000}, ++ {0x4000001, 0x76543210}, ++ {0x4000002, 0x77777777}, ++ {0x4000003, 0x35374425}, ++ {0x4000004, 0x00000043}, ++ {0x4000005, 0x000038E8}, ++ {0x4000100, 0x00000000}, ++ {0x4000101, 0x76543210}, ++ {0x4000102, 0x77777777}, ++ {0x4000103, 0x35374425}, ++ {0x4000104, 0x00000043}, ++ {0x4000105, 0x000038E8}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4010000, 0x00000000}, ++ {0x4010001, 0x76543210}, ++ {0x4010002, 0x77777777}, ++ {0x4010003, 0x35374425}, ++ {0x4010004, 0x00000042}, ++ {0x4010005, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4010000, 0x0000FC50}, ++ {0x4010001, 0x51403210}, ++ {0x4010002, 0x76543276}, ++ {0x4010003, 0x3A4DAA3C}, ++ {0x4010004, 0x00000093}, ++ {0x4010005, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4010000, 0x00000000}, ++ {0x4010001, 0x76543210}, ++ {0x4010002, 0x77777777}, ++ {0x4010003, 0x35374425}, ++ {0x4010004, 0x00000042}, ++ {0x4010005, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4010100, 0x00000000}, ++ {0x4010101, 0x76543210}, ++ {0x4010102, 0x77777777}, ++ {0x4010103, 0x35374425}, ++ {0x4010104, 0x00000042}, ++ {0x4010105, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4010100, 0x0000FC50}, ++ {0x4010101, 0x51403210}, ++ {0x4010102, 0x76543276}, ++ {0x4010103, 0x3A4DAA3C}, ++ {0x4010104, 0x00000093}, ++ {0x4010105, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4010100, 0x00000000}, ++ {0x4010101, 0x76543210}, ++ {0x4010102, 0x77777777}, ++ {0x4010103, 0x35374425}, ++ {0x4010104, 0x00000042}, ++ {0x4010105, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4020000, 0x00000000}, ++ {0x4020001, 0x76543210}, ++ {0x4020002, 0x77777777}, ++ {0x4020003, 0x35374425}, ++ {0x4020004, 0x00000042}, ++ {0x4020005, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4020000, 0x0000FC50}, ++ {0x4020001, 0x51403210}, ++ {0x4020002, 0x76543276}, ++ {0x4020003, 0x4B4DAA3C}, ++ {0x4020004, 0x000000A3}, ++ {0x4020005, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4020000, 0x00000000}, ++ {0x4020001, 0x76543210}, ++ {0x4020002, 0x77777777}, ++ {0x4020003, 0x35374425}, ++ {0x4020004, 0x00000042}, ++ {0x4020005, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4020100, 0x00000000}, ++ {0x4020101, 0x76543210}, ++ {0x4020102, 0x77777777}, ++ {0x4020103, 0x35374425}, ++ {0x4020104, 0x00000042}, ++ {0x4020105, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4020100, 0x0000FC50}, ++ {0x4020101, 0x51403210}, ++ {0x4020102, 0x76543276}, ++ {0x4020103, 0x3A4DAA3C}, ++ {0x4020104, 0x00000093}, ++ {0x4020105, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4020100, 0x00000000}, ++ {0x4020101, 0x76543210}, ++ {0x4020102, 0x77777777}, ++ {0x4020103, 0x35374425}, ++ {0x4020104, 0x00000042}, ++ {0x4020105, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4030000, 0x00000000}, ++ {0x4030001, 0x76543210}, ++ {0x4030002, 0x77777777}, ++ {0x4030003, 0x35374425}, ++ {0x4030004, 0x00000042}, ++ {0x4030005, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4030000, 0x0000FC50}, ++ {0x4030001, 0x51403210}, ++ {0x4030002, 0x76543276}, ++ {0x4030003, 0x3A4DAA3C}, ++ {0x4030004, 0x00000093}, ++ {0x4030005, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4030000, 0x00000000}, ++ {0x4030001, 0x76543210}, ++ {0x4030002, 0x77777777}, ++ {0x4030003, 0x35374425}, ++ {0x4030004, 0x00000042}, ++ {0x4030005, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4030100, 0x00000000}, ++ {0x4030101, 0x76543210}, ++ {0x4030102, 0x77777777}, ++ {0x4030103, 0x35374425}, ++ {0x4030104, 0x00000042}, ++ {0x4030105, 0x000038E8}, ++ {0x903300ff, 0x00000000}, {0x40000000, 0x00000000}, ++ {0x4030100, 0x0000FC50}, ++ {0x4030101, 0x51403210}, ++ {0x4030102, 0x76543276}, ++ {0x4030103, 0x3A4DAA3C}, ++ {0x4030104, 0x00000093}, ++ {0x4030105, 0x000040E4}, ++ {0xA0000000, 0x00000000}, ++ {0x4030100, 0x00000000}, ++ {0x4030101, 0x76543210}, ++ {0x4030102, 0x77777777}, ++ {0x4030103, 0x35374425}, ++ {0x4030104, 0x00000042}, ++ {0x4030105, 0x000038E8}, ++ {0xB0000000, 0x00000000}, ++ {0x1000000, 0x00000008}, ++ {0x1000010, 0x00000008}, ++ {0x1000011, 0x00000000}, ++ {0x1000100, 0x00000004}, ++ {0x1000110, 0x00000004}, ++ {0x1000111, 0x00000000}, ++ {0x1010000, 0x00000004}, ++ {0x1010010, 0x00000004}, ++ {0x1010011, 0x00000000}, ++ {0x1010020, 0x00000004}, ++ {0x1010021, 0x00000000}, ++ {0x1010029, 0x00000000}, ++ {0x1010030, 0x00000000}, ++ {0x1010031, 0x00000000}, ++ {0x1010035, 0x00000000}, ++ {0x1010039, 0x00000000}, ++ {0x101003D, 0x00000000}, ++ {0x1010100, 0x00000010}, ++ {0x1010110, 0x00000010}, ++ {0x1010111, 0x00000000}, ++ {0x1010120, 0x00000010}, ++ {0x1010121, 0x00000000}, ++ {0x1010129, 0x00000000}, ++ {0x1010030, 0x00000000}, ++ {0x1010031, 0x00000000}, ++ {0x1010035, 0x00000000}, ++ {0x1010039, 0x00000000}, ++ {0x101003D, 0x00000000}, ++ {0x1020000, 0x000000FA}, ++ {0x1020010, 0x000000FA}, ++ {0x1020011, 0x00000000}, ++ {0x1020020, 0x000000FA}, ++ {0x1020021, 0x00000000}, ++ {0x1020029, 0x00000000}, ++ {0x1020030, 0x00000000}, ++ {0x1020031, 0x00000000}, ++ {0x1020035, 0x00000000}, ++ {0x1020039, 0x00000000}, ++ {0x102003D, 0x00000000}, ++ {0x1020100, 0x0000000D}, ++ {0x1020110, 0x0000000D}, ++ {0x1020111, 0x00000000}, ++ {0x1020120, 0x0000000D}, ++ {0x1020121, 0x00000000}, ++ {0x1020129, 0x00000000}, ++ {0x1020030, 0x00000000}, ++ {0x1020031, 0x00000000}, ++ {0x1020035, 0x00000000}, ++ {0x1020039, 0x00000000}, ++ {0x102003D, 0x00000000}, ++ {0x1030000, 0x000000E4}, ++ {0x1030010, 0x000000E4}, ++ {0x1030011, 0x00000000}, ++ {0x1030020, 0x0000E8E8}, ++ {0x1030021, 0x00000000}, ++ {0x1030029, 0x00000000}, ++ {0x1030030, 0x00000000}, ++ {0x1030031, 0x00000000}, ++ {0x1030035, 0x00000000}, ++ {0x1030039, 0x00000000}, ++ {0x103003D, 0x00000000}, ++ {0x1030100, 0x00000018}, ++ {0x1030110, 0x00000018}, ++ {0x1030111, 0x00000000}, ++ {0x1030120, 0x00000018}, ++ {0x1030121, 0x00000000}, ++ {0x1030129, 0x00000000}, ++ {0x1030030, 0x00000000}, ++ {0x1030031, 0x00000000}, ++ {0x1030035, 0x00000000}, ++ {0x1030039, 0x00000000}, ++ {0x103003D, 0x00000000}, ++ {0x1040000, 0x000000EE}, ++ {0x1040010, 0x000000EE}, ++ {0x1040011, 0x00000000}, ++ {0x1040020, 0x000000EE}, ++ {0x1040021, 0x00000000}, ++ {0x1040029, 0x00000000}, ++ {0x1040030, 0x000000EE}, ++ {0x1040031, 0x00000000}, ++ {0x1040035, 0x00000000}, ++ {0x1040039, 0x00000000}, ++ {0x104003D, 0x00000000}, ++ {0x1040100, 0x00000000}, ++ {0x1040110, 0x00000005}, ++ {0x1040111, 0x00000000}, ++ {0x1040120, 0x00000008}, ++ {0x1040121, 0x00000000}, ++ {0x1040129, 0x00000000}, ++ {0x1040030, 0x00000008}, ++ {0x1040031, 0x00000000}, ++ {0x1040035, 0x00000000}, ++ {0x1040039, 0x00000000}, ++ {0x104003D, 0x00000000}, ++ {0x1050000, 0x00000008}, ++ {0x1050010, 0x0000000B}, ++ {0x1050011, 0x00000000}, ++ {0x1050020, 0x00000015}, ++ {0x1050021, 0x00000000}, ++ {0x1050029, 0x00000000}, ++ {0x1050030, 0x00000010}, ++ {0x1050031, 0x00000000}, ++ {0x1050035, 0x00000000}, ++ {0x1050039, 0x00000000}, ++ {0x105003D, 0x00000000}, ++ {0x1050100, 0x00000016}, ++ {0x1050110, 0x00000016}, ++ {0x1050111, 0x0000F8F8}, ++ {0x1050120, 0x0000001A}, ++ {0x1050121, 0x00000000}, ++ {0x1050129, 0x00000000}, ++ {0x1050030, 0x0000001A}, ++ {0x1050031, 0x00000000}, ++ {0x1050035, 0x00000000}, ++ {0x1050039, 0x00000000}, ++ {0x105003D, 0x00000000}, ++ {0x1060000, 0x000000F8}, ++ {0x1060010, 0x000000F8}, ++ {0x1060011, 0x00000000}, ++ {0x1060020, 0x00000000}, ++ {0x1060021, 0x00000000}, ++ {0x1060029, 0x00000000}, ++ {0x1060030, 0x00000000}, ++ {0x1060031, 0x00000000}, ++ {0x1060035, 0x00000000}, ++ {0x1060039, 0x00000000}, ++ {0x106003D, 0x00000000}, ++ {0x1060100, 0x000000F6}, ++ {0x1060110, 0x000000F6}, ++ {0x1060111, 0x00000000}, ++ {0x1060120, 0x000000F6}, ++ {0x1060121, 0x00000000}, ++ {0x1060129, 0x00000000}, ++ {0x1060030, 0x00000000}, ++ {0x1060031, 0x00000000}, ++ {0x1060035, 0x00000000}, ++ {0x1060039, 0x00000000}, ++ {0x106003D, 0x00000000}, ++ {0x1070000, 0x000000E8}, ++ {0x1070010, 0x000000E8}, ++ {0x1070011, 0x00000000}, ++ {0x1070020, 0x000000E8}, ++ {0x1070021, 0x00000000}, ++ {0x1070029, 0x00000000}, ++ {0x1070030, 0x000000F0}, ++ {0x1070031, 0x00000000}, ++ {0x1070035, 0x00000000}, ++ {0x1070039, 0x00000000}, ++ {0x107003D, 0x00000000}, ++ {0x1070100, 0x000000E4}, ++ {0x1070110, 0x000000E4}, ++ {0x1070111, 0x00000000}, ++ {0x1070120, 0x000000E4}, ++ {0x1070121, 0x00000000}, ++ {0x1070129, 0x00000000}, ++ {0x1070030, 0x000000F0}, ++ {0x1070031, 0x00000000}, ++ {0x1070035, 0x00000000}, ++ {0x1070039, 0x00000000}, ++ {0x107003D, 0x00000000}, + }; + + static const struct rtw89_reg2_def rtw89_8852c_phy_radioa_regs[] = { +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/txrx.h linux-6.2/drivers/net/wireless/realtek/rtw89/txrx.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/txrx.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/txrx.h 2022-12-24 00:49:25.786376835 +0200 +@@ -298,7 +298,9 @@ + le32_get_bits(*((const __le32 *)ie), GENMASK(11, 5)) + #define RTW89_GET_PHY_STS_IE01_CH_IDX(ie) \ + le32_get_bits(*((const __le32 *)ie), GENMASK(23, 16)) +-#define RTW89_GET_PHY_STS_IE01_CFO(ie) \ ++#define RTW89_GET_PHY_STS_IE01_FD_CFO(ie) \ ++ le32_get_bits(*((const __le32 *)(ie) + 1), GENMASK(19, 8)) ++#define RTW89_GET_PHY_STS_IE01_PREMB_CFO(ie) \ + le32_get_bits(*((const __le32 *)(ie) + 1), GENMASK(31, 20)) + + enum rtw89_tx_channel { +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/util.h linux-6.2/drivers/net/wireless/realtek/rtw89/util.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/util.h 2022-12-12 00:15:18.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/util.h 2022-12-24 00:49:25.786376835 +0200 +@@ -44,4 +44,15 @@ static inline s32 s32_div_u32_round_clos + return s32_div_u32_round_down(dividend + divisor / 2, divisor, NULL); + } + ++static inline void ether_addr_copy_mask(u8 *dst, const u8 *src, u8 mask) ++{ ++ int i; ++ ++ eth_zero_addr(dst); ++ for (i = 0; i < ETH_ALEN; i++) { ++ if (mask & BIT(i)) ++ dst[i] = src[i]; ++ } ++} ++ + #endif +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/wow.c linux-6.2/drivers/net/wireless/realtek/rtw89/wow.c +--- linux-6.1/drivers/net/wireless/realtek/rtw89/wow.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/wow.c 2022-12-24 00:49:25.786376835 +0200 +@@ -0,0 +1,859 @@ ++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause ++/* Copyright(c) 2019-2022 Realtek Corporation ++ */ ++#include "cam.h" ++#include "core.h" ++#include "debug.h" ++#include "fw.h" ++#include "mac.h" ++#include "phy.h" ++#include "ps.h" ++#include "reg.h" ++#include "util.h" ++#include "wow.h" ++ ++static void rtw89_wow_leave_deep_ps(struct rtw89_dev *rtwdev) ++{ ++ __rtw89_leave_ps_mode(rtwdev); ++} ++ ++static void rtw89_wow_enter_deep_ps(struct rtw89_dev *rtwdev) ++{ ++ struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; ++ ++ __rtw89_enter_ps_mode(rtwdev, rtwvif); ++} ++ ++static void rtw89_wow_enter_lps(struct rtw89_dev *rtwdev) ++{ ++ struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; ++ ++ rtw89_enter_lps(rtwdev, rtwvif); ++} ++ ++static void rtw89_wow_leave_lps(struct rtw89_dev *rtwdev) ++{ ++ rtw89_leave_lps(rtwdev); ++} ++ ++static int rtw89_wow_config_mac(struct rtw89_dev *rtwdev, bool enable_wow) ++{ ++ int ret; ++ ++ if (enable_wow) { ++ ret = rtw89_mac_resize_ple_rx_quota(rtwdev, true); ++ if (ret) { ++ rtw89_err(rtwdev, "[ERR]patch rx qta %d\n", ret); ++ return ret; ++ } ++ rtw89_write32_set(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP); ++ rtw89_write32_clr(rtwdev, R_AX_RX_FLTR_OPT, B_AX_SNIFFER_MODE); ++ rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); ++ rtw89_write32(rtwdev, R_AX_ACTION_FWD0, 0); ++ rtw89_write32(rtwdev, R_AX_ACTION_FWD1, 0); ++ rtw89_write32(rtwdev, R_AX_TF_FWD, 0); ++ rtw89_write32(rtwdev, R_AX_HW_RPT_FWD, 0); ++ } else { ++ ret = rtw89_mac_resize_ple_rx_quota(rtwdev, false); ++ if (ret) { ++ rtw89_err(rtwdev, "[ERR]patch rx qta %d\n", ret); ++ return ret; ++ } ++ rtw89_write32_clr(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP); ++ rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true); ++ rtw89_write32(rtwdev, R_AX_ACTION_FWD0, TRXCFG_MPDU_PROC_ACT_FRWD); ++ rtw89_write32(rtwdev, R_AX_TF_FWD, TRXCFG_MPDU_PROC_TF_FRWD); ++ } ++ ++ return 0; ++} ++ ++static void rtw89_wow_set_rx_filter(struct rtw89_dev *rtwdev, bool enable) ++{ ++ enum rtw89_mac_fwd_target fwd_target = enable ? ++ RTW89_FWD_DONT_CARE : ++ RTW89_FWD_TO_HOST; ++ ++ rtw89_mac_typ_fltr_opt(rtwdev, RTW89_MGNT, fwd_target, RTW89_MAC_0); ++ rtw89_mac_typ_fltr_opt(rtwdev, RTW89_CTRL, fwd_target, RTW89_MAC_0); ++ rtw89_mac_typ_fltr_opt(rtwdev, RTW89_DATA, fwd_target, RTW89_MAC_0); ++} ++ ++static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev) ++{ ++ enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; ++ struct cfg80211_wowlan_nd_info nd_info; ++ struct cfg80211_wowlan_wakeup wakeup = { ++ .pattern_idx = -1, ++ }; ++ u32 wow_reason_reg; ++ u8 reason; ++ ++ if (chip_id == RTL8852A || chip_id == RTL8852B) ++ wow_reason_reg = R_AX_C2HREG_DATA3 + 3; ++ else ++ wow_reason_reg = R_AX_C2HREG_DATA3_V1 + 3; ++ ++ reason = rtw89_read8(rtwdev, wow_reason_reg); ++ ++ switch (reason) { ++ case RTW89_WOW_RSN_RX_DEAUTH: ++ wakeup.disconnect = true; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx deauth\n"); ++ break; ++ case RTW89_WOW_RSN_DISCONNECT: ++ wakeup.disconnect = true; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: AP is off\n"); ++ break; ++ case RTW89_WOW_RSN_RX_MAGIC_PKT: ++ wakeup.magic_pkt = true; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx magic packet\n"); ++ break; ++ case RTW89_WOW_RSN_RX_GTK_REKEY: ++ wakeup.gtk_rekey_failure = true; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx gtk rekey\n"); ++ break; ++ case RTW89_WOW_RSN_RX_PATTERN_MATCH: ++ /* Current firmware and driver don't report pattern index ++ * Use pattern_idx to 0 defaultly. ++ */ ++ wakeup.pattern_idx = 0; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: Rx pattern match packet\n"); ++ break; ++ case RTW89_WOW_RSN_RX_NLO: ++ /* Current firmware and driver don't report ssid index. ++ * Use 0 for n_matches based on its comment. ++ */ ++ nd_info.n_matches = 0; ++ wakeup.net_detect = &nd_info; ++ rtw89_debug(rtwdev, RTW89_DBG_WOW, "Rx NLO\n"); ++ break; ++ default: ++ rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason); ++ ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL, ++ GFP_KERNEL); ++ return; ++ } ++ ++ ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup, ++ GFP_KERNEL); ++} ++ ++static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); ++ ++ /* Current wowlan function support setting of only one STATION vif. ++ * So when one suitable vif is found, stop the iteration. ++ */ ++ if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION) ++ return; ++ ++ switch (rtwvif->net_type) { ++ case RTW89_NET_TYPE_INFRA: ++ rtw_wow->wow_vif = vif; ++ break; ++ case RTW89_NET_TYPE_NO_LINK: ++ default: ++ break; ++ } ++} ++ ++static u16 __rtw89_cal_crc16(u8 data, u16 crc) ++{ ++ u8 shift_in, data_bit; ++ u8 crc_bit4, crc_bit11, crc_bit15; ++ u16 crc_result; ++ int index; ++ ++ for (index = 0; index < 8; index++) { ++ crc_bit15 = crc & BIT(15) ? 1 : 0; ++ data_bit = data & BIT(index) ? 1 : 0; ++ shift_in = crc_bit15 ^ data_bit; ++ ++ crc_result = crc << 1; ++ ++ if (shift_in == 0) ++ crc_result &= ~BIT(0); ++ else ++ crc_result |= BIT(0); ++ ++ crc_bit11 = (crc & BIT(11) ? 1 : 0) ^ shift_in; ++ ++ if (crc_bit11 == 0) ++ crc_result &= ~BIT(12); ++ else ++ crc_result |= BIT(12); ++ ++ crc_bit4 = (crc & BIT(4) ? 1 : 0) ^ shift_in; ++ ++ if (crc_bit4 == 0) ++ crc_result &= ~BIT(5); ++ else ++ crc_result |= BIT(5); ++ ++ crc = crc_result; ++ } ++ return crc; ++} ++ ++static u16 rtw89_calc_crc(u8 *pdata, int length) ++{ ++ u16 crc = 0xffff; ++ int i; ++ ++ for (i = 0; i < length; i++) ++ crc = __rtw89_cal_crc16(pdata[i], crc); ++ ++ /* get 1' complement */ ++ return ~crc; ++} ++ ++static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif, ++ struct rtw89_wow_cam_info *rtw_pattern, ++ const u8 *pattern, u8 da_mask) ++{ ++ u8 da[ETH_ALEN]; ++ ++ ether_addr_copy_mask(da, pattern, da_mask); ++ ++ /* Each pattern is divided into different kinds by DA address ++ * a. DA is broadcast address: set bc = 0; ++ * b. DA is multicast address: set mc = 0 ++ * c. DA is unicast address same as dev's mac address: set uc = 0 ++ * d. DA is unmasked. Also called wildcard type: set uc = bc = mc = 0 ++ * e. Others is invalid type. ++ */ ++ ++ if (is_broadcast_ether_addr(da)) ++ rtw_pattern->bc = true; ++ else if (is_multicast_ether_addr(da)) ++ rtw_pattern->mc = true; ++ else if (ether_addr_equal(da, rtwvif->mac_addr) && ++ da_mask == GENMASK(5, 0)) ++ rtw_pattern->uc = true; ++ else if (!da_mask) /*da_mask == 0 mean wildcard*/ ++ return 0; ++ else ++ return -EPERM; ++ ++ return 0; ++} ++ ++static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ const struct cfg80211_pkt_pattern *pkt_pattern, ++ struct rtw89_wow_cam_info *rtw_pattern) ++{ ++ u8 mask_hw[RTW89_MAX_PATTERN_MASK_SIZE * 4] = {0}; ++ u8 content[RTW89_MAX_PATTERN_SIZE] = {0}; ++ const u8 *mask; ++ const u8 *pattern; ++ u8 mask_len; ++ u16 count; ++ u32 len; ++ int i, ret; ++ ++ pattern = pkt_pattern->pattern; ++ len = pkt_pattern->pattern_len; ++ mask = pkt_pattern->mask; ++ mask_len = DIV_ROUND_UP(len, 8); ++ memset(rtw_pattern, 0, sizeof(*rtw_pattern)); ++ ++ ret = rtw89_wow_pattern_get_type(rtwvif, rtw_pattern, pattern, ++ mask[0] & GENMASK(5, 0)); ++ if (ret) ++ return ret; ++ ++ /* translate mask from os to mask for hw ++ * pattern from OS uses 'ethenet frame', like this: ++ * | 6 | 6 | 2 | 20 | Variable | 4 | ++ * |--------+--------+------+-----------+------------+-----| ++ * | 802.3 Mac Header | IP Header | TCP Packet | FCS | ++ * | DA | SA | Type | ++ * ++ * BUT, packet catched by our HW is in '802.11 frame', begin from LLC ++ * | 24 or 30 | 6 | 2 | 20 | Variable | 4 | ++ * |-------------------+--------+------+-----------+------------+-----| ++ * | 802.11 MAC Header | LLC | IP Header | TCP Packet | FCS | ++ * | Others | Tpye | ++ * ++ * Therefore, we need translate mask_from_OS to mask_to_hw. ++ * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0, ++ * because new mask[0~5] means 'SA', but our HW packet begins from LLC, ++ * bit[0~5] corresponds to first 6 Bytes in LLC, they just don't match. ++ */ ++ ++ /* Shift 6 bits */ ++ for (i = 0; i < mask_len - 1; i++) { ++ mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)) | ++ u8_get_bits(mask[i + 1], GENMASK(5, 0)) << 2; ++ } ++ mask_hw[i] = u8_get_bits(mask[i], GENMASK(7, 6)); ++ ++ /* Set bit 0-5 to zero */ ++ mask_hw[0] &= ~GENMASK(5, 0); ++ ++ memcpy(rtw_pattern->mask, mask_hw, sizeof(rtw_pattern->mask)); ++ ++ /* To get the wake up pattern from the mask. ++ * We do not count first 12 bits which means ++ * DA[6] and SA[6] in the pattern to match HW design. ++ */ ++ count = 0; ++ for (i = 12; i < len; i++) { ++ if ((mask[i / 8] >> (i % 8)) & 0x01) { ++ content[count] = pattern[i]; ++ count++; ++ } ++ } ++ ++ rtw_pattern->crc = rtw89_calc_crc(content, count); ++ ++ return 0; ++} ++ ++static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev, ++ struct rtw89_vif *rtwvif, ++ struct cfg80211_wowlan *wowlan) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; ++ int i; ++ int ret; ++ ++ if (!wowlan->n_patterns || !wowlan->patterns) ++ return 0; ++ ++ for (i = 0; i < wowlan->n_patterns; i++) { ++ rtw_pattern = &rtw_wow->patterns[i]; ++ ret = rtw89_wow_pattern_generate(rtwdev, rtwvif, ++ &wowlan->patterns[i], ++ rtw_pattern); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to generate pattern(%d)\n", i); ++ rtw_wow->pattern_cnt = 0; ++ return ret; ++ } ++ ++ rtw_pattern->r_w = true; ++ rtw_pattern->idx = i; ++ rtw_pattern->negative_pattern_match = false; ++ rtw_pattern->skip_mac_hdr = true; ++ rtw_pattern->valid = true; ++ } ++ rtw_wow->pattern_cnt = wowlan->n_patterns; ++ ++ return 0; ++} ++ ++static void rtw89_wow_pattern_clear_cam(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; ++ int i = 0; ++ ++ for (i = 0; i < rtw_wow->pattern_cnt; i++) { ++ rtw_pattern = &rtw_wow->patterns[i]; ++ rtw_pattern->valid = false; ++ rtw89_fw_wow_cam_update(rtwdev, rtw_pattern); ++ } ++} ++ ++static void rtw89_wow_pattern_write(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_wow_cam_info *rtw_pattern = rtw_wow->patterns; ++ int i; ++ ++ for (i = 0; i < rtw_wow->pattern_cnt; i++) ++ rtw89_fw_wow_cam_update(rtwdev, rtw_pattern + i); ++} ++ ++static void rtw89_wow_pattern_clear(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ ++ rtw89_wow_pattern_clear_cam(rtwdev); ++ ++ rtw_wow->pattern_cnt = 0; ++ memset(rtw_wow->patterns, 0, sizeof(rtw_wow->patterns)); ++} ++ ++static void rtw89_wow_clear_wakeups(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ ++ rtw_wow->wow_vif = NULL; ++ rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM); ++ rtw_wow->pattern_cnt = 0; ++} ++ ++static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev, ++ struct cfg80211_wowlan *wowlan) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_vif *rtwvif; ++ ++ if (wowlan->disconnect) ++ set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags); ++ if (wowlan->magic_pkt) ++ set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags); ++ ++ rtw89_for_each_rtwvif(rtwdev, rtwvif) ++ rtw89_wow_vif_iter(rtwdev, rtwvif); ++ ++ if (!rtw_wow->wow_vif) ++ return -EPERM; ++ ++ rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; ++ return rtw89_wow_parse_patterns(rtwdev, rtwvif, wowlan); ++} ++ ++static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; ++ struct ieee80211_sta *wow_sta; ++ struct rtw89_sta *rtwsta = NULL; ++ bool is_conn = true; ++ int ret; ++ ++ wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); ++ if (wow_sta) ++ rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; ++ else ++ is_conn = false; ++ ++ if (wow) { ++ if (rtw_wow->pattern_cnt) ++ rtwvif->wowlan_pattern = true; ++ if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags)) ++ rtwvif->wowlan_magic = true; ++ } else { ++ rtwvif->wowlan_pattern = false; ++ rtwvif->wowlan_magic = false; ++ } ++ ++ ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n"); ++ return ret; ++ } ++ ++ if (wow) { ++ ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n", ++ ret); ++ return ret; ++ } ++ } ++ ++ ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, !is_conn); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c join info\n"); ++ return ret; ++ } ++ ++ ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c cam\n"); ++ return ret; ++ } ++ ++ ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to fw wow global\n"); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int rtw89_wow_check_fw_status(struct rtw89_dev *rtwdev, bool wow_enable) ++{ ++ u8 polling; ++ int ret; ++ ++ ret = read_poll_timeout_atomic(rtw89_read8_mask, polling, ++ wow_enable == !!polling, ++ 50, 50000, false, rtwdev, ++ R_AX_WOW_CTRL, B_AX_WOW_WOWEN); ++ if (ret) ++ rtw89_err(rtwdev, "failed to check wow status %s\n", ++ wow_enable ? "enabled" : "disabled"); ++ return ret; ++} ++ ++static void rtw89_wow_release_pkt_list(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct list_head *pkt_list = &rtw_wow->pkt_list; ++ struct rtw89_pktofld_info *info, *tmp; ++ ++ list_for_each_entry_safe(info, tmp, pkt_list, list) { ++ rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id); ++ rtw89_core_release_bit_map(rtwdev->pkt_offload, ++ info->id); ++ list_del(&info->list); ++ kfree(info); ++ } ++} ++ ++static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow) ++{ ++ enum rtw89_fw_type fw_type = wow ? RTW89_FW_WOWLAN : RTW89_FW_NORMAL; ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct ieee80211_vif *wow_vif = rtw_wow->wow_vif; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv; ++ struct ieee80211_sta *wow_sta; ++ struct rtw89_sta *rtwsta = NULL; ++ bool is_conn = true; ++ int ret; ++ ++ rtw89_hci_disable_intr(rtwdev); ++ ++ wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid); ++ if (wow_sta) ++ rtwsta = (struct rtw89_sta *)wow_sta->drv_priv; ++ else ++ is_conn = false; ++ ++ ret = rtw89_fw_download(rtwdev, fw_type); ++ if (ret) { ++ rtw89_warn(rtwdev, "download fw failed\n"); ++ return ret; ++ } ++ ++ rtw89_phy_init_rf_reg(rtwdev, true); ++ ++ ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta, ++ RTW89_ROLE_FW_RESTORE); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c role maintain\n"); ++ return ret; ++ } ++ ++ ret = rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, wow_vif, wow_sta); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c assoc cmac tbl\n"); ++ return ret; ++ } ++ ++ if (!is_conn) ++ rtw89_cam_reset_keys(rtwdev); ++ ++ ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, !is_conn); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c join info\n"); ++ return ret; ++ } ++ ++ ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL); ++ if (ret) { ++ rtw89_warn(rtwdev, "failed to send h2c cam\n"); ++ return ret; ++ } ++ ++ if (is_conn) { ++ rtw89_phy_ra_assoc(rtwdev, wow_sta); ++ rtw89_phy_set_bss_color(rtwdev, wow_vif); ++ rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, wow_vif); ++ } ++ ++ rtw89_mac_hw_mgnt_sec(rtwdev, wow); ++ rtw89_hci_enable_intr(rtwdev); ++ ++ return 0; ++} ++ ++static int rtw89_wow_enable_trx_pre(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ rtw89_hci_ctrl_txdma_ch(rtwdev, false); ++ rtw89_hci_ctrl_txdma_fw_ch(rtwdev, true); ++ ++ rtw89_mac_ptk_drop_by_band_and_wait(rtwdev, RTW89_MAC_0); ++ ++ ret = rtw89_hci_poll_txdma_ch(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "txdma ch busy\n"); ++ return ret; ++ } ++ rtw89_wow_set_rx_filter(rtwdev, true); ++ ++ ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); ++ if (ret) { ++ rtw89_err(rtwdev, "cfg ppdu status\n"); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int rtw89_wow_enable_trx_post(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ rtw89_hci_disable_intr(rtwdev); ++ rtw89_hci_ctrl_trxhci(rtwdev, false); ++ ++ ret = rtw89_hci_poll_txdma_ch(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to poll txdma ch idle pcie\n"); ++ return ret; ++ } ++ ++ ret = rtw89_wow_config_mac(rtwdev, true); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to config mac\n"); ++ return ret; ++ } ++ ++ rtw89_wow_set_rx_filter(rtwdev, false); ++ rtw89_hci_reset(rtwdev); ++ ++ return 0; ++} ++ ++static int rtw89_wow_disable_trx_pre(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ rtw89_hci_clr_idx_all(rtwdev); ++ ++ ret = rtw89_hci_rst_bdram(rtwdev); ++ if (ret) { ++ rtw89_warn(rtwdev, "reset bdram busy\n"); ++ return ret; ++ } ++ ++ rtw89_hci_ctrl_trxhci(rtwdev, true); ++ rtw89_hci_ctrl_txdma_ch(rtwdev, true); ++ ++ ret = rtw89_wow_config_mac(rtwdev, false); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to config mac\n"); ++ return ret; ++ } ++ rtw89_hci_enable_intr(rtwdev); ++ ++ return 0; ++} ++ ++static int rtw89_wow_disable_trx_post(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true); ++ if (ret) ++ rtw89_err(rtwdev, "cfg ppdu status\n"); ++ ++ return ret; ++} ++ ++static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; ++ int ret; ++ ++ rtw89_wow_pattern_write(rtwdev); ++ ++ ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to enable keep alive\n"); ++ return ret; ++ } ++ ++ ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_cfg_wake(rtwdev, true); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to config wake\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_check_fw_status(rtwdev, true); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to check enable fw ready\n"); ++ goto out; ++ } ++ ++out: ++ return ret; ++} ++ ++static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev) ++{ ++ struct rtw89_wow_param *rtw_wow = &rtwdev->wow; ++ struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv; ++ int ret; ++ ++ rtw89_wow_pattern_clear(rtwdev); ++ ++ ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable keep alive\n"); ++ goto out; ++ } ++ ++ rtw89_wow_release_pkt_list(rtwdev); ++ ++ ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_cfg_wake(rtwdev, false); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable config wake\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_check_fw_status(rtwdev, false); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to check disable fw ready\n"); ++ goto out; ++ } ++ ++out: ++ return ret; ++} ++ ++static int rtw89_wow_enable(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ set_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); ++ ++ ret = rtw89_wow_enable_trx_pre(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to enable trx_pre\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_swap_fw(rtwdev, true); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to swap to wow fw\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_fw_start(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to let wow fw start\n"); ++ goto out; ++ } ++ ++ rtw89_wow_enter_lps(rtwdev); ++ ++ ret = rtw89_wow_enable_trx_post(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to enable trx_post\n"); ++ goto out; ++ } ++ ++ return 0; ++ ++out: ++ clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); ++ return ret; ++} ++ ++static int rtw89_wow_disable(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ ret = rtw89_wow_disable_trx_pre(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable trx_pre\n"); ++ goto out; ++ } ++ ++ rtw89_wow_leave_lps(rtwdev); ++ ++ ret = rtw89_wow_fw_stop(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to swap to normal fw\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_swap_fw(rtwdev, false); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable trx_post\n"); ++ goto out; ++ } ++ ++ ret = rtw89_wow_disable_trx_post(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "wow: failed to disable trx_pre\n"); ++ goto out; ++ } ++ ++out: ++ clear_bit(RTW89_FLAG_WOWLAN, rtwdev->flags); ++ return ret; ++} ++ ++int rtw89_wow_resume(struct rtw89_dev *rtwdev) ++{ ++ int ret; ++ ++ if (!test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags)) { ++ rtw89_err(rtwdev, "wow is not enabled\n"); ++ ret = -EPERM; ++ goto out; ++ } ++ ++ if (!rtw89_mac_get_power_state(rtwdev)) { ++ rtw89_err(rtwdev, "chip is no power when resume\n"); ++ ret = -EPERM; ++ goto out; ++ } ++ ++ rtw89_wow_leave_deep_ps(rtwdev); ++ ++ rtw89_wow_show_wakeup_reason(rtwdev); ++ ++ ret = rtw89_wow_disable(rtwdev); ++ if (ret) ++ rtw89_err(rtwdev, "failed to disable wow\n"); ++ ++out: ++ rtw89_wow_clear_wakeups(rtwdev); ++ return ret; ++} ++ ++int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan) ++{ ++ int ret; ++ ++ ret = rtw89_wow_set_wakeups(rtwdev, wowlan); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to set wakeup event\n"); ++ return ret; ++ } ++ ++ rtw89_wow_leave_lps(rtwdev); ++ ++ ret = rtw89_wow_enable(rtwdev); ++ if (ret) { ++ rtw89_err(rtwdev, "failed to enable wow\n"); ++ return ret; ++ } ++ ++ rtw89_wow_enter_deep_ps(rtwdev); ++ ++ return 0; ++} +diff -Nurp linux-6.1/drivers/net/wireless/realtek/rtw89/wow.h linux-6.2/drivers/net/wireless/realtek/rtw89/wow.h +--- linux-6.1/drivers/net/wireless/realtek/rtw89/wow.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.2/drivers/net/wireless/realtek/rtw89/wow.h 2022-12-24 00:49:25.786376835 +0200 +@@ -0,0 +1,21 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2019-2022 Realtek Corporation ++ */ ++ ++#ifndef __RTW89_WOW_H__ ++#define __RTW89_WOW_H__ ++ ++enum rtw89_wake_reason { ++ RTW89_WOW_RSN_RX_PTK_REKEY = 0x1, ++ RTW89_WOW_RSN_RX_GTK_REKEY = 0x2, ++ RTW89_WOW_RSN_RX_DEAUTH = 0x8, ++ RTW89_WOW_RSN_DISCONNECT = 0x10, ++ RTW89_WOW_RSN_RX_MAGIC_PKT = 0x21, ++ RTW89_WOW_RSN_RX_PATTERN_MATCH = 0x23, ++ RTW89_WOW_RSN_RX_NLO = 0x55, ++}; ++ ++int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan); ++int rtw89_wow_resume(struct rtw89_dev *rtwdev); ++ ++#endif diff --git a/kernel/tools/perf/files/patches/mageia/platform-x86-add-shuttle-wmi-driver.patch b/kernel/tools/perf/files/patches/mageia/platform-x86-add-shuttle-wmi-driver.patch index dfe13ed441..257b0d70b2 100644 --- a/kernel/tools/perf/files/patches/mageia/platform-x86-add-shuttle-wmi-driver.patch +++ b/kernel/tools/perf/files/patches/mageia/platform-x86-add-shuttle-wmi-driver.patch @@ -6,9 +6,9 @@ drivers/platform/x86/shuttle-wmi.c | 1297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1393 insertions(+) -diff -Nurp linux-5.15.1/Documentation/ABI/testing/sysfs-platform-shuttle-wmi linux-5.15.1-shuttle/Documentation/ABI/testing/sysfs-platform-shuttle-wmi ---- linux-5.15.1/Documentation/ABI/testing/sysfs-platform-shuttle-wmi 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.1-shuttle/Documentation/ABI/testing/sysfs-platform-shuttle-wmi 2021-11-08 23:24:45.468092228 +0200 +diff -up linux-6.11/Documentation/ABI/testing/sysfs-platform-shuttle-wmi.wmi linux-6.11/Documentation/ABI/testing/sysfs-platform-shuttle-wmi +--- linux-6.11/Documentation/ABI/testing/sysfs-platform-shuttle-wmi.wmi 2024-11-18 10:43:15.072608505 +0100 ++++ linux-6.11/Documentation/ABI/testing/sysfs-platform-shuttle-wmi 2024-11-18 10:43:15.072608505 +0100 @@ -0,0 +1,72 @@ +What: /sys/devices/platform/shuttle_wmi/lcd_auto_adjust +Date: December 2010 @@ -82,10 +82,10 @@ diff -Nurp linux-5.15.1/Documentation/ABI/testing/sysfs-platform-shuttle-wmi lin + shuttle wmi documentation. It also starts an auto adjust and + color adjust cycle. The function should only work in shuttle + machines with LCD attached to an analog VGA connector. -diff -Nurp linux-5.15.1/drivers/platform/x86/Kconfig linux-5.15.1-shuttle/drivers/platform/x86/Kconfig ---- linux-5.15.1/drivers/platform/x86/Kconfig 2021-10-31 22:53:10.000000000 +0200 -+++ linux-5.15.1-shuttle/drivers/platform/x86/Kconfig 2021-11-08 23:24:45.469092275 +0200 -@@ -879,6 +879,21 @@ config PANASONIC_LAPTOP +diff -up linux-6.11/drivers/platform/x86/Kconfig.wmi linux-6.11/drivers/platform/x86/Kconfig +--- linux-6.11/drivers/platform/x86/Kconfig.wmi 2024-11-18 00:42:21.841340904 +0100 ++++ linux-6.11/drivers/platform/x86/Kconfig 2024-11-18 10:43:15.072608505 +0100 +@@ -947,6 +947,21 @@ config PANASONIC_LAPTOP If you have a Panasonic Let's note laptop (such as the R1(N variant), R2, R3, R5, T2, W2 and Y2 series), say Y. @@ -107,10 +107,10 @@ diff -Nurp linux-5.15.1/drivers/platform/x86/Kconfig linux-5.15.1-shuttle/driver config SONY_LAPTOP tristate "Sony Laptop Extras" depends on ACPI -diff -Nurp linux-5.15.1/drivers/platform/x86/Makefile linux-5.15.1-shuttle/drivers/platform/x86/Makefile ---- linux-5.15.1/drivers/platform/x86/Makefile 2021-10-31 22:53:10.000000000 +0200 -+++ linux-5.15.1-shuttle/drivers/platform/x86/Makefile 2021-11-08 23:24:45.469092275 +0200 -@@ -84,6 +84,9 @@ obj-$(CONFIG_PCENGINES_APU2) += pcengine +diff -up linux-6.11/drivers/platform/x86/Makefile.wmi linux-6.11/drivers/platform/x86/Makefile +--- linux-6.11/drivers/platform/x86/Makefile.wmi 2024-09-15 16:57:56.000000000 +0200 ++++ linux-6.11/drivers/platform/x86/Makefile 2024-11-18 10:43:15.072608505 +0100 +@@ -98,6 +98,9 @@ obj-$(CONFIG_BARCO_P50_GPIO) += barco-p5 obj-$(CONFIG_SAMSUNG_LAPTOP) += samsung-laptop.o obj-$(CONFIG_SAMSUNG_Q10) += samsung-q10.o @@ -120,9 +120,9 @@ diff -Nurp linux-5.15.1/drivers/platform/x86/Makefile linux-5.15.1-shuttle/drive # Toshiba obj-$(CONFIG_TOSHIBA_BT_RFKILL) += toshiba_bluetooth.o obj-$(CONFIG_TOSHIBA_HAPS) += toshiba_haps.o -diff -Nurp linux-5.15.1/drivers/platform/x86/shuttle-wmi.c linux-5.15.1-shuttle/drivers/platform/x86/shuttle-wmi.c ---- linux-5.15.1/drivers/platform/x86/shuttle-wmi.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.15.1-shuttle/drivers/platform/x86/shuttle-wmi.c 2021-11-08 23:24:45.468092228 +0200 +diff -up linux-6.11/drivers/platform/x86/shuttle-wmi.c.wmi linux-6.11/drivers/platform/x86/shuttle-wmi.c +--- linux-6.11/drivers/platform/x86/shuttle-wmi.c.wmi 2024-11-18 10:43:15.072608505 +0100 ++++ linux-6.11/drivers/platform/x86/shuttle-wmi.c 2024-11-18 10:43:15.072608505 +0100 @@ -0,0 +1,1297 @@ +/* + * ACPI-WMI driver for Shuttle WMI interface @@ -1421,19 +1421,19 @@ diff -Nurp linux-5.15.1/drivers/platform/x86/shuttle-wmi.c linux-5.15.1-shuttle/ + +module_init(shuttle_wmi_init); +module_exit(shuttle_wmi_exit); -diff -Nurp linux-5.15.1/MAINTAINERS linux-5.15.1-shuttle/MAINTAINERS ---- linux-5.15.1/MAINTAINERS 2021-10-31 22:53:10.000000000 +0200 -+++ linux-5.15.1-shuttle/MAINTAINERS 2021-11-08 23:24:45.469092275 +0200 -@@ -16993,6 +16993,12 @@ S: Orphan - F: drivers/media/platform/sh_vou.c +diff -up linux-6.11/MAINTAINERS.wmi linux-6.11/MAINTAINERS +--- linux-6.11/MAINTAINERS.wmi 2024-11-18 00:42:21.251332731 +0100 ++++ linux-6.11/MAINTAINERS 2024-11-18 10:43:15.076608549 +0100 +@@ -20958,6 +20958,12 @@ S: Orphan + F: drivers/media/platform/renesas/sh_vou.c F: include/media/drv-intf/sh_vou.h +SHUTTLE WMI EXTRAS DRIVER -+M: Herton Ronaldo Krzesinski -+L: platform-driver-x86@vger.kernel.org -+S: Maintained -+F: drivers/platform/x86/shuttle-wmi.c ++M: Herton Ronaldo Krzesinski ++L: platform-driver-x86@vger.kernel.org ++S: Maintained ++F: drivers/platform/x86/shuttle-wmi.c + SI2157 MEDIA DRIVER - M: Antti Palosaari L: linux-media@vger.kernel.org + S: Orphan diff --git a/kernel/tools/perf/files/patches/mageia/staging-add-r8188eu.patch b/kernel/tools/perf/files/patches/mageia/staging-add-r8188eu.patch new file mode 100644 index 0000000000..d1c75633d8 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/staging-add-r8188eu.patch @@ -0,0 +1,81013 @@ +diff --git a/drivers/staging/r8188eu/Kconfig b/drivers/staging/r8188eu/Kconfig +new file mode 100644 +index 000000000000..dc1719d3f2e4 +--- /dev/null ++++ b/drivers/staging/r8188eu/Kconfig +@@ -0,0 +1,26 @@ ++# SPDX-License-Identifier: GPL-2.0 ++config R8188EU ++ tristate "Realtek RTL8188EU Wireless LAN NIC driver" ++ depends on WLAN && USB && CFG80211 ++ depends on m ++ select WIRELESS_EXT ++ select WEXT_PRIV ++ select LIB80211 ++ select LIB80211_CRYPT_WEP ++ select LIB80211_CRYPT_CCMP ++ help ++ This option adds support for the Realtek RTL8188EU chipset, used in USB ++ devices such as the ASUS USB-N10 Nano. This newer driver is based on GitHub ++ sources for version v4.1.4_6773.20130222, and contains modifications for ++ newer kernel features. If built as a module, it will be called r8188eu. ++ ++if R8188EU ++ ++config 88EU_AP_MODE ++ bool "Realtek RTL8188EU AP mode" ++ help ++ This option enables Access Point mode. Unless you know that your system ++ will never be used as an AP, or the target system has limited memory, ++ "Y" should be selected. ++ ++endif +diff --git a/drivers/staging/r8188eu/Makefile b/drivers/staging/r8188eu/Makefile +new file mode 100644 +index 000000000000..aebaf29990fd +--- /dev/null ++++ b/drivers/staging/r8188eu/Makefile +@@ -0,0 +1,105 @@ ++SHELL := /bin/bash ++EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) ++EXTRA_CFLAGS += -O1 ++ ++ccflags-y += -D__CHECK_ENDIAN__ ++ ++CONFIG_BT_COEXIST = n ++CONFIG_WOWLAN = n ++ ++OUTSRC_FILES := \ ++ hal/HalHWImg8188E_MAC.o \ ++ hal/HalHWImg8188E_BB.o \ ++ hal/HalHWImg8188E_RF.o \ ++ hal/HalPhyRf_8188e.o \ ++ hal/HalPwrSeqCmd.o \ ++ hal/Hal8188EPwrSeq.o \ ++ hal/Hal8188ERateAdaptive.o\ ++ hal/hal_intf.o \ ++ hal/hal_com.o \ ++ hal/odm.o \ ++ hal/odm_debug.o \ ++ hal/odm_interface.o \ ++ hal/odm_HWConfig.o \ ++ hal/odm_RegConfig8188E.o\ ++ hal/odm_RTL8188E.o \ ++ hal/rtl8188e_cmd.o \ ++ hal/rtl8188e_dm.o \ ++ hal/rtl8188e_hal_init.o \ ++ hal/rtl8188e_mp.o \ ++ hal/rtl8188e_phycfg.o \ ++ hal/rtl8188e_rf6052.o \ ++ hal/rtl8188e_rxdesc.o \ ++ hal/rtl8188e_sreset.o \ ++ hal/rtl8188e_xmit.o \ ++ hal/rtl8188eu_led.o \ ++ hal/rtl8188eu_recv.o \ ++ hal/rtl8188eu_xmit.o \ ++ hal/usb_halinit.o \ ++ hal/usb_ops_linux.o ++ ++RTL871X = rtl8188e ++ ++HCI_NAME = usb ++ ++_OS_INTFS_FILES := \ ++ os_dep/ioctl_linux.o \ ++ os_dep/mlme_linux.o \ ++ os_dep/os_intfs.o \ ++ os_dep/osdep_service.o \ ++ os_dep/recv_linux.o \ ++ os_dep/usb_intf.o \ ++ os_dep/usb_ops_linux.o \ ++ os_dep/xmit_linux.o ++ ++_HAL_INTFS_FILES += $(OUTSRC_FILES) ++ ++ifeq ($(CONFIG_BT_COEXIST), y) ++EXTRA_CFLAGS += -DCONFIG_BT_COEXIST ++endif ++ ++ifeq ($(CONFIG_WOWLAN), y) ++EXTRA_CFLAGS += -DCONFIG_WOWLAN ++endif ++ ++SUBARCH := $(shell uname -m | sed -e "s/i.86/i386/; s/ppc.*/powerpc/; s/armv.l/arm/; s/aarch64/arm64/;") ++ ++ARCH ?= $(SUBARCH) ++CROSS_COMPILE ?= ++KVER ?= $(if $(KERNELRELEASE),$(KERNELRELEASE),$(shell uname -r)) ++KSRC ?= $(if $(KERNEL_SRC),$(KERNEL_SRC),/lib/modules/$(KVER)/build) ++MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless ++INSTALL_PREFIX := ++ ++rtk_core := \ ++ core/rtw_ap.o \ ++ core/rtw_br_ext.o \ ++ core/rtw_cmd.o \ ++ core/rtw_debug.o \ ++ core/rtw_efuse.o \ ++ core/rtw_ieee80211.o \ ++ core/rtw_io.o \ ++ core/rtw_ioctl_set.o \ ++ core/rtw_iol.o \ ++ core/rtw_led.o \ ++ core/rtw_mlme.o \ ++ core/rtw_mlme_ext.o \ ++ core/rtw_mp.o \ ++ core/rtw_mp_ioctl.o \ ++ core/rtw_pwrctrl.o \ ++ core/rtw_p2p.o \ ++ core/rtw_recv.o \ ++ core/rtw_rf.o \ ++ core/rtw_security.o \ ++ core/rtw_sreset.o \ ++ core/rtw_sta_mgt.o \ ++ core/rtw_wlan_util.o \ ++ core/rtw_xmit.o ++ ++r8188eu-y += $(rtk_core) ++ ++r8188eu-y += $(_HAL_INTFS_FILES) ++ ++r8188eu-y += $(_OS_INTFS_FILES) ++ ++obj-$(CONFIG_R8188EU) := r8188eu.o +diff --git a/drivers/staging/r8188eu/TODO b/drivers/staging/r8188eu/TODO +new file mode 100644 +index 000000000000..ab9d5d145b3b +--- /dev/null ++++ b/drivers/staging/r8188eu/TODO +@@ -0,0 +1,16 @@ ++To-do list: ++ ++* Correct the coding style according to Linux guidelines; please read the document ++ at https://www.kernel.org/doc/html/latest/process/coding-style.html. ++* Remove unnecessary debugging/printing macros; for those that are still needed ++ use the proper kernel API (pr_debug(), dev_dbg(), netdev_dbg()). ++* Remove dead code such as unusued functions, variables, fields, etc.. ++* Use in-kernel API and remove unnecessary wrappers where possible. ++* Fix bugs due to code that sleeps in atomic context. ++* Remove the HAL layer and migrate its functionality into the relevant parts of ++ the driver. ++* Switch to use LIB80211. ++* Switch to use MAC80211. ++* Switch to use CFG80211. ++* Improve the error handling of various functions, particularly those that use ++ existing kernel APIs. +diff --git a/drivers/staging/r8188eu/core/rtw_ap.c b/drivers/staging/r8188eu/core/rtw_ap.c +new file mode 100644 +index 000000000000..1c07ad28b242 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_ap.c +@@ -0,0 +1,1850 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_AP_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/ieee80211.h" ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++void init_mlme_ap_info(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ ++ spin_lock_init(&pmlmepriv->bcn_update_lock); ++ ++ /* for ACL */ ++ _rtw_init_queue(&pacl_list->acl_node_q); ++ ++ start_ap_mode(padapter); ++} ++ ++void free_mlme_ap_info(struct adapter *padapter) ++{ ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pmlmepriv->update_bcn = false; ++ pmlmeext->bstart_bss = false; ++ ++ rtw_sta_flush(padapter); ++ ++ pmlmeinfo->state = _HW_STATE_NOLINK_; ++ ++ /* free_assoc_sta_resources */ ++ rtw_free_all_stainfo(padapter); ++ ++ /* free bc/mc sta_info */ ++ psta = rtw_get_bcmc_stainfo(padapter); ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(padapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++} ++ ++static void update_BCNTIM(struct adapter *padapter) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork_mlmeext = &pmlmeinfo->network; ++ unsigned char *pie = pnetwork_mlmeext->IEs; ++ ++ /* update TIM IE */ ++ if (true) { ++ u8 *p, *dst_ie, *premainder_ie = NULL; ++ u8 *pbackup_remainder_ie = NULL; ++ __le16 tim_bitmap_le; ++ uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; ++ ++ tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); ++ ++ p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); ++ if (p && tim_ielen > 0) { ++ tim_ielen += 2; ++ premainder_ie = p + tim_ielen; ++ tim_ie_offset = (int)(p - pie); ++ remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; ++ /* append TIM IE from dst_ie offset */ ++ dst_ie = p; ++ } else { ++ tim_ielen = 0; ++ ++ /* calculate head_len */ ++ offset = _FIXED_IE_LENGTH_; ++ offset += pnetwork_mlmeext->Ssid.SsidLength + 2; ++ ++ /* get supported rates len */ ++ p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); ++ if (p) ++ offset += tmp_len + 2; ++ ++ /* DS Parameter Set IE, len = 3 */ ++ offset += 3; ++ ++ premainder_ie = pie + offset; ++ ++ remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; ++ ++ /* append TIM IE from offset */ ++ dst_ie = pie + offset; ++ } ++ ++ if (remainder_ielen > 0) { ++ pbackup_remainder_ie = kmalloc(remainder_ielen, GFP_ATOMIC); ++ if (pbackup_remainder_ie && premainder_ie) ++ memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); ++ } ++ *dst_ie++ = _TIM_IE_; ++ ++ if ((pstapriv->tim_bitmap & 0xff00) && (pstapriv->tim_bitmap & 0x00fc)) ++ tim_ielen = 5; ++ else ++ tim_ielen = 4; ++ ++ *dst_ie++ = tim_ielen; ++ ++ *dst_ie++ = 0;/* DTIM count */ ++ *dst_ie++ = 1;/* DTIM period */ ++ ++ if (pstapriv->tim_bitmap & BIT(0))/* for bc/mc frames */ ++ *dst_ie++ = BIT(0);/* bitmap ctrl */ ++ else ++ *dst_ie++ = 0; ++ ++ if (tim_ielen == 4) { ++ *dst_ie++ = *(u8 *)&tim_bitmap_le; ++ } else if (tim_ielen == 5) { ++ memcpy(dst_ie, &tim_bitmap_le, 2); ++ dst_ie += 2; ++ } ++ ++ /* copy remainder IE */ ++ if (pbackup_remainder_ie) { ++ memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); ++ ++ kfree(pbackup_remainder_ie); ++ } ++ offset = (uint)(dst_ie - pie); ++ pnetwork_mlmeext->IELength = offset + remainder_ielen; ++ } ++ ++ set_tx_beacon_cmd(padapter); ++} ++ ++static u8 chk_sta_is_alive(struct sta_info *psta) ++{ ++ u8 ret = false; ++ ++ if ((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == ++ (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) ++ ; ++ else ++ ret = true; ++ ++ sta_update_last_rx_pkts(psta); ++ ++ return ret; ++} ++ ++void expire_timeout_chk(struct adapter *padapter) ++{ ++ struct list_head *phead, *plist; ++ u8 updated = 0; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 chk_alive_num = 0; ++ char chk_alive_list[NUM_STA]; ++ int i; ++ ++ spin_lock_bh(&pstapriv->auth_list_lock); ++ ++ phead = &pstapriv->auth_list; ++ plist = phead->next; ++ ++ /* check auth_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, auth_list); ++ plist = plist->next; ++ ++ if (psta->expire_to > 0) { ++ psta->expire_to--; ++ if (psta->expire_to == 0) { ++ list_del_init(&psta->auth_list); ++ pstapriv->auth_list_cnt--; ++ ++ DBG_88E("auth expire %6ph\n", ++ psta->hwaddr); ++ ++ spin_unlock_bh(&pstapriv->auth_list_lock); ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(padapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ spin_lock_bh(&pstapriv->auth_list_lock); ++ } ++ } ++ ++ } ++ spin_unlock_bh(&pstapriv->auth_list_lock); ++ ++ psta = NULL; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* check asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ plist = plist->next; ++ ++ if (chk_sta_is_alive(psta) || !psta->expire_to) { ++ psta->expire_to = pstapriv->expire_to; ++ psta->keep_alive_trycnt = 0; ++ psta->under_exist_checking = 0; ++ } else { ++ psta->expire_to--; ++ } ++ ++ if (psta->expire_to <= 0) { ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ if (padapter->registrypriv.wifi_spec == 1) { ++ psta->expire_to = pstapriv->expire_to; ++ continue; ++ } ++ ++ if (psta->state & WIFI_SLEEP_STATE) { ++ if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { ++ /* to check if alive by another methods if station is at ps mode. */ ++ psta->expire_to = pstapriv->expire_to; ++ psta->state |= WIFI_STA_ALIVE_CHK_STATE; ++ ++ /* to update bcn with tim_bitmap for this station */ ++ pstapriv->tim_bitmap |= BIT(psta->aid); ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ ++ if (!pmlmeext->active_keep_alive_check) ++ continue; ++ } ++ } ++ if (pmlmeext->active_keep_alive_check) { ++ int stainfo_offset; ++ ++ stainfo_offset = rtw_stainfo_offset(pstapriv, psta); ++ if (stainfo_offset_valid(stainfo_offset)) ++ chk_alive_list[chk_alive_num++] = stainfo_offset; ++ continue; ++ } ++ ++ list_del_init(&psta->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ ++ DBG_88E("asoc expire %pM, state = 0x%x\n", (psta->hwaddr), psta->state); ++ updated = ap_free_sta(padapter, psta, true, WLAN_REASON_DEAUTH_LEAVING); ++ } else { ++ /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ ++ if (psta->sleepq_len > (NR_XMITFRAME / pstapriv->asoc_list_cnt) && ++ padapter->xmitpriv.free_xmitframe_cnt < (NR_XMITFRAME / pstapriv->asoc_list_cnt / 2)) { ++ DBG_88E("%s sta:%pM, sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__, ++ (psta->hwaddr), psta->sleepq_len, ++ padapter->xmitpriv.free_xmitframe_cnt, ++ pstapriv->asoc_list_cnt); ++ wakeup_sta_to_xmit(padapter, psta); ++ } ++ } ++ } ++ ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ if (chk_alive_num) { ++ u8 backup_oper_channel = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ /* switch to correct channel of current network before issue keep-alive frames */ ++ if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { ++ backup_oper_channel = rtw_get_oper_ch(padapter); ++ SelectChannel(padapter, pmlmeext->cur_channel); ++ } ++ ++ /* issue null data to check sta alive*/ ++ for (i = 0; i < chk_alive_num; i++) { ++ int ret = _FAIL; ++ ++ psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); ++ ++ if (psta->state & WIFI_SLEEP_STATE) ++ ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); ++ else ++ ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); ++ ++ psta->keep_alive_trycnt++; ++ if (ret == _SUCCESS) { ++ DBG_88E("asoc check, sta(%pM) is alive\n", (psta->hwaddr)); ++ psta->expire_to = pstapriv->expire_to; ++ psta->keep_alive_trycnt = 0; ++ continue; ++ } else if (psta->keep_alive_trycnt <= 3) { ++ DBG_88E("ack check for asoc expire, keep_alive_trycnt =%d\n", psta->keep_alive_trycnt); ++ psta->expire_to = 1; ++ continue; ++ } ++ ++ psta->keep_alive_trycnt = 0; ++ ++ DBG_88E("asoc expire %pM, state = 0x%x\n", (psta->hwaddr), psta->state); ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ list_del_init(&psta->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ updated = ap_free_sta(padapter, psta, true, WLAN_REASON_DEAUTH_LEAVING); ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ } ++ ++ if (backup_oper_channel > 0) /* back to the original operation channel */ ++ SelectChannel(padapter, backup_oper_channel); ++ } ++ ++ associated_clients_update(padapter, updated); ++} ++ ++void add_RATid(struct adapter *padapter, struct sta_info *psta, u8 rssi_level) ++{ ++ int i; ++ u8 rf_type; ++ u32 init_rate = 0; ++ unsigned char sta_band = 0, raid, shortGIrate = false; ++ unsigned char limit; ++ unsigned int tx_ra_bitmap = 0; ++ struct ht_priv *psta_ht = NULL; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_network = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; ++ ++ if (psta) ++ psta_ht = &psta->htpriv; ++ else ++ return; ++ ++ if (!(psta->state & _FW_LINKED)) ++ return; ++ ++ /* b/g mode ra_bitmap */ ++ for (i = 0; i < sizeof(psta->bssrateset); i++) { ++ if (psta->bssrateset[i]) ++ tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i] & 0x7f); ++ } ++ /* n mode ra_bitmap */ ++ if (psta_ht->ht_option) { ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ if (rf_type == RF_2T2R) ++ limit = 16;/* 2R */ ++ else ++ limit = 8;/* 1R */ ++ ++ for (i = 0; i < limit; i++) { ++ if (psta_ht->ht_cap.mcs.rx_mask[i / 8] & BIT(i % 8)) ++ tx_ra_bitmap |= BIT(i + 12); ++ } ++ ++ /* max short GI rate */ ++ shortGIrate = psta_ht->sgi; ++ } ++ ++ if (pcur_network->Configuration.DSConfig > 14) { ++ sta_band |= WIRELESS_INVALID; ++ } else { ++ if (tx_ra_bitmap & 0xffff000) ++ sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; ++ else if (tx_ra_bitmap & 0xff0) ++ sta_band |= WIRELESS_11G | WIRELESS_11B; ++ else ++ sta_band |= WIRELESS_11B; ++ } ++ ++ psta->wireless_mode = sta_band; ++ ++ raid = networktype_to_raid(sta_band); ++ init_rate = get_highest_rate_idx(tx_ra_bitmap & 0x0fffffff) & 0x3f; ++ ++ if (psta->aid < NUM_STA) { ++ u8 arg = 0; ++ ++ arg = psta->mac_id & 0x1f; ++ ++ arg |= BIT(7);/* support entry 2~31 */ ++ ++ if (shortGIrate) ++ arg |= BIT(5); ++ ++ tx_ra_bitmap |= ((raid << 28) & 0xf0000000); ++ ++ DBG_88E("%s => mac_id:%d , raid:%d , bitmap = 0x%x, arg = 0x%x\n", ++ __func__, psta->mac_id, raid, tx_ra_bitmap, arg); ++ ++ /* bitmap[0:27] = tx_rate_bitmap */ ++ /* bitmap[28:31]= Rate Adaptive id */ ++ /* arg[0:4] = macid */ ++ /* arg[5] = Short GI */ ++ rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); ++ ++ if (shortGIrate) ++ init_rate |= BIT(6); ++ ++ /* set ra_id, init_rate */ ++ psta->raid = raid; ++ psta->init_rate = init_rate; ++ ++ } else { ++ DBG_88E("station aid %d exceed the max number\n", psta->aid); ++ } ++} ++ ++void update_bmc_sta(struct adapter *padapter) ++{ ++ u32 init_rate = 0; ++ unsigned char network_type, raid; ++ int i, supportRateNum = 0; ++ unsigned int tx_ra_bitmap = 0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_network = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; ++ struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); ++ ++ if (psta) { ++ psta->aid = 0;/* default set to 0 */ ++ psta->mac_id = psta->aid + 1; ++ ++ psta->qos_option = 0; ++ psta->htpriv.ht_option = false; ++ ++ psta->ieee8021x_blocked = 0; ++ ++ memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); ++ ++ /* prepare for add_RATid */ ++ supportRateNum = rtw_get_rateset_len((u8 *)&pcur_network->SupportedRates); ++ network_type = rtw_check_network_type((u8 *)&pcur_network->SupportedRates, supportRateNum, 1); ++ ++ memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); ++ psta->bssratelen = supportRateNum; ++ ++ /* b/g mode ra_bitmap */ ++ for (i = 0; i < supportRateNum; i++) { ++ if (psta->bssrateset[i]) ++ tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i] & 0x7f); ++ } ++ ++ if (pcur_network->Configuration.DSConfig > 14) { ++ network_type = WIRELESS_INVALID; ++ } else { ++ /* force to b mode */ ++ network_type = WIRELESS_11B; ++ tx_ra_bitmap = 0xf; ++ } ++ ++ raid = networktype_to_raid(network_type); ++ init_rate = get_highest_rate_idx(tx_ra_bitmap & 0x0fffffff) & 0x3f; ++ ++ /* ap mode */ ++ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); ++ ++ { ++ u8 arg = 0; ++ ++ arg = psta->mac_id & 0x1f; ++ arg |= BIT(7); ++ tx_ra_bitmap |= ((raid << 28) & 0xf0000000); ++ DBG_88E("update_bmc_sta, mask = 0x%x, arg = 0x%x\n", tx_ra_bitmap, arg); ++ ++ /* bitmap[0:27] = tx_rate_bitmap */ ++ /* bitmap[28:31]= Rate Adaptive id */ ++ /* arg[0:4] = macid */ ++ /* arg[5] = Short GI */ ++ rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); ++ } ++ /* set ra_id, init_rate */ ++ psta->raid = raid; ++ psta->init_rate = init_rate; ++ ++ rtw_sta_media_status_rpt(padapter, psta, 1); ++ ++ spin_lock_bh(&psta->lock); ++ psta->state = _FW_LINKED; ++ spin_unlock_bh(&psta->lock); ++ ++ } else { ++ DBG_88E("add_RATid_bmc_sta error!\n"); ++ } ++} ++ ++/* notes: */ ++/* AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode */ ++/* MAC_ID = AID+1 for sta in ap/adhoc mode */ ++/* MAC_ID = 1 for bc/mc for sta/ap/adhoc */ ++/* MAC_ID = 0 for bssid for sta/ap/adhoc */ ++/* CAM_ID = 0~3 for default key, cmd_id = macid + 3, macid = aid+1; */ ++ ++void update_sta_info_apmode(struct adapter *padapter, struct sta_info *psta) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; ++ struct ht_priv *phtpriv_sta = &psta->htpriv; ++ u16 sta_cap_info; ++ u16 ap_cap_info; ++ ++ psta->mac_id = psta->aid + 1; ++ DBG_88E("%s\n", __func__); ++ ++ /* ap mode */ ++ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); ++ ++ if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ++ psta->ieee8021x_blocked = true; ++ else ++ psta->ieee8021x_blocked = false; ++ ++ /* update sta's cap */ ++ ++ /* ERP */ ++ VCS_update(padapter, psta); ++ /* HT related cap */ ++ if (phtpriv_sta->ht_option) { ++ /* check if sta supports rx ampdu */ ++ phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; ++ sta_cap_info = le16_to_cpu(phtpriv_sta->ht_cap.cap_info); ++ ap_cap_info = le16_to_cpu(phtpriv_ap->ht_cap.cap_info); ++ ++ /* check if sta support s Short GI */ ++ if ((sta_cap_info & ap_cap_info) & ++ (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) ++ phtpriv_sta->sgi = true; ++ ++ /* bwmode */ ++ if ((sta_cap_info & ap_cap_info) & IEEE80211_HT_CAP_SUP_WIDTH_20_40) { ++ phtpriv_sta->bwmode = pmlmeext->cur_bwmode; ++ phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; ++ } ++ psta->qos_option = true; ++ } else { ++ phtpriv_sta->ampdu_enable = false; ++ phtpriv_sta->sgi = false; ++ phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; ++ phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ } ++ ++ /* Rx AMPDU */ ++ send_delba(padapter, 0, psta->hwaddr);/* recipient */ ++ ++ /* TX AMPDU */ ++ send_delba(padapter, 1, psta->hwaddr);/* originator */ ++ phtpriv_sta->agg_enable_bitmap = 0x0;/* reset */ ++ phtpriv_sta->candidate_tid_bitmap = 0x0;/* reset */ ++ ++ /* todo: init other variables */ ++ ++ memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); ++ ++ spin_lock_bh(&psta->lock); ++ psta->state |= _FW_LINKED; ++ spin_unlock_bh(&psta->lock); ++} ++ ++static void update_hw_ht_param(struct adapter *padapter) ++{ ++ unsigned char max_AMPDU_len; ++ unsigned char min_MPDU_spacing; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* handle A-MPDU parameter field */ ++ /* ++ AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k ++ AMPDU_para [4:2]:Min MPDU Start Spacing ++ */ ++ max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; ++ ++ min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); ++ ++ /* */ ++ /* Config SM Power Save setting */ ++ /* */ ++ pmlmeinfo->SM_PS = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & 0x0C) >> 2; ++ if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) ++ DBG_88E("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__); ++} ++ ++static void start_bss_network(struct adapter *padapter, u8 *pbuf) ++{ ++ u8 *p; ++ u8 val8, cur_channel, cur_bwmode, cur_ch_offset; ++ u16 bcn_interval; ++ u32 acparm; ++ int ie_len; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork_mlmeext = &pmlmeinfo->network; ++ struct HT_info_element *pht_info = NULL; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; ++ cur_channel = pnetwork->Configuration.DSConfig; ++ cur_bwmode = HT_CHANNEL_WIDTH_20; ++ cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ ++ /* check if there is wps ie, */ ++ /* if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, */ ++ /* and at first time the security ie (RSN/WPA IE) will not include in beacon. */ ++ if (!rtw_get_wps_ie(pnetwork->IEs + _FIXED_IE_LENGTH_, pnetwork->IELength - _FIXED_IE_LENGTH_, NULL, NULL)) ++ pmlmeext->bstart_bss = true; ++ ++ /* todo: update wmm, ht cap */ ++ if (pmlmepriv->qospriv.qos_option) ++ pmlmeinfo->WMM_enable = true; ++ if (pmlmepriv->htpriv.ht_option) { ++ pmlmeinfo->WMM_enable = true; ++ pmlmeinfo->HT_enable = true; ++ ++ update_hw_ht_param(padapter); ++ } ++ ++ if (pmlmepriv->cur_network.join_res != true) { /* setting only at first time */ ++ /* WEP Key will be set before this function, do not clear CAM. */ ++ if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && ++ (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) ++ flush_all_cam_entry(padapter); /* clear CAM */ ++ } ++ ++ /* set MSR to AP_Mode */ ++ Set_MSR(padapter, _HW_STATE_AP_); ++ ++ /* Set BSSID REG */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); ++ ++ /* Set EDCA param reg */ ++ acparm = 0x002F3217; /* VO */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); ++ acparm = 0x005E4317; /* VI */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); ++ acparm = 0x005ea42b; ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); ++ acparm = 0x0000A444; /* BK */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); ++ ++ /* Set Security */ ++ val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ? 0xcc : 0xcf; ++ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); ++ ++ /* Beacon Control related register */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); ++ ++ UpdateBrateTbl(padapter, pnetwork->SupportedRates); ++ rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); ++ ++ if (!pmlmepriv->cur_network.join_res) { /* setting only at first time */ ++ /* turn on all dynamic functions */ ++ Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); ++ } ++ /* set channel, bwmode */ ++ p = rtw_get_ie((pnetwork->IEs + sizeof(struct ndis_802_11_fixed_ie)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(struct ndis_802_11_fixed_ie))); ++ if (p && ie_len) { ++ pht_info = (struct HT_info_element *)(p + 2); ++ ++ if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) { ++ /* switch to the 40M Hz mode */ ++ cur_bwmode = HT_CHANNEL_WIDTH_40; ++ switch (pht_info->infos[0] & 0x3) { ++ case 1: ++ cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; ++ break; ++ case 3: ++ cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; ++ break; ++ default: ++ cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ break; ++ } ++ } ++ } ++ /* TODO: need to judge the phy parameters on concurrent mode for single phy */ ++ set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); ++ ++ DBG_88E("CH =%d, BW =%d, offset =%d\n", cur_channel, cur_bwmode, cur_ch_offset); ++ ++ /* */ ++ pmlmeext->cur_channel = cur_channel; ++ pmlmeext->cur_bwmode = cur_bwmode; ++ pmlmeext->cur_ch_offset = cur_ch_offset; ++ pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; ++ ++ /* update cur_wireless_mode */ ++ update_wireless_mode(padapter); ++ ++ /* udpate capability after cur_wireless_mode updated */ ++ update_capinfo(padapter, rtw_get_capability((struct wlan_bssid_ex *)pnetwork)); ++ ++ /* let pnetwork_mlmeext == pnetwork_mlme. */ ++ memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); ++ ++#ifdef CONFIG_88EU_P2P ++ memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); ++ pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (pmlmeext->bstart_bss) { ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ ++ /* issue beacon frame */ ++ if (send_beacon(padapter) == _FAIL) ++ DBG_88E("issue_beacon, fail!\n"); ++ } ++ ++ /* update bc/mc sta_info */ ++ update_bmc_sta(padapter); ++} ++ ++int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) ++{ ++ int ret = _SUCCESS; ++ u8 *p; ++ u8 *pHT_caps_ie = NULL; ++ u8 *pHT_info_ie = NULL; ++ struct sta_info *psta = NULL; ++ u16 cap, ht_cap = false; ++ uint ie_len = 0; ++ int group_cipher, pairwise_cipher; ++ u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; ++ int supportRateNum = 0; ++ u8 OUI1[] = {0x00, 0x50, 0xf2, 0x01}; ++ u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pbss_network = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; ++ u8 *ie = pbss_network->IEs; ++ ++ /* SSID */ ++ /* Supported rates */ ++ /* DS Params */ ++ /* WLAN_EID_COUNTRY */ ++ /* ERP Information element */ ++ /* Extended supported rates */ ++ /* WPA/WPA2 */ ++ /* Wi-Fi Wireless Multimedia Extensions */ ++ /* ht_capab, ht_oper */ ++ /* WPS IE */ ++ ++ DBG_88E("%s, len =%d\n", __func__, len); ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != true) ++ return _FAIL; ++ ++ if (len > MAX_IE_SZ) ++ return _FAIL; ++ ++ pbss_network->IELength = len; ++ ++ memset(ie, 0, MAX_IE_SZ); ++ ++ memcpy(ie, pbuf, pbss_network->IELength); ++ ++ if (pbss_network->InfrastructureMode != Ndis802_11APMode) ++ return _FAIL; ++ ++ pbss_network->Rssi = 0; ++ ++ memcpy(pbss_network->MacAddress, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ /* beacon interval */ ++ p = rtw_get_beacon_interval_from_ie(ie);/* 8: TimeStamp, 2: Beacon Interval 2:Capability */ ++ pbss_network->Configuration.BeaconPeriod = get_unaligned_le16(p); ++ ++ /* capability */ ++ cap = get_unaligned_le16(ie); ++ ++ /* SSID */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) { ++ memset(&pbss_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); ++ pbss_network->Ssid.SsidLength = ie_len; ++ } ++ ++ /* channel */ ++ channel = 0; ++ pbss_network->Configuration.Length = 0; ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) ++ channel = *(p + 2); ++ ++ pbss_network->Configuration.DSConfig = channel; ++ ++ memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); ++ /* get supported rates */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p) { ++ memcpy(supportRate, p + 2, ie_len); ++ supportRateNum = ie_len; ++ } ++ ++ /* get ext_supported rates */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); ++ if (p) { ++ memcpy(supportRate + supportRateNum, p + 2, ie_len); ++ supportRateNum += ie_len; ++ } ++ ++ network_type = rtw_check_network_type(supportRate, supportRateNum, channel); ++ ++ rtw_set_supported_rate(pbss_network->SupportedRates, network_type); ++ ++ /* parsing ERP_IE */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) ++ ERP_IE_handler(padapter, (struct ndis_802_11_var_ie *)p); ++ ++ /* update privacy/security */ ++ if (cap & BIT(4)) ++ pbss_network->Privacy = 1; ++ else ++ pbss_network->Privacy = 0; ++ ++ psecuritypriv->wpa_psk = 0; ++ ++ /* wpa2 */ ++ group_cipher = 0; ++ pairwise_cipher = 0; ++ psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; ++ psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) { ++ if (rtw_parse_wpa2_ie(p, ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { ++ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; ++ ++ psecuritypriv->dot8021xalg = 1;/* psk, todo:802.1x */ ++ psecuritypriv->wpa_psk |= BIT(1); ++ ++ psecuritypriv->wpa2_group_cipher = group_cipher; ++ psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; ++ } ++ } ++ /* wpa */ ++ ie_len = 0; ++ group_cipher = 0; ++ pairwise_cipher = 0; ++ psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; ++ psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; ++ for (p = ie + _BEACON_IE_OFFSET_;; p += (ie_len + 2)) { ++ p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, ++ (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); ++ if ((p) && (!memcmp(p + 2, OUI1, 4))) { ++ if (rtw_parse_wpa_ie(p, ie_len + 2, &group_cipher, ++ &pairwise_cipher, NULL) == _SUCCESS) { ++ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; ++ ++ psecuritypriv->dot8021xalg = 1;/* psk, todo:802.1x */ ++ ++ psecuritypriv->wpa_psk |= BIT(0); ++ ++ psecuritypriv->wpa_group_cipher = group_cipher; ++ psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; ++ } ++ break; ++ } ++ if (!p || ie_len == 0) ++ break; ++ } ++ ++ /* wmm */ ++ ie_len = 0; ++ pmlmepriv->qospriv.qos_option = 0; ++ if (pregistrypriv->wmm_enable) { ++ for (p = ie + _BEACON_IE_OFFSET_;; p += (ie_len + 2)) { ++ p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, ++ (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); ++ if ((p) && !memcmp(p + 2, WMM_PARA_IE, 6)) { ++ pmlmepriv->qospriv.qos_option = 1; ++ ++ *(p + 8) |= BIT(7);/* QoS Info, support U-APSD */ ++ ++ /* disable all ACM bits since the WMM admission control is not supported */ ++ *(p + 10) &= ~BIT(4); /* BE */ ++ *(p + 14) &= ~BIT(4); /* BK */ ++ *(p + 18) &= ~BIT(4); /* VI */ ++ *(p + 22) &= ~BIT(4); /* VO */ ++ break; ++ } ++ ++ if (!p || ie_len == 0) ++ break; ++ } ++ } ++ /* parsing HT_CAP_IE */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, ++ (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) { ++ u8 rf_type; ++ struct ieee80211_ht_cap *pht_cap = (struct ieee80211_ht_cap *)(p + 2); ++ ++ pHT_caps_ie = p; ++ ht_cap = true; ++ network_type |= WIRELESS_11_24N; ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ ++ if ((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || ++ (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) ++ pht_cap->ampdu_params_info |= (IEEE80211_HT_AMPDU_PARM_DENSITY & (0x07 << 2)); ++ else ++ pht_cap->ampdu_params_info |= (IEEE80211_HT_AMPDU_PARM_DENSITY & 0x00); ++ ++ /* set Max Rx AMPDU size to 64K */ ++ pht_cap->ampdu_params_info |= (IEEE80211_HT_AMPDU_PARM_FACTOR & 0x03); ++ ++ if (rf_type == RF_1T1R) { ++ pht_cap->mcs.rx_mask[0] = 0xff; ++ pht_cap->mcs.rx_mask[1] = 0x0; ++ } ++ memcpy(&pmlmepriv->htpriv.ht_cap, p + 2, ie_len); ++ } ++ ++ /* parsing HT_INFO_IE */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, ++ (pbss_network->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) ++ pHT_info_ie = p; ++ switch (network_type) { ++ case WIRELESS_11B: ++ pbss_network->NetworkTypeInUse = Ndis802_11DS; ++ break; ++ case WIRELESS_11G: ++ case WIRELESS_11BG: ++ case WIRELESS_11G_24N: ++ case WIRELESS_11BG_24N: ++ pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; ++ break; ++ default: ++ pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; ++ break; ++ } ++ ++ pmlmepriv->cur_network.network_type = network_type; ++ ++ pmlmepriv->htpriv.ht_option = false; ++ ++ if ((psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || ++ (psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_TKIP)) { ++ /* todo: */ ++ /* ht_cap = false; */ ++ } ++ ++ /* ht_cap */ ++ if (pregistrypriv->ht_enable && ht_cap) { ++ pmlmepriv->htpriv.ht_option = true; ++ pmlmepriv->qospriv.qos_option = 1; ++ ++ if (pregistrypriv->ampdu_enable == 1) ++ pmlmepriv->htpriv.ampdu_enable = true; ++ HT_caps_handler(padapter, (struct ndis_802_11_var_ie *)pHT_caps_ie); ++ ++ HT_info_handler(padapter, (struct ndis_802_11_var_ie *)pHT_info_ie); ++ } ++ ++ pbss_network->Length = get_wlan_bssid_ex_sz((struct wlan_bssid_ex *)pbss_network); ++ ++ /* issue beacon to start bss network */ ++ start_bss_network(padapter, (u8 *)pbss_network); ++ ++ /* alloc sta_info for ap itself */ ++ psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); ++ if (!psta) { ++ psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); ++ if (!psta) ++ return _FAIL; ++ } ++ ++ /* fix bug of flush_cam_entry at STOP AP mode */ ++ psta->state |= WIFI_AP_STATE; ++ rtw_indicate_connect(padapter); ++ pmlmepriv->cur_network.join_res = true;/* for check if already set beacon */ ++ return ret; ++} ++ ++void rtw_set_macaddr_acl(struct adapter *padapter, int mode) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ ++ DBG_88E("%s, mode =%d\n", __func__, mode); ++ ++ pacl_list->mode = mode; ++} ++ ++int rtw_acl_add_sta(struct adapter *padapter, u8 *addr) ++{ ++ struct list_head *plist, *phead; ++ u8 added = false; ++ int i, ret = 0; ++ struct rtw_wlan_acl_node *paclnode; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ struct __queue *pacl_node_q = &pacl_list->acl_node_q; ++ ++ DBG_88E("%s(acl_num =%d) =%pM\n", __func__, pacl_list->num, (addr)); ++ ++ if ((NUM_ACL - 1) < pacl_list->num) ++ return -1; ++ ++ spin_lock_bh(&pacl_node_q->lock); ++ ++ phead = get_list_head(pacl_node_q); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ paclnode = container_of(plist, struct rtw_wlan_acl_node, list); ++ plist = plist->next; ++ ++ if (!memcmp(paclnode->addr, addr, ETH_ALEN)) { ++ if (paclnode->valid) { ++ added = true; ++ DBG_88E("%s, sta has been added\n", __func__); ++ break; ++ } ++ } ++ } ++ ++ spin_unlock_bh(&pacl_node_q->lock); ++ ++ if (added) ++ return ret; ++ ++ spin_lock_bh(&pacl_node_q->lock); ++ ++ for (i = 0; i < NUM_ACL; i++) { ++ paclnode = &pacl_list->aclnode[i]; ++ ++ if (!paclnode->valid) { ++ INIT_LIST_HEAD(&paclnode->list); ++ ++ memcpy(paclnode->addr, addr, ETH_ALEN); ++ ++ paclnode->valid = true; ++ ++ list_add_tail(&paclnode->list, get_list_head(pacl_node_q)); ++ ++ pacl_list->num++; ++ ++ break; ++ } ++ } ++ ++ DBG_88E("%s, acl_num =%d\n", __func__, pacl_list->num); ++ ++ spin_unlock_bh(&pacl_node_q->lock); ++ ++ return ret; ++} ++ ++int rtw_acl_remove_sta(struct adapter *padapter, u8 *addr) ++{ ++ struct list_head *plist, *phead; ++ int ret = 0; ++ struct rtw_wlan_acl_node *paclnode; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ struct __queue *pacl_node_q = &pacl_list->acl_node_q; ++ ++ DBG_88E("%s(acl_num =%d) =%pM\n", __func__, pacl_list->num, (addr)); ++ ++ spin_lock_bh(&pacl_node_q->lock); ++ ++ phead = get_list_head(pacl_node_q); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ paclnode = container_of(plist, struct rtw_wlan_acl_node, list); ++ plist = plist->next; ++ ++ if (!memcmp(paclnode->addr, addr, ETH_ALEN)) { ++ if (paclnode->valid) { ++ paclnode->valid = false; ++ ++ list_del_init(&paclnode->list); ++ ++ pacl_list->num--; ++ } ++ } ++ } ++ ++ spin_unlock_bh(&pacl_node_q->lock); ++ ++ DBG_88E("%s, acl_num =%d\n", __func__, pacl_list->num); ++ return ret; ++} ++ ++static void update_bcn_fixed_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_erpinfo_ie(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network; ++ unsigned char *p, *ie = pnetwork->IEs; ++ u32 len = 0; ++ ++ DBG_88E("%s, ERP_enable =%d\n", __func__, pmlmeinfo->ERP_enable); ++ ++ if (!pmlmeinfo->ERP_enable) ++ return; ++ ++ /* parsing ERP_IE */ ++ p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, ++ (pnetwork->IELength - _BEACON_IE_OFFSET_)); ++ if (p && len > 0) { ++ struct ndis_802_11_var_ie *pIE = (struct ndis_802_11_var_ie *)p; ++ ++ if (pmlmepriv->num_sta_non_erp == 1) ++ pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT | RTW_ERP_INFO_USE_PROTECTION; ++ else ++ pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT | RTW_ERP_INFO_USE_PROTECTION); ++ ++ if (pmlmepriv->num_sta_no_short_preamble > 0) ++ pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; ++ else ++ pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); ++ ++ ERP_IE_handler(padapter, pIE); ++ } ++} ++ ++static void update_bcn_htcap_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_htinfo_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_rsn_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_wpa_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_wmm_ie(struct adapter *padapter) ++{ ++ DBG_88E("%s\n", __func__); ++} ++ ++static void update_bcn_wps_ie(struct adapter *padapter) ++{ ++ u8 *pwps_ie = NULL, *pwps_ie_src; ++ u8 *premainder_ie, *pbackup_remainder_ie = NULL; ++ uint wps_ielen = 0, wps_offset, remainder_ielen; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network; ++ unsigned char *ie = pnetwork->IEs; ++ u32 ielen = pnetwork->IELength; ++ ++ DBG_88E("%s\n", __func__); ++ ++ pwps_ie = rtw_get_wps_ie(ie + _FIXED_IE_LENGTH_, ielen - _FIXED_IE_LENGTH_, NULL, &wps_ielen); ++ ++ if (!pwps_ie || wps_ielen == 0) ++ return; ++ ++ wps_offset = (uint)(pwps_ie - ie); ++ ++ premainder_ie = pwps_ie + wps_ielen; ++ ++ remainder_ielen = ielen - wps_offset - wps_ielen; ++ ++ if (remainder_ielen > 0) { ++ pbackup_remainder_ie = kmalloc(remainder_ielen, GFP_ATOMIC); ++ if (pbackup_remainder_ie) ++ memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); ++ } ++ ++ pwps_ie_src = pmlmepriv->wps_beacon_ie; ++ if (!pwps_ie_src) ++ goto exit; ++ ++ wps_ielen = (uint)pwps_ie_src[1];/* to get ie data len */ ++ if ((wps_offset + wps_ielen + 2 + remainder_ielen) <= MAX_IE_SZ) { ++ memcpy(pwps_ie, pwps_ie_src, wps_ielen + 2); ++ pwps_ie += (wps_ielen + 2); ++ ++ if (pbackup_remainder_ie) ++ memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); ++ ++ /* update IELength */ ++ pnetwork->IELength = wps_offset + (wps_ielen + 2) + remainder_ielen; ++ } ++ ++exit: ++ kfree(pbackup_remainder_ie); ++} ++ ++static void update_bcn_p2p_ie(struct adapter *padapter) ++{ ++} ++ ++static void update_bcn_vendor_spec_ie(struct adapter *padapter, u8 *oui) ++{ ++ DBG_88E("%s\n", __func__); ++ ++ if (!memcmp(RTW_WPA_OUI, oui, 4)) ++ update_bcn_wpa_ie(padapter); ++ else if (!memcmp(WMM_OUI, oui, 4)) ++ update_bcn_wmm_ie(padapter); ++ else if (!memcmp(WPS_OUI, oui, 4)) ++ update_bcn_wps_ie(padapter); ++ else if (!memcmp(P2P_OUI, oui, 4)) ++ update_bcn_p2p_ie(padapter); ++ else ++ DBG_88E("unknown OUI type!\n"); ++} ++ ++void update_beacon(struct adapter *padapter, u8 ie_id, u8 *oui, u8 tx) ++{ ++ struct mlme_priv *pmlmepriv; ++ struct mlme_ext_priv *pmlmeext; ++ ++ if (!padapter) ++ return; ++ ++ pmlmepriv = &padapter->mlmepriv; ++ pmlmeext = &padapter->mlmeextpriv; ++ ++ if (!pmlmeext->bstart_bss) ++ return; ++ ++ spin_lock_bh(&pmlmepriv->bcn_update_lock); ++ ++ switch (ie_id) { ++ case 0xFF: ++ update_bcn_fixed_ie(padapter);/* 8: TimeStamp, 2: Beacon Interval 2:Capability */ ++ break; ++ case _TIM_IE_: ++ update_BCNTIM(padapter); ++ break; ++ case _ERPINFO_IE_: ++ update_bcn_erpinfo_ie(padapter); ++ break; ++ case _HT_CAPABILITY_IE_: ++ update_bcn_htcap_ie(padapter); ++ break; ++ case _RSN_IE_2_: ++ update_bcn_rsn_ie(padapter); ++ break; ++ case _HT_ADD_INFO_IE_: ++ update_bcn_htinfo_ie(padapter); ++ break; ++ case _VENDOR_SPECIFIC_IE_: ++ update_bcn_vendor_spec_ie(padapter, oui); ++ break; ++ default: ++ break; ++ } ++ ++ pmlmepriv->update_bcn = true; ++ ++ spin_unlock_bh(&pmlmepriv->bcn_update_lock); ++ ++ if (tx) ++ set_tx_beacon_cmd(padapter); ++} ++ ++/* ++op_mode ++Set to 0 (HT pure) under the followign conditions ++ - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or ++ - all STAs in the BSS are 20 MHz HT in 20 MHz BSS ++Set to 1 (HT non-member protection) if there may be non-HT STAs ++ in both the primary and the secondary channel ++Set to 2 if only HT STAs are associated in BSS, ++ however and at least one 20 MHz HT STA is associated ++Set to 3 (HT mixed mode) when one or more non-HT STAs are associated ++ (currently non-GF HT station is considered as non-HT STA also) ++*/ ++static int rtw_ht_operation_update(struct adapter *padapter) ++{ ++ u16 cur_op_mode, new_op_mode; ++ int op_mode_changes = 0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; ++ ++ if (pmlmepriv->htpriv.ht_option) ++ return 0; ++ ++ DBG_88E("%s current operation mode = 0x%X\n", ++ __func__, pmlmepriv->ht_op_mode); ++ ++ if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && ++ pmlmepriv->num_sta_ht_no_gf) { ++ pmlmepriv->ht_op_mode |= ++ HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; ++ op_mode_changes++; ++ } else if ((pmlmepriv->ht_op_mode & ++ HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && ++ pmlmepriv->num_sta_ht_no_gf == 0) { ++ pmlmepriv->ht_op_mode &= ++ ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; ++ op_mode_changes++; ++ } ++ ++ if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && ++ (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { ++ pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; ++ op_mode_changes++; ++ } else if ((pmlmepriv->ht_op_mode & ++ HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && ++ (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { ++ pmlmepriv->ht_op_mode &= ++ ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; ++ op_mode_changes++; ++ } ++ ++ /* Note: currently we switch to the MIXED op mode if HT non-greenfield ++ * station is associated. Probably it's a theoretical case, since ++ * it looks like all known HT STAs support greenfield. ++ */ ++ new_op_mode = 0; ++ if (pmlmepriv->num_sta_no_ht || ++ (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) ++ new_op_mode = OP_MODE_MIXED; ++ else if ((le16_to_cpu(phtpriv_ap->ht_cap.cap_info) & ++ IEEE80211_HT_CAP_SUP_WIDTH_20_40) && ++ pmlmepriv->num_sta_ht_20mhz) ++ new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; ++ else if (pmlmepriv->olbc_ht) ++ new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; ++ else ++ new_op_mode = OP_MODE_PURE; ++ ++ cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; ++ if (cur_op_mode != new_op_mode) { ++ pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; ++ pmlmepriv->ht_op_mode |= new_op_mode; ++ op_mode_changes++; ++ } ++ ++ DBG_88E("%s new operation mode = 0x%X changes =%d\n", ++ __func__, pmlmepriv->ht_op_mode, op_mode_changes); ++ ++ return op_mode_changes; ++} ++ ++void associated_clients_update(struct adapter *padapter, u8 updated) ++{ ++ /* update associcated stations cap. */ ++ if (updated) { ++ struct list_head *phead, *plist; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* check asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ ++ plist = plist->next; ++ ++ VCS_update(padapter, psta); ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ } ++} ++ ++/* called > TSR LEVEL for USB or SDIO Interface*/ ++void bss_cap_update_on_sta_join(struct adapter *padapter, struct sta_info *psta) ++{ ++ u8 beacon_updated = false; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ if (!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) { ++ if (!psta->no_short_preamble_set) { ++ psta->no_short_preamble_set = 1; ++ ++ pmlmepriv->num_sta_no_short_preamble++; ++ ++ if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && ++ (pmlmepriv->num_sta_no_short_preamble == 1)) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ } else { ++ if (psta->no_short_preamble_set) { ++ psta->no_short_preamble_set = 0; ++ ++ pmlmepriv->num_sta_no_short_preamble--; ++ ++ if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && ++ (pmlmepriv->num_sta_no_short_preamble == 0)) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ } ++ ++ if (psta->flags & WLAN_STA_NONERP) { ++ if (!psta->nonerp_set) { ++ psta->nonerp_set = 1; ++ ++ pmlmepriv->num_sta_non_erp++; ++ ++ if (pmlmepriv->num_sta_non_erp == 1) { ++ beacon_updated = true; ++ update_beacon(padapter, _ERPINFO_IE_, NULL, true); ++ } ++ } ++ } else { ++ if (psta->nonerp_set) { ++ psta->nonerp_set = 0; ++ ++ pmlmepriv->num_sta_non_erp--; ++ ++ if (pmlmepriv->num_sta_non_erp == 0) { ++ beacon_updated = true; ++ update_beacon(padapter, _ERPINFO_IE_, NULL, true); ++ } ++ } ++ } ++ ++ if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) { ++ if (!psta->no_short_slot_time_set) { ++ psta->no_short_slot_time_set = 1; ++ ++ pmlmepriv->num_sta_no_short_slot_time++; ++ ++ if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && ++ (pmlmepriv->num_sta_no_short_slot_time == 1)) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ } else { ++ if (psta->no_short_slot_time_set) { ++ psta->no_short_slot_time_set = 0; ++ ++ pmlmepriv->num_sta_no_short_slot_time--; ++ ++ if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && ++ (pmlmepriv->num_sta_no_short_slot_time == 0)) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ } ++ ++ if (psta->flags & WLAN_STA_HT) { ++ u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); ++ ++ DBG_88E("HT: STA %pM HT Capabilities Info: 0x%04x\n", ++ (psta->hwaddr), ht_capab); ++ ++ if (psta->no_ht_set) { ++ psta->no_ht_set = 0; ++ pmlmepriv->num_sta_no_ht--; ++ } ++ ++ if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { ++ if (!psta->no_ht_gf_set) { ++ psta->no_ht_gf_set = 1; ++ pmlmepriv->num_sta_ht_no_gf++; ++ } ++ DBG_88E("%s STA %pM - no greenfield, num of non-gf stations %d\n", ++ __func__, (psta->hwaddr), ++ pmlmepriv->num_sta_ht_no_gf); ++ } ++ ++ if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH_20_40) == 0) { ++ if (!psta->ht_20mhz_set) { ++ psta->ht_20mhz_set = 1; ++ pmlmepriv->num_sta_ht_20mhz++; ++ } ++ DBG_88E("%s STA %pM - 20 MHz HT, num of 20MHz HT STAs %d\n", ++ __func__, (psta->hwaddr), ++ pmlmepriv->num_sta_ht_20mhz); ++ } ++ } else { ++ if (!psta->no_ht_set) { ++ psta->no_ht_set = 1; ++ pmlmepriv->num_sta_no_ht++; ++ } ++ if (pmlmepriv->htpriv.ht_option) { ++ DBG_88E("%s STA %pM - no HT, num of non-HT stations %d\n", ++ __func__, (psta->hwaddr), ++ pmlmepriv->num_sta_no_ht); ++ } ++ } ++ ++ if (rtw_ht_operation_update(padapter) > 0) { ++ update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, false); ++ update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, true); ++ } ++ ++ /* update associcated stations cap. */ ++ associated_clients_update(padapter, beacon_updated); ++ ++ DBG_88E("%s, updated =%d\n", __func__, beacon_updated); ++} ++ ++u8 bss_cap_update_on_sta_leave(struct adapter *padapter, struct sta_info *psta) ++{ ++ u8 beacon_updated = false; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ if (!psta) ++ return beacon_updated; ++ ++ if (psta->no_short_preamble_set) { ++ psta->no_short_preamble_set = 0; ++ pmlmepriv->num_sta_no_short_preamble--; ++ if (pmlmeext->cur_wireless_mode > WIRELESS_11B && ++ pmlmepriv->num_sta_no_short_preamble == 0) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ ++ if (psta->nonerp_set) { ++ psta->nonerp_set = 0; ++ pmlmepriv->num_sta_non_erp--; ++ if (pmlmepriv->num_sta_non_erp == 0) { ++ beacon_updated = true; ++ update_beacon(padapter, _ERPINFO_IE_, NULL, true); ++ } ++ } ++ ++ if (psta->no_short_slot_time_set) { ++ psta->no_short_slot_time_set = 0; ++ pmlmepriv->num_sta_no_short_slot_time--; ++ if (pmlmeext->cur_wireless_mode > WIRELESS_11B && ++ pmlmepriv->num_sta_no_short_slot_time == 0) { ++ beacon_updated = true; ++ update_beacon(padapter, 0xFF, NULL, true); ++ } ++ } ++ ++ if (psta->no_ht_gf_set) { ++ psta->no_ht_gf_set = 0; ++ pmlmepriv->num_sta_ht_no_gf--; ++ } ++ ++ if (psta->no_ht_set) { ++ psta->no_ht_set = 0; ++ pmlmepriv->num_sta_no_ht--; ++ } ++ ++ if (psta->ht_20mhz_set) { ++ psta->ht_20mhz_set = 0; ++ pmlmepriv->num_sta_ht_20mhz--; ++ } ++ ++ if (rtw_ht_operation_update(padapter) > 0) { ++ update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, false); ++ update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, true); ++ } ++ ++ /* update associcated stations cap. */ ++ ++ DBG_88E("%s, updated =%d\n", __func__, beacon_updated); ++ ++ return beacon_updated; ++} ++ ++u8 ap_free_sta(struct adapter *padapter, struct sta_info *psta, ++ bool active, u16 reason) ++{ ++ u8 beacon_updated = false; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (!psta) ++ return beacon_updated; ++ ++ /* tear down Rx AMPDU */ ++ send_delba(padapter, 0, psta->hwaddr);/* recipient */ ++ ++ /* tear down TX AMPDU */ ++ send_delba(padapter, 1, psta->hwaddr);/* originator */ ++ psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ ++ psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ ++ ++ if (active) ++ issue_deauth(padapter, psta->hwaddr, reason); ++ ++ /* clear cam entry / key */ ++ rtw_clearstakey_cmd(padapter, (u8 *)psta, (u8)(psta->mac_id + 3), true); ++ ++ spin_lock_bh(&psta->lock); ++ psta->state &= ~_FW_LINKED; ++ spin_unlock_bh(&psta->lock); ++ ++ rtw_indicate_sta_disassoc_event(padapter, psta); ++ ++ report_del_sta_event(padapter, psta->hwaddr, reason); ++ ++ beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(padapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ return beacon_updated; ++} ++ ++int rtw_ap_inform_ch_switch(struct adapter *padapter, u8 new_ch, u8 ch_offset) ++{ ++ struct list_head *phead, *plist; ++ int ret = 0; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ return ret; ++ ++ DBG_88E(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", ++ FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* for each sta in asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ plist = plist->next; ++ ++ issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); ++ psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); ++ ++ return ret; ++} ++ ++int rtw_sta_flush(struct adapter *padapter) ++{ ++ struct list_head *phead, *plist; ++ int ret = 0; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ return ret; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* free sta asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ ++ plist = plist->next; ++ ++ list_del_init(&psta->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ ++ ap_free_sta(padapter, psta, true, WLAN_REASON_DEAUTH_LEAVING); ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); ++ ++ associated_clients_update(padapter, true); ++ ++ return ret; ++} ++ ++/* called > TSR LEVEL for USB or SDIO Interface*/ ++void sta_info_update(struct adapter *padapter, struct sta_info *psta) ++{ ++ int flags = psta->flags; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ /* update wmm cap. */ ++ if (WLAN_STA_WME & flags) ++ psta->qos_option = 1; ++ else ++ psta->qos_option = 0; ++ ++ if (pmlmepriv->qospriv.qos_option == 0) ++ psta->qos_option = 0; ++ ++ /* update 802.11n ht cap. */ ++ if (WLAN_STA_HT & flags) { ++ psta->htpriv.ht_option = true; ++ psta->qos_option = 1; ++ } else { ++ psta->htpriv.ht_option = false; ++ } ++ ++ if (!pmlmepriv->htpriv.ht_option) ++ psta->htpriv.ht_option = false; ++ ++ update_sta_info_apmode(padapter, psta); ++} ++ ++/* called >= TSR LEVEL for USB or SDIO Interface*/ ++void ap_sta_info_defer_update(struct adapter *padapter, struct sta_info *psta) ++{ ++ if (psta->state & _FW_LINKED) { ++ /* add ratid */ ++ add_RATid(padapter, psta, 0);/* DM_RATR_STA_INIT */ ++ } ++} ++ ++void start_ap_mode(struct adapter *padapter) ++{ ++ int i; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ ++ pmlmepriv->update_bcn = false; ++ ++ pmlmeext->bstart_bss = false; ++ ++ pmlmepriv->num_sta_non_erp = 0; ++ ++ pmlmepriv->num_sta_no_short_slot_time = 0; ++ ++ pmlmepriv->num_sta_no_short_preamble = 0; ++ ++ pmlmepriv->num_sta_ht_no_gf = 0; ++ pmlmepriv->num_sta_no_ht = 0; ++ pmlmepriv->num_sta_ht_20mhz = 0; ++ ++ pmlmepriv->olbc = false; ++ ++ pmlmepriv->olbc_ht = false; ++ ++ pmlmepriv->ht_op_mode = 0; ++ ++ for (i = 0; i < NUM_STA; i++) ++ pstapriv->sta_aid[i] = NULL; ++ ++ pmlmepriv->wps_beacon_ie = NULL; ++ pmlmepriv->wps_probe_resp_ie = NULL; ++ pmlmepriv->wps_assoc_resp_ie = NULL; ++ ++ pmlmepriv->p2p_beacon_ie = NULL; ++ pmlmepriv->p2p_probe_resp_ie = NULL; ++ ++ /* for ACL */ ++ INIT_LIST_HEAD(&pacl_list->acl_node_q.queue); ++ pacl_list->num = 0; ++ pacl_list->mode = 0; ++ for (i = 0; i < NUM_ACL; i++) { ++ INIT_LIST_HEAD(&pacl_list->aclnode[i].list); ++ pacl_list->aclnode[i].valid = false; ++ } ++} ++ ++void stop_ap_mode(struct adapter *padapter) ++{ ++ struct list_head *phead, *plist; ++ struct rtw_wlan_acl_node *paclnode; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ struct __queue *pacl_node_q = &pacl_list->acl_node_q; ++ ++ pmlmepriv->update_bcn = false; ++ pmlmeext->bstart_bss = false; ++ ++ /* reset and init security priv , this can refine with rtw_reset_securitypriv */ ++ memset((unsigned char *)&padapter->securitypriv, 0, sizeof(struct security_priv)); ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; ++ ++ /* for ACL */ ++ spin_lock_bh(&pacl_node_q->lock); ++ phead = get_list_head(pacl_node_q); ++ plist = phead->next; ++ while (phead != plist) { ++ paclnode = container_of(plist, struct rtw_wlan_acl_node, list); ++ plist = plist->next; ++ ++ if (paclnode->valid) { ++ paclnode->valid = false; ++ ++ list_del_init(&paclnode->list); ++ ++ pacl_list->num--; ++ } ++ } ++ spin_unlock_bh(&pacl_node_q->lock); ++ ++ DBG_88E("%s, free acl_node_queue, num =%d\n", __func__, pacl_list->num); ++ ++ rtw_sta_flush(padapter); ++ ++ /* free_assoc_sta_resources */ ++ rtw_free_all_stainfo(padapter); ++ ++ psta = rtw_get_bcmc_stainfo(padapter); ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(padapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ rtw_init_bcmc_stainfo(padapter); ++ ++ rtw_free_mlme_priv_ie_data(pmlmepriv); ++} ++ ++#endif /* CONFIG_88EU_AP_MODE */ +diff --git a/drivers/staging/r8188eu/core/rtw_br_ext.c b/drivers/staging/r8188eu/core/rtw_br_ext.c +new file mode 100644 +index 000000000000..62a672243696 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_br_ext.c +@@ -0,0 +1,717 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. i*/ ++ ++#define _RTW_BR_EXT_C_ ++ ++#include "../include/linux/if_arp.h" ++#include "../include/net/ip.h" ++#include "../include/linux/atalk.h" ++#include "../include/linux/udp.h" ++#include "../include/linux/if_pppox.h" ++ ++#include "../include/drv_types.h" ++#include "../include/rtw_br_ext.h" ++#include "../include/usb_osintf.h" ++#include "../include/recv_osdep.h" ++ ++#ifndef csum_ipv6_magic ++#include "../include/net/ip6_checksum.h" ++#endif ++ ++#include "../include/linux/ipv6.h" ++#include "../include/linux/icmpv6.h" ++#include "../include/net/ndisc.h" ++#include "../include/net/checksum.h" ++ ++#define NAT25_IPV4 01 ++#define NAT25_IPV6 02 ++#define NAT25_IPX 03 ++#define NAT25_APPLE 04 ++#define NAT25_PPPOE 05 ++ ++#define RTL_RELAY_TAG_LEN (ETH_ALEN) ++#define TAG_HDR_LEN 4 ++ ++#define MAGIC_CODE 0x8186 ++#define MAGIC_CODE_LEN 2 ++#define WAIT_TIME_PPPOE 5 /* waiting time for pppoe server in sec */ ++ ++/*----------------------------------------------------------------- ++ How database records network address: ++ 0 1 2 3 4 5 6 7 8 9 10 ++ |----|----|----|----|----|----|----|----|----|----|----| ++ IPv4 |type| | IP addr | ++ IPX |type| Net addr | Node addr | ++ IPX |type| Net addr |Sckt addr| ++ Apple |type| Network |node| ++ PPPoE |type| SID | AC MAC | ++-----------------------------------------------------------------*/ ++ ++/* Find a tag in pppoe frame and return the pointer */ ++static unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned short type) ++{ ++ unsigned char *cur_ptr, *start_ptr; ++ unsigned short tagLen, tagType; ++ ++ start_ptr = cur_ptr = (unsigned char *)ph->tag; ++ while ((cur_ptr - start_ptr) < ntohs(ph->length)) { ++ /* prevent un-alignment access */ ++ tagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]); ++ tagLen = (unsigned short)((cur_ptr[2] << 8) + cur_ptr[3]); ++ if (tagType == type) ++ return cur_ptr; ++ cur_ptr = cur_ptr + TAG_HDR_LEN + tagLen; ++ } ++ return NULL; ++} ++ ++static int __nat25_add_pppoe_tag(struct sk_buff *skb, struct pppoe_tag *tag) ++{ ++ struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN); ++ int data_len; ++ ++ data_len = tag->tag_len + TAG_HDR_LEN; ++ if (skb_tailroom(skb) < data_len) { ++ _DEBUG_ERR("skb_tailroom() failed in add SID tag!\n"); ++ return -1; ++ } ++ ++ skb_put(skb, data_len); ++ /* have a room for new tag */ ++ memmove(((unsigned char *)ph->tag + data_len), (unsigned char *)ph->tag, ntohs(ph->length)); ++ ph->length = htons(ntohs(ph->length) + data_len); ++ memcpy((unsigned char *)ph->tag, tag, data_len); ++ return data_len; ++} ++ ++static int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len) ++{ ++ int tail_len; ++ unsigned long end, tail; ++ ++ if ((src+len) > skb_tail_pointer(skb) || skb->len < len) ++ return -1; ++ ++ tail = (unsigned long)skb_tail_pointer(skb); ++ end = (unsigned long)src+len; ++ if (tail < end) ++ return -1; ++ ++ tail_len = (int)(tail-end); ++ if (tail_len > 0) ++ memmove(src, src+len, tail_len); ++ ++ skb_trim(skb, skb->len-len); ++ return 0; ++} ++ ++static unsigned long __nat25_timeout(struct adapter *priv) ++{ ++ unsigned long timeout; ++ ++ timeout = jiffies - NAT25_AGEING_TIME*HZ; ++ ++ return timeout; ++} ++ ++static int __nat25_has_expired(struct adapter *priv, ++ struct nat25_network_db_entry *fdb) ++{ ++ if (time_before_eq(fdb->ageing_timer, __nat25_timeout(priv))) ++ return 1; ++ ++ return 0; ++} ++ ++static void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr, ++ unsigned int *ipAddr) ++{ ++ memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); ++ ++ networkAddr[0] = NAT25_IPV4; ++ memcpy(networkAddr+7, (unsigned char *)ipAddr, 4); ++} ++ ++static void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr, ++ unsigned char *ac_mac, __be16 *sid) ++{ ++ memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); ++ ++ networkAddr[0] = NAT25_PPPOE; ++ memcpy(networkAddr+1, (unsigned char *)sid, 2); ++ memcpy(networkAddr+3, (unsigned char *)ac_mac, 6); ++} ++ ++static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr, ++ unsigned int *ipAddr) ++{ ++ memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); ++ ++ networkAddr[0] = NAT25_IPV6; ++ memcpy(networkAddr+1, (unsigned char *)ipAddr, 16); ++} ++ ++static unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b) ++{ ++ while (len > 0) { ++ if (*data == tag && *(data+1) == len8b && len >= len8b*8) ++ return data+2; ++ ++ len -= (*(data+1))*8; ++ data += (*(data+1))*8; ++ } ++ return NULL; ++} ++ ++static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char *replace_mac) ++{ ++ struct icmp6hdr *icmphdr = (struct icmp6hdr *)data; ++ unsigned char *mac; ++ ++ if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) { ++ if (len >= 8) { ++ mac = scan_tlv(&data[8], len-8, 1, 1); ++ if (mac) { ++ _DEBUG_INFO("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ++ replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); ++ memcpy(mac, replace_mac, 6); ++ return 1; ++ } ++ } ++ } else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) { ++ if (len >= 16) { ++ mac = scan_tlv(&data[16], len-16, 1, 1); ++ if (mac) { ++ _DEBUG_INFO("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ++ replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); ++ memcpy(mac, replace_mac, 6); ++ return 1; ++ } ++ } ++ } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) { ++ if (len >= 24) { ++ mac = scan_tlv(&data[24], len-24, 1, 1); ++ if (mac) { ++ _DEBUG_INFO("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ++ replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); ++ memcpy(mac, replace_mac, 6); ++ return 1; ++ } ++ } ++ } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) { ++ if (len >= 24) { ++ mac = scan_tlv(&data[24], len-24, 2, 1); ++ if (mac) { ++ _DEBUG_INFO("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ++ replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); ++ memcpy(mac, replace_mac, 6); ++ return 1; ++ } ++ } ++ } else if (icmphdr->icmp6_type == NDISC_REDIRECT) { ++ if (len >= 40) { ++ mac = scan_tlv(&data[40], len-40, 2, 1); ++ if (mac) { ++ _DEBUG_INFO("Redirect, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ++ replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); ++ memcpy(mac, replace_mac, 6); ++ return 1; ++ } ++ } ++ } ++ return 0; ++} ++ ++static int __nat25_network_hash(unsigned char *networkAddr) ++{ ++ if (networkAddr[0] == NAT25_IPV4) { ++ unsigned long x; ++ ++ x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } else if (networkAddr[0] == NAT25_IPX) { ++ unsigned long x; ++ ++ x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ ++ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } else if (networkAddr[0] == NAT25_APPLE) { ++ unsigned long x; ++ ++ x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } else if (networkAddr[0] == NAT25_PPPOE) { ++ unsigned long x; ++ ++ x = networkAddr[0] ^ networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } else if (networkAddr[0] == NAT25_IPV6) { ++ unsigned long x; ++ ++ x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ ++ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10] ^ ++ networkAddr[11] ^ networkAddr[12] ^ networkAddr[13] ^ networkAddr[14] ^ networkAddr[15] ^ ++ networkAddr[16]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } else { ++ unsigned long x = 0; ++ int i; ++ ++ for (i = 0; i < MAX_NETWORK_ADDR_LEN; i++) ++ x ^= networkAddr[i]; ++ ++ return x & (NAT25_HASH_SIZE - 1); ++ } ++} ++ ++static void __network_hash_link(struct adapter *priv, ++ struct nat25_network_db_entry *ent, int hash) ++{ ++ /* Caller must spin_lock already! */ ++ ent->next_hash = priv->nethash[hash]; ++ if (ent->next_hash) ++ ent->next_hash->pprev_hash = &ent->next_hash; ++ priv->nethash[hash] = ent; ++ ent->pprev_hash = &priv->nethash[hash]; ++} ++ ++static void __network_hash_unlink(struct nat25_network_db_entry *ent) ++{ ++ /* Caller must spin_lock already! */ ++ *ent->pprev_hash = ent->next_hash; ++ if (ent->next_hash) ++ ent->next_hash->pprev_hash = ent->pprev_hash; ++ ent->next_hash = NULL; ++ ent->pprev_hash = NULL; ++} ++ ++static void __nat25_db_network_insert(struct adapter *priv, ++ unsigned char *macAddr, unsigned char *networkAddr) ++{ ++ struct nat25_network_db_entry *db; ++ int hash; ++ ++ spin_lock_bh(&priv->br_ext_lock); ++ hash = __nat25_network_hash(networkAddr); ++ db = priv->nethash[hash]; ++ while (db) { ++ if (!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { ++ memcpy(db->macAddr, macAddr, ETH_ALEN); ++ db->ageing_timer = jiffies; ++ spin_unlock_bh(&priv->br_ext_lock); ++ return; ++ } ++ db = db->next_hash; ++ } ++ db = kmalloc(sizeof(*db), GFP_ATOMIC); ++ if (!db) { ++ spin_unlock_bh(&priv->br_ext_lock); ++ return; ++ } ++ memcpy(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN); ++ memcpy(db->macAddr, macAddr, ETH_ALEN); ++ atomic_set(&db->use_count, 1); ++ db->ageing_timer = jiffies; ++ ++ __network_hash_link(priv, db, hash); ++ ++ spin_unlock_bh(&priv->br_ext_lock); ++} ++ ++static void __nat25_db_print(struct adapter *priv) ++{ ++} ++ ++/* ++ * NAT2.5 interface ++ */ ++ ++void nat25_db_cleanup(struct adapter *priv) ++{ ++ int i; ++ ++ spin_lock_bh(&priv->br_ext_lock); ++ ++ for (i = 0; i < NAT25_HASH_SIZE; i++) { ++ struct nat25_network_db_entry *f; ++ f = priv->nethash[i]; ++ while (f) { ++ struct nat25_network_db_entry *g; ++ ++ g = f->next_hash; ++ if (priv->scdb_entry == f) { ++ memset(priv->scdb_mac, 0, ETH_ALEN); ++ memset(priv->scdb_ip, 0, 4); ++ priv->scdb_entry = NULL; ++ } ++ __network_hash_unlink(f); ++ kfree(f); ++ f = g; ++ } ++ } ++ spin_unlock_bh(&priv->br_ext_lock); ++} ++ ++void nat25_db_expire(struct adapter *priv) ++{ ++ int i; ++ ++ spin_lock_bh(&priv->br_ext_lock); ++ ++ for (i = 0; i < NAT25_HASH_SIZE; i++) { ++ struct nat25_network_db_entry *f; ++ f = priv->nethash[i]; ++ ++ while (f) { ++ struct nat25_network_db_entry *g; ++ g = f->next_hash; ++ ++ if (__nat25_has_expired(priv, f)) { ++ if (atomic_dec_and_test(&f->use_count)) { ++ if (priv->scdb_entry == f) { ++ memset(priv->scdb_mac, 0, ETH_ALEN); ++ memset(priv->scdb_ip, 0, 4); ++ priv->scdb_entry = NULL; ++ } ++ __network_hash_unlink(f); ++ kfree(f); ++ } ++ } ++ f = g; ++ } ++ } ++ spin_unlock_bh(&priv->br_ext_lock); ++} ++ ++int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) ++{ ++ unsigned short protocol; ++ unsigned char networkAddr[MAX_NETWORK_ADDR_LEN]; ++ unsigned int tmp; ++ ++ if (!skb) ++ return -1; ++ ++ if ((method <= NAT25_MIN) || (method >= NAT25_MAX)) ++ return -1; ++ ++ protocol = be16_to_cpu(*((__be16 *)(skb->data + 2 * ETH_ALEN))); ++ ++ /*---------------------------------------------------*/ ++ /* Handle IP frame */ ++ /*---------------------------------------------------*/ ++ if (protocol == ETH_P_IP) { ++ struct iphdr *iph = (struct iphdr *)(skb->data + ETH_HLEN); ++ ++ if (((unsigned char *)(iph) + (iph->ihl<<2)) >= (skb->data + ETH_HLEN + skb->len)) { ++ DEBUG_WARN("NAT25: malformed IP packet !\n"); ++ return -1; ++ } ++ ++ switch (method) { ++ case NAT25_CHECK: ++ return -1; ++ case NAT25_INSERT: ++ /* some multicast with source IP is all zero, maybe other case is illegal */ ++ /* in class A, B, C, host address is all zero or all one is illegal */ ++ if (iph->saddr == 0) ++ return 0; ++ tmp = be32_to_cpu(iph->saddr); ++ DEBUG_INFO("NAT25: Insert IP, SA =%08x, DA =%08x\n", tmp, iph->daddr); ++ __nat25_generate_ipv4_network_addr(networkAddr, &tmp); ++ /* record source IP address and , source mac address into db */ ++ __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); ++ ++ __nat25_db_print(priv); ++ return 0; ++ default: ++ return -1; ++ } ++ } else if (protocol == ETH_P_ARP) { ++ /*---------------------------------------------------*/ ++ /* Handle ARP frame */ ++ /*---------------------------------------------------*/ ++ struct arphdr *arp = (struct arphdr *)(skb->data + ETH_HLEN); ++ unsigned char *arp_ptr = (unsigned char *)(arp + 1); ++ unsigned int *sender; ++ ++ if (arp->ar_pro != __constant_htons(ETH_P_IP)) { ++ DEBUG_WARN("NAT25: arp protocol unknown (%4x)!\n", be16_to_cpu(arp->ar_pro)); ++ return -1; ++ } ++ ++ switch (method) { ++ case NAT25_CHECK: ++ return 0; /* skb_copy for all ARP frame */ ++ case NAT25_INSERT: ++ DEBUG_INFO("NAT25: Insert ARP, MAC =%02x%02x%02x%02x%02x%02x\n", arp_ptr[0], ++ arp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]); ++ ++ /* change to ARP sender mac address to wlan STA address */ ++ memcpy(arp_ptr, GET_MY_HWADDR(priv), ETH_ALEN); ++ arp_ptr += arp->ar_hln; ++ sender = (unsigned int *)arp_ptr; ++ __nat25_generate_ipv4_network_addr(networkAddr, sender); ++ __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); ++ __nat25_db_print(priv); ++ return 0; ++ default: ++ return -1; ++ } ++ } else if ((protocol == ETH_P_PPP_DISC) || ++ (protocol == ETH_P_PPP_SES)) { ++ /*---------------------------------------------------*/ ++ /* Handle PPPoE frame */ ++ /*---------------------------------------------------*/ ++ struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN); ++ unsigned short *pMagic; ++ ++ switch (method) { ++ case NAT25_CHECK: ++ if (ph->sid == 0) ++ return 0; ++ return 1; ++ case NAT25_INSERT: ++ if (ph->sid == 0) { /* Discovery phase according to tag */ ++ if (ph->code == PADI_CODE || ph->code == PADR_CODE) { ++ if (priv->ethBrExtInfo.addPPPoETag) { ++ struct pppoe_tag *tag, *pOldTag; ++ unsigned char tag_buf[40]; ++ int old_tag_len = 0; ++ ++ tag = (struct pppoe_tag *)tag_buf; ++ pOldTag = (struct pppoe_tag *)__nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID)); ++ if (pOldTag) { /* if SID existed, copy old value and delete it */ ++ old_tag_len = ntohs(pOldTag->tag_len); ++ if (old_tag_len+TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN > sizeof(tag_buf)) { ++ DEBUG_ERR("SID tag length too long!\n"); ++ return -1; ++ } ++ ++ memcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN, ++ pOldTag->tag_data, old_tag_len); ++ ++ if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0) { ++ DEBUG_ERR("call skb_pull_and_merge() failed in PADI/R packet!\n"); ++ return -1; ++ } ++ ph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len); ++ } ++ ++ tag->tag_type = PTT_RELAY_SID; ++ tag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len); ++ ++ /* insert the magic_code+client mac in relay tag */ ++ pMagic = (unsigned short *)tag->tag_data; ++ *pMagic = htons(MAGIC_CODE); ++ memcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN); ++ ++ /* Add relay tag */ ++ if (__nat25_add_pppoe_tag(skb, tag) < 0) ++ return -1; ++ ++ DEBUG_INFO("NAT25: Insert PPPoE, forward %s packet\n", ++ (ph->code == PADI_CODE ? "PADI" : "PADR")); ++ } else { /* not add relay tag */ ++ if (priv->pppoe_connection_in_progress && ++ memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) { ++ DEBUG_ERR("Discard PPPoE packet due to another PPPoE connection is in progress!\n"); ++ return -2; ++ } ++ ++ if (priv->pppoe_connection_in_progress == 0) ++ memcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN); ++ ++ priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE; ++ } ++ } else { ++ return -1; ++ } ++ } else { /* session phase */ ++ DEBUG_INFO("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name); ++ ++ __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &ph->sid); ++ ++ __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); ++ ++ __nat25_db_print(priv); ++ ++ if (!priv->ethBrExtInfo.addPPPoETag && ++ priv->pppoe_connection_in_progress && ++ !memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) ++ priv->pppoe_connection_in_progress = 0; ++ } ++ return 0; ++ default: ++ return -1; ++ } ++ } else if (protocol == 0x888e) { ++ /*---------------------------------------------------*/ ++ /* Handle EAP frame */ ++ /*---------------------------------------------------*/ ++ switch (method) { ++ case NAT25_CHECK: ++ return -1; ++ case NAT25_INSERT: ++ return 0; ++ default: ++ return -1; ++ } ++ } else if ((protocol == 0xe2ae) || (protocol == 0xe2af)) { ++ /*---------------------------------------------------*/ ++ /* Handle C-Media proprietary frame */ ++ /*---------------------------------------------------*/ ++ switch (method) { ++ case NAT25_CHECK: ++ return -1; ++ case NAT25_INSERT: ++ return 0; ++ default: ++ return -1; ++ } ++ } else if (protocol == ETH_P_IPV6) { ++ /*------------------------------------------------*/ ++ /* Handle IPV6 frame */ ++ /*------------------------------------------------*/ ++ struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN); ++ ++ if (sizeof(*iph) >= (skb->len - ETH_HLEN)) { ++ DEBUG_WARN("NAT25: malformed IPv6 packet !\n"); ++ return -1; ++ } ++ ++ switch (method) { ++ case NAT25_CHECK: ++ if (skb->data[0] & 1) ++ return 0; ++ return -1; ++ case NAT25_INSERT: ++ DEBUG_INFO("NAT25: Insert IP, SA =%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x," ++ " DA =%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", ++ iph->saddr.s6_addr16[0], iph->saddr.s6_addr16[1], iph->saddr.s6_addr16[2], iph->saddr.s6_addr16[3], ++ iph->saddr.s6_addr16[4], iph->saddr.s6_addr16[5], iph->saddr.s6_addr16[6], iph->saddr.s6_addr16[7], ++ iph->daddr.s6_addr16[0], iph->daddr.s6_addr16[1], iph->daddr.s6_addr16[2], iph->daddr.s6_addr16[3], ++ iph->daddr.s6_addr16[4], iph->daddr.s6_addr16[5], iph->daddr.s6_addr16[6], iph->daddr.s6_addr16[7]); ++ ++ if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) { ++ __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr); ++ __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); ++ __nat25_db_print(priv); ++ ++ if (iph->nexthdr == IPPROTO_ICMPV6 && ++ skb->len > (ETH_HLEN + sizeof(*iph) + 4)) { ++ if (update_nd_link_layer_addr(skb->data + ETH_HLEN + sizeof(*iph), ++ skb->len - ETH_HLEN - sizeof(*iph), GET_MY_HWADDR(priv))) { ++ struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph)); ++ hdr->icmp6_cksum = 0; ++ hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr, ++ iph->payload_len, ++ IPPROTO_ICMPV6, ++ csum_partial((__u8 *)hdr, iph->payload_len, 0)); ++ } ++ } ++ } ++ return 0; ++ default: ++ return -1; ++ } ++ } ++ return -1; ++} ++ ++#define SERVER_PORT 67 ++#define CLIENT_PORT 68 ++#define DHCP_MAGIC 0x63825363 ++#define BROADCAST_FLAG 0x8000 ++ ++struct dhcpMessage { ++ u_int8_t op; ++ u_int8_t htype; ++ u_int8_t hlen; ++ u_int8_t hops; ++ u_int32_t xid; ++ __be16 secs; ++ __be16 flags; ++ __be32 ciaddr; ++ __be32 yiaddr; ++ __be32 siaddr; ++ __be32 giaddr; ++ u_int8_t chaddr[16]; ++ u_int8_t sname[64]; ++ u_int8_t file[128]; ++ __be32 cookie; ++ u_int8_t options[308]; /* 312 - cookie */ ++}; ++ ++void dhcp_flag_bcast(struct adapter *priv, struct sk_buff *skb) ++{ ++ if (!skb) ++ return; ++ ++ if (!priv->ethBrExtInfo.dhcp_bcst_disable) { ++ __be16 protocol = *((__be16 *)(skb->data + 2 * ETH_ALEN)); ++ ++ if (protocol == __constant_htons(ETH_P_IP)) { /* IP */ ++ struct iphdr *iph = (struct iphdr *)(skb->data + ETH_HLEN); ++ ++ if (iph->protocol == IPPROTO_UDP) { /* UDP */ ++ struct udphdr *udph = (struct udphdr *)((size_t)iph + (iph->ihl << 2)); ++ ++ if ((udph->source == __constant_htons(CLIENT_PORT)) && ++ (udph->dest == __constant_htons(SERVER_PORT))) { /* DHCP request */ ++ struct dhcpMessage *dhcph = ++ (struct dhcpMessage *)((size_t)udph + sizeof(struct udphdr)); ++ u32 cookie = be32_to_cpu((__be32)dhcph->cookie); ++ ++ if (cookie == DHCP_MAGIC) { /* match magic word */ ++ if (!(dhcph->flags & htons(BROADCAST_FLAG))) { ++ /* if not broadcast */ ++ register int sum = 0; ++ ++ DEBUG_INFO("DHCP: change flag of DHCP request to broadcast.\n"); ++ /* or BROADCAST flag */ ++ dhcph->flags |= htons(BROADCAST_FLAG); ++ /* recalculate checksum */ ++ sum = ~(udph->check) & 0xffff; ++ sum += be16_to_cpu(dhcph->flags); ++ while (sum >> 16) ++ sum = (sum & 0xffff) + (sum >> 16); ++ udph->check = ~sum; ++ } ++ } ++ } ++ } ++ } ++ } ++} ++ ++void *scdb_findEntry(struct adapter *priv, unsigned char *macAddr, ++ unsigned char *ipAddr) ++{ ++ unsigned char networkAddr[MAX_NETWORK_ADDR_LEN]; ++ struct nat25_network_db_entry *db; ++ int hash; ++ ++ __nat25_generate_ipv4_network_addr(networkAddr, (unsigned int *)ipAddr); ++ hash = __nat25_network_hash(networkAddr); ++ db = priv->nethash[hash]; ++ while (db) { ++ if (!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { ++ return (void *)db; ++ } ++ ++ db = db->next_hash; ++ } ++ ++ return NULL; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_cmd.c b/drivers/staging/r8188eu/core/rtw_cmd.c +new file mode 100644 +index 000000000000..ce73ac7cf973 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_cmd.c +@@ -0,0 +1,2128 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_CMD_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/mlme_osdep.h" ++#include "../include/rtw_br_ext.h" ++#include "../include/rtw_mlme_ext.h" ++ ++/* ++Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. ++No irqsave is necessary. ++*/ ++ ++static int _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) ++{ ++ int res = _SUCCESS; ++ ++ sema_init(&pcmdpriv->cmd_queue_sema, 0); ++ /* sema_init(&(pcmdpriv->cmd_done_sema), 0); */ ++ sema_init(&pcmdpriv->terminate_cmdthread_sema, 0); ++ ++ _rtw_init_queue(&pcmdpriv->cmd_queue); ++ ++ /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ ++ ++ pcmdpriv->cmd_seq = 1; ++ ++ pcmdpriv->cmd_allocated_buf = kzalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ, ++ GFP_KERNEL); ++ ++ if (!pcmdpriv->cmd_allocated_buf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ((size_t)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ - 1)); ++ ++ pcmdpriv->rsp_allocated_buf = kzalloc(MAX_RSPSZ + 4, GFP_KERNEL); ++ ++ if (!pcmdpriv->rsp_allocated_buf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ((size_t)(pcmdpriv->rsp_allocated_buf) & 3); ++ ++ pcmdpriv->cmd_issued_cnt = 0; ++ pcmdpriv->cmd_done_cnt = 0; ++ pcmdpriv->rsp_cnt = 0; ++exit: ++ ++ return res; ++} ++ ++static void c2h_wk_callback(struct work_struct *work); ++ ++static int _rtw_init_evt_priv(struct evt_priv *pevtpriv) ++{ ++ int res = _SUCCESS; ++ ++ /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ ++ atomic_set(&pevtpriv->event_seq, 0); ++ pevtpriv->evt_done_cnt = 0; ++ ++ _init_workitem(&pevtpriv->c2h_wk, c2h_wk_callback, NULL); ++ pevtpriv->c2h_wk_alive = false; ++ pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN + 1); ++ ++ return res; ++} ++ ++void rtw_free_evt_priv(struct evt_priv *pevtpriv) ++{ ++ _cancel_workitem_sync(&pevtpriv->c2h_wk); ++ while (pevtpriv->c2h_wk_alive) ++ msleep(10); ++ ++ while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) { ++ void *c2h = rtw_cbuf_pop(pevtpriv->c2h_queue); ++ if (c2h && c2h != (void *)pevtpriv) ++ kfree(c2h); ++ } ++} ++ ++static void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) ++{ ++ if (pcmdpriv) { ++ kfree(pcmdpriv->cmd_allocated_buf); ++ kfree(pcmdpriv->rsp_allocated_buf); ++ } ++} ++ ++/* ++Calling Context: ++ ++rtw_enqueue_cmd can only be called between kernel thread, ++since only spin_lock is used. ++ ++ISR/Call-Back functions can't call this sub-function. ++ ++*/ ++ ++static int _rtw_enqueue_cmd(struct __queue *queue, struct cmd_obj *obj) ++{ ++ unsigned long flags; ++ ++ if (!obj) ++ goto exit; ++ ++ spin_lock_irqsave(&queue->lock, flags); ++ ++ list_add_tail(&obj->list, &queue->queue); ++ ++ spin_unlock_irqrestore(&queue->lock, flags); ++ ++exit: ++ ++ return _SUCCESS; ++} ++ ++static struct cmd_obj *_rtw_dequeue_cmd(struct __queue *queue) ++{ ++ struct cmd_obj *obj; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&queue->lock, flags); ++ if (list_empty(&queue->queue)) { ++ obj = NULL; ++ } else { ++ obj = container_of((&queue->queue)->next, struct cmd_obj, list); ++ rtw_list_delete(&obj->list); ++ } ++ ++ spin_unlock_irqrestore(&queue->lock, flags); ++ ++ return obj; ++} ++ ++u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) ++{ ++ u32 res; ++ ++ res = _rtw_init_cmd_priv(pcmdpriv); ++ ++ return res; ++} ++ ++u32 rtw_init_evt_priv(struct evt_priv *pevtpriv) ++{ ++ int res; ++ ++ res = _rtw_init_evt_priv(pevtpriv); ++ ++ return res; ++} ++ ++void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) ++{ ++ _rtw_free_cmd_priv(pcmdpriv); ++} ++ ++static int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) ++{ ++ u8 bAllow = false; /* set to true to allow enqueuing cmd when hw_init_completed is false */ ++ ++ /* To decide allow or not */ ++ if ((pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect) && ++ (!pcmdpriv->padapter->registrypriv.usbss_enable)) { ++ if (cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; ++ if (pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) ++ bAllow = true; ++ } ++ } ++ ++ if (cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan)) ++ bAllow = true; ++ ++ if ((!pcmdpriv->padapter->hw_init_completed && !bAllow) || ++ !pcmdpriv->cmdthd_running) /* com_thread not running */ ++ return _FAIL; ++ return _SUCCESS; ++} ++ ++u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) ++{ ++ int res = _FAIL; ++ struct adapter *padapter = pcmdpriv->padapter; ++ ++ if (!cmd_obj) ++ goto exit; ++ ++ cmd_obj->padapter = padapter; ++ ++ res = rtw_cmd_filter(pcmdpriv, cmd_obj); ++ if (_FAIL == res) { ++ rtw_free_cmd_obj(cmd_obj); ++ goto exit; ++ } ++ ++ res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj); ++ ++ if (res == _SUCCESS) ++ up(&pcmdpriv->cmd_queue_sema); ++ ++exit: ++ ++ return res; ++} ++ ++struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) ++{ ++ struct cmd_obj *cmd_obj; ++ ++ cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); ++ ++ return cmd_obj; ++} ++ ++void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv) ++{ ++ ++ pcmdpriv->cmd_done_cnt++; ++ /* up(&(pcmdpriv->cmd_done_sema)); */ ++ ++} ++ ++void rtw_free_cmd_obj(struct cmd_obj *pcmd) ++{ ++ ++ if ((pcmd->cmdcode != _JoinBss_CMD_) && (pcmd->cmdcode != _CreateBss_CMD_)) { ++ /* free parmbuf in cmd_obj */ ++ kfree(pcmd->parmbuf); ++ } ++ ++ if (pcmd->rsp) { ++ if (pcmd->rspsz != 0) { ++ /* free rsp in cmd_obj */ ++ kfree(pcmd->rsp); ++ } ++ } ++ ++ /* free cmd_obj */ ++ kfree(pcmd); ++ ++} ++ ++int rtw_cmd_thread(void *context) ++{ ++ u8 ret; ++ struct cmd_obj *pcmd; ++ u8 *pcmdbuf; ++ u8 (*cmd_hdl)(struct adapter *padapter, u8 *pbuf); ++ void (*pcmd_callback)(struct adapter *dev, struct cmd_obj *pcmd); ++ struct adapter *padapter = (struct adapter *)context; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ thread_enter("RTW_CMD_THREAD"); ++ ++ pcmdbuf = pcmdpriv->cmd_buf; ++ ++ pcmdpriv->cmdthd_running = true; ++ up(&pcmdpriv->terminate_cmdthread_sema); ++ ++ while (1) { ++ if (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) ++ break; ++ ++ if (padapter->bDriverStopped || ++ padapter->bSurpriseRemoved) { ++ DBG_88E("%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", ++ __func__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__); ++ break; ++ } ++_next: ++ if (padapter->bDriverStopped || ++ padapter->bSurpriseRemoved) { ++ DBG_88E("%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", ++ __func__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__); ++ break; ++ } ++ ++ pcmd = rtw_dequeue_cmd(pcmdpriv); ++ if (!pcmd) ++ continue; ++ ++ if (_FAIL == rtw_cmd_filter(pcmdpriv, pcmd)) { ++ pcmd->res = H2C_DROPPED; ++ goto post_process; ++ } ++ ++ pcmdpriv->cmd_issued_cnt++; ++ ++ pcmd->cmdsz = _RND4((pcmd->cmdsz));/* _RND4 */ ++ ++ memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); ++ ++ if (pcmd->cmdcode < ARRAY_SIZE(wlancmds)) { ++ cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; ++ ++ if (cmd_hdl) { ++ ret = cmd_hdl(pcmd->padapter, pcmdbuf); ++ pcmd->res = ret; ++ } ++ ++ pcmdpriv->cmd_seq++; ++ } else { ++ pcmd->res = H2C_PARAMETERS_ERROR; ++ } ++ ++ cmd_hdl = NULL; ++ ++post_process: ++ ++ /* call callback function for post-processed */ ++ if (pcmd->cmdcode < ARRAY_SIZE(rtw_cmd_callback)) { ++ pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback; ++ if (!pcmd_callback) ++ rtw_free_cmd_obj(pcmd); ++ else ++ /* todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!= NULL) */ ++ pcmd_callback(pcmd->padapter, pcmd);/* need conider that free cmd_obj in rtw_cmd_callback */ ++ } else { ++ rtw_free_cmd_obj(pcmd); ++ } ++ ++ flush_signals_thread(); ++ ++ goto _next; ++ } ++ pcmdpriv->cmdthd_running = false; ++ ++ /* free all cmd_obj resources */ ++ do { ++ pcmd = rtw_dequeue_cmd(pcmdpriv); ++ if (!pcmd) ++ break; ++ ++ /* DBG_88E("%s: leaving... drop cmdcode:%u\n", __func__, pcmd->cmdcode); */ ++ ++ rtw_free_cmd_obj(pcmd); ++ } while (1); ++ ++ up(&pcmdpriv->terminate_cmdthread_sema); ++ ++ thread_exit(); ++} ++ ++u8 rtw_setstandby_cmd(struct adapter *padapter, uint action) ++{ ++ struct cmd_obj *ph2c; ++ struct usb_suspend_parm *psetusbsuspend; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 ret = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ psetusbsuspend = kzalloc(sizeof(struct usb_suspend_parm), GFP_ATOMIC); ++ if (!psetusbsuspend) { ++ kfree(ph2c); ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ psetusbsuspend->action = action; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend)); ++ ++ ret = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return ret; ++} ++ ++/* ++rtw_sitesurvey_cmd(~) ++ ### NOTE:#### (!!!!) ++ MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock ++*/ ++u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid, int ssid_num, ++ struct rtw_ieee80211_channel *ch, int ch_num) ++{ ++ u8 res = _FAIL; ++ struct cmd_obj *ph2c; ++ struct sitesurvey_parm *psurveyPara; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); ++ } ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); ++ } ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) ++ return _FAIL; ++ ++ psurveyPara = kzalloc(sizeof(struct sitesurvey_parm), GFP_ATOMIC); ++ if (!psurveyPara) { ++ kfree(ph2c); ++ return _FAIL; ++ } ++ ++ rtw_free_network_queue(padapter, false); ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); ++ ++ /* psurveyPara->bsslimit = 48; */ ++ psurveyPara->scan_mode = pmlmepriv->scan_mode; ++ ++ /* prepare ssid list */ ++ if (ssid) { ++ int i; ++ for (i = 0; i < ssid_num && i < RTW_SSID_SCAN_AMOUNT; i++) { ++ if (ssid[i].SsidLength) { ++ memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(struct ndis_802_11_ssid)); ++ psurveyPara->ssid_num++; ++ } ++ } ++ } ++ ++ /* prepare channel list */ ++ if (ch) { ++ int i; ++ for (i = 0; i < ch_num && i < RTW_CHANNEL_SCAN_AMOUNT; i++) { ++ if (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) { ++ memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel)); ++ psurveyPara->ch_num++; ++ } ++ } ++ } ++ ++ set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++ if (res == _SUCCESS) { ++ pmlmepriv->scan_start_time = jiffies; ++ ++ _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); ++ ++ rtw_led_control(padapter, LED_CTL_SITE_SURVEY); ++ ++ pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ ++ } else { ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); ++ } ++ ++ return res; ++} ++ ++u8 rtw_setdatarate_cmd(struct adapter *padapter, u8 *rateset) ++{ ++ struct cmd_obj *ph2c; ++ struct setdatarate_parm *pbsetdataratepara; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pbsetdataratepara = kzalloc(sizeof(struct setdatarate_parm), GFP_ATOMIC); ++ if (!pbsetdataratepara) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate)); ++ pbsetdataratepara->mac_id = 5; ++ memcpy(pbsetdataratepara->datarates, rateset, NumRates); ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setbasicrate_cmd(struct adapter *padapter, u8 *rateset) ++{ ++ struct cmd_obj *ph2c; ++ struct setbasicrate_parm *pssetbasicratepara; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ pssetbasicratepara = kzalloc(sizeof(struct setbasicrate_parm), GFP_ATOMIC); ++ ++ if (!pssetbasicratepara) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_); ++ ++ memcpy(pssetbasicratepara->basicrates, rateset, NumRates); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++/* ++unsigned char rtw_setphy_cmd(unsigned char *adapter) ++ ++1. be called only after rtw_update_registrypriv_dev_network(~) or mp testing program ++2. for AdHoc/Ap mode or mp mode? ++ ++*/ ++u8 rtw_setphy_cmd(struct adapter *padapter, u8 modem, u8 ch) ++{ ++ struct cmd_obj *ph2c; ++ struct setphy_parm *psetphypara; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ psetphypara = kzalloc(sizeof(struct setphy_parm), GFP_ATOMIC); ++ ++ if (!psetphypara) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_); ++ ++ psetphypara->modem = modem; ++ psetphypara->rfchannel = ch; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setbbreg_cmd(struct adapter *padapter, u8 offset, u8 val) ++{ ++ struct cmd_obj *ph2c; ++ struct writeBB_parm *pwritebbparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ pwritebbparm = kzalloc(sizeof(struct writeBB_parm), GFP_ATOMIC); ++ ++ if (!pwritebbparm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); ++ ++ pwritebbparm->offset = offset; ++ pwritebbparm->value = val; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_getbbreg_cmd(struct adapter *padapter, u8 offset, u8 *pval) ++{ ++ struct cmd_obj *ph2c; ++ struct readBB_parm *prdbbparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ prdbbparm = kzalloc(sizeof(struct readBB_parm), GFP_ATOMIC); ++ ++ if (!prdbbparm) { ++ kfree(ph2c); ++ return _FAIL; ++ } ++ ++ INIT_LIST_HEAD(&ph2c->list); ++ ph2c->cmdcode = GEN_CMD_CODE(_GetBBReg); ++ ph2c->parmbuf = (unsigned char *)prdbbparm; ++ ph2c->cmdsz = sizeof(struct readBB_parm); ++ ph2c->rsp = pval; ++ ph2c->rspsz = sizeof(struct readBB_rsp); ++ ++ prdbbparm->offset = offset; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setrfreg_cmd(struct adapter *padapter, u8 offset, u32 val) ++{ ++ struct cmd_obj *ph2c; ++ struct writeRF_parm *pwriterfparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ pwriterfparm = kzalloc(sizeof(struct writeRF_parm), GFP_ATOMIC); ++ ++ if (!pwriterfparm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); ++ ++ pwriterfparm->offset = offset; ++ pwriterfparm->value = val; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_getrfreg_cmd(struct adapter *padapter, u8 offset, u8 *pval) ++{ ++ struct cmd_obj *ph2c; ++ struct readRF_parm *prdrfparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ prdrfparm = kzalloc(sizeof(struct readRF_parm), GFP_ATOMIC); ++ if (!prdrfparm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ INIT_LIST_HEAD(&ph2c->list); ++ ph2c->cmdcode = GEN_CMD_CODE(_GetRFReg); ++ ph2c->parmbuf = (unsigned char *)prdrfparm; ++ ph2c->cmdsz = sizeof(struct readRF_parm); ++ ph2c->rsp = pval; ++ ph2c->rspsz = sizeof(struct readRF_rsp); ++ ++ prdrfparm->offset = offset; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++void rtw_getbbrfreg_cmdrsp_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ ++ ++ kfree(pcmd->parmbuf); ++ kfree(pcmd); ++ ++ if (padapter->registrypriv.mp_mode == 1) ++ padapter->mppriv.workparam.bcompleted = true; ++ ++} ++ ++void rtw_readtssi_cmdrsp_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ ++ ++ kfree(pcmd->parmbuf); ++ kfree(pcmd); ++ ++ if (padapter->registrypriv.mp_mode == 1) ++ padapter->mppriv.workparam.bcompleted = true; ++ ++} ++ ++u8 rtw_createbss_cmd(struct adapter *padapter) ++{ ++ struct cmd_obj *pcmd; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct wlan_bssid_ex *pdev_network = &padapter->registrypriv.dev_network; ++ u8 res = _SUCCESS; ++ ++ rtw_led_control(padapter, LED_CTL_START_TO_LINK); ++ ++ pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmd) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ INIT_LIST_HEAD(&pcmd->list); ++ pcmd->cmdcode = _CreateBss_CMD_; ++ pcmd->parmbuf = (unsigned char *)pdev_network; ++ pcmd->cmdsz = get_wlan_bssid_ex_sz((struct wlan_bssid_ex *)pdev_network); ++ pcmd->rsp = NULL; ++ pcmd->rspsz = 0; ++ pdev_network->Length = pcmd->cmdsz; ++ res = rtw_enqueue_cmd(pcmdpriv, pcmd); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_createbss_cmd_ex(struct adapter *padapter, unsigned char *pbss, unsigned int sz) ++{ ++ struct cmd_obj *pcmd; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmd) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ INIT_LIST_HEAD(&pcmd->list); ++ pcmd->cmdcode = GEN_CMD_CODE(_CreateBss); ++ pcmd->parmbuf = pbss; ++ pcmd->cmdsz = sz; ++ pcmd->rsp = NULL; ++ pcmd->rspsz = 0; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, pcmd); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork) ++{ ++ u8 res = _SUCCESS; ++ uint t_len = 0; ++ struct wlan_bssid_ex *psecnetwork; ++ struct cmd_obj *pcmd; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct qos_priv *pqospriv = &pmlmepriv->qospriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ enum ndis_802_11_network_infra ndis_network_mode = pnetwork->network.InfrastructureMode; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ rtw_led_control(padapter, LED_CTL_START_TO_LINK); ++ ++ pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmd) { ++ res = _FAIL; ++ goto exit; ++ } ++ /* for IEs is fix buf size */ ++ t_len = sizeof(struct wlan_bssid_ex); ++ ++ /* for hidden ap to set fw_state here */ ++ if (!check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE)) { ++ switch (ndis_network_mode) { ++ case Ndis802_11IBSS: ++ set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); ++ break; ++ case Ndis802_11Infrastructure: ++ set_fwstate(pmlmepriv, WIFI_STATION_STATE); ++ break; ++ case Ndis802_11APMode: ++ case Ndis802_11AutoUnknown: ++ case Ndis802_11InfrastructureMax: ++ break; ++ } ++ } ++ ++ psecnetwork = (struct wlan_bssid_ex *)&psecuritypriv->sec_bss; ++ if (!psecnetwork) { ++ kfree(pcmd); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ memset(psecnetwork, 0, t_len); ++ ++ memcpy(psecnetwork, &pnetwork->network, get_wlan_bssid_ex_sz(&pnetwork->network)); ++ ++ psecuritypriv->authenticator_ie[0] = (unsigned char)psecnetwork->IELength; ++ ++ if (psecnetwork->IELength - 12 < 255) { ++ memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength - 12); ++ } else { ++ memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], 255); ++ } ++ ++ psecnetwork->IELength = 0; ++ /* Added by Albert 2009/02/18 */ ++ /* If the the driver wants to use the bssid to create the connection. */ ++ /* If not, we have to copy the connecting AP's MAC address to it so that */ ++ /* the driver just has the bssid information for PMKIDList searching. */ ++ ++ if (!pmlmepriv->assoc_by_bssid) ++ memcpy(&pmlmepriv->assoc_bssid[0], &pnetwork->network.MacAddress[0], ETH_ALEN); ++ ++ psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); ++ ++ pqospriv->qos_option = 0; ++ ++ if (pregistrypriv->wmm_enable) { ++ u32 tmp_len; ++ ++ tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); ++ ++ if (psecnetwork->IELength != tmp_len) { ++ psecnetwork->IELength = tmp_len; ++ pqospriv->qos_option = 1; /* There is WMM IE in this corresp. beacon */ ++ } else { ++ pqospriv->qos_option = 0;/* There is no WMM IE in this corresp. beacon */ ++ } ++ } ++ ++ phtpriv->ht_option = false; ++ if (pregistrypriv->ht_enable) { ++ /* Added by Albert 2010/06/23 */ ++ /* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */ ++ /* Especially for Realtek 8192u SoftAP. */ ++ if ((padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_) && ++ (padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_) && ++ (padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_)) { ++ /* rtw_restructure_ht_ie */ ++ rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], ++ pnetwork->network.IELength, &psecnetwork->IELength); ++ } ++ } ++ ++ pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength); ++ ++ if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_TENDA) ++ padapter->pwrctrlpriv.smart_ps = 0; ++ else ++ padapter->pwrctrlpriv.smart_ps = padapter->registrypriv.smart_ps; ++ ++ DBG_88E("%s: smart_ps =%d\n", __func__, padapter->pwrctrlpriv.smart_ps); ++ ++ pcmd->cmdsz = get_wlan_bssid_ex_sz(psecnetwork);/* get cmdsz before endian conversion */ ++ ++ INIT_LIST_HEAD(&pcmd->list); ++ pcmd->cmdcode = _JoinBss_CMD_;/* GEN_CMD_CODE(_JoinBss) */ ++ pcmd->parmbuf = (unsigned char *)psecnetwork; ++ pcmd->rsp = NULL; ++ pcmd->rspsz = 0; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, pcmd); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */ ++{ ++ struct cmd_obj *cmdobj = NULL; ++ struct disconnect_parm *param = NULL; ++ struct cmd_priv *cmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ /* prepare cmd parameter */ ++ param = kzalloc(sizeof(*param), GFP_ATOMIC); ++ if (!param) { ++ res = _FAIL; ++ goto exit; ++ } ++ param->deauth_timeout_ms = deauth_timeout_ms; ++ ++ if (enqueue) { ++ /* need enqueue, prepare cmd_obj and enqueue */ ++ cmdobj = kzalloc(sizeof(*cmdobj), GFP_ATOMIC); ++ if (!cmdobj) { ++ res = _FAIL; ++ kfree(param); ++ goto exit; ++ } ++ init_h2fwcmd_w_parm_no_rsp(cmdobj, param, _DisConnect_CMD_); ++ res = rtw_enqueue_cmd(cmdpriv, cmdobj); ++ } else { ++ /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ ++ if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param)) ++ res = _FAIL; ++ kfree(param); ++ } ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setopmode_cmd(struct adapter *padapter, enum ndis_802_11_network_infra networktype) ++{ ++ struct cmd_obj *ph2c; ++ struct setopmode_parm *psetop; ++ ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!ph2c) { ++ res = false; ++ goto exit; ++ } ++ psetop = kzalloc(sizeof(struct setopmode_parm), GFP_KERNEL); ++ ++ if (!psetop) { ++ kfree(ph2c); ++ res = false; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); ++ psetop->mode = (u8)networktype; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key) ++{ ++ struct cmd_obj *ph2c; ++ struct set_stakey_parm *psetstakey_para; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct set_stakey_rsp *psetstakey_rsp = NULL; ++ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct sta_info *sta = (struct sta_info *)psta; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), GFP_KERNEL); ++ if (!psetstakey_para) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp), GFP_KERNEL); ++ if (!psetstakey_rsp) { ++ kfree(ph2c); ++ kfree(psetstakey_para); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); ++ ph2c->rsp = (u8 *)psetstakey_rsp; ++ ph2c->rspsz = sizeof(struct set_stakey_rsp); ++ ++ memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN); ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ psetstakey_para->algorithm = (unsigned char)psecuritypriv->dot11PrivacyAlgrthm; ++ else ++ GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, false); ++ ++ if (unicast_key) ++ memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); ++ else ++ memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); ++ ++ /* jeff: set this because at least sw key is ready */ ++ padapter->securitypriv.busetkipkey = true; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue) ++{ ++ struct cmd_obj *ph2c; ++ struct set_stakey_parm *psetstakey_para; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct set_stakey_rsp *psetstakey_rsp = NULL; ++ struct sta_info *sta = (struct sta_info *)psta; ++ u8 res = _SUCCESS; ++ ++ if (!enqueue) { ++ clear_cam_entry(padapter, entry); ++ } else { ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), ++ GFP_ATOMIC); ++ if (!psetstakey_para) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp), ++ GFP_ATOMIC); ++ if (!psetstakey_rsp) { ++ kfree(ph2c); ++ kfree(psetstakey_para); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); ++ ph2c->rsp = (u8 *)psetstakey_rsp; ++ ph2c->rspsz = sizeof(struct set_stakey_rsp); ++ ++ memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN); ++ ++ psetstakey_para->algorithm = _NO_PRIVACY_; ++ ++ psetstakey_para->id = entry; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ } ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setrttbl_cmd(struct adapter *padapter, struct setratable_parm *prate_table) ++{ ++ struct cmd_obj *ph2c; ++ struct setratable_parm *psetrttblparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ psetrttblparm = kzalloc(sizeof(struct setratable_parm), GFP_KERNEL); ++ ++ if (!psetrttblparm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); ++ ++ memcpy(psetrttblparm, prate_table, sizeof(struct setratable_parm)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_getrttbl_cmd(struct adapter *padapter, struct getratable_rsp *pval) ++{ ++ struct cmd_obj *ph2c; ++ struct getratable_parm *pgetrttblparm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ pgetrttblparm = kzalloc(sizeof(struct getratable_parm), GFP_KERNEL); ++ ++ if (!pgetrttblparm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++/* init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); */ ++ ++ INIT_LIST_HEAD(&ph2c->list); ++ ph2c->cmdcode = GEN_CMD_CODE(_GetRaTable); ++ ph2c->parmbuf = (unsigned char *)pgetrttblparm; ++ ph2c->cmdsz = sizeof(struct getratable_parm); ++ ph2c->rsp = (u8 *)pval; ++ ph2c->rspsz = sizeof(struct getratable_rsp); ++ ++ pgetrttblparm->rsvd = 0x0; ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_setassocsta_cmd(struct adapter *padapter, u8 *mac_addr) ++{ ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct cmd_obj *ph2c; ++ struct set_assocsta_parm *psetassocsta_para; ++ struct set_stakey_rsp *psetassocsta_rsp = NULL; ++ ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetassocsta_para = kzalloc(sizeof(struct set_assocsta_parm), GFP_ATOMIC); ++ if (!psetassocsta_para) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ psetassocsta_rsp = kzalloc(sizeof(struct set_assocsta_rsp), GFP_ATOMIC); ++ if (!psetassocsta_rsp) { ++ kfree(ph2c); ++ kfree(psetassocsta_para); ++ return _FAIL; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_); ++ ph2c->rsp = (u8 *)psetassocsta_rsp; ++ ph2c->rspsz = sizeof(struct set_assocsta_rsp); ++ ++ memcpy(psetassocsta_para->addr, mac_addr, ETH_ALEN); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++ } ++ ++u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr) ++{ ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct cmd_obj *ph2c; ++ struct addBaReq_parm *paddbareq_parm; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_ATOMIC); ++ if (!paddbareq_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ paddbareq_parm->tid = tid; ++ memcpy(paddbareq_parm->addr, addr, ETH_ALEN); ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq)); ++ ++ /* DBG_88E("rtw_addbareq_cmd, tid =%d\n", tid); */ ++ ++ /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_dynamic_chk_wk_cmd(struct adapter *padapter) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID; ++ pdrvextra_cmd_parm->type_size = 0; ++ pdrvextra_cmd_parm->pbuf = (u8 *)padapter; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++u8 rtw_set_ch_cmd(struct adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue) ++{ ++ struct cmd_obj *pcmdobj; ++ struct set_ch_parm *set_ch_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ DBG_88E(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", ++ FUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset); ++ ++ /* check input parameter */ ++ ++ /* prepare cmd parameter */ ++ set_ch_parm = kzalloc(sizeof(*set_ch_parm), GFP_ATOMIC); ++ if (!set_ch_parm) { ++ res = _FAIL; ++ goto exit; ++ } ++ set_ch_parm->ch = ch; ++ set_ch_parm->bw = bw; ++ set_ch_parm->ch_offset = ch_offset; ++ ++ if (enqueue) { ++ /* need enqueue, prepare cmd_obj and enqueue */ ++ pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmdobj) { ++ kfree(set_ch_parm); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(pcmdobj, set_ch_parm, GEN_CMD_CODE(_SetChannel)); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); ++ } else { ++ /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ ++ if (H2C_SUCCESS != set_ch_hdl(padapter, (u8 *)set_ch_parm)) ++ res = _FAIL; ++ ++ kfree(set_ch_parm); ++ } ++ ++ /* do something based on res... */ ++ ++exit: ++ ++ DBG_88E(FUNC_NDEV_FMT" res:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), res); ++ ++ return res; ++} ++ ++u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan, u8 enqueue) ++{ ++ struct cmd_obj *pcmdobj; ++ struct SetChannelPlan_param *setChannelPlan_param; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ /* check input parameter */ ++ if (!rtw_is_channel_plan_valid(chplan)) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ /* prepare cmd parameter */ ++ setChannelPlan_param = kzalloc(sizeof(struct SetChannelPlan_param), ++ GFP_KERNEL); ++ if (!setChannelPlan_param) { ++ res = _FAIL; ++ goto exit; ++ } ++ setChannelPlan_param->channel_plan = chplan; ++ ++ if (enqueue) { ++ /* need enqueue, prepare cmd_obj and enqueue */ ++ pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmdobj) { ++ kfree(setChannelPlan_param); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan)); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); ++ } else { ++ /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ ++ if (H2C_SUCCESS != set_chplan_hdl(padapter, (unsigned char *)setChannelPlan_param)) ++ res = _FAIL; ++ ++ kfree(setChannelPlan_param); ++ } ++ ++ /* do something based on res... */ ++ if (res == _SUCCESS) ++ padapter->mlmepriv.ChannelPlan = chplan; ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_led_blink_cmd(struct adapter *padapter, struct LED_871x *pLed) ++{ ++ struct cmd_obj *pcmdobj; ++ struct LedBlink_param *ledBlink_param; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmdobj) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ ledBlink_param = kzalloc(sizeof(struct LedBlink_param), GFP_ATOMIC); ++ if (!ledBlink_param) { ++ kfree(pcmdobj); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ ledBlink_param->pLed = pLed; ++ ++ init_h2fwcmd_w_parm_no_rsp(pcmdobj, ledBlink_param, GEN_CMD_CODE(_LedBlink)); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_set_csa_cmd(struct adapter *padapter, u8 new_ch_no) ++{ ++ struct cmd_obj *pcmdobj; ++ struct SetChannelSwitch_param *setChannelSwitch_param; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmdobj) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ setChannelSwitch_param = kzalloc(sizeof(struct SetChannelSwitch_param), ++ GFP_ATOMIC); ++ if (!setChannelSwitch_param) { ++ kfree(pcmdobj); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ setChannelSwitch_param->new_ch_no = new_ch_no; ++ ++ init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelSwitch_param, GEN_CMD_CODE(_SetChannelSwitch)); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); ++ ++exit: ++ ++ return res; ++} ++ ++u8 rtw_tdls_cmd(struct adapter *padapter, u8 *addr, u8 option) ++{ ++ return _SUCCESS; ++} ++ ++static void traffic_status_watchdog(struct adapter *padapter) ++{ ++ u8 bEnterPS; ++ u8 bBusyTraffic = false, bTxBusyTraffic = false, bRxBusyTraffic = false; ++ u8 bHigherBusyTraffic = false, bHigherBusyRxTraffic = false, bHigherBusyTxTraffic = false; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ /* */ ++ /* Determine if our traffic is busy now */ ++ /* */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 100 || ++ pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 100) { ++ bBusyTraffic = true; ++ ++ if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) ++ bRxBusyTraffic = true; ++ else ++ bTxBusyTraffic = true; ++ } ++ ++ /* Higher Tx/Rx data. */ ++ if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || ++ pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000) { ++ bHigherBusyTraffic = true; ++ ++ if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) ++ bHigherBusyRxTraffic = true; ++ else ++ bHigherBusyTxTraffic = true; ++ } ++ ++ /* check traffic for powersaving. */ ++ if (((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8) || ++ (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2)) ++ bEnterPS = false; ++ else ++ bEnterPS = true; ++ ++ /* LeisurePS only work in infra mode. */ ++ if (bEnterPS) ++ LPS_Enter(padapter); ++ else ++ LPS_Leave(padapter); ++ } else { ++ LPS_Leave(padapter); ++ } ++ ++ pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0; ++ pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0; ++ pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0; ++ pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic; ++ pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic; ++ pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic; ++ pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic; ++ pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic; ++ pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic; ++} ++ ++static void dynamic_chk_wk_hdl(struct adapter *padapter, u8 *pbuf, int sz) ++{ ++ struct mlme_priv *pmlmepriv; ++ ++ padapter = (struct adapter *)pbuf; ++ pmlmepriv = &padapter->mlmepriv; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ expire_timeout_chk(padapter); ++#endif ++ ++ rtw_hal_sreset_xmit_status_check(padapter); ++ ++ linked_status_chk(padapter); ++ traffic_status_watchdog(padapter); ++ ++ rtw_hal_dm_watchdog(padapter); ++} ++ ++static void lps_ctrl_wk_hdl(struct adapter *padapter, u8 lps_ctrl_type) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 mstatus; ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) ++ return; ++ ++ switch (lps_ctrl_type) { ++ case LPS_CTRL_SCAN: ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ /* connect */ ++ LPS_Leave(padapter); ++ } ++ break; ++ case LPS_CTRL_JOINBSS: ++ LPS_Leave(padapter); ++ break; ++ case LPS_CTRL_CONNECT: ++ mstatus = 1;/* connect */ ++ /* Reset LPS Setting */ ++ padapter->pwrctrlpriv.LpsIdleCount = 0; ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); ++ break; ++ case LPS_CTRL_DISCONNECT: ++ mstatus = 0;/* disconnect */ ++ LPS_Leave(padapter); ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); ++ break; ++ case LPS_CTRL_SPECIAL_PACKET: ++ /* DBG_88E("LPS_CTRL_SPECIAL_PACKET\n"); */ ++ pwrpriv->DelayLPSLastTimeStamp = jiffies; ++ LPS_Leave(padapter); ++ break; ++ case LPS_CTRL_LEAVE: ++ LPS_Leave(padapter); ++ break; ++ default: ++ break; ++ } ++ ++} ++ ++u8 rtw_lps_ctrl_wk_cmd(struct adapter *padapter, u8 lps_ctrl_type, u8 enqueue) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ /* struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; */ ++ u8 res = _SUCCESS; ++ ++ /* if (!pwrctrlpriv->bLeisurePs) */ ++ /* return res; */ ++ ++ if (enqueue) { ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), ++ GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID; ++ pdrvextra_cmd_parm->type_size = lps_ctrl_type; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ } else { ++ lps_ctrl_wk_hdl(padapter, lps_ctrl_type); ++ } ++ ++exit: ++ ++ return res; ++} ++ ++static void rpt_timer_setting_wk_hdl(struct adapter *padapter, u16 min_time) ++{ ++ rtw_hal_set_hwreg(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&min_time)); ++} ++ ++u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 min_time) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), ++ GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = RTP_TIMER_CFG_WK_CID; ++ pdrvextra_cmd_parm->type_size = min_time; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ ++ return res; ++} ++ ++static void antenna_select_wk_hdl(struct adapter *padapter, u8 antenna) ++{ ++ rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); ++} ++ ++u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 support_ant_div; ++ u8 res = _SUCCESS; ++ ++ rtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &support_ant_div); ++ if (!support_ant_div) ++ return res; ++ ++ if (enqueue) { ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), ++ GFP_KERNEL); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID; ++ pdrvextra_cmd_parm->type_size = antenna; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ } else { ++ antenna_select_wk_hdl(padapter, antenna); ++ } ++exit: ++ ++ return res; ++} ++ ++static void power_saving_wk_hdl(struct adapter *padapter, u8 *pbuf, int sz) ++{ ++ rtw_ps_processor(padapter); ++} ++ ++#ifdef CONFIG_88EU_P2P ++u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return res; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; ++ pdrvextra_cmd_parm->type_size = intCmdType; /* As the command tppe. */ ++ pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */ ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++#endif /* CONFIG_88EU_P2P */ ++ ++u8 rtw_ps_cmd(struct adapter *padapter) ++{ ++ struct cmd_obj *ppscmd; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ u8 res = _SUCCESS; ++ ++ ppscmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ppscmd) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ppscmd); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ppscmd); ++ ++exit: ++ ++ return res; ++} ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++static void rtw_chk_hi_queue_hdl(struct adapter *padapter) ++{ ++ int cnt = 0; ++ struct sta_info *psta_bmc; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ psta_bmc = rtw_get_bcmc_stainfo(padapter); ++ if (!psta_bmc) ++ return; ++ ++ if (psta_bmc->sleepq_len == 0) { ++ u8 val = 0; ++ ++ /* while ((rtw_read32(padapter, 0x414)&0x00ffff00)!= 0) */ ++ /* while ((rtw_read32(padapter, 0x414)&0x0000ff00)!= 0) */ ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val); ++ ++ while (!val) { ++ msleep(100); ++ ++ cnt++; ++ ++ if (cnt > 10) ++ break; ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val); ++ } ++ ++ if (cnt <= 10) { ++ pstapriv->tim_bitmap &= ~BIT(0); ++ pstapriv->sta_dz_bitmap &= ~BIT(0); ++ ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ } else { /* re check again */ ++ rtw_chk_hi_queue_cmd(padapter); ++ } ++ } ++} ++ ++u8 rtw_chk_hi_queue_cmd(struct adapter *padapter) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID; ++ pdrvextra_cmd_parm->type_size = 0; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++exit: ++ return res; ++} ++#endif ++ ++u8 rtw_c2h_wk_cmd(struct adapter *padapter, u8 *c2h_evt) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = C2H_WK_CID; ++ pdrvextra_cmd_parm->type_size = c2h_evt ? 16 : 0; ++ pdrvextra_cmd_parm->pbuf = c2h_evt; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++static s32 c2h_evt_hdl(struct adapter *adapter, struct c2h_evt_hdr *c2h_evt, c2h_id_filter filter) ++{ ++ s32 ret = _FAIL; ++ u8 buf[16]; ++ ++ if (!c2h_evt) { ++ /* No c2h event in cmd_obj, read c2h event before handling*/ ++ if (c2h_evt_read(adapter, buf) == _SUCCESS) { ++ c2h_evt = (struct c2h_evt_hdr *)buf; ++ ++ if (filter && !filter(c2h_evt->id)) ++ goto exit; ++ ++ ret = rtw_hal_c2h_handler(adapter, c2h_evt); ++ } ++ } else { ++ if (filter && !filter(c2h_evt->id)) ++ goto exit; ++ ++ ret = rtw_hal_c2h_handler(adapter, c2h_evt); ++ } ++exit: ++ return ret; ++} ++ ++static void c2h_wk_callback(struct work_struct *work) ++{ ++ struct evt_priv *evtpriv = container_of(work, struct evt_priv, c2h_wk); ++ struct adapter *adapter = container_of(evtpriv, struct adapter, evtpriv); ++ struct c2h_evt_hdr *c2h_evt; ++ c2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(adapter); ++ ++ evtpriv->c2h_wk_alive = true; ++ ++ while (!rtw_cbuf_empty(evtpriv->c2h_queue)) { ++ if ((c2h_evt = (struct c2h_evt_hdr *)rtw_cbuf_pop(evtpriv->c2h_queue)) != NULL) { ++ /* This C2H event is read, clear it */ ++ c2h_evt_clear(adapter); ++ } else { ++ c2h_evt = kmalloc(16, GFP_KERNEL); ++ if (c2h_evt) { ++ /* This C2H event is not read, read & clear now */ ++ if (c2h_evt_read(adapter, (u8 *)c2h_evt) != _SUCCESS) { ++ kfree(c2h_evt); ++ continue; ++ } ++ } else { ++ return; ++ } ++ } ++ ++ /* Special pointer to trigger c2h_evt_clear only */ ++ if ((void *)c2h_evt == (void *)evtpriv) ++ continue; ++ ++ if (!c2h_evt_exist(c2h_evt)) { ++ kfree(c2h_evt); ++ continue; ++ } ++ ++ if (ccx_id_filter(c2h_evt->id)) { ++ /* Handle CCX report here */ ++ rtw_hal_c2h_handler(adapter, c2h_evt); ++ kfree(c2h_evt); ++ } else { ++#ifdef CONFIG_88EU_P2P ++ /* Enqueue into cmd_thread for others */ ++ rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt); ++#endif ++ } ++ } ++ ++ evtpriv->c2h_wk_alive = false; ++} ++ ++u8 rtw_drvextra_cmd_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ struct drvextra_cmd_parm *pdrvextra_cmd; ++ ++ if (!pbuf) ++ return H2C_PARAMETERS_ERROR; ++ ++ pdrvextra_cmd = (struct drvextra_cmd_parm *)pbuf; ++ ++ switch (pdrvextra_cmd->ec_id) { ++ case DYNAMIC_CHK_WK_CID: ++ dynamic_chk_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); ++ break; ++ case POWER_SAVING_CTRL_WK_CID: ++ power_saving_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); ++ break; ++ case LPS_CTRL_WK_CID: ++ lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size); ++ break; ++ case RTP_TIMER_CFG_WK_CID: ++ rpt_timer_setting_wk_hdl(padapter, pdrvextra_cmd->type_size); ++ break; ++ case ANT_SELECT_WK_CID: ++ antenna_select_wk_hdl(padapter, pdrvextra_cmd->type_size); ++ break; ++#ifdef CONFIG_88EU_P2P ++ case P2P_PS_WK_CID: ++ p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size); ++ break; ++ case P2P_PROTO_WK_CID: ++ /* Commented by Albert 2011/07/01 */ ++ /* I used the type_size as the type command */ ++ p2p_protocol_wk_hdl(padapter, pdrvextra_cmd->type_size); ++ break; ++#endif ++#ifdef CONFIG_88EU_AP_MODE ++ case CHECK_HIQ_WK_CID: ++ rtw_chk_hi_queue_hdl(padapter); ++ break; ++#endif /* CONFIG_88EU_AP_MODE */ ++ case C2H_WK_CID: ++ c2h_evt_hdl(padapter, (struct c2h_evt_hdr *)pdrvextra_cmd->pbuf, NULL); ++ break; ++ default: ++ break; ++ } ++ ++ if (pdrvextra_cmd->pbuf && pdrvextra_cmd->type_size > 0) ++ kfree(pdrvextra_cmd->pbuf); ++ ++ return H2C_SUCCESS; ++} ++ ++void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (pcmd->res == H2C_DROPPED) { ++ /* TODO: cancel timer and do timeout handler directly... */ ++ /* need to make timeout handlerOS independent */ ++ _set_timer(&pmlmepriv->scan_to_timer, 1); ++ } else if (pcmd->res != H2C_SUCCESS) { ++ _set_timer(&pmlmepriv->scan_to_timer, 1); ++ } ++ ++ /* free cmd */ ++ rtw_free_cmd_obj(pcmd); ++ ++} ++void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (pcmd->res != H2C_SUCCESS) { ++ spin_lock_bh(&pmlmepriv->lock); ++ set_fwstate(pmlmepriv, _FW_LINKED); ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ return; ++ } else /* clear bridge database */ ++ nat25_db_cleanup(padapter); ++ ++ /* free cmd */ ++ rtw_free_cmd_obj(pcmd); ++} ++ ++void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (pcmd->res == H2C_DROPPED) { ++ /* TODO: cancel timer and do timeout handler directly... */ ++ /* need to make timeout handlerOS independent */ ++ _set_timer(&pmlmepriv->assoc_timer, 1); ++ } else if (pcmd->res != H2C_SUCCESS) { ++ _set_timer(&pmlmepriv->assoc_timer, 1); ++ } ++ ++ rtw_free_cmd_obj(pcmd); ++} ++ ++void rtw_createbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ u8 timer_cancelled; ++ struct sta_info *psta = NULL; ++ struct wlan_network *pwlan = NULL; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)pcmd->parmbuf; ++ struct wlan_network *tgt_network = &pmlmepriv->cur_network; ++ ++ if (pcmd->res != H2C_SUCCESS) ++ _set_timer(&pmlmepriv->assoc_timer, 1); ++ ++ _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress); ++ if (!psta) { ++ psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); ++ if (!psta) ++ goto createbss_cmd_fail; ++ } ++ ++ rtw_indicate_connect(padapter); ++ } else { ++ ++ pwlan = _rtw_alloc_network(pmlmepriv); ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ if (!pwlan) { ++ pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); ++ if (!pwlan) { ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ goto createbss_cmd_fail; ++ } ++ pwlan->last_scanned = jiffies; ++ } else { ++ list_add_tail(&pwlan->list, &pmlmepriv->scanned_queue.queue); ++ } ++ ++ pnetwork->Length = get_wlan_bssid_ex_sz(pnetwork); ++ memcpy(&pwlan->network, pnetwork, pnetwork->Length); ++ ++ memcpy(&tgt_network->network, pnetwork, (get_wlan_bssid_ex_sz(pnetwork))); ++ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ /* we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) */ ++ } ++ ++createbss_cmd_fail: ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ rtw_free_cmd_obj(pcmd); ++ ++} ++ ++void rtw_setstaKey_cmdrsp_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct set_stakey_rsp *psetstakey_rsp = (struct set_stakey_rsp *)(pcmd->rsp); ++ struct sta_info *psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); ++ ++ if (!psta) ++ goto exit; ++exit: ++ rtw_free_cmd_obj(pcmd); ++ ++} ++ ++void rtw_setassocsta_cmdrsp_callback(struct adapter *padapter, struct cmd_obj *pcmd) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct set_assocsta_parm *passocsta_parm = (struct set_assocsta_parm *)(pcmd->parmbuf); ++ struct set_assocsta_rsp *passocsta_rsp = (struct set_assocsta_rsp *)(pcmd->rsp); ++ struct sta_info *psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); ++ ++ if (!psta) ++ goto exit; ++ ++ psta->aid = passocsta_rsp->cam_id; ++ psta->mac_id = passocsta_rsp->cam_id; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, WIFI_MP_STATE) && check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ ++ set_fwstate(pmlmepriv, _FW_LINKED); ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++exit: ++ rtw_free_cmd_obj(pcmd); ++ ++} +diff --git a/drivers/staging/r8188eu/core/rtw_debug.c b/drivers/staging/r8188eu/core/rtw_debug.c +new file mode 100644 +index 000000000000..2ee64cef73f7 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_debug.c +@@ -0,0 +1,904 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_DEBUG_C_ ++ ++#include "../include/rtw_debug.h" ++#include "../include/drv_types.h" ++ ++int proc_get_drv_version(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_write_reg(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ *eof = 1; ++ return 0; ++} ++ ++int proc_set_write_reg(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ char tmp[32]; ++ u32 addr, val, len; ++ ++ if (count < 3) { ++ DBG_88E("argument size is less than 3\n"); ++ return -EFAULT; ++ } ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); ++ ++ if (num != 3) { ++ DBG_88E("invalid write_reg parameter!\n"); ++ return count; ++ } ++ switch (len) { ++ case 1: ++ rtw_write8(padapter, addr, (u8)val); ++ break; ++ case 2: ++ rtw_write16(padapter, addr, (u16)val); ++ break; ++ case 4: ++ rtw_write32(padapter, addr, val); ++ break; ++ default: ++ DBG_88E("error write length =%d", len); ++ break; ++ } ++ } ++ return count; ++} ++ ++static u32 proc_get_read_addr = 0xeeeeeeee; ++static u32 proc_get_read_len = 0x4; ++ ++int proc_get_read_reg(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ int len = 0; ++ ++ if (proc_get_read_addr == 0xeeeeeeee) { ++ *eof = 1; ++ return len; ++ } ++ ++ switch (proc_get_read_len) { ++ case 1: ++ len += snprintf(page + len, count - len, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); ++ break; ++ case 2: ++ len += snprintf(page + len, count - len, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); ++ break; ++ case 4: ++ len += snprintf(page + len, count - len, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); ++ break; ++ default: ++ len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len); ++ break; ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_read_reg(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ char tmp[16]; ++ u32 addr, len; ++ ++ if (count < 2) { ++ DBG_88E("argument size is less than 2\n"); ++ return -EFAULT; ++ } ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ int num = sscanf(tmp, "%x %x", &addr, &len); ++ ++ if (num != 2) { ++ DBG_88E("invalid read_reg parameter!\n"); ++ return count; ++ } ++ ++ proc_get_read_addr = addr; ++ ++ proc_get_read_len = len; ++ } ++ ++ return count; ++} ++ ++int proc_get_fwstate(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_sec_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", ++ psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, ++ psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_mlmext_state(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_qos_option(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_ht_option(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ int len = 0; ++ len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rf_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", ++ pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_ap_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct sta_info *psta; ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ int len = 0; ++ ++ psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); ++ if (psta) { ++ int i; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ ++ len += snprintf(page + len, count - len, "SSID=%s\n", cur_network->network.Ssid.Ssid); ++ len += snprintf(page + len, count - len, "sta's macaddr:%pM\n", psta->hwaddr); ++ len += snprintf(page + len, count - len, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); ++ len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); ++ len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); ++ len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); ++ len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); ++ len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); ++ len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); ++ ++ for (i = 0; i < 16; i++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ if (preorder_ctrl->enable) ++ len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); ++ } ++ } else { ++ len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr: %pM\n", cur_network->network.MacAddress); ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_adapter_state(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n", ++ padapter->bSurpriseRemoved, padapter->bDriverStopped); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_trx_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d, free_ext_xmitbuf_cnt=%d, free_recvframe_cnt=%d\n", ++ pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmit_extbuf_cnt, precvpriv->free_recvframe_cnt); ++ len += snprintf(page + len, count - len, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_mac_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= MAC REG =======\n"); ++ ++ for (i = 0x0; i < 0x300; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_mac_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= MAC REG =======\n"); ++ memset(page, 0, count); ++ for (i = 0x300; i < 0x600; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_mac_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= MAC REG =======\n"); ++ ++ for (i = 0x600; i < 0x800; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_bb_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= BB REG =======\n"); ++ for (i = 0x800; i < 0xB00; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_bb_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= BB REG =======\n"); ++ for (i = 0xB00; i < 0xE00; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_bb_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1; ++ ++ len += snprintf(page + len, count - len, "\n======= BB REG =======\n"); ++ for (i = 0xE00; i < 0x1000; i += 4) { ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rf_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1, path; ++ u32 value; ++ ++ len += snprintf(page + len, count - len, "\n======= RF REG =======\n"); ++ path = 1; ++ len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path); ++ for (i = 0; i < 0xC0; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x ", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rf_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1, path; ++ u32 value; ++ ++ len += snprintf(page + len, count - len, "\n======= RF REG =======\n"); ++ path = 1; ++ len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path); ++ for (i = 0xC0; i < 0x100; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x ", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rf_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1, path; ++ u32 value; ++ ++ len += snprintf(page + len, count - len, "\n======= RF REG =======\n"); ++ path = 2; ++ len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path); ++ for (i = 0; i < 0xC0; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x ", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rf_reg_dump4(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ int i, j = 1, path; ++ u32 value; ++ ++ len += snprintf(page + len, count - len, "\n======= RF REG =======\n"); ++ path = 2; ++ len += snprintf(page + len, count - len, "\nRF_Path(%x)\n", path); ++ for (i = 0xC0; i < 0x100; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ len += snprintf(page + len, count - len, "0x%02x ", i); ++ len += snprintf(page + len, count - len, " 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ len += snprintf(page + len, count - len, "\n"); ++ } ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rx_signal(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int len = 0; ++ ++ len = snprintf(page + len, count, ++ "rssi:%d\n" ++ "rxpwdb:%d\n" ++ "signal_strength:%u\n" ++ "signal_qual:%u\n" ++ "noise:%u\n", ++ padapter->recvpriv.rssi, ++ padapter->recvpriv.rxpwdb, ++ padapter->recvpriv.signal_strength, ++ padapter->recvpriv.signal_qual, ++ padapter->recvpriv.noise ++ ); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_rx_signal(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ char tmp[32]; ++ u32 is_signal_dbg; ++ s32 signal_strength; ++ ++ if (count < 1) ++ return -EFAULT; ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength); ++ is_signal_dbg = is_signal_dbg == 0 ? 0 : 1; ++ if (is_signal_dbg && num != 2) ++ return count; ++ ++ signal_strength = signal_strength > 100 ? 100 : signal_strength; ++ signal_strength = signal_strength < 0 ? 0 : signal_strength; ++ ++ padapter->recvpriv.is_signal_dbg = is_signal_dbg; ++ padapter->recvpriv.signal_strength_dbg = signal_strength; ++ ++ if (is_signal_dbg) ++ DBG_88E("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); ++ else ++ DBG_88E("set %s\n", "HW_SIGNAL_STRENGTH"); ++ } ++ return count; ++} ++ ++int proc_get_ht_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ int len = 0; ++ ++ if (pregpriv) ++ len += snprintf(page + len, count - len, ++ "%d\n", ++ pregpriv->ht_enable ++ ); ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_ht_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ char tmp[32]; ++ s32 mode = 0; ++ ++ if (count < 1) ++ return -EFAULT; ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ if (pregpriv) { ++ pregpriv->ht_enable = mode; ++ pr_info("ht_enable=%d\n", pregpriv->ht_enable); ++ } ++ } ++ ++ return count; ++} ++ ++int proc_get_cbw40_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ ++ int len = 0; ++ ++ if (pregpriv) ++ len += snprintf(page + len, count - len, ++ "%d\n", ++ pregpriv->cbw40_enable ++ ); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_cbw40_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ char tmp[32]; ++ s32 mode = 0; ++ ++ if (count < 1) ++ return -EFAULT; ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ if (pregpriv) { ++ pregpriv->cbw40_enable = mode; ++ pr_info("cbw40_enable=%d\n", mode); ++ } ++ } ++ return count; ++} ++ ++int proc_get_ampdu_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ ++ int len = 0; ++ ++ if (pregpriv) ++ len += snprintf(page + len, count - len, ++ "%d\n", ++ pregpriv->ampdu_enable ++ ); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_ampdu_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ char tmp[32]; ++ s32 mode = 0; ++ ++ if (count < 1) ++ return -EFAULT; ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ if (pregpriv) { ++ pregpriv->ampdu_enable = mode; ++ pr_info("ampdu_enable=%d\n", mode); ++ } ++ } ++ return count; ++} ++ ++int proc_get_two_path_rssi(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ int len = 0; ++ ++ if (padapter) ++ len += snprintf(page + len, count - len, ++ "%d %d\n", ++ padapter->recvpriv.RxRssi[0], ++ padapter->recvpriv.RxRssi[1] ++ ); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_get_rx_stbc(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ ++ int len = 0; ++ ++ if (pregpriv) ++ len += snprintf(page + len, count - len, ++ "%d\n", ++ pregpriv->rx_stbc ++ ); ++ ++ *eof = 1; ++ return len; ++} ++ ++int proc_set_rx_stbc(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ char tmp[32]; ++ u32 mode = 0; ++ ++ if (count < 1) ++ return -EFAULT; ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ if (pregpriv) { ++ pregpriv->rx_stbc = mode; ++ printk("rx_stbc=%d\n", mode); ++ } ++ } ++ return count; ++} ++ ++int proc_get_rssi_disp(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ *eof = 1; ++ return 0; ++} ++ ++int proc_set_rssi_disp(struct file *file, const char __user *buffer, ++ unsigned long count, void *data) ++{ ++ struct net_device *dev = (struct net_device *)data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ char tmp[32]; ++ u32 enable = 0; ++ ++ if (count < 1) { ++ DBG_88E("argument size is less than 1\n"); ++ return -EFAULT; ++ } ++ ++ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { ++ int num = sscanf(tmp, "%x", &enable); ++ ++ if (num != 1) { ++ DBG_88E("invalid set_rssi_disp parameter!\n"); ++ return count; ++ } ++ ++ if (enable) { ++ DBG_88E("Turn On Rx RSSI Display Function\n"); ++ padapter->bRxRSSIDisplay = enable; ++ } else { ++ DBG_88E("Turn Off Rx RSSI Display Function\n"); ++ padapter->bRxRSSIDisplay = 0; ++ } ++ } ++ return count; ++} ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++int proc_get_all_sta_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct sta_info *psta; ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ int i, j; ++ struct list_head *plist, *phead; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ int len = 0; ++ ++ len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ ++ for (i = 0; i < NUM_STA; i++) { ++ phead = &pstapriv->sta_hash[i]; ++ plist = phead->next; ++ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, hash_list); ++ ++ plist = plist->next; ++ ++ len += snprintf(page + len, count - len, "sta's macaddr: %pM\n", psta->hwaddr); ++ len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); ++ len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); ++ len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); ++ len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); ++ len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); ++ len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); ++ len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len); ++ len += snprintf(page + len, count - len, "capability=0x%x\n", psta->capability); ++ len += snprintf(page + len, count - len, "flags=0x%x\n", psta->flags); ++ len += snprintf(page + len, count - len, "wpa_psk=0x%x\n", psta->wpa_psk); ++ len += snprintf(page + len, count - len, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher); ++ len += snprintf(page + len, count - len, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher); ++ len += snprintf(page + len, count - len, "qos_info=0x%x\n", psta->qos_info); ++ len += snprintf(page + len, count - len, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy); ++ ++ for (j = 0; j < 16; j++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[j]; ++ if (preorder_ctrl->enable) ++ len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); ++ } ++ } ++ } ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ *eof = 1; ++ return len; ++} ++#endif ++ ++int proc_get_best_channel(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data) ++{ ++ struct net_device *dev = data; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ int len = 0; ++ u32 i, best_channel_24G = 1, index_24G = 0; ++ ++ for (i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) { ++ if (pmlmeext->channel_set[i].ChannelNum == 1) ++ index_24G = i; ++ } ++ ++ for (i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) { ++ /* 2.4G */ ++ if (pmlmeext->channel_set[i].ChannelNum == 6) { ++ if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) { ++ index_24G = i; ++ best_channel_24G = pmlmeext->channel_set[i].ChannelNum; ++ } ++ } ++ ++ /* debug */ ++ len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n", ++ pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); ++ } ++ ++ len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G); ++ ++ *eof = 1; ++ return len; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_efuse.c b/drivers/staging/r8188eu/core/rtw_efuse.c +new file mode 100644 +index 000000000000..c1c70648f5bc +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_efuse.c +@@ -0,0 +1,848 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_EFUSE_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_efuse.h" ++ ++/*------------------------Define local variable------------------------------*/ ++u8 fakeEfuseBank; ++u32 fakeEfuseUsedBytes; ++u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE] = {0}; ++u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN] = {0}; ++u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN] = {0}; ++ ++u32 BTEfuseUsedBytes; ++u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0}; ++u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0}; ++ ++u32 fakeBTEfuseUsedBytes; ++u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0}; ++u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0}; ++/*------------------------Define local variable------------------------------*/ ++ ++/* */ ++#define REG_EFUSE_CTRL 0x0030 ++#define EFUSE_CTRL REG_EFUSE_CTRL /* E-Fuse Control. */ ++/* */ ++static bool Efuse_Read1ByteFromFakeContent(struct adapter *pAdapter, ++ u16 Offset, ++ u8 *Value) ++{ ++ if (Offset >= EFUSE_MAX_HW_SIZE) ++ return false; ++ if (fakeEfuseBank == 0) ++ *Value = fakeEfuseContent[Offset]; ++ else ++ *Value = fakeBTEfuseContent[fakeEfuseBank - 1][Offset]; ++ return true; ++} ++ ++static bool ++Efuse_Write1ByteToFakeContent( ++ struct adapter *pAdapter, ++ u16 Offset, ++ u8 Value) ++{ ++ if (Offset >= EFUSE_MAX_HW_SIZE) ++ return false; ++ if (fakeEfuseBank == 0) { ++ fakeEfuseContent[Offset] = Value; ++ } else { ++ fakeBTEfuseContent[fakeEfuseBank - 1][Offset] = Value; ++ } ++ return true; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: Efuse_PowerSwitch ++ * ++ * Overview: When we want to enable write operation, we should change to ++ * pwr on state. When we stop write, we should switch to 500k mode ++ * and disable LDO 2.5V. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/17/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++void ++Efuse_PowerSwitch( ++ struct adapter *pAdapter, ++ u8 write, ++ u8 PwrState) ++{ ++ pAdapter->HalFunc.EfusePowerSwitch(pAdapter, write, PwrState); ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: efuse_GetCurrentSize ++ * ++ * Overview: Get current efuse size!!! ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/16/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++u16 ++Efuse_GetCurrentSize( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ bool pseudo) ++{ ++ u16 ret = 0; ++ ++ ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, pseudo); ++ ++ return ret; ++} ++ ++/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */ ++u8 ++Efuse_CalculateWordCnts(u8 word_en) ++{ ++ u8 word_cnts = 0; ++ if (!(word_en & BIT(0))) ++ word_cnts++; /* 0 : write enable */ ++ if (!(word_en & BIT(1))) ++ word_cnts++; ++ if (!(word_en & BIT(2))) ++ word_cnts++; ++ if (!(word_en & BIT(3))) ++ word_cnts++; ++ return word_cnts; ++} ++ ++/* */ ++/* Description: */ ++/* Execute E-Fuse read byte operation. */ ++/* Referred from SD1 Richard. */ ++/* */ ++/* Assumption: */ ++/* 1. Boot from E-Fuse and successfully auto-load. */ ++/* 2. PASSIVE_LEVEL (USB interface) */ ++/* */ ++/* Created by Roger, 2008.10.21. */ ++/* */ ++void ++ReadEFuseByte( ++ struct adapter *Adapter, ++ u16 _offset, ++ u8 *pbuf, ++ bool pseudo) ++{ ++ u32 value32; ++ u8 readbyte; ++ u16 retry; ++ ++ if (pseudo) { ++ Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf); ++ return; ++ } ++ ++ /* Write Address */ ++ rtw_write8(Adapter, EFUSE_CTRL + 1, (_offset & 0xff)); ++ readbyte = rtw_read8(Adapter, EFUSE_CTRL + 2); ++ rtw_write8(Adapter, EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); ++ ++ /* Write bit 32 0 */ ++ readbyte = rtw_read8(Adapter, EFUSE_CTRL + 3); ++ rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); ++ ++ /* Check bit 32 read-ready */ ++ retry = 0; ++ value32 = rtw_read32(Adapter, EFUSE_CTRL); ++ while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) { ++ value32 = rtw_read32(Adapter, EFUSE_CTRL); ++ retry++; ++ } ++ ++ /* 20100205 Joseph: Add delay suggested by SD1 Victor. */ ++ /* This fix the problem that Efuse read error in high temperature condition. */ ++ /* Designer says that there shall be some delay after ready bit is set, or the */ ++ /* result will always stay on last data we read. */ ++ udelay(50); ++ value32 = rtw_read32(Adapter, EFUSE_CTRL); ++ ++ *pbuf = (u8)(value32 & 0xff); ++} ++ ++/* */ ++/* Description: */ ++/* 1. Execute E-Fuse read byte operation according as map offset and */ ++/* save to E-Fuse table. */ ++/* 2. Referred from SD1 Richard. */ ++/* */ ++/* Assumption: */ ++/* 1. Boot from E-Fuse and successfully auto-load. */ ++/* 2. PASSIVE_LEVEL (USB interface) */ ++/* */ ++/* Created by Roger, 2008.10.21. */ ++/* */ ++/* 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. */ ++/* 2. Add efuse utilization collect. */ ++/* 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 */ ++/* write addr must be after sec5. */ ++/* */ ++ ++static void efuse_ReadEFuse(struct adapter *Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, bool pseudo) ++{ ++ Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, pseudo); ++} ++ ++void EFUSE_GetEfuseDefinition(struct adapter *pAdapter, u8 efuseType, u8 type, void *pOut, bool pseudo ++ ) ++{ ++ pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, pseudo); ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: EFUSE_Read1Byte ++ * ++ * Overview: Copy from WMAC fot EFUSE read 1 byte. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 09/23/2008 MHC Copy from WMAC. ++ * ++ *---------------------------------------------------------------------------*/ ++u8 EFUSE_Read1Byte(struct adapter *Adapter, u16 Address) ++{ ++ u8 data; ++ u8 Bytetemp = {0x00}; ++ u8 temp = {0x00}; ++ u32 k = 0; ++ u16 contentLen = 0; ++ ++ EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&contentLen, false); ++ ++ if (Address < contentLen) { /* E-fuse 512Byte */ ++ /* Write E-fuse Register address bit0~7 */ ++ temp = Address & 0xFF; ++ rtw_write8(Adapter, EFUSE_CTRL + 1, temp); ++ Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 2); ++ /* Write E-fuse Register address bit8~9 */ ++ temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); ++ rtw_write8(Adapter, EFUSE_CTRL + 2, temp); ++ ++ /* Write 0x30[31]= 0 */ ++ Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); ++ temp = Bytetemp & 0x7F; ++ rtw_write8(Adapter, EFUSE_CTRL + 3, temp); ++ ++ /* Wait Write-ready (0x30[31]= 1) */ ++ Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); ++ while (!(Bytetemp & 0x80)) { ++ Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); ++ k++; ++ if (k == 1000) { ++ k = 0; ++ break; ++ } ++ } ++ data = rtw_read8(Adapter, EFUSE_CTRL); ++ return data; ++ } else { ++ return 0xFF; ++ } ++ ++} /* EFUSE_Read1Byte */ ++ ++/* 11/16/2008 MH Read one byte from real Efuse. */ ++u8 efuse_OneByteRead(struct adapter *pAdapter, u16 addr, u8 *data, bool pseudo) ++{ ++ u8 tmpidx = 0; ++ u8 result; ++ ++ if (pseudo) { ++ result = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); ++ return result; ++ } ++ /* -----------------e-fuse reg ctrl --------------------------------- */ ++ /* address */ ++ rtw_write8(pAdapter, EFUSE_CTRL + 1, (u8)(addr & 0xff)); ++ rtw_write8(pAdapter, EFUSE_CTRL + 2, ((u8)((addr >> 8) & 0x03)) | ++ (rtw_read8(pAdapter, EFUSE_CTRL + 2) & 0xFC)); ++ ++ rtw_write8(pAdapter, EFUSE_CTRL + 3, 0x72);/* read cmd */ ++ ++ while (!(0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 100)) ++ tmpidx++; ++ if (tmpidx < 100) { ++ *data = rtw_read8(pAdapter, EFUSE_CTRL); ++ result = true; ++ } else { ++ *data = 0xff; ++ result = false; ++ } ++ return result; ++} ++ ++/* 11/16/2008 MH Write one byte to reald Efuse. */ ++u8 efuse_OneByteWrite(struct adapter *pAdapter, u16 addr, u8 data, bool pseudo) ++{ ++ u8 tmpidx = 0; ++ u8 result; ++ ++ if (pseudo) { ++ result = Efuse_Write1ByteToFakeContent(pAdapter, addr, data); ++ return result; ++ } ++ ++ /* -----------------e-fuse reg ctrl --------------------------------- */ ++ /* address */ ++ rtw_write8(pAdapter, EFUSE_CTRL + 1, (u8)(addr & 0xff)); ++ rtw_write8(pAdapter, EFUSE_CTRL + 2, ++ (rtw_read8(pAdapter, EFUSE_CTRL + 2) & 0xFC) | ++ (u8)((addr >> 8) & 0x03)); ++ rtw_write8(pAdapter, EFUSE_CTRL, data);/* data */ ++ ++ rtw_write8(pAdapter, EFUSE_CTRL + 3, 0xF2);/* write cmd */ ++ ++ while ((0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 100)) ++ tmpidx++; ++ ++ if (tmpidx < 100) ++ result = true; ++ else ++ result = false; ++ ++ return result; ++} ++ ++int Efuse_PgPacketRead(struct adapter *pAdapter, u8 offset, u8 *data, bool pseudo) ++{ ++ int ret = 0; ++ ++ ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, pseudo); ++ ++ return ret; ++} ++ ++int Efuse_PgPacketWrite(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *data, bool pseudo) ++{ ++ int ret; ++ ++ ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, pseudo); ++ ++ return ret; ++} ++ ++static int Efuse_PgPacketWrite_BT(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *data, bool pseudo) ++{ ++ int ret; ++ ++ ret = pAdapter->HalFunc.Efuse_PgPacketWrite_BT(pAdapter, offset, word_en, data, pseudo); ++ ++ return ret; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: efuse_WordEnableDataRead ++ * ++ * Overview: Read allowed word in current efuse section data. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/16/2008 MHC Create Version 0. ++ * 11/21/2008 MHC Fix Write bug when we only enable late word. ++ * ++ *---------------------------------------------------------------------------*/ ++void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata) ++{ ++ if (!(word_en & BIT(0))) { ++ targetdata[0] = sourdata[0]; ++ targetdata[1] = sourdata[1]; ++ } ++ if (!(word_en & BIT(1))) { ++ targetdata[2] = sourdata[2]; ++ targetdata[3] = sourdata[3]; ++ } ++ if (!(word_en & BIT(2))) { ++ targetdata[4] = sourdata[4]; ++ targetdata[5] = sourdata[5]; ++ } ++ if (!(word_en & BIT(3))) { ++ targetdata[6] = sourdata[6]; ++ targetdata[7] = sourdata[7]; ++ } ++} ++ ++u8 Efuse_WordEnableDataWrite(struct adapter *pAdapter, u16 efuse_addr, u8 word_en, u8 *data, bool pseudo) ++{ ++ u8 ret = 0; ++ ++ ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, pseudo); ++ ++ return ret; ++} ++ ++static u8 efuse_read8(struct adapter *padapter, u16 address, u8 *value) ++{ ++ return efuse_OneByteRead(padapter, address, value, false); ++} ++ ++static u8 efuse_write8(struct adapter *padapter, u16 address, u8 *value) ++{ ++ return efuse_OneByteWrite(padapter, address, *value, false); ++} ++ ++/* ++ * read/wirte raw efuse data ++ */ ++u8 rtw_efuse_access(struct adapter *padapter, u8 write, u16 start_addr, u16 cnts, u8 *data) ++{ ++ int i = 0; ++ u16 real_content_len = 0, max_available_size = 0; ++ u8 res = _FAIL; ++ u8 (*rw8)(struct adapter *, u16, u8*); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&real_content_len, false); ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ ++ if (start_addr > real_content_len) ++ return _FAIL; ++ ++ if (write) { ++ if ((start_addr + cnts) > max_available_size) ++ return _FAIL; ++ rw8 = &efuse_write8; ++ } else { ++ rw8 = &efuse_read8; ++ } ++ ++ Efuse_PowerSwitch(padapter, write, true); ++ ++ /* e-fuse one byte read / write */ ++ for (i = 0; i < cnts; i++) { ++ if (start_addr >= real_content_len) { ++ res = _FAIL; ++ break; ++ } ++ ++ res = rw8(padapter, start_addr++, data++); ++ if (_FAIL == res) ++ break; ++ } ++ ++ Efuse_PowerSwitch(padapter, write, false); ++ ++ return res; ++} ++/* */ ++u16 efuse_GetMaxSize(struct adapter *padapter) ++{ ++ u16 max_size; ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_size, false); ++ return max_size; ++} ++/* */ ++u8 efuse_GetCurrentSize(struct adapter *padapter, u16 *size) ++{ ++ Efuse_PowerSwitch(padapter, false, true); ++ *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, false); ++ Efuse_PowerSwitch(padapter, false, false); ++ ++ return _SUCCESS; ++} ++/* */ ++u8 rtw_efuse_map_read(struct adapter *padapter, u16 addr, u16 cnts, u8 *data) ++{ ++ u16 mapLen = 0; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, false); ++ ++ if ((addr + cnts) > mapLen) ++ return _FAIL; ++ ++ Efuse_PowerSwitch(padapter, false, true); ++ ++ efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, false); ++ ++ Efuse_PowerSwitch(padapter, false, false); ++ ++ return _SUCCESS; ++} ++ ++u8 rtw_BT_efuse_map_read(struct adapter *padapter, u16 addr, u16 cnts, u8 *data) ++{ ++ u16 mapLen = 0; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, false); ++ ++ if ((addr + cnts) > mapLen) ++ return _FAIL; ++ ++ Efuse_PowerSwitch(padapter, false, true); ++ ++ efuse_ReadEFuse(padapter, EFUSE_BT, addr, cnts, data, false); ++ ++ Efuse_PowerSwitch(padapter, false, false); ++ ++ return _SUCCESS; ++} ++/* */ ++u8 rtw_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data) ++{ ++ u8 offset, word_en; ++ u8 *map; ++ u8 newdata[PGPKT_DATA_SIZE + 1]; ++ s32 i, idx; ++ u8 ret = _SUCCESS; ++ u16 mapLen = 0; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, false); ++ ++ if ((addr + cnts) > mapLen) ++ return _FAIL; ++ ++ map = kzalloc(mapLen, GFP_KERNEL); ++ if (!map) ++ return _FAIL; ++ ++ ret = rtw_efuse_map_read(padapter, 0, mapLen, map); ++ if (ret == _FAIL) ++ goto exit; ++ ++ Efuse_PowerSwitch(padapter, true, true); ++ ++ offset = (addr >> 3); ++ word_en = 0xF; ++ memset(newdata, 0xFF, PGPKT_DATA_SIZE + 1); ++ i = addr & 0x7; /* index of one package */ ++ idx = 0; /* data index */ ++ ++ if (i & 0x1) { ++ /* odd start */ ++ if (data[idx] != map[addr + idx]) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i - 1] = map[addr + idx - 1]; ++ newdata[i] = data[idx]; ++ } ++ i++; ++ idx++; ++ } ++ do { ++ for (; i < PGPKT_DATA_SIZE; i += 2) { ++ if (cnts == idx) ++ break; ++ if ((cnts - idx) == 1) { ++ if (data[idx] != map[addr + idx]) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i] = data[idx]; ++ newdata[i + 1] = map[addr + idx + 1]; ++ } ++ idx++; ++ break; ++ } else { ++ if ((data[idx] != map[addr + idx]) || ++ (data[idx + 1] != map[addr + idx + 1])) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i] = data[idx]; ++ newdata[i + 1] = data[idx + 1]; ++ } ++ idx += 2; ++ } ++ if (idx == cnts) ++ break; ++ } ++ ++ if (word_en != 0xF) { ++ ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, false); ++ DBG_88E("offset=%x\n", offset); ++ DBG_88E("word_en=%x\n", word_en); ++ ++ for (i = 0; i < PGPKT_DATA_SIZE; i++) ++ DBG_88E("data=%x \t", newdata[i]); ++ if (ret == _FAIL) ++ break; ++ } ++ ++ if (idx == cnts) ++ break; ++ ++ offset++; ++ i = 0; ++ word_en = 0xF; ++ memset(newdata, 0xFF, PGPKT_DATA_SIZE); ++ } while (1); ++ ++ Efuse_PowerSwitch(padapter, true, false); ++exit: ++ kfree(map); ++ return ret; ++} ++ ++/* */ ++u8 rtw_BT_efuse_map_write(struct adapter *padapter, u16 addr, u16 cnts, u8 *data) ++{ ++ u8 offset, word_en; ++ u8 *map; ++ u8 newdata[PGPKT_DATA_SIZE + 1]; ++ s32 i, idx; ++ u8 ret = _SUCCESS; ++ u16 mapLen = 0; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, false); ++ ++ if ((addr + cnts) > mapLen) ++ return _FAIL; ++ ++ map = kzalloc(mapLen, GFP_KERNEL); ++ if (!map) ++ return _FAIL; ++ ++ ret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map); ++ if (ret == _FAIL) ++ goto exit; ++ ++ Efuse_PowerSwitch(padapter, true, true); ++ ++ offset = (addr >> 3); ++ word_en = 0xF; ++ memset(newdata, 0xFF, PGPKT_DATA_SIZE + 1); ++ i = addr & 0x7; /* index of one package */ ++ idx = 0; /* data index */ ++ ++ if (i & 0x1) { ++ /* odd start */ ++ if (data[idx] != map[addr + idx]) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i - 1] = map[addr + idx - 1]; ++ newdata[i] = data[idx]; ++ } ++ i++; ++ idx++; ++ } ++ do { ++ for (; i < PGPKT_DATA_SIZE; i += 2) { ++ if (cnts == idx) ++ break; ++ if ((cnts - idx) == 1) { ++ if (data[idx] != map[addr + idx]) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i] = data[idx]; ++ newdata[i + 1] = map[addr + idx + 1]; ++ } ++ idx++; ++ break; ++ } else { ++ if ((data[idx] != map[addr + idx]) || ++ (data[idx + 1] != map[addr + idx + 1])) { ++ word_en &= ~BIT(i >> 1); ++ newdata[i] = data[idx]; ++ newdata[i + 1] = data[idx + 1]; ++ } ++ idx += 2; ++ } ++ if (idx == cnts) ++ break; ++ } ++ ++ if (word_en != 0xF) { ++ DBG_88E("%s: offset=%#X\n", __func__, offset); ++ DBG_88E("%s: word_en=%#X\n", __func__, word_en); ++ DBG_88E("%s: data=", __func__); ++ for (i = 0; i < PGPKT_DATA_SIZE; i++) ++ DBG_88E("0x%02X ", newdata[i]); ++ DBG_88E("\n"); ++ ++ ret = Efuse_PgPacketWrite_BT(padapter, offset, word_en, newdata, false); ++ if (ret == _FAIL) ++ break; ++ } ++ ++ if (idx == cnts) ++ break; ++ ++ offset++; ++ i = 0; ++ word_en = 0xF; ++ memset(newdata, 0xFF, PGPKT_DATA_SIZE); ++ } while (1); ++ ++ Efuse_PowerSwitch(padapter, true, false); ++ ++exit: ++ ++ kfree(map); ++ ++ return ret; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: efuse_ShadowRead1Byte ++ * efuse_ShadowRead2Byte ++ * efuse_ShadowRead4Byte ++ * ++ * Overview: Read from efuse init map by one/two/four bytes !!!!! ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/12/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++static void ++efuse_ShadowRead1Byte( ++ struct adapter *pAdapter, ++ u16 Offset, ++ u8 *Value) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); ++ ++ *Value = pEEPROM->efuse_eeprom_data[Offset]; ++ ++} /* EFUSE_ShadowRead1Byte */ ++ ++/* Read Two Bytes */ ++static void ++efuse_ShadowRead2Byte( ++ struct adapter *pAdapter, ++ u16 Offset, ++ u16 *Value) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); ++ ++ *Value = pEEPROM->efuse_eeprom_data[Offset]; ++ *Value |= pEEPROM->efuse_eeprom_data[Offset + 1] << 8; ++ ++} /* EFUSE_ShadowRead2Byte */ ++ ++/* Read Four Bytes */ ++static void ++efuse_ShadowRead4Byte( ++ struct adapter *pAdapter, ++ u16 Offset, ++ u32 *Value) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); ++ ++ *Value = pEEPROM->efuse_eeprom_data[Offset]; ++ *Value |= pEEPROM->efuse_eeprom_data[Offset + 1] << 8; ++ *Value |= pEEPROM->efuse_eeprom_data[Offset + 2] << 16; ++ *Value |= pEEPROM->efuse_eeprom_data[Offset + 3] << 24; ++ ++} /* efuse_ShadowRead4Byte */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: Efuse_ReadAllMap ++ * ++ * Overview: Read All Efuse content ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/11/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++static void Efuse_ReadAllMap(struct adapter *pAdapter, u8 efuseType, u8 *Efuse, bool pseudo) ++{ ++ u16 mapLen = 0; ++ ++ Efuse_PowerSwitch(pAdapter, false, true); ++ ++ EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, pseudo); ++ ++ efuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, pseudo); ++ ++ Efuse_PowerSwitch(pAdapter, false, false); ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: EFUSE_ShadowMapUpdate ++ * ++ * Overview: Transfer current EFUSE content to shadow init and modify map. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/13/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++void EFUSE_ShadowMapUpdate( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ bool pseudo) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); ++ u16 mapLen = 0; ++ ++ EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, pseudo); ++ ++ if (pEEPROM->bautoload_fail_flag) ++ memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); ++ else ++ Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, pseudo); ++} /* EFUSE_ShadowMapUpdate */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: EFUSE_ShadowRead ++ * ++ * Overview: Read from efuse init map !!!!! ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/12/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++void EFUSE_ShadowRead(struct adapter *pAdapter, u8 Type, u16 Offset, u32 *Value) ++{ ++ if (Type == 1) ++ efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value); ++ else if (Type == 2) ++ efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value); ++ else if (Type == 4) ++ efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value); ++ ++} /* EFUSE_ShadowRead */ +diff --git a/drivers/staging/r8188eu/core/rtw_ieee80211.c b/drivers/staging/r8188eu/core/rtw_ieee80211.c +new file mode 100644 +index 000000000000..b3a74198596a +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_ieee80211.c +@@ -0,0 +1,1539 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _IEEE80211_C ++ ++#include "../include/drv_types.h" ++#include "../include/ieee80211.h" ++#include "../include/wifi.h" ++#include "../include/osdep_service.h" ++#include "../include/wlan_bssdef.h" ++#include "../include/usb_osintf.h" ++ ++u8 RTW_WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 }; ++u16 RTW_WPA_VERSION = 1; ++u8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 }; ++u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 }; ++u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 }; ++u8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 }; ++u8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 }; ++u8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 }; ++u8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 }; ++u8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 }; ++u8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 }; ++ ++u16 RSN_VERSION_BSD = 1; ++u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 }; ++u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 }; ++u8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 }; ++u8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 }; ++u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 }; ++u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 }; ++u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 }; ++u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 }; ++/* */ ++/* for adhoc-master to generate ie and provide supported-rate to fw */ ++/* */ ++ ++static u8 WIFI_CCKRATES[] = { ++ (IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), ++ (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), ++ (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), ++ (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK) ++ }; ++ ++static u8 WIFI_OFDMRATES[] = { ++ (IEEE80211_OFDM_RATE_6MB), ++ (IEEE80211_OFDM_RATE_9MB), ++ (IEEE80211_OFDM_RATE_12MB), ++ (IEEE80211_OFDM_RATE_18MB), ++ (IEEE80211_OFDM_RATE_24MB), ++ IEEE80211_OFDM_RATE_36MB, ++ IEEE80211_OFDM_RATE_48MB, ++ IEEE80211_OFDM_RATE_54MB ++ }; ++ ++int rtw_get_bit_value_from_ieee_value(u8 val) ++{ ++ unsigned char dot11_rate_table[] = { ++ 2, 4, 11, 22, 12, 18, 24, 36, 48, ++ 72, 96, 108, 0}; /* last element must be zero!! */ ++ ++ int i = 0; ++ while (dot11_rate_table[i] != 0) { ++ if (dot11_rate_table[i] == val) ++ return BIT(i); ++ i++; ++ } ++ return 0; ++} ++ ++uint rtw_is_cckrates_included(u8 *rate) ++{ ++ u32 i = 0; ++ ++ while (rate[i] != 0) { ++ if ((((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || ++ (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22)) ++ return true; ++ i++; ++ } ++ return false; ++} ++ ++uint rtw_is_cckratesonly_included(u8 *rate) ++{ ++ u32 i = 0; ++ ++ while (rate[i] != 0) { ++ if ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && ++ (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22)) ++ return false; ++ i++; ++ } ++ ++ return true; ++} ++ ++int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) ++{ ++ if (channel > 14) { ++ return WIRELESS_INVALID; ++ } else { /* could be pure B, pure G, or B/G */ ++ if (rtw_is_cckratesonly_included(rate)) ++ return WIRELESS_11B; ++ else if (rtw_is_cckrates_included(rate)) ++ return WIRELESS_11BG; ++ else ++ return WIRELESS_11G; ++ } ++} ++ ++u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, ++ unsigned int *frlen) ++{ ++ memcpy((void *)pbuf, (void *)source, len); ++ *frlen = *frlen + len; ++ return pbuf + len; ++} ++ ++/* rtw_set_ie will update frame length */ ++u8 *rtw_set_ie ++( ++ u8 *pbuf, ++ int index, ++ uint len, ++ u8 *source, ++ uint *frlen /* frame length */ ++) ++{ ++ ++ *pbuf = (u8)index; ++ ++ *(pbuf + 1) = (u8)len; ++ ++ if (len > 0) ++ memcpy((void *)(pbuf + 2), (void *)source, len); ++ ++ *frlen = *frlen + (len + 2); ++ ++ return pbuf + len + 2; ++} ++ ++inline u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode, ++ u8 new_ch, u8 ch_switch_cnt) ++{ ++ u8 ie_data[3]; ++ ++ ie_data[0] = ch_switch_mode; ++ ie_data[1] = new_ch; ++ ie_data[2] = ch_switch_cnt; ++ return rtw_set_ie(buf, WLAN_EID_CHANNEL_SWITCH, 3, ie_data, buf_len); ++} ++ ++inline u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset) ++{ ++ if (ch_offset == SCN) ++ return HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ else if (ch_offset == SCA) ++ return HAL_PRIME_CHNL_OFFSET_UPPER; ++ else if (ch_offset == SCB) ++ return HAL_PRIME_CHNL_OFFSET_LOWER; ++ ++ return HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++} ++ ++inline u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset) ++{ ++ if (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ++ return SCN; ++ else if (ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ++ return SCB; ++ else if (ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) ++ return SCA; ++ ++ return SCN; ++} ++ ++inline u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch_offset) ++{ ++ return rtw_set_ie(buf, WLAN_EID_SECONDARY_CHANNEL_OFFSET, 1, &secondary_ch_offset, buf_len); ++} ++ ++inline u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl, ++ u8 flags, u16 reason, u16 precedence) ++{ ++ u8 ie_data[6]; ++ ++ ie_data[0] = ttl; ++ ie_data[1] = flags; ++ *(u16 *)(ie_data + 2) = cpu_to_le16(reason); ++ *(u16 *)(ie_data + 4) = cpu_to_le16(precedence); ++ ++ return rtw_set_ie(buf, 0x118, 6, ie_data, buf_len); ++} ++ ++/*---------------------------------------------------------------------------- ++index: the information element id index, limit is the limit for search ++-----------------------------------------------------------------------------*/ ++u8 *rtw_get_ie(u8 *pbuf, int index, int *len, int limit) ++{ ++ int tmp, i; ++ u8 *p; ++ ++ if (limit < 1) { ++ ++ return NULL; ++ } ++ ++ p = pbuf; ++ i = 0; ++ *len = 0; ++ while (1) { ++ if (*p == index) { ++ *len = *(p + 1); ++ return p; ++ } else { ++ tmp = *(p + 1); ++ p += (tmp + 2); ++ i += (tmp + 2); ++ } ++ if (i >= limit) ++ break; ++ } ++ ++ return NULL; ++} ++ ++/** ++ * rtw_get_ie_ex - Search specific IE from a series of IEs ++ * @in_ie: Address of IEs to search ++ * @in_len: Length limit from in_ie ++ * @eid: Element ID to match ++ * @oui: OUI to match ++ * @oui_len: OUI length ++ * @ie: If not NULL and the specific IE is found, the IE will be copied to the buf starting from the specific IE ++ * @ielen: If not NULL and the specific IE is found, will set to the length of the entire IE ++ * ++ * Returns: The address of the specific IE found, or NULL ++ */ ++u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen) ++{ ++ uint cnt; ++ u8 *target_ie = NULL; ++ ++ if (ielen) ++ *ielen = 0; ++ ++ if (!in_ie || in_len <= 0) ++ return target_ie; ++ ++ cnt = 0; ++ ++ while (cnt < in_len) { ++ if (eid == in_ie[cnt] && (!oui || !memcmp(&in_ie[cnt + 2], oui, oui_len))) { ++ target_ie = &in_ie[cnt]; ++ ++ if (ie) ++ memcpy(ie, &in_ie[cnt], in_ie[cnt + 1] + 2); ++ ++ if (ielen) ++ *ielen = in_ie[cnt + 1] + 2; ++ ++ break; ++ } else { ++ cnt += in_ie[cnt + 1] + 2; /* goto next */ ++ } ++ } ++ return target_ie; ++} ++ ++/** ++ * rtw_ies_remove_ie - Find matching IEs and remove ++ * @ies: Address of IEs to search ++ * @ies_len: Pointer of length of ies, will update to new length ++ * @offset: The offset to start scarch ++ * @eid: Element ID to match ++ * @oui: OUI to match ++ * @oui_len: OUI length ++ * ++ * Returns: _SUCCESS: ies is updated, _FAIL: not updated ++ */ ++int rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len) ++{ ++ int ret = _FAIL; ++ u8 *target_ie; ++ u32 target_ielen; ++ u8 *start; ++ uint search_len; ++ ++ if (!ies || !ies_len || *ies_len <= offset) ++ goto exit; ++ ++ start = ies + offset; ++ search_len = *ies_len - offset; ++ ++ while (1) { ++ target_ie = rtw_get_ie_ex(start, search_len, eid, oui, oui_len, NULL, &target_ielen); ++ if (target_ie && target_ielen) { ++ u8 buf[MAX_IE_SZ] = {0}; ++ u8 *remain_ies = target_ie + target_ielen; ++ uint remain_len = search_len - (remain_ies - start); ++ ++ memcpy(buf, remain_ies, remain_len); ++ memcpy(target_ie, buf, remain_len); ++ *ies_len = *ies_len - target_ielen; ++ ret = _SUCCESS; ++ ++ start = target_ie; ++ search_len = remain_len; ++ } else { ++ break; ++ } ++ } ++exit: ++ return ret; ++} ++ ++void rtw_set_supported_rate(u8 *SupportedRates, uint mode) ++{ ++ ++ memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); ++ ++ switch (mode) { ++ case WIRELESS_11B: ++ memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); ++ break; ++ case WIRELESS_11G: ++ memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); ++ break; ++ case WIRELESS_11BG: ++ case WIRELESS_11G_24N: ++ case WIRELESS_11_24N: ++ case WIRELESS_11BG_24N: ++ memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); ++ memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); ++ break; ++ } ++ ++} ++ ++uint rtw_get_rateset_len(u8 *rateset) ++{ ++ uint i = 0; ++ ++ while (1) { ++ if ((rateset[i]) == 0) ++ break; ++ if (i > 12) ++ break; ++ i++; ++ } ++ ++ return i; ++} ++ ++int rtw_generate_ie(struct registry_priv *pregistrypriv) ++{ ++ u8 wireless_mode; ++ int sz = 0, rateLen; ++ struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network; ++ u8 *ie = pdev_network->IEs; ++ ++ /* timestamp will be inserted by hardware */ ++ sz += 8; ++ ie += sz; ++ ++ /* beacon interval : 2bytes */ ++ *(__le16 *)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);/* BCN_INTERVAL; */ ++ sz += 2; ++ ie += 2; ++ ++ /* capability info */ ++ *(u16 *)ie = 0; ++ ++ *(__le16 *)ie |= cpu_to_le16(cap_IBSS); ++ ++ if (pregistrypriv->preamble == PREAMBLE_SHORT) ++ *(__le16 *)ie |= cpu_to_le16(cap_ShortPremble); ++ ++ if (pdev_network->Privacy) ++ *(__le16 *)ie |= cpu_to_le16(cap_Privacy); ++ ++ sz += 2; ++ ie += 2; ++ ++ /* SSID */ ++ ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); ++ ++ /* supported rates */ ++ wireless_mode = pregistrypriv->wireless_mode; ++ ++ rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode); ++ ++ rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); ++ ++ if (rateLen > 8) { ++ ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz); ++ /* ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); */ ++ } else { ++ ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz); ++ } ++ ++ /* DS parameter set */ ++ ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&pdev_network->Configuration.DSConfig, &sz); ++ ++ /* IBSS Parameter Set */ ++ ++ ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&pdev_network->Configuration.ATIMWindow, &sz); ++ ++ if (rateLen > 8) ++ ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); ++ ++ return sz; ++} ++ ++unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) ++{ ++ int len; ++ u16 val16; ++ __le16 le_tmp; ++ unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01}; ++ u8 *pbuf = pie; ++ int limit_new = limit; ++ ++ while (1) { ++ pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit_new); ++ ++ if (pbuf) { ++ /* check if oui matches... */ ++ if (memcmp((pbuf + 2), wpa_oui_type, sizeof(wpa_oui_type))) ++ goto check_next_ie; ++ ++ /* check version... */ ++ memcpy((u8 *)&le_tmp, (pbuf + 6), sizeof(val16)); ++ ++ val16 = le16_to_cpu(le_tmp); ++ if (val16 != 0x0001) ++ goto check_next_ie; ++ *wpa_ie_len = *(pbuf + 1); ++ return pbuf; ++ } else { ++ *wpa_ie_len = 0; ++ return NULL; ++ } ++ ++check_next_ie: ++ limit_new = limit - (pbuf - pie) - 2 - len; ++ if (limit_new <= 0) ++ break; ++ pbuf += (2 + len); ++ } ++ *wpa_ie_len = 0; ++ return NULL; ++} ++ ++unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit) ++{ ++ ++ return rtw_get_ie(pie, _WPA2_IE_ID_, rsn_ie_len, limit); ++} ++ ++int rtw_get_wpa_cipher_suite(u8 *s) ++{ ++ if (!memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN)) ++ return WPA_CIPHER_NONE; ++ if (!memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN)) ++ return WPA_CIPHER_WEP40; ++ if (!memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN)) ++ return WPA_CIPHER_TKIP; ++ if (!memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN)) ++ return WPA_CIPHER_CCMP; ++ if (!memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN)) ++ return WPA_CIPHER_WEP104; ++ ++ return 0; ++} ++ ++int rtw_get_wpa2_cipher_suite(u8 *s) ++{ ++ if (!memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN)) ++ return WPA_CIPHER_NONE; ++ if (!memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN)) ++ return WPA_CIPHER_WEP40; ++ if (!memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN)) ++ return WPA_CIPHER_TKIP; ++ if (!memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN)) ++ return WPA_CIPHER_CCMP; ++ if (!memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN)) ++ return WPA_CIPHER_WEP104; ++ ++ return 0; ++} ++ ++int rtw_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) ++{ ++ int i, ret = _SUCCESS; ++ int left, count; ++ u8 *pos; ++ u8 SUITE_1X[4] = {0x00, 0x50, 0xf2, 1}; ++ ++ if (wpa_ie_len <= 0) { ++ /* No WPA IE - fail silently */ ++ return _FAIL; ++ } ++ ++ if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie + 1) != (u8)(wpa_ie_len - 2)) || ++ (memcmp(wpa_ie + 2, RTW_WPA_OUI_TYPE, WPA_SELECTOR_LEN))) ++ return _FAIL; ++ ++ pos = wpa_ie; ++ ++ pos += 8; ++ left = wpa_ie_len - 8; ++ ++ /* group_cipher */ ++ if (left >= WPA_SELECTOR_LEN) { ++ *group_cipher = rtw_get_wpa_cipher_suite(pos); ++ pos += WPA_SELECTOR_LEN; ++ left -= WPA_SELECTOR_LEN; ++ } else if (left > 0) { ++ return _FAIL; ++ } ++ ++ /* pairwise_cipher */ ++ if (left >= 2) { ++ count = get_unaligned_le16(pos); ++ pos += 2; ++ left -= 2; ++ ++ if (count == 0 || left < count * WPA_SELECTOR_LEN) ++ return _FAIL; ++ ++ for (i = 0; i < count; i++) { ++ *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos); ++ ++ pos += WPA_SELECTOR_LEN; ++ left -= WPA_SELECTOR_LEN; ++ } ++ } else if (left == 1) { ++ return _FAIL; ++ } ++ ++ if (is_8021x) { ++ if (left >= 6) { ++ pos += 2; ++ if (!memcmp(pos, SUITE_1X, 4)) ++ *is_8021x = 1; ++ } ++ } ++ ++ return ret; ++} ++ ++int rtw_parse_wpa2_ie(u8 *rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) ++{ ++ int i, ret = _SUCCESS; ++ int left, count; ++ u8 *pos; ++ u8 SUITE_1X[4] = {0x00, 0x0f, 0xac, 0x01}; ++ ++ if (rsn_ie_len <= 0) { ++ /* No RSN IE - fail silently */ ++ return _FAIL; ++ } ++ ++ if ((*rsn_ie != _WPA2_IE_ID_) || (*(rsn_ie + 1) != (u8)(rsn_ie_len - 2))) ++ return _FAIL; ++ ++ pos = rsn_ie; ++ pos += 4; ++ left = rsn_ie_len - 4; ++ ++ /* group_cipher */ ++ if (left >= RSN_SELECTOR_LEN) { ++ *group_cipher = rtw_get_wpa2_cipher_suite(pos); ++ ++ pos += RSN_SELECTOR_LEN; ++ left -= RSN_SELECTOR_LEN; ++ ++ } else if (left > 0) { ++ return _FAIL; ++ } ++ ++ /* pairwise_cipher */ ++ if (left >= 2) { ++ count = get_unaligned_le16(pos); ++ pos += 2; ++ left -= 2; ++ ++ if (count == 0 || left < count * RSN_SELECTOR_LEN) ++ return _FAIL; ++ ++ for (i = 0; i < count; i++) { ++ *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos); ++ ++ pos += RSN_SELECTOR_LEN; ++ left -= RSN_SELECTOR_LEN; ++ } ++ ++ } else if (left == 1) { ++ return _FAIL; ++ } ++ ++ if (is_8021x) { ++ if (left >= 6) { ++ pos += 2; ++ if (!memcmp(pos, SUITE_1X, 4)) ++ *is_8021x = 1; ++ } ++ } ++ return ret; ++} ++ ++int rtw_get_sec_ie(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len, u8 *wpa_ie, u16 *wpa_len) ++{ ++ u8 authmode; ++ u8 wpa_oui[4] = {0x0, 0x50, 0xf2, 0x01}; ++ uint cnt; ++ ++ /* Search required WPA or WPA2 IE and copy to sec_ie[] */ ++ ++ cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_); ++ ++ while (cnt < in_len) { ++ authmode = in_ie[cnt]; ++ ++ if ((authmode == _WPA_IE_ID_) && (!memcmp(&in_ie[cnt + 2], &wpa_oui[0], 4))) { ++ if (wpa_ie) ++ memcpy(wpa_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); ++ ++ *wpa_len = in_ie[cnt + 1] + 2; ++ cnt += in_ie[cnt + 1] + 2; /* get next */ ++ } else { ++ if (authmode == _WPA2_IE_ID_) { ++ if (rsn_ie) ++ memcpy(rsn_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); ++ ++ *rsn_len = in_ie[cnt + 1] + 2; ++ cnt += in_ie[cnt + 1] + 2; /* get next */ ++ } else { ++ cnt += in_ie[cnt + 1] + 2; /* get next */ ++ } ++ } ++ } ++ ++ return *rsn_len + *wpa_len; ++} ++ ++u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen) ++{ ++ u8 match = false; ++ u8 eid, wps_oui[4] = {0x0, 0x50, 0xf2, 0x04}; ++ ++ if (!ie_ptr) ++ return match; ++ ++ eid = ie_ptr[0]; ++ ++ if ((eid == _WPA_IE_ID_) && (!memcmp(&ie_ptr[2], wps_oui, 4))) { ++ *wps_ielen = ie_ptr[1] + 2; ++ match = true; ++ } ++ return match; ++} ++ ++/** ++ * rtw_get_wps_ie - Search WPS IE from a series of IEs ++ * @in_ie: Address of IEs to search ++ * @in_len: Length limit from in_ie ++ * @wps_ie: If not NULL and WPS IE is found, WPS IE will be copied to the buf starting from wps_ie ++ * @wps_ielen: If not NULL and WPS IE is found, will set to the length of the entire WPS IE ++ * ++ * Returns: The address of the WPS IE found, or NULL ++ */ ++u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) ++{ ++ uint cnt; ++ u8 *wpsie_ptr = NULL; ++ u8 eid, wps_oui[4] = {0x0, 0x50, 0xf2, 0x04}; ++ ++ if (wps_ielen) ++ *wps_ielen = 0; ++ ++ if (!in_ie || in_len <= 0) ++ return wpsie_ptr; ++ ++ cnt = 0; ++ ++ while (cnt < in_len) { ++ eid = in_ie[cnt]; ++ ++ if ((eid == _WPA_IE_ID_) && (!memcmp(&in_ie[cnt + 2], wps_oui, 4))) { ++ wpsie_ptr = &in_ie[cnt]; ++ ++ if (wps_ie) ++ memcpy(wps_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); ++ ++ if (wps_ielen) ++ *wps_ielen = in_ie[cnt + 1] + 2; ++ ++ cnt += in_ie[cnt + 1] + 2; ++ ++ break; ++ } else { ++ cnt += in_ie[cnt + 1] + 2; /* goto next */ ++ } ++ } ++ return wpsie_ptr; ++} ++ ++/** ++ * rtw_get_wps_attr - Search a specific WPS attribute from a given WPS IE ++ * @wps_ie: Address of WPS IE to search ++ * @wps_ielen: Length limit from wps_ie ++ * @target_attr_id: The attribute ID of WPS attribute to search ++ * @buf_attr: If not NULL and the WPS attribute is found, WPS attribute will be copied to the buf starting from buf_attr ++ * @len_attr: If not NULL and the WPS attribute is found, will set to the length of the entire WPS attribute ++ * ++ * Returns: the address of the specific WPS attribute found, or NULL ++ */ ++u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, u8 *buf_attr, u32 *len_attr) ++{ ++ u8 *attr_ptr = NULL; ++ u8 *target_attr_ptr = NULL; ++ u8 wps_oui[4] = {0x00, 0x50, 0xF2, 0x04}; ++ ++ if (len_attr) ++ *len_attr = 0; ++ ++ if ((wps_ie[0] != _VENDOR_SPECIFIC_IE_) || ++ (memcmp(wps_ie + 2, wps_oui, 4))) ++ return attr_ptr; ++ ++ /* 6 = 1(Element ID) + 1(Length) + 4(WPS OUI) */ ++ attr_ptr = wps_ie + 6; /* goto first attr */ ++ ++ while (attr_ptr - wps_ie < wps_ielen) { ++ /* 4 = 2(Attribute ID) + 2(Length) */ ++ u16 attr_id = RTW_GET_BE16(attr_ptr); ++ u16 attr_data_len = RTW_GET_BE16(attr_ptr + 2); ++ u16 attr_len = attr_data_len + 4; ++ ++ if (attr_id == target_attr_id) { ++ target_attr_ptr = attr_ptr; ++ if (buf_attr) ++ memcpy(buf_attr, attr_ptr, attr_len); ++ if (len_attr) ++ *len_attr = attr_len; ++ break; ++ } else { ++ attr_ptr += attr_len; /* goto next */ ++ } ++ } ++ return target_attr_ptr; ++} ++ ++/** ++ * rtw_get_wps_attr_content - Search a specific WPS attribute content from a given WPS IE ++ * @wps_ie: Address of WPS IE to search ++ * @wps_ielen: Length limit from wps_ie ++ * @target_attr_id: The attribute ID of WPS attribute to search ++ * @buf_content: If not NULL and the WPS attribute is found, WPS attribute content will be copied to the buf starting from buf_content ++ * @len_content: If not NULL and the WPS attribute is found, will set to the length of the WPS attribute content ++ * ++ * Returns: the address of the specific WPS attribute content found, or NULL ++ */ ++u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, u8 *buf_content, uint *len_content) ++{ ++ u8 *attr_ptr; ++ u32 attr_len; ++ ++ if (len_content) ++ *len_content = 0; ++ ++ attr_ptr = rtw_get_wps_attr(wps_ie, wps_ielen, target_attr_id, NULL, &attr_len); ++ ++ if (attr_ptr && attr_len) { ++ if (buf_content) ++ memcpy(buf_content, attr_ptr + 4, attr_len - 4); ++ ++ if (len_content) ++ *len_content = attr_len - 4; ++ ++ return attr_ptr + 4; ++ } ++ ++ return NULL; ++} ++ ++static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, ++ struct rtw_ieee802_11_elems *elems, ++ int show_errors) ++{ ++ unsigned int oui; ++ ++ /* first 3 bytes in vendor specific information element are the IEEE ++ * OUI of the vendor. The following byte is used a vendor specific ++ * sub-type. */ ++ if (elen < 4) { ++ if (show_errors) { ++ DBG_88E("short vendor specific information element ignored (len=%lu)\n", ++ (unsigned long)elen); ++ } ++ return -1; ++ } ++ ++ oui = RTW_GET_BE24(pos); ++ switch (oui) { ++ case OUI_MICROSOFT: ++ /* Microsoft/Wi-Fi information elements are further typed and ++ * subtyped */ ++ switch (pos[3]) { ++ case 1: ++ /* Microsoft OUI (00:50:F2) with OUI Type 1: ++ * real WPA information element */ ++ elems->wpa_ie = pos; ++ elems->wpa_ie_len = elen; ++ break; ++ case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */ ++ if (elen < 5) { ++ DBG_88E("short WME information element ignored (len=%lu)\n", ++ (unsigned long)elen); ++ return -1; ++ } ++ switch (pos[4]) { ++ case WME_OUI_SUBTYPE_INFORMATION_ELEMENT: ++ case WME_OUI_SUBTYPE_PARAMETER_ELEMENT: ++ elems->wme = pos; ++ elems->wme_len = elen; ++ break; ++ case WME_OUI_SUBTYPE_TSPEC_ELEMENT: ++ elems->wme_tspec = pos; ++ elems->wme_tspec_len = elen; ++ break; ++ default: ++ DBG_88E("unknown WME information element ignored (subtype=%d len=%lu)\n", ++ pos[4], (unsigned long)elen); ++ return -1; ++ } ++ break; ++ case 4: ++ /* Wi-Fi Protected Setup (WPS) IE */ ++ elems->wps_ie = pos; ++ elems->wps_ie_len = elen; ++ break; ++ default: ++ DBG_88E("Unknown Microsoft information element ignored (type=%d len=%lu)\n", ++ pos[3], (unsigned long)elen); ++ return -1; ++ } ++ break; ++ ++ case OUI_BROADCOM: ++ switch (pos[3]) { ++ case VENDOR_HT_CAPAB_OUI_TYPE: ++ elems->vendor_ht_cap = pos; ++ elems->vendor_ht_cap_len = elen; ++ break; ++ default: ++ DBG_88E("Unknown Broadcom information element ignored (type=%d len=%lu)\n", ++ pos[3], (unsigned long)elen); ++ return -1; ++ } ++ break; ++ default: ++ DBG_88E("unknown vendor specific information element ignored (vendor OUI %02x:%02x:%02x len=%lu)\n", ++ pos[0], pos[1], pos[2], (unsigned long)elen); ++ return -1; ++ } ++ return 0; ++} ++ ++/** ++ * ieee802_11_parse_elems - Parse information elements in management frames ++ * @start: Pointer to the start of IEs ++ * @len: Length of IE buffer in octets ++ * @elems: Data structure for parsed elements ++ * @show_errors: Whether to show parsing errors in debug log ++ * Returns: Parsing result ++ */ ++enum parse_res rtw_ieee802_11_parse_elems(u8 *start, uint len, ++ struct rtw_ieee802_11_elems *elems, ++ int show_errors) ++{ ++ uint left = len; ++ u8 *pos = start; ++ int unknown = 0; ++ ++ memset(elems, 0, sizeof(*elems)); ++ ++ while (left >= 2) { ++ u8 id, elen; ++ ++ id = *pos++; ++ elen = *pos++; ++ left -= 2; ++ ++ if (elen > left) { ++ if (show_errors) { ++ DBG_88E("IEEE 802.11 element parse failed (id=%d elen=%d left=%lu)\n", ++ id, elen, (unsigned long)left); ++ } ++ return ParseFailed; ++ } ++ ++ switch (id) { ++ case WLAN_EID_SSID: ++ elems->ssid = pos; ++ elems->ssid_len = elen; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ elems->supp_rates = pos; ++ elems->supp_rates_len = elen; ++ break; ++ case WLAN_EID_FH_PARAMS: ++ elems->fh_params = pos; ++ elems->fh_params_len = elen; ++ break; ++ case WLAN_EID_DS_PARAMS: ++ elems->ds_params = pos; ++ elems->ds_params_len = elen; ++ break; ++ case WLAN_EID_CF_PARAMS: ++ elems->cf_params = pos; ++ elems->cf_params_len = elen; ++ break; ++ case WLAN_EID_TIM: ++ elems->tim = pos; ++ elems->tim_len = elen; ++ break; ++ case WLAN_EID_IBSS_PARAMS: ++ elems->ibss_params = pos; ++ elems->ibss_params_len = elen; ++ break; ++ case WLAN_EID_CHALLENGE: ++ elems->challenge = pos; ++ elems->challenge_len = elen; ++ break; ++ case WLAN_EID_ERP_INFO: ++ elems->erp_info = pos; ++ elems->erp_info_len = elen; ++ break; ++ case WLAN_EID_EXT_SUPP_RATES: ++ elems->ext_supp_rates = pos; ++ elems->ext_supp_rates_len = elen; ++ break; ++ case WLAN_EID_VENDOR_SPECIFIC: ++ if (rtw_ieee802_11_parse_vendor_specific(pos, elen, elems, show_errors)) ++ unknown++; ++ break; ++ case WLAN_EID_RSN: ++ elems->rsn_ie = pos; ++ elems->rsn_ie_len = elen; ++ break; ++ case WLAN_EID_PWR_CAPABILITY: ++ elems->power_cap = pos; ++ elems->power_cap_len = elen; ++ break; ++ case WLAN_EID_SUPPORTED_CHANNELS: ++ elems->supp_channels = pos; ++ elems->supp_channels_len = elen; ++ break; ++ case WLAN_EID_MOBILITY_DOMAIN: ++ elems->mdie = pos; ++ elems->mdie_len = elen; ++ break; ++ case WLAN_EID_FAST_BSS_TRANSITION: ++ elems->ftie = pos; ++ elems->ftie_len = elen; ++ break; ++ case WLAN_EID_TIMEOUT_INTERVAL: ++ elems->timeout_int = pos; ++ elems->timeout_int_len = elen; ++ break; ++ case WLAN_EID_HT_CAP: ++ elems->ht_capabilities = pos; ++ elems->ht_capabilities_len = elen; ++ break; ++ case WLAN_EID_HT_OPERATION: ++ elems->ht_operation = pos; ++ elems->ht_operation_len = elen; ++ break; ++ default: ++ unknown++; ++ if (!show_errors) ++ break; ++ DBG_88E("IEEE 802.11 element parse ignored unknown element (id=%d elen=%d)\n", ++ id, elen); ++ break; ++ } ++ left -= elen; ++ pos += elen; ++ } ++ if (left) ++ return ParseFailed; ++ return unknown ? ParseUnknown : ParseOK; ++} ++ ++u8 key_char2num(u8 ch) ++{ ++ if ((ch >= '0') && (ch <= '9')) ++ return ch - '0'; ++ else if ((ch >= 'a') && (ch <= 'f')) ++ return ch - 'a' + 10; ++ else if ((ch >= 'A') && (ch <= 'F')) ++ return ch - 'A' + 10; ++ else ++ return 0xff; ++} ++ ++u8 str_2char2num(u8 hch, u8 lch) ++{ ++ return (key_char2num(hch) * 10) + key_char2num(lch); ++} ++ ++u8 key_2char2num(u8 hch, u8 lch) ++{ ++ return (key_char2num(hch) << 4) | key_char2num(lch); ++} ++ ++void rtw_macaddr_cfg(u8 *mac_addr) ++{ ++ u8 mac[ETH_ALEN]; ++ if (!mac_addr) ++ return; ++ ++ if (rtw_initmac) { /* Users specify the mac address */ ++ int jj, kk; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk + 1]); ++ memcpy(mac_addr, mac, ETH_ALEN); ++ } else { /* Use the mac address stored in the Efuse */ ++ memcpy(mac, mac_addr, ETH_ALEN); ++ } ++ ++ if (((mac[0] == 0xff) && (mac[1] == 0xff) && (mac[2] == 0xff) && ++ (mac[3] == 0xff) && (mac[4] == 0xff) && (mac[5] == 0xff)) || ++ ((mac[0] == 0x0) && (mac[1] == 0x0) && (mac[2] == 0x0) && ++ (mac[3] == 0x0) && (mac[4] == 0x0) && (mac[5] == 0x0))) { ++ mac[0] = 0x00; ++ mac[1] = 0xe0; ++ mac[2] = 0x4c; ++ mac[3] = 0x87; ++ mac[4] = 0x00; ++ mac[5] = 0x00; ++ /* use default mac addresss */ ++ memcpy(mac_addr, mac, ETH_ALEN); ++ DBG_88E("MAC Address from efuse error, assign default one !!!\n"); ++ } ++ ++ DBG_88E("rtw_macaddr_cfg MAC Address = %pM\n", (mac_addr)); ++} ++ ++void dump_ies(u8 *buf, u32 buf_len) ++{ ++ u8 *pos = (u8 *)buf; ++ u8 id, len; ++ ++ while (pos - buf <= buf_len) { ++ id = *pos; ++ len = *(pos + 1); ++ ++ DBG_88E("%s ID:%u, LEN:%u\n", __func__, id, len); ++ #ifdef CONFIG_88EU_P2P ++ dump_p2p_ie(pos, len); ++ #endif ++ dump_wps_ie(pos, len); ++ ++ pos += (2 + len); ++ } ++} ++ ++void dump_wps_ie(u8 *ie, u32 ie_len) ++{ ++ u8 *pos = (u8 *)ie; ++ u16 id; ++ u16 len; ++ u8 *wps_ie; ++ uint wps_ielen; ++ ++ wps_ie = rtw_get_wps_ie(ie, ie_len, NULL, &wps_ielen); ++ if (wps_ie != ie || wps_ielen == 0) ++ return; ++ ++ pos += 6; ++ while (pos - ie < ie_len) { ++ id = RTW_GET_BE16(pos); ++ len = RTW_GET_BE16(pos + 2); ++ DBG_88E("%s ID:0x%04x, LEN:%u\n", __func__, id, len); ++ pos += (4 + len); ++ } ++} ++ ++#ifdef CONFIG_88EU_P2P ++void dump_p2p_ie(u8 *ie, u32 ie_len) ++{ ++ u8 *pos = (u8 *)ie; ++ u8 id; ++ u16 len; ++ u8 *p2p_ie; ++ uint p2p_ielen; ++ ++ p2p_ie = rtw_get_p2p_ie(ie, ie_len, NULL, &p2p_ielen); ++ if (p2p_ie != ie || p2p_ielen == 0) ++ return; ++ ++ pos += 6; ++ while (pos - ie < ie_len) { ++ id = *pos; ++ len = get_unaligned_le16(pos + 1); ++ DBG_88E("%s ID:%u, LEN:%u\n", __func__, id, len); ++ pos += (3 + len); ++ } ++} ++ ++/** ++ * rtw_get_p2p_ie - Search P2P IE from a series of IEs ++ * @in_ie: Address of IEs to search ++ * @in_len: Length limit from in_ie ++ * @p2p_ie: If not NULL and P2P IE is found, P2P IE will be copied to the buf starting from p2p_ie ++ * @p2p_ielen: If not NULL and P2P IE is found, will set to the length of the entire P2P IE ++ * ++ * Returns: The address of the P2P IE found, or NULL ++ */ ++u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen) ++{ ++ uint cnt = 0; ++ u8 *p2p_ie_ptr; ++ u8 eid, p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09}; ++ ++ if (p2p_ielen) ++ *p2p_ielen = 0; ++ ++ while (cnt < in_len) { ++ eid = in_ie[cnt]; ++ if ((in_len < 0) || (cnt > MAX_IE_SZ)) { ++ dump_stack(); ++ return NULL; ++ } ++ if ((eid == _VENDOR_SPECIFIC_IE_) && !memcmp(&in_ie[cnt + 2], p2p_oui, 4)) { ++ p2p_ie_ptr = in_ie + cnt; ++ ++ if (p2p_ie) ++ memcpy(p2p_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); ++ if (p2p_ielen) ++ *p2p_ielen = in_ie[cnt + 1] + 2; ++ return p2p_ie_ptr; ++ } else { ++ cnt += in_ie[cnt + 1] + 2; /* goto next */ ++ } ++ } ++ return NULL; ++} ++ ++/** ++ * rtw_get_p2p_attr - Search a specific P2P attribute from a given P2P IE ++ * @p2p_ie: Address of P2P IE to search ++ * @p2p_ielen: Length limit from p2p_ie ++ * @target_attr_id: The attribute ID of P2P attribute to search ++ * @buf_attr: If not NULL and the P2P attribute is found, P2P attribute will be copied to the buf starting from buf_attr ++ * @len_attr: If not NULL and the P2P attribute is found, will set to the length of the entire P2P attribute ++ * ++ * Returns: the address of the specific WPS attribute found, or NULL ++ */ ++u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, u8 *buf_attr, u32 *len_attr) ++{ ++ u8 *attr_ptr = NULL; ++ u8 *target_attr_ptr = NULL; ++ u8 p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09}; ++ ++ if (len_attr) ++ *len_attr = 0; ++ ++ if (!p2p_ie || (p2p_ie[0] != _VENDOR_SPECIFIC_IE_) || ++ memcmp(p2p_ie + 2, p2p_oui, 4)) ++ return attr_ptr; ++ ++ /* 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) */ ++ attr_ptr = p2p_ie + 6; /* goto first attr */ ++ ++ while (attr_ptr - p2p_ie < p2p_ielen) { ++ /* 3 = 1(Attribute ID) + 2(Length) */ ++ u8 attr_id = *attr_ptr; ++ u16 attr_data_len = get_unaligned_le16(attr_ptr + 1); ++ u16 attr_len = attr_data_len + 3; ++ ++ if (attr_id == target_attr_id) { ++ target_attr_ptr = attr_ptr; ++ ++ if (buf_attr) ++ memcpy(buf_attr, attr_ptr, attr_len); ++ if (len_attr) ++ *len_attr = attr_len; ++ break; ++ } else { ++ attr_ptr += attr_len; /* goto next */ ++ } ++ } ++ return target_attr_ptr; ++} ++ ++/** ++ * rtw_get_p2p_attr_content - Search a specific P2P attribute content from a given P2P IE ++ * @p2p_ie: Address of P2P IE to search ++ * @p2p_ielen: Length limit from p2p_ie ++ * @target_attr_id: The attribute ID of P2P attribute to search ++ * @buf_content: If not NULL and the P2P attribute is found, P2P attribute content will be copied to the buf starting from buf_content ++ * @len_content: If not NULL and the P2P attribute is found, will set to the length of the P2P attribute content ++ * ++ * Returns: the address of the specific P2P attribute content found, or NULL ++ */ ++u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, u8 *buf_content, uint *len_content) ++{ ++ u8 *attr_ptr; ++ u32 attr_len; ++ ++ if (len_content) ++ *len_content = 0; ++ ++ attr_ptr = rtw_get_p2p_attr(p2p_ie, p2p_ielen, target_attr_id, NULL, &attr_len); ++ ++ if (attr_ptr && attr_len) { ++ if (buf_content) ++ memcpy(buf_content, attr_ptr + 3, attr_len - 3); ++ ++ if (len_content) ++ *len_content = attr_len - 3; ++ ++ return attr_ptr + 3; ++ } ++ ++ return NULL; ++} ++ ++u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr) ++{ ++ u32 a_len; ++ ++ *pbuf = attr_id; ++ ++ /* u16*)(pbuf + 1) = cpu_to_le16(attr_len); */ ++ RTW_PUT_LE16(pbuf + 1, attr_len); ++ ++ if (pdata_attr) ++ memcpy(pbuf + 3, pdata_attr, attr_len); ++ ++ a_len = attr_len + 3; ++ ++ return a_len; ++} ++ ++static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id) ++{ ++ u8 *target_attr; ++ u32 target_attr_len; ++ uint ielen = ielen_ori; ++ ++ while (1) { ++ target_attr = rtw_get_p2p_attr(ie, ielen, attr_id, NULL, &target_attr_len); ++ if (target_attr && target_attr_len) { ++ u8 *next_attr = target_attr + target_attr_len; ++ uint remain_len = ielen - (next_attr - ie); ++ ++ memset(target_attr, 0, target_attr_len); ++ memcpy(target_attr, next_attr, remain_len); ++ memset(target_attr + remain_len, 0, target_attr_len); ++ *(ie + 1) -= target_attr_len; ++ ielen -= target_attr_len; ++ } else { ++ break; ++ } ++ } ++ return ielen; ++} ++ ++void rtw_wlan_bssid_ex_remove_p2p_attr(struct wlan_bssid_ex *bss_ex, u8 attr_id) ++{ ++ u8 *p2p_ie; ++ uint p2p_ielen, p2p_ielen_ori; ++ ++ p2p_ie = rtw_get_p2p_ie(bss_ex->IEs + _FIXED_IE_LENGTH_, bss_ex->IELength - _FIXED_IE_LENGTH_, NULL, &p2p_ielen_ori); ++ if (p2p_ie) { ++ p2p_ielen = rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id); ++ if (p2p_ielen != p2p_ielen_ori) { ++ u8 *next_ie_ori = p2p_ie + p2p_ielen_ori; ++ u8 *next_ie = p2p_ie + p2p_ielen; ++ uint remain_len = bss_ex->IELength - (next_ie_ori - bss_ex->IEs); ++ ++ memcpy(next_ie, next_ie_ori, remain_len); ++ memset(next_ie + remain_len, 0, p2p_ielen_ori - p2p_ielen); ++ bss_ex->IELength -= p2p_ielen_ori - p2p_ielen; ++ } ++ } ++} ++ ++#endif /* CONFIG_88EU_P2P */ ++ ++/* Baron adds to avoid FreeBSD warning */ ++int ieee80211_is_empty_essid(const char *essid, int essid_len) ++{ ++ /* Single white space is for Linksys APs */ ++ if (essid_len == 1 && essid[0] == ' ') ++ return 1; ++ ++ /* Otherwise, if the entire essid is 0, we assume it is hidden */ ++ while (essid_len) { ++ essid_len--; ++ if (essid[essid_len] != '\0') ++ return 0; ++ } ++ ++ return 1; ++} ++ ++int ieee80211_get_hdrlen(u16 fc) ++{ ++ int hdrlen = 24; ++ ++ switch (WLAN_FC_GET_TYPE(fc)) { ++ case RTW_IEEE80211_FTYPE_DATA: ++ if (fc & RTW_IEEE80211_STYPE_QOS_DATA) ++ hdrlen += 2; ++ if ((fc & RTW_IEEE80211_FCTL_FROMDS) && (fc & RTW_IEEE80211_FCTL_TODS)) ++ hdrlen += 6; /* Addr4 */ ++ break; ++ case RTW_IEEE80211_FTYPE_CTL: ++ switch (WLAN_FC_GET_STYPE(fc)) { ++ case RTW_IEEE80211_STYPE_CTS: ++ case RTW_IEEE80211_STYPE_ACK: ++ hdrlen = 10; ++ break; ++ default: ++ hdrlen = 16; ++ break; ++ } ++ break; ++ } ++ ++ return hdrlen; ++} ++ ++static int rtw_get_cipher_info(struct wlan_network *pnetwork) ++{ ++ u32 wpa_ielen; ++ unsigned char *pbuf; ++ int group_cipher = 0, pairwise_cipher = 0, is8021x = 0; ++ int ret = _FAIL; ++ pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); ++ ++ if (pbuf && (wpa_ielen > 0)) { ++ if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { ++ pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; ++ pnetwork->BcnInfo.group_cipher = group_cipher; ++ pnetwork->BcnInfo.is_8021x = is8021x; ++ ret = _SUCCESS; ++ } ++ } else { ++ pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); ++ ++ if (pbuf && (wpa_ielen > 0)) { ++ if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { ++ pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; ++ pnetwork->BcnInfo.group_cipher = group_cipher; ++ pnetwork->BcnInfo.is_8021x = is8021x; ++ ret = _SUCCESS; ++ } ++ } ++ } ++ ++ return ret; ++} ++ ++void rtw_get_bcn_info(struct wlan_network *pnetwork) ++{ ++ unsigned short cap = 0; ++ u8 bencrypt = 0; ++ __le16 le_tmp; ++ u16 wpa_len = 0, rsn_len = 0; ++ struct HT_info_element *pht_info = NULL; ++ struct ieee80211_ht_cap *pht_cap = NULL; ++ unsigned int len; ++ unsigned char *p; ++ ++ memcpy(&le_tmp, rtw_get_capability_from_ie(pnetwork->network.IEs), 2); ++ cap = le16_to_cpu(le_tmp); ++ if (cap & WLAN_CAPABILITY_PRIVACY) { ++ bencrypt = 1; ++ pnetwork->network.Privacy = 1; ++ } else { ++ pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_OPENSYS; ++ } ++ rtw_get_sec_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &rsn_len, NULL, &wpa_len); ++ ++ if (rsn_len > 0) { ++ pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA2; ++ } else if (wpa_len > 0) { ++ pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA; ++ } else { ++ if (bencrypt) ++ pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WEP; ++ } ++ rtw_get_cipher_info(pnetwork); ++ ++ /* get bwmode and ch_offset */ ++ /* parsing HT_CAP_IE */ ++ p = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_); ++ if (p && len > 0) { ++ pht_cap = (struct ieee80211_ht_cap *)(p + 2); ++ pnetwork->BcnInfo.ht_cap_info = le16_to_cpu(pht_cap->cap_info); ++ } else { ++ pnetwork->BcnInfo.ht_cap_info = 0; ++ } ++ /* parsing HT_INFO_IE */ ++ p = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_); ++ if (p && len > 0) { ++ pht_info = (struct HT_info_element *)(p + 2); ++ pnetwork->BcnInfo.ht_info_infos_0 = pht_info->infos[0]; ++ } else { ++ pnetwork->BcnInfo.ht_info_infos_0 = 0; ++ } ++} ++ ++/* show MCS rate, unit: 100Kbps */ ++u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char *MCS_rate) ++{ ++ u16 max_rate = 0; ++ ++ if (rf_type == RF_1T1R) { ++ if (MCS_rate[0] & BIT(7)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1500 : 1350) : ((short_GI_20) ? 722 : 650); ++ else if (MCS_rate[0] & BIT(6)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1350 : 1215) : ((short_GI_20) ? 650 : 585); ++ else if (MCS_rate[0] & BIT(5)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1200 : 1080) : ((short_GI_20) ? 578 : 520); ++ else if (MCS_rate[0] & BIT(4)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 900 : 810) : ((short_GI_20) ? 433 : 390); ++ else if (MCS_rate[0] & BIT(3)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 600 : 540) : ((short_GI_20) ? 289 : 260); ++ else if (MCS_rate[0] & BIT(2)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 450 : 405) : ((short_GI_20) ? 217 : 195); ++ else if (MCS_rate[0] & BIT(1)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 300 : 270) : ((short_GI_20) ? 144 : 130); ++ else if (MCS_rate[0] & BIT(0)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 150 : 135) : ((short_GI_20) ? 72 : 65); ++ } else { ++ if (MCS_rate[1]) { ++ if (MCS_rate[1] & BIT(7)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 3000 : 2700) : ((short_GI_20) ? 1444 : 1300); ++ else if (MCS_rate[1] & BIT(6)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 2700 : 2430) : ((short_GI_20) ? 1300 : 1170); ++ else if (MCS_rate[1] & BIT(5)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 2400 : 2160) : ((short_GI_20) ? 1156 : 1040); ++ else if (MCS_rate[1] & BIT(4)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1800 : 1620) : ((short_GI_20) ? 867 : 780); ++ else if (MCS_rate[1] & BIT(3)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1200 : 1080) : ((short_GI_20) ? 578 : 520); ++ else if (MCS_rate[1] & BIT(2)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 900 : 810) : ((short_GI_20) ? 433 : 390); ++ else if (MCS_rate[1] & BIT(1)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 600 : 540) : ((short_GI_20) ? 289 : 260); ++ else if (MCS_rate[1] & BIT(0)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 300 : 270) : ((short_GI_20) ? 144 : 130); ++ } else { ++ if (MCS_rate[0] & BIT(7)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1500 : 1350) : ((short_GI_20) ? 722 : 650); ++ else if (MCS_rate[0] & BIT(6)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1350 : 1215) : ((short_GI_20) ? 650 : 585); ++ else if (MCS_rate[0] & BIT(5)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 1200 : 1080) : ((short_GI_20) ? 578 : 520); ++ else if (MCS_rate[0] & BIT(4)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 900 : 810) : ((short_GI_20) ? 433 : 390); ++ else if (MCS_rate[0] & BIT(3)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 600 : 540) : ((short_GI_20) ? 289 : 260); ++ else if (MCS_rate[0] & BIT(2)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 450 : 405) : ((short_GI_20) ? 217 : 195); ++ else if (MCS_rate[0] & BIT(1)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 300 : 270) : ((short_GI_20) ? 144 : 130); ++ else if (MCS_rate[0] & BIT(0)) ++ max_rate = (bw_40MHz) ? ((short_GI_40) ? 150 : 135) : ((short_GI_20) ? 72 : 65); ++ } ++ } ++ return max_rate; ++} ++ ++int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8 *category, u8 *action) ++{ ++ const u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr); ++ u16 fc; ++ u8 c, a = 0; ++ ++ fc = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)frame)->frame_ctl); ++ ++ if ((fc & (RTW_IEEE80211_FCTL_FTYPE | RTW_IEEE80211_FCTL_STYPE)) != ++ (RTW_IEEE80211_FTYPE_MGMT | RTW_IEEE80211_STYPE_ACTION)) ++ return false; ++ ++ c = frame_body[0]; ++ ++ switch (c) { ++ case RTW_WLAN_CATEGORY_P2P: /* vendor-specific */ ++ break; ++ default: ++ a = frame_body[1]; ++ } ++ ++ if (category) ++ *category = c; ++ if (action) ++ *action = a; ++ ++ return true; ++} ++ ++static const char *_action_public_str[] = { ++ "ACT_PUB_BSSCOEXIST", ++ "ACT_PUB_DSE_ENABLE", ++ "ACT_PUB_DSE_DEENABLE", ++ "ACT_PUB_DSE_REG_LOCATION", ++ "ACT_PUB_EXT_CHL_SWITCH", ++ "ACT_PUB_DSE_MSR_REQ", ++ "ACT_PUB_DSE_MSR_RPRT", ++ "ACT_PUB_MP", ++ "ACT_PUB_DSE_PWR_CONSTRAINT", ++ "ACT_PUB_VENDOR", ++ "ACT_PUB_GAS_INITIAL_REQ", ++ "ACT_PUB_GAS_INITIAL_RSP", ++ "ACT_PUB_GAS_COMEBACK_REQ", ++ "ACT_PUB_GAS_COMEBACK_RSP", ++ "ACT_PUB_TDLS_DISCOVERY_RSP", ++ "ACT_PUB_LOCATION_TRACK", ++ "ACT_PUB_RSVD", ++}; ++ ++const char *action_public_str(u8 action) ++{ ++ action = (action >= ACT_PUBLIC_MAX) ? ACT_PUBLIC_MAX : action; ++ return _action_public_str[action]; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_io.c b/drivers/staging/r8188eu/core/rtw_io.c +new file mode 100644 +index 000000000000..cde0205816b1 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_io.c +@@ -0,0 +1,299 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/* ++ ++The purpose of rtw_io.c ++ ++a. provides the API ++ ++b. provides the protocol engine ++ ++c. provides the software interface between caller and the hardware interface ++ ++Compiler Flag Option: ++ ++USB: ++ a. USE_ASYNC_IRP: Both sync/async operations are provided. ++ ++Only sync read/rtw_write_mem operations are provided. ++ ++jackson@realtek.com.tw ++ ++*/ ++ ++#define _RTW_IO_C_ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_io.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_ops.h" ++ ++#define rtw_le16_to_cpu(val) le16_to_cpu(val) ++#define rtw_le32_to_cpu(val) le32_to_cpu(val) ++#define rtw_cpu_to_le16(val) cpu_to_le16(val) ++#define rtw_cpu_to_le32(val) cpu_to_le32(val) ++ ++u8 _rtw_read8(struct adapter *adapter, u32 addr) ++{ ++ u8 r_val; ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); ++ ++ ++ _read8 = pintfhdl->io_ops._read8; ++ r_val = _read8(pintfhdl, addr); ++ ++ return r_val; ++} ++ ++u16 _rtw_read16(struct adapter *adapter, u32 addr) ++{ ++ u16 r_val; ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); ++ ++ _read16 = pintfhdl->io_ops._read16; ++ ++ r_val = _read16(pintfhdl, addr); ++ ++ return r_val; ++} ++ ++u32 _rtw_read32(struct adapter *adapter, u32 addr) ++{ ++ u32 r_val; ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); ++ ++ _read32 = pintfhdl->io_ops._read32; ++ ++ r_val = _read32(pintfhdl, addr); ++ ++ return r_val; ++} ++ ++int _rtw_write8(struct adapter *adapter, u32 addr, u8 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); ++ int ret; ++ ++ _write8 = pintfhdl->io_ops._write8; ++ ++ ret = _write8(pintfhdl, addr, val); ++ ++ ++ return RTW_STATUS_CODE(ret); ++} ++ ++int _rtw_write16(struct adapter *adapter, u32 addr, u16 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); ++ int ret; ++ ++ _write16 = pintfhdl->io_ops._write16; ++ ++ ret = _write16(pintfhdl, addr, val); ++ ++ ++ return RTW_STATUS_CODE(ret); ++} ++int _rtw_write32(struct adapter *adapter, u32 addr, u32 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); ++ int ret; ++ ++ _write32 = pintfhdl->io_ops._write32; ++ ++ ret = _write32(pintfhdl, addr, val); ++ ++ ++ return RTW_STATUS_CODE(ret); ++} ++ ++int _rtw_writeN(struct adapter *adapter, u32 addr, u32 length, u8 *pdata) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = (struct intf_hdl *)(&pio_priv->intf); ++ int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); ++ int ret; ++ ++ _writeN = pintfhdl->io_ops._writeN; ++ ++ ret = _writeN(pintfhdl, addr, length, pdata); ++ ++ ++ return RTW_STATUS_CODE(ret); ++} ++int _rtw_write8_async(struct adapter *adapter, u32 addr, u8 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); ++ int ret; ++ ++ _write8_async = pintfhdl->io_ops._write8_async; ++ ++ ret = _write8_async(pintfhdl, addr, val); ++ ++ ++ return RTW_STATUS_CODE(ret); ++} ++ ++int _rtw_write16_async(struct adapter *adapter, u32 addr, u16 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); ++ int ret; ++ ++ _write16_async = pintfhdl->io_ops._write16_async; ++ ret = _write16_async(pintfhdl, addr, val); ++ ++ return RTW_STATUS_CODE(ret); ++} ++ ++int _rtw_write32_async(struct adapter *adapter, u32 addr, u32 val) ++{ ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); ++ int ret; ++ ++ _write32_async = pintfhdl->io_ops._write32_async; ++ ret = _write32_async(pintfhdl, addr, val); ++ ++ return RTW_STATUS_CODE(ret); ++} ++ ++void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem) ++{ ++ void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ ++ ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved) ++ return; ++ _read_mem = pintfhdl->io_ops._read_mem; ++ _read_mem(pintfhdl, addr, cnt, pmem); ++ ++} ++ ++void _rtw_write_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem) ++{ ++ void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ ++ ++ ++ _write_mem = pintfhdl->io_ops._write_mem; ++ ++ _write_mem(pintfhdl, addr, cnt, pmem); ++ ++ ++} ++ ++void _rtw_read_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem) ++{ ++ u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ ++ ++ ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved) ++ return; ++ ++ _read_port = pintfhdl->io_ops._read_port; ++ ++ _read_port(pintfhdl, addr, cnt, pmem); ++ ++ ++} ++ ++void _rtw_read_port_cancel(struct adapter *adapter) ++{ ++ void (*_read_port_cancel)(struct intf_hdl *pintfhdl); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ ++ _read_port_cancel = pintfhdl->io_ops._read_port_cancel; ++ ++ if (_read_port_cancel) ++ _read_port_cancel(pintfhdl); ++} ++ ++u32 _rtw_write_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem) ++{ ++ u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ u32 ret = _SUCCESS; ++ ++ ++ ++ _write_port = pintfhdl->io_ops._write_port; ++ ++ ret = _write_port(pintfhdl, addr, cnt, pmem); ++ ++ ++ ++ return ret; ++} ++ ++u32 _rtw_write_port_and_wait(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms) ++{ ++ int ret = _SUCCESS; ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)pmem; ++ struct submit_ctx sctx; ++ ++ rtw_sctx_init(&sctx, timeout_ms); ++ pxmitbuf->sctx = &sctx; ++ ++ ret = _rtw_write_port(adapter, addr, cnt, pmem); ++ ++ if (ret == _SUCCESS) ++ ret = rtw_sctx_wait(&sctx); ++ ++ return ret; ++} ++ ++void _rtw_write_port_cancel(struct adapter *adapter) ++{ ++ void (*_write_port_cancel)(struct intf_hdl *pintfhdl); ++ struct io_priv *pio_priv = &adapter->iopriv; ++ struct intf_hdl *pintfhdl = &pio_priv->intf; ++ ++ _write_port_cancel = pintfhdl->io_ops._write_port_cancel; ++ ++ if (_write_port_cancel) ++ _write_port_cancel(pintfhdl); ++} ++ ++int rtw_init_io_priv(struct adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops)) ++{ ++ struct io_priv *piopriv = &padapter->iopriv; ++ struct intf_hdl *pintf = &piopriv->intf; ++ ++ if (!set_intf_ops) ++ return _FAIL; ++ ++ piopriv->padapter = padapter; ++ pintf->padapter = padapter; ++ pintf->pintf_dev = adapter_to_dvobj(padapter); ++ ++ set_intf_ops(&pintf->io_ops); ++ ++ return _SUCCESS; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_ioctl_set.c b/drivers/staging/r8188eu/core/rtw_ioctl_set.c +new file mode 100644 +index 000000000000..c187de78b4ac +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_ioctl_set.c +@@ -0,0 +1,891 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_IOCTL_SET_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_ioctl_set.h" ++#include "../include/hal_intf.h" ++ ++#include "../include/usb_osintf.h" ++#include "../include/usb_ops.h" ++ ++extern void indicate_wx_scan_complete_event(struct adapter *padapter); ++ ++u8 rtw_validate_ssid(struct ndis_802_11_ssid *ssid) ++{ ++ u8 i; ++ u8 ret = true; ++ ++ if (ssid->SsidLength > 32) { ++ ret = false; ++ goto exit; ++ } ++ ++ for (i = 0; i < ssid->SsidLength; i++) { ++ /* wifi, printable ascii code must be supported */ ++ if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e))) { ++ ret = false; ++ break; ++ } ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++u8 rtw_do_join(struct adapter *padapter) ++{ ++ struct list_head *plist, *phead; ++ u8 *pibss = NULL; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ u8 ret = _SUCCESS; ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ pmlmepriv->cur_network.join_res = -2; ++ ++ set_fwstate(pmlmepriv, _FW_UNDER_LINKING); ++ ++ pmlmepriv->pscanned = plist; ++ ++ pmlmepriv->to_join = true; ++ ++ if (list_empty(&queue->queue)) { ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ ++ /* when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty */ ++ /* we try to issue sitesurvey firstly */ ++ ++ if (!pmlmepriv->LinkDetectInfo.bBusyTraffic || ++ pmlmepriv->to_roaming > 0) { ++ /* submit site_survey_cmd */ ++ ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); ++ if (_SUCCESS != ret) ++ pmlmepriv->to_join = false; ++ } else { ++ pmlmepriv->to_join = false; ++ ret = _FAIL; ++ } ++ ++ goto exit; ++ } else { ++ int select_ret; ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ select_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); ++ if (select_ret == _SUCCESS) { ++ pmlmepriv->to_join = false; ++ _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); ++ } else { ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ /* submit createbss_cmd to change to a ADHOC_MASTER */ ++ ++ /* pmlmepriv->lock has been acquired by caller... */ ++ struct wlan_bssid_ex *pdev_network = &padapter->registrypriv.dev_network; ++ ++ pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; ++ ++ pibss = padapter->registrypriv.dev_network.MacAddress; ++ ++ memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); ++ ++ rtw_update_registrypriv_dev_network(padapter); ++ ++ rtw_generate_random_ibss(pibss); ++ ++ if (rtw_createbss_cmd(padapter) != _SUCCESS) { ++ ret = false; ++ goto exit; ++ } ++ pmlmepriv->to_join = false; ++ } else { ++ /* can't associate ; reset under-linking */ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ ++ /* when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue */ ++ /* we try to issue sitesurvey firstly */ ++ if (!pmlmepriv->LinkDetectInfo.bBusyTraffic || ++ pmlmepriv->to_roaming > 0) { ++ ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); ++ if (_SUCCESS != ret) ++ pmlmepriv->to_join = false; ++ } else { ++ ret = _FAIL; ++ pmlmepriv->to_join = false; ++ } ++ } ++ } ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++u8 rtw_set_802_11_bssid(struct adapter *padapter, u8 *bssid) ++{ ++ u8 status = _SUCCESS; ++ u32 cur_time = 0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ DBG_88E_LEVEL(_drv_info_, "set bssid:%pM\n", bssid); ++ ++ if ((bssid[0] == 0x00 && bssid[1] == 0x00 && bssid[2] == 0x00 && ++ bssid[3] == 0x00 && bssid[4] == 0x00 && bssid[5] == 0x00) || ++ (bssid[0] == 0xFF && bssid[1] == 0xFF && bssid[2] == 0xFF && ++ bssid[3] == 0xFF && bssid[4] == 0xFF && bssid[5] == 0xFF)) { ++ status = _FAIL; ++ goto exit; ++ } ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ DBG_88E("Set BSSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv)); ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) ++ goto handle_tkip_countermeasure; ++ else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) ++ goto release_mlme_lock; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE)) { ++ if (!memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN)) { ++ if (!check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */ ++ } else { ++ rtw_disassoc_cmd(padapter, 0, true); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ rtw_indicate_disconnect(padapter); ++ ++ rtw_free_assoc_resources(padapter, 1); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); ++ set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); ++ } ++ } ++ } ++ ++handle_tkip_countermeasure: ++ /* should we add something here...? */ ++ ++ if (padapter->securitypriv.btkip_countermeasure) { ++ cur_time = jiffies; ++ ++ if ((cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ) { ++ padapter->securitypriv.btkip_countermeasure = false; ++ padapter->securitypriv.btkip_countermeasure_time = 0; ++ } else { ++ status = _FAIL; ++ goto release_mlme_lock; ++ } ++ } ++ ++ memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); ++ pmlmepriv->assoc_by_bssid = true; ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) ++ pmlmepriv->to_join = true; ++ else ++ status = rtw_do_join(padapter); ++ ++release_mlme_lock: ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++exit: ++ return status; ++} ++ ++u8 rtw_set_802_11_ssid(struct adapter *padapter, struct ndis_802_11_ssid *ssid) ++{ ++ u8 status = _SUCCESS; ++ u32 cur_time = 0; ++ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_network *pnetwork = &pmlmepriv->cur_network; ++ ++ DBG_88E_LEVEL(_drv_info_, "set ssid [%s] fw_state=0x%08x\n", ++ ssid->Ssid, get_fwstate(pmlmepriv)); ++ ++ if (!padapter->hw_init_completed) { ++ status = _FAIL; ++ goto exit; ++ } ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ DBG_88E("Set SSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv)); ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { ++ goto handle_tkip_countermeasure; ++ } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { ++ goto release_mlme_lock; ++ } ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE)) { ++ if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) && ++ (!memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength))) { ++ if (!check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ if (!rtw_is_same_ibss(padapter, pnetwork)) { ++ /* if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again */ ++ rtw_disassoc_cmd(padapter, 0, true); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ rtw_indicate_disconnect(padapter); ++ ++ rtw_free_assoc_resources(padapter, 1); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); ++ set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); ++ } ++ } else { ++ goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */ ++ } ++ } else { ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1); ++ } ++ } else { ++ rtw_disassoc_cmd(padapter, 0, true); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ rtw_indicate_disconnect(padapter); ++ ++ rtw_free_assoc_resources(padapter, 1); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); ++ set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); ++ } ++ } ++ } ++ ++handle_tkip_countermeasure: ++ ++ if (padapter->securitypriv.btkip_countermeasure) { ++ cur_time = jiffies; ++ ++ if ((cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ) { ++ padapter->securitypriv.btkip_countermeasure = false; ++ padapter->securitypriv.btkip_countermeasure_time = 0; ++ } else { ++ status = _FAIL; ++ goto release_mlme_lock; ++ } ++ } ++ ++ memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(struct ndis_802_11_ssid)); ++ pmlmepriv->assoc_by_bssid = false; ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { ++ pmlmepriv->to_join = true; ++ } else { ++ status = rtw_do_join(padapter); ++ } ++ ++release_mlme_lock: ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++exit: ++ return status; ++} ++ ++u8 rtw_set_802_11_infrastructure_mode(struct adapter *padapter, ++ enum ndis_802_11_network_infra networktype) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ enum ndis_802_11_network_infra *pold_state = &cur_network->network.InfrastructureMode; ++ ++ if (*pold_state != networktype) { ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ /* DBG_88E("change mode, old_mode =%d, new_mode =%d, fw_state = 0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); */ ++ ++ if (*pold_state == Ndis802_11APMode) { ++ /* change to other mode from Ndis802_11APMode */ ++ cur_network->join_res = -1; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ stop_ap_mode(padapter); ++#endif ++ } ++ ++ if ((check_fwstate(pmlmepriv, _FW_LINKED)) || ++ (*pold_state == Ndis802_11IBSS)) ++ rtw_disassoc_cmd(padapter, 0, true); ++ ++ if ((check_fwstate(pmlmepriv, _FW_LINKED)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))) ++ rtw_free_assoc_resources(padapter, 1); ++ ++ if ((*pold_state == Ndis802_11Infrastructure) || (*pold_state == Ndis802_11IBSS)) { ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ rtw_indicate_disconnect(padapter); /* will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not */ ++ } ++ ++ *pold_state = networktype; ++ ++ _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE); ++ ++ switch (networktype) { ++ case Ndis802_11IBSS: ++ set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); ++ break; ++ case Ndis802_11Infrastructure: ++ set_fwstate(pmlmepriv, WIFI_STATION_STATE); ++ break; ++ case Ndis802_11APMode: ++ set_fwstate(pmlmepriv, WIFI_AP_STATE); ++#ifdef CONFIG_88EU_AP_MODE ++ start_ap_mode(padapter); ++#endif ++ break; ++ case Ndis802_11AutoUnknown: ++ case Ndis802_11InfrastructureMax: ++ break; ++ } ++ spin_unlock_bh(&pmlmepriv->lock); ++ } ++ ++ return true; ++} ++ ++u8 rtw_set_802_11_disassociate(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ rtw_disassoc_cmd(padapter, 0, true); ++ rtw_indicate_disconnect(padapter); ++ rtw_free_assoc_resources(padapter, 1); ++ rtw_pwr_wakeup(padapter); ++ } ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ return true; ++} ++ ++u8 rtw_set_802_11_bssid_list_scan(struct adapter *padapter, struct ndis_802_11_ssid *pssid, int ssid_max_num) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 res = true; ++ ++ if (!padapter) { ++ res = false; ++ goto exit; ++ } ++ if (!padapter->hw_init_completed) { ++ res = false; ++ goto exit; ++ } ++ ++ if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING)) || ++ (pmlmepriv->LinkDetectInfo.bBusyTraffic)) { ++ /* Scan or linking is in progress, do nothing. */ ++ res = true; ++ } else { ++ if (rtw_is_scan_deny(padapter)) { ++ DBG_88E(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter)); ++ indicate_wx_scan_complete_event(padapter); ++ return _SUCCESS; ++ } ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0); ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ } ++exit: ++ ++ return res; ++} ++ ++u8 rtw_set_802_11_authentication_mode(struct adapter *padapter, enum ndis_802_11_auth_mode authmode) ++{ ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ int res; ++ u8 ret; ++ ++ psecuritypriv->ndisauthtype = authmode; ++ ++ if (psecuritypriv->ndisauthtype > 3) ++ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; ++ ++ res = rtw_set_auth(padapter, psecuritypriv); ++ ++ if (res == _SUCCESS) ++ ret = true; ++ else ++ ret = false; ++ ++ return ret; ++} ++ ++u8 rtw_set_802_11_add_wep(struct adapter *padapter, struct ndis_802_11_wep *wep) ++{ ++ int keyid, res; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ u8 ret = _SUCCESS; ++ ++ keyid = wep->KeyIndex & 0x3fffffff; ++ ++ if (keyid >= 4) { ++ ret = false; ++ goto exit; ++ } ++ ++ switch (wep->KeyLength) { ++ case 5: ++ psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; ++ break; ++ case 13: ++ psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; ++ break; ++ default: ++ psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ break; ++ } ++ ++ memcpy(&psecuritypriv->dot11DefKey[keyid].skey[0], &wep->KeyMaterial, wep->KeyLength); ++ ++ psecuritypriv->dot11DefKeylen[keyid] = wep->KeyLength; ++ ++ psecuritypriv->dot11PrivacyKeyIndex = keyid; ++ ++ res = rtw_set_key(padapter, psecuritypriv, keyid, 1); ++ ++ if (res == _FAIL) ++ ret = false; ++exit: ++ ++ return ret; ++} ++ ++u8 rtw_set_802_11_remove_wep(struct adapter *padapter, u32 keyindex) ++{ ++ u8 ret = _SUCCESS; ++ ++ if (keyindex >= 0x80000000 || !padapter) { ++ ret = false; ++ goto exit; ++ } else { ++ int res; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ if (keyindex < 4) { ++ memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16); ++ res = rtw_set_key(padapter, psecuritypriv, keyindex, 0); ++ psecuritypriv->dot11DefKeylen[keyindex] = 0; ++ if (res == _FAIL) ++ ret = _FAIL; ++ } else { ++ ret = _FAIL; ++ } ++ } ++exit: ++ ++ return ret; ++} ++ ++u8 rtw_set_802_11_add_key(struct adapter *padapter, struct ndis_802_11_key *key) ++{ ++ uint encryptionalgo; ++ u8 *pbssid; ++ struct sta_info *stainfo; ++ u8 bgroup = false; ++ u8 bgrouptkey = false;/* can be removed later */ ++ u8 ret = _SUCCESS; ++ ++ if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)) { ++ /* It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, */ ++ /* it must fail the request and return NDIS_STATUS_INVALID_DATA. */ ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if (key->KeyIndex & 0x40000000) { ++ /* Pairwise key */ ++ ++ pbssid = get_bssid(&padapter->mlmepriv); ++ stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid); ++ ++ if (stainfo && padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ++ encryptionalgo = stainfo->dot118021XPrivacy; ++ else ++ encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm; ++ ++ if (key->KeyIndex & 0x000000FF) { ++ /* The key index is specified in the lower 8 bits by values of zero to 255. */ ++ /* The key index should be set to zero for a Pairwise key, and the driver should fail with */ ++ /* NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero */ ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* check BSSID */ ++ if (is_broadcast_ether_addr(key->BSSID)) { ++ ret = false; ++ goto exit; ++ } ++ ++ /* Check key length for TKIP. */ ++ if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* Check key length for AES. */ ++ if ((encryptionalgo == _AES_) && (key->KeyLength != 16)) { ++ /* For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. */ ++ if (key->KeyLength == 32) { ++ key->KeyLength = 16; ++ } else { ++ ret = _FAIL; ++ goto exit; ++ } ++ } ++ ++ /* Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. */ ++ if ((encryptionalgo == _WEP40_ || encryptionalgo == _WEP104_) && ++ (key->KeyLength != 5 && key->KeyLength != 13)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ bgroup = false; ++ } else { ++ /* Group key - KeyIndex(BIT(30) == 0) */ ++ /* when add wep key through add key and didn't assigned encryption type before */ ++ if ((padapter->securitypriv.ndisauthtype <= 3) && ++ (padapter->securitypriv.dot118021XGrpPrivacy == 0)) { ++ switch (key->KeyLength) { ++ case 5: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; ++ break; ++ case 13: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; ++ break; ++ default: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ break; ++ } ++ ++ encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm; ++ } else { ++ encryptionalgo = padapter->securitypriv.dot118021XGrpPrivacy; ++ } ++ ++ if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE) && !is_broadcast_ether_addr(key->BSSID)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* Check key length for TKIP */ ++ if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) { ++ ret = _FAIL; ++ goto exit; ++ } else if (encryptionalgo == _AES_ && (key->KeyLength != 16 && key->KeyLength != 32)) { ++ /* Check key length for AES */ ++ /* For NDTEST, we allow keylen = 32 in this case. 2005.01.27, by rcnjko. */ ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. */ ++ if ((encryptionalgo == _AES_) && (key->KeyLength == 32)) ++ key->KeyLength = 16; ++ ++ if (key->KeyIndex & 0x8000000) {/* error ??? 0x8000_0000 */ ++ bgrouptkey = true; ++ } ++ ++ if ((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)) && ++ (check_fwstate(&padapter->mlmepriv, _FW_LINKED))) ++ bgrouptkey = true; ++ bgroup = true; ++ } ++ ++ /* If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). */ ++ if ((padapter->securitypriv.dot11AuthAlgrthm != dot11AuthAlgrthm_8021X) && ++ (encryptionalgo == _WEP40_ || encryptionalgo == _WEP104_)) { ++ u32 keyindex; ++ u32 len = FIELD_OFFSET(struct ndis_802_11_key, KeyMaterial) + key->KeyLength; ++ struct ndis_802_11_wep *wep = &padapter->securitypriv.ndiswep; ++ ++ wep->Length = len; ++ keyindex = key->KeyIndex & 0x7fffffff; ++ wep->KeyIndex = keyindex; ++ wep->KeyLength = key->KeyLength; ++ ++ memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength); ++ memcpy(&padapter->securitypriv.dot11DefKey[keyindex].skey[0], key->KeyMaterial, key->KeyLength); ++ ++ padapter->securitypriv.dot11DefKeylen[keyindex] = key->KeyLength; ++ padapter->securitypriv.dot11PrivacyKeyIndex = keyindex; ++ ++ ret = rtw_set_802_11_add_wep(padapter, wep); ++ goto exit; ++ } ++ if (key->KeyIndex & 0x20000000) { ++ /* SetRSC */ ++ if (bgroup) { ++ unsigned long long keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL; ++ memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8); ++ } else { ++ unsigned long long keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL; ++ memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8); ++ } ++ } ++ ++ /* Indicate this key idx is used for TX */ ++ /* Save the key in KeyMaterial */ ++ if (bgroup) { /* Group transmit key */ ++ int res; ++ ++ if (bgrouptkey) ++ padapter->securitypriv.dot118021XGrpKeyid = (u8)key->KeyIndex; ++ if ((key->KeyIndex & 0x3) == 0) { ++ ret = _FAIL; ++ goto exit; ++ } ++ memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16); ++ memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); ++ memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); ++ ++ if ((key->KeyIndex & 0x10000000)) { ++ memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); ++ memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); ++ } else { ++ memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); ++ memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); ++ } ++ ++ /* set group key by index */ ++ memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength); ++ ++ key->KeyIndex = key->KeyIndex & 0x03; ++ ++ padapter->securitypriv.binstallGrpkey = true; ++ ++ padapter->securitypriv.bcheck_grpkey = false; ++ ++ res = rtw_set_key(padapter, &padapter->securitypriv, key->KeyIndex, 1); ++ ++ if (res == _FAIL) ++ ret = _FAIL; ++ ++ goto exit; ++ ++ } else { /* Pairwise Key */ ++ u8 res; ++ ++ pbssid = get_bssid(&padapter->mlmepriv); ++ stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid); ++ ++ if (stainfo) { ++ memset(&stainfo->dot118021x_UncstKey, 0, 16);/* clear keybuffer */ ++ ++ memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16); ++ ++ if (encryptionalgo == _TKIP_) { ++ padapter->securitypriv.busetkipkey = false; ++ ++ /* _set_timer(&padapter->securitypriv.tkip_timer, 50); */ ++ ++ /* if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] */ ++ if ((key->KeyIndex & 0x10000000)) { ++ memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8); ++ memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8); ++ ++ } else { ++ memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8); ++ memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8); ++ } ++ } ++ ++ /* Set key to CAM through H2C command */ ++ if (bgrouptkey) /* never go to here */ ++ res = rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, false); ++ else ++ res = rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, true); ++ if (!res) ++ ret = _FAIL; ++ } ++ } ++exit: ++ ++ return ret; ++} ++ ++u8 rtw_set_802_11_remove_key(struct adapter *padapter, struct ndis_802_11_remove_key *key) ++{ ++ u8 *pbssid; ++ struct sta_info *stainfo; ++ u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? false : true; ++ u8 keyIndex = (u8)key->KeyIndex & 0x03; ++ u8 ret = _SUCCESS; ++ ++ if ((key->KeyIndex & 0xbffffffc) > 0) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if (bgroup) { ++ /* clear group key by index */ ++ ++ memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16); ++ ++ /* \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. */ ++ } else { ++ pbssid = get_bssid(&padapter->mlmepriv); ++ stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid); ++ if (stainfo) { ++ /* clear key by BSSID */ ++ memset(&stainfo->dot118021x_UncstKey, 0, 16); ++ ++ /* \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. */ ++ } else { ++ ret = _FAIL; ++ goto exit; ++ } ++ } ++exit: ++ ++ return ret; ++} ++ ++/* ++* rtw_get_cur_max_rate - ++* @adapter: pointer to struct adapter structure ++* ++* Return 0 or 100Kbps ++*/ ++u16 rtw_get_cur_max_rate(struct adapter *adapter) ++{ ++ int i = 0; ++ u8 *p; ++ u16 rate = 0, max_rate = 0; ++ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct registry_priv *pregistrypriv = &adapter->registrypriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; ++ struct ieee80211_ht_cap *pht_capie; ++ u8 rf_type = 0; ++ u8 bw_40MHz = 0, short_GI_20 = 0, short_GI_40 = 0; ++ u16 mcs_rate = 0; ++ u32 ht_ielen = 0; ++ ++ if (adapter->registrypriv.mp_mode == 1) { ++ if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) ++ return 0; ++ } ++ ++ if ((!check_fwstate(pmlmepriv, _FW_LINKED)) && ++ (!check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))) ++ return 0; ++ ++ if (pmlmeext->cur_wireless_mode & (WIRELESS_11_24N)) { ++ p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength - 12); ++ if (p && ht_ielen > 0) { ++ pht_capie = (struct ieee80211_ht_cap *)(p + 2); ++ ++ memcpy(&mcs_rate, pht_capie->mcs.rx_mask, 2); ++ ++ /* cur_bwmod is updated by beacon, pmlmeinfo is updated by association response */ ++ bw_40MHz = (pmlmeext->cur_bwmode && (HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH & pmlmeinfo->HT_info.infos[0])) ? 1 : 0; ++ ++ short_GI_20 = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & IEEE80211_HT_CAP_SGI_20) ? 1 : 0; ++ short_GI_40 = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & IEEE80211_HT_CAP_SGI_40) ? 1 : 0; ++ ++ rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ max_rate = rtw_mcs_rate( ++ rf_type, ++ bw_40MHz & (pregistrypriv->cbw40_enable), ++ short_GI_20, ++ short_GI_40, ++ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate ++ ); ++ } ++ } else { ++ while ((pcur_bss->SupportedRates[i] != 0) && (pcur_bss->SupportedRates[i] != 0xFF)) { ++ rate = pcur_bss->SupportedRates[i] & 0x7F; ++ if (rate > max_rate) ++ max_rate = rate; ++ i++; ++ } ++ ++ max_rate *= 5; ++ } ++ ++ return max_rate; ++} ++ ++/* ++* rtw_set_scan_mode - ++* @adapter: pointer to struct adapter structure ++* @scan_mode: ++* ++* Return _SUCCESS or _FAIL ++*/ ++int rtw_set_scan_mode(struct adapter *adapter, enum rt_scan_type scan_mode) ++{ ++ if (scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE) ++ return _FAIL; ++ ++ adapter->mlmepriv.scan_mode = scan_mode; ++ ++ return _SUCCESS; ++} ++ ++/* ++* rtw_set_channel_plan - ++* @adapter: pointer to struct adapter structure ++* @channel_plan: ++* ++* Return _SUCCESS or _FAIL ++*/ ++int rtw_set_channel_plan(struct adapter *adapter, u8 channel_plan) ++{ ++ /* handle by cmd_thread to sync with scan operation */ ++ return rtw_set_chplan_cmd(adapter, channel_plan, 1); ++} ++ ++/* ++* rtw_set_country - ++* @adapter: pointer to struct adapter structure ++* @country_code: string of country code ++* ++* Return _SUCCESS or _FAIL ++*/ ++int rtw_set_country(struct adapter *adapter, const char *country_code) ++{ ++ int channel_plan = RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G; ++ ++ DBG_88E("%s country_code:%s\n", __func__, country_code); ++ ++ /* TODO: should have a table to match country code and RT_CHANNEL_DOMAIN */ ++ /* TODO: should consider 2-character and 3-character country code */ ++ if (0 == strcmp(country_code, "US")) ++ channel_plan = RT_CHANNEL_DOMAIN_FCC; ++ else if (0 == strcmp(country_code, "EU")) ++ channel_plan = RT_CHANNEL_DOMAIN_ETSI; ++ else if (0 == strcmp(country_code, "JP")) ++ channel_plan = RT_CHANNEL_DOMAIN_MKK; ++ else if (0 == strcmp(country_code, "CN")) ++ channel_plan = RT_CHANNEL_DOMAIN_CHINA; ++ else ++ DBG_88E("%s unknown country_code:%s\n", __func__, country_code); ++ ++ return rtw_set_channel_plan(adapter, channel_plan); ++} +diff --git a/drivers/staging/r8188eu/core/rtw_iol.c b/drivers/staging/r8188eu/core/rtw_iol.c +new file mode 100644 +index 000000000000..5c1b19679cad +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_iol.c +@@ -0,0 +1,192 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/rtw_iol.h" ++ ++struct xmit_frame *rtw_IOL_accquire_xmit_frame(struct adapter *adapter) ++{ ++ struct xmit_frame *xmit_frame; ++ struct xmit_buf *xmitbuf; ++ struct pkt_attrib *pattrib; ++ struct xmit_priv *pxmitpriv = &adapter->xmitpriv; ++ ++ xmit_frame = rtw_alloc_xmitframe(pxmitpriv); ++ if (!xmit_frame) { ++ DBG_88E("%s rtw_alloc_xmitframe return null\n", __func__); ++ goto exit; ++ } ++ ++ xmitbuf = rtw_alloc_xmitbuf(pxmitpriv); ++ if (!xmitbuf) { ++ DBG_88E("%s rtw_alloc_xmitbuf return null\n", __func__); ++ rtw_free_xmitframe(pxmitpriv, xmit_frame); ++ xmit_frame = NULL; ++ goto exit; ++ } ++ ++ xmit_frame->frame_tag = MGNT_FRAMETAG; ++ xmit_frame->pxmitbuf = xmitbuf; ++ xmit_frame->buf_addr = xmitbuf->pbuf; ++ xmitbuf->priv_data = xmit_frame; ++ ++ pattrib = &xmit_frame->attrib; ++ update_mgntframe_attrib(adapter, pattrib); ++ pattrib->qsel = 0x10;/* Beacon */ ++ pattrib->subtype = WIFI_BEACON; ++ pattrib->pktlen = 0; ++ pattrib->last_txcmdsz = 0; ++exit: ++ return xmit_frame; ++} ++ ++int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len) ++{ ++ struct pkt_attrib *pattrib = &xmit_frame->attrib; ++ u16 buf_offset; ++ u32 ori_len; ++ ++ buf_offset = TXDESC_OFFSET; ++ ori_len = buf_offset + pattrib->pktlen; ++ ++ /* check if the io_buf can accommodate new cmds */ ++ if (ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) { ++ DBG_88E("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\n", ++ __func__, ori_len + cmd_len + 8, MAX_XMITBUF_SZ); ++ return _FAIL; ++ } ++ ++ memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, IOL_cmds, cmd_len); ++ pattrib->pktlen += cmd_len; ++ pattrib->last_txcmdsz += cmd_len; ++ ++ return _SUCCESS; ++} ++ ++bool rtw_IOL_applied(struct adapter *adapter) ++{ ++ if (1 == adapter->registrypriv.fw_iol) ++ return true; ++ ++ if ((2 == adapter->registrypriv.fw_iol) && (!adapter_to_dvobj(adapter)->ishighspeed)) ++ return true; ++ return false; ++} ++ ++int rtw_IOL_exec_cmds_sync(struct adapter *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) ++{ ++ return rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms, bndy_cnt); ++} ++ ++int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary) ++{ ++ return _SUCCESS; ++} ++ ++int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask) ++{ ++ struct ioreg_cfg cmd = {8, IOREG_CMD_WB_REG, 0x0, 0x0, 0x0}; ++ ++ cmd.address = cpu_to_le16(addr); ++ cmd.data = cpu_to_le32(value); ++ ++ if (mask != 0xFF) { ++ cmd.length = 12; ++ cmd.mask = cpu_to_le32(mask); ++ } ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); ++} ++ ++int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask) ++{ ++ struct ioreg_cfg cmd = {8, IOREG_CMD_WW_REG, 0x0, 0x0, 0x0}; ++ ++ cmd.address = cpu_to_le16(addr); ++ cmd.data = cpu_to_le32(value); ++ ++ if (mask != 0xFFFF) { ++ cmd.length = 12; ++ cmd.mask = cpu_to_le32(mask); ++ } ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); ++} ++ ++int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask) ++{ ++ struct ioreg_cfg cmd = {8, IOREG_CMD_WD_REG, 0x0, 0x0, 0x0}; ++ ++ cmd.address = cpu_to_le16(addr); ++ cmd.data = cpu_to_le32(value); ++ ++ if (mask != 0xFFFFFFFF) { ++ cmd.length = 12; ++ cmd.mask = cpu_to_le32(mask); ++ } ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); ++} ++ ++int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask) ++{ ++ struct ioreg_cfg cmd = {8, IOREG_CMD_W_RF, 0x0, 0x0, 0x0}; ++ ++ cmd.address = cpu_to_le16((rf_path << 8) | ((addr) & 0xFF)); ++ cmd.data = cpu_to_le32(value); ++ ++ if (mask != 0x000FFFFF) { ++ cmd.length = 12; ++ cmd.mask = cpu_to_le32(mask); ++ } ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); ++} ++ ++int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us) ++{ ++ struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0}; ++ cmd.address = cpu_to_le16(us); ++ ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); ++} ++ ++int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms) ++{ ++ struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0}; ++ ++ cmd.address = cpu_to_le16(ms); ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); ++} ++ ++int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame) ++{ ++ struct ioreg_cfg cmd = {4, IOREG_CMD_END, cpu_to_le16(0xFFFF), cpu_to_le32(0xFF), 0x0}; ++ ++ return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); ++} ++ ++u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame) ++{ ++ u8 is_cmd_bndy = false; ++ if (((pxmit_frame->attrib.pktlen + 32) % 256) + 8 >= 256) { ++ rtw_IOL_append_END_cmd(pxmit_frame); ++ pxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen + 32) / 256) + 1) * 256); ++ ++ pxmit_frame->attrib.last_txcmdsz = pxmit_frame->attrib.pktlen; ++ is_cmd_bndy = true; ++ } ++ return is_cmd_bndy; ++} ++ ++void rtw_IOL_cmd_buf_dump(struct adapter *Adapter, int buf_len, u8 *pbuf) ++{ ++ int i; ++ int j = 1; ++ ++ pr_info("###### %s ######\n", __func__); ++ for (i = 0; i < buf_len; i++) { ++ printk("%02x-", *(pbuf + i)); ++ ++ if (j % 32 == 0) ++ printk("\n"); ++ j++; ++ } ++ printk("\n"); ++ pr_info("=============ioreg_cmd len=%d===============\n", buf_len); ++} +diff --git a/drivers/staging/r8188eu/core/rtw_led.c b/drivers/staging/r8188eu/core/rtw_led.c +new file mode 100644 +index 000000000000..b33e34cce12e +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_led.c +@@ -0,0 +1,1612 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#include "../include/drv_types.h" ++#include "../include/rtw_led.h" ++ ++/* */ ++/* Description: */ ++/* Callback function of LED BlinkTimer, */ ++/* it just schedules to corresponding BlinkWorkItem/led_blink_hdl */ ++/* */ ++void BlinkTimerCallback(struct timer_list *t) ++{ ++ struct LED_871x *pLed = from_timer(pLed, t, BlinkTimer); ++ struct adapter *padapter = pLed->padapter; ++ ++ if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped)) ++ return; ++ ++ _set_workitem(&pLed->BlinkWorkItem); ++} ++ ++/* */ ++/* Description: */ ++/* Callback function of LED BlinkWorkItem. */ ++/* We dispatch acture LED blink action according to LedStrategy. */ ++/* */ ++void BlinkWorkItemCallback(struct work_struct *work) ++{ ++ struct LED_871x *pLed = container_of(work, struct LED_871x, BlinkWorkItem); ++ BlinkHandler(pLed); ++} ++ ++/* */ ++/* Description: */ ++/* Reset status of LED_871x object. */ ++/* */ ++void ResetLedStatus(struct LED_871x *pLed) ++{ ++ pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */ ++ pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */ ++ ++ pLed->bLedBlinkInProgress = false; /* true if it is blinking, false o.w.. */ ++ pLed->bLedWPSBlinkInProgress = false; ++ ++ pLed->BlinkTimes = 0; /* Number of times to toggle led state for blinking. */ ++ pLed->BlinkingLedState = LED_UNKNOWN; /* Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. */ ++ ++ pLed->bLedNoLinkBlinkInProgress = false; ++ pLed->bLedLinkBlinkInProgress = false; ++ pLed->bLedStartToLinkBlinkInProgress = false; ++ pLed->bLedScanBlinkInProgress = false; ++} ++ ++/*Description: */ ++/* Initialize an LED_871x object. */ ++void InitLed871x(struct adapter *padapter, struct LED_871x *pLed, enum LED_PIN_871x LedPin) ++{ ++ pLed->padapter = padapter; ++ pLed->LedPin = LedPin; ++ ++ ResetLedStatus(pLed); ++ ++ timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0); ++ _init_workitem(&pLed->BlinkWorkItem, BlinkWorkItemCallback, pLed); ++} ++ ++/* */ ++/* Description: */ ++/* DeInitialize an LED_871x object. */ ++/* */ ++void DeInitLed871x(struct LED_871x *pLed) ++{ ++ _cancel_workitem_sync(&pLed->BlinkWorkItem); ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ ResetLedStatus(pLed); ++} ++ ++/* */ ++/* Description: */ ++/* Implementation of LED blinking behavior. */ ++/* It toggle off LED and schedule corresponding timer if necessary. */ ++/* */ ++ ++static void SwLedBlink(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++ ++ /* Determine if we shall change LED state again. */ ++ pLed->BlinkTimes--; ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_NORMAL: ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ break; ++ case LED_BLINK_StartToBlink: ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ bStopBlinking = true; ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))) ++ bStopBlinking = true; ++ else if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ break; ++ case LED_BLINK_WPS: ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ break; ++ default: ++ bStopBlinking = true; ++ break; ++ } ++ ++ if (bStopBlinking) { ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && !pLed->bLedOn) { ++ SwLedOn(padapter, pLed); ++ } else if (check_fwstate(pmlmepriv, _FW_LINKED) && pLed->bLedOn) { ++ SwLedOff(padapter, pLed); ++ } ++ pLed->BlinkTimes = 0; ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ /* Assign LED state to toggle. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ ++ /* Schedule a timer to toggle LED state. */ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_NORMAL: ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ break; ++ case LED_BLINK_SLOWLY: ++ case LED_BLINK_StartToBlink: ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ break; ++ case LED_BLINK_WPS: ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LONG_INTERVAL); ++ break; ++ default: ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ break; ++ } ++ } ++} ++ ++static void SwLedBlink1(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++ ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ ResetLedStatus(pLed); ++ return; ++ } ++ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_SLOWLY: ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ break; ++ case LED_BLINK_NORMAL: ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ break; ++ case LED_BLINK_SCAN: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->bLedLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_NORMAL; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ pLed->bLedScanBlinkInProgress = false; ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_BLINK_TXRX: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->bLedLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_NORMAL; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ pLed->BlinkTimes = 0; ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_BLINK_WPS: ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ break; ++ case LED_BLINK_WPS_STOP: /* WPS success */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ bStopBlinking = false; ++ else ++ bStopBlinking = true; ++ ++ if (bStopBlinking) { ++ pLed->bLedLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_NORMAL; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ ++ pLed->bLedWPSBlinkInProgress = false; ++ } else { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static void SwLedBlink2(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_SCAN: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ SwLedOn(padapter, pLed); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ SwLedOff(padapter, pLed); ++ } ++ pLed->bLedScanBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_TXRX: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ SwLedOn(padapter, pLed); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ SwLedOff(padapter, pLed); ++ } ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static void SwLedBlink3(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) { ++ SwLedOn(padapter, pLed); ++ } else { ++ if (pLed->CurrLedState != LED_BLINK_WPS_STOP) ++ SwLedOff(padapter, pLed); ++ } ++ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_SCAN: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (!pLed->bLedOn) ++ SwLedOn(padapter, pLed); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedOn) ++ SwLedOff(padapter, pLed); ++ } ++ pLed->bLedScanBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_TXRX: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (!pLed->bLedOn) ++ SwLedOn(padapter, pLed); ++ } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ ++ if (pLed->bLedOn) ++ SwLedOff(padapter, pLed); ++ } ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_WPS: ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ break; ++ case LED_BLINK_WPS_STOP: /* WPS success */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); ++ bStopBlinking = false; ++ } else { ++ bStopBlinking = true; ++ } ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ SwLedOn(padapter, pLed); ++ } ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static void SwLedBlink4(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct LED_871x *pLed1 = &ledpriv->SwLed1; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++ ++ if (!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) { ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ pLed1->CurrLedState = RTW_LED_OFF; ++ SwLedOff(padapter, pLed1); ++ } ++ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_SLOWLY: ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ break; ++ case LED_BLINK_StartToBlink: ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ } ++ break; ++ case LED_BLINK_SCAN: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = false; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->bLedNoLinkBlinkInProgress = false; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ pLed->bLedScanBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_TXRX: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_WPS: ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ } ++ break; ++ case LED_BLINK_WPS_STOP: /* WPS authentication fail */ ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ break; ++ case LED_BLINK_WPS_STOP_OVERLAP: /* WPS session overlap */ ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) { ++ if (pLed->bLedOn) ++ pLed->BlinkTimes = 1; ++ else ++ bStopBlinking = true; ++ } ++ ++ if (bStopBlinking) { ++ pLed->BlinkTimes = 10; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static void SwLedBlink5(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ u8 bStopBlinking = false; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++ ++ switch (pLed->CurrLedState) { ++ case LED_BLINK_SCAN: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedOn) ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (!pLed->bLedOn) ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ ++ pLed->bLedScanBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ case LED_BLINK_TXRX: ++ pLed->BlinkTimes--; ++ if (pLed->BlinkTimes == 0) ++ bStopBlinking = true; ++ ++ if (bStopBlinking) { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedOn) ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (!pLed->bLedOn) ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ ++ pLed->bLedBlinkInProgress = false; ++ } else { ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) { ++ SwLedOff(padapter, pLed); ++ } else { ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ } ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++static void SwLedBlink6(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ ++ /* Change LED according to BlinkingLedState specified. */ ++ if (pLed->BlinkingLedState == RTW_LED_ON) ++ SwLedOn(padapter, pLed); ++ else ++ SwLedOff(padapter, pLed); ++} ++ ++ /* ALPHA, added by chiyoko, 20090106 */ ++static void SwLedControlMode1(struct adapter *padapter, enum LED_CTL_MODE LedAction) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct LED_871x *pLed = &ledpriv->SwLed0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ switch (LedAction) { ++ case LED_CTL_POWER_ON: ++ case LED_CTL_START_TO_LINK: ++ case LED_CTL_NO_LINK: ++ if (!pLed->bLedNoLinkBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_LINK: ++ if (!pLed->bLedLinkBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_NORMAL; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_LINK_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_SITE_SURVEY: ++ if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) { ++ ; ++ } else if (!pLed->bLedScanBlinkInProgress) { ++ if (IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedScanBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SCAN; ++ pLed->BlinkTimes = 24; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_TX: ++ case LED_CTL_RX: ++ if (!pLed->bLedBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ pLed->bLedBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_TXRX; ++ pLed->BlinkTimes = 2; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_START_WPS: /* wait until xinpin finish */ ++ case LED_CTL_START_WPS_BOTTON: ++ if (!pLed->bLedWPSBlinkInProgress) { ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ pLed->bLedWPSBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_WPS; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_STOP_WPS: ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ if (pLed->bLedWPSBlinkInProgress) ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ else ++ pLed->bLedWPSBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_WPS_STOP; ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_STOP_WPS_FAIL: ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ break; ++ case LED_CTL_POWER_OFF: ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ SwLedOff(padapter, pLed); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /* Arcadyan/Sitecom , added by chiyoko, 20090216 */ ++static void SwLedControlMode2(struct adapter *padapter, enum LED_CTL_MODE LedAction) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct LED_871x *pLed = &ledpriv->SwLed0; ++ ++ switch (LedAction) { ++ case LED_CTL_SITE_SURVEY: ++ if (pmlmepriv->LinkDetectInfo.bBusyTraffic) { ++ } else if (!pLed->bLedScanBlinkInProgress) { ++ if (IS_LED_WPS_BLINKING(pLed)) ++ return; ++ ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedScanBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SCAN; ++ pLed->BlinkTimes = 24; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_TX: ++ case LED_CTL_RX: ++ if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ pLed->bLedBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_TXRX; ++ pLed->BlinkTimes = 2; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_LINK: ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ case LED_CTL_START_WPS: /* wait until xinpin finish */ ++ case LED_CTL_START_WPS_BOTTON: ++ if (!pLed->bLedWPSBlinkInProgress) { ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ pLed->bLedWPSBlinkInProgress = true; ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_STOP_WPS: ++ pLed->bLedWPSBlinkInProgress = false; ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_STOP_WPS_FAIL: ++ pLed->bLedWPSBlinkInProgress = false; ++ if (padapter->pwrctrlpriv.rf_pwrstate != rf_on) { ++ SwLedOff(padapter, pLed); ++ } else { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_START_TO_LINK: ++ case LED_CTL_NO_LINK: ++ if (!IS_LED_BLINKING(pLed)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_POWER_OFF: ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /* COREGA, added by chiyoko, 20090316 */ ++ static void SwLedControlMode3(struct adapter *padapter, enum LED_CTL_MODE LedAction) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct LED_871x *pLed = &ledpriv->SwLed0; ++ ++ switch (LedAction) { ++ case LED_CTL_SITE_SURVEY: ++ if (pmlmepriv->LinkDetectInfo.bBusyTraffic) { ++ } else if (!pLed->bLedScanBlinkInProgress) { ++ if (IS_LED_WPS_BLINKING(pLed)) ++ return; ++ ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedScanBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SCAN; ++ pLed->BlinkTimes = 24; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_TX: ++ case LED_CTL_RX: ++ if ((!pLed->bLedBlinkInProgress) && (check_fwstate(pmlmepriv, _FW_LINKED))) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ pLed->bLedBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_TXRX; ++ pLed->BlinkTimes = 2; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_LINK: ++ if (IS_LED_WPS_BLINKING(pLed)) ++ return; ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ case LED_CTL_START_WPS: /* wait until xinpin finish */ ++ case LED_CTL_START_WPS_BOTTON: ++ if (!pLed->bLedWPSBlinkInProgress) { ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ pLed->bLedWPSBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_WPS; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_STOP_WPS: ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } else { ++ pLed->bLedWPSBlinkInProgress = true; ++ } ++ ++ pLed->CurrLedState = LED_BLINK_WPS_STOP; ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_STOP_WPS_FAIL: ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ case LED_CTL_START_TO_LINK: ++ case LED_CTL_NO_LINK: ++ if (!IS_LED_BLINKING(pLed)) { ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ break; ++ case LED_CTL_POWER_OFF: ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /* Edimax-Belkin, added by chiyoko, 20090413 */ ++static void SwLedControlMode4(struct adapter *padapter, enum LED_CTL_MODE LedAction) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct LED_871x *pLed = &ledpriv->SwLed0; ++ struct LED_871x *pLed1 = &ledpriv->SwLed1; ++ ++ switch (LedAction) { ++ case LED_CTL_START_TO_LINK: ++ if (pLed1->bLedWPSBlinkInProgress) { ++ pLed1->bLedWPSBlinkInProgress = false; ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ pLed1->CurrLedState = RTW_LED_OFF; ++ ++ if (pLed1->bLedOn) ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ ++ if (!pLed->bLedStartToLinkBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ ++ pLed->bLedStartToLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_StartToBlink; ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ } ++ } ++ break; ++ case LED_CTL_LINK: ++ case LED_CTL_NO_LINK: ++ /* LED1 settings */ ++ if (LedAction == LED_CTL_LINK) { ++ if (pLed1->bLedWPSBlinkInProgress) { ++ pLed1->bLedWPSBlinkInProgress = false; ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ pLed1->CurrLedState = RTW_LED_OFF; ++ ++ if (pLed1->bLedOn) ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ } ++ ++ if (!pLed->bLedNoLinkBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_SITE_SURVEY: ++ if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) { ++ } else if (!pLed->bLedScanBlinkInProgress) { ++ if (IS_LED_WPS_BLINKING(pLed)) ++ return; ++ ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedScanBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SCAN; ++ pLed->BlinkTimes = 24; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_TX: ++ case LED_CTL_RX: ++ if (!pLed->bLedBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) ++ return; ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ pLed->bLedBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_TXRX; ++ pLed->BlinkTimes = 2; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_START_WPS: /* wait until xinpin finish */ ++ case LED_CTL_START_WPS_BOTTON: ++ if (pLed1->bLedWPSBlinkInProgress) { ++ pLed1->bLedWPSBlinkInProgress = false; ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ pLed1->CurrLedState = RTW_LED_OFF; ++ ++ if (pLed1->bLedOn) ++ _set_timer(&pLed->BlinkTimer, 0); ++ } ++ ++ if (!pLed->bLedWPSBlinkInProgress) { ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ pLed->bLedWPSBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_WPS; ++ if (pLed->bLedOn) { ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SLOWLY_INTERVAL); ++ } else { ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ } ++ } ++ break; ++ case LED_CTL_STOP_WPS: /* WPS connect success */ ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ ++ break; ++ case LED_CTL_STOP_WPS_FAIL: /* WPS authentication fail */ ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ ++ /* LED1 settings */ ++ if (pLed1->bLedWPSBlinkInProgress) ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ else ++ pLed1->bLedWPSBlinkInProgress = true; ++ pLed1->CurrLedState = LED_BLINK_WPS_STOP; ++ if (pLed1->bLedOn) ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed1->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ break; ++ case LED_CTL_STOP_WPS_FAIL_OVERLAP: /* WPS session overlap */ ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ pLed->bLedNoLinkBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SLOWLY; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NO_LINK_INTERVAL_ALPHA); ++ ++ /* LED1 settings */ ++ if (pLed1->bLedWPSBlinkInProgress) ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ else ++ pLed1->bLedWPSBlinkInProgress = true; ++ pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; ++ pLed1->BlinkTimes = 10; ++ if (pLed1->bLedOn) ++ pLed1->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed1->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_NORMAL_INTERVAL); ++ break; ++ case LED_CTL_POWER_OFF: ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ ++ if (pLed->bLedNoLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedNoLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedLinkBlinkInProgress = false; ++ } ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ if (pLed->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedWPSBlinkInProgress = false; ++ } ++ if (pLed->bLedScanBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedScanBlinkInProgress = false; ++ } ++ if (pLed->bLedStartToLinkBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedStartToLinkBlinkInProgress = false; ++ } ++ if (pLed1->bLedWPSBlinkInProgress) { ++ _cancel_timer_ex(&pLed1->BlinkTimer); ++ pLed1->bLedWPSBlinkInProgress = false; ++ } ++ pLed1->BlinkingLedState = LED_UNKNOWN; ++ SwLedOff(padapter, pLed); ++ SwLedOff(padapter, pLed1); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /* Sercomm-Belkin, added by chiyoko, 20090415 */ ++static void ++SwLedControlMode5( ++ struct adapter *padapter, ++ enum LED_CTL_MODE LedAction ++) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct LED_871x *pLed = &ledpriv->SwLed0; ++ ++ switch (LedAction) { ++ case LED_CTL_POWER_ON: ++ case LED_CTL_NO_LINK: ++ case LED_CTL_LINK: /* solid blue */ ++ pLed->CurrLedState = RTW_LED_ON; ++ pLed->BlinkingLedState = RTW_LED_ON; ++ ++ _set_timer(&pLed->BlinkTimer, 0); ++ break; ++ case LED_CTL_SITE_SURVEY: ++ if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED))) { ++ } else if (!pLed->bLedScanBlinkInProgress) { ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ pLed->bLedScanBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_SCAN; ++ pLed->BlinkTimes = 24; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_SCAN_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_TX: ++ case LED_CTL_RX: ++ if (!pLed->bLedBlinkInProgress) { ++ if (pLed->CurrLedState == LED_BLINK_SCAN) ++ return; ++ pLed->bLedBlinkInProgress = true; ++ pLed->CurrLedState = LED_BLINK_TXRX; ++ pLed->BlinkTimes = 2; ++ if (pLed->bLedOn) ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ else ++ pLed->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed->BlinkTimer, LED_BLINK_FASTER_INTERVAL_ALPHA); ++ } ++ break; ++ case LED_CTL_POWER_OFF: ++ pLed->CurrLedState = RTW_LED_OFF; ++ pLed->BlinkingLedState = RTW_LED_OFF; ++ ++ if (pLed->bLedBlinkInProgress) { ++ _cancel_timer_ex(&pLed->BlinkTimer); ++ pLed->bLedBlinkInProgress = false; ++ } ++ SwLedOff(padapter, pLed); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /* WNC-Corega, added by chiyoko, 20090902 */ ++static void ++SwLedControlMode6( ++ struct adapter *padapter, ++ enum LED_CTL_MODE LedAction ++) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct LED_871x *pLed0 = &ledpriv->SwLed0; ++ ++ switch (LedAction) { ++ case LED_CTL_POWER_ON: ++ case LED_CTL_LINK: ++ case LED_CTL_NO_LINK: ++ _cancel_timer_ex(&pLed0->BlinkTimer); ++ pLed0->CurrLedState = RTW_LED_ON; ++ pLed0->BlinkingLedState = RTW_LED_ON; ++ _set_timer(&pLed0->BlinkTimer, 0); ++ break; ++ case LED_CTL_POWER_OFF: ++ SwLedOff(padapter, pLed0); ++ break; ++ default: ++ break; ++ } ++} ++ ++/* */ ++/* Description: */ ++/* Handler function of LED Blinking. */ ++/* We dispatch acture LED blink action according to LedStrategy. */ ++/* */ ++void BlinkHandler(struct LED_871x *pLed) ++{ ++ struct adapter *padapter = pLed->padapter; ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ ++ if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped)) ++ return; ++ ++ switch (ledpriv->LedStrategy) { ++ case SW_LED_MODE0: ++ SwLedBlink(pLed); ++ break; ++ case SW_LED_MODE1: ++ SwLedBlink1(pLed); ++ break; ++ case SW_LED_MODE2: ++ SwLedBlink2(pLed); ++ break; ++ case SW_LED_MODE3: ++ SwLedBlink3(pLed); ++ break; ++ case SW_LED_MODE4: ++ SwLedBlink4(pLed); ++ break; ++ case SW_LED_MODE5: ++ SwLedBlink5(pLed); ++ break; ++ case SW_LED_MODE6: ++ SwLedBlink6(pLed); ++ break; ++ default: ++ break; ++ } ++} ++ ++void LedControl8188eu(struct adapter *padapter, enum LED_CTL_MODE LedAction) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ struct registry_priv *registry_par; ++ ++ if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) || ++ (!padapter->hw_init_completed)) ++ return; ++ ++ if (!ledpriv->bRegUseLed) ++ return; ++ ++ registry_par = &padapter->registrypriv; ++ if (!registry_par->led_enable) ++ return; ++ ++ if ((padapter->pwrctrlpriv.rf_pwrstate != rf_on && ++ padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && ++ (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || ++ LedAction == LED_CTL_SITE_SURVEY || ++ LedAction == LED_CTL_LINK || ++ LedAction == LED_CTL_NO_LINK || ++ LedAction == LED_CTL_POWER_ON)) ++ return; ++ ++ switch (ledpriv->LedStrategy) { ++ case SW_LED_MODE0: ++ break; ++ case SW_LED_MODE1: ++ SwLedControlMode1(padapter, LedAction); ++ break; ++ case SW_LED_MODE2: ++ SwLedControlMode2(padapter, LedAction); ++ break; ++ case SW_LED_MODE3: ++ SwLedControlMode3(padapter, LedAction); ++ break; ++ case SW_LED_MODE4: ++ SwLedControlMode4(padapter, LedAction); ++ break; ++ case SW_LED_MODE5: ++ SwLedControlMode5(padapter, LedAction); ++ break; ++ case SW_LED_MODE6: ++ SwLedControlMode6(padapter, LedAction); ++ break; ++ default: ++ break; ++ } ++} +diff --git a/drivers/staging/r8188eu/core/rtw_mlme.c b/drivers/staging/r8188eu/core/rtw_mlme.c +new file mode 100644 +index 000000000000..1115ff5d865a +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_mlme.c +@@ -0,0 +1,2199 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_MLME_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/xmit_osdep.h" ++#include "../include/hal_intf.h" ++#include "../include/mlme_osdep.h" ++#include "../include/sta_info.h" ++#include "../include/wifi.h" ++#include "../include/wlan_bssdef.h" ++#include "../include/rtw_ioctl_set.h" ++#include "../include/usb_osintf.h" ++ ++extern unsigned char MCS_rate_2R[16]; ++extern unsigned char MCS_rate_1R[16]; ++ ++void rtw_set_roaming(struct adapter *adapter, u8 to_roaming) ++{ ++ if (to_roaming == 0) ++ adapter->mlmepriv.to_join = false; ++ adapter->mlmepriv.to_roaming = to_roaming; ++} ++ ++u8 rtw_to_roaming(struct adapter *adapter) ++{ ++ return adapter->mlmepriv.to_roaming; ++} ++ ++int _rtw_init_mlme_priv(struct adapter *padapter) ++{ ++ int i; ++ u8 *pbuf; ++ struct wlan_network *pnetwork; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ int res = _SUCCESS; ++ ++ /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */ ++ ++ pmlmepriv->nic_hdl = (u8 *)padapter; ++ ++ pmlmepriv->pscanned = NULL; ++ pmlmepriv->fw_state = 0; ++ pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; ++ pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */ ++ ++ spin_lock_init(&pmlmepriv->lock); ++ _rtw_init_queue(&pmlmepriv->free_bss_pool); ++ _rtw_init_queue(&pmlmepriv->scanned_queue); ++ ++ set_scanned_network_val(pmlmepriv, 0); ++ ++ memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ ++ pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); ++ ++ if (!pbuf) { ++ res = _FAIL; ++ goto exit; ++ } ++ pmlmepriv->free_bss_buf = pbuf; ++ ++ pnetwork = (struct wlan_network *)pbuf; ++ ++ for (i = 0; i < MAX_BSS_CNT; i++) { ++ INIT_LIST_HEAD(&pnetwork->list); ++ ++ list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue); ++ ++ pnetwork++; ++ } ++ ++ /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ ++ ++ rtw_clear_scan_deny(padapter); ++ ++ rtw_init_mlme_timer(padapter); ++ ++exit: ++ ++ return res; ++} ++ ++static void rtw_mfree_mlme_priv_lock(struct mlme_priv *pmlmepriv) ++{ ++} ++ ++#if defined(CONFIG_88EU_AP_MODE) ++static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) ++{ ++ kfree(*ppie); ++ *plen = 0; ++ *ppie = NULL; ++} ++ ++void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) ++{ ++ kfree(pmlmepriv->assoc_req); ++ kfree(pmlmepriv->assoc_rsp); ++ rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len); ++ ++ rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len); ++ rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len); ++} ++#else ++void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) ++{ ++} ++#endif ++ ++void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) ++{ ++ ++ rtw_free_mlme_priv_ie_data(pmlmepriv); ++ ++ if (pmlmepriv) { ++ rtw_mfree_mlme_priv_lock(pmlmepriv); ++ ++ vfree(pmlmepriv->free_bss_buf); ++ } ++ ++} ++ ++int _rtw_enqueue_network(struct __queue *queue, struct wlan_network *pnetwork) ++{ ++ ++ if (!pnetwork) ++ goto exit; ++ ++ spin_lock_bh(&queue->lock); ++ ++ list_add_tail(&pnetwork->list, &queue->queue); ++ ++ spin_unlock_bh(&queue->lock); ++ ++exit: ++ ++ return _SUCCESS; ++} ++ ++struct wlan_network *_rtw_dequeue_network(struct __queue *queue) ++{ ++ struct wlan_network *pnetwork; ++ ++ spin_lock_bh(&queue->lock); ++ ++ if (list_empty(&queue->queue)) { ++ pnetwork = NULL; ++ } else { ++ pnetwork = container_of((&queue->queue)->next, struct wlan_network, list); ++ ++ list_del_init(&pnetwork->list); ++ } ++ ++ spin_unlock_bh(&queue->lock); ++ ++ return pnetwork; ++} ++ ++struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *free_queue) */ ++{ ++ struct wlan_network *pnetwork; ++ struct __queue *free_queue = &pmlmepriv->free_bss_pool; ++ struct list_head *plist = NULL; ++ ++ spin_lock_bh(&free_queue->lock); ++ ++ if (list_empty(&free_queue->queue)) { ++ pnetwork = NULL; ++ goto exit; ++ } ++ plist = (&free_queue->queue)->next; ++ ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ list_del_init(&pnetwork->list); ++ ++ pnetwork->network_type = 0; ++ pnetwork->fixed = false; ++ pnetwork->last_scanned = jiffies; ++ pnetwork->aid = 0; ++ pnetwork->join_res = 0; ++ ++ pmlmepriv->num_of_scanned++; ++ ++exit: ++ spin_unlock_bh(&free_queue->lock); ++ ++ return pnetwork; ++} ++ ++void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall) ++{ ++ u32 curr_time, delta_time; ++ u32 lifetime = SCANQUEUE_LIFETIME; ++ struct __queue *free_queue = &pmlmepriv->free_bss_pool; ++ ++ if (!pnetwork) ++ return; ++ ++ if (pnetwork->fixed) ++ return; ++ curr_time = jiffies; ++ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))) ++ lifetime = 1; ++ if (!isfreeall) { ++ delta_time = (curr_time - pnetwork->last_scanned) / HZ; ++ if (delta_time < lifetime)/* unit:sec */ ++ return; ++ } ++ spin_lock_bh(&free_queue->lock); ++ list_del_init(&pnetwork->list); ++ list_add_tail(&pnetwork->list, &free_queue->queue); ++ pmlmepriv->num_of_scanned--; ++ spin_unlock_bh(&free_queue->lock); ++} ++ ++void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) ++{ ++ struct __queue *free_queue = &pmlmepriv->free_bss_pool; ++ ++ if (!pnetwork) ++ return; ++ if (pnetwork->fixed) ++ return; ++ list_del_init(&pnetwork->list); ++ list_add_tail(&pnetwork->list, get_list_head(free_queue)); ++ pmlmepriv->num_of_scanned--; ++} ++ ++/* ++ return the wlan_network with the matching addr ++ ++ Shall be calle under atomic context... to avoid possible racing condition... ++*/ ++struct wlan_network *_rtw_find_network(struct __queue *scanned_queue, u8 *addr) ++{ ++ struct list_head *phead, *plist; ++ struct wlan_network *pnetwork = NULL; ++ u8 zero_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; ++ ++ if (!memcmp(zero_addr, addr, ETH_ALEN)) { ++ pnetwork = NULL; ++ goto exit; ++ } ++ phead = get_list_head(scanned_queue); ++ plist = phead->next; ++ ++ while (plist != phead) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN)) ++ break; ++ plist = plist->next; ++ } ++ if (plist == phead) ++ pnetwork = NULL; ++exit: ++ ++ return pnetwork; ++} ++ ++void _rtw_free_network_queue(struct adapter *padapter, u8 isfreeall) ++{ ++ struct list_head *phead, *plist; ++ struct wlan_network *pnetwork; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct __queue *scanned_queue = &pmlmepriv->scanned_queue; ++ ++ spin_lock_bh(&scanned_queue->lock); ++ ++ phead = get_list_head(scanned_queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ plist = plist->next; ++ ++ _rtw_free_network(pmlmepriv, pnetwork, isfreeall); ++ } ++ spin_unlock_bh(&scanned_queue->lock); ++ ++} ++ ++int rtw_if_up(struct adapter *padapter) ++{ ++ int res; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved || ++ !check_fwstate(&padapter->mlmepriv, _FW_LINKED)) ++ res = false; ++ else ++ res = true; ++ ++ return res; ++} ++ ++void rtw_generate_random_ibss(u8 *pibss) ++{ ++ u32 curtime = jiffies; ++ ++ pibss[0] = 0x02; /* in ad-hoc mode bit1 must set to 1 */ ++ pibss[1] = 0x11; ++ pibss[2] = 0x87; ++ pibss[3] = (u8)(curtime & 0xff);/* p[0]; */ ++ pibss[4] = (u8)((curtime >> 8) & 0xff);/* p[1]; */ ++ pibss[5] = (u8)((curtime >> 16) & 0xff);/* p[2]; */ ++} ++ ++u8 *rtw_get_capability_from_ie(u8 *ie) ++{ ++ return ie + 8 + 2; ++} ++ ++u16 rtw_get_capability(struct wlan_bssid_ex *bss) ++{ ++ __le16 val; ++ ++ memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); ++ ++ return le16_to_cpu(val); ++} ++ ++u8 *rtw_get_timestampe_from_ie(u8 *ie) ++{ ++ return ie + 0; ++} ++ ++u8 *rtw_get_beacon_interval_from_ie(u8 *ie) ++{ ++ return ie + 8; ++} ++ ++int rtw_init_mlme_priv(struct adapter *padapter)/* struct mlme_priv *pmlmepriv) */ ++{ ++ int res; ++ ++ res = _rtw_init_mlme_priv(padapter);/* (pmlmepriv); */ ++ ++ return res; ++} ++ ++void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) ++{ ++ _rtw_free_mlme_priv(pmlmepriv); ++} ++ ++static struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) ++{ ++ struct wlan_network *pnetwork; ++ ++ pnetwork = _rtw_alloc_network(pmlmepriv); ++ ++ return pnetwork; ++} ++ ++static void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, ++ struct wlan_network *pnetwork) ++{ ++ ++ _rtw_free_network_nolock(pmlmepriv, pnetwork); ++ ++} ++ ++void rtw_free_network_queue(struct adapter *dev, u8 isfreeall) ++{ ++ ++ _rtw_free_network_queue(dev, isfreeall); ++ ++} ++ ++/* ++ return the wlan_network with the matching addr ++ ++ Shall be calle under atomic context... to avoid possible racing condition... ++*/ ++struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr) ++{ ++ struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); ++ ++ return pnetwork; ++} ++ ++int rtw_is_same_ibss(struct adapter *adapter, struct wlan_network *pnetwork) ++{ ++ int ret = true; ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ ++ if ((psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) && ++ (pnetwork->network.Privacy == 0)) ++ ret = false; ++ else if ((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_) && ++ (pnetwork->network.Privacy == 1)) ++ ret = false; ++ else ++ ret = true; ++ return ret; ++} ++ ++static int is_same_ess(struct wlan_bssid_ex *a, struct wlan_bssid_ex *b) ++{ ++ return (a->Ssid.SsidLength == b->Ssid.SsidLength) && ++ !memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength); ++} ++ ++int is_same_network(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst) ++{ ++ u16 s_cap, d_cap; ++ __le16 le_scap, le_dcap; ++ ++ memcpy((u8 *)&le_scap, rtw_get_capability_from_ie(src->IEs), 2); ++ memcpy((u8 *)&le_dcap, rtw_get_capability_from_ie(dst->IEs), 2); ++ ++ s_cap = le16_to_cpu(le_scap); ++ d_cap = le16_to_cpu(le_dcap); ++ ++ return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && ++ ((!memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN))) && ++ ((!memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength))) && ++ ((s_cap & WLAN_CAPABILITY_IBSS) == ++ (d_cap & WLAN_CAPABILITY_IBSS)) && ++ ((s_cap & WLAN_CAPABILITY_BSS) == ++ (d_cap & WLAN_CAPABILITY_BSS))); ++} ++ ++struct wlan_network *rtw_get_oldest_wlan_network(struct __queue *scanned_queue) ++{ ++ struct list_head *plist, *phead; ++ struct wlan_network *pwlan = NULL; ++ struct wlan_network *oldest = NULL; ++ ++ phead = get_list_head(scanned_queue); ++ ++ plist = phead->next; ++ ++ while (1) { ++ if (phead == plist) ++ break; ++ ++ pwlan = container_of(plist, struct wlan_network, list); ++ ++ if (!pwlan->fixed) { ++ if (!oldest || time_after(oldest->last_scanned, pwlan->last_scanned)) ++ oldest = pwlan; ++ } ++ ++ plist = plist->next; ++ } ++ ++ return oldest; ++} ++ ++void update_network(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src, ++ struct adapter *padapter, bool update_ie) ++{ ++ long rssi_ori = dst->Rssi; ++ u8 sq_smp = src->PhyInfo.SignalQuality; ++ u8 ss_final; ++ u8 sq_final; ++ long rssi_final; ++ ++ rtw_hal_antdiv_rssi_compared(padapter, dst, src); /* this will update src.Rssi, need consider again */ ++ ++ /* The rule below is 1/5 for sample value, 4/5 for history value */ ++ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&padapter->mlmepriv.cur_network.network, src)) { ++ /* Take the recvpriv's value for the connected AP*/ ++ ss_final = padapter->recvpriv.signal_strength; ++ sq_final = padapter->recvpriv.signal_qual; ++ /* the rssi value here is undecorated, and will be used for antenna diversity */ ++ if (sq_smp != 101) /* from the right channel */ ++ rssi_final = dst->Rssi; //(src->Rssi+dst->Rssi*4)/5; ++ else ++ rssi_final = rssi_ori; ++ } else { ++// if (sq_smp != 101) { /* from the right channel */ ++ ss_final = (u32)dst->PhyInfo.SignalStrength; //((u32)(src->PhyInfo.SignalStrength)+(u32)(dst->PhyInfo.SignalStrength)*4)/5; ++ sq_final = (u32)dst->PhyInfo.SignalQuality; //((u32)(src->PhyInfo.SignalQuality)+(u32)(dst->PhyInfo.SignalQuality)*4)/5; ++ rssi_final = dst->Rssi; //(src->Rssi+dst->Rssi*4)/5; ++// } else { ++// /* bss info not receiving from the right channel, use the original RX signal infos */ ++// ss_final = dst->PhyInfo.SignalStrength; ++// sq_final = dst->PhyInfo.SignalQuality; ++// rssi_final = dst->Rssi; ++// } ++ } ++ if (update_ie) { ++ dst->Reserved[0] = src->Reserved[0]; ++ dst->Reserved[1] = src->Reserved[1]; ++ memcpy((u8 *)dst, (u8 *)src, get_wlan_bssid_ex_sz(src)); ++ } ++ dst->PhyInfo.SignalStrength = ss_final; ++ dst->PhyInfo.SignalQuality = sq_final; ++ dst->Rssi = rssi_final; ++ ++} ++ ++static void update_current_network(struct adapter *adapter, struct wlan_bssid_ex *pnetwork) ++{ ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && ++ is_same_network(&pmlmepriv->cur_network.network, pnetwork)) { ++ update_network(&pmlmepriv->cur_network.network, pnetwork, adapter, true); ++ rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof(struct ndis_802_11_fixed_ie), ++ pmlmepriv->cur_network.network.IELength); ++ } ++ ++} ++ ++/* ++Caller must hold pmlmepriv->lock first. ++*/ ++void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *target) ++{ ++ struct list_head *plist, *phead; ++ u32 bssid_ex_sz; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ struct wlan_network *oldest = NULL; ++ ++ spin_lock_bh(&queue->lock); ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ if (is_same_network(&pnetwork->network, target)) ++ break; ++ if ((oldest == ((struct wlan_network *)0)) || ++ time_after(oldest->last_scanned, pnetwork->last_scanned)) ++ oldest = pnetwork; ++ plist = plist->next; ++ } ++ /* If we didn't find a match, then get a new network slot to initialize ++ * with this beacon's information */ ++ if (phead == plist) { ++ if (list_empty(&pmlmepriv->free_bss_pool.queue)) { ++ /* If there are no more slots, expire the oldest */ ++ pnetwork = oldest; ++ ++ rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna); ++ memcpy(&pnetwork->network, target, get_wlan_bssid_ex_sz(target)); ++ /* variable initialize */ ++ pnetwork->fixed = false; ++ pnetwork->last_scanned = jiffies; ++ ++ pnetwork->network_type = 0; ++ pnetwork->aid = 0; ++ pnetwork->join_res = 0; ++ ++ /* bss info not receiving from the right channel */ ++ if (pnetwork->network.PhyInfo.SignalQuality == 101) ++ pnetwork->network.PhyInfo.SignalQuality = 0; ++ } else { ++ /* Otherwise just pull from the free list */ ++ ++ pnetwork = rtw_alloc_network(pmlmepriv); /* will update scan_time */ ++ ++ if (!pnetwork) ++ goto exit; ++ ++ bssid_ex_sz = get_wlan_bssid_ex_sz(target); ++ target->Length = bssid_ex_sz; ++ rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna); ++ memcpy(&pnetwork->network, target, bssid_ex_sz); ++ ++ pnetwork->last_scanned = jiffies; ++ ++ /* bss info not receiving from the right channel */ ++ if (pnetwork->network.PhyInfo.SignalQuality == 101) ++ pnetwork->network.PhyInfo.SignalQuality = 0; ++ list_add_tail(&pnetwork->list, &queue->queue); ++ } ++ } else { ++ /* we have an entry and we are going to update it. But this entry may ++ * be already expired. In this case we do the same as we found a new ++ * net and call the new_net handler ++ */ ++ bool update_ie = true; ++ ++ pnetwork->last_scanned = jiffies; ++ ++ /* target.Reserved[0]== 1, means that scanned network is a bcn frame. */ ++ /* probe resp(3) > beacon(1) > probe req(2) */ ++ if ((target->Reserved[0] != 2) && ++ (target->Reserved[0] >= pnetwork->network.Reserved[0])) ++ update_ie = true; ++ else ++ update_ie = false; ++ update_network(&pnetwork->network, target, adapter, update_ie); ++ } ++ ++exit: ++ spin_unlock_bh(&queue->lock); ++ ++} ++ ++static void rtw_add_network(struct adapter *adapter, ++ struct wlan_bssid_ex *pnetwork) ++{ ++ ++#if defined(CONFIG_88EU_P2P) ++ rtw_wlan_bssid_ex_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); ++#endif ++ update_current_network(adapter, pnetwork); ++ rtw_update_scanned_network(adapter, pnetwork); ++ ++} ++ ++/* select the desired network based on the capability of the (i)bss. */ ++/* check items: (1) security */ ++/* (2) network_type */ ++/* (3) WMM */ ++/* (4) HT */ ++/* (5) others */ ++static int rtw_is_desired_network(struct adapter *adapter, struct wlan_network *pnetwork) ++{ ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ u32 desired_encmode; ++ u32 privacy; ++ ++ /* u8 wps_ie[512]; */ ++ uint wps_ielen; ++ ++ int bselected = true; ++ ++ desired_encmode = psecuritypriv->ndisencryptstatus; ++ privacy = pnetwork->network.Privacy; ++ ++ if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { ++ if (rtw_get_wps_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, pnetwork->network.IELength - _FIXED_IE_LENGTH_, NULL, &wps_ielen)) ++ return true; ++ else ++ return false; ++ } ++ if (adapter->registrypriv.wifi_spec == 1) { /* for correct flow of 8021X to do.... */ ++ u8 *p = NULL; ++ uint ie_len = 0; ++ ++ if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) ++ bselected = false; ++ if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { ++ p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, ++ _RSN_IE_2_, &ie_len, ++ (pnetwork->network.IELength - ++ _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) ++ bselected = true; ++ else ++ bselected = false; ++ } ++ } ++ ++ if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { ++ DBG_88E("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); ++ bselected = false; ++ } ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ if (pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) ++ bselected = false; ++ } ++ ++ return bselected; ++} ++ ++void rtw_survey_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++ u32 len; ++ struct wlan_bssid_ex *pnetwork; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ ++ pnetwork = (struct wlan_bssid_ex *)pbuf; ++ ++ len = get_wlan_bssid_ex_sz(pnetwork); ++ if (len > (sizeof(struct wlan_bssid_ex))) ++ return; ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ /* update IBSS_network 's timestamp */ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ if (!memcmp(&pmlmepriv->cur_network.network.MacAddress, pnetwork->MacAddress, ETH_ALEN)) { ++ struct wlan_network *ibss_wlan = NULL; ++ ++ memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8); ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress); ++ if (ibss_wlan) { ++ memcpy(ibss_wlan->network.IEs, pnetwork->IEs, 8); ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ goto exit; ++ } ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ } ++ } ++ ++ /* lock pmlmepriv->lock when you accessing network_q */ ++ if (!check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { ++ if (pnetwork->Ssid.Ssid[0] == 0) ++ pnetwork->Ssid.SsidLength = 0; ++ rtw_add_network(adapter, pnetwork); ++ } ++ ++exit: ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ u8 timer_cancelled = 0; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (pmlmepriv->wps_probe_req_ie) { ++ pmlmepriv->wps_probe_req_ie_len = 0; ++ kfree(pmlmepriv->wps_probe_req_ie); ++ pmlmepriv->wps_probe_req_ie = NULL; ++ } ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { ++ timer_cancelled = 1; ++ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); ++ } ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ if (timer_cancelled) ++ _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ rtw_set_signal_stat_timer(&adapter->recvpriv); ++ ++ if (pmlmepriv->to_join) { ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ if (!check_fwstate(pmlmepriv, _FW_LINKED)) { ++ set_fwstate(pmlmepriv, _FW_UNDER_LINKING); ++ ++ if (rtw_select_and_join_from_scanned_queue(pmlmepriv) == _SUCCESS) { ++ _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); ++ } else { ++ struct wlan_bssid_ex *pdev_network = &adapter->registrypriv.dev_network; ++ u8 *pibss = adapter->registrypriv.dev_network.MacAddress; ++ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); ++ ++ memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); ++ ++ rtw_update_registrypriv_dev_network(adapter); ++ rtw_generate_random_ibss(pibss); ++ ++ pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; ++ ++ rtw_createbss_cmd(adapter); ++ pmlmepriv->to_join = false; ++ } ++ } ++ } else { ++ int s_ret; ++ set_fwstate(pmlmepriv, _FW_UNDER_LINKING); ++ pmlmepriv->to_join = false; ++ s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); ++ if (_SUCCESS == s_ret) { ++ _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); ++ } else if (s_ret == 2) { /* there is no need to wait for join */ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ rtw_indicate_connect(adapter); ++ } else { ++ DBG_88E("try_to_join, but select scanning queue fail, to_roaming:%d\n", ++ pmlmepriv->to_roaming); ++ if (rtw_to_roaming(adapter) != 0) { ++ if (--pmlmepriv->to_roaming == 0 || ++ _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) { ++ rtw_set_roaming(adapter, 0); ++ rtw_free_assoc_resources(adapter, 1); ++ rtw_indicate_disconnect(adapter); ++ } else { ++ pmlmepriv->to_join = true; ++ } ++ } else { ++ rtw_indicate_disconnect(adapter); ++ } ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ } ++ } ++ } ++ ++ indicate_wx_scan_complete_event(adapter); ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); ++ ++ rtw_os_xmit_schedule(adapter); ++} ++ ++void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++} ++ ++void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++} ++ ++static void free_scanqueue(struct mlme_priv *pmlmepriv) ++{ ++ struct __queue *free_queue = &pmlmepriv->free_bss_pool; ++ struct __queue *scan_queue = &pmlmepriv->scanned_queue; ++ struct list_head *plist, *phead, *ptemp; ++ ++ spin_lock_bh(&scan_queue->lock); ++ spin_lock_bh(&free_queue->lock); ++ ++ phead = get_list_head(scan_queue); ++ plist = phead->next; ++ ++ while (plist != phead) { ++ ptemp = plist->next; ++ list_del_init(plist); ++ list_add_tail(plist, &free_queue->queue); ++ plist = ptemp; ++ pmlmepriv->num_of_scanned--; ++ } ++ ++ spin_unlock_bh(&free_queue->lock); ++ spin_unlock_bh(&scan_queue->lock); ++} ++ ++/* ++*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock ++*/ ++void rtw_free_assoc_resources(struct adapter *adapter, int lock_scanned_queue) ++{ ++ struct wlan_network *pwlan = NULL; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct wlan_network *tgt_network = &pmlmepriv->cur_network; ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_AP_STATE)) { ++ struct sta_info *psta; ++ ++ psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(adapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ } ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE)) { ++ struct sta_info *psta; ++ ++ rtw_free_all_stainfo(adapter); ++ ++ psta = rtw_get_bcmc_stainfo(adapter); ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(adapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ rtw_init_bcmc_stainfo(adapter); ++ } ++ ++ if (lock_scanned_queue) ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); ++ if (pwlan) ++ pwlan->fixed = false; ++ ++ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count == 1))) ++ rtw_free_network_nolock(pmlmepriv, pwlan); ++ ++ if (lock_scanned_queue) ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ pmlmepriv->key_mask = 0; ++ ++} ++ ++/* ++*rtw_indicate_connect: the caller has to lock pmlmepriv->lock ++*/ ++void rtw_indicate_connect(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ pmlmepriv->to_join = false; ++ ++ if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { ++ set_fwstate(pmlmepriv, _FW_LINKED); ++ ++ rtw_led_control(padapter, LED_CTL_LINK); ++ ++ rtw_os_indicate_connect(padapter); ++ } ++ ++ pmlmepriv->to_roaming = 0; ++ ++ rtw_set_scan_deny(padapter, 3000); ++} ++ ++/* ++*rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock ++*/ ++void rtw_indicate_disconnect(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING | WIFI_UNDER_WPS); ++ ++ if (pmlmepriv->to_roaming > 0) ++ _clr_fwstate_(pmlmepriv, _FW_LINKED); ++ ++ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) || ++ (pmlmepriv->to_roaming <= 0)) { ++ rtw_os_indicate_disconnect(padapter); ++ ++ _clr_fwstate_(pmlmepriv, _FW_LINKED); ++ rtw_led_control(padapter, LED_CTL_NO_LINK); ++ rtw_clear_scan_deny(padapter); ++ } ++ p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); ++ ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); ++ ++} ++ ++inline void rtw_indicate_scan_done(struct adapter *padapter, bool aborted) ++{ ++ rtw_os_indicate_scan_done(padapter, aborted); ++} ++ ++void rtw_scan_abort(struct adapter *adapter) ++{ ++ u32 start; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; ++ ++ start = jiffies; ++ pmlmeext->scan_abort = true; ++ while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) && ++ rtw_get_passing_time_ms(start) <= 200) { ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved) ++ break; ++ DBG_88E(FUNC_NDEV_FMT"fw_state=_FW_UNDER_SURVEY!\n", FUNC_NDEV_ARG(adapter->pnetdev)); ++ msleep(20); ++ } ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { ++ if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved) ++ DBG_88E(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev)); ++ rtw_indicate_scan_done(adapter, true); ++ } ++ pmlmeext->scan_abort = false; ++} ++ ++static struct sta_info *rtw_joinbss_update_stainfo(struct adapter *padapter, struct wlan_network *pnetwork) ++{ ++ int i; ++ struct sta_info *bmc_sta, *psta = NULL; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ psta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); ++ if (!psta) ++ psta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); ++ ++ if (psta) { /* update ptarget_sta */ ++ DBG_88E("%s\n", __func__); ++ psta->aid = pnetwork->join_res; ++ psta->mac_id = 0; ++ /* sta mode */ ++ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); ++ /* security related */ ++ if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { ++ padapter->securitypriv.binstallGrpkey = false; ++ padapter->securitypriv.busetkipkey = false; ++ padapter->securitypriv.bgrpkey_handshake = false; ++ psta->ieee8021x_blocked = true; ++ psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; ++ memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof(union Keytype)); ++ memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof(union Keytype)); ++ memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof(union Keytype)); ++ memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48)); ++ memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48)); ++ } ++ /* Commented by Albert 2012/07/21 */ ++ /* When doing the WPS, the wps_ie_len won't equal to 0 */ ++ /* And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. */ ++ if (padapter->securitypriv.wps_ie_len != 0) { ++ psta->ieee8021x_blocked = true; ++ padapter->securitypriv.wps_ie_len = 0; ++ } ++ /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info */ ++ /* if A-MPDU Rx is enabled, resetting rx_ordering_ctrl wstart_b(indicate_seq) to default value = 0xffff */ ++ /* todo: check if AP can send A-MPDU packets */ ++ for (i = 0; i < 16; i++) { ++ /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ preorder_ctrl->enable = false; ++ preorder_ctrl->indicate_seq = 0xffff; ++ preorder_ctrl->wend_b = 0xffff; ++ preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; ex. 32(kbytes) -> wsize_b = 32 */ ++ } ++ bmc_sta = rtw_get_bcmc_stainfo(padapter); ++ if (bmc_sta) { ++ for (i = 0; i < 16; i++) { ++ /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ ++ preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; ++ preorder_ctrl->enable = false; ++ preorder_ctrl->indicate_seq = 0xffff; ++ preorder_ctrl->wend_b = 0xffff; ++ preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; ex. 32(kbytes) -> wsize_b = 32 */ ++ } ++ } ++ /* misc. */ ++ update_sta_info(padapter, psta); ++ } ++ return psta; ++} ++ ++/* pnetwork: returns from rtw_joinbss_event_callback */ ++/* ptarget_wlan: found from scanned_queue */ ++static void rtw_joinbss_update_network(struct adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network *pnetwork) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* why not use ptarget_wlan?? */ ++ memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); ++ /* some IEs in pnetwork is wrong, so we should use ptarget_wlan IEs */ ++ cur_network->network.IELength = ptarget_wlan->network.IELength; ++ memcpy(&cur_network->network.IEs[0], &ptarget_wlan->network.IEs[0], MAX_IE_SZ); ++ ++ cur_network->aid = pnetwork->join_res; ++ ++ rtw_set_signal_stat_timer(&padapter->recvpriv); ++ padapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; ++ padapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; ++ /* the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) */ ++ padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); ++ rtw_set_signal_stat_timer(&padapter->recvpriv); ++ ++ /* update fw_state will clr _FW_UNDER_LINKING here indirectly */ ++ switch (pnetwork->network.InfrastructureMode) { ++ case Ndis802_11Infrastructure: ++ if (pmlmepriv->fw_state & WIFI_UNDER_WPS) ++ pmlmepriv->fw_state = WIFI_STATION_STATE | WIFI_UNDER_WPS; ++ else ++ pmlmepriv->fw_state = WIFI_STATION_STATE; ++ break; ++ case Ndis802_11IBSS: ++ pmlmepriv->fw_state = WIFI_ADHOC_STATE; ++ break; ++ default: ++ pmlmepriv->fw_state = WIFI_NULL_STATE; ++ break; ++ } ++ ++ rtw_update_protection(padapter, (cur_network->network.IEs) + ++ sizeof(struct ndis_802_11_fixed_ie), ++ (cur_network->network.IELength)); ++ rtw_update_ht_cap(padapter, cur_network->network.IEs, cur_network->network.IELength); ++} ++ ++/* Notes: the function could be > passive_level (the same context as Rx tasklet) */ ++/* pnetwork: returns from rtw_joinbss_event_callback */ ++/* ptarget_wlan: found from scanned_queue */ ++/* if join_res > 0, for (fw_state == WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. */ ++/* if join_res > 0, for (fw_state == WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. */ ++/* if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan != NULL). */ ++ ++void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) ++{ ++ u8 timer_cancelled; ++ struct sta_info *ptarget_sta = NULL, *pcur_sta = NULL; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct wlan_network *pnetwork = (struct wlan_network *)pbuf; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; ++ unsigned int the_same_macaddr = false; ++ ++ rtw_get_encrypt_decrypt_from_registrypriv(adapter); ++ ++ the_same_macaddr = !memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); ++ ++ pnetwork->network.Length = get_wlan_bssid_ex_sz(&pnetwork->network); ++ if (pnetwork->network.Length > sizeof(struct wlan_bssid_ex)) ++ return; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (pnetwork->join_res > 0) { ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { ++ /* s1. find ptarget_wlan */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ if (the_same_macaddr) { ++ ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); ++ } else { ++ pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); ++ if (pcur_wlan) ++ pcur_wlan->fixed = false; ++ ++ pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); ++ if (pcur_sta) { ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(adapter, pcur_sta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ } ++ ++ ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ if (ptarget_wlan) ++ ptarget_wlan->fixed = true; ++ } ++ } ++ } else { ++ ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ if (ptarget_wlan) ++ ptarget_wlan->fixed = true; ++ } ++ } ++ ++ /* s2. update cur_network */ ++ if (ptarget_wlan) { ++ rtw_joinbss_update_network(adapter, ptarget_wlan, pnetwork); ++ } else { ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ goto ignore_joinbss_callback; ++ } ++ ++ /* s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode */ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork); ++ if (!ptarget_sta) { ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ goto ignore_joinbss_callback; ++ } ++ } ++ ++ /* s4. indicate connect */ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ pmlmepriv->cur_network_scanned = ptarget_wlan; ++ rtw_indicate_connect(adapter); ++ } ++ ++ /* s5. Cancle assoc_timer */ ++ _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); ++ } else { ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ goto ignore_joinbss_callback; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ } else if (pnetwork->join_res == -4) { ++ rtw_reset_securitypriv(adapter); ++ _set_timer(&pmlmepriv->assoc_timer, 1); ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ } else { /* if join_res < 0 (join fails), then try again */ ++ _set_timer(&pmlmepriv->assoc_timer, 1); ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ } ++ ++ignore_joinbss_callback: ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++void rtw_joinbss_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++ struct wlan_network *pnetwork = (struct wlan_network *)pbuf; ++ ++ mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); ++ ++ rtw_os_xmit_schedule(adapter); ++ ++} ++ ++static u8 search_max_mac_id(struct adapter *padapter) ++{ ++ u8 mac_id; ++#if defined(CONFIG_88EU_AP_MODE) ++ u8 aid; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++#endif ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++#if defined(CONFIG_88EU_AP_MODE) ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ for (aid = (pstapriv->max_num_sta); aid > 0; aid--) { ++ if (pstapriv->sta_aid[aid - 1]) ++ break; ++ } ++ mac_id = aid + 1; ++ } else ++#endif ++ {/* adhoc id = 31~2 */ ++ for (mac_id = (NUM_STA - 1); mac_id >= IBSS_START_MAC_ID; mac_id--) { ++ if (pmlmeinfo->FW_sta_info[mac_id].status == 1) ++ break; ++ } ++ } ++ return mac_id; ++} ++ ++/* FOR AP , AD-HOC mode */ ++void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta, ++ u32 mstatus) ++{ ++ u16 media_status_rpt; ++ u8 macid; ++ ++ if (!psta) ++ return; ++ ++ macid = search_max_mac_id(adapter); ++ rtw_hal_set_hwreg(adapter, HW_VAR_TX_RPT_MAX_MACID, (u8 *)&macid); ++ /* MACID|OPMODE:1 connect */ ++ media_status_rpt = (u16)((psta->mac_id << 8) | mstatus); ++ rtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, ++ (u8 *)&media_status_rpt); ++} ++ ++void rtw_stassoc_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++ struct sta_info *psta; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct stassoc_event *pstassoc = (struct stassoc_event *)pbuf; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ struct wlan_network *ptarget_wlan = NULL; ++ ++ if (!rtw_access_ctrl(adapter, pstassoc->macaddr)) ++ return; ++ ++#if defined(CONFIG_88EU_AP_MODE) ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); ++ if (psta) ++ rtw_indicate_sta_assoc_event(adapter, psta); ++ return; ++ } ++#endif ++ /* for AD-HOC mode */ ++ psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); ++ if (psta) ++ /* the sta have been in sta_info_queue => do nothing */ ++ return; /* between drv has received this event before and fw have not yet to set key to CAM_ENTRY) */ ++ psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); ++ if (!psta) ++ return; ++ /* to do: init sta_info variable */ ++ psta->qos_option = 0; ++ psta->mac_id = (uint)pstassoc->cam_id; ++ DBG_88E("%s\n", __func__); ++ /* for ad-hoc mode */ ++ rtw_hal_set_odm_var(adapter, HAL_ODM_STA_INFO, psta, true); ++ rtw_sta_media_status_rpt(adapter, psta, 1); ++ if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ++ psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; ++ psta->ieee8021x_blocked = false; ++ spin_lock_bh(&pmlmepriv->lock); ++ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))) { ++ if (adapter->stapriv.asoc_sta_count == 2) { ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); ++ pmlmepriv->cur_network_scanned = ptarget_wlan; ++ if (ptarget_wlan) ++ ptarget_wlan->fixed = true; ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ /* a sta + bc/mc_stainfo (not Ibss_stainfo) */ ++ rtw_indicate_connect(adapter); ++ } ++ } ++ spin_unlock_bh(&pmlmepriv->lock); ++ mlmeext_sta_add_event_callback(adapter, psta); ++} ++ ++void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf) ++{ ++ int mac_id = -1; ++ struct sta_info *psta; ++ struct wlan_network *pwlan = NULL; ++ struct wlan_bssid_ex *pdev_network = NULL; ++ u8 *pibss = NULL; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct stadel_event *pstadel = (struct stadel_event *)pbuf; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct wlan_network *tgt_network = &pmlmepriv->cur_network; ++ ++ psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); ++ if (psta) ++ mac_id = psta->mac_id; ++ else ++ mac_id = pstadel->mac_id; ++ ++ DBG_88E("%s(mac_id=%d)=%pM\n", __func__, mac_id, pstadel->macaddr); ++ ++ if (mac_id >= 0) { ++ u16 media_status; ++ media_status = (mac_id << 8) | 0; /* MACID|OPMODE:0 means disconnect */ ++ /* for STA, AP, ADHOC mode, report disconnect stauts to FW */ ++ rtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); ++ } ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ return; ++ ++ mlmeext_sta_del_event_callback(adapter); ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ if (adapter->registrypriv.wifi_spec == 1) ++ rtw_set_roaming(adapter, 0); /* don't roam */ ++ else if (rtw_to_roaming(adapter) > 0) ++ pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */ ++ else if (rtw_to_roaming(adapter) == 0) ++ rtw_set_roaming(adapter, ++ adapter->registrypriv.max_roaming_times); ++ ++ if (*((unsigned short *)(pstadel->rsvd)) != WLAN_REASON_EXPIRATION_CHK) ++ rtw_set_roaming(adapter, 0); /* don't roam */ ++ ++ rtw_free_uc_swdec_pending_queue(adapter); ++ ++ rtw_free_assoc_resources(adapter, 1); ++ rtw_indicate_disconnect(adapter); ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ /* remove the network entry in scanned_queue */ ++ pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); ++ if (pwlan) { ++ pwlan->fixed = false; ++ rtw_free_network_nolock(pmlmepriv, pwlan); ++ } ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ _rtw_roaming(adapter, tgt_network); ++ } ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ rtw_free_stainfo(adapter, psta); ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ if (adapter->stapriv.asoc_sta_count == 1) { /* a sta + bc/mc_stainfo (not Ibss_stainfo) */ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ /* free old ibss network */ ++ pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); ++ if (pwlan) { ++ pwlan->fixed = false; ++ rtw_free_network_nolock(pmlmepriv, pwlan); ++ } ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ /* re-create ibss */ ++ pdev_network = &adapter->registrypriv.dev_network; ++ pibss = adapter->registrypriv.dev_network.MacAddress; ++ ++ memcpy(pdev_network, &tgt_network->network, get_wlan_bssid_ex_sz(&tgt_network->network)); ++ ++ memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); ++ ++ rtw_update_registrypriv_dev_network(adapter); ++ ++ rtw_generate_random_ibss(pibss); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); ++ _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); ++ } ++ ++ rtw_createbss_cmd(adapter); ++ } ++ } ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++} ++ ++/* ++* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss ++* @adapter: pointer to struct adapter structure ++*/ ++void _rtw_join_timeout_handler (struct adapter *adapter) ++{ ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ int do_join_r; ++ ++ DBG_88E("%s, fw_state=%x\n", __func__, get_fwstate(pmlmepriv)); ++ ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved) ++ return; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (rtw_to_roaming(adapter) > 0) { /* join timeout caused by roaming */ ++ while (1) { ++ pmlmepriv->to_roaming--; ++ if (rtw_to_roaming(adapter) != 0) { /* try another */ ++ DBG_88E("%s try another roaming\n", __func__); ++ do_join_r = rtw_do_join(adapter); ++ if (_SUCCESS != do_join_r) { ++ DBG_88E("%s roaming do_join return %d\n", __func__, do_join_r); ++ continue; ++ } ++ break; ++ } else { ++ DBG_88E("%s We've try roaming but fail\n", __func__); ++ rtw_indicate_disconnect(adapter); ++ break; ++ } ++ } ++ } else { ++ rtw_indicate_disconnect(adapter); ++ free_scanqueue(pmlmepriv);/* */ ++ } ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++} ++ ++/* ++* rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey ++* @adapter: pointer to struct adapter structure ++*/ ++void rtw_scan_timeout_handler (struct adapter *adapter) ++{ ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ ++ DBG_88E(FUNC_ADPT_FMT" fw_state=%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); ++ spin_lock_bh(&pmlmepriv->lock); ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); ++ spin_unlock_bh(&pmlmepriv->lock); ++ rtw_indicate_scan_done(adapter, true); ++} ++ ++static void rtw_auto_scan_handler(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ /* auto site survey per 60sec */ ++ if (pmlmepriv->scan_interval > 0) { ++ pmlmepriv->scan_interval--; ++ if (pmlmepriv->scan_interval == 0) { ++ DBG_88E("%s\n", __func__); ++ rtw_set_802_11_bssid_list_scan(padapter, NULL, 0); ++ pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ ++ } ++ } ++} ++ ++void rtw_dynamic_check_timer_handlder(struct adapter *adapter) ++{ ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct registry_priv *pregistrypriv = &adapter->registrypriv; ++ ++ if (!adapter) ++ return; ++ if (!adapter->hw_init_completed) ++ return; ++ if ((adapter->bDriverStopped) || (adapter->bSurpriseRemoved)) ++ return; ++ if (adapter->net_closed) ++ return; ++ rtw_dynamic_chk_wk_cmd(adapter); ++ ++ if (pregistrypriv->wifi_spec == 1) { ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++#endif ++ { ++ /* auto site survey */ ++ rtw_auto_scan_handler(adapter); ++ } ++ } ++ ++ rcu_read_lock(); ++ ++ if (rcu_dereference(adapter->pnetdev->rx_handler_data) && ++ check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE)) { ++ /* expire NAT2.5 entry */ ++ nat25_db_expire(adapter); ++ ++ if (adapter->pppoe_connection_in_progress > 0) { ++ adapter->pppoe_connection_in_progress--; ++ } ++ ++ /* due to rtw_dynamic_check_timer_handlder() is called every 2 seconds */ ++ if (adapter->pppoe_connection_in_progress > 0) { ++ adapter->pppoe_connection_in_progress--; ++ } ++ } ++ ++ rcu_read_unlock(); ++} ++ ++#define RTW_SCAN_RESULT_EXPIRE 2000 ++ ++/* ++* Select a new join candidate from the original @param candidate and @param competitor ++* @return true: candidate is updated ++* @return false: candidate is not updated ++*/ ++static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv ++ , struct wlan_network **candidate, struct wlan_network *competitor) ++{ ++ int updated = false; ++ struct adapter *adapter = container_of(pmlmepriv, struct adapter, mlmepriv); ++ ++ /* check bssid, if needed */ ++ if (pmlmepriv->assoc_by_bssid) { ++ if (memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)) ++ goto exit; ++ } ++ ++ /* check ssid, if needed */ ++ if (pmlmepriv->assoc_ssid.SsidLength) { ++ if (competitor->network.Ssid.SsidLength != pmlmepriv->assoc_ssid.SsidLength || ++ memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) ++ goto exit; ++ } ++ ++ if (!rtw_is_desired_network(adapter, competitor)) ++ goto exit; ++ ++ if (rtw_to_roaming(adapter) > 0) { ++ if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= RTW_SCAN_RESULT_EXPIRE || ++ !is_same_ess(&competitor->network, &pmlmepriv->cur_network.network)) ++ goto exit; ++ } ++ ++ if (!*candidate || (*candidate)->network.Rssi < competitor->network.Rssi) { ++ *candidate = competitor; ++ updated = true; ++ } ++ if (updated) { ++ DBG_88E("[by_bssid:%u][assoc_ssid:%s]new candidate: %s(%pM rssi:%d\n", ++ pmlmepriv->assoc_by_bssid, ++ pmlmepriv->assoc_ssid.Ssid, ++ (*candidate)->network.Ssid.Ssid, ++ (*candidate)->network.MacAddress, ++ (int)(*candidate)->network.Rssi); ++ DBG_88E("[to_roaming:%u]\n", rtw_to_roaming(adapter)); ++ } ++ ++exit: ++ return updated; ++} ++ ++/* ++Calling context: ++The caller of the sub-routine will be in critical section... ++The caller must hold the following spinlock ++pmlmepriv->lock ++*/ ++ ++int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) ++{ ++ int ret; ++ struct list_head *phead; ++ struct adapter *adapter; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ struct wlan_network *candidate = NULL; ++ u8 supp_ant_div = false; ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ phead = get_list_head(queue); ++ adapter = (struct adapter *)pmlmepriv->nic_hdl; ++ pmlmepriv->pscanned = phead->next; ++ while (phead != pmlmepriv->pscanned) { ++ pnetwork = container_of(pmlmepriv->pscanned, struct wlan_network, list); ++ if (!pnetwork) { ++ ret = _FAIL; ++ goto exit; ++ } ++ pmlmepriv->pscanned = pmlmepriv->pscanned->next; ++ rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); ++ } ++ if (!candidate) { ++ DBG_88E("%s: return _FAIL(candidate==NULL)\n", __func__); ++ ret = _FAIL; ++ goto exit; ++ } else { ++ DBG_88E("%s: candidate: %s(%pM ch:%u)\n", __func__, ++ candidate->network.Ssid.Ssid, candidate->network.MacAddress, ++ candidate->network.Configuration.DSConfig); ++ } ++ ++ /* check for situation of _FW_LINKED */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ DBG_88E("%s: _FW_LINKED while ask_for_joinbss!!!\n", __func__); ++ ++ rtw_disassoc_cmd(adapter, 0, true); ++ rtw_indicate_disconnect(adapter); ++ rtw_free_assoc_resources(adapter, 0); ++ } ++ ++ rtw_hal_get_def_var(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(supp_ant_div)); ++ if (supp_ant_div) { ++ u8 cur_ant; ++ rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(cur_ant)); ++ DBG_88E("#### Opt_Ant_(%s), cur_Ant(%s)\n", ++ (2 == candidate->network.PhyInfo.Optimum_antenna) ? "A" : "B", ++ (2 == cur_ant) ? "A" : "B" ++ ); ++ } ++ ++ ret = rtw_joinbss_cmd(adapter, candidate); ++ ++exit: ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ return ret; ++} ++ ++int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv) ++{ ++ struct cmd_obj *pcmd; ++ struct setauth_parm *psetauthparm; ++ struct cmd_priv *pcmdpriv = &adapter->cmdpriv; ++ int res = _SUCCESS; ++ ++ pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmd) { ++ res = _FAIL; /* try again */ ++ goto exit; ++ } ++ ++ psetauthparm = kzalloc(sizeof(struct setauth_parm), GFP_KERNEL); ++ if (!psetauthparm) { ++ kfree(pcmd); ++ res = _FAIL; ++ goto exit; ++ } ++ memset(psetauthparm, 0, sizeof(struct setauth_parm)); ++ psetauthparm->mode = (unsigned char)psecuritypriv->dot11AuthAlgrthm; ++ pcmd->cmdcode = _SetAuth_CMD_; ++ pcmd->parmbuf = (unsigned char *)psetauthparm; ++ pcmd->cmdsz = (sizeof(struct setauth_parm)); ++ pcmd->rsp = NULL; ++ pcmd->rspsz = 0; ++ INIT_LIST_HEAD(&pcmd->list); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmd); ++exit: ++ ++ return res; ++} ++ ++int rtw_set_key(struct adapter *adapter, struct security_priv *psecuritypriv, int keyid, u8 set_tx) ++{ ++ u8 keylen; ++ struct cmd_obj *pcmd; ++ struct setkey_parm *psetkeyparm; ++ struct cmd_priv *pcmdpriv = &adapter->cmdpriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ int res = _SUCCESS; ++ ++ pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmd) { ++ res = _FAIL; /* try again */ ++ goto exit; ++ } ++ psetkeyparm = kzalloc(sizeof(struct setkey_parm), GFP_KERNEL); ++ if (!psetkeyparm) { ++ kfree(pcmd); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ memset(psetkeyparm, 0, sizeof(struct setkey_parm)); ++ ++ if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ++ psetkeyparm->algorithm = (unsigned char)psecuritypriv->dot118021XGrpPrivacy; ++ else ++ psetkeyparm->algorithm = (u8)psecuritypriv->dot11PrivacyAlgrthm; ++ psetkeyparm->keyid = (u8)keyid;/* 0~3 */ ++ psetkeyparm->set_tx = set_tx; ++ pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); ++ DBG_88E("==> rtw_set_key algorithm(%x), keyid(%x), key_mask(%x)\n", ++ psetkeyparm->algorithm, psetkeyparm->keyid, pmlmepriv->key_mask); ++ ++ switch (psetkeyparm->algorithm) { ++ case _WEP40_: ++ keylen = 5; ++ memcpy(&psetkeyparm->key[0], &psecuritypriv->dot11DefKey[keyid].skey[0], keylen); ++ break; ++ case _WEP104_: ++ keylen = 13; ++ memcpy(&psetkeyparm->key[0], &psecuritypriv->dot11DefKey[keyid].skey[0], keylen); ++ break; ++ case _TKIP_: ++ keylen = 16; ++ memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); ++ psetkeyparm->grpkey = 1; ++ break; ++ case _AES_: ++ keylen = 16; ++ memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); ++ psetkeyparm->grpkey = 1; ++ break; ++ default: ++ res = _FAIL; ++ goto exit; ++ } ++ pcmd->cmdcode = _SetKey_CMD_; ++ pcmd->parmbuf = (u8 *)psetkeyparm; ++ pcmd->cmdsz = (sizeof(struct setkey_parm)); ++ pcmd->rsp = NULL; ++ pcmd->rspsz = 0; ++ INIT_LIST_HEAD(&pcmd->list); ++ res = rtw_enqueue_cmd(pcmdpriv, pcmd); ++exit: ++ return res; ++} ++ ++/* adjust IEs for rtw_joinbss_cmd in WMM */ ++int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) ++{ ++ unsigned int ielength = 0; ++ unsigned int i, j; ++ ++ i = 12; /* after the fixed IE */ ++ while (i < in_len) { ++ ielength = initial_out_len; ++ ++ if (in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 && in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 && in_ie[i + 5] == 0x02 && i + 5 < in_len) { ++ /* WMM element ID and OUI */ ++ /* Append WMM IE to the last index of out_ie */ ++ ++ for (j = i; j < i + 9; j++) { ++ out_ie[ielength] = in_ie[j]; ++ ielength++; ++ } ++ out_ie[initial_out_len + 1] = 0x07; ++ out_ie[initial_out_len + 6] = 0x00; ++ out_ie[initial_out_len + 8] = 0x00; ++ break; ++ } ++ i += (in_ie[i + 1] + 2); /* to the next IE element */ ++ } ++ return ielength; ++} ++ ++/* */ ++/* Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.) */ ++/* Added by Annie, 2006-05-07. */ ++/* */ ++/* Search by BSSID, */ ++/* Return Value: */ ++/* -1 :if there is no pre-auth key in the table */ ++/* >= 0 :if there is pre-auth key, and return the entry id */ ++/* */ ++/* */ ++ ++static int SecIsInPMKIDList(struct adapter *Adapter, u8 *bssid) ++{ ++ struct security_priv *psecuritypriv = &Adapter->securitypriv; ++ int i = 0; ++ ++ do { ++ if ((psecuritypriv->PMKIDList[i].bUsed) && ++ (!memcmp(psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN))) { ++ break; ++ } else { ++ i++; ++ /* continue; */ ++ } ++ ++ } while (i < NUM_PMKID_CACHE); ++ ++ if (i == NUM_PMKID_CACHE) { ++ i = -1;/* Could not find. */ ++ } else { ++ /* There is one Pre-Authentication Key for the specific BSSID. */ ++ } ++ return i; ++} ++ ++/* */ ++/* Check the RSN IE length */ ++/* If the RSN IE length <= 20, the RSN IE didn't include the PMKID information */ ++/* 0-11th element in the array are the fixed IE */ ++/* 12th element in the array is the IE */ ++/* 13th element in the array is the IE length */ ++/* */ ++ ++static int rtw_append_pmkid(struct adapter *Adapter, int iEntry, u8 *ie, uint ie_len) ++{ ++ struct security_priv *psecuritypriv = &Adapter->securitypriv; ++ ++ if (ie[13] <= 20) { ++ /* The RSN IE didn't include the PMK ID, append the PMK information */ ++ ie[ie_len] = 1; ++ ie_len++; ++ ie[ie_len] = 0; /* PMKID count = 0x0100 */ ++ ie_len++; ++ memcpy(&ie[ie_len], &psecuritypriv->PMKIDList[iEntry].PMKID, 16); ++ ++ ie_len += 16; ++ ie[13] += 18;/* PMKID length = 2+16 */ ++ } ++ return ie_len; ++} ++ ++int rtw_restruct_sec_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len) ++{ ++ u8 authmode = 0; ++ uint ielength; ++ int iEntry; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ uint ndisauthmode = psecuritypriv->ndisauthtype; ++ ++ /* copy fixed ie only */ ++ memcpy(out_ie, in_ie, 12); ++ ielength = 12; ++ if ((ndisauthmode == Ndis802_11AuthModeWPA) || ++ (ndisauthmode == Ndis802_11AuthModeWPAPSK)) ++ authmode = _WPA_IE_ID_; ++ if ((ndisauthmode == Ndis802_11AuthModeWPA2) || ++ (ndisauthmode == Ndis802_11AuthModeWPA2PSK)) ++ authmode = _WPA2_IE_ID_; ++ ++ if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { ++ memcpy(out_ie + ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); ++ ++ ielength += psecuritypriv->wps_ie_len; ++ } else if ((authmode == _WPA_IE_ID_) || (authmode == _WPA2_IE_ID_)) { ++ /* copy RSN or SSN */ ++ memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1] + 2); ++ ielength += psecuritypriv->supplicant_ie[1] + 2; ++ rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie); ++ } ++ ++ iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); ++ if (iEntry < 0) { ++ return ielength; ++ } else { ++ if (authmode == _WPA2_IE_ID_) ++ ielength = rtw_append_pmkid(adapter, iEntry, out_ie, ielength); ++ } ++ ++ return ielength; ++} ++ ++void rtw_init_registrypriv_dev_network(struct adapter *adapter) ++{ ++ struct registry_priv *pregistrypriv = &adapter->registrypriv; ++ struct eeprom_priv *peepriv = &adapter->eeprompriv; ++ struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network; ++ u8 *myhwaddr = myid(peepriv); ++ ++ memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN); ++ ++ memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(struct ndis_802_11_ssid)); ++ ++ pdev_network->Configuration.Length = sizeof(struct ndis_802_11_config); ++ pdev_network->Configuration.BeaconPeriod = 100; ++ pdev_network->Configuration.FHConfig.Length = 0; ++ pdev_network->Configuration.FHConfig.HopPattern = 0; ++ pdev_network->Configuration.FHConfig.HopSet = 0; ++ pdev_network->Configuration.FHConfig.DwellTime = 0; ++ ++} ++ ++void rtw_update_registrypriv_dev_network(struct adapter *adapter) ++{ ++ int sz = 0; ++ struct registry_priv *pregistrypriv = &adapter->registrypriv; ++ struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network; ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; ++ ++ pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0); /* adhoc no 802.1x */ ++ ++ pdev_network->Rssi = 0; ++ ++ switch (pregistrypriv->wireless_mode) { ++ case WIRELESS_11B: ++ pdev_network->NetworkTypeInUse = (Ndis802_11DS); ++ break; ++ case WIRELESS_11G: ++ case WIRELESS_11BG: ++ case WIRELESS_11_24N: ++ case WIRELESS_11G_24N: ++ case WIRELESS_11BG_24N: ++ pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); ++ break; ++ default: ++ /* TODO */ ++ break; ++ } ++ ++ pdev_network->Configuration.DSConfig = (pregistrypriv->channel); ++ ++ if (cur_network->network.InfrastructureMode == Ndis802_11IBSS) ++ pdev_network->Configuration.ATIMWindow = (0); ++ ++ pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); ++ ++ /* 1. Supported rates */ ++ /* 2. IE */ ++ ++ sz = rtw_generate_ie(pregistrypriv); ++ pdev_network->IELength = sz; ++ pdev_network->Length = get_wlan_bssid_ex_sz((struct wlan_bssid_ex *)pdev_network); ++ ++ /* notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); */ ++ /* pdev_network->IELength = cpu_to_le32(sz); */ ++ ++} ++ ++void rtw_get_encrypt_decrypt_from_registrypriv(struct adapter *adapter) ++{ ++ ++} ++ ++/* the function is at passive_level */ ++void rtw_joinbss_reset(struct adapter *padapter) ++{ ++ u8 threshold; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ ++ /* todo: if you want to do something io/reg/hw setting before join_bss, please add code here */ ++ pmlmepriv->num_FortyMHzIntolerant = 0; ++ ++ pmlmepriv->num_sta_no_ht = 0; ++ ++ phtpriv->ampdu_enable = false;/* reset to disabled */ ++ ++ /* TH = 1 => means that invalidate usb rx aggregation */ ++ /* TH = 0 => means that validate usb rx aggregation, use init value. */ ++ if (phtpriv->ht_option) { ++ if (padapter->registrypriv.wifi_spec == 1) ++ threshold = 1; ++ else ++ threshold = 0; ++ rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); ++ } else { ++ threshold = 1; ++ rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); ++ } ++} ++ ++/* the function is >= passive_level */ ++unsigned int rtw_restructure_ht_ie(struct adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) ++{ ++ u32 ielen, out_len; ++ enum ht_cap_ampdu_factor max_rx_ampdu_factor; ++ unsigned char *p; ++ struct ieee80211_ht_cap ht_capie; ++ unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct qos_priv *pqospriv = &pmlmepriv->qospriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ u32 rx_packet_offset, max_recvbuf_sz; ++ ++ phtpriv->ht_option = false; ++ ++ p = rtw_get_ie(in_ie + 12, _HT_CAPABILITY_IE_, &ielen, in_len - 12); ++ ++ if (p && ielen > 0) { ++ if (pqospriv->qos_option == 0) { ++ out_len = *pout_len; ++ rtw_set_ie(out_ie + out_len, _VENDOR_SPECIFIC_IE_, ++ _WMM_IE_Length_, WMM_IE, pout_len); ++ ++ pqospriv->qos_option = 1; ++ } ++ ++ out_len = *pout_len; ++ ++ memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); ++ ++ ht_capie.cap_info = cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40 | ++ IEEE80211_HT_CAP_SGI_20 | ++ IEEE80211_HT_CAP_SGI_40 | ++ IEEE80211_HT_CAP_TX_STBC | ++ IEEE80211_HT_CAP_DSSSCCK40); ++ ++ rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); ++ rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); ++ ++ /* ++ AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k ++ AMPDU_para [4:2]:Min MPDU Start Spacing ++ */ ++ ++ rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); ++ ht_capie.ampdu_params_info = (max_rx_ampdu_factor & 0x03); ++ ++ if (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) ++ ht_capie.ampdu_params_info |= (IEEE80211_HT_AMPDU_PARM_DENSITY & (0x07 << 2)); ++ else ++ ht_capie.ampdu_params_info |= (IEEE80211_HT_AMPDU_PARM_DENSITY & 0x00); ++ ++ rtw_set_ie(out_ie + out_len, _HT_CAPABILITY_IE_, ++ sizeof(struct ieee80211_ht_cap), (unsigned char *)&ht_capie, pout_len); ++ ++ phtpriv->ht_option = true; ++ ++ p = rtw_get_ie(in_ie + 12, _HT_ADD_INFO_IE_, &ielen, in_len - 12); ++ if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) { ++ out_len = *pout_len; ++ rtw_set_ie(out_ie + out_len, _HT_ADD_INFO_IE_, ielen, p + 2, pout_len); ++ } ++ } ++ return phtpriv->ht_option; ++} ++ ++/* the function is > passive_level (in critical_section) */ ++void rtw_update_ht_cap(struct adapter *padapter, u8 *pie, uint ie_len) ++{ ++ u8 *p, max_ampdu_sz; ++ int len; ++ struct ieee80211_ht_cap *pht_capie; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (!phtpriv->ht_option) ++ return; ++ ++ if ((!pmlmeinfo->HT_info_enable) || (!pmlmeinfo->HT_caps_enable)) ++ return; ++ ++ DBG_88E("+rtw_update_ht_cap()\n"); ++ ++ /* maybe needs check if ap supports rx ampdu. */ ++ if ((!phtpriv->ampdu_enable) && (pregistrypriv->ampdu_enable == 1)) { ++ if (pregistrypriv->wifi_spec == 1) ++ phtpriv->ampdu_enable = false; ++ else ++ phtpriv->ampdu_enable = true; ++ } else if (pregistrypriv->ampdu_enable == 2) { ++ phtpriv->ampdu_enable = true; ++ } ++ ++ /* check Max Rx A-MPDU Size */ ++ len = 0; ++ p = rtw_get_ie(pie + sizeof(struct ndis_802_11_fixed_ie), _HT_CAPABILITY_IE_, &len, ie_len - sizeof(struct ndis_802_11_fixed_ie)); ++ if (p && len > 0) { ++ pht_capie = (struct ieee80211_ht_cap *)(p + 2); ++ max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_AMPDU_PARM_FACTOR); ++ max_ampdu_sz = 1 << (max_ampdu_sz + 3); /* max_ampdu_sz (kbytes); */ ++ phtpriv->rx_ampdu_maxlen = max_ampdu_sz; ++ } ++ len = 0; ++ p = rtw_get_ie(pie + sizeof(struct ndis_802_11_fixed_ie), _HT_ADD_INFO_IE_, &len, ie_len - sizeof(struct ndis_802_11_fixed_ie)); ++ ++ /* update cur_bwmode & cur_ch_offset */ ++ if ((pregistrypriv->cbw40_enable) && ++ (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & BIT(1)) && ++ (pmlmeinfo->HT_info.infos[0] & BIT(2))) { ++ int i; ++ u8 rf_type; ++ ++ padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ ++ /* update the MCS rates */ ++ for (i = 0; i < 16; i++) { ++ if ((rf_type == RF_1T1R) || (rf_type == RF_1T2R)) ++ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; ++ else ++ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i]; ++ } ++ /* switch to the 40M Hz mode according to the AP */ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; ++ switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) { ++ case HT_EXTCHNL_OFFSET_UPPER: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; ++ break; ++ case HT_EXTCHNL_OFFSET_LOWER: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; ++ break; ++ default: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ break; ++ } ++ } ++ ++ /* Config SM Power Save setting */ ++ pmlmeinfo->SM_PS = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & 0x0C) >> 2; ++ if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) ++ DBG_88E("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__); ++ ++ /* Config current HT Protection mode. */ ++ pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; ++} ++ ++void rtw_issue_addbareq_cmd(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ u8 issued; ++ int priority; ++ struct sta_info *psta = NULL; ++ struct ht_priv *phtpriv; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ ++ if (is_multicast_ether_addr(pattrib->ra) || ++ padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod < 100) ++ return; ++ ++ priority = pattrib->priority; ++ ++ if (pattrib->psta) ++ psta = pattrib->psta; ++ else ++ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); ++ ++ if (!psta) ++ return; ++ ++ phtpriv = &psta->htpriv; ++ ++ if ((phtpriv->ht_option) && (phtpriv->ampdu_enable)) { ++ issued = (phtpriv->agg_enable_bitmap >> priority) & 0x1; ++ issued |= (phtpriv->candidate_tid_bitmap >> priority) & 0x1; ++ ++ if (0 == issued) { ++ DBG_88E("rtw_issue_addbareq_cmd, p=%d\n", priority); ++ psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); ++ rtw_addbareq_cmd(padapter, (u8)priority, pattrib->ra); ++ } ++ } ++} ++ ++void rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ _rtw_roaming(padapter, tgt_network); ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ int do_join_r; ++ ++ struct wlan_network *pnetwork; ++ ++ if (tgt_network) ++ pnetwork = tgt_network; ++ else ++ pnetwork = &pmlmepriv->cur_network; ++ ++ if (0 < rtw_to_roaming(padapter)) { ++ DBG_88E("roaming from %s(%pM length:%d\n", ++ pnetwork->network.Ssid.Ssid, pnetwork->network.MacAddress, ++ pnetwork->network.Ssid.SsidLength); ++ memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(struct ndis_802_11_ssid)); ++ ++ pmlmepriv->assoc_by_bssid = false; ++ ++ while (1) { ++ do_join_r = rtw_do_join(padapter); ++ if (_SUCCESS == do_join_r) { ++ break; ++ } else { ++ DBG_88E("roaming do_join return %d\n", do_join_r); ++ pmlmepriv->to_roaming--; ++ ++ if (0 < pmlmepriv->to_roaming) { ++ continue; ++ } else { ++ DBG_88E("%s(%d) -to roaming fail, indicate_disconnect\n", __func__, __LINE__); ++ rtw_indicate_disconnect(padapter); ++ break; ++ } ++ } ++ } ++ } ++} +diff --git a/drivers/staging/r8188eu/core/rtw_mlme_ext.c b/drivers/staging/r8188eu/core/rtw_mlme_ext.c +new file mode 100644 +index 000000000000..5a472a4954b0 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c +@@ -0,0 +1,8327 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_MLME_EXT_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/rtw_mlme_ext.h" ++#include "../include/wlan_bssdef.h" ++#include "../include/mlme_osdep.h" ++#include "../include/recv_osdep.h" ++ ++static struct mlme_handler mlme_sta_tbl[] = { ++ {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, ++ {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, ++ {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, ++ {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, ++ {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, ++ {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, ++ ++ /*---------------------------------------------------------- ++ below 2 are reserved ++ -----------------------------------------------------------*/ ++ {0, "DoReserved", &DoReserved}, ++ {0, "DoReserved", &DoReserved}, ++ {WIFI_BEACON, "OnBeacon", &OnBeacon}, ++ {WIFI_ATIM, "OnATIM", &OnAtim}, ++ {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, ++ {WIFI_AUTH, "OnAuth", &OnAuthClient}, ++ {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, ++ {WIFI_ACTION, "OnAction", &OnAction}, ++}; ++ ++static struct action_handler OnAction_tbl[] = { ++ {RTW_WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", on_action_spct}, ++ {RTW_WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, ++ {RTW_WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, ++ {RTW_WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back}, ++ {RTW_WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", on_action_public}, ++ {RTW_WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, ++ {RTW_WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, ++ {RTW_WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, ++ {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, ++ {RTW_WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, ++ {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, ++}; ++ ++static u8 null_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; ++ ++/************************************************** ++OUI definitions for the vendor specific IE ++***************************************************/ ++unsigned char RTW_WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; ++unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02}; ++unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; ++unsigned char P2P_OUI[] = {0x50, 0x6F, 0x9A, 0x09}; ++unsigned char WFD_OUI[] = {0x50, 0x6F, 0x9A, 0x0A}; ++ ++unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; ++unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; ++ ++unsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02}; ++unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02}; ++ ++extern unsigned char REALTEK_96B_IE[]; ++ ++/******************************************************** ++MCS rate definitions ++*********************************************************/ ++unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; ++unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; ++ ++/******************************************************** ++ChannelPlan definitions ++*********************************************************/ ++static struct rt_channel_plan_2g RTW_ChannelPlan2G[RT_CHANNEL_DOMAIN_2G_MAX] = { ++ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, /* 0x00, RT_CHANNEL_DOMAIN_2G_WORLD , Passive scan CH 12, 13 */ ++ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, /* 0x01, RT_CHANNEL_DOMAIN_2G_ETSI1 */ ++ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 11}, /* 0x02, RT_CHANNEL_DOMAIN_2G_FCC1 */ ++ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14}, /* 0x03, RT_CHANNEL_DOMAIN_2G_MIKK1 */ ++ {{10, 11, 12, 13}, 4}, /* 0x04, RT_CHANNEL_DOMAIN_2G_ETSI2 */ ++ {{}, 0}, /* 0x05, RT_CHANNEL_DOMAIN_2G_NULL */ ++}; ++ ++static struct rt_channel_plan_map RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = { ++ /* 0x00 ~ 0x1F , Old Define ===== */ ++ {0x02}, /* 0x00, RT_CHANNEL_DOMAIN_FCC */ ++ {0x02}, /* 0x01, RT_CHANNEL_DOMAIN_IC */ ++ {0x01}, /* 0x02, RT_CHANNEL_DOMAIN_ETSI */ ++ {0x01}, /* 0x03, RT_CHANNEL_DOMAIN_SPAIN */ ++ {0x01}, /* 0x04, RT_CHANNEL_DOMAIN_FRANCE */ ++ {0x03}, /* 0x05, RT_CHANNEL_DOMAIN_MKK */ ++ {0x03}, /* 0x06, RT_CHANNEL_DOMAIN_MKK1 */ ++ {0x01}, /* 0x07, RT_CHANNEL_DOMAIN_ISRAEL */ ++ {0x03}, /* 0x08, RT_CHANNEL_DOMAIN_TELEC */ ++ {0x03}, /* 0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN */ ++ {0x00}, /* 0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 */ ++ {0x02}, /* 0x0B, RT_CHANNEL_DOMAIN_TAIWAN */ ++ {0x01}, /* 0x0C, RT_CHANNEL_DOMAIN_CHINA */ ++ {0x02}, /* 0x0D, RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO */ ++ {0x02}, /* 0x0E, RT_CHANNEL_DOMAIN_KOREA */ ++ {0x02}, /* 0x0F, RT_CHANNEL_DOMAIN_TURKEY */ ++ {0x01}, /* 0x10, RT_CHANNEL_DOMAIN_JAPAN */ ++ {0x02}, /* 0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS */ ++ {0x01}, /* 0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS */ ++ {0x02}, /* 0x14, RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS */ ++ {0x00}, /* 0x15, RT_CHANNEL_DOMAIN_ETSI_NO_DFS */ ++ {0x00}, /* 0x16, RT_CHANNEL_DOMAIN_KOREA_NO_DFS */ ++ {0x03}, /* 0x17, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS */ ++ {0x05}, /* 0x18, RT_CHANNEL_DOMAIN_PAKISTAN_NO_DFS */ ++ {0x02}, /* 0x19, RT_CHANNEL_DOMAIN_TAIWAN2_NO_DFS */ ++ {0x00}, /* 0x1A, */ ++ {0x00}, /* 0x1B, */ ++ {0x00}, /* 0x1C, */ ++ {0x00}, /* 0x1D, */ ++ {0x00}, /* 0x1E, */ ++ /* 0x20 ~ 0x7F , New Define ===== */ ++ {0x00}, /* 0x20, RT_CHANNEL_DOMAIN_WORLD_NULL */ ++ {0x01}, /* 0x21, RT_CHANNEL_DOMAIN_ETSI1_NULL */ ++ {0x02}, /* 0x22, RT_CHANNEL_DOMAIN_FCC1_NULL */ ++ {0x03}, /* 0x23, RT_CHANNEL_DOMAIN_MKK1_NULL */ ++ {0x04}, /* 0x24, RT_CHANNEL_DOMAIN_ETSI2_NULL */ ++ {0x02}, /* 0x25, RT_CHANNEL_DOMAIN_FCC1_FCC1 */ ++ {0x00}, /* 0x26, RT_CHANNEL_DOMAIN_WORLD_ETSI1 */ ++ {0x03}, /* 0x27, RT_CHANNEL_DOMAIN_MKK1_MKK1 */ ++ {0x00}, /* 0x28, RT_CHANNEL_DOMAIN_WORLD_KCC1 */ ++ {0x00}, /* 0x29, RT_CHANNEL_DOMAIN_WORLD_FCC2 */ ++ {0x00}, /* 0x2A, */ ++ {0x00}, /* 0x2B, */ ++ {0x00}, /* 0x2C, */ ++ {0x00}, /* 0x2D, */ ++ {0x00}, /* 0x2E, */ ++ {0x00}, /* 0x2F, */ ++ {0x00}, /* 0x30, RT_CHANNEL_DOMAIN_WORLD_FCC3 */ ++ {0x00}, /* 0x31, RT_CHANNEL_DOMAIN_WORLD_FCC4 */ ++ {0x00}, /* 0x32, RT_CHANNEL_DOMAIN_WORLD_FCC5 */ ++ {0x00}, /* 0x33, RT_CHANNEL_DOMAIN_WORLD_FCC6 */ ++ {0x02}, /* 0x34, RT_CHANNEL_DOMAIN_FCC1_FCC7 */ ++ {0x00}, /* 0x35, RT_CHANNEL_DOMAIN_WORLD_ETSI2 */ ++ {0x00}, /* 0x36, RT_CHANNEL_DOMAIN_WORLD_ETSI3 */ ++ {0x03}, /* 0x37, RT_CHANNEL_DOMAIN_MKK1_MKK2 */ ++ {0x03}, /* 0x38, RT_CHANNEL_DOMAIN_MKK1_MKK3 */ ++ {0x02}, /* 0x39, RT_CHANNEL_DOMAIN_FCC1_NCC1 */ ++ {0x00}, /* 0x3A, */ ++ {0x00}, /* 0x3B, */ ++ {0x00}, /* 0x3C, */ ++ {0x00}, /* 0x3D, */ ++ {0x00}, /* 0x3E, */ ++ {0x00}, /* 0x3F, */ ++ {0x02}, /* 0x40, RT_CHANNEL_DOMAIN_FCC1_NCC2 */ ++ {0x03}, /* 0x41, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G */ ++}; ++ ++static struct rt_channel_plan_map RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x03}; /* use the conbination for max channel numbers */ ++ ++/* ++ * Search the @param channel_num in given @param channel_set ++ * @ch_set: the given channel set ++ * @ch: the given channel number ++ * ++ * return the index of channel_num in channel_set, -1 if not found ++ */ ++int rtw_ch_set_search_ch(struct rt_channel_info *ch_set, const u32 ch) ++{ ++ int i; ++ for (i = 0; ch_set[i].ChannelNum != 0; i++) { ++ if (ch == ch_set[i].ChannelNum) ++ break; ++ } ++ ++ if (i >= ch_set[i].ChannelNum) ++ return -1; ++ return i; ++} ++ ++/**************************************************************************** ++ ++Following are the initialization functions for WiFi MLME ++ ++*****************************************************************************/ ++ ++int init_hw_mlme_ext(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ return _SUCCESS; ++} ++ ++static void init_mlme_ext_priv_value(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ unsigned char mixed_datarate[NumRates] = { ++ _1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, ++ _9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, ++ _48M_RATE_, _54M_RATE_, 0xff ++ }; ++ unsigned char mixed_basicrate[NumRates] = { ++ _1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, ++ _12M_RATE_, _24M_RATE_, 0xff, ++ }; ++ ++ atomic_set(&pmlmeext->event_seq, 0); ++ pmlmeext->mgnt_seq = 0;/* reset to zero when disconnect at client mode */ ++ ++ pmlmeext->cur_channel = padapter->registrypriv.channel; ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ pmlmeext->retry = 0; ++ ++ pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode; ++ ++ memcpy(pmlmeext->datarate, mixed_datarate, NumRates); ++ memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates); ++ ++ pmlmeext->tx_rate = IEEE80211_CCK_RATE_1MB; ++ ++ pmlmeext->sitesurvey_res.state = SCAN_DISABLE; ++ pmlmeext->sitesurvey_res.channel_idx = 0; ++ pmlmeext->sitesurvey_res.bss_cnt = 0; ++ pmlmeext->scan_abort = false; ++ ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ pmlmeinfo->reauth_count = 0; ++ pmlmeinfo->reassoc_count = 0; ++ pmlmeinfo->link_count = 0; ++ pmlmeinfo->auth_seq = 0; ++ pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; ++ pmlmeinfo->key_index = 0; ++ pmlmeinfo->iv = 0; ++ ++ pmlmeinfo->enc_algo = _NO_PRIVACY_; ++ pmlmeinfo->authModeToggle = 0; ++ ++ memset(pmlmeinfo->chg_txt, 0, 128); ++ ++ pmlmeinfo->slotTime = SHORT_SLOT_TIME; ++ pmlmeinfo->preamble_mode = PREAMBLE_AUTO; ++ ++ pmlmeinfo->dialogToken = 0; ++ ++ pmlmeext->action_public_rxseq = 0xffff; ++ pmlmeext->action_public_dialog_token = 0xff; ++} ++ ++static int has_channel(struct rt_channel_info *channel_set, ++ u8 chanset_size, ++ u8 chan) { ++ int i; ++ ++ for (i = 0; i < chanset_size; i++) { ++ if (channel_set[i].ChannelNum == chan) ++ return 1; ++ } ++ return 0; ++} ++ ++static void init_channel_list(struct adapter *padapter, struct rt_channel_info *channel_set, ++ u8 chanset_size, ++ struct p2p_channels *channel_list) { ++ struct p2p_oper_class_map op_class[] = { ++ { IEEE80211G, 81, 1, 13, 1, BW20 }, ++ { IEEE80211G, 82, 14, 14, 1, BW20 }, ++ { -1, 0, 0, 0, 0, BW20 } ++ }; ++ ++ int cla, op; ++ ++ cla = 0; ++ ++ for (op = 0; op_class[op].op_class; op++) { ++ u8 ch; ++ struct p2p_oper_class_map *o = &op_class[op]; ++ struct p2p_reg_class *reg = NULL; ++ ++ for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) { ++ if (!has_channel(channel_set, chanset_size, ch)) { ++ continue; ++ } ++ ++ if ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc)) ++ continue; ++ ++ if ((0 == (padapter->registrypriv.cbw40_enable & BIT(1))) && ++ ((BW40MINUS == o->bw) || (BW40PLUS == o->bw))) ++ continue; ++ ++ if (!reg) { ++ reg = &channel_list->reg_class[cla]; ++ cla++; ++ reg->reg_class = o->op_class; ++ reg->channels = 0; ++ } ++ reg->channel[reg->channels] = ch; ++ reg->channels++; ++ } ++ } ++ channel_list->reg_classes = cla; ++} ++ ++static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_channel_info *channel_set) ++{ ++ u8 index, chanset_size = 0; ++ u8 b2_4GBand = false; ++ u8 Index2G = 0; ++ ++ memset(channel_set, 0, sizeof(struct rt_channel_info) * MAX_CHANNEL_NUM); ++ ++ if (ChannelPlan >= RT_CHANNEL_DOMAIN_MAX && ChannelPlan != RT_CHANNEL_DOMAIN_REALTEK_DEFINE) { ++ DBG_88E("ChannelPlan ID %x error !!!!!\n", ChannelPlan); ++ return chanset_size; ++ } ++ ++ if (padapter->registrypriv.wireless_mode & WIRELESS_11G) { ++ b2_4GBand = true; ++ if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan) ++ Index2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G; ++ else ++ Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G; ++ } ++ ++ if (b2_4GBand) { ++ for (index = 0; index < RTW_ChannelPlan2G[Index2G].Len; index++) { ++ channel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index]; ++ ++ if ((RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == ChannelPlan) ||/* Channel 1~11 is active, and 12~14 is passive */ ++ (RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G == ChannelPlan)) { ++ if (channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) ++ channel_set[chanset_size].ScanType = SCAN_ACTIVE; ++ else if ((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) ++ channel_set[chanset_size].ScanType = SCAN_PASSIVE; ++ } else if (RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan || ++ RT_CHANNEL_DOMAIN_2G_WORLD == Index2G) {/* channel 12~13, passive scan */ ++ if (channel_set[chanset_size].ChannelNum <= 11) ++ channel_set[chanset_size].ScanType = SCAN_ACTIVE; ++ else ++ channel_set[chanset_size].ScanType = SCAN_PASSIVE; ++ } else { ++ channel_set[chanset_size].ScanType = SCAN_ACTIVE; ++ } ++ ++ chanset_size++; ++ } ++ } ++ return chanset_size; ++} ++ ++int init_mlme_ext_priv(struct adapter *padapter) ++{ ++ int res = _SUCCESS; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pmlmeext->padapter = padapter; ++ ++ init_mlme_ext_priv_value(padapter); ++ pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq; ++ ++ init_mlme_ext_timer(padapter); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ init_mlme_ap_info(padapter); ++#endif ++ ++ pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan, pmlmeext->channel_set); ++ init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list); ++ ++ pmlmeext->chan_scan_time = SURVEY_TO; ++ pmlmeext->mlmeext_init = true; ++ ++ pmlmeext->active_keep_alive_check = true; ++ ++ return res; ++} ++ ++void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext) ++{ ++ struct adapter *padapter = pmlmeext->padapter; ++ ++ if (!padapter) ++ return; ++ ++ if (padapter->bDriverStopped) { ++ _cancel_timer_ex(&pmlmeext->survey_timer); ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ /* _cancel_timer_ex(&pmlmeext->ADDBA_timer); */ ++ } ++} ++ ++static void _mgt_dispatcher(struct adapter *padapter, struct mlme_handler *ptable, struct recv_frame *precv_frame) ++{ ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ u8 *pframe = precv_frame->rx_data; ++ ++ if (ptable->func) { ++ /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ ++ if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && ++ memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) ++ return; ++ ptable->func(padapter, precv_frame); ++ } ++} ++ ++void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ int index; ++ struct mlme_handler *ptable; ++#ifdef CONFIG_88EU_AP_MODE ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++#endif /* CONFIG_88EU_AP_MODE */ ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ u8 *pframe = precv_frame->rx_data; ++ struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe)); ++ ++ if (GetFrameType(pframe) != WIFI_MGT_TYPE) ++ return; ++ ++ /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ ++ if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && ++ memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) ++ return; ++ ++ ptable = mlme_sta_tbl; ++ ++ index = GetFrameSubType(pframe) >> 4; ++ ++ if (index > 13) ++ return; ++ ptable += index; ++ ++ if (psta) { ++ if (GetRetry(pframe)) { ++ if (precv_frame->attrib.seq_num == psta->RxMgmtFrameSeqNum) { ++ /* drop the duplicate management frame */ ++ DBG_88E("Drop duplicate management frame with seq_num=%d.\n", precv_frame->attrib.seq_num); ++ return; ++ } ++ } ++ psta->RxMgmtFrameSeqNum = precv_frame->attrib.seq_num; ++ } ++ ++#ifdef CONFIG_88EU_AP_MODE ++ switch (GetFrameSubType(pframe)) { ++ case WIFI_AUTH: ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ ptable->func = &OnAuth; ++ else ++ ptable->func = &OnAuthClient; ++ fallthrough; ++ case WIFI_ASSOCREQ: ++ case WIFI_REASSOCREQ: ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ break; ++ case WIFI_PROBEREQ: ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ else ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ break; ++ case WIFI_BEACON: ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ break; ++ case WIFI_ACTION: ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ break; ++ default: ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ rtw_hostapd_mlme_rx(padapter, precv_frame); ++ break; ++ } ++#else ++ _mgt_dispatcher(padapter, ptable, precv_frame); ++#endif ++} ++ ++#ifdef CONFIG_88EU_P2P ++static u32 p2p_listen_state_process(struct adapter *padapter, unsigned char *da) ++{ ++ bool response = true; ++ ++ /* do nothing if the device name is empty */ ++ if (!padapter->wdinfo.device_name_len) ++ response = false; ++ ++ if (response) ++ issue_probersp_p2p(padapter, da); ++ ++ return _SUCCESS; ++} ++#endif /* CONFIG_88EU_P2P */ ++ ++/**************************************************************************** ++ ++Following are the callback functions for each subtype of the management frames ++ ++*****************************************************************************/ ++ ++unsigned int OnProbeReq(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ unsigned int ielen; ++ unsigned char *p; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur = &pmlmeinfo->network; ++ u8 *pframe = precv_frame->rx_data; ++ uint len = precv_frame->len; ++ u8 is_valid_p2p_probereq = false; ++ ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 wifi_test_chk_rate = 1; ++ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && ++ !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) && ++ !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && ++ !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) && ++ !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)) { ++ /* mcs_rate = 0 -> CCK 1M rate */ ++ /* mcs_rate = 1 -> CCK 2M rate */ ++ /* mcs_rate = 2 -> CCK 5.5M rate */ ++ /* mcs_rate = 3 -> CCK 11M rate */ ++ /* In the P2P mode, the driver should not support the CCK rate */ ++ ++ /* Commented by Kurt 2012/10/16 */ ++ /* IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client */ ++ if (wifi_test_chk_rate == 1) { ++ is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len); ++ if (is_valid_p2p_probereq) { ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { ++ /* FIXME */ ++ report_survey_event(padapter, precv_frame); ++ p2p_listen_state_process(padapter, get_sa(pframe)); ++ ++ return _SUCCESS; ++ } ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) ++ goto _continue; ++ } ++ } ++ } ++ ++_continue: ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ return _SUCCESS; ++ ++ if (!check_fwstate(pmlmepriv, _FW_LINKED) && ++ !check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE)) ++ return _SUCCESS; ++ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen, ++ len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); ++ ++ /* check (wildcard) SSID */ ++ if (p) { ++ if (is_valid_p2p_probereq) ++ goto _issue_probersp; ++ ++ if ((ielen != 0 && memcmp((void *)(p + 2), (void *)cur->Ssid.Ssid, cur->Ssid.SsidLength)) || ++ (ielen == 0 && pmlmeinfo->hidden_ssid_mode)) ++ return _SUCCESS; ++ ++_issue_probersp: ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && ++ (pmlmepriv->cur_network.join_res || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))) ++ issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); ++ } ++ return _SUCCESS; ++} ++ ++unsigned int OnProbeRsp(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 *pframe = precv_frame->rx_data; ++#endif ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) { ++ if (pwdinfo->tx_prov_disc_info.benable) { ++ if (!memcmp(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN)) { ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { ++ pwdinfo->tx_prov_disc_info.benable = false; ++ issue_p2p_provision_request(padapter, ++ pwdinfo->tx_prov_disc_info.ssid.Ssid, ++ pwdinfo->tx_prov_disc_info.ssid.SsidLength, ++ pwdinfo->tx_prov_disc_info.peerDevAddr); ++ } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ pwdinfo->tx_prov_disc_info.benable = false; ++ issue_p2p_provision_request(padapter, NULL, 0, ++ pwdinfo->tx_prov_disc_info.peerDevAddr); ++ } ++ } ++ } ++ return _SUCCESS; ++ } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { ++ if (pwdinfo->nego_req_info.benable) { ++ DBG_88E("[%s] P2P State is GONEGO ING!\n", __func__); ++ if (!memcmp(pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN)) { ++ pwdinfo->nego_req_info.benable = false; ++ issue_p2p_GO_request(padapter, pwdinfo->nego_req_info.peerDevAddr); ++ } ++ } ++ } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) { ++ if (pwdinfo->invitereq_info.benable) { ++ DBG_88E("[%s] P2P_STATE_TX_INVITE_REQ!\n", __func__); ++ if (!memcmp(pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN)) { ++ pwdinfo->invitereq_info.benable = false; ++ issue_p2p_invitation_request(padapter, pwdinfo->invitereq_info.peer_macaddr); ++ } ++ } ++ } ++#endif ++ ++ if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { ++ report_survey_event(padapter, precv_frame); ++ return _SUCCESS; ++ } ++ ++ return _SUCCESS; ++} ++ ++unsigned int OnBeacon(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ int cam_idx; ++ struct sta_info *psta; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 *pframe = precv_frame->rx_data; ++ uint len = precv_frame->len; ++ struct wlan_bssid_ex *pbss; ++ int ret = _SUCCESS; ++ ++ if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { ++ report_survey_event(padapter, precv_frame); ++ return _SUCCESS; ++ } ++ ++ if (!memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) { ++ if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) { ++ /* we should update current network before auth, or some IE is wrong */ ++ pbss = kmalloc(sizeof(struct wlan_bssid_ex), GFP_ATOMIC); ++ if (pbss) { ++ if (collect_bss_info(padapter, precv_frame, pbss) == _SUCCESS) { ++ update_network(&pmlmepriv->cur_network.network, pbss, padapter, true); ++ rtw_get_bcn_info(&pmlmepriv->cur_network); ++ } ++ kfree(pbss); ++ } ++ ++ /* check the vendor of the assoc AP */ ++ pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe + sizeof(struct rtw_ieee80211_hdr_3addr), len - sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ /* update TSF Value */ ++ update_TSF(pmlmeext, pframe, len); ++ ++ /* start auth */ ++ start_clnt_auth(padapter); ++ ++ return _SUCCESS; ++ } ++ ++ if (((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) { ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ if (psta) { ++ ret = rtw_check_bcn_info(padapter, pframe, len); ++ if (!ret) { ++ DBG_88E_LEVEL(_drv_info_, "ap has changed, disconnect now\n "); ++ receive_disconnect(padapter, pmlmeinfo->network.MacAddress, 0); ++ return _SUCCESS; ++ } ++ /* update WMM, ERP in the beacon */ ++ /* todo: the timer is used instead of the number of the beacon received */ ++ if ((sta_rx_pkts(psta) & 0xf) == 0) ++ update_beacon_info(padapter, pframe, len, psta); ++ process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); ++ } ++ } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ if (psta) { ++ /* update WMM, ERP in the beacon */ ++ /* todo: the timer is used instead of the number of the beacon received */ ++ if ((sta_rx_pkts(psta) & 0xf) == 0) ++ update_beacon_info(padapter, pframe, len, psta); ++ } else { ++ /* allocate a new CAM entry for IBSS station */ ++ cam_idx = allocate_fw_sta_entry(padapter); ++ if (cam_idx == NUM_STA) ++ goto _END_ONBEACON_; ++ ++ /* get supported rate */ ++ if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) { ++ pmlmeinfo->FW_sta_info[cam_idx].status = 0; ++ goto _END_ONBEACON_; ++ } ++ ++ /* update TSF Value */ ++ update_TSF(pmlmeext, pframe, len); ++ ++ /* report sta add event */ ++ report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); ++ } ++ } ++ } ++ ++_END_ONBEACON_: ++ ++ return _SUCCESS; ++} ++ ++unsigned int OnAuth(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ unsigned int auth_mode, ie_len; ++ u16 seq; ++ unsigned char *sa, *p; ++ u16 algorithm; ++ int status; ++ static struct sta_info stat; ++ struct sta_info *pstat = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 *pframe = precv_frame->rx_data; ++ uint len = precv_frame->len; ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ return _FAIL; ++ ++ DBG_88E("+OnAuth\n"); ++ ++ sa = GetAddr2Ptr(pframe); ++ ++ auth_mode = psecuritypriv->dot11AuthAlgrthm; ++ seq = le16_to_cpu(*(__le16 *)((size_t)pframe + WLAN_HDR_A3_LEN + 2)); ++ algorithm = le16_to_cpu(*(__le16 *)((size_t)pframe + WLAN_HDR_A3_LEN)); ++ ++ DBG_88E("auth alg=%x, seq=%X\n", algorithm, seq); ++ ++ if (auth_mode == 2 && psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && ++ psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) ++ auth_mode = 0; ++ ++ if ((algorithm > 0 && auth_mode == 0) || /* rx a shared-key auth but shared not enabled */ ++ (algorithm == 0 && auth_mode == 1)) { /* rx a open-system auth but shared-key is enabled */ ++ DBG_88E("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", ++ algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); ++ ++ status = _STATS_NO_SUPP_ALG_; ++ ++ goto auth_fail; ++ } ++ ++ if (!rtw_access_ctrl(padapter, sa)) { ++ status = _STATS_UNABLE_HANDLE_STA_; ++ goto auth_fail; ++ } ++ ++ pstat = rtw_get_stainfo(pstapriv, sa); ++ if (!pstat) { ++ /* allocate a new one */ ++ DBG_88E("going to alloc stainfo for sa=%pM\n", sa); ++ pstat = rtw_alloc_stainfo(pstapriv, sa); ++ if (!pstat) { ++ DBG_88E(" Exceed the upper limit of supported clients...\n"); ++ status = _STATS_UNABLE_HANDLE_STA_; ++ goto auth_fail; ++ } ++ ++ pstat->state = WIFI_FW_AUTH_NULL; ++ pstat->auth_seq = 0; ++ } else { ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ if (!list_empty(&pstat->asoc_list)) { ++ list_del_init(&pstat->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ if (seq == 1) { ++ /* TODO: STA re_auth and auth timeout */ ++ } ++ } ++ ++ spin_lock_bh(&pstapriv->auth_list_lock); ++ if (list_empty(&pstat->auth_list)) { ++ list_add_tail(&pstat->auth_list, &pstapriv->auth_list); ++ pstapriv->auth_list_cnt++; ++ } ++ spin_unlock_bh(&pstapriv->auth_list_lock); ++ ++ if (pstat->auth_seq == 0) ++ pstat->expire_to = pstapriv->auth_to; ++ ++ if ((pstat->auth_seq + 1) != seq) { ++ DBG_88E("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", ++ seq, pstat->auth_seq + 1); ++ status = _STATS_OUT_OF_AUTH_SEQ_; ++ goto auth_fail; ++ } ++ ++ if (algorithm == 0 && (auth_mode == 0 || auth_mode == 2)) { ++ if (seq == 1) { ++ pstat->state &= ~WIFI_FW_AUTH_NULL; ++ pstat->state |= WIFI_FW_AUTH_SUCCESS; ++ pstat->expire_to = pstapriv->assoc_to; ++ pstat->authalg = algorithm; ++ } else { ++ DBG_88E("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", ++ seq, pstat->auth_seq + 1); ++ status = _STATS_OUT_OF_AUTH_SEQ_; ++ goto auth_fail; ++ } ++ } else { /* shared system or auto authentication */ ++ if (seq == 1) { ++ /* prepare for the challenging txt... */ ++ ++ pstat->state &= ~WIFI_FW_AUTH_NULL; ++ pstat->state |= WIFI_FW_AUTH_STATE; ++ pstat->authalg = algorithm; ++ pstat->auth_seq = 2; ++ } else if (seq == 3) { ++ /* checking for challenging txt... */ ++ DBG_88E("checking for challenging txt...\n"); ++ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&ie_len, ++ len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); ++ ++ if (!p || ie_len <= 0) { ++ DBG_88E("auth rejected because challenge failure!(1)\n"); ++ status = _STATS_CHALLENGE_FAIL_; ++ goto auth_fail; ++ } ++ ++ if (!memcmp((void *)(p + 2), pstat->chg_txt, 128)) { ++ pstat->state &= (~WIFI_FW_AUTH_STATE); ++ pstat->state |= WIFI_FW_AUTH_SUCCESS; ++ /* challenging txt is correct... */ ++ pstat->expire_to = pstapriv->assoc_to; ++ } else { ++ DBG_88E("auth rejected because challenge failure!\n"); ++ status = _STATS_CHALLENGE_FAIL_; ++ goto auth_fail; ++ } ++ } else { ++ DBG_88E("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", ++ seq, pstat->auth_seq + 1); ++ status = _STATS_OUT_OF_AUTH_SEQ_; ++ goto auth_fail; ++ } ++ } ++ ++ /* Now, we are going to issue_auth... */ ++ pstat->auth_seq = seq + 1; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_)); ++#endif ++ ++ if (pstat->state & WIFI_FW_AUTH_SUCCESS) ++ pstat->auth_seq = 0; ++ ++ return _SUCCESS; ++ ++auth_fail: ++ ++ if (pstat) ++ rtw_free_stainfo(padapter, pstat); ++ ++ pstat = &stat; ++ memset((char *)pstat, '\0', sizeof(stat)); ++ pstat->auth_seq = 2; ++ memcpy(pstat->hwaddr, sa, 6); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ issue_auth(padapter, pstat, (unsigned short)status); ++#endif ++ ++#endif ++ return _FAIL; ++} ++ ++unsigned int OnAuthClient(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ unsigned int seq, len, status, offset; ++ unsigned char *p; ++ unsigned int go2asoc = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 *pframe = precv_frame->rx_data; ++ uint pkt_len = precv_frame->len; ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* check A1 matches or not */ ++ if (memcmp(myid(&padapter->eeprompriv), get_da(pframe), ETH_ALEN)) ++ return _SUCCESS; ++ ++ if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) ++ return _SUCCESS; ++ ++ offset = (GetPrivacy(pframe)) ? 4 : 0; ++ ++ seq = le16_to_cpu(*(__le16 *)((size_t)pframe + WLAN_HDR_A3_LEN + offset + 2)); ++ status = le16_to_cpu(*(__le16 *)((size_t)pframe + WLAN_HDR_A3_LEN + offset + 4)); ++ ++ if (status != 0) { ++ DBG_88E("clnt auth fail, status: %d\n", status); ++ if (status == 13) { /* pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto) */ ++ if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) ++ pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; ++ else ++ pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; ++ } ++ ++ set_link_timer(pmlmeext, 1); ++ goto authclnt_fail; ++ } ++ ++ if (seq == 2) { ++ if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) { ++ /* legendary shared system */ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len, ++ pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_); ++ ++ if (!p) ++ goto authclnt_fail; ++ ++ memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len); ++ pmlmeinfo->auth_seq = 3; ++ issue_auth(padapter, NULL, 0); ++ set_link_timer(pmlmeext, REAUTH_TO); ++ ++ return _SUCCESS; ++ } else { ++ /* open system */ ++ go2asoc = 1; ++ } ++ } else if (seq == 4) { ++ if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) ++ go2asoc = 1; ++ else ++ goto authclnt_fail; ++ } else { ++ /* this is also illegal */ ++ goto authclnt_fail; ++ } ++ ++ if (go2asoc) { ++ DBG_88E_LEVEL(_drv_info_, "auth success, start assoc\n"); ++ start_clnt_assoc(padapter); ++ return _SUCCESS; ++ } ++authclnt_fail: ++ return _FAIL; ++} ++ ++unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ u16 capab_info; ++ struct rtw_ieee802_11_elems elems; ++ struct sta_info *pstat; ++ unsigned char reassoc, *p, *pos, *wpa_ie; ++ unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; ++ int i, ie_len, wpa_ie_len, left; ++ unsigned char supportRate[16]; ++ int supportRateNum; ++ unsigned short status = _STATS_SUCCESSFUL_; ++ unsigned short frame_type, ie_offset = 0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur = &pmlmeinfo->network; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 *pframe = precv_frame->rx_data; ++ uint pkt_len = precv_frame->len; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 p2p_status_code = P2P_STATUS_SUCCESS; ++ u8 *p2pie; ++ u32 p2pielen = 0; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ return _FAIL; ++ ++ frame_type = GetFrameSubType(pframe); ++ if (frame_type == WIFI_ASSOCREQ) { ++ reassoc = 0; ++ ie_offset = _ASOCREQ_IE_OFFSET_; ++ } else { /* WIFI_REASSOCREQ */ ++ reassoc = 1; ++ ie_offset = _REASOCREQ_IE_OFFSET_; ++ } ++ ++ if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) { ++ DBG_88E("handle_assoc(reassoc=%d) - too short payload (len=%lu)" ++ "\n", reassoc, (unsigned long)pkt_len); ++ return _FAIL; ++ } ++ ++ pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ if (pstat == (struct sta_info *)NULL) { ++ status = _RSON_CLS2_; ++ goto asoc_class2_error; ++ } ++ ++ capab_info = get_unaligned_le16(pframe + WLAN_HDR_A3_LEN); ++ ++ left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset); ++ pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset); ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* check if this stat has been successfully authenticated/assocated */ ++ if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) { ++ if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) { ++ status = _RSON_CLS2_; ++ goto asoc_class2_error; ++ } else { ++ pstat->state &= (~WIFI_FW_ASSOC_SUCCESS); ++ pstat->state |= WIFI_FW_ASSOC_STATE; ++ } ++ } else { ++ pstat->state &= (~WIFI_FW_AUTH_SUCCESS); ++ pstat->state |= WIFI_FW_ASSOC_STATE; ++ } ++ pstat->capability = capab_info; ++ /* now parse all ieee802_11 ie to point to elems */ ++ if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed || ++ !elems.ssid) { ++ DBG_88E("STA %pM sent invalid association request\n", ++ pstat->hwaddr); ++ status = _STATS_FAILURE_; ++ goto OnAssocReqFail; ++ } ++ ++ /* now we should check all the fields... */ ++ /* checking SSID */ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len, ++ pkt_len - WLAN_HDR_A3_LEN - ie_offset); ++ if (!p) ++ status = _STATS_FAILURE_; ++ ++ if (ie_len == 0) { /* broadcast ssid, however it is not allowed in assocreq */ ++ status = _STATS_FAILURE_; ++ } else { ++ /* check if ssid match */ ++ if (memcmp((void *)(p + 2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) ++ status = _STATS_FAILURE_; ++ ++ if (ie_len != cur->Ssid.SsidLength) ++ status = _STATS_FAILURE_; ++ } ++ ++ if (_STATS_SUCCESSFUL_ != status) ++ goto OnAssocReqFail; ++ ++ /* check if the supported rate is ok */ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); ++ if (!p) { ++ DBG_88E("Rx a sta assoc-req which supported rate is empty!\n"); ++ /* use our own rate set as statoin used */ ++ /* memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); */ ++ /* supportRateNum = AP_BSSRATE_LEN; */ ++ ++ status = _STATS_FAILURE_; ++ goto OnAssocReqFail; ++ } else { ++ memcpy(supportRate, p + 2, ie_len); ++ supportRateNum = ie_len; ++ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_, &ie_len, ++ pkt_len - WLAN_HDR_A3_LEN - ie_offset); ++ if (p) { ++ if (supportRateNum <= sizeof(supportRate)) { ++ memcpy(supportRate + supportRateNum, p + 2, ie_len); ++ supportRateNum += ie_len; ++ } ++ } ++ } ++ ++ /* todo: mask supportRate between AP & STA -> move to update raid */ ++ /* get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); */ ++ ++ /* update station supportRate */ ++ pstat->bssratelen = supportRateNum; ++ memcpy(pstat->bssrateset, supportRate, supportRateNum); ++ UpdateBrateTblForSoftAP(pstat->bssrateset, pstat->bssratelen); ++ ++ /* check RSN/WPA/WPS */ ++ pstat->dot8021xalg = 0; ++ pstat->wpa_psk = 0; ++ pstat->wpa_group_cipher = 0; ++ pstat->wpa2_group_cipher = 0; ++ pstat->wpa_pairwise_cipher = 0; ++ pstat->wpa2_pairwise_cipher = 0; ++ memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie)); ++ if ((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { ++ int group_cipher = 0, pairwise_cipher = 0; ++ ++ wpa_ie = elems.rsn_ie; ++ wpa_ie_len = elems.rsn_ie_len; ++ ++ if (rtw_parse_wpa2_ie(wpa_ie - 2, wpa_ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { ++ pstat->dot8021xalg = 1;/* psk, todo:802.1x */ ++ pstat->wpa_psk |= BIT(1); ++ ++ pstat->wpa2_group_cipher = group_cipher & psecuritypriv->wpa2_group_cipher; ++ pstat->wpa2_pairwise_cipher = pairwise_cipher & psecuritypriv->wpa2_pairwise_cipher; ++ ++ if (!pstat->wpa2_group_cipher) ++ status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; ++ ++ if (!pstat->wpa2_pairwise_cipher) ++ status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; ++ } else { ++ status = WLAN_STATUS_INVALID_IE; ++ } ++ } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) { ++ int group_cipher = 0, pairwise_cipher = 0; ++ ++ wpa_ie = elems.wpa_ie; ++ wpa_ie_len = elems.wpa_ie_len; ++ ++ if (rtw_parse_wpa_ie(wpa_ie - 2, wpa_ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { ++ pstat->dot8021xalg = 1;/* psk, todo:802.1x */ ++ pstat->wpa_psk |= BIT(0); ++ ++ pstat->wpa_group_cipher = group_cipher & psecuritypriv->wpa_group_cipher; ++ pstat->wpa_pairwise_cipher = pairwise_cipher & psecuritypriv->wpa_pairwise_cipher; ++ ++ if (!pstat->wpa_group_cipher) ++ status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; ++ ++ if (!pstat->wpa_pairwise_cipher) ++ status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; ++ } else { ++ status = WLAN_STATUS_INVALID_IE; ++ } ++ } else { ++ wpa_ie = NULL; ++ wpa_ie_len = 0; ++ } ++ ++ if (_STATS_SUCCESSFUL_ != status) ++ goto OnAssocReqFail; ++ ++ pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); ++ if (!wpa_ie) { ++ if (elems.wps_ie) { ++ DBG_88E("STA included WPS IE in " ++ "(Re)Association Request - assume WPS is " ++ "used\n"); ++ pstat->flags |= WLAN_STA_WPS; ++ /* wpabuf_free(sta->wps_ie); */ ++ /* sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, */ ++ /* elems.wps_ie_len - 4); */ ++ } else { ++ DBG_88E("STA did not include WPA/RSN IE " ++ "in (Re)Association Request - possible WPS " ++ "use\n"); ++ pstat->flags |= WLAN_STA_MAYBE_WPS; ++ } ++ ++ /* AP support WPA/RSN, and sta is going to do WPS, but AP is not ready */ ++ /* that the selected registrar of AP is _FLASE */ ++ if ((psecuritypriv->wpa_psk > 0) && (pstat->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) { ++ if (pmlmepriv->wps_beacon_ie) { ++ u8 selected_registrar = 0; ++ ++ rtw_get_wps_attr_content(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len, WPS_ATTR_SELECTED_REGISTRAR, &selected_registrar, NULL); ++ ++ if (!selected_registrar) { ++ DBG_88E("selected_registrar is false , or AP is not ready to do WPS\n"); ++ ++ status = _STATS_UNABLE_HANDLE_STA_; ++ ++ goto OnAssocReqFail; ++ } ++ } ++ } ++ } else { ++ int copy_len; ++ ++ if (psecuritypriv->wpa_psk == 0) { ++ DBG_88E("STA %pM: WPA/RSN IE in association " ++ "request, but AP don't support WPA/RSN\n", pstat->hwaddr); ++ ++ status = WLAN_STATUS_INVALID_IE; ++ ++ goto OnAssocReqFail; ++ } ++ ++ if (elems.wps_ie) { ++ DBG_88E("STA included WPS IE in " ++ "(Re)Association Request - WPS is " ++ "used\n"); ++ pstat->flags |= WLAN_STA_WPS; ++ copy_len = 0; ++ } else { ++ copy_len = ((wpa_ie_len + 2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)) : (wpa_ie_len + 2); ++ } ++ if (copy_len > 0) ++ memcpy(pstat->wpa_ie, wpa_ie - 2, copy_len); ++ } ++ /* check if there is WMM IE & support WWM-PS */ ++ pstat->flags &= ~WLAN_STA_WME; ++ pstat->qos_option = 0; ++ pstat->qos_info = 0; ++ pstat->has_legacy_ac = true; ++ pstat->uapsd_vo = 0; ++ pstat->uapsd_vi = 0; ++ pstat->uapsd_be = 0; ++ pstat->uapsd_bk = 0; ++ if (pmlmepriv->qospriv.qos_option) { ++ p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0; ++ for (;;) { ++ p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); ++ if (p) { ++ if (!memcmp(p + 2, WMM_IE, 6)) { ++ pstat->flags |= WLAN_STA_WME; ++ ++ pstat->qos_option = 1; ++ pstat->qos_info = *(p + 8); ++ ++ pstat->max_sp_len = (pstat->qos_info >> 5) & 0x3; ++ ++ if ((pstat->qos_info & 0xf) != 0xf) ++ pstat->has_legacy_ac = true; ++ else ++ pstat->has_legacy_ac = false; ++ ++ if (pstat->qos_info & 0xf) { ++ if (pstat->qos_info & BIT(0)) ++ pstat->uapsd_vo = BIT(0) | BIT(1); ++ else ++ pstat->uapsd_vo = 0; ++ ++ if (pstat->qos_info & BIT(1)) ++ pstat->uapsd_vi = BIT(0) | BIT(1); ++ else ++ pstat->uapsd_vi = 0; ++ ++ if (pstat->qos_info & BIT(2)) ++ pstat->uapsd_bk = BIT(0) | BIT(1); ++ else ++ pstat->uapsd_bk = 0; ++ ++ if (pstat->qos_info & BIT(3)) ++ pstat->uapsd_be = BIT(0) | BIT(1); ++ else ++ pstat->uapsd_be = 0; ++ } ++ break; ++ } ++ } else { ++ break; ++ } ++ p = p + ie_len + 2; ++ } ++ } ++ ++ /* save HT capabilities in the sta object */ ++ memset(&pstat->htpriv.ht_cap, 0, sizeof(struct ieee80211_ht_cap)); ++ if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct ieee80211_ht_cap)) { ++ pstat->flags |= WLAN_STA_HT; ++ ++ pstat->flags |= WLAN_STA_WME; ++ ++ memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct ieee80211_ht_cap)); ++ } else { ++ pstat->flags &= ~WLAN_STA_HT; ++ } ++ if ((!pmlmepriv->htpriv.ht_option) && (pstat->flags & WLAN_STA_HT)) { ++ status = _STATS_FAILURE_; ++ goto OnAssocReqFail; ++ } ++ ++ if ((pstat->flags & WLAN_STA_HT) && ++ ((pstat->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || ++ (pstat->wpa_pairwise_cipher & WPA_CIPHER_TKIP))) { ++ DBG_88E("HT: %pM tried to " ++ "use TKIP with HT association\n", pstat->hwaddr); ++ ++ /* status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; */ ++ /* goto OnAssocReqFail; */ ++ } ++ ++ pstat->flags |= WLAN_STA_NONERP; ++ for (i = 0; i < pstat->bssratelen; i++) { ++ if ((pstat->bssrateset[i] & 0x7f) > 22) { ++ pstat->flags &= ~WLAN_STA_NONERP; ++ break; ++ } ++ } ++ ++ if (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) ++ pstat->flags |= WLAN_STA_SHORT_PREAMBLE; ++ else ++ pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE; ++ ++ if (status != _STATS_SUCCESSFUL_) ++ goto OnAssocReqFail; ++ ++#ifdef CONFIG_88EU_P2P ++ pstat->is_p2p_device = false; ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ p2pie = rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, pkt_len - WLAN_HDR_A3_LEN - ie_offset, NULL, &p2pielen); ++ if (p2pie) { ++ pstat->is_p2p_device = true; ++ p2p_status_code = (u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat); ++ if (p2p_status_code > 0) { ++ pstat->p2p_status_code = p2p_status_code; ++ status = _STATS_CAP_FAIL_; ++ goto OnAssocReqFail; ++ } ++ } ++ } ++ pstat->p2p_status_code = p2p_status_code; ++#endif /* CONFIG_88EU_P2P */ ++ ++ /* TODO: identify_proprietary_vendor_ie(); */ ++ /* Realtek proprietary IE */ ++ /* identify if this is Broadcom sta */ ++ /* identify if this is ralink sta */ ++ /* Customer proprietary IE */ ++ ++ /* get a unique AID */ ++ if (pstat->aid > 0) { ++ DBG_88E(" old AID %d\n", pstat->aid); ++ } else { ++ for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) ++ if (!pstapriv->sta_aid[pstat->aid - 1]) ++ break; ++ ++ /* if (pstat->aid > NUM_STA) { */ ++ if (pstat->aid > pstapriv->max_num_sta) { ++ pstat->aid = 0; ++ ++ DBG_88E(" no room for more AIDs\n"); ++ ++ status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; ++ ++ goto OnAssocReqFail; ++ } else { ++ pstapriv->sta_aid[pstat->aid - 1] = pstat; ++ DBG_88E("allocate new AID=(%d)\n", pstat->aid); ++ } ++ } ++ ++ pstat->state &= (~WIFI_FW_ASSOC_STATE); ++ pstat->state |= WIFI_FW_ASSOC_SUCCESS; ++ ++ spin_lock_bh(&pstapriv->auth_list_lock); ++ if (!list_empty(&pstat->auth_list)) { ++ list_del_init(&pstat->auth_list); ++ pstapriv->auth_list_cnt--; ++ } ++ spin_unlock_bh(&pstapriv->auth_list_lock); ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ if (list_empty(&pstat->asoc_list)) { ++ pstat->expire_to = pstapriv->expire_to; ++ list_add_tail(&pstat->asoc_list, &pstapriv->asoc_list); ++ pstapriv->asoc_list_cnt++; ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ /* now the station is qualified to join our BSS... */ ++ if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_ == status)) { ++#ifdef CONFIG_88EU_AP_MODE ++ /* 1 bss_cap_update & sta_info_update */ ++ bss_cap_update_on_sta_join(padapter, pstat); ++ sta_info_update(padapter, pstat); ++ ++ /* issue assoc rsp before notify station join event. */ ++ if (frame_type == WIFI_ASSOCREQ) ++ issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); ++ else ++ issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); ++ ++ /* 2 - report to upper layer */ ++ DBG_88E("indicate_sta_join_event to upper layer - hostapd\n"); ++ rtw_indicate_sta_assoc_event(padapter, pstat); ++ ++ /* 3-(1) report sta add event */ ++ report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); ++#endif ++ } ++ ++ return _SUCCESS; ++ ++asoc_class2_error: ++ ++#ifdef CONFIG_88EU_AP_MODE ++ issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status); ++#endif ++ ++ return _FAIL; ++ ++OnAssocReqFail: ++ ++#ifdef CONFIG_88EU_AP_MODE ++ pstat->aid = 0; ++ if (frame_type == WIFI_ASSOCREQ) ++ issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); ++ else ++ issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); ++#endif ++ ++#endif /* CONFIG_88EU_AP_MODE */ ++ ++ return _FAIL; ++} ++ ++unsigned int OnAssocRsp(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ uint i; ++ int res; ++ unsigned short status; ++ struct ndis_802_11_var_ie *pIE; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ /* struct wlan_bssid_ex *cur_network = &(pmlmeinfo->network); */ ++ u8 *pframe = precv_frame->rx_data; ++ uint pkt_len = precv_frame->len; ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* check A1 matches or not */ ++ if (memcmp(myid(&padapter->eeprompriv), get_da(pframe), ETH_ALEN)) ++ return _SUCCESS; ++ ++ if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE))) ++ return _SUCCESS; ++ ++ if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) ++ return _SUCCESS; ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ /* status */ ++ status = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN + 2)); ++ if (status > 0) { ++ DBG_88E("assoc reject, status code: %d\n", status); ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ res = -4; ++ goto report_assoc_result; ++ } ++ ++ /* get capabilities */ ++ pmlmeinfo->capability = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN)); ++ ++ /* set slot time */ ++ pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10)) ? 9 : 20; ++ ++ /* AID */ ++ pmlmeinfo->aid = (int)(le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN + 4)) & 0x3fff); ++ res = pmlmeinfo->aid; ++ ++ /* following are moved to join event callback function */ ++ /* to handle HT, WMM, rate adaptive, update MAC reg */ ++ /* for not to handle the synchronous IO in the tasklet */ ++ for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) { ++ pIE = (struct ndis_802_11_var_ie *)(pframe + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if (!memcmp(pIE->data, WMM_PARA_OUI, 6)) /* WMM */ ++ WMM_param_handler(padapter, pIE); ++ break; ++ case _HT_CAPABILITY_IE_: /* HT caps */ ++ HT_caps_handler(padapter, pIE); ++ break; ++ case _HT_EXTRA_INFO_IE_: /* HT info */ ++ HT_info_handler(padapter, pIE); ++ break; ++ case _ERPINFO_IE_: ++ ERP_IE_handler(padapter, pIE); ++ break; ++ default: ++ break; ++ } ++ ++ i += (pIE->Length + 2); ++ } ++ ++ pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE); ++ pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; ++ ++ /* Update Basic Rate Table for spec, 2010-12-28 , by thomas */ ++ UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); ++ ++report_assoc_result: ++ if (res > 0) ++ rtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len); ++ else ++ kfree(pmlmepriv->assoc_rsp); ++ ++ report_join_res(padapter, res); ++ ++ return _SUCCESS; ++} ++ ++unsigned int OnDeAuth(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ unsigned short reason; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 *pframe = precv_frame->rx_data; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ /* check A3 */ ++ if (!(!memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) ++ return _SUCCESS; ++ ++#ifdef CONFIG_88EU_P2P ++ if (pwdinfo->rx_invitereq_info.scan_op_ch_only) { ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); ++ _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ reason = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN)); ++ ++ DBG_88E("%s Reason code(%d)\n", __func__, reason); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ struct sta_info *psta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ DBG_88E_LEVEL(_drv_always_, "ap recv deauth reason code(%d) sta:%pM\n", ++ reason, GetAddr2Ptr(pframe)); ++ ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ if (psta) { ++ u8 updated = 0; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ if (!list_empty(&psta->asoc_list)) { ++ list_del_init(&psta->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ updated = ap_free_sta(padapter, psta, false, reason); ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ associated_clients_update(padapter, updated); ++ } ++ ++ return _SUCCESS; ++ } else ++#endif ++ { ++ int ignore_received_deauth = 0; ++ ++ /* Before sending the auth frame to start the STA/GC mode connection with AP/GO, ++ * we will send the deauth first. ++ * However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. ++ * Added the following code to avoid this case. ++ */ ++ if ((pmlmeinfo->state & WIFI_FW_AUTH_STATE) || ++ (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)) { ++ if (reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA) { ++ ignore_received_deauth = 1; ++ } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { ++ // TODO: 802.11r ++ ignore_received_deauth = 1; ++ } ++ } ++ ++ DBG_88E_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", ++ reason, GetAddr3Ptr(pframe), ignore_received_deauth); ++ ++ if (!ignore_received_deauth) ++ receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); ++ } ++ pmlmepriv->LinkDetectInfo.bBusyTraffic = false; ++ return _SUCCESS; ++} ++ ++unsigned int OnDisassoc(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ u16 reason; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 *pframe = precv_frame->rx_data; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ /* check A3 */ ++ if (!(!memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) ++ return _SUCCESS; ++ ++#ifdef CONFIG_88EU_P2P ++ if (pwdinfo->rx_invitereq_info.scan_op_ch_only) { ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); ++ _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ reason = le16_to_cpu(*(__le16 *)(pframe + WLAN_HDR_A3_LEN)); ++ ++ DBG_88E("%s Reason code(%d)\n", __func__, reason); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ struct sta_info *psta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ DBG_88E_LEVEL(_drv_always_, "ap recv disassoc reason code(%d) sta:%pM\n", ++ reason, GetAddr2Ptr(pframe)); ++ ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ if (psta) { ++ u8 updated = 0; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ if (!list_empty(&psta->asoc_list)) { ++ list_del_init(&psta->asoc_list); ++ pstapriv->asoc_list_cnt--; ++ updated = ap_free_sta(padapter, psta, false, reason); ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ associated_clients_update(padapter, updated); ++ } ++ ++ return _SUCCESS; ++ } else ++#endif ++ { ++ DBG_88E_LEVEL(_drv_always_, "ap recv disassoc reason code(%d) sta:%pM\n", ++ reason, GetAddr3Ptr(pframe)); ++ ++ receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); ++ } ++ pmlmepriv->LinkDetectInfo.bBusyTraffic = false; ++ return _SUCCESS; ++} ++ ++unsigned int OnAtim(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ DBG_88E("%s\n", __func__); ++ return _SUCCESS; ++} ++ ++unsigned int on_action_spct(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ unsigned int ret = _FAIL; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 *pframe = precv_frame->rx_data; ++ u8 *frame_body = (u8 *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ u8 category; ++ u8 action; ++ ++ DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); ++ ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ ++ if (!psta) ++ goto exit; ++ ++ category = frame_body[0]; ++ if (category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT) ++ goto exit; ++ ++ action = frame_body[1]; ++ switch (action) { ++ case RTW_WLAN_ACTION_SPCT_MSR_REQ: ++ case RTW_WLAN_ACTION_SPCT_MSR_RPRT: ++ case RTW_WLAN_ACTION_SPCT_TPC_REQ: ++ case RTW_WLAN_ACTION_SPCT_TPC_RPRT: ++ break; ++ case RTW_WLAN_ACTION_SPCT_CHL_SWITCH: ++ break; ++ default: ++ break; ++ } ++ ++exit: ++ return ret; ++} ++ ++unsigned int OnAction_qos(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ return _SUCCESS; ++} ++ ++unsigned int OnAction_dls(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ return _SUCCESS; ++} ++ ++unsigned int OnAction_back(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ u8 *addr; ++ struct sta_info *psta = NULL; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ unsigned char *frame_body; ++ unsigned char category, action; ++ unsigned short tid, status, reason_code = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 *pframe = precv_frame->rx_data; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ /* check RA matches or not */ ++ if (memcmp(myid(&padapter->eeprompriv), GetAddr1Ptr(pframe), ETH_ALEN))/* for if1, sta/ap mode */ ++ return _SUCCESS; ++ ++ DBG_88E("%s\n", __func__); ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) ++ return _SUCCESS; ++ ++ addr = GetAddr2Ptr(pframe); ++ psta = rtw_get_stainfo(pstapriv, addr); ++ ++ if (!psta) ++ return _SUCCESS; ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ category = frame_body[0]; ++ if (category == RTW_WLAN_CATEGORY_BACK) { /* representing Block Ack */ ++ if (!pmlmeinfo->HT_enable) ++ return _SUCCESS; ++ action = frame_body[1]; ++ DBG_88E("%s, action=%d\n", __func__, action); ++ switch (action) { ++ case RTW_WLAN_ACTION_ADDBA_REQ: /* ADDBA request */ ++ memcpy(&pmlmeinfo->ADDBA_req, &frame_body[2], sizeof(struct ADDBA_request)); ++ process_addba_req(padapter, (u8 *)&pmlmeinfo->ADDBA_req, addr); ++ ++ if (pmlmeinfo->bAcceptAddbaReq) ++ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0); ++ else ++ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);/* reject ADDBA Req */ ++ break; ++ case RTW_WLAN_ACTION_ADDBA_RESP: /* ADDBA response */ ++ status = get_unaligned_le16(&frame_body[3]); ++ tid = ((frame_body[5] >> 2) & 0x7); ++ if (status == 0) { /* successful */ ++ DBG_88E("agg_enable for TID=%d\n", tid); ++ psta->htpriv.agg_enable_bitmap |= 1 << tid; ++ psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); ++ } else { ++ psta->htpriv.agg_enable_bitmap &= ~BIT(tid); ++ } ++ break; ++ case RTW_WLAN_ACTION_DELBA: /* DELBA */ ++ if ((frame_body[3] & BIT(3)) == 0) { ++ psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); ++ psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); ++ reason_code = get_unaligned_le16(&frame_body[4]); ++ } else if ((frame_body[3] & BIT(3)) == BIT(3)) { ++ tid = (frame_body[3] >> 4) & 0x0F; ++ preorder_ctrl = &psta->recvreorder_ctrl[tid]; ++ preorder_ctrl->enable = false; ++ preorder_ctrl->indicate_seq = 0xffff; ++ } ++ DBG_88E("%s(): DELBA: %x(%x)\n", __func__, pmlmeinfo->agg_enable_bitmap, reason_code); ++ /* todo: how to notify the host while receiving DELETE BA */ ++ break; ++ default: ++ break; ++ } ++ } ++ return _SUCCESS; ++} ++ ++#ifdef CONFIG_88EU_P2P ++ ++static int get_reg_classes_full_count(struct p2p_channels *channel_list) ++{ ++ int cnt = 0; ++ int i; ++ ++ for (i = 0; i < channel_list->reg_classes; i++) { ++ cnt += channel_list->reg_class[i].channels; ++ } ++ ++ return cnt; ++} ++ ++void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_GO_NEGO_REQ; ++ u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; ++ u8 wpsielen = 0, p2pielen = 0; ++ u16 len_channellist_attr = 0; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ DBG_88E("[%s] In\n", __func__); ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pwdinfo->negotiation_dialog_token = 1; /* Initialize the dialog value */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &pattrib->pktlen); ++ ++ /* WPS Section */ ++ wpsielen = 0; ++ /* WPS OUI */ ++ *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* WPS version */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ ++ ++ /* Device Password ID */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ ++ if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC); ++ else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN) ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); ++ else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC) ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC); ++ ++ wpsielen += 2; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ /* P2P IE Section. */ ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20110306 */ ++ /* According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. Group Owner Intent */ ++ /* 3. Configuration Timeout */ ++ /* 4. Listen Channel */ ++ /* 5. Extended Listen Timing */ ++ /* 6. Intended P2P Interface Address */ ++ /* 7. Channel List */ ++ /* 8. P2P Device Info */ ++ /* 9. Operating Channel */ ++ ++ /* P2P Capability */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; ++ else ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; ++ ++ /* Group Owner Intent */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GO_INTENT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Todo the tie breaker bit. */ ++ p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0)); ++ ++ /* Configuration Timeout */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ ++ ++ /* Listen Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->listen_channel; /* listening channel number */ ++ ++ /* Extended Listen Timing ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Availability Period */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ /* Availability Interval */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ /* Intended P2P Interface Address */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Channel List */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CH_LIST; ++ ++ /* Length: */ ++ /* Country String(3) */ ++ /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */ ++ /* + number of channels in all classes */ ++ len_channellist_attr = 3 ++ + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes) ++ + get_reg_classes_full_count(&pmlmeext->channel_list); ++ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Channel Entry List */ ++ ++ { ++ int i, j; ++ for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { ++ /* Operating Class */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; ++ ++ /* Number of Channels */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; ++ ++ /* Channel List */ ++ for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; ++ } ++ } ++ } ++ ++ /* Device Info */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); ++ ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ /* Operating Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_GO_NEGO_RESP; ++ u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; ++ u8 p2pielen = 0; ++ uint wpsielen = 0; ++ u16 wps_devicepassword_id = 0x0000; ++ __be16 be_tmp; ++ uint wps_devicepassword_id_len = 0; ++ u16 len_channellist_attr = 0; ++ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ DBG_88E("[%s] In, result=%d\n", __func__, result); ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pwdinfo->negotiation_dialog_token = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &pattrib->pktlen); ++ ++ /* Commented by Albert 20110328 */ ++ /* Try to get the device password ID from the WPS IE of group negotiation request frame */ ++ /* WiFi Direct test plan 5.1.15 */ ++ rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); ++ rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8 *)&be_tmp, &wps_devicepassword_id_len); ++ wps_devicepassword_id = be16_to_cpu(be_tmp); ++ ++ memset(wpsie, 0x00, 255); ++ wpsielen = 0; ++ ++ /* WPS Section */ ++ wpsielen = 0; ++ /* WPS OUI */ ++ *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* WPS version */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ ++ ++ /* Device Password ID */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ if (wps_devicepassword_id == WPS_DPID_USER_SPEC) ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); ++ else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC); ++ else ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC); ++ wpsielen += 2; ++ ++ /* Commented by Kurt 20120113 */ ++ /* If some device wants to do p2p handshake without sending prov_disc_req */ ++ /* We have to get peer_req_cm from here. */ ++ if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) { ++ if (wps_devicepassword_id == WPS_DPID_USER_SPEC) ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); ++ else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); ++ else ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); ++ } ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ /* P2P IE Section. */ ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20100908 */ ++ /* According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes */ ++ /* 1. Status */ ++ /* 2. P2P Capability */ ++ /* 3. Group Owner Intent */ ++ /* 4. Configuration Timeout */ ++ /* 5. Operating Channel */ ++ /* 6. Intended P2P Interface Address */ ++ /* 7. Channel List */ ++ /* 8. Device Info */ ++ /* 9. Group ID (Only GO) */ ++ ++ /* ToDo: */ ++ ++ /* P2P Status */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_STATUS; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = result; ++ ++ /* P2P Capability */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { ++ /* Commented by Albert 2011/03/08 */ ++ /* According to the P2P specification */ ++ /* if the sending device will be client, the P2P Capability should be reserved of group negotiation response frame */ ++ p2pie[p2pielen++] = 0; ++ } else { ++ /* Be group owner or meet the error case */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ } ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) { ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; ++ } else { ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; ++ } ++ ++ /* Group Owner Intent */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GO_INTENT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ if (pwdinfo->peer_intent & 0x01) { ++ /* Peer's tie breaker bit is 1, our tie breaker bit should be 0 */ ++ p2pie[p2pielen++] = (pwdinfo->intent << 1); ++ } else { ++ /* Peer's tie breaker bit is 0, our tie breaker bit should be 1 */ ++ p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0)); ++ } ++ ++ /* Configuration Timeout */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ ++ ++ /* Operating Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ ++ ++ /* Intended P2P Interface Address */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Channel List */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CH_LIST; ++ ++ /* Country String(3) */ ++ /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */ ++ /* + number of channels in all classes */ ++ len_channellist_attr = 3 ++ + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes ++ + get_reg_classes_full_count(&pmlmeext->channel_list); ++ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); ++ ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Channel Entry List */ ++ ++ { ++ int i, j; ++ for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { ++ /* Operating Class */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; ++ ++ /* Number of Channels */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; ++ ++ /* Channel List */ ++ for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; ++ } ++ } ++ } ++ ++ /* Device Info */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); ++ ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* Group ID Attribute */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* p2P Device Address */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* SSID */ ++ memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); ++ p2pielen += pwdinfo->nego_ssidlen; ++ } ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_GO_NEGO_CONF; ++ u8 p2pie[255] = { 0x00 }; ++ u8 p2pielen = 0; ++ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ DBG_88E("[%s] In\n", __func__); ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &pattrib->pktlen); ++ ++ /* P2P IE Section. */ ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20110306 */ ++ /* According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes */ ++ /* 1. Status */ ++ /* 2. P2P Capability */ ++ /* 3. Operating Channel */ ++ /* 4. Channel List */ ++ /* 5. Group ID (if this WiFi is GO) */ ++ ++ /* P2P Status */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_STATUS; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = result; ++ ++ /* P2P Capability */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; ++ else ++ p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; ++ ++ /* Operating Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; ++ p2pie[p2pielen++] = pwdinfo->peer_operating_ch; ++ } else { ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->operating_channel; /* Use the listen channel as the operating channel */ ++ } ++ ++ /* Channel List */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CH_LIST; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(pwdinfo->channel_list_attr_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len); ++ p2pielen += pwdinfo->channel_list_attr_len; ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* Group ID Attribute */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* p2P Device Address */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* SSID */ ++ memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); ++ p2pielen += pwdinfo->nego_ssidlen; ++ } ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_INVIT_REQ; ++ u8 p2pie[255] = { 0x00 }; ++ u8 p2pielen = 0; ++ u8 dialogToken = 3; ++ u16 len_channellist_attr = 0; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ /* P2P IE Section. */ ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20101011 */ ++ /* According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes */ ++ /* 1. Configuration Timeout */ ++ /* 2. Invitation Flags */ ++ /* 3. Operating Channel (Only GO) */ ++ /* 4. P2P Group BSSID (Should be included if I am the GO) */ ++ /* 5. Channel List */ ++ /* 6. P2P Group ID */ ++ /* 7. P2P Device Info */ ++ ++ /* Configuration Timeout */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ ++ ++ /* Invitation Flags */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_INVITATION_FLAGS; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = P2P_INVITATION_FLAGS_PERSISTENT; ++ ++ /* Operating Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->invitereq_info.operating_ch; /* operating channel number */ ++ ++ if (!memcmp(myid(&padapter->eeprompriv), pwdinfo->invitereq_info.go_bssid, ETH_ALEN)) { ++ /* P2P Group BSSID */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address for GO */ ++ memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ } ++ ++ /* Channel List */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CH_LIST; ++ ++ /* Length: */ ++ /* Country String(3) */ ++ /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */ ++ /* + number of channels in all classes */ ++ len_channellist_attr = 3 ++ + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes ++ + get_reg_classes_full_count(&pmlmeext->channel_list); ++ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); ++ ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Channel Entry List */ ++ { ++ int i, j; ++ for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { ++ /* Operating Class */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; ++ ++ /* Number of Channels */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; ++ ++ /* Channel List */ ++ for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; ++ } ++ } ++ } ++ ++ /* P2P Group ID */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(6 + pwdinfo->invitereq_info.ssidlen); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address for GO */ ++ memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* SSID */ ++ memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen); ++ p2pielen += pwdinfo->invitereq_info.ssidlen; ++ ++ /* Device Info */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialogToken, u8 status_code) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_INVIT_RESP; ++ u8 p2pie[255] = { 0x00 }; ++ u8 p2pielen = 0; ++ u16 len_channellist_attr = 0; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ /* P2P IE Section. */ ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20101005 */ ++ /* According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes */ ++ /* 1. Status */ ++ /* 2. Configuration Timeout */ ++ /* 3. Operating Channel (Only GO) */ ++ /* 4. P2P Group BSSID (Only GO) */ ++ /* 5. Channel List */ ++ ++ /* P2P Status */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_STATUS; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. */ ++ /* Sent the event receiving the P2P Invitation Req frame to DMP UI. */ ++ /* DMP had to compare the MAC address to find out the profile. */ ++ /* So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. */ ++ /* If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req */ ++ /* to NB to rebuild the persistent group. */ ++ p2pie[p2pielen++] = status_code; ++ ++ /* Configuration Timeout */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ ++ p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ ++ ++ if (status_code == P2P_STATUS_SUCCESS) { ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO */ ++ /* In this case, the P2P Invitation response frame should carry the two more P2P attributes. */ ++ /* First one is operating channel attribute. */ ++ /* Second one is P2P Group BSSID attribute. */ ++ ++ /* Operating Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ ++ ++ /* P2P Group BSSID */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address for GO */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ } ++ ++ /* Channel List */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CH_LIST; ++ ++ /* Length: */ ++ /* Country String(3) */ ++ /* + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */ ++ /* + number of channels in all classes */ ++ len_channellist_attr = 3 ++ + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes ++ + get_reg_classes_full_count(&pmlmeext->channel_list); ++ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Channel Entry List */ ++ { ++ int i, j; ++ for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { ++ /* Operating Class */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; ++ ++ /* Number of Channels */ ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; ++ ++ /* Channel List */ ++ for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { ++ p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; ++ } ++ } ++ } ++ } ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidlen, u8 *pdev_raddr) ++{ ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ u8 dialogToken = 1; ++ u8 oui_subtype = P2P_PROVISION_DISC_REQ; ++ u8 wpsie[100] = { 0x00 }; ++ u8 wpsielen = 0; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u32 p2pielen = 0; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ DBG_88E("[%s] In\n", __func__); ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pdev_raddr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ p2pielen = build_prov_disc_request_p2p_ie(pwdinfo, pframe, pssid, ussidlen, pdev_raddr); ++ ++ pframe += p2pielen; ++ pattrib->pktlen += p2pielen; ++ ++ wpsielen = 0; ++ /* WPS OUI */ ++ *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* WPS version */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ ++ ++ /* Config Method */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request); ++ wpsielen += 2; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static u8 is_matched_in_profilelist(u8 *peermacaddr, struct profile_info *profileinfo) ++{ ++ u8 i, match_result = 0; ++ ++ DBG_88E("[%s] peermac=%.2X %.2X %.2X %.2X %.2X %.2X\n", __func__, ++ peermacaddr[0], peermacaddr[1], peermacaddr[2], peermacaddr[3], peermacaddr[4], peermacaddr[5]); ++ ++ for (i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++) { ++ DBG_88E("[%s] profileinfo_mac=%.2X %.2X %.2X %.2X %.2X %.2X\n", __func__, ++ profileinfo->peermac[0], profileinfo->peermac[1], profileinfo->peermac[2], ++ profileinfo->peermac[3], profileinfo->peermac[4], profileinfo->peermac[5]); ++ if (!memcmp(peermacaddr, profileinfo->peermac, ETH_ALEN)) { ++ match_result = 1; ++ DBG_88E("[%s] Match!\n", __func__); ++ break; ++ } ++ } ++ return match_result; ++} ++ ++void issue_probersp_p2p(struct adapter *padapter, unsigned char *da) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned char *mac; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ u16 beacon_interval = 100; ++ u16 capInfo = 0; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 wpsie[255] = { 0x00 }; ++ u32 wpsielen = 0, p2pielen = 0; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ mac = myid(&padapter->eeprompriv); ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, mac, ETH_ALEN); ++ ++ /* Use the device address for BSSID field. */ ++ memcpy(pwlanhdr->addr3, mac, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(fctrl, WIFI_PROBERSP); ++ ++ pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = pattrib->hdrlen; ++ pframe += pattrib->hdrlen; ++ ++ /* timestamp will be inserted by hardware */ ++ pframe += 8; ++ pattrib->pktlen += 8; ++ ++ /* beacon interval: 2 bytes */ ++ memcpy(pframe, (unsigned char *)&beacon_interval, 2); ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* capability info: 2 bytes */ ++ /* ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) */ ++ capInfo |= cap_ShortPremble; ++ capInfo |= cap_ShortSlot; ++ ++ memcpy(pframe, (unsigned char *)&capInfo, 2); ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* SSID */ ++ pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); ++ ++ /* supported rates... */ ++ /* Use the OFDM rate in the P2P probe response frame. (6(B), 9(B), 12, 18, 24, 36, 48, 54) */ ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); ++ ++ /* DS parameter set */ ++ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); ++ ++ /* Todo: WPS IE */ ++ /* Noted by Albert 20100907 */ ++ /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ ++ ++ wpsielen = 0; ++ /* WPS OUI */ ++ *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* WPS version */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ ++ ++ /* WiFi Simple Config State */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SIMPLE_CONF_STATE); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; /* Not Configured. */ ++ ++ /* Response Type */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_RESP_TYPE); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; ++ ++ /* UUID-E */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ wpsielen += 0x10; ++ ++ /* Manufacturer */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MANUFACTURER); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0007); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, "Realtek", 7); ++ wpsielen += 7; ++ ++ /* Model Name */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NAME); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0006); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, "8188EU", 6); ++ wpsielen += 6; ++ ++ /* Model Number */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NUMBER); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = 0x31; /* character 1 */ ++ ++ /* Serial Number */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SERIAL_NUMBER); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(ETH_ALEN); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, "123456", ETH_ALEN); ++ wpsielen += ETH_ALEN; ++ ++ /* Primary Device Type */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008); ++ wpsielen += 2; ++ ++ /* Value: */ ++ /* Category ID */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ wpsielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ wpsielen += 2; ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len); ++ wpsielen += 2; ++ ++ /* Value: */ ++ if (pwdinfo->device_name_len) { ++ memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ wpsielen += pwdinfo->device_name_len; ++ } ++ ++ /* Config Method */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm); ++ wpsielen += 2; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); ++ pframe += p2pielen; ++ pattrib->pktlen += p2pielen; ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static int _issue_probereq_p2p(struct adapter *padapter, u8 *da, int wait_ack) ++{ ++ int ret = _FAIL; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned char *mac; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; ++ u16 wpsielen = 0, p2pielen = 0; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ mac = myid(&padapter->eeprompriv); ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ if (da) { ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, da, ETH_ALEN); ++ } else { ++ if ((pwdinfo->p2p_info.scan_op_ch_only) || (pwdinfo->rx_invitereq_info.scan_op_ch_only)) { ++ /* This two flags will be set when this is only the P2P client mode. */ ++ memcpy(pwlanhdr->addr1, pwdinfo->p2p_peer_interface_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pwdinfo->p2p_peer_interface_addr, ETH_ALEN); ++ } else { ++ /* broadcast probe request frame */ ++ memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); ++ } ++ } ++ memcpy(pwlanhdr->addr2, mac, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_PROBEREQ); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) ++ pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &pattrib->pktlen); ++ else ++ pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); ++ ++ /* Use the OFDM rate in the P2P probe request frame. (6(B), 9(B), 12(B), 24(B), 36, 48, 54) */ ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); ++ ++ /* WPS IE */ ++ /* Noted by Albert 20110221 */ ++ /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ ++ ++ wpsielen = 0; ++ /* WPS OUI */ ++ *(__be32 *)(wpsie) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* WPS version */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); ++ wpsielen += 2; ++ ++ /* Value: */ ++ wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ ++ ++ if (!pmlmepriv->wps_probe_req_ie) { ++ /* UUID-E */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ wpsielen += 0x10; ++ ++ /* Config Method */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm); ++ wpsielen += 2; ++ } ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len); ++ wpsielen += 2; ++ ++ /* Value: */ ++ memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ wpsielen += pwdinfo->device_name_len; ++ ++ /* Primary Device Type */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008); ++ wpsielen += 2; ++ ++ /* Value: */ ++ /* Category ID */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_RTK_WIDI); ++ wpsielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI); ++ wpsielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_RTK_DMP); ++ wpsielen += 2; ++ ++ /* Device Password ID */ ++ /* Type: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); ++ wpsielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ *(__be16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); /* Registrar-specified */ ++ wpsielen += 2; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20110221 */ ++ /* According to the P2P Specification, the probe request frame should contain 5 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. P2P Device ID if this probe request wants to find the specific P2P device */ ++ /* 3. Listen Channel */ ++ /* 4. Extended Listen Timing */ ++ /* 5. Operating Channel if this WiFi is working as the group owner now */ ++ ++ /* P2P Capability */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; ++ else ++ p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; ++ ++ /* Listen Channel */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->listen_channel; /* listen channel */ ++ ++ /* Extended Listen Timing */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Availability Period */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ /* Availability Interval */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* Operating Channel (if this WiFi is working as the group owner now) */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Country String */ ++ p2pie[p2pielen++] = 'X'; ++ p2pie[p2pielen++] = 'X'; ++ ++ /* The third byte should be set to 0x04. */ ++ /* Described in the "Operating Channel Attribute" section. */ ++ p2pie[p2pielen++] = 0x04; ++ ++ /* Operating Class */ ++ p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ ++ ++ /* Channel Number */ ++ p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ ++ } ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ ++ if (pmlmepriv->wps_probe_req_ie) { ++ /* WPS IE */ ++ memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); ++ pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; ++ pframe += pmlmepriv->wps_probe_req_ie_len; ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ if (wait_ack) { ++ ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); ++ } else { ++ dump_mgntframe(padapter, pmgntframe); ++ ret = _SUCCESS; ++ } ++ ++exit: ++ return ret; ++} ++ ++inline void issue_probereq_p2p(struct adapter *adapter, u8 *da) ++{ ++ _issue_probereq_p2p(adapter, da, false); ++} ++ ++int issue_probereq_p2p_ex(struct adapter *adapter, u8 *da, int try_cnt, int wait_ms) ++{ ++ int ret; ++ int i = 0; ++ u32 start = jiffies; ++ ++ do { ++ ret = _issue_probereq_p2p(adapter, da, wait_ms > 0); ++ ++ i++; ++ ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved) ++ break; ++ ++ if (i < try_cnt && wait_ms > 0 && ret == _FAIL) ++ msleep(wait_ms); ++ } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); ++ ++ if (ret != _FAIL) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ ++ if (try_cnt && wait_ms) { ++ if (da) ++ DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(adapter), da, rtw_get_oper_ch(adapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ else ++ DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(adapter), rtw_get_oper_ch(adapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ } ++exit: ++ return ret; ++} ++ ++#endif /* CONFIG_88EU_P2P */ ++ ++static s32 rtw_action_public_decache(struct recv_frame *recv_frame, s32 token) ++{ ++ struct adapter *adapter = recv_frame->adapter; ++ struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; ++ u8 *frame = recv_frame->rx_data; ++ u16 seq_ctrl = ((recv_frame->attrib.seq_num & 0xffff) << 4) | ++ (recv_frame->attrib.frag_num & 0xf); ++ ++ if (GetRetry(frame)) { ++ if (token >= 0) { ++ if ((seq_ctrl == mlmeext->action_public_rxseq) && (token == mlmeext->action_public_dialog_token)) { ++ DBG_88E(FUNC_ADPT_FMT" seq_ctrl = 0x%x, rxseq = 0x%x, token:%d\n", ++ FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq, token); ++ return _FAIL; ++ } ++ } else { ++ if (seq_ctrl == mlmeext->action_public_rxseq) { ++ DBG_88E(FUNC_ADPT_FMT" seq_ctrl = 0x%x, rxseq = 0x%x\n", ++ FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq); ++ return _FAIL; ++ } ++ } ++ } ++ ++ mlmeext->action_public_rxseq = seq_ctrl; ++ ++ if (token >= 0) ++ mlmeext->action_public_dialog_token = token; ++ ++ return _SUCCESS; ++} ++ ++static unsigned int on_action_public_p2p(struct recv_frame *precv_frame) ++{ ++ u8 *pframe = precv_frame->rx_data; ++ u8 *frame_body; ++ u8 dialogToken = 0; ++#ifdef CONFIG_88EU_P2P ++ struct adapter *padapter = precv_frame->adapter; ++ uint len = precv_frame->len; ++ u8 *p2p_ie; ++ u32 p2p_ielen; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 result = P2P_STATUS_SUCCESS; ++ u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; ++#endif /* CONFIG_88EU_P2P */ ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ dialogToken = frame_body[7]; ++ ++ if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL) ++ return _FAIL; ++ ++#ifdef CONFIG_88EU_P2P ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); ++ /* Do nothing if the driver doesn't enable the P2P function. */ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) ++ return _SUCCESS; ++ ++ len -= sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ switch (frame_body[6]) { /* OUI Subtype */ ++ case P2P_GO_NEGO_REQ: ++ DBG_88E("[%s] Got GO Nego Req Frame\n", __func__); ++ memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info)); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) ++ rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) { ++ /* Commented by Albert 20110526 */ ++ /* In this case, this means the previous nego fail doesn't be reset yet. */ ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ /* Restore the previous p2p state */ ++ rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); ++ DBG_88E("[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo)); ++ } ++ ++ /* Commented by Kurt 20110902 */ ++ /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ ++ /* Commented by Kurt 20120113 */ ++ /* Get peer_dev_addr here if peer doesn't issue prov_disc frame. */ ++ if (!memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN)) ++ memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); ++ ++ result = process_p2p_group_negotation_req(pwdinfo, frame_body, len); ++ issue_p2p_GO_response(padapter, GetAddr2Ptr(pframe), frame_body, len, result); ++ ++ /* Commented by Albert 20110718 */ ++ /* No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */ ++ _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); ++ break; ++ case P2P_GO_NEGO_RESP: ++ DBG_88E("[%s] Got GO Nego Resp Frame\n", __func__); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { ++ /* Commented by Albert 20110425 */ ++ /* The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */ ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ pwdinfo->nego_req_info.benable = false; ++ result = process_p2p_group_negotation_resp(pwdinfo, frame_body, len); ++ issue_p2p_GO_confirm(pwdinfo->padapter, GetAddr2Ptr(pframe), result); ++ if (P2P_STATUS_SUCCESS == result) { ++ if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { ++ pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; ++ pwdinfo->p2p_info.scan_op_ch_only = 1; ++ _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH); ++ } ++ } ++ /* Reset the dialog token for group negotiation frames. */ ++ pwdinfo->negotiation_dialog_token = 1; ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) ++ _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); ++ } else { ++ DBG_88E("[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__); ++ } ++ break; ++ case P2P_GO_NEGO_CONF: ++ DBG_88E("[%s] Got GO Nego Confirm Frame\n", __func__); ++ result = process_p2p_group_negotation_confirm(pwdinfo, frame_body, len); ++ if (P2P_STATUS_SUCCESS == result) { ++ if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { ++ pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; ++ pwdinfo->p2p_info.scan_op_ch_only = 1; ++ _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH); ++ } ++ } ++ break; ++ case P2P_INVIT_REQ: ++ /* Added by Albert 2010/10/05 */ ++ /* Received the P2P Invite Request frame. */ ++ ++ DBG_88E("[%s] Got invite request frame!\n", __func__); ++ p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); ++ if (p2p_ie) { ++ /* Parse the necessary information from the P2P Invitation Request frame. */ ++ /* For example: The MAC address of sending this P2P Invitation Request frame. */ ++ u32 attr_contentlen = 0; ++ u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ struct group_id_info group_id; ++ u8 invitation_flag = 0; ++ ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); ++ if (attr_contentlen) { ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); ++ /* Commented by Albert 20120510 */ ++ /* Copy to the pwdinfo->p2p_peer_interface_addr. */ ++ /* So that the WFD UI (or Sigma) can get the peer interface address by using the following command. */ ++ /* #> iwpriv wlan0 p2p_get peer_ifa */ ++ /* After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */ ++ ++ if (attr_contentlen) { ++ DBG_88E("[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__, ++ pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], ++ pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3], ++ pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]); ++ } ++ ++ if (invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT) { ++ /* Re-invoke the persistent group. */ ++ ++ memset(&group_id, 0x00, sizeof(struct group_id_info)); ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8 *)&group_id, &attr_contentlen); ++ if (attr_contentlen) { ++ if (!memcmp(group_id.go_device_addr, myid(&padapter->eeprompriv), ETH_ALEN)) { ++ /* The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ status_code = P2P_STATUS_SUCCESS; ++ } else { ++ /* The p2p device sending this p2p invitation request wants to be the persistent GO. */ ++ if (is_matched_in_profilelist(pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[0])) { ++ u8 operatingch_info[5] = { 0x00 }; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) { ++ if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4])) { ++ /* The operating channel is acceptable for this device. */ ++ pwdinfo->rx_invitereq_info.operation_ch[0] = operatingch_info[4]; ++ pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; ++ _set_timer(&pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ status_code = P2P_STATUS_SUCCESS; ++ } else { ++ /* The operating channel isn't supported by this device. */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ status_code = P2P_STATUS_FAIL_NO_COMMON_CH; ++ _set_timer(&pwdinfo->restore_p2p_state_timer, 3000); ++ } ++ } else { ++ /* Commented by Albert 20121130 */ ++ /* Intel will use the different P2P IE to store the operating channel information */ ++ /* Workaround for Intel WiDi 3.5 */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ status_code = P2P_STATUS_SUCCESS; ++ } ++ } else { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH); ++ status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; ++ } ++ } ++ } else { ++ DBG_88E("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__); ++ status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ } ++ } else { ++ /* Received the invitation to join a P2P group. */ ++ ++ memset(&group_id, 0x00, sizeof(struct group_id_info)); ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8 *)&group_id, &attr_contentlen); ++ if (attr_contentlen) { ++ if (!memcmp(group_id.go_device_addr, myid(&padapter->eeprompriv), ETH_ALEN)) { ++ /* In this case, the GO can't be myself. */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH); ++ status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ } else { ++ /* The p2p device sending this p2p invitation request wants to join an existing P2P group */ ++ /* Commented by Albert 2012/06/28 */ ++ /* In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */ ++ /* The peer device address should be the destination address for the provisioning discovery request. */ ++ /* Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */ ++ /* The peer interface address should be the address for WPS mac address */ ++ memcpy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr, ETH_ALEN); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN); ++ status_code = P2P_STATUS_SUCCESS; ++ } ++ } else { ++ DBG_88E("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__); ++ status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ } ++ } ++ } else { ++ DBG_88E("[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__); ++ status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ } ++ ++ DBG_88E("[%s] status_code = %d\n", __func__, status_code); ++ ++ pwdinfo->inviteresp_info.token = frame_body[7]; ++ issue_p2p_invitation_response(padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code); ++ } ++ break; ++ case P2P_INVIT_RESP: { ++ u8 attr_content = 0x00; ++ u32 attr_contentlen = 0; ++ ++ DBG_88E("[%s] Got invite response frame!\n", __func__); ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); ++ if (p2p_ie) { ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); ++ ++ if (attr_contentlen == 1) { ++ DBG_88E("[%s] Status = %d\n", __func__, attr_content); ++ pwdinfo->invitereq_info.benable = false; ++ ++ if (attr_content == P2P_STATUS_SUCCESS) { ++ if (!memcmp(pwdinfo->invitereq_info.go_bssid, myid(&padapter->eeprompriv), ETH_ALEN)) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ } ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_OK); ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); ++ } ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); ++ } ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); ++ } ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL)) ++ _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); ++ break; ++ } ++ case P2P_DEVDISC_REQ: ++ process_p2p_devdisc_req(pwdinfo, pframe, len); ++ break; ++ case P2P_DEVDISC_RESP: ++ process_p2p_devdisc_resp(pwdinfo, pframe, len); ++ break; ++ case P2P_PROVISION_DISC_REQ: ++ DBG_88E("[%s] Got Provisioning Discovery Request Frame\n", __func__); ++ process_p2p_provdisc_req(pwdinfo, pframe, len); ++ memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); ++ ++ /* 20110902 Kurt */ ++ /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ); ++ _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT); ++ break; ++ case P2P_PROVISION_DISC_RESP: ++ /* Commented by Albert 20110707 */ ++ /* Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */ ++ DBG_88E("[%s] Got Provisioning Discovery Response Frame\n", __func__); ++ /* Commented by Albert 20110426 */ ++ /* The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */ ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP); ++ process_p2p_provdisc_resp(pwdinfo, pframe); ++ _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT); ++ break; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ return _SUCCESS; ++} ++ ++static unsigned int on_action_public_vendor(struct recv_frame *precv_frame) ++{ ++ unsigned int ret = _FAIL; ++ u8 *pframe = precv_frame->rx_data; ++ u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (!memcmp(frame_body + 2, P2P_OUI, 4)) { ++ ret = on_action_public_p2p(precv_frame); ++ } ++ ++ return ret; ++} ++ ++static unsigned int on_action_public_default(struct recv_frame *precv_frame, u8 action) ++{ ++ unsigned int ret = _FAIL; ++ u8 *pframe = precv_frame->rx_data; ++ u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); ++ u8 token; ++ ++ token = frame_body[2]; ++ ++ if (rtw_action_public_decache(precv_frame, token) == _FAIL) ++ goto exit; ++ ++ ret = _SUCCESS; ++ ++exit: ++ return ret; ++} ++ ++unsigned int on_action_public(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ unsigned int ret = _FAIL; ++ u8 *pframe = precv_frame->rx_data; ++ u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); ++ u8 category, action; ++ ++ /* check RA matches or not */ ++ if (memcmp(myid(&padapter->eeprompriv), GetAddr1Ptr(pframe), ETH_ALEN)) ++ goto exit; ++ ++ category = frame_body[0]; ++ if (category != RTW_WLAN_CATEGORY_PUBLIC) ++ goto exit; ++ ++ action = frame_body[1]; ++ switch (action) { ++ case ACT_PUBLIC_VENDOR: ++ ret = on_action_public_vendor(precv_frame); ++ break; ++ default: ++ ret = on_action_public_default(precv_frame, action); ++ break; ++ } ++ ++exit: ++ return ret; ++} ++ ++unsigned int OnAction_ht(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ return _SUCCESS; ++} ++ ++unsigned int OnAction_wmm(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ return _SUCCESS; ++} ++ ++unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_P2P ++ u8 *frame_body; ++ u8 category, OUI_Subtype; ++ u8 *pframe = precv_frame->rx_data; ++ uint len = precv_frame->len; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("%s\n", __func__); ++ ++ /* check RA matches or not */ ++ if (memcmp(myid(&padapter->eeprompriv), GetAddr1Ptr(pframe), ETH_ALEN))/* for if1, sta/ap mode */ ++ return _SUCCESS; ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ category = frame_body[0]; ++ if (category != RTW_WLAN_CATEGORY_P2P) ++ return _SUCCESS; ++ ++ if (be32_to_cpu(*((__be32 *)(frame_body + 1))) != P2POUI) ++ return _SUCCESS; ++ ++ len -= sizeof(struct rtw_ieee80211_hdr_3addr); ++ OUI_Subtype = frame_body[5]; ++ ++ switch (OUI_Subtype) { ++ case P2P_NOTICE_OF_ABSENCE: ++ break; ++ case P2P_PRESENCE_REQUEST: ++ process_p2p_presence_req(pwdinfo, pframe, len); ++ break; ++ case P2P_PRESENCE_RESPONSE: ++ break; ++ case P2P_GO_DISC_REQUEST: ++ break; ++ default: ++ break; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ return _SUCCESS; ++} ++ ++unsigned int OnAction(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ int i; ++ unsigned char category; ++ struct action_handler *ptable; ++ unsigned char *frame_body; ++ u8 *pframe = precv_frame->rx_data; ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ category = frame_body[0]; ++ ++ for (i = 0; i < sizeof(OnAction_tbl) / sizeof(struct action_handler); i++) { ++ ptable = &OnAction_tbl[i]; ++ if (category == ptable->num) ++ ptable->func(padapter, precv_frame); ++ } ++ return _SUCCESS; ++} ++ ++unsigned int DoReserved(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ return _SUCCESS; ++} ++ ++struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv) ++{ ++ struct xmit_frame *pmgntframe; ++ struct xmit_buf *pxmitbuf; ++ ++ pmgntframe = rtw_alloc_xmitframe(pxmitpriv); ++ if (!pmgntframe) { ++ DBG_88E("%s, alloc xmitframe fail\n", __func__); ++ return NULL; ++ } ++ ++ pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv); ++ if (!pxmitbuf) { ++ DBG_88E("%s, alloc xmitbuf fail\n", __func__); ++ rtw_free_xmitframe(pxmitpriv, pmgntframe); ++ return NULL; ++ } ++ pmgntframe->frame_tag = MGNT_FRAMETAG; ++ pmgntframe->pxmitbuf = pxmitbuf; ++ pmgntframe->buf_addr = pxmitbuf->pbuf; ++ pxmitbuf->priv_data = pmgntframe; ++ return pmgntframe; ++} ++ ++/**************************************************************************** ++ ++Following are some TX fuctions for WiFi MLME ++ ++*****************************************************************************/ ++ ++void update_mgnt_tx_rate(struct adapter *padapter, u8 rate) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ pmlmeext->tx_rate = rate; ++ DBG_88E("%s(): rate = %x\n", __func__, rate); ++} ++ ++void update_mgntframe_attrib(struct adapter *padapter, struct pkt_attrib *pattrib) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); ++ ++ pattrib->hdrlen = 24; ++ pattrib->nr_frags = 1; ++ pattrib->priority = 7; ++ pattrib->mac_id = 0; ++ pattrib->qsel = 0x12; ++ ++ pattrib->pktlen = 0; ++ ++ if (pmlmeext->cur_wireless_mode & WIRELESS_11B) ++ pattrib->raid = 6;/* b mode */ ++ else ++ pattrib->raid = 5;/* a/g mode */ ++ ++ pattrib->encrypt = _NO_PRIVACY_; ++ pattrib->bswenc = false; ++ ++ pattrib->qos_en = false; ++ pattrib->ht_en = false; ++ pattrib->bwmode = HT_CHANNEL_WIDTH_20; ++ pattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ pattrib->sgi = false; ++ ++ pattrib->seqnum = pmlmeext->mgnt_seq; ++ ++ pattrib->retry_ctrl = true; ++} ++ ++void dump_mgntframe(struct adapter *padapter, struct xmit_frame *pmgntframe) ++{ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ return; ++ ++ rtw_hal_mgnt_xmit(padapter, pmgntframe); ++} ++ ++s32 dump_mgntframe_and_wait(struct adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms) ++{ ++ s32 ret = _FAIL; ++ struct xmit_buf *pxmitbuf = pmgntframe->pxmitbuf; ++ struct submit_ctx sctx; ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ return ret; ++ ++ rtw_sctx_init(&sctx, timeout_ms); ++ pxmitbuf->sctx = &sctx; ++ ++ ret = rtw_hal_mgnt_xmit(padapter, pmgntframe); ++ ++ if (ret == _SUCCESS) ++ ret = rtw_sctx_wait(&sctx); ++ ++ return ret; ++} ++ ++s32 dump_mgntframe_and_wait_ack(struct adapter *padapter, struct xmit_frame *pmgntframe) ++{ ++ s32 ret = _FAIL; ++ u32 timeout_ms = 500;/* 500ms */ ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ return -1; ++ ++ _enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); ++ pxmitpriv->ack_tx = true; ++ ++ pmgntframe->ack_report = 1; ++ if (rtw_hal_mgnt_xmit(padapter, pmgntframe) == _SUCCESS) { ++ ret = rtw_ack_tx_wait(pxmitpriv, timeout_ms); ++ } ++ ++ pxmitpriv->ack_tx = false; ++ _exit_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); ++ ++ return ret; ++} ++ ++static int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode) ++{ ++ u8 *ssid_ie; ++ int ssid_len_ori; ++ int len_diff = 0; ++ ++ ssid_ie = rtw_get_ie(ies, WLAN_EID_SSID, &ssid_len_ori, ies_len); ++ ++ if (ssid_ie && ssid_len_ori > 0) { ++ switch (hidden_ssid_mode) { ++ case 1: { ++ u8 *next_ie = ssid_ie + 2 + ssid_len_ori; ++ u32 remain_len = 0; ++ ++ remain_len = ies_len - (next_ie - ies); ++ ++ ssid_ie[1] = 0; ++ memcpy(ssid_ie + 2, next_ie, remain_len); ++ len_diff -= ssid_len_ori; ++ ++ break; ++ } ++ case 2: ++ memset(&ssid_ie[2], 0, ssid_len_ori); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ return len_diff; ++} ++ ++void issue_beacon(struct adapter *padapter, int timeout_ms) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned int rate_len; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) { ++ DBG_88E("%s, alloc mgnt frame fail\n", __func__); ++ return; ++ } ++#if defined(CONFIG_88EU_AP_MODE) ++ spin_lock_bh(&pmlmepriv->bcn_update_lock); ++#endif /* if defined (CONFIG_88EU_AP_MODE) */ ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ pattrib->qsel = 0x10; ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); ++ /* pmlmeext->mgnt_seq++; */ ++ SetFrameSubType(pframe, WIFI_BEACON); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++#ifdef CONFIG_88EU_P2P ++ /* for P2P : Primary Device Type & Device Name */ ++ u32 wpsielen = 0, insert_len = 0; ++ u8 *wpsie = NULL; ++ wpsie = rtw_get_wps_ie(cur_network->IEs + _FIXED_IE_LENGTH_, cur_network->IELength - _FIXED_IE_LENGTH_, NULL, &wpsielen); ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen > 0) { ++ uint wps_offset, remainder_ielen; ++ u8 *premainder_ie, *pframe_wscie; ++ ++ wps_offset = (uint)(wpsie - cur_network->IEs); ++ premainder_ie = wpsie + wpsielen; ++ remainder_ielen = cur_network->IELength - wps_offset - wpsielen; ++ pframe_wscie = pframe + wps_offset; ++ memcpy(pframe, cur_network->IEs, wps_offset + wpsielen); ++ pframe += (wps_offset + wpsielen); ++ pattrib->pktlen += (wps_offset + wpsielen); ++ ++ /* now pframe is end of wsc ie, insert Primary Device Type & Device Name */ ++ /* Primary Device Type */ ++ /* Type: */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); ++ insert_len += 2; ++ ++ /* Length: */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(0x0008); ++ insert_len += 2; ++ ++ /* Value: */ ++ /* Category ID */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ insert_len += 2; ++ ++ /* OUI */ ++ *(__be32 *)(pframe + insert_len) = cpu_to_be32(WPSOUI); ++ insert_len += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ insert_len += 2; ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ insert_len += 2; ++ ++ /* Length: */ ++ *(__be16 *)(pframe + insert_len) = cpu_to_be16(pwdinfo->device_name_len); ++ insert_len += 2; ++ ++ /* Value: */ ++ memcpy(pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len); ++ insert_len += pwdinfo->device_name_len; ++ ++ /* update wsc ie length */ ++ *(pframe_wscie + 1) = (wpsielen - 2) + insert_len; ++ ++ /* pframe move to end */ ++ pframe += insert_len; ++ pattrib->pktlen += insert_len; ++ ++ /* copy remainder_ie to pframe */ ++ memcpy(pframe, premainder_ie, remainder_ielen); ++ pframe += remainder_ielen; ++ pattrib->pktlen += remainder_ielen; ++ } else ++#endif /* CONFIG_88EU_P2P */ ++ { ++ int len_diff; ++ memcpy(pframe, cur_network->IEs, cur_network->IELength); ++ len_diff = update_hidden_ssid( ++ pframe + _BEACON_IE_OFFSET_ ++ , cur_network->IELength - _BEACON_IE_OFFSET_ ++ , pmlmeinfo->hidden_ssid_mode ++ ); ++ pframe += (cur_network->IELength + len_diff); ++ pattrib->pktlen += (cur_network->IELength + len_diff); ++ } ++ ++ { ++ u8 *wps_ie; ++ uint wps_ielen; ++ u8 sr = 0; ++ wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr + TXDESC_OFFSET + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, ++ pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_, NULL, &wps_ielen); ++ if (wps_ie && wps_ielen > 0) ++ rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); ++ if (sr != 0) ++ set_fwstate(pmlmepriv, WIFI_UNDER_WPS); ++ else ++ _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS); ++ } ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ u32 len; ++ len = build_beacon_p2p_ie(pwdinfo, pframe); ++ ++ pframe += len; ++ pattrib->pktlen += len; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ goto _issue_bcn; ++ } ++ ++ /* below for ad-hoc mode */ ++ ++ /* timestamp will be inserted by hardware */ ++ pframe += 8; ++ pattrib->pktlen += 8; ++ ++ /* beacon interval: 2 bytes */ ++ ++ memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* capability info: 2 bytes */ ++ ++ memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* SSID */ ++ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); ++ ++ /* supported rates... */ ++ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &pattrib->pktlen); ++ ++ /* DS parameter set */ ++ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&cur_network->Configuration.DSConfig, &pattrib->pktlen); ++ ++ { ++ u8 erpinfo = 0; ++ u32 ATIMWindow; ++ /* IBSS Parameter Set... */ ++ ATIMWindow = 0; ++ pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); ++ ++ /* ERP IE */ ++ pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); ++ } ++ ++ /* EXTERNDED SUPPORTED RATE */ ++ if (rate_len > 8) ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); ++ /* todo:HT for adhoc */ ++_issue_bcn: ++ ++#if defined(CONFIG_88EU_AP_MODE) ++ pmlmepriv->update_bcn = false; ++ ++ spin_unlock_bh(&pmlmepriv->bcn_update_lock); ++#endif /* if defined (CONFIG_88EU_AP_MODE) */ ++ ++ if ((pattrib->pktlen + TXDESC_SIZE) > 512) { ++ DBG_88E("beacon frame too large\n"); ++ return; ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ /* DBG_88E("issue bcn_sz=%d\n", pattrib->last_txcmdsz); */ ++ if (timeout_ms > 0) ++ dump_mgntframe_and_wait(padapter, pmgntframe, timeout_ms); ++ else ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned char *mac, *bssid; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++#if defined(CONFIG_88EU_AP_MODE) ++ u8 *pwps_ie; ++ uint wps_ielen; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++#endif /* if defined (CONFIG_88EU_AP_MODE) */ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ unsigned int rate_len; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) { ++ DBG_88E("%s, alloc mgnt frame fail\n", __func__); ++ return; ++ } ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ mac = myid(&padapter->eeprompriv); ++ bssid = cur_network->MacAddress; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, mac, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(fctrl, WIFI_PROBERSP); ++ ++ pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = pattrib->hdrlen; ++ pframe += pattrib->hdrlen; ++ ++ if (cur_network->IELength > MAX_IE_SZ) ++ return; ++ ++#if defined(CONFIG_88EU_AP_MODE) ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ pwps_ie = rtw_get_wps_ie(cur_network->IEs + _FIXED_IE_LENGTH_, cur_network->IELength - _FIXED_IE_LENGTH_, NULL, &wps_ielen); ++ ++ /* inerset & update wps_probe_resp_ie */ ++ if (pmlmepriv->wps_probe_resp_ie && pwps_ie && wps_ielen > 0) { ++ uint wps_offset, remainder_ielen; ++ u8 *premainder_ie; ++ ++ wps_offset = (uint)(pwps_ie - cur_network->IEs); ++ ++ premainder_ie = pwps_ie + wps_ielen; ++ ++ remainder_ielen = cur_network->IELength - wps_offset - wps_ielen; ++ ++ memcpy(pframe, cur_network->IEs, wps_offset); ++ pframe += wps_offset; ++ pattrib->pktlen += wps_offset; ++ ++ wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];/* to get ie data len */ ++ if ((wps_offset + wps_ielen + 2) <= MAX_IE_SZ) { ++ memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen + 2); ++ pframe += wps_ielen + 2; ++ pattrib->pktlen += wps_ielen + 2; ++ } ++ ++ if ((wps_offset + wps_ielen + 2 + remainder_ielen) <= MAX_IE_SZ) { ++ memcpy(pframe, premainder_ie, remainder_ielen); ++ pframe += remainder_ielen; ++ pattrib->pktlen += remainder_ielen; ++ } ++ } else { ++ memcpy(pframe, cur_network->IEs, cur_network->IELength); ++ pframe += cur_network->IELength; ++ pattrib->pktlen += cur_network->IELength; ++ } ++ } else ++#endif ++ { ++ /* timestamp will be inserted by hardware */ ++ pframe += 8; ++ pattrib->pktlen += 8; ++ ++ /* beacon interval: 2 bytes */ ++ ++ memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* capability info: 2 bytes */ ++ ++ memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* below for ad-hoc mode */ ++ ++ /* SSID */ ++ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); ++ ++ /* supported rates... */ ++ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &pattrib->pktlen); ++ ++ /* DS parameter set */ ++ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&cur_network->Configuration.DSConfig, &pattrib->pktlen); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { ++ u8 erpinfo = 0; ++ u32 ATIMWindow; ++ /* IBSS Parameter Set... */ ++ /* ATIMWindow = cur->Configuration.ATIMWindow; */ ++ ATIMWindow = 0; ++ pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); ++ ++ /* ERP IE */ ++ pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); ++ } ++ ++ /* EXTERNDED SUPPORTED RATE */ ++ if (rate_len > 8) ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); ++ /* todo:HT for adhoc */ ++ } ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) { ++ u32 len; ++ len = build_probe_resp_p2p_ie(pwdinfo, pframe); ++ ++ pframe += len; ++ pattrib->pktlen += len; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static int _issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *pssid, u8 *da, int wait_ack) ++{ ++ int ret = _FAIL; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned char *mac; ++ unsigned char bssrate[NumRates]; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ int bssrate_len = 0; ++ u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ mac = myid(&padapter->eeprompriv); ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ if (da) { ++ /* unicast probe request frame */ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, da, ETH_ALEN); ++ } else { ++ /* broadcast probe request frame */ ++ memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); ++ } ++ ++ memcpy(pwlanhdr->addr2, mac, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_PROBEREQ); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (pssid) ++ pframe = rtw_set_ie(pframe, _SSID_IE_, pssid->SsidLength, pssid->Ssid, &pattrib->pktlen); ++ else ++ pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pattrib->pktlen); ++ ++ get_rate_set(padapter, bssrate, &bssrate_len); ++ ++ if (bssrate_len > 8) { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, bssrate, &pattrib->pktlen); ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, bssrate_len - 8, bssrate + 8, &pattrib->pktlen); ++ } else { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, bssrate_len, bssrate, &pattrib->pktlen); ++ } ++ ++ /* add wps_ie for wps2.0 */ ++ if (pmlmepriv->wps_probe_req_ie_len > 0 && pmlmepriv->wps_probe_req_ie) { ++ memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); ++ pframe += pmlmepriv->wps_probe_req_ie_len; ++ pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ if (wait_ack) { ++ ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); ++ } else { ++ dump_mgntframe(padapter, pmgntframe); ++ ret = _SUCCESS; ++ } ++ ++exit: ++ return ret; ++} ++ ++inline void issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *pssid, u8 *da) ++{ ++ _issue_probereq(padapter, pssid, da, false); ++} ++ ++int issue_probereq_ex(struct adapter *padapter, struct ndis_802_11_ssid *pssid, u8 *da, ++ int try_cnt, int wait_ms) ++{ ++ int ret; ++ int i = 0; ++ u32 start = jiffies; ++ ++ do { ++ ret = _issue_probereq(padapter, pssid, da, wait_ms > 0); ++ ++ i++; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) ++ break; ++ ++ if (i < try_cnt && wait_ms > 0 && ret == _FAIL) ++ msleep(wait_ms); ++ ++ } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); ++ ++ if (ret != _FAIL) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ ++ if (try_cnt && wait_ms) { ++ if (da) ++ DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), da, rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ else ++ DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ } ++exit: ++ return ret; ++} ++ ++/* if psta == NULL, indiate we are station(client) now... */ ++void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short status) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned int val32; ++ u16 val16; ++#ifdef CONFIG_88EU_AP_MODE ++ __le16 le_val16; ++#endif ++ int use_shared_key = 0; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_AUTH); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (psta) {/* for AP mode */ ++#ifdef CONFIG_88EU_AP_MODE ++ ++ memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ /* setting auth algo number */ ++ val16 = (u16)psta->authalg; ++ ++ if (status != _STATS_SUCCESSFUL_) ++ val16 = 0; ++ ++ if (val16) { ++ le_val16 = cpu_to_le16(val16); ++ use_shared_key = 1; ++ } else { ++ le_val16 = 0; ++ } ++ ++ pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&le_val16, &pattrib->pktlen); ++ ++ /* setting auth seq number */ ++ val16 = (u16)psta->auth_seq; ++ le_val16 = cpu_to_le16(val16); ++ pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&le_val16, &pattrib->pktlen); ++ ++ /* setting status code... */ ++ val16 = status; ++ le_val16 = cpu_to_le16(val16); ++ pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&le_val16, &pattrib->pktlen); ++ ++ /* added challenging text... */ ++ if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) ++ pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &pattrib->pktlen); ++#endif ++ } else { ++ __le32 le_tmp32; ++ __le16 le_tmp16; ++ memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ /* setting auth algo number */ ++ val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) ? 1 : 0;/* 0:OPEN System, 1:Shared key */ ++ if (val16) ++ use_shared_key = 1; ++ ++ /* setting IV for auth seq #3 */ ++ if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) { ++ val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30)); ++ le_tmp32 = cpu_to_le32(val32); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&le_tmp32, &pattrib->pktlen); ++ ++ pattrib->iv_len = 4; ++ } ++ ++ le_tmp16 = cpu_to_le16(val16); ++ pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&le_tmp16, &pattrib->pktlen); ++ ++ /* setting auth seq number */ ++ val16 = pmlmeinfo->auth_seq; ++ le_tmp16 = cpu_to_le16(val16); ++ pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&le_tmp16, &pattrib->pktlen); ++ ++ /* setting status code... */ ++ le_tmp16 = cpu_to_le16(status); ++ pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&le_tmp16, &pattrib->pktlen); ++ ++ /* then checking to see if sending challenging text... */ ++ if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) { ++ pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &pattrib->pktlen); ++ ++ SetPrivacy(fctrl); ++ ++ pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pattrib->encrypt = _WEP40_; ++ ++ pattrib->icv_len = 4; ++ ++ pattrib->pktlen += pattrib->icv_len; ++ } ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ rtw_wep_encrypt(padapter, (u8 *)pmgntframe); ++ DBG_88E("%s\n", __func__); ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ struct xmit_frame *pmgntframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ struct pkt_attrib *pattrib; ++ unsigned char *pbuf, *pframe; ++ unsigned short val; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network; ++ u8 *ie = pnetwork->IEs; ++ __le16 lestatus, leval; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ DBG_88E("%s\n", __func__); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); ++ memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP)) ++ SetFrameSubType(pwlanhdr, pkt_type); ++ else ++ return; ++ ++ pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen += pattrib->hdrlen; ++ pframe += pattrib->hdrlen; ++ ++ /* capability */ ++ val = *(unsigned short *)rtw_get_capability_from_ie(ie); ++ ++ pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_, (unsigned char *)&val, &pattrib->pktlen); ++ ++ lestatus = cpu_to_le16(status); ++ pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&lestatus, &pattrib->pktlen); ++ ++ leval = cpu_to_le16(pstat->aid | BIT(14) | BIT(15)); ++ pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_, (unsigned char *)&leval, &pattrib->pktlen); ++ ++ if (pstat->bssratelen <= 8) { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &pattrib->pktlen); ++ } else { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &pattrib->pktlen); ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, pstat->bssratelen - 8, pstat->bssrateset + 8, &pattrib->pktlen); ++ } ++ ++ if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) { ++ uint ie_len = 0; ++ ++ /* FILL HT CAP INFO IE */ ++ pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); ++ if (pbuf && ie_len > 0) { ++ memcpy(pframe, pbuf, ie_len + 2); ++ pframe += (ie_len + 2); ++ pattrib->pktlen += (ie_len + 2); ++ } ++ ++ /* FILL HT ADD INFO IE */ ++ pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); ++ if (pbuf && ie_len > 0) { ++ memcpy(pframe, pbuf, ie_len + 2); ++ pframe += (ie_len + 2); ++ pattrib->pktlen += (ie_len + 2); ++ } ++ } ++ ++ /* FILL WMM IE */ ++ if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) { ++ uint ie_len = 0; ++ unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; ++ ++ for (pbuf = ie + _BEACON_IE_OFFSET_;; pbuf += (ie_len + 2)) { ++ pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); ++ if (pbuf && !memcmp(pbuf + 2, WMM_PARA_IE, 6)) { ++ memcpy(pframe, pbuf, ie_len + 2); ++ pframe += (ie_len + 2); ++ pattrib->pktlen += (ie_len + 2); ++ break; ++ } ++ ++ if (!pbuf || ie_len == 0) ++ break; ++ } ++ } ++ ++ if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6, REALTEK_96B_IE, &pattrib->pktlen); ++ ++ /* add WPS IE ie for wps 2.0 */ ++ if (pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len > 0) { ++ memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); ++ ++ pframe += pmlmepriv->wps_assoc_resp_ie_len; ++ pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len; ++ } ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device)) { ++ u32 len; ++ ++ len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); ++ ++ pframe += len; ++ pattrib->pktlen += len; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ dump_mgntframe(padapter, pmgntframe); ++#endif ++} ++ ++void issue_assocreq(struct adapter *padapter) ++{ ++ int ret = _FAIL; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe, *p; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ __le16 le_tmp; ++ unsigned int i, j, ie_len, index = 0; ++ unsigned char rf_type, bssrate[NumRates], sta_bssrate[NumRates]; ++ struct ndis_802_11_var_ie *pIE; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ int bssrate_len = 0, sta_bssrate_len = 0; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 p2pie[255] = { 0x00 }; ++ u16 p2pielen = 0; ++#endif /* CONFIG_88EU_P2P */ ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ASSOCREQ); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* caps */ ++ ++ memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); ++ ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* listen interval */ ++ /* todo: listen interval for power saving */ ++ le_tmp = cpu_to_le16(3); ++ memcpy(pframe, (unsigned char *)&le_tmp, 2); ++ pframe += 2; ++ pattrib->pktlen += 2; ++ ++ /* SSID */ ++ pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &pattrib->pktlen); ++ ++ /* supported rate & extended supported rate */ ++ ++ /* Check if the AP's supported rates are also supported by STA. */ ++ get_rate_set(padapter, sta_bssrate, &sta_bssrate_len); ++ ++ if (pmlmeext->cur_channel == 14)/* for JAPAN, channel 14 can only uses B Mode(CCK) */ ++ sta_bssrate_len = 4; ++ ++ for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { ++ if (pmlmeinfo->network.SupportedRates[i] == 0) ++ break; ++ DBG_88E("network.SupportedRates[%d]=%02X\n", i, pmlmeinfo->network.SupportedRates[i]); ++ } ++ ++ for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { ++ if (pmlmeinfo->network.SupportedRates[i] == 0) ++ break; ++ ++ /* Check if the AP's supported rates are also supported by STA. */ ++ for (j = 0; j < sta_bssrate_len; j++) { ++ /* Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP */ ++ if ((pmlmeinfo->network.SupportedRates[i] | IEEE80211_BASIC_RATE_MASK) ++ == (sta_bssrate[j] | IEEE80211_BASIC_RATE_MASK)) ++ break; ++ } ++ ++ if (j == sta_bssrate_len) { ++ /* the rate is not supported by STA */ ++ DBG_88E("%s(): the rate[%d]=%02X is not supported by STA!\n", __func__, i, pmlmeinfo->network.SupportedRates[i]); ++ } else { ++ /* the rate is supported by STA */ ++ bssrate[index++] = pmlmeinfo->network.SupportedRates[i]; ++ } ++ } ++ ++ bssrate_len = index; ++ DBG_88E("bssrate_len=%d\n", bssrate_len); ++ ++ if (bssrate_len == 0) { ++ rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); ++ rtw_free_xmitframe(pxmitpriv, pmgntframe); ++ goto exit; /* don't connect to AP if no joint supported rate */ ++ } ++ ++ if (bssrate_len > 8) { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, bssrate, &pattrib->pktlen); ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, bssrate_len - 8, bssrate + 8, &pattrib->pktlen); ++ } else { ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, bssrate_len, bssrate, &pattrib->pktlen); ++ } ++ ++ /* RSN */ ++ p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(struct ndis_802_11_fixed_ie)), _RSN_IE_2_, &ie_len, (pmlmeinfo->network.IELength - sizeof(struct ndis_802_11_fixed_ie))); ++ if (p) ++ pframe = rtw_set_ie(pframe, _RSN_IE_2_, ie_len, p + 2, &pattrib->pktlen); ++ ++ /* HT caps */ ++ if (padapter->mlmepriv.htpriv.ht_option) { ++ p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(struct ndis_802_11_fixed_ie)), _HT_CAPABILITY_IE_, &ie_len, (pmlmeinfo->network.IELength - sizeof(struct ndis_802_11_fixed_ie))); ++ if (p && !is_ap_in_tkip(padapter)) { ++ memcpy(&pmlmeinfo->HT_caps, p + 2, sizeof(struct HT_caps_element)); ++ ++ /* to disable 40M Hz support while gd_bw_40MHz_en = 0 */ ++ if (pregpriv->cbw40_enable == 0) ++ pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info &= cpu_to_le16(~(BIT(6) | BIT(1))); ++ else ++ pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(BIT(1)); ++ ++ /* todo: disable SM power save mode */ ++ pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x000c); ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ switch (rf_type) { ++ case RF_1T1R: ++ if (pregpriv->rx_stbc) ++ pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);/* RX STBC One spatial stream */ ++ memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R, 16); ++ break; ++ case RF_2T2R: ++ case RF_1T2R: ++ default: ++ if ((pregpriv->rx_stbc == 0x3) ||/* enable for 2.4/5 GHz */ ++ ((pmlmeext->cur_wireless_mode & WIRELESS_11_24N) && (pregpriv->rx_stbc == 0x1)) || /* enable for 2.4GHz */ ++ (pregpriv->wifi_spec == 1)) { ++ DBG_88E("declare supporting RX STBC\n"); ++ pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0200);/* RX STBC two spatial stream */ ++ } ++ memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_2R, 16); ++ break; ++ } ++ pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, ie_len, (u8 *)(&pmlmeinfo->HT_caps), &pattrib->pktlen); ++ } ++ } ++ ++ /* vendor specific IE, such as WPA, WMM, WPS */ ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < pmlmeinfo->network.IELength;) { ++ pIE = (struct ndis_802_11_var_ie *)(pmlmeinfo->network.IEs + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if ((!memcmp(pIE->data, RTW_WPA_OUI, 4)) || ++ (!memcmp(pIE->data, WMM_OUI, 4)) || ++ (!memcmp(pIE->data, WPS_OUI, 4))) { ++ if (!padapter->registrypriv.wifi_spec) { ++ /* Commented by Kurt 20110629 */ ++ /* In some older APs, WPS handshake */ ++ /* would be fail if we append vender extensions informations to AP */ ++ if (!memcmp(pIE->data, WPS_OUI, 4)) ++ pIE->Length = 14; ++ } ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &pattrib->pktlen); ++ } ++ break; ++ default: ++ break; ++ } ++ i += (pIE->Length + 2); ++ } ++ ++ if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6, REALTEK_96B_IE, &pattrib->pktlen); ++ ++#ifdef CONFIG_88EU_P2P ++ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { ++ /* Should add the P2P IE in the association request frame. */ ++ /* P2P OUI */ ++ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20101109 */ ++ /* According to the P2P Specification, the association request frame should contain 3 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. Extended Listen Timing */ ++ /* 3. Device Info */ ++ /* Commented by Albert 20110516 */ ++ /* 4. P2P Interface */ ++ ++ /* P2P Capability */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; ++ else ++ p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; ++ ++ /* Extended Listen Timing */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Availability Period */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ /* Availability Interval */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); ++ p2pielen += 2; ++ ++ /* Device Info */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ if ((pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) || ++ (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN)) ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); ++ else ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC); ++ ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ *(__be32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ *(__be16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ /* P2P Interface */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_INTERFACE; ++ ++ /* Length: */ ++ *(__le16 *)(p2pie + p2pielen) = cpu_to_le16(0x000D); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Device Address */ ++ p2pielen += ETH_ALEN; ++ ++ p2pie[p2pielen++] = 1; /* P2P Interface Address Count */ ++ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Interface Address List */ ++ p2pielen += ETH_ALEN; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &pattrib->pktlen); ++ } ++ ++#endif /* CONFIG_88EU_P2P */ ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ dump_mgntframe(padapter, pmgntframe); ++ ++ ret = _SUCCESS; ++ ++exit: ++ if (ret == _SUCCESS) ++ rtw_buf_update(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len, (u8 *)pwlanhdr, pattrib->pktlen); ++ else ++ kfree(pmlmepriv->assoc_req); ++} ++ ++/* when wait_ack is ture, this function shoule be called at process context */ ++static int _issue_nulldata(struct adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack) ++{ ++ int ret = _FAIL; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv; ++ struct mlme_ext_priv *pmlmeext; ++ struct mlme_ext_info *pmlmeinfo; ++ ++ if (!padapter) ++ goto exit; ++ ++ pxmitpriv = &padapter->xmitpriv; ++ pmlmeext = &padapter->mlmeextpriv; ++ pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ pattrib->retry_ctrl = false; ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) ++ SetFrDs(fctrl); ++ else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) ++ SetToDs(fctrl); ++ ++ if (power_mode) ++ SetPwrMgt(fctrl); ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_DATA_NULL); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ if (wait_ack) { ++ ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); ++ } else { ++ dump_mgntframe(padapter, pmgntframe); ++ ret = _SUCCESS; ++ } ++ ++exit: ++ return ret; ++} ++ ++/* when wait_ms > 0 , this function shoule be called at process context */ ++/* da == NULL for station mode */ ++int issue_nulldata(struct adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) ++{ ++ int ret; ++ int i = 0; ++ u32 start = jiffies; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ /* da == NULL, assum it's null data for sta to ap*/ ++ if (!da) ++ da = get_my_bssid(&pmlmeinfo->network); ++ ++ do { ++ ret = _issue_nulldata(padapter, da, power_mode, wait_ms > 0); ++ ++ i++; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) ++ break; ++ ++ if (i < try_cnt && wait_ms > 0 && ret == _FAIL) ++ msleep(wait_ms); ++ } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); ++ ++ if (ret != _FAIL) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ ++ if (try_cnt && wait_ms) { ++ if (da) ++ DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), da, rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ else ++ DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ } ++exit: ++ return ret; ++} ++ ++/* when wait_ack is ture, this function shoule be called at process context */ ++static int _issue_qos_nulldata(struct adapter *padapter, unsigned char *da, u16 tid, int wait_ack) ++{ ++ int ret = _FAIL; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ unsigned short *qc; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ DBG_88E("%s\n", __func__); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ pattrib->hdrlen += 2; ++ pattrib->qos_en = true; ++ pattrib->eosp = 1; ++ pattrib->ack_policy = 0; ++ pattrib->mdata = 0; ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) ++ SetFrDs(fctrl); ++ else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) ++ SetToDs(fctrl); ++ ++ if (pattrib->mdata) ++ SetMData(fctrl); ++ ++ qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); ++ ++ SetPriority(qc, tid); ++ ++ SetEOSP(qc, pattrib->eosp); ++ ++ SetAckpolicy(qc, pattrib->ack_policy); ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ if (wait_ack) { ++ ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); ++ } else { ++ dump_mgntframe(padapter, pmgntframe); ++ ret = _SUCCESS; ++ } ++ ++exit: ++ return ret; ++} ++ ++/* when wait_ms > 0 , this function shoule be called at process context */ ++/* da == NULL for station mode */ ++int issue_qos_nulldata(struct adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms) ++{ ++ int ret; ++ int i = 0; ++ u32 start = jiffies; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ /* da == NULL, assum it's null data for sta to ap*/ ++ if (!da) ++ da = get_my_bssid(&pmlmeinfo->network); ++ ++ do { ++ ret = _issue_qos_nulldata(padapter, da, tid, wait_ms > 0); ++ ++ i++; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) ++ break; ++ ++ if (i < try_cnt && wait_ms > 0 && ret == _FAIL) ++ msleep(wait_ms); ++ } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); ++ ++ if (ret != _FAIL) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ ++ if (try_cnt && wait_ms) { ++ if (da) ++ DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), da, rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ else ++ DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ } ++exit: ++ return ret; ++} ++ ++static int _issue_deauth(struct adapter *padapter, unsigned char *da, unsigned short reason, u8 wait_ack) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ int ret = _FAIL; ++ __le16 le_tmp; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++#ifdef CONFIG_88EU_P2P ++ if (!(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) && (pwdinfo->rx_invitereq_info.scan_op_ch_only)) { ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); ++ _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ pattrib->retry_ctrl = false; ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_DEAUTH); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ le_tmp = cpu_to_le16(reason); ++ pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ if (wait_ack) { ++ ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); ++ } else { ++ dump_mgntframe(padapter, pmgntframe); ++ ret = _SUCCESS; ++ } ++ ++exit: ++ return ret; ++} ++ ++int issue_deauth(struct adapter *padapter, unsigned char *da, unsigned short reason) ++{ ++ DBG_88E("%s to %pM\n", __func__, da); ++ return _issue_deauth(padapter, da, reason, false); ++} ++ ++int issue_deauth_ex(struct adapter *padapter, u8 *da, unsigned short reason, int try_cnt, ++ int wait_ms) ++{ ++ int ret; ++ int i = 0; ++ u32 start = jiffies; ++ ++ do { ++ ret = _issue_deauth(padapter, da, reason, wait_ms > 0); ++ ++ i++; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) ++ break; ++ ++ if (i < try_cnt && wait_ms > 0 && ret == _FAIL) ++ msleep(wait_ms); ++ } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); ++ ++ if (ret != _FAIL) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ ++ if (try_cnt && wait_ms) { ++ if (da) ++ DBG_88E(FUNC_ADPT_FMT" to %pM, ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), da, rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ else ++ DBG_88E(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", ++ FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), ++ ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); ++ } ++exit: ++ return ret; ++} ++ ++void issue_action_spct_ch_switch(struct adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ DBG_88E(FUNC_NDEV_FMT" ra =%pM, ch:%u, offset:%u\n", ++ FUNC_NDEV_ARG(padapter->pnetdev), ra, new_ch, ch_offset); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, ra, ETH_ALEN); /* RA */ ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); /* TA */ ++ memcpy(pwlanhdr->addr3, ra, ETH_ALEN); /* DA = RA */ ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* category, action */ ++ { ++ u8 category, action; ++ category = RTW_WLAN_CATEGORY_SPECTRUM_MGMT; ++ action = RTW_WLAN_ACTION_SPCT_CHL_SWITCH; ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ } ++ ++ pframe = rtw_set_ie_ch_switch(pframe, &pattrib->pktlen, 0, new_ch, 0); ++ pframe = rtw_set_ie_secondary_ch_offset(pframe, &pattrib->pktlen, ++ hal_ch_offset_to_secondary_ch_offset(ch_offset)); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) ++{ ++ u8 category = RTW_WLAN_CATEGORY_BACK; ++ u16 start_seq; ++ u16 BA_para_set; ++ u16 reason_code; ++ u16 BA_timeout_value; ++ __le16 le_tmp; ++ u16 BA_starting_seqctrl = 0; ++ enum ht_cap_ampdu_factor max_rx_ampdu_factor; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ u8 *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct sta_info *psta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ ++ DBG_88E("%s, category=%d, action=%d, status=%d\n", __func__, category, action, status); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ /* memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); */ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &(category), &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &(action), &pattrib->pktlen); ++ ++ if (category == 3) { ++ switch (action) { ++ case 0: /* ADDBA req */ ++ do { ++ pmlmeinfo->dialogToken++; ++ } while (pmlmeinfo->dialogToken == 0); ++ pframe = rtw_set_fixed_ie(pframe, 1, &pmlmeinfo->dialogToken, &pattrib->pktlen); ++ ++ BA_para_set = (0x1002 | ((status & 0xf) << 2)); /* immediate ack & 64 buffer size */ ++ le_tmp = cpu_to_le16(BA_para_set); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ ++ BA_timeout_value = 5000;/* 5ms */ ++ le_tmp = cpu_to_le16(BA_timeout_value); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ ++ psta = rtw_get_stainfo(pstapriv, raddr); ++ if (psta) { ++ start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07] & 0xfff) + 1; ++ ++ DBG_88E("BA_starting_seqctrl=%d for TID=%d\n", start_seq, status & 0x07); ++ ++ psta->BA_starting_seqctrl[status & 0x07] = start_seq; ++ ++ BA_starting_seqctrl = start_seq << 4; ++ } ++ le_tmp = cpu_to_le16(BA_starting_seqctrl); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ break; ++ case 1: /* ADDBA rsp */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &pmlmeinfo->ADDBA_req.dialog_token, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&status, &pattrib->pktlen); ++ BA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f; ++ rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); ++ switch (max_rx_ampdu_factor) { ++ case MAX_AMPDU_FACTOR_64K: ++ BA_para_set |= 0x1000; /* 64 buffer size */ ++ break; ++ case MAX_AMPDU_FACTOR_32K: ++ BA_para_set |= 0x0800; /* 32 buffer size */ ++ break; ++ case MAX_AMPDU_FACTOR_16K: ++ BA_para_set |= 0x0400; /* 16 buffer size */ ++ break; ++ case MAX_AMPDU_FACTOR_8K: ++ BA_para_set |= 0x0200; /* 8 buffer size */ ++ break; ++ default: ++ BA_para_set |= 0x1000; /* 64 buffer size */ ++ break; ++ } ++ ++ if (pregpriv->ampdu_amsdu == 0)/* disabled */ ++ BA_para_set = BA_para_set & ~BIT(0); ++ else if (pregpriv->ampdu_amsdu == 1)/* enabled */ ++ BA_para_set = BA_para_set | BIT(0); ++ le_tmp = cpu_to_le16(BA_para_set); ++ ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeinfo->ADDBA_req.BA_timeout_value, &pattrib->pktlen); ++ break; ++ case 2:/* DELBA */ ++ BA_para_set = (status & 0x1F) << 3; ++ le_tmp = cpu_to_le16(BA_para_set); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ ++ reason_code = 37;/* Requested from peer STA as it does not want to use the mechanism */ ++ le_tmp = cpu_to_le16(reason_code); ++ pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_action_BSSCoexistPacket(struct adapter *padapter) ++{ ++ struct list_head *plist, *phead; ++ unsigned char category, action; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct wlan_network *pnetwork = NULL; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ u8 InfoContent[16] = {0}; ++ u8 ICS[8][15]; ++ if ((pmlmepriv->num_FortyMHzIntolerant == 0) || (pmlmepriv->num_sta_no_ht == 0)) ++ return; ++ ++ if (pmlmeinfo->bwmode_updated) ++ return; ++ ++ DBG_88E("%s\n", __func__); ++ ++ category = RTW_WLAN_CATEGORY_PUBLIC; ++ action = ACT_PUBLIC_BSSCOEXIST; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ ++ /* */ ++ if (pmlmepriv->num_FortyMHzIntolerant > 0) { ++ u8 iedata = 0; ++ ++ iedata |= BIT(2);/* 20 MHz BSS Width Request */ ++ ++ pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &pattrib->pktlen); ++ } ++ ++ /* */ ++ memset(ICS, 0, sizeof(ICS)); ++ if (pmlmepriv->num_sta_no_ht > 0) { ++ int i; ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ int len; ++ u8 *p; ++ struct wlan_bssid_ex *pbss_network; ++ ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ plist = plist->next; ++ ++ pbss_network = (struct wlan_bssid_ex *)&pnetwork->network; ++ ++ p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_); ++ if (!p || len == 0) { /* non-HT */ ++ if ((pbss_network->Configuration.DSConfig <= 0) || (pbss_network->Configuration.DSConfig > 14)) ++ continue; ++ ++ ICS[0][pbss_network->Configuration.DSConfig] = 1; ++ ++ if (ICS[0][0] == 0) ++ ICS[0][0] = 1; ++ } ++ } ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ for (i = 0; i < 8; i++) { ++ if (ICS[i][0] == 1) { ++ int j, k = 0; ++ ++ InfoContent[k] = i; ++ /* SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent, i); */ ++ k++; ++ ++ for (j = 1; j <= 14; j++) { ++ if (ICS[i][j] == 1) { ++ if (k < 16) { ++ InfoContent[k] = j; /* channel number */ ++ /* SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); */ ++ k++; ++ } ++ } ++ } ++ ++ pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &pattrib->pktlen); ++ } ++ } ++ } ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++unsigned int send_delba(struct adapter *padapter, u8 initiator, u8 *addr) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct sta_info *psta = NULL; ++ /* struct recv_reorder_ctrl *preorder_ctrl; */ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u16 tid; ++ ++ if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) ++ if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) ++ return _SUCCESS; ++ ++ psta = rtw_get_stainfo(pstapriv, addr); ++ if (!psta) ++ return _SUCCESS; ++ ++ if (initiator == 0) { /* recipient */ ++ for (tid = 0; tid < MAXTID; tid++) { ++ if (psta->recvreorder_ctrl[tid].enable) { ++ DBG_88E("rx agg disable tid(%d)\n", tid); ++ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); ++ psta->recvreorder_ctrl[tid].enable = false; ++ psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; ++ } ++ } ++ } else if (initiator == 1) { /* originator */ ++ for (tid = 0; tid < MAXTID; tid++) { ++ if (psta->htpriv.agg_enable_bitmap & BIT(tid)) { ++ DBG_88E("tx agg disable tid(%d)\n", tid); ++ issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); ++ psta->htpriv.agg_enable_bitmap &= ~BIT(tid); ++ psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); ++ } ++ } ++ } ++ ++ return _SUCCESS; ++} ++ ++unsigned int send_beacon(struct adapter *padapter) ++{ ++ u8 bxmitok = false; ++ int issue = 0; ++ int poll = 0; ++ ++ u32 start = jiffies; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); ++ do { ++ issue_beacon(padapter, 100); ++ issue++; ++ do { ++ yield(); ++ rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok)); ++ poll++; ++ } while ((poll % 10) != 0 && !bxmitok && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); ++ } while (!bxmitok && issue < 100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ return _FAIL; ++ if (!bxmitok) { ++ DBG_88E("%s fail! %u ms\n", __func__, rtw_get_passing_time_ms(start)); ++ return _FAIL; ++ } else { ++ u32 passing_time = rtw_get_passing_time_ms(start); ++ ++ if (passing_time > 100 || issue > 3) ++ DBG_88E("%s success, issue:%d, poll:%d, %u ms\n", __func__, issue, poll, rtw_get_passing_time_ms(start)); ++ return _SUCCESS; ++ } ++} ++ ++/**************************************************************************** ++ ++Following are some utitity fuctions for WiFi MLME ++ ++*****************************************************************************/ ++ ++void site_survey(struct adapter *padapter) ++{ ++ unsigned char survey_channel = 0, val8; ++ enum rt_scan_type ScanType = SCAN_PASSIVE; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u32 initialgain = 0; ++ ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only)) { ++ if (pwdinfo->rx_invitereq_info.scan_op_ch_only) { ++ survey_channel = pwdinfo->rx_invitereq_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx]; ++ } else { ++ survey_channel = pwdinfo->p2p_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx]; ++ } ++ ScanType = SCAN_ACTIVE; ++ } else if (rtw_p2p_findphase_ex_is_social(pwdinfo)) { ++ /* Commented by Albert 2011/06/03 */ ++ /* The driver is in the find phase, it should go through the social channel. */ ++ int ch_set_idx; ++ survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx]; ++ ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, survey_channel); ++ if (ch_set_idx >= 0) ++ ScanType = pmlmeext->channel_set[ch_set_idx].ScanType; ++ else ++ ScanType = SCAN_ACTIVE; ++ } else ++#endif /* CONFIG_88EU_P2P */ ++ { ++ struct rtw_ieee80211_channel *ch; ++ if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) { ++ ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx]; ++ survey_channel = ch->hw_value; ++ ScanType = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE; ++ } ++ } ++ ++ if (survey_channel != 0) { ++ /* PAUSE 4-AC Queue when site_survey */ ++ /* rtw_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */ ++ /* val8 |= 0x0f; */ ++ /* rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */ ++ if (pmlmeext->sitesurvey_res.channel_idx == 0) ++ set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ else ++ SelectChannel(padapter, survey_channel); ++ ++ if (ScanType == SCAN_ACTIVE) { /* obey the channel plan setting... */ ++ #ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || ++ rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) { ++ issue_probereq_p2p(padapter, NULL); ++ issue_probereq_p2p(padapter, NULL); ++ issue_probereq_p2p(padapter, NULL); ++ } else ++ #endif /* CONFIG_88EU_P2P */ ++ { ++ int i; ++ for (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) { ++ if (pmlmeext->sitesurvey_res.ssid[i].SsidLength) { ++ /* todo: to issue two probe req??? */ ++ issue_probereq(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL); ++ /* msleep(SURVEY_TO>>1); */ ++ issue_probereq(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL); ++ } ++ } ++ ++ if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) { ++ /* todo: to issue two probe req??? */ ++ issue_probereq(padapter, NULL, NULL); ++ /* msleep(SURVEY_TO>>1); */ ++ issue_probereq(padapter, NULL, NULL); ++ } ++ } ++ } ++ ++ set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); ++ } else { ++ /* channel number is 0 or this channel is not valid. */ ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) { ++ if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only)) { ++ /* Set the find_phase_state_exchange_cnt to P2P_FINDPHASE_EX_CNT. */ ++ /* This will let the following flow to run the scanning end. */ ++ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX); ++ } ++ } ++ ++ if (rtw_p2p_findphase_ex_is_needed(pwdinfo)) { ++ /* Set the P2P State to the listen state of find phase and set the current channel to the listen channel */ ++ set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN); ++ pmlmeext->sitesurvey_res.state = SCAN_DISABLE; ++ ++ initialgain = 0xff; /* restore RX GAIN */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); ++ /* turn on dynamic functions */ ++ Restore_DM_Func_Flag(padapter); ++ /* Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, true); */ ++ ++ _set_timer(&pwdinfo->find_phase_timer, (u32)((u32)(pwdinfo->listen_dwell) * 100)); ++ } else ++#endif /* CONFIG_88EU_P2P */ ++ { ++ /* 20100721:Interrupt scan operation here. */ ++ /* For SW antenna diversity before link, it needs to switch to another antenna and scan again. */ ++ /* It compares the scan result and select beter one to do connection. */ ++ if (rtw_hal_antdiv_before_linked(padapter)) { ++ pmlmeext->sitesurvey_res.bss_cnt = 0; ++ pmlmeext->sitesurvey_res.channel_idx = -1; ++ pmlmeext->chan_scan_time = SURVEY_TO / 2; ++ set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); ++ return; ++ } ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) ++ rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); ++ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); ++#endif /* CONFIG_88EU_P2P */ ++ ++ pmlmeext->sitesurvey_res.state = SCAN_COMPLETE; ++ ++ /* switch back to the original channel */ ++ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN)) ++ set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ else ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++#endif /* CONFIG_88EU_P2P */ ++ ++ /* flush 4-AC Queue after site_survey */ ++ /* val8 = 0; */ ++ /* rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); */ ++ ++ /* config MSR */ ++ Set_MSR(padapter, (pmlmeinfo->state & 0x3)); ++ ++ initialgain = 0xff; /* restore RX GAIN */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); ++ /* turn on dynamic functions */ ++ Restore_DM_Func_Flag(padapter); ++ /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); */ ++ ++ if (is_client_associated_to_ap(padapter)) ++ issue_nulldata(padapter, NULL, 0, 3, 500); ++ ++ val8 = 0; /* survey done */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); ++ ++ report_surveydone_event(padapter); ++ ++ pmlmeext->chan_scan_time = SURVEY_TO; ++ pmlmeext->sitesurvey_res.state = SCAN_DISABLE; ++ ++ issue_action_BSSCoexistPacket(padapter); ++ issue_action_BSSCoexistPacket(padapter); ++ issue_action_BSSCoexistPacket(padapter); ++ } ++ } ++} ++ ++/* collect bss info from Beacon and Probe request/response frames. */ ++u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, struct wlan_bssid_ex *bssid) ++{ ++ int i; ++ u32 len; ++ u8 *p; ++ u16 val16, subtype; ++ u8 *pframe = precv_frame->rx_data; ++ u32 packet_len = precv_frame->len; ++ u8 ie_offset; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ __le32 le32_tmp; ++ ++ len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (len > MAX_IE_SZ) ++ return _FAIL; ++ ++ memset(bssid, 0, sizeof(struct wlan_bssid_ex)); ++ ++ subtype = GetFrameSubType(pframe); ++ ++ if (subtype == WIFI_BEACON) { ++ bssid->Reserved[0] = 1; ++ ie_offset = _BEACON_IE_OFFSET_; ++ } else { ++ /* FIXME : more type */ ++ if (subtype == WIFI_PROBEREQ) { ++ ie_offset = _PROBEREQ_IE_OFFSET_; ++ bssid->Reserved[0] = 2; ++ } else if (subtype == WIFI_PROBERSP) { ++ ie_offset = _PROBERSP_IE_OFFSET_; ++ bssid->Reserved[0] = 3; ++ } else { ++ bssid->Reserved[0] = 0; ++ ie_offset = _FIXED_IE_LENGTH_; ++ } ++ } ++ ++ bssid->Length = sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + len; ++ ++ /* below is to copy the information element */ ++ bssid->IELength = len; ++ memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength); ++ ++ /* get the signal strength */ ++ bssid->Rssi = precv_frame->attrib.phy_info.recvpower; /* in dBM.raw data */ ++ bssid->PhyInfo.SignalQuality = precv_frame->attrib.phy_info.SignalQuality;/* in percentage */ ++ bssid->PhyInfo.SignalStrength = precv_frame->attrib.phy_info.SignalStrength;/* in percentage */ ++ rtw_hal_get_def_var(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); ++ ++ /* checking SSID */ ++ p = rtw_get_ie(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset); ++ if (!p) { ++ DBG_88E("marc: cannot find SSID for survey event\n"); ++ return _FAIL; ++ } ++ ++ if (*(p + 1)) { ++ if (len > NDIS_802_11_LENGTH_SSID) { ++ DBG_88E("%s()-%d: IE too long (%d) for survey event\n", __func__, __LINE__, len); ++ return _FAIL; ++ } ++ memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); ++ bssid->Ssid.SsidLength = *(p + 1); ++ } else { ++ bssid->Ssid.SsidLength = 0; ++ } ++ ++ memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); ++ ++ /* checking rate info... */ ++ i = 0; ++ p = rtw_get_ie(bssid->IEs + ie_offset, _SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset); ++ if (p) { ++ if (len > NDIS_802_11_LENGTH_RATES_EX) { ++ DBG_88E("%s()-%d: IE too long (%d) for survey event\n", __func__, __LINE__, len); ++ return _FAIL; ++ } ++ memcpy(bssid->SupportedRates, (p + 2), len); ++ i = len; ++ } ++ ++ p = rtw_get_ie(bssid->IEs + ie_offset, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset); ++ if (p) { ++ if (len > (NDIS_802_11_LENGTH_RATES_EX - i)) { ++ DBG_88E("%s()-%d: IE too long (%d) for survey event\n", __func__, __LINE__, len); ++ return _FAIL; ++ } ++ memcpy(bssid->SupportedRates + i, (p + 2), len); ++ } ++ ++ /* todo: */ ++ bssid->NetworkTypeInUse = Ndis802_11OFDM24; ++ ++ if (bssid->IELength < 12) ++ return _FAIL; ++ ++ /* Checking for DSConfig */ ++ p = rtw_get_ie(bssid->IEs + ie_offset, _DSSET_IE_, &len, bssid->IELength - ie_offset); ++ ++ bssid->Configuration.DSConfig = 0; ++ bssid->Configuration.Length = 0; ++ ++ if (p) { ++ bssid->Configuration.DSConfig = *(p + 2); ++ } else {/* In 5G, some ap do not have DSSET IE */ ++ /* checking HT info for channel */ ++ p = rtw_get_ie(bssid->IEs + ie_offset, _HT_ADD_INFO_IE_, &len, bssid->IELength - ie_offset); ++ if (p) { ++ struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2); ++ bssid->Configuration.DSConfig = HT_info->primary_channel; ++ } else { /* use current channel */ ++ bssid->Configuration.DSConfig = rtw_get_oper_ch(padapter); ++ } ++ } ++ ++ memcpy(&le32_tmp, rtw_get_beacon_interval_from_ie(bssid->IEs), 2); ++ bssid->Configuration.BeaconPeriod = le32_to_cpu(le32_tmp); ++ ++ val16 = rtw_get_capability((struct wlan_bssid_ex *)bssid); ++ ++ if (val16 & BIT(0)) { ++ bssid->InfrastructureMode = Ndis802_11Infrastructure; ++ memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); ++ } else { ++ bssid->InfrastructureMode = Ndis802_11IBSS; ++ memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN); ++ } ++ ++ if (val16 & BIT(4)) ++ bssid->Privacy = 1; ++ else ++ bssid->Privacy = 0; ++ ++ bssid->Configuration.ATIMWindow = 0; ++ ++ /* 20/40 BSS Coexistence check */ ++ if ((pregistrypriv->wifi_spec == 1) && (!pmlmeinfo->bwmode_updated)) { ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ p = rtw_get_ie(bssid->IEs + ie_offset, _HT_CAPABILITY_IE_, &len, bssid->IELength - ie_offset); ++ if (p && len > 0) { ++ struct HT_caps_element *pHT_caps; ++ pHT_caps = (struct HT_caps_element *)(p + 2); ++ ++ if (le16_to_cpu(pHT_caps->u.HT_cap_element.HT_caps_info) & BIT(14)) ++ pmlmepriv->num_FortyMHzIntolerant++; ++ } else { ++ pmlmepriv->num_sta_no_ht++; ++ } ++ } ++ ++ /* mark bss info receiving from nearby channel as SignalQuality 101 */ ++ if (bssid->Configuration.DSConfig != rtw_get_oper_ch(padapter)) ++ bssid->PhyInfo.SignalQuality = 101; ++ return _SUCCESS; ++} ++ ++void start_create_ibss(struct adapter *padapter) ++{ ++ unsigned short caps; ++ u8 val8; ++ u8 join_type; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); ++ pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; ++ pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); ++ ++ /* update wireless mode */ ++ update_wireless_mode(padapter); ++ ++ /* udpate capability */ ++ caps = rtw_get_capability((struct wlan_bssid_ex *)pnetwork); ++ update_capinfo(padapter, caps); ++ if (caps & cap_IBSS) {/* adhoc master */ ++ val8 = 0xcf; ++ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); ++ ++ /* switch channel */ ++ /* SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); */ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ ++ beacon_timing_control(padapter); ++ ++ /* set msr to WIFI_FW_ADHOC_STATE */ ++ pmlmeinfo->state = WIFI_FW_ADHOC_STATE; ++ Set_MSR(padapter, (pmlmeinfo->state & 0x3)); ++ ++ /* issue beacon */ ++ if (send_beacon(padapter) == _FAIL) { ++ report_join_res(padapter, -1); ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ } else { ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); ++ join_type = 0; ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); ++ ++ report_join_res(padapter, 1); ++ pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; ++ rtw_indicate_connect(padapter); ++ } ++ } else { ++ DBG_88E("start_create_ibss, invalid cap:%x\n", caps); ++ return; ++ } ++ /* update bc/mc sta_info */ ++ update_bmc_sta(padapter); ++} ++ ++void start_clnt_join(struct adapter *padapter) ++{ ++ unsigned short caps; ++ u8 val8; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); ++ int beacon_timeout; ++ ++ pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; ++ pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); ++ ++ /* update wireless mode */ ++ update_wireless_mode(padapter); ++ ++ /* udpate capability */ ++ caps = rtw_get_capability((struct wlan_bssid_ex *)pnetwork); ++ update_capinfo(padapter, caps); ++ if (caps & cap_ESS) { ++ Set_MSR(padapter, WIFI_FW_STATION_STATE); ++ ++ val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) ? 0xcc : 0xcf; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); ++ ++ /* switch channel */ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ ++ /* here wait for receiving the beacon to start auth */ ++ /* and enable a timer */ ++ beacon_timeout = decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval); ++ set_link_timer(pmlmeext, beacon_timeout); ++ _set_timer(&padapter->mlmepriv.assoc_timer, ++ (REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO * REASSOC_LIMIT) + beacon_timeout); ++ ++ pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; ++ } else if (caps & cap_IBSS) { /* adhoc client */ ++ Set_MSR(padapter, WIFI_FW_ADHOC_STATE); ++ ++ val8 = 0xcf; ++ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); ++ ++ /* switch channel */ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ ++ beacon_timing_control(padapter); ++ ++ pmlmeinfo->state = WIFI_FW_ADHOC_STATE; ++ ++ report_join_res(padapter, 1); ++ } else { ++ return; ++ } ++} ++ ++void start_clnt_auth(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ pmlmeinfo->state &= (~WIFI_FW_AUTH_NULL); ++ pmlmeinfo->state |= WIFI_FW_AUTH_STATE; ++ ++ pmlmeinfo->auth_seq = 1; ++ pmlmeinfo->reauth_count = 0; ++ pmlmeinfo->reassoc_count = 0; ++ pmlmeinfo->link_count = 0; ++ pmlmeext->retry = 0; ++ ++ /* Because of AP's not receiving deauth before */ ++ /* AP may: 1)not response auth or 2)deauth us after link is complete */ ++ /* issue deauth before issuing auth to deal with the situation */ ++ /* Commented by Albert 2012/07/21 */ ++ /* For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it. */ ++ issue_deauth(padapter, (&pmlmeinfo->network)->MacAddress, WLAN_REASON_DEAUTH_LEAVING); ++ ++ DBG_88E_LEVEL(_drv_info_, "start auth\n"); ++ issue_auth(padapter, NULL, 0); ++ ++ set_link_timer(pmlmeext, REAUTH_TO); ++} ++ ++void start_clnt_assoc(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ pmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE)); ++ pmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE); ++ ++ issue_assocreq(padapter); ++ ++ set_link_timer(pmlmeext, REASSOC_TO); ++} ++ ++unsigned int receive_disconnect(struct adapter *padapter, unsigned char *MacAddr, unsigned short reason) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ /* check A3 */ ++ if (!(!memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) ++ return _SUCCESS; ++ ++ DBG_88E("%s\n", __func__); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { ++ if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ report_del_sta_event(padapter, MacAddr, reason); ++ } else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) { ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ report_join_res(padapter, -2); ++ } ++ } ++ return _SUCCESS; ++} ++ ++static void process_80211d(struct adapter *padapter, struct wlan_bssid_ex *bssid) ++{ ++ struct registry_priv *pregistrypriv; ++ struct mlme_ext_priv *pmlmeext; ++ struct rt_channel_info *chplan_new; ++ u8 channel; ++ u8 i; ++ ++ pregistrypriv = &padapter->registrypriv; ++ pmlmeext = &padapter->mlmeextpriv; ++ ++ /* Adjust channel plan by AP Country IE */ ++ if (pregistrypriv->enable80211d && ++ (!pmlmeext->update_channel_plan_by_ap_done)) { ++ u8 *ie, *p; ++ u32 len; ++ struct rt_channel_plan chplan_ap; ++ struct rt_channel_info chplan_sta[MAX_CHANNEL_NUM]; ++ u8 country[4]; ++ u8 fcn; /* first channel number */ ++ u8 noc; /* number of channel */ ++ u8 j, k; ++ ++ ie = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _COUNTRY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (!ie) ++ return; ++ if (len < 6) ++ return; ++ ie += 2; ++ p = ie; ++ ie += len; ++ ++ memset(country, 0, 4); ++ memcpy(country, p, 3); ++ p += 3; ++ ++ i = 0; ++ while ((ie - p) >= 3) { ++ fcn = *(p++); ++ noc = *(p++); ++ p++; ++ ++ for (j = 0; j < noc; j++) { ++ channel = fcn + j; ++ chplan_ap.Channel[i++] = channel; ++ } ++ } ++ chplan_ap.Len = i; ++ ++ memcpy(chplan_sta, pmlmeext->channel_set, sizeof(chplan_sta)); ++ ++ memset(pmlmeext->channel_set, 0, sizeof(pmlmeext->channel_set)); ++ chplan_new = pmlmeext->channel_set; ++ ++ i = 0; ++ j = 0; ++ k = 0; ++ if (pregistrypriv->wireless_mode & WIRELESS_11G) { ++ do { ++ if ((i == MAX_CHANNEL_NUM) || ++ (chplan_sta[i].ChannelNum == 0)) ++ break; ++ ++ if (j == chplan_ap.Len) ++ break; ++ ++ if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) { ++ chplan_new[k].ChannelNum = chplan_ap.Channel[j]; ++ chplan_new[k].ScanType = SCAN_ACTIVE; ++ i++; ++ j++; ++ k++; ++ } else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) { ++ chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; ++ chplan_new[k].ScanType = SCAN_PASSIVE; ++ i++; ++ k++; ++ } else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) { ++ chplan_new[k].ChannelNum = chplan_ap.Channel[j]; ++ chplan_new[k].ScanType = SCAN_ACTIVE; ++ j++; ++ k++; ++ } ++ } while (1); ++ ++ /* change AP not support channel to Passive scan */ ++ while ((i < MAX_CHANNEL_NUM) && ++ (chplan_sta[i].ChannelNum != 0) && ++ (chplan_sta[i].ChannelNum <= 14)) { ++ chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; ++ chplan_new[k].ScanType = SCAN_PASSIVE; ++ i++; ++ k++; ++ } ++ ++ /* add channel AP supported */ ++ while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) { ++ chplan_new[k].ChannelNum = chplan_ap.Channel[j]; ++ chplan_new[k].ScanType = SCAN_ACTIVE; ++ j++; ++ k++; ++ } ++ } else { ++ /* keep original STA 2.4G channel plan */ ++ while ((i < MAX_CHANNEL_NUM) && ++ (chplan_sta[i].ChannelNum != 0) && ++ (chplan_sta[i].ChannelNum <= 14)) { ++ chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; ++ chplan_new[k].ScanType = chplan_sta[i].ScanType; ++ i++; ++ k++; ++ } ++ ++ /* skip AP 2.4G channel plan */ ++ while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) ++ j++; ++ } ++ ++ /* keep original STA 5G channel plan */ ++ while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) { ++ chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; ++ chplan_new[k].ScanType = chplan_sta[i].ScanType; ++ i++; ++ k++; ++ } ++ ++ pmlmeext->update_channel_plan_by_ap_done = 1; ++ } ++ ++ /* If channel is used by AP, set channel scan type to active */ ++ channel = bssid->Configuration.DSConfig; ++ chplan_new = pmlmeext->channel_set; ++ i = 0; ++ while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0)) { ++ if (chplan_new[i].ChannelNum == channel) { ++ if (chplan_new[i].ScanType == SCAN_PASSIVE) ++ chplan_new[i].ScanType = SCAN_ACTIVE; ++ break; ++ } ++ i++; ++ } ++} ++ ++/**************************************************************************** ++ ++Following are the functions to report events ++ ++*****************************************************************************/ ++ ++void report_survey_event(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ struct cmd_obj *pcmd_obj; ++ u8 *pevtcmd; ++ u32 cmdsz; ++ struct survey_event *psurvey_evt; ++ struct C2HEvent_Header *pc2h_evt_hdr; ++ struct mlme_ext_priv *pmlmeext; ++ struct cmd_priv *pcmdpriv; ++ /* u8 *pframe = precv_frame->rx_data; */ ++ /* uint len = precv_frame->len; */ ++ ++ if (!padapter) ++ return; ++ ++ pmlmeext = &padapter->mlmeextpriv; ++ pcmdpriv = &padapter->cmdpriv; ++ ++ pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmd_obj) ++ return; ++ ++ cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header)); ++ pevtcmd = kzalloc(cmdsz, GFP_ATOMIC); ++ if (!pevtcmd) { ++ kfree(pcmd_obj); ++ return; ++ } ++ ++ INIT_LIST_HEAD(&pcmd_obj->list); ++ ++ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); ++ pcmd_obj->cmdsz = cmdsz; ++ pcmd_obj->parmbuf = pevtcmd; ++ ++ pcmd_obj->rsp = NULL; ++ pcmd_obj->rspsz = 0; ++ ++ pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); ++ pc2h_evt_hdr->len = sizeof(struct survey_event); ++ pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey); ++ pc2h_evt_hdr->seq = atomic_inc_return(&pmlmeext->event_seq); ++ ++ psurvey_evt = (struct survey_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); ++ ++ if (collect_bss_info(padapter, precv_frame, (struct wlan_bssid_ex *)&psurvey_evt->bss) == _FAIL) { ++ kfree(pcmd_obj); ++ kfree(pevtcmd); ++ return; ++ } ++ ++ process_80211d(padapter, &psurvey_evt->bss); ++ ++ rtw_enqueue_cmd(pcmdpriv, pcmd_obj); ++ ++ pmlmeext->sitesurvey_res.bss_cnt++; ++} ++ ++void report_surveydone_event(struct adapter *padapter) ++{ ++ struct cmd_obj *pcmd_obj; ++ u8 *pevtcmd; ++ u32 cmdsz; ++ struct surveydone_event *psurveydone_evt; ++ struct C2HEvent_Header *pc2h_evt_hdr; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmd_obj) ++ return; ++ ++ cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header)); ++ pevtcmd = kzalloc(cmdsz, GFP_KERNEL); ++ if (!pevtcmd) { ++ kfree(pcmd_obj); ++ return; ++ } ++ ++ INIT_LIST_HEAD(&pcmd_obj->list); ++ ++ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); ++ pcmd_obj->cmdsz = cmdsz; ++ pcmd_obj->parmbuf = pevtcmd; ++ ++ pcmd_obj->rsp = NULL; ++ pcmd_obj->rspsz = 0; ++ ++ pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); ++ pc2h_evt_hdr->len = sizeof(struct surveydone_event); ++ pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone); ++ pc2h_evt_hdr->seq = atomic_inc_return(&pmlmeext->event_seq); ++ ++ psurveydone_evt = (struct surveydone_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); ++ psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt; ++ ++ DBG_88E("survey done event(%x)\n", psurveydone_evt->bss_cnt); ++ ++ rtw_enqueue_cmd(pcmdpriv, pcmd_obj); ++} ++ ++void report_join_res(struct adapter *padapter, int res) ++{ ++ struct cmd_obj *pcmd_obj; ++ u8 *pevtcmd; ++ u32 cmdsz; ++ struct joinbss_event *pjoinbss_evt; ++ struct C2HEvent_Header *pc2h_evt_hdr; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!pcmd_obj) ++ return; ++ ++ cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); ++ pevtcmd = kzalloc(cmdsz, GFP_ATOMIC); ++ if (!pevtcmd) { ++ kfree(pcmd_obj); ++ return; ++ } ++ ++ INIT_LIST_HEAD(&pcmd_obj->list); ++ ++ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); ++ pcmd_obj->cmdsz = cmdsz; ++ pcmd_obj->parmbuf = pevtcmd; ++ ++ pcmd_obj->rsp = NULL; ++ pcmd_obj->rspsz = 0; ++ ++ pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); ++ pc2h_evt_hdr->len = sizeof(struct joinbss_event); ++ pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss); ++ pc2h_evt_hdr->seq = atomic_inc_return(&pmlmeext->event_seq); ++ ++ pjoinbss_evt = (struct joinbss_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); ++ memcpy((unsigned char *)(&pjoinbss_evt->network.network), &pmlmeinfo->network, sizeof(struct wlan_bssid_ex)); ++ pjoinbss_evt->network.join_res = res; ++ pjoinbss_evt->network.aid = res; ++ ++ DBG_88E("report_join_res(%d)\n", res); ++ ++ rtw_joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); ++ ++ rtw_enqueue_cmd(pcmdpriv, pcmd_obj); ++} ++ ++void report_del_sta_event(struct adapter *padapter, unsigned char *MacAddr, unsigned short reason) ++{ ++ struct cmd_obj *pcmd_obj; ++ u8 *pevtcmd; ++ u32 cmdsz; ++ struct sta_info *psta; ++ int mac_id; ++ struct stadel_event *pdel_sta_evt; ++ struct C2HEvent_Header *pc2h_evt_hdr; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmd_obj) ++ return; ++ ++ cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header)); ++ pevtcmd = kzalloc(cmdsz, GFP_KERNEL); ++ if (!pevtcmd) { ++ kfree(pcmd_obj); ++ return; ++ } ++ ++ INIT_LIST_HEAD(&pcmd_obj->list); ++ ++ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); ++ pcmd_obj->cmdsz = cmdsz; ++ pcmd_obj->parmbuf = pevtcmd; ++ ++ pcmd_obj->rsp = NULL; ++ pcmd_obj->rspsz = 0; ++ ++ pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); ++ pc2h_evt_hdr->len = sizeof(struct stadel_event); ++ pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA); ++ pc2h_evt_hdr->seq = atomic_inc_return(&pmlmeext->event_seq); ++ ++ pdel_sta_evt = (struct stadel_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); ++ memcpy((unsigned char *)(&pdel_sta_evt->macaddr), MacAddr, ETH_ALEN); ++ memcpy((unsigned char *)(pdel_sta_evt->rsvd), (unsigned char *)(&reason), 2); ++ ++ psta = rtw_get_stainfo(&padapter->stapriv, MacAddr); ++ if (psta) ++ mac_id = (int)psta->mac_id; ++ else ++ mac_id = (-1); ++ ++ pdel_sta_evt->mac_id = mac_id; ++ ++ DBG_88E("report_del_sta_event: delete STA, mac_id =%d\n", mac_id); ++ ++ rtw_enqueue_cmd(pcmdpriv, pcmd_obj); ++} ++ ++void report_add_sta_event(struct adapter *padapter, unsigned char *MacAddr, int cam_idx) ++{ ++ struct cmd_obj *pcmd_obj; ++ u8 *pevtcmd; ++ u32 cmdsz; ++ struct stassoc_event *padd_sta_evt; ++ struct C2HEvent_Header *pc2h_evt_hdr; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ ++ pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); ++ if (!pcmd_obj) ++ return; ++ ++ cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header)); ++ pevtcmd = kzalloc(cmdsz, GFP_KERNEL); ++ if (!pevtcmd) { ++ kfree(pcmd_obj); ++ return; ++ } ++ ++ INIT_LIST_HEAD(&pcmd_obj->list); ++ ++ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); ++ pcmd_obj->cmdsz = cmdsz; ++ pcmd_obj->parmbuf = pevtcmd; ++ ++ pcmd_obj->rsp = NULL; ++ pcmd_obj->rspsz = 0; ++ ++ pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); ++ pc2h_evt_hdr->len = sizeof(struct stassoc_event); ++ pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA); ++ pc2h_evt_hdr->seq = atomic_inc_return(&pmlmeext->event_seq); ++ ++ padd_sta_evt = (struct stassoc_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); ++ memcpy((unsigned char *)(&padd_sta_evt->macaddr), MacAddr, ETH_ALEN); ++ padd_sta_evt->cam_id = cam_idx; ++ ++ DBG_88E("report_add_sta_event: add STA\n"); ++ ++ rtw_enqueue_cmd(pcmdpriv, pcmd_obj); ++} ++ ++/**************************************************************************** ++ ++Following are the event callback functions ++ ++*****************************************************************************/ ++ ++/* for sta/adhoc mode */ ++void update_sta_info(struct adapter *padapter, struct sta_info *psta) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ /* ERP */ ++ VCS_update(padapter, psta); ++ ++ /* HT */ ++ if (pmlmepriv->htpriv.ht_option) { ++ psta->htpriv.ht_option = true; ++ ++ psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable; ++ ++ if (support_short_GI(padapter, &pmlmeinfo->HT_caps)) ++ psta->htpriv.sgi = true; ++ ++ psta->qos_option = true; ++ } else { ++ psta->htpriv.ht_option = false; ++ ++ psta->htpriv.ampdu_enable = false; ++ ++ psta->htpriv.sgi = false; ++ psta->qos_option = false; ++ } ++ psta->htpriv.bwmode = pmlmeext->cur_bwmode; ++ psta->htpriv.ch_offset = pmlmeext->cur_ch_offset; ++ ++ psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ ++ psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ ++ ++ /* QoS */ ++ if (pmlmepriv->qospriv.qos_option) ++ psta->qos_option = true; ++ ++ psta->state = _FW_LINKED; ++} ++ ++void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res) ++{ ++ struct sta_info *psta, *psta_bmc; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 join_type; ++ u16 media_status; ++ ++ if (join_res < 0) { ++ join_type = 1; ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr); ++ ++ /* restore to initial setting. */ ++ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); ++ ++ goto exit_mlmeext_joinbss_event_callback; ++ } ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { ++ /* for bc/mc */ ++ psta_bmc = rtw_get_bcmc_stainfo(padapter); ++ if (psta_bmc) { ++ pmlmeinfo->FW_sta_info[psta_bmc->mac_id].psta = psta_bmc; ++ update_bmc_sta_support_rate(padapter, psta_bmc->mac_id); ++ Update_RA_Entry(padapter, psta_bmc->mac_id); ++ } ++ } ++ ++ /* turn on dynamic functions */ ++ Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); ++ ++ /* update IOT-releated issue */ ++ update_IOT_info(padapter); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); ++ ++ /* BCN interval */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval)); ++ ++ /* udpate capability */ ++ update_capinfo(padapter, pmlmeinfo->capability); ++ ++ /* WMM, Update EDCA param */ ++ WMMOnAssocRsp(padapter); ++ ++ /* HT */ ++ HTOnAssocRsp(padapter); ++ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ ++ psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); ++ if (psta) { /* only for infra. mode */ ++ pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; ++ ++ psta->wireless_mode = pmlmeext->cur_wireless_mode; ++ ++ /* set per sta rate after updating HT cap. */ ++ set_sta_rate(padapter, psta); ++ rtw_hal_set_hwreg(padapter, HW_VAR_TX_RPT_MAX_MACID, (u8 *)&psta->mac_id); ++ media_status = (psta->mac_id << 8) | 1; /* MACID|OPMODE: 1 means connect */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); ++ } ++ ++ join_type = 2; ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { ++ /* correcting TSF */ ++ correct_TSF(padapter, pmlmeext); ++ } ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); ++ ++exit_mlmeext_joinbss_event_callback: ++ ++ DBG_88E("=>%s\n", __func__); ++} ++ ++void mlmeext_sta_add_event_callback(struct adapter *padapter, struct sta_info *psta) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 join_type; ++ ++ DBG_88E("%s\n", __func__); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { ++ if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) {/* adhoc master or sta_count>1 */ ++ /* nothing to do */ ++ } else { /* adhoc client */ ++ /* correcting TSF */ ++ correct_TSF(padapter, pmlmeext); ++ ++ /* start beacon */ ++ if (send_beacon(padapter) == _FAIL) { ++ pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; ++ pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; ++ return; ++ } ++ pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; ++ } ++ ++ join_type = 2; ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); ++ } ++ ++ pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; ++ ++ /* rate radaptive */ ++ Update_RA_Entry(padapter, psta->mac_id); ++ ++ /* update adhoc sta_info */ ++ update_sta_info(padapter, psta); ++} ++ ++void mlmeext_sta_del_event_callback(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) { ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, NULL); ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr); ++ ++ /* restore to initial setting. */ ++ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); ++ ++ /* switch to the 20M Hz mode after disconnect */ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ ++ /* SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); */ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ ++ flush_all_cam_entry(padapter); ++ ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ ++ /* set MSR to no link state -> infra. mode */ ++ Set_MSR(padapter, _HW_STATE_STATION_); ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ } ++} ++ ++/**************************************************************************** ++ ++Following are the functions for the timer handlers ++ ++*****************************************************************************/ ++void _linked_rx_signal_strehgth_display(struct adapter *padapter); ++void _linked_rx_signal_strehgth_display(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 mac_id; ++ int UndecoratedSmoothedPWDB; ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) ++ mac_id = 0; ++ else if ((pmlmeinfo->state & 0x03) == _HW_STATE_AP_) ++ mac_id = 2; ++ ++ rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &mac_id); ++ ++ rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); ++ DBG_88E("UndecoratedSmoothedPWDB:%d\n", UndecoratedSmoothedPWDB); ++} ++ ++static u8 chk_ap_is_alive(struct adapter *padapter, struct sta_info *psta) ++{ ++ u8 ret = false; ++ ++ if ((sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta)) && ++ sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta) && ++ sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta)) ++ ret = false; ++ else ++ ret = true; ++ ++ sta_update_last_rx_pkts(psta); ++ ++ return ret; ++} ++ ++void linked_status_chk(struct adapter *padapter) ++{ ++ u32 i; ++ struct sta_info *psta; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (padapter->bRxRSSIDisplay) ++ _linked_rx_signal_strehgth_display(padapter); ++ ++ rtw_hal_sreset_linked_status_check(padapter); ++ ++ if (is_client_associated_to_ap(padapter)) { ++ /* linked infrastructure client mode */ ++ ++ int tx_chk = _SUCCESS, rx_chk = _SUCCESS; ++ int rx_chk_limit; ++ ++ rx_chk_limit = 4; ++ psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress); ++ if (psta) { ++ bool is_p2p_enable = false; ++ #ifdef CONFIG_88EU_P2P ++ is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE); ++ #endif ++ ++ if (!chk_ap_is_alive(padapter, psta)) ++ rx_chk = _FAIL; ++ ++ if (pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts) ++ tx_chk = _FAIL; ++ ++ if (pmlmeext->active_keep_alive_check && (rx_chk == _FAIL || tx_chk == _FAIL)) { ++ u8 backup_oper_channel = 0; ++ ++ /* switch to correct channel of current network before issue keep-alive frames */ ++ if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { ++ backup_oper_channel = rtw_get_oper_ch(padapter); ++ SelectChannel(padapter, pmlmeext->cur_channel); ++ } ++ ++ if (rx_chk != _SUCCESS) ++ issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, psta->hwaddr, 3, 1); ++ ++ if ((tx_chk != _SUCCESS && pmlmeinfo->link_count++ == 0xf) || rx_chk != _SUCCESS) { ++ tx_chk = issue_nulldata(padapter, psta->hwaddr, 0, 3, 1); ++ /* if tx acked and p2p disabled, set rx_chk _SUCCESS to reset retry count */ ++ if (tx_chk == _SUCCESS && !is_p2p_enable) ++ rx_chk = _SUCCESS; ++ } ++ ++ /* back to the original operation channel */ ++ if (backup_oper_channel > 0) ++ SelectChannel(padapter, backup_oper_channel); ++ } else { ++ if (rx_chk != _SUCCESS) { ++ if (pmlmeext->retry == 0) { ++ issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress); ++ issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress); ++ issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress); ++ } ++ } ++ ++ if (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == 0xf) { ++ tx_chk = issue_nulldata(padapter, NULL, 0, 1, 0); ++ } ++ } ++ ++ if (rx_chk == _FAIL) { ++ pmlmeext->retry++; ++ if (pmlmeext->retry > rx_chk_limit) { ++ DBG_88E_LEVEL(_drv_always_, FUNC_ADPT_FMT" disconnect or roaming\n", ++ FUNC_ADPT_ARG(padapter)); ++ receive_disconnect(padapter, pmlmeinfo->network.MacAddress, ++ WLAN_REASON_EXPIRATION_CHK); ++ return; ++ } ++ } else { ++ pmlmeext->retry = 0; ++ } ++ ++ if (tx_chk == _FAIL) { ++ pmlmeinfo->link_count &= 0xf; ++ } else { ++ pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; ++ pmlmeinfo->link_count = 0; ++ } ++ } /* end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) */ ++ } else if (is_client_associated_to_ibss(padapter)) { ++ /* linked IBSS mode */ ++ /* for each assoc list entry to check the rx pkt counter */ ++ for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) { ++ if (pmlmeinfo->FW_sta_info[i].status == 1) { ++ psta = pmlmeinfo->FW_sta_info[i].psta; ++ ++ if (NULL == psta) ++ continue; ++ if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta)) { ++ if (pmlmeinfo->FW_sta_info[i].retry < 3) { ++ pmlmeinfo->FW_sta_info[i].retry++; ++ } else { ++ pmlmeinfo->FW_sta_info[i].retry = 0; ++ pmlmeinfo->FW_sta_info[i].status = 0; ++ report_del_sta_event(padapter, psta->hwaddr ++ , 65535/* indicate disconnect caused by no rx */ ++ ); ++ } ++ } else { ++ pmlmeinfo->FW_sta_info[i].retry = 0; ++ pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)sta_rx_pkts(psta); ++ } ++ } ++ } ++ } ++} ++ ++void survey_timer_hdl(struct adapter *padapter) ++{ ++ struct cmd_obj *ph2c; ++ struct sitesurvey_parm *psurveyPara; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif ++ ++ /* issue rtw_sitesurvey_cmd */ ++ if (pmlmeext->sitesurvey_res.state > SCAN_START) { ++ if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) ++ pmlmeext->sitesurvey_res.channel_idx++; ++ ++ if (pmlmeext->scan_abort) { ++ #ifdef CONFIG_88EU_P2P ++ if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) { ++ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX); ++ pmlmeext->sitesurvey_res.channel_idx = 3; ++ DBG_88E("%s idx:%d, cnt:%u\n", __func__ ++ , pmlmeext->sitesurvey_res.channel_idx ++ , pwdinfo->find_phase_state_exchange_cnt ++ ); ++ } else ++ #endif ++ { ++ pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num; ++ DBG_88E("%s idx:%d\n", __func__ ++ , pmlmeext->sitesurvey_res.channel_idx ++ ); ++ } ++ ++ pmlmeext->scan_abort = false;/* reset */ ++ } ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) ++ goto exit_survey_timer_hdl; ++ ++ psurveyPara = kzalloc(sizeof(struct sitesurvey_parm), GFP_ATOMIC); ++ if (!psurveyPara) { ++ kfree(ph2c); ++ goto exit_survey_timer_hdl; ++ } ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); ++ rtw_enqueue_cmd(pcmdpriv, ph2c); ++ } ++ ++exit_survey_timer_hdl: ++ return; ++} ++ ++void link_timer_hdl(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) { ++ DBG_88E("link_timer_hdl:no beacon while connecting\n"); ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ report_join_res(padapter, -3); ++ } else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) { ++ /* re-auth timer */ ++ if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) { ++ pmlmeinfo->state = 0; ++ report_join_res(padapter, -1); ++ return; ++ } ++ ++ DBG_88E("link_timer_hdl: auth timeout and try again\n"); ++ pmlmeinfo->auth_seq = 1; ++ issue_auth(padapter, NULL, 0); ++ set_link_timer(pmlmeext, REAUTH_TO); ++ } else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) { ++ /* re-assoc timer */ ++ if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) { ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ report_join_res(padapter, -2); ++ return; ++ } ++ ++ DBG_88E("link_timer_hdl: assoc timeout and try again\n"); ++ issue_assocreq(padapter); ++ set_link_timer(pmlmeext, REASSOC_TO); ++ } ++} ++ ++void addba_timer_hdl(struct sta_info *psta) ++{ ++ struct ht_priv *phtpriv; ++ ++ if (!psta) ++ return; ++ ++ phtpriv = &psta->htpriv; ++ ++ if ((phtpriv->ht_option) && (phtpriv->ampdu_enable)) { ++ if (phtpriv->candidate_tid_bitmap) ++ phtpriv->candidate_tid_bitmap = 0x0; ++ } ++} ++ ++u8 NULL_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ return H2C_SUCCESS; ++} ++ ++u8 setopmode_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ u8 type; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf; ++ ++ if (psetop->mode == Ndis802_11APMode) { ++ pmlmeinfo->state = WIFI_FW_AP_STATE; ++ type = _HW_STATE_AP_; ++ } else if (psetop->mode == Ndis802_11Infrastructure) { ++ pmlmeinfo->state &= ~(BIT(0) | BIT(1));/* clear state */ ++ pmlmeinfo->state |= WIFI_FW_STATION_STATE;/* set to STATION_STATE */ ++ type = _HW_STATE_STATION_; ++ } else if (psetop->mode == Ndis802_11IBSS) { ++ type = _HW_STATE_ADHOC_; ++ } else { ++ type = _HW_STATE_NOLINK_; ++ } ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); ++ /* Set_NETYPE0_MSR(padapter, type); */ ++ ++ return H2C_SUCCESS; ++} ++ ++u8 createbss_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); ++ struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; ++ /* u32 initialgain; */ ++ ++ if (pparm->network.InfrastructureMode == Ndis802_11APMode) { ++#ifdef CONFIG_88EU_AP_MODE ++ ++ if (pmlmeinfo->state == WIFI_FW_AP_STATE) { ++ /* todo: */ ++ return H2C_SUCCESS; ++ } ++#endif ++ } ++ ++ /* below is for ad-hoc master */ ++ if (pparm->network.InfrastructureMode == Ndis802_11IBSS) { ++ rtw_joinbss_reset(padapter); ++ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ pmlmeinfo->ERP_enable = 0; ++ pmlmeinfo->WMM_enable = 0; ++ pmlmeinfo->HT_enable = 0; ++ pmlmeinfo->HT_caps_enable = 0; ++ pmlmeinfo->HT_info_enable = 0; ++ pmlmeinfo->agg_enable_bitmap = 0; ++ pmlmeinfo->candidate_tid_bitmap = 0; ++ ++ /* disable dynamic functions, such as high power, DIG */ ++ Save_DM_Func_Flag(padapter); ++ Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); ++ ++ /* config the initial gain under linking, need to write the BB registers */ ++ /* initialgain = 0x1E; */ ++ /* rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); */ ++ ++ /* cancel link timer */ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ /* clear CAM */ ++ flush_all_cam_entry(padapter); ++ ++ memcpy(pnetwork, pbuf, FIELD_OFFSET(struct wlan_bssid_ex, IELength)); ++ pnetwork->IELength = ((struct wlan_bssid_ex *)pbuf)->IELength; ++ ++ if (pnetwork->IELength > MAX_IE_SZ)/* Check pbuf->IELength */ ++ return H2C_PARAMETERS_ERROR; ++ ++ memcpy(pnetwork->IEs, ((struct wlan_bssid_ex *)pbuf)->IEs, pnetwork->IELength); ++ ++ start_create_ibss(padapter); ++ } ++ ++ return H2C_SUCCESS; ++} ++ ++u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ u8 join_type; ++ struct ndis_802_11_var_ie *pIE; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); ++ struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; ++ u32 i; ++ ++ /* check already connecting to AP or not */ ++ if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { ++ if (pmlmeinfo->state & WIFI_FW_STATION_STATE) ++ issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 5, 100); ++ ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ ++ /* clear CAM */ ++ flush_all_cam_entry(padapter); ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ /* set MSR to nolink -> infra. mode */ ++ Set_MSR(padapter, _HW_STATE_STATION_); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, NULL); ++ } ++ ++ rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, false); ++ ++ rtw_joinbss_reset(padapter); ++ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ pmlmeinfo->ERP_enable = 0; ++ pmlmeinfo->WMM_enable = 0; ++ pmlmeinfo->HT_enable = 0; ++ pmlmeinfo->HT_caps_enable = 0; ++ pmlmeinfo->HT_info_enable = 0; ++ pmlmeinfo->agg_enable_bitmap = 0; ++ pmlmeinfo->candidate_tid_bitmap = 0; ++ pmlmeinfo->bwmode_updated = false; ++ ++ memcpy(pnetwork, pbuf, FIELD_OFFSET(struct wlan_bssid_ex, IELength)); ++ pnetwork->IELength = ((struct wlan_bssid_ex *)pbuf)->IELength; ++ ++ if (pnetwork->IELength > MAX_IE_SZ)/* Check pbuf->IELength */ ++ return H2C_PARAMETERS_ERROR; ++ ++ memcpy(pnetwork->IEs, ((struct wlan_bssid_ex *)pbuf)->IEs, pnetwork->IELength); ++ ++ /* Check AP vendor to move rtw_joinbss_cmd() */ ++ ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < pnetwork->IELength;) { ++ pIE = (struct ndis_802_11_var_ie *)(pnetwork->IEs + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_:/* Get WMM IE. */ ++ if (!memcmp(pIE->data, WMM_OUI, 4)) ++ pmlmeinfo->WMM_enable = 1; ++ break; ++ case _HT_CAPABILITY_IE_: /* Get HT Cap IE. */ ++ pmlmeinfo->HT_caps_enable = 1; ++ break; ++ case _HT_EXTRA_INFO_IE_: /* Get HT Info IE. */ ++ pmlmeinfo->HT_info_enable = 1; ++ ++ /* spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz */ ++ { ++ struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data); ++ ++ if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) { ++ /* switch to the 40M Hz mode according to the AP */ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; ++ switch (pht_info->infos[0] & 0x3) { ++ case 1: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; ++ break; ++ case 3: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; ++ break; ++ default: ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ break; ++ } ++ ++ DBG_88E("set ch/bw before connected\n"); ++ } ++ } ++ break; ++ default: ++ break; ++ } ++ ++ i += (pIE->Length + 2); ++ } ++ /* disable dynamic functions, such as high power, DIG */ ++ ++ /* config the initial gain under linking, need to write the BB registers */ ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); ++ join_type = 0; ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); ++ ++ /* cancel link timer */ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ start_clnt_join(padapter); ++ ++ return H2C_SUCCESS; ++} ++ ++u8 disconnect_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ struct disconnect_parm *param = (struct disconnect_parm *)pbuf; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); ++ u8 val8; ++ ++ if (is_client_associated_to_ap(padapter)) ++ issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms / 100, 100); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, NULL); ++ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr); ++ ++ /* restore to initial setting. */ ++ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); ++ ++ if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { ++ /* Stop BCN */ ++ val8 = 0; ++ rtw_hal_set_hwreg(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8)); ++ } ++ ++ /* set MSR to no link state -> infra. mode */ ++ Set_MSR(padapter, _HW_STATE_STATION_); ++ ++ pmlmeinfo->state = WIFI_FW_NULL_STATE; ++ ++ /* switch to the 20M Hz mode after disconnect */ ++ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; ++ pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ ++ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); ++ ++ flush_all_cam_entry(padapter); ++ ++ _cancel_timer_ex(&pmlmeext->link_timer); ++ ++ rtw_free_uc_swdec_pending_queue(padapter); ++ ++ return H2C_SUCCESS; ++} ++ ++static int rtw_scan_ch_decision(struct adapter *padapter, struct rtw_ieee80211_channel *out, ++ u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num) ++{ ++ int i, j; ++ int set_idx; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ /* clear out first */ ++ memset(out, 0, sizeof(struct rtw_ieee80211_channel) * out_num); ++ ++ /* acquire channels from in */ ++ j = 0; ++ for (i = 0; i < in_num; i++) { ++ set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, in[i].hw_value); ++ if (in[i].hw_value && !(in[i].flags & RTW_IEEE80211_CHAN_DISABLED) && ++ set_idx >= 0) { ++ memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel)); ++ ++ if (pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE) ++ out[j].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN; ++ ++ j++; ++ } ++ if (j >= out_num) ++ break; ++ } ++ ++ /* if out is empty, use channel_set as default */ ++ if (j == 0) { ++ for (i = 0; i < pmlmeext->max_chan_nums; i++) { ++ out[i].hw_value = pmlmeext->channel_set[i].ChannelNum; ++ ++ if (pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE) ++ out[i].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN; ++ ++ j++; ++ } ++ } ++ ++ return j; ++} ++ ++u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; ++ u8 bdelayscan = false; ++ u8 val8; ++ u32 initialgain; ++ u32 i; ++ ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif ++ ++ if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) { ++ /* for first time sitesurvey_cmd */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, NULL); ++ ++ pmlmeext->sitesurvey_res.state = SCAN_START; ++ pmlmeext->sitesurvey_res.bss_cnt = 0; ++ pmlmeext->sitesurvey_res.channel_idx = 0; ++ ++ for (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) { ++ if (pparm->ssid[i].SsidLength) { ++ memcpy(pmlmeext->sitesurvey_res.ssid[i].Ssid, pparm->ssid[i].Ssid, IW_ESSID_MAX_SIZE); ++ pmlmeext->sitesurvey_res.ssid[i].SsidLength = pparm->ssid[i].SsidLength; ++ } else { ++ pmlmeext->sitesurvey_res.ssid[i].SsidLength = 0; ++ } ++ } ++ ++ pmlmeext->sitesurvey_res.ch_num = rtw_scan_ch_decision(padapter ++ , pmlmeext->sitesurvey_res.ch, RTW_CHANNEL_SCAN_AMOUNT ++ , pparm->ch, pparm->ch_num ++ ); ++ ++ pmlmeext->sitesurvey_res.scan_mode = pparm->scan_mode; ++ ++ /* issue null data if associating to the AP */ ++ if (is_client_associated_to_ap(padapter)) { ++ pmlmeext->sitesurvey_res.state = SCAN_TXNULL; ++ ++ issue_nulldata(padapter, NULL, 1, 3, 500); ++ ++ bdelayscan = true; ++ } ++ if (bdelayscan) { ++ /* delay 50ms to protect nulldata(1). */ ++ set_survey_timer(pmlmeext, 50); ++ return H2C_SUCCESS; ++ } ++ } ++ ++ if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) { ++ /* disable dynamic functions, such as high power, DIG */ ++ Save_DM_Func_Flag(padapter); ++ Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); ++ ++ /* config the initial gain under scanning, need to write the BB registers */ ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ initialgain = 0x1E; ++ else ++ initialgain = 0x28; ++#else /* CONFIG_88EU_P2P */ ++ initialgain = 0x1E; ++#endif /* CONFIG_88EU_P2P */ ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); ++ ++ /* set MSR to no link state */ ++ Set_MSR(padapter, _HW_STATE_NOLINK_); ++ ++ val8 = 1; /* under site survey */ ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); ++ ++ pmlmeext->sitesurvey_res.state = SCAN_PROCESS; ++ } ++ ++ site_survey(padapter); ++ ++ return H2C_SUCCESS; ++} ++ ++u8 setauth_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ struct setauth_parm *pparm = (struct setauth_parm *)pbuf; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pparm->mode < 4) ++ pmlmeinfo->auth_algo = pparm->mode; ++ return H2C_SUCCESS; ++} ++ ++u8 setkey_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ unsigned short ctrl; ++ struct setkey_parm *pparm = (struct setkey_parm *)pbuf; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; ++ ++ /* main tx key for wep. */ ++ if (pparm->set_tx) ++ pmlmeinfo->key_index = pparm->keyid; ++ ++ /* write cam */ ++ ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid; ++ ++ DBG_88E_LEVEL(_drv_info_, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) " ++ "keyid:%d\n", pparm->algorithm, pparm->keyid); ++ write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key); ++ ++ return H2C_SUCCESS; ++} ++ ++u8 set_stakey_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ u16 ctrl = 0; ++ u8 cam_id;/* cam_entry */ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf; ++ ++ /* cam_entry: */ ++ /* 0~3 for default key */ ++ ++ /* for concurrent mode (ap+sta): */ ++ /* default key is disable, using sw encrypt/decrypt */ ++ /* cam_entry = 4 for sta mode (macid = 0) */ ++ /* cam_entry(macid+3) = 5 ~ N for ap mode (aid = 1~N, macid = 2 ~N) */ ++ ++ /* for concurrent mode (sta+sta): */ ++ /* default key is disable, using sw encrypt/decrypt */ ++ /* cam_entry = 4 mapping to macid = 0 */ ++ /* cam_entry = 5 mapping to macid = 2 */ ++ ++ cam_id = 4; ++ ++ DBG_88E_LEVEL(_drv_info_, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:%d\n", ++ pparm->algorithm, cam_id); ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ struct sta_info *psta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (pparm->algorithm == _NO_PRIVACY_) /* clear cam entry */ { ++ clear_cam_entry(padapter, pparm->id); ++ return H2C_SUCCESS_RSP; ++ } ++ ++ psta = rtw_get_stainfo(pstapriv, pparm->addr); ++ if (psta) { ++ ctrl = (BIT(15) | ((pparm->algorithm) << 2)); ++ ++ DBG_88E("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm); ++ ++ if ((psta->mac_id < 1) || (psta->mac_id > (NUM_STA - 4))) { ++ DBG_88E("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id); ++ return H2C_REJECTED; ++ } ++ ++ cam_id = (psta->mac_id + 3);/* 0~3 for default key, cmd_id = macid + 3, macid = aid+1; */ ++ ++ DBG_88E("Write CAM, mac_addr =%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0], ++ pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4], ++ pparm->addr[5], cam_id); ++ ++ write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); ++ ++ return H2C_SUCCESS_RSP; ++ } else { ++ DBG_88E("r871x_set_stakey_hdl(): sta has been free\n"); ++ return H2C_REJECTED; ++ } ++ } ++ ++ /* below for sta mode */ ++ ++ if (pparm->algorithm == _NO_PRIVACY_) { /* clear cam entry */ ++ clear_cam_entry(padapter, pparm->id); ++ return H2C_SUCCESS; ++ } ++ ctrl = BIT(15) | ((pparm->algorithm) << 2); ++ write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); ++ pmlmeinfo->enc_algo = pparm->algorithm; ++ return H2C_SUCCESS; ++} ++ ++u8 add_ba_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr); ++ ++ if (!psta) ++ return H2C_SUCCESS; ++ ++ if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || ++ ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { ++ issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); ++ _set_timer(&psta->addba_retry_timer, ADDBA_TO); ++ } else { ++ psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); ++ } ++ return H2C_SUCCESS; ++} ++ ++u8 set_tx_beacon_cmd(struct adapter *padapter) ++{ ++ struct cmd_obj *ph2c; ++ struct Tx_Beacon_param *ptxBeacon_parm; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u8 res = _SUCCESS; ++ int len_diff = 0; ++ ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ ptxBeacon_parm = kzalloc(sizeof(struct Tx_Beacon_param), GFP_ATOMIC); ++ if (!ptxBeacon_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ memcpy(&ptxBeacon_parm->network, &pmlmeinfo->network, sizeof(struct wlan_bssid_ex)); ++ ++ len_diff = update_hidden_ssid(ptxBeacon_parm->network.IEs + _BEACON_IE_OFFSET_, ++ ptxBeacon_parm->network.IELength - _BEACON_IE_OFFSET_, ++ pmlmeinfo->hidden_ssid_mode); ++ ptxBeacon_parm->network.IELength += len_diff; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ ++exit: ++ ++ return res; ++} ++ ++u8 mlme_evt_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ u8 evt_code; ++ u16 evt_sz; ++ uint *peventbuf; ++ void (*event_callback)(struct adapter *dev, u8 *pbuf); ++ struct evt_priv *pevt_priv = &padapter->evtpriv; ++ ++ peventbuf = (uint *)pbuf; ++ evt_sz = (u16)(*peventbuf & 0xffff); ++ evt_code = (u8)((*peventbuf >> 16) & 0xff); ++ ++ /* checking if event code is valid */ ++ if (evt_code >= MAX_C2HEVT) ++ goto _abort_event_; ++ ++ /* checking if event size match the event parm size */ ++ if ((wlanevents[evt_code].parmsize != 0) && ++ (wlanevents[evt_code].parmsize != evt_sz)) ++ goto _abort_event_; ++ ++ atomic_inc(&pevt_priv->event_seq); ++ ++ peventbuf += 2; ++ ++ if (peventbuf) { ++ event_callback = wlanevents[evt_code].event_callback; ++ event_callback(padapter, (u8 *)peventbuf); ++ ++ pevt_priv->evt_done_cnt++; ++ } ++ ++_abort_event_: ++ return H2C_SUCCESS; ++} ++ ++u8 h2c_msg_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ if (!pbuf) ++ return H2C_PARAMETERS_ERROR; ++ ++ return H2C_SUCCESS; ++} ++ ++u8 tx_beacon_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ if (send_beacon(padapter) == _FAIL) { ++ DBG_88E("issue_beacon, fail!\n"); ++ return H2C_PARAMETERS_ERROR; ++ } ++#ifdef CONFIG_88EU_AP_MODE ++ else { /* tx bc/mc frames after update TIM */ ++ struct sta_info *psta_bmc; ++ struct list_head *xmitframe_plist, *xmitframe_phead; ++ struct xmit_frame *pxmitframe = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ /* for BC/MC Frames */ ++ psta_bmc = rtw_get_bcmc_stainfo(padapter); ++ if (!psta_bmc) ++ return H2C_SUCCESS; ++ ++ if ((pstapriv->tim_bitmap & BIT(0)) && (psta_bmc->sleepq_len > 0)) { ++ msleep(10);/* 10ms, ATIM(HIQ) Windows */ ++ spin_lock_bh(&psta_bmc->sleep_q.lock); ++ ++ xmitframe_phead = get_list_head(&psta_bmc->sleep_q); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ while (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ list_del_init(&pxmitframe->list); ++ ++ psta_bmc->sleepq_len--; ++ if (psta_bmc->sleepq_len > 0) ++ pxmitframe->attrib.mdata = 1; ++ else ++ pxmitframe->attrib.mdata = 0; ++ ++ pxmitframe->attrib.triggered = 1; ++ ++ pxmitframe->attrib.qsel = 0x11;/* HIQ */ ++ ++ spin_unlock_bh(&psta_bmc->sleep_q.lock); ++ if (rtw_hal_xmit(padapter, pxmitframe)) ++ rtw_os_xmit_complete(padapter, pxmitframe); ++ spin_lock_bh(&psta_bmc->sleep_q.lock); ++ } ++ spin_unlock_bh(&psta_bmc->sleep_q.lock); ++ } ++ } ++#endif ++ return H2C_SUCCESS; ++} ++ ++u8 set_ch_hdl(struct adapter *padapter, u8 *pbuf) ++{ ++ struct set_ch_parm *set_ch_parm; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ if (!pbuf) ++ return H2C_PARAMETERS_ERROR; ++ ++ set_ch_parm = (struct set_ch_parm *)pbuf; ++ ++ DBG_88E(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", ++ FUNC_NDEV_ARG(padapter->pnetdev), ++ set_ch_parm->ch, set_ch_parm->bw, set_ch_parm->ch_offset); ++ ++ pmlmeext->cur_channel = set_ch_parm->ch; ++ pmlmeext->cur_ch_offset = set_ch_parm->ch_offset; ++ pmlmeext->cur_bwmode = set_ch_parm->bw; ++ ++ set_channel_bwmode(padapter, set_ch_parm->ch, set_ch_parm->ch_offset, set_ch_parm->bw); ++ ++ return H2C_SUCCESS; ++} ++ ++u8 set_chplan_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ struct SetChannelPlan_param *setChannelPlan_param; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ if (!pbuf) ++ return H2C_PARAMETERS_ERROR; ++ ++ setChannelPlan_param = (struct SetChannelPlan_param *)pbuf; ++ ++ pmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set); ++ init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list); ++ ++ return H2C_SUCCESS; ++} ++ ++u8 led_blink_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ if (!pbuf) ++ return H2C_PARAMETERS_ERROR; ++ return H2C_SUCCESS; ++} ++ ++u8 set_csa_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ return H2C_REJECTED; ++} ++ ++/* TDLS_WRCR : write RCR DATA BIT */ ++/* TDLS_SD_PTI : issue peer traffic indication */ ++/* TDLS_CS_OFF : go back to the channel linked with AP, terminating channel switch procedure */ ++/* TDLS_INIT_CH_SEN : init channel sensing, receive all data and mgnt frame */ ++/* TDLS_DONE_CH_SEN: channel sensing and report candidate channel */ ++/* TDLS_OFF_CH : first time set channel to off channel */ ++/* TDLS_BASE_CH : go back tp the channel linked with AP when set base channel as target channel */ ++/* TDLS_P_OFF_CH : periodically go to off channel */ ++/* TDLS_P_BASE_CH : periodically go back to base channel */ ++/* TDLS_RS_RCR : restore RCR */ ++/* TDLS_CKALV_PH1 : check alive timer phase1 */ ++/* TDLS_CKALV_PH2 : check alive timer phase2 */ ++/* TDLS_FREE_STA : free tdls sta */ ++u8 tdls_hdl(struct adapter *padapter, unsigned char *pbuf) ++{ ++ return H2C_REJECTED; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_mp.c b/drivers/staging/r8188eu/core/rtw_mp.c +new file mode 100644 +index 000000000000..dabdd0406f30 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_mp.c +@@ -0,0 +1,935 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_MP_C_ ++ ++#include "../include/drv_types.h" ++#include "../include/odm_precomp.h" ++#include "../include/rtl8188e_hal.h" ++ ++u32 read_bbreg(struct adapter *padapter, u32 addr, u32 bitmask) ++{ ++ return rtw_hal_read_bbreg(padapter, addr, bitmask); ++} ++ ++void write_bbreg(struct adapter *padapter, u32 addr, u32 bitmask, u32 val) ++{ ++ rtw_hal_write_bbreg(padapter, addr, bitmask, val); ++} ++ ++u32 _read_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 bitmask) ++{ ++ return rtw_hal_read_rfreg(padapter, (enum rf_radio_path)rfpath, addr, bitmask); ++} ++ ++void _write_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val) ++{ ++ rtw_hal_write_rfreg(padapter, (enum rf_radio_path)rfpath, addr, bitmask, val); ++} ++ ++u32 read_rfreg(struct adapter *padapter, u8 rfpath, u32 addr) ++{ ++ return _read_rfreg(padapter, (enum rf_radio_path)rfpath, addr, bRFRegOffsetMask); ++} ++ ++void write_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 val) ++{ ++ _write_rfreg(padapter, (enum rf_radio_path)rfpath, addr, bRFRegOffsetMask, val); ++} ++ ++static void _init_mp_priv_(struct mp_priv *pmp_priv) ++{ ++ struct wlan_bssid_ex *pnetwork; ++ ++ memset(pmp_priv, 0, sizeof(struct mp_priv)); ++ ++ pmp_priv->mode = MP_OFF; ++ ++ pmp_priv->channel = 1; ++ pmp_priv->bandwidth = HT_CHANNEL_WIDTH_20; ++ pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ pmp_priv->rateidx = MPT_RATE_1M; ++ pmp_priv->txpoweridx = 0x2A; ++ ++ pmp_priv->antenna_tx = ANTENNA_A; ++ pmp_priv->antenna_rx = ANTENNA_AB; ++ ++ pmp_priv->check_mp_pkt = 0; ++ ++ pmp_priv->tx_pktcount = 0; ++ ++ pmp_priv->rx_pktcount = 0; ++ pmp_priv->rx_crcerrpktcount = 0; ++ ++ pmp_priv->network_macaddr[0] = 0x00; ++ pmp_priv->network_macaddr[1] = 0xE0; ++ pmp_priv->network_macaddr[2] = 0x4C; ++ pmp_priv->network_macaddr[3] = 0x87; ++ pmp_priv->network_macaddr[4] = 0x66; ++ pmp_priv->network_macaddr[5] = 0x55; ++ ++ pnetwork = &pmp_priv->mp_network.network; ++ memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); ++ ++ pnetwork->Ssid.SsidLength = 8; ++ memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength); ++} ++ ++static void mp_init_xmit_attrib(struct mp_tx *pmptx, struct adapter *padapter) ++{ ++ struct pkt_attrib *pattrib; ++ struct tx_desc *desc; ++ ++ /* init xmitframe attribute */ ++ pattrib = &pmptx->attrib; ++ memset(pattrib, 0, sizeof(struct pkt_attrib)); ++ desc = &pmptx->desc; ++ memset(desc, 0, TXDESC_SIZE); ++ ++ pattrib->ether_type = 0x8712; ++ memset(pattrib->dst, 0xFF, ETH_ALEN); ++ pattrib->ack_policy = 0; ++ pattrib->hdrlen = WLAN_HDR_A3_LEN; ++ pattrib->subtype = WIFI_DATA; ++ pattrib->priority = 0; ++ pattrib->qsel = pattrib->priority; ++ pattrib->nr_frags = 1; ++ pattrib->encrypt = 0; ++ pattrib->bswenc = false; ++ pattrib->qos_en = false; ++} ++ ++s32 init_mp_priv(struct adapter *padapter) ++{ ++ struct mp_priv *pmppriv = &padapter->mppriv; ++ ++ _init_mp_priv_(pmppriv); ++ pmppriv->papdater = padapter; ++ ++ pmppriv->tx.stop = 1; ++ mp_init_xmit_attrib(&pmppriv->tx, padapter); ++ ++ switch (padapter->registrypriv.rf_config) { ++ case RF_1T1R: ++ pmppriv->antenna_tx = ANTENNA_A; ++ pmppriv->antenna_rx = ANTENNA_A; ++ break; ++ case RF_1T2R: ++ default: ++ pmppriv->antenna_tx = ANTENNA_A; ++ pmppriv->antenna_rx = ANTENNA_AB; ++ break; ++ case RF_2T2R: ++ case RF_2T2R_GREEN: ++ pmppriv->antenna_tx = ANTENNA_AB; ++ pmppriv->antenna_rx = ANTENNA_AB; ++ break; ++ case RF_2T4R: ++ pmppriv->antenna_tx = ANTENNA_AB; ++ pmppriv->antenna_rx = ANTENNA_ABCD; ++ break; ++ } ++ ++ return _SUCCESS; ++} ++ ++void free_mp_priv(struct mp_priv *pmp_priv) ++{ ++ kfree(pmp_priv->pallocated_mp_xmitframe_buf); ++ pmp_priv->pallocated_mp_xmitframe_buf = NULL; ++ pmp_priv->pmp_xmtframe_buf = NULL; ++} ++ ++#define PHY_IQCalibrate(a, b) PHY_IQCalibrate_8188E(a, b) ++#define PHY_LCCalibrate(a) PHY_LCCalibrate_8188E(a) ++#define PHY_SetRFPathSwitch(a, b) PHY_SetRFPathSwitch_8188E(a, b) ++ ++s32 MPT_InitializeAdapter(struct adapter *pAdapter, u8 Channel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ s32 rtStatus = _SUCCESS; ++ struct mpt_context *pMptCtx = &pAdapter->mppriv.MptCtx; ++ struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; ++ ++ /* HW Initialization for 8190 MPT. */ ++ /* SW Initialization for 8190 MP. */ ++ pMptCtx->bMptDrvUnload = false; ++ pMptCtx->bMassProdTest = false; ++ pMptCtx->bMptIndexEven = true; /* default gain index is -6.0db */ ++ pMptCtx->h2cReqNum = 0x0; ++ /* Init mpt event. */ ++ /* init for BT MP */ ++ ++ pMptCtx->bMptWorkItemInProgress = false; ++ pMptCtx->CurrMptAct = NULL; ++ /* */ ++ ++ /* Don't accept any packets */ ++ rtw_write32(pAdapter, REG_RCR, 0); ++ ++ PHY_IQCalibrate(pAdapter, false); ++ dm_CheckTXPowerTracking(&pHalData->odmpriv); /* trigger thermal meter */ ++ PHY_LCCalibrate(pAdapter); ++ ++ pMptCtx->backup0xc50 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0); ++ pMptCtx->backup0xc58 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0); ++ pMptCtx->backup0xc30 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0); ++ pMptCtx->backup0x52_RF_A = (u8)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); ++ pMptCtx->backup0x52_RF_B = (u8)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); ++ ++ /* set ant to wifi side in mp mode */ ++ rtw_write16(pAdapter, 0x870, 0x300); ++ rtw_write16(pAdapter, 0x860, 0x110); ++ ++ if (pAdapter->registrypriv.mp_mode == 1) ++ pmlmepriv->fw_state = WIFI_MP_STATE; ++ ++ return rtStatus; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: MPT_DeInitAdapter() ++ * ++ * Overview: Extra DeInitialization for Mass Production Test. ++ * ++ * Input: struct adapter * pAdapter ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 05/08/2007 MHC Create Version 0. ++ * 05/18/2007 MHC Add normal driver MPHalt code. ++ * ++ *---------------------------------------------------------------------------*/ ++void MPT_DeInitAdapter(struct adapter *pAdapter) ++{ ++ struct mpt_context *pMptCtx = &pAdapter->mppriv.MptCtx; ++ ++ pMptCtx->bMptDrvUnload = true; ++} ++ ++static u8 mpt_ProStartTest(struct adapter *padapter) ++{ ++ struct mpt_context *pMptCtx = &padapter->mppriv.MptCtx; ++ ++ pMptCtx->bMassProdTest = true; ++ pMptCtx->bStartContTx = false; ++ pMptCtx->bCckContTx = false; ++ pMptCtx->bOfdmContTx = false; ++ pMptCtx->bSingleCarrier = false; ++ pMptCtx->bCarrierSuppression = false; ++ pMptCtx->bSingleTone = false; ++ ++ return _SUCCESS; ++} ++ ++/* ++ * General use ++ */ ++s32 SetPowerTracking(struct adapter *padapter, u8 enable) ++{ ++ Hal_SetPowerTracking(padapter, enable); ++ return 0; ++} ++ ++void GetPowerTracking(struct adapter *padapter, u8 *enable) ++{ ++ Hal_GetPowerTracking(padapter, enable); ++} ++ ++static void disable_dm(struct adapter *padapter) ++{ ++ u8 v8; ++ ++ /* 3 1. disable firmware dynamic mechanism */ ++ /* disable Power Training, Rate Adaptive */ ++ v8 = rtw_read8(padapter, REG_BCN_CTRL); ++ v8 &= ~EN_BCN_FUNCTION; ++ rtw_write8(padapter, REG_BCN_CTRL, v8); ++ ++ /* 3 2. disable driver dynamic mechanism */ ++ /* disable Dynamic Initial Gain */ ++ /* disable High Power */ ++ /* disable Power Tracking */ ++ Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); ++ ++ /* enable APK, LCK and IQK but disable power tracking */ ++ Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, true); ++} ++ ++/* This function initializes the DUT to the MP test mode */ ++s32 mp_start_test(struct adapter *padapter) ++{ ++ struct wlan_bssid_ex bssid; ++ struct sta_info *psta; ++ u32 length; ++ u8 val8; ++ s32 res = _SUCCESS; ++ struct mp_priv *pmppriv = &padapter->mppriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_network *tgt_network = &pmlmepriv->cur_network; ++ ++ padapter->registrypriv.mp_mode = 1; ++ pmppriv->bSetTxPower = 0; /* for manually set tx power */ ++ ++ /* 3 disable dynamic mechanism */ ++ disable_dm(padapter); ++ ++ /* 3 0. update mp_priv */ ++ ++ if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) { ++ switch (GET_RF_TYPE(padapter)) { ++ case RF_1T1R: ++ pmppriv->antenna_tx = ANTENNA_A; ++ pmppriv->antenna_rx = ANTENNA_A; ++ break; ++ case RF_1T2R: ++ default: ++ pmppriv->antenna_tx = ANTENNA_A; ++ pmppriv->antenna_rx = ANTENNA_AB; ++ break; ++ case RF_2T2R: ++ case RF_2T2R_GREEN: ++ pmppriv->antenna_tx = ANTENNA_AB; ++ pmppriv->antenna_rx = ANTENNA_AB; ++ break; ++ case RF_2T4R: ++ pmppriv->antenna_tx = ANTENNA_AB; ++ pmppriv->antenna_rx = ANTENNA_ABCD; ++ break; ++ } ++ } ++ ++ mpt_ProStartTest(padapter); ++ ++ /* 3 1. initialize a new struct wlan_bssid_ex */ ++/* memset(&bssid, 0, sizeof(struct wlan_bssid_ex)); */ ++ memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN); ++ bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc"); ++ memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); ++ bssid.InfrastructureMode = Ndis802_11IBSS; ++ bssid.NetworkTypeInUse = Ndis802_11DS; ++ bssid.IELength = 0; ++ ++ length = get_wlan_bssid_ex_sz(&bssid); ++ if (length % 4) ++ bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */ ++ else ++ bssid.Length = length; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) ++ goto end_of_mp_start_test; ++ ++ /* init mp_start_test status */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ rtw_disassoc_cmd(padapter, 500, true); ++ rtw_indicate_disconnect(padapter); ++ rtw_free_assoc_resources(padapter, 1); ++ } ++ pmppriv->prev_fw_state = get_fwstate(pmlmepriv); ++ if (padapter->registrypriv.mp_mode == 1) ++ pmlmepriv->fw_state = WIFI_MP_STATE; ++ set_fwstate(pmlmepriv, _FW_UNDER_LINKING); ++ ++ /* 3 2. create a new psta for mp driver */ ++ /* clear psta in the cur_network, if any */ ++ psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); ++ if (psta) ++ rtw_free_stainfo(padapter, psta); ++ ++ psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress); ++ if (!psta) { ++ pmlmepriv->fw_state = pmppriv->prev_fw_state; ++ res = _FAIL; ++ goto end_of_mp_start_test; ++ } ++ ++ /* 3 3. join psudo AdHoc */ ++ tgt_network->join_res = 1; ++ tgt_network->aid = 1; ++ psta->aid = 1; ++ memcpy(&tgt_network->network, &bssid, length); ++ ++ rtw_indicate_connect(padapter); ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); ++ ++end_of_mp_start_test: ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++ if (res == _SUCCESS) { ++ /* set MSR to WIFI_FW_ADHOC_STATE */ ++ val8 = rtw_read8(padapter, MSR) & 0xFC; /* 0x0102 */ ++ val8 |= WIFI_FW_ADHOC_STATE; ++ rtw_write8(padapter, MSR, val8); /* Link in ad hoc network */ ++ } ++ return res; ++} ++/* */ ++/* This function change the DUT from the MP test mode into normal mode */ ++void mp_stop_test(struct adapter *padapter) ++{ ++ struct mp_priv *pmppriv = &padapter->mppriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_network *tgt_network = &pmlmepriv->cur_network; ++ struct sta_info *psta; ++ ++ if (pmppriv->mode == MP_ON) { ++ pmppriv->bSetTxPower = 0; ++ spin_lock_bh(&pmlmepriv->lock); ++ if (!check_fwstate(pmlmepriv, WIFI_MP_STATE)) ++ goto end_of_mp_stop_test; ++ ++ /* 3 1. disconnect psudo AdHoc */ ++ rtw_indicate_disconnect(padapter); ++ ++ /* 3 2. clear psta used in mp test mode. */ ++ psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); ++ if (psta) ++ rtw_free_stainfo(padapter, psta); ++ ++ /* 3 3. return to normal state (default:station mode) */ ++ pmlmepriv->fw_state = pmppriv->prev_fw_state; /* WIFI_STATION_STATE; */ ++ ++ /* flush the cur_network */ ++ memset(tgt_network, 0, sizeof(struct wlan_network)); ++ ++ _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); ++ ++end_of_mp_stop_test: ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ } ++} ++ ++/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ ++/* ++ * SetChannel ++ * Description ++ * Use H2C command to change channel, ++ * not only modify rf register, but also other setting need to be done. ++ */ ++void SetChannel(struct adapter *pAdapter) ++{ ++ Hal_SetChannel(pAdapter); ++} ++ ++/* ++ * Notice ++ * Switch bandwitdth may change center frequency(channel) ++ */ ++void SetBandwidth(struct adapter *pAdapter) ++{ ++ Hal_SetBandwidth(pAdapter); ++} ++ ++void SetAntenna(struct adapter *pAdapter) ++{ ++ Hal_SetAntenna(pAdapter); ++} ++ ++void SetAntennaPathPower(struct adapter *pAdapter) ++{ ++ Hal_SetAntennaPathPower(pAdapter); ++} ++ ++void SetTxPower(struct adapter *pAdapter) ++{ ++ Hal_SetTxPower(pAdapter); ++ } ++ ++void SetDataRate(struct adapter *pAdapter) ++{ ++ Hal_SetDataRate(pAdapter); ++} ++ ++void MP_PHY_SetRFPathSwitch(struct adapter *pAdapter, bool bMain) ++{ ++ PHY_SetRFPathSwitch(pAdapter, bMain); ++} ++ ++s32 SetThermalMeter(struct adapter *pAdapter, u8 target_ther) ++{ ++ return Hal_SetThermalMeter(pAdapter, target_ther); ++} ++ ++void GetThermalMeter(struct adapter *pAdapter, u8 *value) ++{ ++ Hal_GetThermalMeter(pAdapter, value); ++} ++ ++void SetSingleCarrierTx(struct adapter *pAdapter, u8 bStart) ++{ ++ PhySetTxPowerLevel(pAdapter); ++ Hal_SetSingleCarrierTx(pAdapter, bStart); ++} ++ ++void SetSingleToneTx(struct adapter *pAdapter, u8 bStart) ++{ ++ PhySetTxPowerLevel(pAdapter); ++ Hal_SetSingleToneTx(pAdapter, bStart); ++} ++ ++void SetCarrierSuppressionTx(struct adapter *pAdapter, u8 bStart) ++{ ++ PhySetTxPowerLevel(pAdapter); ++ Hal_SetCarrierSuppressionTx(pAdapter, bStart); ++} ++ ++void SetContinuousTx(struct adapter *pAdapter, u8 bStart) ++{ ++ PhySetTxPowerLevel(pAdapter); ++ Hal_SetContinuousTx(pAdapter, bStart); ++} ++ ++void PhySetTxPowerLevel(struct adapter *pAdapter) ++{ ++ struct mp_priv *pmp_priv = &pAdapter->mppriv; ++ ++ if (pmp_priv->bSetTxPower == 0) /* for NO manually set power index */ ++ PHY_SetTxPowerLevel8188E(pAdapter, pmp_priv->channel); ++} ++ ++/* */ ++static void dump_mpframe(struct adapter *padapter, struct xmit_frame *pmpframe) ++{ ++ rtw_hal_mgnt_xmit(padapter, pmpframe); ++} ++ ++static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv) ++{ ++ struct xmit_frame *pmpframe; ++ struct xmit_buf *pxmitbuf; ++ ++ pmpframe = rtw_alloc_xmitframe(pxmitpriv); ++ if (!pmpframe) ++ return NULL; ++ ++ pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); ++ if (!pxmitbuf) { ++ rtw_free_xmitframe(pxmitpriv, pmpframe); ++ return NULL; ++ } ++ ++ pmpframe->frame_tag = MP_FRAMETAG; ++ ++ pmpframe->pxmitbuf = pxmitbuf; ++ ++ pmpframe->buf_addr = pxmitbuf->pbuf; ++ ++ pxmitbuf->priv_data = pmpframe; ++ ++ return pmpframe; ++} ++ ++static int mp_xmit_packet_thread(void *context) ++{ ++ struct xmit_frame *pxmitframe; ++ struct mp_tx *pmptx; ++ struct mp_priv *pmp_priv; ++ struct xmit_priv *pxmitpriv; ++ struct adapter *padapter; ++ ++ pmp_priv = (struct mp_priv *)context; ++ pmptx = &pmp_priv->tx; ++ padapter = pmp_priv->papdater; ++ pxmitpriv = &padapter->xmitpriv; ++ ++ thread_enter("RTW_MP_THREAD"); ++ ++ /* DBG_88E("%s:pkTx Start\n", __func__); */ ++ while (1) { ++ pxmitframe = alloc_mp_xmitframe(pxmitpriv); ++ if (!pxmitframe) { ++ if (pmptx->stop || ++ padapter->bSurpriseRemoved || ++ padapter->bDriverStopped) { ++ goto exit; ++ } else { ++ msleep(1); ++ continue; ++ } ++ } ++ ++ memcpy((u8 *)(pxmitframe->buf_addr + TXDESC_OFFSET), pmptx->buf, pmptx->write_size); ++ memcpy(&pxmitframe->attrib, &pmptx->attrib, sizeof(struct pkt_attrib)); ++ ++ dump_mpframe(padapter, pxmitframe); ++ ++ pmptx->sended++; ++ pmp_priv->tx_pktcount++; ++ ++ if (pmptx->stop || ++ padapter->bSurpriseRemoved || ++ padapter->bDriverStopped) ++ goto exit; ++ if ((pmptx->count != 0) && ++ (pmptx->count == pmptx->sended)) ++ goto exit; ++ ++ flush_signals_thread(); ++ } ++ ++exit: ++ kfree(pmptx->pallocated_buf); ++ pmptx->pallocated_buf = NULL; ++ pmptx->stop = 1; ++ ++ thread_exit(); ++} ++ ++void fill_txdesc_for_mp(struct adapter *padapter, struct tx_desc *ptxdesc) ++{ ++ struct mp_priv *pmp_priv = &padapter->mppriv; ++ memcpy(ptxdesc, &pmp_priv->tx.desc, TXDESC_SIZE); ++} ++ ++void SetPacketTx(struct adapter *padapter) ++{ ++ u8 *ptr, *pkt_start, *pkt_end; ++ u32 pkt_size; ++ struct tx_desc *desc; ++ struct rtw_ieee80211_hdr *hdr; ++ u8 payload; ++ bool bmcast; ++ struct pkt_attrib *pattrib; ++ struct mp_priv *pmp_priv; ++ ++ pmp_priv = &padapter->mppriv; ++ if (pmp_priv->tx.stop) ++ return; ++ pmp_priv->tx.sended = 0; ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx_pktcount = 0; ++ ++ /* 3 1. update_attrib() */ ++ pattrib = &pmp_priv->tx.attrib; ++ memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); ++ memcpy(pattrib->ta, pattrib->src, ETH_ALEN); ++ memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); ++ bmcast = is_multicast_ether_addr(pattrib->ra); ++ if (bmcast) { ++ pattrib->mac_id = 1; ++ pattrib->psta = rtw_get_bcmc_stainfo(padapter); ++ } else { ++ pattrib->mac_id = 0; ++ pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); ++ } ++ ++ pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen; ++ ++ /* 3 2. allocate xmit buffer */ ++ pkt_size = pattrib->last_txcmdsz; ++ ++ kfree(pmp_priv->tx.pallocated_buf); ++ pmp_priv->tx.write_size = pkt_size; ++ pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ; ++ pmp_priv->tx.pallocated_buf = kzalloc(pmp_priv->tx.buf_size, GFP_KERNEL); ++ if (!pmp_priv->tx.pallocated_buf) { ++ DBG_88E("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); ++ return; ++ } ++ pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((size_t)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ); ++ ptr = pmp_priv->tx.buf; ++ ++ desc = &pmp_priv->tx.desc; ++ memset(desc, 0, TXDESC_SIZE); ++ pkt_start = ptr; ++ pkt_end = pkt_start + pkt_size; ++ ++ /* 3 3. init TX descriptor */ ++ /* offset 0 */ ++ desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); ++ desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); /* packet size */ ++ desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); /* 32 bytes for TX Desc */ ++ if (bmcast) ++ desc->txdw0 |= cpu_to_le32(BMC); /* broadcast packet */ ++ ++ desc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000); ++ /* offset 4 */ ++ desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); /* CAM_ID(MAC_ID) */ ++ desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); /* Queue Select, TID */ ++ ++ desc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); /* Rate Adaptive ID */ ++ /* offset 8 */ ++ /* offset 12 */ ++ ++ desc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0x0fff0000); ++ ++ /* offset 16 */ ++ desc->txdw4 |= cpu_to_le32(HW_SSN); ++ desc->txdw4 |= cpu_to_le32(USERATE); ++ desc->txdw4 |= cpu_to_le32(DISDATAFB); ++ ++ if (pmp_priv->preamble) { ++ if (pmp_priv->rateidx <= MPT_RATE_54M) ++ desc->txdw4 |= cpu_to_le32(DATA_SHORT); /* CCK Short Preamble */ ++ } ++ if (pmp_priv->bandwidth == HT_CHANNEL_WIDTH_40) ++ desc->txdw4 |= cpu_to_le32(DATA_BW); ++ ++ /* offset 20 */ ++ desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); ++ ++ if (pmp_priv->preamble) { ++ if (pmp_priv->rateidx > MPT_RATE_54M) ++ desc->txdw5 |= cpu_to_le32(SGI); /* MCS Short Guard Interval */ ++ } ++ desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); /* retry limit enable */ ++ desc->txdw5 |= cpu_to_le32(0x00180000); /* DATA/RTS Rate Fallback Limit */ ++ ++ /* 3 4. make wlan header, make_wlanhdr() */ ++ hdr = (struct rtw_ieee80211_hdr *)pkt_start; ++ SetFrameSubType(&hdr->frame_ctl, pattrib->subtype); ++ memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */ ++ memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */ ++ memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); /* RA, BSSID */ ++ ++ /* 3 5. make payload */ ++ ptr = pkt_start + pattrib->hdrlen; ++ ++ switch (pmp_priv->tx.payload) { ++ case 0: ++ payload = 0x00; ++ break; ++ case 1: ++ payload = 0x5a; ++ break; ++ case 2: ++ payload = 0xa5; ++ break; ++ case 3: ++ payload = 0xff; ++ break; ++ default: ++ payload = 0x00; ++ break; ++ } ++ ++ memset(ptr, payload, pkt_end - ptr); ++ ++ /* 3 6. start thread */ ++ pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD"); ++ if (IS_ERR(pmp_priv->tx.PktTxThread)) ++ DBG_88E("Create PktTx Thread Fail !!!!!\n"); ++} ++ ++void SetPacketRx(struct adapter *pAdapter, u8 bStartRx) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ ++ if (bStartRx) { ++ /* Accept CRC error and destination address */ ++ pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ++ AMF | ADF | APP_FCS | HTC_LOC_CTRL | ++ APP_MIC | APP_PHYSTS; ++ ++ pHalData->ReceiveConfig |= (RCR_ACRC32 | RCR_AAP); ++ ++ rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); ++ ++ /* Accept all data frames */ ++ rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF); ++ } else { ++ rtw_write32(pAdapter, REG_RCR, 0); ++ } ++} ++ ++void ResetPhyRxPktCount(struct adapter *pAdapter) ++{ ++ u32 i, phyrx_set = 0; ++ ++ for (i = 0; i <= 0xF; i++) { ++ phyrx_set = 0; ++ phyrx_set |= _RXERR_RPT_SEL(i); /* select */ ++ phyrx_set |= RXERR_RPT_RST; /* set counter to zero */ ++ rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); ++ } ++} ++ ++static u32 GetPhyRxPktCounts(struct adapter *pAdapter, u32 selbit) ++{ ++ /* selection */ ++ u32 phyrx_set = 0, count = 0; ++ ++ phyrx_set = _RXERR_RPT_SEL(selbit & 0xF); ++ rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); ++ ++ /* Read packet count */ ++ count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK; ++ ++ return count; ++} ++ ++u32 GetPhyRxPktReceived(struct adapter *pAdapter) ++{ ++ u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; ++ ++ OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK); ++ CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK); ++ HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK); ++ ++ return OFDM_cnt + CCK_cnt + HT_cnt; ++} ++ ++u32 GetPhyRxPktCRC32Error(struct adapter *pAdapter) ++{ ++ u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; ++ ++ OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL); ++ CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL); ++ HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL); ++ ++ return OFDM_cnt + CCK_cnt + HT_cnt; ++} ++ ++/* reg 0x808[9:0]: FFT data x */ ++/* reg 0x808[22]: 0 --> 1 to get 1 FFT data y */ ++/* reg 0x8B4[15:0]: FFT data y report */ ++static u32 rtw_GetPSDData(struct adapter *pAdapter, u32 point) ++{ ++ int psd_val; ++ ++ psd_val = rtw_read32(pAdapter, 0x808); ++ psd_val &= 0xFFBFFC00; ++ psd_val |= point; ++ ++ rtw_write32(pAdapter, 0x808, psd_val); ++ mdelay(1); ++ psd_val |= 0x00400000; ++ ++ rtw_write32(pAdapter, 0x808, psd_val); ++ mdelay(1); ++ psd_val = rtw_read32(pAdapter, 0x8B4); ++ ++ psd_val &= 0x0000FFFF; ++ ++ return psd_val; ++} ++ ++/* ++ *pts start_point_min stop_point_max ++ * 128 64 64 + 128 = 192 ++ * 256 128 128 + 256 = 384 ++ * 512 256 256 + 512 = 768 ++ * 1024 512 512 + 1024 = 1536 ++ */ ++u32 mp_query_psd(struct adapter *pAdapter, u8 *data) ++{ ++ u32 i, psd_pts = 0, psd_start = 0, psd_stop = 0; ++ u32 psd_data = 0; ++ ++ if (!netif_running(pAdapter->pnetdev)) ++ return 0; ++ ++ if (!check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE)) ++ return 0; ++ ++ if (strlen(data) == 0) { /* default value */ ++ psd_pts = 128; ++ psd_start = 64; ++ psd_stop = 128; ++ } else { ++ sscanf(data, "pts =%d, start =%d, stop =%d", &psd_pts, &psd_start, &psd_stop); ++ } ++ ++ memset(data, '\0', sizeof(*data)); ++ ++ i = psd_start; ++ while (i < psd_stop) { ++ if (i >= psd_pts) { ++ psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); ++ } else { ++ psd_data = rtw_GetPSDData(pAdapter, i); ++ } ++ sprintf(data + strlen(data), "%x ", psd_data); ++ i++; ++ } ++ ++ msleep(100); ++ return strlen(data) + 1; ++} ++ ++void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv) ++{ ++ int i, res; ++ struct adapter *padapter = pxmitpriv->adapter; ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; ++ u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; ++ u32 num_xmit_extbuf = NR_XMIT_EXTBUFF; ++ ++ if (padapter->registrypriv.mp_mode == 0) { ++ max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; ++ num_xmit_extbuf = NR_XMIT_EXTBUFF; ++ } else { ++ max_xmit_extbuf_size = 6000; ++ num_xmit_extbuf = 8; ++ } ++ ++ pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; ++ for (i = 0; i < num_xmit_extbuf; i++) { ++ rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ)); ++ ++ pxmitbuf++; ++ } ++ ++ vfree(pxmitpriv->pallocated_xmit_extbuf); ++ ++ if (padapter->registrypriv.mp_mode == 0) { ++ max_xmit_extbuf_size = 6000; ++ num_xmit_extbuf = 8; ++ } else { ++ max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; ++ num_xmit_extbuf = NR_XMIT_EXTBUFF; ++ } ++ ++ /* Init xmit extension buff */ ++ _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); ++ ++ pxmitpriv->pallocated_xmit_extbuf = vzalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4); ++ ++ if (!pxmitpriv->pallocated_xmit_extbuf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmit_extbuf), 4); ++ ++ pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; ++ ++ for (i = 0; i < num_xmit_extbuf; i++) { ++ INIT_LIST_HEAD(&pxmitbuf->list); ++ ++ pxmitbuf->priv_data = NULL; ++ pxmitbuf->padapter = padapter; ++ pxmitbuf->ext_tag = true; ++ ++ res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ); ++ if (res == _FAIL) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ list_add_tail(&pxmitbuf->list, &pxmitpriv->free_xmit_extbuf_queue.queue); ++ pxmitbuf++; ++ } ++ ++ pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf; ++ ++exit: ++ ; ++} ++ ++void Hal_ProSetCrystalCap(struct adapter *pAdapter, u32 CrystalCapVal) ++{ ++ CrystalCapVal = CrystalCapVal & 0x3F; ++ ++ // write 0x24[16:11] = 0x24[22:17] = CrystalCap ++ PHY_SetBBReg(pAdapter, REG_AFE_XTAL_CTRL, 0x7FF800, ++ (CrystalCapVal | (CrystalCapVal << 6))); ++} +diff --git a/drivers/staging/r8188eu/core/rtw_mp_ioctl.c b/drivers/staging/r8188eu/core/rtw_mp_ioctl.c +new file mode 100644 +index 000000000000..c85f8e467337 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_mp_ioctl.c +@@ -0,0 +1,1170 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_MP_IOCTL_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/mlme_osdep.h" ++#include "../include/rtw_mp_ioctl.h" ++ ++/* rtl8188eu_oid_rtl_seg_81_85 section start **************** */ ++int rtl8188eu_oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->information_buf_len < sizeof(u8)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ if (poid_par_priv->type_of_oid == SET_OID) { ++ Adapter->registrypriv.wireless_mode = *(u8 *)poid_par_priv->information_buf; ++ } else if (poid_par_priv->type_of_oid == QUERY_OID) { ++ *(u8 *)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ } else { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ } ++ ++ return status; ++} ++/* rtl8188eu_oid_rtl_seg_81_87_80 section start **************** */ ++int rtl8188eu_oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct bb_reg_param *pbbreg; ++ u16 offset; ++ u32 value; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); ++ ++ offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ ++ if (offset < BB_REG_BASE_ADDR) ++ offset |= BB_REG_BASE_ADDR; ++ ++ value = pbbreg->value; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ write_bbreg(Adapter, offset, 0xFFFFFFFF, value); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct bb_reg_param *pbbreg; ++ u16 offset; ++ u32 value; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); ++ ++ offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ ++ if (offset < BB_REG_BASE_ADDR) ++ offset |= BB_REG_BASE_ADDR; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ value = read_bbreg(Adapter, offset, 0xFFFFFFFF); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ pbbreg->value = value; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct rf_reg_param *pbbreg; ++ u8 path; ++ u8 offset; ++ u32 value; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); ++ ++ if (pbbreg->path >= RF_PATH_MAX) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ if (pbbreg->offset > 0xFF) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ if (pbbreg->value > 0xFFFFF) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ path = (u8)pbbreg->path; ++ offset = (u8)pbbreg->offset; ++ value = pbbreg->value; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ write_rfreg(Adapter, path, offset, value); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct rf_reg_param *pbbreg; ++ u8 path; ++ u8 offset; ++ u32 value; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ int status = NDIS_STATUS_SUCCESS; ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); ++ ++ if (pbbreg->path >= RF_PATH_MAX) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ if (pbbreg->offset > 0xFF) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ path = (u8)pbbreg->path; ++ offset = (u8)pbbreg->offset; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ value = read_rfreg(Adapter, path, offset); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ pbbreg->value = value; ++ ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ ++ return status; ++} ++/* rtl8188eu_oid_rtl_seg_81_87_00 section end**************** */ ++/* */ ++ ++/* rtl8188eu_oid_rtl_seg_81_80_00 section start **************** */ ++/* */ ++int rtl8188eu_oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 ratevalue;/* 4 */ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ ratevalue = *((u32 *)poid_par_priv->information_buf);/* 4 */ ++ if (ratevalue >= MPT_RATE_LAST) ++ return NDIS_STATUS_INVALID_DATA; ++ ++ Adapter->mppriv.rateidx = ratevalue; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetDataRate(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 mode; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (Adapter->registrypriv.mp_mode == 0) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ /* IQCalibrateBcut(Adapter); */ ++ ++ mode = *((u32 *)poid_par_priv->information_buf); ++ Adapter->mppriv.mode = mode;/* 1 for loopback */ ++ ++ if (mp_start_test(Adapter) == _FAIL) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ goto exit; ++ } ++ ++exit: ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ mp_stop_test(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 Channel; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ if (poid_par_priv->type_of_oid == QUERY_OID) { ++ *((u32 *)poid_par_priv->information_buf) = Adapter->mppriv.channel; ++ return NDIS_STATUS_SUCCESS; ++ } ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ Channel = *((u32 *)poid_par_priv->information_buf); ++ if (Channel > 14) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ Adapter->mppriv.channel = Channel; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetChannel(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u16 bandwidth; ++ u16 channel_offset; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *padapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ bandwidth = *((u32 *)poid_par_priv->information_buf);/* 4 */ ++ channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ ++ if (bandwidth != HT_CHANNEL_WIDTH_40) ++ bandwidth = HT_CHANNEL_WIDTH_20; ++ padapter->mppriv.bandwidth = (u8)bandwidth; ++ padapter->mppriv.prime_channel_offset = (u8)channel_offset; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetBandwidth(padapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 antenna; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ if (poid_par_priv->type_of_oid == SET_OID) { ++ antenna = *(u32 *)poid_par_priv->information_buf; ++ ++ Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); ++ Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetAntenna(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ } else { ++ antenna = (Adapter->mppriv.antenna_tx << 16) | Adapter->mppriv.antenna_rx; ++ *(u32 *)poid_par_priv->information_buf = antenna; ++ } ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 tx_pwr_idx; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ tx_pwr_idx = *((u32 *)poid_par_priv->information_buf); ++ if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetTxPower(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++/* */ ++/* rtl8188eu_oid_rtl_seg_81_80_20 section start **************** */ ++/* */ ++int rtl8188eu_oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ ++ if (poid_par_priv->information_buf_len == sizeof(u32)) { ++ *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ } else { ++ status = NDIS_STATUS_INVALID_LENGTH; ++ } ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ if (poid_par_priv->information_buf_len == sizeof(u32)) { ++ *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ } else { ++ status = NDIS_STATUS_INVALID_LENGTH; ++ } ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ if (poid_par_priv->information_buf_len == sizeof(u32)) { ++ *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ } else { ++ status = NDIS_STATUS_INVALID_LENGTH; ++ } ++ ++ return status; ++} ++/* */ ++ ++int rtl8188eu_oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ ++ Adapter->mppriv.tx_pktcount = 0; ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ ++ if (poid_par_priv->information_buf_len == sizeof(u32)) { ++ Adapter->mppriv.rx_pktcount = 0; ++ Adapter->mppriv.rx_crcerrpktcount = 0; ++ } else { ++ status = NDIS_STATUS_INVALID_LENGTH; ++ } ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ResetPhyRxPktCount(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ *(u32 *)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len != sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ *(u32 *)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ ++ return status; ++} ++/* rtl8188eu_oid_rtl_seg_81_80_20 section end **************** */ ++int rtl8188eu_oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 bStartTest; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ bStartTest = *((u32 *)poid_par_priv->information_buf); ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetContinuousTx(Adapter, (u8)bStartTest); ++ if (bStartTest) { ++ struct mp_priv *pmp_priv = &Adapter->mppriv; ++ if (pmp_priv->tx.stop == 0) { ++ pmp_priv->tx.stop = 1; ++ DBG_88E("%s: pkt tx is running...\n", __func__); ++ msleep(5); ++ } ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = 1; ++ SetPacketTx(Adapter); ++ } ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 bStartTest; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ bStartTest = *((u32 *)poid_par_priv->information_buf); ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetSingleCarrierTx(Adapter, (u8)bStartTest); ++ if (bStartTest) { ++ struct mp_priv *pmp_priv = &Adapter->mppriv; ++ if (pmp_priv->tx.stop == 0) { ++ pmp_priv->tx.stop = 1; ++ DBG_88E("%s: pkt tx is running...\n", __func__); ++ msleep(5); ++ } ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = 1; ++ SetPacketTx(Adapter); ++ } ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 bStartTest; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ bStartTest = *((u32 *)poid_par_priv->information_buf); ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetCarrierSuppressionTx(Adapter, (u8)bStartTest); ++ if (bStartTest) { ++ struct mp_priv *pmp_priv = &Adapter->mppriv; ++ if (pmp_priv->tx.stop == 0) { ++ pmp_priv->tx.stop = 1; ++ DBG_88E("%s: pkt tx is running...\n", __func__); ++ msleep(5); ++ } ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = 1; ++ SetPacketTx(Adapter); ++ } ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u32 bStartTest; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ bStartTest = *((u32 *)poid_par_priv->information_buf); ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ SetSingleToneTx(Adapter, (u8)bStartTest); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ int status = NDIS_STATUS_SUCCESS; ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, NULL); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* rtl8188eu_oid_rtl_seg_81_80_00 section end **************** */ ++/* */ ++int rtl8188eu_oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct mp_rw_reg *RegRWStruct; ++ u32 offset, width; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf; ++ offset = RegRWStruct->offset; ++ width = RegRWStruct->width; ++ ++ if (offset > 0xFFF) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ switch (width) { ++ case 1: ++ RegRWStruct->value = rtw_read8(Adapter, offset); ++ break; ++ case 2: ++ RegRWStruct->value = rtw_read16(Adapter, offset); ++ break; ++ default: ++ width = 4; ++ RegRWStruct->value = rtw_read32(Adapter, offset); ++ break; ++ } ++ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ *poid_par_priv->bytes_rw = width; ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct mp_rw_reg *RegRWStruct; ++ u32 offset, value; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *padapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf; ++ offset = RegRWStruct->offset; ++ value = RegRWStruct->value; ++ ++ if (offset > 0xFFF) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ switch (RegRWStruct->width) { ++ case 1: ++ if (value > 0xFF) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ break; ++ } ++ rtw_write8(padapter, offset, (u8)value); ++ break; ++ case 2: ++ if (value > 0xFFFF) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ break; ++ } ++ rtw_write16(padapter, offset, (u16)value); ++ break; ++ case 4: ++ rtw_write32(padapter, offset, value); ++ break; ++ default: ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ break; ++ } ++ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++/* */ ++int rtl8188eu_oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++/* */ ++int rtl8188eu_oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ int status = NDIS_STATUS_SUCCESS; ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) != _SUCCESS) ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ u8 thermal = 0; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ GetThermalMeter(Adapter, &thermal); ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ *(u32 *)poid_par_priv->information_buf = (u32)thermal; ++ *poid_par_priv->bytes_rw = sizeof(u32); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->information_buf_len < sizeof(u8)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ if (poid_par_priv->type_of_oid == SET_OID) { ++ u8 enable; ++ ++ enable = *(u8 *)poid_par_priv->information_buf; ++ ++ SetPowerTracking(Adapter, enable); ++ } else { ++ GetPowerTracking(Adapter, (u8 *)poid_par_priv->information_buf); ++ } ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++/* rtl8188eu_oid_rtl_seg_87_12_00 section start **************** */ ++int rtl8188eu_oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return NDIS_STATUS_SUCCESS; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct efuse_access_struct *pefuse; ++ u8 *data; ++ u16 addr = 0, cnts = 0, max_available_size = 0; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct efuse_access_struct)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ pefuse = (struct efuse_access_struct *)poid_par_priv->information_buf; ++ addr = pefuse->start_addr; ++ cnts = pefuse->cnts; ++ data = pefuse->data; ++ ++ EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ ++ if ((addr + cnts) > max_available_size) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ if (rtw_efuse_access(Adapter, false, addr, cnts, data) == _FAIL) ++ status = NDIS_STATUS_FAILURE; ++ else ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct efuse_access_struct *pefuse; ++ u8 *data; ++ u16 addr = 0, cnts = 0, max_available_size = 0; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ pefuse = (struct efuse_access_struct *)poid_par_priv->information_buf; ++ addr = pefuse->start_addr; ++ cnts = pefuse->cnts; ++ data = pefuse->data; ++ ++ EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ ++ if ((addr + cnts) > max_available_size) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ if (rtw_efuse_access(Adapter, true, addr, cnts, data) == _FAIL) ++ status = NDIS_STATUS_FAILURE; ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct pgpkt *ppgpkt; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ *poid_par_priv->bytes_rw = 0; ++ ++ if (poid_par_priv->information_buf_len < sizeof(struct pgpkt *)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ ppgpkt = (struct pgpkt *)poid_par_priv->information_buf; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ if (poid_par_priv->type_of_oid == QUERY_OID) { ++ Efuse_PowerSwitch(Adapter, false, true); ++ if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, false)) ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ else ++ status = NDIS_STATUS_FAILURE; ++ Efuse_PowerSwitch(Adapter, false, false); ++ } else { ++ Efuse_PowerSwitch(Adapter, true, true); ++ if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, false)) ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ else ++ status = NDIS_STATUS_FAILURE; ++ Efuse_PowerSwitch(Adapter, true, false); ++ } ++ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u16 size; ++ u8 ret; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ret = efuse_GetCurrentSize(Adapter, &size); ++ _irqlevel_changed_(&oldirql, RAISE); ++ if (ret == _SUCCESS) { ++ *(u32 *)poid_par_priv->information_buf = size; ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ } else { ++ status = NDIS_STATUS_FAILURE; ++ } ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ ++ if (poid_par_priv->type_of_oid != QUERY_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(u32)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ *(u32 *)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); ++ *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status; ++ ++ if (poid_par_priv->type_of_oid == QUERY_OID) ++ status = rtl8188eu_oid_rt_pro_read_efuse_hdl(poid_par_priv); ++ else ++ status = rtl8188eu_oid_rt_pro_write_efuse_hdl(poid_par_priv); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ u8 *data; ++ int status = NDIS_STATUS_SUCCESS; ++ struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context); ++ u16 maplen = 0; ++ ++ EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&maplen, false); ++ ++ *poid_par_priv->bytes_rw = 0; ++ ++ if (poid_par_priv->information_buf_len < maplen) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ data = (u8 *)poid_par_priv->information_buf; ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ if (poid_par_priv->type_of_oid == QUERY_OID) { ++ if (rtw_efuse_map_read(Adapter, 0, maplen, data) == _SUCCESS) ++ *poid_par_priv->bytes_rw = maplen; ++ else ++ status = NDIS_STATUS_FAILURE; ++ } else { ++ /* SET_OID */ ++ if (rtw_efuse_map_write(Adapter, 0, maplen, data) == _SUCCESS) ++ *poid_par_priv->bytes_rw = maplen; ++ else ++ status = NDIS_STATUS_FAILURE; ++ } ++ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ return status; ++} ++ ++int rtl8188eu_oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ ++ if (poid_par_priv->type_of_oid != SET_OID) ++ return NDIS_STATUS_NOT_ACCEPTED; ++ ++ if (poid_par_priv->information_buf_len < sizeof(u8)) ++ return NDIS_STATUS_INVALID_LENGTH; ++ ++ return status; ++} ++ ++int rtl8188eu_oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} ++ ++int rtl8188eu_mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ struct mp_xmit_parm *pparm; ++ struct adapter *padapter; ++ struct mp_priv *pmp_priv; ++ struct pkt_attrib *pattrib; ++ ++ pparm = (struct mp_xmit_parm *)poid_par_priv->information_buf; ++ padapter = (struct adapter *)poid_par_priv->adapter_context; ++ pmp_priv = &padapter->mppriv; ++ ++ if (poid_par_priv->type_of_oid == QUERY_OID) { ++ pparm->enable = !pmp_priv->tx.stop; ++ pparm->count = pmp_priv->tx.sended; ++ } else { ++ if (pparm->enable == 0) { ++ pmp_priv->tx.stop = 1; ++ } else if (pmp_priv->tx.stop == 1) { ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = pparm->count; ++ pmp_priv->tx.payload = pparm->payload_type; ++ pattrib = &pmp_priv->tx.attrib; ++ pattrib->pktlen = pparm->length; ++ memcpy(pattrib->dst, pparm->da, ETH_ALEN); ++ SetPacketTx(padapter); ++ } else { ++ return NDIS_STATUS_FAILURE; ++ } ++ } ++ ++ return NDIS_STATUS_SUCCESS; ++} ++ ++/* */ ++int rtl8188eu_oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ int status = NDIS_STATUS_SUCCESS; ++ ++ if (poid_par_priv->type_of_oid != SET_OID) { ++ status = NDIS_STATUS_NOT_ACCEPTED; ++ return status; ++ } ++ ++ _irqlevel_changed_(&oldirql, LOWER); ++ ++ /* CALL the power_down function */ ++ _irqlevel_changed_(&oldirql, RAISE); ++ ++ return status; ++} ++/* */ ++int rtl8188eu_oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) ++{ ++ return 0; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_p2p.c b/drivers/staging/r8188eu/core/rtw_p2p.c +new file mode 100644 +index 000000000000..e2b6cf2386e0 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_p2p.c +@@ -0,0 +1,1997 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_P2P_C_ ++ ++#include "../include/drv_types.h" ++#include "../include/rtw_p2p.h" ++#include "../include/wifi.h" ++ ++#ifdef CONFIG_88EU_P2P ++ ++static int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8 *ch_list, u8 ch_cnt) ++{ ++ int found = 0, i = 0; ++ ++ for (i = 0; i < ch_cnt; i++) { ++ if (ch_list[i] == desired_ch) { ++ found = 1; ++ break; ++ } ++ } ++ return found; ++} ++ ++static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) ++{ ++ struct list_head *phead, *plist; ++ u32 len = 0; ++ u16 attr_len = 0; ++ u8 tmplen, *pdata_attr, *pstart, *pcur; ++ struct sta_info *psta = NULL; ++ struct adapter *padapter = pwdinfo->padapter; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ DBG_88E("%s\n", __func__); ++ ++ pdata_attr = kzalloc(MAX_P2P_IE_LEN, GFP_KERNEL); ++ ++ pstart = pdata_attr; ++ pcur = pdata_attr; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* look up sta asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ ++ plist = plist->next; ++ ++ if (psta->is_p2p_device) { ++ tmplen = 0; ++ ++ pcur++; ++ ++ /* P2P device address */ ++ memcpy(pcur, psta->dev_addr, ETH_ALEN); ++ pcur += ETH_ALEN; ++ ++ /* P2P interface address */ ++ memcpy(pcur, psta->hwaddr, ETH_ALEN); ++ pcur += ETH_ALEN; ++ ++ *pcur = psta->dev_cap; ++ pcur++; ++ ++ /* u16*)(pcur) = cpu_to_be16(psta->config_methods); */ ++ RTW_PUT_BE16(pcur, psta->config_methods); ++ pcur += 2; ++ ++ memcpy(pcur, psta->primary_dev_type, 8); ++ pcur += 8; ++ ++ *pcur = psta->num_of_secdev_type; ++ pcur++; ++ ++ memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type * 8); ++ pcur += psta->num_of_secdev_type * 8; ++ ++ if (psta->dev_name_len > 0) { ++ /* u16*)(pcur) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */ ++ RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME); ++ pcur += 2; ++ ++ /* u16*)(pcur) = cpu_to_be16(psta->dev_name_len); */ ++ RTW_PUT_BE16(pcur, psta->dev_name_len); ++ pcur += 2; ++ ++ memcpy(pcur, psta->dev_name, psta->dev_name_len); ++ pcur += psta->dev_name_len; ++ } ++ ++ tmplen = (u8)(pcur - pstart); ++ ++ *pstart = (tmplen - 1); ++ ++ attr_len += tmplen; ++ ++ /* pstart += tmplen; */ ++ pstart = pcur; ++ } ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ ++ if (attr_len > 0) ++ len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr); ++ ++ kfree(pdata_attr); ++ return len; ++} ++ ++static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct adapter *padapter = pwdinfo->padapter; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ unsigned char category = RTW_WLAN_CATEGORY_P2P;/* P2P action frame */ ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_GO_DISC_REQUEST; ++ u8 dialogToken = 0; ++ ++ DBG_88E("[%s]\n", __func__); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* Build P2P action frame header */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ /* there is no IE in this P2P action frame */ ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct adapter *padapter = pwdinfo->padapter; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_DEVDISC_RESP; ++ u8 p2pie[8] = { 0x00 }; ++ u32 p2pielen = 0; ++ ++ DBG_88E("[%s]\n", __func__); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* Build P2P public action frame header */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ /* Build P2P IE */ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* P2P_ATTR_STATUS */ ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, u8 *frame_body, u16 config_method) ++{ ++ struct adapter *padapter = pwdinfo->padapter; ++ unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; ++ u8 action = P2P_PUB_ACTION_ACTION; ++ u8 dialogToken = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */ ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_PROVISION_DISC_RESP; ++ u8 wpsie[100] = { 0x00 }; ++ u8 wpsielen = 0; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ wpsielen = 0; ++ /* WPS OUI */ ++ RTW_PUT_BE32(wpsie, WPSOUI); ++ wpsielen += 4; ++ ++ /* Config Method */ ++ /* Type: */ ++ RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD); ++ wpsielen += 2; ++ ++ /* Length: */ ++ RTW_PUT_BE16(wpsie + wpsielen, 0x0002); ++ wpsielen += 2; ++ ++ /* Value: */ ++ RTW_PUT_BE16(wpsie + wpsielen, config_method); ++ wpsielen += 2; ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *)wpsie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) ++{ ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ unsigned char *pframe; ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ struct adapter *padapter = pwdinfo->padapter; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ unsigned char category = RTW_WLAN_CATEGORY_P2P;/* P2P action frame */ ++ __be32 p2poui = cpu_to_be32(P2POUI); ++ u8 oui_subtype = P2P_PRESENCE_RESPONSE; ++ u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; ++ u8 noa_attr_content[32] = { 0x00 }; ++ u32 p2pielen = 0; ++ ++ DBG_88E("[%s]\n", __func__); ++ ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ return; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(padapter, pattrib); ++ ++ memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); ++ ++ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, da, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); ++ pmlmeext->mgnt_seq++; ++ SetFrameSubType(pframe, WIFI_ACTION); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* Build P2P action frame header */ ++ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&p2poui, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &oui_subtype, &pattrib->pktlen); ++ pframe = rtw_set_fixed_ie(pframe, 1, &dialogToken, &pattrib->pktlen); ++ ++ /* Add P2P IE header */ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Add Status attribute in P2P IE */ ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); ++ ++ /* Add NoA attribute in P2P IE */ ++ noa_attr_content[0] = 0x1;/* index */ ++ noa_attr_content[1] = 0x0;/* CTWindow and OppPS Parameters */ ++ ++ /* todo: Notice of Absence Descriptor(s) */ ++ ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content); ++ ++ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); ++ ++ pattrib->last_txcmdsz = pattrib->pktlen; ++ ++ dump_mgntframe(padapter, pmgntframe); ++} ++ ++u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) ++{ ++ u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; ++ u16 capability = 0; ++ u32 len = 0, p2pielen = 0; ++ __le16 le_tmp; ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* According to the P2P Specification, the beacon frame should contain 3 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. P2P Device ID */ ++ /* 3. Notice of Absence (NOA) */ ++ ++ /* P2P Capability ATTR */ ++ /* Type: */ ++ /* Length: */ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ /* Be able to participate in additional P2P Groups and */ ++ /* support the P2P Invitation Procedure */ ++ /* Group Capability Bitmap, 1 byte */ ++ capability = P2P_DEVCAP_INVITATION_PROC | P2P_DEVCAP_CLIENT_DISCOVERABILITY; ++ capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) ++ capability |= (P2P_GRPCAP_GROUP_FORMATION << 8); ++ ++ le_tmp = cpu_to_le16(capability); ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8 *)&le_tmp); ++ ++ /* P2P Device ID ATTR */ ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr); ++ ++ /* Notice of Absence ATTR */ ++ /* Type: */ ++ /* Length: */ ++ /* Value: */ ++ ++ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &len); ++ return len; ++} ++ ++u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) ++{ ++ u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; ++ u32 len = 0, p2pielen = 0; ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20100907 */ ++ /* According to the P2P Specification, the probe response frame should contain 5 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. Extended Listen Timing */ ++ /* 3. Notice of Absence (NOA) (Only GO needs this) */ ++ /* 4. Device Info */ ++ /* 5. Group Info (Only GO need this) */ ++ ++ /* P2P Capability ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ p2pie[p2pielen] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) ++ p2pie[p2pielen] |= P2P_GRPCAP_GROUP_FORMATION; ++ ++ p2pielen++; ++ } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; ++ else ++ p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; ++ } ++ ++ /* Extended Listen Timing ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 0x0004); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Availability Period */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); ++ p2pielen += 2; ++ ++ /* Availability Interval */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); ++ p2pielen += 2; ++ ++ /* Notice of Absence ATTR */ ++ /* Type: */ ++ /* Length: */ ++ /* Value: */ ++ ++ /* Device Info ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); */ ++ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */ ++ RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */ ++ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ /* Group Info ATTR */ ++ /* Type: */ ++ /* Length: */ ++ /* Value: */ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) ++ p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen); ++ ++ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &len); ++ ++ return len; ++} ++ ++u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 *pssid, u8 ussidlen, u8 *pdev_raddr) ++{ ++ u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; ++ u32 len = 0, p2pielen = 0; ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* Commented by Albert 20110301 */ ++ /* According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */ ++ /* 1. P2P Capability */ ++ /* 2. Device Info */ ++ /* 3. Group ID (When joining an operating P2P Group) */ ++ ++ /* P2P Capability ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 0x0002); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* Device Capability Bitmap, 1 byte */ ++ p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; ++ ++ /* Group Capability Bitmap, 1 byte */ ++ if (pwdinfo->persistent_supported) ++ p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; ++ else ++ p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; ++ ++ /* Device Info ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; ++ ++ /* Length: */ ++ /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ ++ /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */ ++ RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ /* P2P Device Address */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ /* Config Method */ ++ /* This field should be big endian. Noted by P2P specification. */ ++ if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC) { ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC); ++ } else { ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY); ++ } ++ ++ p2pielen += 2; ++ ++ /* Primary Device Type */ ++ /* Category ID */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); ++ p2pielen += 2; ++ ++ /* OUI */ ++ /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */ ++ RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); ++ p2pielen += 4; ++ ++ /* Sub Category ID */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); ++ p2pielen += 2; ++ ++ /* Number of Secondary Device Types */ ++ p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ ++ ++ /* Device Name */ ++ /* Type: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */ ++ RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); ++ p2pielen += 2; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */ ++ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); ++ p2pielen += pwdinfo->device_name_len; ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { ++ /* Added by Albert 2011/05/19 */ ++ /* In this case, the pdev_raddr is the device address of the group owner. */ ++ ++ /* P2P Group ID ATTR */ ++ /* Type: */ ++ p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; ++ ++ /* Length: */ ++ /* u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + ussidlen); */ ++ RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen); ++ p2pielen += 2; ++ ++ /* Value: */ ++ memcpy(p2pie + p2pielen, pdev_raddr, ETH_ALEN); ++ p2pielen += ETH_ALEN; ++ ++ memcpy(p2pie + p2pielen, pssid, ussidlen); ++ p2pielen += ussidlen; ++ } ++ ++ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &len); ++ ++ return len; ++} ++ ++u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code) ++{ ++ u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; ++ u32 len = 0, p2pielen = 0; ++ ++ /* P2P OUI */ ++ p2pielen = 0; ++ p2pie[p2pielen++] = 0x50; ++ p2pie[p2pielen++] = 0x6F; ++ p2pie[p2pielen++] = 0x9A; ++ p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ ++ ++ /* According to the P2P Specification, the Association response frame should contain 2 P2P attributes */ ++ /* 1. Status */ ++ /* 2. Extended Listen Timing (optional) */ ++ ++ /* Status ATTR */ ++ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code); ++ ++ /* Extended Listen Timing ATTR */ ++ /* Type: */ ++ /* Length: */ ++ /* Value: */ ++ ++ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *)p2pie, &len); ++ ++ return len; ++} ++ ++u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) ++{ ++ u32 len = 0; ++ ++ return len; ++} ++ ++u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ u8 *p; ++ u32 ret = false; ++ u8 *p2pie; ++ u32 p2pielen = 0; ++ int ssid_len = 0, rate_cnt = 0; ++ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt, ++ len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); ++ ++ if (rate_cnt <= 4) { ++ int i, g_rate = 0; ++ ++ for (i = 0; i < rate_cnt; i++) { ++ if (((*(p + 2 + i) & 0xff) != 0x02) && ++ ((*(p + 2 + i) & 0xff) != 0x04) && ++ ((*(p + 2 + i) & 0xff) != 0x0B) && ++ ((*(p + 2 + i) & 0xff) != 0x16)) ++ g_rate = 1; ++ } ++ ++ if (g_rate == 0) { ++ /* There is no OFDM rate included in SupportedRates IE of this probe request frame */ ++ /* The driver should response this probe request. */ ++ return ret; ++ } ++ } else { ++ /* rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. */ ++ /* We should proceed the following check for this probe request. */ ++ } ++ ++ /* Added comments by Albert 20100906 */ ++ /* There are several items we should check here. */ ++ /* 1. This probe request frame must contain the P2P IE. (Done) */ ++ /* 2. This probe request frame must contain the wildcard SSID. (Done) */ ++ /* 3. Wildcard BSSID. (Todo) */ ++ /* 4. Destination Address. (Done in mgt_dispatcher function) */ ++ /* 5. Requested Device Type in WSC IE. (Todo) */ ++ /* 6. Device ID attribute in P2P IE. (Todo) */ ++ ++ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len, ++ len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); ++ ++ ssid_len &= 0xff; /* Just last 1 byte is valid for ssid len of the probe request */ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ p2pie = rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_, NULL, &p2pielen); ++ if (p2pie) { ++ if (p && !memcmp((void *)(p + 2), (void *)pwdinfo->p2p_wildcard_ssid, 7)) { ++ /* todo: */ ++ /* Check Requested Device Type attributes in WSC IE. */ ++ /* Check Device ID attribute in P2P IE */ ++ ++ ret = true; ++ } else if (p && ssid_len == 0) { ++ ret = true; ++ } ++ } else { ++ /* non -p2p device */ ++ } ++ } ++ ++ return ret; ++} ++ ++u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta) ++{ ++ u8 status_code = P2P_STATUS_SUCCESS; ++ u8 *pbuf, *pattr_content = NULL; ++ u32 attr_contentlen = 0; ++ u16 cap_attr = 0; ++ unsigned short frame_type, ie_offset = 0; ++ u8 *ies; ++ u32 ies_len; ++ u8 *p2p_ie; ++ u32 p2p_ielen = 0; ++ __be16 be_tmp; ++ __le16 le_tmp; ++ ++ if (!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) ++ return P2P_STATUS_FAIL_REQUEST_UNABLE; ++ ++ frame_type = GetFrameSubType(pframe); ++ if (frame_type == WIFI_ASSOCREQ) ++ ie_offset = _ASOCREQ_IE_OFFSET_; ++ else /* WIFI_REASSOCREQ */ ++ ie_offset = _REASOCREQ_IE_OFFSET_; ++ ++ ies = pframe + WLAN_HDR_A3_LEN + ie_offset; ++ ies_len = len - WLAN_HDR_A3_LEN - ie_offset; ++ ++ p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); ++ ++ if (!p2p_ie) { ++ DBG_88E("[%s] P2P IE not Found!!\n", __func__); ++ status_code = P2P_STATUS_FAIL_INVALID_PARAM; ++ } else { ++ DBG_88E("[%s] P2P IE Found!!\n", __func__); ++ } ++ ++ while (p2p_ie) { ++ /* Check P2P Capability ATTR */ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&le_tmp, (uint *)&attr_contentlen)) { ++ DBG_88E("[%s] Got P2P Capability Attr!!\n", __func__); ++ cap_attr = le16_to_cpu(le_tmp); ++ psta->dev_cap = cap_attr & 0xff; ++ } ++ ++ /* Check Extended Listen Timing ATTR */ ++ ++ /* Check P2P Device Info ATTR */ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint *)&attr_contentlen)) { ++ DBG_88E("[%s] Got P2P DEVICE INFO Attr!!\n", __func__); ++ pattr_content = kzalloc(attr_contentlen, GFP_KERNEL); ++ pbuf = pattr_content; ++ if (pattr_content) { ++ u8 num_of_secdev_type; ++ u16 dev_name_len; ++ ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, pattr_content, (uint *)&attr_contentlen); ++ ++ memcpy(psta->dev_addr, pattr_content, ETH_ALEN);/* P2P Device Address */ ++ ++ pattr_content += ETH_ALEN; ++ ++ memcpy(&be_tmp, pattr_content, 2);/* Config Methods */ ++ psta->config_methods = be16_to_cpu(be_tmp); ++ ++ pattr_content += 2; ++ ++ memcpy(psta->primary_dev_type, pattr_content, 8); ++ ++ pattr_content += 8; ++ ++ num_of_secdev_type = *pattr_content; ++ pattr_content += 1; ++ ++ if (num_of_secdev_type == 0) { ++ psta->num_of_secdev_type = 0; ++ } else { ++ u32 len; ++ ++ psta->num_of_secdev_type = num_of_secdev_type; ++ ++ len = (sizeof(psta->secdev_types_list) < (num_of_secdev_type * 8)) ? ++ (sizeof(psta->secdev_types_list)) : (num_of_secdev_type * 8); ++ ++ memcpy(psta->secdev_types_list, pattr_content, len); ++ ++ pattr_content += (num_of_secdev_type * 8); ++ } ++ ++ psta->dev_name_len = 0; ++ if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(__be16 *)pattr_content)) { ++ dev_name_len = be16_to_cpu(*(__be16 *)(pattr_content + 2)); ++ ++ psta->dev_name_len = (sizeof(psta->dev_name) < dev_name_len) ? sizeof(psta->dev_name) : dev_name_len; ++ ++ memcpy(psta->dev_name, pattr_content + 4, psta->dev_name_len); ++ } ++ kfree(pbuf); ++ } ++ } ++ ++ /* Get the next P2P IE */ ++ p2p_ie = rtw_get_p2p_ie(p2p_ie + p2p_ielen, ies_len - (p2p_ie - ies + p2p_ielen), NULL, &p2p_ielen); ++ } ++ ++ return status_code; ++} ++ ++u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ u8 *frame_body; ++ u8 status, dialogToken; ++ struct sta_info *psta = NULL; ++ struct adapter *padapter = pwdinfo->padapter; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 *p2p_ie; ++ u32 p2p_ielen = 0; ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ dialogToken = frame_body[7]; ++ status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; ++ ++ p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); ++ if (p2p_ie) { ++ u8 groupid[38] = { 0x00 }; ++ u8 dev_addr[ETH_ALEN] = { 0x00 }; ++ u32 attr_contentlen = 0; ++ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { ++ if (!memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && ++ !memcmp(pwdinfo->p2p_group_ssid, groupid + ETH_ALEN, pwdinfo->p2p_group_ssid_len)) { ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) { ++ struct list_head *phead, *plist; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* look up sta asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ ++ plist = plist->next; ++ ++ if (psta->is_p2p_device && (psta->dev_cap & P2P_DEVCAP_CLIENT_DISCOVERABILITY) && ++ !memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) { ++ /* issue GO Discoverability Request */ ++ issue_group_disc_req(pwdinfo, psta->hwaddr); ++ status = P2P_STATUS_SUCCESS; ++ break; ++ } else { ++ status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ } ++ } ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ } else { ++ status = P2P_STATUS_FAIL_INVALID_PARAM; ++ } ++ } else { ++ status = P2P_STATUS_FAIL_INVALID_PARAM; ++ } ++ } ++ } ++ ++ /* issue Device Discoverability Response */ ++ issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); ++ ++ return (status == P2P_STATUS_SUCCESS) ? true : false; ++} ++ ++u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ return true; ++} ++ ++u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ u8 *frame_body; ++ u8 *wpsie; ++ uint wps_ielen = 0, attr_contentlen = 0; ++ u16 uconfig_method = 0; ++ __be16 be_tmp; ++ ++ frame_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ wpsie = rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen); ++ if (wpsie) { ++ if (rtw_get_wps_attr_content(wpsie, wps_ielen, WPS_ATTR_CONF_METHOD, (u8 *)&be_tmp, &attr_contentlen)) { ++ uconfig_method = be16_to_cpu(be_tmp); ++ switch (uconfig_method) { ++ case WPS_CM_DISPLYA: ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); ++ break; ++ case WPS_CM_LABEL: ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3); ++ break; ++ case WPS_CM_PUSH_BUTTON: ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); ++ break; ++ case WPS_CM_KEYPAD: ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); ++ break; ++ } ++ issue_p2p_provision_resp(pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); ++ } ++ } ++ DBG_88E("[%s] config method = %s\n", __func__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req); ++ return true; ++} ++ ++u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) ++{ ++ return true; ++} ++ ++static u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list) ++{ ++ u8 i = 0, j = 0; ++ u8 temp = 0; ++ u8 ch_no = 0; ++ ch_content += 3; ++ ch_cnt -= 3; ++ ++ while (ch_cnt > 0) { ++ ch_content += 1; ++ ch_cnt -= 1; ++ temp = *ch_content; ++ for (i = 0 ; i < temp ; i++, j++) ++ peer_ch_list[j] = *(ch_content + 1 + i); ++ ch_content += (temp + 1); ++ ch_cnt -= (temp + 1); ++ ch_no += temp; ++ } ++ ++ return ch_no; ++} ++ ++static u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned) ++{ ++ int i = 0, j = 0, temp = 0; ++ u8 ch_no = 0; ++ ++ for (i = 0; i < peer_ch_num; i++) { ++ for (j = temp; j < pmlmeext->max_chan_nums; j++) { ++ if (*(peer_ch_list + i) == pmlmeext->channel_set[j].ChannelNum) { ++ ch_list_inclusioned[ch_no++] = *(peer_ch_list + i); ++ temp = j; ++ break; ++ } ++ } ++ } ++ ++ return ch_no; ++} ++ ++u8 process_p2p_group_negotation_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ struct adapter *padapter = pwdinfo->padapter; ++ u8 result = P2P_STATUS_SUCCESS; ++ u32 p2p_ielen = 0, wps_ielen = 0; ++ u8 *ies; ++ u32 ies_len; ++ u8 *p2p_ie; ++ u8 *wpsie; ++ u16 wps_devicepassword_id = 0x0000; ++ uint wps_devicepassword_id_len = 0; ++ __be16 be_tmp; ++ ++ wpsie = rtw_get_wps_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen); ++ if (wpsie) { ++ /* Commented by Kurt 20120113 */ ++ /* If some device wants to do p2p handshake without sending prov_disc_req */ ++ /* We have to get peer_req_cm from here. */ ++ if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) { ++ rtw_get_wps_attr_content(wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8 *)&be_tmp, &wps_devicepassword_id_len); ++ wps_devicepassword_id = be16_to_cpu(be_tmp); ++ ++ if (wps_devicepassword_id == WPS_DPID_USER_SPEC) ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); ++ else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); ++ else ++ memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); ++ } ++ } else { ++ DBG_88E("[%s] WPS IE not Found!!\n", __func__); ++ result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ return result; ++ } ++ ++ if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO) { ++ result = P2P_STATUS_FAIL_INFO_UNAVAILABLE; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INFOR_NOREADY); ++ return result; ++ } ++ ++ ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ++ ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; ++ ++ p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); ++ ++ if (!p2p_ie) { ++ DBG_88E("[%s] P2P IE not Found!!\n", __func__); ++ result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ } ++ ++ while (p2p_ie) { ++ u8 attr_content = 0x00; ++ u32 attr_contentlen = 0; ++ u8 ch_content[50] = { 0x00 }; ++ uint ch_cnt = 0; ++ u8 peer_ch_list[50] = { 0x00 }; ++ u8 peer_ch_num = 0; ++ u8 ch_list_inclusioned[50] = { 0x00 }; ++ u8 ch_num_inclusioned = 0; ++ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING); ++ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen)) { ++ DBG_88E("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01); ++ pwdinfo->peer_intent = attr_content; /* include both intent and tie breaker values. */ ++ ++ if (pwdinfo->intent == (pwdinfo->peer_intent >> 1)) { ++ /* Try to match the tie breaker value */ ++ if (pwdinfo->intent == P2P_MAX_INTENT) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; ++ } else { ++ if (attr_content & 0x01) ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ else ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } ++ } else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1)) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ } ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* Store the group id information. */ ++ memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN); ++ memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); ++ } ++ } ++ ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen)) { ++ if (attr_contentlen != ETH_ALEN) ++ memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); ++ } ++ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt)) { ++ peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list); ++ ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned); ++ ++ if (ch_num_inclusioned == 0) { ++ DBG_88E("[%s] No common channel in channel list!\n", __func__); ++ result = P2P_STATUS_FAIL_NO_COMMON_CH; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ break; ++ } ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel, ++ ch_list_inclusioned, ch_num_inclusioned)) { ++ u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0; ++ attr_contentlen = 0; ++ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) ++ peer_operating_ch = operatingch_info[4]; ++ ++ if (rtw_p2p_is_channel_list_ok(peer_operating_ch, ++ ch_list_inclusioned, ch_num_inclusioned)) { ++ /** ++ * Change our operating channel as peer's for compatibility. ++ */ ++ pwdinfo->operating_channel = peer_operating_ch; ++ DBG_88E("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel); ++ } else { ++ /* Take first channel of ch_list_inclusioned as operating channel */ ++ pwdinfo->operating_channel = ch_list_inclusioned[0]; ++ DBG_88E("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel); ++ } ++ } ++ } ++ } ++ ++ /* Get the next P2P IE */ ++ p2p_ie = rtw_get_p2p_ie(p2p_ie + p2p_ielen, ies_len - (p2p_ie - ies + p2p_ielen), NULL, &p2p_ielen); ++ } ++ return result; ++} ++ ++u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ struct adapter *padapter = pwdinfo->padapter; ++ u8 result = P2P_STATUS_SUCCESS; ++ u32 p2p_ielen, wps_ielen; ++ u8 *ies; ++ u32 ies_len; ++ u8 *p2p_ie; ++ ++ ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ++ ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; ++ ++ /* Be able to know which one is the P2P GO and which one is P2P client. */ ++ ++ if (rtw_get_wps_ie(ies, ies_len, NULL, &wps_ielen)) { ++ } else { ++ DBG_88E("[%s] WPS IE not Found!!\n", __func__); ++ result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ } ++ ++ p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); ++ if (!p2p_ie) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; ++ } else { ++ u8 attr_content = 0x00; ++ u32 attr_contentlen = 0; ++ u8 operatingch_info[5] = { 0x00 }; ++ u8 groupid[38]; ++ u8 peer_ch_list[50] = { 0x00 }; ++ u8 peer_ch_num = 0; ++ u8 ch_list_inclusioned[50] = { 0x00 }; ++ u8 ch_num_inclusioned = 0; ++ ++ while (p2p_ie) { /* Found the P2P IE. */ ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); ++ if (attr_contentlen == 1) { ++ DBG_88E("[%s] Status = %d\n", __func__, attr_content); ++ if (attr_content == P2P_STATUS_SUCCESS) { ++ /* Do nothing. */ ++ } else { ++ if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY); ++ } else { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ } ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ result = attr_content; ++ break; ++ } ++ } ++ ++ /* Try to get the peer's interface address */ ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen)) { ++ if (attr_contentlen != ETH_ALEN) ++ memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); ++ } ++ ++ /* Try to get the peer's intent and tie breaker value. */ ++ attr_content = 0x00; ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen)) { ++ DBG_88E("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01); ++ pwdinfo->peer_intent = attr_content; /* include both intent and tie breaker values. */ ++ ++ if (pwdinfo->intent == (pwdinfo->peer_intent >> 1)) { ++ /* Try to match the tie breaker value */ ++ if (pwdinfo->intent == P2P_MAX_INTENT) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ } else { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ if (attr_content & 0x01) ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ else ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } ++ } else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1)) { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } else { ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ } ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ /* Store the group id information. */ ++ memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN); ++ memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); ++ } ++ } ++ ++ /* Try to get the operation channel information */ ++ ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) { ++ DBG_88E("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]); ++ pwdinfo->peer_operating_ch = operatingch_info[4]; ++ } ++ ++ /* Try to get the channel list information */ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len)) { ++ DBG_88E("[%s] channel list attribute found, len = %d\n", __func__, pwdinfo->channel_list_attr_len); ++ ++ peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list); ++ ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned); ++ ++ if (ch_num_inclusioned == 0) { ++ DBG_88E("[%s] No common channel in channel list!\n", __func__); ++ result = P2P_STATUS_FAIL_NO_COMMON_CH; ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ break; ++ } ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel, ++ ch_list_inclusioned, ch_num_inclusioned)) { ++ u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0; ++ attr_contentlen = 0; ++ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) ++ peer_operating_ch = operatingch_info[4]; ++ ++ if (rtw_p2p_is_channel_list_ok(peer_operating_ch, ++ ch_list_inclusioned, ch_num_inclusioned)) { ++ /** ++ * Change our operating channel as peer's for compatibility. ++ */ ++ pwdinfo->operating_channel = peer_operating_ch; ++ DBG_88E("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel); ++ } else { ++ /* Take first channel of ch_list_inclusioned as operating channel */ ++ pwdinfo->operating_channel = ch_list_inclusioned[0]; ++ DBG_88E("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel); ++ } ++ } ++ } ++ } else { ++ DBG_88E("[%s] channel list attribute not found!\n", __func__); ++ } ++ ++ /* Try to get the group id information if peer is GO */ ++ attr_contentlen = 0; ++ memset(groupid, 0x00, 38); ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { ++ memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN); ++ memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN); ++ } ++ ++ /* Get the next P2P IE */ ++ p2p_ie = rtw_get_p2p_ie(p2p_ie + p2p_ielen, ies_len - (p2p_ie - ies + p2p_ielen), NULL, &p2p_ielen); ++ } ++ } ++ return result; ++} ++ ++u8 process_p2p_group_negotation_confirm(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ u8 *ies; ++ u32 ies_len; ++ u8 *p2p_ie; ++ u32 p2p_ielen = 0; ++ u8 result = P2P_STATUS_SUCCESS; ++ ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ++ ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; ++ ++ p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); ++ while (p2p_ie) { /* Found the P2P IE. */ ++ u8 attr_content = 0x00, operatingch_info[5] = { 0x00 }; ++ u8 groupid[38] = { 0x00 }; ++ u32 attr_contentlen = 0; ++ ++ pwdinfo->negotiation_dialog_token = 1; ++ rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); ++ if (attr_contentlen == 1) { ++ DBG_88E("[%s] Status = %d\n", __func__, attr_content); ++ result = attr_content; ++ ++ if (attr_content == P2P_STATUS_SUCCESS) { ++ u8 bcancelled = 0; ++ ++ _cancel_timer(&pwdinfo->restore_p2p_state_timer, &bcancelled); ++ ++ /* Commented by Albert 20100911 */ ++ /* Todo: Need to handle the case which both Intents are the same. */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ if ((pwdinfo->intent) > (pwdinfo->peer_intent >> 1)) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } else if ((pwdinfo->intent) < (pwdinfo->peer_intent >> 1)) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ } else { ++ /* Have to compare the Tie Breaker */ ++ if (pwdinfo->peer_intent & 0x01) ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ else ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ } ++ } else { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); ++ break; ++ } ++ } ++ ++ /* Try to get the group id information */ ++ attr_contentlen = 0; ++ memset(groupid, 0x00, 38); ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { ++ DBG_88E("[%s] Ssid = %s, ssidlen = %zu\n", __func__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN])); ++ memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN); ++ memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN); ++ } ++ ++ attr_contentlen = 0; ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) { ++ DBG_88E("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]); ++ pwdinfo->peer_operating_ch = operatingch_info[4]; ++ } ++ ++ /* Get the next P2P IE */ ++ p2p_ie = rtw_get_p2p_ie(p2p_ie + p2p_ielen, ies_len - (p2p_ie - ies + p2p_ielen), NULL, &p2p_ielen); ++ } ++ return result; ++} ++ ++u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) ++{ ++ u8 *frame_body; ++ u8 dialogToken = 0; ++ u8 status = P2P_STATUS_SUCCESS; ++ ++ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); ++ ++ dialogToken = frame_body[6]; ++ ++ /* todo: check NoA attribute */ ++ ++ issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); ++ ++ return true; ++} ++ ++static void find_phase_handler(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ndis_802_11_ssid ssid; ++ ++ memset((unsigned char *)&ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN); ++ ssid.SsidLength = P2P_WILDCARD_SSID_LEN; ++ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ spin_unlock_bh(&pmlmepriv->lock); ++ ++} ++ ++void p2p_concurrent_handler(struct adapter *padapter); ++ ++static void restore_p2p_state_handler(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { ++ /* In the P2P client mode, the driver should not switch back to its listen channel */ ++ /* because this P2P client should stay at the operating channel of P2P GO. */ ++ set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ } ++ ++} ++ ++static void pre_tx_invitereq_handler(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 val8 = 1; ++ ++ set_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); ++ issue_probereq_p2p(padapter, NULL); ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ ++} ++ ++static void pre_tx_provdisc_handler(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 val8 = 1; ++ ++ set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); ++ issue_probereq_p2p(padapter, NULL); ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ ++} ++ ++static void pre_tx_negoreq_handler(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 val8 = 1; ++ ++ set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); ++ issue_probereq_p2p(padapter, NULL); ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ ++} ++ ++void p2p_protocol_wk_hdl(struct adapter *padapter, int intCmdType) ++{ ++ ++ switch (intCmdType) { ++ case P2P_FIND_PHASE_WK: ++ find_phase_handler(padapter); ++ break; ++ case P2P_RESTORE_STATE_WK: ++ restore_p2p_state_handler(padapter); ++ break; ++ case P2P_PRE_TX_PROVDISC_PROCESS_WK: ++ pre_tx_provdisc_handler(padapter); ++ break; ++ case P2P_PRE_TX_INVITEREQ_PROCESS_WK: ++ pre_tx_invitereq_handler(padapter); ++ break; ++ case P2P_PRE_TX_NEGOREQ_PROCESS_WK: ++ pre_tx_negoreq_handler(padapter); ++ break; ++ } ++ ++} ++ ++void process_p2p_ps_ie(struct adapter *padapter, u8 *IEs, u32 IELength) ++{ ++ u8 *ies; ++ u32 ies_len; ++ u8 *p2p_ie; ++ u32 p2p_ielen = 0; ++ u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };/* NoA length should be n*(13) + 2 */ ++ u32 attr_contentlen = 0; ++ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 find_p2p = false, find_p2p_ps = false; ++ u8 noa_offset, noa_num, noa_index; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ if (IELength <= _BEACON_IE_OFFSET_) ++ return; ++ ++ ies = IEs + _BEACON_IE_OFFSET_; ++ ies_len = IELength - _BEACON_IE_OFFSET_; ++ ++ p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); ++ ++ while (p2p_ie) { ++ find_p2p = true; ++ /* Get Notice of Absence IE. */ ++ if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) { ++ find_p2p_ps = true; ++ noa_index = noa_attr[0]; ++ ++ if ((pwdinfo->p2p_ps_mode == P2P_PS_NONE) || ++ (noa_index != pwdinfo->noa_index)) { /* if index change, driver should reconfigure related setting. */ ++ pwdinfo->noa_index = noa_index; ++ pwdinfo->opp_ps = noa_attr[1] >> 7; ++ pwdinfo->ctwindow = noa_attr[1] & 0x7F; ++ ++ noa_offset = 2; ++ noa_num = 0; ++ /* NoA length should be n*(13) + 2 */ ++ if (attr_contentlen > 2) { ++ while (noa_offset < attr_contentlen) { ++ /* memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); */ ++ pwdinfo->noa_count[noa_num] = noa_attr[noa_offset]; ++ noa_offset += 1; ++ ++ memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4); ++ noa_offset += 4; ++ ++ memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4); ++ noa_offset += 4; ++ ++ memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4); ++ noa_offset += 4; ++ ++ noa_num++; ++ } ++ } ++ pwdinfo->noa_num = noa_num; ++ ++ if (pwdinfo->opp_ps == 1) { ++ pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW; ++ /* driver should wait LPS for entering CTWindow */ ++ if (padapter->pwrctrlpriv.bFwCurrentInPSMode) ++ p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); ++ } else if (pwdinfo->noa_num > 0) { ++ pwdinfo->p2p_ps_mode = P2P_PS_NOA; ++ p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); ++ } else if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { ++ p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); ++ } ++ } ++ ++ break; /* find target, just break. */ ++ } ++ ++ /* Get the next P2P IE */ ++ p2p_ie = rtw_get_p2p_ie(p2p_ie + p2p_ielen, ies_len - (p2p_ie - ies + p2p_ielen), NULL, &p2p_ielen); ++ } ++ ++ if (find_p2p) { ++ if ((pwdinfo->p2p_ps_mode > P2P_PS_NONE) && !find_p2p_ps) ++ p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); ++ } ++ ++} ++ ++void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ /* Pre action for p2p state */ ++ switch (p2p_ps_state) { ++ case P2P_PS_DISABLE: ++ pwdinfo->p2p_ps_state = p2p_ps_state; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); ++ ++ pwdinfo->noa_index = 0; ++ pwdinfo->ctwindow = 0; ++ pwdinfo->opp_ps = 0; ++ pwdinfo->noa_num = 0; ++ pwdinfo->p2p_ps_mode = P2P_PS_NONE; ++ if (padapter->pwrctrlpriv.bFwCurrentInPSMode) { ++ if (pwrpriv->smart_ps == 0) { ++ pwrpriv->smart_ps = 2; ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode)); ++ } ++ } ++ break; ++ case P2P_PS_ENABLE: ++ if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { ++ pwdinfo->p2p_ps_state = p2p_ps_state; ++ ++ if (pwdinfo->ctwindow > 0) { ++ if (pwrpriv->smart_ps != 0) { ++ pwrpriv->smart_ps = 0; ++ DBG_88E("%s(): Enter CTW, change SmartPS\n", __func__); ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode)); ++ } ++ } ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); ++ } ++ break; ++ case P2P_PS_SCAN: ++ case P2P_PS_SCAN_DONE: ++ case P2P_PS_ALLSTASLEEP: ++ if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { ++ pwdinfo->p2p_ps_state = p2p_ps_state; ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); ++ } ++ break; ++ default: ++ break; ++ } ++ ++} ++ ++u8 p2p_ps_wk_cmd(struct adapter *padapter, u8 p2p_ps_state, u8 enqueue) ++{ ++ struct cmd_obj *ph2c; ++ struct drvextra_cmd_parm *pdrvextra_cmd_parm; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ struct cmd_priv *pcmdpriv = &padapter->cmdpriv; ++ u8 res = _SUCCESS; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return res; ++ ++ if (enqueue) { ++ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); ++ if (!ph2c) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); ++ if (!pdrvextra_cmd_parm) { ++ kfree(ph2c); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID; ++ pdrvextra_cmd_parm->type_size = p2p_ps_state; ++ pdrvextra_cmd_parm->pbuf = NULL; ++ ++ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); ++ ++ res = rtw_enqueue_cmd(pcmdpriv, ph2c); ++ } else { ++ p2p_ps_wk_hdl(padapter, p2p_ps_state); ++ } ++ ++exit: ++ ++ return res; ++} ++ ++static void reset_ch_sitesurvey_timer_process(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, pwrctrlpriv.pwr_state_check_timer); ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ ++ DBG_88E("[%s] In\n", __func__); ++ /* Reset the operation channel information */ ++ pwdinfo->rx_invitereq_info.operation_ch[0] = 0; ++ pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; ++} ++ ++static void reset_ch_sitesurvey_timer_process2(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, pwrctrlpriv.pwr_state_check_timer); ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ ++ DBG_88E("[%s] In\n", __func__); ++ /* Reset the operation channel information */ ++ pwdinfo->p2p_info.operation_ch[0] = 0; ++ pwdinfo->p2p_info.scan_op_ch_only = 0; ++} ++ ++static void restore_p2p_state_timer_process(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, wdinfo.restore_p2p_state_timer); ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ ++ p2p_protocol_wk_cmd(adapter, P2P_RESTORE_STATE_WK); ++} ++ ++static void pre_tx_scan_timer_process(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, wdinfo.pre_tx_scan_timer); ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) { ++ if (pwdinfo->tx_prov_disc_info.benable) { /* the provision discovery request frame is trigger to send or not */ ++ p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK); ++ /* issue_probereq_p2p(adapter, NULL); */ ++ /* _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); */ ++ } ++ } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { ++ if (pwdinfo->nego_req_info.benable) ++ p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK); ++ } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) { ++ if (pwdinfo->invitereq_info.benable) ++ p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK); ++ } else { ++ DBG_88E("[%s] p2p_state is %d, ignore!!\n", __func__, rtw_p2p_state(pwdinfo)); ++ } ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++static void find_phase_timer_process(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, wdinfo.find_phase_timer); ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++ ++ adapter->wdinfo.find_phase_state_exchange_cnt++; ++ ++ p2p_protocol_wk_cmd(adapter, P2P_FIND_PHASE_WK); ++} ++ ++void reset_global_wifidirect_info(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo; ++ ++ pwdinfo = &padapter->wdinfo; ++ pwdinfo->persistent_supported = 0; ++ pwdinfo->session_available = true; ++ pwdinfo->wfd_tdls_enable = 0; ++ pwdinfo->wfd_tdls_weaksec = 0; ++} ++ ++void rtw_init_wifidirect_timers(struct adapter *padapter) ++{ ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ timer_setup(&pwdinfo->find_phase_timer, find_phase_timer_process, 0); ++ timer_setup(&pwdinfo->restore_p2p_state_timer, restore_p2p_state_timer_process, 0); ++ timer_setup(&pwdinfo->pre_tx_scan_timer, pre_tx_scan_timer_process, 0); ++ timer_setup(&pwdinfo->reset_ch_sitesurvey, reset_ch_sitesurvey_timer_process, 0); ++ timer_setup(&pwdinfo->reset_ch_sitesurvey2, reset_ch_sitesurvey_timer_process2, 0); ++} ++ ++void rtw_init_wifidirect_addrs(struct adapter *padapter, u8 *dev_addr, u8 *iface_addr) ++{ ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ /*init device&interface address */ ++ if (dev_addr) ++ memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN); ++ if (iface_addr) ++ memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN); ++#endif ++} ++ ++void init_wifidirect_info(struct adapter *padapter, enum P2P_ROLE role) ++{ ++ struct wifidirect_info *pwdinfo; ++ ++ pwdinfo = &padapter->wdinfo; ++ pwdinfo->padapter = padapter; ++ ++ /* 1, 6, 11 are the social channel defined in the WiFi Direct specification. */ ++ pwdinfo->social_chan[0] = 1; ++ pwdinfo->social_chan[1] = 6; ++ pwdinfo->social_chan[2] = 11; ++ pwdinfo->social_chan[3] = 0; /* channel 0 for scanning ending in site survey function. */ ++ ++ /* Use the channel 11 as the listen channel */ ++ pwdinfo->listen_channel = 11; ++ ++ if (role == P2P_ROLE_DEVICE) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); ++ pwdinfo->intent = 1; ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN); ++ } else if (role == P2P_ROLE_CLIENT) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ pwdinfo->intent = 1; ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ } else if (role == P2P_ROLE_GO) { ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ pwdinfo->intent = 15; ++ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); ++ } ++ ++/* Use the OFDM rate in the P2P probe response frame. (6(B), 9(B), 12, 18, 24, 36, 48, 54) */ ++ pwdinfo->support_rate[0] = 0x8c; /* 6(B) */ ++ pwdinfo->support_rate[1] = 0x92; /* 9(B) */ ++ pwdinfo->support_rate[2] = 0x18; /* 12 */ ++ pwdinfo->support_rate[3] = 0x24; /* 18 */ ++ pwdinfo->support_rate[4] = 0x30; /* 24 */ ++ pwdinfo->support_rate[5] = 0x48; /* 36 */ ++ pwdinfo->support_rate[6] = 0x60; /* 48 */ ++ pwdinfo->support_rate[7] = 0x6c; /* 54 */ ++ ++ memcpy(pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7); ++ ++ memset(pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN); ++ pwdinfo->device_name_len = 0; ++ ++ memset(&pwdinfo->invitereq_info, 0x00, sizeof(struct tx_invite_req_info)); ++ pwdinfo->invitereq_info.token = 3; /* Token used for P2P invitation request frame. */ ++ ++ memset(&pwdinfo->inviteresp_info, 0x00, sizeof(struct tx_invite_resp_info)); ++ pwdinfo->inviteresp_info.token = 0; ++ ++ pwdinfo->profileindex = 0; ++ memset(&pwdinfo->profileinfo[0], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM); ++ ++ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); ++ ++ pwdinfo->listen_dwell = (u8)((jiffies % 3) + 1); ++ ++ memset(&pwdinfo->tx_prov_disc_info, 0x00, sizeof(struct tx_provdisc_req_info)); ++ pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE; ++ ++ memset(&pwdinfo->nego_req_info, 0x00, sizeof(struct tx_nego_req_info)); ++ ++ pwdinfo->device_password_id_for_nego = WPS_DPID_PBC; ++ pwdinfo->negotiation_dialog_token = 1; ++ ++ memset(pwdinfo->nego_ssid, 0x00, WLAN_SSID_MAXLEN); ++ pwdinfo->nego_ssidlen = 0; ++ ++ pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO; ++ pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD; ++ pwdinfo->channel_list_attr_len = 0; ++ memset(pwdinfo->channel_list_attr, 0x00, 100); ++ ++ memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4); ++ memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3); ++ memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info)); ++ pwdinfo->wfd_tdls_enable = 0; ++ memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); ++ memset(pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN); ++ ++ pwdinfo->rx_invitereq_info.operation_ch[0] = 0; ++ pwdinfo->rx_invitereq_info.operation_ch[1] = 0; /* Used to indicate the scan end in site survey function */ ++ pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; ++ pwdinfo->p2p_info.operation_ch[0] = 0; ++ pwdinfo->p2p_info.operation_ch[1] = 0; /* Used to indicate the scan end in site survey function */ ++ pwdinfo->p2p_info.scan_op_ch_only = 0; ++} ++ ++int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role) ++{ ++ int ret = _SUCCESS; ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT || role == P2P_ROLE_GO) { ++ /* leave IPS/Autosuspend */ ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* Added by Albert 2011/03/22 */ ++ /* In the P2P mode, the driver should not support the b mode. */ ++ /* So, the Tx packet shouldn't use the CCK rate */ ++ update_tx_basic_rate(padapter, (WIRELESS_11G | WIRELESS_11_24N)); ++ ++ /* Enable P2P function */ ++ init_wifidirect_info(padapter, role); ++ ++ rtw_hal_set_odm_var(padapter, HAL_ODM_P2P_STATE, NULL, true); ++ } else if (role == P2P_ROLE_DISABLE) { ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* Disable P2P function */ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ _cancel_timer_ex(&pwdinfo->find_phase_timer); ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ _cancel_timer_ex(&pwdinfo->pre_tx_scan_timer); ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); ++ _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey2); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); ++ rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE); ++ memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info)); ++ } ++ ++ rtw_hal_set_odm_var(padapter, HAL_ODM_P2P_STATE, NULL, false); ++ ++ /* Restore to initial setting. */ ++ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); ++ } ++ ++exit: ++ return ret; ++} ++ ++#else ++u8 p2p_ps_wk_cmd(struct adapter *padapter, u8 p2p_ps_state, u8 enqueue) ++{ ++ return _FAIL; ++} ++ ++void process_p2p_ps_ie(struct adapter *padapter, u8 *IEs, u32 IELength) ++{ ++} ++ ++#endif /* CONFIG_88EU_P2P */ +diff --git a/drivers/staging/r8188eu/core/rtw_pwrctrl.c b/drivers/staging/r8188eu/core/rtw_pwrctrl.c +new file mode 100644 +index 000000000000..c3897b29121c +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_pwrctrl.c +@@ -0,0 +1,605 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_PWRCTRL_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/osdep_intf.h" ++#include "../include/linux/usb.h" ++ ++void ips_enter(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct xmit_priv *pxmit_priv = &padapter->xmitpriv; ++ ++ if (padapter->registrypriv.mp_mode == 1) ++ return; ++ ++ if (pxmit_priv->free_xmitbuf_cnt != NR_XMITBUFF || ++ pxmit_priv->free_xmit_extbuf_cnt != NR_XMIT_EXTBUFF) { ++ DBG_88E_LEVEL(_drv_info_, "There are some pkts to transmit\n"); ++ DBG_88E_LEVEL(_drv_info_, "free_xmitbuf_cnt: %d, free_xmit_extbuf_cnt: %d\n", ++ pxmit_priv->free_xmitbuf_cnt, pxmit_priv->free_xmit_extbuf_cnt); ++ return; ++ } ++ ++ _enter_pwrlock(&pwrpriv->lock); ++ ++ pwrpriv->bips_processing = true; ++ ++ /* syn ips_mode with request */ ++ pwrpriv->ips_mode = pwrpriv->ips_mode_req; ++ ++ pwrpriv->ips_enter_cnts++; ++ DBG_88E("==>ips_enter cnts:%d\n", pwrpriv->ips_enter_cnts); ++ if (rf_off == pwrpriv->change_rfpwrstate) { ++ pwrpriv->bpower_saving = true; ++ DBG_88E_LEVEL(_drv_info_, "nolinked power save enter\n"); ++ ++ if (pwrpriv->ips_mode == IPS_LEVEL_2) ++ pwrpriv->bkeepfwalive = true; ++ ++ rtw_ips_pwr_down(padapter); ++ pwrpriv->rf_pwrstate = rf_off; ++ } ++ pwrpriv->bips_processing = false; ++ ++ _exit_pwrlock(&pwrpriv->lock); ++} ++ ++int ips_leave(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ int result = _SUCCESS; ++ int keyid; ++ ++ _enter_pwrlock(&pwrpriv->lock); ++ ++ if ((pwrpriv->rf_pwrstate == rf_off) && (!pwrpriv->bips_processing)) { ++ pwrpriv->bips_processing = true; ++ pwrpriv->change_rfpwrstate = rf_on; ++ pwrpriv->ips_leave_cnts++; ++ DBG_88E("==>ips_leave cnts:%d\n", pwrpriv->ips_leave_cnts); ++ ++ result = rtw_ips_pwr_up(padapter); ++ if (result == _SUCCESS) { ++ pwrpriv->rf_pwrstate = rf_on; ++ } ++ DBG_88E_LEVEL(_drv_info_, "nolinked power save leave\n"); ++ ++ if ((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) || (_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) { ++ DBG_88E("==>%s, channel(%d), processing(%x)\n", __func__, padapter->mlmeextpriv.cur_channel, pwrpriv->bips_processing); ++ set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ for (keyid = 0; keyid < 4; keyid++) { ++ if (pmlmepriv->key_mask & BIT(keyid)) { ++ if (keyid == psecuritypriv->dot11PrivacyKeyIndex) ++ result = rtw_set_key(padapter, psecuritypriv, keyid, 1); ++ else ++ result = rtw_set_key(padapter, psecuritypriv, keyid, 0); ++ } ++ } ++ } ++ ++ DBG_88E("==> ips_leave.....LED(0x%08x)...\n", rtw_read32(padapter, 0x4c)); ++ pwrpriv->bips_processing = false; ++ ++ pwrpriv->bkeepfwalive = false; ++ pwrpriv->bpower_saving = false; ++ } ++ ++ _exit_pwrlock(&pwrpriv->lock); ++ ++ return result; ++} ++ ++static bool rtw_pwr_unassociated_idle(struct adapter *adapter) ++{ ++ struct adapter *buddy = adapter->pbuddy_adapter; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &adapter->wdinfo; ++#endif ++ ++ bool ret = false; ++ ++ if (adapter->pwrctrlpriv.ips_deny_time >= jiffies) ++ goto exit; ++ ++ if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE | WIFI_SITE_MONITOR) || ++ check_fwstate(pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS) || ++ check_fwstate(pmlmepriv, WIFI_UNDER_WPS) || ++ check_fwstate(pmlmepriv, WIFI_AP_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE) || ++#if defined(CONFIG_88EU_P2P) ++ !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++#else ++ 0) ++#endif ++ goto exit; ++ ++ /* consider buddy, if exist */ ++ if (buddy) { ++ struct mlme_priv *b_pmlmepriv = &buddy->mlmepriv; ++ #ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *b_pwdinfo = &buddy->wdinfo; ++ #endif ++ ++ if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE | WIFI_SITE_MONITOR) || ++ check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS) || ++ check_fwstate(b_pmlmepriv, WIFI_AP_STATE) || ++ check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE) || ++#if defined(CONFIG_88EU_P2P) ++ !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)) ++#else ++ 0) ++#endif ++ goto exit; ++ } ++ ret = true; ++ ++exit: ++ return ret; ++} ++ ++void rtw_ps_processor(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ enum rt_rf_power_state rfpwrstate; ++ ++ pwrpriv->ps_processing = true; ++ ++ if (pwrpriv->bips_processing) ++ goto exit; ++ ++ if (padapter->pwrctrlpriv.bHWPwrPindetect) { ++ rfpwrstate = RfOnOffDetect(padapter); ++ DBG_88E("@@@@- #2 %s==> rfstate:%s\n", __func__, (rfpwrstate == rf_on) ? "rf_on" : "rf_off"); ++ ++ if (rfpwrstate != pwrpriv->rf_pwrstate) { ++ if (rfpwrstate == rf_off) { ++ pwrpriv->change_rfpwrstate = rf_off; ++ pwrpriv->brfoffbyhw = true; ++ padapter->bCardDisableWOHSM = true; ++ rtw_hw_suspend(padapter); ++ } else { ++ pwrpriv->change_rfpwrstate = rf_on; ++ rtw_hw_resume(padapter); ++ } ++ DBG_88E("current rf_pwrstate(%s)\n", (pwrpriv->rf_pwrstate == rf_off) ? "rf_off" : "rf_on"); ++ } ++ pwrpriv->pwr_state_check_cnts++; ++ } ++ ++ if (pwrpriv->ips_mode_req == IPS_NONE) ++ goto exit; ++ ++ if (!rtw_pwr_unassociated_idle(padapter)) ++ goto exit; ++ ++ if ((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts % 4) == 0)) { ++ DBG_88E("==>%s .fw_state(%x)\n", __func__, get_fwstate(pmlmepriv)); ++ pwrpriv->change_rfpwrstate = rf_off; ++ ++ ips_enter(padapter); ++ } ++exit: ++ rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); ++ pwrpriv->ps_processing = false; ++} ++ ++static void pwr_state_check_handler(struct timer_list *t) ++{ ++ struct adapter *padapter = ++ from_timer(padapter, t, ++ pwrctrlpriv.pwr_state_check_timer); ++ rtw_ps_cmd(padapter); ++} ++ ++/* ++ * ++ * Parameters ++ * padapter ++ * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4 ++ * ++ */ ++void rtw_set_rpwm(struct adapter *padapter, u8 pslv) ++{ ++ u8 rpwm; ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ ++ pslv = PS_STATE(pslv); ++ ++ if (pwrpriv->btcoex_rfon) { ++ if (pslv < PS_STATE_S4) ++ pslv = PS_STATE_S3; ++ } ++ ++ if (pwrpriv->rpwm == pslv) ++ return; ++ ++ if ((padapter->bSurpriseRemoved) || ++ (!padapter->hw_init_completed)) { ++ pwrpriv->cpwm = PS_STATE_S4; ++ ++ return; ++ } ++ ++ if (padapter->bDriverStopped) { ++ if (pslv < PS_STATE_S2) ++ return; ++ } ++ ++ rpwm = pslv | pwrpriv->tog; ++ ++ pwrpriv->rpwm = pslv; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); ++ ++ pwrpriv->tog += 0x80; ++ pwrpriv->cpwm = pslv; ++ ++} ++ ++static u8 PS_RDY_CHECK(struct adapter *padapter) ++{ ++ u32 curr_time, delta_time; ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ curr_time = jiffies; ++ delta_time = curr_time - pwrpriv->DelayLPSLastTimeStamp; ++ ++ if (delta_time < LPS_DELAY_TIME) ++ return false; ++ ++ if (!check_fwstate(pmlmepriv, _FW_LINKED) || ++ check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) || ++ check_fwstate(pmlmepriv, WIFI_AP_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) ++ return false; ++ if (pwrpriv->bInSuspend) ++ return false; ++ if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && !padapter->securitypriv.binstallGrpkey) { ++ DBG_88E("Group handshake still in progress !!!\n"); ++ return false; ++ } ++ return true; ++} ++ ++void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (ps_mode > PM_Card_Disable) ++ return; ++ ++ if (pwrpriv->pwr_mode == ps_mode) { ++ if (PS_MODE_ACTIVE == ps_mode) ++ return; ++ ++ if ((pwrpriv->smart_ps == smart_ps) && ++ (pwrpriv->bcn_ant_mode == bcn_ant_mode)) ++ return; ++ } ++ ++ /* if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) */ ++ if (ps_mode == PS_MODE_ACTIVE) { ++#ifdef CONFIG_88EU_P2P ++ if (pwdinfo->opp_ps == 0) { ++ DBG_88E("rtw_set_ps_mode: Leave 802.11 power save\n"); ++ pwrpriv->pwr_mode = ps_mode; ++ rtw_set_rpwm(padapter, PS_STATE_S4); ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); ++ pwrpriv->bFwCurrentInPSMode = false; ++ } ++ } else { ++#endif /* CONFIG_88EU_P2P */ ++ if (PS_RDY_CHECK(padapter)) { ++ DBG_88E("%s: Enter 802.11 power save\n", __func__); ++ pwrpriv->bFwCurrentInPSMode = true; ++ pwrpriv->pwr_mode = ps_mode; ++ pwrpriv->smart_ps = smart_ps; ++ pwrpriv->bcn_ant_mode = bcn_ant_mode; ++ rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); ++ ++#ifdef CONFIG_88EU_P2P ++ /* Set CTWindow after LPS */ ++ if (pwdinfo->opp_ps == 1) ++ p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); ++#endif /* CONFIG_88EU_P2P */ ++ ++ rtw_set_rpwm(padapter, PS_STATE_S2); ++ } ++ } ++ ++} ++ ++/* ++ * Return: ++ * 0: Leave OK ++ * -1: Timeout ++ * -2: Other error ++ */ ++s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms) ++{ ++ u32 start_time; ++ u8 bAwake = false; ++ s32 err = 0; ++ ++ start_time = jiffies; ++ while (1) { ++ rtw_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, &bAwake); ++ if (bAwake) ++ break; ++ ++ if (padapter->bSurpriseRemoved) { ++ err = -2; ++ DBG_88E("%s: device surprise removed!!\n", __func__); ++ break; ++ } ++ ++ if (rtw_get_passing_time_ms(start_time) > delay_ms) { ++ err = -1; ++ DBG_88E("%s: Wait for FW LPS leave more than %u ms!!!\n", __func__, delay_ms); ++ break; ++ } ++ rtw_usleep_os(100); ++ } ++ ++ return err; ++} ++ ++/* */ ++/* Description: */ ++/* Enter the leisure power save mode. */ ++/* */ ++void LPS_Enter(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ ++ if (!PS_RDY_CHECK(padapter)) ++ return; ++ ++ if (pwrpriv->bLeisurePs) { ++ /* Idle for a while if we connect to AP a while ago. */ ++ if (pwrpriv->LpsIdleCount >= 2) { /* 4 Sec */ ++ if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) { ++ pwrpriv->bpower_saving = true; ++ DBG_88E("%s smart_ps:%d\n", __func__, pwrpriv->smart_ps); ++ /* For Tenda W311R IOT issue */ ++ rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, ++ pwrpriv->smart_ps, 0x40); ++ } ++ } else { ++ pwrpriv->LpsIdleCount++; ++ } ++ } ++ ++} ++ ++#define LPS_LEAVE_TIMEOUT_MS 100 ++ ++/* Description: */ ++/* Leave the leisure power save mode. */ ++void LPS_Leave(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ ++ if (pwrpriv->bLeisurePs) { ++ if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) { ++ rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0x40); ++ ++ if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) ++ LPS_RF_ON_check(padapter, LPS_LEAVE_TIMEOUT_MS); ++ } ++ } ++ ++ pwrpriv->bpower_saving = false; ++ ++} ++ ++/* */ ++/* Description: Leave all power save mode: LPS, FwLPS, IPS if needed. */ ++/* Move code to function by tynli. 2010.03.26. */ ++/* */ ++void LeaveAllPowerSaveMode(struct adapter *Adapter) ++{ ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ u8 enqueue = 0; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { /* connect */ ++ p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, enqueue); ++ ++ rtw_lps_ctrl_wk_cmd(Adapter, LPS_CTRL_LEAVE, enqueue); ++ } ++ ++} ++ ++void rtw_init_pwrctrl_priv(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; ++ ++ _init_pwrlock(&pwrctrlpriv->lock); ++ pwrctrlpriv->rf_pwrstate = rf_on; ++ pwrctrlpriv->ips_enter_cnts = 0; ++ pwrctrlpriv->ips_leave_cnts = 0; ++ pwrctrlpriv->bips_processing = false; ++ ++ pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; ++ pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; ++ ++ pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL; ++ pwrctrlpriv->pwr_state_check_cnts = 0; ++ pwrctrlpriv->bInternalAutoSuspend = false; ++ pwrctrlpriv->bInSuspend = false; ++ pwrctrlpriv->bkeepfwalive = false; ++ ++ pwrctrlpriv->LpsIdleCount = 0; ++ if (padapter->registrypriv.mp_mode == 1) ++ pwrctrlpriv->power_mgnt = PS_MODE_ACTIVE; ++ else ++ pwrctrlpriv->power_mgnt = padapter->registrypriv.power_mgnt;/* PS_MODE_MIN; */ ++ pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false; ++ ++ pwrctrlpriv->bFwCurrentInPSMode = false; ++ ++ pwrctrlpriv->rpwm = 0; ++ pwrctrlpriv->cpwm = PS_STATE_S4; ++ ++ pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE; ++ pwrctrlpriv->smart_ps = padapter->registrypriv.smart_ps; ++ pwrctrlpriv->bcn_ant_mode = 0; ++ ++ pwrctrlpriv->tog = 0x80; ++ ++ pwrctrlpriv->btcoex_rfon = false; ++ ++ timer_setup(&pwrctrlpriv->pwr_state_check_timer, pwr_state_check_handler, 0); ++} ++ ++void rtw_free_pwrctrl_priv(struct adapter *adapter) ++{ ++ struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv; ++ ++ _free_pwrlock(&pwrctrlpriv->lock); ++ ++} ++ ++u8 rtw_interface_ps_func(struct adapter *padapter, enum hal_intf_ps_func efunc_id, u8 *val) ++{ ++ u8 bResult = true; ++ rtw_hal_intf_ps_func(padapter, efunc_id, val); ++ ++ return bResult; ++} ++ ++inline void rtw_set_ips_deny(struct adapter *padapter, u32 ms) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ms); ++} ++ ++/* ++* rtw_pwr_wakeup - Wake the NIC up from: 1)IPS. 2)USB autosuspend ++* @adapter: pointer to struct adapter structure ++* @ips_deffer_ms: the ms wiil prevent from falling into IPS after wakeup ++* Return _SUCCESS or _FAIL ++*/ ++ ++int _rtw_pwr_wakeup(struct adapter *padapter, u32 ips_deffer_ms, const char *caller) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ int ret = _SUCCESS; ++ u32 start = jiffies; ++ ++ if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms)) ++ pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms); ++ ++ if (pwrpriv->ps_processing) { ++ DBG_88E("%s wait ps_processing...\n", __func__); ++ while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000) ++ msleep(10); ++ if (pwrpriv->ps_processing) ++ DBG_88E("%s wait ps_processing timeout\n", __func__); ++ else ++ DBG_88E("%s wait ps_processing done\n", __func__); ++ } ++ ++ /* System suspend is not allowed to wakeup */ ++ if ((!pwrpriv->bInternalAutoSuspend) && pwrpriv->bInSuspend) { ++ while (pwrpriv->bInSuspend && ++ (rtw_get_passing_time_ms(start) <= 3000 || ++ (rtw_get_passing_time_ms(start) <= 500))) ++ msleep(10); ++ if (pwrpriv->bInSuspend) ++ DBG_88E("%s wait bInSuspend timeout\n", __func__); ++ else ++ DBG_88E("%s wait bInSuspend done\n", __func__); ++ } ++ ++ /* block??? */ ++ if ((pwrpriv->bInternalAutoSuspend) && (padapter->net_closed)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* I think this should be check in IPS, LPS, autosuspend functions... */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ ret = _SUCCESS; ++ goto exit; ++ } ++ if (rf_off == pwrpriv->rf_pwrstate) { ++ DBG_88E("%s call ips_leave....\n", __func__); ++ if (_FAIL == ips_leave(padapter)) { ++ DBG_88E("======> ips_leave fail.............\n"); ++ ret = _FAIL; ++ goto exit; ++ } ++ } ++ ++ /* TODO: the following checking need to be merged... */ ++ if (padapter->bDriverStopped || !padapter->bup || ++ !padapter->hw_init_completed) { ++ DBG_88E("%s: bDriverStopped=%d, bup=%d, hw_init_completed =%u\n" ++ , caller ++ , padapter->bDriverStopped ++ , padapter->bup ++ , padapter->hw_init_completed); ++ ret = false; ++ goto exit; ++ } ++ ++exit: ++ if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms)) ++ pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms); ++ return ret; ++} ++ ++int rtw_pm_set_lps(struct adapter *padapter, u8 mode) ++{ ++ int ret = 0; ++ struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; ++ ++ if (mode < PS_MODE_NUM) { ++ if (pwrctrlpriv->power_mgnt != mode) { ++ if (PS_MODE_ACTIVE == mode) ++ LeaveAllPowerSaveMode(padapter); ++ else ++ pwrctrlpriv->LpsIdleCount = 2; ++ pwrctrlpriv->power_mgnt = mode; ++ pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false; ++ } ++ } else { ++ ret = -EINVAL; ++ } ++ ++ return ret; ++} ++ ++int rtw_pm_set_ips(struct adapter *padapter, u8 mode) ++{ ++ struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; ++ ++ if (mode == IPS_NORMAL || mode == IPS_LEVEL_2) { ++ rtw_ips_mode_req(pwrctrlpriv, mode); ++ DBG_88E("%s %s\n", __func__, mode == IPS_NORMAL ? "IPS_NORMAL" : "IPS_LEVEL_2"); ++ return 0; ++ } else if (mode == IPS_NONE) { ++ rtw_ips_mode_req(pwrctrlpriv, mode); ++ DBG_88E("%s %s\n", __func__, "IPS_NONE"); ++ if ((padapter->bSurpriseRemoved == 0) && (_FAIL == rtw_pwr_wakeup(padapter))) ++ return -EFAULT; ++ } else { ++ return -EINVAL; ++ } ++ return 0; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_recv.c b/drivers/staging/r8188eu/core/rtw_recv.c +new file mode 100644 +index 000000000000..e082edfbaad8 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_recv.c +@@ -0,0 +1,2058 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_RECV_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/mlme_osdep.h" ++#include "../include/usb_ops.h" ++#include "../include/wifi.h" ++ ++static u8 SNAP_ETH_TYPE_IPX[2] = {0x81, 0x37}; ++static u8 SNAP_ETH_TYPE_APPLETALK_AARP[2] = {0x80, 0xf3}; ++ ++/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ ++static u8 rtw_bridge_tunnel_header[] = { ++ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 ++}; ++ ++static u8 rtw_rfc1042_header[] = { ++ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 ++}; ++ ++void rtw_signal_stat_timer_hdl(struct timer_list *); ++ ++void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) ++{ ++ ++ memset((u8 *)psta_recvpriv, 0, sizeof(struct sta_recv_priv)); ++ ++ spin_lock_init(&psta_recvpriv->lock); ++ ++ _rtw_init_queue(&psta_recvpriv->defrag_q); ++ ++} ++ ++int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter) ++{ ++ int i; ++ ++ struct recv_frame *precvframe; ++ ++ int res = _SUCCESS; ++ ++ spin_lock_init(&precvpriv->lock); ++ ++ _rtw_init_queue(&precvpriv->free_recv_queue); ++ _rtw_init_queue(&precvpriv->recv_pending_queue); ++ _rtw_init_queue(&precvpriv->uc_swdec_pending_queue); ++ ++ precvpriv->adapter = padapter; ++ ++ precvpriv->free_recvframe_cnt = NR_RECVFRAME; ++ ++ rtw_os_recv_resource_init(precvpriv, padapter); ++ ++ precvpriv->pallocated_frame_buf = vzalloc(NR_RECVFRAME * sizeof(struct recv_frame) + RXFRAME_ALIGN_SZ); ++ ++ if (!precvpriv->pallocated_frame_buf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); ++ ++ precvframe = (struct recv_frame *)precvpriv->precv_frame_buf; ++ ++ for (i = 0; i < NR_RECVFRAME; i++) { ++ INIT_LIST_HEAD(&precvframe->list); ++ ++ list_add_tail(&precvframe->list, &precvpriv->free_recv_queue.queue); ++ ++ res = rtw_os_recv_resource_alloc(padapter, precvframe); ++ ++ precvframe->len = 0; ++ ++ precvframe->adapter = padapter; ++ precvframe++; ++ } ++ precvpriv->rx_pending_cnt = 1; ++ ++ sema_init(&precvpriv->allrxreturnevt, 0); ++ ++ res = rtw_hal_init_recv_priv(padapter); ++ ++ timer_setup(&precvpriv->signal_stat_timer, rtw_signal_stat_timer_hdl, 0); ++ precvpriv->signal_stat_sampling_interval = 1000; /* ms */ ++ ++ rtw_set_signal_stat_timer(precvpriv); ++exit: ++ ++ return res; ++} ++ ++void _rtw_free_recv_priv(struct recv_priv *precvpriv) ++{ ++ struct adapter *padapter = precvpriv->adapter; ++ ++ rtw_free_uc_swdec_pending_queue(padapter); ++ ++ rtw_os_recv_resource_free(precvpriv); ++ ++ vfree(precvpriv->pallocated_frame_buf); ++ ++ rtw_hal_free_recv_priv(padapter); ++} ++ ++struct recv_frame *_rtw_alloc_recvframe(struct __queue *pfree_recv_queue) ++{ ++ struct recv_frame *hdr; ++ struct list_head *plist, *phead; ++ struct adapter *padapter; ++ struct recv_priv *precvpriv; ++ ++ if (list_empty(&pfree_recv_queue->queue)) { ++ hdr = NULL; ++ } else { ++ phead = get_list_head(pfree_recv_queue); ++ ++ plist = phead->next; ++ ++ hdr = container_of(plist, struct recv_frame, list); ++ ++ list_del_init(&hdr->list); ++ padapter = hdr->adapter; ++ if (padapter) { ++ precvpriv = &padapter->recvpriv; ++ if (pfree_recv_queue == &precvpriv->free_recv_queue) ++ precvpriv->free_recvframe_cnt--; ++ } ++ } ++ ++ return (struct recv_frame *)hdr; ++} ++ ++struct recv_frame *rtw_alloc_recvframe(struct __queue *pfree_recv_queue) ++{ ++ struct recv_frame *precvframe; ++ ++ spin_lock_bh(&pfree_recv_queue->lock); ++ ++ precvframe = _rtw_alloc_recvframe(pfree_recv_queue); ++ ++ spin_unlock_bh(&pfree_recv_queue->lock); ++ ++ return precvframe; ++} ++ ++void rtw_init_recvframe(struct recv_frame *precvframe, struct recv_priv *precvpriv) ++{ ++ /* Perry: This can be removed */ ++ INIT_LIST_HEAD(&precvframe->list); ++ ++ precvframe->len = 0; ++} ++ ++int rtw_free_recvframe(struct recv_frame *precvframe, struct __queue *pfree_recv_queue) ++{ ++ struct adapter *padapter; ++ struct recv_priv *precvpriv; ++ ++ if (!precvframe) ++ return _FAIL; ++ padapter = precvframe->adapter; ++ precvpriv = &padapter->recvpriv; ++ if (precvframe->pkt) { ++ dev_kfree_skb_any(precvframe->pkt);/* free skb by driver */ ++ precvframe->pkt = NULL; ++ } ++ ++ spin_lock_bh(&pfree_recv_queue->lock); ++ ++ list_del_init(&precvframe->list); ++ ++ precvframe->len = 0; ++ ++ list_add_tail(&precvframe->list, get_list_head(pfree_recv_queue)); ++ ++ if (padapter) { ++ if (pfree_recv_queue == &precvpriv->free_recv_queue) ++ precvpriv->free_recvframe_cnt++; ++ } ++ ++ spin_unlock_bh(&pfree_recv_queue->lock); ++ ++ return _SUCCESS; ++} ++ ++int _rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue) ++{ ++ struct adapter *padapter = precvframe->adapter; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ list_del_init(&precvframe->list); ++ list_add_tail(&precvframe->list, get_list_head(queue)); ++ ++ if (padapter) { ++ if (queue == &precvpriv->free_recv_queue) ++ precvpriv->free_recvframe_cnt++; ++ } ++ ++ return _SUCCESS; ++} ++ ++int rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue) ++{ ++ int ret; ++ ++ spin_lock_bh(&queue->lock); ++ ret = _rtw_enqueue_recvframe(precvframe, queue); ++ spin_unlock_bh(&queue->lock); ++ ++ return ret; ++} ++ ++/* ++caller : defrag ; recvframe_chk_defrag in recv_thread (passive) ++pframequeue: defrag_queue : will be accessed in recv_thread (passive) ++ ++using spinlock to protect ++ ++*/ ++ ++void rtw_free_recvframe_queue(struct __queue *pframequeue, struct __queue *pfree_recv_queue) ++{ ++ struct recv_frame *hdr; ++ struct list_head *plist, *phead; ++ ++ spin_lock(&pframequeue->lock); ++ ++ phead = get_list_head(pframequeue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ hdr = container_of(plist, struct recv_frame, list); ++ ++ plist = plist->next; ++ ++ rtw_free_recvframe((struct recv_frame *)hdr, pfree_recv_queue); ++ } ++ ++ spin_unlock(&pframequeue->lock); ++ ++} ++ ++u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter) ++{ ++ u32 cnt = 0; ++ struct recv_frame *pending_frame; ++ while ((pending_frame = rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) { ++ rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue); ++ DBG_88E("%s: dequeue uc_swdec_pending_queue\n", __func__); ++ cnt++; ++ } ++ ++ return cnt; ++} ++ ++int rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, struct __queue *queue) ++{ ++ spin_lock_bh(&queue->lock); ++ ++ list_del_init(&precvbuf->list); ++ list_add(&precvbuf->list, get_list_head(queue)); ++ ++ spin_unlock_bh(&queue->lock); ++ ++ return _SUCCESS; ++} ++ ++int rtw_enqueue_recvbuf(struct recv_buf *precvbuf, struct __queue *queue) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&queue->lock, flags); ++ ++ list_del_init(&precvbuf->list); ++ ++ list_add_tail(&precvbuf->list, get_list_head(queue)); ++ spin_unlock_irqrestore(&queue->lock, flags); ++ return _SUCCESS; ++} ++ ++struct recv_buf *rtw_dequeue_recvbuf(struct __queue *queue) ++{ ++ struct recv_buf *precvbuf; ++ struct list_head *plist, *phead; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&queue->lock, flags); ++ ++ if (list_empty(&queue->queue)) { ++ precvbuf = NULL; ++ } else { ++ phead = get_list_head(queue); ++ ++ plist = phead->next; ++ ++ precvbuf = container_of(plist, struct recv_buf, list); ++ ++ list_del_init(&precvbuf->list); ++ } ++ ++ spin_unlock_irqrestore(&queue->lock, flags); ++ ++ return precvbuf; ++} ++ ++static int recvframe_chkmic(struct adapter *adapter, struct recv_frame *precvframe) ++{ ++ int i, res = _SUCCESS; ++ u32 datalen; ++ u8 miccode[8]; ++ u8 bmic_err = false, brpt_micerror = true; ++ u8 *pframe, *payload, *pframemic; ++ u8 *mickey; ++ struct sta_info *stainfo; ++ struct rx_pkt_attrib *prxattrib = &precvframe->attrib; ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ ++ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ stainfo = rtw_get_stainfo(&adapter->stapriv, &prxattrib->ta[0]); ++ ++ if (prxattrib->encrypt == _TKIP_) { ++ /* calculate mic code */ ++ if (stainfo) { ++ if (is_multicast_ether_addr(prxattrib->ra)) { ++ mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; ++ ++ if (!psecuritypriv) { ++ res = _FAIL; ++ DBG_88E("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); ++ goto exit; ++ } ++ } else { ++ mickey = &stainfo->dot11tkiprxmickey.skey[0]; ++ } ++ ++ datalen = precvframe->len - prxattrib->hdrlen - prxattrib->iv_len - prxattrib->icv_len - 8;/* icv_len included the mic code */ ++ pframe = precvframe->rx_data; ++ payload = pframe + prxattrib->hdrlen + prxattrib->iv_len; ++ ++ rtw_seccalctkipmic(mickey, pframe, payload, datalen, &miccode[0], ++ (unsigned char)prxattrib->priority); /* care the length of the data */ ++ ++ pframemic = payload + datalen; ++ ++ bmic_err = false; ++ ++ for (i = 0; i < 8; i++) { ++ if (miccode[i] != *(pframemic + i)) ++ bmic_err = true; ++ } ++ ++ if (bmic_err) { ++ /* double check key_index for some timing issue , */ ++ /* cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */ ++ if (is_multicast_ether_addr(prxattrib->ra) && prxattrib->key_index != pmlmeinfo->key_index) ++ brpt_micerror = false; ++ ++ if ((prxattrib->bdecrypted) && (brpt_micerror)) { ++ rtw_handle_tkip_mic_err(adapter, (u8)is_multicast_ether_addr(prxattrib->ra)); ++ DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); ++ } else { ++ DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); ++ } ++ res = _FAIL; ++ } else { ++ /* mic checked ok */ ++ if (!psecuritypriv->bcheck_grpkey && is_multicast_ether_addr(prxattrib->ra)) ++ psecuritypriv->bcheck_grpkey = true; ++ } ++ } ++ ++ recvframe_pull_tail(precvframe, 8); ++ } ++ ++exit: ++ ++ return res; ++} ++ ++/* decrypt and set the ivlen, icvlen of the recv_frame */ ++static struct recv_frame *decryptor(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ struct rx_pkt_attrib *prxattrib = &precv_frame->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct recv_frame *return_packet = precv_frame; ++ u32 res = _SUCCESS; ++ ++ if (prxattrib->encrypt > 0) { ++ u8 *iv = precv_frame->rx_data + prxattrib->hdrlen; ++ prxattrib->key_index = (((iv[3]) >> 6) & 0x3); ++ ++ if (prxattrib->key_index > WEP_KEYS) { ++ DBG_88E("prxattrib->key_index(%d)>WEP_KEYS\n", prxattrib->key_index); ++ ++ switch (prxattrib->encrypt) { ++ case _WEP40_: ++ case _WEP104_: ++ prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; ++ break; ++ case _TKIP_: ++ case _AES_: ++ default: ++ prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; ++ break; ++ } ++ } ++ } ++ ++ if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0) || (psecuritypriv->sw_decrypt))) { ++ psecuritypriv->hw_decrypted = false; ++ ++ switch (prxattrib->encrypt) { ++ case _WEP40_: ++ case _WEP104_: ++ rtw_wep_decrypt(padapter, (u8 *)precv_frame); ++ break; ++ case _TKIP_: ++ res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame); ++ break; ++ case _AES_: ++ res = rtw_aes_decrypt(padapter, (u8 *)precv_frame); ++ break; ++ default: ++ break; ++ } ++ } else if (prxattrib->bdecrypted == 1 && prxattrib->encrypt > 0 && ++ (psecuritypriv->busetkipkey == 1 || prxattrib->encrypt != _TKIP_)) ++ psecuritypriv->hw_decrypted = true; ++ ++ if (res == _FAIL) { ++ rtw_free_recvframe(return_packet, &padapter->recvpriv.free_recv_queue); ++ return_packet = NULL; ++ } else { ++ prxattrib->bdecrypted = true; ++ } ++ ++ return return_packet; ++} ++ ++/* set the security information in the recv_frame */ ++static struct recv_frame *portctrl(struct adapter *adapter, struct recv_frame *precv_frame) ++{ ++ u8 *psta_addr, *ptr; ++ uint auth_alg; ++ struct recv_frame *pfhdr; ++ struct sta_info *psta; ++ struct sta_priv *pstapriv; ++ struct recv_frame *prtnframe; ++ u16 ether_type = 0; ++ u16 eapol_type = 0x888e;/* for Funia BD's WPA issue */ ++ struct rx_pkt_attrib *pattrib; ++ __be16 be_tmp; ++ ++ pstapriv = &adapter->stapriv; ++ ++ auth_alg = adapter->securitypriv.dot11AuthAlgrthm; ++ ++ ptr = precv_frame->rx_data; ++ pfhdr = precv_frame; ++ pattrib = &pfhdr->attrib; ++ psta_addr = pattrib->ta; ++ ++ prtnframe = NULL; ++ ++ psta = rtw_get_stainfo(pstapriv, psta_addr); ++ ++ if (auth_alg == 2) { ++ if (psta && psta->ieee8021x_blocked) { ++ /* blocked */ ++ /* only accept EAPOL frame */ ++ prtnframe = precv_frame; ++ ++ /* get ether_type */ ++ ptr = ptr + pfhdr->attrib.hdrlen + pfhdr->attrib.iv_len + LLC_HEADER_SIZE; ++ memcpy(&be_tmp, ptr, 2); ++ ether_type = ntohs(be_tmp); ++ ++ if (ether_type == eapol_type) { ++ prtnframe = precv_frame; ++ } else { ++ /* free this frame */ ++ rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue); ++ prtnframe = NULL; ++ } ++ } else { ++ /* allowed */ ++ /* check decryption status, and decrypt the frame if needed */ ++ prtnframe = precv_frame; ++ } ++ } else { ++ prtnframe = precv_frame; ++ } ++ ++ return prtnframe; ++} ++ ++static int recv_decache(struct recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache) ++{ ++ int tid = precv_frame->attrib.priority; ++ ++ u16 seq_ctrl = ((precv_frame->attrib.seq_num & 0xffff) << 4) | ++ (precv_frame->attrib.frag_num & 0xf); ++ ++ if (tid > 15) ++ return _FAIL; ++ ++ if (1) {/* if (bretry) */ ++ if (seq_ctrl == prxcache->tid_rxseq[tid]) ++ return _FAIL; ++ } ++ ++ prxcache->tid_rxseq[tid] = seq_ctrl; ++ ++ return _SUCCESS; ++} ++ ++void process_pwrbit_data(struct adapter *padapter, struct recv_frame *precv_frame); ++void process_pwrbit_data(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ unsigned char pwrbit; ++ u8 *ptr = precv_frame->rx_data; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct sta_info *psta = NULL; ++ ++ psta = rtw_get_stainfo(pstapriv, pattrib->src); ++ ++ pwrbit = GetPwrMgt(ptr); ++ ++ if (psta) { ++ if (pwrbit) { ++ if (!(psta->state & WIFI_SLEEP_STATE)) ++ stop_sta_xmit(padapter, psta); ++ } else { ++ if (psta->state & WIFI_SLEEP_STATE) ++ wakeup_sta_to_xmit(padapter, psta); ++ } ++ } ++ ++#endif ++} ++ ++static void process_wmmps_data(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct sta_info *psta = NULL; ++ ++ psta = rtw_get_stainfo(pstapriv, pattrib->src); ++ ++ if (!psta) ++ return; ++ ++ if (!psta->qos_option) ++ return; ++ ++ if (!(psta->qos_info & 0xf)) ++ return; ++ ++ if (psta->state & WIFI_SLEEP_STATE) { ++ u8 wmmps_ac = 0; ++ ++ switch (pattrib->priority) { ++ case 1: ++ case 2: ++ wmmps_ac = psta->uapsd_bk & BIT(1); ++ break; ++ case 4: ++ case 5: ++ wmmps_ac = psta->uapsd_vi & BIT(1); ++ break; ++ case 6: ++ case 7: ++ wmmps_ac = psta->uapsd_vo & BIT(1); ++ break; ++ case 0: ++ case 3: ++ default: ++ wmmps_ac = psta->uapsd_be & BIT(1); ++ break; ++ } ++ ++ if (wmmps_ac) { ++ if (psta->sleepq_ac_len > 0) { ++ /* process received triggered frame */ ++ xmit_delivery_enabled_frames(padapter, psta); ++ } else { ++ /* issue one qos null frame with More data bit = 0 and the EOSP bit set (= 1) */ ++ issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority, 0, 0); ++ } ++ } ++ } ++ ++#endif ++} ++ ++static void count_rx_stats(struct adapter *padapter, struct recv_frame *prframe, struct sta_info *sta) ++{ ++ int sz; ++ struct sta_info *psta = NULL; ++ struct stainfo_stats *pstats = NULL; ++ struct rx_pkt_attrib *pattrib = &prframe->attrib; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ sz = get_recvframe_len(prframe); ++ precvpriv->rx_bytes += sz; ++ ++ padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++; ++ ++ if (!is_broadcast_ether_addr(pattrib->dst) && !is_multicast_ether_addr(pattrib->dst)) ++ padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++; ++ ++ if (sta) ++ psta = sta; ++ else ++ psta = prframe->psta; ++ ++ if (psta) { ++ pstats = &psta->sta_stats; ++ ++ pstats->rx_data_pkts++; ++ pstats->rx_bytes += sz; ++ } ++} ++ ++int sta2sta_data_frame( ++ struct adapter *adapter, ++ struct recv_frame *precv_frame, ++ struct sta_info **psta ++); ++ ++int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame, struct sta_info **psta) ++{ ++ u8 *ptr = precv_frame->rx_data; ++ int ret = _SUCCESS; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ u8 *mybssid = get_bssid(pmlmepriv); ++ u8 *myhwaddr = myid(&adapter->eeprompriv); ++ u8 *sta_addr = NULL; ++ bool bmcast = is_multicast_ether_addr(pattrib->dst); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ /* filter packets that SA is myself or multicast or broadcast */ ++ if (!memcmp(myhwaddr, pattrib->src, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if (!memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || ++ !memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || ++ memcmp(pattrib->bssid, mybssid, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ sta_addr = pattrib->src; ++ } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ /* For Station mode, sa and bssid should always be BSSID, and DA is my mac-address */ ++ if (memcmp(pattrib->bssid, pattrib->src, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ sta_addr = pattrib->bssid; ++ } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ if (bmcast) { ++ /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */ ++ if (!is_multicast_ether_addr(pattrib->bssid)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ } else { /* not mc-frame */ ++ /* For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID */ ++ if (memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ sta_addr = pattrib->src; ++ } ++ } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) { ++ memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); ++ memcpy(pattrib->ta, pattrib->src, ETH_ALEN); ++ ++ sta_addr = mybssid; ++ } else { ++ ret = _FAIL; ++ } ++ ++ if (bmcast) ++ *psta = rtw_get_bcmc_stainfo(adapter); ++ else ++ *psta = rtw_get_stainfo(pstapriv, sta_addr); /* get ap_info */ ++ ++ if (!*psta) { ++ if (adapter->registrypriv.mp_mode == 1) { ++ if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) ++ adapter->mppriv.rx_pktloss++; ++ } ++ ret = _FAIL; ++ goto exit; ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++static int ap2sta_data_frame( ++ struct adapter *adapter, ++ struct recv_frame *precv_frame, ++ struct sta_info **psta) ++{ ++ u8 *ptr = precv_frame->rx_data; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ int ret = _SUCCESS; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ u8 *mybssid = get_bssid(pmlmepriv); ++ u8 *myhwaddr = myid(&adapter->eeprompriv); ++ bool bmcast = is_multicast_ether_addr(pattrib->dst); ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && ++ (check_fwstate(pmlmepriv, _FW_LINKED) || ++ check_fwstate(pmlmepriv, _FW_UNDER_LINKING))) { ++ /* filter packets that SA is myself or multicast or broadcast */ ++ if (!memcmp(myhwaddr, pattrib->src, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* da should be for me */ ++ if ((memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* check BSSID */ ++ if (!memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || ++ !memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || ++ (memcmp(pattrib->bssid, mybssid, ETH_ALEN))) { ++ if (!bmcast) { ++ DBG_88E("issue_deauth to the nonassociated ap=%pM for the reason(7)\n", (pattrib->bssid)); ++ issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); ++ } ++ ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if (bmcast) ++ *psta = rtw_get_bcmc_stainfo(adapter); ++ else ++ *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get ap_info */ ++ ++ if (!*psta) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { */ ++ /* */ ++ ++ if (GetFrameSubType(ptr) & BIT(6)) { ++ /* No data, will not indicate to upper layer, temporily count it here */ ++ count_rx_stats(adapter, precv_frame, *psta); ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } ++ } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) && ++ check_fwstate(pmlmepriv, _FW_LINKED)) { ++ memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); ++ memcpy(pattrib->ta, pattrib->src, ETH_ALEN); ++ ++ /* */ ++ memcpy(pattrib->bssid, mybssid, ETH_ALEN); ++ ++ *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ ++ if (!*psta) { ++ ret = _FAIL; ++ goto exit; ++ } ++ } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ /* Special case */ ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } else { ++ if (!memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && (!bmcast)) { ++ *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ ++ if (!*psta) { ++ DBG_88E("issue_deauth to the ap =%pM for the reason(7)\n", (pattrib->bssid)); ++ ++ issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); ++ } ++ } ++ ++ ret = _FAIL; ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++static int sta2ap_data_frame(struct adapter *adapter, ++ struct recv_frame *precv_frame, ++ struct sta_info **psta) ++{ ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct sta_priv *pstapriv = &adapter->stapriv; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ u8 *ptr = precv_frame->rx_data; ++ unsigned char *mybssid = get_bssid(pmlmepriv); ++ int ret = _SUCCESS; ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ /* For AP mode, RA = BSSID, TX = STA(SRC_ADDR), A3 = DST_ADDR */ ++ if (memcmp(pattrib->bssid, mybssid, ETH_ALEN)) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ *psta = rtw_get_stainfo(pstapriv, pattrib->src); ++ if (!*psta) { ++ DBG_88E("issue_deauth to sta=%pM for the reason(7)\n", (pattrib->src)); ++ ++ issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); ++ ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } ++ ++ process_pwrbit_data(adapter, precv_frame); ++ ++ if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { ++ process_wmmps_data(adapter, precv_frame); ++ } ++ ++ if (GetFrameSubType(ptr) & BIT(6)) { ++ /* No data, will not indicate to upper layer, temporily count it here */ ++ count_rx_stats(adapter, precv_frame, *psta); ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } ++ } else { ++ u8 *myhwaddr = myid(&adapter->eeprompriv); ++ if (memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) { ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } ++ DBG_88E("issue_deauth to sta=%pM for the reason(7)\n", (pattrib->src)); ++ issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); ++ ret = RTW_RX_HANDLED; ++ goto exit; ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++static int validate_recv_ctrl_frame(struct adapter *padapter, ++ struct recv_frame *precv_frame) ++{ ++#ifdef CONFIG_88EU_AP_MODE ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 *pframe = precv_frame->rx_data; ++ /* uint len = precv_frame->len; */ ++ ++ if (GetFrameType(pframe) != WIFI_CTRL_TYPE) ++ return _FAIL; ++ ++ /* receive the frames that ra(a1) is my address */ ++ if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) ++ return _FAIL; ++ ++ /* only handle ps-poll */ ++ if (GetFrameSubType(pframe) == WIFI_PSPOLL) { ++ u16 aid; ++ u8 wmmps_ac = 0; ++ struct sta_info *psta = NULL; ++ ++ aid = GetAid(pframe); ++ psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); ++ ++ if (!psta || psta->aid != aid) ++ return _FAIL; ++ ++ /* for rx pkt statistics */ ++ psta->sta_stats.rx_ctrl_pkts++; ++ ++ switch (pattrib->priority) { ++ case 1: ++ case 2: ++ wmmps_ac = psta->uapsd_bk & BIT(0); ++ break; ++ case 4: ++ case 5: ++ wmmps_ac = psta->uapsd_vi & BIT(0); ++ break; ++ case 6: ++ case 7: ++ wmmps_ac = psta->uapsd_vo & BIT(0); ++ break; ++ case 0: ++ case 3: ++ default: ++ wmmps_ac = psta->uapsd_be & BIT(0); ++ break; ++ } ++ ++ if (wmmps_ac) ++ return _FAIL; ++ ++ if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { ++ DBG_88E("%s alive check-rx ps-poll\n", __func__); ++ psta->expire_to = pstapriv->expire_to; ++ psta->state ^= WIFI_STA_ALIVE_CHK_STATE; ++ } ++ ++ if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) { ++ struct list_head *xmitframe_plist, *xmitframe_phead; ++ struct xmit_frame *pxmitframe = NULL; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ xmitframe_phead = get_list_head(&psta->sleep_q); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ if (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ list_del_init(&pxmitframe->list); ++ ++ psta->sleepq_len--; ++ ++ if (psta->sleepq_len > 0) ++ pxmitframe->attrib.mdata = 1; ++ else ++ pxmitframe->attrib.mdata = 0; ++ ++ pxmitframe->attrib.triggered = 1; ++ ++ rtw_hal_xmitframe_enqueue(padapter, pxmitframe); ++ ++ if (psta->sleepq_len == 0) { ++ pstapriv->tim_bitmap &= ~BIT(psta->aid); ++ ++ /* upate BCN for TIM IE */ ++ /* update_BCNTIM(padapter); */ ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ } ++ } else { ++ if (pstapriv->tim_bitmap & BIT(psta->aid)) { ++ if (psta->sleepq_len == 0) { ++ DBG_88E("no buffered packets to xmit\n"); ++ ++ /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */ ++ issue_nulldata(padapter, psta->hwaddr, 0, 0, 0); ++ } else { ++ DBG_88E("error!psta->sleepq_len=%d\n", psta->sleepq_len); ++ psta->sleepq_len = 0; ++ } ++ ++ pstapriv->tim_bitmap &= ~BIT(psta->aid); ++ ++ /* upate BCN for TIM IE */ ++ /* update_BCNTIM(padapter); */ ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ } ++ } ++ spin_unlock_bh(&pxmitpriv->lock); ++ } ++ } ++ ++#endif ++ ++ return _FAIL; ++} ++ ++struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_frame *precv_frame); ++ ++static int validate_recv_mgnt_frame(struct adapter *padapter, ++ struct recv_frame *precv_frame) ++{ ++ struct sta_info *psta; ++ ++ precv_frame = recvframe_chk_defrag(padapter, precv_frame); ++ if (!precv_frame) ++ return _SUCCESS; ++ ++ /* for rx pkt statistics */ ++ psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->rx_data)); ++ if (psta) { ++ psta->sta_stats.rx_mgnt_pkts++; ++ if (GetFrameSubType(precv_frame->rx_data) == WIFI_BEACON) { ++ psta->sta_stats.rx_beacon_pkts++; ++ } else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBEREQ) { ++ psta->sta_stats.rx_probereq_pkts++; ++ } else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBERSP) { ++ if (!memcmp(padapter->eeprompriv.mac_addr, GetAddr1Ptr(precv_frame->rx_data), ETH_ALEN)) ++ psta->sta_stats.rx_probersp_pkts++; ++ else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->rx_data)) || ++ is_multicast_mac_addr(GetAddr1Ptr(precv_frame->rx_data))) ++ psta->sta_stats.rx_probersp_bm_pkts++; ++ else ++ psta->sta_stats.rx_probersp_uo_pkts++; ++ } ++ } ++ ++ mgt_dispatcher(padapter, precv_frame); ++ ++ return _SUCCESS; ++} ++ ++static int validate_recv_data_frame(struct adapter *adapter, ++ struct recv_frame *precv_frame) ++{ ++ u8 bretry; ++ u8 *psa, *pda, *pbssid; ++ struct sta_info *psta = NULL; ++ u8 *ptr = precv_frame->rx_data; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ struct security_priv *psecuritypriv = &adapter->securitypriv; ++ int ret = _SUCCESS; ++ ++ bretry = GetRetry(ptr); ++ pda = get_da(ptr); ++ psa = get_sa(ptr); ++ pbssid = get_hdr_bssid(ptr); ++ ++ if (!pbssid) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ memcpy(pattrib->dst, pda, ETH_ALEN); ++ memcpy(pattrib->src, psa, ETH_ALEN); ++ ++ memcpy(pattrib->bssid, pbssid, ETH_ALEN); ++ ++ switch (pattrib->to_fr_ds) { ++ case 0: ++ memcpy(pattrib->ra, pda, ETH_ALEN); ++ memcpy(pattrib->ta, psa, ETH_ALEN); ++ ret = sta2sta_data_frame(adapter, precv_frame, &psta); ++ break; ++ case 1: ++ memcpy(pattrib->ra, pda, ETH_ALEN); ++ memcpy(pattrib->ta, pbssid, ETH_ALEN); ++ ret = ap2sta_data_frame(adapter, precv_frame, &psta); ++ break; ++ case 2: ++ memcpy(pattrib->ra, pbssid, ETH_ALEN); ++ memcpy(pattrib->ta, psa, ETH_ALEN); ++ ret = sta2ap_data_frame(adapter, precv_frame, &psta); ++ break; ++ case 3: ++ memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); ++ memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); ++ ret = _FAIL; ++ break; ++ default: ++ ret = _FAIL; ++ break; ++ } ++ ++ if (ret == _FAIL) { ++ goto exit; ++ } else if (ret == RTW_RX_HANDLED) { ++ goto exit; ++ } ++ ++ if (!psta) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ /* psta->rssi = prxcmd->rssi; */ ++ /* psta->signal_quality = prxcmd->sq; */ ++ precv_frame->psta = psta; ++ ++ pattrib->amsdu = 0; ++ pattrib->ack_policy = 0; ++ /* parsing QC field */ ++ if (pattrib->qos == 1) { ++ pattrib->priority = GetPriority((ptr + 24)); ++ pattrib->ack_policy = GetAckpolicy((ptr + 24)); ++ pattrib->amsdu = GetAMsdu((ptr + 24)); ++ pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26; ++ ++ if (pattrib->priority != 0 && pattrib->priority != 3) ++ adapter->recvpriv.bIsAnyNonBEPkts = true; ++ } else { ++ pattrib->priority = 0; ++ pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24; ++ } ++ ++ if (pattrib->order)/* HT-CTRL 11n */ ++ pattrib->hdrlen += 4; ++ ++ precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; ++ ++ /* decache, drop duplicate recv packets */ ++ if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) { ++ ret = _FAIL; ++ goto exit; ++ } ++ ++ if (pattrib->privacy) { ++ GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, is_multicast_ether_addr(pattrib->ra)); ++ ++ SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); ++ } else { ++ pattrib->encrypt = 0; ++ pattrib->iv_len = 0; ++ pattrib->icv_len = 0; ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv_frame) ++{ ++ /* shall check frame subtype, to / from ds, da, bssid */ ++ ++ /* then call check if rx seq/frag. duplicated. */ ++ ++ u8 type; ++ u8 subtype; ++ int retval = _SUCCESS; ++ u8 bDumpRxPkt; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ u8 *ptr = precv_frame->rx_data; ++ u8 ver = (unsigned char)(*ptr) & 0x3; ++ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; ++ ++ if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { ++ int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter)); ++ if (ch_set_idx >= 0) ++ pmlmeext->channel_set[ch_set_idx].rx_count++; ++ } ++ ++ /* add version chk */ ++ if (ver != 0) { ++ retval = _FAIL; ++ goto exit; ++ } ++ ++ type = GetFrameType(ptr); ++ subtype = GetFrameSubType(ptr); /* bit(7)~bit(2) */ ++ ++ pattrib->to_fr_ds = get_tofr_ds(ptr); ++ ++ pattrib->frag_num = GetFragNum(ptr); ++ pattrib->seq_num = GetSequence(ptr); ++ ++ pattrib->pw_save = GetPwrMgt(ptr); ++ pattrib->mfrag = GetMFrag(ptr); ++ pattrib->mdata = GetMData(ptr); ++ pattrib->privacy = GetPrivacy(ptr); ++ pattrib->order = GetOrder(ptr); ++ ++ /* Dump rx packets */ ++ rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); ++ if (bDumpRxPkt == 1) {/* dump all rx packets */ ++ int i; ++ DBG_88E("#############################\n"); ++ ++ for (i = 0; i < 64; i = i + 8) ++ DBG_88E("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i), ++ *(ptr + i + 1), *(ptr + i + 2), *(ptr + i + 3), *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); ++ DBG_88E("#############################\n"); ++ } else if (bDumpRxPkt == 2) { ++ if (type == WIFI_MGT_TYPE) { ++ int i; ++ DBG_88E("#############################\n"); ++ ++ for (i = 0; i < 64; i = i + 8) ++ DBG_88E("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i), ++ *(ptr + i + 1), *(ptr + i + 2), *(ptr + i + 3), *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); ++ DBG_88E("#############################\n"); ++ } ++ } else if (bDumpRxPkt == 3) { ++ if (type == WIFI_DATA_TYPE) { ++ int i; ++ DBG_88E("#############################\n"); ++ ++ for (i = 0; i < 64; i = i + 8) ++ DBG_88E("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i), ++ *(ptr + i + 1), *(ptr + i + 2), *(ptr + i + 3), *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); ++ DBG_88E("#############################\n"); ++ } ++ } ++ switch (type) { ++ case WIFI_MGT_TYPE: /* mgnt */ ++ validate_recv_mgnt_frame(adapter, precv_frame); ++ retval = _FAIL; /* only data frame return _SUCCESS */ ++ break; ++ case WIFI_CTRL_TYPE: /* ctrl */ ++ validate_recv_ctrl_frame(adapter, precv_frame); ++ retval = _FAIL; /* only data frame return _SUCCESS */ ++ break; ++ case WIFI_DATA_TYPE: /* data */ ++ rtw_led_control(adapter, LED_CTL_RX); ++ pattrib->qos = (subtype & BIT(7)) ? 1 : 0; ++ retval = validate_recv_data_frame(adapter, precv_frame); ++ if (retval == _FAIL) { ++ struct recv_priv *precvpriv = &adapter->recvpriv; ++ precvpriv->rx_drop++; ++ } ++ break; ++ default: ++ retval = _FAIL; ++ break; ++ } ++ ++exit: ++ ++ return retval; ++} ++ ++/* remove the wlanhdr and add the eth_hdr */ ++ ++static int wlanhdr_to_ethhdr(struct recv_frame *precvframe) ++{ ++ int rmv_len; ++ u16 eth_type, len; ++ __be16 be_tmp; ++ u8 bsnaphdr; ++ u8 *psnap_type; ++ struct ieee80211_snap_hdr *psnap; ++ ++ int ret = _SUCCESS; ++ struct adapter *adapter = precvframe->adapter; ++ struct mlme_priv *pmlmepriv = &adapter->mlmepriv; ++ ++ u8 *ptr = get_recvframe_data(precvframe); /* point to frame_ctrl field */ ++ struct rx_pkt_attrib *pattrib = &precvframe->attrib; ++ ++ if (pattrib->encrypt) ++ recvframe_pull_tail(precvframe, pattrib->icv_len); ++ ++ psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len); ++ psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE; ++ /* convert hdr + possible LLC headers into Ethernet header */ ++ if ((!memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) && ++ memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) && ++ memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)) || ++ !memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)) { ++ /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ ++ bsnaphdr = true; ++ } else { ++ /* Leave Ethernet header part of hdr and full payload */ ++ bsnaphdr = false; ++ } ++ ++ rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0); ++ len = precvframe->len - rmv_len; ++ ++ memcpy(&be_tmp, ptr + rmv_len, 2); ++ eth_type = ntohs(be_tmp); /* pattrib->ether_type */ ++ pattrib->eth_type = eth_type; ++ ++ if ((check_fwstate(pmlmepriv, WIFI_MP_STATE))) { ++ ptr += rmv_len; ++ *ptr = 0x87; ++ *(ptr + 1) = 0x12; ++ ++ eth_type = 0x8712; ++ /* append rx status for mp test packets */ ++ ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2) - 24); ++ memcpy(ptr, get_rxmem(precvframe), 24); ++ ptr += 24; ++ } else { ++ ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0))); ++ } ++ ++ memcpy(ptr, pattrib->dst, ETH_ALEN); ++ memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN); ++ ++ if (!bsnaphdr) { ++ be_tmp = htons(len); ++ memcpy(ptr + 12, &be_tmp, 2); ++ } ++ ++ return ret; ++} ++ ++/* perform defrag */ ++static struct recv_frame *recvframe_defrag(struct adapter *adapter, struct __queue *defrag_q) ++{ ++ struct list_head *plist, *phead; ++ u8 wlanhdr_offset; ++ u8 curfragnum; ++ struct recv_frame *pfhdr, *pnfhdr; ++ struct recv_frame *prframe, *pnextrframe; ++ struct __queue *pfree_recv_queue; ++ ++ curfragnum = 0; ++ pfree_recv_queue = &adapter->recvpriv.free_recv_queue; ++ ++ phead = get_list_head(defrag_q); ++ plist = phead->next; ++ pfhdr = container_of(plist, struct recv_frame, list); ++ prframe = (struct recv_frame *)pfhdr; ++ list_del_init(&prframe->list); ++ ++ if (curfragnum != pfhdr->attrib.frag_num) { ++ /* the first fragment number must be 0 */ ++ /* free the whole queue */ ++ rtw_free_recvframe(prframe, pfree_recv_queue); ++ rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); ++ ++ return NULL; ++ } ++ ++ curfragnum++; ++ ++ plist = get_list_head(defrag_q); ++ plist = phead->next; ++ pfhdr = container_of(plist, struct recv_frame, list); ++ prframe = (struct recv_frame *)pfhdr; ++ list_del_init(&prframe->list); ++ ++ plist = plist->next; ++ ++ while (phead != plist) { ++ pnfhdr = container_of(plist, struct recv_frame, list); ++ pnextrframe = (struct recv_frame *)pnfhdr; ++ ++ /* check the fragment sequence (2nd ~n fragment frame) */ ++ ++ if (curfragnum != pnfhdr->attrib.frag_num) { ++ /* the fragment number must be increasing (after decache) */ ++ /* release the defrag_q & prframe */ ++ rtw_free_recvframe(prframe, pfree_recv_queue); ++ rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); ++ return NULL; ++ } ++ ++ curfragnum++; ++ ++ /* copy the 2nd~n fragment frame's payload to the first fragment */ ++ /* get the 2nd~last fragment frame's payload */ ++ ++ wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len; ++ ++ recvframe_pull(pnextrframe, wlanhdr_offset); ++ ++ /* append to first fragment frame's tail (if privacy frame, pull the ICV) */ ++ recvframe_pull_tail(prframe, pfhdr->attrib.icv_len); ++ ++ /* memcpy */ ++ memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len); ++ ++ recvframe_put(prframe, pnfhdr->len); ++ ++ pfhdr->attrib.icv_len = pnfhdr->attrib.icv_len; ++ plist = plist->next; ++ } ++ ++ /* free the defrag_q queue and return the prframe */ ++ rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); ++ ++ return prframe; ++} ++ ++/* check if need to defrag, if needed queue the frame to defrag_q */ ++struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_frame *precv_frame) ++{ ++ u8 ismfrag; ++ u8 fragnum; ++ u8 *psta_addr; ++ struct recv_frame *pfhdr; ++ struct sta_info *psta; ++ struct sta_priv *pstapriv; ++ struct list_head *phead; ++ struct recv_frame *prtnframe = NULL; ++ struct __queue *pfree_recv_queue, *pdefrag_q; ++ ++ pstapriv = &padapter->stapriv; ++ ++ pfhdr = precv_frame; ++ ++ pfree_recv_queue = &padapter->recvpriv.free_recv_queue; ++ ++ /* need to define struct of wlan header frame ctrl */ ++ ismfrag = pfhdr->attrib.mfrag; ++ fragnum = pfhdr->attrib.frag_num; ++ ++ psta_addr = pfhdr->attrib.ta; ++ psta = rtw_get_stainfo(pstapriv, psta_addr); ++ if (!psta) { ++ u8 type = GetFrameType(pfhdr->rx_data); ++ if (type != WIFI_DATA_TYPE) { ++ psta = rtw_get_bcmc_stainfo(padapter); ++ pdefrag_q = &psta->sta_recvpriv.defrag_q; ++ } else { ++ pdefrag_q = NULL; ++ } ++ } else { ++ pdefrag_q = &psta->sta_recvpriv.defrag_q; ++ } ++ ++ if ((ismfrag == 0) && (fragnum == 0)) ++ prtnframe = precv_frame;/* isn't a fragment frame */ ++ ++ if (ismfrag == 1) { ++ /* 0~(n-1) fragment frame */ ++ /* enqueue to defraf_g */ ++ if (pdefrag_q) { ++ if (fragnum == 0) { ++ /* the first fragment */ ++ if (!list_empty(&pdefrag_q->queue)) { ++ /* free current defrag_q */ ++ rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue); ++ } ++ } ++ ++ /* Then enqueue the 0~(n-1) fragment into the defrag_q */ ++ ++ phead = get_list_head(pdefrag_q); ++ list_add_tail(&pfhdr->list, phead); ++ ++ prtnframe = NULL; ++ } else { ++ /* can't find this ta's defrag_queue, so free this recv_frame */ ++ if (precv_frame && pfree_recv_queue) ++ rtw_free_recvframe(precv_frame, pfree_recv_queue); ++ prtnframe = NULL; ++ } ++ } ++ ++ if ((ismfrag == 0) && (fragnum != 0)) { ++ /* the last fragment frame */ ++ /* enqueue the last fragment */ ++ if (pdefrag_q) { ++ phead = get_list_head(pdefrag_q); ++ list_add_tail(&pfhdr->list, phead); ++ ++ /* call recvframe_defrag to defrag */ ++ precv_frame = recvframe_defrag(padapter, pdefrag_q); ++ prtnframe = precv_frame; ++ } else { ++ /* can't find this ta's defrag_queue, so free this recv_frame */ ++ if (precv_frame && pfree_recv_queue) ++ rtw_free_recvframe(precv_frame, pfree_recv_queue); ++ prtnframe = NULL; ++ } ++ } ++ ++ if (prtnframe && prtnframe->attrib.privacy) { ++ /* after defrag we must check tkip mic code */ ++ if (recvframe_chkmic(padapter, prtnframe) == _FAIL) { ++ if (precv_frame && pfree_recv_queue) ++ rtw_free_recvframe(prtnframe, pfree_recv_queue); ++ prtnframe = NULL; ++ } ++ } ++ ++ return prtnframe; ++} ++ ++static int amsdu_to_msdu(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ int a_len, padding_len; ++ u16 eth_type, nSubframe_Length; ++ u8 nr_subframes, i; ++ unsigned char *pdata; ++ struct rx_pkt_attrib *pattrib; ++ unsigned char *data_ptr; ++ struct sk_buff *sub_skb, *subframes[MAX_SUBFRAME_COUNT]; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ struct __queue *pfree_recv_queue = &precvpriv->free_recv_queue; ++ int ret = _SUCCESS; ++ nr_subframes = 0; ++ ++ pattrib = &prframe->attrib; ++ ++ recvframe_pull(prframe, prframe->attrib.hdrlen); ++ ++ if (prframe->attrib.iv_len > 0) ++ recvframe_pull(prframe, prframe->attrib.iv_len); ++ ++ a_len = prframe->len; ++ ++ pdata = prframe->rx_data; ++ ++ while (a_len > ETH_HLEN) { ++ /* Offset 12 denote 2 mac address */ ++ nSubframe_Length = RTW_GET_BE16(pdata + 12); ++ ++ if (a_len < ETH_HLEN + nSubframe_Length) { ++ DBG_88E("nRemain_Length is %d and nSubframe_Length is : %d\n", a_len, nSubframe_Length); ++ goto exit; ++ } ++ ++ /* move the data point to data content */ ++ pdata += ETH_HLEN; ++ a_len -= ETH_HLEN; ++ ++ /* Allocate new skb for releasing to upper layer */ ++ sub_skb = dev_alloc_skb(nSubframe_Length + 12); ++ if (sub_skb) { ++ skb_reserve(sub_skb, 12); ++ data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length); ++ memcpy(data_ptr, pdata, nSubframe_Length); ++ } else { ++ sub_skb = skb_clone(prframe->pkt, GFP_ATOMIC); ++ if (sub_skb) { ++ sub_skb->data = pdata; ++ sub_skb->len = nSubframe_Length; ++ skb_set_tail_pointer(sub_skb, nSubframe_Length); ++ } else { ++ DBG_88E("skb_clone() Fail!!! , nr_subframes=%d\n", nr_subframes); ++ break; ++ } ++ } ++ ++ subframes[nr_subframes++] = sub_skb; ++ ++ if (nr_subframes >= MAX_SUBFRAME_COUNT) { ++ DBG_88E("ParseSubframe(): Too many Subframes! Packets dropped!\n"); ++ break; ++ } ++ ++ pdata += nSubframe_Length; ++ a_len -= nSubframe_Length; ++ if (a_len != 0) { ++ padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4 - 1)); ++ if (padding_len == 4) { ++ padding_len = 0; ++ } ++ ++ if (a_len < padding_len) { ++ goto exit; ++ } ++ pdata += padding_len; ++ a_len -= padding_len; ++ } ++ } ++ ++ for (i = 0; i < nr_subframes; i++) { ++ sub_skb = subframes[i]; ++ /* convert hdr + possible LLC headers into Ethernet header */ ++ eth_type = RTW_GET_BE16(&sub_skb->data[6]); ++ if (sub_skb->len >= 8 && ++ ((!memcmp(sub_skb->data, rtw_rfc1042_header, SNAP_SIZE) && ++ eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || ++ !memcmp(sub_skb->data, rtw_bridge_tunnel_header, SNAP_SIZE))) { ++ /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ ++ skb_pull(sub_skb, SNAP_SIZE); ++ memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); ++ memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); ++ } else { ++ __be16 len; ++ /* Leave Ethernet header part of hdr and full payload */ ++ len = htons(sub_skb->len); ++ memcpy(skb_push(sub_skb, 2), &len, 2); ++ memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); ++ memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); ++ } ++ ++ /* Indicate the packets to upper layer */ ++ /* Insert NAT2.5 RX here! */ ++ sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev); ++ sub_skb->dev = padapter->pnetdev; ++ ++ sub_skb->ip_summed = CHECKSUM_NONE; ++ ++ netif_rx(sub_skb); ++ } ++ ++exit: ++ ++ prframe->len = 0; ++ rtw_free_recvframe(prframe, pfree_recv_queue);/* free this recv_frame */ ++ ++ return ret; ++} ++ ++static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num) ++{ ++ u8 wsize = preorder_ctrl->wsize_b; ++ u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) & 0xFFF;/* 4096; */ ++ ++ /* Rx Reorder initialize condition. */ ++ if (preorder_ctrl->indicate_seq == 0xFFFF) ++ preorder_ctrl->indicate_seq = seq_num; ++ ++ /* Drop out the packet which SeqNum is smaller than WinStart */ ++ if (SN_LESS(seq_num, preorder_ctrl->indicate_seq)) ++ return false; ++ ++ /* */ ++ /* Sliding window manipulation. Conditions includes: */ ++ /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */ ++ /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */ ++ /* */ ++ if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) { ++ preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; ++ } else if (SN_LESS(wend, seq_num)) { ++ if (seq_num >= (wsize - 1)) ++ preorder_ctrl->indicate_seq = seq_num + 1 - wsize; ++ else ++ preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1; ++ } ++ ++ return true; ++} ++ ++int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, struct recv_frame *prframe); ++int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, struct recv_frame *prframe) ++{ ++ struct rx_pkt_attrib *pattrib = &prframe->attrib; ++ struct __queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; ++ struct list_head *phead, *plist; ++ struct recv_frame *hdr; ++ struct rx_pkt_attrib *pnextattrib; ++ ++ phead = get_list_head(ppending_recvframe_queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ hdr = container_of(plist, struct recv_frame, list); ++ pnextattrib = &hdr->attrib; ++ ++ if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) ++ plist = plist->next; ++ else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) ++ return false; ++ else ++ break; ++ } ++ ++ list_del_init(&prframe->list); ++ ++ list_add_tail(&prframe->list, plist); ++ return true; ++} ++ ++static int recv_indicatepkts_in_order(struct adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced) ++{ ++ struct list_head *phead, *plist; ++ struct recv_frame *prframe; ++ struct rx_pkt_attrib *pattrib; ++ int bPktInBuf = false; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ struct __queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; ++ ++ phead = get_list_head(ppending_recvframe_queue); ++ plist = phead->next; ++ ++ /* Handling some condition for forced indicate case. */ ++ if (bforced) { ++ if (list_empty(phead)) ++ return true; ++ ++ prframe = container_of(plist, struct recv_frame, list); ++ pattrib = &prframe->attrib; ++ preorder_ctrl->indicate_seq = pattrib->seq_num; ++ } ++ ++ /* Prepare indication list and indication. */ ++ /* Check if there is any packet need indicate. */ ++ while (!list_empty(phead)) { ++ prframe = container_of(plist, struct recv_frame, list); ++ pattrib = &prframe->attrib; ++ ++ if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) { ++ plist = plist->next; ++ list_del_init(&prframe->list); ++ ++ if (SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) ++ preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; ++ ++ /* Set this as a lock to make sure that only one thread is indicating packet. */ ++ ++ /* indicate this recv_frame */ ++ if (!pattrib->amsdu) { ++ if ((!padapter->bDriverStopped) && ++ (!padapter->bSurpriseRemoved)) ++ rtw_recv_indicatepkt(padapter, prframe);/* indicate this recv_frame */ ++ } else if (pattrib->amsdu == 1) { ++ if (amsdu_to_msdu(padapter, prframe) != _SUCCESS) ++ rtw_free_recvframe(prframe, &precvpriv->free_recv_queue); ++ } else { ++ /* error condition; */ ++ } ++ ++ /* Update local variables. */ ++ bPktInBuf = false; ++ } else { ++ bPktInBuf = true; ++ break; ++ } ++ } ++ return bPktInBuf; ++} ++ ++static int recv_indicatepkt_reorder(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ int retval = _SUCCESS; ++ struct rx_pkt_attrib *pattrib = &prframe->attrib; ++ struct recv_reorder_ctrl *preorder_ctrl = prframe->preorder_ctrl; ++ struct __queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; ++ ++ if (!pattrib->amsdu) { ++ /* s1. */ ++ wlanhdr_to_ethhdr(prframe); ++ ++ if (pattrib->qos != 1) { ++ if (!padapter->bDriverStopped && ++ !padapter->bSurpriseRemoved) { ++ rtw_recv_indicatepkt(padapter, prframe); ++ return _SUCCESS; ++ } ++ ++ return _FAIL; ++ } ++ ++ if (!preorder_ctrl->enable) { ++ /* indicate this recv_frame */ ++ preorder_ctrl->indicate_seq = pattrib->seq_num; ++ rtw_recv_indicatepkt(padapter, prframe); ++ ++ preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096; ++ return _SUCCESS; ++ } ++ } else if (pattrib->amsdu == 1) { /* temp filter -> means didn't support A-MSDUs in a A-MPDU */ ++ if (!preorder_ctrl->enable) { ++ preorder_ctrl->indicate_seq = pattrib->seq_num; ++ retval = amsdu_to_msdu(padapter, prframe); ++ ++ preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096; ++ return retval; ++ } ++ } ++ ++ spin_lock_bh(&ppending_recvframe_queue->lock); ++ ++ /* s2. check if winstart_b(indicate_seq) needs to been updated */ ++ if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) ++ goto _err_exit; ++ ++ /* s3. Insert all packet into Reorder Queue to maintain its ordering. */ ++ if (!enqueue_reorder_recvframe(preorder_ctrl, prframe)) ++ goto _err_exit; ++ ++ /* s4. */ ++ /* Indication process. */ ++ /* After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets */ ++ /* with the SeqNum smaller than latest WinStart and buffer other packets. */ ++ /* */ ++ /* For Rx Reorder condition: */ ++ /* 1. All packets with SeqNum smaller than WinStart => Indicate */ ++ /* 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. */ ++ /* */ ++ ++ /* recv_indicatepkts_in_order(padapter, preorder_ctrl, true); */ ++ if (recv_indicatepkts_in_order(padapter, preorder_ctrl, false)) { ++ _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); ++ spin_unlock_bh(&ppending_recvframe_queue->lock); ++ } else { ++ spin_unlock_bh(&ppending_recvframe_queue->lock); ++ _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); ++ } ++ ++ return _SUCCESS; ++ ++_err_exit: ++ ++ spin_unlock_bh(&ppending_recvframe_queue->lock); ++ ++ return _FAIL; ++} ++ ++void rtw_reordering_ctrl_timeout_handler(void *pcontext) ++{ ++ struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext; ++ struct adapter *padapter = preorder_ctrl->padapter; ++ struct __queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; ++ ++ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) ++ return; ++ ++ spin_lock_bh(&ppending_recvframe_queue->lock); ++ ++ if (recv_indicatepkts_in_order(padapter, preorder_ctrl, true)) ++ _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); ++ ++ spin_unlock_bh(&ppending_recvframe_queue->lock); ++} ++ ++static int process_recv_indicatepkts(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ int retval = _SUCCESS; ++ /* struct recv_priv *precvpriv = &padapter->recvpriv; */ ++ /* struct rx_pkt_attrib *pattrib = &prframe->attrib; */ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ ++ if (phtpriv->ht_option) { /* B/G/N Mode */ ++ /* prframe->preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; */ ++ ++ if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) { ++ /* including perform A-MPDU Rx Ordering Buffer Control */ ++ if ((!padapter->bDriverStopped) && ++ (!padapter->bSurpriseRemoved)) { ++ retval = _FAIL; ++ return retval; ++ } ++ } ++ } else { /* B/G mode */ ++ retval = wlanhdr_to_ethhdr(prframe); ++ if (retval != _SUCCESS) ++ return retval; ++ ++ if ((!padapter->bDriverStopped) && ++ (!padapter->bSurpriseRemoved)) { ++ /* indicate this recv_frame */ ++ rtw_recv_indicatepkt(padapter, prframe); ++ } else { ++ retval = _FAIL; ++ return retval; ++ } ++ } ++ ++ return retval; ++} ++ ++static int recv_func_prehandle(struct adapter *padapter, struct recv_frame *rframe) ++{ ++ int ret = _SUCCESS; ++ struct rx_pkt_attrib *pattrib = &rframe->attrib; ++ struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (padapter->registrypriv.mp_mode == 1) { ++ if (pattrib->crc_err == 1) ++ padapter->mppriv.rx_crcerrpktcount++; ++ else ++ padapter->mppriv.rx_pktcount++; ++ ++ if (!check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE)) { ++ ret = _FAIL; ++ rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ ++ goto exit; ++ } ++ } ++ ++ /* check the frame crtl field and decache */ ++ ret = validate_recv_frame(padapter, rframe); ++ if (ret != _SUCCESS) { ++ rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ ++ goto exit; ++ } ++ ++exit: ++ return ret; ++} ++ ++static int recv_func_posthandle(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ int ret = _SUCCESS; ++ struct recv_frame *orig_prframe = prframe; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; ++ ++ /* DATA FRAME */ ++ rtw_led_control(padapter, LED_CTL_RX); ++ ++ prframe = decryptor(padapter, prframe); ++ if (!prframe) { ++ ret = _FAIL; ++ goto _recv_data_drop; ++ } ++ ++ prframe = recvframe_chk_defrag(padapter, prframe); ++ if (!prframe) ++ goto _recv_data_drop; ++ ++ prframe = portctrl(padapter, prframe); ++ if (!prframe) { ++ ret = _FAIL; ++ goto _recv_data_drop; ++ } ++ ++ count_rx_stats(padapter, prframe, NULL); ++ ++ ret = process_recv_indicatepkts(padapter, prframe); ++ if (ret != _SUCCESS) { ++ rtw_free_recvframe(orig_prframe, pfree_recv_queue);/* free this recv_frame */ ++ goto _recv_data_drop; ++ } ++ return ret; ++ ++_recv_data_drop: ++ precvpriv->rx_drop++; ++ return ret; ++} ++ ++static int recv_func(struct adapter *padapter, struct recv_frame *rframe) ++{ ++ int ret; ++ struct rx_pkt_attrib *prxattrib = &rframe->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_priv *mlmepriv = &padapter->mlmepriv; ++ struct recv_priv *recvpriv = &padapter->recvpriv; ++ ++ /* check if need to handle uc_swdec_pending_queue*/ ++ if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && ++ psecuritypriv->busetkipkey) { ++ struct recv_frame *pending_frame; ++ int cnt = 0; ++ ++ pending_frame = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue); ++ while (pending_frame) { ++ cnt++; ++ recv_func_posthandle(padapter, pending_frame); ++ } ++ } ++ ++ ret = recv_func_prehandle(padapter, rframe); ++ ++ if (ret == _SUCCESS) { ++ /* check if need to enqueue into uc_swdec_pending_queue*/ ++ if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && ++ !is_multicast_ether_addr(prxattrib->ra) && prxattrib->encrypt > 0 && ++ (prxattrib->bdecrypted == 0 || psecuritypriv->sw_decrypt) && ++ psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK && ++ !psecuritypriv->busetkipkey) { ++ rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue); ++ DBG_88E("%s: no key, enqueue uc_swdec_pending_queue\n", __func__); ++ if (recvpriv->free_recvframe_cnt < NR_RECVFRAME / 4) { ++ /* to prevent from recvframe starvation, ++ * get recvframe from uc_swdec_pending_queue to ++ * free_recvframe_cnt */ ++ rframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue); ++ if (rframe) ++ goto do_posthandle; ++ } ++ goto exit; ++ } ++do_posthandle: ++ ret = recv_func_posthandle(padapter, rframe); ++ } ++ ++exit: ++ return ret; ++} ++ ++s32 rtw_recv_entry(struct recv_frame *precvframe) ++{ ++ struct adapter *padapter; ++ struct recv_priv *precvpriv; ++ s32 ret = _SUCCESS; ++ ++ padapter = precvframe->adapter; ++ ++ precvpriv = &padapter->recvpriv; ++ ++ ret = recv_func(padapter, precvframe); ++ if (ret == _FAIL) ++ goto _recv_entry_drop; ++ ++ precvpriv->rx_pkts++; ++ ++ return ret; ++ ++_recv_entry_drop: ++ ++ if (padapter->registrypriv.mp_mode == 1) ++ padapter->mppriv.rx_pktloss = precvpriv->rx_drop; ++ ++ return ret; ++} ++ ++void rtw_signal_stat_timer_hdl(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, recvpriv.signal_stat_timer); ++ struct recv_priv *recvpriv = &adapter->recvpriv; ++ ++ u32 tmp_s, tmp_q; ++ u8 avg_signal_strength = 0; ++ u8 avg_signal_qual = 0; ++ u8 _alpha = 3; /* this value is based on converging_constant = 5000 and sampling_interval = 1000 */ ++ ++ if (adapter->recvpriv.is_signal_dbg) { ++ /* update the user specific value, signal_strength_dbg, to signal_strength, rssi */ ++ adapter->recvpriv.signal_strength = adapter->recvpriv.signal_strength_dbg; ++ adapter->recvpriv.rssi = (s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg); ++ } else { ++ if (recvpriv->signal_strength_data.update_req == 0) {/* update_req is clear, means we got rx */ ++ avg_signal_strength = recvpriv->signal_strength_data.avg_val; ++ /* after avg_vals are accquired, we can re-stat the signal values */ ++ recvpriv->signal_strength_data.update_req = 1; ++ } ++ ++ if (recvpriv->signal_qual_data.update_req == 0) {/* update_req is clear, means we got rx */ ++ avg_signal_qual = recvpriv->signal_qual_data.avg_val; ++ /* after avg_vals are accquired, we can re-stat the signal values */ ++ recvpriv->signal_qual_data.update_req = 1; ++ } ++ ++ /* update value of signal_strength, rssi, signal_qual */ ++ if (!check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY)) { ++ tmp_s = (avg_signal_strength + (_alpha - 1) * recvpriv->signal_strength); ++ if (tmp_s % _alpha) ++ tmp_s = tmp_s / _alpha + 1; ++ else ++ tmp_s = tmp_s / _alpha; ++ if (tmp_s > 100) ++ tmp_s = 100; ++ ++ tmp_q = (avg_signal_qual + (_alpha - 1) * recvpriv->signal_qual); ++ if (tmp_q % _alpha) ++ tmp_q = tmp_q / _alpha + 1; ++ else ++ tmp_q = tmp_q / _alpha; ++ if (tmp_q > 100) ++ tmp_q = 100; ++ ++ recvpriv->signal_strength = tmp_s; ++ recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); ++ recvpriv->signal_qual = tmp_q; ++ } ++ } ++ rtw_set_signal_stat_timer(recvpriv); ++} +diff --git a/drivers/staging/r8188eu/core/rtw_rf.c b/drivers/staging/r8188eu/core/rtw_rf.c +new file mode 100644 +index 000000000000..321546c40446 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_rf.c +@@ -0,0 +1,72 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_RF_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/xmit_osdep.h" ++ ++struct ch_freq { ++ u32 channel; ++ u32 frequency; ++}; ++ ++static struct ch_freq ch_freq_map[] = { ++ {1, 2412}, {2, 2417}, {3, 2422}, {4, 2427}, {5, 2432}, ++ {6, 2437}, {7, 2442}, {8, 2447}, {9, 2452}, {10, 2457}, ++ {11, 2462}, {12, 2467}, {13, 2472}, {14, 2484}, ++ /* UNII */ ++ {36, 5180}, {40, 5200}, {44, 5220}, {48, 5240}, {52, 5260}, ++ {56, 5280}, {60, 5300}, {64, 5320}, {149, 5745}, {153, 5765}, ++ {157, 5785}, {161, 5805}, {165, 5825}, {167, 5835}, {169, 5845}, ++ {171, 5855}, {173, 5865}, ++ /* HiperLAN2 */ ++ {100, 5500}, {104, 5520}, {108, 5540}, {112, 5560}, {116, 5580}, ++ {120, 5600}, {124, 5620}, {128, 5640}, {132, 5660}, {136, 5680}, ++ {140, 5700}, ++ /* Japan MMAC */ ++ {34, 5170}, {38, 5190}, {42, 5210}, {46, 5230}, ++ /* Japan */ ++ {184, 4920}, {188, 4940}, {192, 4960}, {196, 4980}, ++ {208, 5040},/* Japan, means J08 */ ++ {212, 5060},/* Japan, means J12 */ ++ {216, 5080},/* Japan, means J16 */ ++}; ++ ++static int ch_freq_map_num = (sizeof(ch_freq_map) / sizeof(struct ch_freq)); ++ ++u32 rtw_ch2freq(u32 channel) ++{ ++ u8 i; ++ u32 freq = 0; ++ ++ for (i = 0; i < ch_freq_map_num; i++) { ++ if (channel == ch_freq_map[i].channel) { ++ freq = ch_freq_map[i].frequency; ++ break; ++ } ++ } ++ if (i == ch_freq_map_num) ++ freq = 2412; ++ ++ return freq; ++} ++ ++u32 rtw_freq2ch(u32 freq) ++{ ++ u8 i; ++ u32 ch = 0; ++ ++ for (i = 0; i < ch_freq_map_num; i++) { ++ if (freq == ch_freq_map[i].frequency) { ++ ch = ch_freq_map[i].channel; ++ break; ++ } ++ } ++ if (i == ch_freq_map_num) ++ ch = 1; ++ ++ return ch; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_security.c b/drivers/staging/r8188eu/core/rtw_security.c +new file mode 100644 +index 000000000000..5aa893ab46e9 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_security.c +@@ -0,0 +1,1656 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_SECURITY_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/osdep_intf.h" ++ ++/* WEP related ===== */ ++ ++#define CRC32_POLY 0x04c11db7 ++ ++struct arc4context { ++ u32 x; ++ u32 y; ++ u8 state[256]; ++}; ++ ++static void arcfour_init(struct arc4context *parc4ctx, u8 *key, u32 key_len) ++{ ++ u32 t, u; ++ u32 keyindex; ++ u32 stateindex; ++ u8 *state; ++ u32 counter; ++ ++ state = parc4ctx->state; ++ parc4ctx->x = 0; ++ parc4ctx->y = 0; ++ for (counter = 0; counter < 256; counter++) ++ state[counter] = (u8)counter; ++ keyindex = 0; ++ stateindex = 0; ++ for (counter = 0; counter < 256; counter++) { ++ t = state[counter]; ++ stateindex = (stateindex + key[keyindex] + t) & 0xff; ++ u = state[stateindex]; ++ state[stateindex] = (u8)t; ++ state[counter] = (u8)u; ++ if (++keyindex >= key_len) ++ keyindex = 0; ++ } ++ ++} ++ ++static u32 arcfour_byte(struct arc4context *parc4ctx) ++{ ++ u32 x; ++ u32 y; ++ u32 sx, sy; ++ u8 *state; ++ ++ state = parc4ctx->state; ++ x = (parc4ctx->x + 1) & 0xff; ++ sx = state[x]; ++ y = (sx + parc4ctx->y) & 0xff; ++ sy = state[y]; ++ parc4ctx->x = x; ++ parc4ctx->y = y; ++ state[y] = (u8)sx; ++ state[x] = (u8)sy; ++ ++ return state[(sx + sy) & 0xff]; ++} ++ ++static void arcfour_encrypt(struct arc4context *parc4ctx, u8 *dest, u8 *src, u32 len) ++{ ++ u32 i; ++ ++ for (i = 0; i < len; i++) ++ dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx); ++ ++} ++ ++/* ++ Need to consider the fragment situation ++*/ ++void rtw_wep_encrypt(struct adapter *padapter, u8 *pxmitframe) ++{ /* exclude ICV */ ++ union { ++ __le32 f0; ++ u8 f1[4]; ++ } crc; ++ struct arc4context mycontext; ++ ++ int curfragnum, length; ++ u32 keylength; ++ ++ u8 *pframe, *payload, *iv; /* wepkey */ ++ u8 wepkey[16]; ++ u8 hw_hdr_offset = 0; ++ struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ if (!((struct xmit_frame *)pxmitframe)->buf_addr) ++ return; ++ ++ hw_hdr_offset = TXDESC_SIZE + ++ (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); ++ ++ pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; ++ ++ /* start to encrypt each fragment */ ++ if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) { ++ keylength = psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; ++ ++ for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { ++ iv = pframe + pattrib->hdrlen; ++ memcpy(&wepkey[0], iv, 3); ++ memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0], keylength); ++ payload = pframe + pattrib->iv_len + pattrib->hdrlen; ++ ++ if ((curfragnum + 1) == pattrib->nr_frags) { /* the last fragment */ ++ length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ ++ crc.f0 = cpu_to_le32(~crc32_le(~0, payload, length)); ++ ++ arcfour_init(&mycontext, wepkey, 3 + keylength); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ arcfour_encrypt(&mycontext, payload + length, crc.f1, 4); ++ } else { ++ length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ crc.f0 = cpu_to_le32(~crc32_le(~0, payload, length)); ++ arcfour_init(&mycontext, wepkey, 3 + keylength); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ arcfour_encrypt(&mycontext, payload + length, crc.f1, 4); ++ ++ pframe += pxmitpriv->frag_len; ++ pframe = (u8 *)RND4((size_t)(pframe)); ++ } ++ } ++ } ++ ++} ++ ++void rtw_wep_decrypt(struct adapter *padapter, u8 *precvframe) ++{ ++ /* exclude ICV */ ++ struct arc4context mycontext; ++ int length; ++ u32 keylength; ++ u8 *pframe, *payload, *iv, wepkey[16]; ++ u8 keyindex; ++ struct rx_pkt_attrib *prxattrib = &(((struct recv_frame *)precvframe)->attrib); ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ ++ pframe = (unsigned char *)((struct recv_frame *)precvframe)->rx_data; ++ ++ /* start to decrypt recvframe */ ++ if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt == _WEP104_)) { ++ iv = pframe + prxattrib->hdrlen; ++ keyindex = prxattrib->key_index; ++ keylength = psecuritypriv->dot11DefKeylen[keyindex]; ++ memcpy(&wepkey[0], iv, 3); ++ memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0], keylength); ++ length = ((struct recv_frame *)precvframe)->len - prxattrib->hdrlen - prxattrib->iv_len; ++ ++ payload = pframe + prxattrib->iv_len + prxattrib->hdrlen; ++ ++ /* decrypt payload include icv */ ++ arcfour_init(&mycontext, wepkey, 3 + keylength); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ } ++} ++ ++/* 3 ===== TKIP related ===== */ ++ ++static u32 secmicgetuint32(u8 *p) ++/* Convert from Byte[] to Us3232 in a portable way */ ++{ ++ s32 i; ++ u32 res = 0; ++ ++ for (i = 0; i < 4; i++) ++ res |= ((u32)(*p++)) << (8 * i); ++ ++ return res; ++} ++ ++static void secmicputuint32(u8 *p, u32 val) ++/* Convert from Us3232 to Byte[] in a portable way */ ++{ ++ long i; ++ ++ for (i = 0; i < 4; i++) { ++ *p++ = (u8)(val & 0xff); ++ val >>= 8; ++ } ++ ++} ++ ++static void secmicclear(struct mic_data *pmicdata) ++{ ++/* Reset the state to the empty message. */ ++ ++ pmicdata->L = pmicdata->K0; ++ pmicdata->R = pmicdata->K1; ++ pmicdata->nBytesInM = 0; ++ pmicdata->M = 0; ++ ++} ++ ++void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key) ++{ ++ /* Set the key */ ++ ++ pmicdata->K0 = secmicgetuint32(key); ++ pmicdata->K1 = secmicgetuint32(key + 4); ++ /* and reset the message */ ++ secmicclear(pmicdata); ++ ++} ++ ++void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b) ++{ ++ ++ /* Append the byte to our word-sized buffer */ ++ pmicdata->M |= ((unsigned long)b) << (8 * pmicdata->nBytesInM); ++ pmicdata->nBytesInM++; ++ /* Process the word if it is full. */ ++ if (pmicdata->nBytesInM >= 4) { ++ pmicdata->L ^= pmicdata->M; ++ pmicdata->R ^= ROL32(pmicdata->L, 17); ++ pmicdata->L += pmicdata->R; ++ pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8); ++ pmicdata->L += pmicdata->R; ++ pmicdata->R ^= ROL32(pmicdata->L, 3); ++ pmicdata->L += pmicdata->R; ++ pmicdata->R ^= ROR32(pmicdata->L, 2); ++ pmicdata->L += pmicdata->R; ++ /* Clear the buffer */ ++ pmicdata->M = 0; ++ pmicdata->nBytesInM = 0; ++ } ++ ++} ++ ++void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nbytes) ++{ ++ ++ /* This is simple */ ++ while (nbytes > 0) { ++ rtw_secmicappendbyte(pmicdata, *src++); ++ nbytes--; ++ } ++ ++} ++ ++void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst) ++{ ++ ++ /* Append the minimum padding */ ++ rtw_secmicappendbyte(pmicdata, 0x5a); ++ rtw_secmicappendbyte(pmicdata, 0); ++ rtw_secmicappendbyte(pmicdata, 0); ++ rtw_secmicappendbyte(pmicdata, 0); ++ rtw_secmicappendbyte(pmicdata, 0); ++ /* and then zeroes until the length is a multiple of 4 */ ++ while (pmicdata->nBytesInM != 0) ++ rtw_secmicappendbyte(pmicdata, 0); ++ /* The appendByte function has already computed the result. */ ++ secmicputuint32(dst, pmicdata->L); ++ secmicputuint32(dst + 4, pmicdata->R); ++ /* Reset to the empty message. */ ++ secmicclear(pmicdata); ++ ++} ++ ++void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code, u8 pri) ++{ ++ struct mic_data micdata; ++ u8 priority[4] = {0x0, 0x0, 0x0, 0x0}; ++ ++ rtw_secmicsetkey(&micdata, key); ++ priority[0] = pri; ++ ++ /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */ ++ if (header[1] & 1) { /* ToDS == 1 */ ++ rtw_secmicappend(&micdata, &header[16], 6); /* DA */ ++ if (header[1] & 2) /* From Ds == 1 */ ++ rtw_secmicappend(&micdata, &header[24], 6); ++ else ++ rtw_secmicappend(&micdata, &header[10], 6); ++ } else { /* ToDS == 0 */ ++ rtw_secmicappend(&micdata, &header[4], 6); /* DA */ ++ if (header[1] & 2) /* From Ds == 1 */ ++ rtw_secmicappend(&micdata, &header[16], 6); ++ else ++ rtw_secmicappend(&micdata, &header[10], 6); ++ } ++ rtw_secmicappend(&micdata, &priority[0], 4); ++ ++ rtw_secmicappend(&micdata, data, data_len); ++ ++ rtw_secgetmic(&micdata, mic_code); ++ ++} ++ ++/* macros for extraction/creation of unsigned char/unsigned short values */ ++#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) ++#define Lo8(v16) ((u8)((v16) & 0x00FF)) ++#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF)) ++#define Lo16(v32) ((u16)((v32) & 0xFFFF)) ++#define Hi16(v32) ((u16)(((v32) >> 16) & 0xFFFF)) ++#define Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8)) ++ ++/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ ++#define TK16(N) Mk16(tk[2 * (N) + 1], tk[2 * (N)]) ++ ++/* S-box lookup: 16 bits --> 16 bits */ ++#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)]) ++ ++/* fixed algorithm "parameters" */ ++#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ ++#define TA_SIZE 6 /* 48-bit transmitter address */ ++#define TK_SIZE 16 /* 128-bit temporal key */ ++#define P1K_SIZE 10 /* 80-bit Phase1 key */ ++#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ ++ ++/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ ++static const unsigned short Sbox1[2][256] = { /* Sbox for hash (can be in ROM) */ ++{ ++ 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154, ++ 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A, ++ 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B, ++ 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B, ++ 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F, ++ 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F, ++ 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5, ++ 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F, ++ 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB, ++ 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397, ++ 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED, ++ 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A, ++ 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194, ++ 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3, ++ 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104, ++ 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D, ++ 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39, ++ 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695, ++ 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83, ++ 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76, ++ 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4, ++ 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B, ++ 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0, ++ 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018, ++ 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751, ++ 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85, ++ 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12, ++ 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9, ++ 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7, ++ 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A, ++ 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8, ++ 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A, ++ }, ++ ++ { /* second half of table is unsigned char-reversed version of first! */ ++ 0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491, ++ 0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC, ++ 0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB, ++ 0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B, ++ 0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83, ++ 0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A, ++ 0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F, ++ 0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA, ++ 0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B, ++ 0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713, ++ 0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6, ++ 0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85, ++ 0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411, ++ 0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B, ++ 0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1, ++ 0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF, ++ 0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E, ++ 0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6, ++ 0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B, ++ 0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD, ++ 0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8, ++ 0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2, ++ 0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049, ++ 0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810, ++ 0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197, ++ 0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F, ++ 0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C, ++ 0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927, ++ 0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733, ++ 0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5, ++ 0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0, ++ 0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C, ++ } ++}; ++ ++ /* ++********************************************************************** ++* Routine: Phase 1 -- generate P1K, given TA, TK, IV32 ++* ++* Inputs: ++* tk[] = temporal key [128 bits] ++* ta[] = transmitter's MAC address [ 48 bits] ++* iv32 = upper 32 bits of IV [ 32 bits] ++* Output: ++* p1k[] = Phase 1 key [ 80 bits] ++* ++* Note: ++* This function only needs to be called every 2**16 packets, ++* although in theory it could be called every packet. ++* ++********************************************************************** ++*/ ++static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32) ++{ ++ int i; ++ ++ /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ ++ p1k[0] = Lo16(iv32); ++ p1k[1] = Hi16(iv32); ++ p1k[2] = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */ ++ p1k[3] = Mk16(ta[3], ta[2]); ++ p1k[4] = Mk16(ta[5], ta[4]); ++ ++ /* Now compute an unbalanced Feistel cipher with 80-bit block */ ++ /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ ++ for (i = 0; i < PHASE1_LOOP_CNT; i++) { /* Each add operation here is mod 2**16 */ ++ p1k[0] += _S_(p1k[4] ^ TK16((i & 1) + 0)); ++ p1k[1] += _S_(p1k[0] ^ TK16((i & 1) + 2)); ++ p1k[2] += _S_(p1k[1] ^ TK16((i & 1) + 4)); ++ p1k[3] += _S_(p1k[2] ^ TK16((i & 1) + 6)); ++ p1k[4] += _S_(p1k[3] ^ TK16((i & 1) + 0)); ++ p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ ++ } ++ ++} ++ ++/* ++********************************************************************** ++* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16 ++* ++* Inputs: ++* tk[] = Temporal key [128 bits] ++* p1k[] = Phase 1 output key [ 80 bits] ++* iv16 = low 16 bits of IV counter [ 16 bits] ++* Output: ++* rc4key[] = the key used to encrypt the packet [128 bits] ++* ++* Note: ++* The value {TA, IV32, IV16} for Phase1/Phase2 must be unique ++* across all packets using the same key TK value. Then, for a ++* given value of TK[], this TKIP48 construction guarantees that ++* the final RC4KEY value is unique across all packets. ++* ++* Suggested implementation optimization: if PPK[] is "overlaid" ++* appropriately on RC4KEY[], there is no need for the final ++* for loop below that copies the PPK[] result into RC4KEY[]. ++* ++********************************************************************** ++*/ ++static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16) ++{ ++ int i; ++ u16 PPK[6]; /* temporary key for mixing */ ++ ++ /* Note: all adds in the PPK[] equations below are mod 2**16 */ ++ for (i = 0; i < 5; i++) ++ PPK[i] = p1k[i]; /* first, copy P1K to PPK */ ++ PPK[5] = p1k[4] + iv16; /* next, add in IV16 */ ++ ++ /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ ++ PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ ++ PPK[1] += _S_(PPK[0] ^ TK16(1)); ++ PPK[2] += _S_(PPK[1] ^ TK16(2)); ++ PPK[3] += _S_(PPK[2] ^ TK16(3)); ++ PPK[4] += _S_(PPK[3] ^ TK16(4)); ++ PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ ++ ++ /* Final sweep: bijective, "linear". Rotates kill LSB correlations */ ++ PPK[0] += RotR1(PPK[5] ^ TK16(6)); ++ PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ ++ PPK[2] += RotR1(PPK[1]); ++ PPK[3] += RotR1(PPK[2]); ++ PPK[4] += RotR1(PPK[3]); ++ PPK[5] += RotR1(PPK[4]); ++ /* Note: At this point, for a given key TK[0..15], the 96-bit output */ ++ /* value PPK[0..5] is guaranteed to be unique, as a function */ ++ /* of the 96-bit "input" value {TA, IV32, IV16}. That is, P1K */ ++ /* is now a keyed permutation of {TA, IV32, IV16}. */ ++ ++ /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */ ++ rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ ++ rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ ++ rc4key[2] = Lo8(iv16); ++ rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); ++ ++ /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ ++ for (i = 0; i < 6; i++) { ++ rc4key[4 + 2 * i] = Lo8(PPK[i]); ++ rc4key[5 + 2 * i] = Hi8(PPK[i]); ++ } ++ ++} ++ ++/* The hlen isn't include the IV */ ++u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe) ++{ /* exclude ICV */ ++ u16 pnl; ++ u32 pnh; ++ u8 rc4key[16]; ++ u8 ttkey[16]; ++ union { ++ __le32 f0; ++ u8 f1[4]; ++ } crc; ++ u8 hw_hdr_offset = 0; ++ struct arc4context mycontext; ++ int curfragnum, length; ++ ++ u8 *pframe, *payload, *iv, *prwskey; ++ union pn48 dot11txpn; ++ struct sta_info *stainfo; ++ struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ u32 res = _SUCCESS; ++ ++ if (!((struct xmit_frame *)pxmitframe)->buf_addr) ++ return _FAIL; ++ ++ hw_hdr_offset = TXDESC_SIZE + ++ (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); ++ pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; ++ /* 4 start to encrypt each fragment */ ++ if (pattrib->encrypt == _TKIP_) { ++ if (pattrib->psta) ++ stainfo = pattrib->psta; ++ else ++ stainfo = rtw_get_stainfo(&padapter->stapriv, &pattrib->ra[0]); ++ ++ if (stainfo) { ++ if (is_multicast_ether_addr(pattrib->ra)) ++ prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; ++ else ++ prwskey = &stainfo->dot118021x_UncstKey.skey[0]; ++ ++ for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { ++ iv = pframe + pattrib->hdrlen; ++ payload = pframe + pattrib->iv_len + pattrib->hdrlen; ++ ++ GET_TKIP_PN(iv, dot11txpn); ++ ++ pnl = (u16)(dot11txpn.val); ++ pnh = (u32)(dot11txpn.val >> 16); ++ phase1((u16 *)&ttkey[0], prwskey, &pattrib->ta[0], pnh); ++ phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0], pnl); ++ ++ if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */ ++ length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ crc.f0 = cpu_to_le32(~crc32_le(~0, payload, length)); ++ ++ arcfour_init(&mycontext, rc4key, 16); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ arcfour_encrypt(&mycontext, payload + length, crc.f1, 4); ++ } else { ++ length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ crc.f0 = cpu_to_le32(~crc32_le(~0, payload, length)); ++ ++ arcfour_init(&mycontext, rc4key, 16); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ arcfour_encrypt(&mycontext, payload + length, crc.f1, 4); ++ ++ pframe += pxmitpriv->frag_len; ++ pframe = (u8 *)RND4((size_t)(pframe)); ++ } ++ } ++ } else { ++ res = _FAIL; ++ } ++ } ++ ++ return res; ++} ++ ++/* The hlen isn't include the IV */ ++u32 rtw_tkip_decrypt(struct adapter *padapter, u8 *precvframe) ++{ /* exclude ICV */ ++ u16 pnl; ++ u32 pnh; ++ u8 rc4key[16]; ++ u8 ttkey[16]; ++ union { ++ __le32 f0; ++ u8 f1[4]; ++ } crc; ++ struct arc4context mycontext; ++ int length; ++ ++ u8 *pframe, *payload, *iv, *prwskey; ++ union pn48 dot11txpn; ++ struct sta_info *stainfo; ++ struct rx_pkt_attrib *prxattrib = &((struct recv_frame *)precvframe)->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ u32 res = _SUCCESS; ++ ++ pframe = (unsigned char *)((struct recv_frame *)precvframe)->rx_data; ++ ++ /* 4 start to decrypt recvframe */ ++ if (prxattrib->encrypt == _TKIP_) { ++ stainfo = rtw_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]); ++ if (stainfo) { ++ if (is_multicast_ether_addr(prxattrib->ra)) { ++ if (!psecuritypriv->binstallGrpkey) { ++ res = _FAIL; ++ DBG_88E("%s:rx bc/mc packets, but didn't install group key!!!!!!!!!!\n", __func__); ++ goto exit; ++ } ++ prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; ++ } else { ++ prwskey = &stainfo->dot118021x_UncstKey.skey[0]; ++ } ++ ++ iv = pframe + prxattrib->hdrlen; ++ payload = pframe + prxattrib->iv_len + prxattrib->hdrlen; ++ length = ((struct recv_frame *)precvframe)->len - prxattrib->hdrlen - prxattrib->iv_len; ++ ++ GET_TKIP_PN(iv, dot11txpn); ++ ++ pnl = (u16)(dot11txpn.val); ++ pnh = (u32)(dot11txpn.val >> 16); ++ ++ phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0], pnh); ++ phase2(&rc4key[0], prwskey, (unsigned short *)&ttkey[0], pnl); ++ ++ /* 4 decrypt payload include icv */ ++ ++ arcfour_init(&mycontext, rc4key, 16); ++ arcfour_encrypt(&mycontext, payload, payload, length); ++ ++ crc.f0 = cpu_to_le32(~crc32_le(~0, payload, length)); ++ ++ if (crc.f1[3] != payload[length - 1] || ++ crc.f1[2] != payload[length - 2] || ++ crc.f1[1] != payload[length - 3] || ++ crc.f1[0] != payload[length - 4]) ++ res = _FAIL; ++ } else { ++ res = _FAIL; ++ } ++ } ++ ++exit: ++ return res; ++} ++ ++/* 3 ===== AES related ===== */ ++ ++#define MAX_MSG_SIZE 2048 ++/*****************************/ ++/******** SBOX Table *********/ ++/*****************************/ ++ ++static u8 sbox_table[256] = { ++ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, ++ 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, ++ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, ++ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, ++ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, ++ 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, ++ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, ++ 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, ++ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, ++ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, ++ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, ++ 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, ++ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, ++ 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, ++ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, ++ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, ++ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, ++ 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, ++ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, ++ 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, ++ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, ++ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, ++ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, ++ 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, ++ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, ++ 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, ++ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, ++ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, ++ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, ++ 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, ++ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, ++ 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ++}; ++ ++/*****************************/ ++/**** Function Prototypes ****/ ++/*****************************/ ++ ++static void bitwise_xor(u8 *ina, u8 *inb, u8 *out); ++static void construct_mic_iv(u8 *mic_header1, int qc_exists, int a4_exists, u8 *mpdu, uint payload_length, u8 *pn_vector); ++static void construct_mic_header1(u8 *mic_header1, int header_length, u8 *mpdu); ++static void construct_mic_header2(u8 *mic_header2, u8 *mpdu, int a4_exists, int qc_exists); ++static void construct_ctr_preload(u8 *ctr_preload, int a4_exists, int qc_exists, u8 *mpdu, u8 *pn_vector, int c); ++static void xor_128(u8 *a, u8 *b, u8 *out); ++static void xor_32(u8 *a, u8 *b, u8 *out); ++static u8 sbox(u8 a); ++static void next_key(u8 *key, int round); ++static void byte_sub(u8 *in, u8 *out); ++static void shift_row(u8 *in, u8 *out); ++static void mix_column(u8 *in, u8 *out); ++static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext); ++ ++/****************************************/ ++/* aes128k128d() */ ++/* Performs a 128 bit AES encrypt with */ ++/* 128 bit data. */ ++/****************************************/ ++static void xor_128(u8 *a, u8 *b, u8 *out) ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ out[i] = a[i] ^ b[i]; ++ ++} ++ ++static void xor_32(u8 *a, u8 *b, u8 *out) ++{ ++ int i; ++ ++ for (i = 0; i < 4; i++) ++ out[i] = a[i] ^ b[i]; ++ ++} ++ ++static u8 sbox(u8 a) ++{ ++ return sbox_table[(int)a]; ++} ++ ++static void next_key(u8 *key, int round) ++{ ++ u8 rcon; ++ u8 sbox_key[4]; ++ u8 rcon_table[12] = { ++ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, ++ 0x1b, 0x36, 0x36, 0x36 ++ }; ++ ++ sbox_key[0] = sbox(key[13]); ++ sbox_key[1] = sbox(key[14]); ++ sbox_key[2] = sbox(key[15]); ++ sbox_key[3] = sbox(key[12]); ++ ++ rcon = rcon_table[round]; ++ ++ xor_32(&key[0], sbox_key, &key[0]); ++ key[0] = key[0] ^ rcon; ++ ++ xor_32(&key[4], &key[0], &key[4]); ++ xor_32(&key[8], &key[4], &key[8]); ++ xor_32(&key[12], &key[8], &key[12]); ++ ++} ++ ++static void byte_sub(u8 *in, u8 *out) ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ out[i] = sbox(in[i]); ++ ++} ++ ++static void shift_row(u8 *in, u8 *out) ++{ ++ ++ out[0] = in[0]; ++ out[1] = in[5]; ++ out[2] = in[10]; ++ out[3] = in[15]; ++ out[4] = in[4]; ++ out[5] = in[9]; ++ out[6] = in[14]; ++ out[7] = in[3]; ++ out[8] = in[8]; ++ out[9] = in[13]; ++ out[10] = in[2]; ++ out[11] = in[7]; ++ out[12] = in[12]; ++ out[13] = in[1]; ++ out[14] = in[6]; ++ out[15] = in[11]; ++ ++} ++ ++static void mix_column(u8 *in, u8 *out) ++{ ++ int i; ++ u8 add1b[4]; ++ u8 add1bf7[4]; ++ u8 rotl[4]; ++ u8 swap_halfs[4]; ++ u8 andf7[4]; ++ u8 rotr[4]; ++ u8 temp[4]; ++ u8 tempb[4]; ++ ++ for (i = 0 ; i < 4; i++) { ++ if ((in[i] & 0x80) == 0x80) ++ add1b[i] = 0x1b; ++ else ++ add1b[i] = 0x00; ++ } ++ ++ swap_halfs[0] = in[2]; /* Swap halves */ ++ swap_halfs[1] = in[3]; ++ swap_halfs[2] = in[0]; ++ swap_halfs[3] = in[1]; ++ ++ rotl[0] = in[3]; /* Rotate left 8 bits */ ++ rotl[1] = in[0]; ++ rotl[2] = in[1]; ++ rotl[3] = in[2]; ++ ++ andf7[0] = in[0] & 0x7f; ++ andf7[1] = in[1] & 0x7f; ++ andf7[2] = in[2] & 0x7f; ++ andf7[3] = in[3] & 0x7f; ++ ++ for (i = 3; i > 0; i--) { /* logical shift left 1 bit */ ++ andf7[i] = andf7[i] << 1; ++ if ((andf7[i - 1] & 0x80) == 0x80) ++ andf7[i] = (andf7[i] | 0x01); ++ } ++ andf7[0] = andf7[0] << 1; ++ andf7[0] = andf7[0] & 0xfe; ++ ++ xor_32(add1b, andf7, add1bf7); ++ ++ xor_32(in, add1bf7, rotr); ++ ++ temp[0] = rotr[0]; /* Rotate right 8 bits */ ++ rotr[0] = rotr[1]; ++ rotr[1] = rotr[2]; ++ rotr[2] = rotr[3]; ++ rotr[3] = temp[0]; ++ ++ xor_32(add1bf7, rotr, temp); ++ xor_32(swap_halfs, rotl, tempb); ++ xor_32(temp, tempb, out); ++ ++} ++ ++static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext) ++{ ++ int round; ++ int i; ++ u8 intermediatea[16]; ++ u8 intermediateb[16]; ++ u8 round_key[16]; ++ ++ for (i = 0; i < 16; i++) ++ round_key[i] = key[i]; ++ for (round = 0; round < 11; round++) { ++ if (round == 0) { ++ xor_128(round_key, data, ciphertext); ++ next_key(round_key, round); ++ } else if (round == 10) { ++ byte_sub(ciphertext, intermediatea); ++ shift_row(intermediatea, intermediateb); ++ xor_128(intermediateb, round_key, ciphertext); ++ } else { /* 1 - 9 */ ++ byte_sub(ciphertext, intermediatea); ++ shift_row(intermediatea, intermediateb); ++ mix_column(&intermediateb[0], &intermediatea[0]); ++ mix_column(&intermediateb[4], &intermediatea[4]); ++ mix_column(&intermediateb[8], &intermediatea[8]); ++ mix_column(&intermediateb[12], &intermediatea[12]); ++ xor_128(intermediatea, round_key, ciphertext); ++ next_key(round_key, round); ++ } ++ } ++ ++} ++ ++/************************************************/ ++/* construct_mic_iv() */ ++/* Builds the MIC IV from header fields and PN */ ++/************************************************/ ++static void construct_mic_iv(u8 *mic_iv, int qc_exists, int a4_exists, u8 *mpdu, ++ uint payload_length, u8 *pn_vector) ++{ ++ int i; ++ ++ mic_iv[0] = 0x59; ++ if (qc_exists && a4_exists) ++ mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ ++ if (qc_exists && !a4_exists) ++ mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ ++ if (!qc_exists) ++ mic_iv[1] = 0x00; ++ for (i = 2; i < 8; i++) ++ mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ ++ for (i = 8; i < 14; i++) ++ mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ ++ mic_iv[14] = (unsigned char)(payload_length / 256); ++ mic_iv[15] = (unsigned char)(payload_length % 256); ++ ++} ++ ++/************************************************/ ++/* construct_mic_header1() */ ++/* Builds the first MIC header block from */ ++/* header fields. */ ++/************************************************/ ++static void construct_mic_header1(u8 *mic_header1, int header_length, u8 *mpdu) ++{ ++ ++ mic_header1[0] = (u8)((header_length - 2) / 256); ++ mic_header1[1] = (u8)((header_length - 2) % 256); ++ mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ ++ mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ ++ mic_header1[4] = mpdu[4]; /* A1 */ ++ mic_header1[5] = mpdu[5]; ++ mic_header1[6] = mpdu[6]; ++ mic_header1[7] = mpdu[7]; ++ mic_header1[8] = mpdu[8]; ++ mic_header1[9] = mpdu[9]; ++ mic_header1[10] = mpdu[10]; /* A2 */ ++ mic_header1[11] = mpdu[11]; ++ mic_header1[12] = mpdu[12]; ++ mic_header1[13] = mpdu[13]; ++ mic_header1[14] = mpdu[14]; ++ mic_header1[15] = mpdu[15]; ++ ++} ++ ++/************************************************/ ++/* construct_mic_header2() */ ++/* Builds the last MIC header block from */ ++/* header fields. */ ++/************************************************/ ++static void construct_mic_header2(u8 *mic_header2, u8 *mpdu, int a4_exists, int qc_exists) ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ mic_header2[i] = 0x00; ++ ++ mic_header2[0] = mpdu[16]; /* A3 */ ++ mic_header2[1] = mpdu[17]; ++ mic_header2[2] = mpdu[18]; ++ mic_header2[3] = mpdu[19]; ++ mic_header2[4] = mpdu[20]; ++ mic_header2[5] = mpdu[21]; ++ ++ mic_header2[6] = 0x00; ++ mic_header2[7] = 0x00; /* mpdu[23]; */ ++ ++ if (!qc_exists && a4_exists) { ++ for (i = 0; i < 6; i++) ++ mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ ++ } ++ ++ if (qc_exists && !a4_exists) { ++ mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ ++ mic_header2[9] = mpdu[25] & 0x00; ++ } ++ ++ if (qc_exists && a4_exists) { ++ for (i = 0; i < 6; i++) ++ mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ ++ ++ mic_header2[14] = mpdu[30] & 0x0f; ++ mic_header2[15] = mpdu[31] & 0x00; ++ } ++ ++} ++ ++/************************************************/ ++/* construct_mic_header2() */ ++/* Builds the last MIC header block from */ ++/* header fields. */ ++/************************************************/ ++static void construct_ctr_preload(u8 *ctr_preload, int a4_exists, int qc_exists, u8 *mpdu, u8 *pn_vector, int c) ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ ctr_preload[i] = 0x00; ++ i = 0; ++ ++ ctr_preload[0] = 0x01; /* flag */ ++ if (qc_exists && a4_exists) ++ ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ ++ if (qc_exists && !a4_exists) ++ ctr_preload[1] = mpdu[24] & 0x0f; ++ ++ for (i = 2; i < 8; i++) ++ ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ ++ for (i = 8; i < 14; i++) ++ ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ ++ ctr_preload[14] = (unsigned char)(c / 256); /* Ctr */ ++ ctr_preload[15] = (unsigned char)(c % 256); ++ ++} ++ ++/************************************/ ++/* bitwise_xor() */ ++/* A 128 bit, bitwise exclusive or */ ++/************************************/ ++static void bitwise_xor(u8 *ina, u8 *inb, u8 *out) ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) ++ out[i] = ina[i] ^ inb[i]; ++ ++} ++ ++static int aes_cipher(u8 *key, uint hdrlen, u8 *pframe, uint plen) ++{ ++ uint qc_exists, a4_exists, i, j, payload_remainder, ++ num_blocks, payload_index; ++ ++ u8 pn_vector[6]; ++ u8 mic_iv[16]; ++ u8 mic_header1[16]; ++ u8 mic_header2[16]; ++ u8 ctr_preload[16]; ++ ++ /* Intermediate Buffers */ ++ u8 chain_buffer[16]; ++ u8 aes_out[16]; ++ u8 padded_buffer[16]; ++ u8 mic[8]; ++ uint frtype = GetFrameType(pframe); ++ uint frsubtype = GetFrameSubType(pframe); ++ ++ frsubtype = frsubtype >> 4; ++ ++ memset((void *)mic_iv, 0, 16); ++ memset((void *)mic_header1, 0, 16); ++ memset((void *)mic_header2, 0, 16); ++ memset((void *)ctr_preload, 0, 16); ++ memset((void *)chain_buffer, 0, 16); ++ memset((void *)aes_out, 0, 16); ++ memset((void *)padded_buffer, 0, 16); ++ ++ if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) ++ a4_exists = 0; ++ else ++ a4_exists = 1; ++ ++ if ((frtype == WIFI_DATA_CFACK) || (frtype == WIFI_DATA_CFPOLL) || (frtype == WIFI_DATA_CFACKPOLL)) { ++ qc_exists = 1; ++ if (hdrlen != WLAN_HDR_A3_QOS_LEN) ++ hdrlen += 2; ++ } else if ((frsubtype == 0x08) || (frsubtype == 0x09) || (frsubtype == 0x0a) || (frsubtype == 0x0b)) { ++ if (hdrlen != WLAN_HDR_A3_QOS_LEN) ++ hdrlen += 2; ++ qc_exists = 1; ++ } else { ++ qc_exists = 0; ++ } ++ ++ pn_vector[0] = pframe[hdrlen]; ++ pn_vector[1] = pframe[hdrlen + 1]; ++ pn_vector[2] = pframe[hdrlen + 4]; ++ pn_vector[3] = pframe[hdrlen + 5]; ++ pn_vector[4] = pframe[hdrlen + 6]; ++ pn_vector[5] = pframe[hdrlen + 7]; ++ ++ construct_mic_iv(mic_iv, qc_exists, a4_exists, pframe, plen, pn_vector); ++ ++ construct_mic_header1(mic_header1, hdrlen, pframe); ++ construct_mic_header2(mic_header2, pframe, a4_exists, qc_exists); ++ ++ payload_remainder = plen % 16; ++ num_blocks = plen / 16; ++ ++ /* Find start of payload */ ++ payload_index = (hdrlen + 8); ++ ++ /* Calculate MIC */ ++ aes128k128d(key, mic_iv, aes_out); ++ bitwise_xor(aes_out, mic_header1, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ bitwise_xor(aes_out, mic_header2, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ ++ for (i = 0; i < num_blocks; i++) { ++ bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */ ++ ++ payload_index += 16; ++ aes128k128d(key, chain_buffer, aes_out); ++ } ++ ++ /* Add on the final payload block if it needs padding */ ++ if (payload_remainder > 0) { ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < payload_remainder; j++) ++ padded_buffer[j] = pframe[payload_index++];/* padded_buffer[j] = message[payload_index++]; */ ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ } ++ ++ for (j = 0; j < 8; j++) ++ mic[j] = aes_out[j]; ++ ++ /* Insert MIC into payload */ ++ for (j = 0; j < 8; j++) ++ pframe[payload_index + j] = mic[j]; /* message[payload_index+j] = mic[j]; */ ++ ++ payload_index = hdrlen + 8; ++ for (i = 0; i < num_blocks; i++) { ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pframe, pn_vector, i + 1); ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); ++ for (j = 0; j < 16; j++) ++ pframe[payload_index++] = chain_buffer[j]; ++ } ++ ++ if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/ ++ /* encrypt it and copy the unpadded part back */ ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pframe, pn_vector, num_blocks + 1); ++ ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < payload_remainder; j++) ++ padded_buffer[j] = pframe[payload_index + j]; ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ for (j = 0; j < payload_remainder; j++) ++ pframe[payload_index++] = chain_buffer[j]; ++ } ++ /* Encrypt the MIC */ ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pframe, pn_vector, 0); ++ ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < 8; j++) ++ padded_buffer[j] = pframe[j + hdrlen + 8 + plen]; ++ ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ for (j = 0; j < 8; j++) ++ pframe[payload_index++] = chain_buffer[j]; ++ ++ return _SUCCESS; ++} ++ ++u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe) ++{ /* exclude ICV */ ++ ++ /*static*/ ++/* unsigned char message[MAX_MSG_SIZE]; */ ++ ++ /* Intermediate Buffers */ ++ int curfragnum, length; ++ u8 *pframe, *prwskey; /* *payload,*iv */ ++ u8 hw_hdr_offset = 0; ++ struct sta_info *stainfo; ++ struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++/* uint offset = 0; */ ++ u32 res = _SUCCESS; ++ ++ if (!((struct xmit_frame *)pxmitframe)->buf_addr) ++ return _FAIL; ++ ++ hw_hdr_offset = TXDESC_SIZE + ++ (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); ++ ++ pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; ++ ++ /* 4 start to encrypt each fragment */ ++ if (pattrib->encrypt == _AES_) { ++ if (pattrib->psta) ++ stainfo = pattrib->psta; ++ else ++ stainfo = rtw_get_stainfo(&padapter->stapriv, &pattrib->ra[0]); ++ ++ if (stainfo) { ++ if (is_multicast_ether_addr(pattrib->ra)) ++ prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; ++ else ++ prwskey = &stainfo->dot118021x_UncstKey.skey[0]; ++ for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { ++ if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */ ++ length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ ++ aes_cipher(prwskey, pattrib->hdrlen, pframe, length); ++ } else { ++ length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; ++ ++ aes_cipher(prwskey, pattrib->hdrlen, pframe, length); ++ pframe += pxmitpriv->frag_len; ++ pframe = (u8 *)RND4((size_t)(pframe)); ++ } ++ } ++ } else { ++ res = _FAIL; ++ } ++ } ++ ++ return res; ++} ++ ++static int aes_decipher(u8 *key, uint hdrlen, ++ u8 *pframe, uint plen) ++{ ++ static u8 message[MAX_MSG_SIZE]; ++ uint qc_exists, a4_exists, i, j, payload_remainder, ++ num_blocks, payload_index; ++ int res = _SUCCESS; ++ u8 pn_vector[6]; ++ u8 mic_iv[16]; ++ u8 mic_header1[16]; ++ u8 mic_header2[16]; ++ u8 ctr_preload[16]; ++ ++ /* Intermediate Buffers */ ++ u8 chain_buffer[16]; ++ u8 aes_out[16]; ++ u8 padded_buffer[16]; ++ u8 mic[8]; ++ ++/* uint offset = 0; */ ++ uint frtype = GetFrameType(pframe); ++ uint frsubtype = GetFrameSubType(pframe); ++ ++ frsubtype = frsubtype >> 4; ++ ++ memset((void *)mic_iv, 0, 16); ++ memset((void *)mic_header1, 0, 16); ++ memset((void *)mic_header2, 0, 16); ++ memset((void *)ctr_preload, 0, 16); ++ memset((void *)chain_buffer, 0, 16); ++ memset((void *)aes_out, 0, 16); ++ memset((void *)padded_buffer, 0, 16); ++ ++ /* start to decrypt the payload */ ++ ++ num_blocks = (plen - 8) / 16; /* plen including llc, payload_length and mic) */ ++ ++ payload_remainder = (plen - 8) % 16; ++ ++ pn_vector[0] = pframe[hdrlen]; ++ pn_vector[1] = pframe[hdrlen + 1]; ++ pn_vector[2] = pframe[hdrlen + 4]; ++ pn_vector[3] = pframe[hdrlen + 5]; ++ pn_vector[4] = pframe[hdrlen + 6]; ++ pn_vector[5] = pframe[hdrlen + 7]; ++ ++ if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) ++ a4_exists = 0; ++ else ++ a4_exists = 1; ++ ++ if ((frtype == WIFI_DATA_CFACK) || (frtype == WIFI_DATA_CFPOLL) || ++ (frtype == WIFI_DATA_CFACKPOLL)) { ++ qc_exists = 1; ++ if (hdrlen != WLAN_HDR_A3_QOS_LEN) ++ hdrlen += 2; ++ } else if ((frsubtype == 0x08) || (frsubtype == 0x09) || ++ (frsubtype == 0x0a) || (frsubtype == 0x0b)) { ++ if (hdrlen != WLAN_HDR_A3_QOS_LEN) ++ hdrlen += 2; ++ qc_exists = 1; ++ } else { ++ qc_exists = 0; ++ } ++ ++ /* now, decrypt pframe with hdrlen offset and plen long */ ++ ++ payload_index = hdrlen + 8; /* 8 is for extiv */ ++ ++ for (i = 0; i < num_blocks; i++) { ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pframe, pn_vector, i + 1); ++ ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); ++ ++ for (j = 0; j < 16; j++) ++ pframe[payload_index++] = chain_buffer[j]; ++ } ++ ++ if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/ ++ /* encrypt it and copy the unpadded part back */ ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pframe, pn_vector, num_blocks + 1); ++ ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < payload_remainder; j++) ++ padded_buffer[j] = pframe[payload_index + j]; ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ for (j = 0; j < payload_remainder; j++) ++ pframe[payload_index++] = chain_buffer[j]; ++ } ++ ++ /* start to calculate the mic */ ++ if ((hdrlen + plen + 8) <= MAX_MSG_SIZE) ++ memcpy(message, pframe, (hdrlen + plen + 8)); /* 8 is for ext iv len */ ++ ++ pn_vector[0] = pframe[hdrlen]; ++ pn_vector[1] = pframe[hdrlen + 1]; ++ pn_vector[2] = pframe[hdrlen + 4]; ++ pn_vector[3] = pframe[hdrlen + 5]; ++ pn_vector[4] = pframe[hdrlen + 6]; ++ pn_vector[5] = pframe[hdrlen + 7]; ++ construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen - 8, pn_vector); ++ ++ construct_mic_header1(mic_header1, hdrlen, message); ++ construct_mic_header2(mic_header2, message, a4_exists, qc_exists); ++ ++ payload_remainder = (plen - 8) % 16; ++ num_blocks = (plen - 8) / 16; ++ ++ /* Find start of payload */ ++ payload_index = (hdrlen + 8); ++ ++ /* Calculate MIC */ ++ aes128k128d(key, mic_iv, aes_out); ++ bitwise_xor(aes_out, mic_header1, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ bitwise_xor(aes_out, mic_header2, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ ++ for (i = 0; i < num_blocks; i++) { ++ bitwise_xor(aes_out, &message[payload_index], chain_buffer); ++ ++ payload_index += 16; ++ aes128k128d(key, chain_buffer, aes_out); ++ } ++ ++ /* Add on the final payload block if it needs padding */ ++ if (payload_remainder > 0) { ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < payload_remainder; j++) ++ padded_buffer[j] = message[payload_index++]; ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ aes128k128d(key, chain_buffer, aes_out); ++ } ++ ++ for (j = 0 ; j < 8; j++) ++ mic[j] = aes_out[j]; ++ ++ /* Insert MIC into payload */ ++ for (j = 0; j < 8; j++) ++ message[payload_index + j] = mic[j]; ++ ++ payload_index = hdrlen + 8; ++ for (i = 0; i < num_blocks; i++) { ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message, pn_vector, i + 1); ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, &message[payload_index], chain_buffer); ++ for (j = 0; j < 16; j++) ++ message[payload_index++] = chain_buffer[j]; ++ } ++ ++ if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/ ++ /* encrypt it and copy the unpadded part back */ ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message, pn_vector, num_blocks + 1); ++ ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < payload_remainder; j++) ++ padded_buffer[j] = message[payload_index + j]; ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ for (j = 0; j < payload_remainder; j++) ++ message[payload_index++] = chain_buffer[j]; ++ } ++ ++ /* Encrypt the MIC */ ++ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message, pn_vector, 0); ++ ++ for (j = 0; j < 16; j++) ++ padded_buffer[j] = 0x00; ++ for (j = 0; j < 8; j++) ++ padded_buffer[j] = message[j + hdrlen + 8 + plen - 8]; ++ ++ aes128k128d(key, ctr_preload, aes_out); ++ bitwise_xor(aes_out, padded_buffer, chain_buffer); ++ for (j = 0; j < 8; j++) ++ message[payload_index++] = chain_buffer[j]; ++ ++ /* compare the mic */ ++ for (i = 0; i < 8; i++) { ++ if (pframe[hdrlen + 8 + plen - 8 + i] != message[hdrlen + 8 + plen - 8 + i]) { ++ DBG_88E("aes_decipher:mic check error mic[%d]: pframe(%x)!=message(%x)\n", ++ i, pframe[hdrlen + 8 + plen - 8 + i], message[hdrlen + 8 + plen - 8 + i]); ++ res = _FAIL; ++ } ++ } ++ ++ return res; ++} ++ ++u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe) ++{ /* exclude ICV */ ++ /* Intermediate Buffers */ ++ int length; ++ u8 *pframe, *prwskey; /* *payload,*iv */ ++ struct sta_info *stainfo; ++ struct rx_pkt_attrib *prxattrib = &((struct recv_frame *)precvframe)->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ u32 res = _SUCCESS; ++ ++ pframe = (unsigned char *)((struct recv_frame *)precvframe)->rx_data; ++ /* 4 start to encrypt each fragment */ ++ if (prxattrib->encrypt == _AES_) { ++ stainfo = rtw_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]); ++ if (stainfo) { ++ if (is_multicast_ether_addr(prxattrib->ra)) { ++ /* in concurrent we should use sw descrypt in group key, so we remove this message */ ++ if (!psecuritypriv->binstallGrpkey) { ++ res = _FAIL; ++ DBG_88E("%s:rx bc/mc packets, but didn't install group key!!!!!!!!!!\n", __func__); ++ goto exit; ++ } ++ prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; ++ if (psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) { ++ DBG_88E("not match packet_index=%d, install_index=%d\n", ++ prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid); ++ res = _FAIL; ++ goto exit; ++ } ++ } else { ++ prwskey = &stainfo->dot118021x_UncstKey.skey[0]; ++ } ++ length = ((struct recv_frame *)precvframe)->len - prxattrib->hdrlen - prxattrib->iv_len; ++ res = aes_decipher(prwskey, prxattrib->hdrlen, pframe, length); ++ } else { ++ res = _FAIL; ++ } ++ } ++ ++exit: ++ return res; ++} ++ ++/* AES tables*/ ++const u32 Te0[256] = { ++ 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, ++ 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, ++ 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, ++ 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, ++ 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, ++ 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, ++ 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, ++ 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, ++ 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, ++ 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, ++ 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, ++ 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, ++ 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, ++ 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, ++ 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, ++ 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, ++ 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, ++ 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, ++ 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, ++ 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, ++ 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, ++ 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, ++ 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, ++ 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, ++ 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, ++ 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, ++ 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, ++ 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, ++ 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, ++ 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, ++ 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, ++ 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, ++ 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, ++ 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, ++ 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, ++ 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, ++ 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, ++ 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, ++ 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, ++ 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, ++ 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, ++ 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, ++ 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, ++ 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, ++ 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, ++ 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, ++ 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, ++ 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, ++ 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, ++ 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, ++ 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, ++ 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, ++ 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, ++ 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, ++ 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, ++ 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, ++ 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, ++ 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, ++ 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, ++ 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, ++ 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, ++ 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, ++ 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, ++ 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, ++}; ++ ++const u32 Td0[256] = { ++ 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, ++ 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, ++ 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, ++ 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, ++ 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, ++ 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, ++ 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, ++ 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, ++ 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, ++ 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, ++ 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, ++ 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, ++ 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, ++ 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, ++ 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, ++ 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, ++ 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, ++ 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, ++ 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, ++ 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, ++ 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, ++ 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, ++ 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, ++ 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, ++ 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, ++ 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, ++ 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, ++ 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, ++ 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, ++ 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, ++ 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, ++ 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, ++ 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, ++ 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, ++ 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, ++ 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, ++ 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, ++ 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, ++ 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, ++ 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, ++ 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, ++ 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, ++ 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, ++ 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, ++ 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, ++ 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, ++ 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, ++ 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, ++ 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, ++ 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, ++ 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, ++ 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, ++ 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, ++ 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, ++ 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, ++ 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, ++ 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, ++ 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, ++ 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, ++ 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, ++ 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, ++ 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, ++ 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, ++ 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, ++}; ++ ++const u8 Td4s[256] = { ++ 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, ++ 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, ++ 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, ++ 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, ++ 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, ++ 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, ++ 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, ++ 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, ++ 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, ++ 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, ++ 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, ++ 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, ++ 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, ++ 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, ++ 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, ++ 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, ++ 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, ++ 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, ++ 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, ++ 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, ++ 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, ++ 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, ++ 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, ++ 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, ++ 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, ++ 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, ++ 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, ++ 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, ++ 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, ++ 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, ++ 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, ++ 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, ++}; ++const u8 rcons[] = { ++ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 ++ /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ ++}; ++ ++/** ++ * Expand the cipher key into the encryption key schedule. ++ * ++ * @return the number of rounds for the given cipher key size. ++ */ ++#define ROUND(i, d, s) \ ++do { \ ++ d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ ++ d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ ++ d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ ++ d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]; \ ++} while (0); ++ ++/** ++ * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC) ++ * @key: 128-bit key for the hash operation ++ * @data: Data buffer for which a MAC is determined ++ * @data_len: Length of data buffer in bytes ++ * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) ++ * Returns: 0 on success, -1 on failure ++ * ++ * This is a mode for using block cipher (AES in this case) for authentication. ++ * OMAC1 was standardized with the name CMAC by NIST in a Special Publication ++ * (SP) 800-38B. ++ */ ++void rtw_use_tkipkey_handler(void *FunctionContext) ++{ ++ struct adapter *padapter = (struct adapter *)FunctionContext; ++ ++ padapter->securitypriv.busetkipkey = true; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_sreset.c b/drivers/staging/r8188eu/core/rtw_sreset.c +new file mode 100644 +index 000000000000..c831033d20a9 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_sreset.c +@@ -0,0 +1,62 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#include "../include/rtw_sreset.h" ++ ++void sreset_init_value(struct adapter *padapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct sreset_priv *psrtpriv = &pHalData->srestpriv; ++ ++ _rtw_mutex_init(&psrtpriv->silentreset_mutex); ++ psrtpriv->silent_reset_inprogress = false; ++ psrtpriv->wifi_error_status = WIFI_STATUS_SUCCESS; ++ psrtpriv->last_tx_time = 0; ++ psrtpriv->last_tx_complete_time = 0; ++} ++void sreset_reset_value(struct adapter *padapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct sreset_priv *psrtpriv = &pHalData->srestpriv; ++ ++ psrtpriv->silent_reset_inprogress = false; ++ psrtpriv->wifi_error_status = WIFI_STATUS_SUCCESS; ++ psrtpriv->last_tx_time = 0; ++ psrtpriv->last_tx_complete_time = 0; ++} ++ ++u8 sreset_get_wifi_status(struct adapter *padapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct sreset_priv *psrtpriv = &pHalData->srestpriv; ++ ++ u8 status = WIFI_STATUS_SUCCESS; ++ u32 val32 = 0; ++ ++ if (psrtpriv->silent_reset_inprogress) ++ return status; ++ val32 = rtw_read32(padapter, REG_TXDMA_STATUS); ++ if (val32 == 0xeaeaeaea) { ++ psrtpriv->wifi_error_status = WIFI_IF_NOT_EXIST; ++ } else if (val32 != 0) { ++ DBG_88E("txdmastatu(%x)\n", val32); ++ psrtpriv->wifi_error_status = WIFI_MAC_TXDMA_ERROR; ++ } ++ ++ if (WIFI_STATUS_SUCCESS != psrtpriv->wifi_error_status) { ++ DBG_88E("==>%s error_status(0x%x)\n", __func__, psrtpriv->wifi_error_status); ++ status = (psrtpriv->wifi_error_status & (~(USB_READ_PORT_FAIL | USB_WRITE_PORT_FAIL))); ++ } ++ DBG_88E("==> %s wifi_status(0x%x)\n", __func__, status); ++ ++ /* status restore */ ++ psrtpriv->wifi_error_status = WIFI_STATUS_SUCCESS; ++ ++ return status; ++} ++ ++void sreset_set_wifi_error_status(struct adapter *padapter, u32 status) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ pHalData->srestpriv.wifi_error_status = status; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_sta_mgt.c b/drivers/staging/r8188eu/core/rtw_sta_mgt.c +new file mode 100644 +index 000000000000..f6dffed53a60 +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_sta_mgt.c +@@ -0,0 +1,508 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTW_STA_MGT_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/xmit_osdep.h" ++#include "../include/mlme_osdep.h" ++#include "../include/sta_info.h" ++ ++static void _rtw_init_stainfo(struct sta_info *psta) ++{ ++ ++ memset((u8 *)psta, 0, sizeof(struct sta_info)); ++ ++ spin_lock_init(&psta->lock); ++ INIT_LIST_HEAD(&psta->list); ++ INIT_LIST_HEAD(&psta->hash_list); ++ _rtw_init_queue(&psta->sleep_q); ++ psta->sleepq_len = 0; ++ ++ _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); ++ _rtw_init_sta_recv_priv(&psta->sta_recvpriv); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++ INIT_LIST_HEAD(&psta->asoc_list); ++ ++ INIT_LIST_HEAD(&psta->auth_list); ++ ++ psta->expire_to = 0; ++ ++ psta->flags = 0; ++ ++ psta->capability = 0; ++ ++ psta->bpairwise_key_installed = false; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ psta->nonerp_set = 0; ++ psta->no_short_slot_time_set = 0; ++ psta->no_short_preamble_set = 0; ++ psta->no_ht_gf_set = 0; ++ psta->no_ht_set = 0; ++ psta->ht_20mhz_set = 0; ++#endif ++ ++ psta->under_exist_checking = 0; ++ ++ psta->keep_alive_trycnt = 0; ++ ++#endif /* CONFIG_88EU_AP_MODE */ ++ ++} ++ ++u32 _rtw_init_sta_priv(struct sta_priv *pstapriv) ++{ ++ struct sta_info *psta; ++ s32 i; ++ ++ pstapriv->pallocated_stainfo_buf = vzalloc(sizeof(struct sta_info) * NUM_STA + 4); ++ ++ if (!pstapriv->pallocated_stainfo_buf) ++ return _FAIL; ++ ++ pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - ++ ((size_t)(pstapriv->pallocated_stainfo_buf) & 3); ++ ++ _rtw_init_queue(&pstapriv->free_sta_queue); ++ ++ spin_lock_init(&pstapriv->sta_hash_lock); ++ ++ pstapriv->asoc_sta_count = 0; ++ _rtw_init_queue(&pstapriv->sleep_q); ++ _rtw_init_queue(&pstapriv->wakeup_q); ++ ++ psta = (struct sta_info *)(pstapriv->pstainfo_buf); ++ ++ for (i = 0; i < NUM_STA; i++) { ++ _rtw_init_stainfo(psta); ++ ++ INIT_LIST_HEAD(&pstapriv->sta_hash[i]); ++ ++ list_add_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue)); ++ ++ psta++; ++ } ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++ pstapriv->sta_dz_bitmap = 0; ++ pstapriv->tim_bitmap = 0; ++ ++ INIT_LIST_HEAD(&pstapriv->asoc_list); ++ INIT_LIST_HEAD(&pstapriv->auth_list); ++ spin_lock_init(&pstapriv->asoc_list_lock); ++ spin_lock_init(&pstapriv->auth_list_lock); ++ pstapriv->asoc_list_cnt = 0; ++ pstapriv->auth_list_cnt = 0; ++ ++ pstapriv->auth_to = 3; /* 3*2 = 6 sec */ ++ pstapriv->assoc_to = 3; ++ pstapriv->expire_to = 3; /* 3*2 = 6 sec */ ++ pstapriv->max_num_sta = NUM_STA; ++#endif ++ ++ return _SUCCESS; ++} ++ ++inline int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta) ++{ ++ int offset = (((u8 *)sta) - stapriv->pstainfo_buf) / sizeof(struct sta_info); ++ ++ if (!stainfo_offset_valid(offset)) ++ DBG_88E("%s invalid offset(%d), out of range!!!", __func__, offset); ++ ++ return offset; ++} ++ ++inline struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset) ++{ ++ if (!stainfo_offset_valid(offset)) ++ DBG_88E("%s invalid offset(%d), out of range!!!", __func__, offset); ++ ++ return (struct sta_info *)(stapriv->pstainfo_buf + offset * sizeof(struct sta_info)); ++} ++ ++u32 _rtw_free_sta_priv(struct sta_priv *pstapriv) ++{ ++ struct list_head *phead, *plist; ++ struct sta_info *psta = NULL; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ int index; ++ ++ if (pstapriv) { ++ /* delete all reordering_ctrl_timer */ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ for (index = 0; index < NUM_STA; index++) { ++ phead = &pstapriv->sta_hash[index]; ++ plist = phead->next; ++ ++ while (phead != plist) { ++ int i; ++ psta = container_of(plist, struct sta_info, hash_list); ++ plist = plist->next; ++ ++ for (i = 0; i < 16; i++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); ++ } ++ } ++ } ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ /*===============================*/ ++ ++ if (pstapriv->pallocated_stainfo_buf) ++ vfree(pstapriv->pallocated_stainfo_buf); ++ } ++ ++ return _SUCCESS; ++} ++ ++struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) ++{ ++ s32 index; ++ struct list_head *phash_list; ++ struct sta_info *psta; ++ struct __queue *pfree_sta_queue; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ int i = 0; ++ u16 wRxSeqInitialValue = 0xffff; ++ ++ pfree_sta_queue = &pstapriv->free_sta_queue; ++ ++ spin_lock_bh(&pfree_sta_queue->lock); ++ ++ if (list_empty(&pfree_sta_queue->queue)) { ++ spin_unlock_bh(&pfree_sta_queue->lock); ++ psta = NULL; ++ } else { ++ psta = container_of((&pfree_sta_queue->queue)->next, struct sta_info, list); ++ list_del_init(&psta->list); ++ spin_unlock_bh(&pfree_sta_queue->lock); ++ _rtw_init_stainfo(psta); ++ memcpy(psta->hwaddr, hwaddr, ETH_ALEN); ++ index = wifi_mac_hash(hwaddr); ++ if (index >= NUM_STA) { ++ psta = NULL; ++ goto exit; ++ } ++ phash_list = &pstapriv->sta_hash[index]; ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ ++ list_add_tail(&psta->hash_list, phash_list); ++ ++ pstapriv->asoc_sta_count++; ++ ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++/* Commented by Albert 2009/08/13 */ ++/* For the SMC router, the sequence number of first packet of WPS handshake will be 0. */ ++/* In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. */ ++/* So, we initialize the tid_rxseq variable as the 0xffff. */ ++ ++ for (i = 0; i < 16; i++) ++ memcpy(&psta->sta_recvpriv.rxcache.tid_rxseq[i], &wRxSeqInitialValue, 2); ++ ++ init_addba_retry_timer(pstapriv->padapter, psta); ++ ++ /* for A-MPDU Rx reordering buffer control */ ++ for (i = 0; i < 16; i++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ ++ preorder_ctrl->padapter = pstapriv->padapter; ++ ++ preorder_ctrl->enable = false; ++ ++ preorder_ctrl->indicate_seq = 0xffff; ++ preorder_ctrl->wend_b = 0xffff; ++ preorder_ctrl->wsize_b = 64;/* 64; */ ++ ++ _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue); ++ ++ rtw_init_recv_timer(preorder_ctrl); ++ } ++ ++ /* init for DM */ ++ psta->rssi_stat.UndecoratedSmoothedPWDB = (-1); ++ psta->rssi_stat.UndecoratedSmoothedCCK = (-1); ++ ++ /* init for the sequence number of received management frame */ ++ psta->RxMgmtFrameSeqNum = 0xffff; ++ } ++ ++exit: ++ ++ return psta; ++} ++ ++/* using pstapriv->sta_hash_lock to protect */ ++u32 rtw_free_stainfo(struct adapter *padapter, struct sta_info *psta) ++{ ++ int i; ++ struct __queue *pfree_sta_queue; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ struct sta_xmit_priv *pstaxmitpriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (!psta) ++ goto exit; ++ ++ pfree_sta_queue = &pstapriv->free_sta_queue; ++ ++ pstaxmitpriv = &psta->sta_xmitpriv; ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q); ++ psta->sleepq_len = 0; ++ ++ rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); ++ ++ list_del_init(&pstaxmitpriv->vo_q.tx_pending); ++ ++ rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); ++ ++ list_del_init(&pstaxmitpriv->vi_q.tx_pending); ++ ++ rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); ++ ++ list_del_init(&pstaxmitpriv->bk_q.tx_pending); ++ ++ rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->be_q.sta_pending); ++ ++ list_del_init(&pstaxmitpriv->be_q.tx_pending); ++ ++ spin_unlock_bh(&pxmitpriv->lock); ++ ++ list_del_init(&psta->hash_list); ++ pstapriv->asoc_sta_count--; ++ ++ /* re-init sta_info; 20061114 */ ++ _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); ++ _rtw_init_sta_recv_priv(&psta->sta_recvpriv); ++ ++ _cancel_timer_ex(&psta->addba_retry_timer); ++ ++ /* for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer */ ++ for (i = 0; i < 16 ; i++) { ++ struct list_head *phead, *plist; ++ struct recv_frame *prframe; ++ struct __queue *ppending_recvframe_queue; ++ struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; ++ ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ ++ _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); ++ ++ ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; ++ ++ spin_lock_bh(&ppending_recvframe_queue->lock); ++ ++ phead = get_list_head(ppending_recvframe_queue); ++ plist = phead->next; ++ ++ while (!list_empty(phead)) { ++ prframe = container_of(plist, struct recv_frame, list); ++ ++ plist = plist->next; ++ ++ list_del_init(&prframe->list); ++ ++ rtw_free_recvframe(prframe, pfree_recv_queue); ++ } ++ ++ spin_unlock_bh(&ppending_recvframe_queue->lock); ++ } ++ ++ if (!(psta->state & WIFI_AP_STATE)) ++ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, false); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++ spin_lock_bh(&pstapriv->auth_list_lock); ++ if (!list_empty(&psta->auth_list)) { ++ list_del_init(&psta->auth_list); ++ pstapriv->auth_list_cnt--; ++ } ++ spin_unlock_bh(&pstapriv->auth_list_lock); ++ ++ psta->expire_to = 0; ++ ++ psta->sleepq_ac_len = 0; ++ psta->qos_info = 0; ++ ++ psta->max_sp_len = 0; ++ psta->uapsd_bk = 0; ++ psta->uapsd_be = 0; ++ psta->uapsd_vi = 0; ++ psta->uapsd_vo = 0; ++ psta->has_legacy_ac = 0; ++ ++ pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); ++ pstapriv->tim_bitmap &= ~BIT(psta->aid); ++ ++ if ((psta->aid > 0) && (pstapriv->sta_aid[psta->aid - 1] == psta)) { ++ pstapriv->sta_aid[psta->aid - 1] = NULL; ++ psta->aid = 0; ++ } ++ ++ psta->under_exist_checking = 0; ++ ++#endif /* CONFIG_88EU_AP_MODE */ ++ ++ spin_lock_bh(&pfree_sta_queue->lock); ++ list_add_tail(&psta->list, get_list_head(pfree_sta_queue)); ++ spin_unlock_bh(&pfree_sta_queue->lock); ++ ++exit: ++ ++ return _SUCCESS; ++} ++ ++/* free all stainfo which in sta_hash[all] */ ++void rtw_free_all_stainfo(struct adapter *padapter) ++{ ++ struct list_head *plist, *phead; ++ s32 index; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct sta_info *pbcmc_stainfo = rtw_get_bcmc_stainfo(padapter); ++ ++ if (pstapriv->asoc_sta_count == 1) ++ return; ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ ++ for (index = 0; index < NUM_STA; index++) { ++ phead = &pstapriv->sta_hash[index]; ++ plist = phead->next; ++ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, hash_list); ++ ++ plist = plist->next; ++ ++ if (pbcmc_stainfo != psta) ++ rtw_free_stainfo(padapter, psta); ++ } ++ } ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++} ++ ++/* any station allocated can be searched by hash list */ ++struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) ++{ ++ struct list_head *plist, *phead; ++ struct sta_info *psta = NULL; ++ u32 index; ++ u8 *addr; ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ if (!hwaddr) ++ return NULL; ++ ++ if (IS_MCAST(hwaddr)) ++ addr = bc_addr; ++ else ++ addr = hwaddr; ++ ++ index = wifi_mac_hash(addr); ++ ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ ++ phead = &pstapriv->sta_hash[index]; ++ plist = phead->next; ++ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, hash_list); ++ ++ if ((!memcmp(psta->hwaddr, addr, ETH_ALEN))) { ++ /* if found the matched address */ ++ break; ++ } ++ psta = NULL; ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ ++ return psta; ++} ++ ++u32 rtw_init_bcmc_stainfo(struct adapter *padapter) ++{ ++ struct sta_info *psta; ++ u32 res = _SUCCESS; ++ unsigned char bcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ psta = rtw_alloc_stainfo(pstapriv, bcast_addr); ++ ++ if (!psta) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ /* default broadcast & multicast use macid 1 */ ++ psta->mac_id = 1; ++ ++exit: ++ ++ return res; ++} ++ ++struct sta_info *rtw_get_bcmc_stainfo(struct adapter *padapter) ++{ ++ struct sta_info *psta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ psta = rtw_get_stainfo(pstapriv, bc_addr); ++ ++ return psta; ++} ++ ++u8 rtw_access_ctrl(struct adapter *padapter, u8 *mac_addr) ++{ ++ u8 res = true; ++#ifdef CONFIG_88EU_AP_MODE ++ struct list_head *plist, *phead; ++ struct rtw_wlan_acl_node *paclnode; ++ u8 match = false; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; ++ struct __queue *pacl_node_q = &pacl_list->acl_node_q; ++ ++ spin_lock_bh(&pacl_node_q->lock); ++ phead = get_list_head(pacl_node_q); ++ plist = phead->next; ++ while (phead != plist) { ++ paclnode = container_of(plist, struct rtw_wlan_acl_node, list); ++ plist = plist->next; ++ ++ if (!memcmp(paclnode->addr, mac_addr, ETH_ALEN)) { ++ if (paclnode->valid) { ++ match = true; ++ break; ++ } ++ } ++ } ++ spin_unlock_bh(&pacl_node_q->lock); ++ ++ if (pacl_list->mode == 1)/* accept unless in deny list */ ++ res = (match) ? false : true; ++ else if (pacl_list->mode == 2)/* deny unless in accept list */ ++ res = (match) ? true : false; ++ else ++ res = true; ++ ++#endif ++ ++ return res; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_wlan_util.c b/drivers/staging/r8188eu/core/rtw_wlan_util.c +new file mode 100644 +index 000000000000..a3a5e1c64c4a +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_wlan_util.c +@@ -0,0 +1,1643 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_WLAN_UTIL_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++ ++static unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; ++static unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; ++ ++static unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18}; ++static unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7}; ++ ++static unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96}; ++static unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43}; ++static unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43}; ++static unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c}; ++static unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5}; ++static unsigned char EPIGRAM_OUI[] = {0x00, 0x90, 0x4c}; ++ ++unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20}; ++ ++#define R2T_PHY_DELAY (0) ++ ++/* define WAIT_FOR_BCN_TO_M (3000) */ ++#define WAIT_FOR_BCN_TO_MIN (6000) ++#define WAIT_FOR_BCN_TO_MAX (20000) ++ ++static u8 rtw_basic_rate_cck[4] = { ++ IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK, ++ IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK ++}; ++ ++static u8 rtw_basic_rate_ofdm[3] = { ++ IEEE80211_OFDM_RATE_6MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB | IEEE80211_BASIC_RATE_MASK, ++ IEEE80211_OFDM_RATE_24MB | IEEE80211_BASIC_RATE_MASK ++}; ++ ++static u8 rtw_basic_rate_mix[7] = { ++ IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK, ++ IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK, ++ IEEE80211_OFDM_RATE_6MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB | IEEE80211_BASIC_RATE_MASK, ++ IEEE80211_OFDM_RATE_24MB | IEEE80211_BASIC_RATE_MASK ++}; ++ ++int cckrates_included(unsigned char *rate, int ratelen) ++{ ++ int i; ++ ++ for (i = 0; i < ratelen; i++) { ++ if ((((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || ++ (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22)) ++ return true; ++ } ++ return false; ++} ++ ++int cckratesonly_included(unsigned char *rate, int ratelen) ++{ ++ int i; ++ ++ for (i = 0; i < ratelen; i++) { ++ if ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && ++ (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22)) ++ return false; ++ } ++ ++ return true; ++} ++ ++unsigned char networktype_to_raid(unsigned char network_type) ++{ ++ unsigned char raid; ++ ++ switch (network_type) { ++ case WIRELESS_11B: ++ raid = RATR_INX_WIRELESS_B; ++ break; ++ case WIRELESS_11G: ++ raid = RATR_INX_WIRELESS_G; ++ break; ++ case WIRELESS_11BG: ++ raid = RATR_INX_WIRELESS_GB; ++ break; ++ case WIRELESS_11_24N: ++ raid = RATR_INX_WIRELESS_N; ++ break; ++ case WIRELESS_11G_24N: ++ raid = RATR_INX_WIRELESS_NG; ++ break; ++ case WIRELESS_11BG_24N: ++ raid = RATR_INX_WIRELESS_NGB; ++ break; ++ default: ++ raid = RATR_INX_WIRELESS_GB; ++ break; ++ } ++ return raid; ++} ++ ++u8 judge_network_type(struct adapter *padapter, unsigned char *rate, int ratelen) ++{ ++ u8 network_type = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pmlmeext->cur_channel > 14) { ++ network_type |= WIRELESS_INVALID; ++ } else { ++ if (pmlmeinfo->HT_enable) ++ network_type = WIRELESS_11_24N; ++ ++ if (cckratesonly_included(rate, ratelen)) ++ network_type |= WIRELESS_11B; ++ else if (cckrates_included(rate, ratelen)) ++ network_type |= WIRELESS_11BG; ++ else ++ network_type |= WIRELESS_11G; ++ } ++ return network_type; ++} ++ ++static unsigned char ratetbl_val_2wifirate(unsigned char rate) ++{ ++ unsigned char val = 0; ++ ++ switch (rate & 0x7f) { ++ case 0: ++ val = IEEE80211_CCK_RATE_1MB; ++ break; ++ case 1: ++ val = IEEE80211_CCK_RATE_2MB; ++ break; ++ case 2: ++ val = IEEE80211_CCK_RATE_5MB; ++ break; ++ case 3: ++ val = IEEE80211_CCK_RATE_11MB; ++ break; ++ case 4: ++ val = IEEE80211_OFDM_RATE_6MB; ++ break; ++ case 5: ++ val = IEEE80211_OFDM_RATE_9MB; ++ break; ++ case 6: ++ val = IEEE80211_OFDM_RATE_12MB; ++ break; ++ case 7: ++ val = IEEE80211_OFDM_RATE_18MB; ++ break; ++ case 8: ++ val = IEEE80211_OFDM_RATE_24MB; ++ break; ++ case 9: ++ val = IEEE80211_OFDM_RATE_36MB; ++ break; ++ case 10: ++ val = IEEE80211_OFDM_RATE_48MB; ++ break; ++ case 11: ++ val = IEEE80211_OFDM_RATE_54MB; ++ break; ++ } ++ return val; ++} ++ ++static int is_basicrate(struct adapter *padapter, unsigned char rate) ++{ ++ int i; ++ unsigned char val; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ for (i = 0; i < NumRates; i++) { ++ val = pmlmeext->basicrate[i]; ++ ++ if ((val != 0xff) && (val != 0xfe)) { ++ if (rate == ratetbl_val_2wifirate(val)) ++ return true; ++ } ++ } ++ return false; ++} ++ ++static unsigned int ratetbl2rateset(struct adapter *padapter, unsigned char *rateset) ++{ ++ int i; ++ unsigned char rate; ++ unsigned int len = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ for (i = 0; i < NumRates; i++) { ++ rate = pmlmeext->datarate[i]; ++ ++ switch (rate) { ++ case 0xff: ++ return len; ++ case 0xfe: ++ continue; ++ default: ++ rate = ratetbl_val_2wifirate(rate); ++ ++ if (is_basicrate(padapter, rate)) ++ rate |= IEEE80211_BASIC_RATE_MASK; ++ ++ rateset[len] = rate; ++ len++; ++ break; ++ } ++ } ++ return len; ++} ++ ++void get_rate_set(struct adapter *padapter, unsigned char *pbssrate, int *bssrate_len) ++{ ++ unsigned char supportedrates[NumRates]; ++ ++ memset(supportedrates, 0, NumRates); ++ *bssrate_len = ratetbl2rateset(padapter, supportedrates); ++ memcpy(pbssrate, supportedrates, *bssrate_len); ++} ++ ++void UpdateBrateTbl(struct adapter *Adapter, u8 *mbrate) ++{ ++ u8 i; ++ u8 rate; ++ ++ /* 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory. */ ++ for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { ++ rate = mbrate[i] & 0x7f; ++ switch (rate) { ++ case IEEE80211_CCK_RATE_1MB: ++ case IEEE80211_CCK_RATE_2MB: ++ case IEEE80211_CCK_RATE_5MB: ++ case IEEE80211_CCK_RATE_11MB: ++ case IEEE80211_OFDM_RATE_6MB: ++ case IEEE80211_OFDM_RATE_12MB: ++ case IEEE80211_OFDM_RATE_24MB: ++ mbrate[i] |= IEEE80211_BASIC_RATE_MASK; ++ break; ++ } ++ } ++} ++ ++void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen) ++{ ++ u8 i; ++ u8 rate; ++ ++ for (i = 0; i < bssratelen; i++) { ++ rate = bssrateset[i] & 0x7f; ++ switch (rate) { ++ case IEEE80211_CCK_RATE_1MB: ++ case IEEE80211_CCK_RATE_2MB: ++ case IEEE80211_CCK_RATE_5MB: ++ case IEEE80211_CCK_RATE_11MB: ++ bssrateset[i] |= IEEE80211_BASIC_RATE_MASK; ++ break; ++ } ++ } ++} ++ ++void Save_DM_Func_Flag(struct adapter *padapter) ++{ ++ u8 saveflag = true; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag)); ++} ++ ++void Restore_DM_Func_Flag(struct adapter *padapter) ++{ ++ u8 saveflag = false; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag)); ++} ++ ++void Switch_DM_Func(struct adapter *padapter, u32 mode, u8 enable) ++{ ++ if (enable) ++ rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); ++ else ++ rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); ++} ++ ++static void Set_NETYPE0_MSR(struct adapter *padapter, u8 type) ++{ ++ rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type)); ++} ++ ++void Set_MSR(struct adapter *padapter, u8 type) ++{ ++ Set_NETYPE0_MSR(padapter, type); ++} ++ ++inline u8 rtw_get_oper_ch(struct adapter *adapter) ++{ ++ return adapter->mlmeextpriv.oper_channel; ++} ++ ++inline void rtw_set_oper_ch(struct adapter *adapter, u8 ch) ++{ ++ adapter->mlmeextpriv.oper_channel = ch; ++} ++ ++inline u8 rtw_get_oper_bw(struct adapter *adapter) ++{ ++ return adapter->mlmeextpriv.oper_bwmode; ++} ++ ++inline void rtw_set_oper_bw(struct adapter *adapter, u8 bw) ++{ ++ adapter->mlmeextpriv.oper_bwmode = bw; ++} ++ ++inline u8 rtw_get_oper_choffset(struct adapter *adapter) ++{ ++ return adapter->mlmeextpriv.oper_ch_offset; ++} ++ ++inline void rtw_set_oper_choffset(struct adapter *adapter, u8 offset) ++{ ++ adapter->mlmeextpriv.oper_ch_offset = offset; ++} ++ ++void SelectChannel(struct adapter *padapter, unsigned char channel) ++{ ++ /* saved channel info */ ++ rtw_set_oper_ch(padapter, channel); ++ rtw_hal_set_chan(padapter, channel); ++} ++ ++void SetBWMode(struct adapter *padapter, unsigned short bwmode, ++ unsigned char channel_offset) ++{ ++ /* saved bw info */ ++ rtw_set_oper_bw(padapter, bwmode); ++ rtw_set_oper_choffset(padapter, channel_offset); ++ ++ rtw_hal_set_bwmode(padapter, (enum ht_channel_width)bwmode, channel_offset); ++} ++ ++void set_channel_bwmode(struct adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) ++{ ++ u8 center_ch; ++ ++ if (padapter->bNotifyChannelChange) ++ DBG_88E("[%s] ch = %d, offset = %d, bwmode = %d\n", __func__, channel, channel_offset, bwmode); ++ ++ if ((bwmode == HT_CHANNEL_WIDTH_20) || ++ (channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)) { ++ /* SelectChannel(padapter, channel); */ ++ center_ch = channel; ++ } else { ++ /* switch to the proper channel */ ++ if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER) { ++ /* SelectChannel(padapter, channel + 2); */ ++ center_ch = channel + 2; ++ } else { ++ /* SelectChannel(padapter, channel - 2); */ ++ center_ch = channel - 2; ++ } ++ } ++ ++ /* set Channel */ ++ /* saved channel/bw info */ ++ rtw_set_oper_ch(padapter, channel); ++ rtw_set_oper_bw(padapter, bwmode); ++ rtw_set_oper_choffset(padapter, channel_offset); ++ ++ rtw_hal_set_chan(padapter, center_ch); /* set center channel */ ++ SetBWMode(padapter, bwmode, channel_offset); ++} ++ ++int get_bsstype(unsigned short capability) ++{ ++ if (capability & BIT(0)) ++ return WIFI_FW_AP_STATE; ++ else if (capability & BIT(1)) ++ return WIFI_FW_ADHOC_STATE; ++ else ++ return 0; ++} ++ ++__inline u8 *get_my_bssid(struct wlan_bssid_ex *pnetwork) ++{ ++ return pnetwork->MacAddress; ++} ++ ++u16 get_beacon_interval(struct wlan_bssid_ex *bss) ++{ ++ __le16 val; ++ memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2); ++ ++ return le16_to_cpu(val); ++} ++ ++int is_client_associated_to_ap(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext; ++ struct mlme_ext_info *pmlmeinfo; ++ ++ if (!padapter) ++ return _FAIL; ++ ++ pmlmeext = &padapter->mlmeextpriv; ++ pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE)) ++ return true; ++ else ++ return _FAIL; ++} ++ ++int is_client_associated_to_ibss(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) ++ return true; ++ else ++ return _FAIL; ++} ++ ++int is_IBSS_empty(struct adapter *padapter) ++{ ++ unsigned int i; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) { ++ if (pmlmeinfo->FW_sta_info[i].status == 1) ++ return _FAIL; ++ } ++ return true; ++} ++ ++unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) ++{ ++ if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN) ++ return WAIT_FOR_BCN_TO_MIN; ++ else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX) ++ return WAIT_FOR_BCN_TO_MAX; ++ else ++ return bcn_interval << 2; ++} ++ ++void CAM_empty_entry(struct adapter *Adapter, u8 ucIndex) ++{ ++ rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex)); ++} ++ ++void invalidate_cam_all(struct adapter *padapter) ++{ ++ rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, NULL); ++} ++ ++void write_cam(struct adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key) ++{ ++ unsigned int i, val, addr; ++ int j; ++ u32 cam_val[2]; ++ ++ addr = entry << 3; ++ ++ for (j = 5; j >= 0; j--) { ++ switch (j) { ++ case 0: ++ val = (ctrl | (mac[0] << 16) | (mac[1] << 24)); ++ break; ++ case 1: ++ val = (mac[2] | (mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24)); ++ break; ++ default: ++ i = (j - 2) << 2; ++ val = (key[i] | (key[i + 1] << 8) | (key[i + 2] << 16) | (key[i + 3] << 24)); ++ break; ++ } ++ ++ cam_val[0] = val; ++ cam_val[1] = addr + (unsigned int)j; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); ++ } ++} ++ ++void clear_cam_entry(struct adapter *padapter, u8 entry) ++{ ++ unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; ++ unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; ++ ++ write_cam(padapter, entry, 0, null_sta, null_key); ++} ++ ++int allocate_fw_sta_entry(struct adapter *padapter) ++{ ++ unsigned int mac_id; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) { ++ if (pmlmeinfo->FW_sta_info[mac_id].status == 0) { ++ pmlmeinfo->FW_sta_info[mac_id].status = 1; ++ pmlmeinfo->FW_sta_info[mac_id].retry = 0; ++ break; ++ } ++ } ++ ++ return mac_id; ++} ++ ++void flush_all_cam_entry(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, NULL); ++ ++ memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info)); ++} ++ ++int WMM_param_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ++{ ++ /* struct registry_priv *pregpriv = &padapter->registrypriv; */ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pmlmepriv->qospriv.qos_option == 0) { ++ pmlmeinfo->WMM_enable = 0; ++ return _FAIL; ++ } ++ ++ pmlmeinfo->WMM_enable = 1; ++ memcpy(&pmlmeinfo->WMM_param, pIE->data + 6, sizeof(struct WMM_para_element)); ++ return true; ++} ++ ++void WMMOnAssocRsp(struct adapter *padapter) ++{ ++ u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; ++ u8 acm_mask; ++ u16 TXOP; ++ u32 acParm, i; ++ u32 edca[4], inx[4]; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ ++ if (pmlmeinfo->WMM_enable == 0) { ++ padapter->mlmepriv.acm_mask = 0; ++ return; ++ } ++ ++ acm_mask = 0; ++ ++ if (pmlmeext->cur_wireless_mode == WIRELESS_11B) ++ aSifsTime = 10; ++ else ++ aSifsTime = 16; ++ ++ for (i = 0; i < 4; i++) { ++ ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03; ++ ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01; ++ ++ /* AIFS = AIFSN * slot time + SIFS - r2t phy delay */ ++ AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime; ++ ++ ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f); ++ ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4; ++ TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit); ++ ++ acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); ++ ++ switch (ACI) { ++ case 0x0: ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); ++ acm_mask |= (ACM ? BIT(1) : 0); ++ edca[XMIT_BE_QUEUE] = acParm; ++ break; ++ case 0x1: ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); ++ edca[XMIT_BK_QUEUE] = acParm; ++ break; ++ case 0x2: ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); ++ acm_mask |= (ACM ? BIT(2) : 0); ++ edca[XMIT_VI_QUEUE] = acParm; ++ break; ++ case 0x3: ++ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); ++ acm_mask |= (ACM ? BIT(3) : 0); ++ edca[XMIT_VO_QUEUE] = acParm; ++ break; ++ } ++ ++ DBG_88E("WMM(%x): %x, %x\n", ACI, ACM, acParm); ++ } ++ ++ if (padapter->registrypriv.acm_method == 1) ++ rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask)); ++ else ++ padapter->mlmepriv.acm_mask = acm_mask; ++ ++ inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; ++ ++ if (pregpriv->wifi_spec == 1) { ++ u32 j, tmp, change_inx = false; ++ ++ /* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */ ++ for (i = 0; i < 4; i++) { ++ for (j = i + 1; j < 4; j++) { ++ /* compare CW and AIFS */ ++ if ((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) { ++ change_inx = true; ++ } else if ((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) { ++ /* compare TXOP */ ++ if ((edca[j] >> 16) > (edca[i] >> 16)) ++ change_inx = true; ++ } ++ ++ if (change_inx) { ++ tmp = edca[i]; ++ edca[i] = edca[j]; ++ edca[j] = tmp; ++ ++ tmp = inx[i]; ++ inx[i] = inx[j]; ++ inx[j] = tmp; ++ ++ change_inx = false; ++ } ++ } ++ } ++ } ++ ++ for (i = 0; i < 4; i++) { ++ pxmitpriv->wmm_para_seq[i] = inx[i]; ++ DBG_88E("wmm_para_seq(%d): %d\n", i, pxmitpriv->wmm_para_seq[i]); ++ } ++} ++ ++static void bwmode_update_check(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ++{ ++ unsigned char new_bwmode; ++ unsigned char new_ch_offset; ++ struct HT_info_element *pHT_info; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ ++ if (!pIE) ++ return; ++ ++ if (!phtpriv) ++ return; ++ ++ if (pIE->Length > sizeof(struct HT_info_element)) ++ return; ++ ++ pHT_info = (struct HT_info_element *)pIE->data; ++ ++ if ((pHT_info->infos[0] & BIT(2)) && pregistrypriv->cbw40_enable) { ++ new_bwmode = HT_CHANNEL_WIDTH_40; ++ ++ switch (pHT_info->infos[0] & 0x3) { ++ case 1: ++ new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; ++ break; ++ case 3: ++ new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; ++ break; ++ default: ++ new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ break; ++ } ++ } else { ++ new_bwmode = HT_CHANNEL_WIDTH_20; ++ new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ } ++ ++ if ((new_bwmode != pmlmeext->cur_bwmode) || ++ (new_ch_offset != pmlmeext->cur_ch_offset)) { ++ pmlmeinfo->bwmode_updated = true; ++ ++ pmlmeext->cur_bwmode = new_bwmode; ++ pmlmeext->cur_ch_offset = new_ch_offset; ++ ++ /* update HT info also */ ++ HT_info_handler(padapter, pIE); ++ } else { ++ pmlmeinfo->bwmode_updated = false; ++ } ++ ++ if (pmlmeinfo->bwmode_updated) { ++ struct sta_info *psta; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ /* set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); */ ++ ++ /* update ap's stainfo */ ++ psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); ++ if (psta) { ++ struct ht_priv *phtpriv_sta = &psta->htpriv; ++ ++ if (phtpriv_sta->ht_option) { ++ /* bwmode */ ++ phtpriv_sta->bwmode = pmlmeext->cur_bwmode; ++ phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; ++ } else { ++ phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; ++ phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ } ++ } ++ } ++} ++ ++void HT_caps_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ++{ ++ unsigned int i; ++ u8 rf_type; ++ u8 max_AMPDU_len, min_MPDU_spacing; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ ++ if (!pIE) ++ return; ++ ++ if (!phtpriv->ht_option) ++ return; ++ ++ pmlmeinfo->HT_caps_enable = 1; ++ ++ for (i = 0; i < (pIE->Length); i++) { ++ if (i != 2) { ++ /* Got the endian issue here. */ ++ pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]); ++ } else { ++ /* modify from fw by Thomas 2010/11/17 */ ++ if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) ++ max_AMPDU_len = (pIE->data[i] & 0x3); ++ else ++ max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3); ++ ++ if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) ++ min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c); ++ else ++ min_MPDU_spacing = (pIE->data[i] & 0x1c); ++ ++ pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; ++ } ++ } ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ ++ /* update the MCS rates */ ++ for (i = 0; i < 16; i++) { ++ if ((rf_type == RF_1T1R) || (rf_type == RF_1T2R)) ++ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; ++ else ++ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i]; ++ } ++} ++ ++void HT_info_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ht_priv *phtpriv = &pmlmepriv->htpriv; ++ ++ if (!pIE) ++ return; ++ ++ if (!phtpriv->ht_option) ++ return; ++ ++ if (pIE->Length > sizeof(struct HT_info_element)) ++ return; ++ ++ pmlmeinfo->HT_info_enable = 1; ++ memcpy(&pmlmeinfo->HT_info, pIE->data, pIE->Length); ++} ++ ++void HTOnAssocRsp(struct adapter *padapter) ++{ ++ unsigned char max_AMPDU_len; ++ unsigned char min_MPDU_spacing; ++ /* struct registry_priv *pregpriv = &padapter->registrypriv; */ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ DBG_88E("%s\n", __func__); ++ ++ if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) { ++ pmlmeinfo->HT_enable = 1; ++ } else { ++ pmlmeinfo->HT_enable = 0; ++ return; ++ } ++ ++ /* handle A-MPDU parameter field */ ++ /* ++ AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k ++ AMPDU_para [4:2]:Min MPDU Start Spacing ++ */ ++ max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; ++ ++ min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); ++} ++ ++void ERP_IE_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pIE->Length > 1) ++ return; ++ ++ pmlmeinfo->ERP_enable = 1; ++ memcpy(&pmlmeinfo->ERP_IE, pIE->data, pIE->Length); ++} ++ ++void VCS_update(struct adapter *padapter, struct sta_info *psta) ++{ ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ switch (pregpriv->vrtl_carrier_sense) { /* 0:off 1:on 2:auto */ ++ case 0: /* off */ ++ psta->rtsen = 0; ++ psta->cts2self = 0; ++ break; ++ case 1: /* on */ ++ if (pregpriv->vcs_type == 1) { /* 1:RTS/CTS 2:CTS to self */ ++ psta->rtsen = 1; ++ psta->cts2self = 0; ++ } else { ++ psta->rtsen = 0; ++ psta->cts2self = 1; ++ } ++ break; ++ case 2: /* auto */ ++ default: ++ if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) { ++ if (pregpriv->vcs_type == 1) { ++ psta->rtsen = 1; ++ psta->cts2self = 0; ++ } else { ++ psta->rtsen = 0; ++ psta->cts2self = 1; ++ } ++ } else { ++ psta->rtsen = 0; ++ psta->cts2self = 0; ++ } ++ break; ++ } ++} ++ ++int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len) ++{ ++ unsigned int len; ++ unsigned char *p; ++ unsigned short val16, subtype; ++ struct wlan_network *cur_network = &Adapter->mlmepriv.cur_network; ++ /* u8 wpa_ie[255], rsn_ie[255]; */ ++ u16 wpa_len = 0, rsn_len = 0; ++ u8 encryp_protocol = 0; ++ struct wlan_bssid_ex *bssid; ++ int group_cipher = 0, pairwise_cipher = 0, is_8021x = 0; ++ unsigned char *pbuf; ++ u32 wpa_ielen = 0; ++ u8 *pbssid = GetAddr3Ptr(pframe); ++ u32 hidden_ssid = 0; ++ struct HT_info_element *pht_info = NULL; ++ struct ieee80211_ht_cap *pht_cap = NULL; ++ u32 bcn_channel; ++ unsigned short ht_cap_info; ++ unsigned char ht_info_infos_0; ++ ++ if (!is_client_associated_to_ap(Adapter)) ++ return true; ++ ++ len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ if (len > MAX_IE_SZ) { ++ DBG_88E("%s IE too long for survey event\n", __func__); ++ return _FAIL; ++ } ++ ++ if (memcmp(cur_network->network.MacAddress, pbssid, 6)) { ++ DBG_88E("Oops: rtw_check_network_encrypt linked but recv other bssid bcn\n%pM %pM\n", ++ (pbssid), (cur_network->network.MacAddress)); ++ return true; ++ } ++ ++ bssid = kzalloc(sizeof(struct wlan_bssid_ex), GFP_ATOMIC); ++ if (!bssid) ++ return _FAIL; ++ ++ subtype = GetFrameSubType(pframe) >> 4; ++ ++ if (subtype == WIFI_BEACON) ++ bssid->Reserved[0] = 1; ++ ++ bssid->Length = sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + len; ++ ++ /* below is to copy the information element */ ++ bssid->IELength = len; ++ memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength); ++ ++ /* check bw and channel offset */ ++ /* parsing HT_CAP_IE */ ++ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (p && len > 0) { ++ pht_cap = (struct ieee80211_ht_cap *)(p + 2); ++ ht_cap_info = le16_to_cpu(pht_cap->cap_info); ++ } else { ++ ht_cap_info = 0; ++ } ++ /* parsing HT_INFO_IE */ ++ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (p && len > 0) { ++ pht_info = (struct HT_info_element *)(p + 2); ++ ht_info_infos_0 = pht_info->infos[0]; ++ } else { ++ ht_info_infos_0 = 0; ++ } ++ if (ht_cap_info != cur_network->BcnInfo.ht_cap_info || ++ ((ht_info_infos_0 & 0x03) != (cur_network->BcnInfo.ht_info_infos_0 & 0x03))) { ++ DBG_88E("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, ++ ht_cap_info, ht_info_infos_0); ++ DBG_88E("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, ++ cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0); ++ DBG_88E("%s bw mode change, disconnect\n", __func__); ++ /* bcn_info_update */ ++ cur_network->BcnInfo.ht_cap_info = ht_cap_info; ++ cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0; ++ /* to do : need to check that whether modify related register of BB or not */ ++ /* goto _mismatch; */ ++ } ++ ++ /* Checking for channel */ ++ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (p) { ++ bcn_channel = *(p + 2); ++ } else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */ ++ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (pht_info) { ++ bcn_channel = pht_info->primary_channel; ++ } else { /* we don't find channel IE, so don't check it */ ++ DBG_88E("Oops: %s we don't find channel IE, so don't check it\n", __func__); ++ bcn_channel = Adapter->mlmeextpriv.cur_channel; ++ } ++ } ++ if (bcn_channel != Adapter->mlmeextpriv.cur_channel) { ++ DBG_88E("%s beacon channel:%d cur channel:%d disconnect\n", __func__, ++ bcn_channel, Adapter->mlmeextpriv.cur_channel); ++ goto _mismatch; ++ } ++ ++ /* checking SSID */ ++ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); ++ if (!p) { ++ DBG_88E("%s marc: cannot find SSID for survey event\n", __func__); ++ hidden_ssid = true; ++ } else { ++ hidden_ssid = false; ++ } ++ ++ if ((NULL != p) && (false == hidden_ssid && (*(p + 1)))) { ++ memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); ++ bssid->Ssid.SsidLength = *(p + 1); ++ } else { ++ bssid->Ssid.SsidLength = 0; ++ bssid->Ssid.Ssid[0] = '\0'; ++ } ++ ++ if (memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) || ++ bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) { ++ if (bssid->Ssid.Ssid[0] != '\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */ ++ DBG_88E("%s(), SSID is not match return FAIL\n", __func__); ++ goto _mismatch; ++ } ++ } ++ ++ /* check encryption info */ ++ val16 = rtw_get_capability((struct wlan_bssid_ex *)bssid); ++ ++ if (val16 & BIT(4)) ++ bssid->Privacy = 1; ++ else ++ bssid->Privacy = 0; ++ ++ if (cur_network->network.Privacy != bssid->Privacy) { ++ DBG_88E("%s(), privacy is not match return FAIL\n", __func__); ++ goto _mismatch; ++ } ++ ++ rtw_get_sec_ie(bssid->IEs, bssid->IELength, NULL, &rsn_len, NULL, &wpa_len); ++ ++ if (rsn_len > 0) { ++ encryp_protocol = ENCRYP_PROTOCOL_WPA2; ++ } else if (wpa_len > 0) { ++ encryp_protocol = ENCRYP_PROTOCOL_WPA; ++ } else { ++ if (bssid->Privacy) ++ encryp_protocol = ENCRYP_PROTOCOL_WEP; ++ } ++ ++ if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) { ++ DBG_88E("%s(): enctyp is not match , return FAIL\n", __func__); ++ goto _mismatch; ++ } ++ ++ if (encryp_protocol == ENCRYP_PROTOCOL_WPA || encryp_protocol == ENCRYP_PROTOCOL_WPA2) { ++ pbuf = rtw_get_wpa_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength - 12); ++ if (pbuf && (wpa_ielen > 0)) { ++ rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is_8021x); ++ } else { ++ pbuf = rtw_get_wpa2_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength - 12); ++ ++ if (pbuf && (wpa_ielen > 0)) ++ rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is_8021x); ++ } ++ ++ if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) { ++ DBG_88E("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match , return FAIL\n", __func__, ++ pairwise_cipher, cur_network->BcnInfo.pairwise_cipher, ++ group_cipher, cur_network->BcnInfo.group_cipher); ++ goto _mismatch; ++ } ++ ++ if (is_8021x != cur_network->BcnInfo.is_8021x) { ++ DBG_88E("%s authentication is not match , return FAIL\n", __func__); ++ goto _mismatch; ++ } ++ } ++ ++ kfree(bssid); ++ ++ return _SUCCESS; ++ ++_mismatch: ++ kfree(bssid); ++ ++ return _FAIL; ++} ++ ++void update_beacon_info(struct adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta) ++{ ++ unsigned int i; ++ unsigned int len; ++ struct ndis_802_11_var_ie *pIE; ++ ++ len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); ++ ++ for (i = 0; i < len;) { ++ pIE = (struct ndis_802_11_var_ie *)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); ++ ++ switch (pIE->ElementID) { ++ case _HT_EXTRA_INFO_IE_: /* HT info */ ++ /* HT_info_handler(padapter, pIE); */ ++ bwmode_update_check(padapter, pIE); ++ break; ++ case _ERPINFO_IE_: ++ ERP_IE_handler(padapter, pIE); ++ VCS_update(padapter, psta); ++ break; ++ default: ++ break; ++ } ++ ++ i += (pIE->Length + 2); ++ } ++} ++ ++unsigned int is_ap_in_tkip(struct adapter *padapter) ++{ ++ u32 i; ++ struct ndis_802_11_var_ie *pIE; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ ++ if (rtw_get_capability((struct wlan_bssid_ex *)cur_network) & WLAN_CAPABILITY_PRIVACY) { ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < pmlmeinfo->network.IELength;) { ++ pIE = (struct ndis_802_11_var_ie *)(pmlmeinfo->network.IEs + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if ((!memcmp(pIE->data, RTW_WPA_OUI, 4)) && (!memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) ++ return true; ++ break; ++ case _RSN_IE_2_: ++ if (!memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) ++ return true; ++ break; ++ default: ++ break; ++ } ++ ++ i += (pIE->Length + 2); ++ } ++ return false; ++ } else { ++ return false; ++ } ++} ++ ++unsigned int should_forbid_n_rate(struct adapter *padapter) ++{ ++ u32 i; ++ struct ndis_802_11_var_ie *pIE; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *cur_network = &pmlmepriv->cur_network.network; ++ ++ if (rtw_get_capability((struct wlan_bssid_ex *)cur_network) & WLAN_CAPABILITY_PRIVACY) { ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < cur_network->IELength;) { ++ pIE = (struct ndis_802_11_var_ie *)(cur_network->IEs + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if (!memcmp(pIE->data, RTW_WPA_OUI, 4) && ++ ((!memcmp((pIE->data + 12), WPA_CIPHER_SUITE_CCMP, 4)) || ++ (!memcmp((pIE->data + 16), WPA_CIPHER_SUITE_CCMP, 4)))) ++ return false; ++ break; ++ case _RSN_IE_2_: ++ if ((!memcmp((pIE->data + 8), RSN_CIPHER_SUITE_CCMP, 4)) || ++ (!memcmp((pIE->data + 12), RSN_CIPHER_SUITE_CCMP, 4))) ++ return false; ++ break; ++ default: ++ break; ++ } ++ ++ i += (pIE->Length + 2); ++ } ++ ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++unsigned int is_ap_in_wep(struct adapter *padapter) ++{ ++ u32 i; ++ struct ndis_802_11_var_ie *pIE; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ ++ if (rtw_get_capability((struct wlan_bssid_ex *)cur_network) & WLAN_CAPABILITY_PRIVACY) { ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < pmlmeinfo->network.IELength;) { ++ pIE = (struct ndis_802_11_var_ie *)(pmlmeinfo->network.IEs + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if (!memcmp(pIE->data, RTW_WPA_OUI, 4)) ++ return false; ++ break; ++ case _RSN_IE_2_: ++ return false; ++ default: ++ break; ++ } ++ i += (pIE->Length + 2); ++ } ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++int wifirate2_ratetbl_inx(unsigned char rate) ++{ ++ int inx = 0; ++ rate = rate & 0x7f; ++ ++ switch (rate) { ++ case 54 * 2: ++ inx = 11; ++ break; ++ case 48 * 2: ++ inx = 10; ++ break; ++ case 36 * 2: ++ inx = 9; ++ break; ++ case 24 * 2: ++ inx = 8; ++ break; ++ case 18 * 2: ++ inx = 7; ++ break; ++ case 12 * 2: ++ inx = 6; ++ break; ++ case 9 * 2: ++ inx = 5; ++ break; ++ case 6 * 2: ++ inx = 4; ++ break; ++ case 11 * 2: ++ inx = 3; ++ break; ++ case 11: ++ inx = 2; ++ break; ++ case 2 * 2: ++ inx = 1; ++ break; ++ case 1 * 2: ++ inx = 0; ++ break; ++ } ++ return inx; ++} ++ ++unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz) ++{ ++ unsigned int i, num_of_rate; ++ unsigned int mask = 0; ++ ++ num_of_rate = (ptn_sz > NumRates) ? NumRates : ptn_sz; ++ ++ for (i = 0; i < num_of_rate; i++) { ++ if ((*(ptn + i)) & 0x80) ++ mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); ++ } ++ return mask; ++} ++ ++unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) ++{ ++ unsigned int i, num_of_rate; ++ unsigned int mask = 0; ++ ++ num_of_rate = (ptn_sz > NumRates) ? NumRates : ptn_sz; ++ ++ for (i = 0; i < num_of_rate; i++) ++ mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); ++ return mask; ++} ++ ++unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps) ++{ ++ unsigned int mask = 0; ++ ++ mask = ((pHT_caps->u.HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 20)); ++ ++ return mask; ++} ++ ++int support_short_GI(struct adapter *padapter, struct HT_caps_element *pHT_caps) ++{ ++ unsigned char bit_offset; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (!(pmlmeinfo->HT_enable)) ++ return _FAIL; ++ ++ if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_RALINK) ++ return _FAIL; ++ ++ bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40) ? 6 : 5; ++ ++ if (__le16_to_cpu(pHT_caps->u.HT_cap_element.HT_caps_info) & (0x1 << bit_offset)) ++ return _SUCCESS; ++ else ++ return _FAIL; ++} ++ ++unsigned char get_highest_rate_idx(u32 mask) ++{ ++ int i; ++ unsigned char rate_idx = 0; ++ ++ for (i = 27; i >= 0; i--) { ++ if (mask & BIT(i)) { ++ rate_idx = i; ++ break; ++ } ++ } ++ return rate_idx; ++} ++ ++void Update_RA_Entry(struct adapter *padapter, u32 mac_id) ++{ ++ rtw_hal_update_ra_mask(padapter, mac_id, 0); ++} ++ ++static void enable_rate_adaptive(struct adapter *padapter, u32 mac_id) ++{ ++ Update_RA_Entry(padapter, mac_id); ++} ++ ++void set_sta_rate(struct adapter *padapter, struct sta_info *psta) ++{ ++ /* rate adaptive */ ++ enable_rate_adaptive(padapter, psta->mac_id); ++} ++ ++/* Update RRSR and Rate for USERATE */ ++void update_tx_basic_rate(struct adapter *padapter, u8 wirelessmode) ++{ ++ unsigned char supported_rates[NDIS_802_11_LENGTH_RATES_EX]; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ /* Added by Albert 2011/03/22 */ ++ /* In the P2P mode, the driver should not support the b mode. */ ++ /* So, the Tx packet shouldn't use the CCK rate */ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ++ return; ++#endif /* CONFIG_88EU_P2P */ ++ memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX); ++ ++ if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) ++ memcpy(supported_rates, rtw_basic_rate_cck, 4); ++ else if (wirelessmode & WIRELESS_11B) ++ memcpy(supported_rates, rtw_basic_rate_mix, 7); ++ else ++ memcpy(supported_rates, rtw_basic_rate_ofdm, 3); ++ ++ if (wirelessmode & WIRELESS_11B) ++ update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB); ++ else ++ update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, supported_rates); ++} ++ ++unsigned char check_assoc_AP(u8 *pframe, uint len) ++{ ++ unsigned int i; ++ struct ndis_802_11_var_ie *pIE; ++ u8 epigram_vendor_flag; ++ u8 ralink_vendor_flag; ++ epigram_vendor_flag = 0; ++ ralink_vendor_flag = 0; ++ ++ for (i = sizeof(struct ndis_802_11_fixed_ie); i < len;) { ++ pIE = (struct ndis_802_11_var_ie *)(pframe + i); ++ ++ switch (pIE->ElementID) { ++ case _VENDOR_SPECIFIC_IE_: ++ if ((!memcmp(pIE->data, ARTHEROS_OUI1, 3)) || ++ (!memcmp(pIE->data, ARTHEROS_OUI2, 3))) { ++ DBG_88E("link to Artheros AP\n"); ++ return HT_IOT_PEER_ATHEROS; ++ } else if ((!memcmp(pIE->data, BROADCOM_OUI1, 3)) || ++ (!memcmp(pIE->data, BROADCOM_OUI2, 3)) || ++ (!memcmp(pIE->data, BROADCOM_OUI2, 3))) { ++ DBG_88E("link to Broadcom AP\n"); ++ return HT_IOT_PEER_BROADCOM; ++ } else if (!memcmp(pIE->data, MARVELL_OUI, 3)) { ++ DBG_88E("link to Marvell AP\n"); ++ return HT_IOT_PEER_MARVELL; ++ } else if (!memcmp(pIE->data, RALINK_OUI, 3)) { ++ if (!ralink_vendor_flag) { ++ ralink_vendor_flag = 1; ++ } else { ++ DBG_88E("link to Ralink AP\n"); ++ return HT_IOT_PEER_RALINK; ++ } ++ } else if (!memcmp(pIE->data, CISCO_OUI, 3)) { ++ DBG_88E("link to Cisco AP\n"); ++ return HT_IOT_PEER_CISCO; ++ } else if (!memcmp(pIE->data, REALTEK_OUI, 3)) { ++ DBG_88E("link to Realtek 96B\n"); ++ return HT_IOT_PEER_REALTEK; ++ } else if (!memcmp(pIE->data, AIRGOCAP_OUI, 3)) { ++ DBG_88E("link to Airgo Cap\n"); ++ return HT_IOT_PEER_AIRGO; ++ } else if (!memcmp(pIE->data, EPIGRAM_OUI, 3)) { ++ epigram_vendor_flag = 1; ++ if (ralink_vendor_flag) { ++ DBG_88E("link to Tenda W311R AP\n"); ++ return HT_IOT_PEER_TENDA; ++ } else { ++ DBG_88E("Capture EPIGRAM_OUI\n"); ++ } ++ } else { ++ break; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ i += (pIE->Length + 2); ++ } ++ ++ if (ralink_vendor_flag && !epigram_vendor_flag) { ++ DBG_88E("link to Ralink AP\n"); ++ return HT_IOT_PEER_RALINK; ++ } else if (ralink_vendor_flag && epigram_vendor_flag) { ++ DBG_88E("link to Tenda W311R AP\n"); ++ return HT_IOT_PEER_TENDA; ++ } else { ++ DBG_88E("link to new AP\n"); ++ return HT_IOT_PEER_UNKNOWN; ++ } ++} ++ ++void update_IOT_info(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ switch (pmlmeinfo->assoc_AP_vendor) { ++ case HT_IOT_PEER_MARVELL: ++ pmlmeinfo->turboMode_cts2self = 1; ++ pmlmeinfo->turboMode_rtsen = 0; ++ break; ++ case HT_IOT_PEER_RALINK: ++ pmlmeinfo->turboMode_cts2self = 0; ++ pmlmeinfo->turboMode_rtsen = 1; ++ /* disable high power */ ++ Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false); ++ break; ++ case HT_IOT_PEER_REALTEK: ++ /* rtw_write16(padapter, 0x4cc, 0xffff); */ ++ /* rtw_write16(padapter, 0x546, 0x01c0); */ ++ /* disable high power */ ++ Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false); ++ break; ++ default: ++ pmlmeinfo->turboMode_cts2self = 0; ++ pmlmeinfo->turboMode_rtsen = 1; ++ break; ++ } ++} ++ ++void update_capinfo(struct adapter *Adapter, u16 updateCap) ++{ ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ bool ShortPreamble; ++ ++ /* Check preamble mode, 2005.01.06, by rcnjko. */ ++ /* Mark to update preamble value forever, 2008.03.18 by lanhsin */ ++ ++ if (updateCap & cShortPreamble) { /* Short Preamble */ ++ if (pmlmeinfo->preamble_mode != PREAMBLE_SHORT) { /* PREAMBLE_LONG or PREAMBLE_AUTO */ ++ ShortPreamble = true; ++ pmlmeinfo->preamble_mode = PREAMBLE_SHORT; ++ rtw_hal_set_hwreg(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); ++ } ++ } else { /* Long Preamble */ ++ if (pmlmeinfo->preamble_mode != PREAMBLE_LONG) { /* PREAMBLE_SHORT or PREAMBLE_AUTO */ ++ ShortPreamble = false; ++ pmlmeinfo->preamble_mode = PREAMBLE_LONG; ++ rtw_hal_set_hwreg(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); ++ } ++ } ++ ++ if (updateCap & cIBSS) { ++ /* Filen: See 802.11-2007 p.91 */ ++ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; ++ } else { /* Filen: See 802.11-2007 p.90 */ ++ if (pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N)) { ++ if (updateCap & cShortSlotTime) { /* Short Slot Time */ ++ if (pmlmeinfo->slotTime != SHORT_SLOT_TIME) ++ pmlmeinfo->slotTime = SHORT_SLOT_TIME; ++ } else { /* Long Slot Time */ ++ if (pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME) ++ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; ++ } ++ } else { ++ /* B Mode */ ++ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; ++ } ++ } ++ ++ rtw_hal_set_hwreg(Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime); ++} ++ ++void update_wireless_mode(struct adapter *padapter) ++{ ++ int ratelen, network_type = 0; ++ u32 SIFS_Timer; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ unsigned char *rate = cur_network->SupportedRates; ++ ++ ratelen = rtw_get_rateset_len(cur_network->SupportedRates); ++ ++ if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) ++ pmlmeinfo->HT_enable = 1; ++ ++ if (pmlmeext->cur_channel > 14) { ++ network_type |= WIRELESS_INVALID; ++ } else { ++ if (pmlmeinfo->HT_enable) ++ network_type = WIRELESS_11_24N; ++ ++ if (cckratesonly_included(rate, ratelen)) ++ network_type |= WIRELESS_11B; ++ else if (cckrates_included(rate, ratelen)) ++ network_type |= WIRELESS_11BG; ++ else ++ network_type |= WIRELESS_11G; ++ } ++ ++ pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; ++ ++ SIFS_Timer = 0x0a0a0808;/* 0x0808 -> for CCK, 0x0a0a -> for OFDM */ ++ /* change this value if having IOT issues. */ ++ ++ padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); ++ ++ if (pmlmeext->cur_wireless_mode & WIRELESS_11B) ++ update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB); ++ else ++ update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB); ++} ++ ++void update_bmc_sta_support_rate(struct adapter *padapter, u32 mac_id) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { ++ /* Only B, B/G, and B/G/N AP could use CCK rate */ ++ memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_cck, 4); ++ } else { ++ memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_ofdm, 3); ++ } ++} ++ ++int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, uint var_ie_len, int cam_idx) ++{ ++ unsigned int ie_len; ++ struct ndis_802_11_var_ie *pIE; ++ int supportRateNum = 0; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pIE = (struct ndis_802_11_var_ie *)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); ++ if (!pIE) ++ return _FAIL; ++ ++ memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); ++ supportRateNum = ie_len; ++ ++ pIE = (struct ndis_802_11_var_ie *)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); ++ if (pIE) ++ memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); ++ ++ return _SUCCESS; ++} ++ ++void process_addba_req(struct adapter *padapter, u8 *paddba_req, u8 *addr) ++{ ++ struct sta_info *psta; ++ u16 tid; ++ u16 param; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct ADDBA_request *preq = (struct ADDBA_request *)paddba_req; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ psta = rtw_get_stainfo(pstapriv, addr); ++ ++ if (psta) { ++ param = le16_to_cpu(preq->BA_para_set); ++ tid = (param >> 2) & 0x0f; ++ preorder_ctrl = &psta->recvreorder_ctrl[tid]; ++ preorder_ctrl->indicate_seq = 0xffff; ++ preorder_ctrl->enable = (pmlmeinfo->bAcceptAddbaReq) ? true : false; ++ } ++} ++ ++void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) ++{ ++ u8 *pIE; ++ __le32 *pbuf; ++ ++ pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); ++ pbuf = (__le32 *)pIE; ++ ++ pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1)); ++ ++ pmlmeext->TSFValue = pmlmeext->TSFValue << 32; ++ ++ pmlmeext->TSFValue |= le32_to_cpu(*pbuf); ++} ++ ++void correct_TSF(struct adapter *padapter, struct mlme_ext_priv *pmlmeext) ++{ ++ rtw_hal_set_hwreg(padapter, HW_VAR_CORRECT_TSF, NULL); ++} ++ ++void beacon_timing_control(struct adapter *padapter) ++{ ++ rtw_hal_bcn_related_reg_setting(padapter); ++} ++ ++static struct adapter *pbuddy_padapter; ++ ++int rtw_handle_dualmac(struct adapter *adapter, bool init) ++{ ++ int status = _SUCCESS; ++ ++ if (init) { ++ if (!pbuddy_padapter) { ++ pbuddy_padapter = adapter; ++ DBG_88E("%s(): pbuddy_padapter == NULL, Set pbuddy_padapter\n", __func__); ++ } else { ++ adapter->pbuddy_adapter = pbuddy_padapter; ++ pbuddy_padapter->pbuddy_adapter = adapter; ++ /* clear global value */ ++ pbuddy_padapter = NULL; ++ DBG_88E("%s(): pbuddy_padapter exist, Exchange Information\n", __func__); ++ } ++ } else { ++ pbuddy_padapter = NULL; ++ } ++ return status; ++} +diff --git a/drivers/staging/r8188eu/core/rtw_xmit.c b/drivers/staging/r8188eu/core/rtw_xmit.c +new file mode 100644 +index 000000000000..46fe62c7c32c +--- /dev/null ++++ b/drivers/staging/r8188eu/core/rtw_xmit.c +@@ -0,0 +1,2240 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _RTW_XMIT_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_ops.h" ++#include "../include/usb_osintf.h" ++ ++static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; ++static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; ++ ++static void _init_txservq(struct tx_servq *ptxservq) ++{ ++ ++ INIT_LIST_HEAD(&ptxservq->tx_pending); ++ _rtw_init_queue(&ptxservq->sta_pending); ++ ptxservq->qcnt = 0; ++ ++} ++ ++void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) ++{ ++ ++ memset((unsigned char *)psta_xmitpriv, 0, sizeof(struct sta_xmit_priv)); ++ spin_lock_init(&psta_xmitpriv->lock); ++ _init_txservq(&psta_xmitpriv->be_q); ++ _init_txservq(&psta_xmitpriv->bk_q); ++ _init_txservq(&psta_xmitpriv->vi_q); ++ _init_txservq(&psta_xmitpriv->vo_q); ++ INIT_LIST_HEAD(&psta_xmitpriv->legacy_dz); ++ INIT_LIST_HEAD(&psta_xmitpriv->apsd); ++ ++} ++ ++s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) ++{ ++ int i; ++ struct xmit_buf *pxmitbuf; ++ struct xmit_frame *pxframe; ++ int res = _SUCCESS; ++ u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; ++ u32 num_xmit_extbuf = NR_XMIT_EXTBUFF; ++ ++ /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */ ++ ++ spin_lock_init(&pxmitpriv->lock); ++ sema_init(&pxmitpriv->xmit_sema, 0); ++ sema_init(&pxmitpriv->terminate_xmitthread_sema, 0); ++ ++ /* ++ Please insert all the queue initializaiton using _rtw_init_queue below ++ */ ++ ++ pxmitpriv->adapter = padapter; ++ ++ _rtw_init_queue(&pxmitpriv->be_pending); ++ _rtw_init_queue(&pxmitpriv->bk_pending); ++ _rtw_init_queue(&pxmitpriv->vi_pending); ++ _rtw_init_queue(&pxmitpriv->vo_pending); ++ _rtw_init_queue(&pxmitpriv->bm_pending); ++ ++ _rtw_init_queue(&pxmitpriv->free_xmit_queue); ++ ++ /* ++ Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, ++ and initialize free_xmit_frame below. ++ Please also apply free_txobj to link_up all the xmit_frames... ++ */ ++ ++ pxmitpriv->pallocated_frame_buf = vzalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); ++ ++ if (!pxmitpriv->pallocated_frame_buf) { ++ pxmitpriv->pxmit_frame_buf = NULL; ++ res = _FAIL; ++ goto exit; ++ } ++ pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_frame_buf), 4); ++ /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */ ++ /* ((size_t) (pxmitpriv->pallocated_frame_buf) &3); */ ++ ++ pxframe = (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; ++ ++ for (i = 0; i < NR_XMITFRAME; i++) { ++ INIT_LIST_HEAD(&pxframe->list); ++ ++ pxframe->padapter = padapter; ++ pxframe->frame_tag = NULL_FRAMETAG; ++ ++ pxframe->pkt = NULL; ++ ++ pxframe->buf_addr = NULL; ++ pxframe->pxmitbuf = NULL; ++ ++ list_add_tail(&pxframe->list, &pxmitpriv->free_xmit_queue.queue); ++ ++ pxframe++; ++ } ++ ++ pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME; ++ ++ pxmitpriv->frag_len = MAX_FRAG_THRESHOLD; ++ ++ /* init xmit_buf */ ++ _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue); ++ _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue); ++ ++ pxmitpriv->pallocated_xmitbuf = vzalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4); ++ ++ if (!pxmitpriv->pallocated_xmitbuf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmitbuf), 4); ++ /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */ ++ /* ((size_t) (pxmitpriv->pallocated_xmitbuf) &3); */ ++ ++ pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; ++ ++ for (i = 0; i < NR_XMITBUFF; i++) { ++ INIT_LIST_HEAD(&pxmitbuf->list); ++ ++ pxmitbuf->priv_data = NULL; ++ pxmitbuf->padapter = padapter; ++ pxmitbuf->ext_tag = false; ++ ++ /* Tx buf allocation may fail sometimes, so sleep and retry. */ ++ res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ)); ++ if (res == _FAIL) { ++ msleep(10); ++ res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ)); ++ if (res == _FAIL) { ++ goto exit; ++ } ++ } ++ ++ pxmitbuf->flags = XMIT_VO_QUEUE; ++ ++ list_add_tail(&pxmitbuf->list, &pxmitpriv->free_xmitbuf_queue.queue); ++ pxmitbuf++; ++ } ++ ++ pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF; ++ ++ /* Init xmit extension buff */ ++ _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); ++ ++ pxmitpriv->pallocated_xmit_extbuf = vzalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4); ++ ++ if (!pxmitpriv->pallocated_xmit_extbuf) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmit_extbuf), 4); ++ ++ pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; ++ ++ for (i = 0; i < num_xmit_extbuf; i++) { ++ INIT_LIST_HEAD(&pxmitbuf->list); ++ ++ pxmitbuf->priv_data = NULL; ++ pxmitbuf->padapter = padapter; ++ pxmitbuf->ext_tag = true; ++ ++ res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ); ++ if (res == _FAIL) { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ list_add_tail(&pxmitbuf->list, &pxmitpriv->free_xmit_extbuf_queue.queue); ++ pxmitbuf++; ++ } ++ ++ pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf; ++ ++ rtw_alloc_hwxmits(padapter); ++ rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); ++ ++ for (i = 0; i < 4; i++) ++ pxmitpriv->wmm_para_seq[i] = i; ++ ++ pxmitpriv->txirp_cnt = 1; ++ ++ sema_init(&pxmitpriv->tx_retevt, 0); ++ ++ /* per AC pending irp */ ++ pxmitpriv->beq_cnt = 0; ++ pxmitpriv->bkq_cnt = 0; ++ pxmitpriv->viq_cnt = 0; ++ pxmitpriv->voq_cnt = 0; ++ ++ pxmitpriv->ack_tx = false; ++ _rtw_mutex_init(&pxmitpriv->ack_tx_mutex); ++ rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0); ++ ++ rtw_hal_init_xmit_priv(padapter); ++ ++exit: ++ ++ return res; ++} ++ ++void _rtw_free_xmit_priv(struct xmit_priv *pxmitpriv) ++{ ++ int i; ++ struct adapter *padapter = pxmitpriv->adapter; ++ struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; ++ u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; ++ u32 num_xmit_extbuf = NR_XMIT_EXTBUFF; ++ ++ if (!pxmitpriv->pxmit_frame_buf) ++ return; ++ ++ for (i = 0; i < NR_XMITFRAME; i++) { ++ rtw_os_xmit_complete(padapter, pxmitframe); ++ ++ pxmitframe++; ++ } ++ ++ for (i = 0; i < NR_XMITBUFF; i++) { ++ rtw_os_xmit_resource_free(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ)); ++ pxmitbuf++; ++ } ++ ++ vfree(pxmitpriv->pallocated_frame_buf); ++ ++ vfree(pxmitpriv->pallocated_xmitbuf); ++ ++ pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; ++ for (i = 0; i < num_xmit_extbuf; i++) { ++ rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ)); ++ pxmitbuf++; ++ } ++ ++ vfree(pxmitpriv->pallocated_xmit_extbuf); ++ ++ rtw_free_hwxmits(padapter); ++ ++ _rtw_mutex_free(&pxmitpriv->ack_tx_mutex); ++} ++ ++static void update_attrib_vcs_info(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ u32 sz; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct sta_info *psta = pattrib->psta; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pattrib->nr_frags != 1) ++ sz = padapter->xmitpriv.frag_len; ++ else /* no frag */ ++ sz = pattrib->last_txcmdsz; ++ ++ /* (1) RTS_Threshold is compared to the MPDU, not MSDU. */ ++ /* (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. */ ++ /* Other fragments are protected by previous fragment. */ ++ /* So we only need to check the length of first fragment. */ ++ if (pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) { ++ if (sz > padapter->registrypriv.rts_thresh) { ++ pattrib->vcs_mode = RTS_CTS; ++ } else { ++ if (psta->rtsen) ++ pattrib->vcs_mode = RTS_CTS; ++ else if (psta->cts2self) ++ pattrib->vcs_mode = CTS_TO_SELF; ++ else ++ pattrib->vcs_mode = NONE_VCS; ++ } ++ } else { ++ while (true) { ++ /* IOT action */ ++ if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && pattrib->ampdu_en && ++ (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { ++ pattrib->vcs_mode = CTS_TO_SELF; ++ break; ++ } ++ ++ /* check ERP protection */ ++ if (psta->rtsen || psta->cts2self) { ++ if (psta->rtsen) ++ pattrib->vcs_mode = RTS_CTS; ++ else if (psta->cts2self) ++ pattrib->vcs_mode = CTS_TO_SELF; ++ ++ break; ++ } ++ ++ /* check HT op mode */ ++ if (pattrib->ht_en) { ++ u8 htopmode = pmlmeinfo->HT_protection; ++ if ((pmlmeext->cur_bwmode && (htopmode == 2 || htopmode == 3)) || ++ (!pmlmeext->cur_bwmode && htopmode == 3)) { ++ pattrib->vcs_mode = RTS_CTS; ++ break; ++ } ++ } ++ ++ /* check rts */ ++ if (sz > padapter->registrypriv.rts_thresh) { ++ pattrib->vcs_mode = RTS_CTS; ++ break; ++ } ++ ++ /* to do list: check MIMO power save condition. */ ++ ++ /* check AMPDU aggregation for TXOP */ ++ if (pattrib->ampdu_en) { ++ pattrib->vcs_mode = RTS_CTS; ++ break; ++ } ++ ++ pattrib->vcs_mode = NONE_VCS; ++ break; ++ } ++ } ++} ++ ++static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta) ++{ ++ /*if (psta->rtsen) ++ pattrib->vcs_mode = RTS_CTS; ++ else if (psta->cts2self) ++ pattrib->vcs_mode = CTS_TO_SELF; ++ else ++ pattrib->vcs_mode = NONE_VCS;*/ ++ ++ pattrib->mdata = 0; ++ pattrib->eosp = 0; ++ pattrib->triggered = 0; ++ ++ /* qos_en, ht_en, init rate, , bw, ch_offset, sgi */ ++ pattrib->qos_en = psta->qos_option; ++ ++ pattrib->raid = psta->raid; ++ pattrib->ht_en = psta->htpriv.ht_option; ++ pattrib->bwmode = psta->htpriv.bwmode; ++ pattrib->ch_offset = psta->htpriv.ch_offset; ++ pattrib->sgi = psta->htpriv.sgi; ++ pattrib->ampdu_en = false; ++ pattrib->retry_ctrl = false; ++} ++ ++u8 qos_acm(u8 acm_mask, u8 priority) ++{ ++ u8 change_priority = priority; ++ ++ switch (priority) { ++ case 0: ++ case 3: ++ if (acm_mask & BIT(1)) ++ change_priority = 1; ++ break; ++ case 1: ++ case 2: ++ break; ++ case 4: ++ case 5: ++ if (acm_mask & BIT(2)) ++ change_priority = 0; ++ break; ++ case 6: ++ case 7: ++ if (acm_mask & BIT(3)) ++ change_priority = 5; ++ break; ++ default: ++ DBG_88E("qos_acm(): invalid pattrib->priority: %d!!!\n", priority); ++ break; ++ } ++ ++ return change_priority; ++} ++ ++static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) ++{ ++ struct ethhdr etherhdr; ++ struct iphdr ip_hdr; ++ s32 user_prio = 0; ++ ++ _rtw_open_pktfile(ppktfile->pkt, ppktfile); ++ _rtw_pktfile_read(ppktfile, (unsigned char *)ðerhdr, ETH_HLEN); ++ ++ /* get user_prio from IP hdr */ ++ if (pattrib->ether_type == 0x0800) { ++ _rtw_pktfile_read(ppktfile, (u8 *)&ip_hdr, sizeof(ip_hdr)); ++/* user_prio = (ntohs(ip_hdr.tos) >> 5) & 0x3; */ ++ user_prio = ip_hdr.tos >> 5; ++ } else if (pattrib->ether_type == 0x888e) { ++ /* "When priority processing of data frames is supported, */ ++ /* a STA's SME should send EAPOL-Key frames at the highest priority." */ ++ user_prio = 7; ++ } ++ ++ pattrib->priority = user_prio; ++ pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; ++ pattrib->subtype = WIFI_QOS_DATA_TYPE; ++} ++ ++static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct pkt_attrib *pattrib) ++{ ++ struct pkt_file pktfile; ++ struct sta_info *psta = NULL; ++ struct ethhdr etherhdr; ++ ++ bool bmcast; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct qos_priv *pqospriv = &pmlmepriv->qospriv; ++ int res = _SUCCESS; ++ ++ ++ ++ _rtw_open_pktfile(pkt, &pktfile); ++ _rtw_pktfile_read(&pktfile, (u8 *)ðerhdr, ETH_HLEN); ++ ++ pattrib->ether_type = ntohs(etherhdr.h_proto); ++ ++ memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN); ++ memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN); ++ ++ pattrib->pctrl = 0; ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); ++ memcpy(pattrib->ta, pattrib->src, ETH_ALEN); ++ } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); ++ memcpy(pattrib->ta, pattrib->src, ETH_ALEN); ++ } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); ++ memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); ++ } ++ ++ pattrib->pktlen = pktfile.pkt_len; ++ ++ if (ETH_P_IP == pattrib->ether_type) { ++ /* The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time */ ++ /* to prevent DHCP protocol fail */ ++ u8 tmp[24]; ++ _rtw_pktfile_read(&pktfile, &tmp[0], 24); ++ pattrib->dhcp_pkt = 0; ++ if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */ ++ if (ETH_P_IP == pattrib->ether_type) {/* IP header */ ++ if (((tmp[21] == 68) && (tmp[23] == 67)) || ++ ((tmp[21] == 67) && (tmp[23] == 68))) { ++ /* 68 : UDP BOOTP client */ ++ /* 67 : UDP BOOTP server */ ++ /* Use low rate to send DHCP packet. */ ++ pattrib->dhcp_pkt = 1; ++ } ++ } ++ } ++ } else if (0x888e == pattrib->ether_type) { ++ DBG_88E_LEVEL(_drv_info_, "send eapol packet\n"); ++ } ++ ++ if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) ++ rtw_set_scan_deny(padapter, 3000); ++ ++ /* If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */ ++ if ((pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1); ++ ++ bmcast = is_multicast_ether_addr(pattrib->ra); ++ ++ /* get sta_info */ ++ if (bmcast) { ++ psta = rtw_get_bcmc_stainfo(padapter); ++ } else { ++ psta = rtw_get_stainfo(pstapriv, pattrib->ra); ++ if (!psta) { /* if we cannot get psta => drrp the pkt */ ++ res = _FAIL; ++ goto exit; ++ } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) && !(psta->state & _FW_LINKED)) { ++ res = _FAIL; ++ goto exit; ++ } ++ } ++ ++ if (psta) { ++ pattrib->mac_id = psta->mac_id; ++ /* DBG_88E("%s ==> mac_id(%d)\n", __func__, pattrib->mac_id); */ ++ pattrib->psta = psta; ++ } else { ++ /* if we cannot get psta => drop the pkt */ ++ res = _FAIL; ++ goto exit; ++ } ++ ++ pattrib->ack_policy = 0; ++ /* get ether_hdr_len */ ++ pattrib->pkt_hdrlen = ETH_HLEN;/* pattrib->ether_type == 0x8100) ? (14 + 4): 14; vlan tag */ ++ ++ pattrib->hdrlen = WLAN_HDR_A3_LEN; ++ pattrib->subtype = WIFI_DATA_TYPE; ++ pattrib->priority = 0; ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { ++ if (psta->qos_option) ++ set_qos(&pktfile, pattrib); ++ } else { ++ if (pqospriv->qos_option) { ++ set_qos(&pktfile, pattrib); ++ ++ if (pmlmepriv->acm_mask != 0) ++ pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority); ++ } ++ } ++ ++ if (psta->ieee8021x_blocked) { ++ pattrib->encrypt = 0; ++ ++ if ((pattrib->ether_type != 0x888e) && !check_fwstate(pmlmepriv, WIFI_MP_STATE)) { ++ res = _FAIL; ++ goto exit; ++ } ++ } else { ++ GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); ++ ++ switch (psecuritypriv->dot11AuthAlgrthm) { ++ case dot11AuthAlgrthm_Open: ++ case dot11AuthAlgrthm_Shared: ++ case dot11AuthAlgrthm_Auto: ++ pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; ++ break; ++ case dot11AuthAlgrthm_8021X: ++ if (bmcast) ++ pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; ++ else ++ pattrib->key_idx = 0; ++ break; ++ default: ++ pattrib->key_idx = 0; ++ break; ++ } ++ } ++ ++ switch (pattrib->encrypt) { ++ case _WEP40_: ++ case _WEP104_: ++ pattrib->iv_len = 4; ++ pattrib->icv_len = 4; ++ break; ++ case _TKIP_: ++ pattrib->iv_len = 8; ++ pattrib->icv_len = 4; ++ ++ if (padapter->securitypriv.busetkipkey == _FAIL) { ++ res = _FAIL; ++ goto exit; ++ } ++ break; ++ case _AES_: ++ pattrib->iv_len = 8; ++ pattrib->icv_len = 8; ++ break; ++ default: ++ pattrib->iv_len = 0; ++ pattrib->icv_len = 0; ++ break; ++ } ++ ++ if (pattrib->encrypt && ++ (padapter->securitypriv.sw_encrypt || !psecuritypriv->hw_decrypted)) ++ pattrib->bswenc = true; ++ else ++ pattrib->bswenc = false; ++ ++ rtw_set_tx_chksum_offload(pkt, pattrib); ++ ++ update_attrib_phy_info(pattrib, psta); ++ ++exit: ++ ++ return res; ++} ++ ++static s32 xmitframe_addmic(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ int curfragnum, length; ++ u8 *pframe, *payload, mic[8]; ++ struct mic_data micdata; ++ struct sta_info *stainfo; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ u8 priority[4] = {0x0, 0x0, 0x0, 0x0}; ++ u8 hw_hdr_offset = 0; ++ ++ if (pattrib->psta) ++ stainfo = pattrib->psta; ++ else ++ stainfo = rtw_get_stainfo(&padapter->stapriv, &pattrib->ra[0]); ++ ++ hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); ++ ++ if (pattrib->encrypt == _TKIP_) {/* if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_PRIVACY_) */ ++ /* encode mic code */ ++ if (stainfo) { ++ u8 null_key[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ++ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ++ 0x0, 0x0}; ++ ++ pframe = pxmitframe->buf_addr + hw_hdr_offset; ++ ++ if (is_multicast_ether_addr(pattrib->ra)) { ++ if (!memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)) ++ return _FAIL; ++ /* start to calculate the mic code */ ++ rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); ++ } else { ++ if (!memcmp(&stainfo->dot11tkiptxmickey.skey[0], null_key, 16)) { ++ /* msleep(10); */ ++ return _FAIL; ++ } ++ /* start to calculate the mic code */ ++ rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]); ++ } ++ ++ if (pframe[1] & 1) { /* ToDS == 1 */ ++ rtw_secmicappend(&micdata, &pframe[16], 6); /* DA */ ++ if (pframe[1] & 2) /* From Ds == 1 */ ++ rtw_secmicappend(&micdata, &pframe[24], 6); ++ else ++ rtw_secmicappend(&micdata, &pframe[10], 6); ++ } else { /* ToDS == 0 */ ++ rtw_secmicappend(&micdata, &pframe[4], 6); /* DA */ ++ if (pframe[1] & 2) /* From Ds == 1 */ ++ rtw_secmicappend(&micdata, &pframe[16], 6); ++ else ++ rtw_secmicappend(&micdata, &pframe[10], 6); ++ } ++ ++ if (pattrib->qos_en) ++ priority[0] = (u8)pxmitframe->attrib.priority; ++ ++ rtw_secmicappend(&micdata, &priority[0], 4); ++ ++ payload = pframe; ++ ++ for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { ++ payload = (u8 *)RND4((size_t)(payload)); ++ ++ payload = payload + pattrib->hdrlen + pattrib->iv_len; ++ if ((curfragnum + 1) == pattrib->nr_frags) { ++ length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0); ++ rtw_secmicappend(&micdata, payload, length); ++ payload = payload + length; ++ } else { ++ length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0); ++ rtw_secmicappend(&micdata, payload, length); ++ payload = payload + length + pattrib->icv_len; ++ } ++ } ++ rtw_secgetmic(&micdata, &mic[0]); ++ /* add mic code and add the mic code length in last_txcmdsz */ ++ ++ memcpy(payload, &mic[0], 8); ++ pattrib->last_txcmdsz += 8; ++ ++ payload = payload - pattrib->last_txcmdsz + 8; ++ } ++ } ++ ++ return _SUCCESS; ++} ++ ++static s32 xmitframe_swencrypt(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ ++ if (pattrib->bswenc) { ++ switch (pattrib->encrypt) { ++ case _WEP40_: ++ case _WEP104_: ++ rtw_wep_encrypt(padapter, (u8 *)pxmitframe); ++ break; ++ case _TKIP_: ++ rtw_tkip_encrypt(padapter, (u8 *)pxmitframe); ++ break; ++ case _AES_: ++ rtw_aes_encrypt(padapter, (u8 *)pxmitframe); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ return _SUCCESS; ++} ++ ++s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib) ++{ ++ u16 *qc; ++ ++ struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct qos_priv *pqospriv = &pmlmepriv->qospriv; ++ u8 qos_option = false; ++ ++ int res = _SUCCESS; ++ __le16 *fctrl = &pwlanhdr->frame_ctl; ++ ++ struct sta_info *psta; ++ ++ if (pattrib->psta) { ++ psta = pattrib->psta; ++ } else { ++ if (is_multicast_ether_addr(pattrib->ra)) { ++ psta = rtw_get_bcmc_stainfo(padapter); ++ } else { ++ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); ++ } ++ } ++ ++ memset(hdr, 0, WLANHDR_OFFSET); ++ ++ SetFrameSubType(fctrl, pattrib->subtype); ++ ++ if (pattrib->subtype & WIFI_DATA_TYPE) { ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { ++ /* to_ds = 1, fr_ds = 0; */ ++ /* Data transfer to AP */ ++ SetToDs(fctrl); ++ memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); ++ ++ if (pqospriv->qos_option) ++ qos_option = true; ++ } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ /* to_ds = 0, fr_ds = 1; */ ++ SetFrDs(fctrl); ++ memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); ++ ++ if (psta->qos_option) ++ qos_option = true; ++ } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); ++ ++ if (psta->qos_option) ++ qos_option = true; ++ } else { ++ res = _FAIL; ++ goto exit; ++ } ++ ++ if (pattrib->mdata) ++ SetMData(fctrl); ++ ++ if (pattrib->encrypt) ++ SetPrivacy(fctrl); ++ ++ if (qos_option) { ++ qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); ++ ++ if (pattrib->priority) ++ SetPriority(qc, pattrib->priority); ++ ++ SetEOSP(qc, pattrib->eosp); ++ ++ SetAckpolicy(qc, pattrib->ack_policy); ++ } ++ ++ /* TODO: fill HT Control Field */ ++ ++ /* Update Seq Num will be handled by f/w */ ++ if (psta) { ++ psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; ++ psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; ++ ++ pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; ++ ++ SetSeqNum(hdr, pattrib->seqnum); ++ ++ /* check if enable ampdu */ ++ if (pattrib->ht_en && psta->htpriv.ampdu_enable) { ++ if (psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) ++ pattrib->ampdu_en = true; ++ } ++ ++ /* re-check if enable ampdu by BA_starting_seqctrl */ ++ if (pattrib->ampdu_en) { ++ u16 tx_seq; ++ ++ tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f]; ++ ++ /* check BA_starting_seqctrl */ ++ if (SN_LESS(pattrib->seqnum, tx_seq)) { ++ pattrib->ampdu_en = false;/* AGG BK */ ++ } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { ++ psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq + 1) & 0xfff; ++ ++ pattrib->ampdu_en = true;/* AGG EN */ ++ } else { ++ psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum + 1) & 0xfff; ++ pattrib->ampdu_en = true;/* AGG EN */ ++ } ++ } ++ } ++ } ++exit: ++ ++ return res; ++} ++ ++s32 rtw_txframes_pending(struct adapter *padapter) ++{ ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ return (!list_empty(&pxmitpriv->be_pending.queue) || ++ !list_empty(&pxmitpriv->bk_pending.queue) || ++ !list_empty(&pxmitpriv->vi_pending.queue) || ++ !list_empty(&pxmitpriv->vo_pending.queue)); ++} ++ ++s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, struct pkt_attrib *pattrib) ++{ ++ struct sta_info *psta; ++ struct tx_servq *ptxservq; ++ int priority = pattrib->priority; ++ ++ psta = pattrib->psta; ++ ++ switch (priority) { ++ case 1: ++ case 2: ++ ptxservq = &psta->sta_xmitpriv.bk_q; ++ break; ++ case 4: ++ case 5: ++ ptxservq = &psta->sta_xmitpriv.vi_q; ++ break; ++ case 6: ++ case 7: ++ ptxservq = &psta->sta_xmitpriv.vo_q; ++ break; ++ case 0: ++ case 3: ++ default: ++ ptxservq = &psta->sta_xmitpriv.be_q; ++ break; ++ } ++ ++ if (ptxservq) ++ return ptxservq->qcnt; ++ return 0; ++} ++ ++/* ++ * Calculate wlan 802.11 packet MAX size from pkt_attrib ++ * This function doesn't consider fragment case ++ */ ++u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib) ++{ ++ u32 len = 0; ++ ++ len = pattrib->hdrlen + pattrib->iv_len; /* WLAN Header and IV */ ++ len += SNAP_SIZE + sizeof(u16); /* LLC */ ++ len += pattrib->pktlen; ++ if (pattrib->encrypt == _TKIP_) ++ len += 8; /* MIC */ ++ len += ((pattrib->bswenc) ? pattrib->icv_len : 0); /* ICV */ ++ ++ return len; ++} ++ ++/* ++ ++This sub-routine will perform all the following: ++ ++1. remove 802.3 header. ++2. create wlan_header, based on the info in pxmitframe ++3. append sta's iv/ext-iv ++4. append LLC ++5. move frag chunk from pframe to pxmitframe->mem ++6. apply sw-encrypt, if necessary. ++ ++*/ ++s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct xmit_frame *pxmitframe) ++{ ++ struct pkt_file pktfile; ++ s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; ++ size_t addr; ++ u8 *pframe, *mem_start; ++ u8 hw_hdr_offset; ++ struct sta_info *psta; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ u8 *pbuf_start; ++ bool bmcst = is_multicast_ether_addr(pattrib->ra); ++ s32 res = _SUCCESS; ++ ++ if (!pkt) ++ return _FAIL; ++ ++ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); ++ ++ if (!psta) ++ return _FAIL; ++ ++ if (!pxmitframe->buf_addr) { ++ DBG_88E("==> %s buf_addr == NULL\n", __func__); ++ return _FAIL; ++ } ++ ++ pbuf_start = pxmitframe->buf_addr; ++ ++ hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); ++ ++ mem_start = pbuf_start + hw_hdr_offset; ++ ++ if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) { ++ DBG_88E("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ _rtw_open_pktfile(pkt, &pktfile); ++ _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen); ++ ++ frg_inx = 0; ++ frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */ ++ ++ while (1) { ++ llc_sz = 0; ++ ++ mpdu_len = frg_len; ++ ++ pframe = mem_start; ++ ++ SetMFrag(mem_start); ++ ++ pframe += pattrib->hdrlen; ++ mpdu_len -= pattrib->hdrlen; ++ ++ /* adding icv, if necessary... */ ++ if (pattrib->iv_len) { ++ if (psta) { ++ switch (pattrib->encrypt) { ++ case _WEP40_: ++ case _WEP104_: ++ WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); ++ break; ++ case _TKIP_: ++ if (bmcst) ++ TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); ++ else ++ TKIP_IV(pattrib->iv, psta->dot11txpn, 0); ++ break; ++ case _AES_: ++ if (bmcst) ++ AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); ++ else ++ AES_IV(pattrib->iv, psta->dot11txpn, 0); ++ break; ++ } ++ } ++ ++ memcpy(pframe, pattrib->iv, pattrib->iv_len); ++ ++ pframe += pattrib->iv_len; ++ ++ mpdu_len -= pattrib->iv_len; ++ } ++ ++ if (frg_inx == 0) { ++ llc_sz = rtw_put_snap(pframe, pattrib->ether_type); ++ pframe += llc_sz; ++ mpdu_len -= llc_sz; ++ } ++ ++ if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { ++ mpdu_len -= pattrib->icv_len; ++ } ++ ++ if (bmcst) { ++ /* don't do fragment to broadcat/multicast packets */ ++ mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); ++ } else { ++ mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); ++ } ++ ++ pframe += mem_sz; ++ ++ if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { ++ memcpy(pframe, pattrib->icv, pattrib->icv_len); ++ pframe += pattrib->icv_len; ++ } ++ ++ frg_inx++; ++ ++ if (bmcst || rtw_endofpktfile(&pktfile)) { ++ pattrib->nr_frags = frg_inx; ++ ++ pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags == 1) ? llc_sz : 0) + ++ ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; ++ ++ ClearMFrag(mem_start); ++ ++ break; ++ } ++ ++ addr = (size_t)(pframe); ++ ++ mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset; ++ memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen); ++ } ++ ++ if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) { ++ DBG_88E("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"); ++ res = _FAIL; ++ goto exit; ++ } ++ ++ xmitframe_swencrypt(padapter, pxmitframe); ++ ++ if (!bmcst) ++ update_attrib_vcs_info(padapter, pxmitframe); ++ else ++ pattrib->vcs_mode = NONE_VCS; ++ ++exit: ++ ++ return res; ++} ++ ++/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header ++ * IEEE LLC/SNAP header contains 8 octets ++ * First 3 octets comprise the LLC portion ++ * SNAP portion, 5 octets, is divided into two fields: ++ * Organizationally Unique Identifier(OUI), 3 octets, ++ * type, defined by that organization, 2 octets. ++ */ ++s32 rtw_put_snap(u8 *data, u16 h_proto) ++{ ++ struct ieee80211_snap_hdr *snap; ++ u8 *oui; ++ ++ snap = (struct ieee80211_snap_hdr *)data; ++ snap->dsap = 0xaa; ++ snap->ssap = 0xaa; ++ snap->ctrl = 0x03; ++ ++ if (h_proto == 0x8137 || h_proto == 0x80f3) ++ oui = P802_1H_OUI; ++ else ++ oui = RFC1042_OUI; ++ ++ snap->oui[0] = oui[0]; ++ snap->oui[1] = oui[1]; ++ snap->oui[2] = oui[2]; ++ ++ *(__be16 *)(data + SNAP_SIZE) = htons(h_proto); ++ ++ return SNAP_SIZE + sizeof(u16); ++} ++ ++void rtw_update_protection(struct adapter *padapter, u8 *ie, uint ie_len) ++{ ++ uint protection; ++ u8 *perp; ++ int erp_len; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ ++ switch (pxmitpriv->vcs_setting) { ++ case DISABLE_VCS: ++ pxmitpriv->vcs = NONE_VCS; ++ break; ++ case ENABLE_VCS: ++ break; ++ case AUTO_VCS: ++ default: ++ perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); ++ if (!perp) { ++ pxmitpriv->vcs = NONE_VCS; ++ } else { ++ protection = (*(perp + 2)) & BIT(1); ++ if (protection) { ++ if (pregistrypriv->vcs_type == RTS_CTS) ++ pxmitpriv->vcs = RTS_CTS; ++ else ++ pxmitpriv->vcs = CTS_TO_SELF; ++ } else { ++ pxmitpriv->vcs = NONE_VCS; ++ } ++ } ++ break; ++ } ++ ++} ++ ++void rtw_count_tx_stats(struct adapter *padapter, struct xmit_frame *pxmitframe, int sz) ++{ ++ struct sta_info *psta = NULL; ++ struct stainfo_stats *pstats = NULL; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if ((pxmitframe->frame_tag & 0x0f) == DATA_FRAMETAG) { ++ pxmitpriv->tx_bytes += sz; ++ pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num; ++ ++ psta = pxmitframe->attrib.psta; ++ if (psta) { ++ pstats = &psta->sta_stats; ++ pstats->tx_pkts += pxmitframe->agg_num; ++ pstats->tx_bytes += sz; ++ } ++ } ++} ++ ++struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv) ++{ ++ struct xmit_buf *pxmitbuf = NULL; ++ struct list_head *plist, *phead; ++ struct __queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&pfree_queue->lock, flags); ++ ++ if (list_empty(&pfree_queue->queue)) { ++ pxmitbuf = NULL; ++ } else { ++ phead = get_list_head(pfree_queue); ++ ++ plist = phead->next; ++ ++ pxmitbuf = container_of(plist, struct xmit_buf, list); ++ ++ list_del_init(&pxmitbuf->list); ++ } ++ ++ if (pxmitbuf) { ++ pxmitpriv->free_xmit_extbuf_cnt--; ++ ++ pxmitbuf->priv_data = NULL; ++ /* pxmitbuf->ext_tag = true; */ ++ ++ if (pxmitbuf->sctx) { ++ DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__); ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC); ++ } ++ } ++ ++ spin_unlock_irqrestore(&pfree_queue->lock, flags); ++ ++ return pxmitbuf; ++} ++ ++s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) ++{ ++ struct __queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; ++ unsigned long flags; ++ ++ if (!pxmitbuf) ++ return _FAIL; ++ ++ spin_lock_irqsave(&pfree_queue->lock, flags); ++ ++ list_del_init(&pxmitbuf->list); ++ ++ list_add_tail(&pxmitbuf->list, get_list_head(pfree_queue)); ++ pxmitpriv->free_xmit_extbuf_cnt++; ++ ++ spin_unlock_irqrestore(&pfree_queue->lock, flags); ++ ++ return _SUCCESS; ++} ++ ++struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) ++{ ++ struct xmit_buf *pxmitbuf = NULL; ++ struct list_head *plist, *phead; ++ struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; ++ unsigned long flags; ++ ++ /* DBG_88E("+rtw_alloc_xmitbuf\n"); */ ++ ++ spin_lock_irqsave(&pfree_xmitbuf_queue->lock, flags); ++ ++ if (list_empty(&pfree_xmitbuf_queue->queue)) { ++ pxmitbuf = NULL; ++ } else { ++ phead = get_list_head(pfree_xmitbuf_queue); ++ ++ plist = phead->next; ++ ++ pxmitbuf = container_of(plist, struct xmit_buf, list); ++ ++ list_del_init(&pxmitbuf->list); ++ } ++ ++ if (pxmitbuf) { ++ pxmitpriv->free_xmitbuf_cnt--; ++ pxmitbuf->priv_data = NULL; ++ if (pxmitbuf->sctx) { ++ DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__); ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC); ++ } ++ } ++ spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, flags); ++ ++ return pxmitbuf; ++} ++ ++s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) ++{ ++ struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; ++ unsigned long flags; ++ ++ if (!pxmitbuf) ++ return _FAIL; ++ ++ if (pxmitbuf->sctx) { ++ DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__); ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE); ++ } ++ ++ if (pxmitbuf->ext_tag) { ++ rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf); ++ } else { ++ spin_lock_irqsave(&pfree_xmitbuf_queue->lock, flags); ++ ++ list_del_init(&pxmitbuf->list); ++ ++ list_add_tail(&pxmitbuf->list, get_list_head(pfree_xmitbuf_queue)); ++ ++ pxmitpriv->free_xmitbuf_cnt++; ++ spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, flags); ++ } ++ ++ return _SUCCESS; ++} ++ ++/* ++Calling context: ++1. OS_TXENTRY ++2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) ++ ++If we turn on USE_RXTHREAD, then, no need for critical section. ++Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... ++ ++Must be very very cautious... ++ ++*/ ++ ++struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* _queue *pfree_xmit_queue) */ ++{ ++ /* ++ Please remember to use all the osdep_service api, ++ and lock/unlock or _enter/_exit critical to protect ++ pfree_xmit_queue ++ */ ++ ++ struct xmit_frame *pxframe = NULL; ++ struct list_head *plist, *phead; ++ struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; ++ ++ spin_lock_bh(&pfree_xmit_queue->lock); ++ ++ if (list_empty(&pfree_xmit_queue->queue)) { ++ pxframe = NULL; ++ } else { ++ phead = get_list_head(pfree_xmit_queue); ++ ++ plist = phead->next; ++ ++ pxframe = container_of(plist, struct xmit_frame, list); ++ ++ list_del_init(&pxframe->list); ++ } ++ ++ if (pxframe) { /* default value setting */ ++ pxmitpriv->free_xmitframe_cnt--; ++ ++ pxframe->buf_addr = NULL; ++ pxframe->pxmitbuf = NULL; ++ ++ memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib)); ++ /* pxframe->attrib.psta = NULL; */ ++ ++ pxframe->frame_tag = DATA_FRAMETAG; ++ ++ pxframe->pkt = NULL; ++ pxframe->pkt_offset = 1;/* default use pkt_offset to fill tx desc */ ++ ++ pxframe->agg_num = 1; ++ pxframe->ack_report = 0; ++ } ++ ++ spin_unlock_bh(&pfree_xmit_queue->lock); ++ ++ return pxframe; ++} ++ ++s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) ++{ ++ struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; ++ struct adapter *padapter = pxmitpriv->adapter; ++ struct sk_buff *pndis_pkt = NULL; ++ ++ if (!pxmitframe) ++ goto exit; ++ ++ spin_lock_bh(&pfree_xmit_queue->lock); ++ ++ list_del_init(&pxmitframe->list); ++ ++ if (pxmitframe->pkt) { ++ pndis_pkt = pxmitframe->pkt; ++ pxmitframe->pkt = NULL; ++ } ++ ++ list_add_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue)); ++ ++ pxmitpriv->free_xmitframe_cnt++; ++ ++ spin_unlock_bh(&pfree_xmit_queue->lock); ++ ++ if (pndis_pkt) ++ rtw_os_pkt_complete(padapter, pndis_pkt); ++ ++exit: ++ ++ return _SUCCESS; ++} ++ ++void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, struct __queue *pframequeue) ++{ ++ struct list_head *plist, *phead; ++ struct xmit_frame *pxmitframe; ++ ++ spin_lock_bh(&pframequeue->lock); ++ ++ phead = get_list_head(pframequeue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pxmitframe = container_of(plist, struct xmit_frame, list); ++ ++ plist = plist->next; ++ ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ } ++ spin_unlock_bh(&pframequeue->lock); ++ ++} ++ ++s32 rtw_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) { ++/* pxmitframe->pkt = NULL; */ ++ return _FAIL; ++ } ++ ++ return _SUCCESS; ++} ++ ++static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, struct __queue *pframe_queue) ++{ ++ struct list_head *xmitframe_plist, *xmitframe_phead; ++ struct xmit_frame *pxmitframe = NULL; ++ ++ xmitframe_phead = get_list_head(pframe_queue); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ if (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ list_del_init(&pxmitframe->list); ++ ++ ptxservq->qcnt--; ++ } ++ return pxmitframe; ++} ++ ++struct xmit_frame *rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, int entry) ++{ ++ struct list_head *sta_plist, *sta_phead; ++ struct hw_xmit *phwxmit; ++ struct tx_servq *ptxservq = NULL; ++ struct __queue *pframe_queue = NULL; ++ struct xmit_frame *pxmitframe = NULL; ++ struct adapter *padapter = pxmitpriv->adapter; ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ int i, inx[4]; ++ ++ inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; ++ ++ if (pregpriv->wifi_spec == 1) { ++ int j; ++ ++ for (j = 0; j < 4; j++) ++ inx[j] = pxmitpriv->wmm_para_seq[j]; ++ } ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ for (i = 0; i < entry; i++) { ++ phwxmit = phwxmit_i + inx[i]; ++ ++ sta_phead = get_list_head(phwxmit->sta_queue); ++ sta_plist = sta_phead->next; ++ ++ while (sta_phead != sta_plist) { ++ ptxservq = container_of(sta_plist, struct tx_servq, tx_pending); ++ ++ pframe_queue = &ptxservq->sta_pending; ++ ++ pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue); ++ ++ if (pxmitframe) { ++ phwxmit->accnt--; ++ ++ /* Remove sta node when there are no pending packets. */ ++ if (list_empty(&pframe_queue->queue)) /* must be done after get_next and before break */ ++ list_del_init(&ptxservq->tx_pending); ++ goto exit; ++ } ++ ++ sta_plist = sta_plist->next; ++ } ++ } ++exit: ++ spin_unlock_bh(&pxmitpriv->lock); ++ ++ return pxmitframe; ++} ++ ++struct tx_servq *rtw_get_sta_pending(struct adapter *padapter, struct sta_info *psta, int up, u8 *ac) ++{ ++ struct tx_servq *ptxservq; ++ ++ switch (up) { ++ case 1: ++ case 2: ++ ptxservq = &psta->sta_xmitpriv.bk_q; ++ *(ac) = 3; ++ break; ++ case 4: ++ case 5: ++ ptxservq = &psta->sta_xmitpriv.vi_q; ++ *(ac) = 1; ++ break; ++ case 6: ++ case 7: ++ ptxservq = &psta->sta_xmitpriv.vo_q; ++ *(ac) = 0; ++ break; ++ case 0: ++ case 3: ++ default: ++ ptxservq = &psta->sta_xmitpriv.be_q; ++ *(ac) = 2; ++ break; ++ } ++ ++ return ptxservq; ++} ++ ++/* ++ * Will enqueue pxmitframe to the proper queue, ++ * and indicate it to xx_pending list..... ++ */ ++s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ u8 ac_index; ++ struct sta_info *psta; ++ struct tx_servq *ptxservq; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; ++ int res = _SUCCESS; ++ ++ if (pattrib->psta) { ++ psta = pattrib->psta; ++ } else { ++ psta = rtw_get_stainfo(pstapriv, pattrib->ra); ++ } ++ ++ if (!psta) { ++ res = _FAIL; ++ DBG_88E("rtw_xmit_classifier: psta == NULL\n"); ++ goto exit; ++ } ++ ++ ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); ++ ++ if (list_empty(&ptxservq->tx_pending)) ++ list_add_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue)); ++ ++ list_add_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending)); ++ ptxservq->qcnt++; ++ phwxmits[ac_index].accnt++; ++exit: ++ ++ return res; ++} ++ ++void rtw_alloc_hwxmits(struct adapter *padapter) ++{ ++ struct hw_xmit *hwxmits; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ pxmitpriv->hwxmit_entry = HWXMIT_ENTRY; ++ ++ pxmitpriv->hwxmits = kzalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry, GFP_KERNEL); ++ ++ hwxmits = pxmitpriv->hwxmits; ++ ++ if (pxmitpriv->hwxmit_entry == 5) { ++ hwxmits[0] .sta_queue = &pxmitpriv->bm_pending; ++ hwxmits[1] .sta_queue = &pxmitpriv->vo_pending; ++ hwxmits[2] .sta_queue = &pxmitpriv->vi_pending; ++ hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; ++ hwxmits[4] .sta_queue = &pxmitpriv->be_pending; ++ } else if (pxmitpriv->hwxmit_entry == 4) { ++ hwxmits[0] .sta_queue = &pxmitpriv->vo_pending; ++ hwxmits[1] .sta_queue = &pxmitpriv->vi_pending; ++ hwxmits[2] .sta_queue = &pxmitpriv->be_pending; ++ hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; ++ } else { ++ } ++} ++ ++void rtw_free_hwxmits(struct adapter *padapter) ++{ ++ struct hw_xmit *hwxmits; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ hwxmits = pxmitpriv->hwxmits; ++ kfree(hwxmits); ++} ++ ++void rtw_init_hwxmits(struct hw_xmit *phwxmit, int entry) ++{ ++ int i; ++ ++ for (i = 0; i < entry; i++, phwxmit++) ++ phwxmit->accnt = 0; ++ ++} ++ ++static int rtw_br_client_tx(struct adapter *padapter, struct sk_buff **pskb) ++{ ++ struct sk_buff *skb = *pskb; ++ int res, is_vlan_tag = 0, i, do_nat25 = 1; ++ unsigned short vlan_hdr = 0; ++ void *br_port = NULL; ++ ++ rcu_read_lock(); ++ br_port = rcu_dereference(padapter->pnetdev->rx_handler_data); ++ rcu_read_unlock(); ++ spin_lock_bh(&padapter->br_ext_lock); ++ if (!(skb->data[0] & 1) && br_port && ++ memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) && ++ *((__be16 *)(skb->data + MACADDRLEN * 2)) != __constant_htons(ETH_P_8021Q) && ++ *((__be16 *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP) && ++ !memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) { ++ memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); ++ padapter->scdb_entry->ageing_timer = jiffies; ++ spin_unlock_bh(&padapter->br_ext_lock); ++ } else { ++ if (*((__be16 *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_8021Q)) { ++ is_vlan_tag = 1; ++ vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)); ++ for (i = 0; i < 6; i++) ++ *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2)); ++ skb_pull(skb, 4); ++ } ++ if (!memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) && ++ (*((__be16 *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP))) ++ memcpy(padapter->br_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4); ++ ++ if (*((__be16 *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP)) { ++ if (memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN)) { ++ padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter, ++ skb->data + MACADDRLEN, skb->data + WLAN_ETHHDR_LEN + 12); ++ if (padapter->scdb_entry) { ++ memcpy(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN); ++ memcpy(padapter->scdb_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4); ++ padapter->scdb_entry->ageing_timer = jiffies; ++ do_nat25 = 0; ++ } ++ } else { ++ if (padapter->scdb_entry) { ++ padapter->scdb_entry->ageing_timer = jiffies; ++ do_nat25 = 0; ++ } else { ++ memset(padapter->scdb_mac, 0, MACADDRLEN); ++ memset(padapter->scdb_ip, 0, 4); ++ } ++ } ++ } ++ spin_unlock_bh(&padapter->br_ext_lock); ++ if (do_nat25) { ++ if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) { ++ struct sk_buff *newskb; ++ ++ if (is_vlan_tag) { ++ skb_push(skb, 4); ++ for (i = 0; i < 6; i++) ++ *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2)); ++ *((__be16 *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q); ++ *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr; ++ } ++ ++ newskb = skb_copy(skb, GFP_ATOMIC); ++ if (!newskb) { ++ DEBUG_ERR("TX DROP: skb_copy fail!\n"); ++ return -1; ++ } ++ dev_kfree_skb_any(skb); ++ ++ *pskb = skb = newskb; ++ if (is_vlan_tag) { ++ vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)); ++ for (i = 0; i < 6; i++) ++ *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2)); ++ skb_pull(skb, 4); ++ } ++ } ++ ++ if (skb_is_nonlinear(skb)) ++ DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __func__); ++ ++ res = skb_linearize(skb); ++ if (res < 0) { ++ DEBUG_ERR("TX DROP: skb_linearize fail!\n"); ++ return -1; ++ } ++ ++ res = nat25_db_handle(padapter, skb, NAT25_INSERT); ++ if (res < 0) { ++ if (res == -2) { ++ DEBUG_ERR("TX DROP: nat25_db_handle fail!\n"); ++ return -1; ++ } ++ return 0; ++ } ++ } ++ ++ memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); ++ ++ dhcp_flag_bcast(padapter, skb); ++ ++ if (is_vlan_tag) { ++ skb_push(skb, 4); ++ for (i = 0; i < 6; i++) ++ *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2)); ++ *((__be16 *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q); ++ *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr; ++ } ++ } ++ ++ /* check if SA is equal to our MAC */ ++ if (memcmp(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) { ++ DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n", ++ skb->data[6], skb->data[7], skb->data[8], skb->data[9], skb->data[10], skb->data[11]); ++ return -1; ++ } ++ return 0; ++} ++ ++u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) ++{ ++ u32 addr; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ ++ switch (pattrib->qsel) { ++ case 0: ++ case 3: ++ addr = BE_QUEUE_INX; ++ break; ++ case 1: ++ case 2: ++ addr = BK_QUEUE_INX; ++ break; ++ case 4: ++ case 5: ++ addr = VI_QUEUE_INX; ++ break; ++ case 6: ++ case 7: ++ addr = VO_QUEUE_INX; ++ break; ++ case 0x10: ++ addr = BCN_QUEUE_INX; ++ break; ++ case 0x11:/* BC/MC in PS (HIQ) */ ++ addr = HIGH_QUEUE_INX; ++ break; ++ case 0x12: ++ default: ++ addr = MGT_QUEUE_INX; ++ break; ++ } ++ ++ return addr; ++} ++ ++static void do_queue_select(struct adapter *padapter, struct pkt_attrib *pattrib) ++{ ++ u8 qsel; ++ ++ qsel = pattrib->priority; ++ ++ pattrib->qsel = qsel; ++} ++ ++/* ++ * The main transmit(tx) entry ++ * ++ * Return ++ * 1 enqueue ++ * 0 success, hardware will handle this xmit frame(packet) ++ * <0 fail ++ */ ++s32 rtw_xmit(struct adapter *padapter, struct sk_buff **ppkt) ++{ ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct xmit_frame *pxmitframe = NULL; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ void *br_port = NULL; ++ s32 res; ++ ++ pxmitframe = rtw_alloc_xmitframe(pxmitpriv); ++ if (!pxmitframe) { ++ DBG_88E("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __func__); ++ return -1; ++ } ++ ++ rcu_read_lock(); ++ br_port = rcu_dereference(padapter->pnetdev->rx_handler_data); ++ rcu_read_unlock(); ++ ++ if (br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE)) { ++ res = rtw_br_client_tx(padapter, ppkt); ++ if (res == -1) { ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ return -1; ++ } ++ } ++ ++ res = update_attrib(padapter, *ppkt, &pxmitframe->attrib); ++ ++ if (res == _FAIL) { ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ return -1; ++ } ++ pxmitframe->pkt = *ppkt; ++ ++ rtw_led_control(padapter, LED_CTL_TX); ++ ++ do_queue_select(padapter, &pxmitframe->attrib); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ spin_lock_bh(&pxmitpriv->lock); ++ if (xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)) { ++ spin_unlock_bh(&pxmitpriv->lock); ++ return 1; ++ } ++ spin_unlock_bh(&pxmitpriv->lock); ++#endif ++ ++ if (!rtw_hal_xmit(padapter, pxmitframe)) ++ return 1; ++ ++ return 0; ++} ++ ++#if defined(CONFIG_88EU_AP_MODE) ++ ++int xmitframe_enqueue_for_sleeping_sta(struct adapter *padapter, struct xmit_frame *pxmitframe) ++{ ++ int ret = false; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ bool bmcst = is_multicast_ether_addr(pattrib->ra); ++ ++ if (!check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ return ret; ++ ++ if (pattrib->psta) ++ psta = pattrib->psta; ++ else ++ psta = rtw_get_stainfo(pstapriv, pattrib->ra); ++ ++ if (!psta) ++ return ret; ++ ++ if (pattrib->triggered == 1) { ++ if (bmcst) ++ pattrib->qsel = 0x11;/* HIQ */ ++ return ret; ++ } ++ ++ if (bmcst) { ++ spin_lock_bh(&psta->sleep_q.lock); ++ ++ if (pstapriv->sta_dz_bitmap) {/* if any one sta is in ps mode */ ++ list_del_init(&pxmitframe->list); ++ ++ list_add_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); ++ ++ psta->sleepq_len++; ++ ++ pstapriv->tim_bitmap |= BIT(0);/* */ ++ pstapriv->sta_dz_bitmap |= BIT(0); ++ ++ update_beacon(padapter, _TIM_IE_, NULL, false);/* tx bc/mc packets after upate bcn */ ++ ++ ret = true; ++ } ++ ++ spin_unlock_bh(&psta->sleep_q.lock); ++ ++ return ret; ++ } ++ ++ spin_lock_bh(&psta->sleep_q.lock); ++ ++ if (psta->state & WIFI_SLEEP_STATE) { ++ u8 wmmps_ac = 0; ++ ++ if (pstapriv->sta_dz_bitmap & BIT(psta->aid)) { ++ list_del_init(&pxmitframe->list); ++ ++ list_add_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); ++ ++ psta->sleepq_len++; ++ ++ switch (pattrib->priority) { ++ case 1: ++ case 2: ++ wmmps_ac = psta->uapsd_bk & BIT(0); ++ break; ++ case 4: ++ case 5: ++ wmmps_ac = psta->uapsd_vi & BIT(0); ++ break; ++ case 6: ++ case 7: ++ wmmps_ac = psta->uapsd_vo & BIT(0); ++ break; ++ case 0: ++ case 3: ++ default: ++ wmmps_ac = psta->uapsd_be & BIT(0); ++ break; ++ } ++ ++ if (wmmps_ac) ++ psta->sleepq_ac_len++; ++ ++ if (((psta->has_legacy_ac) && (!wmmps_ac)) || ++ ((!psta->has_legacy_ac) && (wmmps_ac))) { ++ pstapriv->tim_bitmap |= BIT(psta->aid); ++ ++ if (psta->sleepq_len == 1) { ++ /* upate BCN for TIM IE */ ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ } ++ } ++ ret = true; ++ } ++ } ++ ++ spin_unlock_bh(&psta->sleep_q.lock); ++ ++ return ret; ++} ++ ++static void dequeue_xmitframes_to_sleeping_queue(struct adapter *padapter, struct sta_info *psta, struct __queue *pframequeue) ++{ ++ struct list_head *plist, *phead; ++ u8 ac_index; ++ struct tx_servq *ptxservq; ++ struct pkt_attrib *pattrib; ++ struct xmit_frame *pxmitframe; ++ struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; ++ ++ phead = get_list_head(pframequeue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pxmitframe = container_of(plist, struct xmit_frame, list); ++ ++ plist = plist->next; ++ ++ xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe); ++ ++ pattrib = &pxmitframe->attrib; ++ ++ ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); ++ ++ ptxservq->qcnt--; ++ phwxmits[ac_index].accnt--; ++ } ++} ++ ++void stop_sta_xmit(struct adapter *padapter, struct sta_info *psta) ++{ ++ struct sta_info *psta_bmc; ++ struct sta_xmit_priv *pstaxmitpriv; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ pstaxmitpriv = &psta->sta_xmitpriv; ++ ++ /* for BC/MC Frames */ ++ psta_bmc = rtw_get_bcmc_stainfo(padapter); ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ psta->state |= WIFI_SLEEP_STATE; ++ ++ pstapriv->sta_dz_bitmap |= BIT(psta->aid); ++ ++ dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending); ++ list_del_init(&pstaxmitpriv->vo_q.tx_pending); ++ ++ dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending); ++ list_del_init(&pstaxmitpriv->vi_q.tx_pending); ++ ++ dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending); ++ list_del_init(&pstaxmitpriv->be_q.tx_pending); ++ ++ dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending); ++ list_del_init(&pstaxmitpriv->bk_q.tx_pending); ++ ++ /* for BC/MC Frames */ ++ pstaxmitpriv = &psta_bmc->sta_xmitpriv; ++ dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending); ++ list_del_init(&pstaxmitpriv->be_q.tx_pending); ++ ++ spin_unlock_bh(&pxmitpriv->lock); ++} ++ ++void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta) ++{ ++ u8 update_mask = 0, wmmps_ac = 0; ++ struct sta_info *psta_bmc; ++ struct list_head *xmitframe_plist, *xmitframe_phead; ++ struct xmit_frame *pxmitframe = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ spin_lock_bh(&psta->sleep_q.lock); ++ ++ xmitframe_phead = get_list_head(&psta->sleep_q); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ while (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ list_del_init(&pxmitframe->list); ++ ++ switch (pxmitframe->attrib.priority) { ++ case 1: ++ case 2: ++ wmmps_ac = psta->uapsd_bk & BIT(1); ++ break; ++ case 4: ++ case 5: ++ wmmps_ac = psta->uapsd_vi & BIT(1); ++ break; ++ case 6: ++ case 7: ++ wmmps_ac = psta->uapsd_vo & BIT(1); ++ break; ++ case 0: ++ case 3: ++ default: ++ wmmps_ac = psta->uapsd_be & BIT(1); ++ break; ++ } ++ ++ psta->sleepq_len--; ++ if (psta->sleepq_len > 0) ++ pxmitframe->attrib.mdata = 1; ++ else ++ pxmitframe->attrib.mdata = 0; ++ ++ if (wmmps_ac) { ++ psta->sleepq_ac_len--; ++ if (psta->sleepq_ac_len > 0) { ++ pxmitframe->attrib.mdata = 1; ++ pxmitframe->attrib.eosp = 0; ++ } else { ++ pxmitframe->attrib.mdata = 0; ++ pxmitframe->attrib.eosp = 1; ++ } ++ } ++ ++ pxmitframe->attrib.triggered = 1; ++ ++ spin_unlock_bh(&psta->sleep_q.lock); ++ if (rtw_hal_xmit(padapter, pxmitframe)) ++ rtw_os_xmit_complete(padapter, pxmitframe); ++ spin_lock_bh(&psta->sleep_q.lock); ++ } ++ ++ if (psta->sleepq_len == 0) { ++ pstapriv->tim_bitmap &= ~BIT(psta->aid); ++ ++ update_mask = BIT(0); ++ ++ if (psta->state & WIFI_SLEEP_STATE) ++ psta->state ^= WIFI_SLEEP_STATE; ++ ++ if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { ++ psta->expire_to = pstapriv->expire_to; ++ psta->state ^= WIFI_STA_ALIVE_CHK_STATE; ++ } ++ ++ pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); ++ } ++ ++ spin_unlock_bh(&psta->sleep_q.lock); ++ ++ /* for BC/MC Frames */ ++ psta_bmc = rtw_get_bcmc_stainfo(padapter); ++ if (!psta_bmc) ++ return; ++ ++ if ((pstapriv->sta_dz_bitmap & 0xfffe) == 0x0) { /* no any sta in ps mode */ ++ spin_lock_bh(&psta_bmc->sleep_q.lock); ++ ++ xmitframe_phead = get_list_head(&psta_bmc->sleep_q); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ while (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ list_del_init(&pxmitframe->list); ++ ++ psta_bmc->sleepq_len--; ++ if (psta_bmc->sleepq_len > 0) ++ pxmitframe->attrib.mdata = 1; ++ else ++ pxmitframe->attrib.mdata = 0; ++ ++ pxmitframe->attrib.triggered = 1; ++ ++ spin_unlock_bh(&psta_bmc->sleep_q.lock); ++ if (rtw_hal_xmit(padapter, pxmitframe)) ++ rtw_os_xmit_complete(padapter, pxmitframe); ++ spin_lock_bh(&psta_bmc->sleep_q.lock); ++ } ++ ++ if (psta_bmc->sleepq_len == 0) { ++ pstapriv->tim_bitmap &= ~BIT(0); ++ pstapriv->sta_dz_bitmap &= ~BIT(0); ++ ++ update_mask |= BIT(1); ++ } ++ ++ spin_unlock_bh(&psta_bmc->sleep_q.lock); ++ } ++ ++ if (update_mask) ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++} ++ ++void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *psta) ++{ ++ u8 wmmps_ac = 0; ++ struct list_head *xmitframe_plist, *xmitframe_phead; ++ struct xmit_frame *pxmitframe = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ spin_lock_bh(&psta->sleep_q.lock); ++ ++ xmitframe_phead = get_list_head(&psta->sleep_q); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ while (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ ++ xmitframe_plist = xmitframe_plist->next; ++ ++ switch (pxmitframe->attrib.priority) { ++ case 1: ++ case 2: ++ wmmps_ac = psta->uapsd_bk & BIT(1); ++ break; ++ case 4: ++ case 5: ++ wmmps_ac = psta->uapsd_vi & BIT(1); ++ break; ++ case 6: ++ case 7: ++ wmmps_ac = psta->uapsd_vo & BIT(1); ++ break; ++ case 0: ++ case 3: ++ default: ++ wmmps_ac = psta->uapsd_be & BIT(1); ++ break; ++ } ++ ++ if (!wmmps_ac) ++ continue; ++ ++ list_del_init(&pxmitframe->list); ++ ++ psta->sleepq_len--; ++ psta->sleepq_ac_len--; ++ ++ if (psta->sleepq_ac_len > 0) { ++ pxmitframe->attrib.mdata = 1; ++ pxmitframe->attrib.eosp = 0; ++ } else { ++ pxmitframe->attrib.mdata = 0; ++ pxmitframe->attrib.eosp = 1; ++ } ++ ++ pxmitframe->attrib.triggered = 1; ++ ++ if (rtw_hal_xmit(padapter, pxmitframe)) ++ rtw_os_xmit_complete(padapter, pxmitframe); ++ ++ if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) && (wmmps_ac)) { ++ pstapriv->tim_bitmap &= ~BIT(psta->aid); ++ ++ /* upate BCN for TIM IE */ ++ update_beacon(padapter, _TIM_IE_, NULL, false); ++ } ++ } ++ ++ spin_unlock_bh(&psta->sleep_q.lock); ++} ++ ++#endif ++ ++void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms) ++{ ++ sctx->timeout_ms = timeout_ms; ++ sctx->submit_time = jiffies; ++ init_completion(&sctx->done); ++ sctx->status = RTW_SCTX_SUBMITTED; ++} ++ ++int rtw_sctx_wait(struct submit_ctx *sctx) ++{ ++ int ret = _FAIL; ++ unsigned long expire; ++ int status = 0; ++ ++ expire = sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT; ++ if (!wait_for_completion_timeout(&sctx->done, expire)) { ++ /* timeout, do something?? */ ++ status = RTW_SCTX_DONE_TIMEOUT; ++ DBG_88E("%s timeout\n", __func__); ++ } else { ++ status = sctx->status; ++ } ++ ++ if (status == RTW_SCTX_DONE_SUCCESS) ++ ret = _SUCCESS; ++ ++ return ret; ++} ++ ++static bool rtw_sctx_chk_waring_status(int status) ++{ ++ switch (status) { ++ case RTW_SCTX_DONE_UNKNOWN: ++ case RTW_SCTX_DONE_BUF_ALLOC: ++ case RTW_SCTX_DONE_BUF_FREE: ++ ++ case RTW_SCTX_DONE_DRV_STOP: ++ case RTW_SCTX_DONE_DEV_REMOVE: ++ return true; ++ default: ++ return false; ++ } ++} ++ ++void rtw_sctx_done_err(struct submit_ctx **sctx, int status) ++{ ++ if (*sctx) { ++ if (rtw_sctx_chk_waring_status(status)) ++ DBG_88E("%s status:%d\n", __func__, status); ++ (*sctx)->status = status; ++ complete(&((*sctx)->done)); ++ *sctx = NULL; ++ } ++} ++ ++void rtw_sctx_done(struct submit_ctx **sctx) ++{ ++ rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS); ++} ++ ++int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms) ++{ ++ struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops; ++ ++ pack_tx_ops->submit_time = jiffies; ++ pack_tx_ops->timeout_ms = timeout_ms; ++ pack_tx_ops->status = RTW_SCTX_SUBMITTED; ++ ++ return rtw_sctx_wait(pack_tx_ops); ++} ++ ++void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status) ++{ ++ struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops; ++ ++ if (pxmitpriv->ack_tx) ++ rtw_sctx_done_err(&pack_tx_ops, status); ++ else ++ DBG_88E("%s ack_tx not set\n", __func__); ++} +diff --git a/drivers/staging/r8188eu/hal/Hal8188EPwrSeq.c b/drivers/staging/r8188eu/hal/Hal8188EPwrSeq.c +new file mode 100644 +index 000000000000..48ede610cd28 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/Hal8188EPwrSeq.c +@@ -0,0 +1,69 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/Hal8188EPwrSeq.h" ++#include "../include/rtl8188e_hal.h" ++ ++/* ++ drivers should parse below arrays and do the corresponding actions ++*/ ++/* 3 Power on Array */ ++struct wl_pwr_cfg rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_CARDEMU_TO_ACT ++ RTL8188E_TRANS_END ++}; ++ ++/* 3Radio off Array */ ++struct wl_pwr_cfg rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_ACT_TO_CARDEMU ++ RTL8188E_TRANS_END ++}; ++ ++/* 3Card Disable Array */ ++struct wl_pwr_cfg rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_ACT_TO_CARDEMU ++ RTL8188E_TRANS_CARDEMU_TO_CARDDIS ++ RTL8188E_TRANS_END ++}; ++ ++/* 3 Card Enable Array */ ++struct wl_pwr_cfg rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_CARDDIS_TO_CARDEMU ++ RTL8188E_TRANS_CARDEMU_TO_ACT ++ RTL8188E_TRANS_END ++}; ++ ++/* 3Suspend Array */ ++struct wl_pwr_cfg rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_ACT_TO_CARDEMU ++ RTL8188E_TRANS_CARDEMU_TO_SUS ++ RTL8188E_TRANS_END ++}; ++ ++/* 3 Resume Array */ ++struct wl_pwr_cfg rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_SUS_TO_CARDEMU ++ RTL8188E_TRANS_CARDEMU_TO_ACT ++ RTL8188E_TRANS_END ++}; ++ ++/* 3HWPDN Array */ ++struct wl_pwr_cfg rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ RTL8188E_TRANS_ACT_TO_CARDEMU ++ RTL8188E_TRANS_CARDEMU_TO_PDN ++ RTL8188E_TRANS_END ++}; ++ ++/* 3 Enter LPS */ ++struct wl_pwr_cfg rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ /* FW behavior */ ++ RTL8188E_TRANS_ACT_TO_LPS ++ RTL8188E_TRANS_END ++}; ++ ++/* 3 Leave LPS */ ++struct wl_pwr_cfg rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS + RTL8188E_TRANS_END_STEPS] = { ++ /* FW behavior */ ++ RTL8188E_TRANS_LPS_TO_ACT ++ RTL8188E_TRANS_END ++}; +diff --git a/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c b/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c +new file mode 100644 +index 000000000000..d873672feb27 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c +@@ -0,0 +1,664 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright (c) Realtek Semiconductor Corp. ++Module Name: ++ RateAdaptive.c ++ ++Abstract: ++ Implement Rate Adaptive functions for common operations. ++ ++Major Change History: ++ When Who What ++ ---------- --------------- ------------------------------- ++ 2011-08-12 Page Create. ++ ++--*/ ++#include "../include/odm_precomp.h" ++ ++/* Rate adaptive parameters */ ++ ++static u8 RETRY_PENALTY[PERENTRY][RETRYSIZE + 1] = { ++ {5, 4, 3, 2, 0, 3}, /* 92 , idx = 0 */ ++ {6, 5, 4, 3, 0, 4}, /* 86 , idx = 1 */ ++ {6, 5, 4, 2, 0, 4}, /* 81 , idx = 2 */ ++ {8, 7, 6, 4, 0, 6}, /* 75 , idx = 3 */ ++ {10, 9, 8, 6, 0, 8}, /* 71 , idx = 4 */ ++ {10, 9, 8, 4, 0, 8}, /* 66 , idx = 5 */ ++ {10, 9, 8, 2, 0, 8}, /* 62 , idx = 6 */ ++ {10, 9, 8, 0, 0, 8}, /* 59 , idx = 7 */ ++ {18, 17, 16, 8, 0, 16}, /* 53 , idx = 8 */ ++ {26, 25, 24, 16, 0, 24}, /* 50 , idx = 9 */ ++ {34, 33, 32, 24, 0, 32}, /* 47 , idx = 0x0a */ ++ {34, 31, 28, 20, 0, 32}, /* 43 , idx = 0x0b */ ++ {34, 31, 27, 18, 0, 32}, /* 40 , idx = 0x0c */ ++ {34, 31, 26, 16, 0, 32}, /* 37 , idx = 0x0d */ ++ {34, 30, 22, 16, 0, 32}, /* 32 , idx = 0x0e */ ++ {34, 30, 24, 16, 0, 32}, /* 26 , idx = 0x0f */ ++ {49, 46, 40, 16, 0, 48}, /* 20 , idx = 0x10 */ ++ {49, 45, 32, 0, 0, 48}, /* 17 , idx = 0x11 */ ++ {49, 45, 22, 18, 0, 48}, /* 15 , idx = 0x12 */ ++ {49, 40, 24, 16, 0, 48}, /* 12 , idx = 0x13 */ ++ {49, 32, 18, 12, 0, 48}, /* 9 , idx = 0x14 */ ++ {49, 22, 18, 14, 0, 48}, /* 6 , idx = 0x15 */ ++ {49, 16, 16, 0, 0, 48} ++ }; /* 3, idx = 0x16 */ ++ ++static u8 PT_PENALTY[RETRYSIZE + 1] = {34, 31, 30, 24, 0, 32}; ++ ++/* wilson modify */ ++static u8 RETRY_PENALTY_IDX[2][RATESIZE] = { ++ {4, 4, 4, 5, 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */ ++ 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d, ++ 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f}, /* 0329 R01 */ ++ {0x0a, 0x0a, 0x0b, 0x0c, 0x0a, ++ 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x14, /* SSTH */ ++ 0x0f, 0x10, 0x10, 0x12, 0x12, 0x13, 0x14, 0x15, ++ 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15}; ++ ++static u8 RSSI_THRESHOLD[RATESIZE] = { ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0x24, 0x26, 0x2a, ++ 0x18, 0x1a, 0x1d, 0x1f, 0x21, 0x27, 0x29, 0x2a, ++ 0, 0, 0, 0x1f, 0x23, 0x28, 0x2a, 0x2c}; ++ ++static u16 N_THRESHOLD_HIGH[RATESIZE] = { ++ 4, 4, 8, 16, ++ 24, 36, 48, 72, 96, 144, 192, 216, ++ 60, 80, 100, 160, 240, 400, 560, 640, ++ 300, 320, 480, 720, 1000, 1200, 1600, 2000}; ++static u16 N_THRESHOLD_LOW[RATESIZE] = { ++ 2, 2, 4, 8, ++ 12, 18, 24, 36, 48, 72, 96, 108, ++ 30, 40, 50, 80, 120, 200, 280, 320, ++ 150, 160, 240, 360, 500, 600, 800, 1000}; ++ ++static u8 DROPING_NECESSARY[RATESIZE] = { ++ 1, 1, 1, 1, ++ 1, 2, 3, 4, 5, 6, 7, 8, ++ 1, 2, 3, 4, 5, 6, 7, 8, ++ 5, 6, 7, 8, 9, 10, 11, 12}; ++ ++static u8 PendingForRateUpFail[5] = {2, 10, 24, 40, 60}; ++static u16 DynamicTxRPTTiming[6] = { ++ 0x186a, 0x30d4, 0x493e, 0x61a8, 0x7a12, 0x927c}; /* 200ms-1200ms */ ++ ++/* End Rate adaptive parameters */ ++ ++static void odm_SetTxRPTTiming_8188E( ++ struct odm_dm_struct *dm_odm, ++ struct odm_ra_info *pRaInfo, ++ u8 extend ++ ) ++{ ++ u8 idx = 0; ++ ++ for (idx = 0; idx < 5; idx++) ++ if (DynamicTxRPTTiming[idx] == pRaInfo->RptTime) ++ break; ++ ++ if (extend == 0) { /* back to default timing */ ++ idx = 0; /* 200ms */ ++ } else if (extend == 1) {/* increase the timing */ ++ idx += 1; ++ if (idx > 5) ++ idx = 5; ++ } else if (extend == 2) {/* decrease the timing */ ++ if (idx != 0) ++ idx -= 1; ++ } ++ pRaInfo->RptTime = DynamicTxRPTTiming[idx]; ++} ++ ++static int odm_RateDown_8188E(struct odm_dm_struct *dm_odm, struct odm_ra_info *pRaInfo) ++{ ++ u8 RateID, LowestRate, HighestRate; ++ u8 i; ++ ++ if (NULL == pRaInfo) ++ return -1; ++ RateID = pRaInfo->PreRate; ++ LowestRate = pRaInfo->LowestRate; ++ HighestRate = pRaInfo->HighestRate; ++ ++ if (RateID > HighestRate) { ++ RateID = HighestRate; ++ } else if (pRaInfo->RateSGI) { ++ pRaInfo->RateSGI = 0; ++ } else if (RateID > LowestRate) { ++ if (RateID > 0) { ++ for (i = RateID - 1; i > LowestRate; i--) { ++ if (pRaInfo->RAUseRate & BIT(i)) { ++ RateID = i; ++ goto RateDownFinish; ++ } ++ } ++ } ++ } else if (RateID <= LowestRate) { ++ RateID = LowestRate; ++ } ++RateDownFinish: ++ if (pRaInfo->RAWaitingCounter == 1) { ++ pRaInfo->RAWaitingCounter += 1; ++ pRaInfo->RAPendingCounter += 1; ++ } else if (pRaInfo->RAWaitingCounter == 0) { ++ ; ++ } else { ++ pRaInfo->RAWaitingCounter = 0; ++ pRaInfo->RAPendingCounter = 0; ++ } ++ ++ if (pRaInfo->RAPendingCounter >= 4) ++ pRaInfo->RAPendingCounter = 4; ++ ++ pRaInfo->DecisionRate = RateID; ++ odm_SetTxRPTTiming_8188E(dm_odm, pRaInfo, 2); ++ return 0; ++} ++ ++static int odm_RateUp_8188E( ++ struct odm_dm_struct *dm_odm, ++ struct odm_ra_info *pRaInfo ++ ) ++{ ++ u8 RateID, HighestRate; ++ u8 i; ++ ++ if (NULL == pRaInfo) ++ return -1; ++ RateID = pRaInfo->PreRate; ++ HighestRate = pRaInfo->HighestRate; ++ if (pRaInfo->RAWaitingCounter == 1) { ++ pRaInfo->RAWaitingCounter = 0; ++ pRaInfo->RAPendingCounter = 0; ++ } else if (pRaInfo->RAWaitingCounter > 1) { ++ pRaInfo->PreRssiStaRA = pRaInfo->RssiStaRA; ++ goto RateUpfinish; ++ } ++ odm_SetTxRPTTiming_8188E(dm_odm, pRaInfo, 0); ++ ++ if (RateID < HighestRate) { ++ for (i = RateID + 1; i <= HighestRate; i++) { ++ if (pRaInfo->RAUseRate & BIT(i)) { ++ RateID = i; ++ goto RateUpfinish; ++ } ++ } ++ } else if (RateID == HighestRate) { ++ if (pRaInfo->SGIEnable && (pRaInfo->RateSGI != 1)) ++ pRaInfo->RateSGI = 1; ++ else if ((pRaInfo->SGIEnable) != 1) ++ pRaInfo->RateSGI = 0; ++ } else { ++ RateID = HighestRate; ++ } ++RateUpfinish: ++ if (pRaInfo->RAWaitingCounter == (4 + PendingForRateUpFail[pRaInfo->RAPendingCounter])) ++ pRaInfo->RAWaitingCounter = 0; ++ else ++ pRaInfo->RAWaitingCounter++; ++ ++ pRaInfo->DecisionRate = RateID; ++ return 0; ++} ++ ++static void odm_ResetRaCounter_8188E(struct odm_ra_info *pRaInfo) ++{ ++ u8 RateID; ++ ++ RateID = pRaInfo->DecisionRate; ++ pRaInfo->NscUp = (N_THRESHOLD_HIGH[RateID] + N_THRESHOLD_LOW[RateID]) >> 1; ++ pRaInfo->NscDown = (N_THRESHOLD_HIGH[RateID] + N_THRESHOLD_LOW[RateID]) >> 1; ++} ++ ++static void odm_RateDecision_8188E(struct odm_dm_struct *dm_odm, ++ struct odm_ra_info *pRaInfo ++ ) ++{ ++ u8 RateID = 0, RtyPtID = 0, PenaltyID1 = 0, PenaltyID2 = 0; ++ /* u32 pool_retry; */ ++ static u8 DynamicTxRPTTimingCounter; ++ ++ if (pRaInfo->Active && (pRaInfo->TOTAL > 0)) { /* STA used and data packet exits */ ++ if ((pRaInfo->RssiStaRA < (pRaInfo->PreRssiStaRA - 3)) || ++ (pRaInfo->RssiStaRA > (pRaInfo->PreRssiStaRA + 3))) { ++ pRaInfo->RAWaitingCounter = 0; ++ pRaInfo->RAPendingCounter = 0; ++ } ++ /* Start RA decision */ ++ if (pRaInfo->PreRate > pRaInfo->HighestRate) ++ RateID = pRaInfo->HighestRate; ++ else ++ RateID = pRaInfo->PreRate; ++ if (pRaInfo->RssiStaRA > RSSI_THRESHOLD[RateID]) ++ RtyPtID = 0; ++ else ++ RtyPtID = 1; ++ PenaltyID1 = RETRY_PENALTY_IDX[RtyPtID][RateID]; /* TODO by page */ ++ ++ pRaInfo->NscDown += pRaInfo->RTY[0] * RETRY_PENALTY[PenaltyID1][0]; ++ pRaInfo->NscDown += pRaInfo->RTY[1] * RETRY_PENALTY[PenaltyID1][1]; ++ pRaInfo->NscDown += pRaInfo->RTY[2] * RETRY_PENALTY[PenaltyID1][2]; ++ pRaInfo->NscDown += pRaInfo->RTY[3] * RETRY_PENALTY[PenaltyID1][3]; ++ pRaInfo->NscDown += pRaInfo->RTY[4] * RETRY_PENALTY[PenaltyID1][4]; ++ if (pRaInfo->NscDown > (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID1][5])) ++ pRaInfo->NscDown -= pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID1][5]; ++ else ++ pRaInfo->NscDown = 0; ++ ++ /* rate up */ ++ PenaltyID2 = RETRY_PENALTY_UP_IDX[RateID]; ++ pRaInfo->NscUp += pRaInfo->RTY[0] * RETRY_PENALTY[PenaltyID2][0]; ++ pRaInfo->NscUp += pRaInfo->RTY[1] * RETRY_PENALTY[PenaltyID2][1]; ++ pRaInfo->NscUp += pRaInfo->RTY[2] * RETRY_PENALTY[PenaltyID2][2]; ++ pRaInfo->NscUp += pRaInfo->RTY[3] * RETRY_PENALTY[PenaltyID2][3]; ++ pRaInfo->NscUp += pRaInfo->RTY[4] * RETRY_PENALTY[PenaltyID2][4]; ++ if (pRaInfo->NscUp > (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID2][5])) ++ pRaInfo->NscUp -= pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID2][5]; ++ else ++ pRaInfo->NscUp = 0; ++ ++ if ((pRaInfo->NscDown < N_THRESHOLD_LOW[RateID]) || ++ (pRaInfo->DROP > DROPING_NECESSARY[RateID])) ++ odm_RateDown_8188E(dm_odm, pRaInfo); ++ else if (pRaInfo->NscUp > N_THRESHOLD_HIGH[RateID]) ++ odm_RateUp_8188E(dm_odm, pRaInfo); ++ ++ if (pRaInfo->DecisionRate > pRaInfo->HighestRate) ++ pRaInfo->DecisionRate = pRaInfo->HighestRate; ++ ++ if ((pRaInfo->DecisionRate) == (pRaInfo->PreRate)) ++ DynamicTxRPTTimingCounter += 1; ++ else ++ DynamicTxRPTTimingCounter = 0; ++ ++ if (DynamicTxRPTTimingCounter >= 4) { ++ odm_SetTxRPTTiming_8188E(dm_odm, pRaInfo, 1); ++ DynamicTxRPTTimingCounter = 0; ++ } ++ ++ pRaInfo->PreRate = pRaInfo->DecisionRate; /* YJ, add, 120120 */ ++ ++ odm_ResetRaCounter_8188E(pRaInfo); ++ } ++} ++ ++static int odm_ARFBRefresh_8188E(struct odm_dm_struct *dm_odm, struct odm_ra_info *pRaInfo) ++{ /* Wilson 2011/10/26 */ ++ u32 MaskFromReg; ++ s8 i; ++ ++ switch (pRaInfo->RateID) { ++ case RATR_INX_WIRELESS_NGB: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0f8ff015; ++ break; ++ case RATR_INX_WIRELESS_NG: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0f8ff010; ++ break; ++ case RATR_INX_WIRELESS_NB: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0f8ff005; ++ break; ++ case RATR_INX_WIRELESS_N: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0f8ff000; ++ break; ++ case RATR_INX_WIRELESS_GB: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x00000ff5; ++ break; ++ case RATR_INX_WIRELESS_G: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x00000ff0; ++ break; ++ case RATR_INX_WIRELESS_B: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0000000d; ++ break; ++ case 12: ++ MaskFromReg = ODM_Read4Byte(dm_odm, REG_ARFR0); ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; ++ break; ++ case 13: ++ MaskFromReg = ODM_Read4Byte(dm_odm, REG_ARFR1); ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; ++ break; ++ case 14: ++ MaskFromReg = ODM_Read4Byte(dm_odm, REG_ARFR2); ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; ++ break; ++ case 15: ++ MaskFromReg = ODM_Read4Byte(dm_odm, REG_ARFR3); ++ pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; ++ break; ++ default: ++ pRaInfo->RAUseRate = (pRaInfo->RateMask); ++ break; ++ } ++ /* Highest rate */ ++ if (pRaInfo->RAUseRate) { ++ for (i = RATESIZE; i >= 0; i--) { ++ if ((pRaInfo->RAUseRate) & BIT(i)) { ++ pRaInfo->HighestRate = i; ++ break; ++ } ++ } ++ } else { ++ pRaInfo->HighestRate = 0; ++ } ++ /* Lowest rate */ ++ if (pRaInfo->RAUseRate) { ++ for (i = 0; i < RATESIZE; i++) { ++ if ((pRaInfo->RAUseRate) & BIT(i)) { ++ pRaInfo->LowestRate = i; ++ break; ++ } ++ } ++ } else { ++ pRaInfo->LowestRate = 0; ++ } ++ if (pRaInfo->HighestRate > 0x13) ++ pRaInfo->PTModeSS = 3; ++ else if (pRaInfo->HighestRate > 0x0b) ++ pRaInfo->PTModeSS = 2; ++ else if (pRaInfo->HighestRate > 0x03) ++ pRaInfo->PTModeSS = 1; ++ else ++ pRaInfo->PTModeSS = 0; ++ ++ if (pRaInfo->DecisionRate > pRaInfo->HighestRate) ++ pRaInfo->DecisionRate = pRaInfo->HighestRate; ++ ++ return 0; ++} ++ ++static void odm_PTTryState_8188E(struct odm_ra_info *pRaInfo) ++{ ++ pRaInfo->PTTryState = 0; ++ switch (pRaInfo->PTModeSS) { ++ case 3: ++ if (pRaInfo->DecisionRate >= 0x19) ++ pRaInfo->PTTryState = 1; ++ break; ++ case 2: ++ if (pRaInfo->DecisionRate >= 0x11) ++ pRaInfo->PTTryState = 1; ++ break; ++ case 1: ++ if (pRaInfo->DecisionRate >= 0x0a) ++ pRaInfo->PTTryState = 1; ++ break; ++ case 0: ++ if (pRaInfo->DecisionRate >= 0x03) ++ pRaInfo->PTTryState = 1; ++ break; ++ default: ++ pRaInfo->PTTryState = 0; ++ break; ++ } ++ ++ if (pRaInfo->RssiStaRA < 48) { ++ pRaInfo->PTStage = 0; ++ } else if (pRaInfo->PTTryState == 1) { ++ if ((pRaInfo->PTStopCount >= 10) || ++ (pRaInfo->PTPreRssi > pRaInfo->RssiStaRA + 5) || ++ (pRaInfo->PTPreRssi < pRaInfo->RssiStaRA - 5) || ++ (pRaInfo->DecisionRate != pRaInfo->PTPreRate)) { ++ if (pRaInfo->PTStage == 0) ++ pRaInfo->PTStage = 1; ++ else if (pRaInfo->PTStage == 1) ++ pRaInfo->PTStage = 3; ++ else ++ pRaInfo->PTStage = 5; ++ ++ pRaInfo->PTPreRssi = pRaInfo->RssiStaRA; ++ pRaInfo->PTStopCount = 0; ++ } else { ++ pRaInfo->RAstage = 0; ++ pRaInfo->PTStopCount++; ++ } ++ } else { ++ pRaInfo->PTStage = 0; ++ pRaInfo->RAstage = 0; ++ } ++ pRaInfo->PTPreRate = pRaInfo->DecisionRate; ++} ++ ++static void odm_PTDecision_8188E(struct odm_ra_info *pRaInfo) ++{ ++ u8 j; ++ u8 temp_stage; ++ u32 numsc; ++ u32 num_total; ++ u8 stage_id; ++ ++ numsc = 0; ++ num_total = pRaInfo->TOTAL * PT_PENALTY[5]; ++ for (j = 0; j <= 4; j++) { ++ numsc += pRaInfo->RTY[j] * PT_PENALTY[j]; ++ if (numsc > num_total) ++ break; ++ } ++ ++ j = j >> 1; ++ temp_stage = (pRaInfo->PTStage + 1) >> 1; ++ if (temp_stage > j) ++ stage_id = temp_stage - j; ++ else ++ stage_id = 0; ++ ++ pRaInfo->PTSmoothFactor = (pRaInfo->PTSmoothFactor >> 1) + (pRaInfo->PTSmoothFactor >> 2) + stage_id * 16 + 2; ++ if (pRaInfo->PTSmoothFactor > 192) ++ pRaInfo->PTSmoothFactor = 192; ++ stage_id = pRaInfo->PTSmoothFactor >> 6; ++ temp_stage = stage_id * 2; ++ if (temp_stage != 0) ++ temp_stage -= 1; ++ if (pRaInfo->DROP > 3) ++ temp_stage = 0; ++ pRaInfo->PTStage = temp_stage; ++} ++ ++static void ++odm_RATxRPTTimerSetting( ++ struct odm_dm_struct *dm_odm, ++ u16 minRptTime ++) ++{ ++ if (dm_odm->CurrminRptTime != minRptTime) { ++ rtw_rpt_timer_cfg_cmd(dm_odm->Adapter, minRptTime); ++ dm_odm->CurrminRptTime = minRptTime; ++ } ++} ++ ++void ++ODM_RASupport_Init( ++ struct odm_dm_struct *dm_odm ++ ) ++{ ++ /* 2012/02/14 MH Be noticed, the init must be after IC type is recognized!!!!! */ ++ if (dm_odm->SupportICType == ODM_RTL8188E) ++ dm_odm->RaSupport88E = true; ++} ++ ++int ODM_RAInfo_Init(struct odm_dm_struct *dm_odm, u8 macid) ++{ ++ struct odm_ra_info *pRaInfo = &dm_odm->RAInfo[macid]; ++ u8 WirelessMode = 0xFF; /* invalid value */ ++ u8 max_rate_idx = 0x13; /* MCS7 */ ++ if (dm_odm->pWirelessMode) ++ WirelessMode = *dm_odm->pWirelessMode; ++ ++ if (WirelessMode != 0xFF) { ++ if (WirelessMode & ODM_WM_N24G) ++ max_rate_idx = 0x13; ++ else if (WirelessMode & ODM_WM_G) ++ max_rate_idx = 0x0b; ++ else if (WirelessMode & ODM_WM_B) ++ max_rate_idx = 0x03; ++ } ++ ++ pRaInfo->DecisionRate = max_rate_idx; ++ pRaInfo->PreRate = max_rate_idx; ++ pRaInfo->HighestRate = max_rate_idx; ++ pRaInfo->LowestRate = 0; ++ pRaInfo->RateID = 0; ++ pRaInfo->RateMask = 0xffffffff; ++ pRaInfo->RssiStaRA = 0; ++ pRaInfo->PreRssiStaRA = 0; ++ pRaInfo->SGIEnable = 0; ++ pRaInfo->RAUseRate = 0xffffffff; ++ pRaInfo->NscDown = (N_THRESHOLD_HIGH[0x13] + N_THRESHOLD_LOW[0x13]) / 2; ++ pRaInfo->NscUp = (N_THRESHOLD_HIGH[0x13] + N_THRESHOLD_LOW[0x13]) / 2; ++ pRaInfo->RateSGI = 0; ++ pRaInfo->Active = 1; /* Active is not used at present. by page, 110819 */ ++ pRaInfo->RptTime = 0x927c; ++ pRaInfo->DROP = 0; ++ pRaInfo->RTY[0] = 0; ++ pRaInfo->RTY[1] = 0; ++ pRaInfo->RTY[2] = 0; ++ pRaInfo->RTY[3] = 0; ++ pRaInfo->RTY[4] = 0; ++ pRaInfo->TOTAL = 0; ++ pRaInfo->RAWaitingCounter = 0; ++ pRaInfo->RAPendingCounter = 0; ++ pRaInfo->PTActive = 1; /* Active when this STA is use */ ++ pRaInfo->PTTryState = 0; ++ pRaInfo->PTStage = 5; /* Need to fill into HW_PWR_STATUS */ ++ pRaInfo->PTSmoothFactor = 192; ++ pRaInfo->PTStopCount = 0; ++ pRaInfo->PTPreRate = 0; ++ pRaInfo->PTPreRssi = 0; ++ pRaInfo->PTModeSS = 0; ++ pRaInfo->RAstage = 0; ++ return 0; ++} ++ ++int ODM_RAInfo_Init_all(struct odm_dm_struct *dm_odm) ++{ ++ u8 macid = 0; ++ ++ dm_odm->CurrminRptTime = 0; ++ ++ for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) ++ ODM_RAInfo_Init(dm_odm, macid); ++ ++ return 0; ++} ++ ++u8 ODM_RA_GetShortGI_8188E(struct odm_dm_struct *dm_odm, u8 macid) ++{ ++ if ((NULL == dm_odm) || (macid >= ASSOCIATE_ENTRY_NUM)) ++ return 0; ++ return dm_odm->RAInfo[macid].RateSGI; ++} ++ ++u8 ODM_RA_GetDecisionRate_8188E(struct odm_dm_struct *dm_odm, u8 macid) ++{ ++ u8 DecisionRate = 0; ++ ++ if ((NULL == dm_odm) || (macid >= ASSOCIATE_ENTRY_NUM)) ++ return 0; ++ DecisionRate = (dm_odm->RAInfo[macid].DecisionRate); ++ return DecisionRate; ++} ++ ++u8 ODM_RA_GetHwPwrStatus_8188E(struct odm_dm_struct *dm_odm, u8 macid) ++{ ++ u8 PTStage = 5; ++ ++ if ((NULL == dm_odm) || (macid >= ASSOCIATE_ENTRY_NUM)) ++ return 0; ++ PTStage = (dm_odm->RAInfo[macid].PTStage); ++ return PTStage; ++} ++ ++void ODM_RA_UpdateRateInfo_8188E(struct odm_dm_struct *dm_odm, u8 macid, u8 RateID, u32 RateMask, u8 SGIEnable) ++{ ++ struct odm_ra_info *pRaInfo = NULL; ++ ++ if ((NULL == dm_odm) || (macid >= ASSOCIATE_ENTRY_NUM)) ++ return; ++ ++ pRaInfo = &dm_odm->RAInfo[macid]; ++ pRaInfo->RateID = RateID; ++ pRaInfo->RateMask = RateMask; ++ pRaInfo->SGIEnable = SGIEnable; ++ odm_ARFBRefresh_8188E(dm_odm, pRaInfo); ++} ++ ++void ODM_RA_SetRSSI_8188E(struct odm_dm_struct *dm_odm, u8 macid, u8 Rssi) ++{ ++ struct odm_ra_info *pRaInfo = NULL; ++ ++ if ((NULL == dm_odm) || (macid >= ASSOCIATE_ENTRY_NUM)) ++ return; ++ ++ pRaInfo = &dm_odm->RAInfo[macid]; ++ pRaInfo->RssiStaRA = Rssi; ++} ++ ++void ODM_RA_Set_TxRPT_Time(struct odm_dm_struct *dm_odm, u16 minRptTime) ++{ ++ ODM_Write2Byte(dm_odm, REG_TX_RPT_TIME, minRptTime); ++} ++ ++void ODM_RA_TxRPT2Handle_8188E(struct odm_dm_struct *dm_odm, u8 *TxRPT_Buf, u16 TxRPT_Len, u32 macid_entry0, u32 macid_entry1) ++{ ++ struct odm_ra_info *pRAInfo = NULL; ++ u8 MacId = 0; ++ u8 *pBuffer = NULL; ++ u32 valid = 0, ItemNum = 0; ++ u16 minRptTime = 0x927c; ++ ++ ItemNum = TxRPT_Len >> 3; ++ pBuffer = TxRPT_Buf; ++ ++ do { ++ if (MacId >= ASSOCIATE_ENTRY_NUM) ++ valid = 0; ++ else if (MacId >= 32) ++ valid = (1 << (MacId - 32)) & macid_entry1; ++ else ++ valid = (1 << MacId) & macid_entry0; ++ ++ pRAInfo = &dm_odm->RAInfo[MacId]; ++ if (valid) { ++ pRAInfo->RTY[0] = (u16)GET_TX_REPORT_TYPE1_RERTY_0(pBuffer); ++ pRAInfo->RTY[1] = (u16)GET_TX_REPORT_TYPE1_RERTY_1(pBuffer); ++ pRAInfo->RTY[2] = (u16)GET_TX_REPORT_TYPE1_RERTY_2((u8 *)pBuffer); ++ pRAInfo->RTY[3] = (u16)GET_TX_REPORT_TYPE1_RERTY_3(pBuffer); ++ pRAInfo->RTY[4] = (u16)GET_TX_REPORT_TYPE1_RERTY_4(pBuffer); ++ pRAInfo->DROP = (u16)GET_TX_REPORT_TYPE1_DROP_0(pBuffer); ++ pRAInfo->TOTAL = pRAInfo->RTY[0] + pRAInfo->RTY[1] + ++ pRAInfo->RTY[2] + pRAInfo->RTY[3] + ++ pRAInfo->RTY[4] + pRAInfo->DROP; ++ if (pRAInfo->TOTAL != 0) { ++ if (pRAInfo->PTActive) { ++ if (pRAInfo->RAstage < 5) ++ odm_RateDecision_8188E(dm_odm, pRAInfo); ++ else if (pRAInfo->RAstage == 5) /* Power training try state */ ++ odm_PTTryState_8188E(pRAInfo); ++ else /* RAstage == 6 */ ++ odm_PTDecision_8188E(pRAInfo); ++ ++ /* Stage_RA counter */ ++ if (pRAInfo->RAstage <= 5) ++ pRAInfo->RAstage++; ++ else ++ pRAInfo->RAstage = 0; ++ } else { ++ odm_RateDecision_8188E(dm_odm, pRAInfo); ++ } ++ } ++ } ++ ++ if (minRptTime > pRAInfo->RptTime) ++ minRptTime = pRAInfo->RptTime; ++ ++ pBuffer += TX_RPT2_ITEM_SIZE; ++ MacId++; ++ } while (MacId < ItemNum); ++ ++ odm_RATxRPTTimerSetting(dm_odm, minRptTime); ++} +diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c +new file mode 100644 +index 000000000000..55aa20a30342 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c +@@ -0,0 +1,702 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++#include "../include/rtw_iol.h" ++ ++#define read_next_pair(array, v1, v2, i) \ ++ do { \ ++ i += 2; \ ++ v1 = array[i]; \ ++ v2 = array[i + 1]; \ ++ } while (0) ++ ++static bool CheckCondition(const u32 condition, const u32 hex) ++{ ++ u32 _board = (hex & 0x000000FF); ++ u32 _interface = (hex & 0x0000FF00) >> 8; ++ u32 _platform = (hex & 0x00FF0000) >> 16; ++ u32 cond = condition; ++ ++ if (condition == 0xCDCDCDCD) ++ return true; ++ ++ cond = condition & 0x000000FF; ++ if ((_board == cond) && cond != 0x00) ++ return false; ++ ++ cond = condition & 0x0000FF00; ++ cond = cond >> 8; ++ if ((_interface & cond) == 0 && cond != 0x07) ++ return false; ++ ++ cond = condition & 0x00FF0000; ++ cond = cond >> 16; ++ if ((_platform & cond) == 0 && cond != 0x0F) ++ return false; ++ return true; ++} ++ ++/****************************************************************************** ++* AGC_TAB_1T.TXT ++******************************************************************************/ ++ ++static u32 array_agc_tab_1t_8188e[] = { ++ 0xC78, 0xFB000001, ++ 0xC78, 0xFB010001, ++ 0xC78, 0xFB020001, ++ 0xC78, 0xFB030001, ++ 0xC78, 0xFB040001, ++ 0xC78, 0xFB050001, ++ 0xC78, 0xFA060001, ++ 0xC78, 0xF9070001, ++ 0xC78, 0xF8080001, ++ 0xC78, 0xF7090001, ++ 0xC78, 0xF60A0001, ++ 0xC78, 0xF50B0001, ++ 0xC78, 0xF40C0001, ++ 0xC78, 0xF30D0001, ++ 0xC78, 0xF20E0001, ++ 0xC78, 0xF10F0001, ++ 0xC78, 0xF0100001, ++ 0xC78, 0xEF110001, ++ 0xC78, 0xEE120001, ++ 0xC78, 0xED130001, ++ 0xC78, 0xEC140001, ++ 0xC78, 0xEB150001, ++ 0xC78, 0xEA160001, ++ 0xC78, 0xE9170001, ++ 0xC78, 0xE8180001, ++ 0xC78, 0xE7190001, ++ 0xC78, 0xE61A0001, ++ 0xC78, 0xE51B0001, ++ 0xC78, 0xE41C0001, ++ 0xC78, 0xE31D0001, ++ 0xC78, 0xE21E0001, ++ 0xC78, 0xE11F0001, ++ 0xC78, 0x8A200001, ++ 0xC78, 0x89210001, ++ 0xC78, 0x88220001, ++ 0xC78, 0x87230001, ++ 0xC78, 0x86240001, ++ 0xC78, 0x85250001, ++ 0xC78, 0x84260001, ++ 0xC78, 0x83270001, ++ 0xC78, 0x82280001, ++ 0xC78, 0x6B290001, ++ 0xC78, 0x6A2A0001, ++ 0xC78, 0x692B0001, ++ 0xC78, 0x682C0001, ++ 0xC78, 0x672D0001, ++ 0xC78, 0x662E0001, ++ 0xC78, 0x652F0001, ++ 0xC78, 0x64300001, ++ 0xC78, 0x63310001, ++ 0xC78, 0x62320001, ++ 0xC78, 0x61330001, ++ 0xC78, 0x46340001, ++ 0xC78, 0x45350001, ++ 0xC78, 0x44360001, ++ 0xC78, 0x43370001, ++ 0xC78, 0x42380001, ++ 0xC78, 0x41390001, ++ 0xC78, 0x403A0001, ++ 0xC78, 0x403B0001, ++ 0xC78, 0x403C0001, ++ 0xC78, 0x403D0001, ++ 0xC78, 0x403E0001, ++ 0xC78, 0x403F0001, ++ 0xC78, 0xFB400001, ++ 0xC78, 0xFB410001, ++ 0xC78, 0xFB420001, ++ 0xC78, 0xFB430001, ++ 0xC78, 0xFB440001, ++ 0xC78, 0xFB450001, ++ 0xC78, 0xFB460001, ++ 0xC78, 0xFB470001, ++ 0xC78, 0xFB480001, ++ 0xC78, 0xFA490001, ++ 0xC78, 0xF94A0001, ++ 0xC78, 0xF84B0001, ++ 0xC78, 0xF74C0001, ++ 0xC78, 0xF64D0001, ++ 0xC78, 0xF54E0001, ++ 0xC78, 0xF44F0001, ++ 0xC78, 0xF3500001, ++ 0xC78, 0xF2510001, ++ 0xC78, 0xF1520001, ++ 0xC78, 0xF0530001, ++ 0xC78, 0xEF540001, ++ 0xC78, 0xEE550001, ++ 0xC78, 0xED560001, ++ 0xC78, 0xEC570001, ++ 0xC78, 0xEB580001, ++ 0xC78, 0xEA590001, ++ 0xC78, 0xE95A0001, ++ 0xC78, 0xE85B0001, ++ 0xC78, 0xE75C0001, ++ 0xC78, 0xE65D0001, ++ 0xC78, 0xE55E0001, ++ 0xC78, 0xE45F0001, ++ 0xC78, 0xE3600001, ++ 0xC78, 0xE2610001, ++ 0xC78, 0xC3620001, ++ 0xC78, 0xC2630001, ++ 0xC78, 0xC1640001, ++ 0xC78, 0x8B650001, ++ 0xC78, 0x8A660001, ++ 0xC78, 0x89670001, ++ 0xC78, 0x88680001, ++ 0xC78, 0x87690001, ++ 0xC78, 0x866A0001, ++ 0xC78, 0x856B0001, ++ 0xC78, 0x846C0001, ++ 0xC78, 0x676D0001, ++ 0xC78, 0x666E0001, ++ 0xC78, 0x656F0001, ++ 0xC78, 0x64700001, ++ 0xC78, 0x63710001, ++ 0xC78, 0x62720001, ++ 0xC78, 0x61730001, ++ 0xC78, 0x60740001, ++ 0xC78, 0x46750001, ++ 0xC78, 0x45760001, ++ 0xC78, 0x44770001, ++ 0xC78, 0x43780001, ++ 0xC78, 0x42790001, ++ 0xC78, 0x417A0001, ++ 0xC78, 0x407B0001, ++ 0xC78, 0x407C0001, ++ 0xC78, 0x407D0001, ++ 0xC78, 0x407E0001, ++ 0xC78, 0x407F0001, ++}; ++ ++enum HAL_STATUS ODM_ReadAndConfig_AGC_TAB_1T_8188E(struct odm_dm_struct *dm_odm) ++{ ++ u32 hex = 0; ++ u32 i = 0; ++ u8 platform = dm_odm->SupportPlatform; ++ u8 interfaceValue = dm_odm->SupportInterface; ++ u8 board = dm_odm->BoardType; ++ u32 arraylen = sizeof(array_agc_tab_1t_8188e) / sizeof(u32); ++ u32 *array = array_agc_tab_1t_8188e; ++ bool biol = false; ++ struct adapter *adapter = dm_odm->Adapter; ++ struct xmit_frame *pxmit_frame = NULL; ++ u8 bndy_cnt = 1; ++ enum HAL_STATUS rst = HAL_STATUS_SUCCESS; ++ ++ hex += board; ++ hex += interfaceValue << 8; ++ hex += platform << 16; ++ hex += 0xFF000000; ++ biol = rtw_IOL_applied(adapter); ++ ++ if (biol) { ++ pxmit_frame = rtw_IOL_accquire_xmit_frame(adapter); ++ if (!pxmit_frame) { ++ pr_info("rtw_IOL_accquire_xmit_frame failed\n"); ++ return HAL_STATUS_FAILURE; ++ } ++ } ++ ++ for (i = 0; i < arraylen; i += 2) { ++ u32 v1 = array[i]; ++ u32 v2 = array[i + 1]; ++ ++ /* This (offset, data) pair meets the condition. */ ++ if (v1 < 0xCDCDCDCD) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ rtw_IOL_append_WD_cmd(pxmit_frame, (u16)v1, v2, bMaskDWord); ++ } else { ++ odm_ConfigBB_AGC_8188E(dm_odm, v1, bMaskDWord, v2); ++ } ++ continue; ++ } else { ++ /* This line is the start line of branch. */ ++ if (!CheckCondition(array[i], hex)) { ++ /* Discard the following (offset, data) pairs. */ ++ read_next_pair(array, v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < arraylen - 2) ++ read_next_pair(array, v1, v2, i); ++ i -= 2; /* prevent from for-loop += 2 */ ++ } else { /* Configure matched pairs and skip to end of if-else. */ ++ read_next_pair(array, v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < arraylen - 2) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ rtw_IOL_append_WD_cmd(pxmit_frame, (u16)v1, v2, bMaskDWord); ++ } else { ++ odm_ConfigBB_AGC_8188E(dm_odm, v1, bMaskDWord, v2); ++ } ++ read_next_pair(array, v1, v2, i); ++ } ++ ++ while (v2 != 0xDEAD && i < arraylen - 2) ++ read_next_pair(array, v1, v2, i); ++ } ++ } ++ } ++ if (biol) { ++ if (!rtw_IOL_exec_cmds_sync(dm_odm->Adapter, pxmit_frame, 1000, bndy_cnt)) { ++ printk("~~~ %s IOL_exec_cmds Failed !!!\n", __func__); ++ rst = HAL_STATUS_FAILURE; ++ } ++ } ++ return rst; ++} ++ ++/****************************************************************************** ++* PHY_REG_1T.TXT ++******************************************************************************/ ++ ++static u32 array_phy_reg_1t_8188e[] = { ++ 0x800, 0x80040000, ++ 0x804, 0x00000003, ++ 0x808, 0x0000FC00, ++ 0x80C, 0x0000000A, ++ 0x810, 0x10001331, ++ 0x814, 0x020C3D10, ++ 0x818, 0x02200385, ++ 0x81C, 0x00000000, ++ 0x820, 0x01000100, ++ 0x824, 0x00390204, ++ 0x828, 0x00000000, ++ 0x82C, 0x00000000, ++ 0x830, 0x00000000, ++ 0x834, 0x00000000, ++ 0x838, 0x00000000, ++ 0x83C, 0x00000000, ++ 0x840, 0x00010000, ++ 0x844, 0x00000000, ++ 0x848, 0x00000000, ++ 0x84C, 0x00000000, ++ 0x850, 0x00000000, ++ 0x854, 0x00000000, ++ 0x858, 0x569A11A9, ++ 0x85C, 0x01000014, ++ 0x860, 0x66F60110, ++ 0x864, 0x061F0649, ++ 0x868, 0x00000000, ++ 0x86C, 0x27272700, ++ 0x870, 0x07000760, ++ 0x874, 0x25004000, ++ 0x878, 0x00000808, ++ 0x87C, 0x00000000, ++ 0x880, 0xB0000C1C, ++ 0x884, 0x00000001, ++ 0x888, 0x00000000, ++ 0x88C, 0xCCC000C0, ++ 0x890, 0x00000800, ++ 0x894, 0xFFFFFFFE, ++ 0x898, 0x40302010, ++ 0x89C, 0x00706050, ++ 0x900, 0x00000000, ++ 0x904, 0x00000023, ++ 0x908, 0x00000000, ++ 0x90C, 0x81121111, ++ 0x910, 0x00000002, ++ 0x914, 0x00000201, ++ 0xA00, 0x00D047C8, ++ 0xA04, 0x80FF000C, ++ 0xA08, 0x8C838300, ++ 0xA0C, 0x2E7F120F, ++ 0xA10, 0x9500BB78, ++ 0xA14, 0x1114D028, ++ 0xA18, 0x00881117, ++ 0xA1C, 0x89140F00, ++ 0xA20, 0x1A1B0000, ++ 0xA24, 0x090E1317, ++ 0xA28, 0x00000204, ++ 0xA2C, 0x00D30000, ++ 0xA70, 0x101FBF00, ++ 0xA74, 0x00000007, ++ 0xA78, 0x00000900, ++ 0xA7C, 0x225B0606, ++ 0xA80, 0x218075B1, ++ 0xB2C, 0x80000000, ++ 0xC00, 0x48071D40, ++ 0xC04, 0x03A05611, ++ 0xC08, 0x000000E4, ++ 0xC0C, 0x6C6C6C6C, ++ 0xC10, 0x08800000, ++ 0xC14, 0x40000100, ++ 0xC18, 0x08800000, ++ 0xC1C, 0x40000100, ++ 0xC20, 0x00000000, ++ 0xC24, 0x00000000, ++ 0xC28, 0x00000000, ++ 0xC2C, 0x00000000, ++ 0xC30, 0x69E9AC47, ++ 0xC34, 0x469652AF, ++ 0xC38, 0x49795994, ++ 0xC3C, 0x0A97971C, ++ 0xC40, 0x1F7C403F, ++ 0xC44, 0x000100B7, ++ 0xC48, 0xEC020107, ++ 0xC4C, 0x007F037F, ++ 0xC50, 0x69553420, ++ 0xC54, 0x43BC0094, ++ 0xC58, 0x00013169, ++ 0xC5C, 0x00250492, ++ 0xC60, 0x00000000, ++ 0xC64, 0x7112848B, ++ 0xC68, 0x47C00BFF, ++ 0xC6C, 0x00000036, ++ 0xC70, 0x2C7F000D, ++ 0xC74, 0x020610DB, ++ 0xC78, 0x0000001F, ++ 0xC7C, 0x00B91612, ++ 0xC80, 0x390000E4, ++ 0xC84, 0x20F60000, ++ 0xC88, 0x40000100, ++ 0xC8C, 0x20200000, ++ 0xC90, 0x00091521, ++ 0xC94, 0x00000000, ++ 0xC98, 0x00121820, ++ 0xC9C, 0x00007F7F, ++ 0xCA0, 0x00000000, ++ 0xCA4, 0x000300A0, ++ 0xCA8, 0x00000000, ++ 0xCAC, 0x00000000, ++ 0xCB0, 0x00000000, ++ 0xCB4, 0x00000000, ++ 0xCB8, 0x00000000, ++ 0xCBC, 0x28000000, ++ 0xCC0, 0x00000000, ++ 0xCC4, 0x00000000, ++ 0xCC8, 0x00000000, ++ 0xCCC, 0x00000000, ++ 0xCD0, 0x00000000, ++ 0xCD4, 0x00000000, ++ 0xCD8, 0x64B22427, ++ 0xCDC, 0x00766932, ++ 0xCE0, 0x00222222, ++ 0xCE4, 0x00000000, ++ 0xCE8, 0x37644302, ++ 0xCEC, 0x2F97D40C, ++ 0xD00, 0x00000740, ++ 0xD04, 0x00020401, ++ 0xD08, 0x0000907F, ++ 0xD0C, 0x20010201, ++ 0xD10, 0xA0633333, ++ 0xD14, 0x3333BC43, ++ 0xD18, 0x7A8F5B6F, ++ 0xD2C, 0xCC979975, ++ 0xD30, 0x00000000, ++ 0xD34, 0x80608000, ++ 0xD38, 0x00000000, ++ 0xD3C, 0x00127353, ++ 0xD40, 0x00000000, ++ 0xD44, 0x00000000, ++ 0xD48, 0x00000000, ++ 0xD4C, 0x00000000, ++ 0xD50, 0x6437140A, ++ 0xD54, 0x00000000, ++ 0xD58, 0x00000282, ++ 0xD5C, 0x30032064, ++ 0xD60, 0x4653DE68, ++ 0xD64, 0x04518A3C, ++ 0xD68, 0x00002101, ++ 0xD6C, 0x2A201C16, ++ 0xD70, 0x1812362E, ++ 0xD74, 0x322C2220, ++ 0xD78, 0x000E3C24, ++ 0xE00, 0x2D2D2D2D, ++ 0xE04, 0x2D2D2D2D, ++ 0xE08, 0x0390272D, ++ 0xE10, 0x2D2D2D2D, ++ 0xE14, 0x2D2D2D2D, ++ 0xE18, 0x2D2D2D2D, ++ 0xE1C, 0x2D2D2D2D, ++ 0xE28, 0x00000000, ++ 0xE30, 0x1000DC1F, ++ 0xE34, 0x10008C1F, ++ 0xE38, 0x02140102, ++ 0xE3C, 0x681604C2, ++ 0xE40, 0x01007C00, ++ 0xE44, 0x01004800, ++ 0xE48, 0xFB000000, ++ 0xE4C, 0x000028D1, ++ 0xE50, 0x1000DC1F, ++ 0xE54, 0x10008C1F, ++ 0xE58, 0x02140102, ++ 0xE5C, 0x28160D05, ++ 0xE60, 0x00000008, ++ 0xE68, 0x001B25A4, ++ 0xE6C, 0x00C00014, ++ 0xE70, 0x00C00014, ++ 0xE74, 0x01000014, ++ 0xE78, 0x01000014, ++ 0xE7C, 0x01000014, ++ 0xE80, 0x01000014, ++ 0xE84, 0x00C00014, ++ 0xE88, 0x01000014, ++ 0xE8C, 0x00C00014, ++ 0xED0, 0x00C00014, ++ 0xED4, 0x00C00014, ++ 0xED8, 0x00C00014, ++ 0xEDC, 0x00000014, ++ 0xEE0, 0x00000014, ++ 0xEEC, 0x01C00014, ++ 0xF14, 0x00000003, ++ 0xF4C, 0x00000000, ++ 0xF00, 0x00000300, ++}; ++ ++enum HAL_STATUS ODM_ReadAndConfig_PHY_REG_1T_8188E(struct odm_dm_struct *dm_odm) ++{ ++ u32 hex = 0; ++ u32 i = 0; ++ u8 platform = dm_odm->SupportPlatform; ++ u8 interfaceValue = dm_odm->SupportInterface; ++ u8 board = dm_odm->BoardType; ++ u32 arraylen = sizeof(array_phy_reg_1t_8188e) / sizeof(u32); ++ u32 *array = array_phy_reg_1t_8188e; ++ bool biol = false; ++ struct adapter *adapter = dm_odm->Adapter; ++ struct xmit_frame *pxmit_frame = NULL; ++ u8 bndy_cnt = 1; ++ enum HAL_STATUS rst = HAL_STATUS_SUCCESS; ++ hex += board; ++ hex += interfaceValue << 8; ++ hex += platform << 16; ++ hex += 0xFF000000; ++ biol = rtw_IOL_applied(adapter); ++ ++ if (biol) { ++ pxmit_frame = rtw_IOL_accquire_xmit_frame(adapter); ++ if (!pxmit_frame) { ++ pr_info("rtw_IOL_accquire_xmit_frame failed\n"); ++ return HAL_STATUS_FAILURE; ++ } ++ } ++ ++ for (i = 0; i < arraylen; i += 2) { ++ u32 v1 = array[i]; ++ u32 v2 = array[i + 1]; ++ ++ /* This (offset, data) pair meets the condition. */ ++ if (v1 < 0xCDCDCDCD) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ if (v1 == 0xfe) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50); ++ } else if (v1 == 0xfd) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5); ++ } else if (v1 == 0xfc) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1); ++ } else if (v1 == 0xfb) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50); ++ } else if (v1 == 0xfa) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5); ++ } else if (v1 == 0xf9) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1); ++ } else { ++ if (v1 == 0xa24) ++ dm_odm->RFCalibrateInfo.RegA24 = v2; ++ rtw_IOL_append_WD_cmd(pxmit_frame, (u16)v1, v2, bMaskDWord); ++ } ++ } else { ++ odm_ConfigBB_PHY_8188E(dm_odm, v1, bMaskDWord, v2); ++ } ++ continue; ++ } else { /* This line is the start line of branch. */ ++ if (!CheckCondition(array[i], hex)) { ++ /* Discard the following (offset, data) pairs. */ ++ read_next_pair(array, v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < arraylen - 2) ++ read_next_pair(array, v1, v2, i); ++ i -= 2; /* prevent from for-loop += 2 */ ++ } else { /* Configure matched pairs and skip to end of if-else. */ ++ read_next_pair(array, v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < arraylen - 2) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ if (v1 == 0xfe) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50); ++ } else if (v1 == 0xfd) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5); ++ } else if (v1 == 0xfc) { ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1); ++ } else if (v1 == 0xfb) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50); ++ } else if (v1 == 0xfa) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5); ++ } else if (v1 == 0xf9) { ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1); ++ } else { ++ if (v1 == 0xa24) ++ dm_odm->RFCalibrateInfo.RegA24 = v2; ++ ++ rtw_IOL_append_WD_cmd(pxmit_frame, (u16)v1, v2, bMaskDWord); ++ } ++ } else { ++ odm_ConfigBB_PHY_8188E(dm_odm, v1, bMaskDWord, v2); ++ } ++ read_next_pair(array, v1, v2, i); ++ } ++ ++ while (v2 != 0xDEAD && i < arraylen - 2) ++ read_next_pair(array, v1, v2, i); ++ } ++ } ++ } ++ if (biol) { ++ if (!rtw_IOL_exec_cmds_sync(dm_odm->Adapter, pxmit_frame, 1000, bndy_cnt)) { ++ rst = HAL_STATUS_FAILURE; ++ pr_info("~~~ IOL Config %s Failed !!!\n", __func__); ++ } ++ } ++ return rst; ++} ++ ++/****************************************************************************** ++* PHY_REG_PG.TXT ++******************************************************************************/ ++ ++static u32 array_phy_reg_pg_8188e[] = { ++ 0xE00, 0xFFFFFFFF, 0x06070809, ++ 0xE04, 0xFFFFFFFF, 0x02020405, ++ 0xE08, 0x0000FF00, 0x00000006, ++ 0x86C, 0xFFFFFF00, 0x00020400, ++ 0xE10, 0xFFFFFFFF, 0x08090A0B, ++ 0xE14, 0xFFFFFFFF, 0x01030607, ++ 0xE18, 0xFFFFFFFF, 0x08090A0B, ++ 0xE1C, 0xFFFFFFFF, 0x01030607, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x02020202, ++ 0xE04, 0xFFFFFFFF, 0x00020202, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x04040404, ++ 0xE14, 0xFFFFFFFF, 0x00020404, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x02020202, ++ 0xE04, 0xFFFFFFFF, 0x00020202, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x04040404, ++ 0xE14, 0xFFFFFFFF, 0x00020404, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x02020202, ++ 0xE04, 0xFFFFFFFF, 0x00020202, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x04040404, ++ 0xE14, 0xFFFFFFFF, 0x00020404, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ 0xE00, 0xFFFFFFFF, 0x00000000, ++ 0xE04, 0xFFFFFFFF, 0x00000000, ++ 0xE08, 0x0000FF00, 0x00000000, ++ 0x86C, 0xFFFFFF00, 0x00000000, ++ 0xE10, 0xFFFFFFFF, 0x00000000, ++ 0xE14, 0xFFFFFFFF, 0x00000000, ++ 0xE18, 0xFFFFFFFF, 0x00000000, ++ 0xE1C, 0xFFFFFFFF, 0x00000000, ++ ++}; ++ ++void ODM_ReadAndConfig_PHY_REG_PG_8188E(struct odm_dm_struct *dm_odm) ++{ ++ u32 hex; ++ u32 i = 0; ++ u8 platform = dm_odm->SupportPlatform; ++ u8 interfaceValue = dm_odm->SupportInterface; ++ u8 board = dm_odm->BoardType; ++ u32 arraylen = sizeof(array_phy_reg_pg_8188e) / sizeof(u32); ++ u32 *array = array_phy_reg_pg_8188e; ++ ++ hex = board + (interfaceValue << 8); ++ hex += (platform << 16) + 0xFF000000; ++ ++ for (i = 0; i < arraylen; i += 3) { ++ u32 v1 = array[i]; ++ u32 v2 = array[i + 1]; ++ u32 v3 = array[i + 2]; ++ ++ /* this line is a line of pure_body */ ++ if (v1 < 0xCDCDCDCD) { ++ odm_ConfigBB_PHY_REG_PG_8188E(dm_odm, v1, v2, v3); ++ continue; ++ } else { /* this line is the start of branch */ ++ if (!CheckCondition(array[i], hex)) { ++ /* don't need the hw_body */ ++ i += 2; /* skip the pair of expression */ ++ v1 = array[i]; ++ v2 = array[i + 1]; ++ v3 = array[i + 2]; ++ while (v2 != 0xDEAD) { ++ i += 3; ++ v1 = array[i]; ++ v2 = array[i + 1]; ++ v3 = array[i + 1]; ++ } ++ } ++ } ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c +new file mode 100644 +index 000000000000..0ff2609c26bb +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c +@@ -0,0 +1,213 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++#include "../include/rtw_iol.h" ++ ++static bool Checkcondition(const u32 condition, const u32 hex) ++{ ++ u32 _board = (hex & 0x000000FF); ++ u32 _interface = (hex & 0x0000FF00) >> 8; ++ u32 _platform = (hex & 0x00FF0000) >> 16; ++ u32 cond = condition; ++ ++ if (condition == 0xCDCDCDCD) ++ return true; ++ ++ cond = condition & 0x000000FF; ++ if ((_board == cond) && cond != 0x00) ++ return false; ++ ++ cond = condition & 0x0000FF00; ++ cond = cond >> 8; ++ if ((_interface & cond) == 0 && cond != 0x07) ++ return false; ++ ++ cond = condition & 0x00FF0000; ++ cond = cond >> 16; ++ if ((_platform & cond) == 0 && cond != 0x0F) ++ return false; ++ return true; ++} ++ ++/****************************************************************************** ++* MAC_REG.TXT ++******************************************************************************/ ++ ++static u32 array_MAC_REG_8188E[] = { ++ 0x026, 0x00000041, ++ 0x027, 0x00000035, ++ 0x428, 0x0000000A, ++ 0x429, 0x00000010, ++ 0x430, 0x00000000, ++ 0x431, 0x00000001, ++ 0x432, 0x00000002, ++ 0x433, 0x00000004, ++ 0x434, 0x00000005, ++ 0x435, 0x00000006, ++ 0x436, 0x00000007, ++ 0x437, 0x00000008, ++ 0x438, 0x00000000, ++ 0x439, 0x00000000, ++ 0x43A, 0x00000001, ++ 0x43B, 0x00000002, ++ 0x43C, 0x00000004, ++ 0x43D, 0x00000005, ++ 0x43E, 0x00000006, ++ 0x43F, 0x00000007, ++ 0x440, 0x0000005D, ++ 0x441, 0x00000001, ++ 0x442, 0x00000000, ++ 0x444, 0x00000015, ++ 0x445, 0x000000F0, ++ 0x446, 0x0000000F, ++ 0x447, 0x00000000, ++ 0x458, 0x00000041, ++ 0x459, 0x000000A8, ++ 0x45A, 0x00000072, ++ 0x45B, 0x000000B9, ++ 0x460, 0x00000066, ++ 0x461, 0x00000066, ++ 0x480, 0x00000008, ++ 0x4C8, 0x000000FF, ++ 0x4C9, 0x00000008, ++ 0x4CC, 0x000000FF, ++ 0x4CD, 0x000000FF, ++ 0x4CE, 0x00000001, ++ 0x4D3, 0x00000001, ++ 0x500, 0x00000026, ++ 0x501, 0x000000A2, ++ 0x502, 0x0000002F, ++ 0x503, 0x00000000, ++ 0x504, 0x00000028, ++ 0x505, 0x000000A3, ++ 0x506, 0x0000005E, ++ 0x507, 0x00000000, ++ 0x508, 0x0000002B, ++ 0x509, 0x000000A4, ++ 0x50A, 0x0000005E, ++ 0x50B, 0x00000000, ++ 0x50C, 0x0000004F, ++ 0x50D, 0x000000A4, ++ 0x50E, 0x00000000, ++ 0x50F, 0x00000000, ++ 0x512, 0x0000001C, ++ 0x514, 0x0000000A, ++ 0x516, 0x0000000A, ++ 0x525, 0x0000004F, ++ 0x550, 0x00000010, ++ 0x551, 0x00000010, ++ 0x559, 0x00000002, ++ 0x55D, 0x000000FF, ++ 0x605, 0x00000030, ++ 0x608, 0x0000000E, ++ 0x609, 0x0000002A, ++ 0x620, 0x000000FF, ++ 0x621, 0x000000FF, ++ 0x622, 0x000000FF, ++ 0x623, 0x000000FF, ++ 0x624, 0x000000FF, ++ 0x625, 0x000000FF, ++ 0x626, 0x000000FF, ++ 0x627, 0x000000FF, ++ 0x652, 0x00000020, ++ 0x63C, 0x0000000A, ++ 0x63D, 0x0000000A, ++ 0x63E, 0x0000000E, ++ 0x63F, 0x0000000E, ++ 0x640, 0x00000040, ++ 0x66E, 0x00000005, ++ 0x700, 0x00000021, ++ 0x701, 0x00000043, ++ 0x702, 0x00000065, ++ 0x703, 0x00000087, ++ 0x708, 0x00000021, ++ 0x709, 0x00000043, ++ 0x70A, 0x00000065, ++ 0x70B, 0x00000087, ++}; ++ ++enum HAL_STATUS ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct *dm_odm) ++{ ++ #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = array[i]; v2 = array[i + 1]; } while (0) ++ ++ u32 hex = 0; ++ u32 i; ++ u8 platform = dm_odm->SupportPlatform; ++ u8 interface_val = dm_odm->SupportInterface; ++ u8 board = dm_odm->BoardType; ++ u32 array_len = sizeof(array_MAC_REG_8188E) / sizeof(u32); ++ u32 *array = array_MAC_REG_8188E; ++ bool biol = false; ++ ++ struct adapter *adapt = dm_odm->Adapter; ++ struct xmit_frame *pxmit_frame = NULL; ++ u8 bndy_cnt = 1; ++ enum HAL_STATUS rst = HAL_STATUS_SUCCESS; ++ hex += board; ++ hex += interface_val << 8; ++ hex += platform << 16; ++ hex += 0xFF000000; ++ ++ biol = rtw_IOL_applied(adapt); ++ ++ if (biol) { ++ pxmit_frame = rtw_IOL_accquire_xmit_frame(adapt); ++ if (!pxmit_frame) { ++ pr_info("rtw_IOL_accquire_xmit_frame failed\n"); ++ return HAL_STATUS_FAILURE; ++ } ++ } ++ ++ for (i = 0; i < array_len; i += 2) { ++ u32 v1 = array[i]; ++ u32 v2 = array[i + 1]; ++ ++ /* This (offset, data) pair meets the condition. */ ++ if (v1 < 0xCDCDCDCD) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ rtw_IOL_append_WB_cmd(pxmit_frame, (u16)v1, (u8)v2, 0xFF); ++ } else { ++ odm_ConfigMAC_8188E(dm_odm, v1, (u8)v2); ++ } ++ continue; ++ } else { /* This line is the start line of branch. */ ++ if (!Checkcondition(array[i], hex)) { ++ /* Discard the following (offset, data) pairs. */ ++ READ_NEXT_PAIR(v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < array_len - 2) { ++ READ_NEXT_PAIR(v1, v2, i); ++ } ++ i -= 2; /* prevent from for-loop += 2 */ ++ } else { /* Configure matched pairs and skip to end of if-else. */ ++ READ_NEXT_PAIR(v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < array_len - 2) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ rtw_IOL_append_WB_cmd(pxmit_frame, (u16)v1, (u8)v2, 0xFF); ++ } else { ++ odm_ConfigMAC_8188E(dm_odm, v1, (u8)v2); ++ } ++ ++ READ_NEXT_PAIR(v1, v2, i); ++ } ++ while (v2 != 0xDEAD && i < array_len - 2) ++ READ_NEXT_PAIR(v1, v2, i); ++ } ++ } ++ } ++ if (biol) { ++ if (!rtw_IOL_exec_cmds_sync(dm_odm->Adapter, pxmit_frame, 1000, bndy_cnt)) { ++ pr_info("~~~ MAC IOL_exec_cmds Failed !!!\n"); ++ rst = HAL_STATUS_FAILURE; ++ } ++ } ++ return rst; ++} +diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c +new file mode 100644 +index 000000000000..55e4b4a877a4 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c +@@ -0,0 +1,250 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++#include "../include/rtw_iol.h" ++ ++static bool CheckCondition(const u32 Condition, const u32 Hex) ++{ ++ u32 _board = (Hex & 0x000000FF); ++ u32 _interface = (Hex & 0x0000FF00) >> 8; ++ u32 _platform = (Hex & 0x00FF0000) >> 16; ++ u32 cond = Condition; ++ ++ if (Condition == 0xCDCDCDCD) ++ return true; ++ ++ cond = Condition & 0x000000FF; ++ if ((_board == cond) && cond != 0x00) ++ return false; ++ ++ cond = Condition & 0x0000FF00; ++ cond = cond >> 8; ++ if ((_interface & cond) == 0 && cond != 0x07) ++ return false; ++ ++ cond = Condition & 0x00FF0000; ++ cond = cond >> 16; ++ if ((_platform & cond) == 0 && cond != 0x0F) ++ return false; ++ return true; ++} ++ ++/****************************************************************************** ++* RadioA_1T.TXT ++******************************************************************************/ ++ ++static u32 Array_RadioA_1T_8188E[] = { ++ 0x000, 0x00030000, ++ 0x008, 0x00084000, ++ 0x018, 0x00000407, ++ 0x019, 0x00000012, ++ 0x01E, 0x00080009, ++ 0x01F, 0x00000880, ++ 0x02F, 0x0001A060, ++ 0x03F, 0x00000000, ++ 0x042, 0x000060C0, ++ 0x057, 0x000D0000, ++ 0x058, 0x000BE180, ++ 0x067, 0x00001552, ++ 0x083, 0x00000000, ++ 0x0B0, 0x000FF8FC, ++ 0x0B1, 0x00054400, ++ 0x0B2, 0x000CCC19, ++ 0x0B4, 0x00043003, ++ 0x0B6, 0x0004953E, ++ 0x0B7, 0x0001C718, ++ 0x0B8, 0x000060FF, ++ 0x0B9, 0x00080001, ++ 0x0BA, 0x00040000, ++ 0x0BB, 0x00000400, ++ 0x0BF, 0x000C0000, ++ 0x0C2, 0x00002400, ++ 0x0C3, 0x00000009, ++ 0x0C4, 0x00040C91, ++ 0x0C5, 0x00099999, ++ 0x0C6, 0x000000A3, ++ 0x0C7, 0x00088820, ++ 0x0C8, 0x00076C06, ++ 0x0C9, 0x00000000, ++ 0x0CA, 0x00080000, ++ 0x0DF, 0x00000180, ++ 0x0EF, 0x000001A0, ++ 0x051, 0x0006B27D, ++ 0xFF0F041F, 0xABCD, ++ 0x052, 0x0007E4DD, ++ 0xCDCDCDCD, 0xCDCD, ++ 0x052, 0x0007E49D, ++ 0xFF0F041F, 0xDEAD, ++ 0x053, 0x00000073, ++ 0x056, 0x00051FF3, ++ 0x035, 0x00000086, ++ 0x035, 0x00000186, ++ 0x035, 0x00000286, ++ 0x036, 0x00001C25, ++ 0x036, 0x00009C25, ++ 0x036, 0x00011C25, ++ 0x036, 0x00019C25, ++ 0x0B6, 0x00048538, ++ 0x018, 0x00000C07, ++ 0x05A, 0x0004BD00, ++ 0x019, 0x000739D0, ++ 0x034, 0x0000ADF3, ++ 0x034, 0x00009DF0, ++ 0x034, 0x00008DED, ++ 0x034, 0x00007DEA, ++ 0x034, 0x00006DE7, ++ 0x034, 0x000054EE, ++ 0x034, 0x000044EB, ++ 0x034, 0x000034E8, ++ 0x034, 0x0000246B, ++ 0x034, 0x00001468, ++ 0x034, 0x0000006D, ++ 0x000, 0x00030159, ++ 0x084, 0x00068200, ++ 0x086, 0x000000CE, ++ 0x087, 0x00048A00, ++ 0x08E, 0x00065540, ++ 0x08F, 0x00088000, ++ 0x0EF, 0x000020A0, ++ 0x03B, 0x000F02B0, ++ 0x03B, 0x000EF7B0, ++ 0x03B, 0x000D4FB0, ++ 0x03B, 0x000CF060, ++ 0x03B, 0x000B0090, ++ 0x03B, 0x000A0080, ++ 0x03B, 0x00090080, ++ 0x03B, 0x0008F780, ++ 0x03B, 0x000722B0, ++ 0x03B, 0x0006F7B0, ++ 0x03B, 0x00054FB0, ++ 0x03B, 0x0004F060, ++ 0x03B, 0x00030090, ++ 0x03B, 0x00020080, ++ 0x03B, 0x00010080, ++ 0x03B, 0x0000F780, ++ 0x0EF, 0x000000A0, ++ 0x000, 0x00010159, ++ 0x018, 0x0000F407, ++ 0xFFE, 0x00000000, ++ 0xFFE, 0x00000000, ++ 0x01F, 0x00080003, ++ 0xFFE, 0x00000000, ++ 0xFFE, 0x00000000, ++ 0x01E, 0x00000001, ++ 0x01F, 0x00080000, ++ 0x000, 0x00033E60, ++}; ++ ++enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *pDM_Odm) ++{ ++ #define READ_NEXT_PAIR(v1, v2, i) do \ ++ { i += 2; v1 = Array[i]; \ ++ v2 = Array[i + 1]; } while (0) ++ ++ u32 hex = 0; ++ u32 i = 0; ++ u8 platform = pDM_Odm->SupportPlatform; ++ u8 interfaceValue = pDM_Odm->SupportInterface; ++ u8 board = pDM_Odm->BoardType; ++ u32 ArrayLen = sizeof(Array_RadioA_1T_8188E) / sizeof(u32); ++ u32 *Array = Array_RadioA_1T_8188E; ++ bool biol = false; ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ struct xmit_frame *pxmit_frame = NULL; ++ u8 bndy_cnt = 1; ++ enum HAL_STATUS rst = HAL_STATUS_SUCCESS; ++ ++ hex += board; ++ hex += interfaceValue << 8; ++ hex += platform << 16; ++ hex += 0xFF000000; ++ biol = rtw_IOL_applied(Adapter); ++ ++ if (biol) { ++ pxmit_frame = rtw_IOL_accquire_xmit_frame(Adapter); ++ if (!pxmit_frame) { ++ pr_info("rtw_IOL_accquire_xmit_frame failed\n"); ++ return HAL_STATUS_FAILURE; ++ } ++ } ++ ++ for (i = 0; i < ArrayLen; i += 2) { ++ u32 v1 = Array[i]; ++ u32 v2 = Array[i + 1]; ++ ++ /* This (offset, data) pair meets the condition. */ ++ if (v1 < 0xCDCDCDCD) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ ++ if (v1 == 0xffe) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50); ++ else if (v1 == 0xfd) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5); ++ else if (v1 == 0xfc) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1); ++ else if (v1 == 0xfb) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50); ++ else if (v1 == 0xfa) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5); ++ else if (v1 == 0xf9) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1); ++ else ++ rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask); ++ } else { ++ odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2); ++ } ++ continue; ++ } else { /* This line is the start line of branch. */ ++ if (!CheckCondition(Array[i], hex)) { ++ /* Discard the following (offset, data) pairs. */ ++ READ_NEXT_PAIR(v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < ArrayLen - 2) ++ READ_NEXT_PAIR(v1, v2, i); ++ i -= 2; /* prevent from for-loop += 2 */ ++ } else { /* Configure matched pairs and skip to end of if-else. */ ++ READ_NEXT_PAIR(v1, v2, i); ++ while (v2 != 0xDEAD && ++ v2 != 0xCDEF && ++ v2 != 0xCDCD && i < ArrayLen - 2) { ++ if (biol) { ++ if (rtw_IOL_cmd_boundary_handle(pxmit_frame)) ++ bndy_cnt++; ++ ++ if (v1 == 0xffe) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50); ++ else if (v1 == 0xfd) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5); ++ else if (v1 == 0xfc) ++ rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1); ++ else if (v1 == 0xfb) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50); ++ else if (v1 == 0xfa) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5); ++ else if (v1 == 0xf9) ++ rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1); ++ else ++ rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask); ++ } else { ++ odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2); ++ } ++ READ_NEXT_PAIR(v1, v2, i); ++ } ++ ++ while (v2 != 0xDEAD && i < ArrayLen - 2) ++ READ_NEXT_PAIR(v1, v2, i); ++ } ++ } ++ } ++ if (biol) { ++ if (!rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt)) { ++ rst = HAL_STATUS_FAILURE; ++ pr_info("~~~ IOL Config %s Failed !!!\n", __func__); ++ } ++ } ++ return rst; ++} +diff --git a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +new file mode 100644 +index 000000000000..356885e27edd +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +@@ -0,0 +1,1264 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++ ++/*---------------------------Define Local Constant---------------------------*/ ++/* 2010/04/25 MH Define the max tx power tracking tx agc power. */ ++#define ODM_TXPWRTRACK_MAX_IDX_88E 6 ++ ++/*---------------------------Define Local Constant---------------------------*/ ++ ++/* 3============================================================ */ ++/* 3 Tx Power Tracking */ ++/* 3============================================================ */ ++/*----------------------------------------------------------------------------- ++ * Function: ODM_TxPwrTrackAdjust88E() ++ * ++ * Overview: 88E we can not write 0xc80/c94/c4c/ 0xa2x. Instead of write TX agc. ++ * No matter OFDM & CCK use the same method. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 04/23/2012 MHC Create Version 0. ++ * 04/23/2012 MHC Adjust TX agc directly not throughput BB digital. ++ * ++ *---------------------------------------------------------------------------*/ ++void ODM_TxPwrTrackAdjust88E(struct odm_dm_struct *dm_odm, u8 Type,/* 0 = OFDM, 1 = CCK */ ++ u8 *pDirection, /* 1 = +(increase) 2 = -(decrease) */ ++ u32 *pOutWriteVal /* Tx tracking CCK/OFDM BB swing index adjust */ ++ ) ++{ ++ u8 pwr_value = 0; ++ /* Tx power tracking BB swing table. */ ++ /* The base index = 12. +((12-n)/2)dB 13~?? = decrease tx pwr by -((n-12)/2)dB */ ++ if (Type == 0) { /* For OFDM afjust */ ++ if (dm_odm->BbSwingIdxOfdm <= dm_odm->BbSwingIdxOfdmBase) { ++ *pDirection = 1; ++ pwr_value = (dm_odm->BbSwingIdxOfdmBase - dm_odm->BbSwingIdxOfdm); ++ } else { ++ *pDirection = 2; ++ pwr_value = (dm_odm->BbSwingIdxOfdm - dm_odm->BbSwingIdxOfdmBase); ++ } ++ } else if (Type == 1) { /* For CCK adjust. */ ++ if (dm_odm->BbSwingIdxCck <= dm_odm->BbSwingIdxCckBase) { ++ *pDirection = 1; ++ pwr_value = (dm_odm->BbSwingIdxCckBase - dm_odm->BbSwingIdxCck); ++ } else { ++ *pDirection = 2; ++ pwr_value = (dm_odm->BbSwingIdxCck - dm_odm->BbSwingIdxCckBase); ++ } ++ } ++ ++ /* */ ++ /* 2012/04/25 MH According to Ed/Luke.Lees estimate for EVM the max tx power tracking */ ++ /* need to be less than 6 power index for 88E. */ ++ /* */ ++ if (pwr_value >= ODM_TXPWRTRACK_MAX_IDX_88E && *pDirection == 1) ++ pwr_value = ODM_TXPWRTRACK_MAX_IDX_88E; ++ ++ *pOutWriteVal = pwr_value | (pwr_value << 8) | (pwr_value << 16) | (pwr_value << 24); ++} /* ODM_TxPwrTrackAdjust88E */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: odm_TxPwrTrackSetPwr88E() ++ * ++ * Overview: 88E change all channel tx power accordign to flag. ++ * OFDM & CCK are all different. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 04/23/2012 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++static void odm_TxPwrTrackSetPwr88E(struct odm_dm_struct *dm_odm) ++{ ++ if (dm_odm->BbSwingFlagOfdm || dm_odm->BbSwingFlagCck) { ++ PHY_SetTxPowerLevel8188E(dm_odm->Adapter, *dm_odm->pChannel); ++ dm_odm->BbSwingFlagOfdm = false; ++ dm_odm->BbSwingFlagCck = false; ++ } ++} /* odm_TxPwrTrackSetPwr88E */ ++ ++/* 091212 chiyokolin */ ++void ++odm_TXPowerTrackingCallback_ThermalMeter_8188E( ++ struct adapter *Adapter ++ ) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, offset; ++ u8 ThermalValue_AVG_count = 0; ++ u32 ThermalValue_AVG = 0; ++ s32 ele_A = 0, ele_D, TempCCk, X, value32; ++ s32 Y, ele_C = 0; ++ s8 OFDM_index[2], CCK_index = 0; ++ s8 OFDM_index_old[2] = {0, 0}, CCK_index_old = 0; ++ u32 i = 0, j = 0; ++ bool is2t = false; ++ ++ u8 OFDM_min_index = 6, rf; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */ ++ u8 Indexforchannel = 0/*GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/; ++ s8 OFDM_index_mapping[2][index_mapping_NUM_88E] = { ++ {0, 0, 2, 3, 4, 4, /* 2.4G, decrease power */ ++ 5, 6, 7, 7, 8, 9, ++ 10, 10, 11}, /* For lower temperature, 20120220 updated on 20120220. */ ++ {0, 0, -1, -2, -3, -4, /* 2.4G, increase power */ ++ -4, -4, -4, -5, -7, -8, ++ -9, -9, -10}, ++ }; ++ u8 Thermal_mapping[2][index_mapping_NUM_88E] = { ++ {0, 2, 4, 6, 8, 10, /* 2.4G, decrease power */ ++ 12, 14, 16, 18, 20, 22, ++ 24, 26, 27}, ++ {0, 2, 4, 6, 8, 10, /* 2.4G,, increase power */ ++ 12, 14, 16, 18, 20, 22, ++ 25, 25, 25}, ++ }; ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ /* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */ ++ odm_TxPwrTrackSetPwr88E(dm_odm); ++ ++ dm_odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; /* cosa add for debug */ ++ dm_odm->RFCalibrateInfo.bTXPowerTrackingInit = true; ++ ++ /* RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files. */ ++ dm_odm->RFCalibrateInfo.RegA24 = 0x090e1317; ++ ++ ThermalValue = (u8)ODM_GetRFReg(dm_odm, RF_PATH_A, RF_T_METER_88E, 0xfc00); /* 0x42: RF Reg[15:10] 88E */ ++ ++ if (is2t) ++ rf = 2; ++ else ++ rf = 1; ++ ++ if (ThermalValue) { ++ /* Query OFDM path A default setting */ ++ ele_D = ODM_GetBBReg(dm_odm, rOFDM0_XATxIQImbalance, bMaskDWord) & bMaskOFDM_D; ++ for (i = 0; i < OFDM_TABLE_SIZE_92D; i++) { /* find the index */ ++ if (ele_D == (OFDMSwingTable[i] & bMaskOFDM_D)) { ++ OFDM_index_old[0] = (u8)i; ++ dm_odm->BbSwingIdxOfdmBase = (u8)i; ++ break; ++ } ++ } ++ ++ /* Query OFDM path B default setting */ ++ if (is2t) { ++ ele_D = ODM_GetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, bMaskDWord) & bMaskOFDM_D; ++ for (i = 0; i < OFDM_TABLE_SIZE_92D; i++) { /* find the index */ ++ if (ele_D == (OFDMSwingTable[i] & bMaskOFDM_D)) { ++ OFDM_index_old[1] = (u8)i; ++ break; ++ } ++ } ++ } ++ ++ /* Query CCK default setting From 0xa24 */ ++ TempCCk = dm_odm->RFCalibrateInfo.RegA24; ++ ++ for (i = 0; i < CCK_TABLE_SIZE; i++) { ++ if (dm_odm->RFCalibrateInfo.bCCKinCH14) { ++ if (ODM_CompareMemory(dm_odm, (void *)&TempCCk, (void *)&CCKSwingTable_Ch14[i][2], 4) == 0) { ++ CCK_index_old = (u8)i; ++ dm_odm->BbSwingIdxCckBase = (u8)i; ++ break; ++ } ++ } else { ++ if (ODM_CompareMemory(dm_odm, (void *)&TempCCk, (void *)&CCKSwingTable_Ch1_Ch13[i][2], 4) == 0) { ++ CCK_index_old = (u8)i; ++ dm_odm->BbSwingIdxCckBase = (u8)i; ++ break; ++ } ++ } ++ } ++ ++ if (!dm_odm->RFCalibrateInfo.ThermalValue) { ++ dm_odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; ++ dm_odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue; ++ dm_odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue; ++ ++ for (i = 0; i < rf; i++) ++ dm_odm->RFCalibrateInfo.OFDM_index[i] = OFDM_index_old[i]; ++ dm_odm->RFCalibrateInfo.CCK_index = CCK_index_old; ++ } ++ ++ /* calculate average thermal meter */ ++ dm_odm->RFCalibrateInfo.ThermalValue_AVG[dm_odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue; ++ dm_odm->RFCalibrateInfo.ThermalValue_AVG_index++; ++ if (dm_odm->RFCalibrateInfo.ThermalValue_AVG_index == AVG_THERMAL_NUM_88E) ++ dm_odm->RFCalibrateInfo.ThermalValue_AVG_index = 0; ++ ++ for (i = 0; i < AVG_THERMAL_NUM_88E; i++) { ++ if (dm_odm->RFCalibrateInfo.ThermalValue_AVG[i]) { ++ ThermalValue_AVG += dm_odm->RFCalibrateInfo.ThermalValue_AVG[i]; ++ ThermalValue_AVG_count++; ++ } ++ } ++ ++ if (ThermalValue_AVG_count) ++ ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count); ++ ++ if (dm_odm->RFCalibrateInfo.bReloadtxpowerindex) { ++ delta = ThermalValue > pHalData->EEPROMThermalMeter ? ++ (ThermalValue - pHalData->EEPROMThermalMeter) : ++ (pHalData->EEPROMThermalMeter - ThermalValue); ++ dm_odm->RFCalibrateInfo.bReloadtxpowerindex = false; ++ dm_odm->RFCalibrateInfo.bDoneTxpower = false; ++ } else if (dm_odm->RFCalibrateInfo.bDoneTxpower) { ++ delta = (ThermalValue > dm_odm->RFCalibrateInfo.ThermalValue) ? ++ (ThermalValue - dm_odm->RFCalibrateInfo.ThermalValue) : ++ (dm_odm->RFCalibrateInfo.ThermalValue - ThermalValue); ++ } else { ++ delta = ThermalValue > pHalData->EEPROMThermalMeter ? ++ (ThermalValue - pHalData->EEPROMThermalMeter) : ++ (pHalData->EEPROMThermalMeter - ThermalValue); ++ } ++ delta_LCK = (ThermalValue > dm_odm->RFCalibrateInfo.ThermalValue_LCK) ? ++ (ThermalValue - dm_odm->RFCalibrateInfo.ThermalValue_LCK) : ++ (dm_odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue); ++ delta_IQK = (ThermalValue > dm_odm->RFCalibrateInfo.ThermalValue_IQK) ? ++ (ThermalValue - dm_odm->RFCalibrateInfo.ThermalValue_IQK) : ++ (dm_odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue); ++ ++ if ((delta_LCK >= 8)) { /* Delta temperature is equal to or larger than 20 centigrade. */ ++ dm_odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue; ++ PHY_LCCalibrate_8188E(Adapter); ++ } ++ ++ if (delta > 0 && dm_odm->RFCalibrateInfo.TxPowerTrackControl) { ++ delta = ThermalValue > pHalData->EEPROMThermalMeter ? ++ (ThermalValue - pHalData->EEPROMThermalMeter) : ++ (pHalData->EEPROMThermalMeter - ThermalValue); ++ /* calculate new OFDM / CCK offset */ ++ if (ThermalValue > pHalData->EEPROMThermalMeter) ++ j = 1; ++ else ++ j = 0; ++ for (offset = 0; offset < index_mapping_NUM_88E; offset++) { ++ if (delta < Thermal_mapping[j][offset]) { ++ if (offset != 0) ++ offset--; ++ break; ++ } ++ } ++ if (offset >= index_mapping_NUM_88E) ++ offset = index_mapping_NUM_88E - 1; ++ for (i = 0; i < rf; i++) ++ OFDM_index[i] = dm_odm->RFCalibrateInfo.OFDM_index[i] + OFDM_index_mapping[j][offset]; ++ CCK_index = dm_odm->RFCalibrateInfo.CCK_index + OFDM_index_mapping[j][offset]; ++ ++ for (i = 0; i < rf; i++) { ++ if (OFDM_index[i] > OFDM_TABLE_SIZE_92D - 1) ++ OFDM_index[i] = OFDM_TABLE_SIZE_92D - 1; ++ else if (OFDM_index[i] < OFDM_min_index) ++ OFDM_index[i] = OFDM_min_index; ++ } ++ ++ if (CCK_index > CCK_TABLE_SIZE - 1) ++ CCK_index = CCK_TABLE_SIZE - 1; ++ else if (CCK_index < 0) ++ CCK_index = 0; ++ ++ /* 2 temporarily remove bNOPG */ ++ /* Config by SwingTable */ ++ if (dm_odm->RFCalibrateInfo.TxPowerTrackControl) { ++ dm_odm->RFCalibrateInfo.bDoneTxpower = true; ++ ++ /* Adujst OFDM Ant_A according to IQK result */ ++ ele_D = (OFDMSwingTable[(u8)OFDM_index[0]] & 0xFFC00000) >> 22; ++ X = dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[Indexforchannel].Value[0][0]; ++ Y = dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[Indexforchannel].Value[0][1]; ++ ++ /* Revse TX power table. */ ++ dm_odm->BbSwingIdxOfdm = (u8)OFDM_index[0]; ++ dm_odm->BbSwingIdxCck = (u8)CCK_index; ++ ++ if (dm_odm->BbSwingIdxOfdmCurrent != dm_odm->BbSwingIdxOfdm) { ++ dm_odm->BbSwingIdxOfdmCurrent = dm_odm->BbSwingIdxOfdm; ++ dm_odm->BbSwingFlagOfdm = true; ++ } ++ ++ if (dm_odm->BbSwingIdxCckCurrent != dm_odm->BbSwingIdxCck) { ++ dm_odm->BbSwingIdxCckCurrent = dm_odm->BbSwingIdxCck; ++ dm_odm->BbSwingFlagCck = true; ++ } ++ ++ if (X != 0) { ++ if ((X & 0x00000200) != 0) ++ X = X | 0xFFFFFC00; ++ ele_A = ((X * ele_D) >> 8) & 0x000003FF; ++ ++ /* new element C = element D x Y */ ++ if ((Y & 0x00000200) != 0) ++ Y = Y | 0xFFFFFC00; ++ ele_C = ((Y * ele_D) >> 8) & 0x000003FF; ++ ++ /* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital */ ++ /* to increase TX power. Otherwise, EVM will be bad. */ ++ } ++ ++ if (is2t) { ++ ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000) >> 22; ++ ++ /* new element A = element D x X */ ++ X = dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[Indexforchannel].Value[0][4]; ++ Y = dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[Indexforchannel].Value[0][5]; ++ ++ if ((X != 0) && (*dm_odm->pBandType == ODM_BAND_2_4G)) { ++ if ((X & 0x00000200) != 0) /* consider minus */ ++ X = X | 0xFFFFFC00; ++ ele_A = ((X * ele_D) >> 8) & 0x000003FF; ++ ++ /* new element C = element D x Y */ ++ if ((Y & 0x00000200) != 0) ++ Y = Y | 0xFFFFFC00; ++ ele_C = ((Y * ele_D) >> 8) & 0x00003FF; ++ ++ /* wtite new elements A, C, D to regC88 and regC9C, element B is always 0 */ ++ value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A; ++ ODM_SetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); ++ ++ value32 = (ele_C & 0x000003C0) >> 6; ++ ODM_SetBBReg(dm_odm, rOFDM0_XDTxAFE, bMaskH4Bits, value32); ++ ++ value32 = ((X * ele_D) >> 7) & 0x01; ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(28), value32); ++ } else { ++ ODM_SetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[1]]); ++ ODM_SetBBReg(dm_odm, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(28), 0x00); ++ } ++ } ++ } ++ } ++ ++ if (delta_IQK >= 8) { /* Delta temperature is equal to or larger than 20 centigrade. */ ++ dm_odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue; ++ PHY_IQCalibrate_8188E(Adapter, false); ++ } ++ /* update thermal meter value */ ++ if (dm_odm->RFCalibrateInfo.TxPowerTrackControl) ++ dm_odm->RFCalibrateInfo.ThermalValue = ThermalValue; ++ } ++ dm_odm->RFCalibrateInfo.TXPowercount = 0; ++} ++ ++/* 1 7. IQK */ ++#define MAX_TOLERANCE 5 ++#define IQK_DELAY_TIME 1 /* ms */ ++ ++static u8 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ ++phy_PathA_IQK_8188E(struct adapter *adapt, bool configPathB) ++{ ++ u32 regeac, regE94, regE9C; ++ u8 result = 0x00; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ /* 1 Tx IQK */ ++ /* path-A IQK setting */ ++ ODM_SetBBReg(dm_odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1c); ++ ODM_SetBBReg(dm_odm, rRx_IQK_Tone_A, bMaskDWord, 0x30008c1c); ++ ODM_SetBBReg(dm_odm, rTx_IQK_PI_A, bMaskDWord, 0x8214032a); ++ ODM_SetBBReg(dm_odm, rRx_IQK_PI_A, bMaskDWord, 0x28160000); ++ ++ /* LO calibration setting */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Rsp, bMaskDWord, 0x00462911); ++ ++ /* One shot, path A LOK & IQK */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000); ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000); ++ ++ /* delay x ms */ ++ /* PlatformStallExecution(IQK_DELAY_TIME_88E*1000); */ ++ ODM_delay_ms(IQK_DELAY_TIME_88E); ++ ++ /* Check failed */ ++ regeac = ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_A_2, bMaskDWord); ++ regE94 = ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_A, bMaskDWord); ++ regE9C = ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_A, bMaskDWord); ++ ++ if (!(regeac & BIT(28)) && ++ (((regE94 & 0x03FF0000) >> 16) != 0x142) && ++ (((regE9C & 0x03FF0000) >> 16) != 0x42)) ++ result |= 0x01; ++ return result; ++} ++ ++static u8 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ ++phy_PathA_RxIQK(struct adapter *adapt, bool configPathB) ++{ ++ u32 regeac, regE94, regE9C, regEA4, u4tmp; ++ u8 result = 0x00; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ /* 1 Get TXIMR setting */ ++ /* modify RXIQK mode table */ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x00000000); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_WE_LUT, bRFRegOffsetMask, 0x800a0); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0000f); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf117B); ++ ++ /* PA,PAD off */ ++ ODM_SetRFReg(dm_odm, RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x980); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, 0x56, bRFRegOffsetMask, 0x51000); ++ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x80800000); ++ ++ /* IQK setting */ ++ ODM_SetBBReg(dm_odm, rTx_IQK, bMaskDWord, 0x01007c00); ++ ODM_SetBBReg(dm_odm, rRx_IQK, bMaskDWord, 0x81004800); ++ ++ /* path-A IQK setting */ ++ ODM_SetBBReg(dm_odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1c); ++ ODM_SetBBReg(dm_odm, rRx_IQK_Tone_A, bMaskDWord, 0x30008c1c); ++ ODM_SetBBReg(dm_odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f); ++ ODM_SetBBReg(dm_odm, rRx_IQK_PI_A, bMaskDWord, 0x28160000); ++ ++ /* LO calibration setting */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911); ++ ++ /* One shot, path A LOK & IQK */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000); ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000); ++ ++ /* delay x ms */ ++ ODM_delay_ms(IQK_DELAY_TIME_88E); ++ ++ /* Check failed */ ++ regeac = ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_A_2, bMaskDWord); ++ regE94 = ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_A, bMaskDWord); ++ regE9C = ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_A, bMaskDWord); ++ ++ if (!(regeac & BIT(28)) && ++ (((regE94 & 0x03FF0000) >> 16) != 0x142) && ++ (((regE9C & 0x03FF0000) >> 16) != 0x42)) ++ result |= 0x01; ++ else /* if Tx not OK, ignore Rx */ ++ return result; ++ ++ u4tmp = 0x80007C00 | (regE94 & 0x3FF0000) | ((regE9C & 0x3FF0000) >> 16); ++ ODM_SetBBReg(dm_odm, rTx_IQK, bMaskDWord, u4tmp); ++ ++ /* 1 RX IQK */ ++ /* modify RXIQK mode table */ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x00000000); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_WE_LUT, bRFRegOffsetMask, 0x800a0); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0000f); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7ffa); ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x80800000); ++ ++ /* IQK setting */ ++ ODM_SetBBReg(dm_odm, rRx_IQK, bMaskDWord, 0x01004800); ++ ++ /* path-A IQK setting */ ++ ODM_SetBBReg(dm_odm, rTx_IQK_Tone_A, bMaskDWord, 0x38008c1c); ++ ODM_SetBBReg(dm_odm, rRx_IQK_Tone_A, bMaskDWord, 0x18008c1c); ++ ODM_SetBBReg(dm_odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c05); ++ ODM_SetBBReg(dm_odm, rRx_IQK_PI_A, bMaskDWord, 0x28160c1f); ++ ++ /* LO calibration setting */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911); ++ ++ /* One shot, path A LOK & IQK */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000); ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000); ++ ++ /* delay x ms */ ++ /* PlatformStallExecution(IQK_DELAY_TIME_88E*1000); */ ++ ODM_delay_ms(IQK_DELAY_TIME_88E); ++ ++ /* Check failed */ ++ regeac = ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_A_2, bMaskDWord); ++ regE94 = ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_A, bMaskDWord); ++ regE9C = ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_A, bMaskDWord); ++ regEA4 = ODM_GetBBReg(dm_odm, rRx_Power_Before_IQK_A_2, bMaskDWord); ++ ++ /* reload RF 0xdf */ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x00000000); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x180); ++ ++ if (!(regeac & BIT(27)) && /* if Tx is OK, check whether Rx is OK */ ++ (((regEA4 & 0x03FF0000) >> 16) != 0x132) && ++ (((regeac & 0x03FF0000) >> 16) != 0x36)) ++ result |= 0x02; ++ ++ return result; ++} ++ ++static u8 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ ++phy_PathB_IQK_8188E(struct adapter *adapt) ++{ ++ u32 regeac, regeb4, regebc, regec4, regecc; ++ u8 result = 0x00; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ /* One shot, path B LOK & IQK */ ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Cont, bMaskDWord, 0x00000002); ++ ODM_SetBBReg(dm_odm, rIQK_AGC_Cont, bMaskDWord, 0x00000000); ++ ++ /* delay x ms */ ++ ODM_delay_ms(IQK_DELAY_TIME_88E); ++ ++ /* Check failed */ ++ regeac = ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_A_2, bMaskDWord); ++ regeb4 = ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_B, bMaskDWord); ++ regebc = ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_B, bMaskDWord); ++ regec4 = ODM_GetBBReg(dm_odm, rRx_Power_Before_IQK_B_2, bMaskDWord); ++ regecc = ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_B_2, bMaskDWord); ++ ++ if (!(regeac & BIT(31)) && ++ (((regeb4 & 0x03FF0000) >> 16) != 0x142) && ++ (((regebc & 0x03FF0000) >> 16) != 0x42)) ++ result |= 0x01; ++ else ++ return result; ++ ++ if (!(regeac & BIT(30)) && ++ (((regec4 & 0x03FF0000) >> 16) != 0x132) && ++ (((regecc & 0x03FF0000) >> 16) != 0x36)) ++ result |= 0x02; ++ ++ return result; ++} ++ ++static void patha_fill_iqk(struct adapter *adapt, bool iqkok, s32 result[][8], u8 final_candidate, bool txonly) ++{ ++ u32 Oldval_0, X, TX0_A, reg; ++ s32 Y, TX0_C; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ if (final_candidate == 0xFF) { ++ return; ++ } else if (iqkok) { ++ Oldval_0 = (ODM_GetBBReg(dm_odm, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF; ++ ++ X = result[final_candidate][0]; ++ if ((X & 0x00000200) != 0) ++ X = X | 0xFFFFFC00; ++ TX0_A = (X * Oldval_0) >> 8; ++ ODM_SetBBReg(dm_odm, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A); ++ ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(31), ((X * Oldval_0 >> 7) & 0x1)); ++ ++ Y = result[final_candidate][1]; ++ if ((Y & 0x00000200) != 0) ++ Y = Y | 0xFFFFFC00; ++ ++ TX0_C = (Y * Oldval_0) >> 8; ++ ODM_SetBBReg(dm_odm, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C & 0x3C0) >> 6)); ++ ODM_SetBBReg(dm_odm, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C & 0x3F)); ++ ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(29), ((Y * Oldval_0 >> 7) & 0x1)); ++ ++ if (txonly) ++ return; ++ ++ reg = result[final_candidate][2]; ++ ODM_SetBBReg(dm_odm, rOFDM0_XARxIQImbalance, 0x3FF, reg); ++ ++ reg = result[final_candidate][3] & 0x3F; ++ ODM_SetBBReg(dm_odm, rOFDM0_XARxIQImbalance, 0xFC00, reg); ++ ++ reg = (result[final_candidate][3] >> 6) & 0xF; ++ ODM_SetBBReg(dm_odm, rOFDM0_RxIQExtAnta, 0xF0000000, reg); ++ } ++} ++ ++static void pathb_fill_iqk(struct adapter *adapt, bool iqkok, s32 result[][8], u8 final_candidate, bool txonly) ++{ ++ u32 Oldval_1, X, TX1_A, reg; ++ s32 Y, TX1_C; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ if (final_candidate == 0xFF) { ++ return; ++ } else if (iqkok) { ++ Oldval_1 = (ODM_GetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF; ++ ++ X = result[final_candidate][4]; ++ if ((X & 0x00000200) != 0) ++ X = X | 0xFFFFFC00; ++ TX1_A = (X * Oldval_1) >> 8; ++ ODM_SetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A); ++ ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(27), ((X * Oldval_1 >> 7) & 0x1)); ++ ++ Y = result[final_candidate][5]; ++ if ((Y & 0x00000200) != 0) ++ Y = Y | 0xFFFFFC00; ++ ++ TX1_C = (Y * Oldval_1) >> 8; ++ ODM_SetBBReg(dm_odm, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C & 0x3C0) >> 6)); ++ ODM_SetBBReg(dm_odm, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C & 0x3F)); ++ ++ ODM_SetBBReg(dm_odm, rOFDM0_ECCAThreshold, BIT(25), ((Y * Oldval_1 >> 7) & 0x1)); ++ ++ if (txonly) ++ return; ++ ++ reg = result[final_candidate][6]; ++ ODM_SetBBReg(dm_odm, rOFDM0_XBRxIQImbalance, 0x3FF, reg); ++ ++ reg = result[final_candidate][7] & 0x3F; ++ ODM_SetBBReg(dm_odm, rOFDM0_XBRxIQImbalance, 0xFC00, reg); ++ ++ reg = (result[final_candidate][7] >> 6) & 0xF; ++ ODM_SetBBReg(dm_odm, rOFDM0_AGCRSSITable, 0x0000F000, reg); ++ } ++} ++ ++/* */ ++/* 2011/07/26 MH Add an API for testing IQK fail case. */ ++/* */ ++/* MP Already declare in odm.c */ ++static bool ODM_CheckPowerStatus(struct adapter *Adapter) ++{ ++ return true; ++} ++ ++void _PHY_SaveADDARegisters(struct adapter *adapt, u32 *ADDAReg, u32 *ADDABackup, u32 RegisterNum) ++{ ++ u32 i; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ if (!ODM_CheckPowerStatus(adapt)) ++ return; ++ ++ for (i = 0; i < RegisterNum; i++) { ++ ADDABackup[i] = ODM_GetBBReg(dm_odm, ADDAReg[i], bMaskDWord); ++ } ++} ++ ++static void _PHY_SaveMACRegisters( ++ struct adapter *adapt, ++ u32 *MACReg, ++ u32 *MACBackup ++ ) ++{ ++ u32 i; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) { ++ MACBackup[i] = ODM_Read1Byte(dm_odm, MACReg[i]); ++ } ++ MACBackup[i] = ODM_Read4Byte(dm_odm, MACReg[i]); ++} ++ ++static void reload_adda_reg(struct adapter *adapt, u32 *ADDAReg, u32 *ADDABackup, u32 RegiesterNum) ++{ ++ u32 i; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ for (i = 0; i < RegiesterNum; i++) ++ ODM_SetBBReg(dm_odm, ADDAReg[i], bMaskDWord, ADDABackup[i]); ++} ++ ++static void ++_PHY_ReloadMACRegisters( ++ struct adapter *adapt, ++ u32 *MACReg, ++ u32 *MACBackup ++ ) ++{ ++ u32 i; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) { ++ ODM_Write1Byte(dm_odm, MACReg[i], (u8)MACBackup[i]); ++ } ++ ODM_Write4Byte(dm_odm, MACReg[i], MACBackup[i]); ++} ++ ++void ++_PHY_PathADDAOn( ++ struct adapter *adapt, ++ u32 *ADDAReg, ++ bool isPathAOn, ++ bool is2t ++ ) ++{ ++ u32 pathOn; ++ u32 i; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4; ++ if (!is2t) { ++ pathOn = 0x0bdb25a0; ++ ODM_SetBBReg(dm_odm, ADDAReg[0], bMaskDWord, 0x0b1b25a0); ++ } else { ++ ODM_SetBBReg(dm_odm, ADDAReg[0], bMaskDWord, pathOn); ++ } ++ ++ for (i = 1; i < IQK_ADDA_REG_NUM; i++) ++ ODM_SetBBReg(dm_odm, ADDAReg[i], bMaskDWord, pathOn); ++} ++ ++void ++_PHY_MACSettingCalibration( ++ struct adapter *adapt, ++ u32 *MACReg, ++ u32 *MACBackup ++ ) ++{ ++ u32 i = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ ODM_Write1Byte(dm_odm, MACReg[i], 0x3F); ++ ++ for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++) { ++ ODM_Write1Byte(dm_odm, MACReg[i], (u8)(MACBackup[i] & (~BIT(3)))); ++ } ++ ODM_Write1Byte(dm_odm, MACReg[i], (u8)(MACBackup[i] & (~BIT(5)))); ++} ++ ++void ++_PHY_PathAStandBy( ++ struct adapter *adapt ++ ) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x0); ++ ODM_SetBBReg(dm_odm, 0x840, bMaskDWord, 0x00010000); ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x80800000); ++} ++ ++static void _PHY_PIModeSwitch( ++ struct adapter *adapt, ++ bool PIMode ++ ) ++{ ++ u32 mode; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ mode = PIMode ? 0x01000100 : 0x01000000; ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_HSSIParameter1, bMaskDWord, mode); ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_HSSIParameter1, bMaskDWord, mode); ++} ++ ++static bool phy_SimularityCompare_8188E( ++ struct adapter *adapt, ++ s32 resulta[][8], ++ u8 c1, ++ u8 c2 ++ ) ++{ ++ u32 i, j, diff, sim_bitmap, bound = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */ ++ bool result = true; ++ bool is2t; ++ s32 tmp1 = 0, tmp2 = 0; ++ ++ if ((dm_odm->RFType == ODM_2T2R) || (dm_odm->RFType == ODM_2T3R) || (dm_odm->RFType == ODM_2T4R)) ++ is2t = true; ++ else ++ is2t = false; ++ ++ if (is2t) ++ bound = 8; ++ else ++ bound = 4; ++ ++ sim_bitmap = 0; ++ ++ for (i = 0; i < bound; i++) { ++ if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) { ++ if ((resulta[c1][i] & 0x00000200) != 0) ++ tmp1 = resulta[c1][i] | 0xFFFFFC00; ++ else ++ tmp1 = resulta[c1][i]; ++ ++ if ((resulta[c2][i] & 0x00000200) != 0) ++ tmp2 = resulta[c2][i] | 0xFFFFFC00; ++ else ++ tmp2 = resulta[c2][i]; ++ } else { ++ tmp1 = resulta[c1][i]; ++ tmp2 = resulta[c2][i]; ++ } ++ ++ diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1); ++ ++ if (diff > MAX_TOLERANCE) { ++ if ((i == 2 || i == 6) && !sim_bitmap) { ++ if (resulta[c1][i] + resulta[c1][i + 1] == 0) ++ final_candidate[(i / 4)] = c2; ++ else if (resulta[c2][i] + resulta[c2][i + 1] == 0) ++ final_candidate[(i / 4)] = c1; ++ else ++ sim_bitmap = sim_bitmap | (1 << i); ++ } else { ++ sim_bitmap = sim_bitmap | (1 << i); ++ } ++ } ++ } ++ ++ if (sim_bitmap == 0) { ++ for (i = 0; i < (bound / 4); i++) { ++ if (final_candidate[i] != 0xFF) { ++ for (j = i * 4; j < (i + 1) * 4 - 2; j++) ++ resulta[3][j] = resulta[final_candidate[i]][j]; ++ result = false; ++ } ++ } ++ return result; ++ } else { ++ if (!(sim_bitmap & 0x03)) { /* path A TX OK */ ++ for (i = 0; i < 2; i++) ++ resulta[3][i] = resulta[c1][i]; ++ } ++ if (!(sim_bitmap & 0x0c)) { /* path A RX OK */ ++ for (i = 2; i < 4; i++) ++ resulta[3][i] = resulta[c1][i]; ++ } ++ ++ if (!(sim_bitmap & 0x30)) { /* path B TX OK */ ++ for (i = 4; i < 6; i++) ++ resulta[3][i] = resulta[c1][i]; ++ } ++ ++ if (!(sim_bitmap & 0xc0)) { /* path B RX OK */ ++ for (i = 6; i < 8; i++) ++ resulta[3][i] = resulta[c1][i]; ++ } ++ return false; ++ } ++} ++ ++static void phy_IQCalibrate_8188E(struct adapter *adapt, s32 result[][8], u8 t, bool is2t) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ u32 i; ++ u8 PathAOK, PathBOK; ++ u32 ADDA_REG[IQK_ADDA_REG_NUM] = { ++ rFPGA0_XCD_SwitchControl, rBlue_Tooth, ++ rRx_Wait_CCA, rTx_CCK_RFON, ++ rTx_CCK_BBON, rTx_OFDM_RFON, ++ rTx_OFDM_BBON, rTx_To_Rx, ++ rTx_To_Tx, rRx_CCK, ++ rRx_OFDM, rRx_Wait_RIFS, ++ rRx_TO_Rx, rStandby, ++ rSleep, rPMPD_ANAEN }; ++ u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = { ++ REG_TXPAUSE, REG_BCN_CTRL, ++ REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; ++ ++ /* since 92C & 92D have the different define in IQK_BB_REG */ ++ u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = { ++ rOFDM0_TRxPathEnable, rOFDM0_TRMuxPar, ++ rFPGA0_XCD_RFInterfaceSW, rConfig_AntA, rConfig_AntB, ++ rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, ++ rFPGA0_XB_RFInterfaceOE, rFPGA0_RFMOD ++ }; ++ ++ u32 retryCount = 9; ++ if (*dm_odm->mp_mode == 1) ++ retryCount = 9; ++ else ++ retryCount = 2; ++ /* Note: IQ calibration must be performed after loading */ ++ /* PHY_REG.txt , and radio_a, radio_b.txt */ ++ ++ if (t == 0) { ++ /* Save ADDA parameters, turn Path A ADDA on */ ++ _PHY_SaveADDARegisters(adapt, ADDA_REG, dm_odm->RFCalibrateInfo.ADDA_backup, IQK_ADDA_REG_NUM); ++ _PHY_SaveMACRegisters(adapt, IQK_MAC_REG, dm_odm->RFCalibrateInfo.IQK_MAC_backup); ++ _PHY_SaveADDARegisters(adapt, IQK_BB_REG_92C, dm_odm->RFCalibrateInfo.IQK_BB_backup, IQK_BB_REG_NUM); ++ } ++ ++ _PHY_PathADDAOn(adapt, ADDA_REG, true, is2t); ++ if (t == 0) ++ dm_odm->RFCalibrateInfo.bRfPiEnable = (u8)ODM_GetBBReg(dm_odm, rFPGA0_XA_HSSIParameter1, BIT(8)); ++ ++ if (!dm_odm->RFCalibrateInfo.bRfPiEnable) { ++ /* Switch BB to PI mode to do IQ Calibration. */ ++ _PHY_PIModeSwitch(adapt, true); ++ } ++ ++ /* BB setting */ ++ ODM_SetBBReg(dm_odm, rFPGA0_RFMOD, BIT(24), 0x00); ++ ODM_SetBBReg(dm_odm, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600); ++ ODM_SetBBReg(dm_odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4); ++ ODM_SetBBReg(dm_odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000); ++ ++ ODM_SetBBReg(dm_odm, rFPGA0_XAB_RFInterfaceSW, BIT(10), 0x01); ++ ODM_SetBBReg(dm_odm, rFPGA0_XAB_RFInterfaceSW, BIT(26), 0x01); ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_RFInterfaceOE, BIT(10), 0x00); ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_RFInterfaceOE, BIT(10), 0x00); ++ ++ if (is2t) { ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000); ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000); ++ } ++ ++ /* MAC settings */ ++ _PHY_MACSettingCalibration(adapt, IQK_MAC_REG, dm_odm->RFCalibrateInfo.IQK_MAC_backup); ++ ++ /* Page B init */ ++ /* AP or IQK */ ++ ODM_SetBBReg(dm_odm, rConfig_AntA, bMaskDWord, 0x0f600000); ++ ++ if (is2t) ++ ODM_SetBBReg(dm_odm, rConfig_AntB, bMaskDWord, 0x0f600000); ++ ++ /* IQ calibration setting */ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0x80800000); ++ ODM_SetBBReg(dm_odm, rTx_IQK, bMaskDWord, 0x01007c00); ++ ODM_SetBBReg(dm_odm, rRx_IQK, bMaskDWord, 0x81004800); ++ ++ for (i = 0; i < retryCount; i++) { ++ PathAOK = phy_PathA_IQK_8188E(adapt, is2t); ++ if (PathAOK == 0x01) { ++ result[t][0] = (ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_A, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][1] = (ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_A, bMaskDWord) & 0x3FF0000) >> 16; ++ break; ++ } ++ } ++ ++ for (i = 0; i < retryCount; i++) { ++ PathAOK = phy_PathA_RxIQK(adapt, is2t); ++ if (PathAOK == 0x03) { ++ result[t][2] = (ODM_GetBBReg(dm_odm, rRx_Power_Before_IQK_A_2, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][3] = (ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_A_2, bMaskDWord) & 0x3FF0000) >> 16; ++ break; ++ } ++ } ++ ++ if (is2t) { ++ _PHY_PathAStandBy(adapt); ++ ++ /* Turn Path B ADDA on */ ++ _PHY_PathADDAOn(adapt, ADDA_REG, false, is2t); ++ ++ for (i = 0; i < retryCount; i++) { ++ PathBOK = phy_PathB_IQK_8188E(adapt); ++ if (PathBOK == 0x03) { ++ result[t][4] = (ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_B, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][5] = (ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_B, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][6] = (ODM_GetBBReg(dm_odm, rRx_Power_Before_IQK_B_2, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][7] = (ODM_GetBBReg(dm_odm, rRx_Power_After_IQK_B_2, bMaskDWord) & 0x3FF0000) >> 16; ++ break; ++ } else if (i == (retryCount - 1) && PathBOK == 0x01) { /* Tx IQK OK */ ++ result[t][4] = (ODM_GetBBReg(dm_odm, rTx_Power_Before_IQK_B, bMaskDWord) & 0x3FF0000) >> 16; ++ result[t][5] = (ODM_GetBBReg(dm_odm, rTx_Power_After_IQK_B, bMaskDWord) & 0x3FF0000) >> 16; ++ } ++ } ++ } ++ ++ /* Back to BB mode, load original value */ ++ ODM_SetBBReg(dm_odm, rFPGA0_IQK, bMaskDWord, 0); ++ ++ if (t != 0) { ++ if (!dm_odm->RFCalibrateInfo.bRfPiEnable) { ++ /* Switch back BB to SI mode after finish IQ Calibration. */ ++ _PHY_PIModeSwitch(adapt, false); ++ } ++ ++ /* Reload ADDA power saving parameters */ ++ reload_adda_reg(adapt, ADDA_REG, dm_odm->RFCalibrateInfo.ADDA_backup, IQK_ADDA_REG_NUM); ++ ++ /* Reload MAC parameters */ ++ _PHY_ReloadMACRegisters(adapt, IQK_MAC_REG, dm_odm->RFCalibrateInfo.IQK_MAC_backup); ++ ++ reload_adda_reg(adapt, IQK_BB_REG_92C, dm_odm->RFCalibrateInfo.IQK_BB_backup, IQK_BB_REG_NUM); ++ ++ /* Restore RX initial gain */ ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3); ++ if (is2t) ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3); ++ ++ /* load 0xe30 IQC default value */ ++ ODM_SetBBReg(dm_odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); ++ ODM_SetBBReg(dm_odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00); ++ } ++} ++ ++static void phy_LCCalibrate_8188E(struct adapter *adapt, bool is2t) ++{ ++ u8 tmpreg; ++ u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ /* Check continuous TX and Packet TX */ ++ tmpreg = ODM_Read1Byte(dm_odm, 0xd03); ++ ++ if ((tmpreg & 0x70) != 0) /* Deal with contisuous TX case */ ++ ODM_Write1Byte(dm_odm, 0xd03, tmpreg & 0x8F); /* disable all continuous TX */ ++ else /* Deal with Packet TX case */ ++ ODM_Write1Byte(dm_odm, REG_TXPAUSE, 0xFF); /* block all queues */ ++ ++ if ((tmpreg & 0x70) != 0) { ++ /* 1. Read original RF mode */ ++ /* Path-A */ ++ RF_Amode = PHY_QueryRFReg(adapt, RF_PATH_A, RF_AC, bMask12Bits); ++ ++ /* Path-B */ ++ if (is2t) ++ RF_Bmode = PHY_QueryRFReg(adapt, RF_PATH_B, RF_AC, bMask12Bits); ++ ++ /* 2. Set RF mode = standby mode */ ++ /* Path-A */ ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode & 0x8FFFF) | 0x10000); ++ ++ /* Path-B */ ++ if (is2t) ++ ODM_SetRFReg(dm_odm, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode & 0x8FFFF) | 0x10000); ++ } ++ ++ /* 3. Read RF reg18 */ ++ LC_Cal = PHY_QueryRFReg(adapt, RF_PATH_A, RF_CHNLBW, bMask12Bits); ++ ++ /* 4. Set LC calibration begin bit15 */ ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal | 0x08000); ++ ++ ODM_sleep_ms(100); ++ ++ /* Restore original situation */ ++ if ((tmpreg & 0x70) != 0) { ++ /* Deal with continuous TX case */ ++ /* Path-A */ ++ ODM_Write1Byte(dm_odm, 0xd03, tmpreg); ++ ODM_SetRFReg(dm_odm, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode); ++ ++ /* Path-B */ ++ if (is2t) ++ ODM_SetRFReg(dm_odm, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode); ++ } else { ++ /* Deal with Packet TX case */ ++ ODM_Write1Byte(dm_odm, REG_TXPAUSE, 0x00); ++ } ++} ++ ++void PHY_IQCalibrate_8188E(struct adapter *adapt, bool recovery) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ struct mpt_context *pMptCtx = &adapt->mppriv.MptCtx; ++ s32 result[4][8]; /* last is final result */ ++ u8 i, final_candidate; ++ bool pathaok, pathbok; ++ s32 RegE94, RegE9C, RegEA4, RegEB4, RegEBC, RegEC4; ++ bool is12simular, is13simular, is23simular; ++ bool singletone = false, carrier_sup = false; ++ u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = { ++ rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance, ++ rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable, ++ rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance, ++ rOFDM0_XCTxAFE, rOFDM0_XDTxAFE, ++ rOFDM0_RxIQExtAnta}; ++ bool is2t; ++ ++ is2t = (dm_odm->RFType == ODM_2T2R) ? true : false; ++ if (!ODM_CheckPowerStatus(adapt)) ++ return; ++ ++ if (!(dm_odm->SupportAbility & ODM_RF_CALIBRATION)) ++ return; ++ ++ if (*dm_odm->mp_mode == 1) { ++ singletone = pMptCtx->bSingleTone; ++ carrier_sup = pMptCtx->bCarrierSuppression; ++ } ++ ++ /* 20120213 Turn on when continuous Tx to pass lab testing. (required by Edlu) */ ++ if (singletone || carrier_sup) ++ return; ++ ++ if (recovery) { ++ reload_adda_reg(adapt, IQK_BB_REG_92C, dm_odm->RFCalibrateInfo.IQK_BB_backup_recover, 9); ++ return; ++ } ++ ++ for (i = 0; i < 8; i++) { ++ result[0][i] = 0; ++ result[1][i] = 0; ++ result[2][i] = 0; ++ if ((i == 0) || (i == 2) || (i == 4) || (i == 6)) ++ result[3][i] = 0x100; ++ else ++ result[3][i] = 0; ++ } ++ final_candidate = 0xff; ++ pathaok = false; ++ pathbok = false; ++ is12simular = false; ++ is23simular = false; ++ is13simular = false; ++ ++ for (i = 0; i < 3; i++) { ++ phy_IQCalibrate_8188E(adapt, result, i, is2t); ++ ++ if (i == 1) { ++ is12simular = phy_SimularityCompare_8188E(adapt, result, 0, 1); ++ if (is12simular) { ++ final_candidate = 0; ++ break; ++ } ++ } ++ ++ if (i == 2) { ++ is13simular = phy_SimularityCompare_8188E(adapt, result, 0, 2); ++ if (is13simular) { ++ final_candidate = 0; ++ ++ break; ++ } ++ is23simular = phy_SimularityCompare_8188E(adapt, result, 1, 2); ++ if (is23simular) { ++ final_candidate = 1; ++ } else { ++ final_candidate = 3; ++ } ++ } ++ } ++ ++ for (i = 0; i < 4; i++) { ++ RegE94 = result[i][0]; ++ RegE9C = result[i][1]; ++ RegEA4 = result[i][2]; ++ RegEB4 = result[i][4]; ++ RegEBC = result[i][5]; ++ RegEC4 = result[i][6]; ++ } ++ ++ if (final_candidate != 0xff) { ++ RegE94 = result[final_candidate][0]; ++ RegE9C = result[final_candidate][1]; ++ RegEA4 = result[final_candidate][2]; ++ RegEB4 = result[final_candidate][4]; ++ RegEBC = result[final_candidate][5]; ++ dm_odm->RFCalibrateInfo.RegE94 = RegE94; ++ dm_odm->RFCalibrateInfo.RegE9C = RegE9C; ++ dm_odm->RFCalibrateInfo.RegEB4 = RegEB4; ++ dm_odm->RFCalibrateInfo.RegEBC = RegEBC; ++ RegEC4 = result[final_candidate][6]; ++ pathaok = true; ++ pathbok = true; ++ } else { ++ dm_odm->RFCalibrateInfo.RegE94 = 0x100; ++ dm_odm->RFCalibrateInfo.RegEB4 = 0x100; /* X default value */ ++ dm_odm->RFCalibrateInfo.RegE9C = 0x0; ++ dm_odm->RFCalibrateInfo.RegEBC = 0x0; /* Y default value */ ++ } ++ if (RegE94 != 0) ++ patha_fill_iqk(adapt, pathaok, result, final_candidate, (RegEA4 == 0)); ++ if (is2t) { ++ if (RegEB4 != 0) ++ pathb_fill_iqk(adapt, pathbok, result, final_candidate, (RegEC4 == 0)); ++ } ++ ++/* To Fix BSOD when final_candidate is 0xff */ ++/* by sherry 20120321 */ ++ if (final_candidate < 4) { ++ for (i = 0; i < IQK_Matrix_REG_NUM; i++) ++ dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[0].Value[0][i] = result[final_candidate][i]; ++ dm_odm->RFCalibrateInfo.IQKMatrixRegSetting[0].bIQKDone = true; ++ } ++ ++ _PHY_SaveADDARegisters(adapt, IQK_BB_REG_92C, dm_odm->RFCalibrateInfo.IQK_BB_backup_recover, 9); ++} ++ ++void PHY_LCCalibrate_8188E(struct adapter *adapt) ++{ ++ bool singletone = false, carrier_sup = false; ++ u32 timeout = 2000, timecount = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ struct mpt_context *pMptCtx = &adapt->mppriv.MptCtx; ++ ++ if (*dm_odm->mp_mode == 1) { ++ singletone = pMptCtx->bSingleTone; ++ carrier_sup = pMptCtx->bCarrierSuppression; ++ } ++ if (!(dm_odm->SupportAbility & ODM_RF_CALIBRATION)) ++ return; ++ /* 20120213 Turn on when continuous Tx to pass lab testing. (required by Edlu) */ ++ if (singletone || carrier_sup) ++ return; ++ ++ while (*dm_odm->pbScanInProcess && timecount < timeout) { ++ ODM_delay_ms(50); ++ timecount += 50; ++ } ++ ++ dm_odm->RFCalibrateInfo.bLCKInProgress = true; ++ ++ if (dm_odm->RFType == ODM_2T2R) { ++ phy_LCCalibrate_8188E(adapt, true); ++ } else { ++ /* For 88C 1T1R */ ++ phy_LCCalibrate_8188E(adapt, false); ++ } ++ ++ dm_odm->RFCalibrateInfo.bLCKInProgress = false; ++} ++ ++static void phy_setrfpathswitch_8188e(struct adapter *adapt, bool main, bool is2t) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ if (!adapt->hw_init_completed) { ++ u8 u1btmp; ++ u1btmp = ODM_Read1Byte(dm_odm, REG_LEDCFG2) | BIT(7); ++ ODM_Write1Byte(dm_odm, REG_LEDCFG2, u1btmp); ++ ODM_SetBBReg(dm_odm, rFPGA0_XAB_RFParameter, BIT(13), 0x01); ++ } ++ ++ if (is2t) { /* 92C */ ++ if (main) ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_RFInterfaceOE, BIT(5) | BIT(6), 0x1); /* 92C_Path_A */ ++ else ++ ODM_SetBBReg(dm_odm, rFPGA0_XB_RFInterfaceOE, BIT(5) | BIT(6), 0x2); /* BT */ ++ } else { /* 88C */ ++ if (main) ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_RFInterfaceOE, BIT(8) | BIT(9), 0x2); /* Main */ ++ else ++ ODM_SetBBReg(dm_odm, rFPGA0_XA_RFInterfaceOE, BIT(8) | BIT(9), 0x1); /* Aux */ ++ } ++} ++ ++void PHY_SetRFPathSwitch_8188E(struct adapter *adapt, bool main) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(adapt); ++ struct odm_dm_struct *dm_odm = &pHalData->odmpriv; ++ ++ if (dm_odm->RFType == ODM_2T2R) { ++ phy_setrfpathswitch_8188e(adapt, main, true); ++ } else { ++ /* For 88C 1T1R */ ++ phy_setrfpathswitch_8188e(adapt, main, false); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c +new file mode 100644 +index 000000000000..0fd11aca7ac7 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c +@@ -0,0 +1,95 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/*++ ++ ++Module Name: ++ HalPwrSeqCmd.c ++ ++Abstract: ++ Implement HW Power sequence configuration CMD handling routine for Realtek devices. ++ ++Major Change History: ++ When Who What ++ ---------- --------------- ------------------------------- ++ 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. ++ 2011-07-07 Roger Create. ++ ++--*/ ++ ++#include "../include/HalPwrSeqCmd.h" ++ ++/* Description: */ ++/* This routine deals with the Power Configuration CMDs parsing ++ * for RTL8723/RTL8188E Series IC. ++ * Assumption: ++ * We should follow specific format which was released from HW SD. ++ */ ++u8 HalPwrSeqCmdParsing(struct adapter *padapter, u8 cut_vers, u8 fab_vers, ++ u8 ifacetype, struct wl_pwr_cfg pwrseqcmd[]) ++{ ++ struct wl_pwr_cfg pwrcfgcmd = {0}; ++ u8 poll_bit = false; ++ u32 aryidx = 0; ++ u8 value = 0; ++ u32 offset = 0; ++ u32 poll_count = 0; /* polling autoload done. */ ++ u32 max_poll_count = 5000; ++ ++ do { ++ pwrcfgcmd = pwrseqcmd[aryidx]; ++ ++ /* 2 Only Handle the command whose FAB, CUT, and Interface are matched */ ++ if ((GET_PWR_CFG_FAB_MASK(pwrcfgcmd) & fab_vers) && ++ (GET_PWR_CFG_CUT_MASK(pwrcfgcmd) & cut_vers) && ++ (GET_PWR_CFG_INTF_MASK(pwrcfgcmd) & ifacetype)) { ++ switch (GET_PWR_CFG_CMD(pwrcfgcmd)) { ++ case PWR_CMD_WRITE: ++ offset = GET_PWR_CFG_OFFSET(pwrcfgcmd); ++ ++ /* Read the value from system register */ ++ value = rtw_read8(padapter, offset); ++ ++ value &= ~(GET_PWR_CFG_MASK(pwrcfgcmd)); ++ value |= (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrcfgcmd)); ++ ++ /* Write the value back to system register */ ++ rtw_write8(padapter, offset, value); ++ break; ++ case PWR_CMD_POLLING: ++ poll_bit = false; ++ offset = GET_PWR_CFG_OFFSET(pwrcfgcmd); ++ do { ++ value = rtw_read8(padapter, offset); ++ ++ value &= GET_PWR_CFG_MASK(pwrcfgcmd); ++ if (value == (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrcfgcmd))) ++ poll_bit = true; ++ else ++ udelay(10); ++ ++ if (poll_count++ > max_poll_count) { ++ DBG_88E("Fail to polling Offset[%#x]\n", offset); ++ return false; ++ } ++ } while (!poll_bit); ++ break; ++ case PWR_CMD_DELAY: ++ if (GET_PWR_CFG_VALUE(pwrcfgcmd) == PWRSEQ_DELAY_US) ++ udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd)); ++ else ++ udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd) * 1000); ++ break; ++ case PWR_CMD_END: ++ /* When this command is parsed, end the process */ ++ return true; ++ break; ++ default: ++ break; ++ } ++ } ++ ++ aryidx++;/* Add Array Index */ ++ } while (1); ++ return true; ++} +diff --git a/drivers/staging/r8188eu/hal/hal_com.c b/drivers/staging/r8188eu/hal/hal_com.c +new file mode 100644 +index 000000000000..f09d4d49b159 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/hal_com.c +@@ -0,0 +1,358 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++ ++#include "../include/hal_intf.h" ++#include "../include/hal_com.h" ++#include "../include/rtl8188e_hal.h" ++ ++#define _HAL_INIT_C_ ++ ++void dump_chip_info(struct HAL_VERSION chip_vers) ++{ ++ uint cnt = 0; ++ char buf[128]; ++ ++ if (IS_81XXC(chip_vers)) { ++ cnt += sprintf((buf + cnt), "Chip Version Info: %s_", ++ IS_92C_SERIAL(chip_vers) ? ++ "CHIP_8192C" : "CHIP_8188C"); ++ } else if (IS_92D(chip_vers)) { ++ cnt += sprintf((buf + cnt), "Chip Version Info: CHIP_8192D_"); ++ } else if (IS_8723_SERIES(chip_vers)) { ++ cnt += sprintf((buf + cnt), "Chip Version Info: CHIP_8723A_"); ++ } else if (IS_8188E(chip_vers)) { ++ cnt += sprintf((buf + cnt), "Chip Version Info: CHIP_8188E_"); ++ } ++ ++ cnt += sprintf((buf + cnt), "%s_", IS_NORMAL_CHIP(chip_vers) ? ++ "Normal_Chip" : "Test_Chip"); ++ cnt += sprintf((buf + cnt), "%s_", IS_CHIP_VENDOR_TSMC(chip_vers) ? ++ "TSMC" : "UMC"); ++ if (IS_A_CUT(chip_vers)) ++ cnt += sprintf((buf + cnt), "A_CUT_"); ++ else if (IS_B_CUT(chip_vers)) ++ cnt += sprintf((buf + cnt), "B_CUT_"); ++ else if (IS_C_CUT(chip_vers)) ++ cnt += sprintf((buf + cnt), "C_CUT_"); ++ else if (IS_D_CUT(chip_vers)) ++ cnt += sprintf((buf + cnt), "D_CUT_"); ++ else if (IS_E_CUT(chip_vers)) ++ cnt += sprintf((buf + cnt), "E_CUT_"); ++ else ++ cnt += sprintf((buf + cnt), "UNKNOWN_CUT(%d)_", ++ chip_vers.CUTVersion); ++ ++ if (IS_1T1R(chip_vers)) ++ cnt += sprintf((buf + cnt), "1T1R_"); ++ else if (IS_1T2R(chip_vers)) ++ cnt += sprintf((buf + cnt), "1T2R_"); ++ else if (IS_2T2R(chip_vers)) ++ cnt += sprintf((buf + cnt), "2T2R_"); ++ else ++ cnt += sprintf((buf + cnt), "UNKNOWN_RFTYPE(%d)_", ++ chip_vers.RFType); ++ ++ cnt += sprintf((buf + cnt), "RomVer(%d)\n", chip_vers.ROMVer); ++ ++ pr_info("%s", buf); ++} ++ ++#define CHAN_PLAN_HW 0x80 ++ ++u8 /* return the final channel plan decision */ ++hal_com_get_channel_plan(struct adapter *padapter, u8 hw_channel_plan, ++ u8 sw_channel_plan, u8 def_channel_plan, ++ bool load_fail) ++{ ++ u8 sw_cfg; ++ u8 chnlplan; ++ ++ sw_cfg = true; ++ if (!load_fail) { ++ if (!rtw_is_channel_plan_valid(sw_channel_plan)) ++ sw_cfg = false; ++ if (hw_channel_plan & CHAN_PLAN_HW) ++ sw_cfg = false; ++ } ++ ++ if (sw_cfg) ++ chnlplan = sw_channel_plan; ++ else ++ chnlplan = hw_channel_plan & (~CHAN_PLAN_HW); ++ ++ if (!rtw_is_channel_plan_valid(chnlplan)) ++ chnlplan = def_channel_plan; ++ ++ return chnlplan; ++} ++ ++u8 MRateToHwRate(u8 rate) ++{ ++ u8 ret = DESC_RATE1M; ++ ++ switch (rate) { ++ /* CCK and OFDM non-HT rates */ ++ case IEEE80211_CCK_RATE_1MB: ++ ret = DESC_RATE1M; ++ break; ++ case IEEE80211_CCK_RATE_2MB: ++ ret = DESC_RATE2M; ++ break; ++ case IEEE80211_CCK_RATE_5MB: ++ ret = DESC_RATE5_5M; ++ break; ++ case IEEE80211_CCK_RATE_11MB: ++ ret = DESC_RATE11M; ++ break; ++ case IEEE80211_OFDM_RATE_6MB: ++ ret = DESC_RATE6M; ++ break; ++ case IEEE80211_OFDM_RATE_9MB: ++ ret = DESC_RATE9M; ++ break; ++ case IEEE80211_OFDM_RATE_12MB: ++ ret = DESC_RATE12M; ++ break; ++ case IEEE80211_OFDM_RATE_18MB: ++ ret = DESC_RATE18M; ++ break; ++ case IEEE80211_OFDM_RATE_24MB: ++ ret = DESC_RATE24M; ++ break; ++ case IEEE80211_OFDM_RATE_36MB: ++ ret = DESC_RATE36M; ++ break; ++ case IEEE80211_OFDM_RATE_48MB: ++ ret = DESC_RATE48M; ++ break; ++ case IEEE80211_OFDM_RATE_54MB: ++ ret = DESC_RATE54M; ++ break; ++ default: ++ break; ++ } ++ return ret; ++} ++ ++void HalSetBrateCfg(struct adapter *adapt, u8 *brates, u16 *rate_cfg) ++{ ++ u8 i, is_brate, brate; ++ ++ for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { ++ is_brate = brates[i] & IEEE80211_BASIC_RATE_MASK; ++ brate = brates[i] & 0x7f; ++ ++ if (is_brate) { ++ switch (brate) { ++ case IEEE80211_CCK_RATE_1MB: ++ *rate_cfg |= RATE_1M; ++ break; ++ case IEEE80211_CCK_RATE_2MB: ++ *rate_cfg |= RATE_2M; ++ break; ++ case IEEE80211_CCK_RATE_5MB: ++ *rate_cfg |= RATE_5_5M; ++ break; ++ case IEEE80211_CCK_RATE_11MB: ++ *rate_cfg |= RATE_11M; ++ break; ++ case IEEE80211_OFDM_RATE_6MB: ++ *rate_cfg |= RATE_6M; ++ break; ++ case IEEE80211_OFDM_RATE_9MB: ++ *rate_cfg |= RATE_9M; ++ break; ++ case IEEE80211_OFDM_RATE_12MB: ++ *rate_cfg |= RATE_12M; ++ break; ++ case IEEE80211_OFDM_RATE_18MB: ++ *rate_cfg |= RATE_18M; ++ break; ++ case IEEE80211_OFDM_RATE_24MB: ++ *rate_cfg |= RATE_24M; ++ break; ++ case IEEE80211_OFDM_RATE_36MB: ++ *rate_cfg |= RATE_36M; ++ break; ++ case IEEE80211_OFDM_RATE_48MB: ++ *rate_cfg |= RATE_48M; ++ break; ++ case IEEE80211_OFDM_RATE_54MB: ++ *rate_cfg |= RATE_54M; ++ break; ++ } ++ } ++ } ++} ++ ++static void one_out_pipe(struct adapter *adapter) ++{ ++ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); ++ ++ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ ++ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ ++ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */ ++ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */ ++ ++ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ ++ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ ++ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ ++ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ ++} ++ ++static void two_out_pipe(struct adapter *adapter, bool wifi_cfg) ++{ ++ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); ++ ++ if (wifi_cfg) { /* WMM */ ++ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ ++ /* 0, 1, 0, 1, 0, 0, 0, 0, 0}; */ ++ /* 0:H, 1:L */ ++ ++ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */ ++ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ ++ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ ++ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */ ++ ++ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ ++ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ ++ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ ++ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ ++ ++ } else {/* typical setting */ ++ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ ++ /* 1, 1, 0, 0, 0, 0, 0, 0, 0}; */ ++ /* 0:H, 1:L */ ++ ++ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ ++ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ ++ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ ++ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */ ++ ++ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ ++ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ ++ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ ++ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ ++ } ++} ++ ++static void three_out_pipe(struct adapter *adapter, bool wifi_cfg) ++{ ++ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); ++ ++ if (wifi_cfg) {/* for WMM */ ++ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ ++ /* 1, 2, 1, 0, 0, 0, 0, 0, 0}; */ ++ /* 0:H, 1:N, 2:L */ ++ ++ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ ++ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */ ++ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */ ++ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */ ++ ++ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ ++ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ ++ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ ++ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ ++ ++ } else {/* typical setting */ ++ /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ ++ /* 2, 2, 1, 0, 0, 0, 0, 0, 0}; */ ++ /* 0:H, 1:N, 2:L */ ++ ++ pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ ++ pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */ ++ pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */ ++ pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */ ++ ++ pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ ++ pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ ++ pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ ++ pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ ++ } ++} ++ ++bool Hal_MappingOutPipe(struct adapter *adapter, u8 numoutpipe) ++{ ++ struct registry_priv *pregistrypriv = &adapter->registrypriv; ++ bool wifi_cfg = (pregistrypriv->wifi_spec) ? true : false; ++ bool result = true; ++ ++ switch (numoutpipe) { ++ case 2: ++ two_out_pipe(adapter, wifi_cfg); ++ break; ++ case 3: ++ three_out_pipe(adapter, wifi_cfg); ++ break; ++ case 1: ++ one_out_pipe(adapter); ++ break; ++ default: ++ result = false; ++ break; ++ } ++ return result; ++} ++ ++void hal_init_macaddr(struct adapter *adapter) ++{ ++ rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, ++ adapter->eeprompriv.mac_addr); ++} ++ ++/* ++* C2H event format: ++* Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID ++* BITS [127:120] [119:16] [15:8] [7:4] [3:0] ++*/ ++ ++void c2h_evt_clear(struct adapter *adapter) ++{ ++ rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE); ++} ++ ++s32 c2h_evt_read(struct adapter *adapter, u8 *buf) ++{ ++ s32 ret = _FAIL; ++ struct c2h_evt_hdr *c2h_evt; ++ int i; ++ u8 trigger; ++ ++ if (!buf) ++ goto exit; ++ ++ trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR); ++ ++ if (trigger == C2H_EVT_HOST_CLOSE) ++ goto exit; /* Not ready */ ++ else if (trigger != C2H_EVT_FW_CLOSE) ++ goto clear_evt; /* Not a valid value */ ++ ++ c2h_evt = (struct c2h_evt_hdr *)buf; ++ ++ memset(c2h_evt, 0, 16); ++ ++ *buf = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL); ++ *(buf + 1) = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1); ++ ++ /* Read the content */ ++ for (i = 0; i < c2h_evt->plen; i++) ++ c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + ++ sizeof(*c2h_evt) + i); ++ ++ ret = _SUCCESS; ++ ++clear_evt: ++ /* ++ * Clear event to notify FW we have read the command. ++ * If this field isn't clear, the FW won't update the next ++ * command message. ++ */ ++ c2h_evt_clear(adapter); ++exit: ++ return ret; ++} +diff --git a/drivers/staging/r8188eu/hal/hal_intf.c b/drivers/staging/r8188eu/hal/hal_intf.c +new file mode 100644 +index 000000000000..a6d589e89aeb +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/hal_intf.c +@@ -0,0 +1,441 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _HAL_INTF_C_ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/hal_intf.h" ++ ++void rtw_hal_chip_configure(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.intf_chip_configure) ++ adapt->HalFunc.intf_chip_configure(adapt); ++} ++ ++void rtw_hal_read_chip_info(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.read_adapter_info) ++ adapt->HalFunc.read_adapter_info(adapt); ++} ++ ++void rtw_hal_read_chip_version(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.read_chip_version) ++ adapt->HalFunc.read_chip_version(adapt); ++} ++ ++void rtw_hal_def_value_init(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.init_default_value) ++ adapt->HalFunc.init_default_value(adapt); ++} ++ ++void rtw_hal_free_data(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.free_hal_data) ++ adapt->HalFunc.free_hal_data(adapt); ++} ++ ++void rtw_hal_dm_init(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.dm_init) ++ adapt->HalFunc.dm_init(adapt); ++} ++ ++void rtw_hal_dm_deinit(struct adapter *adapt) ++{ ++ /* cancel dm timer */ ++ if (adapt->HalFunc.dm_deinit) ++ adapt->HalFunc.dm_deinit(adapt); ++} ++ ++void rtw_hal_sw_led_init(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.InitSwLeds) ++ adapt->HalFunc.InitSwLeds(adapt); ++} ++ ++void rtw_hal_sw_led_deinit(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.DeInitSwLeds) ++ adapt->HalFunc.DeInitSwLeds(adapt); ++} ++ ++u32 rtw_hal_power_on(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.hal_power_on) ++ return adapt->HalFunc.hal_power_on(adapt); ++ return _FAIL; ++} ++ ++uint rtw_hal_init(struct adapter *adapt) ++{ ++ uint status = _SUCCESS; ++ ++ adapt->hw_init_completed = false; ++ ++ status = adapt->HalFunc.hal_init(adapt); ++ ++ if (status == _SUCCESS) { ++ adapt->hw_init_completed = true; ++ ++ if (adapt->registrypriv.notch_filter == 1) ++ rtw_hal_notch_filter(adapt, 1); ++ ++ rtw_hal_reset_security_engine(adapt); ++ } else { ++ adapt->hw_init_completed = false; ++ DBG_88E("rtw_hal_init: hal__init fail\n"); ++ } ++ ++ return status; ++} ++ ++uint rtw_hal_deinit(struct adapter *adapt) ++{ ++ uint status = _SUCCESS; ++ ++ status = adapt->HalFunc.hal_deinit(adapt); ++ ++ if (status == _SUCCESS) ++ adapt->hw_init_completed = false; ++ else ++ DBG_88E("\n rtw_hal_deinit: hal_init fail\n"); ++ ++ return status; ++} ++ ++void rtw_hal_set_hwreg(struct adapter *adapt, u8 variable, u8 *val) ++{ ++ if (adapt->HalFunc.SetHwRegHandler) ++ adapt->HalFunc.SetHwRegHandler(adapt, variable, val); ++} ++ ++void rtw_hal_get_hwreg(struct adapter *adapt, u8 variable, u8 *val) ++{ ++ if (adapt->HalFunc.GetHwRegHandler) ++ adapt->HalFunc.GetHwRegHandler(adapt, variable, val); ++} ++ ++u8 rtw_hal_set_def_var(struct adapter *adapt, enum hal_def_variable var, ++ void *val) ++{ ++ if (adapt->HalFunc.SetHalDefVarHandler) ++ return adapt->HalFunc.SetHalDefVarHandler(adapt, var, val); ++ return _FAIL; ++} ++ ++u8 rtw_hal_get_def_var(struct adapter *adapt, ++ enum hal_def_variable var, void *val) ++{ ++ if (adapt->HalFunc.GetHalDefVarHandler) ++ return adapt->HalFunc.GetHalDefVarHandler(adapt, var, val); ++ return _FAIL; ++} ++ ++void rtw_hal_set_odm_var(struct adapter *adapt, ++ enum hal_odm_variable var, void *val1, ++ bool set) ++{ ++ if (adapt->HalFunc.SetHalODMVarHandler) ++ adapt->HalFunc.SetHalODMVarHandler(adapt, var, ++ val1, set); ++} ++ ++void rtw_hal_get_odm_var(struct adapter *adapt, ++ enum hal_odm_variable var, void *val1, ++ bool set) ++{ ++ if (adapt->HalFunc.GetHalODMVarHandler) ++ adapt->HalFunc.GetHalODMVarHandler(adapt, var, ++ val1, set); ++} ++ ++void rtw_hal_enable_interrupt(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.enable_interrupt) ++ adapt->HalFunc.enable_interrupt(adapt); ++ else ++ DBG_88E("%s: HalFunc.enable_interrupt is NULL!\n", __func__); ++} ++ ++void rtw_hal_disable_interrupt(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.disable_interrupt) ++ adapt->HalFunc.disable_interrupt(adapt); ++ else ++ DBG_88E("%s: HalFunc.disable_interrupt is NULL!\n", __func__); ++} ++ ++u32 rtw_hal_inirp_init(struct adapter *adapt) ++{ ++ u32 rst = _FAIL; ++ ++ if (adapt->HalFunc.inirp_init) ++ rst = adapt->HalFunc.inirp_init(adapt); ++ else ++ DBG_88E(" %s HalFunc.inirp_init is NULL!!!\n", __func__); ++ return rst; ++} ++ ++u32 rtw_hal_inirp_deinit(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.inirp_deinit) ++ return adapt->HalFunc.inirp_deinit(adapt); ++ ++ return _FAIL; ++} ++ ++u8 rtw_hal_intf_ps_func(struct adapter *adapt, ++ enum hal_intf_ps_func efunc_id, u8 *val) ++{ ++ if (adapt->HalFunc.interface_ps_func) ++ return adapt->HalFunc.interface_ps_func(adapt, efunc_id, ++ val); ++ return _FAIL; ++} ++ ++s32 rtw_hal_xmitframe_enqueue(struct adapter *padapter, ++ struct xmit_frame *pxmitframe) ++{ ++ if (padapter->HalFunc.hal_xmitframe_enqueue) ++ return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe); ++ return false; ++} ++ ++s32 rtw_hal_xmit(struct adapter *adapt, struct xmit_frame *pxmitframe) ++{ ++ if (adapt->HalFunc.hal_xmit) ++ return adapt->HalFunc.hal_xmit(adapt, pxmitframe); ++ ++ return false; ++} ++ ++s32 rtw_hal_mgnt_xmit(struct adapter *adapt, struct xmit_frame *pmgntframe) ++{ ++ s32 ret = _FAIL; ++ if (adapt->HalFunc.mgnt_xmit) ++ ret = adapt->HalFunc.mgnt_xmit(adapt, pmgntframe); ++ return ret; ++} ++ ++s32 rtw_hal_init_xmit_priv(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.init_xmit_priv) ++ return adapt->HalFunc.init_xmit_priv(adapt); ++ return _FAIL; ++} ++ ++s32 rtw_hal_init_recv_priv(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.init_recv_priv) ++ return adapt->HalFunc.init_recv_priv(adapt); ++ ++ return _FAIL; ++} ++ ++void rtw_hal_free_recv_priv(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.free_recv_priv) ++ adapt->HalFunc.free_recv_priv(adapt); ++} ++ ++void rtw_hal_update_ra_mask(struct adapter *adapt, u32 mac_id, u8 rssi_level) ++{ ++ struct mlme_priv *pmlmepriv = &adapt->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++#ifdef CONFIG_88EU_AP_MODE ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &adapt->stapriv; ++ if ((mac_id - 1) > 0) ++ psta = pstapriv->sta_aid[(mac_id - 1) - 1]; ++ if (psta) ++ add_RATid(adapt, psta, 0);/* todo: based on rssi_level*/ ++#endif ++ } else { ++ if (adapt->HalFunc.UpdateRAMaskHandler) ++ adapt->HalFunc.UpdateRAMaskHandler(adapt, mac_id, ++ rssi_level); ++ } ++} ++ ++void rtw_hal_add_ra_tid(struct adapter *adapt, u32 bitmap, u8 arg, ++ u8 rssi_level) ++{ ++ if (adapt->HalFunc.Add_RateATid) ++ adapt->HalFunc.Add_RateATid(adapt, bitmap, arg, ++ rssi_level); ++} ++ ++/* Start specifical interface thread */ ++void rtw_hal_start_thread(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.run_thread) ++ adapt->HalFunc.run_thread(adapt); ++} ++ ++/* Start specifical interface thread */ ++void rtw_hal_stop_thread(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.cancel_thread) ++ adapt->HalFunc.cancel_thread(adapt); ++} ++ ++u32 rtw_hal_read_bbreg(struct adapter *adapt, u32 regaddr, u32 bitmask) ++{ ++ u32 data = 0; ++ ++ if (adapt->HalFunc.read_bbreg) ++ data = adapt->HalFunc.read_bbreg(adapt, regaddr, bitmask); ++ return data; ++} ++ ++void rtw_hal_write_bbreg(struct adapter *adapt, u32 regaddr, u32 bitmask, ++ u32 data) ++{ ++ if (adapt->HalFunc.write_bbreg) ++ adapt->HalFunc.write_bbreg(adapt, regaddr, bitmask, data); ++} ++ ++u32 rtw_hal_read_rfreg(struct adapter *adapt, enum rf_radio_path rfpath, ++ u32 regaddr, u32 bitmask) ++{ ++ u32 data = 0; ++ ++ if (adapt->HalFunc.read_rfreg) ++ data = adapt->HalFunc.read_rfreg(adapt, rfpath, regaddr, ++ bitmask); ++ return data; ++} ++ ++void rtw_hal_write_rfreg(struct adapter *adapt, enum rf_radio_path rfpath, ++ u32 regaddr, u32 bitmask, u32 data) ++{ ++ if (adapt->HalFunc.write_rfreg) ++ adapt->HalFunc.write_rfreg(adapt, rfpath, regaddr, ++ bitmask, data); ++} ++ ++s32 rtw_hal_interrupt_handler(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.interrupt_handler) ++ return adapt->HalFunc.interrupt_handler(adapt); ++ return _FAIL; ++} ++ ++void rtw_hal_set_bwmode(struct adapter *adapt, ++ enum ht_channel_width bandwidth, u8 offset) ++{ ++ if (adapt->HalFunc.set_bwmode_handler) ++ adapt->HalFunc.set_bwmode_handler(adapt, bandwidth, ++ offset); ++} ++ ++void rtw_hal_set_chan(struct adapter *adapt, u8 channel) ++{ ++ if (adapt->HalFunc.set_channel_handler) ++ adapt->HalFunc.set_channel_handler(adapt, channel); ++} ++ ++void rtw_hal_dm_watchdog(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.hal_dm_watchdog) ++ adapt->HalFunc.hal_dm_watchdog(adapt); ++} ++ ++void rtw_hal_bcn_related_reg_setting(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.SetBeaconRelatedRegistersHandler) ++ adapt->HalFunc.SetBeaconRelatedRegistersHandler(adapt); ++} ++ ++u8 rtw_hal_antdiv_before_linked(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.AntDivBeforeLinkHandler) ++ return adapt->HalFunc.AntDivBeforeLinkHandler(adapt); ++ return false; ++} ++ ++void rtw_hal_antdiv_rssi_compared(struct adapter *adapt, ++ struct wlan_bssid_ex *dst, ++ struct wlan_bssid_ex *src) ++{ ++ if (adapt->HalFunc.AntDivCompareHandler) ++ adapt->HalFunc.AntDivCompareHandler(adapt, dst, src); ++} ++ ++void rtw_hal_sreset_init(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.sreset_init_value) ++ adapt->HalFunc.sreset_init_value(adapt); ++} ++ ++void rtw_hal_sreset_reset(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.silentreset) ++ adapt->HalFunc.silentreset(adapt); ++} ++ ++void rtw_hal_sreset_reset_value(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.sreset_reset_value) ++ adapt->HalFunc.sreset_reset_value(adapt); ++} ++ ++void rtw_hal_sreset_xmit_status_check(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.sreset_xmit_status_check) ++ adapt->HalFunc.sreset_xmit_status_check(adapt); ++} ++ ++void rtw_hal_sreset_linked_status_check(struct adapter *adapt) ++{ ++ if (adapt->HalFunc.sreset_linked_status_check) ++ adapt->HalFunc.sreset_linked_status_check(adapt); ++} ++ ++u8 rtw_hal_sreset_get_wifi_status(struct adapter *adapt) ++{ ++ u8 status = 0; ++ ++ if (adapt->HalFunc.sreset_get_wifi_status) ++ status = adapt->HalFunc.sreset_get_wifi_status(adapt); ++ return status; ++} ++ ++int rtw_hal_iol_cmd(struct adapter *adapter, struct xmit_frame *xmit_frame, ++ u32 max_wating_ms, u32 bndy_cnt) ++{ ++ if (adapter->HalFunc.IOL_exec_cmds_sync) ++ return adapter->HalFunc.IOL_exec_cmds_sync(adapter, xmit_frame, ++ max_wating_ms, ++ bndy_cnt); ++ return _FAIL; ++} ++ ++void rtw_hal_notch_filter(struct adapter *adapter, bool enable) ++{ ++ if (adapter->HalFunc.hal_notch_filter) ++ adapter->HalFunc.hal_notch_filter(adapter, enable); ++} ++ ++void rtw_hal_reset_security_engine(struct adapter *adapter) ++{ ++ if (adapter->HalFunc.hal_reset_security_engine) ++ adapter->HalFunc.hal_reset_security_engine(adapter); ++} ++ ++s32 rtw_hal_c2h_handler(struct adapter *adapter, struct c2h_evt_hdr *c2h_evt) ++{ ++ s32 ret = _FAIL; ++ ++ if (adapter->HalFunc.c2h_handler) ++ ret = adapter->HalFunc.c2h_handler(adapter, c2h_evt); ++ return ret; ++} ++ ++c2h_id_filter rtw_hal_c2h_id_filter_ccx(struct adapter *adapter) ++{ ++ return adapter->HalFunc.c2h_id_filter_ccx; ++} +diff --git a/drivers/staging/r8188eu/hal/odm.c b/drivers/staging/r8188eu/hal/odm.c +new file mode 100644 +index 000000000000..ed94f64d878d +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm.c +@@ -0,0 +1,1968 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/* include files */ ++ ++#include "../include/odm_precomp.h" ++ ++static const u16 dB_Invert_Table[8][12] = { ++ {1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4}, ++ {4, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16}, ++ {18, 20, 22, 25, 28, 32, 35, 40, 45, 50, 56, 63}, ++ {71, 79, 89, 100, 112, 126, 141, 158, 178, 200, 224, 251}, ++ {282, 316, 355, 398, 447, 501, 562, 631, 708, 794, 891, 1000}, ++ {1122, 1259, 1413, 1585, 1778, 1995, 2239, 2512, 2818, 3162, 3548, 3981}, ++ {4467, 5012, 5623, 6310, 7079, 7943, 8913, 10000, 11220, 12589, 14125, 15849}, ++ {17783, 19953, 22387, 25119, 28184, 31623, 35481, 39811, 44668, 50119, 56234, 65535} ++}; ++ ++/* avoid to warn in FreeBSD ==> To DO modify */ ++static u32 EDCAParam[HT_IOT_PEER_MAX][3] = { ++ /* UL DL */ ++ {0x5ea42b, 0x5ea42b, 0x5ea42b}, /* 0:unknown AP */ ++ {0xa44f, 0x5ea44f, 0x5e431c}, /* 1:realtek AP */ ++ {0x5ea42b, 0x5ea42b, 0x5ea42b}, /* 2:unknown AP => realtek_92SE */ ++ {0x5ea32b, 0x5ea42b, 0x5e4322}, /* 3:broadcom AP */ ++ {0x5ea422, 0x00a44f, 0x00a44f}, /* 4:ralink AP */ ++ {0x5ea322, 0x00a630, 0x00a44f}, /* 5:atheros AP */ ++ {0x5e4322, 0x5e4322, 0x5e4322},/* 6:cisco AP */ ++ {0x5ea44f, 0x00a44f, 0x5ea42b}, /* 8:marvell AP */ ++ {0x5ea42b, 0x5ea42b, 0x5ea42b}, /* 10:unknown AP=> 92U AP */ ++ {0x5ea42b, 0xa630, 0x5e431c}, /* 11:airgocap AP */ ++}; ++ ++/* Global var */ ++u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] = { ++ 0x7f8001fe, /* 0, +6.0dB */ ++ 0x788001e2, /* 1, +5.5dB */ ++ 0x71c001c7, /* 2, +5.0dB */ ++ 0x6b8001ae, /* 3, +4.5dB */ ++ 0x65400195, /* 4, +4.0dB */ ++ 0x5fc0017f, /* 5, +3.5dB */ ++ 0x5a400169, /* 6, +3.0dB */ ++ 0x55400155, /* 7, +2.5dB */ ++ 0x50800142, /* 8, +2.0dB */ ++ 0x4c000130, /* 9, +1.5dB */ ++ 0x47c0011f, /* 10, +1.0dB */ ++ 0x43c0010f, /* 11, +0.5dB */ ++ 0x40000100, /* 12, +0dB */ ++ 0x3c8000f2, /* 13, -0.5dB */ ++ 0x390000e4, /* 14, -1.0dB */ ++ 0x35c000d7, /* 15, -1.5dB */ ++ 0x32c000cb, /* 16, -2.0dB */ ++ 0x300000c0, /* 17, -2.5dB */ ++ 0x2d4000b5, /* 18, -3.0dB */ ++ 0x2ac000ab, /* 19, -3.5dB */ ++ 0x288000a2, /* 20, -4.0dB */ ++ 0x26000098, /* 21, -4.5dB */ ++ 0x24000090, /* 22, -5.0dB */ ++ 0x22000088, /* 23, -5.5dB */ ++ 0x20000080, /* 24, -6.0dB */ ++ 0x1e400079, /* 25, -6.5dB */ ++ 0x1c800072, /* 26, -7.0dB */ ++ 0x1b00006c, /* 27. -7.5dB */ ++ 0x19800066, /* 28, -8.0dB */ ++ 0x18000060, /* 29, -8.5dB */ ++ 0x16c0005b, /* 30, -9.0dB */ ++ 0x15800056, /* 31, -9.5dB */ ++ 0x14400051, /* 32, -10.0dB */ ++ 0x1300004c, /* 33, -10.5dB */ ++ 0x12000048, /* 34, -11.0dB */ ++ 0x11000044, /* 35, -11.5dB */ ++ 0x10000040, /* 36, -12.0dB */ ++ 0x0f00003c,/* 37, -12.5dB */ ++ 0x0e400039,/* 38, -13.0dB */ ++ 0x0d800036,/* 39, -13.5dB */ ++ 0x0cc00033,/* 40, -14.0dB */ ++ 0x0c000030,/* 41, -14.5dB */ ++ 0x0b40002d,/* 42, -15.0dB */ ++}; ++ ++u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { ++ {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */ ++ {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */ ++ {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */ ++ {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */ ++ {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */ ++ {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */ ++ {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */ ++ {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */ ++ {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */ ++ {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */ ++ {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */ ++ {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */ ++ {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0dB */ ++ {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */ ++ {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */ ++ {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */ ++ {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */ ++ {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */ ++ {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */ ++ {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */ ++ {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB */ ++ {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB */ ++ {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB */ ++ {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB */ ++ {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB */ ++ {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB */ ++ {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB */ ++ {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB */ ++ {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB */ ++ {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB */ ++ {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB */ ++ {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB */ ++ {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB */ ++}; ++ ++u8 CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = { ++ {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */ ++ {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */ ++ {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */ ++ {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */ ++ {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */ ++ {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */ ++ {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */ ++ {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */ ++ {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */ ++ {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */ ++ {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */ ++ {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */ ++ {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0dB */ ++ {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */ ++ {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */ ++ {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */ ++ {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */ ++ {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */ ++ {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */ ++ {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */ ++ {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB */ ++ {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB */ ++ {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB */ ++ {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB */ ++ {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB */ ++ {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB */ ++ {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB */ ++ {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB */ ++ {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB */ ++ {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB */ ++ {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB */ ++ {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB */ ++ {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB */ ++}; ++ ++#define RxDefaultAnt1 0x65a9 ++#define RxDefaultAnt2 0x569a ++ ++/* 3 Export Interface */ ++ ++/* 2011/09/21 MH Add to describe different team necessary resource allocate?? */ ++void ODM_DMInit(struct odm_dm_struct *pDM_Odm) ++{ ++ /* 2012.05.03 Luke: For all IC series */ ++ odm_CommonInfoSelfInit(pDM_Odm); ++ odm_DIGInit(pDM_Odm); ++ odm_RateAdaptiveMaskInit(pDM_Odm); ++ ++ if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { ++ ; ++ } else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { ++ odm_PrimaryCCA_Init(pDM_Odm); /* Gary */ ++ odm_DynamicBBPowerSavingInit(pDM_Odm); ++ odm_DynamicTxPowerInit(pDM_Odm); ++ odm_TXPowerTrackingInit(pDM_Odm); ++ ODM_EdcaTurboInit(pDM_Odm); ++ ODM_RAInfo_Init_all(pDM_Odm); ++ if ((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) || ++ (pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) || ++ (pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)) ++ odm_InitHybridAntDiv(pDM_Odm); ++ else if (pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV) ++ odm_SwAntDivInit(pDM_Odm); ++ } ++} ++ ++/* 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */ ++/* You can not add any dummy function here, be care, you can only use DM structure */ ++/* to perform any new ODM_DM. */ ++void ODM_DMWatchdog(struct odm_dm_struct *pDM_Odm) ++{ ++ /* 2012.05.03 Luke: For all IC series */ ++ odm_GlobalAdapterCheck(); ++ odm_CommonInfoSelfUpdate(pDM_Odm); ++ odm_FalseAlarmCounterStatistics(pDM_Odm); ++ odm_RSSIMonitorCheck(pDM_Odm); ++ ++ /* For CE Platform(SPRD or Tablet) */ ++ /* 8723A or 8189ES platform */ ++ /* NeilChen--2012--08--24-- */ ++ /* Fix Leave LPS issue */ ++ if ((pDM_Odm->Adapter->pwrctrlpriv.pwr_mode != PS_MODE_ACTIVE) &&/* in LPS mode */ ++ ((pDM_Odm->SupportICType & (ODM_RTL8723A)) || ++ (pDM_Odm->SupportICType & (ODM_RTL8188E) && ++ ((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))))) ++ odm_DIGbyRSSI_LPS(pDM_Odm); ++ else ++ odm_DIG(pDM_Odm); ++ odm_CCKPacketDetectionThresh(pDM_Odm); ++ ++ if (*pDM_Odm->pbPowerSaving) ++ return; ++ ++ odm_RefreshRateAdaptiveMask(pDM_Odm); ++ ++ odm_DynamicBBPowerSaving(pDM_Odm); ++ if ((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) || ++ (pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) || ++ (pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)) ++ odm_HwAntDiv(pDM_Odm); ++ else if (pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV) ++ odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK); ++ ++ if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { ++ ; ++ } else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { ++ ODM_TXPowerTrackingCheck(pDM_Odm); ++ odm_EdcaTurboCheck(pDM_Odm); ++ odm_DynamicTxPower(pDM_Odm); ++ } ++ odm_dtc(pDM_Odm); ++} ++ ++/* Init /.. Fixed HW value. Only init time. */ ++void ODM_CmnInfoInit(struct odm_dm_struct *pDM_Odm, enum odm_common_info_def CmnInfo, u32 Value) ++{ ++ /* This section is used for init value */ ++ switch (CmnInfo) { ++ /* Fixed ODM value. */ ++ case ODM_CMNINFO_ABILITY: ++ pDM_Odm->SupportAbility = (u32)Value; ++ break; ++ case ODM_CMNINFO_PLATFORM: ++ pDM_Odm->SupportPlatform = (u8)Value; ++ break; ++ case ODM_CMNINFO_INTERFACE: ++ pDM_Odm->SupportInterface = (u8)Value; ++ break; ++ case ODM_CMNINFO_MP_TEST_CHIP: ++ pDM_Odm->bIsMPChip = (u8)Value; ++ break; ++ case ODM_CMNINFO_IC_TYPE: ++ pDM_Odm->SupportICType = Value; ++ break; ++ case ODM_CMNINFO_CUT_VER: ++ pDM_Odm->CutVersion = (u8)Value; ++ break; ++ case ODM_CMNINFO_FAB_VER: ++ pDM_Odm->FabVersion = (u8)Value; ++ break; ++ case ODM_CMNINFO_RF_TYPE: ++ pDM_Odm->RFType = (u8)Value; ++ break; ++ case ODM_CMNINFO_RF_ANTENNA_TYPE: ++ pDM_Odm->AntDivType = (u8)Value; ++ break; ++ case ODM_CMNINFO_BOARD_TYPE: ++ pDM_Odm->BoardType = (u8)Value; ++ break; ++ case ODM_CMNINFO_EXT_LNA: ++ pDM_Odm->ExtLNA = (u8)Value; ++ break; ++ case ODM_CMNINFO_EXT_PA: ++ pDM_Odm->ExtPA = (u8)Value; ++ break; ++ case ODM_CMNINFO_EXT_TRSW: ++ pDM_Odm->ExtTRSW = (u8)Value; ++ break; ++ case ODM_CMNINFO_PATCH_ID: ++ pDM_Odm->PatchID = (u8)Value; ++ break; ++ case ODM_CMNINFO_BINHCT_TEST: ++ pDM_Odm->bInHctTest = (bool)Value; ++ break; ++ case ODM_CMNINFO_BWIFI_TEST: ++ pDM_Odm->bWIFITest = (bool)Value; ++ break; ++ case ODM_CMNINFO_SMART_CONCURRENT: ++ pDM_Odm->bDualMacSmartConcurrent = (bool)Value; ++ break; ++ /* To remove the compiler warning, must add an empty default statement to handle the other values. */ ++ default: ++ /* do nothing */ ++ break; ++ } ++ ++ /* Tx power tracking BB swing table. */ ++ /* The base index = 12. +((12-n)/2)dB 13~?? = decrease tx pwr by -((n-12)/2)dB */ ++ pDM_Odm->BbSwingIdxOfdm = 12; /* Set defalut value as index 12. */ ++ pDM_Odm->BbSwingIdxOfdmCurrent = 12; ++ pDM_Odm->BbSwingFlagOfdm = false; ++} ++ ++void ODM_CmnInfoHook(struct odm_dm_struct *pDM_Odm, enum odm_common_info_def CmnInfo, void *pValue) ++{ ++ /* */ ++ /* Hook call by reference pointer. */ ++ /* */ ++ switch (CmnInfo) { ++ /* Dynamic call by reference pointer. */ ++ case ODM_CMNINFO_MAC_PHY_MODE: ++ pDM_Odm->pMacPhyMode = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_TX_UNI: ++ pDM_Odm->pNumTxBytesUnicast = (u64 *)pValue; ++ break; ++ case ODM_CMNINFO_RX_UNI: ++ pDM_Odm->pNumRxBytesUnicast = (u64 *)pValue; ++ break; ++ case ODM_CMNINFO_WM_MODE: ++ pDM_Odm->pWirelessMode = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_BAND: ++ pDM_Odm->pBandType = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_SEC_CHNL_OFFSET: ++ pDM_Odm->pSecChOffset = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_SEC_MODE: ++ pDM_Odm->pSecurity = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_BW: ++ pDM_Odm->pBandWidth = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_CHNL: ++ pDM_Odm->pChannel = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_DMSP_GET_VALUE: ++ pDM_Odm->pbGetValueFromOtherMac = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_BUDDY_ADAPTOR: ++ pDM_Odm->pBuddyAdapter = (struct adapter **)pValue; ++ break; ++ case ODM_CMNINFO_DMSP_IS_MASTER: ++ pDM_Odm->pbMasterOfDMSP = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_SCAN: ++ pDM_Odm->pbScanInProcess = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_POWER_SAVING: ++ pDM_Odm->pbPowerSaving = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_ONE_PATH_CCA: ++ pDM_Odm->pOnePathCCA = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_DRV_STOP: ++ pDM_Odm->pbDriverStopped = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_PNP_IN: ++ pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_INIT_ON: ++ pDM_Odm->pinit_adpt_in_progress = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_ANT_TEST: ++ pDM_Odm->pAntennaTest = (u8 *)pValue; ++ break; ++ case ODM_CMNINFO_NET_CLOSED: ++ pDM_Odm->pbNet_closed = (bool *)pValue; ++ break; ++ case ODM_CMNINFO_MP_MODE: ++ pDM_Odm->mp_mode = (u8 *)pValue; ++ break; ++ /* To remove the compiler warning, must add an empty default statement to handle the other values. */ ++ default: ++ /* do nothing */ ++ break; ++ } ++} ++ ++void ODM_CmnInfoPtrArrayHook(struct odm_dm_struct *pDM_Odm, enum odm_common_info_def CmnInfo, u16 Index, void *pValue) ++{ ++ /* Hook call by reference pointer. */ ++ switch (CmnInfo) { ++ /* Dynamic call by reference pointer. */ ++ case ODM_CMNINFO_STA_STATUS: ++ pDM_Odm->pODM_StaInfo[Index] = (struct sta_info *)pValue; ++ break; ++ /* To remove the compiler warning, must add an empty default statement to handle the other values. */ ++ default: ++ /* do nothing */ ++ break; ++ } ++} ++ ++/* Update Band/CHannel/.. The values are dynamic but non-per-packet. */ ++void ODM_CmnInfoUpdate(struct odm_dm_struct *pDM_Odm, u32 CmnInfo, u64 Value) ++{ ++ /* */ ++ /* This init variable may be changed in run time. */ ++ /* */ ++ switch (CmnInfo) { ++ case ODM_CMNINFO_ABILITY: ++ pDM_Odm->SupportAbility = (u32)Value; ++ break; ++ case ODM_CMNINFO_RF_TYPE: ++ pDM_Odm->RFType = (u8)Value; ++ break; ++ case ODM_CMNINFO_WIFI_DIRECT: ++ pDM_Odm->bWIFI_Direct = (bool)Value; ++ break; ++ case ODM_CMNINFO_WIFI_DISPLAY: ++ pDM_Odm->bWIFI_Display = (bool)Value; ++ break; ++ case ODM_CMNINFO_LINK: ++ pDM_Odm->bLinked = (bool)Value; ++ break; ++ case ODM_CMNINFO_RSSI_MIN: ++ pDM_Odm->RSSI_Min = (u8)Value; ++ break; ++ case ODM_CMNINFO_RA_THRESHOLD_HIGH: ++ pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value; ++ break; ++ case ODM_CMNINFO_RA_THRESHOLD_LOW: ++ pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value; ++ break; ++ } ++} ++ ++void odm_CommonInfoSelfInit(struct odm_dm_struct *pDM_Odm) ++{ ++ pDM_Odm->bCckHighPower = (bool)ODM_GetBBReg(pDM_Odm, 0x824, BIT(9)); ++ pDM_Odm->RFPathRxEnable = (u8)ODM_GetBBReg(pDM_Odm, 0xc04, 0x0F); ++ if (pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D)) ++ pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; ++ if (pDM_Odm->SupportICType & (ODM_RTL8723A)) ++ pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; ++} ++ ++void odm_CommonInfoSelfUpdate(struct odm_dm_struct *pDM_Odm) ++{ ++ u8 EntryCnt = 0; ++ u8 i; ++ struct sta_info *pEntry; ++ ++ if (*pDM_Odm->pBandWidth == ODM_BW40M) { ++ if (*pDM_Odm->pSecChOffset == 1) ++ pDM_Odm->ControlChannel = *pDM_Odm->pChannel - 2; ++ else if (*pDM_Odm->pSecChOffset == 2) ++ pDM_Odm->ControlChannel = *pDM_Odm->pChannel + 2; ++ } else { ++ pDM_Odm->ControlChannel = *pDM_Odm->pChannel; ++ } ++ ++ for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { ++ pEntry = pDM_Odm->pODM_StaInfo[i]; ++ if (IS_STA_VALID(pEntry)) ++ EntryCnt++; ++ } ++ if (EntryCnt == 1) ++ pDM_Odm->bOneEntryOnly = true; ++ else ++ pDM_Odm->bOneEntryOnly = false; ++} ++ ++static int getIGIForDiff(int value_IGI) ++{ ++ #define ONERCCA_LOW_TH 0x30 ++ #define ONERCCA_LOW_DIFF 8 ++ ++ if (value_IGI < ONERCCA_LOW_TH) { ++ if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF) ++ return ONERCCA_LOW_TH; ++ else ++ return value_IGI + ONERCCA_LOW_DIFF; ++ } else { ++ return value_IGI; ++ } ++} ++ ++void ODM_Write_DIG(struct odm_dm_struct *pDM_Odm, u8 CurrentIGI) ++{ ++ struct rtw_dig *pDM_DigTable = &pDM_Odm->DM_DigTable; ++ ++ if (pDM_DigTable->CurIGValue != CurrentIGI) { ++ if (pDM_Odm->SupportPlatform & (ODM_CE | ODM_MP)) { ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ if (pDM_Odm->SupportICType != ODM_RTL8188E) ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ } else if (pDM_Odm->SupportPlatform & (ODM_AP | ODM_ADSL)) { ++ switch (*pDM_Odm->pOnePathCCA) { ++ case ODM_CCA_2R: ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ if (pDM_Odm->SupportICType != ODM_RTL8188E) ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ break; ++ case ODM_CCA_1R_A: ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ if (pDM_Odm->SupportICType != ODM_RTL8188E) ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), getIGIForDiff(CurrentIGI)); ++ break; ++ case ODM_CCA_1R_B: ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), getIGIForDiff(CurrentIGI)); ++ if (pDM_Odm->SupportICType != ODM_RTL8188E) ++ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); ++ break; ++ } ++ } ++ /* pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue; */ ++ pDM_DigTable->CurIGValue = CurrentIGI; ++ } ++/* Add by Neil Chen to enable edcca to MP Platform */ ++} ++ ++/* Need LPS mode for CE platform --2012--08--24--- */ ++/* 8723AS/8189ES */ ++void odm_DIGbyRSSI_LPS(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *pAdapter = pDM_Odm->Adapter; ++ struct false_alarm_stats *pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; ++ ++ u8 RSSI_Lower = DM_DIG_MIN_NIC; /* 0x1E or 0x1C */ ++ u8 bFwCurrentInPSMode = false; ++ u8 CurrentIGI = pDM_Odm->RSSI_Min; ++ ++ if (!(pDM_Odm->SupportICType & (ODM_RTL8723A | ODM_RTL8188E))) ++ return; ++ ++ CurrentIGI = CurrentIGI + RSSI_OFFSET_DIG; ++ bFwCurrentInPSMode = pAdapter->pwrctrlpriv.bFwCurrentInPSMode; ++ ++ /* Using FW PS mode to make IGI */ ++ if (bFwCurrentInPSMode) { ++ /* Adjust by FA in LPS MODE */ ++ if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_LPS) ++ CurrentIGI = CurrentIGI + 2; ++ else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS) ++ CurrentIGI = CurrentIGI + 1; ++ else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS) ++ CurrentIGI = CurrentIGI - 1; ++ } else { ++ CurrentIGI = RSSI_Lower; ++ } ++ ++ /* Lower bound checking */ ++ ++ /* RSSI Lower bound check */ ++ if ((pDM_Odm->RSSI_Min - 10) > DM_DIG_MIN_NIC) ++ RSSI_Lower = (pDM_Odm->RSSI_Min - 10); ++ else ++ RSSI_Lower = DM_DIG_MIN_NIC; ++ ++ /* Upper and Lower Bound checking */ ++ if (CurrentIGI > DM_DIG_MAX_NIC) ++ CurrentIGI = DM_DIG_MAX_NIC; ++ else if (CurrentIGI < RSSI_Lower) ++ CurrentIGI = RSSI_Lower; ++ ++ ODM_Write_DIG(pDM_Odm, CurrentIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */ ++} ++ ++void odm_DIGInit(struct odm_dm_struct *pDM_Odm) ++{ ++ struct rtw_dig *pDM_DigTable = &pDM_Odm->DM_DigTable; ++ ++ pDM_DigTable->CurIGValue = (u8)ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm)); ++ pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW; ++ pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; ++ pDM_DigTable->FALowThresh = DM_false_ALARM_THRESH_LOW; ++ pDM_DigTable->FAHighThresh = DM_false_ALARM_THRESH_HIGH; ++ if (pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) { ++ pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; ++ pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; ++ } else { ++ pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; ++ pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; ++ } ++ pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; ++ pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; ++ pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; ++ pDM_DigTable->PreCCK_CCAThres = 0xFF; ++ pDM_DigTable->CurCCK_CCAThres = 0x83; ++ pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC; ++ pDM_DigTable->LargeFAHit = 0; ++ pDM_DigTable->Recover_cnt = 0; ++ pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC; ++ pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC; ++ pDM_DigTable->bMediaConnect_0 = false; ++ pDM_DigTable->bMediaConnect_1 = false; ++ ++ /* To Initialize pDM_Odm->bDMInitialGainEnable == false to avoid DIG error */ ++ pDM_Odm->bDMInitialGainEnable = true; ++} ++ ++void odm_DIG(struct odm_dm_struct *pDM_Odm) ++{ ++ struct rtw_dig *pDM_DigTable = &pDM_Odm->DM_DigTable; ++ struct false_alarm_stats *pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; ++ u8 DIG_Dynamic_MIN; ++ u8 DIG_MaxOfMin; ++ bool FirstConnect, FirstDisConnect; ++ u8 dm_dig_max, dm_dig_min; ++ u8 CurrentIGI = pDM_DigTable->CurIGValue; ++ ++ if ((!(pDM_Odm->SupportAbility & ODM_BB_DIG)) || (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) ++ return; ++ ++ if (*pDM_Odm->pbScanInProcess) ++ return; ++ ++ /* add by Neil Chen to avoid PSD is processing */ ++ if (!pDM_Odm->bDMInitialGainEnable) ++ return; ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8192D) { ++ if (*pDM_Odm->pMacPhyMode == ODM_DMSP) { ++ if (*pDM_Odm->pbMasterOfDMSP) { ++ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; ++ FirstConnect = (pDM_Odm->bLinked) && (!pDM_DigTable->bMediaConnect_0); ++ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0); ++ } else { ++ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1; ++ FirstConnect = (pDM_Odm->bLinked) && (!pDM_DigTable->bMediaConnect_1); ++ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1); ++ } ++ } else { ++ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1; ++ FirstConnect = (pDM_Odm->bLinked) && (!pDM_DigTable->bMediaConnect_1); ++ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1); ++ } ++ } else { ++ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; ++ FirstConnect = (pDM_Odm->bLinked) && (!pDM_DigTable->bMediaConnect_0); ++ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0); ++ } ++ ++ /* 1 Boundary Decision */ ++ if ((pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8723A)) && ++ ((pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) || pDM_Odm->ExtLNA)) { ++ if (pDM_Odm->SupportPlatform & (ODM_AP | ODM_ADSL)) { ++ dm_dig_max = DM_DIG_MAX_AP_HP; ++ dm_dig_min = DM_DIG_MIN_AP_HP; ++ } else { ++ dm_dig_max = DM_DIG_MAX_NIC_HP; ++ dm_dig_min = DM_DIG_MIN_NIC_HP; ++ } ++ DIG_MaxOfMin = DM_DIG_MAX_AP_HP; ++ } else { ++ if (pDM_Odm->SupportPlatform & (ODM_AP | ODM_ADSL)) { ++ dm_dig_max = DM_DIG_MAX_AP; ++ dm_dig_min = DM_DIG_MIN_AP; ++ DIG_MaxOfMin = dm_dig_max; ++ } else { ++ dm_dig_max = DM_DIG_MAX_NIC; ++ dm_dig_min = DM_DIG_MIN_NIC; ++ DIG_MaxOfMin = DM_DIG_MAX_AP; ++ } ++ } ++ if (pDM_Odm->bLinked) { ++ /* 2 8723A Series, offset need to be 10 */ ++ if (pDM_Odm->SupportICType == (ODM_RTL8723A)) { ++ /* 2 Upper Bound */ ++ if ((pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC) ++ pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; ++ else if ((pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC) ++ pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC; ++ else ++ pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10; ++ /* 2 If BT is Concurrent, need to set Lower Bound */ ++ DIG_Dynamic_MIN = DM_DIG_MIN_NIC; ++ } else { ++ /* 2 Modify DIG upper bound */ ++ if ((pDM_Odm->RSSI_Min + 20) > dm_dig_max) ++ pDM_DigTable->rx_gain_range_max = dm_dig_max; ++ else if ((pDM_Odm->RSSI_Min + 20) < dm_dig_min) ++ pDM_DigTable->rx_gain_range_max = dm_dig_min; ++ else ++ pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20; ++ /* 2 Modify DIG lower bound */ ++ if (pDM_Odm->bOneEntryOnly) { ++ if (pDM_Odm->RSSI_Min < dm_dig_min) ++ DIG_Dynamic_MIN = dm_dig_min; ++ else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin) ++ DIG_Dynamic_MIN = DIG_MaxOfMin; ++ else ++ DIG_Dynamic_MIN = pDM_Odm->RSSI_Min; ++ } else if ((pDM_Odm->SupportICType == ODM_RTL8188E) && ++ (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) { ++ /* 1 Lower Bound for 88E AntDiv */ ++ if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) ++ DIG_Dynamic_MIN = (u8)pDM_DigTable->AntDiv_RSSI_max; ++ } else { ++ DIG_Dynamic_MIN = dm_dig_min; ++ } ++ } ++ } else { ++ pDM_DigTable->rx_gain_range_max = dm_dig_max; ++ DIG_Dynamic_MIN = dm_dig_min; ++ } ++ ++ /* 1 Modify DIG lower bound, deal with abnormally large false alarm */ ++ if (pFalseAlmCnt->Cnt_all > 10000) { ++ if (pDM_DigTable->LargeFAHit != 3) ++ pDM_DigTable->LargeFAHit++; ++ if (pDM_DigTable->ForbiddenIGI < CurrentIGI) { ++ pDM_DigTable->ForbiddenIGI = CurrentIGI; ++ pDM_DigTable->LargeFAHit = 1; ++ } ++ ++ if (pDM_DigTable->LargeFAHit >= 3) { ++ if ((pDM_DigTable->ForbiddenIGI + 1) > pDM_DigTable->rx_gain_range_max) ++ pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max; ++ else ++ pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); ++ pDM_DigTable->Recover_cnt = 3600; /* 3600=2hr */ ++ } ++ ++ } else { ++ /* Recovery mechanism for IGI lower bound */ ++ if (pDM_DigTable->Recover_cnt != 0) { ++ pDM_DigTable->Recover_cnt--; ++ } else { ++ if (pDM_DigTable->LargeFAHit < 3) { ++ if ((pDM_DigTable->ForbiddenIGI - 1) < DIG_Dynamic_MIN) { /* DM_DIG_MIN) */ ++ pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; /* DM_DIG_MIN; */ ++ pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; /* DM_DIG_MIN; */ ++ } else { ++ pDM_DigTable->ForbiddenIGI--; ++ pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); ++ } ++ } else { ++ pDM_DigTable->LargeFAHit = 0; ++ } ++ } ++ } ++ ++ /* 1 Adjust initial gain by false alarm */ ++ if (pDM_Odm->bLinked) { ++ if (FirstConnect) { ++ CurrentIGI = pDM_Odm->RSSI_Min; ++ } else { ++ if (pDM_Odm->SupportICType == ODM_RTL8192D) { ++ if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D) ++ CurrentIGI = CurrentIGI + 2;/* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; */ ++ else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D) ++ CurrentIGI = CurrentIGI + 1; /* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; */ ++ else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D) ++ CurrentIGI = CurrentIGI - 1;/* pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; */ ++ } else { ++ if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2) ++ CurrentIGI = CurrentIGI + 4;/* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; */ ++ else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1) ++ CurrentIGI = CurrentIGI + 2;/* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; */ ++ else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) ++ CurrentIGI = CurrentIGI - 2;/* pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; */ ++ } ++ } ++ } else { ++ if (FirstDisConnect) { ++ CurrentIGI = pDM_DigTable->rx_gain_range_min; ++ } else { ++ /* 2012.03.30 LukeLee: enable DIG before link but with very high thresholds */ ++ if (pFalseAlmCnt->Cnt_all > 10000) ++ CurrentIGI = CurrentIGI + 2;/* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; */ ++ else if (pFalseAlmCnt->Cnt_all > 8000) ++ CurrentIGI = CurrentIGI + 1;/* pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; */ ++ else if (pFalseAlmCnt->Cnt_all < 500) ++ CurrentIGI = CurrentIGI - 1;/* pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; */ ++ } ++ } ++ /* 1 Check initial gain by upper/lower bound */ ++ if (CurrentIGI > pDM_DigTable->rx_gain_range_max) ++ CurrentIGI = pDM_DigTable->rx_gain_range_max; ++ if (CurrentIGI < pDM_DigTable->rx_gain_range_min) ++ CurrentIGI = pDM_DigTable->rx_gain_range_min; ++ ++ /* 2 High power RSSI threshold */ ++ ++ ODM_Write_DIG(pDM_Odm, CurrentIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */ ++ pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; ++ pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; ++} ++ ++/* 3============================================================ */ ++/* 3 FASLE ALARM CHECK */ ++/* 3============================================================ */ ++ ++void odm_FalseAlarmCounterStatistics(struct odm_dm_struct *pDM_Odm) ++{ ++ u32 ret_value; ++ struct false_alarm_stats *FalseAlmCnt = &pDM_Odm->FalseAlmCnt; ++ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)) ++ return; ++ ++ if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { ++ /* hold ofdm counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT(31), 1); /* hold page C counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT(31), 1); /* hold page D counter */ ++ ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_Fast_Fsync = (ret_value & 0xffff); ++ FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value & 0xffff0000) >> 16); ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff); ++ FalseAlmCnt->Cnt_Parity_Fail = ((ret_value & 0xffff0000) >> 16); ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_Rate_Illegal = (ret_value & 0xffff); ++ FalseAlmCnt->Cnt_Crc8_fail = ((ret_value & 0xffff0000) >> 16); ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_Mcs_fail = (ret_value & 0xffff); ++ ++ FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal + ++ FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail + ++ FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail; ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8188E) { ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_BW_LSC = (ret_value & 0xffff); ++ FalseAlmCnt->Cnt_BW_USC = ((ret_value & 0xffff0000) >> 16); ++ } ++ ++ /* hold cck counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(12), 1); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(14), 1); ++ ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0); ++ FalseAlmCnt->Cnt_Cck_fail = ret_value; ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3); ++ FalseAlmCnt->Cnt_Cck_fail += (ret_value & 0xff) << 8; ++ ++ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord); ++ FalseAlmCnt->Cnt_CCK_CCA = ((ret_value & 0xFF) << 8) | ((ret_value & 0xFF00) >> 8); ++ ++ FalseAlmCnt->Cnt_all = (FalseAlmCnt->Cnt_Fast_Fsync + ++ FalseAlmCnt->Cnt_SB_Search_fail + ++ FalseAlmCnt->Cnt_Parity_Fail + ++ FalseAlmCnt->Cnt_Rate_Illegal + ++ FalseAlmCnt->Cnt_Crc8_fail + ++ FalseAlmCnt->Cnt_Mcs_fail + ++ FalseAlmCnt->Cnt_Cck_fail); ++ ++ FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA; ++ ++ if (pDM_Odm->SupportICType >= ODM_RTL8723A) { ++ /* reset false alarm counter registers */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT(31), 1); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT(31), 0); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT(27), 1); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT(27), 0); ++ /* update ofdm counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT(31), 0); /* update page C counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT(31), 0); /* update page D counter */ ++ ++ /* reset CCK CCA counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(13) | BIT(12), 0); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(13) | BIT(12), 2); ++ /* reset CCK FA counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 0); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 2); ++ } ++ } else { /* FOR ODM_IC_11AC_SERIES */ ++ /* read OFDM FA counter */ ++ FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord); ++ FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord); ++ FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail; ++ ++ /* reset OFDM FA coutner */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 1); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 0); ++ /* reset CCK FA counter */ ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT(15), 0); ++ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT(15), 1); ++ } ++} ++ ++/* 3============================================================ */ ++/* 3 CCK Packet Detect Threshold */ ++/* 3============================================================ */ ++ ++void odm_CCKPacketDetectionThresh(struct odm_dm_struct *pDM_Odm) ++{ ++ u8 CurCCK_CCAThres; ++ struct false_alarm_stats *FalseAlmCnt = &pDM_Odm->FalseAlmCnt; ++ ++ if (!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD | ODM_BB_FA_CNT))) ++ return; ++ if (pDM_Odm->ExtLNA) ++ return; ++ if (pDM_Odm->bLinked) { ++ if (pDM_Odm->RSSI_Min > 25) { ++ CurCCK_CCAThres = 0xcd; ++ } else if ((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10)) { ++ CurCCK_CCAThres = 0x83; ++ } else { ++ if (FalseAlmCnt->Cnt_Cck_fail > 1000) ++ CurCCK_CCAThres = 0x83; ++ else ++ CurCCK_CCAThres = 0x40; ++ } ++ } else { ++ if (FalseAlmCnt->Cnt_Cck_fail > 1000) ++ CurCCK_CCAThres = 0x83; ++ else ++ CurCCK_CCAThres = 0x40; ++ } ++ ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres); ++} ++ ++void ODM_Write_CCK_CCA_Thres(struct odm_dm_struct *pDM_Odm, u8 CurCCK_CCAThres) ++{ ++ struct rtw_dig *pDM_DigTable = &pDM_Odm->DM_DigTable; ++ ++ if (pDM_DigTable->CurCCK_CCAThres != CurCCK_CCAThres) /* modify by Guo.Mingzhi 2012-01-03 */ ++ ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA, pDM_Odm), CurCCK_CCAThres); ++ pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres; ++ pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres; ++} ++ ++/* 3============================================================ */ ++/* 3 BB Power Save */ ++/* 3============================================================ */ ++void odm_DynamicBBPowerSavingInit(struct odm_dm_struct *pDM_Odm) ++{ ++ struct rtl_ps *pDM_PSTable = &pDM_Odm->DM_PSTable; ++ ++ pDM_PSTable->pre_cca_state = CCA_MAX; ++ pDM_PSTable->cur_cca_state = CCA_MAX; ++ pDM_PSTable->pre_rf_state = RF_MAX; ++ pDM_PSTable->cur_rf_state = RF_MAX; ++ pDM_PSTable->rssi_val_min = 0; ++ pDM_PSTable->initialize = 0; ++} ++ ++void odm_DynamicBBPowerSaving(struct odm_dm_struct *pDM_Odm) ++{ ++ if ((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8723A)) ++ return; ++ if (!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE)) ++ return; ++ if (!(pDM_Odm->SupportPlatform & (ODM_MP | ODM_CE))) ++ return; ++ ++ /* 1 2.Power Saving for 92C */ ++ if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->RFType == ODM_2T2R)) { ++ odm_1R_CCA(pDM_Odm); ++ } else { ++ /* 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable. */ ++ /* 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns. */ ++ /* 1 3.Power Saving for 88C */ ++ ODM_RF_Saving(pDM_Odm, false); ++ } ++} ++ ++void odm_1R_CCA(struct odm_dm_struct *pDM_Odm) ++{ ++ struct rtl_ps *pDM_PSTable = &pDM_Odm->DM_PSTable; ++ ++ if (pDM_Odm->RSSI_Min != 0xFF) { ++ if (pDM_PSTable->pre_cca_state == CCA_2R) { ++ if (pDM_Odm->RSSI_Min >= 35) ++ pDM_PSTable->cur_cca_state = CCA_1R; ++ else ++ pDM_PSTable->cur_cca_state = CCA_2R; ++ } else { ++ if (pDM_Odm->RSSI_Min <= 30) ++ pDM_PSTable->cur_cca_state = CCA_2R; ++ else ++ pDM_PSTable->cur_cca_state = CCA_1R; ++ } ++ } else { ++ pDM_PSTable->cur_cca_state = CCA_MAX; ++ } ++ ++ if (pDM_PSTable->pre_cca_state != pDM_PSTable->cur_cca_state) { ++ if (pDM_PSTable->cur_cca_state == CCA_1R) { ++ if (pDM_Odm->RFType == ODM_2T2R) ++ ODM_SetBBReg(pDM_Odm, 0xc04, bMaskByte0, 0x13); ++ else ++ ODM_SetBBReg(pDM_Odm, 0xc04, bMaskByte0, 0x23); ++ } else { ++ ODM_SetBBReg(pDM_Odm, 0xc04, bMaskByte0, 0x33); ++ } ++ pDM_PSTable->pre_cca_state = pDM_PSTable->cur_cca_state; ++ } ++} ++ ++void ODM_RF_Saving(struct odm_dm_struct *pDM_Odm, u8 bForceInNormal) ++{ ++ struct rtl_ps *pDM_PSTable = &pDM_Odm->DM_PSTable; ++ u8 Rssi_Up_bound = 30; ++ u8 Rssi_Low_bound = 25; ++ ++ if (pDM_Odm->PatchID == 40) { /* RT_CID_819x_FUNAI_TV */ ++ Rssi_Up_bound = 50; ++ Rssi_Low_bound = 45; ++ } ++ if (pDM_PSTable->initialize == 0) { ++ pDM_PSTable->reg_874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord) & 0x1CC000) >> 14; ++ pDM_PSTable->reg_c70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord) & BIT(3)) >> 3; ++ pDM_PSTable->reg_85c = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord) & 0xFF000000) >> 24; ++ pDM_PSTable->reg_a74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord) & 0xF000) >> 12; ++ pDM_PSTable->initialize = 1; ++ } ++ ++ if (!bForceInNormal) { ++ if (pDM_Odm->RSSI_Min != 0xFF) { ++ if (pDM_PSTable->pre_rf_state == RF_Normal) { ++ if (pDM_Odm->RSSI_Min >= Rssi_Up_bound) ++ pDM_PSTable->cur_rf_state = RF_Save; ++ else ++ pDM_PSTable->cur_rf_state = RF_Normal; ++ } else { ++ if (pDM_Odm->RSSI_Min <= Rssi_Low_bound) ++ pDM_PSTable->cur_rf_state = RF_Normal; ++ else ++ pDM_PSTable->cur_rf_state = RF_Save; ++ } ++ } else { ++ pDM_PSTable->cur_rf_state = RF_MAX; ++ } ++ } else { ++ pDM_PSTable->cur_rf_state = RF_Normal; ++ } ++ ++ if (pDM_PSTable->pre_rf_state != pDM_PSTable->cur_rf_state) { ++ if (pDM_PSTable->cur_rf_state == RF_Save) { ++ /* 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode. */ ++ /* Suggested by SD3 Yu-Nan. 2011.01.20. */ ++ if (pDM_Odm->SupportICType == ODM_RTL8723A) ++ ODM_SetBBReg(pDM_Odm, 0x874, BIT(5), 0x1); /* Reg874[5]=1b'1 */ ++ ODM_SetBBReg(pDM_Odm, 0x874, 0x1C0000, 0x2); /* Reg874[20:18]=3'b010 */ ++ ODM_SetBBReg(pDM_Odm, 0xc70, BIT(3), 0); /* RegC70[3]=1'b0 */ ++ ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); /* Reg85C[31:24]=0x63 */ ++ ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); /* Reg874[15:14]=2'b10 */ ++ ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); /* RegA75[7:4]=0x3 */ ++ ODM_SetBBReg(pDM_Odm, 0x818, BIT(28), 0x0); /* Reg818[28]=1'b0 */ ++ ODM_SetBBReg(pDM_Odm, 0x818, BIT(28), 0x1); /* Reg818[28]=1'b1 */ ++ } else { ++ ODM_SetBBReg(pDM_Odm, 0x874, 0x1CC000, pDM_PSTable->reg_874); ++ ODM_SetBBReg(pDM_Odm, 0xc70, BIT(3), pDM_PSTable->reg_c70); ++ ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->reg_85c); ++ ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->reg_a74); ++ ODM_SetBBReg(pDM_Odm, 0x818, BIT(28), 0x0); ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8723A) ++ ODM_SetBBReg(pDM_Odm, 0x874, BIT(5), 0x0); /* Reg874[5]=1b'0 */ ++ } ++ pDM_PSTable->pre_rf_state = pDM_PSTable->cur_rf_state; ++ } ++} ++ ++/* 3============================================================ */ ++/* 3 RATR MASK */ ++/* 3============================================================ */ ++/* 3============================================================ */ ++/* 3 Rate Adaptive */ ++/* 3============================================================ */ ++ ++void odm_RateAdaptiveMaskInit(struct odm_dm_struct *pDM_Odm) ++{ ++ struct odm_rate_adapt *pOdmRA = &pDM_Odm->RateAdaptive; ++ ++ pOdmRA->Type = DM_Type_ByDriver; ++ if (pOdmRA->Type == DM_Type_ByDriver) ++ pDM_Odm->bUseRAMask = true; ++ else ++ pDM_Odm->bUseRAMask = false; ++ ++ pOdmRA->RATRState = DM_RATR_STA_INIT; ++ pOdmRA->HighRSSIThresh = 50; ++ pOdmRA->LowRSSIThresh = 20; ++} ++ ++u32 ODM_Get_Rate_Bitmap(struct odm_dm_struct *pDM_Odm, u32 macid, u32 ra_mask, u8 rssi_level) ++{ ++ struct sta_info *pEntry; ++ u32 rate_bitmap = 0x0fffffff; ++ u8 WirelessMode; ++ ++ pEntry = pDM_Odm->pODM_StaInfo[macid]; ++ if (!IS_STA_VALID(pEntry)) ++ return ra_mask; ++ ++ WirelessMode = pEntry->wireless_mode; ++ ++ switch (WirelessMode) { ++ case ODM_WM_B: ++ if (ra_mask & 0x0000000c) /* 11M or 5.5M enable */ ++ rate_bitmap = 0x0000000d; ++ else ++ rate_bitmap = 0x0000000f; ++ break; ++ case (ODM_WM_B | ODM_WM_G): ++ if (rssi_level == DM_RATR_STA_HIGH) ++ rate_bitmap = 0x00000f00; ++ else if (rssi_level == DM_RATR_STA_MIDDLE) ++ rate_bitmap = 0x00000ff0; ++ else ++ rate_bitmap = 0x00000ff5; ++ break; ++ case (ODM_WM_B | ODM_WM_G | ODM_WM_N24G): ++ if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) { ++ if (rssi_level == DM_RATR_STA_HIGH) { ++ rate_bitmap = 0x000f0000; ++ } else if (rssi_level == DM_RATR_STA_MIDDLE) { ++ rate_bitmap = 0x000ff000; ++ } else { ++ if (*pDM_Odm->pBandWidth == ODM_BW40M) ++ rate_bitmap = 0x000ff015; ++ else ++ rate_bitmap = 0x000ff005; ++ } ++ } else { ++ if (rssi_level == DM_RATR_STA_HIGH) { ++ rate_bitmap = 0x0f8f0000; ++ } else if (rssi_level == DM_RATR_STA_MIDDLE) { ++ rate_bitmap = 0x0f8ff000; ++ } else { ++ if (*pDM_Odm->pBandWidth == ODM_BW40M) ++ rate_bitmap = 0x0f8ff015; ++ else ++ rate_bitmap = 0x0f8ff005; ++ } ++ } ++ break; ++ default: ++ /* case WIRELESS_11_24N: */ ++ if (pDM_Odm->RFType == RF_1T2R) ++ rate_bitmap = 0x000fffff; ++ else ++ rate_bitmap = 0x0fffffff; ++ break; ++ } ++ ++ return rate_bitmap; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: odm_RefreshRateAdaptiveMask() ++ * ++ * Overview: Update rate table mask according to rssi ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 05/27/2009 hpfan Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++void odm_RefreshRateAdaptiveMask(struct odm_dm_struct *pDM_Odm) ++{ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) ++ return; ++ /* */ ++ /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */ ++ /* at the same time. In the stage2/3, we need to prive universal interface and merge all */ ++ /* HW dynamic mechanism. */ ++ /* */ ++ switch (pDM_Odm->SupportPlatform) { ++ case ODM_MP: ++ odm_RefreshRateAdaptiveMaskMP(pDM_Odm); ++ break; ++ case ODM_CE: ++ odm_RefreshRateAdaptiveMaskCE(pDM_Odm); ++ break; ++ case ODM_AP: ++ case ODM_ADSL: ++ odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm); ++ break; ++ } ++} ++ ++void odm_RefreshRateAdaptiveMaskMP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++void odm_RefreshRateAdaptiveMaskCE(struct odm_dm_struct *pDM_Odm) ++{ ++ u8 i; ++ struct adapter *pAdapter = pDM_Odm->Adapter; ++ ++ if (pAdapter->bDriverStopped) ++ return; ++ ++ if (!pDM_Odm->bUseRAMask) ++ return; ++ ++ for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { ++ struct sta_info *pstat = pDM_Odm->pODM_StaInfo[i]; ++ if (IS_STA_VALID(pstat)) { ++ if (ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) ++ rtw_hal_update_ra_mask(pAdapter, i, pstat->rssi_level); ++ } ++ } ++} ++ ++void odm_RefreshRateAdaptiveMaskAPADSL(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++/* Return Value: bool */ ++/* - true: RATRState is changed. */ ++bool ODM_RAStateCheck(struct odm_dm_struct *pDM_Odm, s32 RSSI, bool bForceUpdate, u8 *pRATRState) ++{ ++ struct odm_rate_adapt *pRA = &pDM_Odm->RateAdaptive; ++ const u8 GoUpGap = 5; ++ u8 HighRSSIThreshForRA = pRA->HighRSSIThresh; ++ u8 LowRSSIThreshForRA = pRA->LowRSSIThresh; ++ u8 RATRState; ++ ++ /* Threshold Adjustment: */ ++ /* when RSSI state trends to go up one or two levels, make sure RSSI is high enough. */ ++ /* Here GoUpGap is added to solve the boundary's level alternation issue. */ ++ switch (*pRATRState) { ++ case DM_RATR_STA_INIT: ++ case DM_RATR_STA_HIGH: ++ break; ++ case DM_RATR_STA_MIDDLE: ++ HighRSSIThreshForRA += GoUpGap; ++ break; ++ case DM_RATR_STA_LOW: ++ HighRSSIThreshForRA += GoUpGap; ++ LowRSSIThreshForRA += GoUpGap; ++ break; ++ default: ++ break; ++ } ++ ++ /* Decide RATRState by RSSI. */ ++ if (RSSI > HighRSSIThreshForRA) ++ RATRState = DM_RATR_STA_HIGH; ++ else if (RSSI > LowRSSIThreshForRA) ++ RATRState = DM_RATR_STA_MIDDLE; ++ else ++ RATRState = DM_RATR_STA_LOW; ++ ++ if (*pRATRState != RATRState || bForceUpdate) { ++ *pRATRState = RATRState; ++ return true; ++ } ++ return false; ++} ++ ++/* 3============================================================ */ ++/* 3 Dynamic Tx Power */ ++/* 3============================================================ */ ++ ++void odm_DynamicTxPowerInit(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &pHalData->dmpriv; ++ pdmpriv->bDynamicTxPowerEnable = false; ++ pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal; ++ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; ++} ++ ++void odm_DynamicTxPower(struct odm_dm_struct *pDM_Odm) ++{ ++ /* For AP/ADSL use struct rtl8192cd_priv * */ ++ /* For CE/NIC use struct adapter * */ ++ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR)) ++ return; ++ ++ /* 2012/01/12 MH According to Luke's suggestion, only high power will support the feature. */ ++ if (!pDM_Odm->ExtPA) ++ return; ++ ++ /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */ ++ /* at the same time. In the stage2/3, we need to prive universal interface and merge all */ ++ /* HW dynamic mechanism. */ ++ switch (pDM_Odm->SupportPlatform) { ++ case ODM_MP: ++ case ODM_CE: ++ odm_DynamicTxPowerNIC(pDM_Odm); ++ break; ++ case ODM_AP: ++ odm_DynamicTxPowerAP(pDM_Odm); ++ break; ++ case ODM_ADSL: ++ break; ++ } ++} ++ ++void odm_DynamicTxPowerNIC(struct odm_dm_struct *pDM_Odm) ++{ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR)) ++ return; ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8188E) { ++ /* ??? */ ++ /* This part need to be redefined. */ ++ } ++} ++ ++void odm_DynamicTxPowerAP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++/* 3============================================================ */ ++/* 3 RSSI Monitor */ ++/* 3============================================================ */ ++ ++void odm_RSSIMonitorCheck(struct odm_dm_struct *pDM_Odm) ++{ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) ++ return; ++ ++ /* */ ++ /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */ ++ /* at the same time. In the stage2/3, we need to prive universal interface and merge all */ ++ /* HW dynamic mechanism. */ ++ /* */ ++ switch (pDM_Odm->SupportPlatform) { ++ case ODM_MP: ++ odm_RSSIMonitorCheckMP(pDM_Odm); ++ break; ++ case ODM_CE: ++ odm_RSSIMonitorCheckCE(pDM_Odm); ++ break; ++ case ODM_AP: ++ odm_RSSIMonitorCheckAP(pDM_Odm); ++ break; ++ case ODM_ADSL: ++ /* odm_DIGAP(pDM_Odm); */ ++ break; ++ } ++ ++} /* odm_RSSIMonitorCheck */ ++ ++void odm_RSSIMonitorCheckMP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++static void FindMinimumRSSI(struct adapter *pAdapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ struct dm_priv *pdmpriv = &pHalData->dmpriv; ++ struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; ++ ++ /* 1 1.Determine the minimum RSSI */ ++ if (!check_fwstate(pmlmepriv, _FW_LINKED) && ++ pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) ++ pdmpriv->MinUndecoratedPWDBForDM = 0; ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) /* Default port */ ++ pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; ++ else /* associated entry pwdb */ ++ pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; ++} ++ ++void odm_RSSIMonitorCheckCE(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &pHalData->dmpriv; ++ int i; ++ int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; ++ u8 sta_cnt = 0; ++ u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */ ++ struct sta_info *psta; ++ u8 bcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ if (!check_fwstate(&Adapter->mlmepriv, _FW_LINKED)) ++ return; ++ ++ for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { ++ psta = pDM_Odm->pODM_StaInfo[i]; ++ if (IS_STA_VALID(psta) && ++ (psta->state & WIFI_ASOC_STATE) && ++ memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) && ++ memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN)) { ++ if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) ++ tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; ++ ++ if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) ++ tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; ++ if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) ++ PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB << 16)); ++ } ++ } ++ ++ for (i = 0; i < sta_cnt; i++) { ++ if (PWDB_rssi[i] != (0)) { ++ if (pHalData->fw_ractrl) { ++ /* Report every sta's RSSI to FW */ ++ } else { ++ ODM_RA_SetRSSI_8188E( ++ &pHalData->odmpriv, (PWDB_rssi[i] & 0xFF), (u8)((PWDB_rssi[i] >> 16) & 0xFF)); ++ } ++ } ++ } ++ ++ if (tmpEntryMaxPWDB != 0) /* If associated entry is found */ ++ pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; ++ else ++ pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; ++ ++ if (tmpEntryMinPWDB != 0xff) /* If associated entry is found */ ++ pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; ++ else ++ pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; ++ ++ FindMinimumRSSI(Adapter); ++ ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); ++} ++ ++void odm_RSSIMonitorCheckAP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++void ODM_InitAllTimers(struct odm_dm_struct *pDM_Odm) ++{ ++ timer_setup(&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer, odm_SwAntDivChkAntSwitchCallback, 0); ++} ++ ++void ODM_CancelAllTimers(struct odm_dm_struct *pDM_Odm) ++{ ++ ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer); ++} ++ ++void ODM_ReleaseAllTimers(struct odm_dm_struct *pDM_Odm) ++{ ++ ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer); ++ ++ ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->FastAntTrainingTimer); ++} ++ ++/* 3============================================================ */ ++/* 3 Tx Power Tracking */ ++/* 3============================================================ */ ++ ++void odm_TXPowerTrackingInit(struct odm_dm_struct *pDM_Odm) ++{ ++ odm_TXPowerTrackingThermalMeterInit(pDM_Odm); ++} ++ ++void odm_TXPowerTrackingThermalMeterInit(struct odm_dm_struct *pDM_Odm) ++{ ++ pDM_Odm->RFCalibrateInfo.bTXPowerTracking = true; ++ pDM_Odm->RFCalibrateInfo.TXPowercount = 0; ++ pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = false; ++ if (*pDM_Odm->mp_mode != 1) ++ pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; ++ MSG_88E("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl); ++ ++ pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; ++} ++ ++void ODM_TXPowerTrackingCheck(struct odm_dm_struct *pDM_Odm) ++{ ++ /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */ ++ /* at the same time. In the stage2/3, we need to prive universal interface and merge all */ ++ /* HW dynamic mechanism. */ ++ switch (pDM_Odm->SupportPlatform) { ++ case ODM_MP: ++ odm_TXPowerTrackingCheckMP(pDM_Odm); ++ break; ++ case ODM_CE: ++ odm_TXPowerTrackingCheckCE(pDM_Odm); ++ break; ++ case ODM_AP: ++ odm_TXPowerTrackingCheckAP(pDM_Odm); ++ break; ++ case ODM_ADSL: ++ break; ++ } ++} ++ ++void odm_TXPowerTrackingCheckCE(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ ++ if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)) ++ return; ++ ++ if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */ ++ PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_88E, BIT(17) | BIT(16), 0x03); ++ ++ pDM_Odm->RFCalibrateInfo.TM_Trigger = 1; ++ return; ++ } else { ++ odm_TXPowerTrackingCallback_ThermalMeter_8188E(Adapter); ++ pDM_Odm->RFCalibrateInfo.TM_Trigger = 0; ++ } ++} ++ ++void odm_TXPowerTrackingCheckMP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++void odm_TXPowerTrackingCheckAP(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++/* antenna mapping info */ ++/* 1: right-side antenna */ ++/* 2/0: left-side antenna */ ++/* PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt: for right-side antenna: Ant:1 RxDefaultAnt1 */ ++/* PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt: for left-side antenna: Ant:0 RxDefaultAnt2 */ ++/* We select left antenna as default antenna in initial process, modify it as needed */ ++/* */ ++ ++/* 3============================================================ */ ++/* 3 SW Antenna Diversity */ ++/* 3============================================================ */ ++void odm_SwAntDivInit(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++void ODM_SwAntDivChkPerPktRssi(struct odm_dm_struct *pDM_Odm, u8 StationID, struct odm_phy_status_info *pPhyInfo) ++{ ++} ++ ++void odm_SwAntDivChkAntSwitch(struct odm_dm_struct *pDM_Odm, u8 Step) ++{ ++} ++ ++void ODM_SwAntDivRestAfterLink(struct odm_dm_struct *pDM_Odm) ++{ ++} ++ ++void odm_SwAntDivChkAntSwitchCallback(struct timer_list *t) ++{ ++} ++ ++/* 3============================================================ */ ++/* 3 SW Antenna Diversity */ ++/* 3============================================================ */ ++ ++void odm_InitHybridAntDiv(struct odm_dm_struct *pDM_Odm) ++{ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) ++ return; ++ ++ if (pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D)) ++ ; ++ else if (pDM_Odm->SupportICType == ODM_RTL8188E) ++ ODM_AntennaDiversityInit_88E(pDM_Odm); ++} ++ ++void ODM_AntselStatistics_88C(struct odm_dm_struct *pDM_Odm, u8 MacId, u32 PWDBAll, bool isCCKrate) ++{ ++ struct sw_ant_switch *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; ++ ++ if (pDM_SWAT_Table->antsel == 1) { ++ if (isCCKrate) { ++ pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++; ++ } else { ++ pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++; ++ pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll; ++ } ++ } else { ++ if (isCCKrate) { ++ pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++; ++ } else { ++ pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++; ++ pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll; ++ } ++ } ++} ++ ++void odm_HwAntDiv(struct odm_dm_struct *pDM_Odm) ++{ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) ++ return; ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8188E) ++ ODM_AntennaDiversity_88E(pDM_Odm); ++} ++ ++/* EDCA Turbo */ ++void ODM_EdcaTurboInit(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false; ++ pDM_Odm->DM_EDCA_Table.bIsCurRDLState = false; ++ Adapter->recvpriv.bIsAnyNonBEPkts = false; ++ ++} /* ODM_InitEdcaTurbo */ ++ ++void odm_EdcaTurboCheck(struct odm_dm_struct *pDM_Odm) ++{ ++ /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */ ++ /* at the same time. In the stage2/3, we need to prive universal interface and merge all */ ++ /* HW dynamic mechanism. */ ++ if (!(pDM_Odm->SupportAbility & ODM_MAC_EDCA_TURBO)) ++ return; ++ ++ switch (pDM_Odm->SupportPlatform) { ++ case ODM_MP: ++ break; ++ case ODM_CE: ++ odm_EdcaTurboCheckCE(pDM_Odm); ++ break; ++ case ODM_AP: ++ case ODM_ADSL: ++ break; ++ } ++} /* odm_CheckEdcaTurbo */ ++ ++void odm_EdcaTurboCheckCE(struct odm_dm_struct *pDM_Odm) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ u32 trafficIndex; ++ u32 edca_param; ++ u64 cur_tx_bytes = 0; ++ u64 cur_rx_bytes = 0; ++ u8 bbtchange = false; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct xmit_priv *pxmitpriv = &Adapter->xmitpriv; ++ struct recv_priv *precvpriv = &Adapter->recvpriv; ++ struct registry_priv *pregpriv = &Adapter->registrypriv; ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (pregpriv->wifi_spec == 1) ++ goto dm_CheckEdcaTurbo_EXIT; ++ ++ if (pmlmeinfo->assoc_AP_vendor >= HT_IOT_PEER_MAX) ++ goto dm_CheckEdcaTurbo_EXIT; ++ ++ /* Check if the status needs to be changed. */ ++ if ((bbtchange) || (!precvpriv->bIsAnyNonBEPkts)) { ++ cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; ++ cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; ++ ++ /* traffic, TX or RX */ ++ if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_RALINK) || ++ (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS)) { ++ if (cur_tx_bytes > (cur_rx_bytes << 2)) { ++ /* Uplink TP is present. */ ++ trafficIndex = UP_LINK; ++ } else { ++ /* Balance TP is present. */ ++ trafficIndex = DOWN_LINK; ++ } ++ } else { ++ if (cur_rx_bytes > (cur_tx_bytes << 2)) { ++ /* Downlink TP is present. */ ++ trafficIndex = DOWN_LINK; ++ } else { ++ /* Balance TP is present. */ ++ trafficIndex = UP_LINK; ++ } ++ } ++ ++ if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)) { ++ if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_CISCO) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) ++ edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; ++ else ++ edca_param = EDCAParam[HT_IOT_PEER_UNKNOWN][trafficIndex]; ++ ++ rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param); ++ ++ pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex; ++ } ++ ++ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = true; ++ } else { ++ /* Turn Off EDCA turbo here. */ ++ /* Restore original EDCA according to the declaration of AP. */ ++ if (pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA) { ++ rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE); ++ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false; ++ } ++ } ++ ++dm_CheckEdcaTurbo_EXIT: ++ /* Set variables for next time. */ ++ precvpriv->bIsAnyNonBEPkts = false; ++ pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; ++ precvpriv->last_rx_bytes = precvpriv->rx_bytes; ++} ++ ++/* need to ODM CE Platform */ ++/* move to here for ANT detection mechanism using */ ++ ++u32 GetPSDData(struct odm_dm_struct *pDM_Odm, unsigned int point, u8 initial_gain_psd) ++{ ++ u32 psd_report; ++ ++ /* Set DCO frequency index, offset=(40MHz/SamplePts)*point */ ++ ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point); ++ ++ /* Start PSD calculation, Reg808[22]=0->1 */ ++ ODM_SetBBReg(pDM_Odm, 0x808, BIT(22), 1); ++ /* Need to wait for HW PSD report */ ++ ODM_StallExecution(30); ++ ODM_SetBBReg(pDM_Odm, 0x808, BIT(22), 0); ++ /* Read PSD report, Reg8B4[15:0] */ ++ psd_report = ODM_GetBBReg(pDM_Odm, 0x8B4, bMaskDWord) & 0x0000FFFF; ++ ++ psd_report = (u32)(ConvertTo_dB(psd_report)) + (u32)(initial_gain_psd - 0x1c); ++ ++ return psd_report; ++} ++ ++u32 ConvertTo_dB(u32 Value) ++{ ++ u8 i; ++ u8 j; ++ u32 dB; ++ ++ Value = Value & 0xFFFF; ++ for (i = 0; i < 8; i++) { ++ if (Value <= dB_Invert_Table[i][11]) ++ break; ++ } ++ ++ if (i >= 8) ++ return 96; /* maximum 96 dB */ ++ ++ for (j = 0; j < 12; j++) { ++ if (Value <= dB_Invert_Table[i][j]) ++ break; ++ } ++ ++ dB = i * 12 + j + 1; ++ ++ return dB; ++} ++ ++/* 2011/09/22 MH Add for 92D global spin lock utilization. */ ++void odm_GlobalAdapterCheck(void) ++{ ++} /* odm_GlobalAdapterCheck */ ++ ++/* Description: */ ++/* Set Single/Dual Antenna default setting for products that do not do detection in advance. */ ++/* Added by Joseph, 2012.03.22 */ ++void ODM_SingleDualAntennaDefaultSetting(struct odm_dm_struct *pDM_Odm) ++{ ++ struct sw_ant_switch *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; ++ ++ pDM_SWAT_Table->ANTA_ON = true; ++ pDM_SWAT_Table->ANTB_ON = true; ++} ++ ++/* 2 8723A ANT DETECT */ ++ ++static void odm_PHY_SaveAFERegisters(struct odm_dm_struct *pDM_Odm, u32 *AFEReg, u32 *AFEBackup, u32 RegisterNum) ++{ ++ u32 i; ++ ++ /* RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n")); */ ++ for (i = 0; i < RegisterNum; i++) ++ AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord); ++} ++ ++static void odm_PHY_ReloadAFERegisters(struct odm_dm_struct *pDM_Odm, u32 *AFEReg, u32 *AFEBackup, u32 RegiesterNum) ++{ ++ u32 i; ++ ++ for (i = 0; i < RegiesterNum; i++) ++ ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]); ++} ++ ++/* 2 8723A ANT DETECT */ ++/* Description: */ ++/* Implement IQK single tone for RF DPK loopback and BB PSD scanning. */ ++/* This function is cooperated with BB team Neil. */ ++bool ODM_SingleDualAntennaDetection(struct odm_dm_struct *pDM_Odm, u8 mode) ++{ ++ struct sw_ant_switch *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; ++ u32 CurrentChannel, RfLoopReg; ++ u8 n; ++ u32 Reg88c, Regc08, Reg874, Regc50; ++ u8 initial_gain = 0x5a; ++ u32 PSD_report_tmp; ++ u32 AntA_report = 0x0, AntB_report = 0x0, AntO_report = 0x0; ++ bool bResult = true; ++ u32 AFE_Backup[16]; ++ u32 AFE_REG_8723A[16] = { ++ rRx_Wait_CCA, rTx_CCK_RFON, ++ rTx_CCK_BBON, rTx_OFDM_RFON, ++ rTx_OFDM_BBON, rTx_To_Rx, ++ rTx_To_Tx, rRx_CCK, ++ rRx_OFDM, rRx_Wait_RIFS, ++ rRx_TO_Rx, rStandby, ++ rSleep, rPMPD_ANAEN, ++ rFPGA0_XCD_SwitchControl, rBlue_Tooth}; ++ ++ if (!(pDM_Odm->SupportICType & (ODM_RTL8723A | ODM_RTL8192C))) ++ return bResult; ++ ++ if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) ++ return bResult; ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8192C) { ++ /* Which path in ADC/DAC is turnned on for PSD: both I/Q */ ++ ODM_SetBBReg(pDM_Odm, 0x808, BIT(10) | BIT(11), 0x3); ++ /* Ageraged number: 8 */ ++ ODM_SetBBReg(pDM_Odm, 0x808, BIT(12) | BIT(13), 0x1); ++ /* pts = 128; */ ++ ODM_SetBBReg(pDM_Odm, 0x808, BIT(14) | BIT(15), 0x0); ++ } ++ ++ /* 1 Backup Current RF/BB Settings */ ++ ++ CurrentChannel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask); ++ RfLoopReg = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask); ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); /* change to Antenna A */ ++ /* Step 1: USE IQK to transmitter single tone */ ++ ++ ODM_StallExecution(10); ++ ++ /* Store A Path Register 88c, c08, 874, c50 */ ++ Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord); ++ Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord); ++ Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord); ++ Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord); ++ ++ /* Store AFE Registers */ ++ odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16); ++ ++ /* Set PSD 128 pts */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT(14) | BIT(15), 0x0); /* 128 pts */ ++ ++ /* To SET CH1 to do */ ++ ODM_SetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x01); /* Channel 1 */ ++ ++ /* AFE all on step */ ++ ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4); ++ ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4); ++ ++ /* 3 wire Disable */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0); ++ ++ /* BB IQK Setting */ ++ ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4); ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000); ++ ++ /* IQK setting tone@ 4.34Mhz */ ++ ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C); ++ ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00); ++ ++ /* Page B init */ ++ ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000); ++ ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000); ++ ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800); ++ ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f); ++ ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008); ++ ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008); ++ ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0); ++ ++ /* RF loop Setting */ ++ ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0, 0xFFFFF, 0x50008); ++ ++ /* IQK Single tone start */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000); ++ ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000); ++ ODM_StallExecution(1000); ++ PSD_report_tmp = 0x0; ++ ++ for (n = 0; n < 2; n++) { ++ PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain); ++ if (PSD_report_tmp > AntA_report) ++ AntA_report = PSD_report_tmp; ++ } ++ ++ PSD_report_tmp = 0x0; ++ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B); /* change to Antenna B */ ++ ODM_StallExecution(10); ++ ++ for (n = 0; n < 2; n++) { ++ PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain); ++ if (PSD_report_tmp > AntB_report) ++ AntB_report = PSD_report_tmp; ++ } ++ ++ /* change to open case */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, 0); /* change to Ant A and B all open case */ ++ ODM_StallExecution(10); ++ ++ for (n = 0; n < 2; n++) { ++ PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain); ++ if (PSD_report_tmp > AntO_report) ++ AntO_report = PSD_report_tmp; ++ } ++ ++ /* Close IQK Single Tone function */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); ++ PSD_report_tmp = 0x0; ++ ++ /* 1 Return to antanna A */ ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A); ++ ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c); ++ ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08); ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874); ++ ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40); ++ ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50); ++ ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel); ++ ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask, RfLoopReg); ++ ++ /* Reload AFE Registers */ ++ odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16); ++ ++ if (pDM_Odm->SupportICType == ODM_RTL8723A) { ++ /* 2 Test Ant B based on Ant A is ON */ ++ if (mode == ANTTESTB) { ++ if (AntA_report >= 100) { ++ if (AntB_report > (AntA_report + 1)) ++ pDM_SWAT_Table->ANTB_ON = false; ++ else ++ pDM_SWAT_Table->ANTB_ON = true; ++ } else { ++ pDM_SWAT_Table->ANTB_ON = false; /* Set Antenna B off as default */ ++ bResult = false; ++ } ++ } else if (mode == ANTTESTALL) { ++ /* 2 Test Ant A and B based on DPDT Open */ ++ if ((AntO_report >= 100) & (AntO_report < 118)) { ++ if (AntA_report > (AntO_report + 1)) ++ pDM_SWAT_Table->ANTA_ON = false; ++ else ++ pDM_SWAT_Table->ANTA_ON = true; ++ ++ if (AntB_report > (AntO_report + 2)) ++ pDM_SWAT_Table->ANTB_ON = false; ++ else ++ pDM_SWAT_Table->ANTB_ON = true; ++ } ++ } ++ } else if (pDM_Odm->SupportICType == ODM_RTL8192C) { ++ if (AntA_report >= 100) { ++ if (AntB_report > (AntA_report + 2)) { ++ pDM_SWAT_Table->ANTA_ON = false; ++ pDM_SWAT_Table->ANTB_ON = true; ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B); ++ } else if (AntA_report > (AntB_report + 2)) { ++ pDM_SWAT_Table->ANTA_ON = true; ++ pDM_SWAT_Table->ANTB_ON = false; ++ ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A); ++ } else { ++ pDM_SWAT_Table->ANTA_ON = true; ++ pDM_SWAT_Table->ANTB_ON = true; ++ } ++ } else { ++ pDM_SWAT_Table->ANTA_ON = true; /* Set Antenna A on as default */ ++ pDM_SWAT_Table->ANTB_ON = false; /* Set Antenna B off as default */ ++ bResult = false; ++ } ++ } ++ return bResult; ++} ++ ++/* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */ ++void odm_dtc(struct odm_dm_struct *pDM_Odm) ++{ ++} +diff --git a/drivers/staging/r8188eu/hal/odm_HWConfig.c b/drivers/staging/r8188eu/hal/odm_HWConfig.c +new file mode 100644 +index 000000000000..ada22a526fee +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm_HWConfig.c +@@ -0,0 +1,567 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++ ++#define READ_AND_CONFIG READ_AND_CONFIG_MP ++ ++#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig##txt##ic(dm_odm)) ++#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC##txt##ic(dm_odm)) ++ ++static u8 odm_QueryRxPwrPercentage(s8 AntPower) ++{ ++ if ((AntPower <= -100) || (AntPower >= 20)) ++ return 0; ++ else if (AntPower >= 0) ++ return 100; ++ else ++ return 100 + AntPower; ++} ++ ++/* 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. */ ++/* IF other SW team do not support the feature, remove this section.?? */ ++static s32 odm_sig_patch_lenove(struct odm_dm_struct *dm_odm, s32 CurrSig) ++{ ++ return 0; ++} ++ ++static s32 odm_sig_patch_netcore(struct odm_dm_struct *dm_odm, s32 CurrSig) ++{ ++ return 0; ++} ++ ++static s32 odm_SignalScaleMapping_92CSeries(struct odm_dm_struct *dm_odm, s32 CurrSig) ++{ ++ s32 RetSig = 0; ++ ++ if ((dm_odm->SupportInterface == ODM_ITRF_USB) || ++ (dm_odm->SupportInterface == ODM_ITRF_SDIO)) { ++ if (CurrSig >= 51 && CurrSig <= 100) ++ RetSig = 100; ++ else if (CurrSig >= 41 && CurrSig <= 50) ++ RetSig = 80 + ((CurrSig - 40) * 2); ++ else if (CurrSig >= 31 && CurrSig <= 40) ++ RetSig = 66 + (CurrSig - 30); ++ else if (CurrSig >= 21 && CurrSig <= 30) ++ RetSig = 54 + (CurrSig - 20); ++ else if (CurrSig >= 10 && CurrSig <= 20) ++ RetSig = 42 + (((CurrSig - 10) * 2) / 3); ++ else if (CurrSig >= 5 && CurrSig <= 9) ++ RetSig = 22 + (((CurrSig - 5) * 3) / 2); ++ else if (CurrSig >= 1 && CurrSig <= 4) ++ RetSig = 6 + (((CurrSig - 1) * 3) / 2); ++ else ++ RetSig = CurrSig; ++ } ++ return RetSig; ++} ++ ++static s32 odm_SignalScaleMapping(struct odm_dm_struct *dm_odm, s32 CurrSig) ++{ ++ if ((dm_odm->SupportPlatform == ODM_MP) && ++ (dm_odm->SupportInterface != ODM_ITRF_PCIE) && /* USB & SDIO */ ++ (dm_odm->PatchID == 10)) ++ return odm_sig_patch_netcore(dm_odm, CurrSig); ++ else if ((dm_odm->SupportPlatform == ODM_MP) && ++ (dm_odm->SupportInterface == ODM_ITRF_PCIE) && ++ (dm_odm->PatchID == 19)) ++ return odm_sig_patch_lenove(dm_odm, CurrSig); ++ else ++ return odm_SignalScaleMapping_92CSeries(dm_odm, CurrSig); ++} ++ ++/* pMgntInfo->CustomerID == RT_CID_819x_Lenovo */ ++static u8 odm_SQ_process_patch_RT_CID_819x_Lenovo(struct odm_dm_struct *dm_odm, ++ u8 isCCKrate, u8 PWDB_ALL, u8 path, u8 RSSI) ++{ ++ return 0; ++} ++ ++static u8 odm_evm_db_to_percentage(s8 value) ++{ ++ /* -33dB~0dB to 0%~99% */ ++ s8 ret_val = clamp(-value, 0, 33) * 3; ++ ++ if (ret_val == 99) ++ ret_val = 100; ++ ++ return ret_val; ++} ++ ++static void odm_RxPhyStatus92CSeries_Parsing(struct odm_dm_struct *dm_odm, ++ struct odm_phy_status_info *pPhyInfo, ++ u8 *pPhyStatus, ++ struct odm_per_pkt_info *pPktinfo, ++ struct adapter *adapt) ++{ ++ struct sw_ant_switch *pDM_SWAT_Table = &dm_odm->DM_SWAT_Table; ++ u8 i, Max_spatial_stream; ++ s8 rx_pwr[4], rx_pwr_all = 0; ++ u8 EVM, PWDB_ALL = 0, PWDB_ALL_BT; ++ u8 RSSI, total_rssi = 0; ++ u8 isCCKrate = 0; ++ u8 rf_rx_num = 0; ++ u8 cck_highpwr = 0; ++ u8 LNA_idx, VGA_idx; ++ ++ struct phy_status_rpt *pPhyStaRpt = (struct phy_status_rpt *)pPhyStatus; ++ ++ isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false; ++ ++ pPhyInfo->RxMIMOSignalQuality[RF_PATH_A] = -1; ++ pPhyInfo->RxMIMOSignalQuality[RF_PATH_B] = -1; ++ ++ if (isCCKrate) { ++ u8 report; ++ u8 cck_agc_rpt; ++ ++ dm_odm->PhyDbgInfo.NumQryPhyStatusCCK++; ++ /* (1)Hardware does not provide RSSI for CCK */ ++ /* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */ ++ ++ cck_highpwr = dm_odm->bCckHighPower; ++ ++ cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a; ++ ++ /* 2011.11.28 LukeLee: 88E use different LNA & VGA gain table */ ++ /* The RSSI formula should be modified according to the gain table */ ++ /* In 88E, cck_highpwr is always set to 1 */ ++ if (dm_odm->SupportICType & (ODM_RTL8188E | ODM_RTL8812)) { ++ LNA_idx = ((cck_agc_rpt & 0xE0) >> 5); ++ VGA_idx = (cck_agc_rpt & 0x1F); ++ switch (LNA_idx) { ++ case 7: ++ if (VGA_idx <= 27) ++ rx_pwr_all = -100 + 2 * (27 - VGA_idx); /* VGA_idx = 27~2 */ ++ else ++ rx_pwr_all = -100; ++ break; ++ case 6: ++ rx_pwr_all = -48 + 2 * (2 - VGA_idx); /* VGA_idx = 2~0 */ ++ break; ++ case 5: ++ rx_pwr_all = -42 + 2 * (7 - VGA_idx); /* VGA_idx = 7~5 */ ++ break; ++ case 4: ++ rx_pwr_all = -36 + 2 * (7 - VGA_idx); /* VGA_idx = 7~4 */ ++ break; ++ case 3: ++ rx_pwr_all = -24 + 2 * (7 - VGA_idx); /* VGA_idx = 7~0 */ ++ break; ++ case 2: ++ if (cck_highpwr) ++ rx_pwr_all = -12 + 2 * (5 - VGA_idx); /* VGA_idx = 5~0 */ ++ else ++ rx_pwr_all = -6 + 2 * (5 - VGA_idx); ++ break; ++ case 1: ++ rx_pwr_all = 8 - 2 * VGA_idx; ++ break; ++ case 0: ++ rx_pwr_all = 14 - 2 * VGA_idx; ++ break; ++ default: ++ break; ++ } ++ rx_pwr_all += 6; ++ PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); ++ if (!cck_highpwr) { ++ if (PWDB_ALL >= 80) ++ PWDB_ALL = ((PWDB_ALL - 80) << 1) + ((PWDB_ALL - 80) >> 1) + 80; ++ else if ((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) ++ PWDB_ALL += 3; ++ if (PWDB_ALL > 100) ++ PWDB_ALL = 100; ++ } ++ } else { ++ if (!cck_highpwr) { ++ report = (cck_agc_rpt & 0xc0) >> 6; ++ switch (report) { ++ /* 03312009 modified by cosa */ ++ /* Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion */ ++ /* Note: different RF with the different RNA gain. */ ++ case 0x3: ++ rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); ++ break; ++ case 0x2: ++ rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); ++ break; ++ case 0x1: ++ rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); ++ break; ++ case 0x0: ++ rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); ++ break; ++ } ++ } else { ++ report = (cck_agc_rpt & 0x60) >> 5; ++ switch (report) { ++ case 0x3: ++ rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f) << 1); ++ break; ++ case 0x2: ++ rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f) << 1); ++ break; ++ case 0x1: ++ rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f) << 1); ++ break; ++ case 0x0: ++ rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f) << 1); ++ break; ++ } ++ } ++ ++ PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); ++ ++ /* Modification for ext-LNA board */ ++ if (dm_odm->BoardType == ODM_BOARD_HIGHPWR) { ++ if ((cck_agc_rpt >> 7) == 0) { ++ PWDB_ALL = (PWDB_ALL > 94) ? 100 : (PWDB_ALL + 6); ++ } else { ++ if (PWDB_ALL > 38) ++ PWDB_ALL -= 16; ++ else ++ PWDB_ALL = (PWDB_ALL <= 16) ? (PWDB_ALL >> 2) : (PWDB_ALL - 12); ++ } ++ ++ /* CCK modification */ ++ if (PWDB_ALL > 25 && PWDB_ALL <= 60) ++ PWDB_ALL += 6; ++ } else {/* Modification for int-LNA board */ ++ if (PWDB_ALL > 99) ++ PWDB_ALL -= 8; ++ else if (PWDB_ALL > 50 && PWDB_ALL <= 68) ++ PWDB_ALL += 4; ++ } ++ } ++ ++ pPhyInfo->RxPWDBAll = PWDB_ALL; ++ pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; ++ pPhyInfo->RecvSignalPower = rx_pwr_all; ++ /* (3) Get Signal Quality (EVM) */ ++ if (pPktinfo->bPacketMatchBSSID) { ++ u8 SQ, SQ_rpt; ++ ++ if ((dm_odm->SupportPlatform == ODM_MP) && (dm_odm->PatchID == 19)) { ++ SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(dm_odm, isCCKrate, PWDB_ALL, 0, 0); ++ } else if (pPhyInfo->RxPWDBAll > 40 && !dm_odm->bInHctTest) { ++ SQ = 100; ++ } else { ++ SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; ++ ++ if (SQ_rpt > 64) ++ SQ = 0; ++ else if (SQ_rpt < 20) ++ SQ = 100; ++ else ++ SQ = ((64 - SQ_rpt) * 100) / 44; ++ } ++ pPhyInfo->SignalQuality = SQ; ++ pPhyInfo->RxMIMOSignalQuality[RF_PATH_A] = SQ; ++ pPhyInfo->RxMIMOSignalQuality[RF_PATH_B] = -1; ++ } ++ } else { /* is OFDM rate */ ++ dm_odm->PhyDbgInfo.NumQryPhyStatusOFDM++; ++ ++ /* (1)Get RSSI for HT rate */ ++ ++ for (i = RF_PATH_A; i < RF_PATH_MAX; i++) { ++ /* 2008/01/30 MH we will judge RF RX path now. */ ++ if (dm_odm->RFPathRxEnable & BIT(i)) ++ rf_rx_num++; ++ ++ rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain & 0x3F) * 2) - 110; ++ if (i == RF_PATH_A) ++ adapt->signal_strength = rx_pwr[i]; ++ ++ pPhyInfo->RxPwr[i] = rx_pwr[i]; ++ ++ /* Translate DBM to percentage. */ ++ RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); ++ total_rssi += RSSI; ++ ++ /* Modification for ext-LNA board */ ++ if (dm_odm->BoardType == ODM_BOARD_HIGHPWR) { ++ if ((pPhyStaRpt->path_agc[i].trsw) == 1) ++ RSSI = (RSSI > 94) ? 100 : (RSSI + 6); ++ else ++ RSSI = (RSSI <= 16) ? (RSSI >> 3) : (RSSI - 16); ++ ++ if ((RSSI <= 34) && (RSSI >= 4)) ++ RSSI -= 4; ++ } ++ ++ pPhyInfo->RxMIMOSignalStrength[i] = (u8)RSSI; ++ ++ /* Get Rx snr value in DB */ ++ pPhyInfo->RxSNR[i] = (s32)(pPhyStaRpt->path_rxsnr[i] / 2); ++ dm_odm->PhyDbgInfo.RxSNRdB[i] = (s32)(pPhyStaRpt->path_rxsnr[i] / 2); ++ ++ /* Record Signal Strength for next packet */ ++ if (pPktinfo->bPacketMatchBSSID) { ++ if ((dm_odm->SupportPlatform == ODM_MP) && (dm_odm->PatchID == 19)) { ++ if (i == RF_PATH_A) ++ pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(dm_odm, isCCKrate, PWDB_ALL, i, RSSI); ++ } ++ } ++ } ++ /* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */ ++ rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1) & 0x7f) - 110; ++ ++ PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); ++ PWDB_ALL_BT = PWDB_ALL; ++ ++ pPhyInfo->RxPWDBAll = PWDB_ALL; ++ pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; ++ pPhyInfo->RxPower = rx_pwr_all; ++ pPhyInfo->RecvSignalPower = rx_pwr_all; ++ ++ if ((dm_odm->SupportPlatform == ODM_MP) && (dm_odm->PatchID == 19)) { ++ /* do nothing */ ++ } else { ++ /* (3)EVM of HT rate */ ++ if (pPktinfo->Rate >= DESC92C_RATEMCS8 && pPktinfo->Rate <= DESC92C_RATEMCS15) ++ Max_spatial_stream = 2; /* both spatial stream make sense */ ++ else ++ Max_spatial_stream = 1; /* only spatial stream 1 makes sense */ ++ ++ for (i = 0; i < Max_spatial_stream; i++) { ++ /* Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment */ ++ /* fill most significant bit to "zero" when doing shifting operation which may change a negative */ ++ /* value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. */ ++ EVM = odm_evm_db_to_percentage((pPhyStaRpt->stream_rxevm[i])); /* dbm */ ++ ++ if (pPktinfo->bPacketMatchBSSID) { ++ if (i == RF_PATH_A) /* Fill value in RFD, Get the first spatial stream only */ ++ pPhyInfo->SignalQuality = (u8)(EVM & 0xff); ++ pPhyInfo->RxMIMOSignalQuality[i] = (u8)(EVM & 0xff); ++ } ++ } ++ } ++ } ++ /* UI BSS List signal strength(in percentage), make it good looking, from 0~100. */ ++ /* It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). */ ++ if (isCCKrate) { ++ pPhyInfo->SignalStrength = (u8)(odm_SignalScaleMapping(dm_odm, PWDB_ALL));/* PWDB_ALL; */ ++ } else { ++ if (rf_rx_num != 0) ++ pPhyInfo->SignalStrength = (u8)(odm_SignalScaleMapping(dm_odm, total_rssi /= rf_rx_num)); ++ } ++ ++ /* For 92C/92D HW (Hybrid) Antenna Diversity */ ++ pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; ++ /* For 88E HW Antenna Diversity */ ++ dm_odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; ++ dm_odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; ++ dm_odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; ++} ++ ++void odm_Init_RSSIForDM(struct odm_dm_struct *dm_odm) ++{ ++} ++ ++static void odm_Process_RSSIForDM(struct odm_dm_struct *dm_odm, ++ struct odm_phy_status_info *pPhyInfo, ++ struct odm_per_pkt_info *pPktinfo) ++{ ++ s32 UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK; ++ s32 UndecoratedSmoothedOFDM, RSSI_Ave; ++ u8 isCCKrate = 0; ++ u8 RSSI_max, RSSI_min, i; ++ u32 OFDM_pkt = 0; ++ u32 Weighting = 0; ++ struct sta_info *pEntry; ++ ++ if (pPktinfo->StationID == 0xFF) ++ return; ++ pEntry = dm_odm->pODM_StaInfo[pPktinfo->StationID]; ++ if (!IS_STA_VALID(pEntry)) ++ return; ++ if ((!pPktinfo->bPacketMatchBSSID)) ++ return; ++ ++ isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false; ++ ++ /* Smart Antenna Debug Message------------------ */ ++ if (dm_odm->SupportICType == ODM_RTL8188E) { ++ u8 antsel_tr_mux; ++ struct fast_ant_train *pDM_FatTable = &dm_odm->DM_FatTable; ++ ++ if (dm_odm->AntDivType == CG_TRX_SMART_ANTDIV) { ++ if (pDM_FatTable->FAT_State == FAT_TRAINING_STATE) { ++ if (pPktinfo->bPacketToSelf) { ++ antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2 << 2) | ++ (pDM_FatTable->antsel_rx_keep_1 << 1) | ++ pDM_FatTable->antsel_rx_keep_0; ++ pDM_FatTable->antSumRSSI[antsel_tr_mux] += pPhyInfo->RxPWDBAll; ++ pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; ++ } ++ } ++ } else if ((dm_odm->AntDivType == CG_TRX_HW_ANTDIV) || (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV)) { ++ if (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) { ++ antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2 << 2) | ++ (pDM_FatTable->antsel_rx_keep_1 << 1) | pDM_FatTable->antsel_rx_keep_0; ++ ODM_AntselStatistics_88E(dm_odm, antsel_tr_mux, pPktinfo->StationID, pPhyInfo->RxPWDBAll); ++ } ++ } ++ } ++ /* Smart Antenna Debug Message------------------ */ ++ ++ UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; ++ UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; ++ UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; ++ ++ if (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) { ++ if (!isCCKrate) { /* ofdm rate */ ++ if (pPhyInfo->RxMIMOSignalStrength[RF_PATH_B] == 0) { ++ RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A]; ++ } else { ++ if (pPhyInfo->RxMIMOSignalStrength[RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[RF_PATH_B]) { ++ RSSI_max = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A]; ++ RSSI_min = pPhyInfo->RxMIMOSignalStrength[RF_PATH_B]; ++ } else { ++ RSSI_max = pPhyInfo->RxMIMOSignalStrength[RF_PATH_B]; ++ RSSI_min = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A]; ++ } ++ if ((RSSI_max - RSSI_min) < 3) ++ RSSI_Ave = RSSI_max; ++ else if ((RSSI_max - RSSI_min) < 6) ++ RSSI_Ave = RSSI_max - 1; ++ else if ((RSSI_max - RSSI_min) < 10) ++ RSSI_Ave = RSSI_max - 2; ++ else ++ RSSI_Ave = RSSI_max - 3; ++ } ++ ++ /* 1 Process OFDM RSSI */ ++ if (UndecoratedSmoothedOFDM <= 0) { /* initialize */ ++ UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; ++ } else { ++ if (pPhyInfo->RxPWDBAll > (u32)UndecoratedSmoothedOFDM) { ++ UndecoratedSmoothedOFDM = ++ (((UndecoratedSmoothedOFDM) * (Rx_Smooth_Factor - 1)) + ++ (RSSI_Ave)) / (Rx_Smooth_Factor); ++ UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; ++ } else { ++ UndecoratedSmoothedOFDM = ++ (((UndecoratedSmoothedOFDM) * (Rx_Smooth_Factor - 1)) + ++ (RSSI_Ave)) / (Rx_Smooth_Factor); ++ } ++ } ++ ++ pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap << 1) | BIT(0); ++ ++ } else { ++ RSSI_Ave = pPhyInfo->RxPWDBAll; ++ ++ /* 1 Process CCK RSSI */ ++ if (UndecoratedSmoothedCCK <= 0) { /* initialize */ ++ UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; ++ } else { ++ if (pPhyInfo->RxPWDBAll > (u32)UndecoratedSmoothedCCK) { ++ UndecoratedSmoothedCCK = ++ ((UndecoratedSmoothedCCK * (Rx_Smooth_Factor - 1)) + ++ pPhyInfo->RxPWDBAll) / Rx_Smooth_Factor; ++ UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; ++ } else { ++ UndecoratedSmoothedCCK = ++ ((UndecoratedSmoothedCCK * (Rx_Smooth_Factor - 1)) + ++ pPhyInfo->RxPWDBAll) / Rx_Smooth_Factor; ++ } ++ } ++ pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap << 1; ++ } ++ /* 2011.07.28 LukeLee: modified to prevent unstable CCK RSSI */ ++ if (pEntry->rssi_stat.ValidBit >= 64) ++ pEntry->rssi_stat.ValidBit = 64; ++ else ++ pEntry->rssi_stat.ValidBit++; ++ ++ for (i = 0; i < pEntry->rssi_stat.ValidBit; i++) ++ OFDM_pkt += (u8)(pEntry->rssi_stat.PacketMap >> i) & BIT(0); ++ ++ if (pEntry->rssi_stat.ValidBit == 64) { ++ Weighting = ((OFDM_pkt << 4) > 64) ? 64 : (OFDM_pkt << 4); ++ UndecoratedSmoothedPWDB = (Weighting * UndecoratedSmoothedOFDM + (64 - Weighting) * UndecoratedSmoothedCCK) >> 6; ++ } else { ++ if (pEntry->rssi_stat.ValidBit != 0) ++ UndecoratedSmoothedPWDB = (OFDM_pkt * UndecoratedSmoothedOFDM + ++ (pEntry->rssi_stat.ValidBit - OFDM_pkt) * ++ UndecoratedSmoothedCCK) / pEntry->rssi_stat.ValidBit; ++ else ++ UndecoratedSmoothedPWDB = 0; ++ } ++ pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; ++ pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; ++ pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; ++ } ++} ++ ++/* Endianness before calling this API */ ++static void ODM_PhyStatusQuery_92CSeries(struct odm_dm_struct *dm_odm, ++ struct odm_phy_status_info *pPhyInfo, ++ u8 *pPhyStatus, ++ struct odm_per_pkt_info *pPktinfo, ++ struct adapter *adapt) ++{ ++ odm_RxPhyStatus92CSeries_Parsing(dm_odm, pPhyInfo, pPhyStatus, ++ pPktinfo, adapt); ++ if (dm_odm->RSSI_test) { ++ /* Select the packets to do RSSI checking for antenna switching. */ ++ if (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) ++ ODM_SwAntDivChkPerPktRssi(dm_odm, pPktinfo->StationID, pPhyInfo); ++ } else { ++ odm_Process_RSSIForDM(dm_odm, pPhyInfo, pPktinfo); ++ } ++} ++ ++void ODM_PhyStatusQuery(struct odm_dm_struct *dm_odm, ++ struct odm_phy_status_info *pPhyInfo, ++ u8 *pPhyStatus, struct odm_per_pkt_info *pPktinfo, ++ struct adapter *adapt) ++{ ++ ODM_PhyStatusQuery_92CSeries(dm_odm, pPhyInfo, pPhyStatus, pPktinfo, adapt); ++} ++ ++/* For future use. */ ++void ODM_MacStatusQuery(struct odm_dm_struct *dm_odm, u8 *mac_stat, ++ u8 macid, bool pkt_match_bssid, ++ bool pkttoself, bool pkt_beacon) ++{ ++ /* 2011/10/19 Driver team will handle in the future. */ ++} ++ ++enum HAL_STATUS ODM_ConfigRFWithHeaderFile(struct odm_dm_struct *dm_odm, ++ enum rf_radio_path content, ++ enum rf_radio_path rfpath) ++{ ++ if (dm_odm->SupportICType == ODM_RTL8188E) { ++ if (rfpath == RF_PATH_A) ++ READ_AND_CONFIG(8188E, _RadioA_1T_); ++ } ++ ++ return HAL_STATUS_SUCCESS; ++} ++ ++enum HAL_STATUS ODM_ConfigBBWithHeaderFile(struct odm_dm_struct *dm_odm, ++ enum odm_bb_config_type config_tp) ++{ ++ if (dm_odm->SupportICType == ODM_RTL8188E) { ++ if (config_tp == CONFIG_BB_PHY_REG) { ++ READ_AND_CONFIG(8188E, _PHY_REG_1T_); ++ } else if (config_tp == CONFIG_BB_AGC_TAB) { ++ READ_AND_CONFIG(8188E, _AGC_TAB_1T_); ++ } else if (config_tp == CONFIG_BB_PHY_REG_PG) { ++ READ_AND_CONFIG(8188E, _PHY_REG_PG_); ++ } ++ } ++ return HAL_STATUS_SUCCESS; ++} ++ ++enum HAL_STATUS ODM_ConfigMACWithHeaderFile(struct odm_dm_struct *dm_odm) ++{ ++ u8 result = HAL_STATUS_SUCCESS; ++ if (dm_odm->SupportICType == ODM_RTL8188E) ++ result = READ_AND_CONFIG(8188E, _MAC_REG_); ++ return result; ++} +diff --git a/drivers/staging/r8188eu/hal/odm_RTL8188E.c b/drivers/staging/r8188eu/hal/odm_RTL8188E.c +new file mode 100644 +index 000000000000..c64a291f9966 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm_RTL8188E.c +@@ -0,0 +1,337 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++ ++void ODM_DIG_LowerBound_88E(struct odm_dm_struct *dm_odm) ++{ ++ struct rtw_dig *pDM_DigTable = &dm_odm->DM_DigTable; ++ ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ++ pDM_DigTable->rx_gain_range_min = (u8)pDM_DigTable->AntDiv_RSSI_max; ++ /* If only one Entry connected */ ++} ++ ++static void odm_RX_HWAntDivInit(struct odm_dm_struct *dm_odm) ++{ ++ u32 value32; ++ ++ if (*dm_odm->mp_mode == 1) { ++ dm_odm->AntDivType = CGCS_RX_SW_ANTDIV; ++ ODM_SetBBReg(dm_odm, ODM_REG_IGI_A_11N, BIT(7), 0); /* disable HW AntDiv */ ++ ODM_SetBBReg(dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* 1:CG, 0:CS */ ++ return; ++ } ++ ++ /* MAC Setting */ ++ value32 = ODM_GetMACReg(dm_odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord); ++ ODM_SetMACReg(dm_odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32 | (BIT(23) | BIT(25))); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */ ++ /* Pin Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);/* Reg870[8]=1'b0, Reg870[9]=1'b0 antsel antselb by HW */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0); /* Reg864[10]=1'b0 antsel2 by HW */ ++ ODM_SetBBReg(dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(22), 1); /* Regb2c[22]=1'b0 disable CS/CG switch */ ++ ODM_SetBBReg(dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* Regb2c[31]=1'b1 output at CG only */ ++ /* OFDM Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_ANTDIV_PARA1_11N, bMaskDWord, 0x000000a0); ++ /* CCK Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1); /* Fix CCK PHY status report issue */ ++ ODM_SetBBReg(dm_odm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */ ++ ODM_UpdateRxIdleAnt_88E(dm_odm, MAIN_ANT); ++ ODM_SetBBReg(dm_odm, ODM_REG_ANT_MAPPING1_11N, 0xFFFF, 0x0201); /* antenna mapping table */ ++} ++ ++static void odm_TRX_HWAntDivInit(struct odm_dm_struct *dm_odm) ++{ ++ u32 value32; ++ ++ if (*dm_odm->mp_mode == 1) { ++ dm_odm->AntDivType = CGCS_RX_SW_ANTDIV; ++ ODM_SetBBReg(dm_odm, ODM_REG_IGI_A_11N, BIT(7), 0); /* disable HW AntDiv */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(5) | BIT(4) | BIT(3), 0); /* Default RX (0/1) */ ++ return; ++ } ++ ++ /* MAC Setting */ ++ value32 = ODM_GetMACReg(dm_odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord); ++ ODM_SetMACReg(dm_odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32 | (BIT(23) | BIT(25))); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */ ++ /* Pin Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);/* Reg870[8]=1'b0, Reg870[9]=1'b0 antsel antselb by HW */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0); /* Reg864[10]=1'b0 antsel2 by HW */ ++ ODM_SetBBReg(dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(22), 0); /* Regb2c[22]=1'b0 disable CS/CG switch */ ++ ODM_SetBBReg(dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* Regb2c[31]=1'b1 output at CG only */ ++ /* OFDM Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_ANTDIV_PARA1_11N, bMaskDWord, 0x000000a0); ++ /* CCK Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1); /* Fix CCK PHY status report issue */ ++ ODM_SetBBReg(dm_odm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */ ++ /* Tx Settings */ ++ ODM_SetBBReg(dm_odm, ODM_REG_TX_ANT_CTRL_11N, BIT(21), 0); /* Reg80c[21]=1'b0 from TX Reg */ ++ ODM_UpdateRxIdleAnt_88E(dm_odm, MAIN_ANT); ++ ++ /* antenna mapping table */ ++ if (!dm_odm->bIsMPChip) { /* testchip */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_DEFUALT_A_11N, BIT(10) | BIT(9) | BIT(8), 1); /* Reg858[10:8]=3'b001 */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_DEFUALT_A_11N, BIT(13) | BIT(12) | BIT(11), 2); /* Reg858[13:11]=3'b010 */ ++ } else { /* MPchip */ ++ ODM_SetBBReg(dm_odm, ODM_REG_ANT_MAPPING1_11N, bMaskDWord, 0x0201); /* Reg914=3'b010, Reg915=3'b001 */ ++ } ++} ++ ++static void odm_FastAntTrainingInit(struct odm_dm_struct *dm_odm) ++{ ++ u32 value32, i; ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ u32 AntCombination = 2; ++ ++ if (*dm_odm->mp_mode == 1) ++ return; ++ ++ for (i = 0; i < 6; i++) { ++ dm_fat_tbl->Bssid[i] = 0; ++ dm_fat_tbl->antSumRSSI[i] = 0; ++ dm_fat_tbl->antRSSIcnt[i] = 0; ++ dm_fat_tbl->antAveRSSI[i] = 0; ++ } ++ dm_fat_tbl->TrainIdx = 0; ++ dm_fat_tbl->FAT_State = FAT_NORMAL_STATE; ++ ++ /* MAC Setting */ ++ value32 = ODM_GetMACReg(dm_odm, 0x4c, bMaskDWord); ++ ODM_SetMACReg(dm_odm, 0x4c, bMaskDWord, value32 | (BIT(23) | BIT(25))); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */ ++ value32 = ODM_GetMACReg(dm_odm, 0x7B4, bMaskDWord); ++ ODM_SetMACReg(dm_odm, 0x7b4, bMaskDWord, value32 | (BIT(16) | BIT(17))); /* Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match */ ++ ++ /* Match MAC ADDR */ ++ ODM_SetMACReg(dm_odm, 0x7b4, 0xFFFF, 0); ++ ODM_SetMACReg(dm_odm, 0x7b0, bMaskDWord, 0); ++ ++ ODM_SetBBReg(dm_odm, 0x870, BIT(9) | BIT(8), 0);/* Reg870[8]=1'b0, Reg870[9]=1'b0 antsel antselb by HW */ ++ ODM_SetBBReg(dm_odm, 0x864, BIT(10), 0); /* Reg864[10]=1'b0 antsel2 by HW */ ++ ODM_SetBBReg(dm_odm, 0xb2c, BIT(22), 0); /* Regb2c[22]=1'b0 disable CS/CG switch */ ++ ODM_SetBBReg(dm_odm, 0xb2c, BIT(31), 1); /* Regb2c[31]=1'b1 output at CG only */ ++ ODM_SetBBReg(dm_odm, 0xca4, bMaskDWord, 0x000000a0); ++ ++ /* antenna mapping table */ ++ if (AntCombination == 2) { ++ if (!dm_odm->bIsMPChip) { /* testchip */ ++ ODM_SetBBReg(dm_odm, 0x858, BIT(10) | BIT(9) | BIT(8), 1); /* Reg858[10:8]=3'b001 */ ++ ODM_SetBBReg(dm_odm, 0x858, BIT(13) | BIT(12) | BIT(11), 2); /* Reg858[13:11]=3'b010 */ ++ } else { /* MPchip */ ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte0, 1); ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte1, 2); ++ } ++ } else if (AntCombination == 7) { ++ if (!dm_odm->bIsMPChip) { /* testchip */ ++ ODM_SetBBReg(dm_odm, 0x858, BIT(10) | BIT(9) | BIT(8), 0); /* Reg858[10:8]=3'b000 */ ++ ODM_SetBBReg(dm_odm, 0x858, BIT(13) | BIT(12) | BIT(11), 1); /* Reg858[13:11]=3'b001 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(16), 0); ++ ODM_SetBBReg(dm_odm, 0x858, BIT(15) | BIT(14), 2); /* Reg878[0],Reg858[14:15])=3'b010 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(19) | BIT(18) | BIT(17), 3);/* Reg878[3:1]=3b'011 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(22) | BIT(21) | BIT(20), 4);/* Reg878[6:4]=3b'100 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(25) | BIT(24) | BIT(23), 5);/* Reg878[9:7]=3b'101 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(28) | BIT(27) | BIT(26), 6);/* Reg878[12:10]=3b'110 */ ++ ODM_SetBBReg(dm_odm, 0x878, BIT(31) | BIT(30) | BIT(29), 7);/* Reg878[15:13]=3b'111 */ ++ } else { /* MPchip */ ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte0, 0); ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte1, 1); ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte2, 2); ++ ODM_SetBBReg(dm_odm, 0x914, bMaskByte3, 3); ++ ODM_SetBBReg(dm_odm, 0x918, bMaskByte0, 4); ++ ODM_SetBBReg(dm_odm, 0x918, bMaskByte1, 5); ++ ODM_SetBBReg(dm_odm, 0x918, bMaskByte2, 6); ++ ODM_SetBBReg(dm_odm, 0x918, bMaskByte3, 7); ++ } ++ } ++ ++ /* Default Ant Setting when no fast training */ ++ ODM_SetBBReg(dm_odm, 0x80c, BIT(21), 1); /* Reg80c[21]=1'b1 from TX Info */ ++ ODM_SetBBReg(dm_odm, 0x864, BIT(5) | BIT(4) | BIT(3), 0); /* Default RX */ ++ ODM_SetBBReg(dm_odm, 0x864, BIT(8) | BIT(7) | BIT(6), 1); /* Optional RX */ ++ ++ /* Enter Traing state */ ++ ODM_SetBBReg(dm_odm, 0x864, BIT(2) | BIT(1) | BIT(0), (AntCombination - 1)); /* Reg864[2:0]=3'd6 ant combination=reg864[2:0]+1 */ ++ ODM_SetBBReg(dm_odm, 0xc50, BIT(7), 1); /* RegC50[7]=1'b1 enable HW AntDiv */ ++} ++ ++void ODM_AntennaDiversityInit_88E(struct odm_dm_struct *dm_odm) ++{ ++ if (dm_odm->SupportICType != ODM_RTL8188E) ++ return; ++ ++ if (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV) ++ odm_RX_HWAntDivInit(dm_odm); ++ else if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ++ odm_TRX_HWAntDivInit(dm_odm); ++ else if (dm_odm->AntDivType == CG_TRX_SMART_ANTDIV) ++ odm_FastAntTrainingInit(dm_odm); ++} ++ ++void ODM_UpdateRxIdleAnt_88E(struct odm_dm_struct *dm_odm, u8 Ant) ++{ ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ u32 DefaultAnt, OptionalAnt; ++ ++ if (dm_fat_tbl->RxIdleAnt != Ant) { ++ if (Ant == MAIN_ANT) { ++ DefaultAnt = (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ? MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX; ++ OptionalAnt = (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ? AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX; ++ } else { ++ DefaultAnt = (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ? AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX; ++ OptionalAnt = (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ? MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX; ++ } ++ ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) { ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(5) | BIT(4) | BIT(3), DefaultAnt); /* Default RX */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(8) | BIT(7) | BIT(6), OptionalAnt); /* Optional RX */ ++ ODM_SetBBReg(dm_odm, ODM_REG_ANTSEL_CTRL_11N, BIT(14) | BIT(13) | BIT(12), DefaultAnt); /* Default TX */ ++ ODM_SetMACReg(dm_odm, ODM_REG_RESP_TX_11N, BIT(6) | BIT(7), DefaultAnt); /* Resp Tx */ ++ } else if (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV) { ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(5) | BIT(4) | BIT(3), DefaultAnt); /* Default RX */ ++ ODM_SetBBReg(dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(8) | BIT(7) | BIT(6), OptionalAnt); /* Optional RX */ ++ } ++ } ++ dm_fat_tbl->RxIdleAnt = Ant; ++ if (Ant != MAIN_ANT) ++ pr_info("RxIdleAnt=AUX_ANT\n"); ++} ++ ++static void odm_UpdateTxAnt_88E(struct odm_dm_struct *dm_odm, u8 Ant, u32 MacId) ++{ ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ u8 TargetAnt; ++ ++ if (Ant == MAIN_ANT) ++ TargetAnt = MAIN_ANT_CG_TRX; ++ else ++ TargetAnt = AUX_ANT_CG_TRX; ++ dm_fat_tbl->antsel_a[MacId] = TargetAnt & BIT(0); ++ dm_fat_tbl->antsel_b[MacId] = (TargetAnt & BIT(1)) >> 1; ++ dm_fat_tbl->antsel_c[MacId] = (TargetAnt & BIT(2)) >> 2; ++} ++ ++void ODM_SetTxAntByTxInfo_88E(struct odm_dm_struct *dm_odm, u8 *pDesc, u8 macId) ++{ ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ ++ if ((dm_odm->AntDivType == CG_TRX_HW_ANTDIV) || (dm_odm->AntDivType == CG_TRX_SMART_ANTDIV)) { ++ SET_TX_DESC_ANTSEL_A_88E(pDesc, dm_fat_tbl->antsel_a[macId]); ++ SET_TX_DESC_ANTSEL_B_88E(pDesc, dm_fat_tbl->antsel_b[macId]); ++ SET_TX_DESC_ANTSEL_C_88E(pDesc, dm_fat_tbl->antsel_c[macId]); ++ } ++} ++ ++void ODM_AntselStatistics_88E(struct odm_dm_struct *dm_odm, u8 antsel_tr_mux, u32 MacId, u8 RxPWDBAll) ++{ ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) { ++ if (antsel_tr_mux == MAIN_ANT_CG_TRX) { ++ dm_fat_tbl->MainAnt_Sum[MacId] += RxPWDBAll; ++ dm_fat_tbl->MainAnt_Cnt[MacId]++; ++ } else { ++ dm_fat_tbl->AuxAnt_Sum[MacId] += RxPWDBAll; ++ dm_fat_tbl->AuxAnt_Cnt[MacId]++; ++ } ++ } else if (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV) { ++ if (antsel_tr_mux == MAIN_ANT_CGCS_RX) { ++ dm_fat_tbl->MainAnt_Sum[MacId] += RxPWDBAll; ++ dm_fat_tbl->MainAnt_Cnt[MacId]++; ++ } else { ++ dm_fat_tbl->AuxAnt_Sum[MacId] += RxPWDBAll; ++ dm_fat_tbl->AuxAnt_Cnt[MacId]++; ++ } ++ } ++} ++ ++static void odm_HWAntDiv(struct odm_dm_struct *dm_odm) ++{ ++ u32 i, MinRSSI = 0xFF, AntDivMaxRSSI = 0, MaxRSSI = 0, LocalMinRSSI, LocalMaxRSSI; ++ u32 Main_RSSI, Aux_RSSI; ++ u8 RxIdleAnt = 0, TargetAnt = 7; ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ struct rtw_dig *pDM_DigTable = &dm_odm->DM_DigTable; ++ struct sta_info *pEntry; ++ ++ for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { ++ pEntry = dm_odm->pODM_StaInfo[i]; ++ if (IS_STA_VALID(pEntry)) { ++ /* 2 Caculate RSSI per Antenna */ ++ Main_RSSI = (dm_fat_tbl->MainAnt_Cnt[i] != 0) ? (dm_fat_tbl->MainAnt_Sum[i] / dm_fat_tbl->MainAnt_Cnt[i]) : 0; ++ Aux_RSSI = (dm_fat_tbl->AuxAnt_Cnt[i] != 0) ? (dm_fat_tbl->AuxAnt_Sum[i] / dm_fat_tbl->AuxAnt_Cnt[i]) : 0; ++ TargetAnt = (Main_RSSI >= Aux_RSSI) ? MAIN_ANT : AUX_ANT; ++ /* 2 Select MaxRSSI for DIG */ ++ LocalMaxRSSI = (Main_RSSI > Aux_RSSI) ? Main_RSSI : Aux_RSSI; ++ if ((LocalMaxRSSI > AntDivMaxRSSI) && (LocalMaxRSSI < 40)) ++ AntDivMaxRSSI = LocalMaxRSSI; ++ if (LocalMaxRSSI > MaxRSSI) ++ MaxRSSI = LocalMaxRSSI; ++ ++ /* 2 Select RX Idle Antenna */ ++ if ((dm_fat_tbl->RxIdleAnt == MAIN_ANT) && (Main_RSSI == 0)) ++ Main_RSSI = Aux_RSSI; ++ else if ((dm_fat_tbl->RxIdleAnt == AUX_ANT) && (Aux_RSSI == 0)) ++ Aux_RSSI = Main_RSSI; ++ ++ LocalMinRSSI = (Main_RSSI > Aux_RSSI) ? Aux_RSSI : Main_RSSI; ++ if (LocalMinRSSI < MinRSSI) { ++ MinRSSI = LocalMinRSSI; ++ RxIdleAnt = TargetAnt; ++ } ++ /* 2 Select TRX Antenna */ ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ++ odm_UpdateTxAnt_88E(dm_odm, TargetAnt, i); ++ } ++ dm_fat_tbl->MainAnt_Sum[i] = 0; ++ dm_fat_tbl->AuxAnt_Sum[i] = 0; ++ dm_fat_tbl->MainAnt_Cnt[i] = 0; ++ dm_fat_tbl->AuxAnt_Cnt[i] = 0; ++ } ++ ++ /* 2 Set RX Idle Antenna */ ++ ODM_UpdateRxIdleAnt_88E(dm_odm, RxIdleAnt); ++ ++ pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI; ++ pDM_DigTable->RSSI_max = MaxRSSI; ++} ++ ++void ODM_AntennaDiversity_88E(struct odm_dm_struct *dm_odm) ++{ ++ struct fast_ant_train *dm_fat_tbl = &dm_odm->DM_FatTable; ++ if ((dm_odm->SupportICType != ODM_RTL8188E) || (!(dm_odm->SupportAbility & ODM_BB_ANT_DIV))) ++ return; ++ if (!dm_odm->bLinked) { ++ if (dm_fat_tbl->bBecomeLinked) { ++ ODM_SetBBReg(dm_odm, ODM_REG_IGI_A_11N, BIT(7), 0); /* RegC50[7]=1'b1 enable HW AntDiv */ ++ ODM_SetBBReg(dm_odm, ODM_REG_CCK_ANTDIV_PARA1_11N, BIT(15), 0); /* Enable CCK AntDiv */ ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ++ ODM_SetBBReg(dm_odm, ODM_REG_TX_ANT_CTRL_11N, BIT(21), 0); /* Reg80c[21]=1'b0 from TX Reg */ ++ dm_fat_tbl->bBecomeLinked = dm_odm->bLinked; ++ } ++ return; ++ } else { ++ if (!dm_fat_tbl->bBecomeLinked) { ++ /* Because HW AntDiv is disabled before Link, we enable HW AntDiv after link */ ++ ODM_SetBBReg(dm_odm, ODM_REG_IGI_A_11N, BIT(7), 1); /* RegC50[7]=1'b1 enable HW AntDiv */ ++ ODM_SetBBReg(dm_odm, ODM_REG_CCK_ANTDIV_PARA1_11N, BIT(15), 1); /* Enable CCK AntDiv */ ++ if (dm_odm->AntDivType == CG_TRX_HW_ANTDIV) ++ ODM_SetBBReg(dm_odm, ODM_REG_TX_ANT_CTRL_11N, BIT(21), 1); /* Reg80c[21]=1'b1 from TX Info */ ++ dm_fat_tbl->bBecomeLinked = dm_odm->bLinked; ++ } ++ } ++ if ((dm_odm->AntDivType == CG_TRX_HW_ANTDIV) || (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV)) ++ odm_HWAntDiv(dm_odm); ++} ++ ++/* 3============================================================ */ ++/* 3 Dynamic Primary CCA */ ++/* 3============================================================ */ ++ ++void odm_PrimaryCCA_Init(struct odm_dm_struct *dm_odm) ++{ ++ struct dyn_primary_cca *PrimaryCCA = &dm_odm->DM_PriCCA; ++ ++ PrimaryCCA->dup_rts_flag = 0; ++ PrimaryCCA->intf_flag = 0; ++ PrimaryCCA->intf_type = 0; ++ PrimaryCCA->monitor_flag = 0; ++ PrimaryCCA->pri_cca_flag = 0; ++} +diff --git a/drivers/staging/r8188eu/hal/odm_RegConfig8188E.c b/drivers/staging/r8188eu/hal/odm_RegConfig8188E.c +new file mode 100644 +index 000000000000..1bc3b49cd67f +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm_RegConfig8188E.c +@@ -0,0 +1,98 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++ ++void odm_ConfigRFReg_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, ++ u32 Data, enum rf_radio_path RF_PATH, ++ u32 RegAddr) ++{ ++ if (Addr == 0xffe) { ++ ODM_sleep_ms(50); ++ } else if (Addr == 0xfd) { ++ ODM_delay_ms(5); ++ } else if (Addr == 0xfc) { ++ ODM_delay_ms(1); ++ } else if (Addr == 0xfb) { ++ ODM_delay_us(50); ++ } else if (Addr == 0xfa) { ++ ODM_delay_us(5); ++ } else if (Addr == 0xf9) { ++ ODM_delay_us(1); ++ } else { ++ ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); ++ /* Add 1us delay between BB/RF register setting. */ ++ ODM_delay_us(1); ++ } ++} ++ ++void odm_ConfigRF_RadioA_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u32 Data) ++{ ++ u32 content = 0x1000; /* RF_Content: radioa_txt */ ++ u32 maskforPhySet = (u32)(content & 0xE000); ++ ++ odm_ConfigRFReg_8188E(pDM_Odm, Addr, Data, RF_PATH_A, Addr | maskforPhySet); ++} ++ ++void odm_ConfigRF_RadioB_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u32 Data) ++{ ++ u32 content = 0x1001; /* RF_Content: radiob_txt */ ++ u32 maskforPhySet = (u32)(content & 0xE000); ++ ++ odm_ConfigRFReg_8188E(pDM_Odm, Addr, Data, RF_PATH_B, Addr | maskforPhySet); ++} ++ ++void odm_ConfigMAC_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u8 Data) ++{ ++ ODM_Write1Byte(pDM_Odm, Addr, Data); ++} ++ ++void odm_ConfigBB_AGC_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u32 Bitmask, u32 Data) ++{ ++ ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data); ++ /* Add 1us delay between BB/RF register setting. */ ++ ODM_delay_us(1); ++} ++ ++void odm_ConfigBB_PHY_REG_PG_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, ++ u32 Bitmask, u32 Data) ++{ ++ if (Addr == 0xfe) ++ ODM_sleep_ms(50); ++ else if (Addr == 0xfd) ++ ODM_delay_ms(5); ++ else if (Addr == 0xfc) ++ ODM_delay_ms(1); ++ else if (Addr == 0xfb) ++ ODM_delay_us(50); ++ else if (Addr == 0xfa) ++ ODM_delay_us(5); ++ else if (Addr == 0xf9) ++ ODM_delay_us(1); ++ else ++ storePwrIndexDiffRateOffset(pDM_Odm->Adapter, Addr, Bitmask, Data); ++} ++ ++void odm_ConfigBB_PHY_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u32 Bitmask, u32 Data) ++{ ++ if (Addr == 0xfe) { ++ ODM_sleep_ms(50); ++ } else if (Addr == 0xfd) { ++ ODM_delay_ms(5); ++ } else if (Addr == 0xfc) { ++ ODM_delay_ms(1); ++ } else if (Addr == 0xfb) { ++ ODM_delay_us(50); ++ } else if (Addr == 0xfa) { ++ ODM_delay_us(5); ++ } else if (Addr == 0xf9) { ++ ODM_delay_us(1); ++ } else { ++ if (Addr == 0xa24) ++ pDM_Odm->RFCalibrateInfo.RegA24 = Data; ++ ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data); ++ ++ /* Add 1us delay between BB/RF register setting. */ ++ ODM_delay_us(1); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/odm_debug.c b/drivers/staging/r8188eu/hal/odm_debug.c +new file mode 100644 +index 000000000000..7029ec4f771e +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm_debug.c +@@ -0,0 +1,6 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++ ++u32 GlobalDebugLevel; +diff --git a/drivers/staging/r8188eu/hal/odm_interface.c b/drivers/staging/r8188eu/hal/odm_interface.c +new file mode 100644 +index 000000000000..5a01495d74bc +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/odm_interface.c +@@ -0,0 +1,178 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/odm_precomp.h" ++/* ODM IO Relative API. */ ++ ++u8 ODM_Read1Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return rtw_read8(Adapter, RegAddr); ++} ++ ++u16 ODM_Read2Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return rtw_read16(Adapter, RegAddr); ++} ++ ++u32 ODM_Read4Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return rtw_read32(Adapter, RegAddr); ++} ++ ++void ODM_Write1Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u8 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ rtw_write8(Adapter, RegAddr, Data); ++} ++ ++void ODM_Write2Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u16 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ rtw_write16(Adapter, RegAddr, Data); ++} ++ ++void ODM_Write4Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ rtw_write32(Adapter, RegAddr, Data); ++} ++ ++void ODM_SetMACReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask, u32 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); ++} ++ ++u32 ODM_GetMACReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return PHY_QueryBBReg(Adapter, RegAddr, BitMask); ++} ++ ++void ODM_SetBBReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask, u32 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); ++} ++ ++u32 ODM_GetBBReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return PHY_QueryBBReg(Adapter, RegAddr, BitMask); ++} ++ ++void ODM_SetRFReg(struct odm_dm_struct *pDM_Odm, enum rf_radio_path eRFPath, u32 RegAddr, u32 BitMask, u32 Data) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ PHY_SetRFReg(Adapter, (enum rf_radio_path)eRFPath, RegAddr, BitMask, Data); ++} ++ ++u32 ODM_GetRFReg(struct odm_dm_struct *pDM_Odm, enum rf_radio_path eRFPath, u32 RegAddr, u32 BitMask) ++{ ++ struct adapter *Adapter = pDM_Odm->Adapter; ++ return PHY_QueryRFReg(Adapter, (enum rf_radio_path)eRFPath, RegAddr, BitMask); ++} ++ ++/* ODM Memory relative API. */ ++void ODM_AllocateMemory(struct odm_dm_struct *pDM_Odm, void **pPtr, u32 length) ++{ ++ *pPtr = vzalloc(length); ++} ++ ++/* length could be ignored, used to detect memory leakage. */ ++void ODM_FreeMemory(struct odm_dm_struct *pDM_Odm, void *pPtr, u32 length) ++{ ++ vfree(pPtr); ++} ++ ++s32 ODM_CompareMemory(struct odm_dm_struct *pDM_Odm, void *pBuf1, void *pBuf2, u32 length) ++{ ++ return !memcmp(pBuf1, pBuf2, length); ++} ++ ++/* ODM MISC relative API. */ ++void ODM_AcquireSpinLock(struct odm_dm_struct *pDM_Odm, enum RT_SPINLOCK_TYPE type) ++{ ++} ++ ++void ODM_ReleaseSpinLock(struct odm_dm_struct *pDM_Odm, enum RT_SPINLOCK_TYPE type) ++{ ++} ++ ++/* Work item relative API. FOr MP driver only~! */ ++void ODM_InitializeWorkItem(struct odm_dm_struct *pDM_Odm, void *pRtWorkItem, ++ RT_WORKITEM_CALL_BACK RtWorkItemCallback, ++ void *pContext, const char *szID) ++{ ++} ++ ++void ODM_StartWorkItem(void *pRtWorkItem) ++{ ++} ++ ++void ODM_StopWorkItem(void *pRtWorkItem) ++{ ++} ++ ++void ODM_FreeWorkItem(void *pRtWorkItem) ++{ ++} ++ ++void ODM_ScheduleWorkItem(void *pRtWorkItem) ++{ ++} ++ ++void ODM_IsWorkItemScheduled(void *pRtWorkItem) ++{ ++} ++ ++/* ODM Timer relative API. */ ++void ODM_StallExecution(u32 usDelay) ++{ ++ udelay(usDelay); ++} ++ ++void ODM_delay_ms(u32 ms) ++{ ++ mdelay(ms); ++} ++ ++void ODM_delay_us(u32 us) ++{ ++ udelay(us); ++} ++ ++void ODM_sleep_ms(u32 ms) ++{ ++ msleep(ms); ++} ++ ++void ODM_sleep_us(u32 us) ++{ ++ rtw_usleep_os(us); ++} ++ ++void ODM_SetTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer, u32 msDelay) ++{ ++ _set_timer(pTimer, msDelay); /* ms */ ++} ++ ++void ODM_CancelTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer) ++{ ++ _cancel_timer_ex(pTimer); ++} ++ ++void ODM_ReleaseTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer) ++{ ++} ++ ++/* ODM FW relative API. */ ++u32 ODM_FillH2CCmd(u8 *pH2CBuffer, u32 H2CBufferLen, u32 CmdNum, ++ u32 *pElementID, u32 *pCmdLen, ++ u8 **pCmbBuffer, u8 *CmdStartSeq) ++{ ++ return true; ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_cmd.c b/drivers/staging/r8188eu/hal/rtl8188e_cmd.c +new file mode 100644 +index 000000000000..7d50d64cf34d +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_cmd.c +@@ -0,0 +1,737 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_CMD_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/mlme_osdep.h" ++#include "../include/rtw_ioctl_set.h" ++ ++#include "../include/rtl8188e_hal.h" ++ ++#define RTL88E_MAX_H2C_BOX_NUMS 4 ++#define RTL88E_MAX_CMD_LEN 7 ++#define RTL88E_MESSAGE_BOX_SIZE 4 ++#define RTL88E_EX_MESSAGE_BOX_SIZE 4 ++ ++static u8 _is_fw_read_cmd_down(struct adapter *adapt, u8 msgbox_num) ++{ ++ u8 read_down = false; ++ int retry_cnts = 100; ++ ++ u8 valid; ++ ++ do { ++ valid = rtw_read8(adapt, REG_HMETFR) & BIT(msgbox_num); ++ if (0 == valid) ++ read_down = true; ++ } while ((!read_down) && (retry_cnts--)); ++ ++ return read_down; ++} ++ ++/***************************************** ++* H2C Msg format : ++* 0x1DF - 0x1D0 ++*| 31 - 8 | 7-5 4 - 0 | ++*| h2c_msg |Class_ID CMD_ID | ++* ++* Extend 0x1FF - 0x1F0 ++*|31 - 0 | ++*|ext_msg| ++******************************************/ ++static s32 FillH2CCmd_88E(struct adapter *adapt, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) ++{ ++ u8 bcmd_down = false; ++ s32 retry_cnts = 100; ++ u8 h2c_box_num; ++ u32 msgbox_addr; ++ u32 msgbox_ex_addr; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ u8 cmd_idx, ext_cmd_len; ++ u32 h2c_cmd = 0; ++ u32 h2c_cmd_ex = 0; ++ s32 ret = _FAIL; ++ ++ if (!adapt->bFWReady) { ++ DBG_88E("FillH2CCmd_88E(): return H2C cmd because fw is not ready\n"); ++ return ret; ++ } ++ ++ if (!pCmdBuffer) ++ goto exit; ++ if (CmdLen > RTL88E_MAX_CMD_LEN) ++ goto exit; ++ if (adapt->bSurpriseRemoved) ++ goto exit; ++ ++ /* pay attention to if race condition happened in H2C cmd setting. */ ++ do { ++ h2c_box_num = haldata->LastHMEBoxNum; ++ ++ if (!_is_fw_read_cmd_down(adapt, h2c_box_num)) { ++ DBG_88E(" fw read cmd failed...\n"); ++ goto exit; ++ } ++ ++ *(u8 *)(&h2c_cmd) = ElementID; ++ ++ if (CmdLen <= 3) { ++ memcpy((u8 *)(&h2c_cmd) + 1, pCmdBuffer, CmdLen); ++ } else { ++ memcpy((u8 *)(&h2c_cmd) + 1, pCmdBuffer, 3); ++ ext_cmd_len = CmdLen - 3; ++ memcpy((u8 *)(&h2c_cmd_ex), pCmdBuffer + 3, ext_cmd_len); ++ ++ /* Write Ext command */ ++ msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num * RTL88E_EX_MESSAGE_BOX_SIZE); ++ for (cmd_idx = 0; cmd_idx < ext_cmd_len; cmd_idx++) { ++ rtw_write8(adapt, msgbox_ex_addr + cmd_idx, *((u8 *)(&h2c_cmd_ex) + cmd_idx)); ++ } ++ } ++ /* Write command */ ++ msgbox_addr = REG_HMEBOX_0 + (h2c_box_num * RTL88E_MESSAGE_BOX_SIZE); ++ for (cmd_idx = 0; cmd_idx < RTL88E_MESSAGE_BOX_SIZE; cmd_idx++) { ++ rtw_write8(adapt, msgbox_addr + cmd_idx, *((u8 *)(&h2c_cmd) + cmd_idx)); ++ } ++ bcmd_down = true; ++ ++ haldata->LastHMEBoxNum = (h2c_box_num + 1) % RTL88E_MAX_H2C_BOX_NUMS; ++ ++ } while ((!bcmd_down) && (retry_cnts--)); ++ ++ ret = _SUCCESS; ++ ++exit: ++ ++ return ret; ++} ++ ++u8 rtl8188e_set_rssi_cmd(struct adapter *adapt, u8 *param) ++{ ++ u8 res = _SUCCESS; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ if (haldata->fw_ractrl) { ++ ; ++ } else { ++ DBG_88E("==>%s fw dont support RA\n", __func__); ++ res = _FAIL; ++ } ++ ++ return res; ++} ++ ++u8 rtl8188e_set_raid_cmd(struct adapter *adapt, u32 mask) ++{ ++ u8 buf[3]; ++ u8 res = _SUCCESS; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ if (haldata->fw_ractrl) { ++ __le32 lmask; ++ ++ memset(buf, 0, 3); ++ lmask = cpu_to_le32(mask); ++ memcpy(buf, &lmask, 3); ++ ++ FillH2CCmd_88E(adapt, H2C_DM_MACID_CFG, 3, buf); ++ } else { ++ DBG_88E("==>%s fw dont support RA\n", __func__); ++ res = _FAIL; ++ } ++ ++ return res; ++} ++ ++/* bitmap[0:27] = tx_rate_bitmap */ ++/* bitmap[28:31]= Rate Adaptive id */ ++/* arg[0:4] = macid */ ++/* arg[5] = Short GI */ ++void rtl8188e_Add_RateATid(struct adapter *pAdapter, u32 bitmap, u8 arg, u8 rssi_level) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(pAdapter); ++ ++ u8 macid, raid, short_gi_rate = false; ++ ++ macid = arg & 0x1f; ++ ++ raid = (bitmap >> 28) & 0x0f; ++ bitmap &= 0x0fffffff; ++ ++ if (rssi_level != DM_RATR_STA_INIT) ++ bitmap = ODM_Get_Rate_Bitmap(&haldata->odmpriv, macid, bitmap, rssi_level); ++ ++ bitmap |= ((raid << 28) & 0xf0000000); ++ ++ short_gi_rate = (arg & BIT(5)) ? true : false; ++ ++ raid = (bitmap >> 28) & 0x0f; ++ ++ bitmap &= 0x0fffffff; ++ ++ ODM_RA_UpdateRateInfo_8188E(&haldata->odmpriv, macid, raid, bitmap, short_gi_rate); ++} ++ ++void rtl8188e_set_FwPwrMode_cmd(struct adapter *adapt, u8 Mode) ++{ ++ struct setpwrmode_parm H2CSetPwrMode; ++ struct pwrctrl_priv *pwrpriv = &adapt->pwrctrlpriv; ++ u8 RLBM = 0; /* 0:Min, 1:Max, 2:User define */ ++ ++ DBG_88E("%s: Mode=%d SmartPS=%d UAPSD=%d\n", __func__, ++ Mode, pwrpriv->smart_ps, adapt->registrypriv.uapsd_enable); ++ ++ switch (Mode) { ++ case PS_MODE_ACTIVE: ++ H2CSetPwrMode.Mode = 0; ++ break; ++ case PS_MODE_MIN: ++ H2CSetPwrMode.Mode = 1; ++ break; ++ case PS_MODE_MAX: ++ RLBM = 1; ++ H2CSetPwrMode.Mode = 1; ++ break; ++ case PS_MODE_DTIM: ++ RLBM = 2; ++ H2CSetPwrMode.Mode = 1; ++ break; ++ case PS_MODE_UAPSD_WMM: ++ H2CSetPwrMode.Mode = 2; ++ break; ++ default: ++ H2CSetPwrMode.Mode = 0; ++ break; ++ } ++ ++ H2CSetPwrMode.SmartPS_RLBM = (((pwrpriv->smart_ps << 4) & 0xf0) | (RLBM & 0x0f)); ++ ++ H2CSetPwrMode.AwakeInterval = 1; ++ ++ H2CSetPwrMode.bAllQueueUAPSD = adapt->registrypriv.uapsd_enable; ++ ++ if (Mode > 0) ++ H2CSetPwrMode.PwrState = 0x00;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */ ++ else ++ H2CSetPwrMode.PwrState = 0x0C;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */ ++ ++ FillH2CCmd_88E(adapt, H2C_PS_PWR_MODE, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); ++ ++} ++ ++void rtl8188e_set_FwMediaStatus_cmd(struct adapter *adapt, __le16 mstatus_rpt) ++{ ++ u8 opmode, macid; ++ u16 mst_rpt = le16_to_cpu(mstatus_rpt); ++ opmode = (u8)mst_rpt; ++ macid = (u8)(mst_rpt >> 8); ++ ++ DBG_88E("### %s: MStatus=%x MACID=%d\n", __func__, opmode, macid); ++ FillH2CCmd_88E(adapt, H2C_COM_MEDIA_STATUS_RPT, sizeof(mst_rpt), (u8 *)&mst_rpt); ++} ++ ++static void ConstructBeacon(struct adapter *adapt, u8 *pframe, u32 *pLength) ++{ ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ u32 rate_len, pktlen; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ ++ memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&adapt->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); ++ SetFrameSubType(pframe, WIFI_BEACON); ++ ++ pframe += sizeof(struct rtw_ieee80211_hdr_3addr); ++ pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ ++ /* timestamp will be inserted by hardware */ ++ pframe += 8; ++ pktlen += 8; ++ ++ /* beacon interval: 2 bytes */ ++ memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pktlen += 2; ++ ++ /* capability info: 2 bytes */ ++ memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); ++ ++ pframe += 2; ++ pktlen += 2; ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ pktlen += cur_network->IELength - sizeof(struct ndis_802_11_fixed_ie); ++ memcpy(pframe, cur_network->IEs + sizeof(struct ndis_802_11_fixed_ie), pktlen); ++ ++ goto _ConstructBeacon; ++ } ++ ++ /* below for ad-hoc mode */ ++ ++ /* SSID */ ++ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); ++ ++ /* supported rates... */ ++ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); ++ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &pktlen); ++ ++ /* DS parameter set */ ++ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&cur_network->Configuration.DSConfig, &pktlen); ++ ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { ++ u32 ATIMWindow; ++ /* IBSS Parameter Set... */ ++ ATIMWindow = 0; ++ pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); ++ } ++ ++ /* todo: ERP IE */ ++ ++ /* EXTERNDED SUPPORTED RATE */ ++ if (rate_len > 8) ++ pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); ++ ++ /* todo:HT for adhoc */ ++ ++_ConstructBeacon: ++ ++ if ((pktlen + TXDESC_SIZE) > 512) { ++ DBG_88E("beacon frame too large\n"); ++ return; ++ } ++ ++ *pLength = pktlen; ++} ++ ++static void ConstructPSPoll(struct adapter *adapt, u8 *pframe, u32 *pLength) ++{ ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ __le16 *fctrl; ++ ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ /* Frame control. */ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ SetPwrMgt(fctrl); ++ SetFrameSubType(pframe, WIFI_PSPOLL); ++ ++ /* AID. */ ++ SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); ++ ++ /* BSSID. */ ++ memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ ++ /* TA. */ ++ memcpy(pwlanhdr->addr2, myid(&adapt->eeprompriv), ETH_ALEN); ++ ++ *pLength = 16; ++} ++ ++static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe, ++ u32 *pLength, ++ u8 *StaAddr, ++ u8 bQoS, ++ u8 AC, ++ u8 bEosp, ++ u8 bForcePowerSave) ++{ ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ u32 pktlen; ++ struct mlme_priv *pmlmepriv = &adapt->mlmepriv; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ if (bForcePowerSave) ++ SetPwrMgt(fctrl); ++ ++ switch (cur_network->network.InfrastructureMode) { ++ case Ndis802_11Infrastructure: ++ SetToDs(fctrl); ++ memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&adapt->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); ++ break; ++ case Ndis802_11APMode: ++ SetFrDs(fctrl); ++ memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, myid(&adapt->eeprompriv), ETH_ALEN); ++ break; ++ case Ndis802_11IBSS: ++ default: ++ memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, myid(&adapt->eeprompriv), ETH_ALEN); ++ memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); ++ break; ++ } ++ ++ SetSeqNum(pwlanhdr, 0); ++ ++ if (bQoS) { ++ struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; ++ ++ SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); ++ ++ pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos *)pframe; ++ SetPriority(&pwlanqoshdr->qc, AC); ++ SetEOSP(&pwlanqoshdr->qc, bEosp); ++ ++ pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); ++ } else { ++ SetFrameSubType(pframe, WIFI_DATA_NULL); ++ ++ pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ } ++ ++ *pLength = pktlen; ++} ++ ++static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u8 *StaAddr, bool bHideSSID) ++{ ++ struct rtw_ieee80211_hdr *pwlanhdr; ++ __le16 *fctrl; ++ u8 *mac, *bssid; ++ u32 pktlen; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ ++ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; ++ ++ mac = myid(&adapt->eeprompriv); ++ bssid = cur_network->MacAddress; ++ ++ fctrl = &pwlanhdr->frame_ctl; ++ *(fctrl) = 0; ++ memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); ++ memcpy(pwlanhdr->addr2, mac, ETH_ALEN); ++ memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); ++ ++ SetSeqNum(pwlanhdr, 0); ++ SetFrameSubType(fctrl, WIFI_PROBERSP); ++ ++ pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); ++ pframe += pktlen; ++ ++ if (cur_network->IELength > MAX_IE_SZ) ++ return; ++ ++ memcpy(pframe, cur_network->IEs, cur_network->IELength); ++ pframe += cur_network->IELength; ++ pktlen += cur_network->IELength; ++ ++ *pLength = pktlen; ++} ++ ++/* To check if reserved page content is destroyed by beacon because beacon is too large. */ ++/* 2010.06.23. Added by tynli. */ ++void CheckFwRsvdPageContent(struct adapter *Adapter) ++{ ++} ++ ++/* */ ++/* Description: Fill the reserved packets that FW will use to RSVD page. */ ++/* Now we just send 4 types packet to rsvd page. */ ++/* (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. */ ++/* Input: */ ++/* bDLFinished - false: At the first time we will send all the packets as a large packet to Hw, */ ++/* so we need to set the packet length to total length. */ ++/* true: At the second time, we should send the first packet (default:beacon) */ ++/* to Hw again and set the length in descriptor to the real beacon length. */ ++/* 2009.10.15 by tynli. */ ++static void SetFwRsvdPagePkt(struct adapter *adapt, bool bDLFinished) ++{ ++ struct hal_data_8188e *haldata; ++ struct xmit_frame *pmgntframe; ++ struct pkt_attrib *pattrib; ++ struct xmit_priv *pxmitpriv; ++ struct mlme_ext_priv *pmlmeext; ++ struct mlme_ext_info *pmlmeinfo; ++ u32 BeaconLength = 0, ProbeRspLength = 0, PSPollLength; ++ u32 NullDataLength, QosNullLength; ++ u8 *ReservedPagePacket; ++ u8 PageNum, PageNeed, TxDescLen; ++ u16 BufIndex; ++ u32 TotalPacketLen; ++ struct rsvdpage_loc RsvdPageLoc; ++ ++ DBG_88E("%s\n", __func__); ++ ReservedPagePacket = kzalloc(1000, GFP_KERNEL); ++ if (!ReservedPagePacket) { ++ DBG_88E("%s: alloc ReservedPagePacket fail!\n", __func__); ++ return; ++ } ++ ++ haldata = GET_HAL_DATA(adapt); ++ pxmitpriv = &adapt->xmitpriv; ++ pmlmeext = &adapt->mlmeextpriv; ++ pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ TxDescLen = TXDESC_SIZE; ++ PageNum = 0; ++ ++ /* 3 (1) beacon * 2 pages */ ++ BufIndex = TXDESC_OFFSET; ++ ConstructBeacon(adapt, &ReservedPagePacket[BufIndex], &BeaconLength); ++ ++ /* When we count the first page size, we need to reserve description size for the RSVD */ ++ /* packet, it will be filled in front of the packet in TXPKTBUF. */ ++ PageNeed = (u8)PageNum_128(TxDescLen + BeaconLength); ++ /* To reserved 2 pages for beacon buffer. 2010.06.24. */ ++ if (PageNeed == 1) ++ PageNeed += 1; ++ PageNum += PageNeed; ++ haldata->FwRsvdPageStartOffset = PageNum; ++ ++ BufIndex += PageNeed * 128; ++ ++ /* 3 (2) ps-poll *1 page */ ++ RsvdPageLoc.LocPsPoll = PageNum; ++ ConstructPSPoll(adapt, &ReservedPagePacket[BufIndex], &PSPollLength); ++ rtl8188e_fill_fake_txdesc(adapt, &ReservedPagePacket[BufIndex - TxDescLen], PSPollLength, true, false); ++ ++ PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength); ++ PageNum += PageNeed; ++ ++ BufIndex += PageNeed * 128; ++ ++ /* 3 (3) null data * 1 page */ ++ RsvdPageLoc.LocNullData = PageNum; ++ ConstructNullFunctionData(adapt, &ReservedPagePacket[BufIndex], &NullDataLength, get_my_bssid(&pmlmeinfo->network), false, 0, 0, false); ++ rtl8188e_fill_fake_txdesc(adapt, &ReservedPagePacket[BufIndex - TxDescLen], NullDataLength, false, false); ++ ++ PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength); ++ PageNum += PageNeed; ++ ++ BufIndex += PageNeed * 128; ++ ++ /* 3 (4) probe response * 1page */ ++ RsvdPageLoc.LocProbeRsp = PageNum; ++ ConstructProbeRsp(adapt, &ReservedPagePacket[BufIndex], &ProbeRspLength, get_my_bssid(&pmlmeinfo->network), false); ++ rtl8188e_fill_fake_txdesc(adapt, &ReservedPagePacket[BufIndex - TxDescLen], ProbeRspLength, false, false); ++ ++ PageNeed = (u8)PageNum_128(TxDescLen + ProbeRspLength); ++ PageNum += PageNeed; ++ ++ BufIndex += PageNeed * 128; ++ ++ /* 3 (5) Qos null data */ ++ RsvdPageLoc.LocQosNull = PageNum; ++ ConstructNullFunctionData(adapt, &ReservedPagePacket[BufIndex], ++ &QosNullLength, get_my_bssid(&pmlmeinfo->network), true, 0, 0, false); ++ rtl8188e_fill_fake_txdesc(adapt, &ReservedPagePacket[BufIndex - TxDescLen], QosNullLength, false, false); ++ ++ PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength); ++ PageNum += PageNeed; ++ ++ TotalPacketLen = BufIndex + QosNullLength; ++ pmgntframe = alloc_mgtxmitframe(pxmitpriv); ++ if (!pmgntframe) ++ goto exit; ++ ++ /* update attribute */ ++ pattrib = &pmgntframe->attrib; ++ update_mgntframe_attrib(adapt, pattrib); ++ pattrib->qsel = 0x10; ++ pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET; ++ pattrib->pktlen = pattrib->last_txcmdsz; ++ memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); ++ ++ rtw_hal_mgnt_xmit(adapt, pmgntframe); ++ ++ DBG_88E("%s: Set RSVD page location to Fw\n", __func__); ++ FillH2CCmd_88E(adapt, H2C_COM_RSVD_PAGE, sizeof(RsvdPageLoc), (u8 *)&RsvdPageLoc); ++ ++exit: ++ kfree(ReservedPagePacket); ++} ++ ++void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ bool bSendBeacon = false; ++ bool bcn_valid = false; ++ u8 DLBcnCount = 0; ++ u32 poll = 0; ++ ++ DBG_88E("%s mstatus(%x)\n", __func__, mstatus); ++ ++ if (mstatus == 1) { ++ /* We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. */ ++ /* Suggested by filen. Added by tynli. */ ++ rtw_write16(adapt, REG_BCN_PSR_RPT, (0xC000 | pmlmeinfo->aid)); ++ /* Do not set TSF again here or vWiFi beacon DMA INT will not work. */ ++ ++ /* Set REG_CR bit 8. DMA beacon by SW. */ ++ haldata->RegCR_1 |= BIT(0); ++ rtw_write8(adapt, REG_CR + 1, haldata->RegCR_1); ++ ++ /* Disable Hw protection for a time which revserd for Hw sending beacon. */ ++ /* Fix download reserved page packet fail that access collision with the protection time. */ ++ /* 2010.05.11. Added by tynli. */ ++ rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(3))); ++ rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(4)); ++ ++ if (haldata->RegFwHwTxQCtrl & BIT(6)) { ++ DBG_88E("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); ++ bSendBeacon = true; ++ } ++ ++ /* Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. */ ++ rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl & (~BIT(6)))); ++ haldata->RegFwHwTxQCtrl &= (~BIT(6)); ++ ++ /* Clear beacon valid check bit. */ ++ rtw_hal_set_hwreg(adapt, HW_VAR_BCN_VALID, NULL); ++ DLBcnCount = 0; ++ poll = 0; ++ do { ++ /* download rsvd page. */ ++ SetFwRsvdPagePkt(adapt, false); ++ DLBcnCount++; ++ do { ++ yield(); ++ /* mdelay(10); */ ++ /* check rsvd page download OK. */ ++ rtw_hal_get_hwreg(adapt, HW_VAR_BCN_VALID, (u8 *)(&bcn_valid)); ++ poll++; ++ } while (!bcn_valid && (poll % 10) != 0 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped); ++ } while (!bcn_valid && DLBcnCount <= 100 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped); ++ ++ if (adapt->bSurpriseRemoved || adapt->bDriverStopped) ++ ; ++ else if (!bcn_valid) ++ DBG_88E("%s: 1 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __func__, DLBcnCount, poll); ++ else ++ DBG_88E("%s: 1 Download RSVD success! DLBcnCount:%u, poll:%u\n", __func__, DLBcnCount, poll); ++ /* */ ++ /* We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) */ ++ /* because we need to free the Tx BCN Desc which is used by the first reserved page packet. */ ++ /* At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return */ ++ /* the beacon TCB in the following code. 2011.11.23. by tynli. */ ++ /* */ ++ ++ /* Enable Bcn */ ++ rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(3)); ++ rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(4))); ++ ++ /* To make sure that if there exists an adapter which would like to send beacon. */ ++ /* If exists, the origianl value of 0x422[6] will be 1, we should check this to */ ++ /* prevent from setting 0x422[6] to 0 after download reserved page, or it will cause */ ++ /* the beacon cannot be sent by HW. */ ++ /* 2010.06.23. Added by tynli. */ ++ if (bSendBeacon) { ++ rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl | BIT(6))); ++ haldata->RegFwHwTxQCtrl |= BIT(6); ++ } ++ ++ /* Update RSVD page location H2C to Fw. */ ++ if (bcn_valid) { ++ rtw_hal_set_hwreg(adapt, HW_VAR_BCN_VALID, NULL); ++ DBG_88E("Set RSVD page location to Fw.\n"); ++ } ++ ++ /* Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. */ ++ /* Clear CR[8] or beacon packet will not be send to TxBuf anymore. */ ++ haldata->RegCR_1 &= (~BIT(0)); ++ rtw_write8(adapt, REG_CR + 1, haldata->RegCR_1); ++ } ++ ++} ++ ++void rtl8188e_set_p2p_ps_offload_cmd(struct adapter *adapt, u8 p2p_ps_state) ++{ ++#ifdef CONFIG_88EU_P2P ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct wifidirect_info *pwdinfo = &adapt->wdinfo; ++ struct P2P_PS_Offload_t *p2p_ps_offload = &haldata->p2p_ps_offload; ++ u8 i; ++ ++ switch (p2p_ps_state) { ++ case P2P_PS_DISABLE: ++ DBG_88E("P2P_PS_DISABLE\n"); ++ memset(p2p_ps_offload, 0, 1); ++ break; ++ case P2P_PS_ENABLE: ++ DBG_88E("P2P_PS_ENABLE\n"); ++ /* update CTWindow value. */ ++ if (pwdinfo->ctwindow > 0) { ++ p2p_ps_offload->CTWindow_En = 1; ++ rtw_write8(adapt, REG_P2P_CTWIN, pwdinfo->ctwindow); ++ } ++ ++ /* hw only support 2 set of NoA */ ++ for (i = 0; i < pwdinfo->noa_num; i++) { ++ /* To control the register setting for which NOA */ ++ rtw_write8(adapt, REG_NOA_DESC_SEL, (i << 4)); ++ if (i == 0) ++ p2p_ps_offload->NoA0_En = 1; ++ else ++ p2p_ps_offload->NoA1_En = 1; ++ ++ /* config P2P NoA Descriptor Register */ ++ rtw_write32(adapt, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); ++ rtw_write32(adapt, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); ++ rtw_write32(adapt, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); ++ rtw_write8(adapt, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); ++ } ++ ++ if ((pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0)) { ++ /* rst p2p circuit */ ++ rtw_write8(adapt, REG_DUAL_TSF_RST, BIT(4)); ++ ++ p2p_ps_offload->Offload_En = 1; ++ ++ if (pwdinfo->role == P2P_ROLE_GO) { ++ p2p_ps_offload->role = 1; ++ p2p_ps_offload->AllStaSleep = 0; ++ } else { ++ p2p_ps_offload->role = 0; ++ } ++ ++ p2p_ps_offload->discovery = 0; ++ } ++ break; ++ case P2P_PS_SCAN: ++ DBG_88E("P2P_PS_SCAN\n"); ++ p2p_ps_offload->discovery = 1; ++ break; ++ case P2P_PS_SCAN_DONE: ++ DBG_88E("P2P_PS_SCAN_DONE\n"); ++ p2p_ps_offload->discovery = 0; ++ pwdinfo->p2p_ps_state = P2P_PS_ENABLE; ++ break; ++ default: ++ break; ++ } ++ ++ FillH2CCmd_88E(adapt, H2C_PS_P2P_OFFLOAD, 1, (u8 *)p2p_ps_offload); ++#endif ++ ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_dm.c b/drivers/staging/r8188eu/hal/rtl8188e_dm.c +new file mode 100644 +index 000000000000..78552303c990 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_dm.c +@@ -0,0 +1,238 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/* This file is for 92CE/92CU dynamic mechanism only */ ++#define _RTL8188E_DM_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtl8188e_hal.h" ++ ++static void dm_CheckStatistics(struct adapter *Adapter) ++{ ++} ++ ++/* Initialize GPIO setting registers */ ++static void dm_InitGPIOSetting(struct adapter *Adapter) ++{ ++ u8 tmp1byte; ++ ++ tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); ++ tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); ++ ++ rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); ++} ++ ++/* */ ++/* functions */ ++/* */ ++static void Init_ODM_ComInfo_88E(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &hal_data->dmpriv; ++ struct odm_dm_struct *dm_odm = &hal_data->odmpriv; ++ u8 cut_ver, fab_ver; ++ ++ /* Init Value */ ++ memset(dm_odm, 0, sizeof(*dm_odm)); ++ ++ dm_odm->Adapter = Adapter; ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_PLATFORM, ODM_CE); ++ ++ if (Adapter->interface_type == RTW_GSPI) ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO); ++ else ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_INTERFACE, Adapter->interface_type);/* RTL871X_HCI_TYPE */ ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8188E); ++ ++ fab_ver = ODM_TSMC; ++ cut_ver = ODM_CUT_A; ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_FAB_VER, fab_ver); ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_CUT_VER, cut_ver); ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(hal_data->VersionID)); ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_PATCH_ID, hal_data->CustomerID); ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec); ++ ++ if (hal_data->rf_type == RF_1T1R) ++ ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R); ++ else if (hal_data->rf_type == RF_2T2R) ++ ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R); ++ else if (hal_data->rf_type == RF_1T2R) ++ ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R); ++ ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_RF_ANTENNA_TYPE, hal_data->TRxAntDivType); ++ ++ pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | ++ ODM_RF_TX_PWR_TRACK; ++ ++ ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag); ++} ++ ++static void Update_ODM_ComInfo_88E(struct adapter *Adapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ struct odm_dm_struct *dm_odm = &hal_data->odmpriv; ++ struct dm_priv *pdmpriv = &hal_data->dmpriv; ++ int i; ++ ++ pdmpriv->InitODMFlag = ODM_BB_DIG | ++ ODM_BB_RA_MASK | ++ ODM_BB_DYNAMIC_TXPWR | ++ ODM_BB_FA_CNT | ++ ODM_BB_RSSI_MONITOR | ++ ODM_BB_CCK_PD | ++ ODM_BB_PWR_SAVE | ++ ODM_MAC_EDCA_TURBO | ++ ODM_RF_CALIBRATION | ++ ODM_RF_TX_PWR_TRACK; ++ if (hal_data->AntDivCfg) ++ pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; ++ ++ if (Adapter->registrypriv.mp_mode == 1) { ++ pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | ++ ODM_RF_TX_PWR_TRACK; ++ } ++ ++ ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag); ++ ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_TX_UNI, &Adapter->xmitpriv.tx_bytes); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_RX_UNI, &Adapter->recvpriv.rx_bytes); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_WM_MODE, &pmlmeext->cur_wireless_mode); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &hal_data->nCur40MhzPrimeSC); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SEC_MODE, &Adapter->securitypriv.dot11PrivacyAlgrthm); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_BW, &hal_data->CurrentChannelBW); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_CHNL, &hal_data->CurrentChannel); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_NET_CLOSED, &Adapter->net_closed); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_MP_MODE, &Adapter->registrypriv.mp_mode); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SCAN, &pmlmepriv->bScanInProcess); ++ ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_POWER_SAVING, &pwrctrlpriv->bpower_saving); ++ ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_RF_ANTENNA_TYPE, hal_data->TRxAntDivType); ++ ++ for (i = 0; i < NUM_STA; i++) ++ ODM_CmnInfoPtrArrayHook(dm_odm, ODM_CMNINFO_STA_STATUS, i, NULL); ++} ++ ++void rtl8188e_InitHalDm(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &hal_data->dmpriv; ++ struct odm_dm_struct *dm_odm = &hal_data->odmpriv; ++ ++ dm_InitGPIOSetting(Adapter); ++ pdmpriv->DM_Type = DM_Type_ByDriver; ++ pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; ++ Update_ODM_ComInfo_88E(Adapter); ++ ODM_DMInit(dm_odm); ++ Adapter->fix_rate = 0xFF; ++} ++ ++void rtl8188e_HalDmWatchDog(struct adapter *Adapter) ++{ ++ bool fw_cur_in_ps = false; ++ bool fw_ps_awake = true; ++ u8 hw_init_completed = false; ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ ++ ++ hw_init_completed = Adapter->hw_init_completed; ++ ++ if (!hw_init_completed) ++ return; ++ ++ fw_cur_in_ps = Adapter->pwrctrlpriv.bFwCurrentInPSMode; ++ rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&fw_ps_awake)); ++ ++ /* Fw is under p2p powersaving mode, driver should stop dynamic mechanism. */ ++ /* modifed by thomas. 2011.06.11. */ ++ if (Adapter->wdinfo.p2p_ps_mode) ++ fw_ps_awake = false; ++ ++ if (hw_init_completed && ((!fw_cur_in_ps) && fw_ps_awake)) { ++ /* Calculate Tx/Rx statistics. */ ++ dm_CheckStatistics(Adapter); ++ ++ ++ } ++ ++ /* ODM */ ++ if (hw_init_completed) { ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ u8 bLinked = false; ++ ++ if ((check_fwstate(pmlmepriv, WIFI_AP_STATE)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE))) { ++ if (Adapter->stapriv.asoc_sta_count > 2) ++ bLinked = true; ++ } else {/* Station mode */ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ bLinked = true; ++ } ++ ++ ODM_CmnInfoUpdate(&hal_data->odmpriv, ODM_CMNINFO_LINK, bLinked); ++ ODM_DMWatchdog(&hal_data->odmpriv); ++ } ++} ++ ++void rtl8188e_init_dm_priv(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &hal_data->dmpriv; ++ ++ memset(pdmpriv, 0, sizeof(struct dm_priv)); ++ Init_ODM_ComInfo_88E(Adapter); ++} ++ ++void rtl8188e_deinit_dm_priv(struct adapter *Adapter) ++{ ++} ++ ++/* Add new function to reset the state of antenna diversity before link. */ ++/* Compare RSSI for deciding antenna */ ++void AntDivCompare8188E(struct adapter *Adapter, struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src) ++{ ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ ++ if (0 != hal_data->AntDivCfg) { ++ /* select optimum_antenna for before linked =>For antenna diversity */ ++ if (dst->Rssi >= src->Rssi) {/* keep org parameter */ ++ src->Rssi = dst->Rssi; ++ src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; ++ } ++ } ++} ++ ++/* Add new function to reset the state of antenna diversity before link. */ ++u8 AntDivBeforeLink8188E(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter); ++ struct odm_dm_struct *dm_odm = &hal_data->odmpriv; ++ struct sw_ant_switch *dm_swat_tbl = &dm_odm->DM_SWAT_Table; ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ ++ /* Condition that does not need to use antenna diversity. */ ++ if (hal_data->AntDivCfg == 0) ++ return false; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ return false; ++ ++ if (dm_swat_tbl->SWAS_NoLink_State == 0) { ++ /* switch channel */ ++ dm_swat_tbl->SWAS_NoLink_State = 1; ++ dm_swat_tbl->CurAntenna = (dm_swat_tbl->CurAntenna == Antenna_A) ? Antenna_B : Antenna_A; ++ ++ rtw_antenna_select_cmd(Adapter, dm_swat_tbl->CurAntenna, false); ++ return true; ++ } else { ++ dm_swat_tbl->SWAS_NoLink_State = 0; ++ return false; ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +new file mode 100644 +index 000000000000..14758361960c +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +@@ -0,0 +1,2304 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _HAL_INIT_C_ ++ ++#include "../include/linux/firmware.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_efuse.h" ++#include "../include/rtl8188e_hal.h" ++#include "../include/rtw_iol.h" ++#include "../include/usb_ops.h" ++ ++static void iol_mode_enable(struct adapter *padapter, u8 enable) ++{ ++ u8 reg_0xf0 = 0; ++ ++ if (enable) { ++ /* Enable initial offload */ ++ reg_0xf0 = rtw_read8(padapter, REG_SYS_CFG); ++ rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 | SW_OFFLOAD_EN); ++ ++ if (!padapter->bFWReady) { ++ DBG_88E("bFWReady == false call reset 8051...\n"); ++ _8051Reset88E(padapter); ++ } ++ ++ } else { ++ /* disable initial offload */ ++ reg_0xf0 = rtw_read8(padapter, REG_SYS_CFG); ++ rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 & ~SW_OFFLOAD_EN); ++ } ++} ++ ++static s32 iol_execute(struct adapter *padapter, u8 control) ++{ ++ s32 status = _FAIL; ++ u8 reg_0x88 = 0; ++ u32 start = 0, passing_time = 0; ++ ++ control = control & 0x0f; ++ reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); ++ rtw_write8(padapter, REG_HMEBOX_E0, reg_0x88 | control); ++ ++ start = jiffies; ++ while ((reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0)) & control && ++ (passing_time = rtw_get_passing_time_ms(start)) < 1000) { ++ ; ++ } ++ ++ reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); ++ status = (reg_0x88 & control) ? _FAIL : _SUCCESS; ++ if (reg_0x88 & control << 4) ++ status = _FAIL; ++ return status; ++} ++ ++static s32 iol_InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy) ++{ ++ s32 rst = _SUCCESS; ++ iol_mode_enable(padapter, 1); ++ rtw_write8(padapter, REG_TDECTRL + 1, txpktbuf_bndy); ++ rst = iol_execute(padapter, CMD_INIT_LLT); ++ iol_mode_enable(padapter, 0); ++ return rst; ++} ++ ++static void ++efuse_phymap_to_logical(u8 *phymap, u16 _offset, u16 _size_byte, u8 *pbuf) ++{ ++ u8 *efuseTbl = NULL; ++ u8 rtemp8; ++ u16 eFuse_Addr = 0; ++ u8 offset, wren; ++ u16 i, j; ++ u16 **eFuseWord = NULL; ++ u16 efuse_utilized = 0; ++ u8 u1temp = 0; ++ ++ efuseTbl = kzalloc(EFUSE_MAP_LEN_88E, GFP_KERNEL); ++ if (!efuseTbl) { ++ DBG_88E("%s: alloc efuseTbl fail!\n", __func__); ++ goto exit; ++ } ++ ++ eFuseWord = rtw_malloc2d(EFUSE_MAX_SECTION_88E, EFUSE_MAX_WORD_UNIT, sizeof(u16)); ++ if (!eFuseWord) { ++ DBG_88E("%s: alloc eFuseWord fail!\n", __func__); ++ goto exit; ++ } ++ ++ /* 0. Refresh efuse init map as all oxFF. */ ++ for (i = 0; i < EFUSE_MAX_SECTION_88E; i++) ++ for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) ++ eFuseWord[i][j] = 0xFFFF; ++ ++ /* */ ++ /* 1. Read the first byte to check if efuse is empty!!! */ ++ /* */ ++ /* */ ++ rtemp8 = *(phymap + eFuse_Addr); ++ if (rtemp8 != 0xFF) { ++ efuse_utilized++; ++ eFuse_Addr++; ++ } else { ++ DBG_88E("EFUSE is empty efuse_Addr-%d efuse_data =%x\n", eFuse_Addr, rtemp8); ++ goto exit; ++ } ++ ++ /* */ ++ /* 2. Read real efuse content. Filter PG header and every section data. */ ++ /* */ ++ while ((rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) { ++ /* Check PG header for section num. */ ++ if ((rtemp8 & 0x1F) == 0x0F) { /* extended header */ ++ u1temp = ((rtemp8 & 0xE0) >> 5); ++ rtemp8 = *(phymap + eFuse_Addr); ++ if ((rtemp8 & 0x0F) == 0x0F) { ++ eFuse_Addr++; ++ rtemp8 = *(phymap + eFuse_Addr); ++ ++ if (rtemp8 != 0xFF && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) ++ eFuse_Addr++; ++ continue; ++ } else { ++ offset = ((rtemp8 & 0xF0) >> 1) | u1temp; ++ wren = (rtemp8 & 0x0F); ++ eFuse_Addr++; ++ } ++ } else { ++ offset = ((rtemp8 >> 4) & 0x0f); ++ wren = (rtemp8 & 0x0f); ++ } ++ ++ if (offset < EFUSE_MAX_SECTION_88E) { ++ /* Get word enable value from PG header */ ++ for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { ++ /* Check word enable condition in the section */ ++ if (!(wren & 0x01)) { ++ rtemp8 = *(phymap + eFuse_Addr); ++ eFuse_Addr++; ++ efuse_utilized++; ++ eFuseWord[offset][i] = (rtemp8 & 0xff); ++ if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) ++ break; ++ rtemp8 = *(phymap + eFuse_Addr); ++ eFuse_Addr++; ++ efuse_utilized++; ++ eFuseWord[offset][i] |= (((u16)rtemp8 << 8) & 0xff00); ++ ++ if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) ++ break; ++ } ++ wren >>= 1; ++ } ++ } ++ /* Read next PG header */ ++ rtemp8 = *(phymap + eFuse_Addr); ++ ++ if (rtemp8 != 0xFF && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) { ++ efuse_utilized++; ++ eFuse_Addr++; ++ } ++ } ++ ++ /* */ ++ /* 3. Collect 16 sections and 4 word unit into Efuse map. */ ++ /* */ ++ for (i = 0; i < EFUSE_MAX_SECTION_88E; i++) { ++ for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) { ++ efuseTbl[(i * 8) + (j * 2)] = (eFuseWord[i][j] & 0xff); ++ efuseTbl[(i * 8) + ((j * 2) + 1)] = ((eFuseWord[i][j] >> 8) & 0xff); ++ } ++ } ++ ++ /* */ ++ /* 4. Copy from Efuse map to output pointer memory!!! */ ++ /* */ ++ for (i = 0; i < _size_byte; i++) ++ pbuf[i] = efuseTbl[_offset + i]; ++ ++ /* */ ++ /* 5. Calculate Efuse utilization. */ ++ /* */ ++ ++exit: ++ kfree(efuseTbl); ++ kfree(eFuseWord); ++} ++ ++static void efuse_read_phymap_from_txpktbuf( ++ struct adapter *adapter, ++ int bcnhead, /* beacon head, where FW store len(2-byte) and efuse physical map. */ ++ u8 *content, /* buffer to store efuse physical map */ ++ u16 *size /* for efuse content: the max byte to read. will update to byte read */ ++ ) ++{ ++ u16 dbg_addr = 0; ++ u32 start = 0, passing_time = 0; ++ u8 reg_0x143 = 0; ++ __le32 lo32 = 0, hi32 = 0; ++ u16 len = 0, count = 0; ++ int i = 0; ++ u16 limit = *size; ++ ++ u8 *pos = content; ++ ++ if (bcnhead < 0) /* if not valid */ ++ bcnhead = rtw_read8(adapter, REG_TDECTRL + 1); ++ ++ DBG_88E("%s bcnhead:%d\n", __func__, bcnhead); ++ ++ rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); ++ ++ dbg_addr = bcnhead * 128 / 8; /* 8-bytes addressing */ ++ ++ while (1) { ++ rtw_write16(adapter, REG_PKTBUF_DBG_ADDR, dbg_addr + i); ++ ++ rtw_write8(adapter, REG_TXPKTBUF_DBG, 0); ++ start = jiffies; ++ while (!(reg_0x143 = rtw_read8(adapter, REG_TXPKTBUF_DBG)) && ++ (passing_time = rtw_get_passing_time_ms(start)) < 1000) { ++ DBG_88E("%s polling reg_0x143:0x%02x, reg_0x106:0x%02x\n", __func__, reg_0x143, rtw_read8(adapter, 0x106)); ++ rtw_usleep_os(100); ++ } ++ ++ /* data from EEPROM needs to be in LE */ ++ lo32 = cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L)); ++ hi32 = cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H)); ++ ++ if (i == 0) { ++ /* Although lenc is only used in a debug statement, ++ * do not remove it as the rtw_read16() call consumes ++ * 2 bytes from the EEPROM source. ++ */ ++ u16 lenc = rtw_read16(adapter, REG_PKTBUF_DBG_DATA_L); ++ ++ len = le32_to_cpu(lo32) & 0x0000ffff; ++ ++ limit = (len - 2 < limit) ? len - 2 : limit; ++ ++ DBG_88E("%s len:%u, lenc:%u\n", __func__, len, lenc); ++ ++ memcpy(pos, ((u8 *)&lo32) + 2, (limit >= count + 2) ? 2 : limit - count); ++ count += (limit >= count + 2) ? 2 : limit - count; ++ pos = content + count; ++ } else { ++ memcpy(pos, ((u8 *)&lo32), (limit >= count + 4) ? 4 : limit - count); ++ count += (limit >= count + 4) ? 4 : limit - count; ++ pos = content + count; ++ } ++ ++ if (limit > count && len - 2 > count) { ++ memcpy(pos, (u8 *)&hi32, (limit >= count + 4) ? 4 : limit - count); ++ count += (limit >= count + 4) ? 4 : limit - count; ++ pos = content + count; ++ } ++ ++ if (limit <= count || len - 2 <= count) ++ break; ++ i++; ++ } ++ rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, DISABLE_TRXPKT_BUF_ACCESS); ++ DBG_88E("%s read count:%u\n", __func__, count); ++ *size = count; ++} ++ ++static s32 iol_read_efuse(struct adapter *padapter, u8 txpktbuf_bndy, u16 offset, u16 size_byte, u8 *logical_map) ++{ ++ s32 status = _FAIL; ++ u8 physical_map[512]; ++ u16 size = 512; ++ ++ rtw_write8(padapter, REG_TDECTRL + 1, txpktbuf_bndy); ++ memset(physical_map, 0xFF, 512); ++ rtw_write8(padapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); ++ status = iol_execute(padapter, CMD_READ_EFUSE_MAP); ++ if (status == _SUCCESS) ++ efuse_read_phymap_from_txpktbuf(padapter, txpktbuf_bndy, physical_map, &size); ++ efuse_phymap_to_logical(physical_map, offset, size_byte, logical_map); ++ return status; ++} ++ ++s32 rtl8188e_iol_efuse_patch(struct adapter *padapter) ++{ ++ s32 result = _SUCCESS; ++ ++ DBG_88E("==> %s\n", __func__); ++ if (rtw_IOL_applied(padapter)) { ++ iol_mode_enable(padapter, 1); ++ result = iol_execute(padapter, CMD_READ_EFUSE_MAP); ++ if (result == _SUCCESS) ++ result = iol_execute(padapter, CMD_EFUSE_PATCH); ++ ++ iol_mode_enable(padapter, 0); ++ } ++ return result; ++} ++ ++static s32 iol_ioconfig(struct adapter *padapter, u8 iocfg_bndy) ++{ ++ s32 rst = _SUCCESS; ++ ++ rtw_write8(padapter, REG_TDECTRL + 1, iocfg_bndy); ++ rst = iol_execute(padapter, CMD_IOCONFIG); ++ return rst; ++} ++ ++static int rtl8188e_IOL_exec_cmds_sync(struct adapter *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) ++{ ++ struct pkt_attrib *pattrib = &xmit_frame->attrib; ++ u8 i; ++ int ret = _FAIL; ++ ++ if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) ++ goto exit; ++ if (rtw_usb_bulk_size_boundary(adapter, TXDESC_SIZE + pattrib->last_txcmdsz)) { ++ if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) ++ goto exit; ++ } ++ ++ dump_mgntframe_and_wait(adapter, xmit_frame, max_wating_ms); ++ ++ iol_mode_enable(adapter, 1); ++ for (i = 0; i < bndy_cnt; i++) { ++ u8 page_no = 0; ++ page_no = i * 2; ++ ret = iol_ioconfig(adapter, page_no); ++ if (ret != _SUCCESS) ++ break; ++ } ++ iol_mode_enable(adapter, 0); ++exit: ++ /* restore BCN_HEAD */ ++ rtw_write8(adapter, REG_TDECTRL + 1, 0); ++ return ret; ++} ++ ++void rtw_IOL_cmd_tx_pkt_buf_dump(struct adapter *Adapter, int data_len) ++{ ++ u32 fifo_data, reg_140; ++ u32 addr, rstatus, loop = 0; ++ u16 data_cnts = (data_len / 8) + 1; ++ u8 *pbuf = vzalloc(data_len + 10); ++ DBG_88E("###### %s ######\n", __func__); ++ ++ rtw_write8(Adapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); ++ if (pbuf) { ++ for (addr = 0; addr < data_cnts; addr++) { ++ rtw_write32(Adapter, 0x140, addr); ++ rtw_usleep_os(2); ++ loop = 0; ++ do { ++ rstatus = (reg_140 = rtw_read32(Adapter, REG_PKTBUF_DBG_CTRL) & BIT(24)); ++ if (rstatus) { ++ fifo_data = rtw_read32(Adapter, REG_PKTBUF_DBG_DATA_L); ++ memcpy(pbuf + (addr * 8), &fifo_data, 4); ++ ++ fifo_data = rtw_read32(Adapter, REG_PKTBUF_DBG_DATA_H); ++ memcpy(pbuf + (addr * 8 + 4), &fifo_data, 4); ++ } ++ rtw_usleep_os(2); ++ } while (!rstatus && (loop++ < 10)); ++ } ++ rtw_IOL_cmd_buf_dump(Adapter, data_len, pbuf); ++ vfree(pbuf); ++ } ++ DBG_88E("###### %s ######\n", __func__); ++} ++ ++static void _FWDownloadEnable(struct adapter *padapter, bool enable) ++{ ++ u8 tmp; ++ ++ if (enable) { ++ /* MCU firmware download enable. */ ++ tmp = rtw_read8(padapter, REG_MCUFWDL); ++ rtw_write8(padapter, REG_MCUFWDL, tmp | 0x01); ++ ++ /* 8051 reset */ ++ tmp = rtw_read8(padapter, REG_MCUFWDL + 2); ++ rtw_write8(padapter, REG_MCUFWDL + 2, tmp & 0xf7); ++ } else { ++ /* MCU firmware download disable. */ ++ tmp = rtw_read8(padapter, REG_MCUFWDL); ++ rtw_write8(padapter, REG_MCUFWDL, tmp & 0xfe); ++ ++ /* Reserved for fw extension. */ ++ rtw_write8(padapter, REG_MCUFWDL + 1, 0x00); ++ } ++} ++ ++#define MAX_REG_BOLCK_SIZE 196 ++ ++static int _BlockWrite(struct adapter *padapter, void *buffer, u32 buffSize) ++{ ++ int ret = _SUCCESS; ++ u32 blockSize_p1 = 4; /* (Default) Phase #1 : PCI muse use 4-byte write to download FW */ ++ u32 blockSize_p2 = 8; /* Phase #2 : Use 8-byte, if Phase#1 use big size to write FW. */ ++ u32 blockSize_p3 = 1; /* Phase #3 : Use 1-byte, the remnant of FW image. */ ++ u32 blockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0; ++ u32 remainSize_p1 = 0, remainSize_p2 = 0; ++ u8 *bufferPtr = (u8 *)buffer; ++ u32 i = 0, offset = 0; ++ ++ blockSize_p1 = MAX_REG_BOLCK_SIZE; ++ ++ /* 3 Phase #1 */ ++ blockCount_p1 = buffSize / blockSize_p1; ++ remainSize_p1 = buffSize % blockSize_p1; ++ ++ for (i = 0; i < blockCount_p1; i++) { ++ ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + i * blockSize_p1), blockSize_p1, (bufferPtr + i * blockSize_p1)); ++ if (ret == _FAIL) ++ goto exit; ++ } ++ ++ /* 3 Phase #2 */ ++ if (remainSize_p1) { ++ offset = blockCount_p1 * blockSize_p1; ++ ++ blockCount_p2 = remainSize_p1 / blockSize_p2; ++ remainSize_p2 = remainSize_p1 % blockSize_p2; ++ ++ for (i = 0; i < blockCount_p2; i++) { ++ ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + offset + i * blockSize_p2), blockSize_p2, (bufferPtr + offset + i * blockSize_p2)); ++ ++ if (ret == _FAIL) ++ goto exit; ++ } ++ } ++ ++ /* 3 Phase #3 */ ++ if (remainSize_p2) { ++ offset = (blockCount_p1 * blockSize_p1) + (blockCount_p2 * blockSize_p2); ++ ++ blockCount_p3 = remainSize_p2 / blockSize_p3; ++ ++ for (i = 0; i < blockCount_p3; i++) { ++ ret = rtw_write8(padapter, (FW_8188E_START_ADDRESS + offset + i), *(bufferPtr + offset + i)); ++ ++ if (ret == _FAIL) ++ goto exit; ++ } ++ } ++ ++exit: ++ return ret; ++} ++ ++static int _PageWrite(struct adapter *padapter, u32 page, void *buffer, u32 size) ++{ ++ u8 value8; ++ u8 u8Page = (u8)(page & 0x07); ++ ++ value8 = (rtw_read8(padapter, REG_MCUFWDL + 2) & 0xF8) | u8Page; ++ rtw_write8(padapter, REG_MCUFWDL + 2, value8); ++ ++ return _BlockWrite(padapter, buffer, size); ++} ++ ++static int _WriteFW(struct adapter *padapter, void *buffer, u32 size) ++{ ++ /* Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. */ ++ /* We can remove _ReadChipVersion from ReadpadapterInfo8192C later. */ ++ int ret = _SUCCESS; ++ u32 pageNums, remainSize; ++ u32 page, offset; ++ u8 *bufferPtr = (u8 *)buffer; ++ ++ pageNums = size / MAX_PAGE_SIZE; ++ remainSize = size % MAX_PAGE_SIZE; ++ ++ for (page = 0; page < pageNums; page++) { ++ offset = page * MAX_PAGE_SIZE; ++ ret = _PageWrite(padapter, page, bufferPtr + offset, MAX_PAGE_SIZE); ++ ++ if (ret == _FAIL) ++ goto exit; ++ } ++ if (remainSize) { ++ offset = pageNums * MAX_PAGE_SIZE; ++ page = pageNums; ++ ret = _PageWrite(padapter, page, bufferPtr + offset, remainSize); ++ ++ if (ret == _FAIL) ++ goto exit; ++ } ++exit: ++ return ret; ++} ++ ++void _8051Reset88E(struct adapter *padapter) ++{ ++ u8 u1bTmp; ++ ++ u1bTmp = rtw_read8(padapter, REG_SYS_FUNC_EN + 1); ++ rtw_write8(padapter, REG_SYS_FUNC_EN + 1, u1bTmp & (~BIT(2))); ++ rtw_write8(padapter, REG_SYS_FUNC_EN + 1, u1bTmp | (BIT(2))); ++ DBG_88E("=====> _8051Reset88E(): 8051 reset success .\n"); ++} ++ ++static s32 _FWFreeToGo(struct adapter *padapter) ++{ ++ u32 counter = 0; ++ u32 value32; ++ ++ /* polling CheckSum report */ ++ do { ++ value32 = rtw_read32(padapter, REG_MCUFWDL); ++ if (value32 & FWDL_ChkSum_rpt) ++ break; ++ } while (counter++ < POLLING_READY_TIMEOUT_COUNT); ++ ++ if (counter >= POLLING_READY_TIMEOUT_COUNT) { ++ DBG_88E("%s: chksum report fail! REG_MCUFWDL:0x%08x\n", __func__, value32); ++ return _FAIL; ++ } ++ DBG_88E("%s: Checksum report OK! REG_MCUFWDL:0x%08x\n", __func__, value32); ++ ++ value32 = rtw_read32(padapter, REG_MCUFWDL); ++ value32 |= MCUFWDL_RDY; ++ value32 &= ~WINTINI_RDY; ++ rtw_write32(padapter, REG_MCUFWDL, value32); ++ ++ _8051Reset88E(padapter); ++ ++ /* polling for FW ready */ ++ counter = 0; ++ do { ++ value32 = rtw_read32(padapter, REG_MCUFWDL); ++ if (value32 & WINTINI_RDY) { ++ DBG_88E("%s: Polling FW ready success!! REG_MCUFWDL:0x%08x\n", __func__, value32); ++ return _SUCCESS; ++ } ++ udelay(5); ++ } while (counter++ < POLLING_READY_TIMEOUT_COUNT); ++ ++ DBG_88E("%s: Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", __func__, value32); ++ return _FAIL; ++} ++ ++#define IS_FW_81xxC(padapter) (((GET_HAL_DATA(padapter))->FirmwareSignature & 0xFFF0) == 0x88C0) ++ ++static int load_firmware(struct rt_firmware *pFirmware, struct device *device) ++{ ++ s32 rtStatus = _SUCCESS; ++ const struct firmware *fw; ++ const char *fw_name = "rtlwifi/rtl8188eufw.bin"; ++ int err = request_firmware(&fw, fw_name, device); ++ ++ if (err) { ++ pr_err("Request firmware failed with error 0x%x\n", err); ++ rtStatus = _FAIL; ++ goto Exit; ++ } ++ if (!fw) { ++ pr_err("Firmware %s not available\n", fw_name); ++ rtStatus = _FAIL; ++ goto Exit; ++ } ++ if (fw->size > FW_8188E_SIZE) { ++ rtStatus = _FAIL; ++ goto Exit; ++ } ++ ++ pFirmware->szFwBuffer = kzalloc(FW_8188E_SIZE, GFP_KERNEL); ++ if (!pFirmware->szFwBuffer) { ++ pr_err("Failed to allocate pFirmware->szFwBuffer\n"); ++ rtStatus = _FAIL; ++ goto Exit; ++ } ++ memcpy(pFirmware->szFwBuffer, fw->data, fw->size); ++ pFirmware->ulFwLength = fw->size; ++ release_firmware(fw); ++ DBG_88E_LEVEL(_drv_info_, "+%s: !bUsedWoWLANFw, FmrmwareLen:%d+\n", __func__, pFirmware->ulFwLength); ++ ++Exit: ++ return rtStatus; ++} ++ ++s32 rtl8188e_FirmwareDownload(struct adapter *padapter) ++{ ++ s32 rtStatus = _SUCCESS; ++ u8 writeFW_retry = 0; ++ u32 fwdl_start_time; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); ++ struct device *device = dvobj_to_dev(dvobj); ++ struct rt_firmware_hdr *pFwHdr = NULL; ++ u8 *pFirmwareBuf; ++ u32 FirmwareLen; ++ static int log_version; ++ ++ if (!dvobj->firmware.szFwBuffer) ++ rtStatus = load_firmware(&dvobj->firmware, device); ++ if (rtStatus == _FAIL) { ++ dvobj->firmware.szFwBuffer = NULL; ++ goto Exit; ++ } ++ pFirmwareBuf = dvobj->firmware.szFwBuffer; ++ FirmwareLen = dvobj->firmware.ulFwLength; ++ ++ /* To Check Fw header. Added by tynli. 2009.12.04. */ ++ pFwHdr = (struct rt_firmware_hdr *)dvobj->firmware.szFwBuffer; ++ ++ pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version); ++ pHalData->FirmwareSubVersion = pFwHdr->Subversion; ++ pHalData->FirmwareSignature = le16_to_cpu(pFwHdr->Signature); ++ ++ if (!log_version++) ++ pr_info("%sFirmware Version %d, SubVersion %d, Signature 0x%x\n", ++ DRIVER_PREFIX, pHalData->FirmwareVersion, ++ pHalData->FirmwareSubVersion, pHalData->FirmwareSignature); ++ ++ if (IS_FW_HEADER_EXIST(pFwHdr)) { ++ /* Shift 32 bytes for FW header */ ++ pFirmwareBuf = pFirmwareBuf + 32; ++ FirmwareLen = FirmwareLen - 32; ++ } ++ ++ /* Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, */ ++ /* or it will cause download Fw fail. 2010.02.01. by tynli. */ ++ if (rtw_read8(padapter, REG_MCUFWDL) & RAM_DL_SEL) { /* 8051 RAM code */ ++ rtw_write8(padapter, REG_MCUFWDL, 0x00); ++ _8051Reset88E(padapter); ++ } ++ ++ _FWDownloadEnable(padapter, true); ++ fwdl_start_time = jiffies; ++ while (1) { ++ /* reset the FWDL chksum */ ++ rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWDL_ChkSum_rpt); ++ ++ rtStatus = _WriteFW(padapter, pFirmwareBuf, FirmwareLen); ++ ++ if (rtStatus == _SUCCESS || ++ (rtw_get_passing_time_ms(fwdl_start_time) > 500 && writeFW_retry++ >= 3)) ++ break; ++ ++ DBG_88E("%s writeFW_retry:%u, time after fwdl_start_time:%ums\n", ++ __func__, writeFW_retry, rtw_get_passing_time_ms(fwdl_start_time) ++ ); ++ } ++ _FWDownloadEnable(padapter, false); ++ if (_SUCCESS != rtStatus) { ++ DBG_88E("DL Firmware failed!\n"); ++ goto Exit; ++ } ++ ++ rtStatus = _FWFreeToGo(padapter); ++ if (_SUCCESS != rtStatus) { ++ DBG_88E("DL Firmware failed!\n"); ++ goto Exit; ++ } ++ ++Exit: ++ return rtStatus; ++} ++ ++void rtl8188e_InitializeFirmwareVars(struct adapter *padapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ ++ /* Init Fw LPS related. */ ++ padapter->pwrctrlpriv.bFwCurrentInPSMode = false; ++ ++ /* Init H2C counter. by tynli. 2009.12.09. */ ++ pHalData->LastHMEBoxNum = 0; ++} ++ ++static void rtl8188e_free_hal_data(struct adapter *padapter) ++{ ++ ++ kfree(padapter->HalData); ++ padapter->HalData = NULL; ++ ++} ++ ++/* */ ++/* Efuse related code */ ++/* */ ++enum{ ++ VOLTAGE_V25 = 0x03, ++ LDOE25_SHIFT = 28, ++ }; ++ ++static bool ++hal_EfusePgPacketWrite2ByteHeader( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ u16 *pAddr, ++ struct pgpkt *pTargetPkt, ++ bool bPseudoTest); ++static bool ++hal_EfusePgPacketWrite1ByteHeader( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ u16 *pAddr, ++ struct pgpkt *pTargetPkt, ++ bool bPseudoTest); ++static bool ++hal_EfusePgPacketWriteData( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ u16 *pAddr, ++ struct pgpkt *pTargetPkt, ++ bool bPseudoTest); ++ ++static void ++hal_EfusePowerSwitch_RTL8188E( ++ struct adapter *pAdapter, ++ u8 bWrite, ++ u8 PwrState) ++{ ++ u8 tempval; ++ u16 tmpV16; ++ ++ if (PwrState) { ++ rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); ++ ++ /* 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid */ ++ tmpV16 = rtw_read16(pAdapter, REG_SYS_ISO_CTRL); ++ if (!(tmpV16 & PWC_EV12V)) { ++ tmpV16 |= PWC_EV12V; ++ rtw_write16(pAdapter, REG_SYS_ISO_CTRL, tmpV16); ++ } ++ /* Reset: 0x0000h[28], default valid */ ++ tmpV16 = rtw_read16(pAdapter, REG_SYS_FUNC_EN); ++ if (!(tmpV16 & FEN_ELDR)) { ++ tmpV16 |= FEN_ELDR; ++ rtw_write16(pAdapter, REG_SYS_FUNC_EN, tmpV16); ++ } ++ ++ /* Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid */ ++ tmpV16 = rtw_read16(pAdapter, REG_SYS_CLKR); ++ if ((!(tmpV16 & LOADER_CLK_EN)) || (!(tmpV16 & ANA8M))) { ++ tmpV16 |= (LOADER_CLK_EN | ANA8M); ++ rtw_write16(pAdapter, REG_SYS_CLKR, tmpV16); ++ } ++ ++ if (bWrite) { ++ /* Enable LDO 2.5V before read/write action */ ++ tempval = rtw_read8(pAdapter, EFUSE_TEST + 3); ++ tempval &= 0x0F; ++ tempval |= (VOLTAGE_V25 << 4); ++ rtw_write8(pAdapter, EFUSE_TEST + 3, (tempval | 0x80)); ++ } ++ } else { ++ rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); ++ ++ if (bWrite) { ++ /* Disable LDO 2.5V after read/write action */ ++ tempval = rtw_read8(pAdapter, EFUSE_TEST + 3); ++ rtw_write8(pAdapter, EFUSE_TEST + 3, (tempval & 0x7F)); ++ } ++ } ++} ++ ++static void ++rtl8188e_EfusePowerSwitch( ++ struct adapter *pAdapter, ++ u8 bWrite, ++ u8 PwrState) ++{ ++ hal_EfusePowerSwitch_RTL8188E(pAdapter, bWrite, PwrState); ++} ++ ++static void Hal_EfuseReadEFuse88E(struct adapter *Adapter, ++ u16 _offset, ++ u16 _size_byte, ++ u8 *pbuf, ++ bool bPseudoTest ++ ) ++{ ++ u8 *efuseTbl = NULL; ++ u8 rtemp8[1]; ++ u16 eFuse_Addr = 0; ++ u8 offset, wren; ++ u16 i, j; ++ u16 **eFuseWord = NULL; ++ u16 efuse_utilized = 0; ++ u8 u1temp = 0; ++ ++ /* */ ++ /* Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. */ ++ /* */ ++ if ((_offset + _size_byte) > EFUSE_MAP_LEN_88E) {/* total E-Fuse table is 512bytes */ ++ DBG_88E("Hal_EfuseReadEFuse88E(): Invalid offset(%#x) with read bytes(%#x)!!\n", _offset, _size_byte); ++ goto exit; ++ } ++ ++ efuseTbl = kzalloc(EFUSE_MAP_LEN_88E, GFP_KERNEL); ++ if (!efuseTbl) { ++ DBG_88E("%s: alloc efuseTbl fail!\n", __func__); ++ goto exit; ++ } ++ ++ eFuseWord = rtw_malloc2d(EFUSE_MAX_SECTION_88E, EFUSE_MAX_WORD_UNIT, sizeof(u16)); ++ if (!eFuseWord) { ++ DBG_88E("%s: alloc eFuseWord fail!\n", __func__); ++ goto exit; ++ } ++ ++ /* 0. Refresh efuse init map as all oxFF. */ ++ for (i = 0; i < EFUSE_MAX_SECTION_88E; i++) ++ for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) ++ eFuseWord[i][j] = 0xFFFF; ++ ++ /* */ ++ /* 1. Read the first byte to check if efuse is empty!!! */ ++ /* */ ++ /* */ ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ if (*rtemp8 != 0xFF) { ++ efuse_utilized++; ++ eFuse_Addr++; ++ } else { ++ DBG_88E("EFUSE is empty efuse_Addr-%d efuse_data =%x\n", eFuse_Addr, *rtemp8); ++ goto exit; ++ } ++ ++ /* */ ++ /* 2. Read real efuse content. Filter PG header and every section data. */ ++ /* */ ++ while ((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) { ++ /* Check PG header for section num. */ ++ if ((*rtemp8 & 0x1F) == 0x0F) { /* extended header */ ++ u1temp = ((*rtemp8 & 0xE0) >> 5); ++ ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ ++ if ((*rtemp8 & 0x0F) == 0x0F) { ++ eFuse_Addr++; ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ ++ if (*rtemp8 != 0xFF && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) ++ eFuse_Addr++; ++ continue; ++ } else { ++ offset = ((*rtemp8 & 0xF0) >> 1) | u1temp; ++ wren = (*rtemp8 & 0x0F); ++ eFuse_Addr++; ++ } ++ } else { ++ offset = ((*rtemp8 >> 4) & 0x0f); ++ wren = (*rtemp8 & 0x0f); ++ } ++ ++ if (offset < EFUSE_MAX_SECTION_88E) { ++ /* Get word enable value from PG header */ ++ ++ for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { ++ /* Check word enable condition in the section */ ++ if (!(wren & 0x01)) { ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ eFuse_Addr++; ++ efuse_utilized++; ++ eFuseWord[offset][i] = (*rtemp8 & 0xff); ++ if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) ++ break; ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ eFuse_Addr++; ++ efuse_utilized++; ++ eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00); ++ if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) ++ break; ++ } ++ wren >>= 1; ++ } ++ } ++ ++ /* Read next PG header */ ++ ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); ++ ++ if (*rtemp8 != 0xFF && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) { ++ efuse_utilized++; ++ eFuse_Addr++; ++ } ++ } ++ ++ /* 3. Collect 16 sections and 4 word unit into Efuse map. */ ++ for (i = 0; i < EFUSE_MAX_SECTION_88E; i++) { ++ for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) { ++ efuseTbl[(i * 8) + (j * 2)] = (eFuseWord[i][j] & 0xff); ++ efuseTbl[(i * 8) + ((j * 2) + 1)] = ((eFuseWord[i][j] >> 8) & 0xff); ++ } ++ } ++ ++ /* 4. Copy from Efuse map to output pointer memory!!! */ ++ for (i = 0; i < _size_byte; i++) ++ pbuf[i] = efuseTbl[_offset + i]; ++ ++ /* 5. Calculate Efuse utilization. */ ++ rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&eFuse_Addr); ++ ++exit: ++ kfree(efuseTbl); ++ kfree(eFuseWord); ++} ++ ++static void ReadEFuseByIC(struct adapter *Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, bool bPseudoTest) ++{ ++ if (!bPseudoTest) { ++ int ret = _FAIL; ++ if (rtw_IOL_applied(Adapter)) { ++ rtw_hal_power_on(Adapter); ++ ++ iol_mode_enable(Adapter, 1); ++ ret = iol_read_efuse(Adapter, 0, _offset, _size_byte, pbuf); ++ iol_mode_enable(Adapter, 0); ++ ++ if (_SUCCESS == ret) ++ goto exit; ++ } ++ } ++ Hal_EfuseReadEFuse88E(Adapter, _offset, _size_byte, pbuf, bPseudoTest); ++ ++exit: ++ return; ++} ++ ++static void ReadEFuse_Pseudo(struct adapter *Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, bool bPseudoTest) ++{ ++ Hal_EfuseReadEFuse88E(Adapter, _offset, _size_byte, pbuf, bPseudoTest); ++} ++ ++static void rtl8188e_ReadEFuse(struct adapter *Adapter, u8 efuseType, ++ u16 _offset, u16 _size_byte, u8 *pbuf, ++ bool bPseudoTest) ++{ ++ if (bPseudoTest) ++ ReadEFuse_Pseudo(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); ++ else ++ ReadEFuseByIC(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); ++} ++ ++/* Do not support BT */ ++static void Hal_EFUSEGetEfuseDefinition88E(struct adapter *pAdapter, u8 efuseType, u8 type, void *pOut) ++{ ++ switch (type) { ++ case TYPE_EFUSE_MAX_SECTION: ++ { ++ u8 *pMax_section; ++ pMax_section = (u8 *)pOut; ++ *pMax_section = EFUSE_MAX_SECTION_88E; ++ } ++ break; ++ case TYPE_EFUSE_REAL_CONTENT_LEN: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = EFUSE_REAL_CONTENT_LEN_88E; ++ } ++ break; ++ case TYPE_EFUSE_CONTENT_LEN_BANK: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = EFUSE_REAL_CONTENT_LEN_88E; ++ } ++ break; ++ case TYPE_AVAILABLE_EFUSE_BYTES_BANK: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_88E - EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_88E - EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ case TYPE_EFUSE_MAP_LEN: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)EFUSE_MAP_LEN_88E; ++ } ++ break; ++ case TYPE_EFUSE_PROTECT_BYTES_BANK: ++ { ++ u8 *pu1Tmp; ++ pu1Tmp = (u8 *)pOut; ++ *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ default: ++ { ++ u8 *pu1Tmp; ++ pu1Tmp = (u8 *)pOut; ++ *pu1Tmp = 0; ++ } ++ break; ++ } ++} ++ ++static void Hal_EFUSEGetEfuseDefinition_Pseudo88E(struct adapter *pAdapter, u8 efuseType, u8 type, void *pOut) ++{ ++ switch (type) { ++ case TYPE_EFUSE_MAX_SECTION: ++ { ++ u8 *pMax_section; ++ pMax_section = (u8 *)pOut; ++ *pMax_section = EFUSE_MAX_SECTION_88E; ++ } ++ break; ++ case TYPE_EFUSE_REAL_CONTENT_LEN: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = EFUSE_REAL_CONTENT_LEN_88E; ++ } ++ break; ++ case TYPE_EFUSE_CONTENT_LEN_BANK: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = EFUSE_REAL_CONTENT_LEN_88E; ++ } ++ break; ++ case TYPE_AVAILABLE_EFUSE_BYTES_BANK: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_88E - EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_88E - EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ case TYPE_EFUSE_MAP_LEN: ++ { ++ u16 *pu2Tmp; ++ pu2Tmp = (u16 *)pOut; ++ *pu2Tmp = (u16)EFUSE_MAP_LEN_88E; ++ } ++ break; ++ case TYPE_EFUSE_PROTECT_BYTES_BANK: ++ { ++ u8 *pu1Tmp; ++ pu1Tmp = (u8 *)pOut; ++ *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES_88E); ++ } ++ break; ++ default: ++ { ++ u8 *pu1Tmp; ++ pu1Tmp = (u8 *)pOut; ++ *pu1Tmp = 0; ++ } ++ break; ++ } ++} ++ ++static void rtl8188e_EFUSE_GetEfuseDefinition(struct adapter *pAdapter, u8 efuseType, u8 type, void *pOut, bool bPseudoTest) ++{ ++ if (bPseudoTest) ++ Hal_EFUSEGetEfuseDefinition_Pseudo88E(pAdapter, efuseType, type, pOut); ++ else ++ Hal_EFUSEGetEfuseDefinition88E(pAdapter, efuseType, type, pOut); ++} ++ ++static u8 Hal_EfuseWordEnableDataWrite(struct adapter *pAdapter, u16 efuse_addr, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ u16 tmpaddr = 0; ++ u16 start_addr = efuse_addr; ++ u8 badworden = 0x0F; ++ u8 tmpdata[8]; ++ ++ memset((void *)tmpdata, 0xff, PGPKT_DATA_SIZE); ++ ++ if (!(word_en & BIT(0))) { ++ tmpaddr = start_addr; ++ efuse_OneByteWrite(pAdapter, start_addr++, data[0], bPseudoTest); ++ efuse_OneByteWrite(pAdapter, start_addr++, data[1], bPseudoTest); ++ ++ efuse_OneByteRead(pAdapter, tmpaddr, &tmpdata[0], bPseudoTest); ++ efuse_OneByteRead(pAdapter, tmpaddr + 1, &tmpdata[1], bPseudoTest); ++ if ((data[0] != tmpdata[0]) || (data[1] != tmpdata[1])) ++ badworden &= (~BIT(0)); ++ } ++ if (!(word_en & BIT(1))) { ++ tmpaddr = start_addr; ++ efuse_OneByteWrite(pAdapter, start_addr++, data[2], bPseudoTest); ++ efuse_OneByteWrite(pAdapter, start_addr++, data[3], bPseudoTest); ++ ++ efuse_OneByteRead(pAdapter, tmpaddr, &tmpdata[2], bPseudoTest); ++ efuse_OneByteRead(pAdapter, tmpaddr + 1, &tmpdata[3], bPseudoTest); ++ if ((data[2] != tmpdata[2]) || (data[3] != tmpdata[3])) ++ badworden &= (~BIT(1)); ++ } ++ if (!(word_en & BIT(2))) { ++ tmpaddr = start_addr; ++ efuse_OneByteWrite(pAdapter, start_addr++, data[4], bPseudoTest); ++ efuse_OneByteWrite(pAdapter, start_addr++, data[5], bPseudoTest); ++ ++ efuse_OneByteRead(pAdapter, tmpaddr, &tmpdata[4], bPseudoTest); ++ efuse_OneByteRead(pAdapter, tmpaddr + 1, &tmpdata[5], bPseudoTest); ++ if ((data[4] != tmpdata[4]) || (data[5] != tmpdata[5])) ++ badworden &= (~BIT(2)); ++ } ++ if (!(word_en & BIT(3))) { ++ tmpaddr = start_addr; ++ efuse_OneByteWrite(pAdapter, start_addr++, data[6], bPseudoTest); ++ efuse_OneByteWrite(pAdapter, start_addr++, data[7], bPseudoTest); ++ ++ efuse_OneByteRead(pAdapter, tmpaddr, &tmpdata[6], bPseudoTest); ++ efuse_OneByteRead(pAdapter, tmpaddr + 1, &tmpdata[7], bPseudoTest); ++ if ((data[6] != tmpdata[6]) || (data[7] != tmpdata[7])) ++ badworden &= (~BIT(3)); ++ } ++ return badworden; ++} ++ ++static u8 Hal_EfuseWordEnableDataWrite_Pseudo(struct adapter *pAdapter, u16 efuse_addr, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ u8 ret; ++ ++ ret = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); ++ return ret; ++} ++ ++static u8 rtl8188e_Efuse_WordEnableDataWrite(struct adapter *pAdapter, u16 efuse_addr, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ u8 ret = 0; ++ ++ if (bPseudoTest) ++ ret = Hal_EfuseWordEnableDataWrite_Pseudo(pAdapter, efuse_addr, word_en, data, bPseudoTest); ++ else ++ ret = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); ++ return ret; ++} ++ ++static u16 hal_EfuseGetCurrentSize_8188e(struct adapter *pAdapter, bool bPseudoTest) ++{ ++ int bContinual = true; ++ u16 efuse_addr = 0; ++ u8 hoffset = 0, hworden = 0; ++ u8 efuse_data, word_cnts = 0; ++ ++ if (bPseudoTest) ++ efuse_addr = (u16)(fakeEfuseUsedBytes); ++ else ++ rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); ++ ++ while (bContinual && ++ efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest) && ++ AVAILABLE_EFUSE_ADDR(efuse_addr)) { ++ if (efuse_data != 0xFF) { ++ if ((efuse_data & 0x1F) == 0x0F) { /* extended header */ ++ hoffset = efuse_data; ++ efuse_addr++; ++ efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest); ++ if ((efuse_data & 0x0F) == 0x0F) { ++ efuse_addr++; ++ continue; ++ } else { ++ hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); ++ hworden = efuse_data & 0x0F; ++ } ++ } else { ++ hoffset = (efuse_data >> 4) & 0x0F; ++ hworden = efuse_data & 0x0F; ++ } ++ word_cnts = Efuse_CalculateWordCnts(hworden); ++ /* read next header */ ++ efuse_addr = efuse_addr + (word_cnts * 2) + 1; ++ } else { ++ bContinual = false; ++ } ++ } ++ ++ if (bPseudoTest) ++ fakeEfuseUsedBytes = efuse_addr; ++ else ++ rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); ++ ++ return efuse_addr; ++} ++ ++static u16 Hal_EfuseGetCurrentSize_Pseudo(struct adapter *pAdapter, bool bPseudoTest) ++{ ++ u16 ret = 0; ++ ++ ret = hal_EfuseGetCurrentSize_8188e(pAdapter, bPseudoTest); ++ return ret; ++} ++ ++static u16 rtl8188e_EfuseGetCurrentSize(struct adapter *pAdapter, u8 efuseType, bool bPseudoTest) ++{ ++ u16 ret = 0; ++ ++ if (bPseudoTest) ++ ret = Hal_EfuseGetCurrentSize_Pseudo(pAdapter, bPseudoTest); ++ else ++ ret = hal_EfuseGetCurrentSize_8188e(pAdapter, bPseudoTest); ++ return ret; ++} ++ ++static int hal_EfusePgPacketRead_8188e(struct adapter *pAdapter, u8 offset, u8 *data, bool bPseudoTest) ++{ ++ u8 ReadState = PG_STATE_HEADER; ++ int bContinual = true; ++ int bDataEmpty = true; ++ u8 efuse_data, word_cnts = 0; ++ u16 efuse_addr = 0; ++ u8 hoffset = 0, hworden = 0; ++ u8 tmpidx = 0; ++ u8 tmpdata[8]; ++ u8 max_section = 0; ++ u8 tmp_header = 0; ++ ++ EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAX_SECTION, (void *)&max_section, bPseudoTest); ++ ++ if (!data) ++ return false; ++ if (offset > max_section) ++ return false; ++ ++ memset((void *)data, 0xff, sizeof(u8) * PGPKT_DATA_SIZE); ++ memset((void *)tmpdata, 0xff, sizeof(u8) * PGPKT_DATA_SIZE); ++ ++ /* Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. */ ++ /* Skip dummy parts to prevent unexpected data read from Efuse. */ ++ /* By pass right now. 2009.02.19. */ ++ while (bContinual && AVAILABLE_EFUSE_ADDR(efuse_addr)) { ++ /* Header Read ------------- */ ++ if (ReadState & PG_STATE_HEADER) { ++ if (efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest) && (efuse_data != 0xFF)) { ++ if (EXT_HEADER(efuse_data)) { ++ tmp_header = efuse_data; ++ efuse_addr++; ++ efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest); ++ if (!ALL_WORDS_DISABLED(efuse_data)) { ++ hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); ++ hworden = efuse_data & 0x0F; ++ } else { ++ DBG_88E("Error, All words disabled\n"); ++ efuse_addr++; ++ continue; ++ } ++ } else { ++ hoffset = (efuse_data >> 4) & 0x0F; ++ hworden = efuse_data & 0x0F; ++ } ++ word_cnts = Efuse_CalculateWordCnts(hworden); ++ bDataEmpty = true; ++ ++ if (hoffset == offset) { ++ for (tmpidx = 0; tmpidx < word_cnts * 2; tmpidx++) { ++ if (efuse_OneByteRead(pAdapter, efuse_addr + 1 + tmpidx, &efuse_data, bPseudoTest)) { ++ tmpdata[tmpidx] = efuse_data; ++ if (efuse_data != 0xff) ++ bDataEmpty = false; ++ } ++ } ++ if (!bDataEmpty) { ++ ReadState = PG_STATE_DATA; ++ } else {/* read next header */ ++ efuse_addr = efuse_addr + (word_cnts * 2) + 1; ++ ReadState = PG_STATE_HEADER; ++ } ++ } else {/* read next header */ ++ efuse_addr = efuse_addr + (word_cnts * 2) + 1; ++ ReadState = PG_STATE_HEADER; ++ } ++ } else { ++ bContinual = false; ++ } ++ } else if (ReadState & PG_STATE_DATA) { ++ /* Data section Read ------------- */ ++ efuse_WordEnableDataRead(hworden, tmpdata, data); ++ efuse_addr = efuse_addr + (word_cnts * 2) + 1; ++ ReadState = PG_STATE_HEADER; ++ } ++ ++ } ++ ++ if ((data[0] == 0xff) && (data[1] == 0xff) && (data[2] == 0xff) && (data[3] == 0xff) && ++ (data[4] == 0xff) && (data[5] == 0xff) && (data[6] == 0xff) && (data[7] == 0xff)) ++ return false; ++ else ++ return true; ++} ++ ++static int Hal_EfusePgPacketRead(struct adapter *pAdapter, u8 offset, u8 *data, bool bPseudoTest) ++{ ++ int ret; ++ ++ ret = hal_EfusePgPacketRead_8188e(pAdapter, offset, data, bPseudoTest); ++ return ret; ++} ++ ++static int Hal_EfusePgPacketRead_Pseudo(struct adapter *pAdapter, u8 offset, u8 *data, bool bPseudoTest) ++{ ++ int ret; ++ ++ ret = hal_EfusePgPacketRead_8188e(pAdapter, offset, data, bPseudoTest); ++ return ret; ++} ++ ++static int rtl8188e_Efuse_PgPacketRead(struct adapter *pAdapter, u8 offset, u8 *data, bool bPseudoTest) ++{ ++ int ret; ++ ++ if (bPseudoTest) ++ ret = Hal_EfusePgPacketRead_Pseudo(pAdapter, offset, data, bPseudoTest); ++ else ++ ret = Hal_EfusePgPacketRead(pAdapter, offset, data, bPseudoTest); ++ return ret; ++} ++ ++static bool hal_EfuseFixHeaderProcess(struct adapter *pAdapter, u8 efuseType, struct pgpkt *pFixPkt, u16 *pAddr, bool bPseudoTest) ++{ ++ u8 originaldata[8], badworden = 0; ++ u16 efuse_addr = *pAddr; ++ u32 PgWriteSuccess = 0; ++ ++ memset((void *)originaldata, 0xff, 8); ++ ++ if (Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) { ++ /* check if data exist */ ++ badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr + 1, pFixPkt->word_en, originaldata, bPseudoTest); ++ ++ if (badworden != 0xf) { /* write fail */ ++ PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); ++ ++ if (!PgWriteSuccess) ++ return false; ++ else ++ efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); ++ } else { ++ efuse_addr = efuse_addr + (pFixPkt->word_cnts * 2) + 1; ++ } ++ } else { ++ efuse_addr = efuse_addr + (pFixPkt->word_cnts * 2) + 1; ++ } ++ *pAddr = efuse_addr; ++ return true; ++} ++ ++static bool hal_EfusePgPacketWrite2ByteHeader(struct adapter *pAdapter, u8 efuseType, u16 *pAddr, struct pgpkt *pTargetPkt, bool bPseudoTest) ++{ ++ bool bRet = false; ++ u16 efuse_addr = *pAddr, efuse_max_available_len = 0; ++ u8 pg_header = 0, tmp_header = 0, pg_header_temp = 0; ++ u8 repeatcnt = 0; ++ ++ EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (void *)&efuse_max_available_len, bPseudoTest); ++ ++ while (efuse_addr < efuse_max_available_len) { ++ pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ ++ while (tmp_header == 0xFF) { ++ if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) ++ return false; ++ ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ } ++ ++ /* to write ext_header */ ++ if (tmp_header == pg_header) { ++ efuse_addr++; ++ pg_header_temp = pg_header; ++ pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; ++ ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ ++ while (tmp_header == 0xFF) { ++ if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) ++ return false; ++ ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ } ++ ++ if ((tmp_header & 0x0F) == 0x0F) { /* word_en PG fail */ ++ if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { ++ return false; ++ } else { ++ efuse_addr++; ++ continue; ++ } ++ } else if (pg_header != tmp_header) { /* offset PG fail */ ++ struct pgpkt fixPkt; ++ fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); ++ fixPkt.word_en = tmp_header & 0x0F; ++ fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); ++ if (!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) ++ return false; ++ } else { ++ bRet = true; ++ break; ++ } ++ } else if ((tmp_header & 0x1F) == 0x0F) { /* wrong extended header */ ++ efuse_addr += 2; ++ continue; ++ } ++ } ++ ++ *pAddr = efuse_addr; ++ return bRet; ++} ++ ++static bool hal_EfusePgPacketWrite1ByteHeader(struct adapter *pAdapter, u8 efuseType, u16 *pAddr, struct pgpkt *pTargetPkt, bool bPseudoTest) ++{ ++ bool bRet = false; ++ u8 pg_header = 0, tmp_header = 0; ++ u16 efuse_addr = *pAddr; ++ u8 repeatcnt = 0; ++ ++ pg_header = ((pTargetPkt->offset << 4) & 0xf0) | pTargetPkt->word_en; ++ ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ ++ while (tmp_header == 0xFF) { ++ if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) ++ return false; ++ efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); ++ efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); ++ } ++ ++ if (pg_header == tmp_header) { ++ bRet = true; ++ } else { ++ struct pgpkt fixPkt; ++ fixPkt.offset = (tmp_header >> 4) & 0x0F; ++ fixPkt.word_en = tmp_header & 0x0F; ++ fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); ++ if (!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) ++ return false; ++ } ++ ++ *pAddr = efuse_addr; ++ return bRet; ++} ++ ++static bool hal_EfusePgPacketWriteData(struct adapter *pAdapter, u8 efuseType, u16 *pAddr, struct pgpkt *pTargetPkt, bool bPseudoTest) ++{ ++ u16 efuse_addr = *pAddr; ++ u8 badworden = 0; ++ u32 PgWriteSuccess = 0; ++ ++ badworden = 0x0f; ++ badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr + 1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); ++ if (badworden == 0x0F) { ++ /* write ok */ ++ return true; ++ } else { ++ /* reorganize other pg packet */ ++ PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); ++ if (!PgWriteSuccess) ++ return false; ++ else ++ return true; ++ } ++} ++ ++static bool ++hal_EfusePgPacketWriteHeader( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ u16 *pAddr, ++ struct pgpkt *pTargetPkt, ++ bool bPseudoTest) ++{ ++ bool bRet = false; ++ ++ if (pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) ++ bRet = hal_EfusePgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); ++ else ++ bRet = hal_EfusePgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); ++ ++ return bRet; ++} ++ ++static bool wordEnMatched(struct pgpkt *pTargetPkt, struct pgpkt *pCurPkt, ++ u8 *pWden) ++{ ++ u8 match_word_en = 0x0F; /* default all words are disabled */ ++ ++ /* check if the same words are enabled both target and current PG packet */ ++ if (((pTargetPkt->word_en & BIT(0)) == 0) && ++ ((pCurPkt->word_en & BIT(0)) == 0)) ++ match_word_en &= ~BIT(0); /* enable word 0 */ ++ if (((pTargetPkt->word_en & BIT(1)) == 0) && ++ ((pCurPkt->word_en & BIT(1)) == 0)) ++ match_word_en &= ~BIT(1); /* enable word 1 */ ++ if (((pTargetPkt->word_en & BIT(2)) == 0) && ++ ((pCurPkt->word_en & BIT(2)) == 0)) ++ match_word_en &= ~BIT(2); /* enable word 2 */ ++ if (((pTargetPkt->word_en & BIT(3)) == 0) && ++ ((pCurPkt->word_en & BIT(3)) == 0)) ++ match_word_en &= ~BIT(3); /* enable word 3 */ ++ ++ *pWden = match_word_en; ++ ++ if (match_word_en != 0xf) ++ return true; ++ else ++ return false; ++} ++ ++static bool hal_EfuseCheckIfDatafollowed(struct adapter *pAdapter, u8 word_cnts, u16 startAddr, bool bPseudoTest) ++{ ++ bool bRet = false; ++ u8 i, efuse_data; ++ ++ for (i = 0; i < (word_cnts * 2); i++) { ++ if (efuse_OneByteRead(pAdapter, (startAddr + i), &efuse_data, bPseudoTest) && (efuse_data != 0xFF)) ++ bRet = true; ++ } ++ return bRet; ++} ++ ++static bool hal_EfusePartialWriteCheck(struct adapter *pAdapter, u8 efuseType, u16 *pAddr, struct pgpkt *pTargetPkt, bool bPseudoTest) ++{ ++ bool bRet = false; ++ u8 i, efuse_data = 0, cur_header = 0; ++ u8 matched_wden = 0, badworden = 0; ++ u16 startAddr = 0, efuse_max_available_len = 0, efuse_max = 0; ++ struct pgpkt curPkt; ++ ++ EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (void *)&efuse_max_available_len, bPseudoTest); ++ EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&efuse_max, bPseudoTest); ++ ++ if (efuseType == EFUSE_WIFI) { ++ if (bPseudoTest) { ++ startAddr = (u16)(fakeEfuseUsedBytes % EFUSE_REAL_CONTENT_LEN); ++ } else { ++ rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr); ++ startAddr %= EFUSE_REAL_CONTENT_LEN; ++ } ++ } else { ++ if (bPseudoTest) ++ startAddr = (u16)(fakeBTEfuseUsedBytes % EFUSE_REAL_CONTENT_LEN); ++ else ++ startAddr = (u16)(BTEfuseUsedBytes % EFUSE_REAL_CONTENT_LEN); ++ } ++ ++ while (1) { ++ if (startAddr >= efuse_max_available_len) { ++ bRet = false; ++ break; ++ } ++ ++ if (efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data != 0xFF)) { ++ if (EXT_HEADER(efuse_data)) { ++ cur_header = efuse_data; ++ startAddr++; ++ efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); ++ if (ALL_WORDS_DISABLED(efuse_data)) { ++ bRet = false; ++ break; ++ } else { ++ curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); ++ curPkt.word_en = efuse_data & 0x0F; ++ } ++ } else { ++ cur_header = efuse_data; ++ curPkt.offset = (cur_header >> 4) & 0x0F; ++ curPkt.word_en = cur_header & 0x0F; ++ } ++ ++ curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); ++ /* if same header is found but no data followed */ ++ /* write some part of data followed by the header. */ ++ if ((curPkt.offset == pTargetPkt->offset) && ++ (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr + 1, bPseudoTest)) && ++ wordEnMatched(pTargetPkt, &curPkt, &matched_wden)) { ++ /* Here to write partial data */ ++ badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr + 1, matched_wden, pTargetPkt->data, bPseudoTest); ++ if (badworden != 0x0F) { ++ u32 PgWriteSuccess = 0; ++ /* if write fail on some words, write these bad words again */ ++ ++ PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); ++ ++ if (!PgWriteSuccess) { ++ bRet = false; /* write fail, return */ ++ break; ++ } ++ } ++ /* partial write ok, update the target packet for later use */ ++ for (i = 0; i < 4; i++) { ++ if ((matched_wden & (0x1 << i)) == 0) /* this word has been written */ ++ pTargetPkt->word_en |= (0x1 << i); /* disable the word */ ++ } ++ pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); ++ } ++ /* read from next header */ ++ startAddr = startAddr + (curPkt.word_cnts * 2) + 1; ++ } else { ++ /* not used header, 0xff */ ++ *pAddr = startAddr; ++ bRet = true; ++ break; ++ } ++ } ++ return bRet; ++} ++ ++static bool ++hal_EfusePgCheckAvailableAddr( ++ struct adapter *pAdapter, ++ u8 efuseType, ++ bool bPseudoTest ++ ) ++{ ++ u16 efuse_max_available_len = 0; ++ ++ /* Change to check TYPE_EFUSE_MAP_LEN , because 8188E raw 256, logic map over 256. */ ++ EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&efuse_max_available_len, false); ++ ++ if (Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= efuse_max_available_len) ++ return false; ++ return true; ++} ++ ++static void hal_EfuseConstructPGPkt(u8 offset, u8 word_en, u8 *pData, struct pgpkt *pTargetPkt) ++{ ++ memset((void *)pTargetPkt->data, 0xFF, sizeof(u8) * 8); ++ pTargetPkt->offset = offset; ++ pTargetPkt->word_en = word_en; ++ efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); ++ pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); ++} ++ ++static bool hal_EfusePgPacketWrite_8188e(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *pData, bool bPseudoTest) ++{ ++ struct pgpkt targetPkt; ++ u16 startAddr = 0; ++ u8 efuseType = EFUSE_WIFI; ++ ++ if (!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) ++ return false; ++ ++ hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); ++ ++ if (!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) ++ return false; ++ ++ if (!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) ++ return false; ++ ++ if (!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) ++ return false; ++ ++ return true; ++} ++ ++static int Hal_EfusePgPacketWrite_Pseudo(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ int ret; ++ ++ ret = hal_EfusePgPacketWrite_8188e(pAdapter, offset, word_en, data, bPseudoTest); ++ return ret; ++} ++ ++static int Hal_EfusePgPacketWrite(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ int ret = 0; ++ ret = hal_EfusePgPacketWrite_8188e(pAdapter, offset, word_en, data, bPseudoTest); ++ ++ return ret; ++} ++ ++static int rtl8188e_Efuse_PgPacketWrite(struct adapter *pAdapter, u8 offset, u8 word_en, u8 *data, bool bPseudoTest) ++{ ++ int ret; ++ ++ if (bPseudoTest) ++ ret = Hal_EfusePgPacketWrite_Pseudo(pAdapter, offset, word_en, data, bPseudoTest); ++ else ++ ret = Hal_EfusePgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); ++ return ret; ++} ++ ++static struct HAL_VERSION ReadChipVersion8188E(struct adapter *padapter) ++{ ++ u32 value32; ++ struct HAL_VERSION ChipVersion; ++ struct hal_data_8188e *pHalData; ++ ++ pHalData = GET_HAL_DATA(padapter); ++ ++ value32 = rtw_read32(padapter, REG_SYS_CFG); ++ ChipVersion.ICType = CHIP_8188E; ++ ChipVersion.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); ++ ++ ChipVersion.RFType = RF_TYPE_1T1R; ++ ChipVersion.VendorType = ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHIP_VENDOR_TSMC); ++ ChipVersion.CUTVersion = (value32 & CHIP_VER_RTL_MASK) >> CHIP_VER_RTL_SHIFT; /* IC version (CUT) */ ++ ++ /* For regulator mode. by tynli. 2011.01.14 */ ++ pHalData->RegulatorMode = ((value32 & TRP_BT_EN) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR); ++ ++ ChipVersion.ROMVer = 0; /* ROM code version. */ ++ pHalData->MultiFunc = RT_MULTI_FUNC_NONE; ++ ++ dump_chip_info(ChipVersion); ++ ++ pHalData->VersionID = ChipVersion; ++ ++ if (IS_1T2R(ChipVersion)) { ++ pHalData->rf_type = RF_1T2R; ++ pHalData->NumTotalRFPath = 2; ++ } else if (IS_2T2R(ChipVersion)) { ++ pHalData->rf_type = RF_2T2R; ++ pHalData->NumTotalRFPath = 2; ++ } else { ++ pHalData->rf_type = RF_1T1R; ++ pHalData->NumTotalRFPath = 1; ++ } ++ ++ MSG_88E("RF_Type is %x!!\n", pHalData->rf_type); ++ ++ return ChipVersion; ++} ++ ++static void rtl8188e_read_chip_version(struct adapter *padapter) ++{ ++ ReadChipVersion8188E(padapter); ++} ++ ++static void rtl8188e_GetHalODMVar(struct adapter *Adapter, enum hal_odm_variable eVariable, void *pValue1, bool bSet) ++{ ++} ++ ++static void rtl8188e_SetHalODMVar(struct adapter *Adapter, enum hal_odm_variable eVariable, void *pValue1, bool bSet) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct odm_dm_struct *podmpriv = &pHalData->odmpriv; ++ switch (eVariable) { ++ case HAL_ODM_STA_INFO: ++ { ++ struct sta_info *psta = (struct sta_info *)pValue1; ++ if (bSet) { ++ DBG_88E("### Set STA_(%d) info\n", psta->mac_id); ++ ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta); ++ ODM_RAInfo_Init(podmpriv, psta->mac_id); ++ } else { ++ DBG_88E("### Clean STA_(%d) info\n", psta->mac_id); ++ ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL); ++ } ++ } ++ break; ++ case HAL_ODM_P2P_STATE: ++ ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet); ++ break; ++ case HAL_ODM_WIFI_DISPLAY_STATE: ++ ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet); ++ break; ++ default: ++ break; ++ } ++} ++ ++void rtl8188e_clone_haldata(struct adapter *dst_adapter, struct adapter *src_adapter) ++{ ++ memcpy(dst_adapter->HalData, src_adapter->HalData, dst_adapter->hal_data_sz); ++} ++ ++void rtl8188e_start_thread(struct adapter *padapter) ++{ ++} ++ ++void rtl8188e_stop_thread(struct adapter *padapter) ++{ ++} ++ ++static void hal_notch_filter_8188e(struct adapter *adapter, bool enable) ++{ ++ if (enable) { ++ DBG_88E("Enable notch filter\n"); ++ rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + 1) | BIT(1)); ++ } else { ++ DBG_88E("Disable notch filter\n"); ++ rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + 1) & ~BIT(1)); ++ } ++} ++void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc) ++{ ++ pHalFunc->free_hal_data = &rtl8188e_free_hal_data; ++ ++ pHalFunc->dm_init = &rtl8188e_init_dm_priv; ++ pHalFunc->dm_deinit = &rtl8188e_deinit_dm_priv; ++ ++ pHalFunc->read_chip_version = &rtl8188e_read_chip_version; ++ ++ pHalFunc->set_bwmode_handler = &PHY_SetBWMode8188E; ++ pHalFunc->set_channel_handler = &PHY_SwChnl8188E; ++ ++ pHalFunc->hal_dm_watchdog = &rtl8188e_HalDmWatchDog; ++ ++ pHalFunc->Add_RateATid = &rtl8188e_Add_RateATid; ++ pHalFunc->run_thread = &rtl8188e_start_thread; ++ pHalFunc->cancel_thread = &rtl8188e_stop_thread; ++ ++ pHalFunc->AntDivBeforeLinkHandler = &AntDivBeforeLink8188E; ++ pHalFunc->AntDivCompareHandler = &AntDivCompare8188E; ++ pHalFunc->read_bbreg = &rtl8188e_PHY_QueryBBReg; ++ pHalFunc->write_bbreg = &rtl8188e_PHY_SetBBReg; ++ pHalFunc->read_rfreg = &rtl8188e_PHY_QueryRFReg; ++ pHalFunc->write_rfreg = &rtl8188e_PHY_SetRFReg; ++ ++ /* Efuse related function */ ++ pHalFunc->EfusePowerSwitch = &rtl8188e_EfusePowerSwitch; ++ pHalFunc->ReadEFuse = &rtl8188e_ReadEFuse; ++ pHalFunc->EFUSEGetEfuseDefinition = &rtl8188e_EFUSE_GetEfuseDefinition; ++ pHalFunc->EfuseGetCurrentSize = &rtl8188e_EfuseGetCurrentSize; ++ pHalFunc->Efuse_PgPacketRead = &rtl8188e_Efuse_PgPacketRead; ++ pHalFunc->Efuse_PgPacketWrite = &rtl8188e_Efuse_PgPacketWrite; ++ pHalFunc->Efuse_WordEnableDataWrite = &rtl8188e_Efuse_WordEnableDataWrite; ++ ++ pHalFunc->sreset_init_value = &sreset_init_value; ++ pHalFunc->sreset_reset_value = &sreset_reset_value; ++ pHalFunc->silentreset = &rtl8188e_silentreset_for_specific_platform; ++ pHalFunc->sreset_xmit_status_check = &rtl8188e_sreset_xmit_status_check; ++ pHalFunc->sreset_linked_status_check = &rtl8188e_sreset_linked_status_check; ++ pHalFunc->sreset_get_wifi_status = &sreset_get_wifi_status; ++ ++ pHalFunc->GetHalODMVarHandler = &rtl8188e_GetHalODMVar; ++ pHalFunc->SetHalODMVarHandler = &rtl8188e_SetHalODMVar; ++ ++ pHalFunc->IOL_exec_cmds_sync = &rtl8188e_IOL_exec_cmds_sync; ++ ++ pHalFunc->hal_notch_filter = &hal_notch_filter_8188e; ++} ++ ++u8 GetEEPROMSize8188E(struct adapter *padapter) ++{ ++ u8 size = 0; ++ u32 cr; ++ ++ cr = rtw_read16(padapter, REG_9346CR); ++ /* 6: EEPROM used is 93C46, 4: boot from E-Fuse. */ ++ size = (cr & BOOT_FROM_EEPROM) ? 6 : 4; ++ ++ MSG_88E("EEPROM type is %s\n", size == 4 ? "E-FUSE" : "93C46"); ++ ++ return size; ++} ++ ++/* */ ++/* */ ++/* LLT R/W/Init function */ ++/* */ ++/* */ ++static s32 _LLTWrite(struct adapter *padapter, u32 address, u32 data) ++{ ++ s32 status = _SUCCESS; ++ s32 count = 0; ++ u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); ++ u16 LLTReg = REG_LLT_INIT; ++ ++ rtw_write32(padapter, LLTReg, value); ++ ++ /* polling */ ++ do { ++ value = rtw_read32(padapter, LLTReg); ++ if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) ++ break; ++ ++ if (count > POLLING_LLT_THRESHOLD) { ++ status = _FAIL; ++ break; ++ } ++ } while (count++); ++ ++ return status; ++} ++ ++s32 InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy) ++{ ++ s32 status = _FAIL; ++ u32 i; ++ u32 Last_Entry_Of_TxPktBuf = LAST_ENTRY_OF_TX_PKT_BUFFER;/* 176, 22k */ ++ ++ if (rtw_IOL_applied(padapter)) { ++ status = iol_InitLLTTable(padapter, txpktbuf_bndy); ++ } else { ++ for (i = 0; i < (txpktbuf_bndy - 1); i++) { ++ status = _LLTWrite(padapter, i, i + 1); ++ if (_SUCCESS != status) ++ return status; ++ } ++ ++ /* end of list */ ++ status = _LLTWrite(padapter, (txpktbuf_bndy - 1), 0xFF); ++ if (_SUCCESS != status) ++ return status; ++ ++ /* Make the other pages as ring buffer */ ++ /* This ring buffer is used as beacon buffer if we config this MAC as two MAC transfer. */ ++ /* Otherwise used as local loopback buffer. */ ++ for (i = txpktbuf_bndy; i < Last_Entry_Of_TxPktBuf; i++) { ++ status = _LLTWrite(padapter, i, (i + 1)); ++ if (_SUCCESS != status) ++ return status; ++ } ++ ++ /* Let last entry point to the start entry of ring buffer */ ++ status = _LLTWrite(padapter, Last_Entry_Of_TxPktBuf, txpktbuf_bndy); ++ if (_SUCCESS != status) { ++ return status; ++ } ++ } ++ ++ return status; ++} ++ ++void ++Hal_InitPGData88E(struct adapter *padapter) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); ++ ++ if (!pEEPROM->bautoload_fail_flag) { /* autoload OK. */ ++ if (!is_boot_from_eeprom(padapter)) { ++ /* Read EFUSE real map to shadow. */ ++ EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, false); ++ } ++ } else {/* autoload fail */ ++ /* update to default value 0xFF */ ++ if (!is_boot_from_eeprom(padapter)) ++ EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, false); ++ } ++} ++ ++void ++Hal_EfuseParseIDCode88E( ++ struct adapter *padapter, ++ u8 *hwinfo ++ ) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); ++ u16 EEPROMId; ++ ++ /* Check 0x8129 again for making sure autoload status!! */ ++ EEPROMId = le16_to_cpu(*((__le16 *)hwinfo)); ++ if (EEPROMId != RTL_EEPROM_ID) { ++ pr_err("EEPROM ID(%#x) is invalid!!\n", EEPROMId); ++ pEEPROM->bautoload_fail_flag = true; ++ } else { ++ pEEPROM->bautoload_fail_flag = false; ++ } ++ ++ pr_info("EEPROM ID = 0x%04x\n", EEPROMId); ++} ++ ++static void Hal_ReadPowerValueFromPROM_8188E(struct txpowerinfo24g *pwrInfo24G, u8 *PROMContent, bool AutoLoadFail) ++{ ++ u32 rfPath, eeAddr = EEPROM_TX_PWR_INX_88E, group, TxCount = 0; ++ ++ memset(pwrInfo24G, 0, sizeof(struct txpowerinfo24g)); ++ ++ if (AutoLoadFail) { ++ for (rfPath = 0; rfPath < RF_PATH_MAX; rfPath++) { ++ /* 2.4G default value */ ++ for (group = 0; group < MAX_CHNL_GROUP_24G; group++) { ++ pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; ++ pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; ++ } ++ for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { ++ if (TxCount == 0) { ++ pwrInfo24G->BW20_Diff[rfPath][0] = EEPROM_DEFAULT_24G_HT20_DIFF; ++ pwrInfo24G->OFDM_Diff[rfPath][0] = EEPROM_DEFAULT_24G_OFDM_DIFF; ++ } else { ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ pwrInfo24G->BW40_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ pwrInfo24G->CCK_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ } ++ } ++ } ++ return; ++ } ++ ++ for (rfPath = 0; rfPath < RF_PATH_MAX; rfPath++) { ++ /* 2.4G default value */ ++ for (group = 0; group < MAX_CHNL_GROUP_24G; group++) { ++ pwrInfo24G->IndexCCK_Base[rfPath][group] = PROMContent[eeAddr++]; ++ if (pwrInfo24G->IndexCCK_Base[rfPath][group] == 0xFF) ++ pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; ++ } ++ for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) { ++ pwrInfo24G->IndexBW40_Base[rfPath][group] = PROMContent[eeAddr++]; ++ if (pwrInfo24G->IndexBW40_Base[rfPath][group] == 0xFF) ++ pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; ++ } ++ for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { ++ if (TxCount == 0) { ++ pwrInfo24G->BW40_Diff[rfPath][TxCount] = 0; ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_24G_HT20_DIFF; ++ } else { ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0xf0) >> 4; ++ if (pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_24G_OFDM_DIFF; ++ } else { ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0x0f); ++ if (pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ pwrInfo24G->CCK_Diff[rfPath][TxCount] = 0; ++ eeAddr++; ++ } else { ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->BW40_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ } else { ++ pwrInfo24G->BW40_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0xf0) >> 4; ++ if (pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ } else { ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0x0f); ++ if (pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ eeAddr++; ++ ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ } else { ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0xf0) >> 4; ++ if (pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ ++ if (PROMContent[eeAddr] == 0xFF) { ++ pwrInfo24G->CCK_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; ++ } else { ++ pwrInfo24G->CCK_Diff[rfPath][TxCount] = (PROMContent[eeAddr] & 0x0f); ++ if (pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT(3)) /* 4bit sign number to 8 bit sign number */ ++ pwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0; ++ } ++ eeAddr++; ++ } ++ } ++ } ++} ++ ++static void hal_get_chnl_group_88e(u8 chnl, u8 *group) ++{ ++ if (chnl < 3) /* Channel 1-2 */ ++ *group = 0; ++ else if (chnl < 6) /* Channel 3-5 */ ++ *group = 1; ++ else if (chnl < 9) /* Channel 6-8 */ ++ *group = 2; ++ else if (chnl < 12) /* Channel 9-11 */ ++ *group = 3; ++ else if (chnl < 14) /* Channel 12-13 */ ++ *group = 4; ++ else if (chnl == 14) /* Channel 14 */ ++ *group = 5; ++} ++ ++void Hal_ReadPowerSavingMode88E(struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ if (AutoLoadFail) { ++ padapter->pwrctrlpriv.bHWPowerdown = false; ++ padapter->pwrctrlpriv.bSupportRemoteWakeup = false; ++ } else { ++ /* hw power down mode selection , 0:rf-off / 1:power down */ ++ ++ if (padapter->registrypriv.hwpdn_mode == 2) ++ padapter->pwrctrlpriv.bHWPowerdown = (hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & BIT(4)); ++ else ++ padapter->pwrctrlpriv.bHWPowerdown = padapter->registrypriv.hwpdn_mode; ++ ++ /* decide hw if support remote wakeup function */ ++ /* if hw supported, 8051 (SIE) will generate WeakUP signal(D+/D- toggle) when autoresume */ ++ padapter->pwrctrlpriv.bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT(1)) ? true : false; ++ ++ DBG_88E("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) , bSupportRemoteWakeup(%x)\n", __func__, ++ padapter->pwrctrlpriv.bHWPwrPindetect, padapter->pwrctrlpriv.bHWPowerdown, padapter->pwrctrlpriv.bSupportRemoteWakeup); ++ ++ DBG_88E("### PS params => power_mgnt(%x), usbss_enable(%x) ###\n", padapter->registrypriv.power_mgnt, padapter->registrypriv.usbss_enable); ++ } ++} ++ ++void Hal_ReadTxPowerInfo88E(struct adapter *padapter, u8 *PROMContent, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct txpowerinfo24g pwrInfo24G; ++ u8 rfPath, ch, group; ++ u8 TxCount; ++ ++ Hal_ReadPowerValueFromPROM_8188E(&pwrInfo24G, PROMContent, AutoLoadFail); ++ ++ if (!AutoLoadFail) ++ pHalData->bTXPowerDataReadFromEEPORM = true; ++ ++ for (rfPath = 0; rfPath < pHalData->NumTotalRFPath; rfPath++) { ++ for (ch = 0; ch < CHANNEL_MAX_NUMBER; ch++) { ++ hal_get_chnl_group_88e(ch, &group); ++ ++ pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][group]; ++ if (ch == 14) ++ pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][4]; ++ else ++ pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group]; ++ ++ DBG_88E("======= Path %d, Channel %d =======\n", rfPath, ch); ++ DBG_88E("Index24G_CCK_Base[%d][%d] = 0x%x\n", rfPath, ch, pHalData->Index24G_CCK_Base[rfPath][ch]); ++ DBG_88E("Index24G_BW40_Base[%d][%d] = 0x%x\n", rfPath, ch, pHalData->Index24G_BW40_Base[rfPath][ch]); ++ } ++ for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { ++ pHalData->CCK_24G_Diff[rfPath][TxCount] = pwrInfo24G.CCK_Diff[rfPath][TxCount]; ++ pHalData->OFDM_24G_Diff[rfPath][TxCount] = pwrInfo24G.OFDM_Diff[rfPath][TxCount]; ++ pHalData->BW20_24G_Diff[rfPath][TxCount] = pwrInfo24G.BW20_Diff[rfPath][TxCount]; ++ pHalData->BW40_24G_Diff[rfPath][TxCount] = pwrInfo24G.BW40_Diff[rfPath][TxCount]; ++ DBG_88E("======= TxCount %d =======\n", TxCount); ++ DBG_88E("CCK_24G_Diff[%d][%d] = %d\n", rfPath, TxCount, pHalData->CCK_24G_Diff[rfPath][TxCount]); ++ DBG_88E("OFDM_24G_Diff[%d][%d] = %d\n", rfPath, TxCount, pHalData->OFDM_24G_Diff[rfPath][TxCount]); ++ DBG_88E("BW20_24G_Diff[%d][%d] = %d\n", rfPath, TxCount, pHalData->BW20_24G_Diff[rfPath][TxCount]); ++ DBG_88E("BW40_24G_Diff[%d][%d] = %d\n", rfPath, TxCount, pHalData->BW40_24G_Diff[rfPath][TxCount]); ++ } ++ } ++ ++ /* 2010/10/19 MH Add Regulator recognize for CU. */ ++ if (!AutoLoadFail) { ++ pHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_88E] & 0x7); /* bit0~2 */ ++ if (PROMContent[EEPROM_RF_BOARD_OPTION_88E] == 0xFF) ++ pHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION & 0x7); /* bit0~2 */ ++ } else { ++ pHalData->EEPROMRegulatory = 0; ++ } ++ DBG_88E("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); ++} ++ ++void Hal_EfuseParseXtal_8188E(struct adapter *pAdapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ ++ if (!AutoLoadFail) { ++ pHalData->CrystalCap = hwinfo[EEPROM_XTAL_88E]; ++ if (pHalData->CrystalCap == 0xFF) ++ pHalData->CrystalCap = EEPROM_Default_CrystalCap_88E; ++ } else { ++ pHalData->CrystalCap = EEPROM_Default_CrystalCap_88E; ++ } ++ DBG_88E("CrystalCap: 0x%2x\n", pHalData->CrystalCap); ++} ++ ++void Hal_EfuseParseBoardType88E(struct adapter *pAdapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ ++ if (!AutoLoadFail) ++ pHalData->BoardType = ((hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0xE0) >> 5); ++ else ++ pHalData->BoardType = 0; ++ DBG_88E("Board Type: 0x%2x\n", pHalData->BoardType); ++} ++ ++void Hal_EfuseParseEEPROMVer88E(struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ ++ if (!AutoLoadFail) { ++ pHalData->EEPROMVersion = hwinfo[EEPROM_VERSION_88E]; ++ if (pHalData->EEPROMVersion == 0xFF) ++ pHalData->EEPROMVersion = EEPROM_Default_Version; ++ } else { ++ pHalData->EEPROMVersion = 1; ++ } ++} ++ ++void rtl8188e_EfuseParseChnlPlan(struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ padapter->mlmepriv.ChannelPlan = ++ hal_com_get_channel_plan(padapter, ++ hwinfo ? hwinfo[EEPROM_ChannelPlan_88E] : 0xFF, ++ padapter->registrypriv.channel_plan, ++ RT_CHANNEL_DOMAIN_WORLD_WIDE_13, AutoLoadFail); ++ ++ DBG_88E("mlmepriv.ChannelPlan = 0x%02x\n", padapter->mlmepriv.ChannelPlan); ++} ++ ++void Hal_EfuseParseCustomerID88E(struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ ++ if (!AutoLoadFail) { ++ pHalData->EEPROMCustomerID = hwinfo[EEPROM_CUSTOMERID_88E]; ++ } else { ++ pHalData->EEPROMCustomerID = 0; ++ pHalData->EEPROMSubCustomerID = 0; ++ } ++ DBG_88E("EEPROM Customer ID: 0x%2x\n", pHalData->EEPROMCustomerID); ++} ++ ++void Hal_ReadAntennaDiversity88E(struct adapter *pAdapter, u8 *PROMContent, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ struct registry_priv *registry_par = &pAdapter->registrypriv; ++ ++ if (!AutoLoadFail) { ++ /* Antenna Diversity setting. */ ++ if (registry_par->antdiv_cfg == 2) { /* 2:By EFUSE */ ++ pHalData->AntDivCfg = (PROMContent[EEPROM_RF_BOARD_OPTION_88E] & 0x18) >> 3; ++ if (PROMContent[EEPROM_RF_BOARD_OPTION_88E] == 0xFF) ++ pHalData->AntDivCfg = (EEPROM_DEFAULT_BOARD_OPTION & 0x18) >> 3; ++ } else { ++ pHalData->AntDivCfg = registry_par->antdiv_cfg; /* 0:OFF , 1:ON, 2:By EFUSE */ ++ } ++ ++ if (registry_par->antdiv_type == 0) { ++ /* If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead. */ ++ pHalData->TRxAntDivType = PROMContent[EEPROM_RF_ANTENNA_OPT_88E]; ++ if (pHalData->TRxAntDivType == 0xFF) ++ pHalData->TRxAntDivType = CG_TRX_HW_ANTDIV; /* For 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) */ ++ } else { ++ pHalData->TRxAntDivType = registry_par->antdiv_type; ++ } ++ ++ if (pHalData->TRxAntDivType == CG_TRX_HW_ANTDIV || pHalData->TRxAntDivType == CGCS_RX_HW_ANTDIV) ++ pHalData->AntDivCfg = 1; /* 0xC1[3] is ignored. */ ++ } else { ++ pHalData->AntDivCfg = 0; ++ pHalData->TRxAntDivType = pHalData->TRxAntDivType; /* The value in the driver setting of device manager. */ ++ } ++ DBG_88E("EEPROM : AntDivCfg = %x, TRxAntDivType = %x\n", pHalData->AntDivCfg, pHalData->TRxAntDivType); ++} ++ ++void Hal_ReadThermalMeter_88E(struct adapter *Adapter, u8 *PROMContent, bool AutoloadFail) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ /* ThermalMeter from EEPROM */ ++ if (!AutoloadFail) ++ pHalData->EEPROMThermalMeter = PROMContent[EEPROM_THERMAL_METER_88E]; ++ else ++ pHalData->EEPROMThermalMeter = EEPROM_Default_ThermalMeter_88E; ++ ++ if (pHalData->EEPROMThermalMeter == 0xff || AutoloadFail) { ++ pHalData->bAPKThermalMeterIgnore = true; ++ pHalData->EEPROMThermalMeter = EEPROM_Default_ThermalMeter_88E; ++ } ++ DBG_88E("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter); ++} ++ ++void Hal_InitChannelPlan(struct adapter *padapter) ++{ ++} ++ ++bool HalDetectPwrDownMode88E(struct adapter *Adapter) ++{ ++ u8 tmpvalue = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; ++ ++ EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_FEATURE_OPTION_88E, (u32 *)&tmpvalue); ++ ++ /* 2010/08/25 MH INF priority > PDN Efuse value. */ ++ if (tmpvalue & BIT(4) && pwrctrlpriv->reg_pdnmode) ++ pHalData->pwrdown = true; ++ else ++ pHalData->pwrdown = false; ++ ++ DBG_88E("HalDetectPwrDownMode(): PDN =%d\n", pHalData->pwrdown); ++ ++ return pHalData->pwrdown; ++} /* HalDetectPwrDownMode */ ++ ++/* This function is used only for 92C to set REG_BCN_CTRL(0x550) register. */ ++/* We just reserve the value of the register in variable pHalData->RegBcnCtrlVal and then operate */ ++/* the value of the register via atomic operation. */ ++/* This prevents from race condition when setting this register. */ ++/* The value of pHalData->RegBcnCtrlVal is initialized in HwConfigureRTL8192CE() function. */ ++ ++void SetBcnCtrlReg(struct adapter *padapter, u8 SetBits, u8 ClearBits) ++{ ++ struct hal_data_8188e *pHalData; ++ ++ pHalData = GET_HAL_DATA(padapter); ++ ++ pHalData->RegBcnCtrlVal |= SetBits; ++ pHalData->RegBcnCtrlVal &= ~ClearBits; ++ ++ rtw_write8(padapter, REG_BCN_CTRL, (u8)pHalData->RegBcnCtrlVal); ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_mp.c b/drivers/staging/r8188eu/hal/rtl8188e_mp.c +new file mode 100644 +index 000000000000..fc13db705511 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_mp.c +@@ -0,0 +1,798 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_MP_C_ ++ ++#include "../include/drv_types.h" ++#include "../include/rtw_mp.h" ++#include "../include/rtl8188e_hal.h" ++#include "../include/rtl8188e_dm.h" ++ ++s32 Hal_SetPowerTracking(struct adapter *padapter, u8 enable) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct odm_dm_struct *pDM_Odm = &pHalData->odmpriv; ++ ++ if (!netif_running(padapter->pnetdev)) ++ return _FAIL; ++ ++ if (!check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE)) ++ return _FAIL; ++ ++ if (enable) ++ pDM_Odm->RFCalibrateInfo.bTXPowerTracking = true; ++ else ++ pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = false; ++ ++ return _SUCCESS; ++} ++ ++void Hal_GetPowerTracking(struct adapter *padapter, u8 *enable) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct odm_dm_struct *pDM_Odm = &pHalData->odmpriv; ++ ++ *enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: mpt_SwitchRfSetting ++ * ++ * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. ++ * ++ * Input: struct adapter * pAdapter ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. ++ * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. ++ * ++ *---------------------------------------------------------------------------*/ ++void Hal_mpt_SwitchRfSetting(struct adapter *pAdapter) ++{ ++ struct mp_priv *pmp = &pAdapter->mppriv; ++ ++ /* <20120525, Kordan> Dynamic mechanism for APK, asked by Dennis. */ ++ pmp->MptCtx.backup0x52_RF_A = (u8)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); ++ pmp->MptCtx.backup0x52_RF_B = (u8)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0); ++ PHY_SetRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0, 0xD); ++ PHY_SetRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0, 0xD); ++} ++/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ ++ ++/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ ++void Hal_MPT_CCKTxPowerAdjust(struct adapter *Adapter, bool bInCH14) ++{ ++ u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; ++ u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; ++ u8 i; ++ ++ /* get current cck swing value and check 0xa22 & 0xa23 later to match the table. */ ++ CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); ++ ++ if (!bInCH14) { ++ /* Readback the current bb cck swing value and compare with the table to */ ++ /* get the current swing index */ ++ for (i = 0; i < CCK_TABLE_SIZE; i++) { ++ if (((CurrCCKSwingVal & 0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && ++ (((CurrCCKSwingVal & 0xff00) >> 8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) { ++ CCKSwingIndex = i; ++ break; ++ } ++ } ++ ++ /* Write 0xa22 0xa23 */ ++ TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + ++ (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1] << 8); ++ ++ /* Write 0xa24 ~ 0xa27 */ ++ TempVal2 = 0; ++ TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + ++ (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3] << 8) + ++ (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4] << 16) + ++ (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5] << 24); ++ ++ /* Write 0xa28 0xa29 */ ++ TempVal3 = 0; ++ TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + ++ (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7] << 8); ++ } else { ++ for (i = 0; i < CCK_TABLE_SIZE; i++) { ++ if (((CurrCCKSwingVal & 0xff) == (u32)CCKSwingTable_Ch14[i][0]) && ++ (((CurrCCKSwingVal & 0xff00) >> 8) == (u32)CCKSwingTable_Ch14[i][1])) { ++ CCKSwingIndex = i; ++ break; ++ } ++ } ++ ++ /* Write 0xa22 0xa23 */ ++ TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + ++ (CCKSwingTable_Ch14[CCKSwingIndex][1] << 8); ++ ++ /* Write 0xa24 ~ 0xa27 */ ++ TempVal2 = 0; ++ TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + ++ (CCKSwingTable_Ch14[CCKSwingIndex][3] << 8) + ++ (CCKSwingTable_Ch14[CCKSwingIndex][4] << 16) + ++ (CCKSwingTable_Ch14[CCKSwingIndex][5] << 24); ++ ++ /* Write 0xa28 0xa29 */ ++ TempVal3 = 0; ++ TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + ++ (CCKSwingTable_Ch14[CCKSwingIndex][7] << 8); ++ } ++ ++ write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); ++ write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); ++ write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); ++} ++ ++void Hal_MPT_CCKTxPowerAdjustbyIndex(struct adapter *pAdapter, bool beven) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ struct mpt_context *pMptCtx = &pAdapter->mppriv.MptCtx; ++ struct odm_dm_struct *pDM_Odm = &pHalData->odmpriv; ++ s32 TempCCk; ++ u8 CCK_index, CCK_index_old = 0; ++ u8 Action = 0; /* 0: no action, 1: even->odd, 2:odd->even */ ++ s32 i = 0; ++ ++ if (!IS_92C_SERIAL(pHalData->VersionID)) ++ return; ++ if (beven && !pMptCtx->bMptIndexEven) { ++ /* odd->even */ ++ Action = 2; ++ pMptCtx->bMptIndexEven = true; ++ } else if (!beven && pMptCtx->bMptIndexEven) { ++ /* even->odd */ ++ Action = 1; ++ pMptCtx->bMptIndexEven = false; ++ } ++ ++ if (Action != 0) { ++ /* Query CCK default setting From 0xa24 */ ++ TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; ++ for (i = 0; i < CCK_TABLE_SIZE; i++) { ++ if (pDM_Odm->RFCalibrateInfo.bCCKinCH14) { ++ if (!memcmp((void *)&TempCCk, (void *)&CCKSwingTable_Ch14[i][2], 4)) { ++ CCK_index_old = (u8)i; ++ break; ++ } ++ } else { ++ if (!memcmp((void *)&TempCCk, (void *)&CCKSwingTable_Ch1_Ch13[i][2], 4)) { ++ CCK_index_old = (u8)i; ++ break; ++ } ++ } ++ } ++ ++ if (Action == 1) ++ CCK_index = CCK_index_old - 1; ++ else ++ CCK_index = CCK_index_old + 1; ++ ++ /* Adjust CCK according to gain index */ ++ if (!pDM_Odm->RFCalibrateInfo.bCCKinCH14) { ++ rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); ++ rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); ++ rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); ++ rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); ++ rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); ++ rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); ++ rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); ++ rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); ++ } else { ++ rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); ++ rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); ++ rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); ++ rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); ++ rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); ++ rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); ++ rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); ++ rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); ++ } ++ } ++} ++/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ ++ ++/* ++ * SetChannel ++ * Description ++ * Use H2C command to change channel, ++ * not only modify rf register, but also other setting need to be done. ++ */ ++void Hal_SetChannel(struct adapter *pAdapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ struct mp_priv *pmp = &pAdapter->mppriv; ++ struct odm_dm_struct *pDM_Odm = &pHalData->odmpriv; ++ u8 eRFPath; ++ u8 channel = pmp->channel; ++ ++ /* set RF channel register */ ++ for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) ++ _write_rfreg(pAdapter, eRFPath, ODM_CHANNEL, 0x3FF, channel); ++ Hal_mpt_SwitchRfSetting(pAdapter); ++ ++ SelectChannel(pAdapter, channel); ++ ++ if (pHalData->CurrentChannel == 14 && !pDM_Odm->RFCalibrateInfo.bCCKinCH14) { ++ pDM_Odm->RFCalibrateInfo.bCCKinCH14 = true; ++ Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); ++ } else if (pHalData->CurrentChannel != 14 && pDM_Odm->RFCalibrateInfo.bCCKinCH14) { ++ pDM_Odm->RFCalibrateInfo.bCCKinCH14 = false; ++ Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); ++ } ++} ++ ++/* ++ * Notice ++ * Switch bandwitdth may change center frequency(channel) ++ */ ++void Hal_SetBandwidth(struct adapter *pAdapter) ++{ ++ struct mp_priv *pmp = &pAdapter->mppriv; ++ ++ SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); ++ Hal_mpt_SwitchRfSetting(pAdapter); ++} ++ ++void Hal_SetCCKTxPower(struct adapter *pAdapter, u8 *TxPower) ++{ ++ u32 tmpval = 0; ++ ++ /* rf-A cck tx power */ ++ write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); ++ tmpval = (TxPower[RF_PATH_A] << 16) | (TxPower[RF_PATH_A] << 8) | TxPower[RF_PATH_A]; ++ write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); ++ ++ /* rf-B cck tx power */ ++ write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); ++ tmpval = (TxPower[RF_PATH_B] << 16) | (TxPower[RF_PATH_B] << 8) | TxPower[RF_PATH_B]; ++ write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); ++} ++ ++void Hal_SetOFDMTxPower(struct adapter *pAdapter, u8 *TxPower) ++{ ++ u32 TxAGC = 0; ++ u8 tmpval = 0; ++ ++ /* HT Tx-rf(A) */ ++ tmpval = TxPower[RF_PATH_A]; ++ TxAGC = (tmpval << 24) | (tmpval << 16) | (tmpval << 8) | tmpval; ++ ++ write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); ++ ++ /* HT Tx-rf(B) */ ++ tmpval = TxPower[RF_PATH_B]; ++ TxAGC = (tmpval << 24) | (tmpval << 16) | (tmpval << 8) | tmpval; ++ ++ write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); ++ write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); ++} ++ ++void Hal_SetAntennaPathPower(struct adapter *pAdapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ u8 TxPowerLevel[RF_PATH_MAX]; ++ u8 rfPath; ++ ++ TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; ++ TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; ++ ++ switch (pAdapter->mppriv.antenna_tx) { ++ case ANTENNA_A: ++ default: ++ rfPath = RF_PATH_A; ++ break; ++ case ANTENNA_B: ++ rfPath = RF_PATH_B; ++ break; ++ case ANTENNA_C: ++ rfPath = RF_PATH_C; ++ break; ++ } ++ ++ switch (pHalData->rf_chip) { ++ case RF_8225: ++ case RF_8256: ++ case RF_6052: ++ Hal_SetCCKTxPower(pAdapter, TxPowerLevel); ++ if (pAdapter->mppriv.rateidx < MPT_RATE_6M) /* CCK rate */ ++ Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath] % 2 == 0); ++ Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); ++ break; ++ default: ++ break; ++ } ++} ++ ++void Hal_SetTxPower(struct adapter *pAdapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ u8 TxPower = pAdapter->mppriv.txpoweridx; ++ u8 TxPowerLevel[RF_PATH_MAX]; ++ u8 rf, rfPath; ++ ++ for (rf = 0; rf < RF_PATH_MAX; rf++) ++ TxPowerLevel[rf] = TxPower; ++ ++ switch (pAdapter->mppriv.antenna_tx) { ++ case ANTENNA_A: ++ default: ++ rfPath = RF_PATH_A; ++ break; ++ case ANTENNA_B: ++ rfPath = RF_PATH_B; ++ break; ++ case ANTENNA_C: ++ rfPath = RF_PATH_C; ++ break; ++ } ++ ++ switch (pHalData->rf_chip) { ++ /* 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! */ ++ /* We should call normal driver API later!! */ ++ case RF_8225: ++ case RF_8256: ++ case RF_6052: ++ Hal_SetCCKTxPower(pAdapter, TxPowerLevel); ++ if (pAdapter->mppriv.rateidx < MPT_RATE_6M) /* CCK rate */ ++ Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath] % 2 == 0); ++ Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); ++ break; ++ default: ++ break; ++ } ++} ++ ++void Hal_SetDataRate(struct adapter *pAdapter) ++{ ++ Hal_mpt_SwitchRfSetting(pAdapter); ++} ++ ++void Hal_SetAntenna(struct adapter *pAdapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ ++ struct ant_sel_ofdm *p_ofdm_tx; /* OFDM Tx register */ ++ struct ant_sel_cck *p_cck_txrx; ++ u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; ++ u8 chgTx = 0, chgRx = 0; ++ u32 r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; ++ ++ p_ofdm_tx = (struct ant_sel_ofdm *)&r_ant_select_ofdm_val; ++ p_cck_txrx = (struct ant_sel_cck *)&r_ant_select_cck_val; ++ ++ p_ofdm_tx->r_ant_ht1 = 0x1; ++ p_ofdm_tx->r_ant_ht2 = 0x2; /* Second TX RF path is A */ ++ p_ofdm_tx->r_ant_non_ht = 0x3; /* 0x1+0x2=0x3 */ ++ ++ switch (pAdapter->mppriv.antenna_tx) { ++ case ANTENNA_A: ++ p_ofdm_tx->r_tx_antenna = 0x1; ++ r_ofdm_tx_en_val = 0x1; ++ p_ofdm_tx->r_ant_l = 0x1; ++ p_ofdm_tx->r_ant_ht_s1 = 0x1; ++ p_ofdm_tx->r_ant_non_ht_s1 = 0x1; ++ p_cck_txrx->r_ccktx_enable = 0x8; ++ chgTx = 1; ++ ++ /* From SD3 Willis suggestion !!! Set RF A=TX and B as standby */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); ++ r_ofdm_tx_en_val = 0x3; ++ ++ /* Power save */ ++ ++ /* We need to close RFB by SW control */ ++ if (pHalData->rf_type == RF_2T2R) { ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(10), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(26), 1); ++ PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT(10), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(1), 1); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(17), 0); ++ } ++ break; ++ case ANTENNA_B: ++ p_ofdm_tx->r_tx_antenna = 0x2; ++ r_ofdm_tx_en_val = 0x2; ++ p_ofdm_tx->r_ant_l = 0x2; ++ p_ofdm_tx->r_ant_ht_s1 = 0x2; ++ p_ofdm_tx->r_ant_non_ht_s1 = 0x2; ++ p_cck_txrx->r_ccktx_enable = 0x4; ++ chgTx = 1; ++ /* From SD3 Willis suggestion !!! Set RF A as standby */ ++ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); ++ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); ++ ++ /* Power save */ ++ /* cosa r_ant_select_ofdm_val = 0x22222222; */ ++ ++ /* 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. */ ++ /* 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control */ ++ if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) { ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(10), 1); ++ PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT(10), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(26), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(1), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(17), 1); ++ } ++ break; ++ case ANTENNA_AB: /* For 8192S */ ++ p_ofdm_tx->r_tx_antenna = 0x3; ++ r_ofdm_tx_en_val = 0x3; ++ p_ofdm_tx->r_ant_l = 0x3; ++ p_ofdm_tx->r_ant_ht_s1 = 0x3; ++ p_ofdm_tx->r_ant_non_ht_s1 = 0x3; ++ p_cck_txrx->r_ccktx_enable = 0xC; ++ chgTx = 1; ++ ++ /* From SD3 Willis suggestion !!! Set RF B as standby */ ++ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); ++ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); ++ ++ /* Disable Power save */ ++ /* cosa r_ant_select_ofdm_val = 0x3321333; */ ++ /* 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control */ ++ if (pHalData->rf_type == RF_2T2R) { ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(10), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT(26), 0); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(1), 1); ++ PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT(17), 1); ++ } ++ break; ++ default: ++ break; ++ } ++ ++ /* r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D */ ++ /* r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D */ ++ /* r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D */ ++ switch (pAdapter->mppriv.antenna_rx) { ++ case ANTENNA_A: ++ r_rx_antenna_ofdm = 0x1; /* A */ ++ p_cck_txrx->r_cckrx_enable = 0x0; /* default: A */ ++ p_cck_txrx->r_cckrx_enable_2 = 0x0; /* option: A */ ++ chgRx = 1; ++ break; ++ case ANTENNA_B: ++ r_rx_antenna_ofdm = 0x2; /* B */ ++ p_cck_txrx->r_cckrx_enable = 0x1; /* default: B */ ++ p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option: B */ ++ chgRx = 1; ++ break; ++ case ANTENNA_AB: ++ r_rx_antenna_ofdm = 0x3; /* AB */ ++ p_cck_txrx->r_cckrx_enable = 0x0; /* default:A */ ++ p_cck_txrx->r_cckrx_enable_2 = 0x1; /* option:B */ ++ chgRx = 1; ++ break; ++ default: ++ break; ++ } ++ ++ if (chgTx && chgRx) { ++ switch (pHalData->rf_chip) { ++ case RF_8225: ++ case RF_8256: ++ case RF_6052: ++ /* r_ant_sel_cck_val = r_ant_select_cck_val; */ ++ PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); /* OFDM Tx */ ++ PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); /* OFDM Tx */ ++ PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); /* OFDM Rx */ ++ PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); /* OFDM Rx */ ++ PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val); /* CCK TxRx */ ++ ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++s32 Hal_SetThermalMeter(struct adapter *pAdapter, u8 target_ther) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ ++ if (!netif_running(pAdapter->pnetdev)) ++ return _FAIL; ++ ++ if (!check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE)) ++ return _FAIL; ++ ++ target_ther &= 0xff; ++ if (target_ther < 0x07) ++ target_ther = 0x07; ++ else if (target_ther > 0x1d) ++ target_ther = 0x1d; ++ ++ pHalData->EEPROMThermalMeter = target_ther; ++ ++ return _SUCCESS; ++} ++ ++void Hal_TriggerRFThermalMeter(struct adapter *pAdapter) ++{ ++ _write_rfreg(pAdapter, RF_PATH_A, RF_T_METER_88E, BIT(17) | BIT(16), 0x03); ++} ++ ++u8 Hal_ReadRFThermalMeter(struct adapter *pAdapter) ++{ ++ u32 ThermalValue = 0; ++ ++ ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER_88E, 0xfc00); ++ return (u8)ThermalValue; ++} ++ ++void Hal_GetThermalMeter(struct adapter *pAdapter, u8 *value) ++{ ++ Hal_TriggerRFThermalMeter(pAdapter); ++ msleep(1000); ++ *value = Hal_ReadRFThermalMeter(pAdapter); ++} ++ ++void Hal_SetSingleCarrierTx(struct adapter *pAdapter, u8 bStart) ++{ ++ pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; ++ if (bStart) { ++ /* Start Single Carrier. */ ++ /* 1. if OFDM block on? */ ++ if (!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);/* set OFDM block on */ ++ ++ /* 2. set CCK test mode off, set to CCK normal mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); ++ /* 3. turn on scramble setting */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); ++ /* 4. Turn On Single Carrier Tx and turn off the other test modes. */ ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ /* for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); ++ } else { ++ /* Stop Single Carrier. */ ++ /* Turn off all test modes. */ ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ msleep(10); ++ ++ /* BB Reset */ ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); ++ ++ /* Stop for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); ++ } ++} ++ ++void Hal_SetSingleToneTx(struct adapter *pAdapter, u8 bStart) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(pAdapter); ++ bool is92C = IS_92C_SERIAL(pHalData->VersionID); ++ ++ u8 rfPath; ++ u32 reg58 = 0x0; ++ switch (pAdapter->mppriv.antenna_tx) { ++ case ANTENNA_A: ++ default: ++ rfPath = RF_PATH_A; ++ break; ++ case ANTENNA_B: ++ rfPath = RF_PATH_B; ++ break; ++ case ANTENNA_C: ++ rfPath = RF_PATH_C; ++ break; ++ } ++ ++ pAdapter->mppriv.MptCtx.bSingleTone = bStart; ++ if (bStart) { ++ /* Start Single Tone. */ ++ /* <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu) */ ++ if (IS_HARDWARE_TYPE_8188E(pAdapter)) { ++ reg58 = PHY_QueryRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask); ++ reg58 &= 0xFFFFFFF0; ++ reg58 += 2; ++ PHY_SetRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, reg58); ++ } ++ PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); ++ PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); ++ ++ if (is92C) { ++ _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT(19), 0x01); ++ rtw_usleep_os(100); ++ if (rfPath == RF_PATH_A) ++ write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); /* PAD all on. */ ++ else if (rfPath == RF_PATH_B) ++ write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); /* PAD all on. */ ++ write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); /* PAD all on. */ ++ rtw_usleep_os(100); ++ } else { ++ write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); ++ rtw_usleep_os(100); ++ write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); /* PAD all on. */ ++ rtw_usleep_os(100); ++ } ++ ++ /* for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); ++ ++ } else { ++ /* Stop Single Tone. */ ++ /* <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu) */ ++ /* <20120326, Kordan> Only in single tone mode. (asked by Edlu) */ ++ if (IS_HARDWARE_TYPE_8188E(pAdapter)) { ++ reg58 = PHY_QueryRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask); ++ reg58 &= 0xFFFFFFF0; ++ PHY_SetRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, reg58); ++ } ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); ++ if (is92C) { ++ _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT(19), 0x00); ++ rtw_usleep_os(100); ++ write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); /* PAD all on. */ ++ write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); /* PAD all on. */ ++ rtw_usleep_os(100); ++ } else { ++ write_rfreg(pAdapter, rfPath, 0x21, 0x54000); ++ rtw_usleep_os(100); ++ write_rfreg(pAdapter, rfPath, 0x00, 0x30000); /* PAD all on. */ ++ rtw_usleep_os(100); ++ } ++ ++ /* Stop for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); ++ } ++} ++ ++void Hal_SetCarrierSuppressionTx(struct adapter *pAdapter, u8 bStart) ++{ ++ pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; ++ if (bStart) { ++ /* Start Carrier Suppression. */ ++ if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) { ++ /* 1. if CCK block on? */ ++ if (!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);/* set CCK block on */ ++ ++ /* Turn Off All Test Mode */ ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); /* transmit mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); /* turn off scramble setting */ ++ ++ /* Set CCK Tx Test Rate */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); /* Set FTxRate to 1Mbps */ ++ } ++ ++ /* for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); ++ } else { ++ /* Stop Carrier Suppression. */ ++ if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) { ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); /* normal mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); /* turn on scramble setting */ ++ ++ /* BB Reset */ ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); ++ } ++ ++ /* Stop for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); ++ } ++} ++ ++void Hal_SetCCKContinuousTx(struct adapter *pAdapter, u8 bStart) ++{ ++ u32 cckrate; ++ ++ if (bStart) { ++ /* 1. if CCK block on? */ ++ if (!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);/* set CCK block on */ ++ ++ /* Turn Off All Test Mode */ ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ /* Set CCK Tx Test Rate */ ++ cckrate = pAdapter->mppriv.rateidx; ++ write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); /* transmit mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); /* turn on scramble setting */ ++ ++ /* for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); ++ } else { ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); /* normal mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); /* turn on scramble setting */ ++ ++ /* BB Reset */ ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); ++ ++ /* Stop for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); ++ } ++ ++ pAdapter->mppriv.MptCtx.bCckContTx = bStart; ++ pAdapter->mppriv.MptCtx.bOfdmContTx = false; ++} /* mpt_StartCckContTx */ ++ ++void Hal_SetOFDMContinuousTx(struct adapter *pAdapter, u8 bStart) ++{ ++ if (bStart) { ++ /* 1. if OFDM block on? */ ++ if (!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) ++ write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);/* set OFDM block on */ ++ ++ /* 2. set CCK test mode off, set to CCK normal mode */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); ++ ++ /* 3. turn on scramble setting */ ++ write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); ++ /* 4. Turn On Continue Tx and turn off the other test modes. */ ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ ++ /* for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); ++ ++ } else { ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); ++ write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); ++ /* Delay 10 ms */ ++ msleep(10); ++ /* BB Reset */ ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); ++ write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); ++ ++ /* Stop for dynamic set Power index. */ ++ write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); ++ write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); ++ } ++ ++ pAdapter->mppriv.MptCtx.bCckContTx = false; ++ pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; ++} /* mpt_StartOfdmContTx */ ++ ++void Hal_SetContinuousTx(struct adapter *pAdapter, u8 bStart) ++{ ++ pAdapter->mppriv.MptCtx.bStartContTx = bStart; ++ if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) ++ Hal_SetCCKContinuousTx(pAdapter, bStart); ++ else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && ++ (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) ++ Hal_SetOFDMContinuousTx(pAdapter, bStart); ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +new file mode 100644 +index 000000000000..30a9dca8f453 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +@@ -0,0 +1,1105 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_PHYCFG_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_iol.h" ++#include "../include/rtl8188e_hal.h" ++ ++/*---------------------------Define Local Constant---------------------------*/ ++/* Channel switch:The size of command tables for switch channel*/ ++#define MAX_PRECMD_CNT 16 ++#define MAX_RFDEPENDCMD_CNT 16 ++#define MAX_POSTCMD_CNT 16 ++ ++#define MAX_DOZE_WAITING_TIMES_9x 64 ++ ++/*---------------------------Define Local Constant---------------------------*/ ++ ++/*------------------------Define global variable-----------------------------*/ ++ ++/*------------------------Define local variable------------------------------*/ ++ ++/*--------------------Define export function prototype-----------------------*/ ++/* Please refer to header file */ ++/*--------------------Define export function prototype-----------------------*/ ++ ++/*----------------------------Function Body----------------------------------*/ ++/* */ ++/* 1. BB register R/W API */ ++/* */ ++ ++/** ++* Function: phy_CalculateBitShift ++* ++* OverView: Get shifted position of the BitMask ++* ++* Input: ++* u32 BitMask, ++* ++* Output: none ++* Return: u32 Return the shift bit bit position of the mask ++*/ ++static u32 phy_CalculateBitShift(u32 BitMask) ++{ ++ u32 i; ++ ++ for (i = 0; i <= 31; i++) { ++ if (((BitMask >> i) & 0x1) == 1) ++ break; ++ } ++ return i; ++} ++ ++/** ++* Function: PHY_QueryBBReg ++* ++* OverView: Read "sepcific bits" from BB register ++* ++* Input: ++* struct adapter *Adapter, ++* u32 RegAddr, The target address to be readback ++* u32 BitMask The target bit position in the target address ++* to be readback ++* Output: None ++* Return: u32 Data The readback register value ++* Note: This function is equal to "GetRegSetting" in PHY programming guide ++*/ ++u32 ++rtl8188e_PHY_QueryBBReg( ++ struct adapter *Adapter, ++ u32 RegAddr, ++ u32 BitMask ++ ) ++{ ++ u32 ReturnValue = 0, OriginalValue, BitShift; ++ ++ OriginalValue = rtw_read32(Adapter, RegAddr); ++ BitShift = phy_CalculateBitShift(BitMask); ++ ReturnValue = (OriginalValue & BitMask) >> BitShift; ++ return ReturnValue; ++} ++ ++/** ++* Function: PHY_SetBBReg ++* ++* OverView: Write "Specific bits" to BB register (page 8~) ++* ++* Input: ++* struct adapter *Adapter, ++* u32 RegAddr, The target address to be modified ++* u32 BitMask The target bit position in the target address ++* to be modified ++* u32 Data The new register value in the target bit position ++* of the target address ++* ++* Output: None ++* Return: None ++* Note: This function is equal to "PutRegSetting" in PHY programming guide ++*/ ++ ++void rtl8188e_PHY_SetBBReg(struct adapter *Adapter, u32 RegAddr, u32 BitMask, u32 Data) ++{ ++ u32 OriginalValue, BitShift; ++ ++ if (BitMask != bMaskDWord) { /* if not "double word" write */ ++ OriginalValue = rtw_read32(Adapter, RegAddr); ++ BitShift = phy_CalculateBitShift(BitMask); ++ Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); ++ } ++ ++ rtw_write32(Adapter, RegAddr, Data); ++} ++ ++/* */ ++/* 2. RF register R/W API */ ++/* */ ++/** ++* Function: phy_RFSerialRead ++* ++* OverView: Read regster from RF chips ++* ++* Input: ++* struct adapter *Adapter, ++* enum rf_radio_path eRFPath, Radio path of A/B/C/D ++* u32 Offset, The target address to be read ++* ++* Output: None ++* Return: u32 reback value ++* Note: Threre are three types of serial operations: ++* 1. Software serial write ++* 2. Hardware LSSI-Low Speed Serial Interface ++* 3. Hardware HSSI-High speed ++* serial write. Driver need to implement (1) and (2). ++* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() ++*/ ++static u32 ++phy_RFSerialRead( ++ struct adapter *Adapter, ++ enum rf_radio_path eRFPath, ++ u32 Offset ++ ) ++{ ++ u32 retValue = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct bb_reg_def *pPhyReg = &pHalData->PHYRegDef[eRFPath]; ++ u32 NewOffset; ++ u32 tmplong, tmplong2; ++ u8 RfPiEnable = 0; ++ /* */ ++ /* Make sure RF register offset is correct */ ++ /* */ ++ Offset &= 0xff; ++ ++ /* */ ++ /* Switch page for 8256 RF IC */ ++ /* */ ++ NewOffset = Offset; ++ ++ /* For 92S LSSI Read RFLSSIRead */ ++ /* For RF A/B write 0x824/82c(does not work in the future) */ ++ /* We must use 0x824 for RF A and B to execute read trigger */ ++ tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); ++ if (eRFPath == RF_PATH_A) ++ tmplong2 = tmplong; ++ else ++ tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); ++ ++ tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge; /* T65 RF */ ++ ++ PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong & (~bLSSIReadEdge)); ++ udelay(10);/* PlatformStallExecution(10); */ ++ ++ PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); ++ udelay(100);/* PlatformStallExecution(100); */ ++ ++ udelay(10);/* PlatformStallExecution(10); */ ++ ++ if (eRFPath == RF_PATH_A) ++ RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT(8)); ++ else if (eRFPath == RF_PATH_B) ++ RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT(8)); ++ ++ if (RfPiEnable) { /* Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF */ ++ retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); ++ } else { /* Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF */ ++ retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); ++ } ++ return retValue; ++} ++ ++/** ++* Function: phy_RFSerialWrite ++* ++* OverView: Write data to RF register (page 8~) ++* ++* Input: ++* struct adapter *Adapter, ++* enum rf_radio_path eRFPath, Radio path of A/B/C/D ++* u32 Offset, The target address to be read ++* u32 Data The new register Data in the target bit position ++* of the target to be read ++* ++* Output: None ++* Return: None ++* Note: Threre are three types of serial operations: ++* 1. Software serial write ++* 2. Hardware LSSI-Low Speed Serial Interface ++* 3. Hardware HSSI-High speed ++* serial write. Driver need to implement (1) and (2). ++* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() ++ * ++ * Note: For RF8256 only ++ * The total count of RTL8256(Zebra4) register is around 36 bit it only employs ++ * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) ++ * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration ++ * programming guide" for more details. ++ * Thus, we define a sub-finction for RTL8526 register address conversion ++ * =========================================================== ++ * Register Mode RegCTL[1] RegCTL[0] Note ++ * (Reg00[12]) (Reg00[10]) ++ * =========================================================== ++ * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) ++ * ------------------------------------------------------------------ ++ * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) ++ * ------------------------------------------------------------------ ++ * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) ++ * ------------------------------------------------------------------ ++ * ++ * 2008/09/02 MH Add 92S RF definition ++ * ++ * ++ * ++*/ ++static void ++phy_RFSerialWrite( ++ struct adapter *Adapter, ++ enum rf_radio_path eRFPath, ++ u32 Offset, ++ u32 Data ++ ) ++{ ++ u32 DataAndAddr = 0; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct bb_reg_def *pPhyReg = &pHalData->PHYRegDef[eRFPath]; ++ u32 NewOffset; ++ ++ /* 2009/06/17 MH We can not execute IO for power save or other accident mode. */ ++ ++ Offset &= 0xff; ++ ++ /* */ ++ /* Switch page for 8256 RF IC */ ++ /* */ ++ NewOffset = Offset; ++ ++ /* */ ++ /* Put write addr in [5:0] and write data in [31:16] */ ++ /* */ ++ DataAndAddr = ((NewOffset << 20) | (Data & 0x000fffff)) & 0x0fffffff; /* T65 RF */ ++ ++ /* */ ++ /* Write Operation */ ++ /* */ ++ PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); ++} ++ ++/** ++* Function: PHY_QueryRFReg ++* ++* OverView: Query "Specific bits" to RF register (page 8~) ++* ++* Input: ++* struct adapter *Adapter, ++* enum rf_radio_path eRFPath, Radio path of A/B/C/D ++* u32 RegAddr, The target address to be read ++* u32 BitMask The target bit position in the target address ++* to be read ++* ++* Output: None ++* Return: u32 Readback value ++* Note: This function is equal to "GetRFRegSetting" in PHY programming guide ++*/ ++u32 rtl8188e_PHY_QueryRFReg(struct adapter *Adapter, enum rf_radio_path eRFPath, ++ u32 RegAddr, u32 BitMask) ++{ ++ u32 Original_Value, Readback_Value, BitShift; ++ ++ Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); ++ ++ BitShift = phy_CalculateBitShift(BitMask); ++ Readback_Value = (Original_Value & BitMask) >> BitShift; ++ return Readback_Value; ++} ++ ++/** ++* Function: PHY_SetRFReg ++* ++* OverView: Write "Specific bits" to RF register (page 8~) ++* ++* Input: ++* struct adapter *Adapter, ++* enum rf_radio_path eRFPath, Radio path of A/B/C/D ++* u32 RegAddr, The target address to be modified ++* u32 BitMask The target bit position in the target address ++* to be modified ++* u32 Data The new register Data in the target bit position ++* of the target address ++* ++* Output: None ++* Return: None ++* Note: This function is equal to "PutRFRegSetting" in PHY programming guide ++*/ ++void ++rtl8188e_PHY_SetRFReg( ++ struct adapter *Adapter, ++ enum rf_radio_path eRFPath, ++ u32 RegAddr, ++ u32 BitMask, ++ u32 Data ++ ) ++{ ++ u32 Original_Value, BitShift; ++ ++ /* RF data is 12 bits only */ ++ if (BitMask != bRFRegOffsetMask) { ++ Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); ++ BitShift = phy_CalculateBitShift(BitMask); ++ Data = ((Original_Value & (~BitMask)) | (Data << BitShift)); ++ } ++ ++ phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); ++} ++ ++/* */ ++/* 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. */ ++/* */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_MACConfig8192C ++ * ++ * Overview: Condig MAC by header file or parameter file. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 08/12/2008 MHC Create Version 0. ++ * ++ *---------------------------------------------------------------------------*/ ++s32 PHY_MACConfig8188E(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ int rtStatus = _SUCCESS; ++ ++ /* */ ++ /* Config MAC */ ++ /* */ ++ if (HAL_STATUS_FAILURE == ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv)) ++ rtStatus = _FAIL; ++ ++ /* 2010.07.13 AMPDU aggregation number B */ ++ rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); ++ ++ return rtStatus; ++} ++ ++/** ++* Function: phy_InitBBRFRegisterDefinition ++* ++* OverView: Initialize Register definition offset for Radio Path A/B/C/D ++* ++* Input: ++* struct adapter *Adapter, ++* ++* Output: None ++* Return: None ++* Note: The initialization value is constant and it should never be changes ++*/ ++static void ++phy_InitBBRFRegisterDefinition( ++ struct adapter *Adapter ++) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ /* RF Interface Sowrtware Control */ ++ pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 LSBs if read 32-bit from 0x870 */ ++ pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */ ++ pHalData->PHYRegDef[RF_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;/* 16 LSBs if read 32-bit from 0x874 */ ++ pHalData->PHYRegDef[RF_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;/* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */ ++ ++ /* RF Interface Readback Value */ ++ pHalData->PHYRegDef[RF_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; /* 16 LSBs if read 32-bit from 0x8E0 */ ++ pHalData->PHYRegDef[RF_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;/* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */ ++ pHalData->PHYRegDef[RF_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;/* 16 LSBs if read 32-bit from 0x8E4 */ ++ pHalData->PHYRegDef[RF_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;/* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */ ++ ++ /* RF Interface Output (and Enable) */ ++ pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x860 */ ++ pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x864 */ ++ ++ /* RF Interface (Output and) Enable */ ++ pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */ ++ pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */ ++ ++ /* Addr of LSSI. Wirte RF register by driver */ ++ pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; /* LSSI Parameter */ ++ pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; ++ ++ /* RF parameter */ ++ pHalData->PHYRegDef[RF_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; /* BB Band Select */ ++ pHalData->PHYRegDef[RF_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; ++ pHalData->PHYRegDef[RF_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; ++ pHalData->PHYRegDef[RF_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; ++ ++ /* Tx AGC Gain Stage (same for all path. Should we remove this?) */ ++ pHalData->PHYRegDef[RF_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */ ++ pHalData->PHYRegDef[RF_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */ ++ pHalData->PHYRegDef[RF_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */ ++ pHalData->PHYRegDef[RF_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */ ++ ++ /* Tranceiver A~D HSSI Parameter-1 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; /* wire control parameter1 */ ++ pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; /* wire control parameter1 */ ++ ++ /* Tranceiver A~D HSSI Parameter-2 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; /* wire control parameter2 */ ++ pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; /* wire control parameter2 */ ++ ++ /* RF switch Control */ ++ pHalData->PHYRegDef[RF_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; /* TR/Ant switch control */ ++ pHalData->PHYRegDef[RF_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; ++ pHalData->PHYRegDef[RF_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; ++ pHalData->PHYRegDef[RF_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; ++ ++ /* AGC control 1 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; ++ pHalData->PHYRegDef[RF_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; ++ pHalData->PHYRegDef[RF_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; ++ pHalData->PHYRegDef[RF_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; ++ ++ /* AGC control 2 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; ++ pHalData->PHYRegDef[RF_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; ++ pHalData->PHYRegDef[RF_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; ++ pHalData->PHYRegDef[RF_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; ++ ++ /* RX AFE control 1 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; ++ ++ /* RX AFE control 1 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfRxAFE = rOFDM0_XARxAFE; ++ pHalData->PHYRegDef[RF_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; ++ pHalData->PHYRegDef[RF_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; ++ pHalData->PHYRegDef[RF_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; ++ ++ /* Tx AFE control 1 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; ++ pHalData->PHYRegDef[RF_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; ++ ++ /* Tx AFE control 2 */ ++ pHalData->PHYRegDef[RF_PATH_A].rfTxAFE = rOFDM0_XATxAFE; ++ pHalData->PHYRegDef[RF_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; ++ pHalData->PHYRegDef[RF_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; ++ pHalData->PHYRegDef[RF_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; ++ ++ /* Tranceiver LSSI Readback SI mode */ ++ pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; ++ pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; ++ pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; ++ pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; ++ ++ /* Tranceiver LSSI Readback PI mode */ ++ pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; ++ pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; ++} ++ ++void storePwrIndexDiffRateOffset(struct adapter *Adapter, u32 RegAddr, u32 BitMask, u32 Data) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ if (RegAddr == rTxAGC_A_Rate18_06) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; ++ if (RegAddr == rTxAGC_A_Rate54_24) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; ++ if (RegAddr == rTxAGC_A_CCK1_Mcs32) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; ++ if (RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; ++ if (RegAddr == rTxAGC_A_Mcs03_Mcs00) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; ++ if (RegAddr == rTxAGC_A_Mcs07_Mcs04) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; ++ if (RegAddr == rTxAGC_A_Mcs11_Mcs08) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; ++ if (RegAddr == rTxAGC_A_Mcs15_Mcs12) { ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; ++ if (pHalData->rf_type == RF_1T1R) ++ pHalData->pwrGroupCnt++; ++ } ++ if (RegAddr == rTxAGC_B_Rate18_06) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; ++ if (RegAddr == rTxAGC_B_Rate54_24) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; ++ if (RegAddr == rTxAGC_B_CCK1_55_Mcs32) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; ++ if (RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; ++ if (RegAddr == rTxAGC_B_Mcs03_Mcs00) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; ++ if (RegAddr == rTxAGC_B_Mcs07_Mcs04) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; ++ if (RegAddr == rTxAGC_B_Mcs11_Mcs08) ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; ++ if (RegAddr == rTxAGC_B_Mcs15_Mcs12) { ++ pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; ++ if (pHalData->rf_type != RF_1T1R) ++ pHalData->pwrGroupCnt++; ++ } ++} ++ ++static int phy_BB8188E_Config_ParaFile(struct adapter *Adapter) ++{ ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ int rtStatus = _SUCCESS; ++ ++ /* */ ++ /* 1. Read PHY_REG.TXT BB INIT!! */ ++ /* We will separate as 88C / 92C according to chip version */ ++ /* */ ++ if (HAL_STATUS_FAILURE == ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) ++ rtStatus = _FAIL; ++ if (rtStatus != _SUCCESS) ++ goto phy_BB8190_Config_ParaFile_Fail; ++ ++ /* 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt */ ++ if (!pEEPROM->bautoload_fail_flag) { ++ pHalData->pwrGroupCnt = 0; ++ ++ if (HAL_STATUS_FAILURE == ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_PG)) ++ rtStatus = _FAIL; ++ } ++ ++ if (rtStatus != _SUCCESS) ++ goto phy_BB8190_Config_ParaFile_Fail; ++ ++ /* 3. BB AGC table Initialization */ ++ if (HAL_STATUS_FAILURE == ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) ++ rtStatus = _FAIL; ++ ++ if (rtStatus != _SUCCESS) ++ goto phy_BB8190_Config_ParaFile_Fail; ++ ++phy_BB8190_Config_ParaFile_Fail: ++ ++ return rtStatus; ++} ++ ++int ++PHY_BBConfig8188E( ++ struct adapter *Adapter ++ ) ++{ ++ int rtStatus = _SUCCESS; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u32 RegVal; ++ u8 CrystalCap; ++ ++ phy_InitBBRFRegisterDefinition(Adapter); ++ ++ /* Enable BB and RF */ ++ RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); ++ rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal | BIT(13) | BIT(0) | BIT(1))); ++ ++ /* 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. */ ++ ++ rtw_write8(Adapter, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB); ++ ++ rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); ++ ++ /* Config BB and AGC */ ++ rtStatus = phy_BB8188E_Config_ParaFile(Adapter); ++ ++ /* write 0x24[16:11] = 0x24[22:17] = CrystalCap */ ++ CrystalCap = pHalData->CrystalCap & 0x3F; ++ PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, 0x7ff800, (CrystalCap | (CrystalCap << 6))); ++ ++ return rtStatus; ++} ++ ++int PHY_RFConfig8188E(struct adapter *Adapter) ++{ ++ int rtStatus = _SUCCESS; ++ ++ /* RF config */ ++ rtStatus = PHY_RF6052_Config8188E(Adapter); ++ return rtStatus; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_ConfigRFWithParaFile() ++ * ++ * Overview: This function read RF parameters from general file format, and do RF 3-wire ++ * ++ * Input: struct adapter *Adapter ++ * ps8 pFileName ++ * enum rf_radio_path eRFPath ++ * ++ * Output: NONE ++ * ++ * Return: RT_STATUS_SUCCESS: configuration file exist ++ * ++ * Note: Delay may be required for RF configuration ++ *---------------------------------------------------------------------------*/ ++int rtl8188e_PHY_ConfigRFWithParaFile(struct adapter *Adapter, u8 *pFileName, enum rf_radio_path eRFPath) ++{ ++ return _SUCCESS; ++} ++ ++void ++rtl8192c_PHY_GetHWRegOriginalValue( ++ struct adapter *Adapter ++ ) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ /* read rx initial gain */ ++ pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); ++ pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); ++ pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); ++ pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); ++ ++ /* read framesync */ ++ pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); ++ pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); ++} ++ ++/* */ ++/* Description: */ ++/* Map dBm into Tx power index according to */ ++/* current HW model, for example, RF and PA, and */ ++/* current wireless mode. */ ++/* By Bruce, 2008-01-29. */ ++/* */ ++static u8 phy_DbmToTxPwrIdx(struct adapter *Adapter, enum wireless_mode WirelessMode, int PowerInDbm) ++{ ++ u8 TxPwrIdx = 0; ++ int Offset = 0; ++ ++ /* */ ++ /* Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to */ ++ /* 3dbm, and OFDM HT equals to 0dbm respectively. */ ++ /* Note: */ ++ /* The mapping may be different by different NICs. Do not use this formula for what needs accurate result. */ ++ /* By Bruce, 2008-01-29. */ ++ /* */ ++ switch (WirelessMode) { ++ case WIRELESS_MODE_B: ++ Offset = -7; ++ break; ++ ++ case WIRELESS_MODE_G: ++ case WIRELESS_MODE_N_24G: ++ default: ++ Offset = -8; ++ break; ++ } ++ ++ if ((PowerInDbm - Offset) > 0) ++ TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); ++ else ++ TxPwrIdx = 0; ++ ++ /* Tx Power Index is too large. */ ++ if (TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) ++ TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; ++ ++ return TxPwrIdx; ++} ++ ++/* */ ++/* Description: */ ++/* Map Tx power index into dBm according to */ ++/* current HW model, for example, RF and PA, and */ ++/* current wireless mode. */ ++/* By Bruce, 2008-01-29. */ ++/* */ ++static int phy_TxPwrIdxToDbm(struct adapter *Adapter, enum wireless_mode WirelessMode, u8 TxPwrIdx) ++{ ++ int Offset = 0; ++ int PwrOutDbm = 0; ++ ++ /* */ ++ /* Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. */ ++ /* Note: */ ++ /* The mapping may be different by different NICs. Do not use this formula for what needs accurate result. */ ++ /* By Bruce, 2008-01-29. */ ++ /* */ ++ switch (WirelessMode) { ++ case WIRELESS_MODE_B: ++ Offset = -7; ++ break; ++ case WIRELESS_MODE_G: ++ case WIRELESS_MODE_N_24G: ++ default: ++ Offset = -8; ++ break; ++ } ++ ++ PwrOutDbm = TxPwrIdx / 2 + Offset; /* Discard the decimal part. */ ++ ++ return PwrOutDbm; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: GetTxPowerLevel8190() ++ * ++ * Overview: This function is export to "common" moudule ++ * ++ * Input: struct adapter *Adapter ++ * psByte Power Level ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ *---------------------------------------------------------------------------*/ ++void PHY_GetTxPowerLevel8188E(struct adapter *Adapter, u32 *powerlevel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u8 TxPwrLevel = 0; ++ int TxPwrDbm; ++ ++ /* */ ++ /* Because the Tx power indexes are different, we report the maximum of them to */ ++ /* meet the CCX TPC request. By Bruce, 2008-01-31. */ ++ /* */ ++ ++ /* CCK */ ++ TxPwrLevel = pHalData->CurrentCckTxPwrIdx; ++ TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); ++ ++ /* Legacy OFDM */ ++ TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; ++ ++ /* Compare with Legacy OFDM Tx power. */ ++ if (phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) ++ TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); ++ ++ /* HT OFDM */ ++ TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; ++ ++ /* Compare with HT OFDM Tx power. */ ++ if (phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) ++ TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); ++ ++ *powerlevel = TxPwrDbm; ++} ++ ++static void getTxPowerIndex88E(struct adapter *Adapter, u8 channel, u8 *cckPowerLevel, ++ u8 *ofdmPowerLevel, u8 *BW20PowerLevel, ++ u8 *BW40PowerLevel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u8 index = (channel - 1); ++ u8 TxCount = 0, path_nums; ++ ++ if ((RF_1T2R == pHalData->rf_type) || (RF_1T1R == pHalData->rf_type)) ++ path_nums = 1; ++ else ++ path_nums = 2; ++ ++ for (TxCount = 0; TxCount < path_nums; TxCount++) { ++ if (TxCount == RF_PATH_A) { ++ /* 1. CCK */ ++ cckPowerLevel[TxCount] = pHalData->Index24G_CCK_Base[TxCount][index]; ++ /* 2. OFDM */ ++ ofdmPowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->OFDM_24G_Diff[TxCount][RF_PATH_A]; ++ /* 1. BW20 */ ++ BW20PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[TxCount][RF_PATH_A]; ++ /* 2. BW40 */ ++ BW40PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[TxCount][index]; ++ } else if (TxCount == RF_PATH_B) { ++ /* 1. CCK */ ++ cckPowerLevel[TxCount] = pHalData->Index24G_CCK_Base[TxCount][index]; ++ /* 2. OFDM */ ++ ofdmPowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ /* 1. BW20 */ ++ BW20PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[TxCount][RF_PATH_A] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ /* 2. BW40 */ ++ BW40PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[TxCount][index]; ++ } else if (TxCount == RF_PATH_C) { ++ /* 1. CCK */ ++ cckPowerLevel[TxCount] = pHalData->Index24G_CCK_Base[TxCount][index]; ++ /* 2. OFDM */ ++ ofdmPowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_B][index] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ /* 1. BW20 */ ++ BW20PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_B][index] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ /* 2. BW40 */ ++ BW40PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[TxCount][index]; ++ } else if (TxCount == RF_PATH_D) { ++ /* 1. CCK */ ++ cckPowerLevel[TxCount] = pHalData->Index24G_CCK_Base[TxCount][index]; ++ /* 2. OFDM */ ++ ofdmPowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_B][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_C][index] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ ++ /* 1. BW20 */ ++ BW20PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_A][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_B][index] + ++ pHalData->BW20_24G_Diff[RF_PATH_C][index] + ++ pHalData->BW20_24G_Diff[TxCount][index]; ++ ++ /* 2. BW40 */ ++ BW40PowerLevel[TxCount] = pHalData->Index24G_BW40_Base[TxCount][index]; ++ } ++ } ++} ++ ++static void phy_PowerIndexCheck88E(struct adapter *Adapter, u8 channel, u8 *cckPowerLevel, ++ u8 *ofdmPowerLevel, u8 *BW20PowerLevel, u8 *BW40PowerLevel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; ++ pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; ++ pHalData->CurrentBW2024GTxPwrIdx = BW20PowerLevel[0]; ++ pHalData->CurrentBW4024GTxPwrIdx = BW40PowerLevel[0]; ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: SetTxPowerLevel8190() ++ * ++ * Overview: This function is export to "HalCommon" moudule ++ * We must consider RF path later!!!!!!! ++ * ++ * Input: struct adapter *Adapter ++ * u8 channel ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * 2008/11/04 MHC We remove EEPROM_93C56. ++ * We need to move CCX relative code to independet file. ++ * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. ++ * ++ *---------------------------------------------------------------------------*/ ++void ++PHY_SetTxPowerLevel8188E( ++ struct adapter *Adapter, ++ u8 channel ++ ) ++{ ++ u8 cckPowerLevel[MAX_TX_COUNT] = {0}; ++ u8 ofdmPowerLevel[MAX_TX_COUNT] = {0};/* [0]:RF-A, [1]:RF-B */ ++ u8 BW20PowerLevel[MAX_TX_COUNT] = {0}; ++ u8 BW40PowerLevel[MAX_TX_COUNT] = {0}; ++ ++ getTxPowerIndex88E(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0], &BW20PowerLevel[0], &BW40PowerLevel[0]); ++ ++ phy_PowerIndexCheck88E(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0], &BW20PowerLevel[0], &BW40PowerLevel[0]); ++ ++ rtl8188e_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); ++ rtl8188e_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], &BW20PowerLevel[0], &BW40PowerLevel[0], channel); ++} ++ ++/* */ ++/* Description: */ ++/* Update transmit power level of all channel supported. */ ++/* */ ++/* TODO: */ ++/* A mode. */ ++/* By Bruce, 2008-02-04. */ ++/* */ ++bool ++PHY_UpdateTxPowerDbm8188E( ++ struct adapter *Adapter, ++ int powerInDbm ++ ) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u8 idx; ++ u8 rf_path; ++ ++ /* TODO: A mode Tx power. */ ++ u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); ++ u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); ++ ++ if (OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) ++ OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; ++ else ++ OfdmTxPwrIdx = 0; ++ ++ for (idx = 0; idx < 14; idx++) { ++ for (rf_path = 0; rf_path < 2; rf_path++) { ++ pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; ++ pHalData->TxPwrLevelHT40_1S[rf_path][idx] = ++ pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; ++ } ++ } ++ return true; ++} ++ ++void ++PHY_ScanOperationBackup8188E( ++ struct adapter *Adapter, ++ u8 Operation ++ ) ++{ ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_SetBWModeCallback8192C() ++ * ++ * Overview: Timer callback function for SetSetBWMode ++ * ++ * Input: PRT_TIMER pTimer ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Note: (1) We do not take j mode into consideration now ++ * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run ++ * concurrently? ++ *---------------------------------------------------------------------------*/ ++static void ++_PHY_SetBWMode92C( ++ struct adapter *Adapter ++) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u8 regBwOpMode; ++ u8 regRRSR_RSC; ++ ++ if (pHalData->rf_chip == RF_PSEUDO_11N) ++ return; ++ ++ /* There is no 40MHz mode in RF_8225. */ ++ if (pHalData->rf_chip == RF_8225) ++ return; ++ ++ if (Adapter->bDriverStopped) ++ return; ++ ++ /* 3 */ ++ /* 3<1>Set MAC register */ ++ /* 3 */ ++ ++ regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); ++ regRRSR_RSC = rtw_read8(Adapter, REG_RRSR + 2); ++ ++ switch (pHalData->CurrentChannelBW) { ++ case HT_CHANNEL_WIDTH_20: ++ regBwOpMode |= BW_OPMODE_20MHZ; ++ /* 2007/02/07 Mark by Emily because we have not verify whether this register works */ ++ rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); ++ break; ++ case HT_CHANNEL_WIDTH_40: ++ regBwOpMode &= ~BW_OPMODE_20MHZ; ++ /* 2007/02/07 Mark by Emily because we have not verify whether this register works */ ++ rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); ++ regRRSR_RSC = (regRRSR_RSC & 0x90) | (pHalData->nCur40MhzPrimeSC << 5); ++ rtw_write8(Adapter, REG_RRSR + 2, regRRSR_RSC); ++ break; ++ default: ++ break; ++ } ++ ++ /* 3 */ ++ /* 3 <2>Set PHY related register */ ++ /* 3 */ ++ switch (pHalData->CurrentChannelBW) { ++ /* 20 MHz channel*/ ++ case HT_CHANNEL_WIDTH_20: ++ PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); ++ PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); ++ break; ++ /* 40 MHz channel*/ ++ case HT_CHANNEL_WIDTH_40: ++ PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); ++ PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); ++ /* Set Control channel to upper or lower. These settings are required only for 40MHz */ ++ PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC >> 1)); ++ PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); ++ PHY_SetBBReg(Adapter, 0x818, (BIT(26) | BIT(27)), ++ (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); ++ break; ++ default: ++ break; ++ } ++ /* Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 */ ++ ++ /* 3<3>Set RF related register */ ++ switch (pHalData->rf_chip) { ++ case RF_8225: ++ break; ++ case RF_8256: ++ /* Please implement this function in Hal8190PciPhy8256.c */ ++ break; ++ case RF_PSEUDO_11N: ++ break; ++ case RF_6052: ++ rtl8188e_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); ++ break; ++ default: ++ break; ++ } ++} ++ ++ /*----------------------------------------------------------------------------- ++ * Function: SetBWMode8190Pci() ++ * ++ * Overview: This function is export to "HalCommon" moudule ++ * ++ * Input: struct adapter *Adapter ++ * enum ht_channel_width Bandwidth 20M or 40M ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Note: We do not take j mode into consideration now ++ *---------------------------------------------------------------------------*/ ++void PHY_SetBWMode8188E(struct adapter *Adapter, enum ht_channel_width Bandwidth, /* 20M or 40M */ ++ unsigned char Offset) /* Upper, Lower, or Don't care */ ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ enum ht_channel_width tmpBW = pHalData->CurrentChannelBW; ++ ++ pHalData->CurrentChannelBW = Bandwidth; ++ ++ pHalData->nCur40MhzPrimeSC = Offset; ++ ++ if ((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) ++ _PHY_SetBWMode92C(Adapter); ++ else ++ pHalData->CurrentChannelBW = tmpBW; ++} ++ ++static void _PHY_SwChnl8192C(struct adapter *Adapter, u8 channel) ++{ ++ u8 eRFPath; ++ u32 param1, param2; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ if (Adapter->bNotifyChannelChange) ++ DBG_88E("[%s] ch = %d\n", __func__, channel); ++ ++ /* s1. pre common command - CmdID_SetTxPowerLevel */ ++ PHY_SetTxPowerLevel8188E(Adapter, channel); ++ ++ /* s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel */ ++ param1 = RF_CHNLBW; ++ param2 = channel; ++ for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { ++ pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); ++ PHY_SetRFReg(Adapter, (enum rf_radio_path)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); ++ } ++} ++ ++void PHY_SwChnl8188E(struct adapter *Adapter, u8 channel) ++{ ++ /* Call after initialization */ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ if (pHalData->rf_chip == RF_PSEUDO_11N) ++ return; /* return immediately if it is peudo-phy */ ++ ++ if (channel == 0) ++ channel = 1; ++ ++ if ((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) { ++ pHalData->CurrentChannel = channel; ++ _PHY_SwChnl8192C(Adapter, channel); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_rf6052.c b/drivers/staging/r8188eu/hal/rtl8188e_rf6052.c +new file mode 100644 +index 000000000000..ad0782259654 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_rf6052.c +@@ -0,0 +1,550 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/****************************************************************************** ++ * ++ * ++ * Module: rtl8192c_rf6052.c ( Source C File) ++ * ++ * Note: Provide RF 6052 series relative API. ++ * ++ * Function: ++ * ++ * Export: ++ * ++ * Abbrev: ++ * ++ * History: ++ * Data Who Remark ++ * ++ * 09/25/2008 MHC Create initial version. ++ * 11/05/2008 MHC Add API for tw power setting. ++ * ++ * ++******************************************************************************/ ++ ++#define _RTL8188E_RF6052_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtl8188e_hal.h" ++ ++/*---------------------------Define Local Constant---------------------------*/ ++/* Define local structure for debug!!!!! */ ++struct rf_shadow { ++ /* Shadow register value */ ++ u32 Value; ++ /* Compare or not flag */ ++ u8 Compare; ++ /* Record If it had ever modified unpredicted */ ++ u8 ErrorOrNot; ++ /* Recorver Flag */ ++ u8 Recorver; ++ /* */ ++ u8 Driver_Write; ++}; ++ ++/*---------------------------Define Local Constant---------------------------*/ ++ ++/*------------------------Define global variable-----------------------------*/ ++ ++/*------------------------Define local variable------------------------------*/ ++ ++/*----------------------------------------------------------------------------- ++ * Function: RF_ChangeTxPath ++ * ++ * Overview: For RL6052, we must change some RF settign for 1T or 2T. ++ * ++ * Input: u16 DataRate 0x80-8f, 0x90-9f ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 09/25/2008 MHC Create Version 0. ++ * Firmwaer support the utility later. ++ * ++ *---------------------------------------------------------------------------*/ ++void rtl8188e_RF_ChangeTxPath(struct adapter *Adapter, u16 DataRate) ++{ ++/* We do not support gain table change inACUT now !!!! Delete later !!! */ ++} /* RF_ChangeTxPath */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_RF6052SetBandwidth() ++ * ++ * Overview: This function is called by SetBWModeCallback8190Pci() only ++ * ++ * Input: struct adapter *Adapter ++ * WIRELESS_BANDWIDTH_E Bandwidth 20M or 40M ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Note: For RF type 0222D ++ *---------------------------------------------------------------------------*/ ++void rtl8188e_PHY_RF6052SetBandwidth(struct adapter *Adapter, ++ enum ht_channel_width Bandwidth) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ ++ switch (Bandwidth) { ++ case HT_CHANNEL_WIDTH_20: ++ pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT(10) | BIT(11)); ++ PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); ++ break; ++ case HT_CHANNEL_WIDTH_40: ++ pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT(10)); ++ PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); ++ break; ++ default: ++ break; ++ } ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_RF6052SetCckTxPower ++ * ++ * Overview: ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/05/2008 MHC Simulate 8192series.. ++ * ++ *---------------------------------------------------------------------------*/ ++ ++void ++rtl8188e_PHY_RF6052SetCckTxPower( ++ struct adapter *Adapter, ++ u8 *pPowerlevel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &pHalData->dmpriv; ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ u32 TxAGC[2] = {0, 0}, tmpval = 0, pwrtrac_value; ++ bool TurboScanOff = false; ++ u8 idx1, idx2; ++ u8 *ptr; ++ u8 direction; ++ /* FOR CE ,must disable turbo scan */ ++ TurboScanOff = true; ++ ++ if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { ++ TxAGC[RF_PATH_A] = 0x3f3f3f3f; ++ TxAGC[RF_PATH_B] = 0x3f3f3f3f; ++ ++ TurboScanOff = true;/* disable turbo scan */ ++ ++ if (TurboScanOff) { ++ for (idx1 = RF_PATH_A; idx1 <= RF_PATH_B; idx1++) { ++ TxAGC[idx1] = ++ pPowerlevel[idx1] | (pPowerlevel[idx1] << 8) | ++ (pPowerlevel[idx1] << 16) | (pPowerlevel[idx1] << 24); ++ /* 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. */ ++ if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) ++ TxAGC[idx1] = 0x20; ++ } ++ } ++ } else { ++ /* Driver dynamic Tx power shall not affect Tx power. ++ * It shall be determined by power training mechanism. ++i * Currently, we cannot fully disable driver dynamic ++ * tx power mechanism because it is referenced by BT ++ * coexist mechanism. ++ * In the future, two mechanism shall be separated from ++ * each other and maintained independently. */ ++ if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) { ++ TxAGC[RF_PATH_A] = 0x10101010; ++ TxAGC[RF_PATH_B] = 0x10101010; ++ } else if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) { ++ TxAGC[RF_PATH_A] = 0x00000000; ++ TxAGC[RF_PATH_B] = 0x00000000; ++ } else { ++ for (idx1 = RF_PATH_A; idx1 <= RF_PATH_B; idx1++) { ++ TxAGC[idx1] = ++ pPowerlevel[idx1] | (pPowerlevel[idx1] << 8) | ++ (pPowerlevel[idx1] << 16) | (pPowerlevel[idx1] << 24); ++ } ++ if (pHalData->EEPROMRegulatory == 0) { ++ tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + ++ (pHalData->MCSTxPowerLevelOriginalOffset[0][7] << 8); ++ TxAGC[RF_PATH_A] += tmpval; ++ ++ tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + ++ (pHalData->MCSTxPowerLevelOriginalOffset[0][15] << 24); ++ TxAGC[RF_PATH_B] += tmpval; ++ } ++ } ++ } ++ for (idx1 = RF_PATH_A; idx1 <= RF_PATH_B; idx1++) { ++ ptr = (u8 *)(&TxAGC[idx1]); ++ for (idx2 = 0; idx2 < 4; idx2++) { ++ if (*ptr > RF6052_MAX_TX_PWR) ++ *ptr = RF6052_MAX_TX_PWR; ++ ptr++; ++ } ++ } ++ ODM_TxPwrTrackAdjust88E(&pHalData->odmpriv, 1, &direction, &pwrtrac_value); ++ ++ if (direction == 1) { ++ /* Increase TX power */ ++ TxAGC[0] += pwrtrac_value; ++ TxAGC[1] += pwrtrac_value; ++ } else if (direction == 2) { ++ /* Decrease TX power */ ++ TxAGC[0] -= pwrtrac_value; ++ TxAGC[1] -= pwrtrac_value; ++ } ++ ++ /* rf-A cck tx power */ ++ tmpval = TxAGC[RF_PATH_A] & 0xff; ++ PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); ++ tmpval = TxAGC[RF_PATH_A] >> 8; ++ PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); ++ ++ /* rf-B cck tx power */ ++ tmpval = TxAGC[RF_PATH_B] >> 24; ++ PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); ++ tmpval = TxAGC[RF_PATH_B] & 0x00ffffff; ++ PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); ++} /* PHY_RF6052SetCckTxPower */ ++ ++/* */ ++/* powerbase0 for OFDM rates */ ++/* powerbase1 for HT MCS rates */ ++/* */ ++static void getpowerbase88e(struct adapter *Adapter, u8 *pPowerLevelOFDM, ++ u8 *pPowerLevelBW20, u8 *pPowerLevelBW40, u8 Channel, u32 *OfdmBase, u32 *MCSBase) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u32 powerBase0, powerBase1; ++ u8 i, powerlevel[2]; ++ ++ for (i = 0; i < 2; i++) { ++ powerBase0 = pPowerLevelOFDM[i]; ++ ++ powerBase0 = (powerBase0 << 24) | (powerBase0 << 16) | (powerBase0 << 8) | powerBase0; ++ *(OfdmBase + i) = powerBase0; ++ } ++ for (i = 0; i < pHalData->NumTotalRFPath; i++) { ++ /* Check HT20 to HT40 diff */ ++ if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) ++ powerlevel[i] = pPowerLevelBW20[i]; ++ else ++ powerlevel[i] = pPowerLevelBW40[i]; ++ powerBase1 = powerlevel[i]; ++ powerBase1 = (powerBase1 << 24) | (powerBase1 << 16) | (powerBase1 << 8) | powerBase1; ++ *(MCSBase + i) = powerBase1; ++ } ++} ++static void get_rx_power_val_by_reg(struct adapter *Adapter, u8 Channel, ++ u8 index, u32 *powerBase0, u32 *powerBase1, ++ u32 *pOutWriteVal) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &pHalData->dmpriv; ++ u8 i, chnlGroup = 0, pwr_diff_limit[4], customer_pwr_limit; ++ s8 pwr_diff = 0; ++ u32 writeVal, customer_limit, rf; ++ u8 Regulatory = pHalData->EEPROMRegulatory; ++ ++ /* Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate */ ++ ++ for (rf = 0; rf < 2; rf++) { ++ switch (Regulatory) { ++ case 0: /* Realtek better performance */ ++ /* increase power diff defined by Realtek for large power */ ++ chnlGroup = 0; ++ writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index + (rf ? 8 : 0)] + ++ ((index < 2) ? powerBase0[rf] : powerBase1[rf]); ++ break; ++ case 1: /* Realtek regulatory */ ++ /* increase power diff defined by Realtek for regulatory */ ++ if (pHalData->pwrGroupCnt == 1) ++ chnlGroup = 0; ++ if (pHalData->pwrGroupCnt >= pHalData->PGMaxGroup) { ++ if (Channel < 3) /* Channel 1-2 */ ++ chnlGroup = 0; ++ else if (Channel < 6) /* Channel 3-5 */ ++ chnlGroup = 1; ++ else if (Channel < 9) /* Channel 6-8 */ ++ chnlGroup = 2; ++ else if (Channel < 12) /* Channel 9-11 */ ++ chnlGroup = 3; ++ else if (Channel < 14) /* Channel 12-13 */ ++ chnlGroup = 4; ++ else if (Channel == 14) /* Channel 14 */ ++ chnlGroup = 5; ++ } ++ writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index + (rf ? 8 : 0)] + ++ ((index < 2) ? powerBase0[rf] : powerBase1[rf]); ++ break; ++ case 2: /* Better regulatory */ ++ /* don't increase any power diff */ ++ writeVal = ((index < 2) ? powerBase0[rf] : powerBase1[rf]); ++ break; ++ case 3: /* Customer defined power diff. */ ++ /* increase power diff defined by customer. */ ++ chnlGroup = 0; ++ ++ if (index < 2) ++ pwr_diff = pHalData->TxPwrLegacyHtDiff[rf][Channel - 1]; ++ else if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) ++ pwr_diff = pHalData->TxPwrHt20Diff[rf][Channel - 1]; ++ ++ if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) ++ customer_pwr_limit = pHalData->PwrGroupHT40[rf][Channel - 1]; ++ else ++ customer_pwr_limit = pHalData->PwrGroupHT20[rf][Channel - 1]; ++ ++ if (pwr_diff >= customer_pwr_limit) ++ pwr_diff = 0; ++ else ++ pwr_diff = customer_pwr_limit - pwr_diff; ++ ++ for (i = 0; i < 4; i++) { ++ pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index + (rf ? 8 : 0)] & (0x7f << (i * 8))) >> (i * 8)); ++ ++ if (pwr_diff_limit[i] > pwr_diff) ++ pwr_diff_limit[i] = pwr_diff; ++ } ++ customer_limit = (pwr_diff_limit[3] << 24) | (pwr_diff_limit[2] << 16) | ++ (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]); ++ writeVal = customer_limit + ((index < 2) ? powerBase0[rf] : powerBase1[rf]); ++ break; ++ default: ++ chnlGroup = 0; ++ writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index + (rf ? 8 : 0)] + ++ ((index < 2) ? powerBase0[rf] : powerBase1[rf]); ++ break; ++ } ++/* 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. */ ++/* Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. */ ++/* In the future, two mechanism shall be separated from each other and maintained independently. Thanks for Lanhsin's reminder. */ ++ /* 92d do not need this */ ++ if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) ++ writeVal = 0x14141414; ++ else if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) ++ writeVal = 0x00000000; ++ ++ /* 20100628 Joseph: High power mode for BT-Coexist mechanism. */ ++ /* This mechanism is only applied when Driver-Highpower-Mechanism is OFF. */ ++ if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) ++ writeVal = writeVal - 0x06060606; ++ *(pOutWriteVal + rf) = writeVal; ++ } ++} ++static void writeOFDMPowerReg88E(struct adapter *Adapter, u8 index, u32 *pValue) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u16 regoffset_a[6] = { ++ rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, ++ rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, ++ rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; ++ u16 regoffset_b[6] = { ++ rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, ++ rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, ++ rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; ++ u8 i, rf, pwr_val[4]; ++ u32 writeVal; ++ u16 regoffset; ++ ++ for (rf = 0; rf < 2; rf++) { ++ writeVal = pValue[rf]; ++ for (i = 0; i < 4; i++) { ++ pwr_val[i] = (u8)((writeVal & (0x7f << (i * 8))) >> (i * 8)); ++ if (pwr_val[i] > RF6052_MAX_TX_PWR) ++ pwr_val[i] = RF6052_MAX_TX_PWR; ++ } ++ writeVal = (pwr_val[3] << 24) | (pwr_val[2] << 16) | (pwr_val[1] << 8) | pwr_val[0]; ++ ++ if (rf == 0) ++ regoffset = regoffset_a[index]; ++ else ++ regoffset = regoffset_b[index]; ++ ++ PHY_SetBBReg(Adapter, regoffset, bMaskDWord, writeVal); ++ ++ /* 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. */ ++ if (((pHalData->rf_type == RF_2T2R) && ++ (regoffset == rTxAGC_A_Mcs15_Mcs12 || regoffset == rTxAGC_B_Mcs15_Mcs12)) || ++ ((pHalData->rf_type != RF_2T2R) && ++ (regoffset == rTxAGC_A_Mcs07_Mcs04 || regoffset == rTxAGC_B_Mcs07_Mcs04))) { ++ writeVal = pwr_val[3]; ++ if (regoffset == rTxAGC_A_Mcs15_Mcs12 || regoffset == rTxAGC_A_Mcs07_Mcs04) ++ regoffset = 0xc90; ++ if (regoffset == rTxAGC_B_Mcs15_Mcs12 || regoffset == rTxAGC_B_Mcs07_Mcs04) ++ regoffset = 0xc98; ++ for (i = 0; i < 3; i++) { ++ if (i != 2) ++ writeVal = (writeVal > 8) ? (writeVal - 8) : 0; ++ else ++ writeVal = (writeVal > 6) ? (writeVal - 6) : 0; ++ rtw_write8(Adapter, (u32)(regoffset + i), (u8)writeVal); ++ } ++ } ++ } ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: PHY_RF6052SetOFDMTxPower ++ * ++ * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for ++ * different channel and read original value in TX power register area from ++ * 0xe00. We increase offset and original value to be correct tx pwr. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 11/05/2008 MHC Simulate 8192 series method. ++ * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to ++ * A/B pwr difference or legacy/HT pwr diff. ++ * 2. We concern with path B legacy/HT OFDM difference. ++ * 01/22/2009 MHC Support new EPRO format from SD3. ++ * ++ *---------------------------------------------------------------------------*/ ++ ++void ++rtl8188e_PHY_RF6052SetOFDMTxPower( ++ struct adapter *Adapter, ++ u8 *pPowerLevelOFDM, ++ u8 *pPowerLevelBW20, ++ u8 *pPowerLevelBW40, ++ u8 Channel) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u32 writeVal[2], powerBase0[2], powerBase1[2], pwrtrac_value; ++ u8 direction; ++ u8 index = 0; ++ ++ getpowerbase88e(Adapter, pPowerLevelOFDM, pPowerLevelBW20, pPowerLevelBW40, Channel, &powerBase0[0], &powerBase1[0]); ++ ++ /* 2012/04/23 MH According to power tracking value, we need to revise OFDM tx power. */ ++ /* This is ued to fix unstable power tracking mode. */ ++ ODM_TxPwrTrackAdjust88E(&pHalData->odmpriv, 0, &direction, &pwrtrac_value); ++ ++ for (index = 0; index < 6; index++) { ++ get_rx_power_val_by_reg(Adapter, Channel, index, ++ &powerBase0[0], &powerBase1[0], ++ &writeVal[0]); ++ ++ if (direction == 1) { ++ writeVal[0] += pwrtrac_value; ++ writeVal[1] += pwrtrac_value; ++ } else if (direction == 2) { ++ writeVal[0] -= pwrtrac_value; ++ writeVal[1] -= pwrtrac_value; ++ } ++ writeOFDMPowerReg88E(Adapter, index, &writeVal[0]); ++ } ++} ++ ++static int phy_RF6052_Config_ParaFile(struct adapter *Adapter) ++{ ++ struct bb_reg_def *pPhyReg; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ u32 u4RegValue = 0; ++ u8 eRFPath; ++ int rtStatus = _SUCCESS; ++ ++ /* 3----------------------------------------------------------------- */ ++ /* 3 <2> Initialize RF */ ++ /* 3----------------------------------------------------------------- */ ++ for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { ++ pPhyReg = &pHalData->PHYRegDef[eRFPath]; ++ ++ /*----Store original RFENV control type----*/ ++ switch (eRFPath) { ++ case RF_PATH_A: ++ case RF_PATH_C: ++ u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); ++ break; ++ case RF_PATH_B: ++ case RF_PATH_D: ++ u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV << 16); ++ break; ++ } ++ /*----Set RF_ENV enable----*/ ++ PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV << 16, 0x1); ++ udelay(1);/* PlatformStallExecution(1); */ ++ ++ /*----Set RF_ENV output high----*/ ++ PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); ++ udelay(1);/* PlatformStallExecution(1); */ ++ ++ /* Set bit number of Address and Data for RF register */ ++ PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); /* Set 1 to 4 bits for 8255 */ ++ udelay(1);/* PlatformStallExecution(1); */ ++ ++ PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); /* Set 0 to 12 bits for 8255 */ ++ udelay(1);/* PlatformStallExecution(1); */ ++ ++ /*----Initialize RF fom connfiguration file----*/ ++ switch (eRFPath) { ++ case RF_PATH_A: ++ if (HAL_STATUS_FAILURE == ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, (enum rf_radio_path)eRFPath, (enum rf_radio_path)eRFPath)) ++ rtStatus = _FAIL; ++ break; ++ case RF_PATH_B: ++ if (HAL_STATUS_FAILURE == ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, (enum rf_radio_path)eRFPath, (enum rf_radio_path)eRFPath)) ++ rtStatus = _FAIL; ++ break; ++ case RF_PATH_C: ++ break; ++ case RF_PATH_D: ++ break; ++ } ++ /*----Restore RFENV control type----*/; ++ switch (eRFPath) { ++ case RF_PATH_A: ++ case RF_PATH_C: ++ PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); ++ break; ++ case RF_PATH_B: ++ case RF_PATH_D: ++ PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV << 16, u4RegValue); ++ break; ++ } ++ if (rtStatus != _SUCCESS) ++ goto phy_RF6052_Config_ParaFile_Fail; ++ } ++ return rtStatus; ++ ++phy_RF6052_Config_ParaFile_Fail: ++ return rtStatus; ++} ++ ++int PHY_RF6052_Config8188E(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(Adapter); ++ int rtStatus = _SUCCESS; ++ ++ /* */ ++ /* Initialize general global value */ ++ /* */ ++ /* TODO: Extend RF_PATH_C and RF_PATH_D in the future */ ++ if (pHalData->rf_type == RF_1T1R) ++ pHalData->NumTotalRFPath = 1; ++ else ++ pHalData->NumTotalRFPath = 2; ++ ++ /* */ ++ /* Config BB and RF */ ++ /* */ ++ rtStatus = phy_RF6052_Config_ParaFile(Adapter); ++ return rtStatus; ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c b/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c +new file mode 100644 +index 000000000000..244286789b6d +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c +@@ -0,0 +1,186 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_REDESC_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtl8188e_hal.h" ++ ++static void process_rssi(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ struct rx_pkt_attrib *pattrib = &prframe->attrib; ++ struct signal_stat *signal_stat = &padapter->recvpriv.signal_strength_data; ++ ++ if (signal_stat->update_req) { ++ signal_stat->total_num = 0; ++ signal_stat->total_val = 0; ++ signal_stat->update_req = 0; ++ } ++ ++ signal_stat->total_num++; ++ signal_stat->total_val += pattrib->phy_info.SignalStrength; ++ signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; ++} /* Process_UI_RSSI_8192C */ ++ ++static void process_link_qual(struct adapter *padapter, struct recv_frame *prframe) ++{ ++ struct rx_pkt_attrib *pattrib; ++ struct signal_stat *signal_stat; ++ ++ if (!prframe || !padapter) ++ return; ++ ++ pattrib = &prframe->attrib; ++ signal_stat = &padapter->recvpriv.signal_qual_data; ++ ++ if (signal_stat->update_req) { ++ signal_stat->total_num = 0; ++ signal_stat->total_val = 0; ++ signal_stat->update_req = 0; ++ } ++ ++ signal_stat->total_num++; ++ signal_stat->total_val += pattrib->phy_info.SignalQuality; ++ signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; ++} ++ ++void rtl8188e_process_phy_info(struct adapter *padapter, void *prframe) ++{ ++ struct recv_frame *precvframe = (struct recv_frame *)prframe; ++ ++ /* Check RSSI */ ++ process_rssi(padapter, precvframe); ++ /* Check EVM */ ++ process_link_qual(padapter, precvframe); ++} ++ ++void update_recvframe_attrib_88e(struct recv_frame *precvframe, struct recv_stat *prxstat) ++{ ++ struct rx_pkt_attrib *pattrib; ++ struct recv_stat report; ++ ++ report.rxdw0 = prxstat->rxdw0; ++ report.rxdw1 = prxstat->rxdw1; ++ report.rxdw2 = prxstat->rxdw2; ++ report.rxdw3 = prxstat->rxdw3; ++ report.rxdw4 = prxstat->rxdw4; ++ report.rxdw5 = prxstat->rxdw5; ++ ++ pattrib = &precvframe->attrib; ++ memset(pattrib, 0, sizeof(struct rx_pkt_attrib)); ++ ++ pattrib->crc_err = (u8)((le32_to_cpu(report.rxdw0) >> 14) & 0x1);/* u8)prxreport->crc32; */ ++ ++ /* update rx report to recv_frame attribute */ ++ pattrib->pkt_rpt_type = (u8)((le32_to_cpu(report.rxdw3) >> 14) & 0x3);/* prxreport->rpt_sel; */ ++ ++ if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */ ++ pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x00003fff);/* u16)prxreport->pktlen; */ ++ pattrib->drvinfo_sz = (u8)((le32_to_cpu(report.rxdw0) >> 16) & 0xf) * 8;/* u8)(prxreport->drvinfosize << 3); */ ++ ++ pattrib->physt = (u8)((le32_to_cpu(report.rxdw0) >> 26) & 0x1);/* u8)prxreport->physt; */ ++ ++ pattrib->bdecrypted = (le32_to_cpu(report.rxdw0) & BIT(27)) ? 0 : 1;/* u8)(prxreport->swdec ? 0 : 1); */ ++ pattrib->encrypt = (u8)((le32_to_cpu(report.rxdw0) >> 20) & 0x7);/* u8)prxreport->security; */ ++ ++ pattrib->qos = (u8)((le32_to_cpu(report.rxdw0) >> 23) & 0x1);/* u8)prxreport->qos; */ ++ pattrib->priority = (u8)((le32_to_cpu(report.rxdw1) >> 8) & 0xf);/* u8)prxreport->tid; */ ++ ++ pattrib->amsdu = (u8)((le32_to_cpu(report.rxdw1) >> 13) & 0x1);/* u8)prxreport->amsdu; */ ++ ++ pattrib->seq_num = (u16)(le32_to_cpu(report.rxdw2) & 0x00000fff);/* u16)prxreport->seq; */ ++ pattrib->frag_num = (u8)((le32_to_cpu(report.rxdw2) >> 12) & 0xf);/* u8)prxreport->frag; */ ++ pattrib->mfrag = (u8)((le32_to_cpu(report.rxdw1) >> 27) & 0x1);/* u8)prxreport->mf; */ ++ pattrib->mdata = (u8)((le32_to_cpu(report.rxdw1) >> 26) & 0x1);/* u8)prxreport->md; */ ++ ++ pattrib->mcs_rate = (u8)(le32_to_cpu(report.rxdw3) & 0x3f);/* u8)prxreport->rxmcs; */ ++ pattrib->rxht = (u8)((le32_to_cpu(report.rxdw3) >> 6) & 0x1);/* u8)prxreport->rxht; */ ++ ++ pattrib->icv_err = (u8)((le32_to_cpu(report.rxdw0) >> 15) & 0x1);/* u8)prxreport->icverr; */ ++ pattrib->shift_sz = (u8)((le32_to_cpu(report.rxdw0) >> 24) & 0x3); ++ } else if (pattrib->pkt_rpt_type == TX_REPORT1) { /* CCX */ ++ pattrib->pkt_len = TX_RPT1_PKT_LEN; ++ pattrib->drvinfo_sz = 0; ++ } else if (pattrib->pkt_rpt_type == TX_REPORT2) { /* TX RPT */ ++ pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x3FF);/* Rx length[9:0] */ ++ pattrib->drvinfo_sz = 0; ++ ++ /* */ ++ /* Get TX report MAC ID valid. */ ++ /* */ ++ pattrib->MacIDValidEntry[0] = le32_to_cpu(report.rxdw4); ++ pattrib->MacIDValidEntry[1] = le32_to_cpu(report.rxdw5); ++ ++ } else if (pattrib->pkt_rpt_type == HIS_REPORT) { /* USB HISR RPT */ ++ pattrib->pkt_len = (u16)(le32_to_cpu(report.rxdw0) & 0x00003fff);/* u16)prxreport->pktlen; */ ++ } ++} ++ ++/* ++ * Notice: ++ * Before calling this function, ++ * precvframe->rx_data should be ready! ++ */ ++void update_recvframe_phyinfo_88e(struct recv_frame *precvframe, struct phy_stat *pphy_status) ++{ ++ struct adapter *padapter = precvframe->adapter; ++ struct rx_pkt_attrib *pattrib = &precvframe->attrib; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct odm_phy_status_info *pPHYInfo = (struct odm_phy_status_info *)(&pattrib->phy_info); ++ u8 *wlanhdr; ++ struct odm_per_pkt_info pkt_info; ++ u8 *sa = NULL; ++ struct sta_priv *pstapriv; ++ struct sta_info *psta; ++ ++ pkt_info.bPacketMatchBSSID = false; ++ pkt_info.bPacketToSelf = false; ++ pkt_info.bPacketBeacon = false; ++ ++ wlanhdr = get_recvframe_data(precvframe); ++ ++ pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) && ++ !pattrib->icv_err && !pattrib->crc_err && ++ !memcmp(get_hdr_bssid(wlanhdr), ++ get_bssid(&padapter->mlmepriv), ETH_ALEN)); ++ ++ pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && ++ (!memcmp(get_da(wlanhdr), ++ myid(&padapter->eeprompriv), ETH_ALEN)); ++ ++ pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && ++ (GetFrameSubType(wlanhdr) == WIFI_BEACON); ++ ++ if (pkt_info.bPacketBeacon) { ++ if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) ++ sa = padapter->mlmepriv.cur_network.network.MacAddress; ++ /* to do Ad-hoc */ ++ } else { ++ sa = get_sa(wlanhdr); ++ } ++ ++ pstapriv = &padapter->stapriv; ++ pkt_info.StationID = 0xFF; ++ psta = rtw_get_stainfo(pstapriv, sa); ++ if (psta) ++ pkt_info.StationID = psta->mac_id; ++ pkt_info.Rate = pattrib->mcs_rate; ++ ++ ODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, (u8 *)pphy_status, &(pkt_info), padapter); ++ ++ precvframe->psta = NULL; ++ if (pkt_info.bPacketMatchBSSID && ++ (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE))) { ++ if (psta) { ++ precvframe->psta = psta; ++ rtl8188e_process_phy_info(padapter, precvframe); ++ } ++ } else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) { ++ if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { ++ if (psta) ++ precvframe->psta = psta; ++ } ++ rtl8188e_process_phy_info(padapter, precvframe); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_sreset.c b/drivers/staging/r8188eu/hal/rtl8188e_sreset.c +new file mode 100644 +index 000000000000..16fa249e35d3 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_sreset.c +@@ -0,0 +1,64 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_SRESET_C_ ++ ++#include "../include/rtl8188e_sreset.h" ++#include "../include/rtl8188e_hal.h" ++ ++void rtl8188e_silentreset_for_specific_platform(struct adapter *padapter) ++{ ++} ++ ++void rtl8188e_sreset_xmit_status_check(struct adapter *padapter) ++{ ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ struct sreset_priv *psrtpriv = &pHalData->srestpriv; ++ ++ unsigned long current_time; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ unsigned int diff_time; ++ u32 txdma_status; ++ ++ txdma_status = rtw_read32(padapter, REG_TXDMA_STATUS); ++ if (txdma_status != 0x00) { ++ DBG_88E("%s REG_TXDMA_STATUS:0x%08x\n", __func__, txdma_status); ++ rtw_write32(padapter, REG_TXDMA_STATUS, txdma_status); ++ rtl8188e_silentreset_for_specific_platform(padapter); ++ } ++ /* total xmit irp = 4 */ ++ current_time = jiffies; ++ if (0 == pxmitpriv->free_xmitbuf_cnt) { ++ diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_time); ++ ++ if (diff_time > 2000) { ++ if (psrtpriv->last_tx_complete_time == 0) { ++ psrtpriv->last_tx_complete_time = current_time; ++ } else { ++ diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_complete_time); ++ if (diff_time > 4000) { ++ DBG_88E("%s tx hang\n", __func__); ++ rtl8188e_silentreset_for_specific_platform(padapter); ++ } ++ } ++ } ++ } ++} ++ ++void rtl8188e_sreset_linked_status_check(struct adapter *padapter) ++{ ++ u32 rx_dma_status = 0; ++ u8 fw_status = 0; ++ rx_dma_status = rtw_read32(padapter, REG_RXDMA_STATUS); ++ if (rx_dma_status != 0x00) { ++ DBG_88E("%s REG_RXDMA_STATUS:0x%08x\n", __func__, rx_dma_status); ++ rtw_write32(padapter, REG_RXDMA_STATUS, rx_dma_status); ++ } ++ fw_status = rtw_read8(padapter, REG_FMETHR); ++ if (fw_status != 0x00) { ++ if (fw_status == 1) ++ DBG_88E("%s REG_FW_STATUS (0x%02x), Read_Efuse_Fail !!\n", __func__, fw_status); ++ else if (fw_status == 2) ++ DBG_88E("%s REG_FW_STATUS (0x%02x), Condition_No_Match !!\n", __func__, fw_status); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188e_xmit.c b/drivers/staging/r8188eu/hal/rtl8188e_xmit.c +new file mode 100644 +index 000000000000..46b871f3f631 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188e_xmit.c +@@ -0,0 +1,22 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_XMIT_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtl8188e_hal.h" ++ ++void handle_txrpt_ccx_88e(struct adapter *adapter, u8 *buf) ++{ ++ struct txrpt_ccx_88e *txrpt_ccx = (struct txrpt_ccx_88e *)buf; ++ ++ if (txrpt_ccx->int_ccx) { ++ if (txrpt_ccx->pkt_ok) ++ rtw_ack_tx_done(&adapter->xmitpriv, ++ RTW_SCTX_DONE_SUCCESS); ++ else ++ rtw_ack_tx_done(&adapter->xmitpriv, ++ RTW_SCTX_DONE_CCX_PKT_FAIL); ++ } ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188eu_led.c b/drivers/staging/r8188eu/hal/rtl8188eu_led.c +new file mode 100644 +index 000000000000..452d4bb87aba +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188eu_led.c +@@ -0,0 +1,94 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtl8188e_hal.h" ++#include "../include/rtl8188e_led.h" ++ ++/* LED object. */ ++ ++/* LED_819xUsb routines. */ ++/* Description: */ ++/* Turn on LED according to LedPin specified. */ ++void SwLedOn(struct adapter *padapter, struct LED_871x *pLed) ++{ ++ u8 LedCfg; ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ return; ++ LedCfg = rtw_read8(padapter, REG_LEDCFG2); ++ switch (pLed->LedPin) { ++ case LED_PIN_LED0: ++ rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); /* SW control led0 on. */ ++ break; ++ case LED_PIN_LED1: ++ rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0x0f) | BIT(5)); /* SW control led1 on. */ ++ break; ++ default: ++ break; ++ } ++ pLed->bLedOn = true; ++} ++ ++/* Description: */ ++/* Turn off LED according to LedPin specified. */ ++void SwLedOff(struct adapter *padapter, struct LED_871x *pLed) ++{ ++ u8 LedCfg; ++ struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped) ++ goto exit; ++ ++ LedCfg = rtw_read8(padapter, REG_LEDCFG2);/* 0x4E */ ++ ++ switch (pLed->LedPin) { ++ case LED_PIN_LED0: ++ if (pHalData->bLedOpenDrain) { ++ /* Open-drain arrangement for controlling the LED) */ ++ LedCfg &= 0x90; /* Set to software control. */ ++ rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3))); ++ LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); ++ LedCfg &= 0xFE; ++ rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); ++ } else { ++ rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3) | BIT(5) | BIT(6))); ++ } ++ break; ++ case LED_PIN_LED1: ++ LedCfg &= 0x0f; /* Set to software control. */ ++ rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3))); ++ break; ++ default: ++ break; ++ } ++exit: ++ pLed->bLedOn = false; ++} ++ ++/* Interface to manipulate LED objects. */ ++/* Default LED behavior. */ ++ ++/* Description: */ ++/* Initialize all LED_871x objects. */ ++void rtl8188eu_InitSwLeds(struct adapter *padapter) ++{ ++ struct led_priv *pledpriv = &padapter->ledpriv; ++ ++ pledpriv->LedControlHandler = LedControl8188eu; ++ ++ InitLed871x(padapter, &pledpriv->SwLed0, LED_PIN_LED0); ++ ++ InitLed871x(padapter, &pledpriv->SwLed1, LED_PIN_LED1); ++} ++ ++/* Description: */ ++/* DeInitialize all LED_819xUsb objects. */ ++void rtl8188eu_DeInitSwLeds(struct adapter *padapter) ++{ ++ struct led_priv *ledpriv = &padapter->ledpriv; ++ ++ DeInitLed871x(&ledpriv->SwLed0); ++ DeInitLed871x(&ledpriv->SwLed1); ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188eu_recv.c b/drivers/staging/r8188eu/hal/rtl8188eu_recv.c +new file mode 100644 +index 000000000000..2da7bde80cc0 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188eu_recv.c +@@ -0,0 +1,117 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188EU_RECV_C_ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/mlme_osdep.h" ++ ++#include "../include/usb_ops.h" ++#include "../include/wifi.h" ++ ++#include "../include/rtl8188e_hal.h" ++ ++void rtl8188eu_init_recvbuf(struct adapter *padapter, struct recv_buf *precvbuf) ++{ ++ precvbuf->transfer_len = 0; ++ ++ precvbuf->len = 0; ++ ++ precvbuf->ref_cnt = 0; ++ ++ if (precvbuf->pbuf) { ++ precvbuf->pdata = precvbuf->pbuf; ++ precvbuf->phead = precvbuf->pbuf; ++ precvbuf->ptail = precvbuf->pbuf; ++ precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ; ++ } ++} ++ ++int rtl8188eu_init_recv_priv(struct adapter *padapter) ++{ ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ int i, res = _SUCCESS; ++ struct recv_buf *precvbuf; ++ ++ tasklet_init(&precvpriv->recv_tasklet, ++ rtl8188eu_recv_tasklet, ++ (unsigned long)padapter); ++ ++ /* init recv_buf */ ++ _rtw_init_queue(&precvpriv->free_recv_buf_queue); ++ ++ precvpriv->pallocated_recv_buf = kzalloc(NR_RECVBUFF * sizeof(struct recv_buf) + 4, ++ GFP_KERNEL); ++ if (!precvpriv->pallocated_recv_buf) { ++ res = _FAIL; ++ goto exit; ++ } ++ memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF * sizeof(struct recv_buf) + 4); ++ ++ precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(precvpriv->pallocated_recv_buf), 4); ++ ++ precvbuf = (struct recv_buf *)precvpriv->precv_buf; ++ ++ for (i = 0; i < NR_RECVBUFF; i++) { ++ INIT_LIST_HEAD(&precvbuf->list); ++ spin_lock_init(&precvbuf->recvbuf_lock); ++ precvbuf->alloc_sz = MAX_RECVBUF_SZ; ++ res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); ++ if (res == _FAIL) ++ break; ++ precvbuf->ref_cnt = 0; ++ precvbuf->adapter = padapter; ++ precvbuf++; ++ } ++ precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; ++ skb_queue_head_init(&precvpriv->rx_skb_queue); ++ { ++ int i; ++ size_t tmpaddr = 0; ++ size_t alignment = 0; ++ struct sk_buff *pskb = NULL; ++ ++ skb_queue_head_init(&precvpriv->free_recv_skb_queue); ++ ++ for (i = 0; i < NR_PREALLOC_RECV_SKB; i++) { ++ pskb = __netdev_alloc_skb(padapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); ++ if (pskb) { ++ pskb->dev = padapter->pnetdev; ++ tmpaddr = (size_t)pskb->data; ++ alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1); ++ skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); ++ ++ skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); ++ } ++ pskb = NULL; ++ } ++ } ++exit: ++ return res; ++} ++ ++void rtl8188eu_free_recv_priv(struct adapter *padapter) ++{ ++ int i; ++ struct recv_buf *precvbuf; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ precvbuf = (struct recv_buf *)precvpriv->precv_buf; ++ ++ for (i = 0; i < NR_RECVBUFF; i++) { ++ rtw_os_recvbuf_resource_free(padapter, precvbuf); ++ precvbuf++; ++ } ++ ++ kfree(precvpriv->pallocated_recv_buf); ++ ++ if (skb_queue_len(&precvpriv->rx_skb_queue)) ++ DBG_88E(KERN_WARNING "rx_skb_queue not empty\n"); ++ skb_queue_purge(&precvpriv->rx_skb_queue); ++ ++ if (skb_queue_len(&precvpriv->free_recv_skb_queue)) ++ DBG_88E(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); ++ ++ skb_queue_purge(&precvpriv->free_recv_skb_queue); ++} +diff --git a/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c b/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c +new file mode 100644 +index 000000000000..17be67ac5fae +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c +@@ -0,0 +1,672 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RTL8188E_XMIT_C_ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_ops.h" ++#include "../include/rtl8188e_hal.h" ++ ++s32 rtl8188eu_init_xmit_priv(struct adapter *adapt) ++{ ++ struct xmit_priv *pxmitpriv = &adapt->xmitpriv; ++ ++ tasklet_init(&pxmitpriv->xmit_tasklet, ++ rtl8188eu_xmit_tasklet, ++ (unsigned long)adapt); ++ return _SUCCESS; ++} ++ ++static u8 urb_zero_packet_chk(struct adapter *adapt, int sz) ++{ ++ u8 set_tx_desc_offset; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ set_tx_desc_offset = (((sz + TXDESC_SIZE) % haldata->UsbBulkOutSize) == 0) ? 1 : 0; ++ ++ return set_tx_desc_offset; ++} ++ ++static void rtl8188eu_cal_txdesc_chksum(struct tx_desc *ptxdesc) ++{ ++ u16 *usptr = (u16 *)ptxdesc; ++ u32 count = 16; /* (32 bytes / 2 bytes per XOR) => 16 times */ ++ u32 index; ++ u16 checksum = 0; ++ ++ /* Clear first */ ++ ptxdesc->txdw7 &= cpu_to_le32(0xffff0000); ++ ++ for (index = 0; index < count; index++) ++ checksum = checksum ^ le16_to_cpu(*(__le16 *)(usptr + index)); ++ ptxdesc->txdw7 |= cpu_to_le32(0x0000ffff & checksum); ++} ++ ++/* Description: In normal chip, we should send some packet to Hw which will be used by Fw */ ++/* in FW LPS mode. The function is to fill the Tx descriptor of this packets, then */ ++/* Fw can tell Hw to send these packet derectly. */ ++void rtl8188e_fill_fake_txdesc(struct adapter *adapt, u8 *desc, u32 BufferLen, u8 ispspoll, u8 is_btqosnull) ++{ ++ struct tx_desc *ptxdesc; ++ ++ /* Clear all status */ ++ ptxdesc = (struct tx_desc *)desc; ++ memset(desc, 0, TXDESC_SIZE); ++ ++ /* offset 0 */ ++ ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); /* own, bFirstSeg, bLastSeg; */ ++ ++ ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); /* 32 bytes for TX Desc */ ++ ++ ptxdesc->txdw0 |= cpu_to_le32(BufferLen & 0x0000ffff); /* Buffer size + command header */ ++ ++ /* offset 4 */ ++ ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT << QSEL_SHT) & 0x00001f00); /* Fixed queue of Mgnt queue */ ++ ++ /* Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. */ ++ if (ispspoll) { ++ ptxdesc->txdw1 |= cpu_to_le32(NAVUSEHDR); ++ } else { ++ ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); /* Hw set sequence number */ ++ ptxdesc->txdw3 |= cpu_to_le32((8 << 28)); /* set bit3 to 1. Suugested by TimChen. 2009.12.29. */ ++ } ++ ++ if (is_btqosnull) ++ ptxdesc->txdw2 |= cpu_to_le32(BIT(23)); /* BT NULL */ ++ ++ /* offset 16 */ ++ ptxdesc->txdw4 |= cpu_to_le32(BIT(8));/* driver uses rate */ ++ ++ /* USB interface drop packet if the checksum of descriptor isn't correct. */ ++ /* Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). */ ++ rtl8188eu_cal_txdesc_chksum(ptxdesc); ++} ++ ++static void fill_txdesc_sectype(struct pkt_attrib *pattrib, struct tx_desc *ptxdesc) ++{ ++ if ((pattrib->encrypt > 0) && !pattrib->bswenc) { ++ switch (pattrib->encrypt) { ++ /* SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES */ ++ case _WEP40_: ++ case _WEP104_: ++ ptxdesc->txdw1 |= cpu_to_le32((0x01 << SEC_TYPE_SHT) & 0x00c00000); ++ ptxdesc->txdw2 |= cpu_to_le32(0x7 << AMPDU_DENSITY_SHT); ++ break; ++ case _TKIP_: ++ case _TKIP_WTMIC_: ++ ptxdesc->txdw1 |= cpu_to_le32((0x01 << SEC_TYPE_SHT) & 0x00c00000); ++ ptxdesc->txdw2 |= cpu_to_le32(0x7 << AMPDU_DENSITY_SHT); ++ break; ++ case _AES_: ++ ptxdesc->txdw1 |= cpu_to_le32((0x03 << SEC_TYPE_SHT) & 0x00c00000); ++ ptxdesc->txdw2 |= cpu_to_le32(0x7 << AMPDU_DENSITY_SHT); ++ break; ++ case _NO_PRIVACY_: ++ default: ++ break; ++ } ++ } ++} ++ ++static void fill_txdesc_vcs(struct pkt_attrib *pattrib, __le32 *pdw) ++{ ++ switch (pattrib->vcs_mode) { ++ case RTS_CTS: ++ *pdw |= cpu_to_le32(RTS_EN); ++ break; ++ case CTS_TO_SELF: ++ *pdw |= cpu_to_le32(CTS_2_SELF); ++ break; ++ case NONE_VCS: ++ default: ++ break; ++ } ++ if (pattrib->vcs_mode) { ++ *pdw |= cpu_to_le32(HW_RTS_EN); ++ /* Set RTS BW */ ++ if (pattrib->ht_en) { ++ *pdw |= (pattrib->bwmode & HT_CHANNEL_WIDTH_40) ? cpu_to_le32(BIT(27)) : 0; ++ ++ if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ++ *pdw |= cpu_to_le32((0x01 << 28) & 0x30000000); ++ else if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) ++ *pdw |= cpu_to_le32((0x02 << 28) & 0x30000000); ++ else if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ++ *pdw |= 0; ++ else ++ *pdw |= cpu_to_le32((0x03 << 28) & 0x30000000); ++ } ++ } ++} ++ ++static void fill_txdesc_phy(struct pkt_attrib *pattrib, __le32 *pdw) ++{ ++ if (pattrib->ht_en) { ++ *pdw |= (pattrib->bwmode & HT_CHANNEL_WIDTH_40) ? cpu_to_le32(BIT(25)) : 0; ++ ++ if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ++ *pdw |= cpu_to_le32((0x01 << DATA_SC_SHT) & 0x003f0000); ++ else if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) ++ *pdw |= cpu_to_le32((0x02 << DATA_SC_SHT) & 0x003f0000); ++ else if (pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ++ *pdw |= 0; ++ else ++ *pdw |= cpu_to_le32((0x03 << DATA_SC_SHT) & 0x003f0000); ++ } ++} ++ ++static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz, u8 bagg_pkt) ++{ ++ int pull = 0; ++ uint qsel; ++ u8 data_rate, pwr_status, offset; ++ struct adapter *adapt = pxmitframe->padapter; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct tx_desc *ptxdesc = (struct tx_desc *)pmem; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if (adapt->registrypriv.mp_mode == 0) { ++ if ((!bagg_pkt) && (urb_zero_packet_chk(adapt, sz) == 0)) { ++ ptxdesc = (struct tx_desc *)(pmem + PACKET_OFFSET_SZ); ++ pull = 1; ++ } ++ } ++ ++ memset(ptxdesc, 0, sizeof(struct tx_desc)); ++ ++ /* 4 offset 0 */ ++ ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); ++ ptxdesc->txdw0 |= cpu_to_le32(sz & 0x0000ffff);/* update TXPKTSIZE */ ++ ++ offset = TXDESC_SIZE + OFFSET_SZ; ++ ++ ptxdesc->txdw0 |= cpu_to_le32(((offset) << OFFSET_SHT) & 0x00ff0000);/* 32 bytes for TX Desc */ ++ ++ if (is_multicast_ether_addr(pattrib->ra)) ++ ptxdesc->txdw0 |= cpu_to_le32(BMC); ++ ++ if (adapt->registrypriv.mp_mode == 0) { ++ if (!bagg_pkt) { ++ if ((pull) && (pxmitframe->pkt_offset > 0)) ++ pxmitframe->pkt_offset = pxmitframe->pkt_offset - 1; ++ } ++ } ++ ++ /* pkt_offset, unit:8 bytes padding */ ++ if (pxmitframe->pkt_offset > 0) ++ ptxdesc->txdw1 |= cpu_to_le32((pxmitframe->pkt_offset << 26) & 0x7c000000); ++ ++ /* driver uses rate */ ++ ptxdesc->txdw4 |= cpu_to_le32(USERATE);/* rate control always by driver */ ++ ++ if ((pxmitframe->frame_tag & 0x0f) == DATA_FRAMETAG) { ++ /* offset 4 */ ++ ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id & 0x3F); ++ ++ qsel = (uint)(pattrib->qsel & 0x0000001f); ++ ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); ++ ++ ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); ++ ++ fill_txdesc_sectype(pattrib, ptxdesc); ++ ++ if (pattrib->ampdu_en) { ++ ptxdesc->txdw2 |= cpu_to_le32(AGG_EN);/* AGG EN */ ++ ptxdesc->txdw6 = cpu_to_le32(0x6666f800); ++ } else { ++ ptxdesc->txdw2 |= cpu_to_le32(AGG_BK);/* AGG BK */ ++ } ++ ++ /* offset 8 */ ++ ++ /* offset 12 */ ++ ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0x0FFF0000); ++ ++ /* offset 16 , offset 20 */ ++ if (pattrib->qos_en) ++ ptxdesc->txdw4 |= cpu_to_le32(QOS);/* QoS */ ++ ++ /* offset 20 */ ++ if (pxmitframe->agg_num > 1) ++ ptxdesc->txdw5 |= cpu_to_le32((pxmitframe->agg_num << USB_TXAGG_NUM_SHT) & 0xFF000000); ++ ++ if ((pattrib->ether_type != 0x888e) && ++ (pattrib->ether_type != 0x0806) && ++ (pattrib->ether_type != 0x88b4) && ++ (pattrib->dhcp_pkt != 1)) { ++ /* Non EAP & ARP & DHCP type data packet */ ++ ++ fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); ++ fill_txdesc_phy(pattrib, &ptxdesc->txdw4); ++ ++ ptxdesc->txdw4 |= cpu_to_le32(0x00000008);/* RTS Rate=24M */ ++ ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00);/* DATA/RTS Rate FB LMT */ ++ ++ if (pattrib->ht_en) { ++ if (ODM_RA_GetShortGI_8188E(&haldata->odmpriv, pattrib->mac_id)) ++ ptxdesc->txdw5 |= cpu_to_le32(SGI);/* SGI */ ++ } ++ data_rate = ODM_RA_GetDecisionRate_8188E(&haldata->odmpriv, pattrib->mac_id); ++ ptxdesc->txdw5 |= cpu_to_le32(data_rate & 0x3F); ++ pwr_status = ODM_RA_GetHwPwrStatus_8188E(&haldata->odmpriv, pattrib->mac_id); ++ ptxdesc->txdw4 |= cpu_to_le32((pwr_status & 0x7) << PWR_STATUS_SHT); ++ } else { ++ /* EAP data packet and ARP packet and DHCP. */ ++ /* Use the 1M data rate to send the EAP/ARP packet. */ ++ /* This will maybe make the handshake smooth. */ ++ ptxdesc->txdw2 |= cpu_to_le32(AGG_BK);/* AGG BK */ ++ if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) ++ ptxdesc->txdw4 |= cpu_to_le32(BIT(24));/* DATA_SHORT */ ++ ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate)); ++ } ++ } else if ((pxmitframe->frame_tag & 0x0f) == MGNT_FRAMETAG) { ++ /* offset 4 */ ++ ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id & 0x3f); ++ ++ qsel = (uint)(pattrib->qsel & 0x0000001f); ++ ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); ++ ++ ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000f0000); ++ ++ /* offset 8 */ ++ /* CCX-TXRPT ack for xmit mgmt frames. */ ++ if (pxmitframe->ack_report) ++ ptxdesc->txdw2 |= cpu_to_le32(BIT(19)); ++ ++ /* offset 12 */ ++ ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0x0FFF0000); ++ ++ /* offset 20 */ ++ ptxdesc->txdw5 |= cpu_to_le32(RTY_LMT_EN);/* retry limit enable */ ++ if (pattrib->retry_ctrl) ++ ptxdesc->txdw5 |= cpu_to_le32(0x00180000);/* retry limit = 6 */ ++ else ++ ptxdesc->txdw5 |= cpu_to_le32(0x00300000);/* retry limit = 12 */ ++ ++ ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate)); ++ } else if ((pxmitframe->frame_tag & 0x0f) == TXAGG_FRAMETAG) { ++ DBG_88E("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); ++ } else if (((pxmitframe->frame_tag & 0x0f) == MP_FRAMETAG) && ++ (adapt->registrypriv.mp_mode == 1)) { ++ fill_txdesc_for_mp(adapt, ptxdesc); ++ } else { ++ DBG_88E("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); ++ ++ /* offset 4 */ ++ ptxdesc->txdw1 |= cpu_to_le32((4) & 0x3f);/* CAM_ID(MAC_ID) */ ++ ++ ptxdesc->txdw1 |= cpu_to_le32((6 << RATE_ID_SHT) & 0x000f0000);/* raid */ ++ ++ /* offset 8 */ ++ ++ /* offset 12 */ ++ ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0x0fff0000); ++ ++ /* offset 20 */ ++ ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate)); ++ } ++ ++ /* 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. */ ++ /* (1) The sequence number of each non-Qos frame / broadcast / multicast / */ ++ /* mgnt frame should be controlled by Hw because Fw will also send null data */ ++ /* which we cannot control when Fw LPS enable. */ ++ /* --> default enable non-Qos data sequense number. 2010.06.23. by tynli. */ ++ /* (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. */ ++ /* (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. */ ++ /* 2010.06.23. Added by tynli. */ ++ if (!pattrib->qos_en) { ++ ptxdesc->txdw3 |= cpu_to_le32(EN_HWSEQ); /* Hw set sequence number */ ++ ptxdesc->txdw4 |= cpu_to_le32(HW_SSN); /* Hw set sequence number */ ++ } ++ ++ ODM_SetTxAntByTxInfo_88E(&haldata->odmpriv, pmem, pattrib->mac_id); ++ ++ rtl8188eu_cal_txdesc_chksum(ptxdesc); ++ return pull; ++} ++ ++/* for non-agg data frame or management frame */ ++static s32 rtw_dump_xframe(struct adapter *adapt, struct xmit_frame *pxmitframe) ++{ ++ s32 ret = _SUCCESS; ++ s32 inner_ret = _SUCCESS; ++ int t, sz, w_sz, pull = 0; ++ u8 *mem_addr; ++ u32 ff_hwaddr; ++ struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct xmit_priv *pxmitpriv = &adapt->xmitpriv; ++ struct security_priv *psecuritypriv = &adapt->securitypriv; ++ if ((pxmitframe->frame_tag == DATA_FRAMETAG) && ++ (pxmitframe->attrib.ether_type != 0x0806) && ++ (pxmitframe->attrib.ether_type != 0x888e) && ++ (pxmitframe->attrib.ether_type != 0x88b4) && ++ (pxmitframe->attrib.dhcp_pkt != 1)) ++ rtw_issue_addbareq_cmd(adapt, pxmitframe); ++ mem_addr = pxmitframe->buf_addr; ++ ++ for (t = 0; t < pattrib->nr_frags; t++) { ++ if (inner_ret != _SUCCESS && ret == _SUCCESS) ++ ret = _FAIL; ++ ++ if (t != (pattrib->nr_frags - 1)) { ++ sz = pxmitpriv->frag_len; ++ sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); ++ } else { ++ /* no frag */ ++ sz = pattrib->last_txcmdsz; ++ } ++ ++ pull = update_txdesc(pxmitframe, mem_addr, sz, false); ++ ++ if (pull) { ++ mem_addr += PACKET_OFFSET_SZ; /* pull txdesc head */ ++ pxmitframe->buf_addr = mem_addr; ++ w_sz = sz + TXDESC_SIZE; ++ } else { ++ w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; ++ } ++ ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); ++ ++ inner_ret = rtw_write_port(adapt, ff_hwaddr, w_sz, (unsigned char *)pxmitbuf); ++ ++ rtw_count_tx_stats(adapt, pxmitframe, sz); ++ ++ mem_addr += w_sz; ++ ++ mem_addr = (u8 *)RND4(((size_t)(mem_addr))); ++ } ++ ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ ++ if (ret != _SUCCESS) ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN); ++ ++ return ret; ++} ++ ++static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) ++{ ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ ++ u32 len = 0; ++ ++ /* no consider fragement */ ++ len = pattrib->hdrlen + pattrib->iv_len + ++ SNAP_SIZE + sizeof(u16) + ++ pattrib->pktlen + ++ ((pattrib->bswenc) ? pattrib->icv_len : 0); ++ ++ if (pattrib->encrypt == _TKIP_) ++ len += 8; ++ ++ return len; ++} ++ ++s32 rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct xmit_frame *pxmitframe = NULL; ++ struct xmit_frame *pfirstframe = NULL; ++ ++ /* aggregate variable */ ++ struct hw_xmit *phwxmit; ++ struct sta_info *psta = NULL; ++ struct tx_servq *ptxservq = NULL; ++ struct list_head *xmitframe_plist = NULL, *xmitframe_phead = NULL; ++ ++ u32 pbuf; /* next pkt address */ ++ u32 pbuf_tail; /* last pkt tail */ ++ u32 len; /* packet length, except TXDESC_SIZE and PKT_OFFSET */ ++ ++ u32 bulksize = haldata->UsbBulkOutSize; ++ u8 desc_cnt; ++ u32 bulkptr; ++ ++ /* dump frame variable */ ++ u32 ff_hwaddr; ++ ++ /* check xmitbuffer is ok */ ++ if (!pxmitbuf) { ++ pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); ++ if (!pxmitbuf) ++ return false; ++ } ++ ++ /* 3 1. pick up first frame */ ++ do { ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ ++ pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); ++ if (!pxmitframe) { ++ /* no more xmit frame, release xmit buffer */ ++ rtw_free_xmitbuf(pxmitpriv, pxmitbuf); ++ return false; ++ } ++ ++ pxmitframe->pxmitbuf = pxmitbuf; ++ pxmitframe->buf_addr = pxmitbuf->pbuf; ++ pxmitbuf->priv_data = pxmitframe; ++ ++ pxmitframe->agg_num = 1; /* alloc xmitframe should assign to 1. */ ++ pxmitframe->pkt_offset = 1; /* first frame of aggregation, reserve offset */ ++ ++ rtw_xmitframe_coalesce(adapt, pxmitframe->pkt, pxmitframe); ++ ++ /* always return ndis_packet after rtw_xmitframe_coalesce */ ++ rtw_os_xmit_complete(adapt, pxmitframe); ++ ++ break; ++ } while (1); ++ ++ /* 3 2. aggregate same priority and same DA(AP or STA) frames */ ++ pfirstframe = pxmitframe; ++ len = xmitframe_need_length(pfirstframe) + TXDESC_SIZE + (pfirstframe->pkt_offset * PACKET_OFFSET_SZ); ++ pbuf_tail = len; ++ pbuf = _RND8(pbuf_tail); ++ ++ /* check pkt amount in one bulk */ ++ desc_cnt = 0; ++ bulkptr = bulksize; ++ if (pbuf < bulkptr) { ++ desc_cnt++; ++ } else { ++ desc_cnt = 0; ++ bulkptr = ((pbuf / bulksize) + 1) * bulksize; /* round to next bulksize */ ++ } ++ ++ /* dequeue same priority packet from station tx queue */ ++ psta = pfirstframe->attrib.psta; ++ switch (pfirstframe->attrib.priority) { ++ case 1: ++ case 2: ++ ptxservq = &psta->sta_xmitpriv.bk_q; ++ phwxmit = pxmitpriv->hwxmits + 3; ++ break; ++ case 4: ++ case 5: ++ ptxservq = &psta->sta_xmitpriv.vi_q; ++ phwxmit = pxmitpriv->hwxmits + 1; ++ break; ++ case 6: ++ case 7: ++ ptxservq = &psta->sta_xmitpriv.vo_q; ++ phwxmit = pxmitpriv->hwxmits; ++ break; ++ case 0: ++ case 3: ++ default: ++ ptxservq = &psta->sta_xmitpriv.be_q; ++ phwxmit = pxmitpriv->hwxmits + 2; ++ break; ++ } ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ xmitframe_phead = get_list_head(&ptxservq->sta_pending); ++ xmitframe_plist = xmitframe_phead->next; ++ ++ while (xmitframe_phead != xmitframe_plist) { ++ pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); ++ xmitframe_plist = xmitframe_plist->next; ++ ++ pxmitframe->agg_num = 0; /* not first frame of aggregation */ ++ pxmitframe->pkt_offset = 0; /* not first frame of aggregation, no need to reserve offset */ ++ ++ len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); ++ ++ if (_RND8(pbuf + len) > MAX_XMITBUF_SZ) { ++ pxmitframe->agg_num = 1; ++ pxmitframe->pkt_offset = 1; ++ break; ++ } ++ list_del_init(&pxmitframe->list); ++ ptxservq->qcnt--; ++ phwxmit->accnt--; ++ ++ pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; ++ ++ rtw_xmitframe_coalesce(adapt, pxmitframe->pkt, pxmitframe); ++ /* always return ndis_packet after rtw_xmitframe_coalesce */ ++ rtw_os_xmit_complete(adapt, pxmitframe); ++ ++ /* (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz */ ++ update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz, true); ++ ++ /* don't need xmitframe any more */ ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ ++ /* handle pointer and stop condition */ ++ pbuf_tail = pbuf + len; ++ pbuf = _RND8(pbuf_tail); ++ ++ pfirstframe->agg_num++; ++ if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) ++ break; ++ ++ if (pbuf < bulkptr) { ++ desc_cnt++; ++ if (desc_cnt == haldata->UsbTxAggDescNum) ++ break; ++ } else { ++ desc_cnt = 0; ++ bulkptr = ((pbuf / bulksize) + 1) * bulksize; ++ } ++ } /* end while (aggregate same priority and same DA(AP or STA) frames) */ ++ ++ if (list_empty(&ptxservq->sta_pending.queue)) ++ list_del_init(&ptxservq->tx_pending); ++ ++ spin_unlock_bh(&pxmitpriv->lock); ++ if ((pfirstframe->attrib.ether_type != 0x0806) && ++ (pfirstframe->attrib.ether_type != 0x888e) && ++ (pfirstframe->attrib.ether_type != 0x88b4) && ++ (pfirstframe->attrib.dhcp_pkt != 1)) ++ rtw_issue_addbareq_cmd(adapt, pfirstframe); ++ /* 3 3. update first frame txdesc */ ++ if ((pbuf_tail % bulksize) == 0) { ++ /* remove pkt_offset */ ++ pbuf_tail -= PACKET_OFFSET_SZ; ++ pfirstframe->buf_addr += PACKET_OFFSET_SZ; ++ pfirstframe->pkt_offset--; ++ } ++ ++ update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz, true); ++ ++ /* 3 4. write xmit buffer to USB FIFO */ ++ ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); ++ rtw_write_port(adapt, ff_hwaddr, pbuf_tail, (u8 *)pxmitbuf); ++ ++ /* 3 5. update statisitc */ ++ pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); ++ pbuf_tail -= (pfirstframe->pkt_offset * PACKET_OFFSET_SZ); ++ ++ rtw_count_tx_stats(adapt, pfirstframe, pbuf_tail); ++ ++ rtw_free_xmitframe(pxmitpriv, pfirstframe); ++ ++ return true; ++} ++ ++static s32 xmitframe_direct(struct adapter *adapt, struct xmit_frame *pxmitframe) ++{ ++ s32 res = _SUCCESS; ++ ++ res = rtw_xmitframe_coalesce(adapt, pxmitframe->pkt, pxmitframe); ++ if (res == _SUCCESS) ++ rtw_dump_xframe(adapt, pxmitframe); ++ else ++ DBG_88E("==> %s xmitframe_coalsece failed\n", __func__); ++ return res; ++} ++ ++/* ++ * Return ++ * true dump packet directly ++ * false enqueue packet ++ */ ++static s32 pre_xmitframe(struct adapter *adapt, struct xmit_frame *pxmitframe) ++{ ++ s32 res; ++ struct xmit_buf *pxmitbuf = NULL; ++ struct xmit_priv *pxmitpriv = &adapt->xmitpriv; ++ struct pkt_attrib *pattrib = &pxmitframe->attrib; ++ struct mlme_priv *pmlmepriv = &adapt->mlmepriv; ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ if (rtw_txframes_sta_ac_pending(adapt, pattrib) > 0) ++ goto enqueue; ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING)) ++ goto enqueue; ++ ++ pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); ++ if (!pxmitbuf) ++ goto enqueue; ++ ++ spin_unlock_bh(&pxmitpriv->lock); ++ ++ pxmitframe->pxmitbuf = pxmitbuf; ++ pxmitframe->buf_addr = pxmitbuf->pbuf; ++ pxmitbuf->priv_data = pxmitframe; ++ ++ if (xmitframe_direct(adapt, pxmitframe) != _SUCCESS) { ++ rtw_free_xmitbuf(pxmitpriv, pxmitbuf); ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ } ++ ++ return true; ++ ++enqueue: ++ res = rtw_xmitframe_enqueue(adapt, pxmitframe); ++ spin_unlock_bh(&pxmitpriv->lock); ++ ++ if (res != _SUCCESS) { ++ rtw_free_xmitframe(pxmitpriv, pxmitframe); ++ ++ /* Trick, make the statistics correct */ ++ pxmitpriv->tx_pkts--; ++ pxmitpriv->tx_drop++; ++ return true; ++ } ++ ++ return false; ++} ++ ++s32 rtl8188eu_mgnt_xmit(struct adapter *adapt, struct xmit_frame *pmgntframe) ++{ ++ return rtw_dump_xframe(adapt, pmgntframe); ++} ++ ++/* ++ * Return ++ * true dump packet directly ok ++ * false temporary can't transmit packets to hardware ++ */ ++s32 rtl8188eu_hal_xmit(struct adapter *adapt, struct xmit_frame *pxmitframe) ++{ ++ return pre_xmitframe(adapt, pxmitframe); ++} +diff --git a/drivers/staging/r8188eu/hal/usb_halinit.c b/drivers/staging/r8188eu/hal/usb_halinit.c +new file mode 100644 +index 000000000000..5cdabf43d4fd +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/usb_halinit.c +@@ -0,0 +1,2271 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _HCI_HAL_INIT_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/rtw_efuse.h" ++ ++#include "../include/rtl8188e_hal.h" ++#include "../include/rtl8188e_led.h" ++#include "../include/rtw_iol.h" ++#include "../include/usb_ops.h" ++#include "../include/usb_osintf.h" ++ ++#define HAL_MAC_ENABLE 1 ++#define HAL_BB_ENABLE 1 ++#define HAL_RF_ENABLE 1 ++ ++static void _ConfigNormalChipOutEP_8188E(struct adapter *adapt, u8 NumOutPipe) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ switch (NumOutPipe) { ++ case 3: ++ haldata->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ; ++ haldata->OutEpNumber = 3; ++ break; ++ case 2: ++ haldata->OutEpQueueSel = TX_SELE_HQ | TX_SELE_NQ; ++ haldata->OutEpNumber = 2; ++ break; ++ case 1: ++ haldata->OutEpQueueSel = TX_SELE_HQ; ++ haldata->OutEpNumber = 1; ++ break; ++ default: ++ break; ++ } ++ DBG_88E("%s OutEpQueueSel(0x%02x), OutEpNumber(%d)\n", __func__, haldata->OutEpQueueSel, haldata->OutEpNumber); ++} ++ ++static bool HalUsbSetQueuePipeMapping8188EUsb(struct adapter *adapt, u8 NumInPipe, u8 NumOutPipe) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ bool result = false; ++ ++ _ConfigNormalChipOutEP_8188E(adapt, NumOutPipe); ++ ++ /* Normal chip with one IN and one OUT doesn't have interrupt IN EP. */ ++ if (1 == haldata->OutEpNumber) { ++ if (1 != NumInPipe) ++ return result; ++ } ++ ++ /* All config other than above support one Bulk IN and one Interrupt IN. */ ++ ++ result = Hal_MappingOutPipe(adapt, NumOutPipe); ++ ++ return result; ++} ++ ++static void rtl8188eu_interface_configure(struct adapter *adapt) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapt); ++ ++ if (pdvobjpriv->ishighspeed) ++ haldata->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;/* 512 bytes */ ++ else ++ haldata->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;/* 64 bytes */ ++ ++ haldata->interfaceIndex = pdvobjpriv->InterfaceNumber; ++ ++ haldata->UsbTxAggMode = 1; ++ haldata->UsbTxAggDescNum = 0x6; /* only 4 bits */ ++ ++ haldata->UsbRxAggMode = USB_RX_AGG_DMA;/* USB_RX_AGG_DMA; */ ++ haldata->UsbRxAggBlockCount = 8; /* unit : 512b */ ++ haldata->UsbRxAggBlockTimeout = 0x6; ++ haldata->UsbRxAggPageCount = 48; /* uint :128 b 0x0A; 10 = MAX_RX_DMA_BUFFER_SIZE/2/haldata->UsbBulkOutSize */ ++ haldata->UsbRxAggPageTimeout = 0x4; /* 6, absolute time = 34ms/(2^6) */ ++ ++ HalUsbSetQueuePipeMapping8188EUsb(adapt, ++ pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); ++} ++ ++static u32 rtl8188eu_InitPowerOn(struct adapter *adapt) ++{ ++ u16 value16; ++ /* HW Power on sequence */ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ if (haldata->bMacPwrCtrlOn) ++ return _SUCCESS; ++ ++ if (!HalPwrSeqCmdParsing(adapt, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8188E_NIC_PWR_ON_FLOW)) { ++ DBG_88E(KERN_ERR "%s: run power on flow fail\n", __func__); ++ return _FAIL; ++ } ++ ++ /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ ++ /* Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. */ ++ rtw_write16(adapt, REG_CR, 0x00); /* suggseted by zhouzhou, by page, 20111230 */ ++ ++ /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ ++ value16 = rtw_read16(adapt, REG_CR); ++ value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN ++ | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); ++ /* for SDIO - Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. */ ++ ++ rtw_write16(adapt, REG_CR, value16); ++ haldata->bMacPwrCtrlOn = true; ++ ++ return _SUCCESS; ++} ++ ++/* Shall USB interface init this? */ ++static void _InitInterrupt(struct adapter *Adapter) ++{ ++ u32 imr, imr_ex; ++ u8 usb_opt; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ /* HISR write one to clear */ ++ rtw_write32(Adapter, REG_HISR_88E, 0xFFFFFFFF); ++ /* HIMR - */ ++ imr = IMR_PSTIMEOUT_88E | IMR_TBDER_88E | IMR_CPWM_88E | IMR_CPWM2_88E; ++ rtw_write32(Adapter, REG_HIMR_88E, imr); ++ haldata->IntrMask[0] = imr; ++ ++ imr_ex = IMR_TXERR_88E | IMR_RXERR_88E | IMR_TXFOVW_88E | IMR_RXFOVW_88E; ++ rtw_write32(Adapter, REG_HIMRE_88E, imr_ex); ++ haldata->IntrMask[1] = imr_ex; ++ ++ /* REG_USB_SPECIAL_OPTION - BIT(4) */ ++ /* 0; Use interrupt endpoint to upload interrupt pkt */ ++ /* 1; Use bulk endpoint to upload interrupt pkt, */ ++ usb_opt = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); ++ ++ if (!adapter_to_dvobj(Adapter)->ishighspeed) ++ usb_opt = usb_opt & (~INT_BULK_SEL); ++ else ++ usb_opt = usb_opt | (INT_BULK_SEL); ++ ++ rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, usb_opt); ++} ++ ++static void _InitQueueReservedPage(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ struct registry_priv *pregistrypriv = &Adapter->registrypriv; ++ u32 numHQ = 0; ++ u32 numLQ = 0; ++ u32 numNQ = 0; ++ u32 numPubQ; ++ u32 value32; ++ u8 value8; ++ bool bWiFiConfig = pregistrypriv->wifi_spec; ++ ++ if (bWiFiConfig) { ++ if (haldata->OutEpQueueSel & TX_SELE_HQ) ++ numHQ = 0x29; ++ ++ if (haldata->OutEpQueueSel & TX_SELE_LQ) ++ numLQ = 0x1C; ++ ++ /* NOTE: This step shall be proceed before writting REG_RQPN. */ ++ if (haldata->OutEpQueueSel & TX_SELE_NQ) ++ numNQ = 0x1C; ++ value8 = (u8)_NPQ(numNQ); ++ rtw_write8(Adapter, REG_RQPN_NPQ, value8); ++ ++ numPubQ = 0xA8 - numHQ - numLQ - numNQ; ++ ++ /* TX DMA */ ++ value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN; ++ rtw_write32(Adapter, REG_RQPN, value32); ++ } else { ++ rtw_write16(Adapter, REG_RQPN_NPQ, 0x0000);/* Just follow MP Team,??? Georgia 03/28 */ ++ rtw_write16(Adapter, REG_RQPN_NPQ, 0x0d); ++ rtw_write32(Adapter, REG_RQPN, 0x808E000d);/* reserve 7 page for LPS */ ++ } ++} ++ ++static void _InitTxBufferBoundary(struct adapter *Adapter, u8 txpktbuf_bndy) ++{ ++ rtw_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); ++ rtw_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); ++ rtw_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy); ++ rtw_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy); ++ rtw_write8(Adapter, REG_TDECTRL + 1, txpktbuf_bndy); ++} ++ ++static void _InitPageBoundary(struct adapter *Adapter) ++{ ++ /* RX Page Boundary */ ++ /* */ ++ u16 rxff_bndy = MAX_RX_DMA_BUFFER_SIZE_88E - 1; ++ ++ rtw_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy); ++} ++ ++static void _InitNormalChipRegPriority(struct adapter *Adapter, u16 beQ, ++ u16 bkQ, u16 viQ, u16 voQ, u16 mgtQ, ++ u16 hiQ) ++{ ++ u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); ++ ++ value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | ++ _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | ++ _TXDMA_MGQ_MAP(mgtQ) | _TXDMA_HIQ_MAP(hiQ); ++ ++ rtw_write16(Adapter, REG_TRXDMA_CTRL, value16); ++} ++ ++static void _InitNormalChipOneOutEpPriority(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ u16 value = 0; ++ switch (haldata->OutEpQueueSel) { ++ case TX_SELE_HQ: ++ value = QUEUE_HIGH; ++ break; ++ case TX_SELE_LQ: ++ value = QUEUE_LOW; ++ break; ++ case TX_SELE_NQ: ++ value = QUEUE_NORMAL; ++ break; ++ default: ++ break; ++ } ++ _InitNormalChipRegPriority(Adapter, value, value, value, value, ++ value, value); ++} ++ ++static void _InitNormalChipTwoOutEpPriority(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ struct registry_priv *pregistrypriv = &Adapter->registrypriv; ++ u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ; ++ u16 valueHi = 0; ++ u16 valueLow = 0; ++ ++ switch (haldata->OutEpQueueSel) { ++ case (TX_SELE_HQ | TX_SELE_LQ): ++ valueHi = QUEUE_HIGH; ++ valueLow = QUEUE_LOW; ++ break; ++ case (TX_SELE_NQ | TX_SELE_LQ): ++ valueHi = QUEUE_NORMAL; ++ valueLow = QUEUE_LOW; ++ break; ++ case (TX_SELE_HQ | TX_SELE_NQ): ++ valueHi = QUEUE_HIGH; ++ valueLow = QUEUE_NORMAL; ++ break; ++ default: ++ break; ++ } ++ ++ if (!pregistrypriv->wifi_spec) { ++ beQ = valueLow; ++ bkQ = valueLow; ++ viQ = valueHi; ++ voQ = valueHi; ++ mgtQ = valueHi; ++ hiQ = valueHi; ++ } else {/* for WMM ,CONFIG_OUT_EP_WIFI_MODE */ ++ beQ = valueLow; ++ bkQ = valueHi; ++ viQ = valueHi; ++ voQ = valueLow; ++ mgtQ = valueHi; ++ hiQ = valueHi; ++ } ++ _InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ); ++} ++ ++static void _InitNormalChipThreeOutEpPriority(struct adapter *Adapter) ++{ ++ struct registry_priv *pregistrypriv = &Adapter->registrypriv; ++ u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ; ++ ++ if (!pregistrypriv->wifi_spec) {/* typical setting */ ++ beQ = QUEUE_LOW; ++ bkQ = QUEUE_LOW; ++ viQ = QUEUE_NORMAL; ++ voQ = QUEUE_HIGH; ++ mgtQ = QUEUE_HIGH; ++ hiQ = QUEUE_HIGH; ++ } else {/* for WMM */ ++ beQ = QUEUE_LOW; ++ bkQ = QUEUE_NORMAL; ++ viQ = QUEUE_NORMAL; ++ voQ = QUEUE_HIGH; ++ mgtQ = QUEUE_HIGH; ++ hiQ = QUEUE_HIGH; ++ } ++ _InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ); ++} ++ ++static void _InitQueuePriority(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ switch (haldata->OutEpNumber) { ++ case 1: ++ _InitNormalChipOneOutEpPriority(Adapter); ++ break; ++ case 2: ++ _InitNormalChipTwoOutEpPriority(Adapter); ++ break; ++ case 3: ++ _InitNormalChipThreeOutEpPriority(Adapter); ++ break; ++ default: ++ break; ++ } ++} ++ ++static void _InitNetworkType(struct adapter *Adapter) ++{ ++ u32 value32; ++ ++ value32 = rtw_read32(Adapter, REG_CR); ++ /* TODO: use the other function to set network type */ ++ value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); ++ ++ rtw_write32(Adapter, REG_CR, value32); ++} ++ ++static void _InitTransferPageSize(struct adapter *Adapter) ++{ ++ /* Tx page size is always 128. */ ++ ++ u8 value8; ++ value8 = _PSRX(PBP_128) | _PSTX(PBP_128); ++ rtw_write8(Adapter, REG_PBP, value8); ++} ++ ++static void _InitDriverInfoSize(struct adapter *Adapter, u8 drvInfoSize) ++{ ++ rtw_write8(Adapter, REG_RX_DRVINFO_SZ, drvInfoSize); ++} ++ ++static void _InitWMACSetting(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ haldata->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB | ++ RCR_CBSSID_DATA | RCR_CBSSID_BCN | ++ RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | ++ RCR_APP_MIC | RCR_APP_PHYSTS; ++ ++ /* some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() */ ++ rtw_write32(Adapter, REG_RCR, haldata->ReceiveConfig); ++ ++ /* Accept all multicast address */ ++ rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); ++ rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); ++} ++ ++static void _InitAdaptiveCtrl(struct adapter *Adapter) ++{ ++ u16 value16; ++ u32 value32; ++ ++ /* Response Rate Set */ ++ value32 = rtw_read32(Adapter, REG_RRSR); ++ value32 &= ~RATE_BITMAP_ALL; ++ value32 |= RATE_RRSR_CCK_ONLY_1M; ++ rtw_write32(Adapter, REG_RRSR, value32); ++ ++ /* CF-END Threshold */ ++ ++ /* SIFS (used in NAV) */ ++ value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); ++ rtw_write16(Adapter, REG_SPEC_SIFS, value16); ++ ++ /* Retry Limit */ ++ value16 = _LRL(0x30) | _SRL(0x30); ++ rtw_write16(Adapter, REG_RL, value16); ++} ++ ++static void _InitEDCA(struct adapter *Adapter) ++{ ++ /* Set Spec SIFS (used in NAV) */ ++ rtw_write16(Adapter, REG_SPEC_SIFS, 0x100a); ++ rtw_write16(Adapter, REG_MAC_SPEC_SIFS, 0x100a); ++ ++ /* Set SIFS for CCK */ ++ rtw_write16(Adapter, REG_SIFS_CTX, 0x100a); ++ ++ /* Set SIFS for OFDM */ ++ rtw_write16(Adapter, REG_SIFS_TRX, 0x100a); ++ ++ /* TXOP */ ++ rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); ++ rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); ++ rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); ++ rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); ++} ++ ++static void _InitBeaconMaxError(struct adapter *Adapter, bool InfraMode) ++{ ++} ++ ++static void _InitHWLed(struct adapter *Adapter) ++{ ++ struct led_priv *pledpriv = &Adapter->ledpriv; ++ ++ if (pledpriv->LedStrategy != HW_LED) ++ return; ++ ++/* HW led control */ ++/* to do .... */ ++/* must consider cases of antenna diversity/ commbo card/solo card/mini card */ ++} ++ ++static void _InitRDGSetting(struct adapter *Adapter) ++{ ++ rtw_write8(Adapter, REG_RD_CTRL, 0xFF); ++ rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); ++ rtw_write8(Adapter, REG_RD_RESP_PKT_TH, 0x05); ++} ++ ++static void _InitRxSetting(struct adapter *Adapter) ++{ ++ rtw_write32(Adapter, REG_MACID, 0x87654321); ++ rtw_write32(Adapter, 0x0700, 0x87654321); ++} ++ ++static void _InitRetryFunction(struct adapter *Adapter) ++{ ++ u8 value8; ++ ++ value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); ++ value8 |= EN_AMPDU_RTY_NEW; ++ rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); ++ ++ /* Set ACK timeout */ ++ rtw_write8(Adapter, REG_ACKTO, 0x40); ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: usb_AggSettingTxUpdate() ++ * ++ * Overview: Separate TX/RX parameters update independent for TP detection and ++ * dynamic TX/RX aggreagtion parameters update. ++ * ++ * Input: struct adapter * ++ * ++ * Output/Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 12/10/2010 MHC Separate to smaller function. ++ * ++ *---------------------------------------------------------------------------*/ ++static void usb_AggSettingTxUpdate(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ u32 value32; ++ ++ if (Adapter->registrypriv.wifi_spec) ++ haldata->UsbTxAggMode = false; ++ ++ if (haldata->UsbTxAggMode) { ++ value32 = rtw_read32(Adapter, REG_TDECTRL); ++ value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); ++ value32 |= ((haldata->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); ++ ++ rtw_write32(Adapter, REG_TDECTRL, value32); ++ } ++} /* usb_AggSettingTxUpdate */ ++ ++/*----------------------------------------------------------------------------- ++ * Function: usb_AggSettingRxUpdate() ++ * ++ * Overview: Separate TX/RX parameters update independent for TP detection and ++ * dynamic TX/RX aggreagtion parameters update. ++ * ++ * Input: struct adapter * ++ * ++ * Output/Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 12/10/2010 MHC Separate to smaller function. ++ * ++ *---------------------------------------------------------------------------*/ ++static void ++usb_AggSettingRxUpdate( ++ struct adapter *Adapter ++ ) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ u8 valueDMA; ++ u8 valueUSB; ++ ++ valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL); ++ valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); ++ ++ switch (haldata->UsbRxAggMode) { ++ case USB_RX_AGG_DMA: ++ valueDMA |= RXDMA_AGG_EN; ++ valueUSB &= ~USB_AGG_EN; ++ break; ++ case USB_RX_AGG_USB: ++ valueDMA &= ~RXDMA_AGG_EN; ++ valueUSB |= USB_AGG_EN; ++ break; ++ case USB_RX_AGG_MIX: ++ valueDMA |= RXDMA_AGG_EN; ++ valueUSB |= USB_AGG_EN; ++ break; ++ case USB_RX_AGG_DISABLE: ++ default: ++ valueDMA &= ~RXDMA_AGG_EN; ++ valueUSB &= ~USB_AGG_EN; ++ break; ++ } ++ ++ rtw_write8(Adapter, REG_TRXDMA_CTRL, valueDMA); ++ rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, valueUSB); ++ ++ switch (haldata->UsbRxAggMode) { ++ case USB_RX_AGG_DMA: ++ rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, haldata->UsbRxAggPageCount); ++ rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH + 1, haldata->UsbRxAggPageTimeout); ++ break; ++ case USB_RX_AGG_USB: ++ rtw_write8(Adapter, REG_USB_AGG_TH, haldata->UsbRxAggBlockCount); ++ rtw_write8(Adapter, REG_USB_AGG_TO, haldata->UsbRxAggBlockTimeout); ++ break; ++ case USB_RX_AGG_MIX: ++ rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, haldata->UsbRxAggPageCount); ++ rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH + 1, (haldata->UsbRxAggPageTimeout & 0x1F));/* 0x280[12:8] */ ++ rtw_write8(Adapter, REG_USB_AGG_TH, haldata->UsbRxAggBlockCount); ++ rtw_write8(Adapter, REG_USB_AGG_TO, haldata->UsbRxAggBlockTimeout); ++ break; ++ case USB_RX_AGG_DISABLE: ++ default: ++ /* TODO: */ ++ break; ++ } ++ ++ switch (PBP_128) { ++ case PBP_128: ++ haldata->HwRxPageSize = 128; ++ break; ++ case PBP_64: ++ haldata->HwRxPageSize = 64; ++ break; ++ case PBP_256: ++ haldata->HwRxPageSize = 256; ++ break; ++ case PBP_512: ++ haldata->HwRxPageSize = 512; ++ break; ++ case PBP_1024: ++ haldata->HwRxPageSize = 1024; ++ break; ++ default: ++ break; ++ } ++} /* usb_AggSettingRxUpdate */ ++ ++static void InitUsbAggregationSetting(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ /* Tx aggregation setting */ ++ usb_AggSettingTxUpdate(Adapter); ++ ++ /* Rx aggregation setting */ ++ usb_AggSettingRxUpdate(Adapter); ++ ++ /* 201/12/10 MH Add for USB agg mode dynamic switch. */ ++ haldata->UsbRxHighSpeedMode = false; ++} ++ ++static void _InitOperationMode(struct adapter *Adapter) ++{ ++} ++ ++static void _InitBeaconParameters(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); ++ ++ /* TODO: Remove these magic number */ ++ rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0x6404);/* ms */ ++ rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME);/* 5ms */ ++ rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME); /* 2ms */ ++ ++ /* Suggested by designer timchen. Change beacon AIFS to the largest number */ ++ /* beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 */ ++ rtw_write16(Adapter, REG_BCNTCFG, 0x660F); ++ ++ haldata->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); ++ haldata->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); ++ haldata->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2); ++ haldata->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2); ++ haldata->RegCR_1 = rtw_read8(Adapter, REG_CR + 1); ++} ++ ++static void _BeaconFunctionEnable(struct adapter *Adapter, ++ bool Enable, bool Linked) ++{ ++ rtw_write8(Adapter, REG_BCN_CTRL, (BIT(4) | BIT(3) | BIT(1))); ++ ++ rtw_write8(Adapter, REG_RD_CTRL + 1, 0x6F); ++} ++ ++/* Set CCK and OFDM Block "ON" */ ++static void _BBTurnOnBlock(struct adapter *Adapter) ++{ ++ PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); ++ PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); ++} ++ ++enum { ++ Antenna_Lfet = 1, ++ Antenna_Right = 2, ++}; ++ ++static void _InitAntenna_Selection(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ if (haldata->AntDivCfg == 0) ++ return; ++ DBG_88E("==> %s ....\n", __func__); ++ ++ rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0) | BIT(23)); ++ PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT(13), 0x01); ++ ++ if (PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A) ++ haldata->CurAntenna = Antenna_A; ++ else ++ haldata->CurAntenna = Antenna_B; ++ DBG_88E("%s,Cur_ant:(%x)%s\n", __func__, haldata->CurAntenna, (haldata->CurAntenna == Antenna_A) ? "Antenna_A" : "Antenna_B"); ++} ++ ++/*----------------------------------------------------------------------------- ++ * Function: HwSuspendModeEnable92Cu() ++ * ++ * Overview: HW suspend mode switch. ++ * ++ * Input: NONE ++ * ++ * Output: NONE ++ * ++ * Return: NONE ++ * ++ * Revised History: ++ * When Who Remark ++ * 08/23/2010 MHC HW suspend mode switch test.. ++ *---------------------------------------------------------------------------*/ ++enum rt_rf_power_state RfOnOffDetect(struct adapter *adapt) ++{ ++ u8 val8; ++ enum rt_rf_power_state rfpowerstate = rf_off; ++ ++ if (adapt->pwrctrlpriv.bHWPowerdown) { ++ val8 = rtw_read8(adapt, REG_HSISR); ++ DBG_88E("pwrdown, 0x5c(BIT(7))=%02x\n", val8); ++ rfpowerstate = (val8 & BIT(7)) ? rf_off : rf_on; ++ } else { /* rf on/off */ ++ rtw_write8(adapt, REG_MAC_PINMUX_CFG, rtw_read8(adapt, REG_MAC_PINMUX_CFG) & ~(BIT(3))); ++ val8 = rtw_read8(adapt, REG_GPIO_IO_SEL); ++ DBG_88E("GPIO_IN=%02x\n", val8); ++ rfpowerstate = (val8 & BIT(3)) ? rf_on : rf_off; ++ } ++ return rfpowerstate; ++} /* HalDetectPwrDownMode */ ++ ++static u32 rtl8188eu_hal_init(struct adapter *Adapter) ++{ ++ u8 value8 = 0; ++ u16 value16; ++ u8 txpktbuf_bndy; ++ u32 status = _SUCCESS; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; ++ struct registry_priv *pregistrypriv = &Adapter->registrypriv; ++ u32 init_start_time = jiffies; ++ ++ #define HAL_INIT_PROFILE_TAG(stage) do {} while (0) ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN); ++ ++ if (Adapter->pwrctrlpriv.bkeepfwalive) { ++ _ps_open_RF(Adapter); ++ ++ if (haldata->odmpriv.RFCalibrateInfo.bIQKInitialized) { ++ PHY_IQCalibrate_8188E(Adapter, true); ++ } else { ++ PHY_IQCalibrate_8188E(Adapter, false); ++ haldata->odmpriv.RFCalibrateInfo.bIQKInitialized = true; ++ } ++ ++ ODM_TXPowerTrackingCheck(&haldata->odmpriv); ++ PHY_LCCalibrate_8188E(Adapter); ++ ++ goto exit; ++ } ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON); ++ status = rtl8188eu_InitPowerOn(Adapter); ++ if (status == _FAIL) ++ goto exit; ++ ++ /* Save target channel */ ++ haldata->CurrentChannel = 6;/* default set to 6 */ ++ ++ if (pwrctrlpriv->reg_rfoff) { ++ pwrctrlpriv->rf_pwrstate = rf_off; ++ } ++ ++ /* 2010/08/09 MH We need to check if we need to turnon or off RF after detecting */ ++ /* HW GPIO pin. Before PHY_RFConfig8192C. */ ++ /* 2010/08/26 MH If Efuse does not support sective suspend then disable the function. */ ++ ++ if (!pregistrypriv->wifi_spec) { ++ txpktbuf_bndy = TX_PAGE_BOUNDARY_88E; ++ } else { ++ /* for WMM */ ++ txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_88E; ++ } ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01); ++ _InitQueueReservedPage(Adapter); ++ _InitQueuePriority(Adapter); ++ _InitPageBoundary(Adapter); ++ _InitTransferPageSize(Adapter); ++ ++ _InitTxBufferBoundary(Adapter, 0); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW); ++ if (Adapter->registrypriv.mp_mode == 1) { ++ _InitRxSetting(Adapter); ++ Adapter->bFWReady = false; ++ haldata->fw_ractrl = false; ++ } else { ++ status = rtl8188e_FirmwareDownload(Adapter); ++ ++ if (status != _SUCCESS) { ++ DBG_88E("%s: Download Firmware failed!!\n", __func__); ++ Adapter->bFWReady = false; ++ haldata->fw_ractrl = false; ++ return status; ++ } else { ++ Adapter->bFWReady = true; ++ haldata->fw_ractrl = false; ++ } ++ } ++ rtl8188e_InitializeFirmwareVars(Adapter); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC); ++#if (HAL_MAC_ENABLE == 1) ++ status = PHY_MACConfig8188E(Adapter); ++ if (status == _FAIL) { ++ DBG_88E(" ### Failed to init MAC ......\n "); ++ goto exit; ++ } ++#endif ++ ++ /* */ ++ /* d. Initialize BB related configurations. */ ++ /* */ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB); ++#if (HAL_BB_ENABLE == 1) ++ status = PHY_BBConfig8188E(Adapter); ++ if (status == _FAIL) { ++ DBG_88E(" ### Failed to init BB ......\n "); ++ goto exit; ++ } ++#endif ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF); ++#if (HAL_RF_ENABLE == 1) ++ status = PHY_RFConfig8188E(Adapter); ++ if (status == _FAIL) { ++ DBG_88E(" ### Failed to init RF ......\n "); ++ goto exit; ++ } ++#endif ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_EFUSE_PATCH); ++ status = rtl8188e_iol_efuse_patch(Adapter); ++ if (status == _FAIL) { ++ DBG_88E("%s rtl8188e_iol_efuse_patch failed\n", __func__); ++ goto exit; ++ } ++ ++ _InitTxBufferBoundary(Adapter, txpktbuf_bndy); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT); ++ status = InitLLTTable(Adapter, txpktbuf_bndy); ++ if (status == _FAIL) ++ goto exit; ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02); ++ /* Get Rx PHY status in order to report RSSI and others. */ ++ _InitDriverInfoSize(Adapter, DRVINFO_SZ); ++ ++ _InitInterrupt(Adapter); ++ hal_init_macaddr(Adapter);/* set mac_address */ ++ _InitNetworkType(Adapter);/* set msr */ ++ _InitWMACSetting(Adapter); ++ _InitAdaptiveCtrl(Adapter); ++ _InitEDCA(Adapter); ++ _InitRetryFunction(Adapter); ++ InitUsbAggregationSetting(Adapter); ++ _InitOperationMode(Adapter);/* todo */ ++ _InitBeaconParameters(Adapter); ++ _InitBeaconMaxError(Adapter, true); ++ ++ /* */ ++ /* Init CR MACTXEN, MACRXEN after setting RxFF boundary REG_TRXFF_BNDY to patch */ ++ /* Hw bug which Hw initials RxFF boundary size to a value which is larger than the real Rx buffer size in 88E. */ ++ /* */ ++ /* Enable MACTXEN/MACRXEN block */ ++ value16 = rtw_read16(Adapter, REG_CR); ++ value16 |= (MACTXEN | MACRXEN); ++ rtw_write8(Adapter, REG_CR, value16); ++ ++ if (haldata->bRDGEnable) ++ _InitRDGSetting(Adapter); ++ ++ /* Enable TX Report */ ++ /* Enable Tx Report Timer */ ++ value8 = rtw_read8(Adapter, REG_TX_RPT_CTRL); ++ rtw_write8(Adapter, REG_TX_RPT_CTRL, (value8 | BIT(1) | BIT(0))); ++ /* Set MAX RPT MACID */ ++ rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, 2);/* FOR sta mode ,0: bc/mc ,1:AP */ ++ /* Tx RPT Timer. Unit: 32us */ ++ rtw_write16(Adapter, REG_TX_RPT_TIME, 0xCdf0); ++ ++ rtw_write8(Adapter, REG_EARLY_MODE_CONTROL, 0); ++ ++ rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ ++ rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ ++ ++ _InitHWLed(Adapter); ++ ++ /* Keep RfRegChnlVal for later use. */ ++ haldata->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (enum rf_radio_path)0, RF_CHNLBW, bRFRegOffsetMask); ++ haldata->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (enum rf_radio_path)1, RF_CHNLBW, bRFRegOffsetMask); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK); ++ _BBTurnOnBlock(Adapter); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY); ++ invalidate_cam_all(Adapter); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11); ++ /* 2010/12/17 MH We need to set TX power according to EFUSE content at first. */ ++ PHY_SetTxPowerLevel8188E(Adapter, haldata->CurrentChannel); ++ ++/* Move by Neo for USB SS to below setp */ ++/* _RfPowerSave(Adapter); */ ++ ++ _InitAntenna_Selection(Adapter); ++ ++ /* */ ++ /* Disable BAR, suggested by Scott */ ++ /* 2010.04.09 add by hpfan */ ++ /* */ ++ rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); ++ ++ /* HW SEQ CTRL */ ++ /* set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. */ ++ rtw_write8(Adapter, REG_HWSEQ_CTRL, 0xFF); ++ ++ if (pregistrypriv->wifi_spec) ++ rtw_write16(Adapter, REG_FAST_EDCA_CTRL, 0); ++ ++ /* Nav limit , suggest by scott */ ++ rtw_write8(Adapter, 0x652, 0x0); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM); ++ rtl8188e_InitHalDm(Adapter); ++ ++ if (Adapter->registrypriv.mp_mode == 1) { ++ Adapter->mppriv.channel = haldata->CurrentChannel; ++ MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); ++ } else { ++ /* 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status */ ++ /* and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not */ ++ /* call initstruct adapter. May cause some problem?? */ ++ /* Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed */ ++ /* in MgntActSet_RF_State() after wake up, because the value of haldata->eRFPowerState */ ++ /* is the same as eRfOff, we should change it to eRfOn after we config RF parameters. */ ++ /* Added by tynli. 2010.03.30. */ ++ pwrctrlpriv->rf_pwrstate = rf_on; ++ ++ /* enable Tx report. */ ++ rtw_write8(Adapter, REG_FWHW_TXQ_CTRL + 1, 0x0F); ++ ++ /* Suggested by SD1 pisa. Added by tynli. 2011.10.21. */ ++ rtw_write8(Adapter, REG_EARLY_MODE_CONTROL + 3, 0x01);/* Pretx_en, for WEP/TKIP SEC */ ++ ++ /* tynli_test_tx_report. */ ++ rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0); ++ ++ /* enable tx DMA to drop the redundate data of packet */ ++ rtw_write16(Adapter, REG_TXDMA_OFFSET_CHK, (rtw_read16(Adapter, REG_TXDMA_OFFSET_CHK) | DROP_DATA_EN)); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK); ++ /* 2010/08/26 MH Merge from 8192CE. */ ++ if (pwrctrlpriv->rf_pwrstate == rf_on) { ++ if (haldata->odmpriv.RFCalibrateInfo.bIQKInitialized) { ++ PHY_IQCalibrate_8188E(Adapter, true); ++ } else { ++ PHY_IQCalibrate_8188E(Adapter, false); ++ haldata->odmpriv.RFCalibrateInfo.bIQKInitialized = true; ++ } ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_PW_TRACK); ++ ++ ODM_TXPowerTrackingCheck(&haldata->odmpriv); ++ ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_LCK); ++ PHY_LCCalibrate_8188E(Adapter); ++ } ++ } ++ ++/* HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS); */ ++/* _InitPABias(Adapter); */ ++ rtw_write8(Adapter, REG_USB_HRPWM, 0); ++ ++ /* ack for xmit mgmt frames. */ ++ rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL) | BIT(12)); ++ ++exit: ++ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END); ++ ++ DBG_88E("%s in %dms\n", __func__, rtw_get_passing_time_ms(init_start_time)); ++ ++ return status; ++} ++ ++void _ps_open_RF(struct adapter *adapt) ++{ ++ /* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */ ++ /* phy_SsPwrSwitch92CU(adapt, rf_on, 1); */ ++} ++ ++static void _ps_close_RF(struct adapter *adapt) ++{ ++ /* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */ ++ /* phy_SsPwrSwitch92CU(adapt, rf_off, 1); */ ++} ++ ++static void CardDisableRTL8188EU(struct adapter *Adapter) ++{ ++ u8 val8; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ /* Stop Tx Report Timer. 0x4EC[Bit1]=b'0 */ ++ val8 = rtw_read8(Adapter, REG_TX_RPT_CTRL); ++ rtw_write8(Adapter, REG_TX_RPT_CTRL, val8 & (~BIT(1))); ++ ++ /* stop rx */ ++ rtw_write8(Adapter, REG_CR, 0x0); ++ ++ /* Run LPS WL RFOFF flow */ ++ HalPwrSeqCmdParsing(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8188E_NIC_LPS_ENTER_FLOW); ++ ++ /* 2. 0x1F[7:0] = 0 turn off RF */ ++ ++ val8 = rtw_read8(Adapter, REG_MCUFWDL); ++ if ((val8 & RAM_DL_SEL) && Adapter->bFWReady) { /* 8051 RAM code */ ++ /* Reset MCU 0x2[10]=0. */ ++ val8 = rtw_read8(Adapter, REG_SYS_FUNC_EN + 1); ++ val8 &= ~BIT(2); /* 0x2[10], FEN_CPUEN */ ++ rtw_write8(Adapter, REG_SYS_FUNC_EN + 1, val8); ++ } ++ ++ /* reset MCU ready status */ ++ rtw_write8(Adapter, REG_MCUFWDL, 0); ++ ++ /* YJ,add,111212 */ ++ /* Disable 32k */ ++ val8 = rtw_read8(Adapter, REG_32K_CTRL); ++ rtw_write8(Adapter, REG_32K_CTRL, val8 & (~BIT(0))); ++ ++ /* Card disable power action flow */ ++ HalPwrSeqCmdParsing(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8188E_NIC_DISABLE_FLOW); ++ ++ /* Reset MCU IO Wrapper */ ++ val8 = rtw_read8(Adapter, REG_RSV_CTRL + 1); ++ rtw_write8(Adapter, REG_RSV_CTRL + 1, (val8 & (~BIT(3)))); ++ val8 = rtw_read8(Adapter, REG_RSV_CTRL + 1); ++ rtw_write8(Adapter, REG_RSV_CTRL + 1, val8 | BIT(3)); ++ ++ /* YJ,test add, 111207. For Power Consumption. */ ++ val8 = rtw_read8(Adapter, GPIO_IN); ++ rtw_write8(Adapter, GPIO_OUT, val8); ++ rtw_write8(Adapter, GPIO_IO_SEL, 0xFF);/* Reg0x46 */ ++ ++ val8 = rtw_read8(Adapter, REG_GPIO_IO_SEL); ++ rtw_write8(Adapter, REG_GPIO_IO_SEL, (val8 << 4)); ++ val8 = rtw_read8(Adapter, REG_GPIO_IO_SEL + 1); ++ rtw_write8(Adapter, REG_GPIO_IO_SEL + 1, val8 | 0x0F);/* Reg0x43 */ ++ rtw_write32(Adapter, REG_BB_PAD_CTRL, 0x00080808);/* set LNA ,TRSW,EX_PA Pin to output mode */ ++ haldata->bMacPwrCtrlOn = false; ++ Adapter->bFWReady = false; ++} ++static void rtl8192cu_hw_power_down(struct adapter *adapt) ++{ ++ /* 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. */ ++ /* Then enable power down control bit of register 0x04 BIT(4) and BIT(15) as 1. */ ++ ++ /* Enable register area 0x0-0xc. */ ++ rtw_write8(adapt, REG_RSV_CTRL, 0x0); ++ rtw_write16(adapt, REG_APS_FSMCO, 0x8812); ++} ++ ++static u32 rtl8188eu_hal_deinit(struct adapter *Adapter) ++{ ++ ++ DBG_88E("==> %s\n", __func__); ++ ++ rtw_write32(Adapter, REG_HIMR_88E, IMR_DISABLED_88E); ++ rtw_write32(Adapter, REG_HIMRE_88E, IMR_DISABLED_88E); ++ ++ DBG_88E("bkeepfwalive(%x)\n", Adapter->pwrctrlpriv.bkeepfwalive); ++ if (Adapter->pwrctrlpriv.bkeepfwalive) { ++ _ps_close_RF(Adapter); ++ if ((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown)) ++ rtl8192cu_hw_power_down(Adapter); ++ } else { ++ if (Adapter->hw_init_completed) { ++ CardDisableRTL8188EU(Adapter); ++ ++ if ((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown)) ++ rtl8192cu_hw_power_down(Adapter); ++ } ++ } ++ return _SUCCESS; ++ } ++ ++static unsigned int rtl8188eu_inirp_init(struct adapter *Adapter) ++{ ++ u8 i; ++ struct recv_buf *precvbuf; ++ uint status; ++ struct intf_hdl *pintfhdl = &Adapter->iopriv.intf; ++ struct recv_priv *precvpriv = &Adapter->recvpriv; ++ u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); ++ ++ _read_port = pintfhdl->io_ops._read_port; ++ ++ status = _SUCCESS; ++ ++ precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; ++ ++ /* issue Rx irp to receive data */ ++ precvbuf = (struct recv_buf *)precvpriv->precv_buf; ++ for (i = 0; i < NR_RECVBUFF; i++) { ++ if (!_read_port(pintfhdl, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf)) { ++ status = _FAIL; ++ goto exit; ++ } ++ ++ precvbuf++; ++ precvpriv->free_recv_buf_queue_cnt--; ++ } ++ ++exit: ++ return status; ++} ++ ++static unsigned int rtl8188eu_inirp_deinit(struct adapter *Adapter) ++{ ++ rtw_read_port_cancel(Adapter); ++ ++ return _SUCCESS; ++} ++ ++/* */ ++/* */ ++/* EEPROM/EFUSE Content Parsing */ ++/* */ ++/* */ ++static void _ReadLEDSetting(struct adapter *Adapter, u8 *PROMContent, bool AutoloadFail) ++{ ++ struct led_priv *pledpriv = &Adapter->ledpriv; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ pledpriv->bRegUseLed = true; ++ pledpriv->LedStrategy = SW_LED_MODE1; ++ haldata->bLedOpenDrain = true;/* Support Open-drain arrangement for controlling the LED. */ ++} ++ ++static void Hal_EfuseParsePIDVID_8188EU(struct adapter *adapt, u8 *hwinfo, bool AutoLoadFail) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ if (!AutoLoadFail) { ++ /* VID, PID */ ++ haldata->EEPROMVID = EF2BYTE(*(__le16 *)&hwinfo[EEPROM_VID_88EU]); ++ haldata->EEPROMPID = EF2BYTE(*(__le16 *)&hwinfo[EEPROM_PID_88EU]); ++ ++ /* Customer ID, 0x00 and 0xff are reserved for Realtek. */ ++ haldata->EEPROMCustomerID = *(u8 *)&hwinfo[EEPROM_CUSTOMERID_88E]; ++ haldata->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; ++ } else { ++ haldata->EEPROMVID = EEPROM_Default_VID; ++ haldata->EEPROMPID = EEPROM_Default_PID; ++ ++ /* Customer ID, 0x00 and 0xff are reserved for Realtek. */ ++ haldata->EEPROMCustomerID = EEPROM_Default_CustomerID; ++ haldata->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; ++ } ++ ++ DBG_88E("VID = 0x%04X, PID = 0x%04X\n", haldata->EEPROMVID, haldata->EEPROMPID); ++ DBG_88E("Customer ID: 0x%02X, SubCustomer ID: 0x%02X\n", haldata->EEPROMCustomerID, haldata->EEPROMSubCustomerID); ++} ++ ++static void Hal_EfuseParseMACAddr_8188EU(struct adapter *adapt, u8 *hwinfo, bool AutoLoadFail) ++{ ++ u16 i; ++ u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x88, 0x02}; ++ struct eeprom_priv *eeprom = GET_EEPROM_EFUSE_PRIV(adapt); ++ ++ if (AutoLoadFail) { ++ for (i = 0; i < 6; i++) ++ eeprom->mac_addr[i] = sMacAddr[i]; ++ } else { ++ /* Read Permanent MAC address */ ++ memcpy(eeprom->mac_addr, &hwinfo[EEPROM_MAC_ADDR_88EU], ETH_ALEN); ++ } ++} ++ ++static void Hal_CustomizeByCustomerID_8188EU(struct adapter *adapt) ++{ ++} ++ ++static void ++readAdapterInfo_8188EU( ++ struct adapter *adapt ++ ) ++{ ++ struct eeprom_priv *eeprom = GET_EEPROM_EFUSE_PRIV(adapt); ++ ++ /* parse the eeprom/efuse content */ ++ Hal_EfuseParseIDCode88E(adapt, eeprom->efuse_eeprom_data); ++ Hal_EfuseParsePIDVID_8188EU(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_EfuseParseMACAddr_8188EU(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ ++ Hal_ReadPowerSavingMode88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_ReadTxPowerInfo88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_EfuseParseEEPROMVer88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ rtl8188e_EfuseParseChnlPlan(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_EfuseParseXtal_8188E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_EfuseParseCustomerID88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_ReadAntennaDiversity88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_EfuseParseBoardType88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ Hal_ReadThermalMeter_88E(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++ ++ /* */ ++ /* The following part initialize some vars by PG info. */ ++ /* */ ++ Hal_InitChannelPlan(adapt); ++ Hal_CustomizeByCustomerID_8188EU(adapt); ++ ++ _ReadLEDSetting(adapt, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); ++} ++ ++static void _ReadPROMContent( ++ struct adapter *Adapter ++ ) ++{ ++ struct eeprom_priv *eeprom = GET_EEPROM_EFUSE_PRIV(Adapter); ++ u8 eeValue; ++ ++ /* check system boot selection */ ++ eeValue = rtw_read8(Adapter, REG_9346CR); ++ eeprom->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? true : false; ++ eeprom->bautoload_fail_flag = (eeValue & EEPROM_EN) ? false : true; ++ ++ DBG_88E("Boot from %s, Autoload %s !\n", (eeprom->EepromOrEfuse ? "EEPROM" : "EFUSE"), ++ (eeprom->bautoload_fail_flag ? "Fail" : "OK")); ++ ++ Hal_InitPGData88E(Adapter); ++ readAdapterInfo_8188EU(Adapter); ++} ++ ++static void _ReadRFType(struct adapter *Adapter) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ ++ haldata->rf_chip = RF_6052; ++} ++ ++static int _ReadAdapterInfo8188EU(struct adapter *Adapter) ++{ ++ u32 start = jiffies; ++ ++ MSG_88E("====> %s\n", __func__); ++ ++ _ReadRFType(Adapter);/* rf_chip -> _InitRFType() */ ++ _ReadPROMContent(Adapter); ++ ++ MSG_88E("<==== %s in %d ms\n", __func__, rtw_get_passing_time_ms(start)); ++ ++ return _SUCCESS; ++} ++ ++static void ReadAdapterInfo8188EU(struct adapter *Adapter) ++{ ++ /* Read EEPROM size before call any EEPROM function */ ++ Adapter->EepromAddressSize = GetEEPROMSize8188E(Adapter); ++ ++ _ReadAdapterInfo8188EU(Adapter); ++} ++ ++#define GPIO_DEBUG_PORT_NUM 0 ++static void rtl8192cu_trigger_gpio_0(struct adapter *adapt) ++{ ++} ++ ++static void ResumeTxBeacon(struct adapter *adapt) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ ++ /* which should be read from register to a global variable. */ ++ ++ rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) | BIT(6)); ++ haldata->RegFwHwTxQCtrl |= BIT(6); ++ rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0xff); ++ haldata->RegReg542 |= BIT(0); ++ rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); ++} ++ ++static void StopTxBeacon(struct adapter *adapt) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ ++ /* which should be read from register to a global variable. */ ++ ++ rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) & (~BIT(6))); ++ haldata->RegFwHwTxQCtrl &= (~BIT(6)); ++ rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0x64); ++ haldata->RegReg542 &= ~(BIT(0)); ++ rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); ++ ++ /* todo: CheckFwRsvdPageContent(Adapter); 2010.06.23. Added by tynli. */ ++} ++ ++static void hw_var_set_opmode(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ u8 val8; ++ u8 mode = *((u8 *)val); ++ ++ /* disable Port0 TSF update */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); ++ ++ /* set net_type */ ++ val8 = rtw_read8(Adapter, MSR) & 0x0c; ++ val8 |= mode; ++ rtw_write8(Adapter, MSR, val8); ++ ++ DBG_88E("%s()-%d mode = %d\n", __func__, __LINE__, mode); ++ ++ if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) { ++ StopTxBeacon(Adapter); ++ ++ rtw_write8(Adapter, REG_BCN_CTRL, 0x19);/* disable atim wnd */ ++ } else if (mode == _HW_STATE_ADHOC_) { ++ ResumeTxBeacon(Adapter); ++ rtw_write8(Adapter, REG_BCN_CTRL, 0x1a); ++ } else if (mode == _HW_STATE_AP_) { ++ ResumeTxBeacon(Adapter); ++ ++ rtw_write8(Adapter, REG_BCN_CTRL, 0x12); ++ ++ /* Set RCR */ ++ rtw_write32(Adapter, REG_RCR, 0x7000208e);/* CBSSID_DATA must set to 0,reject ICV_ERR packet */ ++ /* enable to rx data frame */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); ++ /* enable to rx ps-poll */ ++ rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400); ++ ++ /* Beacon Control related register for first time */ ++ rtw_write8(Adapter, REG_BCNDMATIM, 0x02); /* 2ms */ ++ ++ rtw_write8(Adapter, REG_ATIMWND, 0x0a); /* 10ms */ ++ rtw_write16(Adapter, REG_BCNTCFG, 0x00); ++ rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); ++ rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);/* +32767 (~32ms) */ ++ ++ /* reset TSF */ ++ rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); ++ ++ /* BIT(3) - If set 0, hw will clr bcnq when tx becon ok/fail or port 0 */ ++ rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM) | BIT(3) | BIT(4)); ++ ++ /* enable BCN0 Function for if1 */ ++ /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) */ ++ rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP | EN_BCN_FUNCTION | BIT(1))); ++ ++ /* dis BCN1 ATIM WND if if2 is station */ ++ rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1) | BIT(0)); ++ } ++} ++ ++static void hw_var_set_macaddr(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ u8 idx = 0; ++ u32 reg_macid; ++ ++ reg_macid = REG_MACID; ++ ++ for (idx = 0; idx < 6; idx++) ++ rtw_write8(Adapter, (reg_macid + idx), val[idx]); ++} ++ ++static void hw_var_set_bssid(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ u8 idx = 0; ++ u32 reg_bssid; ++ ++ reg_bssid = REG_BSSID; ++ ++ for (idx = 0; idx < 6; idx++) ++ rtw_write8(Adapter, (reg_bssid + idx), val[idx]); ++} ++ ++static void hw_var_set_bcn_func(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ u32 bcn_ctrl_reg; ++ ++ bcn_ctrl_reg = REG_BCN_CTRL; ++ ++ if (*((u8 *)val)) ++ rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); ++ else ++ rtw_write8(Adapter, bcn_ctrl_reg, rtw_read8(Adapter, bcn_ctrl_reg) & (~(EN_BCN_FUNCTION | EN_TXBCN_RPT))); ++} ++ ++static void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ struct dm_priv *pdmpriv = &haldata->dmpriv; ++ struct odm_dm_struct *podmpriv = &haldata->odmpriv; ++ ++ switch (variable) { ++ case HW_VAR_MEDIA_STATUS: ++ { ++ u8 val8; ++ ++ val8 = rtw_read8(Adapter, MSR) & 0x0c; ++ val8 |= *((u8 *)val); ++ rtw_write8(Adapter, MSR, val8); ++ } ++ break; ++ case HW_VAR_MEDIA_STATUS1: ++ { ++ u8 val8; ++ ++ val8 = rtw_read8(Adapter, MSR) & 0x03; ++ val8 |= *((u8 *)val) << 2; ++ rtw_write8(Adapter, MSR, val8); ++ } ++ break; ++ case HW_VAR_SET_OPMODE: ++ hw_var_set_opmode(Adapter, variable, val); ++ break; ++ case HW_VAR_MAC_ADDR: ++ hw_var_set_macaddr(Adapter, variable, val); ++ break; ++ case HW_VAR_BSSID: ++ hw_var_set_bssid(Adapter, variable, val); ++ break; ++ case HW_VAR_BASIC_RATE: ++ { ++ u16 BrateCfg = 0; ++ u8 RateIndex = 0; ++ ++ /* 2007.01.16, by Emily */ ++ /* Select RRSR (in Legacy-OFDM and CCK) */ ++ /* For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. */ ++ /* We do not use other rates. */ ++ HalSetBrateCfg(Adapter, val, &BrateCfg); ++ DBG_88E("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg); ++ ++ /* 2011.03.30 add by Luke Lee */ ++ /* CCK 2M ACK should be disabled for some BCM and Atheros AP IOT */ ++ /* because CCK 2M has poor TXEVM */ ++ /* CCK 5.5M & 11M ACK should be enabled for better performance */ ++ ++ BrateCfg = (BrateCfg | 0xd) & 0x15d; ++ haldata->BasicRateSet = BrateCfg; ++ ++ BrateCfg |= 0x01; /* default enable 1M ACK rate */ ++ /* Set RRSR rate table. */ ++ rtw_write8(Adapter, REG_RRSR, BrateCfg & 0xff); ++ rtw_write8(Adapter, REG_RRSR + 1, (BrateCfg >> 8) & 0xff); ++ rtw_write8(Adapter, REG_RRSR + 2, rtw_read8(Adapter, REG_RRSR + 2) & 0xf0); ++ ++ /* Set RTS initial rate */ ++ while (BrateCfg > 0x1) { ++ BrateCfg = (BrateCfg >> 1); ++ RateIndex++; ++ } ++ /* Ziv - Check */ ++ rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex); ++ } ++ break; ++ case HW_VAR_TXPAUSE: ++ rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val)); ++ break; ++ case HW_VAR_BCN_FUNC: ++ hw_var_set_bcn_func(Adapter, variable, val); ++ break; ++ case HW_VAR_CORRECT_TSF: ++ { ++ u64 tsf; ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ tsf = pmlmeext->TSFValue - do_div(pmlmeext->TSFValue, ++ pmlmeinfo->bcn_interval * 1024) - 1024; /* us */ ++ ++ if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) ++ StopTxBeacon(Adapter); ++ ++ /* disable related TSF function */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(3))); ++ ++ rtw_write32(Adapter, REG_TSFTR, tsf); ++ rtw_write32(Adapter, REG_TSFTR + 4, tsf >> 32); ++ ++ /* enable related TSF function */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(3)); ++ ++ if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) ++ ResumeTxBeacon(Adapter); ++ } ++ break; ++ case HW_VAR_CHECK_BSSID: ++ if (*((u8 *)val)) { ++ rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); ++ } else { ++ u32 val32; ++ ++ val32 = rtw_read32(Adapter, REG_RCR); ++ ++ val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); ++ ++ rtw_write32(Adapter, REG_RCR, val32); ++ } ++ break; ++ case HW_VAR_MLME_DISCONNECT: ++ /* Set RCR to not to receive data frame when NO LINK state */ ++ /* reject all data frames */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); ++ ++ /* reset TSF */ ++ rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); ++ ++ /* disable update TSF */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); ++ break; ++ case HW_VAR_MLME_SITESURVEY: ++ if (*((u8 *)val)) { /* under sitesurvey */ ++ /* config RCR to receive different BSSID & not to receive data frame */ ++ u32 v = rtw_read32(Adapter, REG_RCR); ++ v &= ~(RCR_CBSSID_BCN); ++ rtw_write32(Adapter, REG_RCR, v); ++ /* reject all data frame */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); ++ ++ /* disable update TSF */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); ++ } else { /* sitesurvey done */ ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ if ((is_client_associated_to_ap(Adapter)) || ++ ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) { ++ /* enable to rx data frame */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); ++ ++ /* enable update TSF */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); ++ } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); ++ /* enable update TSF */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); ++ } ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_BCN); ++ } else { ++ if (Adapter->in_cta_test) { ++ u32 v = rtw_read32(Adapter, REG_RCR); ++ v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);/* RCR_ADF */ ++ rtw_write32(Adapter, REG_RCR, v); ++ } else { ++ rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_BCN); ++ } ++ } ++ } ++ break; ++ case HW_VAR_MLME_JOIN: ++ { ++ u8 RetryLimit = 0x30; ++ u8 type = *((u8 *)val); ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ ++ if (type == 0) { /* prepare to join */ ++ /* enable to rx data frame.Accept all data frame */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); ++ ++ if (Adapter->in_cta_test) { ++ u32 v = rtw_read32(Adapter, REG_RCR); ++ v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);/* RCR_ADF */ ++ rtw_write32(Adapter, REG_RCR, v); ++ } else { ++ rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); ++ } ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ RetryLimit = (haldata->CustomerID == RT_CID_CCX) ? 7 : 48; ++ else /* Ad-hoc Mode */ ++ RetryLimit = 0x7; ++ } else if (type == 1) { ++ /* joinbss_event call back when join res < 0 */ ++ rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); ++ } else if (type == 2) { ++ /* sta add event call back */ ++ /* enable update TSF */ ++ rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) ++ RetryLimit = 0x7; ++ } ++ rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT); ++ } ++ break; ++ case HW_VAR_BEACON_INTERVAL: ++ rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val)); ++ break; ++ case HW_VAR_SLOT_TIME: ++ { ++ u8 u1bAIFS, aSifsTime; ++ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ ++ rtw_write8(Adapter, REG_SLOT, val[0]); ++ ++ if (pmlmeinfo->WMM_enable == 0) { ++ if (pmlmeext->cur_wireless_mode == WIRELESS_11B) ++ aSifsTime = 10; ++ else ++ aSifsTime = 16; ++ ++ u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); ++ ++ /* Temporary removed, 2008.06.20. */ ++ rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS); ++ rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS); ++ rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS); ++ rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS); ++ } ++ } ++ break; ++ case HW_VAR_RESP_SIFS: ++ /* RESP_SIFS for CCK */ ++ rtw_write8(Adapter, REG_R2T_SIFS, val[0]); /* SIFS_T2T_CCK (0x08) */ ++ rtw_write8(Adapter, REG_R2T_SIFS + 1, val[1]); /* SIFS_R2T_CCK(0x08) */ ++ /* RESP_SIFS for OFDM */ ++ rtw_write8(Adapter, REG_T2T_SIFS, val[2]); /* SIFS_T2T_OFDM (0x0a) */ ++ rtw_write8(Adapter, REG_T2T_SIFS + 1, val[3]); /* SIFS_R2T_OFDM(0x0a) */ ++ break; ++ case HW_VAR_ACK_PREAMBLE: ++ { ++ u8 regTmp; ++ u8 bShortPreamble = *((bool *)val); ++ /* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */ ++ regTmp = (haldata->nCur40MhzPrimeSC) << 5; ++ if (bShortPreamble) ++ regTmp |= 0x80; ++ ++ rtw_write8(Adapter, REG_RRSR + 2, regTmp); ++ } ++ break; ++ case HW_VAR_SEC_CFG: ++ rtw_write8(Adapter, REG_SECCFG, *((u8 *)val)); ++ break; ++ case HW_VAR_DM_FLAG: ++ podmpriv->SupportAbility = *((u8 *)val); ++ break; ++ case HW_VAR_DM_FUNC_OP: ++ if (val[0]) ++ podmpriv->BK_SupportAbility = podmpriv->SupportAbility; ++ else ++ podmpriv->SupportAbility = podmpriv->BK_SupportAbility; ++ break; ++ case HW_VAR_DM_FUNC_SET: ++ if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) { ++ pdmpriv->DMFlag = pdmpriv->InitDMFlag; ++ podmpriv->SupportAbility = pdmpriv->InitODMFlag; ++ } else { ++ podmpriv->SupportAbility |= *((u32 *)val); ++ } ++ break; ++ case HW_VAR_DM_FUNC_CLR: ++ podmpriv->SupportAbility &= *((u32 *)val); ++ break; ++ case HW_VAR_CAM_EMPTY_ENTRY: ++ { ++ u8 ucIndex = *((u8 *)val); ++ u8 i; ++ u32 ulCommand = 0; ++ u32 ulContent = 0; ++ u32 ulEncAlgo = CAM_AES; ++ ++ for (i = 0; i < CAM_CONTENT_COUNT; i++) { ++ /* filled id in CAM config 2 byte */ ++ if (i == 0) ++ ulContent |= (ucIndex & 0x03) | ((u16)(ulEncAlgo) << 2); ++ else ++ ulContent = 0; ++ /* polling bit, and No Write enable, and address */ ++ ulCommand = CAM_CONTENT_COUNT * ucIndex + i; ++ ulCommand = ulCommand | CAM_POLLINIG | CAM_WRITE; ++ /* write content 0 is equall to mark invalid */ ++ rtw_write32(Adapter, WCAMI, ulContent); /* delay_ms(40); */ ++ rtw_write32(Adapter, RWCAM, ulCommand); /* delay_ms(40); */ ++ } ++ } ++ break; ++ case HW_VAR_CAM_INVALID_ALL: ++ rtw_write32(Adapter, RWCAM, BIT(31) | BIT(30)); ++ break; ++ case HW_VAR_CAM_WRITE: ++ { ++ u32 cmd; ++ u32 *cam_val = (u32 *)val; ++ rtw_write32(Adapter, WCAMI, cam_val[0]); ++ ++ cmd = CAM_POLLINIG | CAM_WRITE | cam_val[1]; ++ rtw_write32(Adapter, RWCAM, cmd); ++ } ++ break; ++ case HW_VAR_AC_PARAM_VO: ++ rtw_write32(Adapter, REG_EDCA_VO_PARAM, ((u32 *)(val))[0]); ++ break; ++ case HW_VAR_AC_PARAM_VI: ++ rtw_write32(Adapter, REG_EDCA_VI_PARAM, ((u32 *)(val))[0]); ++ break; ++ case HW_VAR_AC_PARAM_BE: ++ haldata->AcParam_BE = ((u32 *)(val))[0]; ++ rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]); ++ break; ++ case HW_VAR_AC_PARAM_BK: ++ rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]); ++ break; ++ case HW_VAR_ACM_CTRL: ++ { ++ u8 acm_ctrl = *((u8 *)val); ++ u8 AcmCtrl = rtw_read8(Adapter, REG_ACMHWCTRL); ++ ++ if (acm_ctrl > 1) ++ AcmCtrl = AcmCtrl | 0x1; ++ ++ if (acm_ctrl & BIT(3)) ++ AcmCtrl |= AcmHw_VoqEn; ++ else ++ AcmCtrl &= (~AcmHw_VoqEn); ++ ++ if (acm_ctrl & BIT(2)) ++ AcmCtrl |= AcmHw_ViqEn; ++ else ++ AcmCtrl &= (~AcmHw_ViqEn); ++ ++ if (acm_ctrl & BIT(1)) ++ AcmCtrl |= AcmHw_BeqEn; ++ else ++ AcmCtrl &= (~AcmHw_BeqEn); ++ ++ DBG_88E("[HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl); ++ rtw_write8(Adapter, REG_ACMHWCTRL, AcmCtrl); ++ } ++ break; ++ case HW_VAR_AMPDU_MIN_SPACE: ++ { ++ u8 MinSpacingToSet; ++ u8 SecMinSpace; ++ ++ MinSpacingToSet = *((u8 *)val); ++ if (MinSpacingToSet <= 7) { ++ switch (Adapter->securitypriv.dot11PrivacyAlgrthm) { ++ case _NO_PRIVACY_: ++ case _AES_: ++ SecMinSpace = 0; ++ break; ++ case _WEP40_: ++ case _WEP104_: ++ case _TKIP_: ++ case _TKIP_WTMIC_: ++ SecMinSpace = 6; ++ break; ++ default: ++ SecMinSpace = 7; ++ break; ++ } ++ if (MinSpacingToSet < SecMinSpace) ++ MinSpacingToSet = SecMinSpace; ++ rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet); ++ } ++ } ++ break; ++ case HW_VAR_AMPDU_FACTOR: ++ { ++ u8 RegToSet_Normal[4] = {0x41, 0xa8, 0x72, 0xb9}; ++ u8 FactorToSet; ++ u8 *pRegToSet; ++ u8 index = 0; ++ ++ pRegToSet = RegToSet_Normal; /* 0xb972a841; */ ++ FactorToSet = *((u8 *)val); ++ if (FactorToSet <= 3) { ++ FactorToSet = (1 << (FactorToSet + 2)); ++ if (FactorToSet > 0xf) ++ FactorToSet = 0xf; ++ ++ for (index = 0; index < 4; index++) { ++ if ((pRegToSet[index] & 0xf0) > (FactorToSet << 4)) ++ pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet << 4); ++ ++ if ((pRegToSet[index] & 0x0f) > FactorToSet) ++ pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); ++ ++ rtw_write8(Adapter, (REG_AGGLEN_LMT + index), pRegToSet[index]); ++ } ++ } ++ } ++ break; ++ case HW_VAR_RXDMA_AGG_PG_TH: ++ { ++ u8 threshold = *((u8 *)val); ++ if (threshold == 0) ++ threshold = haldata->UsbRxAggPageCount; ++ rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold); ++ } ++ break; ++ case HW_VAR_SET_RPWM: ++ break; ++ case HW_VAR_H2C_FW_PWRMODE: ++ { ++ u8 psmode = (*(u8 *)val); ++ ++ /* Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power */ ++ /* saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. */ ++ if ((psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(haldata->VersionID))) ++ ODM_RF_Saving(podmpriv, true); ++ rtl8188e_set_FwPwrMode_cmd(Adapter, psmode); ++ } ++ break; ++ case HW_VAR_H2C_FW_JOINBSSRPT: ++ { ++ u8 mstatus = (*(u8 *)val); ++ rtl8188e_set_FwJoinBssReport_cmd(Adapter, mstatus); ++ } ++ break; ++#ifdef CONFIG_88EU_P2P ++ case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: ++ { ++ u8 p2p_ps_state = (*(u8 *)val); ++ rtl8188e_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state); ++ } ++ break; ++#endif ++ case HW_VAR_INITIAL_GAIN: ++ { ++ struct rtw_dig *pDigTable = &podmpriv->DM_DigTable; ++ u32 rx_gain = ((u32 *)(val))[0]; ++ ++ if (rx_gain == 0xff) {/* restore rx gain */ ++ ODM_Write_DIG(podmpriv, pDigTable->BackupIGValue); ++ } else { ++ pDigTable->BackupIGValue = pDigTable->CurIGValue; ++ ODM_Write_DIG(podmpriv, rx_gain); ++ } ++ } ++ break; ++ case HW_VAR_TRIGGER_GPIO_0: ++ rtl8192cu_trigger_gpio_0(Adapter); ++ break; ++ case HW_VAR_RPT_TIMER_SETTING: ++ { ++ u16 min_rpt_time = (*(u16 *)val); ++ ODM_RA_Set_TxRPT_Time(podmpriv, min_rpt_time); ++ } ++ break; ++ case HW_VAR_ANTENNA_DIVERSITY_SELECT: ++ { ++ u8 Optimum_antenna = (*(u8 *)val); ++ u8 Ant; ++ /* switch antenna to Optimum_antenna */ ++ if (haldata->CurAntenna != Optimum_antenna) { ++ Ant = (Optimum_antenna == 2) ? MAIN_ANT : AUX_ANT; ++ ODM_UpdateRxIdleAnt_88E(&haldata->odmpriv, Ant); ++ ++ haldata->CurAntenna = Optimum_antenna; ++ } ++ } ++ break; ++ case HW_VAR_EFUSE_BYTES: /* To set EFUE total used bytes, added by Roger, 2008.12.22. */ ++ haldata->EfuseUsedBytes = *((u16 *)val); ++ break; ++ case HW_VAR_FIFO_CLEARN_UP: ++ { ++ struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv; ++ u8 trycnt = 100; ++ ++ /* pause tx */ ++ rtw_write8(Adapter, REG_TXPAUSE, 0xff); ++ ++ /* keep sn */ ++ Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter, REG_NQOS_SEQ); ++ ++ if (!pwrpriv->bkeepfwalive) { ++ /* RX DMA stop */ ++ rtw_write32(Adapter, REG_RXPKT_NUM, (rtw_read32(Adapter, REG_RXPKT_NUM) | RW_RELEASE_EN)); ++ do { ++ if (!(rtw_read32(Adapter, REG_RXPKT_NUM) & RXDMA_IDLE)) ++ break; ++ } while (trycnt--); ++ if (trycnt == 0) ++ DBG_88E("Stop RX DMA failed......\n"); ++ ++ /* RQPN Load 0 */ ++ rtw_write16(Adapter, REG_RQPN_NPQ, 0x0); ++ rtw_write32(Adapter, REG_RQPN, 0x80000000); ++ mdelay(10); ++ } ++ } ++ break; ++ case HW_VAR_CHECK_TXBUF: ++ break; ++ case HW_VAR_APFM_ON_MAC: ++ haldata->bMacPwrCtrlOn = *val; ++ DBG_88E("%s: bMacPwrCtrlOn=%d\n", __func__, haldata->bMacPwrCtrlOn); ++ break; ++ case HW_VAR_TX_RPT_MAX_MACID: ++ { ++ u8 maxMacid = *val; ++ DBG_88E("### MacID(%d),Set Max Tx RPT MID(%d)\n", maxMacid, maxMacid + 1); ++ rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, maxMacid + 1); ++ } ++ break; ++ case HW_VAR_H2C_MEDIA_STATUS_RPT: ++ rtl8188e_set_FwMediaStatus_cmd(Adapter, (*(__le16 *)val)); ++ break; ++ case HW_VAR_BCN_VALID: ++ /* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2, write 1 to clear, Clear by sw */ ++ rtw_write8(Adapter, REG_TDECTRL + 2, rtw_read8(Adapter, REG_TDECTRL + 2) | BIT(0)); ++ break; ++ default: ++ break; ++ } ++ ++} ++ ++static void GetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ struct odm_dm_struct *podmpriv = &haldata->odmpriv; ++ ++ switch (variable) { ++ case HW_VAR_BASIC_RATE: ++ *((u16 *)(val)) = haldata->BasicRateSet; ++ fallthrough; ++ case HW_VAR_TXPAUSE: ++ val[0] = rtw_read8(Adapter, REG_TXPAUSE); ++ break; ++ case HW_VAR_BCN_VALID: ++ /* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2 */ ++ val[0] = (BIT(0) & rtw_read8(Adapter, REG_TDECTRL + 2)) ? true : false; ++ break; ++ case HW_VAR_DM_FLAG: ++ val[0] = podmpriv->SupportAbility; ++ break; ++ case HW_VAR_RF_TYPE: ++ val[0] = haldata->rf_type; ++ break; ++ case HW_VAR_FWLPS_RF_ON: ++ { ++ /* When we halt NIC, we should check if FW LPS is leave. */ ++ if (Adapter->pwrctrlpriv.rf_pwrstate == rf_off) { ++ /* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */ ++ /* because Fw is unload. */ ++ val[0] = true; ++ } else { ++ u32 valRCR; ++ valRCR = rtw_read32(Adapter, REG_RCR); ++ valRCR &= 0x00070000; ++ if (valRCR) ++ val[0] = false; ++ else ++ val[0] = true; ++ } ++ } ++ break; ++ case HW_VAR_CURRENT_ANTENNA: ++ val[0] = haldata->CurAntenna; ++ break; ++ case HW_VAR_EFUSE_BYTES: /* To get EFUE total used bytes, added by Roger, 2008.12.22. */ ++ *((u16 *)(val)) = haldata->EfuseUsedBytes; ++ break; ++ case HW_VAR_APFM_ON_MAC: ++ *val = haldata->bMacPwrCtrlOn; ++ break; ++ case HW_VAR_CHK_HI_QUEUE_EMPTY: ++ *val = ((rtw_read32(Adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0) ? true : false; ++ break; ++ default: ++ break; ++ } ++ ++} ++ ++/* */ ++/* Description: */ ++/* Query setting of specified variable. */ ++/* */ ++static u8 ++GetHalDefVar8188EUsb( ++ struct adapter *Adapter, ++ enum hal_def_variable eVariable, ++ void *pValue ++ ) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ u8 bResult = _SUCCESS; ++ ++ switch (eVariable) { ++ case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB: ++ { ++ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; ++ struct sta_priv *pstapriv = &Adapter->stapriv; ++ struct sta_info *psta; ++ psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress); ++ if (psta) ++ *((int *)pValue) = psta->rssi_stat.UndecoratedSmoothedPWDB; ++ } ++ break; ++ case HAL_DEF_IS_SUPPORT_ANT_DIV: ++ *((u8 *)pValue) = (haldata->AntDivCfg == 0) ? false : true; ++ break; ++ case HAL_DEF_CURRENT_ANTENNA: ++ *((u8 *)pValue) = haldata->CurAntenna; ++ break; ++ case HAL_DEF_DRVINFO_SZ: ++ *((u32 *)pValue) = DRVINFO_SZ; ++ break; ++ case HAL_DEF_MAX_RECVBUF_SZ: ++ *((u32 *)pValue) = MAX_RECVBUF_SZ; ++ break; ++ case HAL_DEF_RX_PACKET_OFFSET: ++ *((u32 *)pValue) = RXDESC_SIZE + DRVINFO_SZ; ++ break; ++ case HAL_DEF_DBG_DM_FUNC: ++ *((u32 *)pValue) = haldata->odmpriv.SupportAbility; ++ break; ++ case HAL_DEF_RA_DECISION_RATE: ++ { ++ u8 MacID = *((u8 *)pValue); ++ *((u8 *)pValue) = ODM_RA_GetDecisionRate_8188E(&haldata->odmpriv, MacID); ++ } ++ break; ++ case HAL_DEF_RA_SGI: ++ { ++ u8 MacID = *((u8 *)pValue); ++ *((u8 *)pValue) = ODM_RA_GetShortGI_8188E(&haldata->odmpriv, MacID); ++ } ++ break; ++ case HAL_DEF_PT_PWR_STATUS: ++ { ++ u8 MacID = *((u8 *)pValue); ++ *((u8 *)pValue) = ODM_RA_GetHwPwrStatus_8188E(&haldata->odmpriv, MacID); ++ } ++ break; ++ case HW_VAR_MAX_RX_AMPDU_FACTOR: ++ *((u32 *)pValue) = MAX_AMPDU_FACTOR_64K; ++ break; ++ case HW_DEF_RA_INFO_DUMP: ++ { ++ u8 entry_id = *((u8 *)pValue); ++ if (check_fwstate(&Adapter->mlmepriv, _FW_LINKED)) { ++ DBG_88E("============ RA status check ===================\n"); ++ DBG_88E("Mac_id:%d , RateID = %d, RAUseRate = 0x%08x, RateSGI = %d, DecisionRate = 0x%02x ,PTStage = %d\n", ++ entry_id, ++ haldata->odmpriv.RAInfo[entry_id].RateID, ++ haldata->odmpriv.RAInfo[entry_id].RAUseRate, ++ haldata->odmpriv.RAInfo[entry_id].RateSGI, ++ haldata->odmpriv.RAInfo[entry_id].DecisionRate, ++ haldata->odmpriv.RAInfo[entry_id].PTStage); ++ } ++ } ++ break; ++ case HAL_DEF_DBG_DUMP_RXPKT: ++ *((u8 *)pValue) = haldata->bDumpRxPkt; ++ break; ++ case HAL_DEF_DBG_DUMP_TXPKT: ++ *((u8 *)pValue) = haldata->bDumpTxPkt; ++ break; ++ default: ++ bResult = _FAIL; ++ break; ++ } ++ ++ return bResult; ++} ++ ++/* */ ++/* Description: */ ++/* Change default setting of specified variable. */ ++/* */ ++static u8 SetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(Adapter); ++ u8 bResult = _SUCCESS; ++ ++ switch (eVariable) { ++ case HAL_DEF_DBG_DM_FUNC: ++ { ++ u8 dm_func = *((u8 *)pValue); ++ struct odm_dm_struct *podmpriv = &haldata->odmpriv; ++ ++ if (dm_func == 0) { /* disable all dynamic func */ ++ podmpriv->SupportAbility = DYNAMIC_FUNC_DISABLE; ++ DBG_88E("==> Disable all dynamic function...\n"); ++ } else if (dm_func == 1) {/* disable DIG */ ++ podmpriv->SupportAbility &= (~DYNAMIC_BB_DIG); ++ DBG_88E("==> Disable DIG...\n"); ++ } else if (dm_func == 2) {/* disable High power */ ++ podmpriv->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR); ++ } else if (dm_func == 3) {/* disable tx power tracking */ ++ podmpriv->SupportAbility &= (~DYNAMIC_RF_CALIBRATION); ++ DBG_88E("==> Disable tx power tracking...\n"); ++ } else if (dm_func == 5) {/* disable antenna diversity */ ++ podmpriv->SupportAbility &= (~DYNAMIC_BB_ANT_DIV); ++ } else if (dm_func == 6) {/* turn on all dynamic func */ ++ if (!(podmpriv->SupportAbility & DYNAMIC_BB_DIG)) { ++ struct rtw_dig *pDigTable = &podmpriv->DM_DigTable; ++ pDigTable->CurIGValue = rtw_read8(Adapter, 0xc50); ++ } ++ podmpriv->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE; ++ DBG_88E("==> Turn on all dynamic function...\n"); ++ } ++ } ++ break; ++ case HAL_DEF_DBG_DUMP_RXPKT: ++ haldata->bDumpRxPkt = *((u8 *)pValue); ++ break; ++ case HAL_DEF_DBG_DUMP_TXPKT: ++ haldata->bDumpTxPkt = *((u8 *)pValue); ++ break; ++ default: ++ bResult = _FAIL; ++ break; ++ } ++ ++ return bResult; ++} ++ ++static void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level) ++{ ++ u8 init_rate = 0; ++ u8 networkType, raid; ++ u32 mask, rate_bitmap; ++ u8 shortGIrate = false; ++ int supportRateNum = 0; ++ struct sta_info *psta; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; ++ ++ if (mac_id >= NUM_STA) /* CAM_SIZE */ ++ return; ++ psta = pmlmeinfo->FW_sta_info[mac_id].psta; ++ if (!psta) ++ return; ++ switch (mac_id) { ++ case 0:/* for infra mode */ ++ supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates); ++ networkType = judge_network_type(adapt, cur_network->SupportedRates, supportRateNum) & 0xf; ++ raid = networktype_to_raid(networkType); ++ mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); ++ mask |= (pmlmeinfo->HT_enable) ? update_MSC_rate(&pmlmeinfo->HT_caps) : 0; ++ if (support_short_GI(adapt, &pmlmeinfo->HT_caps)) ++ shortGIrate = true; ++ break; ++ case 1:/* for broadcast/multicast */ ++ supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); ++ if (pmlmeext->cur_wireless_mode & WIRELESS_11B) ++ networkType = WIRELESS_11B; ++ else ++ networkType = WIRELESS_11G; ++ raid = networktype_to_raid(networkType); ++ mask = update_basic_rate(cur_network->SupportedRates, supportRateNum); ++ break; ++ default: /* for each sta in IBSS */ ++ supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); ++ networkType = judge_network_type(adapt, pmlmeinfo->FW_sta_info[mac_id].SupportedRates, supportRateNum) & 0xf; ++ raid = networktype_to_raid(networkType); ++ mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); ++ ++ /* todo: support HT in IBSS */ ++ break; ++ } ++ ++ rate_bitmap = 0x0fffffff; ++ rate_bitmap = ODM_Get_Rate_Bitmap(&haldata->odmpriv, mac_id, mask, rssi_level); ++ DBG_88E("%s => mac_id:%d, networkType:0x%02x, mask:0x%08x\n\t ==> rssi_level:%d, rate_bitmap:0x%08x\n", ++ __func__, mac_id, networkType, mask, rssi_level, rate_bitmap); ++ ++ mask &= rate_bitmap; ++ ++ init_rate = get_highest_rate_idx(mask) & 0x3f; ++ ++ if (haldata->fw_ractrl) { ++ u8 arg; ++ ++ arg = mac_id & 0x1f;/* MACID */ ++ arg |= BIT(7); ++ if (shortGIrate) ++ arg |= BIT(5); ++ mask |= ((raid << 28) & 0xf0000000); ++ DBG_88E("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg); ++ psta->ra_mask = mask; ++ mask |= ((raid << 28) & 0xf0000000); ++ ++ /* to do ,for 8188E-SMIC */ ++ rtl8188e_set_raid_cmd(adapt, mask); ++ } else { ++ ODM_RA_UpdateRateInfo_8188E(&haldata->odmpriv, ++ mac_id, ++ raid, ++ mask, ++ shortGIrate ++ ); ++ } ++ /* set ra_id */ ++ psta->raid = raid; ++ psta->init_rate = init_rate; ++} ++ ++static void SetBeaconRelatedRegisters8188EUsb(struct adapter *adapt) ++{ ++ u32 value32; ++ struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ u32 bcn_ctrl_reg = REG_BCN_CTRL; ++ /* reset TSF, enable update TSF, correcting TSF On Beacon */ ++ ++ /* BCN interval */ ++ rtw_write16(adapt, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); ++ rtw_write8(adapt, REG_ATIMWND, 0x02);/* 2ms */ ++ ++ _InitBeaconParameters(adapt); ++ ++ rtw_write8(adapt, REG_SLOT, 0x09); ++ ++ value32 = rtw_read32(adapt, REG_TCR); ++ value32 &= ~TSFRST; ++ rtw_write32(adapt, REG_TCR, value32); ++ ++ value32 |= TSFRST; ++ rtw_write32(adapt, REG_TCR, value32); ++ ++ /* NOTE: Fix test chip's bug (about contention windows's randomness) */ ++ rtw_write8(adapt, REG_RXTSF_OFFSET_CCK, 0x50); ++ rtw_write8(adapt, REG_RXTSF_OFFSET_OFDM, 0x50); ++ ++ _BeaconFunctionEnable(adapt, true, true); ++ ++ ResumeTxBeacon(adapt); ++ ++ rtw_write8(adapt, bcn_ctrl_reg, rtw_read8(adapt, bcn_ctrl_reg) | BIT(1)); ++} ++ ++static void rtl8188eu_init_default_value(struct adapter *adapt) ++{ ++ struct hal_data_8188e *haldata; ++ struct pwrctrl_priv *pwrctrlpriv; ++ u8 i; ++ ++ haldata = GET_HAL_DATA(adapt); ++ pwrctrlpriv = &adapt->pwrctrlpriv; ++ ++ /* init default value */ ++ haldata->fw_ractrl = false; ++ if (!pwrctrlpriv->bkeepfwalive) ++ haldata->LastHMEBoxNum = 0; ++ ++ /* init dm default value */ ++ haldata->odmpriv.RFCalibrateInfo.bIQKInitialized = false; ++ haldata->odmpriv.RFCalibrateInfo.TM_Trigger = 0;/* for IQK */ ++ haldata->pwrGroupCnt = 0; ++ haldata->PGMaxGroup = 13; ++ haldata->odmpriv.RFCalibrateInfo.ThermalValue_HP_index = 0; ++ for (i = 0; i < HP_THERMAL_NUM; i++) ++ haldata->odmpriv.RFCalibrateInfo.ThermalValue_HP[i] = 0; ++} ++ ++static u8 rtl8188eu_ps_func(struct adapter *Adapter, enum hal_intf_ps_func efunc_id, u8 *val) ++{ ++ u8 bResult = true; ++ return bResult; ++} ++ ++void rtl8188eu_set_hal_ops(struct adapter *adapt) ++{ ++ struct hal_ops *halfunc = &adapt->HalFunc; ++ ++ adapt->HalData = kzalloc(sizeof(struct hal_data_8188e), GFP_KERNEL); ++ if (!adapt->HalData) ++ DBG_88E("cant not alloc memory for HAL DATA\n"); ++ adapt->hal_data_sz = sizeof(struct hal_data_8188e); ++ ++ halfunc->hal_power_on = rtl8188eu_InitPowerOn; ++ halfunc->hal_init = &rtl8188eu_hal_init; ++ halfunc->hal_deinit = &rtl8188eu_hal_deinit; ++ ++ halfunc->inirp_init = &rtl8188eu_inirp_init; ++ halfunc->inirp_deinit = &rtl8188eu_inirp_deinit; ++ ++ halfunc->init_xmit_priv = &rtl8188eu_init_xmit_priv; ++ ++ halfunc->init_recv_priv = &rtl8188eu_init_recv_priv; ++ halfunc->free_recv_priv = &rtl8188eu_free_recv_priv; ++ halfunc->InitSwLeds = &rtl8188eu_InitSwLeds; ++ halfunc->DeInitSwLeds = &rtl8188eu_DeInitSwLeds; ++ ++ halfunc->init_default_value = &rtl8188eu_init_default_value; ++ halfunc->intf_chip_configure = &rtl8188eu_interface_configure; ++ halfunc->read_adapter_info = &ReadAdapterInfo8188EU; ++ ++ halfunc->SetHwRegHandler = &SetHwReg8188EU; ++ halfunc->GetHwRegHandler = &GetHwReg8188EU; ++ halfunc->GetHalDefVarHandler = &GetHalDefVar8188EUsb; ++ halfunc->SetHalDefVarHandler = &SetHalDefVar8188EUsb; ++ ++ halfunc->UpdateRAMaskHandler = &UpdateHalRAMask8188EUsb; ++ halfunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8188EUsb; ++ ++ halfunc->hal_xmit = &rtl8188eu_hal_xmit; ++ halfunc->mgnt_xmit = &rtl8188eu_mgnt_xmit; ++ ++ halfunc->interface_ps_func = &rtl8188eu_ps_func; ++ ++ rtl8188e_set_hal_ops(halfunc); ++ ++} +diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/staging/r8188eu/hal/usb_ops_linux.c +new file mode 100644 +index 000000000000..0cf69033c529 +--- /dev/null ++++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c +@@ -0,0 +1,562 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_ops.h" ++#include "../include/recv_osdep.h" ++#include "../include/rtl8188e_hal.h" ++ ++static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u16 value, void *pdata, u16 len, u8 requesttype) ++{ ++ struct adapter *adapt = pintfhdl->padapter; ++ struct dvobj_priv *dvobjpriv = adapter_to_dvobj(adapt); ++ struct usb_device *udev = dvobjpriv->pusbdev; ++ unsigned int pipe; ++ int status = 0; ++ u8 *pIo_buf; ++ int vendorreq_times = 0; ++ ++ if ((adapt->bSurpriseRemoved) || (adapt->pwrctrlpriv.pnp_bstop_trx)) { ++ status = -EPERM; ++ goto exit; ++ } ++ ++ if (len > MAX_VENDOR_REQ_CMD_SIZE) { ++ DBG_88E("[%s] Buffer len error ,vendor request failed\n", __func__); ++ status = -EINVAL; ++ goto exit; ++ } ++ ++ _enter_critical_mutex(&dvobjpriv->usb_vendor_req_mutex, NULL); ++ ++ /* Acquire IO memory for vendorreq */ ++ pIo_buf = dvobjpriv->usb_vendor_req_buf; ++ ++ if (!pIo_buf) { ++ DBG_88E("[%s] pIo_buf == NULL\n", __func__); ++ status = -ENOMEM; ++ goto release_mutex; ++ } ++ ++ if (requesttype == REALTEK_USB_VENQT_READ) ++ pipe = usb_rcvctrlpipe(udev, 0);/* read_in */ ++ else ++ pipe = usb_sndctrlpipe(udev, 0);/* write_out */ ++ ++ while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) { ++ if (requesttype == REALTEK_USB_VENQT_READ) ++ memset(pIo_buf, 0, len); ++ else ++ memcpy(pIo_buf, pdata, len); ++ ++ status = usb_control_msg(udev, pipe, REALTEK_USB_VENQT_CMD_REQ, ++ requesttype, value, REALTEK_USB_VENQT_CMD_IDX, ++ pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); ++ ++ if (status == len) { /* Success this control transfer. */ ++ rtw_reset_continual_urb_error(dvobjpriv); ++ if (requesttype == REALTEK_USB_VENQT_READ) ++ memcpy(pdata, pIo_buf, len); ++ } else { /* error cases */ ++ DBG_88E("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n", ++ value, (requesttype == REALTEK_USB_VENQT_READ) ? "read" : "write", ++ len, status, *(u32 *)pdata, vendorreq_times); ++ ++ if (status < 0) { ++ if (status == (-ESHUTDOWN) || status == -ENODEV) { ++ adapt->bSurpriseRemoved = true; ++ } else { ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ haldata->srestpriv.wifi_error_status = USB_VEN_REQ_CMD_FAIL; ++ } ++ } else { /* status != len && status >= 0 */ ++ if (status > 0) { ++ if (requesttype == REALTEK_USB_VENQT_READ) { ++ /* For Control read transfer, we have to copy the read data from pIo_buf to pdata. */ ++ memcpy(pdata, pIo_buf, len); ++ } ++ } ++ } ++ ++ if (rtw_inc_and_chk_continual_urb_error(dvobjpriv)) { ++ adapt->bSurpriseRemoved = true; ++ break; ++ } ++ ++ } ++ ++ /* firmware download is checksumed, don't retry */ ++ if ((value >= FW_8188E_START_ADDRESS && value <= FW_8188E_END_ADDRESS) || status == len) ++ break; ++ } ++release_mutex: ++ _exit_critical_mutex(&dvobjpriv->usb_vendor_req_mutex, NULL); ++exit: ++ return status; ++} ++ ++static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ u8 data; ++ ++ usbctrl_vendorreq(pintfhdl, wvalue, &data, 1, REALTEK_USB_VENQT_READ); ++ ++ return data; ++} ++ ++static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ __le32 data; ++ ++ usbctrl_vendorreq(pintfhdl, wvalue, &data, 2, REALTEK_USB_VENQT_READ); ++ ++ return (u16)(le32_to_cpu(data) & 0xffff); ++} ++ ++static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ __le32 data; ++ ++ usbctrl_vendorreq(pintfhdl, wvalue, &data, 4, REALTEK_USB_VENQT_READ); ++ ++ return le32_to_cpu(data); ++} ++ ++static int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ ++ return usbctrl_vendorreq(pintfhdl, wvalue, &val, 1, REALTEK_USB_VENQT_WRITE); ++} ++ ++static int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ __le32 data = cpu_to_le32(val & 0x0000ffff); ++ ++ return usbctrl_vendorreq(pintfhdl, wvalue, &data, 2, REALTEK_USB_VENQT_WRITE); ++} ++ ++static int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ __le32 data = cpu_to_le32(val); ++ ++ return usbctrl_vendorreq(pintfhdl, wvalue, &data, 4, REALTEK_USB_VENQT_WRITE); ++} ++ ++static int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata) ++{ ++ u16 wvalue = (u16)(addr & 0x0000ffff); ++ u8 buf[VENDOR_CMD_MAX_DATA_LEN] = {0}; ++ ++ if (length > VENDOR_CMD_MAX_DATA_LEN) ++ return -EINVAL; ++ ++ memcpy(buf, pdata, length); ++ ++ return usbctrl_vendorreq(pintfhdl, wvalue, buf, (length & 0xffff), REALTEK_USB_VENQT_WRITE); ++} ++ ++static void interrupt_handler_8188eu(struct adapter *adapt, u16 pkt_len, u8 *pbuf) ++{ ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ ++ if (pkt_len != INTERRUPT_MSG_FORMAT_LEN) { ++ DBG_88E("%s Invalid interrupt content length (%d)!\n", __func__, pkt_len); ++ return; ++ } ++ ++ /* HISR */ ++ memcpy(&haldata->IntArray[0], &pbuf[USB_INTR_CONTENT_HISR_OFFSET], 4); ++ memcpy(&haldata->IntArray[1], &pbuf[USB_INTR_CONTENT_HISRE_OFFSET], 4); ++ ++ /* C2H Event */ ++ if (pbuf[0] != 0) ++ memcpy(&haldata->C2hArray[0], &pbuf[USB_INTR_CONTENT_C2H_OFFSET], 16); ++} ++ ++static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb) ++{ ++ u8 *pbuf; ++ u8 shift_sz = 0; ++ u16 pkt_cnt; ++ u32 pkt_offset, skb_len, alloc_sz; ++ s32 transfer_len; ++ struct recv_stat *prxstat; ++ struct phy_stat *pphy_status = NULL; ++ struct sk_buff *pkt_copy = NULL; ++ struct recv_frame *precvframe = NULL; ++ struct rx_pkt_attrib *pattrib = NULL; ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ struct recv_priv *precvpriv = &adapt->recvpriv; ++ struct __queue *pfree_recv_queue = &precvpriv->free_recv_queue; ++ ++ transfer_len = (s32)pskb->len; ++ pbuf = pskb->data; ++ ++ prxstat = (struct recv_stat *)pbuf; ++ pkt_cnt = (le32_to_cpu(prxstat->rxdw2) >> 16) & 0xff; ++ ++ do { ++ prxstat = (struct recv_stat *)pbuf; ++ ++ precvframe = rtw_alloc_recvframe(pfree_recv_queue); ++ if (!precvframe) { ++ DBG_88E("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __func__, __LINE__); ++ goto _exit_recvbuf2recvframe; ++ } ++ ++ INIT_LIST_HEAD(&precvframe->list); ++ precvframe->precvbuf = NULL; /* can't access the precvbuf for new arch. */ ++ precvframe->len = 0; ++ ++ update_recvframe_attrib_88e(precvframe, prxstat); ++ ++ pattrib = &precvframe->attrib; ++ ++ if ((pattrib->crc_err) || (pattrib->icv_err)) { ++ DBG_88E("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n", __func__, pattrib->crc_err, pattrib->icv_err); ++ ++ rtw_free_recvframe(precvframe, pfree_recv_queue); ++ goto _exit_recvbuf2recvframe; ++ } ++ ++ if ((pattrib->physt) && (pattrib->pkt_rpt_type == NORMAL_RX)) ++ pphy_status = (struct phy_stat *)(pbuf + RXDESC_OFFSET); ++ ++ pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len; ++ ++ if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) { ++ DBG_88E("%s()-%d: RX Warning!,pkt_len<=0 or pkt_offset> transfoer_len\n", __func__, __LINE__); ++ rtw_free_recvframe(precvframe, pfree_recv_queue); ++ goto _exit_recvbuf2recvframe; ++ } ++ ++ /* Modified by Albert 20101213 */ ++ /* For 8 bytes IP header alignment. */ ++ if (pattrib->qos) /* Qos data, wireless lan header length is 26 */ ++ shift_sz = 6; ++ else ++ shift_sz = 0; ++ ++ skb_len = pattrib->pkt_len; ++ ++ /* for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. */ ++ /* modify alloc_sz for recvive crc error packet by thomas 2011-06-02 */ ++ if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) { ++ if (skb_len <= 1650) ++ alloc_sz = 1664; ++ else ++ alloc_sz = skb_len + 14; ++ } else { ++ alloc_sz = skb_len; ++ /* 6 is for IP header 8 bytes alignment in QoS packet case. */ ++ /* 8 is for skb->data 4 bytes alignment. */ ++ alloc_sz += 14; ++ } ++ ++ pkt_copy = netdev_alloc_skb(adapt->pnetdev, alloc_sz); ++ if (pkt_copy) { ++ pkt_copy->dev = adapt->pnetdev; ++ precvframe->pkt = pkt_copy; ++ precvframe->rx_head = pkt_copy->data; ++ precvframe->rx_end = pkt_copy->data + alloc_sz; ++ skb_reserve(pkt_copy, 8 - ((size_t)(pkt_copy->data) & 7));/* force pkt_copy->data at 8-byte alignment address */ ++ skb_reserve(pkt_copy, shift_sz);/* force ip_hdr at 8-byte alignment address according to shift_sz. */ ++ memcpy(pkt_copy->data, (pbuf + pattrib->drvinfo_sz + RXDESC_SIZE), skb_len); ++ precvframe->rx_tail = pkt_copy->data; ++ precvframe->rx_data = pkt_copy->data; ++ } else { ++ if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) { ++ DBG_88E("recvbuf2recvframe: alloc_skb fail , drop frag frame\n"); ++ rtw_free_recvframe(precvframe, pfree_recv_queue); ++ goto _exit_recvbuf2recvframe; ++ } ++ precvframe->pkt = skb_clone(pskb, GFP_ATOMIC); ++ if (precvframe->pkt) { ++ precvframe->rx_tail = pbuf + pattrib->drvinfo_sz + RXDESC_SIZE; ++ precvframe->rx_head = precvframe->rx_tail; ++ precvframe->rx_data = precvframe->rx_tail; ++ precvframe->rx_end = pbuf + pattrib->drvinfo_sz + RXDESC_SIZE + alloc_sz; ++ } else { ++ DBG_88E("recvbuf2recvframe: skb_clone fail\n"); ++ rtw_free_recvframe(precvframe, pfree_recv_queue); ++ goto _exit_recvbuf2recvframe; ++ } ++ } ++ ++ recvframe_put(precvframe, skb_len); ++ ++ switch (haldata->UsbRxAggMode) { ++ case USB_RX_AGG_DMA: ++ case USB_RX_AGG_MIX: ++ pkt_offset = (u16)_RND128(pkt_offset); ++ break; ++ case USB_RX_AGG_USB: ++ pkt_offset = (u16)_RND4(pkt_offset); ++ break; ++ case USB_RX_AGG_DISABLE: ++ default: ++ break; ++ } ++ if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */ ++ if (pattrib->physt) ++ update_recvframe_phyinfo_88e(precvframe, (struct phy_stat *)pphy_status); ++ rtw_recv_entry(precvframe); ++ } else { ++ /* enqueue recvframe to txrtp queue */ ++ if (pattrib->pkt_rpt_type == TX_REPORT1) { ++ /* CCX-TXRPT ack for xmit mgmt frames. */ ++ handle_txrpt_ccx_88e(adapt, precvframe->rx_data); ++ } else if (pattrib->pkt_rpt_type == TX_REPORT2) { ++ ODM_RA_TxRPT2Handle_8188E( ++ &haldata->odmpriv, ++ precvframe->rx_data, ++ pattrib->pkt_len, ++ pattrib->MacIDValidEntry[0], ++ pattrib->MacIDValidEntry[1] ++ ); ++ } else if (pattrib->pkt_rpt_type == HIS_REPORT) { ++ interrupt_handler_8188eu(adapt, pattrib->pkt_len, precvframe->rx_data); ++ } ++ rtw_free_recvframe(precvframe, pfree_recv_queue); ++ } ++ pkt_cnt--; ++ transfer_len -= pkt_offset; ++ pbuf += pkt_offset; ++ precvframe = NULL; ++ pkt_copy = NULL; ++ ++ if (transfer_len > 0 && pkt_cnt == 0) ++ pkt_cnt = (le32_to_cpu(prxstat->rxdw2) >> 16) & 0xff; ++ ++ } while ((transfer_len > 0) && (pkt_cnt > 0)); ++ ++_exit_recvbuf2recvframe: ++ ++ return _SUCCESS; ++} ++ ++void rtl8188eu_recv_tasklet(unsigned long priv) ++{ ++ struct sk_buff *pskb; ++ struct adapter *adapt = (struct adapter *)priv; ++ struct recv_priv *precvpriv = &adapt->recvpriv; ++ ++ while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) { ++ if ((adapt->bDriverStopped) || (adapt->bSurpriseRemoved)) { ++ DBG_88E("recv_tasklet => bDriverStopped or bSurpriseRemoved\n"); ++ dev_kfree_skb_any(pskb); ++ break; ++ } ++ recvbuf2recvframe(adapt, pskb); ++ skb_reset_tail_pointer(pskb); ++ pskb->len = 0; ++ skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); ++ } ++} ++ ++static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) ++{ ++ struct recv_buf *precvbuf = (struct recv_buf *)purb->context; ++ struct adapter *adapt = (struct adapter *)precvbuf->adapter; ++ struct recv_priv *precvpriv = &adapt->recvpriv; ++ ++ precvpriv->rx_pending_cnt--; ++ ++ if (adapt->bSurpriseRemoved || adapt->bDriverStopped || adapt->bReadPortCancel) { ++ precvbuf->reuse = true; ++ DBG_88E("%s() RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bReadPortCancel(%d)\n", ++ __func__, adapt->bDriverStopped, ++ adapt->bSurpriseRemoved, adapt->bReadPortCancel); ++ return; ++ } ++ ++ if (purb->status == 0) { /* SUCCESS */ ++ if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) { ++ precvbuf->reuse = true; ++ rtw_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); ++ DBG_88E("%s()-%d: RX Warning!\n", __func__, __LINE__); ++ } else { ++ rtw_reset_continual_urb_error(adapter_to_dvobj(adapt)); ++ ++ precvbuf->transfer_len = purb->actual_length; ++ skb_put(precvbuf->pskb, purb->actual_length); ++ skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb); ++ ++ if (skb_queue_len(&precvpriv->rx_skb_queue) <= 1) ++ tasklet_schedule(&precvpriv->recv_tasklet); ++ ++ precvbuf->pskb = NULL; ++ precvbuf->reuse = false; ++ rtw_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); ++ } ++ } else { ++ DBG_88E("###=> usb_read_port_complete => urb status(%d)\n", purb->status); ++ skb_put(precvbuf->pskb, purb->actual_length); ++ precvbuf->pskb = NULL; ++ ++ if (rtw_inc_and_chk_continual_urb_error(adapter_to_dvobj(adapt))) ++ adapt->bSurpriseRemoved = true; ++ ++ switch (purb->status) { ++ case -EINVAL: ++ case -EPIPE: ++ case -ENODEV: ++ case -ESHUTDOWN: ++ case -ENOENT: ++ adapt->bDriverStopped = true; ++ break; ++ case -EPROTO: ++ case -EOVERFLOW: ++ { ++ struct hal_data_8188e *haldata = GET_HAL_DATA(adapt); ++ haldata->srestpriv.wifi_error_status = USB_READ_PORT_FAIL; ++ } ++ precvbuf->reuse = true; ++ rtw_read_port(adapt, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); ++ break; ++ case -EINPROGRESS: ++ DBG_88E("ERROR: URB IS IN PROGRESS!/n"); ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) ++{ ++ struct urb *purb = NULL; ++ struct recv_buf *precvbuf = (struct recv_buf *)rmem; ++ struct adapter *adapter = pintfhdl->padapter; ++ struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter); ++ struct recv_priv *precvpriv = &adapter->recvpriv; ++ struct usb_device *pusbd = pdvobj->pusbdev; ++ int err; ++ unsigned int pipe; ++ size_t tmpaddr = 0; ++ size_t alignment = 0; ++ u32 ret = _SUCCESS; ++ ++ if (adapter->bDriverStopped || adapter->bSurpriseRemoved || ++ adapter->pwrctrlpriv.pnp_bstop_trx) ++ return _FAIL; ++ ++ if (!precvbuf) ++ return _FAIL; ++ ++ if (!precvbuf->reuse || !precvbuf->pskb) { ++ precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue); ++ if (precvbuf->pskb) ++ precvbuf->reuse = true; ++ } ++ ++ rtl8188eu_init_recvbuf(adapter, precvbuf); ++ ++ /* re-assign for linux based on skb */ ++ if (!precvbuf->reuse || !precvbuf->pskb) { ++ precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); ++ if (!precvbuf->pskb) { ++ DBG_88E("#### usb_read_port() alloc_skb fail!#####\n"); ++ return _FAIL; ++ } ++ ++ tmpaddr = (size_t)precvbuf->pskb->data; ++ alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1); ++ skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); ++ ++ precvbuf->phead = precvbuf->pskb->head; ++ precvbuf->pdata = precvbuf->pskb->data; ++ precvbuf->ptail = skb_tail_pointer(precvbuf->pskb); ++ precvbuf->pend = skb_end_pointer(precvbuf->pskb); ++ precvbuf->pbuf = precvbuf->pskb->data; ++ } else { /* reuse skb */ ++ precvbuf->phead = precvbuf->pskb->head; ++ precvbuf->pdata = precvbuf->pskb->data; ++ precvbuf->ptail = skb_tail_pointer(precvbuf->pskb); ++ precvbuf->pend = skb_end_pointer(precvbuf->pskb); ++ precvbuf->pbuf = precvbuf->pskb->data; ++ ++ precvbuf->reuse = false; ++ } ++ ++ precvpriv->rx_pending_cnt++; ++ ++ purb = precvbuf->purb; ++ ++ /* translate DMA FIFO addr to pipehandle */ ++ pipe = ffaddr2pipehdl(pdvobj, addr); ++ ++ usb_fill_bulk_urb(purb, pusbd, pipe, ++ precvbuf->pbuf, ++ MAX_RECVBUF_SZ, ++ usb_read_port_complete, ++ precvbuf);/* context is precvbuf */ ++ ++ err = usb_submit_urb(purb, GFP_ATOMIC); ++ if ((err) && (err != (-EPERM))) { ++ DBG_88E("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n", ++ err, purb->status); ++ ret = _FAIL; ++ } ++ ++ return ret; ++} ++ ++void rtl8188eu_xmit_tasklet(unsigned long priv) ++{ ++ int ret = false; ++ struct adapter *adapt = (struct adapter *)priv; ++ struct xmit_priv *pxmitpriv = &adapt->xmitpriv; ++ ++ if (check_fwstate(&adapt->mlmepriv, _FW_UNDER_SURVEY)) ++ return; ++ ++ while (1) { ++ if ((adapt->bDriverStopped) || ++ (adapt->bSurpriseRemoved) || ++ (adapt->bWritePortCancel)) { ++ DBG_88E("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); ++ break; ++ } ++ ++ ret = rtl8188eu_xmitframe_complete(adapt, pxmitpriv, NULL); ++ ++ if (!ret) ++ break; ++ } ++} ++ ++void rtl8188eu_set_intf_ops(struct _io_ops *pops) ++{ ++ ++ memset((u8 *)pops, 0, sizeof(struct _io_ops)); ++ pops->_read8 = &usb_read8; ++ pops->_read16 = &usb_read16; ++ pops->_read32 = &usb_read32; ++ pops->_read_mem = &usb_read_mem; ++ pops->_read_port = &usb_read_port; ++ pops->_write8 = &usb_write8; ++ pops->_write16 = &usb_write16; ++ pops->_write32 = &usb_write32; ++ pops->_writeN = &usb_writeN; ++ pops->_write_mem = &usb_write_mem; ++ pops->_write_port = &usb_write_port; ++ pops->_read_port_cancel = &usb_read_port_cancel; ++ pops->_write_port_cancel = &usb_write_port_cancel; ++ ++} ++ ++void rtl8188eu_set_hw_type(struct adapter *adapt) ++{ ++ adapt->chip_type = RTL8188E; ++ adapt->HardwareType = HARDWARE_TYPE_RTL8188EU; ++ DBG_88E("CHIP TYPE: RTL8188E\n"); ++} +diff --git a/drivers/staging/r8188eu/include/Hal8188EPhyCfg.h b/drivers/staging/r8188eu/include/Hal8188EPhyCfg.h +new file mode 100644 +index 000000000000..4370ec2fa981 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/Hal8188EPhyCfg.h +@@ -0,0 +1,249 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_HAL8188EPHYCFG_H__ ++#define __INC_HAL8188EPHYCFG_H__ ++ ++/*--------------------------Define Parameters-------------------------------*/ ++#define LOOP_LIMIT 5 ++#define MAX_STALL_TIME 50 /* us */ ++#define AntennaDiversityValue 0x80 ++#define MAX_TXPWR_IDX_NMODE_92S 63 ++#define Reset_Cnt_Limit 3 ++ ++#define IQK_MAC_REG_NUM 4 ++#define IQK_ADDA_REG_NUM 16 ++#define IQK_BB_REG_NUM 9 ++#define HP_THERMAL_NUM 8 ++ ++#define MAX_AGGR_NUM 0x07 ++ ++/*--------------------------Define Parameters-------------------------------*/ ++ ++/*------------------------------Define structure----------------------------*/ ++enum sw_chnl_cmd_id { ++ CmdID_End, ++ CmdID_SetTxPowerLevel, ++ CmdID_BBRegWrite10, ++ CmdID_WritePortUlong, ++ CmdID_WritePortUshort, ++ CmdID_WritePortUchar, ++ CmdID_RF_WriteReg, ++}; ++ ++/* 1. Switch channel related */ ++struct sw_chnl_cmd { ++ enum sw_chnl_cmd_id CmdID; ++ u32 Para1; ++ u32 Para2; ++ u32 msDelay; ++}; ++ ++enum hw90_block { ++ HW90_BLOCK_MAC = 0, ++ HW90_BLOCK_PHY0 = 1, ++ HW90_BLOCK_PHY1 = 2, ++ HW90_BLOCK_RF = 3, ++ HW90_BLOCK_MAXIMUM = 4, /* Never use this */ ++}; ++ ++enum rf_radio_path { ++ RF_PATH_A = 0, /* Radio Path A */ ++ RF_PATH_B = 1, /* Radio Path B */ ++ RF_PATH_C = 2, /* Radio Path C */ ++ RF_PATH_D = 3, /* Radio Path D */ ++}; ++ ++#define MAX_PG_GROUP 13 ++ ++#define RF_PATH_MAX 3 ++#define MAX_TX_COUNT 4 /* path numbers */ ++ ++#define CHANNEL_MAX_NUMBER 14 /* 14 is the max chnl number */ ++#define MAX_CHNL_GROUP_24G 6 /* ch1~2, ch3~5, ch6~8, ++ *ch9~11, ch12~13, CH 14 ++ * total three groups */ ++#define CHANNEL_GROUP_MAX_88E 6 ++ ++enum wireless_mode { ++ WIRELESS_MODE_UNKNOWN = 0x00, ++ WIRELESS_MODE_B = BIT(0), ++ WIRELESS_MODE_G = BIT(1), ++ WIRELESS_MODE_AUTO = BIT(5), ++ WIRELESS_MODE_N_24G = BIT(3), ++}; ++ ++enum phy_rate_tx_offset_area { ++ RA_OFFSET_LEGACY_OFDM1, ++ RA_OFFSET_LEGACY_OFDM2, ++ RA_OFFSET_HT_OFDM1, ++ RA_OFFSET_HT_OFDM2, ++ RA_OFFSET_HT_OFDM3, ++ RA_OFFSET_HT_OFDM4, ++ RA_OFFSET_HT_CCK, ++}; ++ ++/* BB/RF related */ ++enum RF_TYPE_8190P { ++ RF_TYPE_MIN, /* 0 */ ++ RF_8225 = 1, /* 1 11b/g RF for verification only */ ++ RF_8256 = 2, /* 2 11b/g/n */ ++ RF_6052 = 4, /* 4 11b/g/n RF */ ++ /* TODO: We should remove this psudo PHY RF after we get new RF. */ ++ RF_PSEUDO_11N = 5, /* 5, It is a temporality RF. */ ++}; ++ ++struct bb_reg_def { ++ u32 rfintfs; /* set software control: */ ++ /* 0x870~0x877[8 bytes] */ ++ u32 rfintfi; /* readback data: */ ++ /* 0x8e0~0x8e7[8 bytes] */ ++ u32 rfintfo; /* output data: */ ++ /* 0x860~0x86f [16 bytes] */ ++ u32 rfintfe; /* output enable: */ ++ /* 0x860~0x86f [16 bytes] */ ++ u32 rf3wireOffset; /* LSSI data: */ ++ /* 0x840~0x84f [16 bytes] */ ++ u32 rfLSSI_Select; /* BB Band Select: */ ++ /* 0x878~0x87f [8 bytes] */ ++ u32 rfTxGainStage; /* Tx gain stage: */ ++ /* 0x80c~0x80f [4 bytes] */ ++ u32 rfHSSIPara1; /* wire parameter control1 : */ ++ /* 0x820~0x823,0x828~0x82b, ++ * 0x830~0x833, 0x838~0x83b [16 bytes] */ ++ u32 rfHSSIPara2; /* wire parameter control2 : */ ++ /* 0x824~0x827,0x82c~0x82f, 0x834~0x837, ++ * 0x83c~0x83f [16 bytes] */ ++ u32 rfSwitchControl; /* Tx Rx antenna control : */ ++ /* 0x858~0x85f [16 bytes] */ ++ u32 rfAGCControl1; /* AGC parameter control1 : */ ++ /* 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, ++ * 0xc68~0xc6b [16 bytes] */ ++ u32 rfAGCControl2; /* AGC parameter control2 : */ ++ /* 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, ++ * 0xc6c~0xc6f [16 bytes] */ ++ u32 rfRxIQImbalance; /* OFDM Rx IQ imbalance matrix : */ ++ /* 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, ++ * 0xc2c~0xc2f [16 bytes] */ ++ u32 rfRxAFE; /* Rx IQ DC ofset and Rx digital filter, ++ * Rx DC notch filter : */ ++ /* 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, ++ * 0xc28~0xc2b [16 bytes] */ ++ u32 rfTxIQImbalance; /* OFDM Tx IQ imbalance matrix */ ++ /* 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, ++ * 0xc98~0xc9b [16 bytes] */ ++ u32 rfTxAFE; /* Tx IQ DC Offset and Tx DFIR type */ ++ /* 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, ++ * 0xc9c~0xc9f [16 bytes] */ ++ u32 rfLSSIReadBack; /* LSSI RF readback data SI mode */ ++ /* 0x8a0~0x8af [16 bytes] */ ++ u32 rfLSSIReadBackPi; /* LSSI RF readback data PI mode 0x8b8-8bc for ++ * Path A and B */ ++}; ++ ++struct ant_sel_ofdm { ++ u32 r_tx_antenna:4; ++ u32 r_ant_l:4; ++ u32 r_ant_non_ht:4; ++ u32 r_ant_ht1:4; ++ u32 r_ant_ht2:4; ++ u32 r_ant_ht_s1:4; ++ u32 r_ant_non_ht_s1:4; ++ u32 OFDM_TXSC:2; ++ u32 reserved:2; ++}; ++ ++struct ant_sel_cck { ++ u8 r_cckrx_enable_2:2; ++ u8 r_cckrx_enable:2; ++ u8 r_ccktx_enable:4; ++}; ++ ++/*------------------------------Define structure----------------------------*/ ++ ++/*------------------------Export global variable----------------------------*/ ++/*------------------------Export global variable----------------------------*/ ++ ++/*------------------------Export Marco Definition---------------------------*/ ++/*------------------------Export Marco Definition---------------------------*/ ++ ++/*--------------------------Exported Function prototype---------------------*/ ++/* */ ++/* BB and RF register read/write */ ++/* */ ++u32 rtl8188e_PHY_QueryBBReg(struct adapter *adapter, u32 regaddr, u32 mask); ++void rtl8188e_PHY_SetBBReg(struct adapter *Adapter, u32 RegAddr, ++ u32 mask, u32 data); ++u32 rtl8188e_PHY_QueryRFReg(struct adapter *adapter, enum rf_radio_path rfpath, ++ u32 regaddr, u32 mask); ++void rtl8188e_PHY_SetRFReg(struct adapter *adapter, enum rf_radio_path rfpath, ++ u32 regaddr, u32 mask, u32 data); ++ ++/* Initialization related function */ ++/* MAC/BB/RF HAL config */ ++int PHY_MACConfig8188E(struct adapter *adapter); ++int PHY_BBConfig8188E(struct adapter *adapter); ++int PHY_RFConfig8188E(struct adapter *adapter); ++ ++/* RF config */ ++int rtl8188e_PHY_ConfigRFWithParaFile(struct adapter *adapter, u8 *filename, ++ enum rf_radio_path rfpath); ++int rtl8188e_PHY_ConfigRFWithHeaderFile(struct adapter *adapter, ++ enum rf_radio_path rfpath); ++ ++/* Read initi reg value for tx power setting. */ ++void rtl8192c_PHY_GetHWRegOriginalValue(struct adapter *adapter); ++ ++/* BB TX Power R/W */ ++void PHY_GetTxPowerLevel8188E(struct adapter *adapter, u32 *powerlevel); ++void PHY_SetTxPowerLevel8188E(struct adapter *adapter, u8 channel); ++bool PHY_UpdateTxPowerDbm8188E(struct adapter *adapter, int power); ++ ++void PHY_ScanOperationBackup8188E(struct adapter *Adapter, u8 Operation); ++ ++/* Switch bandwidth for 8192S */ ++void PHY_SetBWMode8188E(struct adapter *adapter, ++ enum ht_channel_width chnlwidth, unsigned char offset); ++ ++/* channel switch related funciton */ ++void PHY_SwChnl8188E(struct adapter *adapter, u8 channel); ++/* Call after initialization */ ++void ChkFwCmdIoDone(struct adapter *adapter); ++ ++/* BB/MAC/RF other monitor API */ ++void PHY_SetRFPathSwitch_8188E(struct adapter *adapter, bool main); ++ ++void PHY_SwitchEphyParameter(struct adapter *adapter); ++ ++void PHY_EnableHostClkReq(struct adapter *adapter); ++ ++bool SetAntennaConfig92C(struct adapter *adapter, u8 defaultant); ++ ++void storePwrIndexDiffRateOffset(struct adapter *adapter, u32 regaddr, ++ u32 mask, u32 data); ++/*--------------------------Exported Function prototype---------------------*/ ++ ++#define PHY_QueryBBReg(adapt, regaddr, mask) \ ++ rtl8188e_PHY_QueryBBReg((adapt), (regaddr), (mask)) ++#define PHY_SetBBReg(adapt, regaddr, bitmask, data) \ ++ rtl8188e_PHY_SetBBReg((adapt), (regaddr), (bitmask), (data)) ++#define PHY_QueryRFReg(adapt, rfpath, regaddr, bitmask) \ ++ rtl8188e_PHY_QueryRFReg((adapt), (rfpath), (regaddr), (bitmask)) ++#define PHY_SetRFReg(adapt, rfpath, regaddr, bitmask, data) \ ++ rtl8188e_PHY_SetRFReg((adapt), (rfpath), (regaddr), (bitmask), (data)) ++ ++#define PHY_SetMacReg PHY_SetBBReg ++ ++#define SIC_HW_SUPPORT 0 ++ ++#define SIC_MAX_POLL_CNT 5 ++ ++#define SIC_CMD_READY 0 ++#define SIC_CMD_WRITE 1 ++#define SIC_CMD_READ 2 ++ ++#define SIC_CMD_REG 0x1EB /* 1byte */ ++#define SIC_ADDR_REG 0x1E8 /* 1b9~1ba, 2 bytes */ ++#define SIC_DATA_REG 0x1EC /* 1bc~1bf */ ++ ++#endif /* __INC_HAL8192CPHYCFG_H */ +diff --git a/drivers/staging/r8188eu/include/Hal8188EPhyReg.h b/drivers/staging/r8188eu/include/Hal8188EPhyReg.h +new file mode 100644 +index 000000000000..8b8c75a1f149 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/Hal8188EPhyReg.h +@@ -0,0 +1,1072 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_HAL8188EPHYREG_H__ ++#define __INC_HAL8188EPHYREG_H__ ++/*--------------------------Define Parameters-------------------------------*/ ++/* */ ++/* BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF */ ++/* 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF */ ++/* 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 */ ++/* 3. RF register 0x00-2E */ ++/* 4. Bit Mask for BB/RF register */ ++/* 5. Other definition for BB/RF R/W */ ++/* */ ++ ++/* */ ++/* 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF */ ++/* 1. Page1(0x100) */ ++/* */ ++#define rPMAC_Reset 0x100 ++#define rPMAC_TxStart 0x104 ++#define rPMAC_TxLegacySIG 0x108 ++#define rPMAC_TxHTSIG1 0x10c ++#define rPMAC_TxHTSIG2 0x110 ++#define rPMAC_PHYDebug 0x114 ++#define rPMAC_TxPacketNum 0x118 ++#define rPMAC_TxIdle 0x11c ++#define rPMAC_TxMACHeader0 0x120 ++#define rPMAC_TxMACHeader1 0x124 ++#define rPMAC_TxMACHeader2 0x128 ++#define rPMAC_TxMACHeader3 0x12c ++#define rPMAC_TxMACHeader4 0x130 ++#define rPMAC_TxMACHeader5 0x134 ++#define rPMAC_TxDataType 0x138 ++#define rPMAC_TxRandomSeed 0x13c ++#define rPMAC_CCKPLCPPreamble 0x140 ++#define rPMAC_CCKPLCPHeader 0x144 ++#define rPMAC_CCKCRC16 0x148 ++#define rPMAC_OFDMRxCRC32OK 0x170 ++#define rPMAC_OFDMRxCRC32Er 0x174 ++#define rPMAC_OFDMRxParityEr 0x178 ++#define rPMAC_OFDMRxCRC8Er 0x17c ++#define rPMAC_CCKCRxRC16Er 0x180 ++#define rPMAC_CCKCRxRC32Er 0x184 ++#define rPMAC_CCKCRxRC32OK 0x188 ++#define rPMAC_TxStatus 0x18c ++ ++/* 2. Page2(0x200) */ ++/* The following two definition are only used for USB interface. */ ++#define RF_BB_CMD_ADDR 0x02c0 /* RF/BB r/w cmd address. */ ++#define RF_BB_CMD_DATA 0x02c4 /* RF/BB r/w cmd data. */ ++ ++/* 3. Page8(0x800) */ ++#define rFPGA0_RFMOD 0x800 /* RF mode & CCK TxSC RF BW Setting */ ++ ++#define rFPGA0_TxInfo 0x804 /* Status report?? */ ++#define rFPGA0_PSDFunction 0x808 ++ ++#define rFPGA0_TxGainStage 0x80c /* Set TX PWR init gain? */ ++ ++#define rFPGA0_RFTiming1 0x810 /* Useless now */ ++#define rFPGA0_RFTiming2 0x814 ++ ++#define rFPGA0_XA_HSSIParameter1 0x820 /* RF 3 wire register */ ++#define rFPGA0_XA_HSSIParameter2 0x824 ++#define rFPGA0_XB_HSSIParameter1 0x828 ++#define rFPGA0_XB_HSSIParameter2 0x82c ++ ++#define rFPGA0_XA_LSSIParameter 0x840 ++#define rFPGA0_XB_LSSIParameter 0x844 ++ ++#define rFPGA0_RFWakeUpParameter 0x850 /* Useless now */ ++#define rFPGA0_RFSleepUpParameter 0x854 ++ ++#define rFPGA0_XAB_SwitchControl 0x858 /* RF Channel switch */ ++#define rFPGA0_XCD_SwitchControl 0x85c ++ ++#define rFPGA0_XA_RFInterfaceOE 0x860 /* RF Channel switch */ ++#define rFPGA0_XB_RFInterfaceOE 0x864 ++ ++#define rFPGA0_XAB_RFInterfaceSW 0x870 /* RF Iface Software Control */ ++#define rFPGA0_XCD_RFInterfaceSW 0x874 ++ ++#define rFPGA0_XAB_RFParameter 0x878 /* RF Parameter */ ++#define rFPGA0_XCD_RFParameter 0x87c ++ ++/* Crystal cap setting RF-R/W protection for parameter4?? */ ++#define rFPGA0_AnalogParameter1 0x880 ++#define rFPGA0_AnalogParameter2 0x884 ++#define rFPGA0_AnalogParameter3 0x888 ++/* enable ad/da clock1 for dual-phy */ ++#define rFPGA0_AdDaClockEn 0x888 ++#define rFPGA0_AnalogParameter4 0x88c ++ ++#define rFPGA0_XA_LSSIReadBack 0x8a0 /* Tranceiver LSSI Readback */ ++#define rFPGA0_XB_LSSIReadBack 0x8a4 ++#define rFPGA0_XC_LSSIReadBack 0x8a8 ++#define rFPGA0_XD_LSSIReadBack 0x8ac ++ ++#define rFPGA0_PSDReport 0x8b4 /* Useless now */ ++/* Transceiver A HSPI Readback */ ++#define TransceiverA_HSPI_Readback 0x8b8 ++/* Transceiver B HSPI Readback */ ++#define TransceiverB_HSPI_Readback 0x8bc ++/* Useless now RF Interface Readback Value */ ++#define rFPGA0_XAB_RFInterfaceRB 0x8e0 ++#define rFPGA0_XCD_RFInterfaceRB 0x8e4 /* Useless now */ ++ ++/* 4. Page9(0x900) */ ++/* RF mode & OFDM TxSC RF BW Setting?? */ ++#define rFPGA1_RFMOD 0x900 ++ ++#define rFPGA1_TxBlock 0x904 /* Useless now */ ++#define rFPGA1_DebugSelect 0x908 /* Useless now */ ++#define rFPGA1_TxInfo 0x90c /* Useless now Status report */ ++ ++/* 5. PageA(0xA00) */ ++/* Set Control channel to upper or lower - required only for 40MHz */ ++#define rCCK0_System 0xa00 ++ ++/* Disable init gain now Select RX path by RSSI */ ++#define rCCK0_AFESetting 0xa04 ++/* Disable init gain now Init gain */ ++#define rCCK0_CCA 0xa08 ++ ++/* AGC default value, saturation level Antenna Diversity, RX AGC, LNA Threshold, ++ * RX LNA Threshold useless now. Not the same as 90 series */ ++#define rCCK0_RxAGC1 0xa0c ++#define rCCK0_RxAGC2 0xa10 /* AGC & DAGC */ ++ ++#define rCCK0_RxHP 0xa14 ++ ++/* Timing recovery & Channel estimation threshold */ ++#define rCCK0_DSPParameter1 0xa18 ++#define rCCK0_DSPParameter2 0xa1c /* SQ threshold */ ++ ++#define rCCK0_TxFilter1 0xa20 ++#define rCCK0_TxFilter2 0xa24 ++#define rCCK0_DebugPort 0xa28 /* debug port and Tx filter3 */ ++#define rCCK0_FalseAlarmReport 0xa2c /* 0xa2d useless now */ ++#define rCCK0_TRSSIReport 0xa50 ++#define rCCK0_RxReport 0xa54 /* 0xa57 */ ++#define rCCK0_FACounterLower 0xa5c /* 0xa5b */ ++#define rCCK0_FACounterUpper 0xa58 /* 0xa5c */ ++ ++/* */ ++/* PageB(0xB00) */ ++/* */ ++#define rPdp_AntA 0xb00 ++#define rPdp_AntA_4 0xb04 ++#define rConfig_Pmpd_AntA 0xb28 ++#define rConfig_AntA 0xb68 ++#define rConfig_AntB 0xb6c ++#define rPdp_AntB 0xb70 ++#define rPdp_AntB_4 0xb74 ++#define rConfig_Pmpd_AntB 0xb98 ++#define rAPK 0xbd8 ++ ++/* */ ++/* 6. PageC(0xC00) */ ++/* */ ++#define rOFDM0_LSTF 0xc00 ++ ++#define rOFDM0_TRxPathEnable 0xc04 ++#define rOFDM0_TRMuxPar 0xc08 ++#define rOFDM0_TRSWIsolation 0xc0c ++ ++/* RxIQ DC offset, Rx digital filter, DC notch filter */ ++#define rOFDM0_XARxAFE 0xc10 ++#define rOFDM0_XARxIQImbalance 0xc14 /* RxIQ imblance matrix */ ++#define rOFDM0_XBRxAFE 0xc18 ++#define rOFDM0_XBRxIQImbalance 0xc1c ++#define rOFDM0_XCRxAFE 0xc20 ++#define rOFDM0_XCRxIQImbalance 0xc24 ++#define rOFDM0_XDRxAFE 0xc28 ++#define rOFDM0_XDRxIQImbalance 0xc2c ++ ++#define rOFDM0_RxDetector1 0xc30 /*PD,BW & SBD DM tune init gain*/ ++#define rOFDM0_RxDetector2 0xc34 /* SBD & Fame Sync. */ ++#define rOFDM0_RxDetector3 0xc38 /* Frame Sync. */ ++#define rOFDM0_RxDetector4 0xc3c /* PD, SBD, Frame Sync & Short-GI */ ++ ++#define rOFDM0_RxDSP 0xc40 /* Rx Sync Path */ ++#define rOFDM0_CFOandDAGC 0xc44 /* CFO & DAGC */ ++#define rOFDM0_CCADropThreshold 0xc48 /* CCA Drop threshold */ ++#define rOFDM0_ECCAThreshold 0xc4c /* energy CCA */ ++ ++#define rOFDM0_XAAGCCore1 0xc50 /* DIG */ ++#define rOFDM0_XAAGCCore2 0xc54 ++#define rOFDM0_XBAGCCore1 0xc58 ++#define rOFDM0_XBAGCCore2 0xc5c ++#define rOFDM0_XCAGCCore1 0xc60 ++#define rOFDM0_XCAGCCore2 0xc64 ++#define rOFDM0_XDAGCCore1 0xc68 ++#define rOFDM0_XDAGCCore2 0xc6c ++ ++#define rOFDM0_AGCParameter1 0xc70 ++#define rOFDM0_AGCParameter2 0xc74 ++#define rOFDM0_AGCRSSITable 0xc78 ++#define rOFDM0_HTSTFAGC 0xc7c ++ ++#define rOFDM0_XATxIQImbalance 0xc80 /* TX PWR TRACK and DIG */ ++#define rOFDM0_XATxAFE 0xc84 ++#define rOFDM0_XBTxIQImbalance 0xc88 ++#define rOFDM0_XBTxAFE 0xc8c ++#define rOFDM0_XCTxIQImbalance 0xc90 ++#define rOFDM0_XCTxAFE 0xc94 ++#define rOFDM0_XDTxIQImbalance 0xc98 ++#define rOFDM0_XDTxAFE 0xc9c ++ ++#define rOFDM0_RxIQExtAnta 0xca0 ++#define rOFDM0_TxCoeff1 0xca4 ++#define rOFDM0_TxCoeff2 0xca8 ++#define rOFDM0_TxCoeff3 0xcac ++#define rOFDM0_TxCoeff4 0xcb0 ++#define rOFDM0_TxCoeff5 0xcb4 ++#define rOFDM0_TxCoeff6 0xcb8 ++#define rOFDM0_RxHPParameter 0xce0 ++#define rOFDM0_TxPseudoNoiseWgt 0xce4 ++#define rOFDM0_FrameSync 0xcf0 ++#define rOFDM0_DFSReport 0xcf4 ++ ++/* */ ++/* 7. PageD(0xD00) */ ++/* */ ++#define rOFDM1_LSTF 0xd00 ++#define rOFDM1_TRxPathEnable 0xd04 ++ ++#define rOFDM1_CFO 0xd08 /* No setting now */ ++#define rOFDM1_CSI1 0xd10 ++#define rOFDM1_SBD 0xd14 ++#define rOFDM1_CSI2 0xd18 ++#define rOFDM1_CFOTracking 0xd2c ++#define rOFDM1_TRxMesaure1 0xd34 ++#define rOFDM1_IntfDet 0xd3c ++#define rOFDM1_PseudoNoiseStateAB 0xd50 ++#define rOFDM1_PseudoNoiseStateCD 0xd54 ++#define rOFDM1_RxPseudoNoiseWgt 0xd58 ++ ++#define rOFDM_PHYCounter1 0xda0 /* cca, parity fail */ ++#define rOFDM_PHYCounter2 0xda4 /* rate illegal, crc8 fail */ ++#define rOFDM_PHYCounter3 0xda8 /* MCS not support */ ++ ++#define rOFDM_ShortCFOAB 0xdac /* No setting now */ ++#define rOFDM_ShortCFOCD 0xdb0 ++#define rOFDM_LongCFOAB 0xdb4 ++#define rOFDM_LongCFOCD 0xdb8 ++#define rOFDM_TailCFOAB 0xdbc ++#define rOFDM_TailCFOCD 0xdc0 ++#define rOFDM_PWMeasure1 0xdc4 ++#define rOFDM_PWMeasure2 0xdc8 ++#define rOFDM_BWReport 0xdcc ++#define rOFDM_AGCReport 0xdd0 ++#define rOFDM_RxSNR 0xdd4 ++#define rOFDM_RxEVMCSI 0xdd8 ++#define rOFDM_SIGReport 0xddc ++ ++/* */ ++/* 8. PageE(0xE00) */ ++/* */ ++#define rTxAGC_A_Rate18_06 0xe00 ++#define rTxAGC_A_Rate54_24 0xe04 ++#define rTxAGC_A_CCK1_Mcs32 0xe08 ++#define rTxAGC_A_Mcs03_Mcs00 0xe10 ++#define rTxAGC_A_Mcs07_Mcs04 0xe14 ++#define rTxAGC_A_Mcs11_Mcs08 0xe18 ++#define rTxAGC_A_Mcs15_Mcs12 0xe1c ++ ++#define rTxAGC_B_Rate18_06 0x830 ++#define rTxAGC_B_Rate54_24 0x834 ++#define rTxAGC_B_CCK1_55_Mcs32 0x838 ++#define rTxAGC_B_Mcs03_Mcs00 0x83c ++#define rTxAGC_B_Mcs07_Mcs04 0x848 ++#define rTxAGC_B_Mcs11_Mcs08 0x84c ++#define rTxAGC_B_Mcs15_Mcs12 0x868 ++#define rTxAGC_B_CCK11_A_CCK2_11 0x86c ++ ++#define rFPGA0_IQK 0xe28 ++#define rTx_IQK_Tone_A 0xe30 ++#define rRx_IQK_Tone_A 0xe34 ++#define rTx_IQK_PI_A 0xe38 ++#define rRx_IQK_PI_A 0xe3c ++ ++#define rTx_IQK 0xe40 ++#define rRx_IQK 0xe44 ++#define rIQK_AGC_Pts 0xe48 ++#define rIQK_AGC_Rsp 0xe4c ++#define rTx_IQK_Tone_B 0xe50 ++#define rRx_IQK_Tone_B 0xe54 ++#define rTx_IQK_PI_B 0xe58 ++#define rRx_IQK_PI_B 0xe5c ++#define rIQK_AGC_Cont 0xe60 ++ ++#define rBlue_Tooth 0xe6c ++#define rRx_Wait_CCA 0xe70 ++#define rTx_CCK_RFON 0xe74 ++#define rTx_CCK_BBON 0xe78 ++#define rTx_OFDM_RFON 0xe7c ++#define rTx_OFDM_BBON 0xe80 ++#define rTx_To_Rx 0xe84 ++#define rTx_To_Tx 0xe88 ++#define rRx_CCK 0xe8c ++ ++#define rTx_Power_Before_IQK_A 0xe94 ++#define rTx_Power_After_IQK_A 0xe9c ++ ++#define rRx_Power_Before_IQK_A 0xea0 ++#define rRx_Power_Before_IQK_A_2 0xea4 ++#define rRx_Power_After_IQK_A 0xea8 ++#define rRx_Power_After_IQK_A_2 0xeac ++ ++#define rTx_Power_Before_IQK_B 0xeb4 ++#define rTx_Power_After_IQK_B 0xebc ++ ++#define rRx_Power_Before_IQK_B 0xec0 ++#define rRx_Power_Before_IQK_B_2 0xec4 ++#define rRx_Power_After_IQK_B 0xec8 ++#define rRx_Power_After_IQK_B_2 0xecc ++ ++#define rRx_OFDM 0xed0 ++#define rRx_Wait_RIFS 0xed4 ++#define rRx_TO_Rx 0xed8 ++#define rStandby 0xedc ++#define rSleep 0xee0 ++#define rPMPD_ANAEN 0xeec ++ ++/* */ ++/* 7. RF Register 0x00-0x2E (RF 8256) */ ++/* RF-0222D 0x00-3F */ ++/* */ ++/* Zebra1 */ ++#define rZebra1_HSSIEnable 0x0 /* Useless now */ ++#define rZebra1_TRxEnable1 0x1 ++#define rZebra1_TRxEnable2 0x2 ++#define rZebra1_AGC 0x4 ++#define rZebra1_ChargePump 0x5 ++#define rZebra1_Channel 0x7 /* RF channel switch */ ++ ++/* endif */ ++#define rZebra1_TxGain 0x8 /* Useless now */ ++#define rZebra1_TxLPF 0x9 ++#define rZebra1_RxLPF 0xb ++#define rZebra1_RxHPFCorner 0xc ++ ++/* Zebra4 */ ++#define rGlobalCtrl 0 /* Useless now */ ++#define rRTL8256_TxLPF 19 ++#define rRTL8256_RxLPF 11 ++ ++/* RTL8258 */ ++#define rRTL8258_TxLPF 0x11 /* Useless now */ ++#define rRTL8258_RxLPF 0x13 ++#define rRTL8258_RSSILPF 0xa ++ ++/* */ ++/* RL6052 Register definition */ ++/* */ ++#define RF_AC 0x00 /* */ ++ ++#define RF_IQADJ_G1 0x01 /* */ ++#define RF_IQADJ_G2 0x02 /* */ ++ ++#define RF_POW_TRSW 0x05 /* */ ++ ++#define RF_GAIN_RX 0x06 /* */ ++#define RF_GAIN_TX 0x07 /* */ ++ ++#define RF_TXM_IDAC 0x08 /* */ ++#define RF_IPA_G 0x09 /* */ ++#define RF_TXBIAS_G 0x0A ++#define RF_TXPA_AG 0x0B ++#define RF_IPA_A 0x0C /* */ ++#define RF_TXBIAS_A 0x0D ++#define RF_BS_PA_APSET_G9_G11 0x0E ++#define RF_BS_IQGEN 0x0F /* */ ++ ++#define RF_MODE1 0x10 /* */ ++#define RF_MODE2 0x11 /* */ ++ ++#define RF_RX_AGC_HP 0x12 /* */ ++#define RF_TX_AGC 0x13 /* */ ++#define RF_BIAS 0x14 /* */ ++#define RF_IPA 0x15 /* */ ++#define RF_TXBIAS 0x16 ++#define RF_POW_ABILITY 0x17 /* */ ++#define RF_CHNLBW 0x18 /* RF channel and BW switch */ ++#define RF_TOP 0x19 /* */ ++ ++#define RF_RX_G1 0x1A /* */ ++#define RF_RX_G2 0x1B /* */ ++ ++#define RF_RX_BB2 0x1C /* */ ++#define RF_RX_BB1 0x1D /* */ ++ ++#define RF_RCK1 0x1E /* */ ++#define RF_RCK2 0x1F /* */ ++ ++#define RF_TX_G1 0x20 /* */ ++#define RF_TX_G2 0x21 /* */ ++#define RF_TX_G3 0x22 /* */ ++ ++#define RF_TX_BB1 0x23 /* */ ++ ++#define RF_T_METER_92D 0x42 /* */ ++#define RF_T_METER_88E 0x42 /* */ ++#define RF_T_METER 0x24 /* */ ++ ++#define RF_SYN_G1 0x25 /* RF TX Power control */ ++#define RF_SYN_G2 0x26 /* RF TX Power control */ ++#define RF_SYN_G3 0x27 /* RF TX Power control */ ++#define RF_SYN_G4 0x28 /* RF TX Power control */ ++#define RF_SYN_G5 0x29 /* RF TX Power control */ ++#define RF_SYN_G6 0x2A /* RF TX Power control */ ++#define RF_SYN_G7 0x2B /* RF TX Power control */ ++#define RF_SYN_G8 0x2C /* RF TX Power control */ ++ ++#define RF_RCK_OS 0x30 /* RF TX PA control */ ++#define RF_TXPA_G1 0x31 /* RF TX PA control */ ++#define RF_TXPA_G2 0x32 /* RF TX PA control */ ++#define RF_TXPA_G3 0x33 /* RF TX PA control */ ++#define RF_TX_BIAS_A 0x35 ++#define RF_TX_BIAS_D 0x36 ++#define RF_LOBF_9 0x38 ++#define RF_RXRF_A3 0x3C /* */ ++#define RF_TRSW 0x3F ++ ++#define RF_TXRF_A2 0x41 ++#define RF_TXPA_G4 0x46 ++#define RF_TXPA_A4 0x4B ++#define RF_0x52 0x52 ++#define RF_WE_LUT 0xEF ++ ++/* */ ++/* Bit Mask */ ++/* */ ++/* 1. Page1(0x100) */ ++#define bBBResetB 0x100 /* Useless now? */ ++#define bGlobalResetB 0x200 ++#define bOFDMTxStart 0x4 ++#define bCCKTxStart 0x8 ++#define bCRC32Debug 0x100 ++#define bPMACLoopback 0x10 ++#define bTxLSIG 0xffffff ++#define bOFDMTxRate 0xf ++#define bOFDMTxReserved 0x10 ++#define bOFDMTxLength 0x1ffe0 ++#define bOFDMTxParity 0x20000 ++#define bTxHTSIG1 0xffffff ++#define bTxHTMCSRate 0x7f ++#define bTxHTBW 0x80 ++#define bTxHTLength 0xffff00 ++#define bTxHTSIG2 0xffffff ++#define bTxHTSmoothing 0x1 ++#define bTxHTSounding 0x2 ++#define bTxHTReserved 0x4 ++#define bTxHTAggreation 0x8 ++#define bTxHTSTBC 0x30 ++#define bTxHTAdvanceCoding 0x40 ++#define bTxHTShortGI 0x80 ++#define bTxHTNumberHT_LTF 0x300 ++#define bTxHTCRC8 0x3fc00 ++#define bCounterReset 0x10000 ++#define bNumOfOFDMTx 0xffff ++#define bNumOfCCKTx 0xffff0000 ++#define bTxIdleInterval 0xffff ++#define bOFDMService 0xffff0000 ++#define bTxMACHeader 0xffffffff ++#define bTxDataInit 0xff ++#define bTxHTMode 0x100 ++#define bTxDataType 0x30000 ++#define bTxRandomSeed 0xffffffff ++#define bCCKTxPreamble 0x1 ++#define bCCKTxSFD 0xffff0000 ++#define bCCKTxSIG 0xff ++#define bCCKTxService 0xff00 ++#define bCCKLengthExt 0x8000 ++#define bCCKTxLength 0xffff0000 ++#define bCCKTxCRC16 0xffff ++#define bCCKTxStatus 0x1 ++#define bOFDMTxStatus 0x2 ++ ++#define IS_BB_REG_OFFSET_92S(_Offset) \ ++ ((_Offset >= 0x800) && (_Offset <= 0xfff)) ++ ++/* 2. Page8(0x800) */ ++#define bRFMOD 0x1 /* Reg 0x800 rFPGA0_RFMOD */ ++#define bJapanMode 0x2 ++#define bCCKTxSC 0x30 ++#define bCCKEn 0x1000000 ++#define bOFDMEn 0x2000000 ++ ++#define bOFDMRxADCPhase 0x10000 /* Useless now */ ++#define bOFDMTxDACPhase 0x40000 ++#define bXATxAGC 0x3f ++ ++#define bAntennaSelect 0x0300 ++ ++#define bXBTxAGC 0xf00 /* Reg 80c rFPGA0_TxGainStage */ ++#define bXCTxAGC 0xf000 ++#define bXDTxAGC 0xf0000 ++ ++#define bPAStart 0xf0000000 /* Useless now */ ++#define bTRStart 0x00f00000 ++#define bRFStart 0x0000f000 ++#define bBBStart 0x000000f0 ++#define bBBCCKStart 0x0000000f ++#define bPAEnd 0xf /* Reg0x814 */ ++#define bTREnd 0x0f000000 ++#define bRFEnd 0x000f0000 ++#define bCCAMask 0x000000f0 /* T2R */ ++#define bR2RCCAMask 0x00000f00 ++#define bHSSI_R2TDelay 0xf8000000 ++#define bHSSI_T2RDelay 0xf80000 ++#define bContTxHSSI 0x400 /* change gain at continue Tx */ ++#define bIGFromCCK 0x200 ++#define bAGCAddress 0x3f ++#define bRxHPTx 0x7000 ++#define bRxHPT2R 0x38000 ++#define bRxHPCCKIni 0xc0000 ++#define bAGCTxCode 0xc00000 ++#define bAGCRxCode 0x300000 ++ ++/* Reg 0x820~84f rFPGA0_XA_HSSIParameter1 */ ++#define b3WireDataLength 0x800 ++#define b3WireAddressLength 0x400 ++ ++#define b3WireRFPowerDown 0x1 /* Useless now */ ++#define b5GPAPEPolarity 0x40000000 ++#define b2GPAPEPolarity 0x80000000 ++#define bRFSW_TxDefaultAnt 0x3 ++#define bRFSW_TxOptionAnt 0x30 ++#define bRFSW_RxDefaultAnt 0x300 ++#define bRFSW_RxOptionAnt 0x3000 ++#define bRFSI_3WireData 0x1 ++#define bRFSI_3WireClock 0x2 ++#define bRFSI_3WireLoad 0x4 ++#define bRFSI_3WireRW 0x8 ++#define bRFSI_3Wire 0xf ++ ++#define bRFSI_RFENV 0x10 /* Reg 0x870 rFPGA0_XAB_RFInterfaceSW */ ++ ++#define bRFSI_TRSW 0x20 /* Useless now */ ++#define bRFSI_TRSWB 0x40 ++#define bRFSI_ANTSW 0x100 ++#define bRFSI_ANTSWB 0x200 ++#define bRFSI_PAPE 0x400 ++#define bRFSI_PAPE5G 0x800 ++#define bBandSelect 0x1 ++#define bHTSIG2_GI 0x80 ++#define bHTSIG2_Smoothing 0x01 ++#define bHTSIG2_Sounding 0x02 ++#define bHTSIG2_Aggreaton 0x08 ++#define bHTSIG2_STBC 0x30 ++#define bHTSIG2_AdvCoding 0x40 ++#define bHTSIG2_NumOfHTLTF 0x300 ++#define bHTSIG2_CRC8 0x3fc ++#define bHTSIG1_MCS 0x7f ++#define bHTSIG1_BandWidth 0x80 ++#define bHTSIG1_HTLength 0xffff ++#define bLSIG_Rate 0xf ++#define bLSIG_Reserved 0x10 ++#define bLSIG_Length 0x1fffe ++#define bLSIG_Parity 0x20 ++#define bCCKRxPhase 0x4 ++ ++#define bLSSIReadAddress 0x7f800000 /* T65 RF */ ++ ++#define bLSSIReadEdge 0x80000000 /* LSSI "Read" edge signal */ ++ ++#define bLSSIReadBackData 0xfffff /* T65 RF */ ++ ++#define bLSSIReadOKFlag 0x1000 /* Useless now */ ++#define bCCKSampleRate 0x8 /* 0: 44MHz, 1:88MHz */ ++#define bRegulator0Standby 0x1 ++#define bRegulatorPLLStandby 0x2 ++#define bRegulator1Standby 0x4 ++#define bPLLPowerUp 0x8 ++#define bDPLLPowerUp 0x10 ++#define bDA10PowerUp 0x20 ++#define bAD7PowerUp 0x200 ++#define bDA6PowerUp 0x2000 ++#define bXtalPowerUp 0x4000 ++#define b40MDClkPowerUP 0x8000 ++#define bDA6DebugMode 0x20000 ++#define bDA6Swing 0x380000 ++ ++/* Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ */ ++#define bADClkPhase 0x4000000 ++ ++#define b80MClkDelay 0x18000000 /* Useless */ ++#define bAFEWatchDogEnable 0x20000000 ++ ++/* Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap */ ++#define bXtalCap01 0xc0000000 ++#define bXtalCap23 0x3 ++#define bXtalCap92x 0x0f000000 ++#define bXtalCap 0x0f000000 ++ ++#define bIntDifClkEnable 0x400 /* Useless */ ++#define bExtSigClkEnable 0x800 ++#define bBandgapMbiasPowerUp 0x10000 ++#define bAD11SHGain 0xc0000 ++#define bAD11InputRange 0x700000 ++#define bAD11OPCurrent 0x3800000 ++#define bIPathLoopback 0x4000000 ++#define bQPathLoopback 0x8000000 ++#define bAFELoopback 0x10000000 ++#define bDA10Swing 0x7e0 ++#define bDA10Reverse 0x800 ++#define bDAClkSource 0x1000 ++#define bAD7InputRange 0x6000 ++#define bAD7Gain 0x38000 ++#define bAD7OutputCMMode 0x40000 ++#define bAD7InputCMMode 0x380000 ++#define bAD7Current 0xc00000 ++#define bRegulatorAdjust 0x7000000 ++#define bAD11PowerUpAtTx 0x1 ++#define bDA10PSAtTx 0x10 ++#define bAD11PowerUpAtRx 0x100 ++#define bDA10PSAtRx 0x1000 ++#define bCCKRxAGCFormat 0x200 ++#define bPSDFFTSamplepPoint 0xc000 ++#define bPSDAverageNum 0x3000 ++#define bIQPathControl 0xc00 ++#define bPSDFreq 0x3ff ++#define bPSDAntennaPath 0x30 ++#define bPSDIQSwitch 0x40 ++#define bPSDRxTrigger 0x400000 ++#define bPSDTxTrigger 0x80000000 ++#define bPSDSineToneScale 0x7f000000 ++#define bPSDReport 0xffff ++ ++/* 3. Page9(0x900) */ ++#define bOFDMTxSC 0x30000000 /* Useless */ ++#define bCCKTxOn 0x1 ++#define bOFDMTxOn 0x2 ++#define bDebugPage 0xfff /* reset debug page and HWord, LWord */ ++#define bDebugItem 0xff /* reset debug page and LWord */ ++#define bAntL 0x10 ++#define bAntNonHT 0x100 ++#define bAntHT1 0x1000 ++#define bAntHT2 0x10000 ++#define bAntHT1S1 0x100000 ++#define bAntNonHTS1 0x1000000 ++ ++/* 4. PageA(0xA00) */ ++#define bCCKBBMode 0x3 /* Useless */ ++#define bCCKTxPowerSaving 0x80 ++#define bCCKRxPowerSaving 0x40 ++ ++#define bCCKSideBand 0x10 /* Reg 0xa00 rCCK0_System 20/40 */ ++ ++#define bCCKScramble 0x8 /* Useless */ ++#define bCCKAntDiversity 0x8000 ++#define bCCKCarrierRecovery 0x4000 ++#define bCCKTxRate 0x3000 ++#define bCCKDCCancel 0x0800 ++#define bCCKISICancel 0x0400 ++#define bCCKMatchFilter 0x0200 ++#define bCCKEqualizer 0x0100 ++#define bCCKPreambleDetect 0x800000 ++#define bCCKFastFalseCCA 0x400000 ++#define bCCKChEstStart 0x300000 ++#define bCCKCCACount 0x080000 ++#define bCCKcs_lim 0x070000 ++#define bCCKBistMode 0x80000000 ++#define bCCKCCAMask 0x40000000 ++#define bCCKTxDACPhase 0x4 ++#define bCCKRxADCPhase 0x20000000 /* r_rx_clk */ ++#define bCCKr_cp_mode0 0x0100 ++#define bCCKTxDCOffset 0xf0 ++#define bCCKRxDCOffset 0xf ++#define bCCKCCAMode 0xc000 ++#define bCCKFalseCS_lim 0x3f00 ++#define bCCKCS_ratio 0xc00000 ++#define bCCKCorgBit_sel 0x300000 ++#define bCCKPD_lim 0x0f0000 ++#define bCCKNewCCA 0x80000000 ++#define bCCKRxHPofIG 0x8000 ++#define bCCKRxIG 0x7f00 ++#define bCCKLNAPolarity 0x800000 ++#define bCCKRx1stGain 0x7f0000 ++#define bCCKRFExtend 0x20000000 /* CCK Rx Iinital gain polarity */ ++#define bCCKRxAGCSatLevel 0x1f000000 ++#define bCCKRxAGCSatCount 0xe0 ++#define bCCKRxRFSettle 0x1f /* AGCsamp_dly */ ++#define bCCKFixedRxAGC 0x8000 ++#define bCCKAntennaPolarity 0x2000 ++#define bCCKTxFilterType 0x0c00 ++#define bCCKRxAGCReportType 0x0300 ++#define bCCKRxDAGCEn 0x80000000 ++#define bCCKRxDAGCPeriod 0x20000000 ++#define bCCKRxDAGCSatLevel 0x1f000000 ++#define bCCKTimingRecovery 0x800000 ++#define bCCKTxC0 0x3f0000 ++#define bCCKTxC1 0x3f000000 ++#define bCCKTxC2 0x3f ++#define bCCKTxC3 0x3f00 ++#define bCCKTxC4 0x3f0000 ++#define bCCKTxC5 0x3f000000 ++#define bCCKTxC6 0x3f ++#define bCCKTxC7 0x3f00 ++#define bCCKDebugPort 0xff0000 ++#define bCCKDACDebug 0x0f000000 ++#define bCCKFalseAlarmEnable 0x8000 ++#define bCCKFalseAlarmRead 0x4000 ++#define bCCKTRSSI 0x7f ++#define bCCKRxAGCReport 0xfe ++#define bCCKRxReport_AntSel 0x80000000 ++#define bCCKRxReport_MFOff 0x40000000 ++#define bCCKRxRxReport_SQLoss 0x20000000 ++#define bCCKRxReport_Pktloss 0x10000000 ++#define bCCKRxReport_Lockedbit 0x08000000 ++#define bCCKRxReport_RateError 0x04000000 ++#define bCCKRxReport_RxRate 0x03000000 ++#define bCCKRxFACounterLower 0xff ++#define bCCKRxFACounterUpper 0xff000000 ++#define bCCKRxHPAGCStart 0xe000 ++#define bCCKRxHPAGCFinal 0x1c00 ++#define bCCKRxFalseAlarmEnable 0x8000 ++#define bCCKFACounterFreeze 0x4000 ++#define bCCKTxPathSel 0x10000000 ++#define bCCKDefaultRxPath 0xc000000 ++#define bCCKOptionRxPath 0x3000000 ++ ++/* 5. PageC(0xC00) */ ++#define bNumOfSTF 0x3 /* Useless */ ++#define bShift_L 0xc0 ++#define bGI_TH 0xc ++#define bRxPathA 0x1 ++#define bRxPathB 0x2 ++#define bRxPathC 0x4 ++#define bRxPathD 0x8 ++#define bTxPathA 0x1 ++#define bTxPathB 0x2 ++#define bTxPathC 0x4 ++#define bTxPathD 0x8 ++#define bTRSSIFreq 0x200 ++#define bADCBackoff 0x3000 ++#define bDFIRBackoff 0xc000 ++#define bTRSSILatchPhase 0x10000 ++#define bRxIDCOffset 0xff ++#define bRxQDCOffset 0xff00 ++#define bRxDFIRMode 0x1800000 ++#define bRxDCNFType 0xe000000 ++#define bRXIQImb_A 0x3ff ++#define bRXIQImb_B 0xfc00 ++#define bRXIQImb_C 0x3f0000 ++#define bRXIQImb_D 0xffc00000 ++#define bDC_dc_Notch 0x60000 ++#define bRxNBINotch 0x1f000000 ++#define bPD_TH 0xf ++#define bPD_TH_Opt2 0xc000 ++#define bPWED_TH 0x700 ++#define bIfMF_Win_L 0x800 ++#define bPD_Option 0x1000 ++#define bMF_Win_L 0xe000 ++#define bBW_Search_L 0x30000 ++#define bwin_enh_L 0xc0000 ++#define bBW_TH 0x700000 ++#define bED_TH2 0x3800000 ++#define bBW_option 0x4000000 ++#define bRatio_TH 0x18000000 ++#define bWindow_L 0xe0000000 ++#define bSBD_Option 0x1 ++#define bFrame_TH 0x1c ++#define bFS_Option 0x60 ++#define bDC_Slope_check 0x80 ++#define bFGuard_Counter_DC_L 0xe00 ++#define bFrame_Weight_Short 0x7000 ++#define bSub_Tune 0xe00000 ++#define bFrame_DC_Length 0xe000000 ++#define bSBD_start_offset 0x30000000 ++#define bFrame_TH_2 0x7 ++#define bFrame_GI2_TH 0x38 ++#define bGI2_Sync_en 0x40 ++#define bSarch_Short_Early 0x300 ++#define bSarch_Short_Late 0xc00 ++#define bSarch_GI2_Late 0x70000 ++#define bCFOAntSum 0x1 ++#define bCFOAcc 0x2 ++#define bCFOStartOffset 0xc ++#define bCFOLookBack 0x70 ++#define bCFOSumWeight 0x80 ++#define bDAGCEnable 0x10000 ++#define bTXIQImb_A 0x3ff ++#define bTXIQImb_B 0xfc00 ++#define bTXIQImb_C 0x3f0000 ++#define bTXIQImb_D 0xffc00000 ++#define bTxIDCOffset 0xff ++#define bTxQDCOffset 0xff00 ++#define bTxDFIRMode 0x10000 ++#define bTxPesudoNoiseOn 0x4000000 ++#define bTxPesudoNoise_A 0xff ++#define bTxPesudoNoise_B 0xff00 ++#define bTxPesudoNoise_C 0xff0000 ++#define bTxPesudoNoise_D 0xff000000 ++#define bCCADropOption 0x20000 ++#define bCCADropThres 0xfff00000 ++#define bEDCCA_H 0xf ++#define bEDCCA_L 0xf0 ++#define bLambda_ED 0x300 ++#define bRxInitialGain 0x7f ++#define bRxAntDivEn 0x80 ++#define bRxAGCAddressForLNA 0x7f00 ++#define bRxHighPowerFlow 0x8000 ++#define bRxAGCFreezeThres 0xc0000 ++#define bRxFreezeStep_AGC1 0x300000 ++#define bRxFreezeStep_AGC2 0xc00000 ++#define bRxFreezeStep_AGC3 0x3000000 ++#define bRxFreezeStep_AGC0 0xc000000 ++#define bRxRssi_Cmp_En 0x10000000 ++#define bRxQuickAGCEn 0x20000000 ++#define bRxAGCFreezeThresMode 0x40000000 ++#define bRxOverFlowCheckType 0x80000000 ++#define bRxAGCShift 0x7f ++#define bTRSW_Tri_Only 0x80 ++#define bPowerThres 0x300 ++#define bRxAGCEn 0x1 ++#define bRxAGCTogetherEn 0x2 ++#define bRxAGCMin 0x4 ++#define bRxHP_Ini 0x7 ++#define bRxHP_TRLNA 0x70 ++#define bRxHP_RSSI 0x700 ++#define bRxHP_BBP1 0x7000 ++#define bRxHP_BBP2 0x70000 ++#define bRxHP_BBP3 0x700000 ++#define bRSSI_H 0x7f0000 /* threshold for high power */ ++#define bRSSI_Gen 0x7f000000 /* threshold for ant diversity */ ++#define bRxSettle_TRSW 0x7 ++#define bRxSettle_LNA 0x38 ++#define bRxSettle_RSSI 0x1c0 ++#define bRxSettle_BBP 0xe00 ++#define bRxSettle_RxHP 0x7000 ++#define bRxSettle_AntSW_RSSI 0x38000 ++#define bRxSettle_AntSW 0xc0000 ++#define bRxProcessTime_DAGC 0x300000 ++#define bRxSettle_HSSI 0x400000 ++#define bRxProcessTime_BBPPW 0x800000 ++#define bRxAntennaPowerShift 0x3000000 ++#define bRSSITableSelect 0xc000000 ++#define bRxHP_Final 0x7000000 ++#define bRxHTSettle_BBP 0x7 ++#define bRxHTSettle_HSSI 0x8 ++#define bRxHTSettle_RxHP 0x70 ++#define bRxHTSettle_BBPPW 0x80 ++#define bRxHTSettle_Idle 0x300 ++#define bRxHTSettle_Reserved 0x1c00 ++#define bRxHTRxHPEn 0x8000 ++#define bRxHTAGCFreezeThres 0x30000 ++#define bRxHTAGCTogetherEn 0x40000 ++#define bRxHTAGCMin 0x80000 ++#define bRxHTAGCEn 0x100000 ++#define bRxHTDAGCEn 0x200000 ++#define bRxHTRxHP_BBP 0x1c00000 ++#define bRxHTRxHP_Final 0xe0000000 ++#define bRxPWRatioTH 0x3 ++#define bRxPWRatioEn 0x4 ++#define bRxMFHold 0x3800 ++#define bRxPD_Delay_TH1 0x38 ++#define bRxPD_Delay_TH2 0x1c0 ++#define bRxPD_DC_COUNT_MAX 0x600 ++#define bRxPD_Delay_TH 0x8000 ++#define bRxProcess_Delay 0xf0000 ++#define bRxSearchrange_GI2_Early 0x700000 ++#define bRxFrame_Guard_Counter_L 0x3800000 ++#define bRxSGI_Guard_L 0xc000000 ++#define bRxSGI_Search_L 0x30000000 ++#define bRxSGI_TH 0xc0000000 ++#define bDFSCnt0 0xff ++#define bDFSCnt1 0xff00 ++#define bDFSFlag 0xf0000 ++#define bMFWeightSum 0x300000 ++#define bMinIdxTH 0x7f000000 ++#define bDAFormat 0x40000 ++#define bTxChEmuEnable 0x01000000 ++#define bTRSWIsolation_A 0x7f ++#define bTRSWIsolation_B 0x7f00 ++#define bTRSWIsolation_C 0x7f0000 ++#define bTRSWIsolation_D 0x7f000000 ++#define bExtLNAGain 0x7c00 ++ ++/* 6. PageE(0xE00) */ ++#define bSTBCEn 0x4 /* Useless */ ++#define bAntennaMapping 0x10 ++#define bNss 0x20 ++#define bCFOAntSumD 0x200 ++#define bPHYCounterReset 0x8000000 ++#define bCFOReportGet 0x4000000 ++#define bOFDMContinueTx 0x10000000 ++#define bOFDMSingleCarrier 0x20000000 ++#define bOFDMSingleTone 0x40000000 ++#define bHTDetect 0x100 ++#define bCFOEn 0x10000 ++#define bCFOValue 0xfff00000 ++#define bSigTone_Re 0x3f ++#define bSigTone_Im 0x7f00 ++#define bCounter_CCA 0xffff ++#define bCounter_ParityFail 0xffff0000 ++#define bCounter_RateIllegal 0xffff ++#define bCounter_CRC8Fail 0xffff0000 ++#define bCounter_MCSNoSupport 0xffff ++#define bCounter_FastSync 0xffff ++#define bShortCFO 0xfff ++#define bShortCFOTLength 12 /* total */ ++#define bShortCFOFLength 11 /* fraction */ ++#define bLongCFO 0x7ff ++#define bLongCFOTLength 11 ++#define bLongCFOFLength 11 ++#define bTailCFO 0x1fff ++#define bTailCFOTLength 13 ++#define bTailCFOFLength 12 ++#define bmax_en_pwdB 0xffff ++#define bCC_power_dB 0xffff0000 ++#define bnoise_pwdB 0xffff ++#define bPowerMeasTLength 10 ++#define bPowerMeasFLength 3 ++#define bRx_HT_BW 0x1 ++#define bRxSC 0x6 ++#define bRx_HT 0x8 ++#define bNB_intf_det_on 0x1 ++#define bIntf_win_len_cfg 0x30 ++#define bNB_Intf_TH_cfg 0x1c0 ++#define bRFGain 0x3f ++#define bTableSel 0x40 ++#define bTRSW 0x80 ++#define bRxSNR_A 0xff ++#define bRxSNR_B 0xff00 ++#define bRxSNR_C 0xff0000 ++#define bRxSNR_D 0xff000000 ++#define bSNREVMTLength 8 ++#define bSNREVMFLength 1 ++#define bCSI1st 0xff ++#define bCSI2nd 0xff00 ++#define bRxEVM1st 0xff0000 ++#define bRxEVM2nd 0xff000000 ++#define bSIGEVM 0xff ++#define bPWDB 0xff00 ++#define bSGIEN 0x10000 ++ ++#define bSFactorQAM1 0xf /* Useless */ ++#define bSFactorQAM2 0xf0 ++#define bSFactorQAM3 0xf00 ++#define bSFactorQAM4 0xf000 ++#define bSFactorQAM5 0xf0000 ++#define bSFactorQAM6 0xf0000 ++#define bSFactorQAM7 0xf00000 ++#define bSFactorQAM8 0xf000000 ++#define bSFactorQAM9 0xf0000000 ++#define bCSIScheme 0x100000 ++ ++#define bNoiseLvlTopSet 0x3 /* Useless */ ++#define bChSmooth 0x4 ++#define bChSmoothCfg1 0x38 ++#define bChSmoothCfg2 0x1c0 ++#define bChSmoothCfg3 0xe00 ++#define bChSmoothCfg4 0x7000 ++#define bMRCMode 0x800000 ++#define bTHEVMCfg 0x7000000 ++ ++#define bLoopFitType 0x1 /* Useless */ ++#define bUpdCFO 0x40 ++#define bUpdCFOOffData 0x80 ++#define bAdvUpdCFO 0x100 ++#define bAdvTimeCtrl 0x800 ++#define bUpdClko 0x1000 ++#define bFC 0x6000 ++#define bTrackingMode 0x8000 ++#define bPhCmpEnable 0x10000 ++#define bUpdClkoLTF 0x20000 ++#define bComChCFO 0x40000 ++#define bCSIEstiMode 0x80000 ++#define bAdvUpdEqz 0x100000 ++#define bUChCfg 0x7000000 ++#define bUpdEqz 0x8000000 ++ ++/* Rx Pseduo noise */ ++#define bRxPesudoNoiseOn 0x20000000 /* Useless */ ++#define bRxPesudoNoise_A 0xff ++#define bRxPesudoNoise_B 0xff00 ++#define bRxPesudoNoise_C 0xff0000 ++#define bRxPesudoNoise_D 0xff000000 ++#define bPesudoNoiseState_A 0xffff ++#define bPesudoNoiseState_B 0xffff0000 ++#define bPesudoNoiseState_C 0xffff ++#define bPesudoNoiseState_D 0xffff0000 ++ ++/* 7. RF Register */ ++/* Zebra1 */ ++#define bZebra1_HSSIEnable 0x8 /* Useless */ ++#define bZebra1_TRxControl 0xc00 ++#define bZebra1_TRxGainSetting 0x07f ++#define bZebra1_RxCorner 0xc00 ++#define bZebra1_TxChargePump 0x38 ++#define bZebra1_RxChargePump 0x7 ++#define bZebra1_ChannelNum 0xf80 ++#define bZebra1_TxLPFBW 0x400 ++#define bZebra1_RxLPFBW 0x600 ++ ++/* Zebra4 */ ++#define bRTL8256RegModeCtrl1 0x100 /* Useless */ ++#define bRTL8256RegModeCtrl0 0x40 ++#define bRTL8256_TxLPFBW 0x18 ++#define bRTL8256_RxLPFBW 0x600 ++ ++/* RTL8258 */ ++#define bRTL8258_TxLPFBW 0xc /* Useless */ ++#define bRTL8258_RxLPFBW 0xc00 ++#define bRTL8258_RSSILPFBW 0xc0 ++ ++/* */ ++/* Other Definition */ ++/* */ ++ ++/* byte endable for sb_write */ ++#define bByte0 0x1 /* Useless */ ++#define bByte1 0x2 ++#define bByte2 0x4 ++#define bByte3 0x8 ++#define bWord0 0x3 ++#define bWord1 0xc ++#define bDWord 0xf ++ ++/* for PutRegsetting & GetRegSetting BitMask */ ++#define bMaskByte0 0xff /* Reg 0xc50 rOFDM0_XAAGCCore~0xC6f */ ++#define bMaskByte1 0xff00 ++#define bMaskByte2 0xff0000 ++#define bMaskByte3 0xff000000 ++#define bMaskHWord 0xffff0000 ++#define bMaskLWord 0x0000ffff ++#define bMaskDWord 0xffffffff ++#define bMask12Bits 0xfff ++#define bMaskH4Bits 0xf0000000 ++#define bMaskOFDM_D 0xffc00000 ++#define bMaskCCK 0x3f3f3f3f ++ ++/* for PutRFRegsetting & GetRFRegSetting BitMask */ ++#define bRFRegOffsetMask 0xfffff ++ ++#define bEnable 0x1 /* Useless */ ++#define bDisable 0x0 ++ ++#define LeftAntenna 0x0 /* Useless */ ++#define RightAntenna 0x1 ++ ++#define tCheckTxStatus 500 /* 500ms Useless */ ++#define tUpdateRxCounter 100 /* 100ms */ ++ ++#define rateCCK 0 /* Useless */ ++#define rateOFDM 1 ++#define rateHT 2 ++ ++/* define Register-End */ ++#define bPMAC_End 0x1ff /* Useless */ ++#define bFPGAPHY0_End 0x8ff ++#define bFPGAPHY1_End 0x9ff ++#define bCCKPHY0_End 0xaff ++#define bOFDMPHY0_End 0xcff ++#define bOFDMPHY1_End 0xdff ++ ++#define bPMACControl 0x0 /* Useless */ ++#define bWMACControl 0x1 ++#define bWNICControl 0x2 ++ ++#define PathA 0x0 /* Useless */ ++#define PathB 0x1 ++#define PathC 0x2 ++#define PathD 0x3 ++ ++/*--------------------------Define Parameters-------------------------------*/ ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/Hal8188EPwrSeq.h b/drivers/staging/r8188eu/include/Hal8188EPwrSeq.h +new file mode 100644 +index 000000000000..a73bd1a5d57b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/Hal8188EPwrSeq.h +@@ -0,0 +1,155 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HAL8188EPWRSEQ_H__ ++#define __HAL8188EPWRSEQ_H__ ++ ++#include "HalPwrSeqCmd.h" ++ ++/* ++ Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd ++ There are 6 HW Power States: ++ 0: POFF--Power Off ++ 1: PDN--Power Down ++ 2: CARDEMU--Card Emulation ++ 3: ACT--Active Mode ++ 4: LPS--Low Power State ++ 5: SUS--Suspend ++ ++ The transision from different states are defined below ++ TRANS_CARDEMU_TO_ACT ++ TRANS_ACT_TO_CARDEMU ++ TRANS_CARDEMU_TO_SUS ++ TRANS_SUS_TO_CARDEMU ++ TRANS_CARDEMU_TO_PDN ++ TRANS_ACT_TO_LPS ++ TRANS_LPS_TO_ACT ++ ++ TRANS_END ++ ++ PWR SEQ Version: rtl8188E_PwrSeq_V09.h ++*/ ++#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10 ++#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10 ++#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10 ++#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10 ++#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10 ++#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10 ++#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15 ++#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15 ++#define RTL8188E_TRANS_END_STEPS 1 ++ ++#define RTL8188E_TRANS_CARDEMU_TO_ACT \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)},/* wait till 0x04[17] = 1 power ready*/ \ ++ {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0)|BIT(1), 0}, /* 0x02[1:0] = 0 reset BB*/ \ ++ {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, /*0x24[23] = 2b'01 schmit trigger */ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4)|BIT(3), 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, /*0x04[8] = 1 polling until return 0*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}, /*wait till 0x04[8] = 0*/ \ ++ {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, /*LDO normal mode*/ \ ++ {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*SDIO Driving*/ \ ++ ++#define RTL8188E_TRANS_ACT_TO_CARDEMU \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ ++ {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*LDO Sleep mode*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ ++ ++#define RTL8188E_TRANS_CARDEMU_TO_SUS \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, /*0x04[12:11] = 2b'01enable WL suspend*/ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)|BIT(4)}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ ++ {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, BIT(7)}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ ++ {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ ++ {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, /*Set SDIO suspend local register*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0}, /*wait power state to suspend*/ ++ ++#define RTL8188E_TRANS_SUS_TO_CARDEMU \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, /*Set SDIO suspend local register*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, /*wait power state to suspend*/\ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ ++ ++#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, /*0x24[23] = 2b'01 schmit trigger */ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ ++ {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ ++ {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ ++ {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, /*Set SDIO suspend local register*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0}, /*wait power state to suspend*/ ++ ++#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, /*Set SDIO suspend local register*/ \ ++ {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, /*wait power state to suspend*/\ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ ++ ++#define RTL8188E_TRANS_CARDEMU_TO_PDN \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0},/* 0x04[16] = 0*/\ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)},/* 0x04[15] = 1*/ ++ ++#define RTL8188E_TRANS_PDN_TO_CARDEMU \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here */ \ ++ {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0},/* 0x04[15] = 0*/ ++ ++/* This is used by driver for LPSRadioOff Procedure, not for FW LPS Step */ ++#define RTL8188E_TRANS_ACT_TO_LPS \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here */ \ ++ {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ ++ {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ ++ {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ ++ {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ ++ {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ ++ {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0},/*CCK and OFDM are disabled,and clock are gated*/ \ ++ {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ ++ {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ ++ {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0},/*check if removed later*/ \ ++ {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)},/*Respond TxOK to scheduler*/ \ ++ ++#define RTL8188E_TRANS_LPS_TO_ACT \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here */ \ ++ {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ ++ {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ ++ {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ ++ {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ ++ {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ ++ {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ ++ {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ ++ {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, /*. 0x101[1] = 1*/\ ++ {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ ++ {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1)|BIT(0), BIT(1)|BIT(0)}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ ++ {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ ++ ++#define RTL8188E_TRANS_END \ ++ /* format */ \ ++ /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \ ++ {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0, PWR_CMD_END, 0, 0}, /* */ ++ ++extern struct wl_pwr_cfg rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS]; ++extern struct wl_pwr_cfg rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; ++ ++#endif /* __HAL8188EPWRSEQ_H__ */ +diff --git a/drivers/staging/r8188eu/include/Hal8188ERateAdaptive.h b/drivers/staging/r8188eu/include/Hal8188ERateAdaptive.h +new file mode 100644 +index 000000000000..d5ced507a648 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/Hal8188ERateAdaptive.h +@@ -0,0 +1,64 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright (c) 2011 Realtek Semiconductor Corp. */ ++ ++#ifndef __INC_RA_H ++#define __INC_RA_H ++/* Module Name: RateAdaptive.h ++ * Abstract: Prototype of RA and related data structure. ++ */ ++ ++#include ++ ++/* Rate adaptive define */ ++#define PERENTRY 23 ++#define RETRYSIZE 5 ++#define RATESIZE 28 ++#define TX_RPT2_ITEM_SIZE 8 ++ ++/* TX report 2 format in Rx desc */ ++#define GET_TX_RPT2_DESC_PKT_LEN_88E(__rxstatusdesc) \ ++ le32_get_bits(*(__le32 *)__rxstatusdesc, GENMASK(8, 0)) ++#define GET_TX_RPT2_DESC_MACID_VALID_1_88E(__rxstatusdesc) \ ++ le32_to_cpu((*(__le32 *)(__rxstatusdesc + 16)) ++#define GET_TX_RPT2_DESC_MACID_VALID_2_88E(__rxstatusdesc) \ ++ le32_to_cpu((*(__le32 *)(__rxstatusdesc + 20)) ++ ++#define GET_TX_REPORT_TYPE1_RERTY_0(__paddr) \ ++ le16_get_bits(*(__le16 *)__paddr, GENMASK(15, 0)) ++#define GET_TX_REPORT_TYPE1_RERTY_1(__paddr) \ ++ LE_BITS_TO_1BYTE(__paddr + 2, 0, 8) ++#define GET_TX_REPORT_TYPE1_RERTY_2(__paddr) \ ++ LE_BITS_TO_1BYTE(__paddr + 3, 0, 8) ++#define GET_TX_REPORT_TYPE1_RERTY_3(__paddr) \ ++ LE_BITS_TO_1BYTE(__paddr + 4, 0, 8) ++#define GET_TX_REPORT_TYPE1_RERTY_4(__paddr) \ ++ LE_BITS_TO_1BYTE(__paddr + 5, 0, 8) ++#define GET_TX_REPORT_TYPE1_DROP_0(__paddr) \ ++ LE_BITS_TO_1BYTE(__paddr + 6, 0, 8) ++/* End rate adaptive define */ ++ ++void ODM_RASupport_Init(struct odm_dm_struct *dm_odm); ++ ++int ODM_RAInfo_Init_all(struct odm_dm_struct *dm_odm); ++ ++int ODM_RAInfo_Init(struct odm_dm_struct *dm_odm, u8 MacID); ++ ++u8 ODM_RA_GetShortGI_8188E(struct odm_dm_struct *dm_odm, u8 MacID); ++ ++u8 ODM_RA_GetDecisionRate_8188E(struct odm_dm_struct *dm_odm, u8 MacID); ++ ++u8 ODM_RA_GetHwPwrStatus_8188E(struct odm_dm_struct *dm_odm, u8 MacID); ++void ODM_RA_UpdateRateInfo_8188E(struct odm_dm_struct *dm_odm, u8 MacID, ++ u8 RateID, u32 RateMask, ++ u8 SGIEnable); ++ ++void ODM_RA_SetRSSI_8188E(struct odm_dm_struct *dm_odm, u8 macid, ++ u8 rssi); ++ ++void ODM_RA_TxRPT2Handle_8188E(struct odm_dm_struct *dm_odm, ++ u8 *txrpt_buf, u16 txrpt_len, ++ u32 validentry0, u32 validentry1); ++ ++void ODM_RA_Set_TxRPT_Time(struct odm_dm_struct *dm_odm, u16 minRptTime); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/HalHWImg8188E_BB.h b/drivers/staging/r8188eu/include/HalHWImg8188E_BB.h +new file mode 100644 +index 000000000000..8270fdbc2844 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalHWImg8188E_BB.h +@@ -0,0 +1,27 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_BB_8188E_HW_IMG_H ++#define __INC_BB_8188E_HW_IMG_H ++ ++/* static bool CheckCondition(const u32 Condition, const u32 Hex); */ ++ ++/****************************************************************************** ++* AGC_TAB_1T.TXT ++******************************************************************************/ ++ ++enum HAL_STATUS ODM_ReadAndConfig_AGC_TAB_1T_8188E(struct odm_dm_struct *odm); ++ ++/****************************************************************************** ++* PHY_REG_1T.TXT ++******************************************************************************/ ++ ++enum HAL_STATUS ODM_ReadAndConfig_PHY_REG_1T_8188E(struct odm_dm_struct *odm); ++ ++/****************************************************************************** ++* PHY_REG_PG.TXT ++******************************************************************************/ ++ ++void ODM_ReadAndConfig_PHY_REG_PG_8188E(struct odm_dm_struct *dm_odm); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/HalHWImg8188E_FW.h b/drivers/staging/r8188eu/include/HalHWImg8188E_FW.h +new file mode 100644 +index 000000000000..5ddcd283097b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalHWImg8188E_FW.h +@@ -0,0 +1,16 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_FW_8188E_HW_IMG_H ++#define __INC_FW_8188E_HW_IMG_H ++ ++/****************************************************************************** ++* FW_AP.TXT ++******************************************************************************/ ++/****************************************************************************** ++* FW_WoWLAN.TXT ++******************************************************************************/ ++#define ArrayLength_8188E_FW_WoWLAN 15764 ++extern const u8 Array_8188E_FW_WoWLAN[ArrayLength_8188E_FW_WoWLAN]; ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/HalHWImg8188E_MAC.h b/drivers/staging/r8188eu/include/HalHWImg8188E_MAC.h +new file mode 100644 +index 000000000000..391c1754b0b6 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalHWImg8188E_MAC.h +@@ -0,0 +1,13 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_MAC_8188E_HW_IMG_H ++#define __INC_MAC_8188E_HW_IMG_H ++ ++/****************************************************************************** ++* MAC_REG.TXT ++******************************************************************************/ ++ ++enum HAL_STATUS ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct *pDM_Odm); ++ ++#endif /* end of HWIMG_SUPPORT */ +diff --git a/drivers/staging/r8188eu/include/HalHWImg8188E_RF.h b/drivers/staging/r8188eu/include/HalHWImg8188E_RF.h +new file mode 100644 +index 000000000000..0c67c3df20b9 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalHWImg8188E_RF.h +@@ -0,0 +1,13 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_RF_8188E_HW_IMG_H ++#define __INC_RF_8188E_HW_IMG_H ++ ++/****************************************************************************** ++ * RadioA_1T.TXT ++ ******************************************************************************/ ++ ++enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *odm); ++ ++#endif /* end of HWIMG_SUPPORT */ +diff --git a/drivers/staging/r8188eu/include/HalPhyRf_8188e.h b/drivers/staging/r8188eu/include/HalPhyRf_8188e.h +new file mode 100644 +index 000000000000..d4a27662309f +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalPhyRf_8188e.h +@@ -0,0 +1,41 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HAL_PHY_RF_8188E_H__ ++#define __HAL_PHY_RF_8188E_H__ ++ ++/*--------------------------Define Parameters-------------------------------*/ ++#define IQK_DELAY_TIME_88E 10 /* ms */ ++#define index_mapping_NUM_88E 15 ++#define AVG_THERMAL_NUM_88E 4 ++ ++void ODM_TxPwrTrackAdjust88E(struct odm_dm_struct *pDM_Odm, ++ u8 Type, /* 0 = OFDM, 1 = CCK */ ++ u8 *pDirection,/* 1 = +(incr) 2 = -(decr) */ ++ u32 *pOutWriteVal); /* Tx tracking CCK/OFDM BB ++ * swing index adjust */ ++ ++void odm_TXPowerTrackingCallback_ThermalMeter_8188E(struct adapter *Adapter); ++ ++/* 1 7. IQK */ ++ ++void PHY_IQCalibrate_8188E(struct adapter *Adapter, bool ReCovery); ++ ++/* LC calibrate */ ++void PHY_LCCalibrate_8188E(struct adapter *pAdapter); ++ ++/* AP calibrate */ ++void PHY_DigitalPredistortion_8188E(struct adapter *pAdapter); ++ ++void _PHY_SaveADDARegisters(struct adapter *pAdapter, u32 *ADDAReg, ++ u32 *ADDABackup, u32 RegisterNum); ++ ++void _PHY_PathADDAOn(struct adapter *pAdapter, u32 *ADDAReg, ++ bool isPathAOn, bool is2T); ++ ++void _PHY_MACSettingCalibration(struct adapter *pAdapter, u32 *MACReg, ++ u32 *MACBackup); ++ ++void _PHY_PathAStandBy(struct adapter *pAdapter); ++ ++#endif /* #ifndef __HAL_PHY_RF_8188E_H__ */ +diff --git a/drivers/staging/r8188eu/include/HalPwrSeqCmd.h b/drivers/staging/r8188eu/include/HalPwrSeqCmd.h +new file mode 100644 +index 000000000000..fe7ac910beb8 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalPwrSeqCmd.h +@@ -0,0 +1,110 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HALPWRSEQCMD_H__ ++#define __HALPWRSEQCMD_H__ ++ ++#include "drv_types.h" ++ ++/*---------------------------------------------*/ ++/* 3 The value of cmd: 4 bits */ ++/*---------------------------------------------*/ ++#define PWR_CMD_READ 0x00 ++ /* offset: the read register offset */ ++ /* msk: the mask of the read value */ ++ /* value: N/A, left by 0 */ ++ /* note: dirver shall implement this function by read & msk */ ++ ++#define PWR_CMD_WRITE 0x01 ++ /* offset: the read register offset */ ++ /* msk: the mask of the write bits */ ++ /* value: write value */ ++ /* note: driver shall implement this cmd by read & msk after write */ ++ ++#define PWR_CMD_POLLING 0x02 ++ /* offset: the read register offset */ ++ /* msk: the mask of the polled value */ ++ /* value: the value to be polled, masked by the msd field. */ ++ /* note: driver shall implement this cmd by */ ++ /* do{ */ ++ /* if ( (Read(offset) & msk) == (value & msk) ) */ ++ /* break; */ ++ /* } while (not timeout); */ ++ ++#define PWR_CMD_DELAY 0x03 ++ /* offset: the value to delay */ ++ /* msk: N/A */ ++ /* value: the unit of delay, 0: us, 1: ms */ ++ ++#define PWR_CMD_END 0x04 ++ /* offset: N/A */ ++ /* msk: N/A */ ++ /* value: N/A */ ++ ++/*---------------------------------------------*/ ++/* 3 The value of base: 4 bits */ ++/*---------------------------------------------*/ ++ /* define the base address of each block */ ++#define PWR_BASEADDR_MAC 0x00 ++#define PWR_BASEADDR_USB 0x01 ++#define PWR_BASEADDR_PCIE 0x02 ++#define PWR_BASEADDR_SDIO 0x03 ++ ++/*---------------------------------------------*/ ++/* 3 The value of interface_msk: 4 bits */ ++/*---------------------------------------------*/ ++#define PWR_INTF_SDIO_MSK BIT(0) ++#define PWR_INTF_USB_MSK BIT(1) ++#define PWR_INTF_PCI_MSK BIT(2) ++#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) ++ ++/*---------------------------------------------*/ ++/* 3 The value of fab_msk: 4 bits */ ++/*---------------------------------------------*/ ++#define PWR_FAB_TSMC_MSK BIT(0) ++#define PWR_FAB_UMC_MSK BIT(1) ++#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) ++ ++/*---------------------------------------------*/ ++/* 3 The value of cut_msk: 8 bits */ ++/*---------------------------------------------*/ ++#define PWR_CUT_TESTCHIP_MSK BIT(0) ++#define PWR_CUT_A_MSK BIT(1) ++#define PWR_CUT_B_MSK BIT(2) ++#define PWR_CUT_C_MSK BIT(3) ++#define PWR_CUT_D_MSK BIT(4) ++#define PWR_CUT_E_MSK BIT(5) ++#define PWR_CUT_F_MSK BIT(6) ++#define PWR_CUT_G_MSK BIT(7) ++#define PWR_CUT_ALL_MSK 0xFF ++ ++enum pwrseq_cmd_delat_unit { ++ PWRSEQ_DELAY_US, ++ PWRSEQ_DELAY_MS, ++}; ++ ++struct wl_pwr_cfg { ++ u16 offset; ++ u8 cut_msk; ++ u8 fab_msk:4; ++ u8 interface_msk:4; ++ u8 base:4; ++ u8 cmd:4; ++ u8 msk; ++ u8 value; ++}; ++ ++#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset ++#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk ++#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk ++#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk ++#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base ++#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd ++#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk ++#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value ++ ++/* Prototype of protected function. */ ++u8 HalPwrSeqCmdParsing(struct adapter *padapter, u8 CutVersion, u8 FabVersion, ++ u8 InterfaceType, struct wl_pwr_cfg PwrCfgCmd[]); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/HalVerDef.h b/drivers/staging/r8188eu/include/HalVerDef.h +new file mode 100644 +index 000000000000..a0f5bf52e75a +--- /dev/null ++++ b/drivers/staging/r8188eu/include/HalVerDef.h +@@ -0,0 +1,149 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++#ifndef __HAL_VERSION_DEF_H__ ++#define __HAL_VERSION_DEF_H__ ++ ++enum HAL_IC_TYPE { ++ CHIP_8192S = 0, ++ CHIP_8188C = 1, ++ CHIP_8192C = 2, ++ CHIP_8192D = 3, ++ CHIP_8723A = 4, ++ CHIP_8188E = 5, ++ CHIP_8881A = 6, ++ CHIP_8812A = 7, ++ CHIP_8821A = 8, ++ CHIP_8723B = 9, ++ CHIP_8192E = 10, ++}; ++ ++enum HAL_CHIP_TYPE { ++ TEST_CHIP = 0, ++ NORMAL_CHIP = 1, ++ FPGA = 2, ++}; ++ ++enum HAL_CUT_VERSION { ++ A_CUT_VERSION = 0, ++ B_CUT_VERSION = 1, ++ C_CUT_VERSION = 2, ++ D_CUT_VERSION = 3, ++ E_CUT_VERSION = 4, ++ F_CUT_VERSION = 5, ++ G_CUT_VERSION = 6, ++}; ++ ++enum HAL_VENDOR { ++ CHIP_VENDOR_TSMC = 0, ++ CHIP_VENDOR_UMC = 1, ++}; ++ ++enum HAL_RF_TYPE { ++ RF_TYPE_1T1R = 0, ++ RF_TYPE_1T2R = 1, ++ RF_TYPE_2T2R = 2, ++ RF_TYPE_2T3R = 3, ++ RF_TYPE_2T4R = 4, ++ RF_TYPE_3T3R = 5, ++ RF_TYPE_3T4R = 6, ++ RF_TYPE_4T4R = 7, ++}; ++ ++struct HAL_VERSION { ++ enum HAL_IC_TYPE ICType; ++ enum HAL_CHIP_TYPE ChipType; ++ enum HAL_CUT_VERSION CUTVersion; ++ enum HAL_VENDOR VendorType; ++ enum HAL_RF_TYPE RFType; ++ u8 ROMVer; ++}; ++ ++/* Get element */ ++#define GET_CVID_IC_TYPE(version) (((version).ICType)) ++#define GET_CVID_CHIP_TYPE(version) (((version).ChipType)) ++#define GET_CVID_RF_TYPE(version) (((version).RFType)) ++#define GET_CVID_MANUFACTUER(version) (((version).VendorType)) ++#define GET_CVID_CUT_VERSION(version) (((version).CUTVersion)) ++#define GET_CVID_ROM_VERSION(version) (((version).ROMVer) & ROM_VERSION_MASK) ++ ++/* Common Macro. -- */ ++/* HAL_VERSION VersionID */ ++ ++/* HAL_IC_TYPE_E */ ++#define IS_81XXC(version) \ ++ (((GET_CVID_IC_TYPE(version) == CHIP_8192C) || \ ++ (GET_CVID_IC_TYPE(version) == CHIP_8188C)) ? true : false) ++#define IS_8723_SERIES(version) \ ++ ((GET_CVID_IC_TYPE(version) == CHIP_8723A) ? true : false) ++#define IS_92D(version) \ ++ ((GET_CVID_IC_TYPE(version) == CHIP_8192D) ? true : false) ++#define IS_8188E(version) \ ++ ((GET_CVID_IC_TYPE(version) == CHIP_8188E) ? true : false) ++ ++/* HAL_CHIP_TYPE_E */ ++#define IS_TEST_CHIP(version) \ ++ ((GET_CVID_CHIP_TYPE(version) == TEST_CHIP) ? true : false) ++#define IS_NORMAL_CHIP(version) \ ++ ((GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP) ? true : false) ++ ++/* HAL_CUT_VERSION_E */ ++#define IS_A_CUT(version) \ ++ ((GET_CVID_CUT_VERSION(version) == A_CUT_VERSION) ? true : false) ++#define IS_B_CUT(version) \ ++ ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? true : false) ++#define IS_C_CUT(version) \ ++ ((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? true : false) ++#define IS_D_CUT(version) \ ++ ((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? true : false) ++#define IS_E_CUT(version) \ ++ ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? true : false) ++ ++/* HAL_VENDOR_E */ ++#define IS_CHIP_VENDOR_TSMC(version) \ ++ ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC) ? true : false) ++#define IS_CHIP_VENDOR_UMC(version) \ ++ ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_UMC) ? true : false) ++ ++/* HAL_RF_TYPE_E */ ++#define IS_1T1R(version) \ ++ ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T1R) ? true : false) ++#define IS_1T2R(version) \ ++ ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R) ? true : false) ++#define IS_2T2R(version) \ ++ ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R) ? true : false) ++ ++/* Chip version Macro. -- */ ++#define IS_81XXC_TEST_CHIP(version) \ ++ ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version))) ? true : false) ++ ++#define IS_92C_SERIAL(version) \ ++ ((IS_81XXC(version) && IS_2T2R(version)) ? true : false) ++#define IS_81xxC_VENDOR_UMC_A_CUT(version) \ ++ (IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ? \ ++ (IS_A_CUT(version) ? true : false) : false) : false) ++#define IS_81xxC_VENDOR_UMC_B_CUT(version) \ ++ (IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ? \ ++ (IS_B_CUT(version) ? true : false) : false) : false) ++#define IS_81xxC_VENDOR_UMC_C_CUT(version) \ ++ (IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ? \ ++ (IS_C_CUT(version) ? true : false) : false) : false) ++ ++#define IS_NORMAL_CHIP92D(version) \ ++ ((IS_92D(version)) ? \ ++ ((GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP) ? true : false) : false) ++ ++#define IS_92D_SINGLEPHY(version) \ ++ ((IS_92D(version)) ? (IS_2T2R(version) ? true : false) : false) ++#define IS_92D_C_CUT(version) \ ++ ((IS_92D(version)) ? (IS_C_CUT(version) ? true : false) : false) ++#define IS_92D_D_CUT(version) \ ++ ((IS_92D(version)) ? (IS_D_CUT(version) ? true : false) : false) ++#define IS_92D_E_CUT(version) \ ++ ((IS_92D(version)) ? (IS_E_CUT(version) ? true : false) : false) ++ ++#define IS_8723A_A_CUT(version) \ ++ ((IS_8723_SERIES(version)) ? (IS_A_CUT(version) ? true : false) : false) ++#define IS_8723A_B_CUT(version) \ ++ ((IS_8723_SERIES(version)) ? (IS_B_CUT(version) ? true : false) : false) ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/basic_types.h b/drivers/staging/r8188eu/include/basic_types.h +new file mode 100644 +index 000000000000..d82b2171d584 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/basic_types.h +@@ -0,0 +1,123 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __BASIC_TYPES_H__ ++#define __BASIC_TYPES_H__ ++ ++#define SUCCESS 0 ++#define FAIL (-1) ++ ++#include ++#define NDIS_OID uint ++ ++typedef void (*proc_t)(void *); ++ ++#define FIELD_OFFSET(s, field) ((ssize_t)&((s *)(0))->field) ++ ++#define MEM_ALIGNMENT_OFFSET (sizeof(size_t)) ++#define MEM_ALIGNMENT_PADDING (sizeof(size_t) - 1) ++ ++/* port from fw */ ++/* TODO: Macros Below are Sync from SD7-Driver. It is necessary ++ * to check correctness */ ++ ++/* ++ * Call endian free function when ++ * 1. Read/write packet content. ++ * 2. Before write integer to IO. ++ * 3. After read integer from IO. ++*/ ++ ++/* Convert little data endian to host ordering */ ++#define EF1BYTE(_val) \ ++ ((u8)(_val)) ++#define EF2BYTE(_val) \ ++ (le16_to_cpu(_val)) ++#define EF4BYTE(_val) \ ++ (le32_to_cpu(_val)) ++ ++/* Read data from memory */ ++#define READEF1BYTE(_ptr) \ ++ EF1BYTE(*((u8 *)(_ptr))) ++/* Read le16 data from memory and convert to host ordering */ ++#define READEF2BYTE(_ptr) \ ++ EF2BYTE(*(_ptr)) ++#define READEF4BYTE(_ptr) \ ++ EF4BYTE(*(_ptr)) ++ ++/* Write data to memory */ ++#define WRITEEF1BYTE(_ptr, _val) \ ++ do { \ ++ (*((u8 *)(_ptr))) = EF1BYTE(_val) \ ++ } while (0) ++/* Write le data to memory in host ordering */ ++#define WRITEEF2BYTE(_ptr, _val) \ ++ do { \ ++ (*((u16 *)(_ptr))) = EF2BYTE(_val) \ ++ } while (0) ++ ++#define WRITEEF4BYTE(_ptr, _val) \ ++ do { \ ++ (*((u32 *)(_ptr))) = EF2BYTE(_val) \ ++ } while (0) ++ ++/* Create a bit mask ++ * Examples: ++ * BIT_LEN_MASK_32(0) => 0x00000000 ++ * BIT_LEN_MASK_32(1) => 0x00000001 ++ * BIT_LEN_MASK_32(2) => 0x00000003 ++ * BIT_LEN_MASK_32(32) => 0xFFFFFFFF ++ */ ++#define BIT_LEN_MASK_32(__bitlen) \ ++ (0xFFFFFFFF >> (32 - (__bitlen))) ++#define BIT_LEN_MASK_16(__bitlen) \ ++ (0xFFFF >> (16 - (__bitlen))) ++#define BIT_LEN_MASK_8(__bitlen) \ ++ (0xFF >> (8 - (__bitlen))) ++ ++/* Create an offset bit mask ++ * Examples: ++ * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 ++ * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 ++ */ ++#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \ ++ (BIT_LEN_MASK_32(__bitlen) << (__bitoffset)) ++#define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \ ++ (BIT_LEN_MASK_16(__bitlen) << (__bitoffset)) ++#define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \ ++ (BIT_LEN_MASK_8(__bitlen) << (__bitoffset)) ++ ++/*Description: ++ * Return 4-byte value in host byte ordering from ++ * 4-byte pointer in little-endian system. ++ */ ++#define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \ ++ (EF4BYTE(*((__le32 *)(__pstart)))) ++#define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \ ++ (EF2BYTE(*((__le16 *)(__pstart)))) ++#define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \ ++ (EF1BYTE(*((u8 *)(__pstart)))) ++ ++/*Description: ++Translate subfield (continuous bits in little-endian) of 4-byte ++value to host byte ordering.*/ ++#define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \ ++ ( \ ++ (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \ ++ BIT_LEN_MASK_32(__bitlen) \ ++ ) ++#define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \ ++ ( \ ++ (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \ ++ BIT_LEN_MASK_16(__bitlen) \ ++ ) ++#define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \ ++ ( \ ++ (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \ ++ BIT_LEN_MASK_8(__bitlen) \ ++ ) ++ ++#define N_BYTE_ALIGMENT(__value, __aligment) ((__aligment == 1) ? \ ++ (__value) : (((__value + __aligment - 1) / __aligment) * __aligment)) ++ ++#endif /* __BASIC_TYPES_H__ */ +diff --git a/drivers/staging/r8188eu/include/drv_types.h b/drivers/staging/r8188eu/include/drv_types.h +new file mode 100644 +index 000000000000..04f4224c11de +--- /dev/null ++++ b/drivers/staging/r8188eu/include/drv_types.h +@@ -0,0 +1,323 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++/*----------------------------------------------------------------------------- ++ ++ For type defines and data structure defines ++ ++------------------------------------------------------------------------------*/ ++ ++#ifndef __DRV_TYPES_H__ ++#define __DRV_TYPES_H__ ++ ++#define DRV_NAME "r8188eu" ++#define CONFIG_88EU_AP_MODE 1 ++#define CONFIG_88EU_P2P 1 ++ ++#include "osdep_service.h" ++#include "wlan_bssdef.h" ++#include "rtw_ht.h" ++#include "rtw_cmd.h" ++#include "rtw_xmit.h" ++#include "rtw_recv.h" ++#include "hal_intf.h" ++#include "hal_com.h" ++#include "rtw_security.h" ++#include "rtw_pwrctrl.h" ++#include "rtw_io.h" ++#include "rtw_eeprom.h" ++#include "sta_info.h" ++#include "rtw_mlme.h" ++#include "rtw_debug.h" ++#include "rtw_rf.h" ++#include "rtw_event.h" ++#include "rtw_led.h" ++#include "rtw_mlme_ext.h" ++#include "rtw_p2p.h" ++#include "rtw_ap.h" ++#include "rtw_mp.h" ++#include "rtw_br_ext.h" ++ ++#define DRIVERVERSION "v4.1.4_6773.20130222" ++ ++#define SPEC_DEV_ID_NONE BIT(0) ++#define SPEC_DEV_ID_DISABLE_HT BIT(1) ++#define SPEC_DEV_ID_ENABLE_PS BIT(2) ++#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3) ++#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4) ++#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5) ++ ++struct specific_device_id { ++ u32 flags; ++ u16 idVendor; ++ u16 idProduct; ++}; ++ ++struct registry_priv { ++ u8 chip_version; ++ u8 rfintfs; ++ u8 lbkmode; ++ u8 hci; ++ struct ndis_802_11_ssid ssid; ++ u8 network_mode; /* infra, ad-hoc, auto */ ++ u8 channel;/* ad-hoc support requirement */ ++ u8 wireless_mode;/* A, B, G, auto */ ++ u8 scan_mode;/* active, passive */ ++ u8 radio_enable; ++ u8 preamble;/* long, short, auto */ ++ u8 vrtl_carrier_sense;/* Enable, Disable, Auto */ ++ u8 vcs_type;/* RTS/CTS, CTS-to-self */ ++ u16 rts_thresh; ++ u16 frag_thresh; ++ u8 adhoc_tx_pwr; ++ u8 soft_ap; ++ u8 power_mgnt; ++ u8 ips_mode; ++ u8 smart_ps; ++ u8 long_retry_lmt; ++ u8 short_retry_lmt; ++ u16 busy_thresh; ++ u8 ack_policy; ++ u8 mp_mode; ++ u8 software_encrypt; ++ u8 software_decrypt; ++ u8 acm_method; ++ /* UAPSD */ ++ u8 wmm_enable; ++ u8 uapsd_enable; ++ u8 uapsd_max_sp; ++ u8 uapsd_acbk_en; ++ u8 uapsd_acbe_en; ++ u8 uapsd_acvi_en; ++ u8 uapsd_acvo_en; ++ ++ u8 led_enable; ++ ++ struct wlan_bssid_ex dev_network; ++ ++ u8 ht_enable; ++ u8 cbw40_enable; ++ u8 ampdu_enable;/* for tx */ ++ u8 rx_stbc; ++ u8 ampdu_amsdu;/* A-MPDU Supports A-MSDU is permitted */ ++ u8 lowrate_two_xmit; ++ ++ u8 rf_config; ++ u8 low_power; ++ ++ u8 wifi_spec;/* !turbo_mode */ ++ ++ u8 channel_plan; ++ bool bAcceptAddbaReq; ++ ++ u8 antdiv_cfg; ++ u8 antdiv_type; ++ ++ u8 usbss_enable;/* 0:disable,1:enable */ ++ u8 hwpdn_mode;/* 0:disable,1:enable,2:decide by EFUSE config */ ++ u8 hwpwrp_detect;/* 0:disable,1:enable */ ++ ++ u8 hw_wps_pbc;/* 0:disable,1:enable */ ++ ++ u8 max_roaming_times; /* the max number driver will try */ ++ ++ u8 fw_iol; /* enable iol without other concern */ ++ ++ u8 enable80211d; ++ ++ u8 ifname[16]; ++ u8 if2name[16]; ++ ++ u8 notch_filter; ++}; ++ ++/* For registry parameters */ ++#define RGTRY_OFT(field) ((u32)FIELD_OFFSET(struct registry_priv, field)) ++#define RGTRY_SZ(field) sizeof(((struct registry_priv *)0)->field) ++#define BSSID_OFT(field) ((u32)FIELD_OFFSET(struct wlan_bssid_ex, field)) ++#define BSSID_SZ(field) sizeof(((struct wlan_bssid_ex *)0)->field) ++ ++#define MAX_CONTINUAL_URB_ERR 4 ++ ++struct rt_firmware { ++ u8 *szFwBuffer; ++ u32 ulFwLength; ++}; ++ ++struct dvobj_priv { ++ struct adapter *if1; ++ struct adapter *if2; ++ ++ /* For 92D, DMDP have 2 interface. */ ++ u8 InterfaceNumber; ++ u8 NumInterfaces; ++ ++ /* In /Out Pipe information */ ++ int RtInPipe[2]; ++ int RtOutPipe[3]; ++ u8 Queue2Pipe[HW_QUEUE_ENTRY];/* for out pipe mapping */ ++ ++ u8 irq_alloc; ++ ++ struct rt_firmware firmware; ++ ++/*-------- below is for USB INTERFACE --------*/ ++ ++ u8 nr_endpoint; ++ u8 ishighspeed; ++ u8 RtNumInPipes; ++ u8 RtNumOutPipes; ++ int ep_num[5]; /* endpoint number */ ++ int RegUsbSS; ++ struct semaphore usb_suspend_sema; ++ struct mutex usb_vendor_req_mutex; ++ ++ u8 *usb_alloc_vendor_req_buf; ++ u8 *usb_vendor_req_buf; ++ ++ struct usb_interface *pusbintf; ++ struct usb_device *pusbdev; ++ ++ atomic_t continual_urb_error; ++ u8 signal_strength; ++}; ++ ++static inline struct device *dvobj_to_dev(struct dvobj_priv *dvobj) ++{ ++ /* todo: get interface type from dvobj and the return ++ * the dev accordingly */ ++ return &dvobj->pusbintf->dev; ++}; ++ ++enum _IFACE_TYPE { ++ IFACE_PORT0, /* mapping to port0 for C/D series chips */ ++ IFACE_PORT1, /* mapping to port1 for C/D series chip */ ++ MAX_IFACE_PORT, ++}; ++ ++enum _ADAPTER_TYPE { ++ PRIMARY_ADAPTER, ++ SECONDARY_ADAPTER, ++ MAX_ADAPTER, ++}; ++ ++enum driver_state { ++ DRIVER_NORMAL = 0, ++ DRIVER_DISAPPEAR = 1, ++ DRIVER_REPLACE_DONGLE = 2, ++}; ++ ++struct adapter { ++ int DriverState;/* for disable driver using module, use dongle toi ++ * replace module. */ ++ int pid[3];/* process id from UI, 0:wps, 1:hostapd, 2:dhcpcd */ ++ int bDongle;/* build-in module or external dongle */ ++ u16 chip_type; ++ u16 HardwareType; ++ u16 interface_type;/* USB,SDIO,SPI,PCI */ ++ ++ struct dvobj_priv *dvobj; ++ struct mlme_priv mlmepriv; ++ struct mlme_ext_priv mlmeextpriv; ++ struct cmd_priv cmdpriv; ++ struct evt_priv evtpriv; ++ struct io_priv iopriv; ++ struct xmit_priv xmitpriv; ++ struct recv_priv recvpriv; ++ struct sta_priv stapriv; ++ struct security_priv securitypriv; ++ struct registry_priv registrypriv; ++ struct pwrctrl_priv pwrctrlpriv; ++ struct eeprom_priv eeprompriv; ++ struct led_priv ledpriv; ++ struct mp_priv mppriv; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ struct hostapd_priv *phostapdpriv; ++#endif ++ ++ struct wifidirect_info wdinfo; ++ ++ void *HalData; ++ u32 hal_data_sz; ++ struct hal_ops HalFunc; ++ ++ s32 bDriverStopped; ++ s32 bSurpriseRemoved; ++ s32 bCardDisableWOHSM; ++ ++ u32 IsrContent; ++ u32 ImrContent; ++ ++ u8 EepromAddressSize; ++ u8 hw_init_completed; ++ u8 bDriverIsGoingToUnload; ++ u8 init_adpt_in_progress; ++ u8 bHaltInProgress; ++ s8 signal_strength; ++ ++ void *cmdThread; ++ void *evtThread; ++ void *xmitThread; ++ void *recvThread; ++ void (*intf_start)(struct adapter *adapter); ++ void (*intf_stop)(struct adapter *adapter); ++ struct net_device *pnetdev; ++ ++ /* used by rtw_rereg_nd_name related function */ ++ struct rereg_nd_name_data { ++ struct net_device *old_pnetdev; ++ char old_ifname[IFNAMSIZ]; ++ u8 old_ips_mode; ++ u8 old_bRegUseLed; ++ } rereg_nd_name_priv; ++ ++ int bup; ++ struct net_device_stats stats; ++ struct iw_statistics iwstats; ++ struct proc_dir_entry *dir_dev;/* for proc directory */ ++ ++ int net_closed; ++ u8 bFWReady; ++ u8 bBTFWReady; ++ u8 bReadPortCancel; ++ u8 bWritePortCancel; ++ u8 bRxRSSIDisplay; ++ /* The driver will show up the desired channel number ++ * when this flag is 1. */ ++ u8 bNotifyChannelChange; ++#ifdef CONFIG_88EU_P2P ++ /* The driver will show the current P2P status when the ++ * upper application reads it. */ ++ u8 bShowGetP2PState; ++#endif ++ struct adapter *pbuddy_adapter; ++ ++ struct mutex *hw_init_mutex; ++ ++ spinlock_t br_ext_lock; ++ struct nat25_network_db_entry *nethash[NAT25_HASH_SIZE]; ++ int pppoe_connection_in_progress; ++ unsigned char pppoe_addr[MACADDRLEN]; ++ unsigned char scdb_mac[MACADDRLEN]; ++ unsigned char scdb_ip[4]; ++ struct nat25_network_db_entry *scdb_entry; ++ unsigned char br_mac[MACADDRLEN]; ++ unsigned char br_ip[4]; ++ struct br_ext_info ethBrExtInfo; ++ ++ u8 fix_rate; ++ ++ unsigned char in_cta_test; ++}; ++ ++#define adapter_to_dvobj(adapter) (adapter->dvobj) ++ ++int rtw_handle_dualmac(struct adapter *adapter, bool init); ++ ++static inline u8 *myid(struct eeprom_priv *peepriv) ++{ ++ return peepriv->mac_addr; ++} ++ ++#endif /* __DRV_TYPES_H__ */ +diff --git a/drivers/staging/r8188eu/include/hal_com.h b/drivers/staging/r8188eu/include/hal_com.h +new file mode 100644 +index 000000000000..95167f0b327f +--- /dev/null ++++ b/drivers/staging/r8188eu/include/hal_com.h +@@ -0,0 +1,156 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HAL_COMMON_H__ ++#define __HAL_COMMON_H__ ++ ++/* */ ++/* Rate Definition */ ++/* */ ++/* CCK */ ++#define RATR_1M 0x00000001 ++#define RATR_2M 0x00000002 ++#define RATR_55M 0x00000004 ++#define RATR_11M 0x00000008 ++/* OFDM */ ++#define RATR_6M 0x00000010 ++#define RATR_9M 0x00000020 ++#define RATR_12M 0x00000040 ++#define RATR_18M 0x00000080 ++#define RATR_24M 0x00000100 ++#define RATR_36M 0x00000200 ++#define RATR_48M 0x00000400 ++#define RATR_54M 0x00000800 ++/* MCS 1 Spatial Stream */ ++#define RATR_MCS0 0x00001000 ++#define RATR_MCS1 0x00002000 ++#define RATR_MCS2 0x00004000 ++#define RATR_MCS3 0x00008000 ++#define RATR_MCS4 0x00010000 ++#define RATR_MCS5 0x00020000 ++#define RATR_MCS6 0x00040000 ++#define RATR_MCS7 0x00080000 ++/* MCS 2 Spatial Stream */ ++#define RATR_MCS8 0x00100000 ++#define RATR_MCS9 0x00200000 ++#define RATR_MCS10 0x00400000 ++#define RATR_MCS11 0x00800000 ++#define RATR_MCS12 0x01000000 ++#define RATR_MCS13 0x02000000 ++#define RATR_MCS14 0x04000000 ++#define RATR_MCS15 0x08000000 ++ ++/* CCK */ ++#define RATE_1M BIT(0) ++#define RATE_2M BIT(1) ++#define RATE_5_5M BIT(2) ++#define RATE_11M BIT(3) ++/* OFDM */ ++#define RATE_6M BIT(4) ++#define RATE_9M BIT(5) ++#define RATE_12M BIT(6) ++#define RATE_18M BIT(7) ++#define RATE_24M BIT(8) ++#define RATE_36M BIT(9) ++#define RATE_48M BIT(10) ++#define RATE_54M BIT(11) ++/* MCS 1 Spatial Stream */ ++#define RATE_MCS0 BIT(12) ++#define RATE_MCS1 BIT(13) ++#define RATE_MCS2 BIT(14) ++#define RATE_MCS3 BIT(15) ++#define RATE_MCS4 BIT(16) ++#define RATE_MCS5 BIT(17) ++#define RATE_MCS6 BIT(18) ++#define RATE_MCS7 BIT(19) ++/* MCS 2 Spatial Stream */ ++#define RATE_MCS8 BIT(20) ++#define RATE_MCS9 BIT(21) ++#define RATE_MCS10 BIT(22) ++#define RATE_MCS11 BIT(23) ++#define RATE_MCS12 BIT(24) ++#define RATE_MCS13 BIT(25) ++#define RATE_MCS14 BIT(26) ++#define RATE_MCS15 BIT(27) ++ ++/* ALL CCK Rate */ ++#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M) ++#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M | \ ++ RATR_24M | RATR_36M | RATR_48M | RATR_54M) ++#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 | \ ++ RATR_MCS3 | RATR_MCS4 | RATR_MCS5|RATR_MCS6 | \ ++ RATR_MCS7) ++#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 | \ ++ RATR_MCS11 | RATR_MCS12 | RATR_MCS13 | \ ++ RATR_MCS14 | RATR_MCS15) ++ ++/*------------------------------ Tx Desc definition Macro --------------------*/ ++/* pragma mark -- Tx Desc related definition. -- */ ++/* Rate */ ++/* CCK Rates, TxHT = 0 */ ++#define DESC_RATE1M 0x00 ++#define DESC_RATE2M 0x01 ++#define DESC_RATE5_5M 0x02 ++#define DESC_RATE11M 0x03 ++ ++/* OFDM Rates, TxHT = 0 */ ++#define DESC_RATE6M 0x04 ++#define DESC_RATE9M 0x05 ++#define DESC_RATE12M 0x06 ++#define DESC_RATE18M 0x07 ++#define DESC_RATE24M 0x08 ++#define DESC_RATE36M 0x09 ++#define DESC_RATE48M 0x0a ++#define DESC_RATE54M 0x0b ++ ++/* MCS Rates, TxHT = 1 */ ++#define DESC_RATEMCS0 0x0c ++#define DESC_RATEMCS1 0x0d ++#define DESC_RATEMCS2 0x0e ++#define DESC_RATEMCS3 0x0f ++#define DESC_RATEMCS4 0x10 ++#define DESC_RATEMCS5 0x11 ++#define DESC_RATEMCS6 0x12 ++#define DESC_RATEMCS7 0x13 ++#define DESC_RATEMCS8 0x14 ++#define DESC_RATEMCS9 0x15 ++#define DESC_RATEMCS10 0x16 ++#define DESC_RATEMCS11 0x17 ++#define DESC_RATEMCS12 0x18 ++#define DESC_RATEMCS13 0x19 ++#define DESC_RATEMCS14 0x1a ++#define DESC_RATEMCS15 0x1b ++#define DESC_RATEMCS15_SG 0x1c ++#define DESC_RATEMCS32 0x20 ++ ++/* 1 Byte long (in unit of TU) */ ++#define REG_P2P_CTWIN 0x0572 ++#define REG_NOA_DESC_SEL 0x05CF ++#define REG_NOA_DESC_DURATION 0x05E0 ++#define REG_NOA_DESC_INTERVAL 0x05E4 ++#define REG_NOA_DESC_START 0x05E8 ++#define REG_NOA_DESC_COUNT 0x05EC ++ ++#include "HalVerDef.h" ++void dump_chip_info(struct HAL_VERSION ChipVersion); ++ ++/* return the final channel plan decision */ ++u8 hal_com_get_channel_plan(struct adapter *padapter, ++ u8 hw_channel_plan, ++ u8 sw_channel_plan, ++ u8 def_channel_plan, ++ bool AutoLoadFail ++); ++ ++u8 MRateToHwRate(u8 rate); ++ ++void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg); ++ ++bool Hal_MappingOutPipe(struct adapter *pAdapter, u8 NumOutPipe); ++ ++void hal_init_macaddr(struct adapter *adapter); ++ ++void c2h_evt_clear(struct adapter *adapter); ++s32 c2h_evt_read(struct adapter *adapter, u8 *buf); ++ ++#endif /* __HAL_COMMON_H__ */ +diff --git a/drivers/staging/r8188eu/include/hal_intf.h b/drivers/staging/r8188eu/include/hal_intf.h +new file mode 100644 +index 000000000000..fa252540e596 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/hal_intf.h +@@ -0,0 +1,411 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef __HAL_INTF_H__ ++#define __HAL_INTF_H__ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "Hal8188EPhyCfg.h" ++ ++enum RTL871X_HCI_TYPE { ++ RTW_PCIE = BIT(0), ++ RTW_USB = BIT(1), ++ RTW_SDIO = BIT(2), ++ RTW_GSPI = BIT(3), ++}; ++ ++enum _CHIP_TYPE { ++ NULL_CHIP_TYPE, ++ RTL8712_8188S_8191S_8192S, ++ RTL8188C_8192C, ++ RTL8192D, ++ RTL8723A, ++ RTL8188E, ++ MAX_CHIP_TYPE ++}; ++ ++enum hw_variables { ++ HW_VAR_MEDIA_STATUS, ++ HW_VAR_MEDIA_STATUS1, ++ HW_VAR_SET_OPMODE, ++ HW_VAR_MAC_ADDR, ++ HW_VAR_BSSID, ++ HW_VAR_INIT_RTS_RATE, ++ HW_VAR_BASIC_RATE, ++ HW_VAR_TXPAUSE, ++ HW_VAR_BCN_FUNC, ++ HW_VAR_CORRECT_TSF, ++ HW_VAR_CHECK_BSSID, ++ HW_VAR_MLME_DISCONNECT, ++ HW_VAR_MLME_SITESURVEY, ++ HW_VAR_MLME_JOIN, ++ HW_VAR_BEACON_INTERVAL, ++ HW_VAR_SLOT_TIME, ++ HW_VAR_RESP_SIFS, ++ HW_VAR_ACK_PREAMBLE, ++ HW_VAR_SEC_CFG, ++ HW_VAR_BCN_VALID, ++ HW_VAR_RF_TYPE, ++ HW_VAR_DM_FLAG, ++ HW_VAR_DM_FUNC_OP, ++ HW_VAR_DM_FUNC_SET, ++ HW_VAR_DM_FUNC_CLR, ++ HW_VAR_CAM_EMPTY_ENTRY, ++ HW_VAR_CAM_INVALID_ALL, ++ HW_VAR_CAM_WRITE, ++ HW_VAR_CAM_READ, ++ HW_VAR_AC_PARAM_VO, ++ HW_VAR_AC_PARAM_VI, ++ HW_VAR_AC_PARAM_BE, ++ HW_VAR_AC_PARAM_BK, ++ HW_VAR_ACM_CTRL, ++ HW_VAR_AMPDU_MIN_SPACE, ++ HW_VAR_AMPDU_FACTOR, ++ HW_VAR_RXDMA_AGG_PG_TH, ++ HW_VAR_SET_RPWM, ++ HW_VAR_H2C_FW_PWRMODE, ++ HW_VAR_H2C_FW_JOINBSSRPT, ++ HW_VAR_FWLPS_RF_ON, ++ HW_VAR_H2C_FW_P2P_PS_OFFLOAD, ++ HW_VAR_TDLS_WRCR, ++ HW_VAR_TDLS_INIT_CH_SEN, ++ HW_VAR_TDLS_RS_RCR, ++ HW_VAR_TDLS_DONE_CH_SEN, ++ HW_VAR_INITIAL_GAIN, ++ HW_VAR_TRIGGER_GPIO_0, ++ HW_VAR_BT_SET_COEXIST, ++ HW_VAR_BT_ISSUE_DELBA, ++ HW_VAR_CURRENT_ANTENNA, ++ HW_VAR_ANTENNA_DIVERSITY_LINK, ++ HW_VAR_ANTENNA_DIVERSITY_SELECT, ++ HW_VAR_SWITCH_EPHY_WoWLAN, ++ HW_VAR_EFUSE_USAGE, ++ HW_VAR_EFUSE_BYTES, ++ HW_VAR_EFUSE_BT_USAGE, ++ HW_VAR_EFUSE_BT_BYTES, ++ HW_VAR_FIFO_CLEARN_UP, ++ HW_VAR_CHECK_TXBUF, ++ HW_VAR_APFM_ON_MAC, /* Auto FSM to Turn On, include clock, isolation, ++ * power control for MAC only */ ++ /* The valid upper nav range for the HW updating, if the true value is ++ * larger than the upper range, the HW won't update it. */ ++ /* Unit in microsecond. 0 means disable this function. */ ++ HW_VAR_NAV_UPPER, ++ HW_VAR_RPT_TIMER_SETTING, ++ HW_VAR_TX_RPT_MAX_MACID, ++ HW_VAR_H2C_MEDIA_STATUS_RPT, ++ HW_VAR_CHK_HI_QUEUE_EMPTY, ++}; ++ ++enum hal_def_variable { ++ HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, ++ HAL_DEF_IS_SUPPORT_ANT_DIV, ++ HAL_DEF_CURRENT_ANTENNA, ++ HAL_DEF_DRVINFO_SZ, ++ HAL_DEF_MAX_RECVBUF_SZ, ++ HAL_DEF_RX_PACKET_OFFSET, ++ HAL_DEF_DBG_DUMP_RXPKT,/* for dbg */ ++ HAL_DEF_DBG_DM_FUNC,/* for dbg */ ++ HAL_DEF_RA_DECISION_RATE, ++ HAL_DEF_RA_SGI, ++ HAL_DEF_PT_PWR_STATUS, ++ HW_VAR_MAX_RX_AMPDU_FACTOR, ++ HW_DEF_RA_INFO_DUMP, ++ HAL_DEF_DBG_DUMP_TXPKT, ++}; ++ ++enum hal_odm_variable { ++ HAL_ODM_STA_INFO, ++ HAL_ODM_P2P_STATE, ++ HAL_ODM_WIFI_DISPLAY_STATE, ++}; ++ ++enum hal_intf_ps_func { ++ HAL_USB_SELECT_SUSPEND, ++ HAL_MAX_ID, ++}; ++ ++typedef s32 (*c2h_id_filter)(u8 id); ++ ++struct hal_ops { ++ u32 (*hal_power_on)(struct adapter *padapter); ++ u32 (*hal_init)(struct adapter *padapter); ++ u32 (*hal_deinit)(struct adapter *padapter); ++ ++ void (*free_hal_data)(struct adapter *padapter); ++ ++ u32 (*inirp_init)(struct adapter *padapter); ++ u32 (*inirp_deinit)(struct adapter *padapter); ++ ++ s32 (*init_xmit_priv)(struct adapter *padapter); ++ ++ s32 (*init_recv_priv)(struct adapter *padapter); ++ void (*free_recv_priv)(struct adapter *padapter); ++ ++ void (*InitSwLeds)(struct adapter *padapter); ++ void (*DeInitSwLeds)(struct adapter *padapter); ++ ++ void (*dm_init)(struct adapter *padapter); ++ void (*dm_deinit)(struct adapter *padapter); ++ void (*read_chip_version)(struct adapter *padapter); ++ ++ void (*init_default_value)(struct adapter *padapter); ++ ++ void (*intf_chip_configure)(struct adapter *padapter); ++ ++ void (*read_adapter_info)(struct adapter *padapter); ++ ++ void (*enable_interrupt)(struct adapter *padapter); ++ void (*disable_interrupt)(struct adapter *padapter); ++ s32 (*interrupt_handler)(struct adapter *padapter); ++ ++ void (*set_bwmode_handler)(struct adapter *padapter, ++ enum ht_channel_width Bandwidth, ++ u8 Offset); ++ void (*set_channel_handler)(struct adapter *padapter, u8 channel); ++ ++ void (*hal_dm_watchdog)(struct adapter *padapter); ++ ++ void (*SetHwRegHandler)(struct adapter *padapter, u8 variable, ++ u8 *val); ++ void (*GetHwRegHandler)(struct adapter *padapter, u8 variable, ++ u8 *val); ++ ++ u8 (*GetHalDefVarHandler)(struct adapter *padapter, ++ enum hal_def_variable eVariable, ++ void *pValue); ++ u8 (*SetHalDefVarHandler)(struct adapter *padapter, ++ enum hal_def_variable eVariable, ++ void *pValue); ++ ++ void (*GetHalODMVarHandler)(struct adapter *padapter, ++ enum hal_odm_variable eVariable, ++ void *pValue1, bool bSet); ++ void (*SetHalODMVarHandler)(struct adapter *padapter, ++ enum hal_odm_variable eVariable, ++ void *pValue1, bool bSet); ++ ++ void (*UpdateRAMaskHandler)(struct adapter *padapter, ++ u32 mac_id, u8 rssi_level); ++ void (*SetBeaconRelatedRegistersHandler)(struct adapter *padapter); ++ ++ void (*Add_RateATid)(struct adapter *adapter, u32 bitmap, u8 arg, ++ u8 rssi_level); ++ void (*run_thread)(struct adapter *adapter); ++ void (*cancel_thread)(struct adapter *adapter); ++ ++ u8 (*AntDivBeforeLinkHandler)(struct adapter *adapter); ++ void (*AntDivCompareHandler)(struct adapter *adapter, ++ struct wlan_bssid_ex *dst, ++ struct wlan_bssid_ex *src); ++ u8 (*interface_ps_func)(struct adapter *padapter, ++ enum hal_intf_ps_func efunc_id, u8 *val); ++ ++ s32 (*hal_xmit)(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++ s32 (*mgnt_xmit)(struct adapter *padapter, ++ struct xmit_frame *pmgntframe); ++ s32 (*hal_xmitframe_enqueue)(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++ ++ u32 (*read_bbreg)(struct adapter *padapter, u32 RegAddr, ++ u32 BitMask); ++ void (*write_bbreg)(struct adapter *padapter, u32 RegAddr, ++ u32 BitMask, u32 Data); ++ u32 (*read_rfreg)(struct adapter *padapter, ++ enum rf_radio_path eRFPath, u32 RegAddr, ++ u32 BitMask); ++ void (*write_rfreg)(struct adapter *padapter, ++ enum rf_radio_path eRFPath, u32 RegAddr, ++ u32 BitMask, u32 Data); ++ ++ void (*EfusePowerSwitch)(struct adapter *padapter, u8 bWrite, ++ u8 PwrState); ++ void (*ReadEFuse)(struct adapter *padapter, u8 efuseType, u16 _offset, ++ u16 _size_byte, u8 *pbuf, bool bPseudoTest); ++ void (*EFUSEGetEfuseDefinition)(struct adapter *padapter, u8 efuseType, ++ u8 type, void *pOut, bool bPseudoTest); ++ u16 (*EfuseGetCurrentSize)(struct adapter *padapter, u8 efuseType, ++ bool bPseudoTest); ++ int (*Efuse_PgPacketRead)(struct adapter *adapter, u8 offset, ++ u8 *data, bool bPseudoTest); ++ int (*Efuse_PgPacketWrite)(struct adapter *padapter, u8 offset, ++ u8 word_en, u8 *data, bool bPseudoTest); ++ u8 (*Efuse_WordEnableDataWrite)(struct adapter *padapter, ++ u16 efuse_addr, u8 word_en, ++ u8 *data, bool bPseudoTest); ++ bool (*Efuse_PgPacketWrite_BT)(struct adapter *padapter, u8 offset, ++ u8 word_en, u8 *data, bool test); ++ ++ void (*sreset_init_value)(struct adapter *padapter); ++ void (*sreset_reset_value)(struct adapter *padapter); ++ void (*silentreset)(struct adapter *padapter); ++ void (*sreset_xmit_status_check)(struct adapter *padapter); ++ void (*sreset_linked_status_check) (struct adapter *padapter); ++ u8 (*sreset_get_wifi_status)(struct adapter *padapter); ++ ++ int (*IOL_exec_cmds_sync)(struct adapter *padapter, ++ struct xmit_frame *frame, u32 max_wait, ++ u32 bndy_cnt); ++ ++ void (*hal_notch_filter)(struct adapter *adapter, bool enable); ++ void (*hal_reset_security_engine)(struct adapter *adapter); ++ s32 (*c2h_handler)(struct adapter *padapter, ++ struct c2h_evt_hdr *c2h_evt); ++ c2h_id_filter c2h_id_filter_ccx; ++}; ++ ++enum rt_eeprom_type { ++ EEPROM_93C46, ++ EEPROM_93C56, ++ EEPROM_BOOT_EFUSE, ++}; ++ ++#define RF_CHANGE_BY_INIT 0 ++#define RF_CHANGE_BY_IPS BIT(28) ++#define RF_CHANGE_BY_PS BIT(29) ++#define RF_CHANGE_BY_HW BIT(30) ++#define RF_CHANGE_BY_SW BIT(31) ++ ++enum hardware_type { ++ HARDWARE_TYPE_RTL8180, ++ HARDWARE_TYPE_RTL8185, ++ HARDWARE_TYPE_RTL8187, ++ HARDWARE_TYPE_RTL8188, ++ HARDWARE_TYPE_RTL8190P, ++ HARDWARE_TYPE_RTL8192E, ++ HARDWARE_TYPE_RTL819xU, ++ HARDWARE_TYPE_RTL8192SE, ++ HARDWARE_TYPE_RTL8192SU, ++ HARDWARE_TYPE_RTL8192CE, ++ HARDWARE_TYPE_RTL8192CU, ++ HARDWARE_TYPE_RTL8192DE, ++ HARDWARE_TYPE_RTL8192DU, ++ HARDWARE_TYPE_RTL8723AE, ++ HARDWARE_TYPE_RTL8723AU, ++ HARDWARE_TYPE_RTL8723AS, ++ HARDWARE_TYPE_RTL8188EE, ++ HARDWARE_TYPE_RTL8188EU, ++ HARDWARE_TYPE_RTL8188ES, ++ HARDWARE_TYPE_MAX, ++}; ++ ++/* RTL8188E Series */ ++#define IS_HARDWARE_TYPE_8188EE(_Adapter) \ ++(((struct adapter *)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188EE) ++#define IS_HARDWARE_TYPE_8188EU(_Adapter) \ ++(((struct adapter *)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188EU) ++#define IS_HARDWARE_TYPE_8188ES(_Adapter) \ ++(((struct adapter *)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188ES) ++#define IS_HARDWARE_TYPE_8188E(_Adapter) \ ++(IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || \ ++ IS_HARDWARE_TYPE_8188ES(_Adapter)) ++ ++#define GET_EEPROM_EFUSE_PRIV(adapter) (&adapter->eeprompriv) ++ ++#define is_boot_from_eeprom(adapter) (adapter->eeprompriv.EepromOrEfuse) ++ ++void rtl8188eu_set_hal_ops(struct adapter *padapter); ++void rtw_hal_def_value_init(struct adapter *padapter); ++ ++void rtw_hal_free_data(struct adapter *padapter); ++ ++void rtw_hal_dm_init(struct adapter *padapter); ++void rtw_hal_dm_deinit(struct adapter *padapter); ++void rtw_hal_sw_led_init(struct adapter *padapter); ++void rtw_hal_sw_led_deinit(struct adapter *padapter); ++ ++u32 rtw_hal_power_on(struct adapter *padapter); ++uint rtw_hal_init(struct adapter *padapter); ++uint rtw_hal_deinit(struct adapter *padapter); ++void rtw_hal_stop(struct adapter *padapter); ++void rtw_hal_set_hwreg(struct adapter *padapter, u8 variable, u8 *val); ++void rtw_hal_get_hwreg(struct adapter *padapter, u8 variable, u8 *val); ++ ++void rtw_hal_chip_configure(struct adapter *padapter); ++void rtw_hal_read_chip_info(struct adapter *padapter); ++void rtw_hal_read_chip_version(struct adapter *padapter); ++ ++u8 rtw_hal_set_def_var(struct adapter *padapter, ++ enum hal_def_variable eVariable, void *pValue); ++u8 rtw_hal_get_def_var(struct adapter *padapter, ++ enum hal_def_variable eVariable, void *pValue); ++ ++void rtw_hal_set_odm_var(struct adapter *padapter, ++ enum hal_odm_variable eVariable, void *pValue1, ++ bool bSet); ++void rtw_hal_get_odm_var(struct adapter *padapter, ++ enum hal_odm_variable eVariable, ++ void *pValue1, bool bSet); ++ ++void rtw_hal_enable_interrupt(struct adapter *padapter); ++void rtw_hal_disable_interrupt(struct adapter *padapter); ++ ++u32 rtw_hal_inirp_init(struct adapter *padapter); ++u32 rtw_hal_inirp_deinit(struct adapter *padapter); ++ ++u8 rtw_hal_intf_ps_func(struct adapter *padapter, ++ enum hal_intf_ps_func efunc_id, u8 *val); ++s32 rtw_hal_xmitframe_enqueue(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++ ++s32 rtw_hal_xmit(struct adapter *padapter, struct xmit_frame *pxmitframe); ++s32 rtw_hal_mgnt_xmit(struct adapter *padapter, ++ struct xmit_frame *pmgntframe); ++ ++s32 rtw_hal_init_xmit_priv(struct adapter *padapter); ++ ++s32 rtw_hal_init_recv_priv(struct adapter *padapter); ++void rtw_hal_free_recv_priv(struct adapter *padapter); ++ ++void rtw_hal_update_ra_mask(struct adapter *padapter, u32 mac_id, u8 level); ++void rtw_hal_add_ra_tid(struct adapter *adapt, u32 bitmap, u8 arg, u8 level); ++void rtw_hal_clone_data(struct adapter *dst_adapt, ++ struct adapter *src_adapt); ++void rtw_hal_start_thread(struct adapter *padapter); ++void rtw_hal_stop_thread(struct adapter *padapter); ++ ++void rtw_hal_bcn_related_reg_setting(struct adapter *padapter); ++ ++u32 rtw_hal_read_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask); ++void rtw_hal_write_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask, ++ u32 Data); ++u32 rtw_hal_read_rfreg(struct adapter *padapter, enum rf_radio_path eRFPath, ++ u32 RegAddr, u32 BitMask); ++void rtw_hal_write_rfreg(struct adapter *padapter, ++ enum rf_radio_path eRFPath, u32 RegAddr, ++ u32 BitMask, u32 Data); ++ ++s32 rtw_hal_interrupt_handler(struct adapter *padapter); ++ ++void rtw_hal_set_bwmode(struct adapter *padapter, ++ enum ht_channel_width Bandwidth, u8 Offset); ++void rtw_hal_set_chan(struct adapter *padapter, u8 channel); ++void rtw_hal_dm_watchdog(struct adapter *padapter); ++ ++u8 rtw_hal_antdiv_before_linked(struct adapter *padapter); ++void rtw_hal_antdiv_rssi_compared(struct adapter *padapter, ++ struct wlan_bssid_ex *dst, ++ struct wlan_bssid_ex *src); ++ ++void rtw_hal_sreset_init(struct adapter *padapter); ++void rtw_hal_sreset_reset(struct adapter *padapter); ++void rtw_hal_sreset_reset_value(struct adapter *padapter); ++void rtw_hal_sreset_xmit_status_check(struct adapter *padapter); ++void rtw_hal_sreset_linked_status_check(struct adapter *padapter); ++u8 rtw_hal_sreset_get_wifi_status(struct adapter *padapter); ++ ++int rtw_hal_iol_cmd(struct adapter *adapter, struct xmit_frame *xmit_frame, ++ u32 max_wating_ms, u32 bndy_cnt); ++ ++void rtw_hal_notch_filter(struct adapter *adapter, bool enable); ++void rtw_hal_reset_security_engine(struct adapter *adapter); ++ ++s32 rtw_hal_c2h_handler(struct adapter *adapter, ++ struct c2h_evt_hdr *c2h_evt); ++c2h_id_filter rtw_hal_c2h_id_filter_ccx(struct adapter *adapter); ++void indicate_wx_scan_complete_event(struct adapter *padapter); ++u8 rtw_do_join(struct adapter *padapter); ++ ++#endif /* __HAL_INTF_H__ */ +diff --git a/drivers/staging/r8188eu/include/ieee80211.h b/drivers/staging/r8188eu/include/ieee80211.h +new file mode 100644 +index 000000000000..bc5b030e9c40 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/ieee80211.h +@@ -0,0 +1,1226 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __IEEE80211_H ++#define __IEEE80211_H ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "wifi.h" ++#include ++ ++#define MGMT_QUEUE_NUM 5 ++ ++#define ETH_ALEN 6 ++#define ETH_TYPE_LEN 2 ++#define PAYLOAD_TYPE_LEN 1 ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28) ++ ++/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */ ++enum { ++ RTL871X_HOSTAPD_FLUSH = 1, ++ RTL871X_HOSTAPD_ADD_STA = 2, ++ RTL871X_HOSTAPD_REMOVE_STA = 3, ++ RTL871X_HOSTAPD_GET_INFO_STA = 4, ++ /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */ ++ RTL871X_HOSTAPD_GET_WPAIE_STA = 5, ++ RTL871X_SET_ENCRYPTION = 6, ++ RTL871X_GET_ENCRYPTION = 7, ++ RTL871X_HOSTAPD_SET_FLAGS_STA = 8, ++ RTL871X_HOSTAPD_GET_RID = 9, ++ RTL871X_HOSTAPD_SET_RID = 10, ++ RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11, ++ RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12, ++ RTL871X_HOSTAPD_MLME = 13, ++ RTL871X_HOSTAPD_SCAN_REQ = 14, ++ RTL871X_HOSTAPD_STA_CLEAR_STATS = 15, ++ RTL871X_HOSTAPD_SET_BEACON = 16, ++ RTL871X_HOSTAPD_SET_WPS_BEACON = 17, ++ RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18, ++ RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19, ++ RTL871X_HOSTAPD_SET_HIDDEN_SSID = 20, ++ RTL871X_HOSTAPD_SET_MACADDR_ACL = 21, ++ RTL871X_HOSTAPD_ACL_ADD_STA = 22, ++ RTL871X_HOSTAPD_ACL_REMOVE_STA = 23, ++}; ++ ++/* STA flags */ ++#define WLAN_STA_AUTH BIT(0) ++#define WLAN_STA_ASSOC BIT(1) ++#define WLAN_STA_PS BIT(2) ++#define WLAN_STA_TIM BIT(3) ++#define WLAN_STA_PERM BIT(4) ++#define WLAN_STA_AUTHORIZED BIT(5) ++#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ ++#define WLAN_STA_SHORT_PREAMBLE BIT(7) ++#define WLAN_STA_PREAUTH BIT(8) ++#define WLAN_STA_WME BIT(9) ++#define WLAN_STA_MFP BIT(10) ++#define WLAN_STA_HT BIT(11) ++#define WLAN_STA_WPS BIT(12) ++#define WLAN_STA_MAYBE_WPS BIT(13) ++#define WLAN_STA_NONERP BIT(31) ++ ++#endif ++ ++#define IEEE_CMD_SET_WPA_PARAM 1 ++#define IEEE_CMD_SET_WPA_IE 2 ++#define IEEE_CMD_SET_ENCRYPTION 3 ++#define IEEE_CMD_MLME 4 ++ ++#define IEEE_PARAM_WPA_ENABLED 1 ++#define IEEE_PARAM_TKIP_COUNTERMEASURES 2 ++#define IEEE_PARAM_DROP_UNENCRYPTED 3 ++#define IEEE_PARAM_PRIVACY_INVOKED 4 ++#define IEEE_PARAM_AUTH_ALGS 5 ++#define IEEE_PARAM_IEEE_802_1X 6 ++#define IEEE_PARAM_WPAX_SELECT 7 ++ ++#define AUTH_ALG_OPEN_SYSTEM 0x1 ++#define AUTH_ALG_SHARED_KEY 0x2 ++#define AUTH_ALG_LEAP 0x00000004 ++ ++#define IEEE_MLME_STA_DEAUTH 1 ++#define IEEE_MLME_STA_DISASSOC 2 ++ ++#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2 ++#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3 ++#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4 ++#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5 ++#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6 ++#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7 ++ ++#define IEEE_CRYPT_ALG_NAME_LEN 16 ++ ++#define WPA_CIPHER_NONE BIT(0) ++#define WPA_CIPHER_WEP40 BIT(1) ++#define WPA_CIPHER_WEP104 BIT(2) ++#define WPA_CIPHER_TKIP BIT(3) ++#define WPA_CIPHER_CCMP BIT(4) ++ ++ ++#define WPA_SELECTOR_LEN 4 ++extern u8 RTW_WPA_OUI_TYPE[]; ++extern u16 RTW_WPA_VERSION; ++extern u8 WPA_AUTH_KEY_MGMT_NONE[]; ++extern u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[]; ++extern u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[]; ++extern u8 WPA_CIPHER_SUITE_NONE[]; ++extern u8 WPA_CIPHER_SUITE_WEP40[]; ++extern u8 WPA_CIPHER_SUITE_TKIP[]; ++extern u8 WPA_CIPHER_SUITE_WRAP[]; ++extern u8 WPA_CIPHER_SUITE_CCMP[]; ++extern u8 WPA_CIPHER_SUITE_WEP104[]; ++ ++#define RSN_HEADER_LEN 4 ++#define RSN_SELECTOR_LEN 4 ++ ++extern u16 RSN_VERSION_BSD; ++extern u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[]; ++extern u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[]; ++extern u8 RSN_CIPHER_SUITE_NONE[]; ++extern u8 RSN_CIPHER_SUITE_WEP40[]; ++extern u8 RSN_CIPHER_SUITE_TKIP[]; ++extern u8 RSN_CIPHER_SUITE_WRAP[]; ++extern u8 RSN_CIPHER_SUITE_CCMP[]; ++extern u8 RSN_CIPHER_SUITE_WEP104[]; ++ ++enum ratr_table_mode { ++ RATR_INX_WIRELESS_NGB = 0, /* BGN 40 Mhz 2SS 1SS */ ++ RATR_INX_WIRELESS_NG = 1, /* GN or N */ ++ RATR_INX_WIRELESS_NB = 2, /* BGN 20 Mhz 2SS 1SS or BN */ ++ RATR_INX_WIRELESS_N = 3, ++ RATR_INX_WIRELESS_GB = 4, ++ RATR_INX_WIRELESS_G = 5, ++ RATR_INX_WIRELESS_B = 6, ++ RATR_INX_WIRELESS_MC = 7, ++ RATR_INX_WIRELESS_AC_N = 8, ++}; ++ ++enum NETWORK_TYPE { ++ WIRELESS_INVALID = 0, ++ /* Sub-Element */ ++ WIRELESS_11B = BIT(0), /* tx:cck only, rx:cck only, hw: cck */ ++ WIRELESS_11G = BIT(1), /* tx:ofdm only, rx:ofdm & cck, hw:cck & ofdm*/ ++ WIRELESS_11_24N = BIT(3), /* tx:MCS only, rx:MCS & cck, hw:MCS & cck */ ++ ++ /* Combination */ ++ /* tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm */ ++ WIRELESS_11BG = (WIRELESS_11B | WIRELESS_11G), ++ /* tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm */ ++ WIRELESS_11G_24N = (WIRELESS_11G | WIRELESS_11_24N), ++ /* tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck */ ++ WIRELESS_11BG_24N = (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N), ++}; ++ ++#define SUPPORTED_24G_NETTYPE_MSK \ ++ (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) ++ ++#define IsSupported24G(NetType) \ ++ ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? true : false) ++ ++#define IsEnableHWCCK(NetType) \ ++ IsSupported24G(NetType) ++ ++#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) ++ ++#define IsSupportedTxCCK(NetType) \ ++ ((NetType) & (WIRELESS_11B) ? true : false) ++#define IsSupportedTxOFDM(NetType) \ ++ ((NetType) & (WIRELESS_11G) ? true : false) ++#define IsSupportedTxMCS(NetType) \ ++ ((NetType) & (WIRELESS_11_24N) ? true : false) ++ ++struct ieee_param { ++ u32 cmd; ++ u8 sta_addr[ETH_ALEN]; ++ union { ++ struct { ++ u8 name; ++ u32 value; ++ } wpa_param; ++ struct { ++ u32 len; ++ u8 reserved[32]; ++ u8 data[0]; ++ } wpa_ie; ++ struct { ++ int command; ++ int reason_code; ++ } mlme; ++ struct { ++ u8 alg[IEEE_CRYPT_ALG_NAME_LEN]; ++ u8 set_tx; ++ u32 err; ++ u8 idx; ++ u8 seq[8]; /* sequence counter (set: RX, get: TX) */ ++ u16 key_len; ++ u8 key[0]; ++ } crypt; ++#ifdef CONFIG_88EU_AP_MODE ++ struct { ++ u16 aid; ++ u16 capability; ++ int flags; ++ u8 tx_supp_rates[16]; ++ struct ieee80211_ht_cap ht_cap; ++ } add_sta; ++ struct { ++ u8 reserved[2];/* for set max_num_sta */ ++ u8 buf[0]; ++ } bcn_ie; ++#endif ++ ++ } u; ++}; ++ ++#ifdef CONFIG_88EU_AP_MODE ++struct ieee_param_ex { ++ u32 cmd; ++ u8 sta_addr[ETH_ALEN]; ++ u8 data[0]; ++}; ++ ++struct sta_data { ++ u16 aid; ++ u16 capability; ++ int flags; ++ u32 sta_set; ++ u8 tx_supp_rates[16]; ++ u32 tx_supp_rates_len; ++ struct ieee80211_ht_cap ht_cap; ++ u64 rx_pkts; ++ u64 rx_bytes; ++ u64 rx_drops; ++ u64 tx_pkts; ++ u64 tx_bytes; ++ u64 tx_drops; ++}; ++#endif ++ ++#define IEEE80211_DATA_LEN 2304 ++/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section ++ 6.2.1.1.2. ++ ++ The figure in section 7.1.2 suggests a body size of up to 2312 ++ bytes is allowed, which is a bit confusing, I suspect this ++ represents the 2304 bytes of real data, plus a possible 8 bytes of ++ WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ ++ ++#define IEEE80211_HLEN 30 ++#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) ++ ++/* this is stolen from ipw2200 driver */ ++#define IEEE_IBSS_MAC_HASH_SIZE 31 ++ ++struct ieee_ibss_seq { ++ u8 mac[ETH_ALEN]; ++ u16 seq_num; ++ u16 frag_num; ++ unsigned long packet_time; ++ struct list_head list; ++}; ++ ++struct rtw_ieee80211_hdr { ++ __le16 frame_ctl; ++ __le16 duration_id; ++ u8 addr1[ETH_ALEN]; ++ u8 addr2[ETH_ALEN]; ++ u8 addr3[ETH_ALEN]; ++ u16 seq_ctl; ++ u8 addr4[ETH_ALEN]; ++} __packed; ++ ++struct rtw_ieee80211_hdr_3addr { ++ __le16 frame_ctl; ++ __le16 duration_id; ++ u8 addr1[ETH_ALEN]; ++ u8 addr2[ETH_ALEN]; ++ u8 addr3[ETH_ALEN]; ++ u16 seq_ctl; ++} __packed; ++ ++struct rtw_ieee80211_hdr_qos { ++ __le16 frame_ctl; ++ __le16 duration_id; ++ u8 addr1[ETH_ALEN]; ++ u8 addr2[ETH_ALEN]; ++ u8 addr3[ETH_ALEN]; ++ u16 seq_ctl; ++ u8 addr4[ETH_ALEN]; ++ u16 qc; ++} __packed; ++ ++struct rtw_ieee80211_hdr_3addr_qos { ++ __le16 frame_ctl; ++ __le16 duration_id; ++ u8 addr1[ETH_ALEN]; ++ u8 addr2[ETH_ALEN]; ++ u8 addr3[ETH_ALEN]; ++ u16 seq_ctl; ++ u16 qc; ++} __packed; ++ ++struct eapol { ++ u8 snap[6]; ++ u16 ethertype; ++ u8 version; ++ u8 type; ++ u16 length; ++} __packed; ++ ++enum eap_type { ++ EAP_PACKET = 0, ++ EAPOL_START, ++ EAPOL_LOGOFF, ++ EAPOL_KEY, ++ EAPOL_ENCAP_ASF_ALERT ++}; ++ ++#define IEEE80211_3ADDR_LEN 24 ++#define IEEE80211_4ADDR_LEN 30 ++#define IEEE80211_FCS_LEN 4 ++ ++#define MIN_FRAG_THRESHOLD 256U ++#define MAX_FRAG_THRESHOLD 2346U ++ ++/* Frame control field constants */ ++#define RTW_IEEE80211_FCTL_VERS 0x0003 ++#define RTW_IEEE80211_FCTL_FTYPE 0x000c ++#define RTW_IEEE80211_FCTL_STYPE 0x00f0 ++#define RTW_IEEE80211_FCTL_TODS 0x0100 ++#define RTW_IEEE80211_FCTL_FROMDS 0x0200 ++#define RTW_IEEE80211_FCTL_MOREFRAGS 0x0400 ++#define RTW_IEEE80211_FCTL_RETRY 0x0800 ++#define RTW_IEEE80211_FCTL_PM 0x1000 ++#define RTW_IEEE80211_FCTL_MOREDATA 0x2000 ++#define RTW_IEEE80211_FCTL_PROTECTED 0x4000 ++#define RTW_IEEE80211_FCTL_ORDER 0x8000 ++#define RTW_IEEE80211_FCTL_CTL_EXT 0x0f00 ++ ++#define RTW_IEEE80211_FTYPE_MGMT 0x0000 ++#define RTW_IEEE80211_FTYPE_CTL 0x0004 ++#define RTW_IEEE80211_FTYPE_DATA 0x0008 ++#define RTW_IEEE80211_FTYPE_EXT 0x000c ++ ++/* management */ ++#define RTW_IEEE80211_STYPE_ASSOC_REQ 0x0000 ++#define RTW_IEEE80211_STYPE_ASSOC_RESP 0x0010 ++#define RTW_IEEE80211_STYPE_REASSOC_REQ 0x0020 ++#define RTW_IEEE80211_STYPE_REASSOC_RESP 0x0030 ++#define RTW_IEEE80211_STYPE_PROBE_REQ 0x0040 ++#define RTW_IEEE80211_STYPE_PROBE_RESP 0x0050 ++#define RTW_IEEE80211_STYPE_BEACON 0x0080 ++#define RTW_IEEE80211_STYPE_ATIM 0x0090 ++#define RTW_IEEE80211_STYPE_DISASSOC 0x00A0 ++#define RTW_IEEE80211_STYPE_AUTH 0x00B0 ++#define RTW_IEEE80211_STYPE_DEAUTH 0x00C0 ++#define RTW_IEEE80211_STYPE_ACTION 0x00D0 ++ ++/* control */ ++#define RTW_IEEE80211_STYPE_CTL_EXT 0x0060 ++#define RTW_IEEE80211_STYPE_BACK_REQ 0x0080 ++#define RTW_IEEE80211_STYPE_BACK 0x0090 ++#define RTW_IEEE80211_STYPE_PSPOLL 0x00A0 ++#define RTW_IEEE80211_STYPE_RTS 0x00B0 ++#define RTW_IEEE80211_STYPE_CTS 0x00C0 ++#define RTW_IEEE80211_STYPE_ACK 0x00D0 ++#define RTW_IEEE80211_STYPE_CFEND 0x00E0 ++#define RTW_IEEE80211_STYPE_CFENDACK 0x00F0 ++ ++/* data */ ++#define RTW_IEEE80211_STYPE_DATA 0x0000 ++#define RTW_IEEE80211_STYPE_DATA_CFACK 0x0010 ++#define RTW_IEEE80211_STYPE_DATA_CFPOLL 0x0020 ++#define RTW_IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 ++#define RTW_IEEE80211_STYPE_NULLFUNC 0x0040 ++#define RTW_IEEE80211_STYPE_CFACK 0x0050 ++#define RTW_IEEE80211_STYPE_CFPOLL 0x0060 ++#define RTW_IEEE80211_STYPE_CFACKPOLL 0x0070 ++#define RTW_IEEE80211_STYPE_QOS_DATA 0x0080 ++#define RTW_IEEE80211_STYPE_QOS_DATA_CFACK 0x0090 ++#define RTW_IEEE80211_STYPE_QOS_DATA_CFPOLL 0x00A0 ++#define RTW_IEEE80211_STYPE_QOS_DATA_CFACKPOLL 0x00B0 ++#define RTW_IEEE80211_STYPE_QOS_NULLFUNC 0x00C0 ++#define RTW_IEEE80211_STYPE_QOS_CFACK 0x00D0 ++#define RTW_IEEE80211_STYPE_QOS_CFPOLL 0x00E0 ++#define RTW_IEEE80211_STYPE_QOS_CFACKPOLL 0x00F0 ++ ++/* sequence control field */ ++#define RTW_IEEE80211_SCTL_FRAG 0x000F ++#define RTW_IEEE80211_SCTL_SEQ 0xFFF0 ++ ++#define RTW_ERP_INFO_NON_ERP_PRESENT BIT(0) ++#define RTW_ERP_INFO_USE_PROTECTION BIT(1) ++#define RTW_ERP_INFO_BARKER_PREAMBLE_MODE BIT(2) ++ ++/* QoS, QOS */ ++#define NORMAL_ACK 0 ++#define NO_ACK 1 ++#define NON_EXPLICIT_ACK 2 ++#define BLOCK_ACK 3 ++ ++#ifndef ETH_P_PAE ++#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ ++#endif /* ETH_P_PAE */ ++ ++#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ ++ ++#define ETH_P_ECONET 0x0018 ++ ++#ifndef ETH_P_80211_RAW ++#define ETH_P_80211_RAW (ETH_P_ECONET + 1) ++#endif ++ ++/* IEEE 802.11 defines */ ++ ++#define P80211_OUI_LEN 3 ++ ++struct ieee80211_snap_hdr { ++ u8 dsap; /* always 0xAA */ ++ u8 ssap; /* always 0xAA */ ++ u8 ctrl; /* always 0x03 */ ++ u8 oui[P80211_OUI_LEN]; /* organizational universal id */ ++} __packed; ++ ++#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) ++ ++#define WLAN_FC_GET_TYPE(fc) ((fc) & RTW_IEEE80211_FCTL_FTYPE) ++#define WLAN_FC_GET_STYPE(fc) ((fc) & RTW_IEEE80211_FCTL_STYPE) ++ ++#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f) ++ ++#define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTW_IEEE80211_SCTL_FRAG) ++#define WLAN_GET_SEQ_SEQ(seq) ((seq) & RTW_IEEE80211_SCTL_SEQ) ++ ++/* Authentication algorithms */ ++#define WLAN_AUTH_OPEN 0 ++#define WLAN_AUTH_SHARED_KEY 1 ++ ++#define WLAN_AUTH_CHALLENGE_LEN 128 ++ ++#define WLAN_CAPABILITY_BSS (1<<0) ++#define WLAN_CAPABILITY_IBSS (1<<1) ++#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) ++#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) ++#define WLAN_CAPABILITY_PRIVACY (1<<4) ++#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) ++#define WLAN_CAPABILITY_PBCC (1<<6) ++#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) ++#define WLAN_CAPABILITY_SHORT_SLOT (1<<10) ++ ++/* Status codes */ ++#define WLAN_STATUS_SUCCESS 0 ++#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 ++#define WLAN_STATUS_CAPS_UNSUPPORTED 10 ++#define WLAN_STATUS_REASSOC_NO_ASSOC 11 ++#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 ++#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 ++#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 ++#define WLAN_STATUS_CHALLENGE_FAIL 15 ++#define WLAN_STATUS_AUTH_TIMEOUT 16 ++#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 ++#define WLAN_STATUS_ASSOC_DENIED_RATES 18 ++/* 802.11b */ ++#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 ++#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 ++#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 ++ ++/* Reason codes */ ++#define WLAN_REASON_UNSPECIFIED 1 ++#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 ++#define WLAN_REASON_DEAUTH_LEAVING 3 ++#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 ++#define WLAN_REASON_DISASSOC_AP_BUSY 5 ++#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 ++#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 ++#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 ++#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 ++#define WLAN_REASON_JOIN_WRONG_CHANNEL 65534 ++#define WLAN_REASON_EXPIRATION_CHK 65535 ++ ++/* Information Element IDs */ ++#define WLAN_EID_SSID 0 ++#define WLAN_EID_SUPP_RATES 1 ++#define WLAN_EID_FH_PARAMS 2 ++#define WLAN_EID_DS_PARAMS 3 ++#define WLAN_EID_CF_PARAMS 4 ++#define WLAN_EID_TIM 5 ++#define WLAN_EID_IBSS_PARAMS 6 ++#define WLAN_EID_CHALLENGE 16 ++/* EIDs defined by IEEE 802.11h - START */ ++#define WLAN_EID_PWR_CONSTRAINT 32 ++#define WLAN_EID_PWR_CAPABILITY 33 ++#define WLAN_EID_TPC_REQUEST 34 ++#define WLAN_EID_TPC_REPORT 35 ++#define WLAN_EID_SUPPORTED_CHANNELS 36 ++#define WLAN_EID_CHANNEL_SWITCH 37 ++#define WLAN_EID_MEASURE_REQUEST 38 ++#define WLAN_EID_MEASURE_REPORT 39 ++#define WLAN_EID_QUITE 40 ++#define WLAN_EID_IBSS_DFS 41 ++/* EIDs defined by IEEE 802.11h - END */ ++#define WLAN_EID_ERP_INFO 42 ++#define WLAN_EID_HT_CAP 45 ++#define WLAN_EID_RSN 48 ++#define WLAN_EID_EXT_SUPP_RATES 50 ++#define WLAN_EID_MOBILITY_DOMAIN 54 ++#define WLAN_EID_FAST_BSS_TRANSITION 55 ++#define WLAN_EID_TIMEOUT_INTERVAL 56 ++#define WLAN_EID_RIC_DATA 57 ++#define WLAN_EID_HT_OPERATION 61 ++#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 ++#define WLAN_EID_20_40_BSS_COEXISTENCE 72 ++#define WLAN_EID_20_40_BSS_INTOLERANT 73 ++#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 ++#define WLAN_EID_MMIE 76 ++#define WLAN_EID_VENDOR_SPECIFIC 221 ++#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC) ++ ++#define IEEE80211_MGMT_HDR_LEN 24 ++#define IEEE80211_DATA_HDR3_LEN 24 ++#define IEEE80211_DATA_HDR4_LEN 30 ++ ++#define IEEE80211_STATMASK_SIGNAL (1<<0) ++#define IEEE80211_STATMASK_RSSI (1<<1) ++#define IEEE80211_STATMASK_NOISE (1<<2) ++#define IEEE80211_STATMASK_RATE (1<<3) ++#define IEEE80211_STATMASK_WEMASK 0x7 ++ ++#define IEEE80211_CCK_MODULATION (1<<0) ++#define IEEE80211_OFDM_MODULATION (1<<1) ++ ++#define IEEE80211_24GHZ_BAND (1<<0) ++#define IEEE80211_52GHZ_BAND (1<<1) ++ ++#define IEEE80211_CCK_RATE_LEN 4 ++#define IEEE80211_NUM_OFDM_RATESLEN 8 ++ ++#define IEEE80211_CCK_RATE_1MB 0x02 ++#define IEEE80211_CCK_RATE_2MB 0x04 ++#define IEEE80211_CCK_RATE_5MB 0x0B ++#define IEEE80211_CCK_RATE_11MB 0x16 ++#define IEEE80211_OFDM_RATE_LEN 8 ++#define IEEE80211_OFDM_RATE_6MB 0x0C ++#define IEEE80211_OFDM_RATE_9MB 0x12 ++#define IEEE80211_OFDM_RATE_12MB 0x18 ++#define IEEE80211_OFDM_RATE_18MB 0x24 ++#define IEEE80211_OFDM_RATE_24MB 0x30 ++#define IEEE80211_OFDM_RATE_36MB 0x48 ++#define IEEE80211_OFDM_RATE_48MB 0x60 ++#define IEEE80211_OFDM_RATE_54MB 0x6C ++#define IEEE80211_BASIC_RATE_MASK 0x80 ++ ++#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) ++#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) ++#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) ++#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) ++#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) ++#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) ++#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) ++#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) ++#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) ++#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) ++#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) ++#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) ++ ++#define IEEE80211_CCK_RATES_MASK 0x0000000F ++#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ ++ IEEE80211_CCK_RATE_2MB_MASK) ++#define IEEE80211_CCK_DEFAULT_RATES_MASK \ ++ (IEEE80211_CCK_BASIC_RATES_MASK | \ ++ IEEE80211_CCK_RATE_5MB_MASK | \ ++ IEEE80211_CCK_RATE_11MB_MASK) ++ ++#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 ++#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ ++ IEEE80211_OFDM_RATE_12MB_MASK | \ ++ IEEE80211_OFDM_RATE_24MB_MASK) ++#define IEEE80211_OFDM_DEFAULT_RATES_MASK \ ++ (IEEE80211_OFDM_BASIC_RATES_MASK | \ ++ IEEE80211_OFDM_RATE_9MB_MASK | \ ++ IEEE80211_OFDM_RATE_18MB_MASK | \ ++ IEEE80211_OFDM_RATE_36MB_MASK | \ ++ IEEE80211_OFDM_RATE_48MB_MASK | \ ++ IEEE80211_OFDM_RATE_54MB_MASK) ++#define IEEE80211_DEFAULT_RATES_MASK \ ++ (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ ++ IEEE80211_CCK_DEFAULT_RATES_MASK) ++ ++#define IEEE80211_NUM_OFDM_RATES 8 ++#define IEEE80211_NUM_CCK_RATES 4 ++#define IEEE80211_OFDM_SHIFT_MASK_A 4 ++ ++/* NOTE: This data is for statistical purposes; not all hardware provides this ++ * information for frames received. Not setting these will not cause ++ * any adverse affects. */ ++struct ieee80211_rx_stats { ++ /* u32 mac_time[2]; */ ++ s8 rssi; ++ u8 signal; ++ u8 noise; ++ u8 received_channel; ++ u16 rate; /* in 100 kbps */ ++ /* u8 control; */ ++ u8 mask; ++ u8 freq; ++ u16 len; ++}; ++ ++/* IEEE 802.11 requires that STA supports concurrent reception of at least ++ * three fragmented frames. This define can be increased to support more ++ * concurrent frames, but it should be noted that each entry can consume about ++ * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ ++#define IEEE80211_FRAG_CACHE_LEN 4 ++ ++struct ieee80211_frag_entry { ++ u32 first_frag_time; ++ uint seq; ++ uint last_frag; ++ uint qos; /* jackson */ ++ uint tid; /* jackson */ ++ struct sk_buff *skb; ++ u8 src_addr[ETH_ALEN]; ++ u8 dst_addr[ETH_ALEN]; ++}; ++ ++struct ieee80211_stats { ++ uint tx_unicast_frames; ++ uint tx_multicast_frames; ++ uint tx_fragments; ++ uint tx_unicast_octets; ++ uint tx_multicast_octets; ++ uint tx_deferred_transmissions; ++ uint tx_single_retry_frames; ++ uint tx_multiple_retry_frames; ++ uint tx_retry_limit_exceeded; ++ uint tx_discards; ++ uint rx_unicast_frames; ++ uint rx_multicast_frames; ++ uint rx_fragments; ++ uint rx_unicast_octets; ++ uint rx_multicast_octets; ++ uint rx_fcs_errors; ++ uint rx_discards_no_buffer; ++ uint tx_discards_wrong_sa; ++ uint rx_discards_undecryptable; ++ uint rx_message_in_msg_fragments; ++ uint rx_message_in_bad_msg_fragments; ++}; ++ ++struct ieee80211_softmac_stats { ++ uint rx_ass_ok; ++ uint rx_ass_err; ++ uint rx_probe_rq; ++ uint tx_probe_rs; ++ uint tx_beacons; ++ uint rx_auth_rq; ++ uint rx_auth_rs_ok; ++ uint rx_auth_rs_err; ++ uint tx_auth_rq; ++ uint no_auth_rs; ++ uint no_ass_rs; ++ uint tx_ass_rq; ++ uint rx_ass_rq; ++ uint tx_probe_rq; ++ uint reassoc; ++ uint swtxstop; ++ uint swtxawake; ++}; ++ ++#define SEC_KEY_1 (1<<0) ++#define SEC_KEY_2 (1<<1) ++#define SEC_KEY_3 (1<<2) ++#define SEC_KEY_4 (1<<3) ++#define SEC_ACTIVE_KEY (1<<4) ++#define SEC_AUTH_MODE (1<<5) ++#define SEC_UNICAST_GROUP (1<<6) ++#define SEC_LEVEL (1<<7) ++#define SEC_ENABLED (1<<8) ++ ++#define SEC_LEVEL_0 0 /* None */ ++#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ ++#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ ++#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ ++#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ ++ ++#define WEP_KEYS 4 ++#define WEP_KEY_LEN 13 ++ ++struct ieee80211_security { ++ u16 active_key:2, ++ enabled:1, ++ auth_mode:2, ++ auth_algo:4, ++ unicast_uses_group:1; ++ u8 key_sizes[WEP_KEYS]; ++ u8 keys[WEP_KEYS][WEP_KEY_LEN]; ++ u8 level; ++ u16 flags; ++} __packed; ++ ++/* ++ ++ 802.11 data frame from AP ++ ++ ,-------------------------------------------------------------------. ++Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | ++ |------|------|---------|---------|---------|------|---------|------| ++Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | ++ | | tion | (BSSID) | | | ence | data | | ++ `-------------------------------------------------------------------' ++ ++Total: 28-2340 bytes ++ ++*/ ++ ++struct ieee80211_header_data { ++ u16 frame_ctl; ++ u16 duration_id; ++ u8 addr1[6]; ++ u8 addr2[6]; ++ u8 addr3[6]; ++ u16 seq_ctrl; ++}; ++ ++#define BEACON_PROBE_SSID_ID_POSITION 12 ++ ++/* Management Frame Information Element Types */ ++#define MFIE_TYPE_SSID 0 ++#define MFIE_TYPE_RATES 1 ++#define MFIE_TYPE_FH_SET 2 ++#define MFIE_TYPE_DS_SET 3 ++#define MFIE_TYPE_CF_SET 4 ++#define MFIE_TYPE_TIM 5 ++#define MFIE_TYPE_IBSS_SET 6 ++#define MFIE_TYPE_CHALLENGE 16 ++#define MFIE_TYPE_ERP 42 ++#define MFIE_TYPE_RSN 48 ++#define MFIE_TYPE_RATES_EX 50 ++#define MFIE_TYPE_GENERIC 221 ++ ++struct ieee80211_info_element_hdr { ++ u8 id; ++ u8 len; ++} __packed; ++ ++struct ieee80211_info_element { ++ u8 id; ++ u8 len; ++ u8 data[0]; ++} __packed; ++ ++/* ++ * These are the data types that can make up management packets ++ * ++ u16 auth_algorithm; ++ u16 auth_sequence; ++ u16 beacon_interval; ++ u16 capability; ++ u8 current_ap[ETH_ALEN]; ++ u16 listen_interval; ++ struct { ++ u16 association_id:14, reserved:2; ++ } __packed; ++ u32 time_stamp[2]; ++ u16 reason; ++ u16 status; ++*/ ++ ++#define IEEE80211_DEFAULT_TX_ESSID "Penguin" ++#define IEEE80211_DEFAULT_BASIC_RATE 10 ++ ++struct ieee80211_authentication { ++ struct ieee80211_header_data header; ++ u16 algorithm; ++ u16 transaction; ++ u16 status; ++ /* struct ieee80211_info_element_hdr info_element; */ ++} __packed; ++ ++struct ieee80211_probe_response { ++ struct ieee80211_header_data header; ++ u32 time_stamp[2]; ++ u16 beacon_interval; ++ u16 capability; ++ struct ieee80211_info_element info_element; ++} __packed; ++ ++struct ieee80211_probe_request { ++ struct ieee80211_header_data header; ++} __packed; ++ ++struct ieee80211_assoc_request_frame { ++ struct rtw_ieee80211_hdr_3addr header; ++ u16 capability; ++ u16 listen_interval; ++ struct ieee80211_info_element_hdr info_element; ++} __packed; ++ ++struct ieee80211_assoc_response_frame { ++ struct rtw_ieee80211_hdr_3addr header; ++ u16 capability; ++ u16 status; ++ u16 aid; ++} __packed; ++ ++struct ieee80211_txb { ++ u8 nr_frags; ++ u8 encrypted; ++ u16 reserved; ++ u16 frag_size; ++ u16 payload_size; ++ struct sk_buff *fragments[0]; ++}; ++ ++/* SWEEP TABLE ENTRIES NUMBER*/ ++#define MAX_SWEEP_TAB_ENTRIES 42 ++#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 ++/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs ++ * only use 8, and then use extended rates for the remaining supported ++ * rates. Other APs, however, stick all of their supported rates on the ++ * main rates information element... */ ++#define MAX_RATES_LENGTH ((u8)12) ++#define MAX_RATES_EX_LENGTH ((u8)16) ++#define MAX_NETWORK_COUNT 128 ++#define MAX_CHANNEL_NUMBER 161 ++#define IEEE80211_SOFTMAC_SCAN_TIME 400 ++/* HZ / 2) */ ++#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) ++ ++#define CRC_LENGTH 4U ++ ++#define MAX_WPA_IE_LEN (256) ++#define MAX_WPS_IE_LEN (512) ++#define MAX_P2P_IE_LEN (256) ++#define MAX_WFD_IE_LEN (128) ++ ++#define NETWORK_EMPTY_ESSID (1<<0) ++#define NETWORK_HAS_OFDM (1<<1) ++#define NETWORK_HAS_CCK (1<<2) ++ ++#define IEEE80211_DTIM_MBCAST 4 ++#define IEEE80211_DTIM_UCAST 2 ++#define IEEE80211_DTIM_VALID 1 ++#define IEEE80211_DTIM_INVALID 0 ++ ++#define IEEE80211_PS_DISABLED 0 ++#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST ++#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST ++#define IW_ESSID_MAX_SIZE 32 ++/* ++join_res: ++-1: authentication fail ++-2: association fail ++> 0: TID ++*/ ++ ++enum ieee80211_state { ++ /* the card is not linked at all */ ++ IEEE80211_NOLINK = 0, ++ ++ /* IEEE80211_ASSOCIATING* are for BSS client mode ++ * the driver shall not perform RX filtering unless ++ * the state is LINKED. ++ * The driver shall just check for the state LINKED and ++ * defaults to NOLINK for ALL the other states (including ++ * LINKED_SCANNING) ++ */ ++ ++ /* the association procedure will start (wq scheduling)*/ ++ IEEE80211_ASSOCIATING, ++ IEEE80211_ASSOCIATING_RETRY, ++ ++ /* the association procedure is sending AUTH request*/ ++ IEEE80211_ASSOCIATING_AUTHENTICATING, ++ ++ /* the association procedure has successfully authentcated ++ * and is sending association request ++ */ ++ IEEE80211_ASSOCIATING_AUTHENTICATED, ++ ++ /* the link is ok. the card associated to a BSS or linked ++ * to a ibss cell or acting as an AP and creating the bss ++ */ ++ IEEE80211_LINKED, ++ ++ /* same as LINKED, but the driver shall apply RX filter ++ * rules as we are in NO_LINK mode. As the card is still ++ * logically linked, but it is doing a syncro site survey ++ * then it will be back to LINKED state. ++ */ ++ IEEE80211_LINKED_SCANNING, ++ ++}; ++ ++#define DEFAULT_MAX_SCAN_AGE (15 * HZ) ++#define DEFAULT_FTS 2346 ++ ++static inline int is_multicast_mac_addr(const u8 *addr) ++{ ++ return ((addr[0] != 0xff) && (0x01 & addr[0])); ++} ++ ++static inline int is_broadcast_mac_addr(const u8 *addr) ++{ ++ return (addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && ++ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff); ++} ++ ++#define CFG_IEEE80211_RESERVE_FCS (1<<0) ++#define CFG_IEEE80211_COMPUTE_FCS (1<<1) ++ ++struct tx_pending { ++ int frag; ++ struct ieee80211_txb *txb; ++}; ++ ++#define MAXTID 16 ++ ++#define IEEE_A (1<<0) ++#define IEEE_B (1<<1) ++#define IEEE_G (1<<2) ++#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) ++ ++/* Baron move to ieee80211.c */ ++int ieee80211_is_empty_essid(const char *essid, int essid_len); ++int ieee80211_get_hdrlen(u16 fc); ++ ++/* Action category code */ ++enum rtw_ieee80211_category { ++ RTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0, ++ RTW_WLAN_CATEGORY_QOS = 1, ++ RTW_WLAN_CATEGORY_DLS = 2, ++ RTW_WLAN_CATEGORY_BACK = 3, ++ RTW_WLAN_CATEGORY_PUBLIC = 4, /* IEEE 802.11 public action frames */ ++ RTW_WLAN_CATEGORY_RADIO_MEASUREMENT = 5, ++ RTW_WLAN_CATEGORY_FT = 6, ++ RTW_WLAN_CATEGORY_HT = 7, ++ RTW_WLAN_CATEGORY_SA_QUERY = 8, ++ RTW_WLAN_CATEGORY_TDLS = 12, ++ RTW_WLAN_CATEGORY_WMM = 17, ++ RTW_WLAN_CATEGORY_P2P = 0x7f,/* P2P action frames */ ++}; ++ ++/* SPECTRUM_MGMT action code */ ++enum rtw_ieee80211_spectrum_mgmt_actioncode { ++ RTW_WLAN_ACTION_SPCT_MSR_REQ = 0, ++ RTW_WLAN_ACTION_SPCT_MSR_RPRT = 1, ++ RTW_WLAN_ACTION_SPCT_TPC_REQ = 2, ++ RTW_WLAN_ACTION_SPCT_TPC_RPRT = 3, ++ RTW_WLAN_ACTION_SPCT_CHL_SWITCH = 4, ++ RTW_WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, ++}; ++ ++enum _PUBLIC_ACTION { ++ ACT_PUBLIC_BSSCOEXIST = 0, /* 20/40 BSS Coexistence */ ++ ACT_PUBLIC_DSE_ENABLE = 1, ++ ACT_PUBLIC_DSE_DEENABLE = 2, ++ ACT_PUBLIC_DSE_REG_LOCATION = 3, ++ ACT_PUBLIC_EXT_CHL_SWITCH = 4, ++ ACT_PUBLIC_DSE_MSR_REQ = 5, ++ ACT_PUBLIC_DSE_MSR_RPRT = 6, ++ ACT_PUBLIC_MP = 7, /* Measurement Pilot */ ++ ACT_PUBLIC_DSE_PWR_CONSTRAINT = 8, ++ ACT_PUBLIC_VENDOR = 9, /* for WIFI_DIRECT */ ++ ACT_PUBLIC_GAS_INITIAL_REQ = 10, ++ ACT_PUBLIC_GAS_INITIAL_RSP = 11, ++ ACT_PUBLIC_GAS_COMEBACK_REQ = 12, ++ ACT_PUBLIC_GAS_COMEBACK_RSP = 13, ++ ACT_PUBLIC_TDLS_DISCOVERY_RSP = 14, ++ ACT_PUBLIC_LOCATION_TRACK = 15, ++ ACT_PUBLIC_MAX ++}; ++ ++/* BACK action code */ ++enum rtw_ieee80211_back_actioncode { ++ RTW_WLAN_ACTION_ADDBA_REQ = 0, ++ RTW_WLAN_ACTION_ADDBA_RESP = 1, ++ RTW_WLAN_ACTION_DELBA = 2, ++}; ++ ++/* HT features action code */ ++enum rtw_ieee80211_ht_actioncode { ++ RTW_WLAN_ACTION_NOTIFY_CH_WIDTH = 0, ++ RTW_WLAN_ACTION_SM_PS = 1, ++ RTW_WLAN_ACTION_PSPM = 2, ++ RTW_WLAN_ACTION_PCO_PHASE = 3, ++ RTW_WLAN_ACTION_MIMO_CSI_MX = 4, ++ RTW_WLAN_ACTION_MIMO_NONCP_BF = 5, ++ RTW_WLAN_ACTION_MIMP_CP_BF = 6, ++ RTW_WLAN_ACTION_ASEL_INDICATES_FB = 7, ++ RTW_WLAN_ACTION_HI_INFO_EXCHG = 8, ++}; ++ ++/* BACK (block-ack) parties */ ++enum rtw_ieee80211_back_parties { ++ RTW_WLAN_BACK_RECIPIENT = 0, ++ RTW_WLAN_BACK_INITIATOR = 1, ++ RTW_WLAN_BACK_TIMER = 2, ++}; ++ ++#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) ++ * 00:50:F2 */ ++#define WME_OUI_TYPE 2 ++#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0 ++#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1 ++#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2 ++#define WME_VERSION 1 ++ ++#define WME_ACTION_CODE_SETUP_REQUEST 0 ++#define WME_ACTION_CODE_SETUP_RESPONSE 1 ++#define WME_ACTION_CODE_TEARDOWN 2 ++ ++#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0 ++#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1 ++#define WME_SETUP_RESPONSE_STATUS_REFUSED 3 ++ ++#define WME_TSPEC_DIRECTION_UPLINK 0 ++#define WME_TSPEC_DIRECTION_DOWNLINK 1 ++#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3 ++ ++#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ ++ ++#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ ++ ++/** ++ * enum rtw_ieee80211_channel_flags - channel flags ++ * ++ * Channel flags set by the regulatory control code. ++ * ++ * @RTW_IEEE80211_CHAN_DISABLED: This channel is disabled. ++ * @RTW_IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted ++ * on this channel. ++ * @RTW_IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel. ++ * @RTW_IEEE80211_CHAN_RADAR: Radar detection is required on this channel. ++ * @RTW_IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel ++ * is not permitted. ++ * @RTW_IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel ++ * is not permitted. ++ */ ++enum rtw_ieee80211_channel_flags { ++ RTW_IEEE80211_CHAN_DISABLED = 1<<0, ++ RTW_IEEE80211_CHAN_PASSIVE_SCAN = 1<<1, ++ RTW_IEEE80211_CHAN_NO_IBSS = 1<<2, ++ RTW_IEEE80211_CHAN_RADAR = 1<<3, ++ RTW_IEEE80211_CHAN_NO_HT40PLUS = 1<<4, ++ RTW_IEEE80211_CHAN_NO_HT40MINUS = 1<<5, ++}; ++ ++#define RTW_IEEE80211_CHAN_NO_HT40 \ ++ (RTW_IEEE80211_CHAN_NO_HT40PLUS | RTW_IEEE80211_CHAN_NO_HT40MINUS) ++ ++/* Represent channel details, subset of ieee80211_channel */ ++struct rtw_ieee80211_channel { ++ u16 hw_value; ++ u32 flags; ++}; ++ ++#define CHAN_FMT \ ++ "hw_value:%u, " \ ++ "flags:0x%08x" \ ++ ++#define CHAN_ARG(channel) \ ++ (channel)->hw_value \ ++ , (channel)->flags \ ++ ++/* Parsed Information Elements */ ++struct rtw_ieee802_11_elems { ++ u8 *ssid; ++ u8 ssid_len; ++ u8 *supp_rates; ++ u8 supp_rates_len; ++ u8 *fh_params; ++ u8 fh_params_len; ++ u8 *ds_params; ++ u8 ds_params_len; ++ u8 *cf_params; ++ u8 cf_params_len; ++ u8 *tim; ++ u8 tim_len; ++ u8 *ibss_params; ++ u8 ibss_params_len; ++ u8 *challenge; ++ u8 challenge_len; ++ u8 *erp_info; ++ u8 erp_info_len; ++ u8 *ext_supp_rates; ++ u8 ext_supp_rates_len; ++ u8 *wpa_ie; ++ u8 wpa_ie_len; ++ u8 *rsn_ie; ++ u8 rsn_ie_len; ++ u8 *wme; ++ u8 wme_len; ++ u8 *wme_tspec; ++ u8 wme_tspec_len; ++ u8 *wps_ie; ++ u8 wps_ie_len; ++ u8 *power_cap; ++ u8 power_cap_len; ++ u8 *supp_channels; ++ u8 supp_channels_len; ++ u8 *mdie; ++ u8 mdie_len; ++ u8 *ftie; ++ u8 ftie_len; ++ u8 *timeout_int; ++ u8 timeout_int_len; ++ u8 *ht_capabilities; ++ u8 ht_capabilities_len; ++ u8 *ht_operation; ++ u8 ht_operation_len; ++ u8 *vendor_ht_cap; ++ u8 vendor_ht_cap_len; ++}; ++ ++enum parse_res { ++ ParseOK = 0, ++ ParseUnknown = 1, ++ ParseFailed = -1 ++}; ++ ++enum parse_res rtw_ieee802_11_parse_elems(u8 *start, uint len, ++ struct rtw_ieee802_11_elems *elems, ++ int show_errors); ++ ++u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, ++ unsigned char *source, unsigned int *frlen); ++u8 *rtw_set_ie(u8 *pbuf, int index, uint len, u8 *source, uint *frlen); ++ ++enum secondary_ch_offset { ++ SCN = 0, /* no secondary channel */ ++ SCA = 1, /* secondary channel above */ ++ SCB = 3, /* secondary channel below */ ++}; ++u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset); ++u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset); ++u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode, ++ u8 new_ch, u8 ch_switch_cnt); ++u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, ++ u8 secondary_ch_offset); ++u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl, ++ u8 flags, u16 reason, u16 precedence); ++ ++u8 *rtw_get_ie(u8 *pbuf, int index, int *len, int limit); ++u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, ++ u8 oui_len, u8 *ie, uint *ielen); ++int rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, ++ u8 eid, u8 *oui, u8 oui_len); ++ ++void rtw_set_supported_rate(u8 *SupportedRates, uint mode); ++ ++unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit); ++unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit); ++int rtw_get_wpa_cipher_suite(u8 *s); ++int rtw_get_wpa2_cipher_suite(u8 *s); ++int rtw_get_wapi_ie(u8 *in_ie, uint in_len, u8 *wapi_ie, u16 *wapi_len); ++int rtw_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher, ++ int *pairwise_cipher, int *is_8021x); ++int rtw_parse_wpa2_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher, ++ int *pairwise_cipher, int *is_8021x); ++ ++int rtw_get_sec_ie(u8 *in_ie, uint in_len, u8 *rsn_ie, u16 *rsn_len, ++ u8 *wpa_ie, u16 *wpa_len); ++ ++u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen); ++u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); ++u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, ++ u8 *buf_attr, u32 *len_attr); ++u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, ++ u8 *buf_content, uint *len_content); ++ ++/** ++ * for_each_ie - iterate over continuous IEs ++ * @ie: ++ * @buf: ++ * @buf_len: ++ */ ++#define for_each_ie(ie, buf, buf_len) \ ++ for (ie = (void *)buf; (((u8 *)ie) - ((u8 *)buf) + 1) < buf_len; \ ++ ie = (void *)(((u8 *)ie) + *(((u8 *)ie)+1) + 2)) ++ ++void dump_ies(u8 *buf, u32 buf_len); ++void dump_wps_ie(u8 *ie, u32 ie_len); ++ ++#ifdef CONFIG_88EU_P2P ++void dump_p2p_ie(u8 *ie, u32 ie_len); ++u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen); ++u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, ++ u8 *buf_attr, u32 *len_attr); ++u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, ++ u8 *buf_content, uint *len_content); ++u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, ++ u8 *pdata_attr); ++void rtw_wlan_bssid_ex_remove_p2p_attr(struct wlan_bssid_ex *bss_ex, ++ u8 attr_id); ++#endif ++ ++uint rtw_get_rateset_len(u8 *rateset); ++ ++struct registry_priv; ++int rtw_generate_ie(struct registry_priv *pregistrypriv); ++ ++int rtw_get_bit_value_from_ieee_value(u8 val); ++ ++uint rtw_is_cckrates_included(u8 *rate); ++ ++uint rtw_is_cckratesonly_included(u8 *rate); ++ ++int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); ++ ++void rtw_get_bcn_info(struct wlan_network *pnetwork); ++ ++void rtw_macaddr_cfg(u8 *mac_addr); ++ ++u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, ++ unsigned char *MCS_rate); ++ ++int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8 *category, ++ u8 *action); ++const char *action_public_str(u8 action); ++ ++#endif /* IEEE80211_H */ +diff --git a/drivers/staging/r8188eu/include/ieee80211_ext.h b/drivers/staging/r8188eu/include/ieee80211_ext.h +new file mode 100644 +index 000000000000..e7ade835d478 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/ieee80211_ext.h +@@ -0,0 +1,271 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __IEEE80211_EXT_H ++#define __IEEE80211_EXT_H ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define WMM_OUI_TYPE 2 ++#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 ++#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 ++#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 ++#define WMM_VERSION 1 ++ ++#define WPA_PROTO_WPA BIT(0) ++#define WPA_PROTO_RSN BIT(1) ++ ++#define WPA_KEY_MGMT_IEEE8021X BIT(0) ++#define WPA_KEY_MGMT_PSK BIT(1) ++#define WPA_KEY_MGMT_NONE BIT(2) ++#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) ++#define WPA_KEY_MGMT_WPA_NONE BIT(4) ++ ++#define WPA_CAPABILITY_PREAUTH BIT(0) ++#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) ++#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) ++ ++#define PMKID_LEN 16 ++ ++struct wpa_ie_hdr { ++ u8 elem_id; ++ u8 len; ++ u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ ++ u8 version[2]; /* little endian */ ++} __packed; ++ ++struct rsn_ie_hdr { ++ u8 elem_id; /* WLAN_EID_RSN */ ++ u8 len; ++ u8 version[2]; /* little endian */ ++} __packed; ++ ++struct wme_ac_parameter { ++#if defined(__LITTLE_ENDIAN) ++ /* byte 1 */ ++ u8 aifsn:4, ++ acm:1, ++ aci:2, ++ reserved:1; ++ ++ /* byte 2 */ ++ u8 eCWmin:4, ++ eCWmax:4; ++#elif defined(__BIG_ENDIAN) ++ /* byte 1 */ ++ u8 reserved:1, ++ aci:2, ++ acm:1, ++ aifsn:4; ++ ++ /* byte 2 */ ++ u8 eCWmax:4, ++ eCWmin:4; ++#else ++#error "Please fix " ++#endif ++ ++ /* bytes 3 & 4 */ ++ u16 txopLimit; ++} __packed; ++ ++struct wme_parameter_element { ++ /* required fields for WME version 1 */ ++ u8 oui[3]; ++ u8 oui_type; ++ u8 oui_subtype; ++ u8 version; ++ u8 acInfo; ++ u8 reserved; ++ struct wme_ac_parameter ac[4]; ++ ++} __packed; ++ ++#define WPA_PUT_LE16(a, val) \ ++ do { \ ++ (a)[1] = ((u16) (val)) >> 8; \ ++ (a)[0] = ((u16) (val)) & 0xff; \ ++ } while (0) ++ ++#define WPA_PUT_BE32(a, val) \ ++ do { \ ++ (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ ++ (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ ++ (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ ++ (a)[3] = (u8) (((u32) (val)) & 0xff); \ ++ } while (0) ++ ++#define WPA_PUT_LE32(a, val) \ ++ do { \ ++ (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ ++ (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ ++ (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ ++ (a)[0] = (u8) (((u32) (val)) & 0xff); \ ++ } while (0) ++ ++#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *)(a), (val)) ++ ++/* Action category code */ ++enum ieee80211_category { ++ WLAN_CATEGORY_SPECTRUM_MGMT = 0, ++ WLAN_CATEGORY_QOS = 1, ++ WLAN_CATEGORY_DLS = 2, ++ WLAN_CATEGORY_BACK = 3, ++ WLAN_CATEGORY_HT = 7, ++ WLAN_CATEGORY_WMM = 17, ++}; ++ ++/* SPECTRUM_MGMT action code */ ++enum ieee80211_spectrum_mgmt_actioncode { ++ WLAN_ACTION_SPCT_MSR_REQ = 0, ++ WLAN_ACTION_SPCT_MSR_RPRT = 1, ++ WLAN_ACTION_SPCT_TPC_REQ = 2, ++ WLAN_ACTION_SPCT_TPC_RPRT = 3, ++ WLAN_ACTION_SPCT_CHL_SWITCH = 4, ++ WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, ++}; ++ ++/* BACK action code */ ++enum ieee80211_back_actioncode { ++ WLAN_ACTION_ADDBA_REQ = 0, ++ WLAN_ACTION_ADDBA_RESP = 1, ++ WLAN_ACTION_DELBA = 2, ++}; ++ ++/* HT features action code */ ++enum ieee80211_ht_actioncode { ++ WLAN_ACTION_NOTIFY_CH_WIDTH = 0, ++ WLAN_ACTION_SM_PS = 1, ++ WLAN_ACTION_PSPM = 2, ++ WLAN_ACTION_PCO_PHASE = 3, ++ WLAN_ACTION_MIMO_CSI_MX = 4, ++ WLAN_ACTION_MIMO_NONCP_BF = 5, ++ WLAN_ACTION_MIMP_CP_BF = 6, ++ WLAN_ACTION_ASEL_INDICATES_FB = 7, ++ WLAN_ACTION_HI_INFO_EXCHG = 8, ++}; ++ ++/* BACK (block-ack) parties */ ++enum ieee80211_back_parties { ++ WLAN_BACK_RECIPIENT = 0, ++ WLAN_BACK_INITIATOR = 1, ++ WLAN_BACK_TIMER = 2, ++}; ++ ++struct ieee80211_mgmt { ++ u16 frame_control; ++ u16 duration; ++ u8 da[6]; ++ u8 sa[6]; ++ u8 bssid[6]; ++ u16 seq_ctrl; ++ union { ++ struct { ++ u16 auth_alg; ++ u16 auth_transaction; ++ u16 status_code; ++ /* possibly followed by Challenge text */ ++ u8 variable[0]; ++ } __packed auth; ++ struct { ++ u16 reason_code; ++ } __packed deauth; ++ struct { ++ u16 capab_info; ++ u16 listen_interval; ++ /* followed by SSID and Supported rates */ ++ u8 variable[0]; ++ } __packed assoc_req; ++ struct { ++ u16 capab_info; ++ u16 status_code; ++ u16 aid; ++ /* followed by Supported rates */ ++ u8 variable[0]; ++ } __packed assoc_resp, reassoc_resp; ++ struct { ++ u16 capab_info; ++ u16 listen_interval; ++ u8 current_ap[6]; ++ /* followed by SSID and Supported rates */ ++ u8 variable[0]; ++ } __packed reassoc_req; ++ struct { ++ u16 reason_code; ++ } __packed disassoc; ++ struct { ++ __le64 timestamp; ++ u16 beacon_int; ++ u16 capab_info; ++ /* followed by some of SSID, Supported rates, ++ * FH Params, DS Params, CF Params, IBSS Params, TIM */ ++ u8 variable[0]; ++ } __packed beacon; ++ struct { ++ /* only variable items: SSID, Supported rates */ ++ u8 variable[0]; ++ } __packed probe_req; ++ struct { ++ __le64 timestamp; ++ u16 beacon_int; ++ u16 capab_info; ++ /* followed by some of SSID, Supported rates, ++ * FH Params, DS Params, CF Params, IBSS Params */ ++ u8 variable[0]; ++ } __packed probe_resp; ++ struct { ++ u8 category; ++ union { ++ struct { ++ u8 action_code; ++ u8 dialog_token; ++ u8 status_code; ++ u8 variable[0]; ++ } __packed wme_action; ++ struct { ++ u8 action_code; ++ u8 dialog_token; ++ u16 capab; ++ u16 timeout; ++ u16 start_seq_num; ++ } __packed addba_req; ++ struct { ++ u8 action_code; ++ u8 dialog_token; ++ u16 status; ++ u16 capab; ++ u16 timeout; ++ } __packed addba_resp; ++ struct { ++ u8 action_code; ++ u16 params; ++ u16 reason_code; ++ } __packed delba; ++ structi { ++ u8 action_code; ++ /* capab_info for open and confirm, ++ * reason for close ++ */ ++ u16 aux; ++ /* Followed in plink_confirm by status ++ * code, AID and supported rates, ++ * and directly by supported rates in ++ * plink_open and plink_close ++ */ ++ u8 variable[0]; ++ } __packed plink_action; ++ struct{ ++ u8 action_code; ++ u8 variable[0]; ++ } __packed mesh_action; ++ } __packed u; ++ } __packed action; ++ } __packed u; ++} __packed; ++ ++/* mgmt header + 1 byte category code */ ++#define IEEE80211_MIN_ACTION_SIZE \ ++ FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/ioctl_cfg80211.h b/drivers/staging/r8188eu/include/ioctl_cfg80211.h +new file mode 100644 +index 000000000000..e22481050ef8 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/ioctl_cfg80211.h +@@ -0,0 +1,91 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. i*/ ++ ++#ifndef __IOCTL_CFG80211_H__ ++#define __IOCTL_CFG80211_H__ ++ ++struct rtw_wdev_invit_info { ++ u8 token; ++ u8 flags; ++ u8 status; ++ u8 req_op_ch; ++ u8 rsp_op_ch; ++}; ++ ++#define rtw_wdev_invit_info_init(invit_info) \ ++ do { \ ++ (invit_info)->token = 0; \ ++ (invit_info)->flags = 0x00; \ ++ (invit_info)->status = 0xff; \ ++ (invit_info)->req_op_ch = 0; \ ++ (invit_info)->rsp_op_ch = 0; \ ++ } while (0) ++ ++struct rtw_wdev_priv { ++ struct wireless_dev *rtw_wdev; ++ ++ struct adapter *padapter; ++ ++ struct cfg80211_scan_request *scan_request; ++ spinlock_t scan_req_lock; ++ ++ struct net_device *pmon_ndev;/* for monitor interface */ ++ char ifname_mon[IFNAMSIZ + 1]; /* name of monitor interface */ ++ ++ u8 p2p_enabled; ++ ++ u8 provdisc_req_issued; ++ ++ struct rtw_wdev_invit_info invit_info; ++ ++ u8 bandroid_scan; ++ bool block; ++ bool power_mgmt; ++}; ++ ++#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w))) ++ ++#define wiphy_to_wdev(x) \ ++((struct wireless_dev *)(((struct rtw_wdev_priv *)wiphy_priv(x))->rtw_wdev)) ++ ++int rtw_wdev_alloc(struct adapter *padapter, struct device *dev); ++void rtw_wdev_free(struct wireless_dev *wdev); ++void rtw_wdev_unregister(struct wireless_dev *wdev); ++ ++void rtw_cfg80211_init_wiphy(struct adapter *padapter); ++ ++void rtw_cfg80211_surveydone_event_callback(struct adapter *padapter); ++ ++void rtw_cfg80211_indicate_connect(struct adapter *padapter); ++void rtw_cfg80211_indicate_disconnect(struct adapter *padapter); ++void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, ++ bool aborted); ++ ++#ifdef CONFIG_88EU_AP_MODE ++void rtw_cfg80211_indicate_sta_assoc(struct adapter *padapter, ++ u8 *pmgmt_frame, uint frame_len); ++void rtw_cfg80211_indicate_sta_disassoc(struct adapter *padapter, ++ unsigned char *da, ++ unsigned short reason); ++#endif /* CONFIG_88EU_AP_MODE */ ++ ++void rtw_cfg80211_issue_p2p_provision_request(struct adapter *padapter, ++ const u8 *buf, size_t len); ++void rtw_cfg80211_rx_p2p_action_public(struct adapter *padapter, ++ u8 *pmgmt_frame, uint frame_len); ++void rtw_cfg80211_rx_action_p2p(struct adapter *padapter, u8 *pmgmt_frame, ++ uint frame_len); ++void rtw_cfg80211_rx_action(struct adapter *adapter, u8 *frame, ++ uint frame_len, const char *msg); ++ ++int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, ++ char *buf, int len, int type); ++ ++bool rtw_cfg80211_pwr_mgmt(struct adapter *adapter); ++ ++#define rtw_cfg80211_rx_mgmt(dev, freq, sig_dbm, buf, len, gfp) \ ++ cfg80211_rx_mgmt(dev, freq, sig_dbm, buf, len, gfp) ++#define rtw_cfg80211_send_rx_assoc(dev, bss, buf, len) \ ++ cfg80211_send_rx_assoc(dev, bss, buf, len) ++ ++#endif /* __IOCTL_CFG80211_H__ */ +diff --git a/drivers/staging/r8188eu/include/mlme_osdep.h b/drivers/staging/r8188eu/include/mlme_osdep.h +new file mode 100644 +index 000000000000..5b9f688f9424 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/mlme_osdep.h +@@ -0,0 +1,19 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __MLME_OSDEP_H_ ++#define __MLME_OSDEP_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++void rtw_init_mlme_timer(struct adapter *padapter); ++void rtw_os_indicate_disconnect(struct adapter *adapter); ++void rtw_os_indicate_connect(struct adapter *adapter); ++void rtw_os_indicate_scan_done(struct adapter *padapter, bool aborted); ++void rtw_report_sec_ie(struct adapter *adapter, u8 authmode, u8 *sec_ie); ++ ++void rtw_reset_securitypriv(struct adapter *adapter); ++void indicate_wx_scan_complete_event(struct adapter *padapter); ++ ++#endif /* _MLME_OSDEP_H_ */ +diff --git a/drivers/staging/r8188eu/include/mp_custom_oid.h b/drivers/staging/r8188eu/include/mp_custom_oid.h +new file mode 100644 +index 000000000000..7bcb857c795d +--- /dev/null ++++ b/drivers/staging/r8188eu/include/mp_custom_oid.h +@@ -0,0 +1,333 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __CUSTOM_OID_H ++#define __CUSTOM_OID_H ++ ++/* by Owen */ ++/* 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit */ ++/* 0xFF818500 - 0xFF81850F RTL8185 Setup Utility */ ++/* 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility */ ++ ++/* */ ++ ++/* by Owen for Production Kit */ ++/* For Production Kit with Agilent Equipments */ ++/* in order to make our custom oids hopefully somewhat unique */ ++/* we will use 0xFF (indicating implementation specific OID) */ ++/* 81(first byte of non zero Realtek unique identifier) */ ++/* 80 (second byte of non zero Realtek unique identifier) */ ++/* XX (the custom OID number - providing 255 possible custom oids) */ ++ ++#define OID_RT_PRO_RESET_DUT 0xFF818000 ++#define OID_RT_PRO_SET_DATA_RATE 0xFF818001 ++#define OID_RT_PRO_START_TEST 0xFF818002 ++#define OID_RT_PRO_STOP_TEST 0xFF818003 ++#define OID_RT_PRO_SET_PREAMBLE 0xFF818004 ++#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005 ++#define OID_RT_PRO_SET_FILTER_BB 0xFF818006 ++#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007 ++#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008 ++#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009 ++#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A ++ ++#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D ++#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E ++#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F ++#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010 ++#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011 ++#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012 ++#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013 ++#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014 ++#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015 ++#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016 ++#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017 ++#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018 ++#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019 ++#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A ++#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B ++#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C ++#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D ++#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E ++#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F ++#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020 ++#define OID_RT_PRO_WRITE_EEPROM 0xFF818021 ++#define OID_RT_PRO_READ_EEPROM 0xFF818022 ++#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023 ++#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024 ++#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025 ++#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026 ++#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027 ++#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028 ++#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029 ++#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A ++#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C ++/* added by Owen on 04/08/03 for Cameo's request */ ++#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D ++#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E ++#define OID_RT_PRO_SET_MODULATION 0xFF81802F ++/* */ ++ ++/* Sean */ ++#define OID_RT_DRIVER_OPTION 0xFF818080 ++#define OID_RT_RF_OFF 0xFF818081 ++#define OID_RT_AUTH_STATUS 0xFF818082 ++ ++/* */ ++#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B ++#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C ++#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B ++#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043 ++/* */ ++ ++/* by Owen for RTL8185 Phy Status Report Utility */ ++#define OID_RT_UTILITY_false_ALARM_COUNTERS 0xFF818580 ++#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581 ++#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582 ++#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583 ++#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584 ++#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS \ ++ 0xFF818585 ++#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586 ++/* */ ++ ++/* by Owen on 03/09/19-03/09/22 for RTL8185 */ ++#define OID_RT_WIRELESS_MODE 0xFF818500 ++#define OID_RT_SUPPORTED_RATES 0xFF818501 ++#define OID_RT_DESIRED_RATES 0xFF818502 ++#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503 ++/* */ ++ ++#define OID_RT_GET_CONNECT_STATE 0xFF030001 ++#define OID_RT_RESCAN 0xFF030002 ++#define OID_RT_SET_KEY_LENGTH 0xFF030003 ++#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004 ++ ++#define OID_RT_SET_CHANNEL 0xFF010182 ++#define OID_RT_SET_SNIFFER_MODE 0xFF010183 ++#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184 ++#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185 ++#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186 ++#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187 ++#define OID_RT_GET_TX_RETRY 0xFF010188 ++#define OID_RT_GET_RX_RETRY 0xFF010189 ++#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A/* S */ ++#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B/* S */ ++ ++#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190 ++#define OID_RT_GET_TX_BEACON_OK 0xFF010191 ++#define OID_RT_GET_TX_BEACON_ERR 0xFF010192 ++#define OID_RT_GET_RX_ICV_ERR 0xFF010193 ++#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194 ++#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195 ++#define OID_RT_GET_PREAMBLE_MODE 0xFF010196 ++#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197 ++#define OID_RT_GET_AP_IP 0xFF010198 ++#define OID_RT_GET_CHANNELPLAN 0xFF010199 ++#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A ++#define OID_RT_SET_BCN_INTVL 0xFF01019B ++#define OID_RT_GET_RF_VENDER 0xFF01019C ++#define OID_RT_DEDICATE_PROBE 0xFF01019D ++#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E ++ ++#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F ++ ++#define OID_RT_GET_CCA_ERR 0xFF0101A0 ++#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1 ++#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2 ++ ++#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3 ++#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4 ++ ++/* by Owen on 03/31/03 for Cameo's request */ ++#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5 ++/* */ ++#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5 ++#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6 ++#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7 ++#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8 ++#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9 ++#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA ++#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB ++#define OID_RT_GET_CHANNEL 0xFF0101AC ++ ++#define OID_RT_SET_CHANNELPLAN 0xFF0101AD ++#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE ++#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF ++#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0 ++#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1 ++#define OID_RT_GET_IS_ROAMING 0xFF0101B2 ++#define OID_RT_GET_IS_PRIVACY 0xFF0101B3 ++#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4 ++#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5 ++#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6 ++#define OID_RT_RESET_LOG 0xFF0101B7 ++#define OID_RT_GET_LOG 0xFF0101B8 ++#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9 ++#define OID_RT_GET_HEADER_FAIL 0xFF0101BA ++#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB ++#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC ++#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD ++#define OID_RT_GET_TX_INFO 0xFF0101BE ++#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF ++#define OID_RT_RF_READ_WRITE 0xFF0101C0 ++ ++/* For Netgear request. 2005.01.13, by rcnjko. */ ++#define OID_RT_FORCED_DATA_RATE 0xFF0101C1 ++#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2 ++/* For Netgear request. 2005.02.17, by rcnjko. */ ++#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3 ++/* For AZ project. 2005.06.27, by rcnjko. */ ++#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4 ++ ++/* Vincent 8185MP */ ++#define OID_RT_PRO_RX_FILTER 0xFF0111C0 ++ ++#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1 ++#define OID_CE_USB_READ_REGISTRY 0xFF0111C2 ++ ++#define OID_RT_PRO_SET_INITIAL_GA 0xFF0111C3 ++#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4 ++#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5 ++#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6 ++#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7 ++#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8 ++#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9 ++#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA ++ ++/* AP OID */ ++#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300 ++#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301 ++#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302 ++#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303 ++/* Determine if driver supports AP mode. */ ++#define OID_RT_AP_SUPPORTED 0xFF010304 ++/* Set WPA-PSK passphrase into authenticator. */ ++#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 ++ ++/* 8187MP. 2004.09.06, by rcnjko. */ ++#define OID_RT_PRO8187_WI_POLL 0xFF818780 ++#define OID_RT_PRO_WRITE_BB_REG 0xFF818781 ++#define OID_RT_PRO_READ_BB_REG 0xFF818782 ++#define OID_RT_PRO_WRITE_RF_REG 0xFF818783 ++#define OID_RT_PRO_READ_RF_REG 0xFF818784 ++ ++/* Meeting House. added by Annie, 2005-07-20. */ ++#define OID_RT_MH_VENDER_ID 0xFFEDC100 ++ ++/* 8711 MP OID added 20051230. */ ++#define OID_RT_PRO8711_JOIN_BSS 0xFF871100/* S */ ++ ++#define OID_RT_PRO_READ_REGISTER 0xFF871101 /* Q */ ++#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 /* S */ ++ ++#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 /* Q */ ++#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 /* S */ ++ ++#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 /* S */ ++ ++#define OID_RT_PRO_READ16_EEPROM 0xFF871106 /* Q */ ++#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 /* S */ ++ ++#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 /* S */ ++#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 /* Q */ ++ ++#define OID_RT_PRO8711_WI_POLL 0xFF87110A /* Q */ ++#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B /* Q */ ++#define OID_RT_RD_ATTRIB_MEM 0xFF87110C/* Q */ ++#define OID_RT_WR_ATTRIB_MEM 0xFF87110D/* S */ ++ ++/* Method 2 for H2C/C2H */ ++#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 /* S */ ++#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 /* Q */ ++#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 /* S */ ++#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 /* Q */ ++#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114/* Q */ ++ ++#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 /* Q, S */ ++ ++#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 /* S */ ++#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 /* Q,S */ ++#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 /* Q */ ++#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 /* Q */ ++ ++#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A /* S */ ++#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B /* Q */ ++#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C /* S */ ++#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D /* Q */ ++#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E /* S */ ++#define OID_RT_POLL_RX_STATUS 0xFF87111F /* Q */ ++ ++#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 /* Q,S */ ++#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121/* S */ ++#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122/* S */ ++#define OID_RT_PRO_READ_TSSI 0xFF871123/* S */ ++#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124/* S */ ++ ++#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 /* Q */ ++#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 /* S */ ++ ++/* Method 2 , using workitem */ ++#define OID_RT_SET_READ_REG 0xFF871181 /* S */ ++#define OID_RT_SET_WRITE_REG 0xFF871182 /* S */ ++#define OID_RT_SET_BURST_READ_REG 0xFF871183 /* S */ ++#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 /* S */ ++#define OID_RT_SET_WRITE_TXCMD 0xFF871185 /* S */ ++#define OID_RT_SET_READ16_EEPROM 0xFF871186 /* S */ ++#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 /* S */ ++#define OID_RT_QRY_POLL_WKITEM 0xFF871188 /* Q */ ++ ++/* For SDIO INTERFACE only */ ++#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 /* Q, S */ ++#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1 ++ ++/* For USB INTERFACE only */ ++#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 /* Q, S */ ++#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 /* S */ ++#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 /* S */ ++#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 /* Q */ ++#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 /* Q */ ++ ++#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB /* S */ ++#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC /* S */ ++#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE ++ ++#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 /* Q, S */ ++#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 /* S */ ++#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 /* S */ ++#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 /* Q */ ++ ++#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 /* Q, S */ ++ ++#define OID_RT_PRO_READ_EFUSE 0xFF871205 /* Q */ ++#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 /* S */ ++#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 /* Q, S */ ++#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 /* Q */ ++ ++#define OID_RT_SET_BANDWIDTH 0xFF871209 /* S */ ++#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A /* S */ ++ ++#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B /* S */ ++ ++#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C /* Q */ ++ ++#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D /* S */ ++ ++#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E /* S */ ++ ++#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F /* S */ ++ ++#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 /* Q */ ++ ++#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 /* S */ ++#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 /* Q */ ++#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 /* Q */ ++ ++#define OID_RT_SET_POWER_DOWN 0xFF871214 /* S */ ++ ++#define OID_RT_GET_POWER_MODE 0xFF871215 /* Q */ ++ ++#define OID_RT_PRO_EFUSE 0xFF871216 /* Q, S */ ++#define OID_RT_PRO_EFUSE_MAP 0xFF871217 /* Q, S */ ++ ++#endif /* ifndef __CUSTOM_OID_H */ +diff --git a/drivers/staging/r8188eu/include/odm.h b/drivers/staging/r8188eu/include/odm.h +new file mode 100644 +index 000000000000..d9041ee576bb +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm.h +@@ -0,0 +1,1154 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HALDMOUTSRC_H__ ++#define __HALDMOUTSRC_H__ ++ ++/* Definition */ ++/* Define all team support ability. */ ++ ++/* Define for all teams. Please Define the constant in your precomp header. */ ++ ++/* define DM_ODM_SUPPORT_AP 0 */ ++/* define DM_ODM_SUPPORT_ADSL 0 */ ++/* define DM_ODM_SUPPORT_CE 0 */ ++/* define DM_ODM_SUPPORT_MP 1 */ ++ ++/* Define ODM SW team support flag. */ ++ ++/* Antenna Switch Relative Definition. */ ++ ++/* Add new function SwAntDivCheck8192C(). */ ++/* This is the main function of Antenna diversity function before link. */ ++/* Mainly, it just retains last scan result and scan again. */ ++/* After that, it compares the scan result to see which one gets better ++ * RSSI. It selects antenna with better receiving power and returns better ++ * scan result. */ ++ ++#define TP_MODE 0 ++#define RSSI_MODE 1 ++#define TRAFFIC_LOW 0 ++#define TRAFFIC_HIGH 1 ++ ++/* 3 Tx Power Tracking */ ++/* 3============================================================ */ ++#define DPK_DELTA_MAPPING_NUM 13 ++#define index_mapping_HP_NUM 15 ++ ++/* */ ++/* 3 PSD Handler */ ++/* 3============================================================ */ ++ ++#define AFH_PSD 1 /* 0:normal PSD scan, 1: only do 20 pts PSD */ ++#define MODE_40M 0 /* 0:20M, 1:40M */ ++#define PSD_TH2 3 ++#define PSD_CHM 20 /* Minimum channel number for BT AFH */ ++#define SIR_STEP_SIZE 3 ++#define Smooth_Size_1 5 ++#define Smooth_TH_1 3 ++#define Smooth_Size_2 10 ++#define Smooth_TH_2 4 ++#define Smooth_Size_3 20 ++#define Smooth_TH_3 4 ++#define Smooth_Step_Size 5 ++#define Adaptive_SIR 1 ++#define PSD_RESCAN 4 ++#define PSD_SCAN_INTERVAL 700 /* ms */ ++ ++/* 8723A High Power IGI Setting */ ++#define DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22 ++#define DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28 ++#define DM_DIG_HIGH_PWR_THRESHOLD 0x3a ++ ++/* LPS define */ ++#define DM_DIG_FA_TH0_LPS 4 /* 4 in lps */ ++#define DM_DIG_FA_TH1_LPS 15 /* 15 lps */ ++#define DM_DIG_FA_TH2_LPS 30 /* 30 lps */ ++#define RSSI_OFFSET_DIG 0x05; ++ ++/* ANT Test */ ++#define ANTTESTALL 0x00 /* Ant A or B will be Testing */ ++#define ANTTESTA 0x01 /* Ant A will be Testing */ ++#define ANTTESTB 0x02 /* Ant B will be testing */ ++ ++/* structure and define */ ++ ++/* Add for AP/ADSLpseudo DM structuer requirement. */ ++/* We need to remove to other position??? */ ++struct rtl8192cd_priv { ++ u8 temp; ++}; ++ ++struct rtw_dig { ++ u8 Dig_Enable_Flag; ++ u8 Dig_Ext_Port_Stage; ++ ++ int RssiLowThresh; ++ int RssiHighThresh; ++ ++ u32 FALowThresh; ++ u32 FAHighThresh; ++ ++ u8 CurSTAConnectState; ++ u8 PreSTAConnectState; ++ u8 CurMultiSTAConnectState; ++ ++ u8 PreIGValue; ++ u8 CurIGValue; ++ u8 BackupIGValue; ++ ++ s8 BackoffVal; ++ s8 BackoffVal_range_max; ++ s8 BackoffVal_range_min; ++ u8 rx_gain_range_max; ++ u8 rx_gain_range_min; ++ u8 Rssi_val_min; ++ ++ u8 PreCCK_CCAThres; ++ u8 CurCCK_CCAThres; ++ u8 PreCCKPDState; ++ u8 CurCCKPDState; ++ ++ u8 LargeFAHit; ++ u8 ForbiddenIGI; ++ u32 Recover_cnt; ++ ++ u8 DIG_Dynamic_MIN_0; ++ u8 DIG_Dynamic_MIN_1; ++ bool bMediaConnect_0; ++ bool bMediaConnect_1; ++ ++ u32 AntDiv_RSSI_max; ++ u32 RSSI_max; ++}; ++ ++struct rtl_ps { ++ u8 pre_cca_state; ++ u8 cur_cca_state; ++ ++ u8 pre_rf_state; ++ u8 cur_rf_state; ++ ++ int rssi_val_min; ++ ++ u8 initialize; ++ u32 reg_874; ++ u32 reg_c70; ++ u32 reg_85c; ++ u32 reg_a74; ++ ++}; ++ ++struct false_alarm_stats { ++ u32 Cnt_Parity_Fail; ++ u32 Cnt_Rate_Illegal; ++ u32 Cnt_Crc8_fail; ++ u32 Cnt_Mcs_fail; ++ u32 Cnt_Ofdm_fail; ++ u32 Cnt_Cck_fail; ++ u32 Cnt_all; ++ u32 Cnt_Fast_Fsync; ++ u32 Cnt_SB_Search_fail; ++ u32 Cnt_OFDM_CCA; ++ u32 Cnt_CCK_CCA; ++ u32 Cnt_CCA_all; ++ u32 Cnt_BW_USC; /* Gary */ ++ u32 Cnt_BW_LSC; /* Gary */ ++}; ++ ++struct dyn_primary_cca { ++ u8 pri_cca_flag; ++ u8 intf_flag; ++ u8 intf_type; ++ u8 dup_rts_flag; ++ u8 monitor_flag; ++}; ++ ++struct rx_hpc { ++ u8 RXHP_flag; ++ u8 PSD_func_trigger; ++ u8 PSD_bitmap_RXHP[80]; ++ u8 Pre_IGI; ++ u8 Cur_IGI; ++ u8 Pre_pw_th; ++ u8 Cur_pw_th; ++ bool First_time_enter; ++ bool RXHP_enable; ++ u8 TP_Mode; ++ struct timer_list PSDTimer; ++}; ++ ++#define ASSOCIATE_ENTRY_NUM 32 /* Max size of AsocEntry[]. */ ++#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM ++ ++/* This indicates two different steps. */ ++/* In SWAW_STEP_PEAK, driver needs to switch antenna and listen to ++ * the signal on the air. */ ++/* In SWAW_STEP_DETERMINE, driver just compares the signal captured in ++ * SWAW_STEP_PEAK with original RSSI to determine if it is necessary to ++ * switch antenna. */ ++ ++#define SWAW_STEP_PEAK 0 ++#define SWAW_STEP_DETERMINE 1 ++ ++#define TP_MODE 0 ++#define RSSI_MODE 1 ++#define TRAFFIC_LOW 0 ++#define TRAFFIC_HIGH 1 ++ ++struct sw_ant_switch { ++ u8 try_flag; ++ s32 PreRSSI; ++ u8 CurAntenna; ++ u8 PreAntenna; ++ u8 RSSI_Trying; ++ u8 TestMode; ++ u8 bTriggerAntennaSwitch; ++ u8 SelectAntennaMap; ++ u8 RSSI_target; ++ ++ /* Before link Antenna Switch check */ ++ u8 SWAS_NoLink_State; ++ u32 SWAS_NoLink_BK_Reg860; ++ bool ANTA_ON; /* To indicate Ant A is or not */ ++ bool ANTB_ON; /* To indicate Ant B is on or not */ ++ ++ s32 RSSI_sum_A; ++ s32 RSSI_sum_B; ++ s32 RSSI_cnt_A; ++ s32 RSSI_cnt_B; ++ u64 lastTxOkCnt; ++ u64 lastRxOkCnt; ++ u64 TXByteCnt_A; ++ u64 TXByteCnt_B; ++ u64 RXByteCnt_A; ++ u64 RXByteCnt_B; ++ u8 TrafficLoad; ++ struct timer_list SwAntennaSwitchTimer; ++ /* Hybrid Antenna Diversity */ ++ u32 CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; ++ u32 CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; ++ u32 OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; ++ u32 OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; ++ u32 RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM]; ++ u32 RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM]; ++ u8 TxAnt[ASSOCIATE_ENTRY_NUM]; ++ u8 TargetSTA; ++ u8 antsel; ++ u8 RxIdleAnt; ++}; ++ ++struct edca_turbo { ++ bool bCurrentTurboEDCA; ++ bool bIsCurRDLState; ++ u32 prv_traffic_idx; /* edca turbo */ ++}; ++ ++struct odm_rate_adapt { ++ u8 Type; /* DM_Type_ByFW/DM_Type_ByDriver */ ++ u8 HighRSSIThresh; /* if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH */ ++ u8 LowRSSIThresh; /* if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW */ ++ u8 RATRState; /* Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW */ ++ u32 LastRATR; /* RATR Register Content */ ++}; ++ ++#define IQK_MAC_REG_NUM 4 ++#define IQK_ADDA_REG_NUM 16 ++#define IQK_BB_REG_NUM_MAX 10 ++#define IQK_BB_REG_NUM 9 ++#define HP_THERMAL_NUM 8 ++ ++#define AVG_THERMAL_NUM 8 ++#define IQK_Matrix_REG_NUM 8 ++#define IQK_Matrix_Settings_NUM 1+24+21 ++ ++#define DM_Type_ByFWi 0 ++#define DM_Type_ByDriver 1 ++ ++/* Declare for common info */ ++ ++struct odm_phy_status_info { ++ u8 RxPWDBAll; ++ u8 SignalQuality; /* in 0-100 index. */ ++ u8 RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; /* EVM */ ++ u8 RxMIMOSignalStrength[MAX_PATH_NUM_92CS];/* in 0~100 index */ ++ s8 RxPower; /* in dBm Translate from PWdB */ ++ s8 RecvSignalPower;/* Real power in dBm for this packet, no ++ * beautification and aggregation. Keep this raw ++ * info to be used for the other procedures. */ ++ u8 BTRxRSSIPercentage; ++ u8 SignalStrength; /* in 0-100 index. */ ++ u8 RxPwr[MAX_PATH_NUM_92CS];/* per-path's pwdb */ ++ u8 RxSNR[MAX_PATH_NUM_92CS];/* per-path's SNR */ ++}; ++ ++struct odm_phy_dbg_info { ++ /* ODM Write,debug info */ ++ s8 RxSNRdB[MAX_PATH_NUM_92CS]; ++ u64 NumQryPhyStatus; ++ u64 NumQryPhyStatusCCK; ++ u64 NumQryPhyStatusOFDM; ++ /* Others */ ++ s32 RxEVM[MAX_PATH_NUM_92CS]; ++}; ++ ++struct odm_per_pkt_info { ++ s8 Rate; ++ u8 StationID; ++ bool bPacketMatchBSSID; ++ bool bPacketToSelf; ++ bool bPacketBeacon; ++}; ++ ++struct odm_mac_status_info { ++ u8 test; ++}; ++ ++enum odm_ability { ++ /* BB Team */ ++ ODM_DIG = 0x00000001, ++ ODM_HIGH_POWER = 0x00000002, ++ ODM_CCK_CCA_TH = 0x00000004, ++ ODM_FA_STATISTICS = 0x00000008, ++ ODM_RAMASK = 0x00000010, ++ ODM_RSSI_MONITOR = 0x00000020, ++ ODM_SW_ANTDIV = 0x00000040, ++ ODM_HW_ANTDIV = 0x00000080, ++ ODM_BB_PWRSV = 0x00000100, ++ ODM_2TPATHDIV = 0x00000200, ++ ODM_1TPATHDIV = 0x00000400, ++ ODM_PSD2AFH = 0x00000800 ++}; ++ ++/* 2011/20/20 MH For MP driver RT_WLAN_STA = struct sta_info */ ++/* Please declare below ODM relative info in your STA info structure. */ ++ ++struct odm_sta_info { ++ /* Driver Write */ ++ bool bUsed; /* record the sta status link or not? */ ++ u8 IOTPeer; /* Enum value. HT_IOT_PEER_E */ ++ ++ /* ODM Write */ ++ /* 1 PHY_STATUS_INFO */ ++ u8 RSSI_Path[4]; /* */ ++ u8 RSSI_Ave; ++ u8 RXEVM[4]; ++ u8 RXSNR[4]; ++}; ++ ++/* 2011/10/20 MH Define Common info enum for all team. */ ++ ++enum odm_common_info_def { ++ /* Fixed value: */ ++ ++ /* HOOK BEFORE REG INIT----------- */ ++ ODM_CMNINFO_PLATFORM = 0, ++ ODM_CMNINFO_ABILITY, /* ODM_ABILITY_E */ ++ ODM_CMNINFO_INTERFACE, /* ODM_INTERFACE_E */ ++ ODM_CMNINFO_MP_TEST_CHIP, ++ ODM_CMNINFO_IC_TYPE, /* ODM_IC_TYPE_E */ ++ ODM_CMNINFO_CUT_VER, /* ODM_CUT_VERSION_E */ ++ ODM_CMNINFO_FAB_VER, /* ODM_FAB_E */ ++ ODM_CMNINFO_RF_TYPE, /* RF_PATH_E or ODM_RF_TYPE_E? */ ++ ODM_CMNINFO_BOARD_TYPE, /* ODM_BOARD_TYPE_E */ ++ ODM_CMNINFO_EXT_LNA, /* true */ ++ ODM_CMNINFO_EXT_PA, ++ ODM_CMNINFO_EXT_TRSW, ++ ODM_CMNINFO_PATCH_ID, /* CUSTOMER ID */ ++ ODM_CMNINFO_BINHCT_TEST, ++ ODM_CMNINFO_BWIFI_TEST, ++ ODM_CMNINFO_SMART_CONCURRENT, ++ /* HOOK BEFORE REG INIT----------- */ ++ ++ /* Dynamic value: */ ++/* POINTER REFERENCE----------- */ ++ ODM_CMNINFO_MAC_PHY_MODE, /* ODM_MAC_PHY_MODE_E */ ++ ODM_CMNINFO_TX_UNI, ++ ODM_CMNINFO_RX_UNI, ++ ODM_CMNINFO_WM_MODE, /* ODM_WIRELESS_MODE_E */ ++ ODM_CMNINFO_BAND, /* ODM_BAND_TYPE_E */ ++ ODM_CMNINFO_SEC_CHNL_OFFSET, /* ODM_SEC_CHNL_OFFSET_E */ ++ ODM_CMNINFO_SEC_MODE, /* ODM_SECURITY_E */ ++ ODM_CMNINFO_BW, /* ODM_BW_E */ ++ ODM_CMNINFO_CHNL, ++ ++ ODM_CMNINFO_DMSP_GET_VALUE, ++ ODM_CMNINFO_BUDDY_ADAPTOR, ++ ODM_CMNINFO_DMSP_IS_MASTER, ++ ODM_CMNINFO_SCAN, ++ ODM_CMNINFO_POWER_SAVING, ++ ODM_CMNINFO_ONE_PATH_CCA, /* ODM_CCA_PATH_E */ ++ ODM_CMNINFO_DRV_STOP, ++ ODM_CMNINFO_PNP_IN, ++ ODM_CMNINFO_INIT_ON, ++ ODM_CMNINFO_ANT_TEST, ++ ODM_CMNINFO_NET_CLOSED, ++ ODM_CMNINFO_MP_MODE, ++/* POINTER REFERENCE----------- */ ++ ++/* CALL BY VALUE------------- */ ++ ODM_CMNINFO_WIFI_DIRECT, ++ ODM_CMNINFO_WIFI_DISPLAY, ++ ODM_CMNINFO_LINK, ++ ODM_CMNINFO_RSSI_MIN, ++ ODM_CMNINFO_RA_THRESHOLD_HIGH, /* u8 */ ++ ODM_CMNINFO_RA_THRESHOLD_LOW, /* u8 */ ++ ODM_CMNINFO_RF_ANTENNA_TYPE, /* u8 */ ++ ODM_CMNINFO_BT_DISABLED, ++ ODM_CMNINFO_BT_OPERATION, ++ ODM_CMNINFO_BT_DIG, ++ ODM_CMNINFO_BT_BUSY, /* Check Bt is using or not */ ++ ODM_CMNINFO_BT_DISABLE_EDCA, ++/* CALL BY VALUE-------------*/ ++ ++ /* Dynamic ptr array hook itms. */ ++ ODM_CMNINFO_STA_STATUS, ++ ODM_CMNINFO_PHY_STATUS, ++ ODM_CMNINFO_MAC_STATUS, ++ ODM_CMNINFO_MAX, ++}; ++ ++/* 2011/10/20 MH Define ODM support ability. ODM_CMNINFO_ABILITY */ ++ ++enum odm_ability_def { ++ /* BB ODM section BIT 0-15 */ ++ ODM_BB_DIG = BIT(0), ++ ODM_BB_RA_MASK = BIT(1), ++ ODM_BB_DYNAMIC_TXPWR = BIT(2), ++ ODM_BB_FA_CNT = BIT(3), ++ ODM_BB_RSSI_MONITOR = BIT(4), ++ ODM_BB_CCK_PD = BIT(5), ++ ODM_BB_ANT_DIV = BIT(6), ++ ODM_BB_PWR_SAVE = BIT(7), ++ ODM_BB_PWR_TRA = BIT(8), ++ ODM_BB_RATE_ADAPTIVE = BIT(9), ++ ODM_BB_PATH_DIV = BIT(10), ++ ODM_BB_PSD = BIT(11), ++ ODM_BB_RXHP = BIT(12), ++ ++ /* MAC DM section BIT 16-23 */ ++ ODM_MAC_EDCA_TURBO = BIT(16), ++ ODM_MAC_EARLY_MODE = BIT(17), ++ ++ /* RF ODM section BIT 24-31 */ ++ ODM_RF_TX_PWR_TRACK = BIT(24), ++ ODM_RF_RX_GAIN_TRACK = BIT(25), ++ ODM_RF_CALIBRATION = BIT(26), ++}; ++ ++/* ODM_CMNINFO_INTERFACE */ ++enum odm_interface_def { ++ ODM_ITRF_PCIE = 0x1, ++ ODM_ITRF_USB = 0x2, ++ ODM_ITRF_SDIO = 0x4, ++ ODM_ITRF_ALL = 0x7, ++}; ++ ++/* ODM_CMNINFO_IC_TYPE */ ++enum odm_ic_type { ++ ODM_RTL8192S = BIT(0), ++ ODM_RTL8192C = BIT(1), ++ ODM_RTL8192D = BIT(2), ++ ODM_RTL8723A = BIT(3), ++ ODM_RTL8188E = BIT(4), ++ ODM_RTL8812 = BIT(5), ++ ODM_RTL8821 = BIT(6), ++}; ++ ++#define ODM_IC_11N_SERIES \ ++ (ODM_RTL8192S | ODM_RTL8192C | ODM_RTL8192D | \ ++ ODM_RTL8723A | ODM_RTL8188E) ++#define ODM_IC_11AC_SERIES (ODM_RTL8812) ++ ++/* ODM_CMNINFO_CUT_VER */ ++enum odm_cut_version { ++ ODM_CUT_A = 1, ++ ODM_CUT_B = 2, ++ ODM_CUT_C = 3, ++ ODM_CUT_D = 4, ++ ODM_CUT_E = 5, ++ ODM_CUT_F = 6, ++ ODM_CUT_TEST = 7, ++}; ++ ++/* ODM_CMNINFO_FAB_VER */ ++enum odm_fab_Version { ++ ODM_TSMC = 0, ++ ODM_UMC = 1, ++}; ++ ++/* ODM_CMNINFO_RF_TYPE */ ++/* For example 1T2R (A+AB = BIT(0)|BIT(4)|BIT(5)) */ ++enum odm_rf_path { ++ ODM_RF_TX_A = BIT(0), ++ ODM_RF_TX_B = BIT(1), ++ ODM_RF_TX_C = BIT(2), ++ ODM_RF_TX_D = BIT(3), ++ ODM_RF_RX_A = BIT(4), ++ ODM_RF_RX_B = BIT(5), ++ ODM_RF_RX_C = BIT(6), ++ ODM_RF_RX_D = BIT(7), ++}; ++ ++enum odm_rf_type { ++ ODM_1T1R = 0, ++ ODM_1T2R = 1, ++ ODM_2T2R = 2, ++ ODM_2T3R = 3, ++ ODM_2T4R = 4, ++ ODM_3T3R = 5, ++ ODM_3T4R = 6, ++ ODM_4T4R = 7, ++}; ++ ++/* ODM Dynamic common info value definition */ ++ ++enum odm_mac_phy_mode { ++ ODM_SMSP = 0, ++ ODM_DMSP = 1, ++ ODM_DMDP = 2, ++}; ++ ++enum odm_bt_coexist { ++ ODM_BT_BUSY = 1, ++ ODM_BT_ON = 2, ++ ODM_BT_OFF = 3, ++ ODM_BT_NONE = 4, ++}; ++ ++/* ODM_CMNINFO_OP_MODE */ ++enum odm_operation_mode { ++ ODM_NO_LINK = BIT(0), ++ ODM_LINK = BIT(1), ++ ODM_SCAN = BIT(2), ++ ODM_POWERSAVE = BIT(3), ++ ODM_AP_MODE = BIT(4), ++ ODM_CLIENT_MODE = BIT(5), ++ ODM_AD_HOC = BIT(6), ++ ODM_WIFI_DIRECT = BIT(7), ++ ODM_WIFI_DISPLAY = BIT(8), ++}; ++ ++/* ODM_CMNINFO_WM_MODE */ ++enum odm_wireless_mode { ++ ODM_WM_UNKNOW = 0x0, ++ ODM_WM_B = BIT(0), ++ ODM_WM_G = BIT(1), ++ ODM_WM_N24G = BIT(3), ++ ODM_WM_AUTO = BIT(5), ++}; ++ ++/* ODM_CMNINFO_BAND */ ++enum odm_band_type { ++ ODM_BAND_2_4G = BIT(0), ++}; ++ ++/* ODM_CMNINFO_SEC_CHNL_OFFSET */ ++enum odm_sec_chnl_offset { ++ ODM_DONT_CARE = 0, ++ ODM_BELOW = 1, ++ ODM_ABOVE = 2 ++}; ++ ++/* ODM_CMNINFO_SEC_MODE */ ++enum odm_security { ++ ODM_SEC_OPEN = 0, ++ ODM_SEC_WEP40 = 1, ++ ODM_SEC_TKIP = 2, ++ ODM_SEC_RESERVE = 3, ++ ODM_SEC_AESCCMP = 4, ++ ODM_SEC_WEP104 = 5, ++ ODM_WEP_WPA_MIXED = 6, /* WEP + WPA */ ++ ODM_SEC_SMS4 = 7, ++}; ++ ++/* ODM_CMNINFO_BW */ ++enum odm_bw { ++ ODM_BW20M = 0, ++ ODM_BW40M = 1, ++}; ++ ++/* ODM_CMNINFO_BOARD_TYPE */ ++enum odm_board_type { ++ ODM_BOARD_NORMAL = 0, ++ ODM_BOARD_HIGHPWR = 1, ++ ODM_BOARD_MINICARD = 2, ++ ODM_BOARD_SLIM = 3, ++ ODM_BOARD_COMBO = 4, ++}; ++ ++/* ODM_CMNINFO_ONE_PATH_CCA */ ++enum odm_cca_path { ++ ODM_CCA_2R = 0, ++ ODM_CCA_1R_A = 1, ++ ODM_CCA_1R_B = 2, ++}; ++ ++struct odm_ra_info { ++ u8 RateID; ++ u32 RateMask; ++ u32 RAUseRate; ++ u8 RateSGI; ++ u8 RssiStaRA; ++ u8 PreRssiStaRA; ++ u8 SGIEnable; ++ u8 DecisionRate; ++ u8 PreRate; ++ u8 HighestRate; ++ u8 LowestRate; ++ u32 NscUp; ++ u32 NscDown; ++ u16 RTY[5]; ++ u32 TOTAL; ++ u16 DROP; ++ u8 Active; ++ u16 RptTime; ++ u8 RAWaitingCounter; ++ u8 RAPendingCounter; ++ u8 PTActive; /* on or off */ ++ u8 PTTryState; /* 0 trying state, 1 for decision state */ ++ u8 PTStage; /* 0~6 */ ++ u8 PTStopCount; /* Stop PT counter */ ++ u8 PTPreRate; /* if rate change do PT */ ++ u8 PTPreRssi; /* if RSSI change 5% do PT */ ++ u8 PTModeSS; /* decide whitch rate should do PT */ ++ u8 RAstage; /* StageRA, decide how many times RA will be done ++ * between PT */ ++ u8 PTSmoothFactor; ++}; ++ ++struct ijk_matrix_regs_set { ++ bool bIQKDone; ++ s32 Value[1][IQK_Matrix_REG_NUM]; ++}; ++ ++struct odm_rf_cal { ++ /* for tx power tracking */ ++ u32 RegA24; /* for TempCCK */ ++ s32 RegE94; ++ s32 RegE9C; ++ s32 RegEB4; ++ s32 RegEBC; ++ ++ u8 TXPowercount; ++ bool bTXPowerTrackingInit; ++ bool bTXPowerTracking; ++ u8 TxPowerTrackControl; /* for mp mode, turn off txpwrtracking ++ * as default */ ++ u8 TM_Trigger; ++ u8 InternalPA5G[2]; /* pathA / pathB */ ++ ++ u8 ThermalMeter[2]; /* ThermalMeter, index 0 for RFIC0, ++ * and 1 for RFIC1 */ ++ u8 ThermalValue; ++ u8 ThermalValue_LCK; ++ u8 ThermalValue_IQK; ++ u8 ThermalValue_DPK; ++ u8 ThermalValue_AVG[AVG_THERMAL_NUM]; ++ u8 ThermalValue_AVG_index; ++ u8 ThermalValue_RxGain; ++ u8 ThermalValue_Crystal; ++ u8 ThermalValue_DPKstore; ++ u8 ThermalValue_DPKtrack; ++ bool TxPowerTrackingInProgress; ++ bool bDPKenable; ++ ++ bool bReloadtxpowerindex; ++ u8 bRfPiEnable; ++ u32 TXPowerTrackingCallbackCnt; /* cosa add for debug */ ++ ++ u8 bCCKinCH14; ++ u8 CCK_index; ++ u8 OFDM_index[2]; ++ bool bDoneTxpower; ++ ++ u8 ThermalValue_HP[HP_THERMAL_NUM]; ++ u8 ThermalValue_HP_index; ++ struct ijk_matrix_regs_set IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; ++ ++ u8 Delta_IQK; ++ u8 Delta_LCK; ++ ++ /* for IQK */ ++ u32 RegC04; ++ u32 Reg874; ++ u32 RegC08; ++ u32 RegB68; ++ u32 RegB6C; ++ u32 Reg870; ++ u32 Reg860; ++ u32 Reg864; ++ ++ bool bIQKInitialized; ++ bool bLCKInProgress; ++ bool bAntennaDetected; ++ u32 ADDA_backup[IQK_ADDA_REG_NUM]; ++ u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; ++ u32 IQK_BB_backup_recover[9]; ++ u32 IQK_BB_backup[IQK_BB_REG_NUM]; ++ ++ /* for APK */ ++ u32 APKoutput[2][2]; /* path A/B; output1_1a/output1_2a */ ++ u8 bAPKdone; ++ u8 bAPKThermalMeterIgnore; ++ u8 bDPdone; ++ u8 bDPPathAOK; ++ u8 bDPPathBOK; ++}; ++ ++/* ODM Dynamic common info value definition */ ++ ++struct fast_ant_train { ++ u8 Bssid[6]; ++ u8 antsel_rx_keep_0; ++ u8 antsel_rx_keep_1; ++ u8 antsel_rx_keep_2; ++ u32 antSumRSSI[7]; ++ u32 antRSSIcnt[7]; ++ u32 antAveRSSI[7]; ++ u8 FAT_State; ++ u32 TrainIdx; ++ u8 antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; ++ u8 antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; ++ u8 antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; ++ u32 MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; ++ u32 AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; ++ u32 MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; ++ u32 AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; ++ u8 RxIdleAnt; ++ bool bBecomeLinked; ++}; ++ ++enum fat_state { ++ FAT_NORMAL_STATE = 0, ++ FAT_TRAINING_STATE = 1, ++}; ++ ++enum ant_div_type { ++ NO_ANTDIV = 0xFF, ++ CG_TRX_HW_ANTDIV = 0x01, ++ CGCS_RX_HW_ANTDIV = 0x02, ++ FIXED_HW_ANTDIV = 0x03, ++ CG_TRX_SMART_ANTDIV = 0x04, ++ CGCS_RX_SW_ANTDIV = 0x05, ++}; ++ ++/* Copy from SD4 defined structure. We use to support PHY DM integration. */ ++struct odm_dm_struct { ++ /* Add for different team use temporarily */ ++ struct adapter *Adapter; /* For CE/NIC team */ ++ struct rtl8192cd_priv *priv; /* For AP/ADSL team */ ++ /* WHen you use above pointers, they must be initialized. */ ++ bool odm_ready; ++ ++ struct rtl8192cd_priv *fake_priv; ++ ++/* ODM HANDLE, DRIVER NEEDS NOT TO HOOK------ */ ++ bool bCckHighPower; ++ u8 RFPathRxEnable; /* ODM_CMNINFO_RFPATH_ENABLE */ ++ u8 ControlChannel; ++/* ODM HANDLE, DRIVER NEEDS NOT TO HOOK------ */ ++ ++/* 1 COMMON INFORMATION */ ++ /* Init Value */ ++/* HOOK BEFORE REG INIT----------- */ ++ /* ODM Platform info AP/ADSL/CE/MP = 1/2/3/4 */ ++ u8 SupportPlatform; ++ /* ODM Support Ability DIG/RATR/TX_PWR_TRACK/ �K�K = 1/2/3/�K */ ++ u32 SupportAbility; ++ /* ODM PCIE/USB/SDIO/GSPI = 0/1/2/3 */ ++ u8 SupportInterface; ++ /* ODM composite or independent. Bit oriented/ 92C+92D+ .... or any ++ * other type = 1/2/3/... */ ++ u32 SupportICType; ++ /* Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/... */ ++ u8 CutVersion; ++ /* Fab Version TSMC/UMC = 0/1 */ ++ u8 FabVersion; ++ /* RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/... */ ++ u8 RFType; ++ /* Board Type Normal/HighPower/MiniCard/SLIM/Combo/. = 0/1/2/3/4/. */ ++ u8 BoardType; ++ /* with external LNA NO/Yes = 0/1 */ ++ u8 ExtLNA; ++ /* with external PA NO/Yes = 0/1 */ ++ u8 ExtPA; ++ /* with external TRSW NO/Yes = 0/1 */ ++ u8 ExtTRSW; ++ u8 PatchID; /* Customer ID */ ++ bool bInHctTest; ++ bool bWIFITest; ++ ++ bool bDualMacSmartConcurrent; ++ u32 BK_SupportAbility; ++ u8 AntDivType; ++/* HOOK BEFORE REG INIT----------- */ ++ ++ /* Dynamic Value */ ++/* POINTER REFERENCE----------- */ ++ ++ u8 u8_temp; ++ bool bool_temp; ++ struct adapter *adapter_temp; ++ ++ /* MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2 */ ++ u8 *pMacPhyMode; ++ /* TX Unicast byte count */ ++ u64 *pNumTxBytesUnicast; ++ /* RX Unicast byte count */ ++ u64 *pNumRxBytesUnicast; ++ /* Wireless mode B/G/A/N = BIT(0)/BIT(1)/BIT(2)/BIT(3) */ ++ u8 *pWirelessMode; /* ODM_WIRELESS_MODE_E */ ++ /* Frequence band 2.4G/5G = 0/1 */ ++ u8 *pBandType; ++ /* Secondary channel offset don't_care/below/above = 0/1/2 */ ++ u8 *pSecChOffset; ++ /* Security mode Open/WEP/AES/TKIP = 0/1/2/3 */ ++ u8 *pSecurity; ++ /* BW info 20M/40M/80M = 0/1/2 */ ++ u8 *pBandWidth; ++ /* Central channel location Ch1/Ch2/.... */ ++ u8 *pChannel; /* central channel number */ ++ /* Common info for 92D DMSP */ ++ ++ bool *pbGetValueFromOtherMac; ++ struct adapter **pBuddyAdapter; ++ bool *pbMasterOfDMSP; /* MAC0: master, MAC1: slave */ ++ /* Common info for Status */ ++ bool *pbScanInProcess; ++ bool *pbPowerSaving; ++ /* CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E. */ ++ u8 *pOnePathCCA; ++ /* pMgntInfo->AntennaTest */ ++ u8 *pAntennaTest; ++ bool *pbNet_closed; ++/* POINTER REFERENCE----------- */ ++ /* */ ++/* CALL BY VALUE------------- */ ++ bool bWIFI_Direct; ++ bool bWIFI_Display; ++ bool bLinked; ++ u8 RSSI_Min; ++ u8 InterfaceIndex; /* Add for 92D dual MAC: 0--Mac0 1--Mac1 */ ++ bool bIsMPChip; ++ bool bOneEntryOnly; ++ /* Common info for BTDM */ ++ bool bBtDisabled; /* BT is disabled */ ++ bool bBtHsOperation; /* BT HS mode is under progress */ ++ u8 btHsDigVal; /* use BT rssi to decide the DIG value */ ++ bool bBtDisableEdcaTurbo;/* Under some condition, don't enable the ++ * EDCA Turbo */ ++ bool bBtBusy; /* BT is busy. */ ++/* CALL BY VALUE------------- */ ++ ++ /* 2 Define STA info. */ ++ /* _ODM_STA_INFO */ ++ /* For MP, we need to reduce one array pointer for default port.?? */ ++ struct sta_info *pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; ++ ++ u16 CurrminRptTime; ++ struct odm_ra_info RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; /* Use MacID as ++ * array index. STA MacID=0, ++ * VWiFi Client MacID={1, ODM_ASSOCIATE_ENTRY_NUM-1} */ ++ /* */ ++ /* 2012/02/14 MH Add to share 88E ra with other SW team. */ ++ /* We need to colelct all support abilit to a proper area. */ ++ /* */ ++ bool RaSupport88E; ++ ++ /* Define ........... */ ++ ++ /* Latest packet phy info (ODM write) */ ++ struct odm_phy_dbg_info PhyDbgInfo; ++ ++ /* Latest packet phy info (ODM write) */ ++ struct odm_mac_status_info *pMacInfo; ++ ++ /* Different Team independt structure?? */ ++ ++ /* ODM Structure */ ++ struct fast_ant_train DM_FatTable; ++ struct rtw_dig DM_DigTable; ++ struct rtl_ps DM_PSTable; ++ struct dyn_primary_cca DM_PriCCA; ++ struct rx_hpc DM_RXHP_Table; ++ struct false_alarm_stats FalseAlmCnt; ++ struct false_alarm_stats FlaseAlmCntBuddyAdapter; ++ struct sw_ant_switch DM_SWAT_Table; ++ bool RSSI_test; ++ ++ struct edca_turbo DM_EDCA_Table; ++ u32 WMMEDCA_BE; ++ /* Copy from SD4 structure */ ++ /* */ ++ /* ================================================== */ ++ /* */ ++ ++ bool *pbDriverStopped; ++ bool *pbDriverIsGoingToPnpSetPowerSleep; ++ bool *pinit_adpt_in_progress; ++ ++ /* PSD */ ++ bool bUserAssignLevel; ++ struct timer_list PSDTimer; ++ u8 RSSI_BT; /* come from BT */ ++ bool bPSDinProcess; ++ bool bDMInitialGainEnable; ++ ++ /* for rate adaptive, in fact, 88c/92c fw will handle this */ ++ u8 bUseRAMask; ++ ++ struct odm_rate_adapt RateAdaptive; ++ ++ struct odm_rf_cal RFCalibrateInfo; ++ ++ /* TX power tracking */ ++ u8 BbSwingIdxOfdm; ++ u8 BbSwingIdxOfdmCurrent; ++ u8 BbSwingIdxOfdmBase; ++ bool BbSwingFlagOfdm; ++ u8 BbSwingIdxCck; ++ u8 BbSwingIdxCckCurrent; ++ u8 BbSwingIdxCckBase; ++ bool BbSwingFlagCck; ++ u8 *mp_mode; ++ /* ODM system resource. */ ++ ++ /* ODM relative time. */ ++ struct timer_list PathDivSwitchTimer; ++ /* 2011.09.27 add for Path Diversity */ ++ struct timer_list CCKPathDiversityTimer; ++ struct timer_list FastAntTrainingTimer; ++}; /* DM_Dynamic_Mechanism_Structure */ ++ ++enum ODM_RF_CONTENT { ++ odm_radioa_txt = 0x1000, ++ odm_radiob_txt = 0x1001, ++ odm_radioc_txt = 0x1002, ++ odm_radiod_txt = 0x1003 ++}; ++ ++enum odm_bb_config_type { ++ CONFIG_BB_PHY_REG, ++ CONFIG_BB_AGC_TAB, ++ CONFIG_BB_AGC_TAB_2G, ++ CONFIG_BB_PHY_REG_PG, ++}; ++ ++/* Status code */ ++enum rt_status { ++ RT_STATUS_SUCCESS, ++ RT_STATUS_FAILURE, ++ RT_STATUS_PENDING, ++ RT_STATUS_RESOURCE, ++ RT_STATUS_INVALID_CONTEXT, ++ RT_STATUS_INVALID_PARAMETER, ++ RT_STATUS_NOT_SUPPORT, ++ RT_STATUS_OS_API_FAILED, ++}; ++ ++/* 3=========================================================== */ ++/* 3 DIG */ ++/* 3=========================================================== */ ++ ++enum dm_dig_op { ++ RT_TYPE_THRESH_HIGH = 0, ++ RT_TYPE_THRESH_LOW = 1, ++ RT_TYPE_BACKOFF = 2, ++ RT_TYPE_RX_GAIN_MIN = 3, ++ RT_TYPE_RX_GAIN_MAX = 4, ++ RT_TYPE_ENABLE = 5, ++ RT_TYPE_DISABLE = 6, ++ DIG_OP_TYPE_MAX ++}; ++ ++#define DM_DIG_THRESH_HIGH 40 ++#define DM_DIG_THRESH_LOW 35 ++ ++#define DM_SCAN_RSSI_TH 0x14 /* scan return issue for LC */ ++ ++#define DM_false_ALARM_THRESH_LOW 400 ++#define DM_false_ALARM_THRESH_HIGH 1000 ++ ++#define DM_DIG_MAX_NIC 0x4e ++#define DM_DIG_MIN_NIC 0x1e /* 0x22/0x1c */ ++ ++#define DM_DIG_MAX_AP 0x32 ++#define DM_DIG_MIN_AP 0x20 ++ ++#define DM_DIG_MAX_NIC_HP 0x46 ++#define DM_DIG_MIN_NIC_HP 0x2e ++ ++#define DM_DIG_MAX_AP_HP 0x42 ++#define DM_DIG_MIN_AP_HP 0x30 ++ ++/* vivi 92c&92d has different definition, 20110504 */ ++/* this is for 92c */ ++#define DM_DIG_FA_TH0 0x200/* 0x20 */ ++#define DM_DIG_FA_TH1 0x300/* 0x100 */ ++#define DM_DIG_FA_TH2 0x400/* 0x200 */ ++/* this is for 92d */ ++#define DM_DIG_FA_TH0_92D 0x100 ++#define DM_DIG_FA_TH1_92D 0x400 ++#define DM_DIG_FA_TH2_92D 0x600 ++ ++#define DM_DIG_BACKOFF_MAX 12 ++#define DM_DIG_BACKOFF_MIN -4 ++#define DM_DIG_BACKOFF_DEFAULT 10 ++ ++/* 3=========================================================== */ ++/* 3 AGC RX High Power Mode */ ++/* 3=========================================================== */ ++#define LNA_Low_Gain_1 0x64 ++#define LNA_Low_Gain_2 0x5A ++#define LNA_Low_Gain_3 0x58 ++ ++#define FA_RXHP_TH1 5000 ++#define FA_RXHP_TH2 1500 ++#define FA_RXHP_TH3 800 ++#define FA_RXHP_TH4 600 ++#define FA_RXHP_TH5 500 ++ ++/* 3=========================================================== */ ++/* 3 EDCA */ ++/* 3=========================================================== */ ++ ++/* 3=========================================================== */ ++/* 3 Dynamic Tx Power */ ++/* 3=========================================================== */ ++/* Dynamic Tx Power Control Threshold */ ++#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 ++#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 ++#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F ++ ++#define TxHighPwrLevel_Normal 0 ++#define TxHighPwrLevel_Level1 1 ++#define TxHighPwrLevel_Level2 2 ++#define TxHighPwrLevel_BT1 3 ++#define TxHighPwrLevel_BT2 4 ++#define TxHighPwrLevel_15 5 ++#define TxHighPwrLevel_35 6 ++#define TxHighPwrLevel_50 7 ++#define TxHighPwrLevel_70 8 ++#define TxHighPwrLevel_100 9 ++ ++/* 3=========================================================== */ ++/* 3 Rate Adaptive */ ++/* 3=========================================================== */ ++#define DM_RATR_STA_INIT 0 ++#define DM_RATR_STA_HIGH 1 ++#define DM_RATR_STA_MIDDLE 2 ++#define DM_RATR_STA_LOW 3 ++ ++/* 3=========================================================== */ ++/* 3 BB Power Save */ ++/* 3=========================================================== */ ++ ++enum dm_1r_cca { ++ CCA_1R = 0, ++ CCA_2R = 1, ++ CCA_MAX = 2, ++}; ++ ++enum dm_rf { ++ RF_Save = 0, ++ RF_Normal = 1, ++ RF_MAX = 2, ++}; ++ ++/* 3=========================================================== */ ++/* 3 Antenna Diversity */ ++/* 3=========================================================== */ ++enum dm_swas { ++ Antenna_A = 1, ++ Antenna_B = 2, ++ Antenna_MAX = 3, ++}; ++ ++/* Maximal number of antenna detection mechanism needs to perform. */ ++#define MAX_ANTENNA_DETECTION_CNT 10 ++ ++/* Extern Global Variables. */ ++#define OFDM_TABLE_SIZE_92C 37 ++#define OFDM_TABLE_SIZE_92D 43 ++#define CCK_TABLE_SIZE 33 ++ ++extern u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D]; ++extern u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; ++extern u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; ++ ++/* check Sta pointer valid or not */ ++#define IS_STA_VALID(pSta) (pSta) ++/* 20100514 Joseph: Add definition for antenna switching test after link. */ ++/* This indicates two different the steps. */ ++/* In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the ++ * signal on the air. */ ++/* In SWAW_STEP_DETERMINE, driver just compares the signal captured in ++ * SWAW_STEP_PEAK */ ++/* with original RSSI to determine if it is necessary to switch antenna. */ ++#define SWAW_STEP_PEAK 0 ++#define SWAW_STEP_DETERMINE 1 ++ ++void ODM_Write_DIG(struct odm_dm_struct *pDM_Odm, u8 CurrentIGI); ++void ODM_Write_CCK_CCA_Thres(struct odm_dm_struct *pDM_Odm, u8 CurCCK_CCAThres); ++ ++void ODM_SetAntenna(struct odm_dm_struct *pDM_Odm, u8 Antenna); ++ ++#define dm_RF_Saving ODM_RF_Saving ++void ODM_RF_Saving(struct odm_dm_struct *pDM_Odm, u8 bForceInNormal); ++ ++#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink ++void ODM_SwAntDivRestAfterLink(struct odm_dm_struct *pDM_Odm); ++ ++#define dm_CheckTXPowerTracking ODM_TXPowerTrackingCheck ++void ODM_TXPowerTrackingCheck(struct odm_dm_struct *pDM_Odm); ++ ++bool ODM_RAStateCheck(struct odm_dm_struct *pDM_Odm, s32 RSSI, ++ bool bForceUpdate, u8 *pRATRState); ++ ++#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi ++void ODM_SwAntDivChkPerPktRssi(struct odm_dm_struct *pDM_Odm, u8 StationID, ++ struct odm_phy_status_info *pPhyInfo); ++ ++u32 ConvertTo_dB(u32 Value); ++ ++u32 GetPSDData(struct odm_dm_struct *pDM_Odm, unsigned int point, ++ u8 initial_gain_psd); ++ ++void odm_DIGbyRSSI_LPS(struct odm_dm_struct *pDM_Odm); ++ ++u32 ODM_Get_Rate_Bitmap(struct odm_dm_struct *pDM_Odm, u32 macid, ++ u32 ra_mask, u8 rssi_level); ++ ++void ODM_DMInit(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_DMWatchdog(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_CmnInfoInit(struct odm_dm_struct *pDM_Odm, ++ enum odm_common_info_def CmnInfo, u32 Value); ++ ++void ODM_CmnInfoHook(struct odm_dm_struct *pDM_Odm, ++ enum odm_common_info_def CmnInfo, void *pValue); ++ ++void ODM_CmnInfoPtrArrayHook(struct odm_dm_struct *pDM_Odm, ++ enum odm_common_info_def CmnInfo, ++ u16 Index, void *pValue); ++ ++void ODM_CmnInfoUpdate(struct odm_dm_struct *pDM_Odm, u32 CmnInfo, u64 Value); ++ ++void ODM_InitAllTimers(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_CancelAllTimers(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_ReleaseAllTimers(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_AntselStatistics_88C(struct odm_dm_struct *pDM_Odm, u8 MacId, ++ u32 PWDBAll, bool isCCKrate); ++ ++void ODM_SingleDualAntennaDefaultSetting(struct odm_dm_struct *pDM_Odm); ++ ++bool ODM_SingleDualAntennaDetection(struct odm_dm_struct *pDM_Odm, u8 mode); ++ ++void odm_dtc(struct odm_dm_struct *pDM_Odm); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_HWConfig.h b/drivers/staging/r8188eu/include/odm_HWConfig.h +new file mode 100644 +index 000000000000..9b2ab3bcf992 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_HWConfig.h +@@ -0,0 +1,116 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __HALHWOUTSRC_H__ ++#define __HALHWOUTSRC_H__ ++ ++/* Definition */ ++/* CCK Rates, TxHT = 0 */ ++#define DESC92C_RATE1M 0x00 ++#define DESC92C_RATE2M 0x01 ++#define DESC92C_RATE5_5M 0x02 ++#define DESC92C_RATE11M 0x03 ++ ++/* OFDM Rates, TxHT = 0 */ ++#define DESC92C_RATE6M 0x04 ++#define DESC92C_RATE9M 0x05 ++#define DESC92C_RATE12M 0x06 ++#define DESC92C_RATE18M 0x07 ++#define DESC92C_RATE24M 0x08 ++#define DESC92C_RATE36M 0x09 ++#define DESC92C_RATE48M 0x0a ++#define DESC92C_RATE54M 0x0b ++ ++/* MCS Rates, TxHT = 1 */ ++#define DESC92C_RATEMCS0 0x0c ++#define DESC92C_RATEMCS1 0x0d ++#define DESC92C_RATEMCS2 0x0e ++#define DESC92C_RATEMCS3 0x0f ++#define DESC92C_RATEMCS4 0x10 ++#define DESC92C_RATEMCS5 0x11 ++#define DESC92C_RATEMCS6 0x12 ++#define DESC92C_RATEMCS7 0x13 ++#define DESC92C_RATEMCS8 0x14 ++#define DESC92C_RATEMCS9 0x15 ++#define DESC92C_RATEMCS10 0x16 ++#define DESC92C_RATEMCS11 0x17 ++#define DESC92C_RATEMCS12 0x18 ++#define DESC92C_RATEMCS13 0x19 ++#define DESC92C_RATEMCS14 0x1a ++#define DESC92C_RATEMCS15 0x1b ++#define DESC92C_RATEMCS15_SG 0x1c ++#define DESC92C_RATEMCS32 0x20 ++ ++/* structure and define */ ++ ++struct phy_rx_agc_info { ++ #ifdef __LITTLE_ENDIAN ++ u8 gain:7, trsw:1; ++ #else ++ u8 trsw:1, gain:7; ++ #endif ++}; ++ ++struct phy_status_rpt { ++ struct phy_rx_agc_info path_agc[3]; ++ u8 ch_corr[2]; ++ u8 cck_sig_qual_ofdm_pwdb_all; ++ u8 cck_agc_rpt_ofdm_cfosho_a; ++ u8 cck_rpt_b_ofdm_cfosho_b; ++ u8 rsvd_1;/* ch_corr_msb; */ ++ u8 noise_power_db_msb; ++ u8 path_cfotail[2]; ++ u8 pcts_mask[2]; ++ s8 stream_rxevm[2]; ++ u8 path_rxsnr[3]; ++ u8 noise_power_db_lsb; ++ u8 rsvd_2[3]; ++ u8 stream_csi[2]; ++ u8 stream_target_csi[2]; ++ s8 sig_evm; ++ u8 rsvd_3; ++ ++#ifdef __LITTLE_ENDIAN ++ u8 antsel_rx_keep_2:1; /* ex_intf_flg:1; */ ++ u8 sgi_en:1; ++ u8 rxsc:2; ++ u8 idle_long:1; ++ u8 r_ant_train_en:1; ++ u8 ant_sel_b:1; ++ u8 ant_sel:1; ++#else /* _BIG_ENDIAN_ */ ++ u8 ant_sel:1; ++ u8 ant_sel_b:1; ++ u8 r_ant_train_en:1; ++ u8 idle_long:1; ++ u8 rxsc:2; ++ u8 sgi_en:1; ++ u8 antsel_rx_keep_2:1; /* ex_intf_flg:1; */ ++#endif ++}; ++ ++void odm_Init_RSSIForDM(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_PhyStatusQuery(struct odm_dm_struct *pDM_Odm, ++ struct odm_phy_status_info *pPhyInfo, ++ u8 *pPhyStatus, ++ struct odm_per_pkt_info *pPktinfo, ++ struct adapter *adapt); ++ ++void ODM_MacStatusQuery(struct odm_dm_struct *pDM_Odm, ++ u8 *pMacStatus, ++ u8 MacID, ++ bool bPacketMatchBSSID, ++ bool bPacketToSelf, ++ bool bPacketBeacon); ++ ++enum HAL_STATUS ODM_ConfigRFWithHeaderFile(struct odm_dm_struct *pDM_Odm, ++ enum rf_radio_path Content, ++ enum rf_radio_path eRFPath); ++ ++enum HAL_STATUS ODM_ConfigBBWithHeaderFile(struct odm_dm_struct *pDM_Odm, ++ enum odm_bb_config_type ConfigType); ++ ++enum HAL_STATUS ODM_ConfigMACWithHeaderFile(struct odm_dm_struct *pDM_Odm); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_RTL8188E.h b/drivers/staging/r8188eu/include/odm_RTL8188E.h +new file mode 100644 +index 000000000000..00d2678532f8 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_RTL8188E.h +@@ -0,0 +1,36 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __ODM_RTL8188E_H__ ++#define __ODM_RTL8188E_H__ ++ ++#define MAIN_ANT 0 ++#define AUX_ANT 1 ++#define MAIN_ANT_CG_TRX 1 ++#define AUX_ANT_CG_TRX 0 ++#define MAIN_ANT_CGCS_RX 0 ++#define AUX_ANT_CGCS_RX 1 ++ ++void ODM_DIG_LowerBound_88E(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_AntennaDiversityInit_88E(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_AntennaDiversity_88E(struct odm_dm_struct *pDM_Odm); ++ ++void ODM_SetTxAntByTxInfo_88E(struct odm_dm_struct *pDM_Odm, u8 *pDesc, ++ u8 macId); ++ ++void ODM_UpdateRxIdleAnt_88E(struct odm_dm_struct *pDM_Odm, u8 Ant); ++ ++void ODM_AntselStatistics_88E(struct odm_dm_struct *pDM_Odm, u8 antsel_tr_mux, ++ u32 MacId, u8 RxPWDBAll); ++ ++void odm_FastAntTraining(struct odm_dm_struct *pDM_Odm); ++ ++void odm_FastAntTrainingCallback(struct odm_dm_struct *pDM_Odm); ++ ++void odm_FastAntTrainingWorkItemCallback(struct odm_dm_struct *pDM_Odm); ++ ++void odm_PrimaryCCA_Init(struct odm_dm_struct *pDM_Odm); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_RegConfig8188E.h b/drivers/staging/r8188eu/include/odm_RegConfig8188E.h +new file mode 100644 +index 000000000000..86b5b2d24210 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_RegConfig8188E.h +@@ -0,0 +1,27 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __INC_ODM_REGCONFIG_H_8188E ++#define __INC_ODM_REGCONFIG_H_8188E ++ ++void odm_ConfigRFReg_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u32 Data, ++ enum rf_radio_path RF_PATH, u32 RegAddr); ++ ++void odm_ConfigRF_RadioA_8188E(struct odm_dm_struct *pDM_Odm, ++ u32 Addr, u32 Data); ++ ++void odm_ConfigRF_RadioB_8188E(struct odm_dm_struct *pDM_Odm, ++ u32 Addr, u32 Data); ++ ++void odm_ConfigMAC_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, u8 Data); ++ ++void odm_ConfigBB_AGC_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, ++ u32 Bitmask, u32 Data); ++ ++void odm_ConfigBB_PHY_REG_PG_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, ++ u32 Bitmask, u32 Data); ++ ++void odm_ConfigBB_PHY_8188E(struct odm_dm_struct *pDM_Odm, u32 Addr, ++ u32 Bitmask, u32 Data); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_RegDefine11AC.h b/drivers/staging/r8188eu/include/odm_RegDefine11AC.h +new file mode 100644 +index 000000000000..bba7511cf244 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_RegDefine11AC.h +@@ -0,0 +1,29 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __ODM_REGDEFINE11AC_H__ ++#define __ODM_REGDEFINE11AC_H__ ++ ++/* 2 RF REG LIST */ ++ ++/* 2 BB REG LIST */ ++/* PAGE 8 */ ++/* PAGE 9 */ ++#define ODM_REG_OFDM_FA_RST_11AC 0x9A4 ++/* PAGE A */ ++#define ODM_REG_CCK_CCA_11AC 0xA0A ++#define ODM_REG_CCK_FA_RST_11AC 0xA2C ++#define ODM_REG_CCK_FA_11AC 0xA5C ++/* PAGE C */ ++#define ODM_REG_IGI_A_11AC 0xC50 ++/* PAGE E */ ++#define ODM_REG_IGI_B_11AC 0xE50 ++/* PAGE F */ ++#define ODM_REG_OFDM_FA_11AC 0xF48 ++ ++/* 2 MAC REG LIST */ ++ ++/* DIG Related */ ++#define ODM_BIT_IGI_11AC 0xFFFFFFFF ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_RegDefine11N.h b/drivers/staging/r8188eu/include/odm_RegDefine11N.h +new file mode 100644 +index 000000000000..5d1d73490c1c +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_RegDefine11N.h +@@ -0,0 +1,143 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __ODM_REGDEFINE11N_H__ ++#define __ODM_REGDEFINE11N_H__ ++ ++/* 2 RF REG LIST */ ++#define ODM_REG_RF_MODE_11N 0x00 ++#define ODM_REG_RF_0B_11N 0x0B ++#define ODM_REG_CHNBW_11N 0x18 ++#define ODM_REG_T_METER_11N 0x24 ++#define ODM_REG_RF_25_11N 0x25 ++#define ODM_REG_RF_26_11N 0x26 ++#define ODM_REG_RF_27_11N 0x27 ++#define ODM_REG_RF_2B_11N 0x2B ++#define ODM_REG_RF_2C_11N 0x2C ++#define ODM_REG_RXRF_A3_11N 0x3C ++#define ODM_REG_T_METER_92D_11N 0x42 ++#define ODM_REG_T_METER_88E_11N 0x42 ++ ++/* 2 BB REG LIST */ ++/* PAGE 8 */ ++#define ODM_REG_BB_CTRL_11N 0x800 ++#define ODM_REG_RF_PIN_11N 0x804 ++#define ODM_REG_PSD_CTRL_11N 0x808 ++#define ODM_REG_TX_ANT_CTRL_11N 0x80C ++#define ODM_REG_BB_PWR_SAV5_11N 0x818 ++#define ODM_REG_CCK_RPT_FORMAT_11N 0x824 ++#define ODM_REG_RX_DEFUALT_A_11N 0x858 ++#define ODM_REG_RX_DEFUALT_B_11N 0x85A ++#define ODM_REG_BB_PWR_SAV3_11N 0x85C ++#define ODM_REG_ANTSEL_CTRL_11N 0x860 ++#define ODM_REG_RX_ANT_CTRL_11N 0x864 ++#define ODM_REG_PIN_CTRL_11N 0x870 ++#define ODM_REG_BB_PWR_SAV1_11N 0x874 ++#define ODM_REG_ANTSEL_PATH_11N 0x878 ++#define ODM_REG_BB_3WIRE_11N 0x88C ++#define ODM_REG_SC_CNT_11N 0x8C4 ++#define ODM_REG_PSD_DATA_11N 0x8B4 ++/* PAGE 9 */ ++#define ODM_REG_ANT_MAPPING1_11N 0x914 ++#define ODM_REG_ANT_MAPPING2_11N 0x918 ++/* PAGE A */ ++#define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 ++#define ODM_REG_CCK_CCA_11N 0xA0A ++#define ODM_REG_CCK_ANTDIV_PARA2_11N 0xA0C ++#define ODM_REG_CCK_ANTDIV_PARA3_11N 0xA10 ++#define ODM_REG_CCK_ANTDIV_PARA4_11N 0xA14 ++#define ODM_REG_CCK_FILTER_PARA1_11N 0xA22 ++#define ODM_REG_CCK_FILTER_PARA2_11N 0xA23 ++#define ODM_REG_CCK_FILTER_PARA3_11N 0xA24 ++#define ODM_REG_CCK_FILTER_PARA4_11N 0xA25 ++#define ODM_REG_CCK_FILTER_PARA5_11N 0xA26 ++#define ODM_REG_CCK_FILTER_PARA6_11N 0xA27 ++#define ODM_REG_CCK_FILTER_PARA7_11N 0xA28 ++#define ODM_REG_CCK_FILTER_PARA8_11N 0xA29 ++#define ODM_REG_CCK_FA_RST_11N 0xA2C ++#define ODM_REG_CCK_FA_MSB_11N 0xA58 ++#define ODM_REG_CCK_FA_LSB_11N 0xA5C ++#define ODM_REG_CCK_CCA_CNT_11N 0xA60 ++#define ODM_REG_BB_PWR_SAV4_11N 0xA74 ++/* PAGE B */ ++#define ODM_REG_LNA_SWITCH_11N 0xB2C ++#define ODM_REG_PATH_SWITCH_11N 0xB30 ++#define ODM_REG_RSSI_CTRL_11N 0xB38 ++#define ODM_REG_CONFIG_ANTA_11N 0xB68 ++#define ODM_REG_RSSI_BT_11N 0xB9C ++/* PAGE C */ ++#define ODM_REG_OFDM_FA_HOLDC_11N 0xC00 ++#define ODM_REG_RX_PATH_11N 0xC04 ++#define ODM_REG_TRMUX_11N 0xC08 ++#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C ++#define ODM_REG_RXIQI_MATRIX_11N 0xC14 ++#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C ++#define ODM_REG_IGI_A_11N 0xC50 ++#define ODM_REG_ANTDIV_PARA2_11N 0xC54 ++#define ODM_REG_IGI_B_11N 0xC58 ++#define ODM_REG_ANTDIV_PARA3_11N 0xC5C ++#define ODM_REG_BB_PWR_SAV2_11N 0xC70 ++#define ODM_REG_RX_OFF_11N 0xC7C ++#define ODM_REG_TXIQK_MATRIXA_11N 0xC80 ++#define ODM_REG_TXIQK_MATRIXB_11N 0xC88 ++#define ODM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94 ++#define ODM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C ++#define ODM_REG_RXIQK_MATRIX_LSB_11N 0xCA0 ++#define ODM_REG_ANTDIV_PARA1_11N 0xCA4 ++#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0 ++/* PAGE D */ ++#define ODM_REG_OFDM_FA_RSTD_11N 0xD00 ++#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0 ++#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4 ++#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8 ++/* PAGE E */ ++#define ODM_REG_TXAGC_A_6_18_11N 0xE00 ++#define ODM_REG_TXAGC_A_24_54_11N 0xE04 ++#define ODM_REG_TXAGC_A_1_MCS32_11N 0xE08 ++#define ODM_REG_TXAGC_A_MCS0_3_11N 0xE10 ++#define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 ++#define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 ++#define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C ++#define ODM_REG_FPGA0_IQK_11N 0xE28 ++#define ODM_REG_TXIQK_TONE_A_11N 0xE30 ++#define ODM_REG_RXIQK_TONE_A_11N 0xE34 ++#define ODM_REG_TXIQK_PI_A_11N 0xE38 ++#define ODM_REG_RXIQK_PI_A_11N 0xE3C ++#define ODM_REG_TXIQK_11N 0xE40 ++#define ODM_REG_RXIQK_11N 0xE44 ++#define ODM_REG_IQK_AGC_PTS_11N 0xE48 ++#define ODM_REG_IQK_AGC_RSP_11N 0xE4C ++#define ODM_REG_BLUETOOTH_11N 0xE6C ++#define ODM_REG_RX_WAIT_CCA_11N 0xE70 ++#define ODM_REG_TX_CCK_RFON_11N 0xE74 ++#define ODM_REG_TX_CCK_BBON_11N 0xE78 ++#define ODM_REG_OFDM_RFON_11N 0xE7C ++#define ODM_REG_OFDM_BBON_11N 0xE80 ++#define ODM_REG_TX2RX_11N 0xE84 ++#define ODM_REG_TX2TX_11N 0xE88 ++#define ODM_REG_RX_CCK_11N 0xE8C ++#define ODM_REG_RX_OFDM_11N 0xED0 ++#define ODM_REG_RX_WAIT_RIFS_11N 0xED4 ++#define ODM_REG_RX2RX_11N 0xED8 ++#define ODM_REG_STANDBY_11N 0xEDC ++#define ODM_REG_SLEEP_11N 0xEE0 ++#define ODM_REG_PMPD_ANAEN_11N 0xEEC ++ ++/* 2 MAC REG LIST */ ++#define ODM_REG_BB_RST_11N 0x02 ++#define ODM_REG_ANTSEL_PIN_11N 0x4C ++#define ODM_REG_EARLY_MODE_11N 0x4D0 ++#define ODM_REG_RSSI_MONITOR_11N 0x4FE ++#define ODM_REG_EDCA_VO_11N 0x500 ++#define ODM_REG_EDCA_VI_11N 0x504 ++#define ODM_REG_EDCA_BE_11N 0x508 ++#define ODM_REG_EDCA_BK_11N 0x50C ++#define ODM_REG_TXPAUSE_11N 0x522 ++#define ODM_REG_RESP_TX_11N 0x6D8 ++#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 ++#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 ++ ++/* DIG Related */ ++#define ODM_BIT_IGI_11N 0x0000007F ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_interface.h b/drivers/staging/r8188eu/include/odm_interface.h +new file mode 100644 +index 000000000000..6b589413d56c +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_interface.h +@@ -0,0 +1,147 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __ODM_INTERFACE_H__ ++#define __ODM_INTERFACE_H__ ++ ++/* */ ++/* =========== Constant/Structure/Enum/... Define */ ++/* */ ++ ++/* */ ++/* =========== Macro Define */ ++/* */ ++ ++#define _reg_all(_name) ODM_##_name ++#define _reg_ic(_name, _ic) ODM_##_name##_ic ++#define _bit_all(_name) BIT_##_name ++#define _bit_ic(_name, _ic) BIT_##_name##_ic ++ ++/* _cat: implemented by Token-Pasting Operator. */ ++ ++/*=================================== ++ ++#define ODM_REG_DIG_11N 0xC50 ++#define ODM_REG_DIG_11AC 0xDDD ++ ++ODM_REG(DIG,_pDM_Odm) ++=====================================*/ ++ ++#define _reg_11N(_name) ODM_REG_##_name##_11N ++#define _reg_11AC(_name) ODM_REG_##_name##_11AC ++#define _bit_11N(_name) ODM_BIT_##_name##_11N ++#define _bit_11AC(_name) ODM_BIT_##_name##_11AC ++ ++#define _cat(_name, _ic_type, _func) \ ++ ( \ ++ ((_ic_type) & ODM_IC_11N_SERIES) ? _func##_11N(_name) : \ ++ _func##_11AC(_name) \ ++ ) ++ ++/* _name: name of register or bit. */ ++/* Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" */ ++/* gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", ++ * depends on SupportICType. */ ++#define ODM_REG(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _reg) ++#define ODM_BIT(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _bit) ++ ++enum odm_h2c_cmd { ++ ODM_H2C_RSSI_REPORT = 0, ++ ODM_H2C_PSD_RESULT= 1, ++ ODM_H2C_PathDiv = 2, ++ ODM_MAX_H2CCMD ++}; ++ ++/* 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem. */ ++/* Suggest HW team to use thread instead of workitem. Windows also support the feature. */ ++typedef void (*RT_WORKITEM_CALL_BACK)(void *pContext); ++ ++/* =========== Extern Variable ??? It should be forbidden. */ ++ ++/* =========== EXtern Function Prototype */ ++ ++u8 ODM_Read1Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr); ++ ++u16 ODM_Read2Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr); ++ ++u32 ODM_Read4Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr); ++ ++void ODM_Write1Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u8 Data); ++ ++void ODM_Write2Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u16 Data); ++ ++void ODM_Write4Byte(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 Data); ++ ++void ODM_SetMACReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, ++ u32 BitMask, u32 Data); ++ ++u32 ODM_GetMACReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask); ++ ++void ODM_SetBBReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, ++ u32 BitMask, u32 Data); ++ ++u32 ODM_GetBBReg(struct odm_dm_struct *pDM_Odm, u32 RegAddr, u32 BitMask); ++ ++void ODM_SetRFReg(struct odm_dm_struct *pDM_Odm, enum rf_radio_path eRFPath, ++ u32 RegAddr, u32 BitMask, u32 Data); ++ ++u32 ODM_GetRFReg(struct odm_dm_struct *pDM_Odm, enum rf_radio_path eRFPath, ++ u32 RegAddr, u32 BitMask); ++ ++/* Memory Relative Function. */ ++void ODM_AllocateMemory(struct odm_dm_struct *pDM_Odm, void **pPtr, u32 length); ++void ODM_FreeMemory(struct odm_dm_struct *pDM_Odm, void *pPtr, u32 length); ++ ++s32 ODM_CompareMemory(struct odm_dm_struct *pDM_Odm, void *pBuf1, void *pBuf2, ++ u32 length); ++ ++/* ODM MISC-spin lock relative API. */ ++void ODM_AcquireSpinLock(struct odm_dm_struct *pDM_Odm, ++ enum RT_SPINLOCK_TYPE type); ++ ++void ODM_ReleaseSpinLock(struct odm_dm_struct *pDM_Odm, ++ enum RT_SPINLOCK_TYPE type); ++ ++/* ODM MISC-workitem relative API. */ ++void ODM_InitializeWorkItem(struct odm_dm_struct *pDM_Odm, void *pRtWorkItem, ++ RT_WORKITEM_CALL_BACK RtWorkItemCallback, ++ void *pContext, const char *szID); ++ ++void ODM_StartWorkItem(void *pRtWorkItem); ++ ++void ODM_StopWorkItem(void *pRtWorkItem); ++ ++void ODM_FreeWorkItem(void *pRtWorkItem); ++ ++void ODM_ScheduleWorkItem(void *pRtWorkItem); ++ ++void ODM_IsWorkItemScheduled(void *pRtWorkItem); ++ ++/* ODM Timer relative API. */ ++void ODM_StallExecution(u32 usDelay); ++ ++void ODM_delay_ms(u32 ms); ++ ++void ODM_delay_us(u32 us); ++ ++void ODM_sleep_ms(u32 ms); ++ ++void ODM_sleep_us(u32 us); ++ ++void ODM_SetTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer, ++ u32 msDelay); ++ ++void ODM_InitializeTimer(struct odm_dm_struct *pDM_Odm, ++ struct timer_list *pTimer, void *CallBackFunc, ++ void *pContext, const char *szID); ++ ++void ODM_CancelTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer); ++ ++void ODM_ReleaseTimer(struct odm_dm_struct *pDM_Odm, struct timer_list *pTimer); ++ ++/* ODM FW relative API. */ ++u32 ODM_FillH2CCmd(u8 *pH2CBuffer, u32 H2CBufferLen, u32 CmdNum, ++ u32 *pElementID, u32 *pCmdLen, u8 **pCmbBuffer, ++ u8 *CmdStartSeq); ++ ++#endif /* __ODM_INTERFACE_H__ */ +diff --git a/drivers/staging/r8188eu/include/odm_precomp.h b/drivers/staging/r8188eu/include/odm_precomp.h +new file mode 100644 +index 000000000000..a1d6d674bda6 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_precomp.h +@@ -0,0 +1,76 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. i*/ ++ ++#ifndef __ODM_PRECOMP_H__ ++#define __ODM_PRECOMP_H__ ++ ++#include "odm_types.h" ++ ++#define TEST_FALG___ 1 ++ ++/* 2 Config Flags and Structs - defined by each ODM Type */ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "hal_intf.h" ++ ++/* 2 OutSrc Header Files */ ++ ++#include "odm.h" ++#include "odm_HWConfig.h" ++#include "odm_RegDefine11AC.h" ++#include "odm_RegDefine11N.h" ++ ++#include "HalPhyRf_8188e.h"/* for IQK,LCK,Power-tracking */ ++#include "Hal8188ERateAdaptive.h"/* for RA,Power training */ ++#include "rtl8188e_hal.h" ++ ++#include "odm_interface.h" ++#include "odm_reg.h" ++ ++#include "HalHWImg8188E_MAC.h" ++#include "HalHWImg8188E_RF.h" ++#include "HalHWImg8188E_BB.h" ++ ++#include "odm_RegConfig8188E.h" ++#include "odm_RTL8188E.h" ++ ++void odm_DIGInit(struct odm_dm_struct *pDM_Odm); ++void odm_RateAdaptiveMaskInit(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicBBPowerSavingInit(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicTxPowerInit(struct odm_dm_struct *pDM_Odm); ++void odm_TXPowerTrackingInit(struct odm_dm_struct *pDM_Odm); ++void ODM_EdcaTurboInit(struct odm_dm_struct *pDM_Odm); ++void odm_SwAntDivInit_NIC(struct odm_dm_struct *pDM_Odm); ++void odm_GlobalAdapterCheck(void); ++void odm_CommonInfoSelfUpdate(struct odm_dm_struct *pDM_Odm); ++void odm_FalseAlarmCounterStatistics(struct odm_dm_struct *pDM_Odm); ++void odm_DIG(struct odm_dm_struct *pDM_Odm); ++void odm_CCKPacketDetectionThresh(struct odm_dm_struct *pDM_Odm); ++void odm_RefreshRateAdaptiveMaskMP(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicBBPowerSaving(struct odm_dm_struct *pDM_Odm); ++void odm_SwAntDivChkAntSwitch(struct odm_dm_struct *pDM_Odm, u8 Step); ++void odm_EdcaTurboCheck(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicTxPower(struct odm_dm_struct *pDM_Odm); ++void odm_CommonInfoSelfInit(struct odm_dm_struct *pDM_Odm); ++void odm_SwAntDivInit(struct odm_dm_struct *pDM_Odm); ++void odm_RSSIMonitorCheck(struct odm_dm_struct *pDM_Odm); ++void odm_RefreshRateAdaptiveMask(struct odm_dm_struct *pDM_Odm); ++void odm_1R_CCA(struct odm_dm_struct *pDM_Odm); ++void odm_RefreshRateAdaptiveMaskCE(struct odm_dm_struct *pDM_Odm); ++void odm_RefreshRateAdaptiveMaskAPADSL(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicTxPowerNIC(struct odm_dm_struct *pDM_Odm); ++void odm_DynamicTxPowerAP(struct odm_dm_struct *pDM_Odm); ++void odm_RSSIMonitorCheckMP(struct odm_dm_struct *pDM_Odm); ++void odm_RSSIMonitorCheckCE(struct odm_dm_struct *pDM_Odm); ++void odm_RSSIMonitorCheckAP(struct odm_dm_struct *pDM_Odm); ++void odm_TXPowerTrackingThermalMeterInit(struct odm_dm_struct *pDM_Odm); ++void odm_EdcaTurboCheckCE(struct odm_dm_struct *pDM_Odm); ++void odm_TXPowerTrackingCheckCE(struct odm_dm_struct *pDM_Odm); ++void odm_TXPowerTrackingCheckMP(struct odm_dm_struct *pDM_Odm); ++void odm_TXPowerTrackingCheckAP(struct odm_dm_struct *pDM_Odm); ++void odm_SwAntDivChkAntSwitchCallback(struct timer_list *t); ++void odm_InitHybridAntDiv(struct odm_dm_struct *pDM_Odm); ++void odm_HwAntDiv(struct odm_dm_struct *pDM_Odm); ++ ++#endif /* __ODM_PRECOMP_H__ */ +diff --git a/drivers/staging/r8188eu/include/odm_reg.h b/drivers/staging/r8188eu/include/odm_reg.h +new file mode 100644 +index 000000000000..78d7e904947c +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_reg.h +@@ -0,0 +1,89 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. i*/ ++ ++#ifndef __HAL_ODM_REG_H__ ++#define __HAL_ODM_REG_H__ ++ ++/* Register Definition */ ++ ++/* MAC REG */ ++#define ODM_BB_RESET 0x002 ++#define ODM_DUMMY 0x4fe ++#define ODM_EDCA_VO_PARAM 0x500 ++#define ODM_EDCA_VI_PARAM 0x504 ++#define ODM_EDCA_BE_PARAM 0x508 ++#define ODM_EDCA_BK_PARAM 0x50C ++#define ODM_TXPAUSE 0x522 ++ ++/* BB REG */ ++#define ODM_FPGA_PHY0_PAGE8 0x800 ++#define ODM_PSD_SETTING 0x808 ++#define ODM_AFE_SETTING 0x818 ++#define ODM_TXAGC_B_6_18 0x830 ++#define ODM_TXAGC_B_24_54 0x834 ++#define ODM_TXAGC_B_MCS32_5 0x838 ++#define ODM_TXAGC_B_MCS0_MCS3 0x83c ++#define ODM_TXAGC_B_MCS4_MCS7 0x848 ++#define ODM_TXAGC_B_MCS8_MCS11 0x84c ++#define ODM_ANALOG_REGISTER 0x85c ++#define ODM_RF_INTERFACE_OUTPUT 0x860 ++#define ODM_TXAGC_B_MCS12_MCS15 0x868 ++#define ODM_TXAGC_B_11_A_2_11 0x86c ++#define ODM_AD_DA_LSB_MASK 0x874 ++#define ODM_ENABLE_3_WIRE 0x88c ++#define ODM_PSD_REPORT 0x8b4 ++#define ODM_R_ANT_SELECT 0x90c ++#define ODM_CCK_ANT_SELECT 0xa07 ++#define ODM_CCK_PD_THRESH 0xa0a ++#define ODM_CCK_RF_REG1 0xa11 ++#define ODM_CCK_MATCH_FILTER 0xa20 ++#define ODM_CCK_RAKE_MAC 0xa2e ++#define ODM_CCK_CNT_RESET 0xa2d ++#define ODM_CCK_TX_DIVERSITY 0xa2f ++#define ODM_CCK_FA_CNT_MSB 0xa5b ++#define ODM_CCK_FA_CNT_LSB 0xa5c ++#define ODM_CCK_NEW_FUNCTION 0xa75 ++#define ODM_OFDM_PHY0_PAGE_C 0xc00 ++#define ODM_OFDM_RX_ANT 0xc04 ++#define ODM_R_A_RXIQI 0xc14 ++#define ODM_R_A_AGC_CORE1 0xc50 ++#define ODM_R_A_AGC_CORE2 0xc54 ++#define ODM_R_B_AGC_CORE1 0xc58 ++#define ODM_R_AGC_PAR 0xc70 ++#define ODM_R_HTSTF_AGC_PAR 0xc7c ++#define ODM_TX_PWR_TRAINING_A 0xc90 ++#define ODM_TX_PWR_TRAINING_B 0xc98 ++#define ODM_OFDM_FA_CNT1 0xcf0 ++#define ODM_OFDM_PHY0_PAGE_D 0xd00 ++#define ODM_OFDM_FA_CNT2 0xda0 ++#define ODM_OFDM_FA_CNT3 0xda4 ++#define ODM_OFDM_FA_CNT4 0xda8 ++#define ODM_TXAGC_A_6_18 0xe00 ++#define ODM_TXAGC_A_24_54 0xe04 ++#define ODM_TXAGC_A_1_MCS32 0xe08 ++#define ODM_TXAGC_A_MCS0_MCS3 0xe10 ++#define ODM_TXAGC_A_MCS4_MCS7 0xe14 ++#define ODM_TXAGC_A_MCS8_MCS11 0xe18 ++#define ODM_TXAGC_A_MCS12_MCS15 0xe1c ++ ++/* RF REG */ ++#define ODM_GAIN_SETTING 0x00 ++#define ODM_CHANNEL 0x18 ++ ++/* Ant Detect Reg */ ++#define ODM_DPDT 0x300 ++ ++/* PSD Init */ ++#define ODM_PSDREG 0x808 ++ ++/* 92D Path Div */ ++#define PATHDIV_REG 0xB30 ++#define PATHDIV_TRI 0xBA0 ++ ++/* */ ++/* Bitmap Definition */ ++/* */ ++ ++#define BIT_FA_RESET BIT(0) ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/odm_types.h b/drivers/staging/r8188eu/include/odm_types.h +new file mode 100644 +index 000000000000..6f4a4bd37ec1 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/odm_types.h +@@ -0,0 +1,45 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __ODM_TYPES_H__ ++#define __ODM_TYPES_H__ ++ ++/* */ ++/* Define Different SW team support */ ++/* */ ++#define ODM_AP 0x01 /* BIT(0) */ ++#define ODM_ADSL 0x02 /* BIT(1) */ ++#define ODM_CE 0x04 /* BIT(2) */ ++#define ODM_MP 0x08 /* BIT(3) */ ++ ++#define RT_PCI_INTERFACE 1 ++#define RT_USB_INTERFACE 2 ++#define RT_SDIO_INTERFACE 3 ++ ++enum HAL_STATUS { ++ HAL_STATUS_SUCCESS, ++ HAL_STATUS_FAILURE, ++}; ++ ++enum RT_SPINLOCK_TYPE { ++ RT_TEMP = 1, ++}; ++ ++#include "basic_types.h" ++ ++#define DEV_BUS_TYPE RT_USB_INTERFACE ++ ++#define SET_TX_DESC_ANTSEL_A_88E(__ptxdesc, __value) \ ++ le32p_replace_bits((__le32 *)(__ptxdesc + 8), __value, BIT(24)) ++#define SET_TX_DESC_ANTSEL_B_88E(__ptxdesc, __value) \ ++ le32p_replace_bits((__le32 *)(__ptxdesc + 8), __value, BIT(25)) ++#define SET_TX_DESC_ANTSEL_C_88E(__ptxdesc, __value) \ ++ le32p_replace_bits((__le32 *)(__ptxdesc + 28), __value, BIT(29)) ++ ++/* define useless flag to avoid compile warning */ ++#define USE_WORKITEM 0 ++#define FOR_BRAZIL_PRETEST 0 ++#define BT_30_SUPPORT 0 ++#define FPGA_TWO_MAC_VERIFICATION 0 ++ ++#endif /* __ODM_TYPES_H__ */ +diff --git a/drivers/staging/r8188eu/include/osdep_intf.h b/drivers/staging/r8188eu/include/osdep_intf.h +new file mode 100644 +index 000000000000..3ea60feee2db +--- /dev/null ++++ b/drivers/staging/r8188eu/include/osdep_intf.h +@@ -0,0 +1,64 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __OSDEP_INTF_H_ ++#define __OSDEP_INTF_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++struct intf_priv { ++ u8 *intf_dev; ++ u32 max_iosz; /* USB2.0: 128, USB1.1: 64, SDIO:64 */ ++ u32 max_xmitsz; /* USB2.0: unlimited, SDIO:512 */ ++ u32 max_recvsz; /* USB2.0: unlimited, SDIO:512 */ ++ ++ u8 *io_rwmem; ++ u8 *allocated_io_rwmem; ++ u32 io_wsz; /* unit: 4bytes */ ++ u32 io_rsz;/* unit: 4bytes */ ++ u8 intf_status; ++ ++ void (*_bus_io)(u8 *priv); ++ ++/* ++Under Sync. IRP (SDIO/USB) ++A protection mechanism is necessary for the io_rwmem(read/write protocol) ++ ++Under Async. IRP (SDIO/USB) ++The protection mechanism is through the pending queue. ++*/ ++ struct mutex ioctl_mutex; ++ /* when in USB, IO is through interrupt in/out endpoints */ ++ struct usb_device *udev; ++ struct urb *piorw_urb; ++ u8 io_irp_cnt; ++ u8 bio_irp_pending; ++ struct semaphore io_retevt; ++ struct timer_list io_timer; ++ u8 bio_irp_timeout; ++ u8 bio_timer_cancel; ++}; ++ ++u8 rtw_init_drv_sw(struct adapter *padapter); ++u8 rtw_free_drv_sw(struct adapter *padapter); ++u8 rtw_reset_drv_sw(struct adapter *padapter); ++ ++u32 rtw_start_drv_threads(struct adapter *padapter); ++void rtw_stop_drv_threads (struct adapter *padapter); ++void rtw_cancel_all_timer(struct adapter *padapter); ++ ++int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); ++struct net_device *rtw_init_netdev(struct adapter *padapter); ++u16 rtw_recv_select_queue(struct sk_buff *skb); ++void rtw_proc_init_one(struct net_device *dev); ++void rtw_proc_remove_one(struct net_device *dev); ++ ++void rtw_ips_dev_unload(struct adapter *padapter); ++ ++int rtw_ips_pwr_up(struct adapter *padapter); ++void rtw_ips_pwr_down(struct adapter *padapter); ++int rtw_hw_suspend(struct adapter *padapter); ++int rtw_hw_resume(struct adapter *padapter); ++ ++#endif /* _OSDEP_INTF_H_ */ +diff --git a/drivers/staging/r8188eu/include/osdep_service.h b/drivers/staging/r8188eu/include/osdep_service.h +new file mode 100644 +index 000000000000..029aa4e92c9b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/osdep_service.h +@@ -0,0 +1,315 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __OSDEP_SERVICE_H_ ++#define __OSDEP_SERVICE_H_ ++ ++#include ++#include "basic_types.h" ++ ++#define _FAIL 0 ++#define _SUCCESS 1 ++#define RTW_RX_HANDLED 2 ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include /* Necessary because we use the proc fs */ ++#include /* for struct tasklet_struct */ ++#include ++#include ++#include ++ ++#include ++#include ++ ++struct __queue { ++ struct list_head queue; ++ spinlock_t lock; ++}; ++ ++#define thread_exit() complete_and_exit(NULL, 0) ++ ++static inline struct list_head *get_list_head(struct __queue *queue) ++{ ++ return (&(queue->queue)); ++} ++ ++static inline int _enter_critical_mutex(struct mutex *pmutex, unsigned long *pirqL) ++{ ++ int ret; ++ ++ ret = mutex_lock_interruptible(pmutex); ++ return ret; ++} ++ ++static inline void _exit_critical_mutex(struct mutex *pmutex, unsigned long *pirqL) ++{ ++ mutex_unlock(pmutex); ++} ++ ++static inline void rtw_list_delete(struct list_head *plist) ++{ ++ list_del_init(plist); ++} ++ ++static inline void _set_timer(struct timer_list *ptimer,u32 delay_time) ++{ ++ mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); ++} ++ ++static inline void _cancel_timer(struct timer_list *ptimer,u8 *bcancelled) ++{ ++ del_timer_sync(ptimer); ++ *bcancelled= true;/* true ==1; false==0 */ ++} ++ ++#define RTW_TIMER_HDL_ARGS void *FunctionContext ++#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl ++#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS) ++ ++static inline void _init_workitem(struct work_struct *pwork, void *pfunc, void * cntx) ++{ ++ INIT_WORK(pwork, pfunc); ++} ++ ++static inline void _set_workitem(struct work_struct *pwork) ++{ ++ schedule_work(pwork); ++} ++ ++static inline void _cancel_workitem_sync(struct work_struct *pwork) ++{ ++ cancel_work_sync(pwork); ++} ++/* */ ++/* Global Mutex: can only be used at PASSIVE level. */ ++/* */ ++ ++#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ ++{ \ ++ while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ ++ { \ ++ atomic_dec((atomic_t *)&(_MutexCounter)); \ ++ msleep(10); \ ++ } \ ++} ++ ++#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ ++{ \ ++ atomic_dec((atomic_t *)&(_MutexCounter)); \ ++} ++ ++static inline int rtw_netif_queue_stopped(struct net_device *pnetdev) ++{ ++ return netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) && ++ netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 1)) && ++ netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 2)) && ++ netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 3)); ++} ++ ++static inline void rtw_netif_wake_queue(struct net_device *pnetdev) ++{ ++ netif_tx_wake_all_queues(pnetdev); ++} ++ ++static inline void rtw_netif_start_queue(struct net_device *pnetdev) ++{ ++ netif_tx_start_all_queues(pnetdev); ++} ++ ++static inline void rtw_netif_stop_queue(struct net_device *pnetdev) ++{ ++ netif_tx_stop_all_queues(pnetdev); ++} ++ ++extern int RTW_STATUS_CODE(int error_code); ++ ++extern unsigned char MCS_rate_2R[16]; ++extern unsigned char MCS_rate_1R[16]; ++extern unsigned char RTW_WPA_OUI[]; ++extern unsigned char WPA_TKIP_CIPHER[4]; ++extern unsigned char RSN_TKIP_CIPHER[4]; ++ ++void *rtw_malloc2d(int h, int w, int size); ++ ++u32 _rtw_down_sema(struct semaphore *sema); ++void _rtw_mutex_init(struct mutex *pmutex); ++void _rtw_mutex_free(struct mutex *pmutex); ++ ++void _rtw_init_queue(struct __queue *pqueue); ++ ++u32 rtw_systime_to_ms(u32 systime); ++u32 rtw_ms_to_systime(u32 ms); ++s32 rtw_get_passing_time_ms(u32 start); ++ ++void rtw_usleep_os(int us); ++ ++u32 rtw_atoi(u8 *s); ++ ++static inline unsigned char _cancel_timer_ex(struct timer_list *ptimer) ++{ ++ return del_timer_sync(ptimer); ++} ++ ++static __inline void thread_enter(char *name) ++{ ++#ifdef daemonize ++ daemonize("%s", name); ++#endif ++ allow_signal(SIGTERM); ++} ++ ++static inline void flush_signals_thread(void) ++{ ++ if (signal_pending (current)) ++ flush_signals(current); ++} ++ ++static inline int res_to_status(int res) ++{ ++ return res; ++} ++ ++#define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r)) ++#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) ++ ++static inline u32 _RND4(u32 sz) ++{ ++ u32 val; ++ ++ val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2; ++ return val; ++} ++ ++static inline u32 _RND8(u32 sz) ++{ ++ u32 val; ++ ++ val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3; ++ return val; ++} ++ ++static inline u32 _RND128(u32 sz) ++{ ++ u32 val; ++ ++ val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7; ++ return val; ++} ++ ++static inline u32 _RND256(u32 sz) ++{ ++ u32 val; ++ ++ val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8; ++ return val; ++} ++ ++static inline u32 _RND512(u32 sz) ++{ ++ u32 val; ++ ++ val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9; ++ return val; ++} ++ ++static inline u32 bitshift(u32 bitmask) ++{ ++ u32 i; ++ ++ for (i = 0; i <= 31; i++) ++ if (((bitmask>>i) & 0x1) == 1) break; ++ return i; ++} ++ ++/* limitation of path length */ ++#define PATH_LENGTH_MAX PATH_MAX ++ ++struct rtw_netdev_priv_indicator { ++ void *priv; ++ u32 sizeof_priv; ++}; ++struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, ++ void *old_priv); ++struct net_device *rtw_alloc_etherdev(int sizeof_priv); ++ ++#define rtw_netdev_priv(netdev) \ ++ (((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv) ++void rtw_free_netdev(struct net_device *netdev); ++ ++#define NDEV_FMT "%s" ++#define NDEV_ARG(ndev) ndev->name ++#define ADPT_FMT "%s" ++#define ADPT_ARG(adapter) adapter->pnetdev->name ++#define FUNC_NDEV_FMT "%s(%s)" ++#define FUNC_NDEV_ARG(ndev) __func__, ndev->name ++#define FUNC_ADPT_FMT "%s(%s)" ++#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name ++ ++#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) ++ ++/* Macros for handling unaligned memory accesses */ ++ ++#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) ++#define RTW_PUT_BE16(a, val) \ ++ do { \ ++ (a)[0] = ((u16) (val)) >> 8; \ ++ (a)[1] = ((u16) (val)) & 0xff; \ ++ } while (0) ++ ++#define RTW_PUT_LE16(a, val) \ ++ do { \ ++ (a)[1] = ((u16) (val)) >> 8; \ ++ (a)[0] = ((u16) (val)) & 0xff; \ ++ } while (0) ++ ++#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ ++ ((u32) (a)[2])) ++ ++#define RTW_PUT_BE32(a, val) \ ++ do { \ ++ (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ ++ (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ ++ (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ ++ (a)[3] = (u8) (((u32) (val)) & 0xff); \ ++ } while (0) ++ ++void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len); ++ ++struct rtw_cbuf { ++ u32 write; ++ u32 read; ++ u32 size; ++ void *bufs[0]; ++}; ++ ++bool rtw_cbuf_full(struct rtw_cbuf *cbuf); ++bool rtw_cbuf_empty(struct rtw_cbuf *cbuf); ++bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf); ++void *rtw_cbuf_pop(struct rtw_cbuf *cbuf); ++struct rtw_cbuf *rtw_cbuf_alloc(u32 size); ++int wifirate2_ratetbl_inx(unsigned char rate); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/recv_osdep.h b/drivers/staging/r8188eu/include/recv_osdep.h +new file mode 100644 +index 000000000000..72ddf515071e +--- /dev/null ++++ b/drivers/staging/r8188eu/include/recv_osdep.h +@@ -0,0 +1,37 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RECV_OSDEP_H_ ++#define __RECV_OSDEP_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter); ++void _rtw_free_recv_priv(struct recv_priv *precvpriv); ++ ++s32 rtw_recv_entry(struct recv_frame *precv_frame); ++int rtw_recv_indicatepkt(struct adapter *adapter, struct recv_frame *recv_frame); ++void rtw_recv_returnpacket(struct net_device *cnxt, struct sk_buff *retpkt); ++ ++void rtw_hostapd_mlme_rx(struct adapter *padapter, struct recv_frame *recv_fr); ++void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup); ++ ++int rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter); ++void rtw_free_recv_priv(struct recv_priv *precvpriv); ++ ++int rtw_os_recv_resource_init(struct recv_priv *recvpr, struct adapter *adapt); ++int rtw_os_recv_resource_alloc(struct adapter *adapt, struct recv_frame *recvfr); ++void rtw_os_recv_resource_free(struct recv_priv *precvpriv); ++ ++int rtw_os_recvbuf_resource_alloc(struct adapter *adapt, struct recv_buf *buf); ++int rtw_os_recvbuf_resource_free(struct adapter *adapt, struct recv_buf *buf); ++ ++void rtw_os_read_port(struct adapter *padapter, struct recv_buf *precvbuf); ++ ++void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); ++int _netdev_open(struct net_device *pnetdev); ++int netdev_open(struct net_device *pnetdev); ++int netdev_close(struct net_device *pnetdev); ++ ++#endif /* */ +diff --git a/drivers/staging/r8188eu/include/rtl8188e_cmd.h b/drivers/staging/r8188eu/include/rtl8188e_cmd.h +new file mode 100644 +index 000000000000..6fbf9a47430b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_cmd.h +@@ -0,0 +1,106 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_CMD_H__ ++#define __RTL8188E_CMD_H__ ++ ++enum RTL8188E_H2C_CMD_ID { ++ /* Class Common */ ++ H2C_COM_RSVD_PAGE = 0x00, ++ H2C_COM_MEDIA_STATUS_RPT = 0x01, ++ H2C_COM_SCAN = 0x02, ++ H2C_COM_KEEP_ALIVE = 0x03, ++ H2C_COM_DISCNT_DECISION = 0x04, ++ H2C_COM_INIT_OFFLOAD = 0x06, ++ H2C_COM_REMOTE_WAKE_CTL = 0x07, ++ H2C_COM_AP_OFFLOAD = 0x08, ++ H2C_COM_BCN_RSVD_PAGE = 0x09, ++ H2C_COM_PROB_RSP_RSVD_PAGE = 0x0A, ++ ++ /* Class PS */ ++ H2C_PS_PWR_MODE = 0x20, ++ H2C_PS_TUNE_PARA = 0x21, ++ H2C_PS_TUNE_PARA_2 = 0x22, ++ H2C_PS_LPS_PARA = 0x23, ++ H2C_PS_P2P_OFFLOAD = 0x24, ++ ++ /* Class DM */ ++ H2C_DM_MACID_CFG = 0x40, ++ H2C_DM_TXBF = 0x41, ++ ++ /* Class BT */ ++ H2C_BT_COEX_MASK = 0x60, ++ H2C_BT_COEX_GPIO_MODE = 0x61, ++ H2C_BT_DAC_SWING_VAL = 0x62, ++ H2C_BT_PSD_RST = 0x63, ++ ++ /* Class */ ++ H2C_RESET_TSF = 0xc0, ++}; ++ ++struct cmd_msg_parm { ++ u8 eid; /* element id */ ++ u8 sz; /* sz */ ++ u8 buf[6]; ++}; ++ ++enum { ++ PWRS ++}; ++ ++struct setpwrmode_parm { ++ u8 Mode;/* 0:Active,1:LPS,2:WMMPS */ ++ u8 SmartPS_RLBM;/* LPS= 0:PS_Poll,1:PS_Poll,2:NullData,WMM= 0:PS_Poll,1:NullData */ ++ u8 AwakeInterval; /* unit: beacon interval */ ++ u8 bAllQueueUAPSD; ++ u8 PwrState;/* AllON(0x0c),RFON(0x04),RFOFF(0x00) */ ++}; ++ ++struct H2C_SS_RFOFF_PARAM { ++ u8 ROFOn; /* 1: on, 0:off */ ++ u16 gpio_period; /* unit: 1024 us */ ++} __packed; ++ ++struct joinbssrpt_parm { ++ u8 OpMode; /* RT_MEDIA_STATUS */ ++}; ++ ++struct rsvdpage_loc { ++ u8 LocProbeRsp; ++ u8 LocPsPoll; ++ u8 LocNullData; ++ u8 LocQosNull; ++ u8 LocBTQosNull; ++}; ++ ++struct P2P_PS_Offload_t { ++ u8 Offload_En:1; ++ u8 role:1; /* 1: Owner, 0: Client */ ++ u8 CTWindow_En:1; ++ u8 NoA0_En:1; ++ u8 NoA1_En:1; ++ u8 AllStaSleep:1; /* Only valid in Owner */ ++ u8 discovery:1; ++ u8 rsvd:1; ++}; ++ ++struct P2P_PS_CTWPeriod_t { ++ u8 CTWPeriod; /* TU */ ++}; ++ ++/* host message to firmware cmd */ ++void rtl8188e_set_FwPwrMode_cmd(struct adapter *padapter, u8 Mode); ++void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *padapter, u8 mstatus); ++u8 rtl8188e_set_rssi_cmd(struct adapter *padapter, u8 *param); ++u8 rtl8188e_set_raid_cmd(struct adapter *padapter, u32 mask); ++void rtl8188e_Add_RateATid(struct adapter *padapter, u32 bitmap, u8 arg, ++ u8 rssi_level); ++ ++#ifdef CONFIG_88EU_P2P ++void rtl8188e_set_p2p_ps_offload_cmd(struct adapter *adapt, u8 p2p_ps_state); ++#endif /* CONFIG_88EU_P2P */ ++ ++void CheckFwRsvdPageContent(struct adapter *adapt); ++void rtl8188e_set_FwMediaStatus_cmd(struct adapter *adapt, __le16 mstatus_rpt); ++ ++#endif/* __RTL8188E_CMD_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtl8188e_dm.h b/drivers/staging/r8188eu/include/rtl8188e_dm.h +new file mode 100644 +index 000000000000..3ead20b321a9 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_dm.h +@@ -0,0 +1,47 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_DM_H__ ++#define __RTL8188E_DM_H__ ++ ++enum{ ++ UP_LINK, ++ DOWN_LINK, ++}; ++/* duplicate code,will move to ODM ######### */ ++#define IQK_MAC_REG_NUM 4 ++#define IQK_ADDA_REG_NUM 16 ++#define IQK_BB_REG_NUM 9 ++#define HP_THERMAL_NUM 8 ++/* duplicate code,will move to ODM ######### */ ++struct dm_priv { ++ u8 DM_Type; ++ u8 DMFlag; ++ u8 InitDMFlag; ++ u32 InitODMFlag; ++ ++ /* Upper and Lower Signal threshold for Rate Adaptive*/ ++ int UndecoratedSmoothedPWDB; ++ int UndecoratedSmoothedCCK; ++ int EntryMinUndecoratedSmoothedPWDB; ++ int EntryMaxUndecoratedSmoothedPWDB; ++ int MinUndecoratedPWDBForDM; ++ int LastMinUndecoratedPWDBForDM; ++ ++ /* for High Power */ ++ u8 bDynamicTxPowerEnable; ++ u8 LastDTPLvl; ++ u8 DynamicTxHighPowerLvl;/* Tx Power Control for Near/Far Range */ ++ u8 PowerIndex_backup[6]; ++}; ++ ++void rtl8188e_init_dm_priv(struct adapter *adapt); ++void rtl8188e_deinit_dm_priv(struct adapter *adapt); ++void rtl8188e_InitHalDm(struct adapter *adapt); ++void rtl8188e_HalDmWatchDog(struct adapter *adapt); ++ ++void AntDivCompare8188E(struct adapter *adapt, struct wlan_bssid_ex *dst, ++ struct wlan_bssid_ex *src); ++u8 AntDivBeforeLink8188E(struct adapter *adapt); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtl8188e_hal.h b/drivers/staging/r8188eu/include/rtl8188e_hal.h +new file mode 100644 +index 000000000000..3939bf053de1 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_hal.h +@@ -0,0 +1,452 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_HAL_H__ ++#define __RTL8188E_HAL_H__ ++ ++/* include HAL Related header after HAL Related compiling flags */ ++#include "rtl8188e_spec.h" ++#include "Hal8188EPhyReg.h" ++#include "Hal8188EPhyCfg.h" ++#include "rtl8188e_rf.h" ++#include "rtl8188e_dm.h" ++#include "rtl8188e_recv.h" ++#include "rtl8188e_xmit.h" ++#include "rtl8188e_cmd.h" ++#include "Hal8188EPwrSeq.h" ++#include "rtl8188e_sreset.h" ++#include "rtw_efuse.h" ++ ++#include "odm_precomp.h" ++ ++/* Fw Array */ ++#define Rtl8188E_FwImageArray Rtl8188EFwImgArray ++#define Rtl8188E_FWImgArrayLength Rtl8188EFWImgArrayLength ++ ++#define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" ++#define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" ++#define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" ++#define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" ++#define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" ++#define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" ++#define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" ++#define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" ++ ++/* RTL8188E Power Configuration CMDs for USB/SDIO interfaces */ ++#define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow ++#define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow ++#define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow ++#define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow ++#define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow ++#define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow ++#define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow ++#define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow ++#define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow ++ ++#define DRVINFO_SZ 4 /* unit is 8bytes */ ++#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len) & 0x7F ? 1 : 0)) ++ ++/* download firmware related data structure */ ++#define FW_8188E_SIZE 0x4000 /* 16384,16k */ ++#define FW_8188E_START_ADDRESS 0x1000 ++#define FW_8188E_END_ADDRESS 0x1FFF /* 0x5FFF */ ++ ++#define MAX_PAGE_SIZE 4096 /* @ page : 4k bytes */ ++ ++#define IS_FW_HEADER_EXIST(_pFwHdr) \ ++ ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 || \ ++ (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 || \ ++ (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300 || \ ++ (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0) ++ ++/* This structure must be careful with byte-ordering */ ++ ++struct rt_firmware_hdr { ++ /* 8-byte alinment required */ ++ /* LONG WORD 0 ---- */ ++ __le16 Signature; /* 92C0: test chip; 92C, ++ * 88C0: test chip; 88C1: MP A-cut; ++ * 92C1: MP A-cut */ ++ u8 Category; /* AP/NIC and USB/PCI */ ++ u8 Function; /* Reserved for different FW function ++ * indcation, for further use when ++ * driver needs to download different ++ * FW for different conditions */ ++ __le16 Version; /* FW Version */ ++ u8 Subversion; /* FW Subversion, default 0x00 */ ++ u16 Rsvd1; ++ ++ /* LONG WORD 1 ---- */ ++ u8 Month; /* Release time Month field */ ++ u8 Date; /* Release time Date field */ ++ u8 Hour; /* Release time Hour field */ ++ u8 Minute; /* Release time Minute field */ ++ __le16 RamCodeSize; /* The size of RAM code */ ++ u8 Foundry; ++ u8 Rsvd2; ++ ++ /* LONG WORD 2 ---- */ ++ __le32 SvnIdx; /* The SVN entry index */ ++ u32 Rsvd3; ++ ++ /* LONG WORD 3 ---- */ ++ u32 Rsvd4; ++ u32 Rsvd5; ++}; ++ ++#define DRIVER_EARLY_INT_TIME 0x05 ++#define BCN_DMA_ATIME_INT_TIME 0x02 ++ ++enum usb_rx_agg_mode { ++ USB_RX_AGG_DISABLE, ++ USB_RX_AGG_DMA, ++ USB_RX_AGG_USB, ++ USB_RX_AGG_MIX ++}; ++ ++#define MAX_RX_DMA_BUFFER_SIZE_88E \ ++ 0x2400 /* 9k for 88E nornal chip , MaxRxBuff=10k-max(TxReportSize(64*8), ++ * WOLPattern(16*24)) */ ++ ++#define MAX_TX_REPORT_BUFFER_SIZE 0x0400 /* 1k */ ++ ++/* BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. */ ++#define MAX_TX_QUEUE 9 ++ ++#define TX_SELE_HQ BIT(0) /* High Queue */ ++#define TX_SELE_LQ BIT(1) /* Low Queue */ ++#define TX_SELE_NQ BIT(2) /* Normal Queue */ ++ ++/* Note: We will divide number of page equally for each queue other ++ * than public queue! */ ++/* 22k = 22528 bytes = 176 pages (@page = 128 bytes) */ ++/* must reserved about 7 pages for LPS => 176-7 = 169 (0xA9) */ ++/* 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS ++ * null-data */ ++ ++#define TX_TOTAL_PAGE_NUMBER_88E 0xA9/* 169 (21632=> 21k) */ ++ ++#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1) ++ ++/* Note: For Normal Chip Setting ,modify later */ ++#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER \ ++ TX_TOTAL_PAGE_NUMBER_88E /* 0xA9 , 0xb0=>176=>22k */ ++#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E \ ++ (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) /* 0xA9 */ ++ ++/* Chip specific */ ++#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) ++#define CHIP_BONDING_92C_1T2R 0x1 ++#define CHIP_BONDING_88C_USB_MCARD 0x2 ++#define CHIP_BONDING_88C_USB_HP 0x1 ++#include "HalVerDef.h" ++#include "hal_com.h" ++ ++/* Channel Plan */ ++enum ChannelPlan { ++ CHPL_FCC = 0, ++ CHPL_IC = 1, ++ CHPL_ETSI = 2, ++ CHPL_SPA = 3, ++ CHPL_FRANCE = 4, ++ CHPL_MKK = 5, ++ CHPL_MKK1 = 6, ++ CHPL_ISRAEL = 7, ++ CHPL_TELEC = 8, ++ CHPL_GLOBAL = 9, ++ CHPL_WORLD = 10, ++}; ++ ++struct txpowerinfo24g { ++ u8 IndexCCK_Base[RF_PATH_MAX][MAX_CHNL_GROUP_24G]; ++ u8 IndexBW40_Base[RF_PATH_MAX][MAX_CHNL_GROUP_24G]; ++ /* If only one tx, only BW20 and OFDM are used. */ ++ s8 CCK_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 OFDM_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 BW20_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 BW40_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++}; ++ ++#define EFUSE_REAL_CONTENT_LEN 512 ++#define EFUSE_MAX_SECTION 16 ++#define EFUSE_IC_ID_OFFSET 506 /* For some inferior IC purpose*/ ++#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) ++/* To prevent out of boundary programming case, */ ++/* leave 1byte and program full section */ ++/* 9bytes + 1byt + 5bytes and pre 1byte. */ ++/* For worst case: */ ++/* | 1byte|----8bytes----|1byte|--5bytes--| */ ++/* | | Reserved(14bytes) | */ ++ ++/* PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. */ ++#define EFUSE_OOB_PROTECT_BYTES 15 ++ ++#define HWSET_MAX_SIZE_88E 512 ++ ++#define EFUSE_REAL_CONTENT_LEN_88E 256 ++#define EFUSE_MAP_LEN_88E 512 ++#define EFUSE_MAP_LEN EFUSE_MAP_LEN_88E ++#define EFUSE_MAX_SECTION_88E 64 ++#define EFUSE_MAX_WORD_UNIT_88E 4 ++#define EFUSE_IC_ID_OFFSET_88E 506 ++#define AVAILABLE_EFUSE_ADDR_88E(addr) \ ++ (addr < EFUSE_REAL_CONTENT_LEN_88E) ++/* To prevent out of boundary programming case, leave 1byte and program ++ * full section */ ++/* 9bytes + 1byt + 5bytes and pre 1byte. */ ++/* For worst case: */ ++/* | 2byte|----8bytes----|1byte|--7bytes--| 92D */ ++/* PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. */ ++#define EFUSE_OOB_PROTECT_BYTES_88E 18 ++#define EFUSE_PROTECT_BYTES_BANK_88E 16 ++ ++/* EFUSE for BT definition */ ++#define EFUSE_BT_REAL_CONTENT_LEN 1536 /* 512*3 */ ++#define EFUSE_BT_MAP_LEN 1024 /* 1k bytes */ ++#define EFUSE_BT_MAX_SECTION 128 /* 1024/8 */ ++ ++#define EFUSE_PROTECT_BYTES_BANK 16 ++ ++/* For RTL8723 WiFi/BT/GPS multi-function configuration. */ ++enum rt_multi_func { ++ RT_MULTI_FUNC_NONE = 0x00, ++ RT_MULTI_FUNC_WIFI = 0x01, ++ RT_MULTI_FUNC_BT = 0x02, ++ RT_MULTI_FUNC_GPS = 0x04, ++}; ++ ++/* For RTL8723 regulator mode. */ ++enum rt_regulator_mode { ++ RT_SWITCHING_REGULATOR = 0, ++ RT_LDO_REGULATOR = 1, ++}; ++ ++struct hal_data_8188e { ++ struct HAL_VERSION VersionID; ++ enum rt_multi_func MultiFunc; /* For multi-function consideration. */ ++ enum rt_regulator_mode RegulatorMode; /* switching regulator or LDO */ ++ u16 CustomerID; ++ ++ u16 FirmwareVersion; ++ u16 FirmwareVersionRev; ++ u16 FirmwareSubVersion; ++ u16 FirmwareSignature; ++ u8 PGMaxGroup; ++ /* current WIFI_PHY values */ ++ u32 ReceiveConfig; ++ enum wireless_mode CurrentWirelessMode; ++ enum ht_channel_width CurrentChannelBW; ++ u8 CurrentChannel; ++ u8 nCur40MhzPrimeSC;/* Control channel sub-carrier */ ++ ++ u16 BasicRateSet; ++ ++ /* rf_ctrl */ ++ u8 rf_chip; ++ u8 rf_type; ++ u8 NumTotalRFPath; ++ ++ u8 BoardType; ++ ++ /* EEPROM setting. */ ++ u16 EEPROMVID; ++ u16 EEPROMPID; ++ u16 EEPROMSVID; ++ u16 EEPROMSDID; ++ u8 EEPROMCustomerID; ++ u8 EEPROMSubCustomerID; ++ u8 EEPROMVersion; ++ u8 EEPROMRegulatory; ++ ++ u8 bTXPowerDataReadFromEEPORM; ++ u8 EEPROMThermalMeter; ++ u8 bAPKThermalMeterIgnore; ++ ++ bool EepromOrEfuse; ++ struct efuse_hal EfuseHal; ++ ++ u8 Index24G_CCK_Base[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ u8 Index24G_BW40_Base[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* If only one tx, only BW20 and OFDM are used. */ ++ s8 CCK_24G_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 OFDM_24G_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 BW20_24G_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ s8 BW40_24G_Diff[RF_PATH_MAX][MAX_TX_COUNT]; ++ ++ u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* For HT 40MHZ pwr */ ++ u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* For HT 40MHZ pwr */ ++ u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* HT 20<->40 Pwr diff */ ++ u8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* For HT<->legacy pwr diff */ ++ u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ /* For power group */ ++ u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; ++ ++ u8 LegacyHTTxPowerDiff;/* Legacy to HT rate power diff */ ++ /* The current Tx Power Level */ ++ u8 CurrentCckTxPwrIdx; ++ u8 CurrentOfdm24GTxPwrIdx; ++ u8 CurrentBW2024GTxPwrIdx; ++ u8 CurrentBW4024GTxPwrIdx; ++ ++ /* Read/write are allow for following hardware information variables */ ++ u8 framesync; ++ u32 framesyncC34; ++ u8 framesyncMonitor; ++ u8 DefaultInitialGain[4]; ++ u8 pwrGroupCnt; ++ u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; ++ u32 CCKTxPowerLevelOriginalOffset; ++ ++ u8 CrystalCap; ++ u32 AntennaTxPath; /* Antenna path Tx */ ++ u32 AntennaRxPath; /* Antenna path Rx */ ++ u8 BluetoothCoexist; ++ u8 ExternalPA; ++ ++ u8 bLedOpenDrain; /* Open-drain support for controlling the LED.*/ ++ ++ u8 b1x1RecvCombine; /* for 1T1R receive combining */ ++ ++ u32 AcParam_BE; /* Original parameter for BE, use for EDCA turbo. */ ++ ++ struct bb_reg_def PHYRegDef[4]; /* Radio A/B/C/D */ ++ ++ u32 RfRegChnlVal[2]; ++ ++ /* RDG enable */ ++ bool bRDGEnable; ++ ++ /* for host message to fw */ ++ u8 LastHMEBoxNum; ++ ++ u8 fw_ractrl; ++ u8 RegTxPause; ++ /* Beacon function related global variable. */ ++ u32 RegBcnCtrlVal; ++ u8 RegFwHwTxQCtrl; ++ u8 RegReg542; ++ u8 RegCR_1; ++ ++ struct dm_priv dmpriv; ++ struct odm_dm_struct odmpriv; ++ struct sreset_priv srestpriv; ++ ++ u8 CurAntenna; ++ u8 AntDivCfg; ++ u8 TRxAntDivType; ++ ++ u8 bDumpRxPkt;/* for debug */ ++ u8 bDumpTxPkt;/* for debug */ ++ u8 FwRsvdPageStartOffset; /* Reserve page start offset except ++ * beacon in TxQ. */ ++ ++ /* 2010/08/09 MH Add CU power down mode. */ ++ bool pwrdown; ++ ++ /* Add for dual MAC 0--Mac0 1--Mac1 */ ++ u32 interfaceIndex; ++ ++ u8 OutEpQueueSel; ++ u8 OutEpNumber; ++ ++ /* Add for USB aggreation mode dynamic shceme. */ ++ bool UsbRxHighSpeedMode; ++ ++ /* 2010/11/22 MH Add for slim combo debug mode selective. */ ++ /* This is used for fix the drawback of CU TSMC-A/UMC-A cut. ++ * HW auto suspend ability. Close BT clock. */ ++ bool SlimComboDbg; ++ ++ u16 EfuseUsedBytes; ++ ++#ifdef CONFIG_88EU_P2P ++ struct P2P_PS_Offload_t p2p_ps_offload; ++#endif ++ ++ /* Auto FSM to Turn On, include clock, isolation, power control ++ * for MAC only */ ++ u8 bMacPwrCtrlOn; ++ ++ u32 UsbBulkOutSize; ++ ++ /* Interrupt relatd register information. */ ++ u32 IntArray[3];/* HISR0,HISR1,HSISR */ ++ u32 IntrMask[3]; ++ u8 C2hArray[16]; ++ u8 UsbTxAggMode; ++ u8 UsbTxAggDescNum; ++ u16 HwRxPageSize; /* Hardware setting */ ++ u32 MaxUsbRxAggBlock; ++ ++ enum usb_rx_agg_mode UsbRxAggMode; ++ u8 UsbRxAggBlockCount; /* USB Block count. Block size is ++ * 512-byte in high speed and 64-byte ++ * in full speed */ ++ u8 UsbRxAggBlockTimeout; ++ u8 UsbRxAggPageCount; /* 8192C DMA page count */ ++ u8 UsbRxAggPageTimeout; ++}; ++ ++#define GET_HAL_DATA(__pAdapter) \ ++ ((struct hal_data_8188e *)((__pAdapter)->HalData)) ++#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) ++ ++#define INCLUDE_MULTI_FUNC_BT(_Adapter) \ ++ (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) ++#define INCLUDE_MULTI_FUNC_GPS(_Adapter) \ ++ (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) ++ ++/* rtl8188e_hal_init.c */ ++s32 rtl8188e_FirmwareDownload(struct adapter *padapter); ++void _8051Reset88E(struct adapter *padapter); ++void rtl8188e_InitializeFirmwareVars(struct adapter *padapter); ++ ++s32 InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy); ++ ++/* EFuse */ ++u8 GetEEPROMSize8188E(struct adapter *padapter); ++void Hal_InitPGData88E(struct adapter *padapter); ++void Hal_EfuseParseIDCode88E(struct adapter *padapter, u8 *hwinfo); ++void Hal_ReadTxPowerInfo88E(struct adapter *padapter, u8 *hwinfo, ++ bool AutoLoadFail); ++ ++void Hal_EfuseParseEEPROMVer88E(struct adapter *padapter, u8 *hwinfo, ++ bool AutoLoadFail); ++void rtl8188e_EfuseParseChnlPlan(struct adapter *padapter, u8 *hwinfo, ++ bool AutoLoadFail); ++void Hal_EfuseParseCustomerID88E(struct adapter *padapter, u8 *hwinfo, ++ bool AutoLoadFail); ++void Hal_ReadAntennaDiversity88E(struct adapter *pAdapter,u8 *PROMContent, ++ bool AutoLoadFail); ++void Hal_ReadThermalMeter_88E(struct adapter * dapter, u8 *PROMContent, ++ bool AutoloadFail); ++void Hal_EfuseParseXtal_8188E(struct adapter *pAdapter, u8 *hwinfo, ++ bool AutoLoadFail); ++void Hal_EfuseParseBoardType88E(struct adapter *pAdapter, u8 *hwinfo, ++ bool AutoLoadFail); ++void Hal_ReadPowerSavingMode88E(struct adapter *pAdapter, u8 *hwinfo, ++ bool AutoLoadFail); ++ ++bool HalDetectPwrDownMode88E(struct adapter *Adapter); ++ ++void Hal_InitChannelPlan(struct adapter *padapter); ++void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc); ++ ++/* register */ ++void SetBcnCtrlReg(struct adapter *padapter, u8 SetBits, u8 ClearBits); ++ ++void rtl8188e_clone_haldata(struct adapter *dst, struct adapter *src); ++void rtl8188e_start_thread(struct adapter *padapter); ++void rtl8188e_stop_thread(struct adapter *padapter); ++ ++void rtw_IOL_cmd_tx_pkt_buf_dump(struct adapter *Adapter, int len); ++s32 rtl8188e_iol_efuse_patch(struct adapter *padapter); ++void rtw_cancel_all_timer(struct adapter *padapter); ++void _ps_open_RF(struct adapter *adapt); ++ ++#endif /* __RTL8188E_HAL_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtl8188e_led.h b/drivers/staging/r8188eu/include/rtl8188e_led.h +new file mode 100644 +index 000000000000..b00954198764 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_led.h +@@ -0,0 +1,18 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_LED_H__ ++#define __RTL8188E_LED_H__ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++/* */ ++/* Interface to manipulate LED objects. */ ++/* */ ++void rtl8188eu_InitSwLeds(struct adapter *padapter); ++void rtl8188eu_DeInitSwLeds(struct adapter *padapter); ++void SwLedOn(struct adapter *padapter, struct LED_871x *pLed); ++void SwLedOff(struct adapter *padapter, struct LED_871x *pLed); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtl8188e_recv.h b/drivers/staging/r8188eu/include/rtl8188e_recv.h +new file mode 100644 +index 000000000000..a91daf84d6c3 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_recv.h +@@ -0,0 +1,53 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_RECV_H__ ++#define __RTL8188E_RECV_H__ ++ ++#define TX_RPT1_PKT_LEN 8 ++ ++#define RECV_BLK_SZ 512 ++#define RECV_BLK_CNT 16 ++#define RECV_BLK_TH RECV_BLK_CNT ++#define RECV_BULK_IN_ADDR 0x80 ++#define RECV_INT_IN_ADDR 0x81 ++ ++#define NR_PREALLOC_RECV_SKB (8) ++ ++#define NR_RECVBUFF (4) ++ ++#define MAX_RECVBUF_SZ (15360) /* 15k < 16k */ ++ ++struct phy_stat { ++ unsigned int phydw0; ++ unsigned int phydw1; ++ unsigned int phydw2; ++ unsigned int phydw3; ++ unsigned int phydw4; ++ unsigned int phydw5; ++ unsigned int phydw6; ++ unsigned int phydw7; ++}; ++ ++/* Rx smooth factor */ ++#define Rx_Smooth_Factor (20) ++ ++enum rx_packet_type { ++ NORMAL_RX,/* Normal rx packet */ ++ TX_REPORT1,/* CCX */ ++ TX_REPORT2,/* TX RPT */ ++ HIS_REPORT,/* USB HISR RPT */ ++}; ++ ++#define INTERRUPT_MSG_FORMAT_LEN 60 ++void rtl8188eu_init_recvbuf(struct adapter *padapter, struct recv_buf *buf); ++s32 rtl8188eu_init_recv_priv(struct adapter *padapter); ++void rtl8188eu_free_recv_priv(struct adapter * padapter); ++void rtl8188eu_recv_hdl(struct adapter * padapter, struct recv_buf *precvbuf); ++void rtl8188eu_recv_tasklet(unsigned long priv); ++void rtl8188e_query_rx_phy_status(struct recv_frame *fr, struct phy_stat *phy); ++void rtl8188e_process_phy_info(struct adapter * padapter, void *prframe); ++void update_recvframe_phyinfo_88e(struct recv_frame *fra, struct phy_stat *phy); ++void update_recvframe_attrib_88e(struct recv_frame *fra, struct recv_stat *stat); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtl8188e_rf.h b/drivers/staging/r8188eu/include/rtl8188e_rf.h +new file mode 100644 +index 000000000000..da6b7f8212a3 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_rf.h +@@ -0,0 +1,19 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_RF_H__ ++#define __RTL8188E_RF_H__ ++ ++#define RF6052_MAX_TX_PWR 0x3F ++#define RF6052_MAX_REG 0x3F ++#define RF6052_MAX_PATH 2 ++ ++int PHY_RF6052_Config8188E(struct adapter *Adapter); ++void rtl8188e_RF_ChangeTxPath(struct adapter *Adapter, u16 DataRate); ++void rtl8188e_PHY_RF6052SetBandwidth(struct adapter *Adapter, ++ enum ht_channel_width Bandwidth); ++void rtl8188e_PHY_RF6052SetCckTxPower(struct adapter *Adapter, u8 *level); ++void rtl8188e_PHY_RF6052SetOFDMTxPower(struct adapter *Adapter, u8 *ofdm, ++ u8 *pwrbw20, u8 *pwrbw40, u8 channel); ++ ++#endif/* __RTL8188E_RF_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtl8188e_spec.h b/drivers/staging/r8188eu/include/rtl8188e_spec.h +new file mode 100644 +index 000000000000..1c96f7b81245 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_spec.h +@@ -0,0 +1,1381 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_SPEC_H__ ++#define __RTL8188E_SPEC_H__ ++ ++/* 8192C Regsiter offset definition */ ++ ++#define HAL_PS_TIMER_INT_DELAY 50 /* 50 microseconds */ ++#define HAL_92C_NAV_UPPER_UNIT 128 /* micro-second */ ++ ++#define MAC_ADDR_LEN 6 ++/* 8188E PKT_BUFF_ACCESS_CTRL value */ ++#define TXPKT_BUF_SELECT 0x69 ++#define RXPKT_BUF_SELECT 0xA5 ++#define DISABLE_TRXPKT_BUF_ACCESS 0x0 ++ ++/* 0x0000h ~ 0x00FFh System Configuration */ ++#define REG_SYS_ISO_CTRL 0x0000 ++#define REG_SYS_FUNC_EN 0x0002 ++#define REG_APS_FSMCO 0x0004 ++#define REG_SYS_CLKR 0x0008 ++#define REG_9346CR 0x000A ++#define REG_EE_VPD 0x000C ++#define REG_AFE_MISC 0x0010 ++#define REG_SPS0_CTRL 0x0011 ++#define REG_SPS_OCP_CFG 0x0018 ++#define REG_RSV_CTRL 0x001C ++#define REG_RF_CTRL 0x001F ++#define REG_LDOA15_CTRL 0x0020 ++#define REG_LDOV12D_CTRL 0x0021 ++#define REG_LDOHCI12_CTRL 0x0022 ++#define REG_LPLDO_CTRL 0x0023 ++#define REG_AFE_XTAL_CTRL 0x0024 ++#define REG_AFE_PLL_CTRL 0x0028 ++#define REG_APE_PLL_CTRL_EXT 0x002c ++#define REG_EFUSE_CTRL 0x0030 ++#define REG_EFUSE_TEST 0x0034 ++#define REG_GPIO_MUXCFG 0x0040 ++#define REG_GPIO_IO_SEL 0x0042 ++#define REG_MAC_PINMUX_CFG 0x0043 ++#define REG_GPIO_PIN_CTRL 0x0044 ++#define REG_GPIO_INTM 0x0048 ++#define REG_LEDCFG0 0x004C ++#define REG_LEDCFG1 0x004D ++#define REG_LEDCFG2 0x004E ++#define REG_LEDCFG3 0x004F ++#define REG_FSIMR 0x0050 ++#define REG_FSISR 0x0054 ++#define REG_HSIMR 0x0058 ++#define REG_HSISR 0x005c ++#define REG_GPIO_PIN_CTRL_2 0x0060 /* RTL8723 WIFI/BT/GPS ++ * Multi-Function GPIO Pin Control. */ ++#define REG_GPIO_IO_SEL_2 0x0062 /* RTL8723 WIFI/BT/GPS ++ * Multi-Function GPIO Select. */ ++#define REG_BB_PAD_CTRL 0x0064 ++#define REG_MULTI_FUNC_CTRL 0x0068 /* RTL8723 WIFI/BT/GPS ++ * Multi-Function control source. */ ++#define REG_GPIO_OUTPUT 0x006c ++#define REG_AFE_XTAL_CTRL_EXT 0x0078 /* RTL8188E */ ++#define REG_XCK_OUT_CTRL 0x007c /* RTL8188E */ ++#define REG_MCUFWDL 0x0080 ++#define REG_WOL_EVENT 0x0081 /* RTL8188E */ ++#define REG_MCUTSTCFG 0x0084 ++#define REG_HMEBOX_E0 0x0088 ++#define REG_HMEBOX_E1 0x008A ++#define REG_HMEBOX_E2 0x008C ++#define REG_HMEBOX_E3 0x008E ++#define REG_HMEBOX_EXT_0 0x01F0 ++#define REG_HMEBOX_EXT_1 0x01F4 ++#define REG_HMEBOX_EXT_2 0x01F8 ++#define REG_HMEBOX_EXT_3 0x01FC ++#define REG_HIMR_88E 0x00B0 ++#define REG_HISR_88E 0x00B4 ++#define REG_HIMRE_88E 0x00B8 ++#define REG_HISRE_88E 0x00BC ++#define REG_EFUSE_ACCESS 0x00CF /* Efuse access protection ++ * for RTL8723 */ ++#define REG_BIST_SCAN 0x00D0 ++#define REG_BIST_RPT 0x00D4 ++#define REG_BIST_ROM_RPT 0x00D8 ++#define REG_USB_SIE_INTF 0x00E0 ++#define REG_PCIE_MIO_INTF 0x00E4 ++#define REG_PCIE_MIO_INTD 0x00E8 ++#define REG_HPON_FSM 0x00EC ++#define REG_SYS_CFG 0x00F0 ++#define REG_GPIO_OUTSTS 0x00F4 /* For RTL8723 only. */ ++#define REG_TYPE_ID 0x00FC ++ ++#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 ++ ++/* 0x0100h ~ 0x01FFh MACTOP General Configuration */ ++#define REG_CR 0x0100 ++#define REG_PBP 0x0104 ++#define REG_PKT_BUFF_ACCESS_CTRL 0x0106 ++#define REG_TRXDMA_CTRL 0x010C ++#define REG_TRXFF_BNDY 0x0114 ++#define REG_TRXFF_STATUS 0x0118 ++#define REG_RXFF_PTR 0x011C ++/* define REG_HIMR 0x0120 */ ++/* define REG_HISR 0x0124 */ ++#define REG_HIMRE 0x0128 ++#define REG_HISRE 0x012C ++#define REG_CPWM 0x012F ++#define REG_FWIMR 0x0130 ++#define REG_FTIMR 0x0138 ++#define REG_FWISR 0x0134 ++#define REG_PKTBUF_DBG_CTRL 0x0140 ++#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) ++#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) ++#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) ++#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) ++#define REG_PKTBUF_DBG_DATA_L 0x0144 ++#define REG_PKTBUF_DBG_DATA_H 0x0148 ++ ++#define REG_TC0_CTRL 0x0150 ++#define REG_TC1_CTRL 0x0154 ++#define REG_TC2_CTRL 0x0158 ++#define REG_TC3_CTRL 0x015C ++#define REG_TC4_CTRL 0x0160 ++#define REG_TCUNIT_BASE 0x0164 ++#define REG_MBIST_START 0x0174 ++#define REG_MBIST_DONE 0x0178 ++#define REG_MBIST_FAIL 0x017C ++#define REG_32K_CTRL 0x0194 /* RTL8188E */ ++#define REG_C2HEVT_MSG_NORMAL 0x01A0 ++#define REG_C2HEVT_CLEAR 0x01AF ++#define REG_MCUTST_1 0x01c0 ++#define REG_FMETHR 0x01C8 ++#define REG_HMETFR 0x01CC ++#define REG_HMEBOX_0 0x01D0 ++#define REG_HMEBOX_1 0x01D4 ++#define REG_HMEBOX_2 0x01D8 ++#define REG_HMEBOX_3 0x01DC ++ ++#define REG_LLT_INIT 0x01E0 ++ ++/* 0x0200h ~ 0x027Fh TXDMA Configuration */ ++#define REG_RQPN 0x0200 ++#define REG_FIFOPAGE 0x0204 ++#define REG_TDECTRL 0x0208 ++#define REG_TXDMA_OFFSET_CHK 0x020C ++#define REG_TXDMA_STATUS 0x0210 ++#define REG_RQPN_NPQ 0x0214 ++ ++/* 0x0280h ~ 0x02FFh RXDMA Configuration */ ++#define REG_RXDMA_AGG_PG_TH 0x0280 ++#define REG_RXPKT_NUM 0x0284 ++#define REG_RXDMA_STATUS 0x0288 ++ ++/* 0x0300h ~ 0x03FFh PCIe */ ++#define REG_PCIE_CTRL_REG 0x0300 ++#define REG_INT_MIG 0x0304 /* Interrupt Migration */ ++#define REG_BCNQ_DESA 0x0308 /* TX Beacon Descr Address */ ++#define REG_HQ_DESA 0x0310 /* TX High Queue Descr Addr */ ++#define REG_MGQ_DESA 0x0318 /* TX Manage Queue Descr Addr*/ ++#define REG_VOQ_DESA 0x0320 /* TX VO Queue Descr Addr */ ++#define REG_VIQ_DESA 0x0328 /* TX VI Queue Descr Addr */ ++#define REG_BEQ_DESA 0x0330 /* TX BE Queue Descr Addr */ ++#define REG_BKQ_DESA 0x0338 /* TX BK Queue Descr Addr */ ++#define REG_RX_DESA 0x0340 /* RX Queue Descr Addr */ ++#define REG_MDIO 0x0354 /* MDIO for Access PCIE PHY */ ++#define REG_DBG_SEL 0x0360 /* Debug Selection Register */ ++#define REG_PCIE_HRPWM 0x0361 /* PCIe RPWM */ ++#define REG_PCIE_HCPWM 0x0363 /* PCIe CPWM */ ++#define REG_WATCH_DOG 0x0368 ++ ++/* RTL8723 series ------------------------------ */ ++#define REG_PCIE_HISR 0x03A0 ++ ++/* spec version 11 */ ++/* 0x0400h ~ 0x047Fh Protocol Configuration */ ++#define REG_VOQ_INFORMATION 0x0400 ++#define REG_VIQ_INFORMATION 0x0404 ++#define REG_BEQ_INFORMATION 0x0408 ++#define REG_BKQ_INFORMATION 0x040C ++#define REG_MGQ_INFORMATION 0x0410 ++#define REG_HGQ_INFORMATION 0x0414 ++#define REG_BCNQ_INFORMATION 0x0418 ++#define REG_TXPKT_EMPTY 0x041A ++ ++#define REG_CPU_MGQ_INFORMATION 0x041C ++#define REG_FWHW_TXQ_CTRL 0x0420 ++#define REG_HWSEQ_CTRL 0x0423 ++#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 ++#define REG_TXPKTBUF_MGQ_BDNY 0x0425 ++#define REG_LIFETIME_EN 0x0426 ++#define REG_MULTI_BCNQ_OFFSET 0x0427 ++#define REG_SPEC_SIFS 0x0428 ++#define REG_RL 0x042A ++#define REG_DARFRC 0x0430 ++#define REG_RARFRC 0x0438 ++#define REG_RRSR 0x0440 ++#define REG_ARFR0 0x0444 ++#define REG_ARFR1 0x0448 ++#define REG_ARFR2 0x044C ++#define REG_ARFR3 0x0450 ++#define REG_AGGLEN_LMT 0x0458 ++#define REG_AMPDU_MIN_SPACE 0x045C ++#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D ++#define REG_FAST_EDCA_CTRL 0x0460 ++#define REG_RD_RESP_PKT_TH 0x0463 ++#define REG_INIRTS_RATE_SEL 0x0480 ++/* define REG_INIDATA_RATE_SEL 0x0484 */ ++#define REG_POWER_STATUS 0x04A4 ++#define REG_POWER_STAGE1 0x04B4 ++#define REG_POWER_STAGE2 0x04B8 ++#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 ++#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 ++#define REG_STBC_SETTING 0x04C4 ++#define REG_PROT_MODE_CTRL 0x04C8 ++#define REG_MAX_AGGR_NUM 0x04CA ++#define REG_RTS_MAX_AGGR_NUM 0x04CB ++#define REG_BAR_MODE_CTRL 0x04CC ++#define REG_RA_TRY_RATE_AGG_LMT 0x04CF ++#define REG_EARLY_MODE_CONTROL 0x4D0 ++#define REG_NQOS_SEQ 0x04DC ++#define REG_QOS_SEQ 0x04DE ++#define REG_NEED_CPU_HANDLE 0x04E0 ++#define REG_PKT_LOSE_RPT 0x04E1 ++#define REG_PTCL_ERR_STATUS 0x04E2 ++#define REG_TX_RPT_CTRL 0x04EC ++#define REG_TX_RPT_TIME 0x04F0 /* 2 byte */ ++#define REG_DUMMY 0x04FC ++ ++/* 0x0500h ~ 0x05FFh EDCA Configuration */ ++#define REG_EDCA_VO_PARAM 0x0500 ++#define REG_EDCA_VI_PARAM 0x0504 ++#define REG_EDCA_BE_PARAM 0x0508 ++#define REG_EDCA_BK_PARAM 0x050C ++#define REG_BCNTCFG 0x0510 ++#define REG_PIFS 0x0512 ++#define REG_RDG_PIFS 0x0513 ++#define REG_SIFS_CTX 0x0514 ++#define REG_SIFS_TRX 0x0516 ++#define REG_TSFTR_SYN_OFFSET 0x0518 ++#define REG_AGGR_BREAK_TIME 0x051A ++#define REG_SLOT 0x051B ++#define REG_TX_PTCL_CTRL 0x0520 ++#define REG_TXPAUSE 0x0522 ++#define REG_DIS_TXREQ_CLR 0x0523 ++#define REG_RD_CTRL 0x0524 ++/* Format for offset 540h-542h: */ ++/* [3:0]: TBTT prohibit setup in unit of 32us. The time for HW getting ++ * beacon content before TBTT. */ ++/* [7:4]: Reserved. */ ++/* [19:8]: TBTT prohibit hold in unit of 32us. The time for HW holding ++ * to send the beacon packet. */ ++/* [23:20]: Reserved */ ++/* Description: */ ++/* | */ ++/* |<--Setup--|--Hold------------>| */ ++/* --------------|---------------------- */ ++/* | */ ++/* TBTT */ ++/* Note: We cannot update beacon content to HW or send any AC packets during ++ * the time between Setup and Hold. */ ++#define REG_TBTT_PROHIBIT 0x0540 ++#define REG_RD_NAV_NXT 0x0544 ++#define REG_NAV_PROT_LEN 0x0546 ++#define REG_BCN_CTRL 0x0550 ++#define REG_BCN_CTRL_1 0x0551 ++#define REG_MBID_NUM 0x0552 ++#define REG_DUAL_TSF_RST 0x0553 ++#define REG_BCN_INTERVAL 0x0554 ++#define REG_DRVERLYINT 0x0558 ++#define REG_BCNDMATIM 0x0559 ++#define REG_ATIMWND 0x055A ++#define REG_BCN_MAX_ERR 0x055D ++#define REG_RXTSF_OFFSET_CCK 0x055E ++#define REG_RXTSF_OFFSET_OFDM 0x055F ++#define REG_TSFTR 0x0560 ++#define REG_TSFTR1 0x0568 ++#define REG_ATIMWND_1 0x0570 ++#define REG_PSTIMER 0x0580 ++#define REG_TIMER0 0x0584 ++#define REG_TIMER1 0x0588 ++#define REG_ACMHWCTRL 0x05C0 ++ ++/* define REG_FW_TSF_SYNC_CNT 0x04A0 */ ++#define REG_FW_RESET_TSF_CNT_1 0x05FC ++#define REG_FW_RESET_TSF_CNT_0 0x05FD ++#define REG_FW_BCN_DIS_CNT 0x05FE ++ ++/* 0x0600h ~ 0x07FFh WMAC Configuration */ ++#define REG_APSD_CTRL 0x0600 ++#define REG_BWOPMODE 0x0603 ++#define REG_TCR 0x0604 ++#define REG_RCR 0x0608 ++#define REG_RX_PKT_LIMIT 0x060C ++#define REG_RX_DLK_TIME 0x060D ++#define REG_RX_DRVINFO_SZ 0x060F ++ ++#define REG_MACID 0x0610 ++#define REG_BSSID 0x0618 ++#define REG_MAR 0x0620 ++#define REG_MBIDCAMCFG 0x0628 ++ ++#define REG_USTIME_EDCA 0x0638 ++#define REG_MAC_SPEC_SIFS 0x063A ++ ++/* 20100719 Joseph: Hardware register definition change. (HW datasheet v54) */ ++/* [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK */ ++#define REG_R2T_SIFS 0x063C ++/* [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK */ ++#define REG_T2T_SIFS 0x063E ++#define REG_ACKTO 0x0640 ++#define REG_CTS2TO 0x0641 ++#define REG_EIFS 0x0642 ++ ++/* RXERR_RPT */ ++#define RXERR_TYPE_OFDM_PPDU 0 ++#define RXERR_TYPE_OFDM_false_ALARM 1 ++#define RXERR_TYPE_OFDM_MPDU_OK 2 ++#define RXERR_TYPE_OFDM_MPDU_FAIL 3 ++#define RXERR_TYPE_CCK_PPDU 4 ++#define RXERR_TYPE_CCK_false_ALARM 5 ++#define RXERR_TYPE_CCK_MPDU_OK 6 ++#define RXERR_TYPE_CCK_MPDU_FAIL 7 ++#define RXERR_TYPE_HT_PPDU 8 ++#define RXERR_TYPE_HT_false_ALARM 9 ++#define RXERR_TYPE_HT_MPDU_TOTAL 10 ++#define RXERR_TYPE_HT_MPDU_OK 11 ++#define RXERR_TYPE_HT_MPDU_FAIL 12 ++#define RXERR_TYPE_RX_FULL_DROP 15 ++ ++#define RXERR_COUNTER_MASK 0xFFFFF ++#define RXERR_RPT_RST BIT(27) ++#define _RXERR_RPT_SEL(type) ((type) << 28) ++ ++/* Note: */ ++/* The NAV upper value is very important to WiFi 11n 5.2.3 NAV test. ++ * The default value is always too small, but the WiFi TestPlan test ++ * by 25,000 microseconds of NAV through sending CTS in the air. ++ * We must update this value greater than 25,000 microseconds to pass ++ * the item. The offset of NAV_UPPER in 8192C Spec is incorrect, and ++ * the offset should be 0x0652. */ ++#define REG_NAV_UPPER 0x0652 /* unit of 128 */ ++ ++/* WMA, BA, CCX */ ++/* define REG_NAV_CTRL 0x0650 */ ++#define REG_BACAMCMD 0x0654 ++#define REG_BACAMCONTENT 0x0658 ++#define REG_LBDLY 0x0660 ++#define REG_FWDLY 0x0661 ++#define REG_RXERR_RPT 0x0664 ++#define REG_WMAC_TRXPTCL_CTL 0x0668 ++ ++/* Security */ ++#define REG_CAMCMD 0x0670 ++#define REG_CAMWRITE 0x0674 ++#define REG_CAMREAD 0x0678 ++#define REG_CAMDBG 0x067C ++#define REG_SECCFG 0x0680 ++ ++/* Power */ ++#define REG_WOW_CTRL 0x0690 ++#define REG_PS_RX_INFO 0x0692 ++#define REG_UAPSD_TID 0x0693 ++#define REG_WKFMCAM_CMD 0x0698 ++#define REG_WKFMCAM_NUM_88E 0x698 ++#define REG_RXFLTMAP0 0x06A0 ++#define REG_RXFLTMAP1 0x06A2 ++#define REG_RXFLTMAP2 0x06A4 ++#define REG_BCN_PSR_RPT 0x06A8 ++#define REG_BT_COEX_TABLE 0x06C0 ++ ++/* Hardware Port 2 */ ++#define REG_MACID1 0x0700 ++#define REG_BSSID1 0x0708 ++ ++/* 0xFE00h ~ 0xFE55h USB Configuration */ ++#define REG_USB_INFO 0xFE17 ++#define REG_USB_SPECIAL_OPTION 0xFE55 ++#define REG_USB_DMA_AGG_TO 0xFE5B ++#define REG_USB_AGG_TO 0xFE5C ++#define REG_USB_AGG_TH 0xFE5D ++ ++/* For normal chip */ ++#define REG_NORMAL_SIE_VID 0xFE60 /* 0xFE60~0xFE61 */ ++#define REG_NORMAL_SIE_PID 0xFE62 /* 0xFE62~0xFE63 */ ++#define REG_NORMAL_SIE_OPTIONAL 0xFE64 ++#define REG_NORMAL_SIE_EP 0xFE65 /* 0xFE65~0xFE67 */ ++#define REG_NORMAL_SIE_PHY 0xFE68 /* 0xFE68~0xFE6B */ ++#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C ++#define REG_NORMAL_SIE_GPS_EP 0xFE6D /* 0xFE6D, for RTL8723 only. */ ++#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 /* 0xFE70~0xFE75 */ ++#define REG_NORMAL_SIE_STRING 0xFE80 /* 0xFE80~0xFEDF */ ++ ++/* TODO: use these definition when using REG_xxx naming rule. */ ++/* NOTE: DO NOT Remove these definition. Use later. */ ++ ++#define EFUSE_CTRL REG_EFUSE_CTRL /* E-Fuse Control. */ ++#define EFUSE_TEST REG_EFUSE_TEST /* E-Fuse Test. */ ++#define MSR (REG_CR + 2) /* Media Status reg */ ++#define ISR REG_HISR_88E ++/* Timing Sync Function Timer Register. */ ++#define TSFR REG_TSFTR ++ ++#define PBP REG_PBP ++ ++/* Redifine MACID register, to compatible prior ICs. */ ++/* MAC ID Register, Offset 0x0050-0x0053 */ ++#define IDR0 REG_MACID ++/* MAC ID Register, Offset 0x0054-0x0055 */ ++#define IDR4 (REG_MACID + 4) ++ ++/* 9. Security Control Registers (Offset: ) */ ++/* IN 8190 Data Sheet is called CAMcmd */ ++#define RWCAM REG_CAMCMD ++/* Software write CAM input content */ ++#define WCAMI REG_CAMWRITE ++/* Software read/write CAM config */ ++#define RCAMO REG_CAMREAD ++#define CAMDBG REG_CAMDBG ++/* Security Configuration Register */ ++#define SECR REG_SECCFG ++ ++/* Unused register */ ++#define UnusedRegister 0x1BF ++#define DCAM UnusedRegister ++#define PSR UnusedRegister ++#define BBAddr UnusedRegister ++#define PhyDataR UnusedRegister ++ ++/* Min Spacing related settings. */ ++#define MAX_MSS_DENSITY_2T 0x13 ++#define MAX_MSS_DENSITY_1T 0x0A ++ ++/* EEPROM enable when set 1 */ ++#define CmdEEPROM_En BIT(5) ++/* System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 */ ++#define CmdEERPOMSEL BIT(4) ++#define Cmd9346CR_9356SEL BIT(4) ++ ++/* 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) */ ++#define GPIOSEL_GPIO 0 ++#define GPIOSEL_ENBT BIT(5) ++ ++/* 8192C GPIO PIN Control Register (offset 0x44, 4 byte) */ ++/* GPIO pins input value */ ++#define GPIO_IN REG_GPIO_PIN_CTRL ++/* GPIO pins output value */ ++#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) ++/* GPIO pins output enable when a bit is set to "1"; otherwise, ++ * input is configured. */ ++#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) ++#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) ++ ++/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */ ++#define HSIMR_GPIO12_0_INT_EN BIT(0) ++#define HSIMR_SPS_OCP_INT_EN BIT(5) ++#define HSIMR_RON_INT_EN BIT(6) ++#define HSIMR_PDN_INT_EN BIT(7) ++#define HSIMR_GPIO9_INT_EN BIT(25) ++ ++/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */ ++#define HSISR_GPIO12_0_INT BIT(0) ++#define HSISR_SPS_OCP_INT BIT(5) ++#define HSISR_RON_INT_EN BIT(6) ++#define HSISR_PDNINT BIT(7) ++#define HSISR_GPIO9_INT BIT(25) ++ ++/* 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) */ ++/* ++Network Type ++00: No link ++01: Link in ad hoc network ++10: Link in infrastructure network ++11: AP mode ++Default: 00b. ++*/ ++#define MSR_NOLINK 0x00 ++#define MSR_ADHOC 0x01 ++#define MSR_INFRA 0x02 ++#define MSR_AP 0x03 ++ ++/* 88EU (MSR) Media Status Register (Offset 0x4C, 8 bits) */ ++#define USB_INTR_CONTENT_C2H_OFFSET 0 ++#define USB_INTR_CONTENT_CPWM1_OFFSET 16 ++#define USB_INTR_CONTENT_CPWM2_OFFSET 20 ++#define USB_INTR_CONTENT_HISR_OFFSET 48 ++#define USB_INTR_CONTENT_HISRE_OFFSET 52 ++ ++/* 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits) */ ++/* IOL config for REG_FDHM0(Reg0x88) */ ++#define CMD_INIT_LLT BIT(0) ++#define CMD_READ_EFUSE_MAP BIT(1) ++#define CMD_EFUSE_PATCH BIT(2) ++#define CMD_IOCONFIG BIT(3) ++#define CMD_INIT_LLT_ERR BIT(4) ++#define CMD_READ_EFUSE_MAP_ERR BIT(5) ++#define CMD_EFUSE_PATCH_ERR BIT(6) ++#define CMD_IOCONFIG_ERR BIT(7) ++ ++/* 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) */ ++/* 8192C Response Rate Set Register (offset 0x181, 24bits) */ ++#define RRSR_1M BIT(0) ++#define RRSR_2M BIT(1) ++#define RRSR_5_5M BIT(2) ++#define RRSR_11M BIT(3) ++#define RRSR_6M BIT(4) ++#define RRSR_9M BIT(5) ++#define RRSR_12M BIT(6) ++#define RRSR_18M BIT(7) ++#define RRSR_24M BIT(8) ++#define RRSR_36M BIT(9) ++#define RRSR_48M BIT(10) ++#define RRSR_54M BIT(11) ++#define RRSR_MCS0 BIT(12) ++#define RRSR_MCS1 BIT(13) ++#define RRSR_MCS2 BIT(14) ++#define RRSR_MCS3 BIT(15) ++#define RRSR_MCS4 BIT(16) ++#define RRSR_MCS5 BIT(17) ++#define RRSR_MCS6 BIT(18) ++#define RRSR_MCS7 BIT(19) ++ ++/* 8192C Response Rate Set Register (offset 0x1BF, 8bits) */ ++/* WOL bit information */ ++#define HAL92C_WOL_PTK_UPDATE_EVENT BIT(0) ++#define HAL92C_WOL_GTK_UPDATE_EVENT BIT(1) ++ ++/* 8192C BW_OPMODE bits (Offset 0x203, 8bit) */ ++#define BW_OPMODE_20MHZ BIT(2) ++ ++/* 8192C CAM Config Setting (offset 0x250, 1 byte) */ ++#define CAM_VALID BIT(15) ++#define CAM_NOTVALID 0x0000 ++#define CAM_USEDK BIT(5) ++ ++#define CAM_CONTENT_COUNT 8 ++ ++#define CAM_NONE 0x0 ++#define CAM_WEP40 0x01 ++#define CAM_TKIP 0x02 ++#define CAM_AES 0x04 ++#define CAM_WEP104 0x05 ++#define CAM_SMS4 0x6 ++ ++#define TOTAL_CAM_ENTRY 32 ++#define HALF_CAM_ENTRY 16 ++ ++#define CAM_CONFIG_USEDK true ++#define CAM_CONFIG_NO_USEDK false ++ ++#define CAM_WRITE BIT(16) ++#define CAM_READ 0x00000000 ++#define CAM_POLLINIG BIT(31) ++ ++#define SCR_UseDK 0x01 ++#define SCR_TxSecEnable 0x02 ++#define SCR_RxSecEnable 0x04 ++ ++/* 10. Power Save Control Registers (Offset: 0x0260 - 0x02DF) */ ++#define WOW_PMEN BIT(0) /* Power management Enable. */ ++#define WOW_WOMEN BIT(1) /* WoW function on or off. */ ++#define WOW_MAGIC BIT(2) /* Magic packet */ ++#define WOW_UWF BIT(3) /* Unicast Wakeup frame. */ ++ ++/* 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) */ ++/* 8188 IMR/ISR bits */ ++#define IMR_DISABLED_88E 0x0 ++/* IMR DW0(0x0060-0063) Bit 0-31 */ ++#define IMR_TXCCK_88E BIT(30) /* TXRPT interrupt when CCX bit of the packet is set */ ++#define IMR_PSTIMEOUT_88E BIT(29) /* Power Save Time Out Interrupt */ ++#define IMR_GTINT4_88E BIT(28) /* When GTIMER4 expires, this bit is set to 1 */ ++#define IMR_GTINT3_88E BIT(27) /* When GTIMER3 expires, this bit is set to 1 */ ++#define IMR_TBDER_88E BIT(26) /* Transmit Beacon0 Error */ ++#define IMR_TBDOK_88E BIT(25) /* Transmit Beacon0 OK */ ++#define IMR_TSF_BIT32_TOGGLE_88E BIT(24) /* TSF Timer BIT32 toggle indication interrupt */ ++#define IMR_BCNDMAINT0_88E BIT(20) /* Beacon DMA Interrupt 0 */ ++#define IMR_BCNDERR0_88E BIT(16) /* Beacon Queue DMA Error 0 */ ++#define IMR_HSISR_IND_ON_INT_88E BIT(15) /* HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) */ ++#define IMR_BCNDMAINT_E_88E BIT(14) /* Beacon DMA Interrupt Extension for Win7 */ ++#define IMR_ATIMEND_88E BIT(12) /* CTWidnow End or ATIM Window End */ ++#define IMR_HISR1_IND_INT_88E BIT(11) /* HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) */ ++#define IMR_C2HCMD_88E BIT(10) /* CPU to Host Command INT Status, Write 1 clear */ ++#define IMR_CPWM2_88E BIT(9) /* CPU power Mode exchange INT Status, Write 1 clear */ ++#define IMR_CPWM_88E BIT(8) /* CPU power Mode exchange INT Status, Write 1 clear */ ++#define IMR_HIGHDOK_88E BIT(7) /* High Queue DMA OK */ ++#define IMR_MGNTDOK_88E BIT(6) /* Management Queue DMA OK */ ++#define IMR_BKDOK_88E BIT(5) /* AC_BK DMA OK */ ++#define IMR_BEDOK_88E BIT(4) /* AC_BE DMA OK */ ++#define IMR_VIDOK_88E BIT(3) /* AC_VI DMA OK */ ++#define IMR_VODOK_88E BIT(2) /* AC_VO DMA OK */ ++#define IMR_RDU_88E BIT(1) /* Rx Descriptor Unavailable */ ++#define IMR_ROK_88E BIT(0) /* Receive DMA OK */ ++ ++/* IMR DW1(0x00B4-00B7) Bit 0-31 */ ++#define IMR_BCNDMAINT7_88E BIT(27) /* Beacon DMA Interrupt 7 */ ++#define IMR_BCNDMAINT6_88E BIT(26) /* Beacon DMA Interrupt 6 */ ++#define IMR_BCNDMAINT5_88E BIT(25) /* Beacon DMA Interrupt 5 */ ++#define IMR_BCNDMAINT4_88E BIT(24) /* Beacon DMA Interrupt 4 */ ++#define IMR_BCNDMAINT3_88E BIT(23) /* Beacon DMA Interrupt 3 */ ++#define IMR_BCNDMAINT2_88E BIT(22) /* Beacon DMA Interrupt 2 */ ++#define IMR_BCNDMAINT1_88E BIT(21) /* Beacon DMA Interrupt 1 */ ++#define IMR_BCNDERR7_88E BIT(20) /* Beacon DMA Error Int 7 */ ++#define IMR_BCNDERR6_88E BIT(19) /* Beacon DMA Error Int 6 */ ++#define IMR_BCNDERR5_88E BIT(18) /* Beacon DMA Error Int 5 */ ++#define IMR_BCNDERR4_88E BIT(17) /* Beacon DMA Error Int 4 */ ++#define IMR_BCNDERR3_88E BIT(16) /* Beacon DMA Error Int 3 */ ++#define IMR_BCNDERR2_88E BIT(15) /* Beacon DMA Error Int 2 */ ++#define IMR_BCNDERR1_88E BIT(14) /* Beacon DMA Error Int 1 */ ++#define IMR_ATIMEND_E_88E BIT(13) /* ATIM Window End Ext for Win7 */ ++#define IMR_TXERR_88E BIT(11) /* Tx Err Flag Int Status, write 1 clear. */ ++#define IMR_RXERR_88E BIT(10) /* Rx Err Flag INT Status, Write 1 clear */ ++#define IMR_TXFOVW_88E BIT(9) /* Transmit FIFO Overflow */ ++#define IMR_RXFOVW_88E BIT(8) /* Receive FIFO Overflow */ ++ ++#define HAL_NIC_UNPLUG_ISR 0xFFFFFFFF /* The value when the NIC is unplugged for PCI. */ ++ ++/* 8192C EFUSE */ ++#define HWSET_MAX_SIZE 256 ++#define HWSET_MAX_SIZE_88E 512 ++ ++/*=================================================================== ++===================================================================== ++Here the register defines are for 92C. When the define is as same with 92C, ++we will use the 92C's define for the consistency ++So the following defines for 92C is not entire!!!!!! ++===================================================================== ++=====================================================================*/ ++/* ++Based on Datasheet V33---090401 ++Register Summary ++Current IOREG MAP ++0x0000h ~ 0x00FFh System Configuration (256 Bytes) ++0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) ++0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) ++0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) ++0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) ++0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) ++0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) ++0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) ++0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) ++*/ ++/* 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) */ ++/* Note: */ ++/* The bits of stopping AC(VO/VI/BE/BK) queue in datasheet ++ * RTL8192S/RTL8192C are wrong, */ ++/* the correct arragement is VO - Bit0, VI - Bit1, BE - Bit2, ++ * and BK - Bit3. */ ++/* 8723 and 88E may be not correct either in the earlier version. */ ++#define StopBecon BIT(6) ++#define StopHigh BIT(5) ++#define StopMgt BIT(4) ++#define StopBK BIT(3) ++#define StopBE BIT(2) ++#define StopVI BIT(1) ++#define StopVO BIT(0) ++ ++/* 8192C (RCR) Receive Configuration Register(Offset 0x608, 32 bits) */ ++#define RCR_APPFCS BIT(31) /* WMAC append FCS after payload */ ++#define RCR_APP_MIC BIT(30) ++#define RCR_APP_PHYSTS BIT(28) ++#define RCR_APP_ICV BIT(29) ++#define RCR_APP_PHYST_RXFF BIT(28) ++#define RCR_APP_BA_SSN BIT(27) /* Accept BA SSN */ ++#define RCR_ENMBID BIT(24) /* Enable Multiple BssId. */ ++#define RCR_LSIGEN BIT(23) ++#define RCR_MFBEN BIT(22) ++#define RCR_HTC_LOC_CTRL BIT(14) /* MFC<--HTC=1 MFC-->HTC=0 */ ++#define RCR_AMF BIT(13) /* Accept management type frame */ ++#define RCR_ACF BIT(12) /* Accept control type frame */ ++#define RCR_ADF BIT(11) /* Accept data type frame */ ++#define RCR_AICV BIT(9) /* Accept ICV error packet */ ++#define RCR_ACRC32 BIT(8) /* Accept CRC32 error packet */ ++#define RCR_CBSSID_BCN BIT(7) /* Accept BSSID match packet ++ * (Rx beacon, probe rsp) */ ++#define RCR_CBSSID_DATA BIT(6) /* Accept BSSID match (Data)*/ ++#define RCR_CBSSID RCR_CBSSID_DATA /* Accept BSSID match */ ++#define RCR_APWRMGT BIT(5) /* Accept power management pkt*/ ++#define RCR_ADD3 BIT(4) /* Accept address 3 match pkt */ ++#define RCR_AB BIT(3) /* Accept broadcast packet */ ++#define RCR_AM BIT(2) /* Accept multicast packet */ ++#define RCR_APM BIT(1) /* Accept physical match pkt */ ++#define RCR_AAP BIT(0) /* Accept all unicast packet */ ++#define RCR_MXDMA_OFFSET 8 ++#define RCR_FIFO_OFFSET 13 ++ ++/* 0xFE00h ~ 0xFE55h USB Configuration */ ++#define REG_USB_INFO 0xFE17 ++#define REG_USB_SPECIAL_OPTION 0xFE55 ++#define REG_USB_DMA_AGG_TO 0xFE5B ++#define REG_USB_AGG_TO 0xFE5C ++#define REG_USB_AGG_TH 0xFE5D ++ ++#define REG_USB_HRPWM 0xFE58 ++#define REG_USB_HCPWM 0xFE57 ++/* 8192C Regsiter Bit and Content definition */ ++/* 0x0000h ~ 0x00FFh System Configuration */ ++ ++/* 2 SYS_ISO_CTRL */ ++#define ISO_MD2PP BIT(0) ++#define ISO_UA2USB BIT(1) ++#define ISO_UD2CORE BIT(2) ++#define ISO_PA2PCIE BIT(3) ++#define ISO_PD2CORE BIT(4) ++#define ISO_IP2MAC BIT(5) ++#define ISO_DIOP BIT(6) ++#define ISO_DIOE BIT(7) ++#define ISO_EB2CORE BIT(8) ++#define ISO_DIOR BIT(9) ++#define PWC_EV12V BIT(15) ++ ++/* 2 SYS_FUNC_EN */ ++#define FEN_BBRSTB BIT(0) ++#define FEN_BB_GLB_RSTn BIT(1) ++#define FEN_USBA BIT(2) ++#define FEN_UPLL BIT(3) ++#define FEN_USBD BIT(4) ++#define FEN_DIO_PCIE BIT(5) ++#define FEN_PCIEA BIT(6) ++#define FEN_PPLL BIT(7) ++#define FEN_PCIED BIT(8) ++#define FEN_DIOE BIT(9) ++#define FEN_CPUEN BIT(10) ++#define FEN_DCORE BIT(11) ++#define FEN_ELDR BIT(12) ++#define FEN_DIO_RF BIT(13) ++#define FEN_HWPDN BIT(14) ++#define FEN_MREGEN BIT(15) ++ ++/* 2 APS_FSMCO */ ++#define PFM_LDALL BIT(0) ++#define PFM_ALDN BIT(1) ++#define PFM_LDKP BIT(2) ++#define PFM_WOWL BIT(3) ++#define EnPDN BIT(4) ++#define PDN_PL BIT(5) ++#define APFM_ONMAC BIT(8) ++#define APFM_OFF BIT(9) ++#define APFM_RSM BIT(10) ++#define AFSM_HSUS BIT(11) ++#define AFSM_PCIE BIT(12) ++#define APDM_MAC BIT(13) ++#define APDM_HOST BIT(14) ++#define APDM_HPDN BIT(15) ++#define RDY_MACON BIT(16) ++#define SUS_HOST BIT(17) ++#define ROP_ALD BIT(20) ++#define ROP_PWR BIT(21) ++#define ROP_SPS BIT(22) ++#define SOP_MRST BIT(25) ++#define SOP_FUSE BIT(26) ++#define SOP_ABG BIT(27) ++#define SOP_AMB BIT(28) ++#define SOP_RCK BIT(29) ++#define SOP_A8M BIT(30) ++#define XOP_BTCK BIT(31) ++ ++/* 2 SYS_CLKR */ ++#define ANAD16V_EN BIT(0) ++#define ANA8M BIT(1) ++#define MACSLP BIT(4) ++#define LOADER_CLK_EN BIT(5) ++ ++/* 2 9346CR */ ++ ++#define BOOT_FROM_EEPROM BIT(4) ++#define EEPROM_EN BIT(5) ++ ++/* 2 SPS0_CTRL */ ++ ++/* 2 SPS_OCP_CFG */ ++ ++/* 2 RF_CTRL */ ++#define RF_EN BIT(0) ++#define RF_RSTB BIT(1) ++#define RF_SDMRSTB BIT(2) ++ ++/* 2 LDOV12D_CTRL */ ++#define LDV12_EN BIT(0) ++#define LDV12_SDBY BIT(1) ++#define LPLDO_HSM BIT(2) ++#define LPLDO_LSM_DIS BIT(3) ++#define _LDV12_VADJ(x) (((x) & 0xF) << 4) ++ ++/* 2EFUSE_CTRL */ ++#define ALD_EN BIT(18) ++#define EF_PD BIT(19) ++#define EF_FLAG BIT(31) ++ ++/* 2 EFUSE_TEST (For RTL8723 partially) */ ++#define EF_TRPT BIT(7) ++/* 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 */ ++#define EF_CELL_SEL (BIT(8)|BIT(9)) ++#define LDOE25_EN BIT(31) ++#define EFUSE_SEL(x) (((x) & 0x3) << 8) ++#define EFUSE_SEL_MASK 0x300 ++#define EFUSE_WIFI_SEL_0 0x0 ++#define EFUSE_BT_SEL_0 0x1 ++#define EFUSE_BT_SEL_1 0x2 ++#define EFUSE_BT_SEL_2 0x3 ++ ++#define EFUSE_ACCESS_ON 0x69 /* For RTL8723 only. */ ++#define EFUSE_ACCESS_OFF 0x00 /* For RTL8723 only. */ ++ ++/* 2 8051FWDL */ ++/* 2 MCUFWDL */ ++#define MCUFWDL_EN BIT(0) ++#define MCUFWDL_RDY BIT(1) ++#define FWDL_ChkSum_rpt BIT(2) ++#define MACINI_RDY BIT(3) ++#define BBINI_RDY BIT(4) ++#define RFINI_RDY BIT(5) ++#define WINTINI_RDY BIT(6) ++#define RAM_DL_SEL BIT(7) /* 1:RAM, 0:ROM */ ++#define ROM_DLEN BIT(19) ++#define CPRST BIT(23) ++ ++/* 2 REG_SYS_CFG */ ++#define XCLK_VLD BIT(0) ++#define ACLK_VLD BIT(1) ++#define UCLK_VLD BIT(2) ++#define PCLK_VLD BIT(3) ++#define PCIRSTB BIT(4) ++#define V15_VLD BIT(5) ++#define SW_OFFLOAD_EN BIT(7) ++#define SIC_IDLE BIT(8) ++#define BD_MAC2 BIT(9) ++#define BD_MAC1 BIT(10) ++#define IC_MACPHY_MODE BIT(11) ++#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) ++#define BT_FUNC BIT(16) ++#define VENDOR_ID BIT(19) ++#define PAD_HWPD_IDN BIT(22) ++#define TRP_VAUX_EN BIT(23) /* RTL ID */ ++#define TRP_BT_EN BIT(24) ++#define BD_PKG_SEL BIT(25) ++#define BD_HCI_SEL BIT(26) ++#define TYPE_ID BIT(27) ++ ++#define CHIP_VER_RTL_MASK 0xF000 /* Bit 12 ~ 15 */ ++#define CHIP_VER_RTL_SHIFT 12 ++ ++/* 2REG_GPIO_OUTSTS (For RTL8723 only) */ ++#define EFS_HCI_SEL (BIT(0)|BIT(1)) ++#define PAD_HCI_SEL (BIT(2)|BIT(3)) ++#define HCI_SEL (BIT(4)|BIT(5)) ++#define PKG_SEL_HCI BIT(6) ++#define FEN_GPS BIT(7) ++#define FEN_BT BIT(8) ++#define FEN_WL BIT(9) ++#define FEN_PCI BIT(10) ++#define FEN_USB BIT(11) ++#define BTRF_HWPDN_N BIT(12) ++#define WLRF_HWPDN_N BIT(13) ++#define PDN_BT_N BIT(14) ++#define PDN_GPS_N BIT(15) ++#define BT_CTL_HWPDN BIT(16) ++#define GPS_CTL_HWPDN BIT(17) ++#define PPHY_SUSB BIT(20) ++#define UPHY_SUSB BIT(21) ++#define PCI_SUSEN BIT(22) ++#define USB_SUSEN BIT(23) ++#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) ++ ++/* 2SYS_CFG */ ++#define RTL_ID BIT(23) /* TestChip ID, 1:Test(RLE); 0:MP(RL) */ ++ ++/* 0x0100h ~ 0x01FFh MACTOP General Configuration */ ++ ++/* 2 Function Enable Registers */ ++/* 2 CR */ ++ ++#define HCI_TXDMA_EN BIT(0) ++#define HCI_RXDMA_EN BIT(1) ++#define TXDMA_EN BIT(2) ++#define RXDMA_EN BIT(3) ++#define PROTOCOL_EN BIT(4) ++#define SCHEDULE_EN BIT(5) ++#define MACTXEN BIT(6) ++#define MACRXEN BIT(7) ++#define ENSWBCN BIT(8) ++#define ENSEC BIT(9) ++#define CALTMR_EN BIT(10) /* 32k CAL TMR enable */ ++ ++/* Network type */ ++#define _NETTYPE(x) (((x) & 0x3) << 16) ++#define MASK_NETTYPE 0x30000 ++#define NT_NO_LINK 0x0 ++#define NT_LINK_AD_HOC 0x1 ++#define NT_LINK_AP 0x2 ++#define NT_AS_AP 0x3 ++ ++/* 2 PBP - Page Size Register */ ++#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) ++#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) ++#define _PSRX_MASK 0xF ++#define _PSTX_MASK 0xF0 ++#define _PSRX(x) (x) ++#define _PSTX(x) ((x) << 4) ++ ++#define PBP_64 0x0 ++#define PBP_128 0x1 ++#define PBP_256 0x2 ++#define PBP_512 0x3 ++#define PBP_1024 0x4 ++ ++/* 2 TX/RXDMA */ ++#define RXDMA_ARBBW_EN BIT(0) ++#define RXSHFT_EN BIT(1) ++#define RXDMA_AGG_EN BIT(2) ++#define QS_VO_QUEUE BIT(8) ++#define QS_VI_QUEUE BIT(9) ++#define QS_BE_QUEUE BIT(10) ++#define QS_BK_QUEUE BIT(11) ++#define QS_MANAGER_QUEUE BIT(12) ++#define QS_HIGH_QUEUE BIT(13) ++ ++#define HQSEL_VOQ BIT(0) ++#define HQSEL_VIQ BIT(1) ++#define HQSEL_BEQ BIT(2) ++#define HQSEL_BKQ BIT(3) ++#define HQSEL_MGTQ BIT(4) ++#define HQSEL_HIQ BIT(5) ++ ++/* For normal driver, 0x10C */ ++#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) ++#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) ++#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) ++#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) ++#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) ++#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) ++ ++#define QUEUE_LOW 1 ++#define QUEUE_NORMAL 2 ++#define QUEUE_HIGH 3 ++ ++/* 2 TRXFF_BNDY */ ++ ++/* 2 LLT_INIT */ ++#define _LLT_NO_ACTIVE 0x0 ++#define _LLT_WRITE_ACCESS 0x1 ++#define _LLT_READ_ACCESS 0x2 ++ ++#define _LLT_INIT_DATA(x) ((x) & 0xFF) ++#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) ++#define _LLT_OP(x) (((x) & 0x3) << 30) ++#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) ++ ++/* 0x0200h ~ 0x027Fh TXDMA Configuration */ ++/* 2RQPN */ ++#define _HPQ(x) ((x) & 0xFF) ++#define _LPQ(x) (((x) & 0xFF) << 8) ++#define _PUBQ(x) (((x) & 0xFF) << 16) ++/* NOTE: in RQPN_NPQ register */ ++#define _NPQ(x) ((x) & 0xFF) ++ ++#define HPQ_PUBLIC_DIS BIT(24) ++#define LPQ_PUBLIC_DIS BIT(25) ++#define LD_RQPN BIT(31) ++ ++/* 2TDECTRL */ ++#define BCN_VALID BIT(16) ++#define BCN_HEAD(x) (((x) & 0xFF) << 8) ++#define BCN_HEAD_MASK 0xFF00 ++ ++/* 2 TDECTL */ ++#define BLK_DESC_NUM_SHIFT 4 ++#define BLK_DESC_NUM_MASK 0xF ++ ++/* 2 TXDMA_OFFSET_CHK */ ++#define DROP_DATA_EN BIT(9) ++ ++/* 0x0280h ~ 0x028Bh RX DMA Configuration */ ++ ++/* REG_RXDMA_CONTROL, 0x0286h */ ++ ++/* 2 REG_RXPKT_NUM, 0x0284 */ ++#define RXPKT_RELEASE_POLL BIT(16) ++#define RXDMA_IDLE BIT(17) ++#define RW_RELEASE_EN BIT(18) ++ ++/* 0x0400h ~ 0x047Fh Protocol Configuration */ ++/* 2 FWHW_TXQ_CTRL */ ++#define EN_AMPDU_RTY_NEW BIT(7) ++ ++/* 2 SPEC SIFS */ ++#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) ++#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) ++ ++/* 2 RL */ ++#define RETRY_LIMIT_SHORT_SHIFT 8 ++#define RETRY_LIMIT_LONG_SHIFT 0 ++ ++/* 0x0500h ~ 0x05FFh EDCA Configuration */ ++ ++/* 2 EDCA setting */ ++#define AC_PARAM_TXOP_LIMIT_OFFSET 16 ++#define AC_PARAM_ECW_MAX_OFFSET 12 ++#define AC_PARAM_ECW_MIN_OFFSET 8 ++#define AC_PARAM_AIFS_OFFSET 0 ++ ++#define _LRL(x) ((x) & 0x3F) ++#define _SRL(x) (((x) & 0x3F) << 8) ++ ++/* 2 BCN_CTRL */ ++#define EN_MBSSID BIT(1) ++#define EN_TXBCN_RPT BIT(2) ++#define EN_BCN_FUNCTION BIT(3) ++#define DIS_TSF_UPDATE BIT(3) ++ ++/* The same function but different bit field. */ ++#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) ++#define DIS_TSF_UDT0_TEST_CHIP BIT(5) ++#define STOP_BCNQ BIT(6) ++ ++/* 2 ACMHWCTRL */ ++#define AcmHw_HwEn BIT(0) ++#define AcmHw_BeqEn BIT(1) ++#define AcmHw_ViqEn BIT(2) ++#define AcmHw_VoqEn BIT(3) ++#define AcmHw_BeqStatus BIT(4) ++#define AcmHw_ViqStatus BIT(5) ++#define AcmHw_VoqStatus BIT(6) ++ ++/* 0x0600h ~ 0x07FFh WMAC Configuration */ ++/* 2APSD_CTRL */ ++#define APSDOFF BIT(6) ++#define APSDOFF_STATUS BIT(7) ++ ++#define RATE_BITMAP_ALL 0xFFFFF ++ ++/* Only use CCK 1M rate for ACK */ ++#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 ++ ++/* 2 TCR */ ++#define TSFRST BIT(0) ++#define DIS_GCLK BIT(1) ++#define PAD_SEL BIT(2) ++#define PWR_ST BIT(6) ++#define PWRBIT_OW_EN BIT(7) ++#define ACRC BIT(8) ++#define CFENDFORM BIT(9) ++#define ICV BIT(10) ++ ++/* 2 RCR */ ++#define AAP BIT(0) ++#define APM BIT(1) ++#define AM BIT(2) ++#define AB BIT(3) ++#define ADD3 BIT(4) ++#define APWRMGT BIT(5) ++#define CBSSID BIT(6) ++#define CBSSID_DATA BIT(6) ++#define CBSSID_BCN BIT(7) ++#define ACRC32 BIT(8) ++#define AICV BIT(9) ++#define ADF BIT(11) ++#define ACF BIT(12) ++#define AMF BIT(13) ++#define HTC_LOC_CTRL BIT(14) ++#define UC_DATA_EN BIT(16) ++#define BM_DATA_EN BIT(17) ++#define MFBEN BIT(22) ++#define LSIGEN BIT(23) ++#define EnMBID BIT(24) ++#define APP_BASSN BIT(27) ++#define APP_PHYSTS BIT(28) ++#define APP_ICV BIT(29) ++#define APP_MIC BIT(30) ++#define APP_FCS BIT(31) ++ ++/* 2 SECCFG */ ++#define SCR_TxUseDK BIT(0) /* Force Tx Use Default Key */ ++#define SCR_RxUseDK BIT(1) /* Force Rx Use Default Key */ ++#define SCR_TxEncEnable BIT(2) /* Enable Tx Encryption */ ++#define SCR_RxDecEnable BIT(3) /* Enable Rx Decryption */ ++#define SCR_SKByA2 BIT(4) /* Search kEY BY A2 */ ++#define SCR_NoSKMC BIT(5) /* No Key Search Multicast */ ++#define SCR_TXBCUSEDK BIT(6) /* Force Tx Bcast pkt Use Default Key */ ++#define SCR_RXBCUSEDK BIT(7) /* Force Rx Bcast pkt Use Default Key */ ++ ++/* RTL8188E SDIO Configuration */ ++ ++/* I/O bus domain address mapping */ ++#define SDIO_LOCAL_BASE 0x10250000 ++#define WLAN_IOREG_BASE 0x10260000 ++#define FIRMWARE_FIFO_BASE 0x10270000 ++#define TX_HIQ_BASE 0x10310000 ++#define TX_MIQ_BASE 0x10320000 ++#define TX_LOQ_BASE 0x10330000 ++#define RX_RX0FF_BASE 0x10340000 ++ ++/* SDIO host local register space mapping. */ ++#define SDIO_LOCAL_MSK 0x0FFF ++#define WLAN_IOREG_MSK 0x7FFF ++#define WLAN_FIFO_MSK 0x1FFF /* Aggregation Length[12:0] */ ++#define WLAN_RX0FF_MSK 0x0003 ++ ++/* Without ref to the SDIO Device ID */ ++#define SDIO_WITHOUT_REF_DEVICE_ID 0 ++#define SDIO_LOCAL_DEVICE_ID 0 /* 0b[16], 000b[15:13] */ ++#define WLAN_TX_HIQ_DEVICE_ID 4 /* 0b[16], 100b[15:13] */ ++#define WLAN_TX_MIQ_DEVICE_ID 5 /* 0b[16], 101b[15:13] */ ++#define WLAN_TX_LOQ_DEVICE_ID 6 /* 0b[16], 110b[15:13] */ ++#define WLAN_RX0FF_DEVICE_ID 7 /* 0b[16], 111b[15:13] */ ++#define WLAN_IOREG_DEVICE_ID 8 /* 1b[16] */ ++ ++/* SDIO Tx Free Page Index */ ++#define HI_QUEUE_IDX 0 ++#define MID_QUEUE_IDX 1 ++#define LOW_QUEUE_IDX 2 ++#define PUBLIC_QUEUE_IDX 3 ++ ++#define SDIO_MAX_TX_QUEUE 3 /* HIQ, MIQ and LOQ */ ++#define SDIO_MAX_RX_QUEUE 1 ++ ++/* SDIO Tx Control */ ++#define SDIO_REG_TX_CTRL 0x0000 ++/* SDIO Host Interrupt Mask */ ++#define SDIO_REG_HIMR 0x0014 ++/* SDIO Host Interrupt Service Routine */ ++#define SDIO_REG_HISR 0x0018 ++/* HCI Current Power Mode */ ++#define SDIO_REG_HCPWM 0x0019 ++/* RXDMA Request Length */ ++#define SDIO_REG_RX0_REQ_LEN 0x001C ++/* Free Tx Buffer Page */ ++#define SDIO_REG_FREE_TXPG 0x0020 ++/* HCI Current Power Mode 1 */ ++#define SDIO_REG_HCPWM1 0x0024 ++/* HCI Current Power Mode 2 */ ++#define SDIO_REG_HCPWM2 0x0026 ++/* HTSF Informaion */ ++#define SDIO_REG_HTSFR_INFO 0x0030 ++/* HCI Request Power Mode 1 */ ++#define SDIO_REG_HRPWM1 0x0080 ++/* HCI Request Power Mode 2 */ ++#define SDIO_REG_HRPWM2 0x0082 ++/* HCI Power Save Clock */ ++#define SDIO_REG_HPS_CLKR 0x0084 ++/* SDIO HCI Suspend Control */ ++#define SDIO_REG_HSUS_CTRL 0x0086 ++/* SDIO Host Extension Interrupt Mask Always */ ++#define SDIO_REG_HIMR_ON 0x0090 ++/* SDIO Host Extension Interrupt Status Always */ ++#define SDIO_REG_HISR_ON 0x0091 ++ ++#define SDIO_HIMR_DISABLED 0 ++ ++/* RTL8188E SDIO Host Interrupt Mask Register */ ++#define SDIO_HIMR_RX_REQUEST_MSK BIT(0) ++#define SDIO_HIMR_AVAL_MSK BIT(1) ++#define SDIO_HIMR_TXERR_MSK BIT(2) ++#define SDIO_HIMR_RXERR_MSK BIT(3) ++#define SDIO_HIMR_TXFOVW_MSK BIT(4) ++#define SDIO_HIMR_RXFOVW_MSK BIT(5) ++#define SDIO_HIMR_TXBCNOK_MSK BIT(6) ++#define SDIO_HIMR_TXBCNERR_MSK BIT(7) ++#define SDIO_HIMR_BCNERLY_INT_MSK BIT(16) ++#define SDIO_HIMR_C2HCMD_MSK BIT(17) ++#define SDIO_HIMR_CPWM1_MSK BIT(18) ++#define SDIO_HIMR_CPWM2_MSK BIT(19) ++#define SDIO_HIMR_HSISR_IND_MSK BIT(20) ++#define SDIO_HIMR_GTINT3_IND_MSK BIT(21) ++#define SDIO_HIMR_GTINT4_IND_MSK BIT(22) ++#define SDIO_HIMR_PSTIMEOUT_MSK BIT(23) ++#define SDIO_HIMR_OCPINT_MSK BIT(24) ++#define SDIO_HIMR_ATIMEND_MSK BIT(25) ++#define SDIO_HIMR_ATIMEND_E_MSK BIT(26) ++#define SDIO_HIMR_CTWEND_MSK BIT(27) ++ ++/* RTL8188E SDIO Specific */ ++#define SDIO_HIMR_MCU_ERR_MSK BIT(28) ++#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT(29) ++ ++/* SDIO Host Interrupt Service Routine */ ++#define SDIO_HISR_RX_REQUEST BIT(0) ++#define SDIO_HISR_AVAL BIT(1) ++#define SDIO_HISR_TXERR BIT(2) ++#define SDIO_HISR_RXERR BIT(3) ++#define SDIO_HISR_TXFOVW BIT(4) ++#define SDIO_HISR_RXFOVW BIT(5) ++#define SDIO_HISR_TXBCNOK BIT(6) ++#define SDIO_HISR_TXBCNERR BIT(7) ++#define SDIO_HISR_BCNERLY_INT BIT(16) ++#define SDIO_HISR_C2HCMD BIT(17) ++#define SDIO_HISR_CPWM1 BIT(18) ++#define SDIO_HISR_CPWM2 BIT(19) ++#define SDIO_HISR_HSISR_IND BIT(20) ++#define SDIO_HISR_GTINT3_IND BIT(21) ++#define SDIO_HISR_GTINT4_IND BIT(22) ++#define SDIO_HISR_PSTIME BIT(23) ++#define SDIO_HISR_OCPINT BIT(24) ++#define SDIO_HISR_ATIMEND BIT(25) ++#define SDIO_HISR_ATIMEND_E BIT(26) ++#define SDIO_HISR_CTWEND BIT(27) ++ ++/* RTL8188E SDIO Specific */ ++#define SDIO_HISR_MCU_ERR BIT(28) ++#define SDIO_HISR_TSF_BIT32_TOGGLE BIT(29) ++ ++#define MASK_SDIO_HISR_CLEAR \ ++ (SDIO_HISR_TXERR | SDIO_HISR_RXERR | SDIO_HISR_TXFOVW |\ ++ SDIO_HISR_RXFOVW | SDIO_HISR_TXBCNOK | SDIO_HISR_TXBCNERR |\ ++ SDIO_HISR_C2HCMD | SDIO_HISR_CPWM1 | SDIO_HISR_CPWM2 |\ ++ SDIO_HISR_HSISR_IND | SDIO_HISR_GTINT3_IND | SDIO_HISR_GTINT4_IND |\ ++ SDIO_HISR_PSTIMEOUT | SDIO_HISR_OCPINT) ++ ++/* SDIO HCI Suspend Control Register */ ++#define HCI_RESUME_PWR_RDY BIT(1) ++#define HCI_SUS_CTRL BIT(0) ++ ++/* SDIO Tx FIFO related */ ++/* The number of Tx FIFO free page */ ++#define SDIO_TX_FREE_PG_QUEUE 4 ++#define SDIO_TX_FIFO_PAGE_SZ 128 ++ ++/* 0xFE00h ~ 0xFE55h USB Configuration */ ++ ++/* 2 USB Information (0xFE17) */ ++#define USB_IS_HIGH_SPEED 0 ++#define USB_IS_FULL_SPEED 1 ++#define USB_SPEED_MASK BIT(5) ++ ++#define USB_NORMAL_SIE_EP_MASK 0xF ++#define USB_NORMAL_SIE_EP_SHIFT 4 ++ ++/* 2 Special Option */ ++#define USB_AGG_EN BIT(3) ++ ++/* 0; Use interrupt endpoint to upload interrupt pkt */ ++/* 1; Use bulk endpoint to upload interrupt pkt, */ ++#define INT_BULK_SEL BIT(4) ++ ++/* 2REG_C2HEVT_CLEAR */ ++/* Set by driver and notify FW that the driver has read ++ * the C2H command message */ ++#define C2H_EVT_HOST_CLOSE 0x00 ++/* Set by FW indicating that FW had set the C2H command ++ * message and it's not yet read by driver. */ ++#define C2H_EVT_FW_CLOSE 0xFF ++ ++/* 2REG_MULTI_FUNC_CTRL(For RTL8723 Only) */ ++/* Enable GPIO[9] as WiFi HW PDn source */ ++#define WL_HWPDN_EN BIT(0) ++/* WiFi HW PDn polarity control */ ++#define WL_HWPDN_SL BIT(1) ++/* WiFi function enable */ ++#define WL_FUNC_EN BIT(2) ++/* Enable GPIO[9] as WiFi RF HW PDn source */ ++#define WL_HWROF_EN BIT(3) ++/* Enable GPIO[11] as BT HW PDn source */ ++#define BT_HWPDN_EN BIT(16) ++/* BT HW PDn polarity control */ ++#define BT_HWPDN_SL BIT(17) ++/* BT function enable */ ++#define BT_FUNC_EN BIT(18) ++/* Enable GPIO[11] as BT/GPS RF HW PDn source */ ++#define BT_HWROF_EN BIT(19) ++/* Enable GPIO[10] as GPS HW PDn source */ ++#define GPS_HWPDN_EN BIT(20) ++/* GPS HW PDn polarity control */ ++#define GPS_HWPDN_SL BIT(21) ++/* GPS function enable */ ++#define GPS_FUNC_EN BIT(22) ++ ++/* 3 REG_LIFECTRL_CTRL */ ++#define HAL92C_EN_PKT_LIFE_TIME_BK BIT(3) ++#define HAL92C_EN_PKT_LIFE_TIME_BE BIT(2) ++#define HAL92C_EN_PKT_LIFE_TIME_VI BIT(1) ++#define HAL92C_EN_PKT_LIFE_TIME_VO BIT(0) ++ ++#define HAL92C_MSDU_LIFE_TIME_UNIT 128 /* in us */ ++ ++/* General definitions */ ++#define LAST_ENTRY_OF_TX_PKT_BUFFER 176 /* 22k 22528 bytes */ ++ ++#define POLLING_LLT_THRESHOLD 20 ++#define POLLING_READY_TIMEOUT_COUNT 1000 ++/* GPIO BIT */ ++#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) ++ ++/* 8192C EEPROM/EFUSE share register definition. */ ++ ++/* EEPROM/Efuse PG Offset for 88EE/88EU/88ES */ ++#define EEPROM_TX_PWR_INX_88E 0x10 ++ ++#define EEPROM_ChannelPlan_88E 0xB8 ++#define EEPROM_XTAL_88E 0xB9 ++#define EEPROM_THERMAL_METER_88E 0xBA ++#define EEPROM_IQK_LCK_88E 0xBB ++ ++#define EEPROM_RF_BOARD_OPTION_88E 0xC1 ++#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 ++#define EEPROM_RF_BT_SETTING_88E 0xC3 ++#define EEPROM_VERSION_88E 0xC4 ++#define EEPROM_CUSTOMERID_88E 0xC5 ++#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 ++ ++/* RTL88EE */ ++#define EEPROM_MAC_ADDR_88EE 0xD0 ++#define EEPROM_VID_88EE 0xD6 ++#define EEPROM_DID_88EE 0xD8 ++#define EEPROM_SVID_88EE 0xDA ++#define EEPROM_SMID_88EE 0xDC ++ ++/* RTL88EU */ ++#define EEPROM_MAC_ADDR_88EU 0xD7 ++#define EEPROM_VID_88EU 0xD0 ++#define EEPROM_PID_88EU 0xD2 ++#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 ++ ++/* RTL88ES */ ++#define EEPROM_MAC_ADDR_88ES 0x11A ++ ++/* EEPROM/Efuse Value Type */ ++#define EETYPE_TX_PWR 0x0 ++ ++/* Default Value for EEPROM or EFUSE!!! */ ++#define EEPROM_Default_TSSI 0x0 ++#define EEPROM_Default_TxPowerDiff 0x0 ++#define EEPROM_Default_CrystalCap 0x5 ++/* Default: 2X2, RTL8192CE(QFPN68) */ ++#define EEPROM_Default_BoardType 0x02 ++#define EEPROM_Default_TxPower 0x1010 ++#define EEPROM_Default_HT2T_TxPwr 0x10 ++ ++#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 ++#define EEPROM_Default_ThermalMeter 0x12 ++ ++#define EEPROM_Default_AntTxPowerDiff 0x0 ++#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 ++#define EEPROM_Default_TxPowerLevel 0x2A ++ ++#define EEPROM_Default_HT40_2SDiff 0x0 ++/* HT20<->40 default Tx Power Index Difference */ ++#define EEPROM_Default_HT20_Diff 2 ++#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 ++#define EEPROM_Default_HT40_PwrMaxOffset 0 ++#define EEPROM_Default_HT20_PwrMaxOffset 0 ++ ++#define EEPROM_Default_CrystalCap_88E 0x20 ++#define EEPROM_Default_ThermalMeter_88E 0x18 ++ ++/* New EFUSE deafult value */ ++#define EEPROM_DEFAULT_24G_INDEX 0x2D ++#define EEPROM_DEFAULT_24G_HT20_DIFF 0X02 ++#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X04 ++ ++#define EEPROM_DEFAULT_DIFF 0XFE ++#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F ++#define EEPROM_DEFAULT_BOARD_OPTION 0x00 ++#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 ++#define EEPROM_DEFAULT_BT_OPTION 0x10 ++ ++/* For debug */ ++#define EEPROM_Default_PID 0x1234 ++#define EEPROM_Default_VID 0x5678 ++#define EEPROM_Default_CustomerID 0xAB ++#define EEPROM_Default_CustomerID_8188E 0x00 ++#define EEPROM_Default_SubCustomerID 0xCD ++#define EEPROM_Default_Version 0 ++ ++#define EEPROM_CHANNEL_PLAN_FCC 0x0 ++#define EEPROM_CHANNEL_PLAN_IC 0x1 ++#define EEPROM_CHANNEL_PLAN_ETSI 0x2 ++#define EEPROM_CHANNEL_PLAN_SPA 0x3 ++#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 ++#define EEPROM_CHANNEL_PLAN_MKK 0x5 ++#define EEPROM_CHANNEL_PLAN_MKK1 0x6 ++#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 ++#define EEPROM_CHANNEL_PLAN_TELEC 0x8 ++#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMA 0x9 ++#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA ++#define EEPROM_CHANNEL_PLAN_NCC 0xB ++#define EEPROM_USB_OPTIONAL1 0xE ++#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 ++ ++#define EEPROM_CID_DEFAULT 0x0 ++#define EEPROM_CID_TOSHIBA 0x4 ++#define EEPROM_CID_CCX 0x10 /* CCX test. */ ++#define EEPROM_CID_QMI 0x0D ++#define EEPROM_CID_WHQL 0xFE ++#define RTL_EEPROM_ID 0x8129 ++ ++#endif /* __RTL8188E_SPEC_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtl8188e_sreset.h b/drivers/staging/r8188eu/include/rtl8188e_sreset.h +new file mode 100644 +index 000000000000..880c5792d5dd +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_sreset.h +@@ -0,0 +1,15 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTL8188E_SRESET_H_ ++#define _RTL8188E_SRESET_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "rtw_sreset.h" ++ ++void rtl8188e_silentreset_for_specific_platform(struct adapter *padapter); ++void rtl8188e_sreset_xmit_status_check(struct adapter *padapter); ++void rtl8188e_sreset_linked_status_check(struct adapter *padapter); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtl8188e_xmit.h b/drivers/staging/r8188eu/include/rtl8188e_xmit.h +new file mode 100644 +index 000000000000..f1f2ccfc765e +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtl8188e_xmit.h +@@ -0,0 +1,150 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTL8188E_XMIT_H__ ++#define __RTL8188E_XMIT_H__ ++ ++#define MAX_TX_AGG_PACKET_NUMBER 0xFF ++/* */ ++/* Queue Select Value in TxDesc */ ++/* */ ++#define QSLT_BK 0x2/* 0x01 */ ++#define QSLT_BE 0x0 ++#define QSLT_VI 0x5/* 0x4 */ ++#define QSLT_VO 0x7/* 0x6 */ ++#define QSLT_BEACON 0x10 ++#define QSLT_HIGH 0x11 ++#define QSLT_MGNT 0x12 ++#define QSLT_CMD 0x13 ++ ++/* For 88e early mode */ ++#define SET_EARLYMODE_PKTNUM(__paddr, __value) \ ++ le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(2, 0)) ++#define SET_EARLYMODE_LEN0(__pAddr, __Value) \ ++ le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(15, 4)) ++#define SET_EARLYMODE_LEN1(__paddr, __value) \ ++ le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(27, 16)) ++#define SET_EARLYMODE_LEN2_1(__pdr, __vValue) \ ++ le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(31, 28)) ++#define SET_EARLYMODE_LEN2_2(__paddr, __value) \ ++ le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(7, 0)) ++#define SET_EARLYMODE_LEN3(__pAddr, __Value) \ ++ le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(19, 8)) ++#define SET_EARLYMODE_LEN4(__paAddr, __vValue) \ ++ le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(31, 20)) ++ ++/* defined for TX DESC Operation */ ++ ++#define MAX_TID (15) ++ ++/* OFFSET 0 */ ++#define OFFSET_SZ 0 ++#define OFFSET_SHT 16 ++#define BMC BIT(24) ++#define LSG BIT(26) ++#define FSG BIT(27) ++#define OWN BIT(31) ++ ++/* OFFSET 4 */ ++#define PKT_OFFSET_SZ 0 ++#define QSEL_SHT 8 ++#define RATE_ID_SHT 16 ++#define NAVUSEHDR BIT(20) ++#define SEC_TYPE_SHT 22 ++#define PKT_OFFSET_SHT 26 ++ ++/* OFFSET 8 */ ++#define AGG_EN BIT(12) ++#define AGG_BK BIT(16) ++#define AMPDU_DENSITY_SHT 20 ++#define ANTSEL_A BIT(24) ++#define ANTSEL_B BIT(25) ++#define TX_ANT_CCK_SHT 26 ++#define TX_ANTL_SHT 28 ++#define TX_ANT_HT_SHT 30 ++ ++/* OFFSET 12 */ ++#define SEQ_SHT 16 ++#define EN_HWSEQ BIT(31) ++ ++/* OFFSET 16 */ ++#define QOS BIT(6) ++#define HW_SSN BIT(7) ++#define USERATE BIT(8) ++#define DISDATAFB BIT(10) ++#define CTS_2_SELF BIT(11) ++#define RTS_EN BIT(12) ++#define HW_RTS_EN BIT(13) ++#define DATA_SHORT BIT(24) ++#define PWR_STATUS_SHT 15 ++#define DATA_SC_SHT 20 ++#define DATA_BW BIT(25) ++ ++/* OFFSET 20 */ ++#define RTY_LMT_EN BIT(17) ++ ++enum TXDESC_SC { ++ SC_DONT_CARE = 0x00, ++ SC_UPPER = 0x01, ++ SC_LOWER = 0x02, ++ SC_DUPLICATE = 0x03 ++}; ++/* OFFSET 20 */ ++#define SGI BIT(6) ++#define USB_TXAGG_NUM_SHT 24 ++ ++#define txdesc_set_ccx_sw_88e(txdesc, value) \ ++ do { \ ++ ((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \ ++ ((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \ ++ } while (0) ++ ++struct txrpt_ccx_88e { ++ /* offset 0 */ ++ u8 tag1:1; ++ u8 pkt_num:3; ++ u8 txdma_underflow:1; ++ u8 int_bt:1; ++ u8 int_tri:1; ++ u8 int_ccx:1; ++ ++ /* offset 1 */ ++ u8 mac_id:6; ++ u8 pkt_ok:1; ++ u8 bmc:1; ++ ++ /* offset 2 */ ++ u8 retry_cnt:6; ++ u8 lifetime_over:1; ++ u8 retry_over:1; ++ ++ /* offset 3 */ ++ u8 ccx_qtime0; ++ u8 ccx_qtime1; ++ ++ /* offset 5 */ ++ u8 final_data_rate; ++ ++ /* offset 6 */ ++ u8 sw1:4; ++ u8 qsel:4; ++ ++ /* offset 7 */ ++ u8 sw0; ++}; ++ ++void rtl8188e_fill_fake_txdesc(struct adapter *padapter, u8 *pDesc, ++ u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull); ++s32 rtl8188eu_init_xmit_priv(struct adapter *padapter); ++s32 rtl8188eu_hal_xmit(struct adapter *padapter, struct xmit_frame *frame); ++s32 rtl8188eu_mgnt_xmit(struct adapter *padapter, struct xmit_frame *frame); ++s32 rtl8188eu_xmit_buf_handler(struct adapter *padapter); ++#define hal_xmit_handler rtl8188eu_xmit_buf_handler ++void rtl8188eu_xmit_tasklet(unsigned long priv); ++s32 rtl8188eu_xmitframe_complete(struct adapter *padapter, ++ struct xmit_priv *pxmitpriv, ++ struct xmit_buf *pxmitbuf); ++ ++void handle_txrpt_ccx_88e(struct adapter *adapter, u8 *buf); ++ ++#endif /* __RTL8188E_XMIT_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtw_ap.h b/drivers/staging/r8188eu/include/rtw_ap.h +new file mode 100644 +index 000000000000..2eb556968509 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_ap.h +@@ -0,0 +1,47 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef __RTW_AP_H_ ++#define __RTW_AP_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++/* external function */ ++void rtw_indicate_sta_assoc_event(struct adapter *padapter, ++ struct sta_info *psta); ++void rtw_indicate_sta_disassoc_event(struct adapter *padapter, ++ struct sta_info *psta); ++void init_mlme_ap_info(struct adapter *padapter); ++void free_mlme_ap_info(struct adapter *padapter); ++void update_beacon(struct adapter *padapter, u8 ie_id, ++ u8 *oui, u8 tx); ++void add_RATid(struct adapter *padapter, struct sta_info *psta, ++ u8 rssi_level); ++void expire_timeout_chk(struct adapter *padapter); ++void update_sta_info_apmode(struct adapter *padapter, struct sta_info *psta); ++int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len); ++void rtw_ap_restore_network(struct adapter *padapter); ++void rtw_set_macaddr_acl(struct adapter *padapter, int mode); ++int rtw_acl_add_sta(struct adapter *padapter, u8 *addr); ++int rtw_acl_remove_sta(struct adapter *padapter, u8 *addr); ++ ++#ifdef CONFIG_88EU_AP_MODE ++void associated_clients_update(struct adapter *padapter, u8 updated); ++void bss_cap_update_on_sta_join(struct adapter *padapter, struct sta_info *psta); ++u8 bss_cap_update_on_sta_leave(struct adapter *padapter, struct sta_info *psta); ++void sta_info_update(struct adapter *padapter, struct sta_info *psta); ++void ap_sta_info_defer_update(struct adapter *padapter, struct sta_info *psta); ++u8 ap_free_sta(struct adapter *padapter, struct sta_info *psta, ++ bool active, u16 reason); ++int rtw_sta_flush(struct adapter *padapter); ++int rtw_ap_inform_ch_switch(struct adapter *padapter, u8 new_ch, u8 ch_offset); ++void start_ap_mode(struct adapter *padapter); ++void stop_ap_mode(struct adapter *padapter); ++#endif ++#endif /* end of CONFIG_88EU_AP_MODE */ ++void update_bmc_sta(struct adapter *padapter); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_br_ext.h b/drivers/staging/r8188eu/include/rtw_br_ext.h +new file mode 100644 +index 000000000000..69905d30c191 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_br_ext.h +@@ -0,0 +1,49 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_BR_EXT_H_ ++#define _RTW_BR_EXT_H_ ++ ++#define MACADDRLEN 6 ++#define _DEBUG_ERR DBG_88E ++#define _DEBUG_INFO DBG_88E ++#define DEBUG_WARN DBG_88E ++#define DEBUG_INFO DBG_88E ++#define DEBUG_ERR DBG_88E ++#define GET_MY_HWADDR(padapter) ((padapter)->eeprompriv.mac_addr) ++ ++#define NAT25_HASH_BITS 4 ++#define NAT25_HASH_SIZE (1 << NAT25_HASH_BITS) ++#define NAT25_AGEING_TIME 300 ++ ++#define MAX_NETWORK_ADDR_LEN 17 ++ ++struct nat25_network_db_entry { ++ struct nat25_network_db_entry *next_hash; ++ struct nat25_network_db_entry **pprev_hash; ++ atomic_t use_count; ++ unsigned char macAddr[6]; ++ unsigned long ageing_timer; ++ unsigned char networkAddr[MAX_NETWORK_ADDR_LEN]; ++}; ++ ++enum NAT25_METHOD { ++ NAT25_MIN, ++ NAT25_CHECK, ++ NAT25_INSERT, ++ NAT25_PARSE, ++ NAT25_MAX ++}; ++ ++struct br_ext_info { ++ unsigned int nat25_disable; ++ unsigned int macclone_enable; ++ unsigned int dhcp_bcst_disable; ++ int addPPPoETag; /* 1: Add PPPoE relay-SID, 0: disable */ ++ unsigned char nat25_dmzMac[MACADDRLEN]; ++ unsigned int nat25sc_disable; ++}; ++ ++void nat25_db_cleanup(struct adapter *priv); ++ ++#endif /* _RTW_BR_EXT_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_cmd.h b/drivers/staging/r8188eu/include/rtw_cmd.h +new file mode 100644 +index 000000000000..c14d9052b997 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_cmd.h +@@ -0,0 +1,975 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_CMD_H_ ++#define __RTW_CMD_H_ ++ ++#include "wlan_bssdef.h" ++#include "rtw_rf.h" ++#include "rtw_led.h" ++ ++#define C2H_MEM_SZ (16*1024) ++ ++#include "osdep_service.h" ++#include "ieee80211.h" /* */ ++ ++#define FREE_CMDOBJ_SZ 128 ++ ++#define MAX_CMDSZ 1024 ++#define MAX_RSPSZ 512 ++#define MAX_EVTSZ 1024 ++ ++#define CMDBUFF_ALIGN_SZ 512 ++ ++struct cmd_obj { ++ struct adapter *padapter; ++ u16 cmdcode; ++ u8 res; ++ u8 *parmbuf; ++ u32 cmdsz; ++ u8 *rsp; ++ u32 rspsz; ++ struct list_head list; ++}; ++ ++struct cmd_priv { ++ struct semaphore cmd_queue_sema; ++ struct semaphore terminate_cmdthread_sema; ++ struct __queue cmd_queue; ++ u8 cmd_seq; ++ u8 *cmd_buf; /* shall be non-paged, and 4 bytes aligned */ ++ u8 *cmd_allocated_buf; ++ u8 *rsp_buf; /* shall be non-paged, and 4 bytes aligned */ ++ u8 *rsp_allocated_buf; ++ u32 cmd_issued_cnt; ++ u32 cmd_done_cnt; ++ u32 rsp_cnt; ++ u8 cmdthd_running; ++ struct adapter *padapter; ++}; ++ ++struct evt_priv { ++ struct work_struct c2h_wk; ++ bool c2h_wk_alive; ++ struct rtw_cbuf *c2h_queue; ++ #define C2H_QUEUE_MAX_LEN 10 ++ atomic_t event_seq; ++ u8 *evt_buf; /* shall be non-paged, and 4 bytes aligned */ ++ u8 *evt_allocated_buf; ++ u32 evt_done_cnt; ++}; ++ ++#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ ++do {\ ++ INIT_LIST_HEAD(&pcmd->list);\ ++ pcmd->cmdcode = code;\ ++ pcmd->parmbuf = (u8 *)(pparm);\ ++ pcmd->cmdsz = sizeof(*pparm);\ ++ pcmd->rsp = NULL;\ ++ pcmd->rspsz = 0;\ ++} while (0) ++ ++struct c2h_evt_hdr { ++ u8 id:4; ++ u8 plen:4; ++ u8 seq; ++ u8 payload[0]; ++}; ++ ++#define c2h_evt_exist(c2h_evt) ((c2h_evt)->id || (c2h_evt)->plen) ++ ++u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj); ++struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv); ++void rtw_free_cmd_obj(struct cmd_obj *pcmd); ++ ++int rtw_cmd_thread(void *context); ++ ++u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv); ++void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv); ++ ++u32 rtw_init_evt_priv(struct evt_priv *pevtpriv); ++void rtw_free_evt_priv(struct evt_priv *pevtpriv); ++void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv); ++void rtw_evt_notify_isr(struct evt_priv *pevtpriv); ++#ifdef CONFIG_88EU_P2P ++u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType); ++#endif /* CONFIG_88EU_P2P */ ++ ++enum rtw_drvextra_cmd_id { ++ NONE_WK_CID, ++ DYNAMIC_CHK_WK_CID, ++ DM_CTRL_WK_CID, ++ PBC_POLLING_WK_CID, ++ POWER_SAVING_CTRL_WK_CID,/* IPS,AUTOSuspend */ ++ LPS_CTRL_WK_CID, ++ ANT_SELECT_WK_CID, ++ P2P_PS_WK_CID, ++ P2P_PROTO_WK_CID, ++ CHECK_HIQ_WK_CID,/* for softap mode, check hi queue if empty */ ++ INTEl_WIDI_WK_CID, ++ C2H_WK_CID, ++ RTP_TIMER_CFG_WK_CID, ++ MAX_WK_CID ++}; ++ ++enum LPS_CTRL_TYPE { ++ LPS_CTRL_SCAN = 0, ++ LPS_CTRL_JOINBSS = 1, ++ LPS_CTRL_CONNECT = 2, ++ LPS_CTRL_DISCONNECT = 3, ++ LPS_CTRL_SPECIAL_PACKET = 4, ++ LPS_CTRL_LEAVE = 5, ++}; ++ ++enum RFINTFS { ++ SWSI, ++ HWSI, ++ HWPI, ++}; ++ ++/* ++Caller Mode: Infra, Ad-HoC(C) ++ ++Notes: To enter USB suspend mode ++ ++Command Mode ++ ++*/ ++struct usb_suspend_parm { ++ u32 action;/* 1: sleep, 0:resume */ ++}; ++ ++/* ++Caller Mode: Infra, Ad-HoC ++ ++Notes: To join a known BSS. ++ ++Command-Event Mode ++ ++*/ ++ ++/* ++Caller Mode: Infra, Ad-Hoc ++ ++Notes: To join the specified bss ++ ++Command Event Mode ++ ++*/ ++struct joinbss_parm { ++ struct wlan_bssid_ex network; ++}; ++ ++/* ++Caller Mode: Infra, Ad-HoC(C) ++ ++Notes: To disconnect the current associated BSS ++ ++Command Mode ++ ++*/ ++struct disconnect_parm { ++ u32 deauth_timeout_ms; ++}; ++ ++/* ++Caller Mode: AP, Ad-HoC(M) ++ ++Notes: To create a BSS ++ ++Command Mode ++*/ ++struct createbss_parm { ++ struct wlan_bssid_ex network; ++}; ++ ++struct setopmode_parm { ++ u8 mode; ++ u8 rsvd[3]; ++}; ++ ++/* ++Caller Mode: AP, Ad-HoC, Infra ++ ++Notes: To ask RTL8711 performing site-survey ++ ++Command-Event Mode ++ ++*/ ++ ++#define RTW_SSID_SCAN_AMOUNT 9 /* for WEXT_CSCAN_AMOUNT 9 */ ++#define RTW_CHANNEL_SCAN_AMOUNT (14+37) ++struct sitesurvey_parm { ++ int scan_mode; /* active: 1, passive: 0 */ ++ u8 ssid_num; ++ u8 ch_num; ++ struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT]; ++ struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To set the auth type of RTL8711. open/shared/802.1x ++ ++Command Mode ++ ++*/ ++struct setauth_parm { ++ u8 mode; /* 0: legacy open, 1: legacy shared 2: 802.1x */ ++ u8 _1x; /* 0: PSK, 1: TLS */ ++ u8 rsvd[2]; ++}; ++ ++/* ++Caller Mode: Infra ++ ++a. algorithm: wep40, wep104, tkip & aes ++b. keytype: grp key/unicast key ++c. key contents ++ ++when shared key ==> keyid is the camid ++when 802.1x ==> keyid [0:1] ==> grp key ++when 802.1x ==> keyid > 2 ==> unicast key ++ ++*/ ++struct setkey_parm { ++ u8 algorithm; /* could be none, wep40, TKIP, CCMP, wep104 */ ++ u8 keyid; ++ u8 grpkey; /* 1: this is the grpkey for 802.1x. ++ * 0: this is the unicast key for 802.1x */ ++ u8 set_tx; /* 1: main tx key for wep. 0: other key. */ ++ u8 key[16]; /* this could be 40 or 104 */ ++}; ++ ++/* ++When in AP or Ad-Hoc mode, this is used to ++allocate an sw/hw entry for a newly associated sta. ++ ++Command ++ ++when shared key ==> algorithm/keyid ++ ++*/ ++struct set_stakey_parm { ++ u8 addr[ETH_ALEN]; ++ u8 algorithm; ++ u8 id;/* currently for erasing cam entry if ++ * algorithm == _NO_PRIVACY_ */ ++ u8 key[16]; ++}; ++ ++struct set_stakey_rsp { ++ u8 addr[ETH_ALEN]; ++ u8 keyid; ++ u8 rsvd; ++}; ++ ++/* ++Caller Ad-Hoc/AP ++ ++Command -Rsp(AID == CAMID) mode ++ ++This is to force fw to add an sta_data entry per driver's request. ++ ++FW will write an cam entry associated with it. ++ ++*/ ++struct set_assocsta_parm { ++ u8 addr[ETH_ALEN]; ++}; ++ ++struct set_assocsta_rsp { ++ u8 cam_id; ++ u8 rsvd[3]; ++}; ++ ++/* ++ Caller Ad-Hoc/AP ++ ++ Command mode ++ ++ This is to force fw to del an sta_data entry per driver's request ++ ++ FW will invalidate the cam entry associated with it. ++ ++*/ ++struct del_assocsta_parm { ++ u8 addr[ETH_ALEN]; ++}; ++ ++/* ++Caller Mode: AP/Ad-HoC(M) ++ ++Notes: To notify fw that given staid has changed its power state ++ ++Command Mode ++ ++*/ ++struct setstapwrstate_parm { ++ u8 staid; ++ u8 status; ++ u8 hwaddr[6]; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To setup the basic rate of RTL8711 ++ ++Command Mode ++ ++*/ ++struct setbasicrate_parm { ++ u8 basicrates[NumRates]; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To read the current basic rate ++ ++Command-Rsp Mode ++ ++*/ ++struct getbasicrate_parm { ++ u32 rsvd; ++}; ++ ++struct getbasicrate_rsp { ++ u8 basicrates[NumRates]; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To setup the data rate of RTL8711 ++ ++Command Mode ++ ++*/ ++struct setdatarate_parm { ++ u8 mac_id; ++ u8 datarates[NumRates]; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To read the current data rate ++ ++Command-Rsp Mode ++ ++*/ ++struct getdatarate_parm { ++ u32 rsvd; ++ ++}; ++struct getdatarate_rsp { ++ u8 datarates[NumRates]; ++}; ++ ++/* ++Caller Mode: Any ++AP: AP can use the info for the contents of beacon frame ++Infra: STA can use the info when sitesurveying ++Ad-HoC(M): Like AP ++Ad-HoC(C): Like STA ++ ++Notes: To set the phy capability of the NIC ++ ++Command Mode ++ ++*/ ++ ++struct setphyinfo_parm { ++ struct regulatory_class class_sets[NUM_REGULATORYS]; ++ u8 status; ++}; ++ ++struct getphyinfo_parm { ++ u32 rsvd; ++}; ++ ++struct getphyinfo_rsp { ++ struct regulatory_class class_sets[NUM_REGULATORYS]; ++ u8 status; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To set the channel/modem/band ++This command will be used when channel/modem/band is changed. ++ ++Command Mode ++ ++*/ ++struct setphy_parm { ++ u8 rfchannel; ++ u8 modem; ++}; ++ ++/* ++Caller Mode: Any ++ ++Notes: To get the current setting of channel/modem/band ++ ++Command-Rsp Mode ++ ++*/ ++struct getphy_parm { ++ u32 rsvd; ++ ++}; ++struct getphy_rsp { ++ u8 rfchannel; ++ u8 modem; ++}; ++ ++struct readBB_parm { ++ u8 offset; ++}; ++struct readBB_rsp { ++ u8 value; ++}; ++ ++struct readTSSI_parm { ++ u8 offset; ++}; ++struct readTSSI_rsp { ++ u8 value; ++}; ++ ++struct writeBB_parm { ++ u8 offset; ++ u8 value; ++}; ++ ++struct readRF_parm { ++ u8 offset; ++}; ++struct readRF_rsp { ++ u32 value; ++}; ++ ++struct writeRF_parm { ++ u32 offset; ++ u32 value; ++}; ++ ++struct getrfintfs_parm { ++ u8 rfintfs; ++}; ++ ++struct Tx_Beacon_param ++{ ++ struct wlan_bssid_ex network; ++}; ++ ++/* ++ Notes: This command is used for H2C/C2H loopback testing ++ ++ mac[0] == 0 ++ ==> CMD mode, return H2C_SUCCESS. ++ The following condition must be ture under CMD mode ++ mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0; ++ s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7; ++ s2 == (b1 << 8 | b0); ++ ++ mac[0] == 1 ++ ==> CMD_RSP mode, return H2C_SUCCESS_RSP ++ ++ The rsp layout shall be: ++ rsp: parm: ++ mac[0] = mac[5]; ++ mac[1] = mac[4]; ++ mac[2] = mac[3]; ++ mac[3] = mac[2]; ++ mac[4] = mac[1]; ++ mac[5] = mac[0]; ++ s0 = s1; ++ s1 = swap16(s0); ++ w0 = swap32(w1); ++ b0 = b1 ++ s2 = s0 + s1 ++ b1 = b0 ++ w1 = w0 ++ ++ mac[0] == 2 ++ ==> CMD_EVENT mode, return H2C_SUCCESS ++ The event layout shall be: ++ event: parm: ++ mac[0] = mac[5]; ++ mac[1] = mac[4]; ++ mac[2] = event's seq no, starting from 1 to parm's marc[3] ++ mac[3] = mac[2]; ++ mac[4] = mac[1]; ++ mac[5] = mac[0]; ++ s0 = swap16(s0) - event.mac[2]; ++ s1 = s1 + event.mac[2]; ++ w0 = swap32(w0); ++ b0 = b1 ++ s2 = s0 + event.mac[2] ++ b1 = b0 ++ w1 = swap32(w1) - event.mac[2]; ++ ++ parm->mac[3] is the total event counts that host requested. ++ event will be the same with the cmd's param. ++*/ ++ ++/* CMD param Format for driver extra cmd handler */ ++struct drvextra_cmd_parm { ++ int ec_id; /* extra cmd id */ ++ int type_size; /* Can use this field as the type id or command size */ ++ unsigned char *pbuf; ++}; ++ ++/*------------------- Below are used for RF/BB tunning ---------------------*/ ++ ++struct setantenna_parm { ++ u8 tx_antset; ++ u8 rx_antset; ++ u8 tx_antenna; ++ u8 rx_antenna; ++}; ++ ++struct enrateadaptive_parm { ++ u32 en; ++}; ++ ++struct settxagctbl_parm { ++ u32 txagc[MAX_RATES_LENGTH]; ++}; ++ ++struct gettxagctbl_parm { ++ u32 rsvd; ++}; ++struct gettxagctbl_rsp { ++ u32 txagc[MAX_RATES_LENGTH]; ++}; ++ ++struct setagcctrl_parm { ++ u32 agcctrl; /* 0: pure hw, 1: fw */ ++}; ++ ++struct setssup_parm { ++ u32 ss_ForceUp[MAX_RATES_LENGTH]; ++}; ++ ++struct getssup_parm { ++ u32 rsvd; ++}; ++ ++struct getssup_rsp { ++ u8 ss_ForceUp[MAX_RATES_LENGTH]; ++}; ++ ++struct setssdlevel_parm { ++ u8 ss_DLevel[MAX_RATES_LENGTH]; ++}; ++ ++struct getssdlevel_parm { ++ u32 rsvd; ++}; ++ ++struct getssdlevel_rsp { ++ u8 ss_DLevel[MAX_RATES_LENGTH]; ++}; ++ ++struct setssulevel_parm { ++ u8 ss_ULevel[MAX_RATES_LENGTH]; ++}; ++ ++struct getssulevel_parm { ++ u32 rsvd; ++}; ++ ++struct getssulevel_rsp { ++ u8 ss_ULevel[MAX_RATES_LENGTH]; ++}; ++ ++struct setcountjudge_parm { ++ u8 count_judge[MAX_RATES_LENGTH]; ++}; ++ ++struct getcountjudge_parm { ++ u32 rsvd; ++}; ++ ++struct getcountjudge_rsp { ++ u8 count_judge[MAX_RATES_LENGTH]; ++}; ++ ++struct setratable_parm { ++ u8 ss_ForceUp[NumRates]; ++ u8 ss_ULevel[NumRates]; ++ u8 ss_DLevel[NumRates]; ++ u8 count_judge[NumRates]; ++}; ++ ++struct getratable_parm { ++ uint rsvd; ++}; ++ ++struct getratable_rsp { ++ u8 ss_ForceUp[NumRates]; ++ u8 ss_ULevel[NumRates]; ++ u8 ss_DLevel[NumRates]; ++ u8 count_judge[NumRates]; ++}; ++ ++/* to get TX,RX retry count */ ++ ++struct gettxretrycnt_parm { ++ unsigned int rsvd; ++}; ++ ++struct gettxretrycnt_rsp { ++ unsigned long tx_retrycnt; ++}; ++ ++struct getrxretrycnt_parm { ++ unsigned int rsvd; ++}; ++ ++struct getrxretrycnt_rsp { ++ unsigned long rx_retrycnt; ++}; ++ ++/* to get BCNOK,BCNERR count */ ++struct getbcnokcnt_parm { ++ unsigned int rsvd; ++}; ++ ++struct getbcnokcnt_rsp { ++ unsigned long bcnokcnt; ++}; ++ ++struct getbcnerrcnt_parm { ++ unsigned int rsvd; ++}; ++ ++struct getbcnerrcnt_rsp { ++ unsigned long bcnerrcnt; ++}; ++ ++/* to get current TX power level */ ++struct getcurtxpwrlevel_parm { ++ unsigned int rsvd; ++}; ++struct getcurtxpwrlevel_rspi { ++ unsigned short tx_power; ++}; ++ ++struct setprobereqextraie_parm { ++ unsigned char e_id; ++ unsigned char ie_len; ++ unsigned char ie[0]; ++}; ++ ++struct setassocreqextraie_parm { ++ unsigned char e_id; ++ unsigned char ie_len; ++ unsigned char ie[0]; ++}; ++ ++struct setproberspextraie_parm { ++ unsigned char e_id; ++ unsigned char ie_len; ++ unsigned char ie[0]; ++}; ++ ++struct setassocrspextraie_parm { ++ unsigned char e_id; ++ unsigned char ie_len; ++ unsigned char ie[0]; ++}; ++ ++struct addBaReq_parm { ++ unsigned int tid; ++ u8 addr[ETH_ALEN]; ++}; ++ ++/*H2C Handler index: 46 */ ++struct set_ch_parm { ++ u8 ch; ++ u8 bw; ++ u8 ch_offset; ++}; ++ ++/*H2C Handler index: 59 */ ++struct SetChannelPlan_param ++{ ++ u8 channel_plan; ++}; ++ ++/*H2C Handler index: 60 */ ++struct LedBlink_param ++{ ++ struct LED_871x *pLed; ++}; ++ ++/*H2C Handler index: 61 */ ++struct SetChannelSwitch_param ++{ ++ u8 new_ch_no; ++}; ++ ++/*H2C Handler index: 62 */ ++struct TDLSoption_param ++{ ++ u8 addr[ETH_ALEN]; ++ u8 option; ++}; ++ ++#define GEN_CMD_CODE(cmd) cmd ## _CMD_ ++ ++/* ++ ++Result: ++0x00: success ++0x01: success, and check Response. ++0x02: cmd ignored due to duplicated sequcne number ++0x03: cmd dropped due to invalid cmd code ++0x04: reserved. ++ ++*/ ++ ++#define H2C_RSP_OFFSET 512 ++ ++#define H2C_SUCCESS 0x00 ++#define H2C_SUCCESS_RSP 0x01 ++#define H2C_DUPLICATED 0x02 ++#define H2C_DROPPED 0x03 ++#define H2C_PARAMETERS_ERROR 0x04 ++#define H2C_REJECTED 0x05 ++#define H2C_CMD_OVERFLOW 0x06 ++#define H2C_RESERVED 0x07 ++ ++u8 rtw_setassocsta_cmd(struct adapter *padapter, u8 *mac_addr); ++u8 rtw_setstandby_cmd(struct adapter *padapter, uint action); ++u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid, ++ int ssid_num, struct rtw_ieee80211_channel *ch, ++ int ch_num); ++u8 rtw_createbss_cmd(struct adapter *padapter); ++u8 rtw_createbss_cmd_ex(struct adapter *padapter, unsigned char *pbss, ++ unsigned int sz); ++u8 rtw_setphy_cmd(struct adapter *padapter, u8 modem, u8 ch); ++u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key); ++u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue); ++u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network* pnetwork); ++u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueue); ++u8 rtw_setopmode_cmd(struct adapter *padapter, enum ndis_802_11_network_infra networktype); ++u8 rtw_setdatarate_cmd(struct adapter *padapter, u8 *rateset); ++u8 rtw_setbasicrate_cmd(struct adapter *padapter, u8 *rateset); ++u8 rtw_setbbreg_cmd(struct adapter * padapter, u8 offset, u8 val); ++u8 rtw_setrfreg_cmd(struct adapter * padapter, u8 offset, u32 val); ++u8 rtw_getbbreg_cmd(struct adapter * padapter, u8 offset, u8 * pval); ++u8 rtw_getrfreg_cmd(struct adapter * padapter, u8 offset, u8 * pval); ++u8 rtw_setrfintfs_cmd(struct adapter *padapter, u8 mode); ++u8 rtw_setrttbl_cmd(struct adapter *padapter, struct setratable_parm *prate_table); ++u8 rtw_getrttbl_cmd(struct adapter *padapter, struct getratable_rsp *pval); ++ ++u8 rtw_gettssi_cmd(struct adapter *padapter, u8 offset,u8 *pval); ++u8 rtw_setfwdig_cmd(struct adapter*padapter, u8 type); ++u8 rtw_setfwra_cmd(struct adapter*padapter, u8 type); ++ ++u8 rtw_addbareq_cmd(struct adapter*padapter, u8 tid, u8 *addr); ++ ++u8 rtw_dynamic_chk_wk_cmd(struct adapter *adapter); ++ ++u8 rtw_lps_ctrl_wk_cmd(struct adapter*padapter, u8 lps_ctrl_type, u8 enqueue); ++u8 rtw_rpt_timer_cfg_cmd(struct adapter*padapter, u16 minRptTime); ++ ++ u8 rtw_antenna_select_cmd(struct adapter*padapter, u8 antenna,u8 enqueue); ++u8 rtw_ps_cmd(struct adapter*padapter); ++ ++#ifdef CONFIG_88EU_AP_MODE ++u8 rtw_chk_hi_queue_cmd(struct adapter*padapter); ++#endif ++ ++u8 rtw_set_ch_cmd(struct adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue); ++u8 rtw_set_chplan_cmd(struct adapter*padapter, u8 chplan, u8 enqueue); ++u8 rtw_led_blink_cmd(struct adapter*padapter, struct LED_871x * pLed); ++u8 rtw_set_csa_cmd(struct adapter*padapter, u8 new_ch_no); ++u8 rtw_tdls_cmd(struct adapter *padapter, u8 *addr, u8 option); ++ ++u8 rtw_c2h_wk_cmd(struct adapter *padapter, u8 *c2h_evt); ++ ++u8 rtw_drvextra_cmd_hdl(struct adapter *padapter, unsigned char *pbuf); ++ ++void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd); ++void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd); ++void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd); ++void rtw_createbss_cmd_callback(struct adapter *adapt, struct cmd_obj *pcmd); ++void rtw_getbbrfreg_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd); ++void rtw_readtssi_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd); ++ ++void rtw_setstaKey_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd); ++void rtw_setassocsta_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cm); ++void rtw_getrttbl_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd); ++ ++struct _cmd_callback { ++ u32 cmd_code; ++ void (*callback)(struct adapter *padapter, struct cmd_obj *cmd); ++}; ++ ++enum rtw_h2c_cmd { ++ GEN_CMD_CODE(_Read_MACREG), /*0*/ ++ GEN_CMD_CODE(_Write_MACREG), ++ GEN_CMD_CODE(_Read_BBREG), ++ GEN_CMD_CODE(_Write_BBREG), ++ GEN_CMD_CODE(_Read_RFREG), ++ GEN_CMD_CODE(_Write_RFREG), /*5*/ ++ GEN_CMD_CODE(_Read_EEPROM), ++ GEN_CMD_CODE(_Write_EEPROM), ++ GEN_CMD_CODE(_Read_EFUSE), ++ GEN_CMD_CODE(_Write_EFUSE), ++ ++ GEN_CMD_CODE(_Read_CAM), /*10*/ ++ GEN_CMD_CODE(_Write_CAM), ++ GEN_CMD_CODE(_setBCNITV), ++ GEN_CMD_CODE(_setMBIDCFG), ++ GEN_CMD_CODE(_JoinBss), /*14*/ ++ GEN_CMD_CODE(_DisConnect), /*15*/ ++ GEN_CMD_CODE(_CreateBss), ++ GEN_CMD_CODE(_SetOpMode), ++ GEN_CMD_CODE(_SiteSurvey), /*18*/ ++ GEN_CMD_CODE(_SetAuth), ++ ++ GEN_CMD_CODE(_SetKey), /*20*/ ++ GEN_CMD_CODE(_SetStaKey), ++ GEN_CMD_CODE(_SetAssocSta), ++ GEN_CMD_CODE(_DelAssocSta), ++ GEN_CMD_CODE(_SetStaPwrState), ++ GEN_CMD_CODE(_SetBasicRate), /*25*/ ++ GEN_CMD_CODE(_GetBasicRate), ++ GEN_CMD_CODE(_SetDataRate), ++ GEN_CMD_CODE(_GetDataRate), ++ GEN_CMD_CODE(_SetPhyInfo), ++ ++ GEN_CMD_CODE(_GetPhyInfo), /*30*/ ++ GEN_CMD_CODE(_SetPhy), ++ GEN_CMD_CODE(_GetPhy), ++ GEN_CMD_CODE(_readRssi), ++ GEN_CMD_CODE(_readGain), ++ GEN_CMD_CODE(_SetAtim), /*35*/ ++ GEN_CMD_CODE(_SetPwrMode), ++ GEN_CMD_CODE(_JoinbssRpt), ++ GEN_CMD_CODE(_SetRaTable), ++ GEN_CMD_CODE(_GetRaTable), ++ ++ GEN_CMD_CODE(_GetCCXReport), /*40*/ ++ GEN_CMD_CODE(_GetDTMReport), ++ GEN_CMD_CODE(_GetTXRateStatistics), ++ GEN_CMD_CODE(_SetUsbSuspend), ++ GEN_CMD_CODE(_SetH2cLbk), ++ GEN_CMD_CODE(_AddBAReq), /*45*/ ++ GEN_CMD_CODE(_SetChannel), /*46*/ ++ GEN_CMD_CODE(_SetTxPower), ++ GEN_CMD_CODE(_SwitchAntenna), ++ GEN_CMD_CODE(_SetCrystalCap), ++ GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/ ++ ++ GEN_CMD_CODE(_SetSingleToneTx),/*51*/ ++ GEN_CMD_CODE(_SetCarrierSuppressionTx), ++ GEN_CMD_CODE(_SetContinuousTx), ++ GEN_CMD_CODE(_SwitchBandwidth), /*54*/ ++ GEN_CMD_CODE(_TX_Beacon), /*55*/ ++ ++ GEN_CMD_CODE(_Set_MLME_EVT), /*56*/ ++ GEN_CMD_CODE(_Set_Drv_Extra), /*57*/ ++ GEN_CMD_CODE(_Set_H2C_MSG), /*58*/ ++ ++ GEN_CMD_CODE(_SetChannelPlan), /*59*/ ++ GEN_CMD_CODE(_LedBlink), /*60*/ ++ ++ GEN_CMD_CODE(_SetChannelSwitch), /*61*/ ++ GEN_CMD_CODE(_TDLS), /*62*/ ++ ++ MAX_H2CCMD ++}; ++ ++#define _GetBBReg_CMD_ _Read_BBREG_CMD_ ++#define _SetBBReg_CMD_ _Write_BBREG_CMD_ ++#define _GetRFReg_CMD_ _Read_RFREG_CMD_ ++#define _SetRFReg_CMD_ _Write_RFREG_CMD_ ++ ++#ifdef _RTW_CMD_C_ ++static struct _cmd_callback rtw_cmd_callback[] = ++{ ++ {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/ ++ {GEN_CMD_CODE(_Write_MACREG), NULL}, ++ {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback}, ++ {GEN_CMD_CODE(_Write_BBREG), NULL}, ++ {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback}, ++ {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/ ++ {GEN_CMD_CODE(_Read_EEPROM), NULL}, ++ {GEN_CMD_CODE(_Write_EEPROM), NULL}, ++ {GEN_CMD_CODE(_Read_EFUSE), NULL}, ++ {GEN_CMD_CODE(_Write_EFUSE), NULL}, ++ ++ {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/ ++ {GEN_CMD_CODE(_Write_CAM), NULL}, ++ {GEN_CMD_CODE(_setBCNITV), NULL}, ++ {GEN_CMD_CODE(_setMBIDCFG), NULL}, ++ {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/ ++ {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/ ++ {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback}, ++ {GEN_CMD_CODE(_SetOpMode), NULL}, ++ {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/ ++ {GEN_CMD_CODE(_SetAuth), NULL}, ++ ++ {GEN_CMD_CODE(_SetKey), NULL}, /*20*/ ++ {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback}, ++ {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback}, ++ {GEN_CMD_CODE(_DelAssocSta), NULL}, ++ {GEN_CMD_CODE(_SetStaPwrState), NULL}, ++ {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/ ++ {GEN_CMD_CODE(_GetBasicRate), NULL}, ++ {GEN_CMD_CODE(_SetDataRate), NULL}, ++ {GEN_CMD_CODE(_GetDataRate), NULL}, ++ {GEN_CMD_CODE(_SetPhyInfo), NULL}, ++ ++ {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/ ++ {GEN_CMD_CODE(_SetPhy), NULL}, ++ {GEN_CMD_CODE(_GetPhy), NULL}, ++ {GEN_CMD_CODE(_readRssi), NULL}, ++ {GEN_CMD_CODE(_readGain), NULL}, ++ {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/ ++ {GEN_CMD_CODE(_SetPwrMode), NULL}, ++ {GEN_CMD_CODE(_JoinbssRpt), NULL}, ++ {GEN_CMD_CODE(_SetRaTable), NULL}, ++ {GEN_CMD_CODE(_GetRaTable), NULL}, ++ ++ {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/ ++ {GEN_CMD_CODE(_GetDTMReport), NULL}, ++ {GEN_CMD_CODE(_GetTXRateStatistics), NULL}, ++ {GEN_CMD_CODE(_SetUsbSuspend), NULL}, ++ {GEN_CMD_CODE(_SetH2cLbk), NULL}, ++ {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/ ++ {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/ ++ {GEN_CMD_CODE(_SetTxPower), NULL}, ++ {GEN_CMD_CODE(_SwitchAntenna), NULL}, ++ {GEN_CMD_CODE(_SetCrystalCap), NULL}, ++ {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/ ++ ++ {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/ ++ {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL}, ++ {GEN_CMD_CODE(_SetContinuousTx), NULL}, ++ {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/ ++ {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/ ++ ++ {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/ ++ {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/ ++ {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/ ++ {GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/ ++ {GEN_CMD_CODE(_LedBlink), NULL},/*60*/ ++ ++ {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/ ++ {GEN_CMD_CODE(_TDLS), NULL},/*62*/ ++}; ++#endif ++ ++#endif /* _CMD_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_debug.h b/drivers/staging/r8188eu/include/rtw_debug.h +new file mode 100644 +index 000000000000..3c3bf2a4f30e +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_debug.h +@@ -0,0 +1,231 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_DEBUG_H__ ++#define __RTW_DEBUG_H__ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define _drv_always_ 1 ++#define _drv_emerg_ 2 ++#define _drv_alert_ 3 ++#define _drv_crit_ 4 ++#define _drv_err_ 5 ++#define _drv_warning_ 6 ++#define _drv_notice_ 7 ++#define _drv_info_ 8 ++#define _drv_debug_ 9 ++ ++#define _module_rtl871x_xmit_c_ BIT(0) ++#define _module_xmit_osdep_c_ BIT(1) ++#define _module_rtl871x_recv_c_ BIT(2) ++#define _module_recv_osdep_c_ BIT(3) ++#define _module_rtl871x_mlme_c_ BIT(4) ++#define _module_mlme_osdep_c_ BIT(5) ++#define _module_rtl871x_sta_mgt_c_ BIT(6) ++#define _module_rtl871x_cmd_c_ BIT(7) ++#define _module_cmd_osdep_c_ BIT(8) ++#define _module_rtl871x_io_c_ BIT(9) ++#define _module_io_osdep_c_ BIT(10) ++#define _module_os_intfs_c_ BIT(11) ++#define _module_rtl871x_security_c_ BIT(12) ++#define _module_rtl871x_eeprom_c_ BIT(13) ++#define _module_hal_init_c_ BIT(14) ++#define _module_hci_hal_init_c_ BIT(15) ++#define _module_rtl871x_ioctl_c_ BIT(16) ++#define _module_rtl871x_ioctl_set_c_ BIT(17) ++#define _module_rtl871x_ioctl_query_c_ BIT(18) ++#define _module_rtl871x_pwrctrl_c_ BIT(19) ++#define _module_hci_intfs_c_ BIT(20) ++#define _module_hci_ops_c_ BIT(21) ++#define _module_osdep_service_c_ BIT(22) ++#define _module_mp_ BIT(23) ++#define _module_hci_ops_os_c_ BIT(24) ++#define _module_rtl871x_ioctl_os_c BIT(25) ++#define _module_rtl8712_cmd_c_ BIT(26) ++#define _module_rtl8192c_xmit_c_ BIT(27) ++#define _module_hal_xmit_c_ BIT(28) ++#define _module_efuse_ BIT(29) ++#define _module_rtl8712_recv_c_ BIT(30) ++#define _module_rtl8712_led_c_ BIT(31) ++ ++#define DRIVER_PREFIX "R8188EU: " ++ ++extern u32 GlobalDebugLevel; ++ ++#define DBG_88E_LEVEL(_level, fmt, arg...) \ ++ do { \ ++ if (_level <= GlobalDebugLevel) \ ++ pr_info(DRIVER_PREFIX"INFO " fmt, ##arg); \ ++ } while (0) ++ ++#define DBG_88E(...) \ ++ do { \ ++ if (_drv_err_ <= GlobalDebugLevel) \ ++ pr_info(DRIVER_PREFIX __VA_ARGS__); \ ++ } while (0) ++ ++#define MSG_88E(...) \ ++ do { \ ++ if (_drv_err_ <= GlobalDebugLevel) \ ++ pr_info(DRIVER_PREFIX __VA_ARGS__); \ ++ } while (0) ++ ++int proc_get_drv_version(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_write_reg(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_write_reg(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++int proc_get_read_reg(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_read_reg(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_fwstate(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++int proc_get_sec_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++int proc_get_mlmext_state(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_qos_option(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++int proc_get_ht_option(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++int proc_get_rf_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++int proc_get_ap_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_adapter_state(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_trx_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_mac_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_mac_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_mac_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_bb_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_bb_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_bb_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rf_reg_dump1(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rf_reg_dump2(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rf_reg_dump3(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rf_reg_dump4(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++int proc_get_all_sta_info(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++#endif ++ ++int proc_get_best_channel(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rx_signal(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_rx_signal(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_ht_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_ht_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_cbw40_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_cbw40_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_ampdu_enable(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_ampdu_enable(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_rx_stbc(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_rx_stbc(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++int proc_get_two_path_rssi(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_get_rssi_disp(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_rssi_disp(struct file *file, const char __user *buffer, ++ unsigned long count, void *data); ++ ++#ifdef CONFIG_BT_COEXIST ++int proc_get_btcoex_dbg(char *page, char **start, ++ off_t offset, int count, ++ int *eof, void *data); ++ ++int proc_set_btcoex_dbg(struct file *file, const char *buffer, ++ signed long count, void *data); ++ ++#endif /* CONFIG_BT_COEXIST */ ++ ++#endif /* __RTW_DEBUG_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtw_eeprom.h b/drivers/staging/r8188eu/include/rtw_eeprom.h +new file mode 100644 +index 000000000000..9f8a9c070339 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_eeprom.h +@@ -0,0 +1,114 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_EEPROM_H__ ++#define __RTW_EEPROM_H__ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define RTL8712_EEPROM_ID 0x8712 ++ ++#define HWSET_MAX_SIZE_512 512 ++#define EEPROM_MAX_SIZE HWSET_MAX_SIZE_512 ++ ++#define CLOCK_RATE 50 /* 100us */ ++ ++/* EEPROM opcodes */ ++#define EEPROM_READ_OPCODE 06 ++#define EEPROM_WRITE_OPCODE 05 ++#define EEPROM_ERASE_OPCODE 07 ++#define EEPROM_EWEN_OPCODE 19 /* Erase/write enable */ ++#define EEPROM_EWDS_OPCODE 16 /* Erase/write disable */ ++ ++/* Country codes */ ++#define USA 0x555320 ++#define EUROPE 0x1 /* temp, should be provided later */ ++#define JAPAN 0x2 /* temp, should be provided later */ ++ ++#define EEPROM_CID_DEFAULT 0x0 ++#define EEPROM_CID_ALPHA 0x1 ++#define EEPROM_CID_Senao 0x3 ++#define EEPROM_CID_NetCore 0x5 ++#define EEPROM_CID_CAMEO 0X8 ++#define EEPROM_CID_SITECOM 0x9 ++#define EEPROM_CID_COREGA 0xB ++#define EEPROM_CID_EDIMAX_BELK 0xC ++#define EEPROM_CID_SERCOMM_BELK 0xE ++#define EEPROM_CID_CAMEO1 0xF ++#define EEPROM_CID_WNC_COREGA 0x12 ++#define EEPROM_CID_CLEVO 0x13 ++#define EEPROM_CID_WHQL 0xFE ++ ++/* Customer ID, note that: */ ++/* This variable is initiailzed through EEPROM or registry, */ ++/* however, its definition may be different with that in EEPROM for */ ++/* EEPROM size consideration. So, we have to perform proper translation ++ * between them. */ ++/* Besides, CustomerID of registry has precedence of that of EEPROM. */ ++/* defined below. 060703, by rcnjko. */ ++enum RT_CUSTOMER_ID { ++ RT_CID_DEFAULT = 0, ++ RT_CID_8187_ALPHA0 = 1, ++ RT_CID_8187_SERCOMM_PS = 2, ++ RT_CID_8187_HW_LED = 3, ++ RT_CID_8187_NETGEAR = 4, ++ RT_CID_WHQL = 5, ++ RT_CID_819x_CAMEO = 6, ++ RT_CID_819x_RUNTOP = 7, ++ RT_CID_819x_Senao = 8, ++ RT_CID_TOSHIBA = 9, /* Merge by Jacken, 2008/01/31. */ ++ RT_CID_819x_Netcore = 10, ++ RT_CID_Nettronix = 11, ++ RT_CID_DLINK = 12, ++ RT_CID_PRONET = 13, ++ RT_CID_COREGA = 14, ++ RT_CID_CHINA_MOBILE = 15, ++ RT_CID_819x_ALPHA = 16, ++ RT_CID_819x_Sitecom = 17, ++ RT_CID_CCX = 18, /* It's set under CCX logo test and isn't demanded ++ * for CCX functions, but for test behavior like retry ++ * limit and tx report. By Bruce, 2009-02-17. */ ++ RT_CID_819x_Lenovo = 19, ++ RT_CID_819x_QMI = 20, ++ RT_CID_819x_Edimax_Belkin = 21, ++ RT_CID_819x_Sercomm_Belkin = 22, ++ RT_CID_819x_CAMEO1 = 23, ++ RT_CID_819x_MSI = 24, ++ RT_CID_819x_Acer = 25, ++ RT_CID_819x_AzWave_ASUS = 26, ++ RT_CID_819x_AzWave = 27, /* For AzWave in PCIe,i ++ * The ID is AzWave use and not only Asus */ ++ RT_CID_819x_HP = 28, ++ RT_CID_819x_WNC_COREGA = 29, ++ RT_CID_819x_Arcadyan_Belkin = 30, ++ RT_CID_819x_SAMSUNG = 31, ++ RT_CID_819x_CLEVO = 32, ++ RT_CID_819x_DELL = 33, ++ RT_CID_819x_PRONETS = 34, ++ RT_CID_819x_Edimax_ASUS = 35, ++ RT_CID_819x_CAMEO_NETGEAR = 36, ++ RT_CID_PLANEX = 37, ++ RT_CID_CC_C = 38, ++ RT_CID_819x_Xavi = 39, ++ RT_CID_819x_FUNAI_TV = 40, ++ RT_CID_819x_ALPHA_WD=41, ++}; ++ ++struct eeprom_priv { ++ u8 bautoload_fail_flag; ++ u8 bloadfile_fail_flag; ++ u8 bloadmac_fail_flag; ++ u8 mac_addr[6]; /* PermanentAddress */ ++ u16 channel_plan; ++ u8 EepromOrEfuse; ++ u8 efuse_eeprom_data[HWSET_MAX_SIZE_512] __aligned(4); ++}; ++ ++void eeprom_write16(struct adapter *padapter, u16 reg, u16 data); ++u16 eeprom_read16(struct adapter *padapter, u16 reg); ++void read_eeprom_content(struct adapter *padapter); ++void eeprom_read_sz(struct adapter *adapt, u16 reg, u8 *data, u32 sz); ++void read_eeprom_content_by_attrib(struct adapter *padapter); ++ ++#endif /* __RTL871X_EEPROM_H__ */ +diff --git a/drivers/staging/r8188eu/include/rtw_efuse.h b/drivers/staging/r8188eu/include/rtw_efuse.h +new file mode 100644 +index 000000000000..b3ff46db2091 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_efuse.h +@@ -0,0 +1,134 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_EFUSE_H__ ++#define __RTW_EFUSE_H__ ++ ++#include "osdep_service.h" ++ ++#define EFUSE_ERROE_HANDLE 1 ++ ++#define PG_STATE_HEADER 0x01 ++#define PG_STATE_WORD_0 0x02 ++#define PG_STATE_WORD_1 0x04 ++#define PG_STATE_WORD_2 0x08 ++#define PG_STATE_WORD_3 0x10 ++#define PG_STATE_DATA 0x20 ++ ++#define PG_SWBYTE_H 0x01 ++#define PG_SWBYTE_L 0x02 ++ ++#define PGPKT_DATA_SIZE 8 ++ ++#define EFUSE_WIFI 0 ++#define EFUSE_BT 1 ++ ++enum _EFUSE_DEF_TYPE { ++ TYPE_EFUSE_MAX_SECTION = 0, ++ TYPE_EFUSE_REAL_CONTENT_LEN = 1, ++ TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2, ++ TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3, ++ TYPE_EFUSE_MAP_LEN = 4, ++ TYPE_EFUSE_PROTECT_BYTES_BANK = 5, ++ TYPE_EFUSE_CONTENT_LEN_BANK = 6, ++}; ++ ++/* E-Fuse */ ++#define EFUSE_MAP_SIZE 512 ++#define EFUSE_MAX_SIZE 256 ++/* end of E-Fuse */ ++ ++#define EFUSE_MAX_MAP_LEN 512 ++#define EFUSE_MAX_HW_SIZE 512 ++#define EFUSE_MAX_SECTION_BASE 16 ++ ++#define EXT_HEADER(header) ((header & 0x1F) == 0x0F) ++#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F) ++#define GET_HDR_OFFSET_2_0(header) ((header & 0xE0) >> 5) ++ ++#define EFUSE_REPEAT_THRESHOLD_ 3 ++ ++/* The following is for BT Efuse definition */ ++#define EFUSE_BT_MAX_MAP_LEN 1024 ++#define EFUSE_MAX_BANK 4 ++#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1) ++/*--------------------------Define Parameters-------------------------------*/ ++#define EFUSE_MAX_WORD_UNIT 4 ++ ++/*------------------------------Define structure----------------------------*/ ++struct pgpkt { ++ u8 offset; ++ u8 word_en; ++ u8 data[8]; ++ u8 word_cnts; ++}; ++ ++/*------------------------------Define structure----------------------------*/ ++struct efuse_hal { ++ u8 fakeEfuseBank; ++ u32 fakeEfuseUsedBytes; ++ u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]; ++ u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]; ++ u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]; ++ ++ u16 BTEfuseUsedBytes; ++ u8 BTEfuseUsedPercentage; ++ u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++ u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]; ++ u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]; ++ ++ u16 fakeBTEfuseUsedBytes; ++ u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++ u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]; ++ u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]; ++}; ++ ++/*------------------------Export global variable----------------------------*/ ++extern u8 fakeEfuseBank; ++extern u32 fakeEfuseUsedBytes; ++extern u8 fakeEfuseContent[]; ++extern u8 fakeEfuseInitMap[]; ++extern u8 fakeEfuseModifiedMap[]; ++ ++extern u32 BTEfuseUsedBytes; ++extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++extern u8 BTEfuseInitMap[]; ++extern u8 BTEfuseModifiedMap[]; ++ ++extern u32 fakeBTEfuseUsedBytes; ++extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; ++extern u8 fakeBTEfuseInitMap[]; ++extern u8 fakeBTEfuseModifiedMap[]; ++/*------------------------Export global variable----------------------------*/ ++ ++u8 efuse_GetCurrentSize(struct adapter *adapter, u16 *size); ++u16 efuse_GetMaxSize(struct adapter *adapter); ++u8 rtw_efuse_access(struct adapter *adapter, u8 read, u16 start_addr, ++ u16 cnts, u8 *data); ++u8 rtw_efuse_map_read(struct adapter *adapter, u16 addr, u16 cnts, u8 *data); ++u8 rtw_efuse_map_write(struct adapter *adapter, u16 addr, u16 cnts, u8 *data); ++u8 rtw_BT_efuse_map_read(struct adapter *adapter, u16 addr, ++ u16 cnts, u8 *data); ++u8 rtw_BT_efuse_map_write(struct adapter *adapter, u16 addr, ++ u16 cnts, u8 *data); ++u16 Efuse_GetCurrentSize(struct adapter *adapter, u8 efusetype, bool test); ++u8 Efuse_CalculateWordCnts(u8 word_en); ++void ReadEFuseByte(struct adapter *adapter, u16 _offset, u8 *pbuf, bool test); ++void EFUSE_GetEfuseDefinition(struct adapter *adapt, u8 type, u8 type1, ++ void *out, bool bPseudoTest); ++u8 efuse_OneByteRead(struct adapter *adapter, u16 addr, u8 *data, bool test); ++u8 efuse_OneByteWrite(struct adapter *adapter, u16 addr, u8 data, bool test); ++ ++void Efuse_PowerSwitch(struct adapter *adapt,u8 bWrite,u8 PwrState); ++int Efuse_PgPacketRead(struct adapter *adapt, u8 offset, u8 *data, bool test); ++int Efuse_PgPacketWrite(struct adapter *adapter, u8 offset, u8 word, u8 *data, ++ bool test); ++void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata); ++u8 Efuse_WordEnableDataWrite(struct adapter *adapter, u16 efuse_addr, ++ u8 word_en, u8 *data, bool test); ++ ++u8 EFUSE_Read1Byte(struct adapter *adapter, u16 address); ++void EFUSE_ShadowMapUpdate(struct adapter *adapter, u8 efusetype, bool test); ++void EFUSE_ShadowRead(struct adapter *adapt, u8 type, u16 offset, u32 *val); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_event.h b/drivers/staging/r8188eu/include/rtw_event.h +new file mode 100644 +index 000000000000..54dc1ea437fc +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_event.h +@@ -0,0 +1,97 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_EVENT_H_ ++#define _RTW_EVENT_H_ ++ ++#include "osdep_service.h" ++ ++#include "wlan_bssdef.h" ++#include ++#include ++ ++/* ++Used to report a bss has been scanned ++*/ ++struct survey_event { ++ struct wlan_bssid_ex bss; ++}; ++ ++/* ++Used to report that the requested site survey has been done. ++ ++bss_cnt indicates the number of bss that has been reported. ++ ++*/ ++struct surveydone_event { ++ unsigned int bss_cnt; ++ ++}; ++ ++/* ++Used to report the link result of joinning the given bss ++ ++join_res: ++-1: authentication fail ++-2: association fail ++> 0: TID ++ ++*/ ++struct joinbss_event { ++ struct wlan_network network; ++}; ++ ++/* ++Used to report a given STA has joinned the created BSS. ++It is used in AP/Ad-HoC(M) mode. ++*/ ++ ++struct stassoc_event { ++ unsigned char macaddr[6]; ++ unsigned char rsvd[2]; ++ int cam_id; ++}; ++ ++struct stadel_event { ++ unsigned char macaddr[6]; ++ unsigned char rsvd[2]; /* for reason */ ++ int mac_id; ++}; ++ ++struct addba_event { ++ unsigned int tid; ++}; ++ ++#define GEN_EVT_CODE(event) event ## _EVT_ ++ ++struct fwevent { ++ u32 parmsize; ++ void (*event_callback)(struct adapter *dev, u8 *pbuf); ++}; ++ ++#define C2HEVENT_SZ 32 ++ ++struct event_node { ++ unsigned char *node; ++ unsigned char evt_code; ++ unsigned short evt_sz; ++ int *caller_ff_tail; ++ int caller_ff_sz; ++}; ++ ++struct c2hevent_queue { ++ int head; ++ int tail; ++ struct event_node nodes[C2HEVENT_SZ]; ++ unsigned char seq; ++}; ++ ++#define NETWORK_QUEUE_SZ 4 ++ ++struct network_queue { ++ int head; ++ int tail; ++ struct wlan_bssid_ex networks[NETWORK_QUEUE_SZ]; ++}; ++ ++#endif /* _WLANEVENT_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_ht.h b/drivers/staging/r8188eu/include/rtw_ht.h +new file mode 100644 +index 000000000000..2b56b7c38c86 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_ht.h +@@ -0,0 +1,28 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_HT_H_ ++#define _RTW_HT_H_ ++ ++#include "osdep_service.h" ++#include "wifi.h" ++ ++struct ht_priv { ++ u32 ht_option; ++ u32 ampdu_enable;/* for enable Tx A-MPDU */ ++ u32 tx_amsdu_enable;/* for enable Tx A-MSDU */ ++ u32 tx_amdsu_maxlen; /* 1: 8k, 0:4k ; default:8k, for tx */ ++ u32 rx_ampdu_maxlen; /* for rx reordering ctrl win_sz, ++ * updated when join_callback. */ ++ u8 bwmode;/* */ ++ u8 ch_offset;/* PRIME_CHNL_OFFSET */ ++ u8 sgi;/* short GI */ ++ ++ /* for processing Tx A-MPDU */ ++ u8 agg_enable_bitmap; ++ u8 candidate_tid_bitmap; ++ ++ struct ieee80211_ht_cap ht_cap; ++}; ++ ++#endif /* _RTL871X_HT_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_io.h b/drivers/staging/r8188eu/include/rtw_io.h +new file mode 100644 +index 000000000000..4b41c7b03972 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_io.h +@@ -0,0 +1,367 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_IO_H_ ++#define _RTW_IO_H_ ++ ++#include "osdep_service.h" ++#include "osdep_intf.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define rtw_usb_buffer_alloc(dev, size, dma) \ ++ usb_alloc_coherent((dev), (size), (in_interrupt() ? \ ++ GFP_ATOMIC : GFP_KERNEL), (dma)) ++#define rtw_usb_buffer_free(dev, size, addr, dma) \ ++ usb_free_coherent((dev), (size), (addr), (dma)) ++ ++#define NUM_IOREQ 8 ++ ++#define MAX_PROT_SZ (64-16) ++ ++#define _IOREADY 0 ++#define _IO_WAIT_COMPLETE 1 ++#define _IO_WAIT_RSP 2 ++ ++/* IO COMMAND TYPE */ ++#define _IOSZ_MASK_ (0x7F) ++#define _IO_WRITE_ BIT(7) ++#define _IO_FIXED_ BIT(8) ++#define _IO_BURST_ BIT(9) ++#define _IO_BYTE_ BIT(10) ++#define _IO_HW_ BIT(11) ++#define _IO_WORD_ BIT(12) ++#define _IO_SYNC_ BIT(13) ++#define _IO_CMDMASK_ (0x1F80) ++ ++/* ++ For prompt mode accessing, caller shall free io_req ++ Otherwise, io_handler will free io_req ++*/ ++ ++/* IO STATUS TYPE */ ++#define _IO_ERR_ BIT(2) ++#define _IO_SUCCESS_ BIT(1) ++#define _IO_DONE_ BIT(0) ++ ++#define IO_RD32 (_IO_SYNC_ | _IO_WORD_) ++#define IO_RD16 (_IO_SYNC_ | _IO_HW_) ++#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) ++ ++#define IO_RD32_ASYNC (_IO_WORD_) ++#define IO_RD16_ASYNC (_IO_HW_) ++#define IO_RD8_ASYNC (_IO_BYTE_) ++ ++#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) ++#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) ++#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) ++ ++#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) ++#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) ++#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) ++ ++/* ++ Only Sync. burst accessing is provided. ++*/ ++ ++#define IO_WR_BURST(x) \ ++ (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_)) ++#define IO_RD_BURST(x) \ ++ (_IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_)) ++ ++/* below is for the intf_option bit defition... */ ++ ++#define _INTF_ASYNC_ BIT(0) /* support async io */ ++ ++struct intf_priv; ++struct intf_hdl; ++struct io_queue; ++ ++struct _io_ops { ++ u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); ++ u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); ++ u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); ++ int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); ++ int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); ++ int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); ++ int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, ++ u8 *pdata); ++ int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); ++ int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); ++ int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); ++ void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, ++ u8 *pmem); ++ void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, ++ u8 *pmem); ++ u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, ++ u8 *pmem); ++ u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, ++ u8 *pmem); ++ void (*_read_port_cancel)(struct intf_hdl *pintfhdl); ++ void (*_write_port_cancel)(struct intf_hdl *pintfhdl); ++}; ++ ++struct io_req { ++ struct list_head list; ++ u32 addr; ++ u32 val; ++ u32 command; ++ u32 status; ++ u8 *pbuf; ++ struct semaphore sema; ++ ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, u8 *cnxt); ++ u8 *cnxt; ++}; ++ ++struct intf_hdl { ++ struct adapter *padapter; ++ struct dvobj_priv *pintf_dev; ++ struct _io_ops io_ops; ++}; ++ ++struct reg_protocol_rd { ++#ifdef __LITTLE_ENDIAN ++ /* DW1 */ ++ u32 NumOfTrans:4; ++ u32 Reserved1:4; ++ u32 Reserved2:24; ++ /* DW2 */ ++ u32 ByteCount:7; ++ u32 WriteEnable:1; /* 0:read, 1:write */ ++ u32 FixOrContinuous:1; /* 0:continuous, 1: Fix */ ++ u32 BurstMode:1; ++ u32 Byte1Access:1; ++ u32 Byte2Access:1; ++ u32 Byte4Access:1; ++ u32 Reserved3:3; ++ u32 Reserved4:16; ++ /* DW3 */ ++ u32 BusAddress; ++ /* DW4 */ ++ /* u32 Value; */ ++#else ++/* DW1 */ ++ u32 Reserved1:4; ++ u32 NumOfTrans:4; ++ u32 Reserved2:24; ++ /* DW2 */ ++ u32 WriteEnable:1; ++ u32 ByteCount:7; ++ u32 Reserved3:3; ++ u32 Byte4Access:1; ++ ++ u32 Byte2Access:1; ++ u32 Byte1Access:1; ++ u32 BurstMode:1; ++ u32 FixOrContinuous:1; ++ u32 Reserved4:16; ++ /* DW3 */ ++ u32 BusAddress; ++ ++ /* DW4 */ ++#endif ++}; ++ ++struct reg_protocol_wt { ++#ifdef __LITTLE_ENDIAN ++ /* DW1 */ ++ u32 NumOfTrans:4; ++ u32 Reserved1:4; ++ u32 Reserved2:24; ++ /* DW2 */ ++ u32 ByteCount:7; ++ u32 WriteEnable:1; /* 0:read, 1:write */ ++ u32 FixOrContinuous:1; /* 0:continuous, 1: Fix */ ++ u32 BurstMode:1; ++ u32 Byte1Access:1; ++ u32 Byte2Access:1; ++ u32 Byte4Access:1; ++ u32 Reserved3:3; ++ u32 Reserved4:16; ++ /* DW3 */ ++ u32 BusAddress; ++ /* DW4 */ ++ u32 Value; ++#else ++ /* DW1 */ ++ u32 Reserved1 :4; ++ u32 NumOfTrans:4; ++ u32 Reserved2:24; ++ /* DW2 */ ++ u32 WriteEnable:1; ++ u32 ByteCount:7; ++ u32 Reserved3:3; ++ u32 Byte4Access:1; ++ u32 Byte2Access:1; ++ u32 Byte1Access:1; ++ u32 BurstMode:1; ++ u32 FixOrContinuous:1; ++ u32 Reserved4:16; ++ /* DW3 */ ++ u32 BusAddress; ++ /* DW4 */ ++ u32 Value; ++#endif ++}; ++ ++/* ++Below is the data structure used by _io_handler ++*/ ++ ++struct io_queue { ++ spinlock_t lock; ++ struct list_head free_ioreqs; ++ struct list_head pending; /* The io_req list that will be served ++ * in the single protocol read/write.*/ ++ struct list_head processing; ++ u8 *free_ioreqs_buf; /* 4-byte aligned */ ++ u8 *pallocated_free_ioreqs_buf; ++ struct intf_hdl intf; ++}; ++ ++struct io_priv { ++ struct adapter *padapter; ++ struct intf_hdl intf; ++}; ++ ++uint ioreq_flush(struct adapter *adapter, struct io_queue *ioqueue); ++void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue); ++uint sync_ioreq_flush(struct adapter *adapter, struct io_queue *ioqueue); ++uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue); ++struct io_req *alloc_ioreq(struct io_queue *pio_q); ++ ++uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl); ++void unregister_intf_hdl(struct intf_hdl *pintfhdl); ++ ++void _rtw_attrib_read(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++void _rtw_attrib_write(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++ ++u8 _rtw_read8(struct adapter *adapter, u32 addr); ++u16 _rtw_read16(struct adapter *adapter, u32 addr); ++u32 _rtw_read32(struct adapter *adapter, u32 addr); ++void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++void _rtw_read_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++void _rtw_read_port_cancel(struct adapter *adapter); ++ ++int _rtw_write8(struct adapter *adapter, u32 addr, u8 val); ++int _rtw_write16(struct adapter *adapter, u32 addr, u16 val); ++int _rtw_write32(struct adapter *adapter, u32 addr, u32 val); ++int _rtw_writeN(struct adapter *adapter, u32 addr, u32 length, u8 *pdata); ++ ++int _rtw_write8_async(struct adapter *adapter, u32 addr, u8 val); ++int _rtw_write16_async(struct adapter *adapter, u32 addr, u16 val); ++int _rtw_write32_async(struct adapter *adapter, u32 addr, u32 val); ++ ++void _rtw_write_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++u32 _rtw_write_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++u32 _rtw_write_port_and_wait(struct adapter *adapter, u32 addr, u32 cnt, ++ u8 *pmem, int timeout_ms); ++void _rtw_write_port_cancel(struct adapter *adapter); ++ ++#define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr)) ++#define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr)) ++#define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr)) ++#define rtw_read_mem(adapter, addr, cnt, mem) \ ++ _rtw_read_mem((adapter), (addr), (cnt), (mem)) ++#define rtw_read_port(adapter, addr, cnt, mem) \ ++ _rtw_read_port((adapter), (addr), (cnt), (mem)) ++#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter)) ++ ++#define rtw_write8(adapter, addr, val) \ ++ _rtw_write8((adapter), (addr), (val)) ++#define rtw_write16(adapter, addr, val) \ ++ _rtw_write16((adapter), (addr), (val)) ++#define rtw_write32(adapter, addr, val) \ ++ _rtw_write32((adapter), (addr), (val)) ++#define rtw_writeN(adapter, addr, length, data) \ ++ _rtw_writeN((adapter), (addr), (length), (data)) ++#define rtw_write8_async(adapter, addr, val) \ ++ _rtw_write8_async((adapter), (addr), (val)) ++#define rtw_write16_async(adapter, addr, val) \ ++ _rtw_write16_async((adapter), (addr), (val)) ++#define rtw_write32_async(adapter, addr, val) \ ++ _rtw_write32_async((adapter), (addr), (val)) ++#define rtw_write_mem(adapter, addr, cnt, mem) \ ++ _rtw_write_mem((adapter), (addr), (cnt), (mem)) ++#define rtw_write_port(adapter, addr, cnt, mem) \ ++ _rtw_write_port((adapter), (addr), (cnt), (mem)) ++#define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) \ ++ _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms)) ++#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel((adapter)) ++ ++void rtw_write_scsi(struct adapter *adapter, u32 cnt, u8 *pmem); ++ ++/* ioreq */ ++void ioreq_read8(struct adapter *adapter, u32 addr, u8 *pval); ++void ioreq_read16(struct adapter *adapter, u32 addr, u16 *pval); ++void ioreq_read32(struct adapter *adapter, u32 addr, u32 *pval); ++void ioreq_write8(struct adapter *adapter, u32 addr, u8 val); ++void ioreq_write16(struct adapter *adapter, u32 addr, u16 val); ++void ioreq_write32(struct adapter *adapter, u32 addr, u32 val); ++ ++uint async_read8(struct adapter *adapter, u32 addr, u8 *pbuff, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++uint async_read16(struct adapter *adapter, u32 addr, u8 *pbuff, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++uint async_read32(struct adapter *adapter, u32 addr, u8 *pbuff, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++ ++void async_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++void async_read_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++ ++void async_write8(struct adapter *adapter, u32 addr, u8 val, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++void async_write16(struct adapter *adapter, u32 addr, u16 val, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++void async_write32(struct adapter *adapter, u32 addr, u32 val, ++ void (*_async_io_callback)(struct adapter *padater, ++ struct io_req *pio_req, ++ u8 *cnxt), u8 *cnxt); ++ ++void async_write_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++void async_write_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); ++ ++int rtw_init_io_priv(struct adapter *padapter, ++ void (*set_intf_ops)(struct _io_ops *pops)); ++ ++uint alloc_io_queue(struct adapter *adapter); ++void free_io_queue(struct adapter *adapter); ++void async_bus_io(struct io_queue *pio_q); ++void bus_sync_io(struct io_queue *pio_q); ++u32 _ioreq2rwmem(struct io_queue *pio_q); ++void dev_power_down(struct adapter * Adapter, u8 bpwrup); ++ ++#define PlatformEFIOWrite1Byte(_a,_b,_c) \ ++ rtw_write8(_a,_b,_c) ++#define PlatformEFIOWrite2Byte(_a,_b,_c) \ ++ rtw_write16(_a,_b,_c) ++#define PlatformEFIOWrite4Byte(_a,_b,_c) \ ++ rtw_write32(_a,_b,_c) ++ ++#define PlatformEFIORead1Byte(_a,_b) \ ++ rtw_read8(_a,_b) ++#define PlatformEFIORead2Byte(_a,_b) \ ++ rtw_read16(_a,_b) ++#define PlatformEFIORead4Byte(_a,_b) \ ++ rtw_read32(_a,_b) ++ ++#endif /* _RTL8711_IO_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_ioctl.h b/drivers/staging/r8188eu/include/rtw_ioctl.h +new file mode 100644 +index 000000000000..a36bd7313755 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_ioctl.h +@@ -0,0 +1,92 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_IOCTL_H_ ++#define _RTW_IOCTL_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#ifndef OID_802_11_CAPABILITY ++ #define OID_802_11_CAPABILITY 0x0d010122 ++#endif ++ ++#ifndef OID_802_11_PMKID ++ #define OID_802_11_PMKID 0x0d010123 ++#endif ++ ++/* For DDK-defined OIDs */ ++#define OID_NDIS_SEG1 0x00010100 ++#define OID_NDIS_SEG2 0x00010200 ++#define OID_NDIS_SEG3 0x00020100 ++#define OID_NDIS_SEG4 0x01010100 ++#define OID_NDIS_SEG5 0x01020100 ++#define OID_NDIS_SEG6 0x01020200 ++#define OID_NDIS_SEG7 0xFD010100 ++#define OID_NDIS_SEG8 0x0D010100 ++#define OID_NDIS_SEG9 0x0D010200 ++#define OID_NDIS_SEG10 0x0D020200 ++ ++#define SZ_OID_NDIS_SEG1 23 ++#define SZ_OID_NDIS_SEG2 3 ++#define SZ_OID_NDIS_SEG3 6 ++#define SZ_OID_NDIS_SEG4 6 ++#define SZ_OID_NDIS_SEG5 4 ++#define SZ_OID_NDIS_SEG6 8 ++#define SZ_OID_NDIS_SEG7 7 ++#define SZ_OID_NDIS_SEG8 36 ++#define SZ_OID_NDIS_SEG9 24 ++#define SZ_OID_NDIS_SEG10 19 ++ ++/* For Realtek-defined OIDs */ ++#define OID_MP_SEG1 0xFF871100 ++#define OID_MP_SEG2 0xFF818000 ++ ++#define OID_MP_SEG3 0xFF818700 ++#define OID_MP_SEG4 0xFF011100 ++ ++enum oid_type { ++ QUERY_OID, ++ SET_OID ++}; ++ ++struct oid_funs_node { ++ unsigned int oid_start; /* the starting number for OID */ ++ unsigned int oid_end; /* the ending number for OID */ ++ struct oid_obj_priv *node_array; ++ unsigned int array_sz; /* the size of node_array */ ++ int query_counter; /* count the number of query hits for this segment */ ++ int set_counter; /* count the number of set hits for this segment */ ++}; ++ ++struct oid_par_priv { ++ void *adapter_context; ++ NDIS_OID oid; ++ void *information_buf; ++ u32 information_buf_len; ++ u32 *bytes_rw; ++ u32 *bytes_needed; ++ enum oid_type type_of_oid; ++ u32 dbg; ++}; ++ ++struct oid_obj_priv { ++ unsigned char dbg; /* 0: without OID debug message ++ * 1: with OID debug message */ ++ int (*oidfuns)(struct oid_par_priv *poid_par_priv); ++}; ++ ++extern struct iw_handler_def rtw_handlers_def; ++ ++int drv_query_info(struct net_device *miniportadaptercontext, NDIS_OID oid, ++ void *informationbuffer, u32 informationbufferlength, ++ u32 *byteswritten, u32 *bytesneeded); ++ ++int drv_set_info(struct net_device *MiniportAdapterContext, ++ NDIS_OID oid, void *informationbuffer, ++ u32 informationbufferlength, u32 *bytesread, ++ u32 *bytesneeded); ++ ++extern int ui_pid[3]; ++ ++#endif /* #ifndef __INC_CEINFO_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_ioctl_rtl.h b/drivers/staging/r8188eu/include/rtw_ioctl_rtl.h +new file mode 100644 +index 000000000000..6d3d1ef923f6 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_ioctl_rtl.h +@@ -0,0 +1,63 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_IOCTL_RTL_H_ ++#define _RTW_IOCTL_RTL_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++/* oid_rtl_seg_01_01 ************** */ ++int oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv);/* 84 */ ++int oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv); ++ ++int oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv);/* 8a */ ++int oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv); /* 8b */ ++ ++int oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv);/* 93 */ ++int oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* oid_rtl_seg_01_03 section start ************** */ ++int oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *priv); ++int oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* oid_rtl_seg_01_11 */ ++int oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* oid_rtl_seg_03_00 section start ************** */ ++int oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv); ++int oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_ioctl_set.h b/drivers/staging/r8188eu/include/rtw_ioctl_set.h +new file mode 100644 +index 000000000000..6216b8ab3a79 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_ioctl_set.h +@@ -0,0 +1,33 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_IOCTL_SET_H_ ++#define __RTW_IOCTL_SET_H_ ++ ++#include "drv_types.h" ++ ++typedef u8 NDIS_802_11_PMKID_VALUE[16]; ++ ++u8 rtw_set_802_11_add_key(struct adapter *adapt, struct ndis_802_11_key *key); ++u8 rtw_set_802_11_authentication_mode(struct adapter *adapt, ++ enum ndis_802_11_auth_mode authmode); ++u8 rtw_set_802_11_bssid(struct adapter*adapter, u8 *bssid); ++u8 rtw_set_802_11_add_wep(struct adapter *adapter, struct ndis_802_11_wep *wep); ++u8 rtw_set_802_11_disassociate(struct adapter *adapter); ++u8 rtw_set_802_11_bssid_list_scan(struct adapter*adapter, ++ struct ndis_802_11_ssid *pssid, ++ int ssid_max_num); ++u8 rtw_set_802_11_infrastructure_mode(struct adapter *adapter, ++ enum ndis_802_11_network_infra type); ++u8 rtw_set_802_11_remove_wep(struct adapter *adapter, u32 keyindex); ++u8 rtw_set_802_11_ssid(struct adapter *adapt, struct ndis_802_11_ssid *ssid); ++u8 rtw_set_802_11_remove_key(struct adapter *adapt, ++ struct ndis_802_11_remove_key *key); ++u8 rtw_validate_ssid(struct ndis_802_11_ssid *ssid); ++u16 rtw_get_cur_max_rate(struct adapter *adapter); ++int rtw_set_scan_mode(struct adapter *adapter, enum rt_scan_type scan_mode); ++int rtw_set_channel_plan(struct adapter *adapter, u8 channel_plan); ++int rtw_set_country(struct adapter *adapter, const char *country_code); ++int rtw_change_ifname(struct adapter *padapter, const char *ifname); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_iol.h b/drivers/staging/r8188eu/include/rtw_iol.h +new file mode 100644 +index 000000000000..471f9ca092a8 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_iol.h +@@ -0,0 +1,68 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_IOL_H_ ++#define __RTW_IOL_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define IOREG_CMD_END_LEN 4 ++ ++struct ioreg_cfg { ++ u8 length; ++ u8 cmd_id; ++ __le16 address; ++ __le32 data; ++ __le32 mask; ++}; ++ ++enum ioreg_cmd { ++ IOREG_CMD_LLT = 0x01, ++ IOREG_CMD_REFUSE = 0x02, ++ IOREG_CMD_EFUSE_PATH = 0x03, ++ IOREG_CMD_WB_REG = 0x04, ++ IOREG_CMD_WW_REG = 0x05, ++ IOREG_CMD_WD_REG = 0x06, ++ IOREG_CMD_W_RF = 0x07, ++ IOREG_CMD_DELAY_US = 0x10, ++ IOREG_CMD_DELAY_MS = 0x11, ++ IOREG_CMD_END = 0xFF, ++}; ++ ++struct xmit_frame *rtw_IOL_accquire_xmit_frame(struct adapter *adapter); ++int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, ++ u32 cmd_len); ++int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary); ++int rtw_IOL_exec_cmds_sync(struct adapter *adapter, ++ struct xmit_frame *xmit_frame, u32 max_wating_ms, ++ u32 bndy_cnt); ++bool rtw_IOL_applied(struct adapter *adapter); ++int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us); ++int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms); ++int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame); ++ ++void read_efuse_from_txpktbuf(struct adapter *adapter, int bcnhead, ++ u8 *content, u16 *size); ++ ++int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, ++ u8 value, u8 mask); ++int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, ++ u16 value, u16 mask); ++int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, ++ u32 value, u32 mask); ++int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, ++ u16 addr, u32 value, u32 mask); ++#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value, mask) \ ++ _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) ++#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value, mask) \ ++ _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) ++#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value, mask) \ ++ _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), (mask)) ++#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value, mask) \ ++ _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value), (mask)) ++ ++u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); ++void rtw_IOL_cmd_buf_dump(struct adapter *Adapter,int buf_len,u8 *pbuf); ++ ++#endif /* __RTW_IOL_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_led.h b/drivers/staging/r8188eu/include/rtw_led.h +new file mode 100644 +index 000000000000..f0965aa5b470 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_led.h +@@ -0,0 +1,181 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_LED_H_ ++#define __RTW_LED_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) ++ ++#define LED_BLINK_NORMAL_INTERVAL 100 ++#define LED_BLINK_SLOWLY_INTERVAL 200 ++#define LED_BLINK_LONG_INTERVAL 400 ++ ++#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 ++#define LED_BLINK_LINK_INTERVAL_ALPHA 500 /* 500 */ ++#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 /* 150 */ ++#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 ++#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 ++ ++#define LED_BLINK_NORMAL_INTERVAL_NETTRONIX 100 ++#define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX 2000 ++ ++#define LED_BLINK_SLOWLY_INTERVAL_PORNET 1000 ++#define LED_BLINK_NORMAL_INTERVAL_PORNET 100 ++ ++#define LED_BLINK_FAST_INTERVAL_BITLAND 30 ++ ++/* 060403, rcnjko: Customized for AzWave. */ ++#define LED_CM2_BLINK_ON_INTERVAL 250 ++#define LED_CM2_BLINK_OFF_INTERVAL 4750 ++ ++#define LED_CM8_BLINK_INTERVAL 500 /* for QMI */ ++#define LED_CM8_BLINK_OFF_INTERVAL 3750 /* for QMI */ ++ ++/* 080124, lanhsin: Customized for RunTop */ ++#define LED_RunTop_BLINK_INTERVAL 300 ++ ++/* 060421, rcnjko: Customized for Sercomm Printer Server case. */ ++#define LED_CM3_BLINK_INTERVAL 1500 ++ ++enum LED_CTL_MODE { ++ LED_CTL_POWER_ON = 1, ++ LED_CTL_LINK = 2, ++ LED_CTL_NO_LINK = 3, ++ LED_CTL_TX = 4, ++ LED_CTL_RX = 5, ++ LED_CTL_SITE_SURVEY = 6, ++ LED_CTL_POWER_OFF = 7, ++ LED_CTL_START_TO_LINK = 8, ++ LED_CTL_START_WPS = 9, ++ LED_CTL_STOP_WPS = 10, ++ LED_CTL_START_WPS_BOTTON = 11, /* added for runtop */ ++ LED_CTL_STOP_WPS_FAIL = 12, /* added for ALPHA */ ++ LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, /* added for BELKIN */ ++ LED_CTL_CONNECTION_NO_TRANSFER = 14, ++}; ++ ++enum LED_STATE_871x { ++ LED_UNKNOWN = 0, ++ RTW_LED_ON = 1, ++ RTW_LED_OFF = 2, ++ LED_BLINK_NORMAL = 3, ++ LED_BLINK_SLOWLY = 4, ++ LED_BLINK_POWER_ON = 5, ++ LED_BLINK_SCAN = 6, /* LED is blinking during scanning period, ++ * the # of times to blink is depend on time ++ * for scanning. */ ++ LED_BLINK_NO_LINK = 7, /* LED is blinking during no link state. */ ++ LED_BLINK_StartToBlink = 8,/* Customzied for Sercomm Printer ++ * Server case */ ++ LED_BLINK_TXRX = 9, ++ LED_BLINK_WPS = 10, /* LED is blinkg during WPS communication */ ++ LED_BLINK_WPS_STOP = 11, /* for ALPHA */ ++ LED_BLINK_WPS_STOP_OVERLAP = 12, /* for BELKIN */ ++ LED_BLINK_RUNTOP = 13, /* Customized for RunTop */ ++ LED_BLINK_CAMEO = 14, ++ LED_BLINK_XAVI = 15, ++ LED_BLINK_ALWAYS_ON = 16, ++}; ++ ++enum LED_PIN_871x { ++ LED_PIN_NULL = 0, ++ LED_PIN_LED0 = 1, ++ LED_PIN_LED1 = 2, ++ LED_PIN_LED2 = 3, ++ LED_PIN_GPIO0 = 4, ++}; ++ ++struct LED_871x { ++ struct adapter *padapter; ++ ++ enum LED_PIN_871x LedPin; /* Identify how to implement this ++ * SW led. */ ++ enum LED_STATE_871x CurrLedState; /* Current LED state. */ ++ enum LED_STATE_871x BlinkingLedState; /* Next state for blinking, ++ * either RTW_LED_ON or RTW_LED_OFF are. */ ++ ++ u8 bLedOn; /* true if LED is ON, false if LED is OFF. */ ++ ++ u8 bLedBlinkInProgress; /* true if it is blinking, false o.w.. */ ++ ++ u8 bLedWPSBlinkInProgress; ++ ++ u32 BlinkTimes; /* Number of times to toggle led state for blinking. */ ++ ++ struct timer_list BlinkTimer; /* Timer object for led blinking. */ ++ ++ u8 bSWLedCtrl; ++ ++ /* ALPHA, added by chiyoko, 20090106 */ ++ u8 bLedNoLinkBlinkInProgress; ++ u8 bLedLinkBlinkInProgress; ++ u8 bLedStartToLinkBlinkInProgress; ++ u8 bLedScanBlinkInProgress; ++ struct work_struct BlinkWorkItem; /* Workitem used by BlinkTimer to ++ * manipulate H/W to blink LED. */ ++}; ++ ++#define IS_LED_WPS_BLINKING(_LED_871x) \ ++ (((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS || \ ++ ((struct LED_871x *)_LED_871x)->CurrLedState == LED_BLINK_WPS_STOP || \ ++ ((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress) ++ ++#define IS_LED_BLINKING(_LED_871x) \ ++ (((struct LED_871x *)_LED_871x)->bLedWPSBlinkInProgress || \ ++ ((struct LED_871x *)_LED_871x)->bLedScanBlinkInProgress) ++ ++/* LED customization. */ ++ ++enum LED_STRATEGY_871x { ++ SW_LED_MODE0 = 0, /* SW control 1 LED via GPIO0. It is default option.*/ ++ SW_LED_MODE1= 1, /* 2 LEDs, through LED0 and LED1. For ALPHA. */ ++ SW_LED_MODE2 = 2, /* SW control 1 LED via GPIO0, customized for AzWave ++ * 8187 minicard. */ ++ SW_LED_MODE3 = 3, /* SW control 1 LED via GPIO0, customized for Sercomm ++ * Printer Server case. */ ++ SW_LED_MODE4 = 4, /* for Edimax / Belkin */ ++ SW_LED_MODE5 = 5, /* for Sercomm / Belkin */ ++ SW_LED_MODE6 = 6, /* for 88CU minicard, porting from ce SW_LED_MODE7 */ ++ HW_LED = 50, /* HW control 2 LEDs, LED0 and LED1 (there are 4 ++ * different control modes, see MAC.CONFIG1 for details.)*/ ++ LED_ST_NONE = 99, ++}; ++ ++void LedControl8188eu(struct adapter *padapter, enum LED_CTL_MODE LedAction); ++ ++struct led_priv{ ++ /* add for led control */ ++ struct LED_871x SwLed0; ++ struct LED_871x SwLed1; ++ enum LED_STRATEGY_871x LedStrategy; ++ u8 bRegUseLed; ++ void (*LedControlHandler)(struct adapter *padapter, ++ enum LED_CTL_MODE LedAction); ++ /* add for led control */ ++}; ++ ++#define rtw_led_control(adapt, action) \ ++ do { \ ++ if ((adapt)->ledpriv.LedControlHandler) \ ++ (adapt)->ledpriv.LedControlHandler((adapt), (action)); \ ++ } while (0) ++ ++void BlinkTimerCallback(struct timer_list *t); ++void BlinkWorkItemCallback(struct work_struct *work); ++ ++void ResetLedStatus(struct LED_871x * pLed); ++ ++void InitLed871x(struct adapter *padapter, struct LED_871x *pLed, ++ enum LED_PIN_871x LedPin); ++ ++void DeInitLed871x(struct LED_871x *pLed); ++ ++/* hal... */ ++void BlinkHandler(struct LED_871x * pLed); ++void SwLedOn(struct adapter *padapter, struct LED_871x *pLed); ++void SwLedOff(struct adapter *padapter, struct LED_871x *pLed); ++ ++#endif /* __RTW_LED_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_mlme.h b/drivers/staging/r8188eu/include/rtw_mlme.h +new file mode 100644 +index 000000000000..bbb41471472d +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_mlme.h +@@ -0,0 +1,632 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_MLME_H_ ++#define __RTW_MLME_H_ ++ ++#include "osdep_service.h" ++#include "mlme_osdep.h" ++#include "drv_types.h" ++#include "wlan_bssdef.h" ++ ++#define MAX_BSS_CNT 128 ++#define MAX_JOIN_TIMEOUT 6500 ++ ++/* Increase the scanning timeout because of increasing the SURVEY_TO value. */ ++ ++#define SCANNING_TIMEOUT 8000 ++ ++#define SCAN_INTERVAL (30) /* unit:2sec, 30*2=60sec */ ++ ++#define SCANQUEUE_LIFETIME 20 /* unit:sec */ ++ ++#define WIFI_NULL_STATE 0x00000000 ++ ++#define WIFI_ASOC_STATE 0x00000001 /* Under Linked state */ ++#define WIFI_REASOC_STATE 0x00000002 ++#define WIFI_SLEEP_STATE 0x00000004 ++#define WIFI_STATION_STATE 0x00000008 ++ ++#define WIFI_AP_STATE 0x00000010 ++#define WIFI_ADHOC_STATE 0x00000020 ++#define WIFI_ADHOC_MASTER_STATE 0x00000040 ++#define WIFI_UNDER_LINKING 0x00000080 ++ ++#define WIFI_UNDER_WPS 0x00000100 ++#define WIFI_STA_ALIVE_CHK_STATE 0x00000400 ++#define WIFI_SITE_MONITOR 0x00000800 /* to indicate the station is under site surveying */ ++ ++#define WIFI_MP_STATE 0x00010000 ++#define WIFI_MP_CTX_BACKGROUND 0x00020000 /* in continuous tx background */ ++#define WIFI_MP_CTX_ST 0x00040000 /* in continuous tx with single-tone */ ++#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 /* pending in continuous tx background due to out of skb */ ++#define WIFI_MP_CTX_CCK_HW 0x00100000 /* in continuous tx */ ++#define WIFI_MP_CTX_CCK_CS 0x00200000 /* in continuous tx with carrier suppression */ ++#define WIFI_MP_LPBK_STATE 0x00400000 ++ ++#define _FW_UNDER_LINKING WIFI_UNDER_LINKING ++#define _FW_LINKED WIFI_ASOC_STATE ++#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR ++ ++enum dot11AuthAlgrthmNum { ++ dot11AuthAlgrthm_Open = 0, ++ dot11AuthAlgrthm_Shared, ++ dot11AuthAlgrthm_8021X, ++ dot11AuthAlgrthm_Auto, ++ dot11AuthAlgrthm_WAPI, ++ dot11AuthAlgrthm_MaxNum ++}; ++ ++/* Scan type including active and passive scan. */ ++enum rt_scan_type { ++ SCAN_PASSIVE, ++ SCAN_ACTIVE, ++ SCAN_MIX, ++}; ++ ++enum SCAN_RESULT_TYPE { ++ SCAN_RESULT_P2P_ONLY = 0, /* Will return all the P2P devices. */ ++ SCAN_RESULT_ALL = 1, /* Will return all the scanned device, ++ * include AP. */ ++ SCAN_RESULT_WFD_TYPE = 2 /* Will just return the correct WFD ++ * device. */ ++ /* If this device is Miracast sink ++ * device, it will just return all the ++ * Miracast source devices. */ ++}; ++ ++/* ++there are several "locks" in mlme_priv, ++since mlme_priv is a shared resource between many threads, ++like ISR/Call-Back functions, the OID handlers, and even timer functions. ++ ++Each _queue has its own locks, already. ++Other items are protected by mlme_priv.lock. ++ ++To avoid possible dead lock, any thread trying to modifiying mlme_priv ++SHALL not lock up more than one lock at a time! ++*/ ++ ++#define traffic_threshold 10 ++#define traffic_scan_period 500 ++ ++struct sitesurvey_ctrl { ++ u64 last_tx_pkts; ++ uint last_rx_pkts; ++ int traffic_busy; ++ struct timer_list sitesurvey_ctrl_timer; ++}; ++ ++struct rt_link_detect { ++ u32 NumTxOkInPeriod; ++ u32 NumRxOkInPeriod; ++ u32 NumRxUnicastOkInPeriod; ++ bool bBusyTraffic; ++ bool bTxBusyTraffic; ++ bool bRxBusyTraffic; ++ bool bHigherBusyTraffic; /* For interrupt migration purpose. */ ++ bool bHigherBusyRxTraffic; /* We may disable Tx interrupt according ++ * to Rx traffic. */ ++ bool bHigherBusyTxTraffic; /* We may disable Tx interrupt according ++ * to Tx traffic. */ ++}; ++ ++struct profile_info { ++ u8 ssidlen; ++ u8 ssid[ WLAN_SSID_MAXLEN ]; ++ u8 peermac[ ETH_ALEN ]; ++}; ++ ++struct tx_invite_req_info { ++ u8 token; ++ u8 benable; ++ u8 go_ssid[ WLAN_SSID_MAXLEN ]; ++ u8 ssidlen; ++ u8 go_bssid[ ETH_ALEN ]; ++ u8 peer_macaddr[ ETH_ALEN ]; ++ u8 operating_ch; /* This information will be set by using the ++ * p2p_set op_ch=x */ ++ u8 peer_ch; /* The listen channel for peer P2P device */ ++}; ++ ++struct tx_invite_resp_info { ++ u8 token; /* Used to record the dialog token of p2p invitation ++ * request frame. */ ++}; ++ ++struct tx_provdisc_req_info { ++ u16 wps_config_method_request; /* Used when sending the ++ * provisioning request frame*/ ++ u16 peer_channel_num[2]; /* The channel number which the ++ * receiver stands. */ ++ struct ndis_802_11_ssid ssid; ++ u8 peerDevAddr[ETH_ALEN]; /* Peer device address */ ++ u8 peerIFAddr[ETH_ALEN]; /* Peer interface address */ ++ u8 benable; /* This provision discovery ++ * request frame is trigger ++ * to send or not */ ++}; ++ ++/* When peer device issue prov_disc_req first, we should store the following ++ * information */ ++/* The UI must know this information to know which config method the ++ * remote p2p device needs. */ ++struct rx_provdisc_req_info { ++ u8 peerDevAddr[ETH_ALEN]; /* Peer device address */ ++ u8 strconfig_method_desc_of_prov_disc_req[4]; /* description ++ * for the config method located in the provisioning ++ * discovery request frame. */ ++}; ++ ++struct tx_nego_req_info { ++ u16 peer_channel_num[2]; /* The channel number. */ ++ u8 peerDevAddr[ETH_ALEN]; /* Peer device address */ ++ u8 benable; /* This negotiation request frame is ++ * trigger to send or not */ ++}; ++ ++struct group_id_info { ++ u8 go_device_addr[ ETH_ALEN ]; /* The GO's device address of ++ * this P2P group */ ++ u8 ssid[ WLAN_SSID_MAXLEN ]; /* The SSID of this P2P group */ ++}; ++ ++struct scan_limit_info { ++ u8 scan_op_ch_only; /* When this flag is set, the driver ++ * should only scan the op. channel */ ++ u8 operation_ch[2]; /* Store the op. chan of invitation */ ++}; ++ ++struct wifidirect_info { ++ struct adapter *padapter; ++ struct timer_list find_phase_timer; ++ struct timer_list restore_p2p_state_timer; ++ ++ /* Used to do the scanning. After confirming the peer is availalble, ++ * the driver transmits the P2P frame to peer. */ ++ struct timer_list pre_tx_scan_timer; ++ struct timer_list reset_ch_sitesurvey; ++ struct timer_list reset_ch_sitesurvey2; /* Just for resetting the scan ++ * limit function by using p2p nego */ ++ struct tx_provdisc_req_info tx_prov_disc_info; ++ struct rx_provdisc_req_info rx_prov_disc_info; ++ struct tx_invite_req_info invitereq_info; ++ /* Store the profile information of persistent group */ ++ struct profile_info profileinfo[P2P_MAX_PERSISTENT_GROUP_NUM]; ++ struct tx_invite_resp_info inviteresp_info; ++ struct tx_nego_req_info nego_req_info; ++ /* Store the group id info when doing the group negot handshake. */ ++ struct group_id_info groupid_info; ++ /* Used for get the limit scan channel from the Invitation procedure */ ++ struct scan_limit_info rx_invitereq_info; ++ /* Used for get the limit scan chan from the P2P negotiation handshake*/ ++ struct scan_limit_info p2p_info; ++ enum P2P_ROLE role; ++ enum P2P_STATE pre_p2p_state; ++ enum P2P_STATE p2p_state; ++ /* The device address should be the mac address of this device. */ ++ u8 device_addr[ETH_ALEN]; ++ u8 interface_addr[ETH_ALEN]; ++ u8 social_chan[4]; ++ u8 listen_channel; ++ u8 operating_channel; ++ u8 listen_dwell; /* This value should be between 1 and 3 */ ++ u8 support_rate[8]; ++ u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN]; ++ u8 intent; /* should only include the intent value. */ ++ u8 p2p_peer_interface_addr[ETH_ALEN]; ++ u8 p2p_peer_device_addr[ETH_ALEN]; ++ u8 peer_intent; /* Included the intent value and tie breaker value. */ ++ /* Device name for displaying on searching device screen */ ++ u8 device_name[WPS_MAX_DEVICE_NAME_LEN]; ++ u8 device_name_len; ++ u8 profileindex; /* Used to point to the index of profileinfo array */ ++ u8 peer_operating_ch; ++ u8 find_phase_state_exchange_cnt; ++ /* The device password ID for group negotiation */ ++ u16 device_password_id_for_nego; ++ u8 negotiation_dialog_token; ++ /* SSID information for group negotitation */ ++ u8 nego_ssid[WLAN_SSID_MAXLEN]; ++ u8 nego_ssidlen; ++ u8 p2p_group_ssid[WLAN_SSID_MAXLEN]; ++ u8 p2p_group_ssid_len; ++ /* Flag to know if the persistent function should be supported or not.*/ ++ u8 persistent_supported; ++ /* In the Sigma test, the Sigma will provide this enable from the ++ * sta_set_p2p CAPI. */ ++ /* 0: disable */ ++ /* 1: enable */ ++ u8 session_available; /* Flag to set the WFD session available to ++ * enable or disable "by Sigma" */ ++ /* In the Sigma test, the Sigma will disable the session available ++ * by using the sta_preset CAPI. */ ++ /* 0: disable */ ++ /* 1: enable */ ++ u8 wfd_tdls_enable; /* Flag to enable or disable the TDLS by WFD Sigma*/ ++ /* 0: disable */ ++ /* 1: enable */ ++ u8 wfd_tdls_weaksec; /* Flag to enable or disable the weak security ++ * function for TDLS by WFD Sigma */ ++ /* 0: disable */ ++ /* In this case, the driver can't issue the tdsl ++ * setup request frame. */ ++ /* 1: enable */ ++ /* In this case, the driver can issue the tdls ++ * setup request frame */ ++ /* even the current security is weak security. */ ++ ++ /* This field will store the WPS value (PIN value or PBC) that UI had ++ * got from the user. */ ++ enum P2P_WPSINFO ui_got_wps_info; ++ u16 supported_wps_cm; /* This field describes the WPS config method ++ * which this driver supported. */ ++ /* The value should be the combination of config ++ * method defined in page104 of WPS v2.0 spec.*/ ++ /* This field will contain the length of body of P2P Channel List ++ * attribute of group negotiation response frame. */ ++ uint channel_list_attr_len; ++ /* This field will contain the body of P2P Channel List attribute of ++ * group negotitation response frame. */ ++ /* We will use the channel_cnt and channel_list fields when constructing ++ * the group negotiation confirm frame. */ ++ u8 channel_list_attr[100]; ++ enum P2P_PS_MODE p2p_ps_mode; /* indicate p2p ps mode */ ++ enum P2P_PS_STATE p2p_ps_state; /* indicate p2p ps state */ ++ u8 noa_index; /* Identifies and instance of Notice of Absence timing. */ ++ u8 ctwindow; /* Client traffic window. A period of time in TU after TBTT. */ ++ u8 opp_ps; /* opportunistic power save. */ ++ u8 noa_num; /* number of NoA descriptor in P2P IE. */ ++ u8 noa_count[P2P_MAX_NOA_NUM]; /* Count for owner, Type of client. */ ++ /* Max duration for owner, preferred or min acceptable duration for ++ * client. */ ++ u32 noa_duration[P2P_MAX_NOA_NUM]; ++ /* Length of interval for owner, preferred or max acceptable interval ++ * of client. */ ++ u32 noa_interval[P2P_MAX_NOA_NUM]; ++ /* schedule expressed in terms of the lower 4 bytes of the TSF timer. */ ++ u32 noa_start_time[P2P_MAX_NOA_NUM]; ++}; ++ ++struct tdls_ss_record { /* signal strength record */ ++ u8 macaddr[ETH_ALEN]; ++ u8 RxPWDBAll; ++ u8 is_tdls_sta; /* true: direct link sta, false: else */ ++}; ++ ++struct tdls_info { ++ u8 ap_prohibited; ++ uint setup_state; ++ u8 sta_cnt; ++ u8 sta_maximum; /* 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; */ ++ struct tdls_ss_record ss_record; ++ u8 macid_index; /* macid entry that is ready to write */ ++ u8 clear_cam; /* cam entry that is trying to clear, using it in direct link teardown */ ++ u8 ch_sensing; ++ u8 cur_channel; ++ u8 candidate_ch; ++ u8 collect_pkt_num[MAX_CHANNEL_NUM]; ++ spinlock_t cmd_lock; ++ spinlock_t hdl_lock; ++ u8 watchdog_count; ++ u8 dev_discovered; /* WFD_TDLS: for sigma test */ ++ u8 enable; ++}; ++ ++struct qos_priv { ++ /* bit mask option: u-apsd, ++ * s-apsd, ts, block ack... */ ++ unsigned int qos_option; ++}; ++ ++struct mlme_priv { ++ spinlock_t lock; ++ int fw_state; /* shall we protect this variable? maybe not necessarily... */ ++ u8 bScanInProcess; ++ u8 to_join; /* flag */ ++ u8 to_roaming; /* roaming trying times */ ++ ++ u8 *nic_hdl; ++ ++ u8 not_indic_disco; ++ struct list_head *pscanned; ++ struct __queue free_bss_pool; ++ struct __queue scanned_queue; ++ u8 *free_bss_buf; ++ u8 key_mask; /* use to restore wep key after hal_init */ ++ u32 num_of_scanned; ++ ++ struct ndis_802_11_ssid assoc_ssid; ++ u8 assoc_bssid[6]; ++ ++ struct wlan_network cur_network; ++ struct wlan_network *cur_network_scanned; ++ ++ u32 scan_interval; ++ ++ struct timer_list assoc_timer; ++ ++ uint assoc_by_bssid; ++ uint assoc_by_rssi; ++ ++ struct timer_list scan_to_timer; /* driver itself handles scan_timeout status. */ ++ u32 scan_start_time; /* used to evaluate the time spent in scanning */ ++ ++ struct qos_priv qospriv; ++ ++ /* Number of non-HT AP/stations */ ++ int num_sta_no_ht; ++ ++ /* Number of HT AP/stations 20 MHz */ ++ /* int num_sta_ht_20mhz; */ ++ ++ int num_FortyMHzIntolerant; ++ struct ht_priv htpriv; ++ struct rt_link_detect LinkDetectInfo; ++ struct timer_list dynamic_chk_timer; /* dynamic/periodic check timer */ ++ ++ u8 acm_mask; /* for wmm acm mask */ ++ u8 ChannelPlan; ++ enum rt_scan_type scan_mode; /* active: 1, passive: 0 */ ++ ++ /* u8 probereq_wpsie[MAX_WPS_IE_LEN];added in probe req */ ++ /* int probereq_wpsie_len; */ ++ u8 *wps_probe_req_ie; ++ u32 wps_probe_req_ie_len; ++ ++ u8 *assoc_req; ++ u32 assoc_req_len; ++ u8 *assoc_rsp; ++ u32 assoc_rsp_len; ++ ++#if defined (CONFIG_88EU_AP_MODE) ++ /* Number of associated Non-ERP stations (i.e., stations using 802.11b ++ * in 802.11g BSS) */ ++ int num_sta_non_erp; ++ ++ /* Number of associated stations that do not support Short Slot Time */ ++ int num_sta_no_short_slot_time; ++ ++ /* Number of associated stations that do not support Short Preamble */ ++ int num_sta_no_short_preamble; ++ ++ int olbc; /* Overlapping Legacy BSS Condition */ ++ ++ /* Number of HT assoc sta that do not support greenfield */ ++ int num_sta_ht_no_gf; ++ ++ /* Number of associated non-HT stations */ ++ /* int num_sta_no_ht; */ ++ ++ /* Number of HT associated stations 20 MHz */ ++ int num_sta_ht_20mhz; ++ ++ /* Overlapping BSS information */ ++ int olbc_ht; ++ ++ u16 ht_op_mode; ++ ++ u8 *wps_beacon_ie; ++ /* u8 *wps_probe_req_ie; */ ++ u8 *wps_probe_resp_ie; ++ u8 *wps_assoc_resp_ie; ++ ++ u32 wps_beacon_ie_len; ++ u32 wps_probe_resp_ie_len; ++ u32 wps_assoc_resp_ie_len; ++ ++ u8 *p2p_beacon_ie; ++ u8 *p2p_probe_req_ie; ++ u8 *p2p_probe_resp_ie; ++ u8 *p2p_go_probe_resp_ie; /* for GO */ ++ u8 *p2p_assoc_req_ie; ++ ++ u32 p2p_beacon_ie_len; ++ u32 p2p_probe_req_ie_len; ++ u32 p2p_probe_resp_ie_len; ++ u32 p2p_go_probe_resp_ie_len; /* for GO */ ++ u32 p2p_assoc_req_ie_len; ++ spinlock_t bcn_update_lock; ++ u8 update_bcn; ++#endif /* if defined (CONFIG_88EU_AP_MODE) */ ++}; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++struct hostapd_priv { ++ struct adapter *padapter; ++}; ++ ++int hostapd_mode_init(struct adapter *padapter); ++void hostapd_mode_unload(struct adapter *padapter); ++#endif ++ ++extern unsigned char WPA_TKIP_CIPHER[4]; ++extern unsigned char RSN_TKIP_CIPHER[4]; ++extern unsigned char REALTEK_96B_IE[]; ++extern unsigned char MCS_rate_2R[16]; ++extern unsigned char MCS_rate_1R[16]; ++ ++void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf); ++void rtw_survey_event_callback(struct adapter *adapter, u8 *pbuf); ++void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf); ++void rtw_joinbss_event_callback(struct adapter *adapter, u8 *pbuf); ++void rtw_stassoc_event_callback(struct adapter *adapter, u8 *pbuf); ++void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf); ++void indicate_wx_scan_complete_event(struct adapter *padapter); ++void rtw_indicate_wx_assoc_event(struct adapter *padapter); ++void rtw_indicate_wx_disassoc_event(struct adapter *padapter); ++int event_thread(void *context); ++void rtw_join_timeout_handler (struct timer_list *t); ++void _rtw_scan_timeout_handler (struct timer_list *t); ++void rtw_free_network_queue(struct adapter *adapter, u8 isfreeall); ++int rtw_init_mlme_priv(struct adapter *adapter); ++void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); ++int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); ++int rtw_set_key(struct adapter *adapter, struct security_priv *psecuritypriv, ++ int keyid, u8 set_tx); ++int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv); ++ ++static inline u8 *get_bssid(struct mlme_priv *pmlmepriv) ++{ /* if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid */ ++ /* if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address */ ++ return pmlmepriv->cur_network.network.MacAddress; ++} ++ ++static inline int check_fwstate(struct mlme_priv *pmlmepriv, int state) ++{ ++ if (pmlmepriv->fw_state & state) ++ return true; ++ ++ return false; ++} ++ ++static inline int get_fwstate(struct mlme_priv *pmlmepriv) ++{ ++ return pmlmepriv->fw_state; ++} ++ ++/* ++ * No Limit on the calling context, ++ * therefore set it to be the critical section... ++ * ++ * ### NOTE:#### (!!!!) ++ * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock ++ */ ++static inline void set_fwstate(struct mlme_priv *pmlmepriv, int state) ++{ ++ pmlmepriv->fw_state |= state; ++ /* FOR HW integration */ ++ if (_FW_UNDER_SURVEY==state) ++ pmlmepriv->bScanInProcess = true; ++} ++ ++static inline void _clr_fwstate_(struct mlme_priv *pmlmepriv, int state) ++{ ++ pmlmepriv->fw_state &= ~state; ++ /* FOR HW integration */ ++ if (_FW_UNDER_SURVEY==state) ++ pmlmepriv->bScanInProcess = false; ++} ++ ++/* ++ * No Limit on the calling context, ++ * therefore set it to be the critical section... ++ */ ++static inline void clr_fwstate(struct mlme_priv *pmlmepriv, int state) ++{ ++ spin_lock_bh(&pmlmepriv->lock); ++ if (check_fwstate(pmlmepriv, state)) ++ pmlmepriv->fw_state ^= state; ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++static inline void clr_fwstate_ex(struct mlme_priv *pmlmepriv, int state) ++{ ++ spin_lock_bh(&pmlmepriv->lock); ++ _clr_fwstate_(pmlmepriv, state); ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++static inline void up_scanned_network(struct mlme_priv *pmlmepriv) ++{ ++ spin_lock_bh(&pmlmepriv->lock); ++ pmlmepriv->num_of_scanned++; ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++static inline void down_scanned_network(struct mlme_priv *pmlmepriv) ++{ ++ spin_lock_bh(&pmlmepriv->lock); ++ pmlmepriv->num_of_scanned--; ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++static inline void set_scanned_network_val(struct mlme_priv *pmlmepriv, int val) ++{ ++ spin_lock_bh(&pmlmepriv->lock); ++ pmlmepriv->num_of_scanned = val; ++ spin_unlock_bh(&pmlmepriv->lock); ++} ++ ++u16 rtw_get_capability(struct wlan_bssid_ex *bss); ++void rtw_update_scanned_network(struct adapter *adapter, ++ struct wlan_bssid_ex *target); ++void rtw_disconnect_hdl_under_linked(struct adapter *adapter, ++ struct sta_info *psta, u8 free_assoc); ++void rtw_generate_random_ibss(u8 *pibss); ++struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr); ++struct wlan_network *rtw_get_oldest_wlan_network(struct __queue *scanned_queue); ++ ++void rtw_free_assoc_resources(struct adapter *adapter, int lock_scanned_queue); ++void rtw_indicate_disconnect(struct adapter *adapter); ++void rtw_indicate_connect(struct adapter *adapter); ++void rtw_indicate_scan_done( struct adapter *padapter, bool aborted); ++void rtw_scan_abort(struct adapter *adapter); ++ ++int rtw_restruct_sec_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, ++ uint in_len); ++int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, ++ uint in_len, uint initial_out_len); ++void rtw_init_registrypriv_dev_network(struct adapter *adapter); ++ ++void rtw_update_registrypriv_dev_network(struct adapter *adapter); ++ ++void rtw_get_encrypt_decrypt_from_registrypriv(struct adapter *adapter); ++ ++void _rtw_join_timeout_handler(struct adapter *adapter); ++void rtw_scan_timeout_handler(struct adapter *adapter); ++ ++ void rtw_dynamic_check_timer_handlder(struct adapter *adapter); ++#define rtw_is_scan_deny(adapter) false ++#define rtw_clear_scan_deny(adapter) do {} while (0) ++#define rtw_set_scan_deny_timer_hdl(adapter) do {} while (0) ++#define rtw_set_scan_deny(adapter, ms) do {} while (0) ++ ++int _rtw_init_mlme_priv(struct adapter *padapter); ++ ++void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv); ++ ++void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); ++ ++int _rtw_enqueue_network(struct __queue *queue, struct wlan_network *pnetwork); ++ ++struct wlan_network *_rtw_dequeue_network(struct __queue *queue); ++ ++ struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv); ++ ++void _rtw_free_network(struct mlme_priv *pmlmepriv, ++ struct wlan_network *pnetwork, u8 isfreeall); ++void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, ++ struct wlan_network *pnetwork); ++ ++struct wlan_network* _rtw_find_network(struct __queue *scanned_queue, u8 *addr); ++ ++void _rtw_free_network_queue(struct adapter *padapter, u8 isfreeall); ++ ++int rtw_if_up(struct adapter *padapter); ++ ++u8 *rtw_get_capability_from_ie(u8 *ie); ++u8 *rtw_get_timestampe_from_ie(u8 *ie); ++u8 *rtw_get_beacon_interval_from_ie(u8 *ie); ++ ++void rtw_joinbss_reset(struct adapter *padapter); ++ ++unsigned int rtw_restructure_ht_ie(struct adapter *padapter, u8 *in_ie, ++ u8 *out_ie, uint in_len, uint *pout_len); ++void rtw_update_ht_cap(struct adapter *padapter, u8 *pie, uint ie_len); ++void rtw_issue_addbareq_cmd(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++ ++int rtw_is_same_ibss(struct adapter *adapter, struct wlan_network *pnetwork); ++int is_same_network(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst); ++ ++void rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network); ++void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network); ++void rtw_set_roaming(struct adapter *adapter, u8 to_roaming); ++u8 rtw_to_roaming(struct adapter *adapter); ++ ++void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta, ++ u32 mstatus); ++ ++#endif /* __RTL871X_MLME_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_mlme_ext.h b/drivers/staging/r8188eu/include/rtw_mlme_ext.h +new file mode 100644 +index 000000000000..d2f4d3ce7b90 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_mlme_ext.h +@@ -0,0 +1,857 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_MLME_EXT_H_ ++#define __RTW_MLME_EXT_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "wlan_bssdef.h" ++ ++/* Commented by Albert 20101105 */ ++/* Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms ) */ ++/* The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request. */ ++/* So, this driver tried to extend the dwell time for each scanning channel. */ ++/* This will increase the chance to receive the probe response from SoftAP. */ ++ ++#define SURVEY_TO (100) ++#define REAUTH_TO (300) /* 50) */ ++#define REASSOC_TO (300) /* 50) */ ++/* define DISCONNECT_TO (3000) */ ++#define ADDBA_TO (2000) ++ ++#define LINKED_TO (1) /* unit:2 sec, 1x2=2 sec */ ++ ++#define REAUTH_LIMIT (4) ++#define REASSOC_LIMIT (4) ++#define READDBA_LIMIT (2) ++ ++#define ROAMING_LIMIT 8 ++ ++#define DYNAMIC_FUNC_DISABLE (0x0) ++ ++/* ====== ODM_ABILITY_E ======== */ ++/* BB ODM section BIT 0-15 */ ++#define DYNAMIC_BB_DIG BIT(0) ++#define DYNAMIC_BB_RA_MASK BIT(1) ++#define DYNAMIC_BB_DYNAMIC_TXPWR BIT(2) ++#define DYNAMIC_BB_BB_FA_CNT BIT(3) ++ ++#define DYNAMIC_BB_RSSI_MONITOR BIT(4) ++#define DYNAMIC_BB_CCK_PD BIT(5) ++#define DYNAMIC_BB_ANT_DIV BIT(6) ++#define DYNAMIC_BB_PWR_SAVE BIT(7) ++#define DYNAMIC_BB_PWR_TRA BIT(8) ++#define DYNAMIC_BB_RATE_ADAPTIVE BIT(9) ++#define DYNAMIC_BB_PATH_DIV BIT(10) ++#define DYNAMIC_BB_PSD BIT(11) ++ ++/* MAC DM section BIT 16-23 */ ++#define DYNAMIC_MAC_EDCA_TURBO BIT(16) ++#define DYNAMIC_MAC_EARLY_MODE BIT(17) ++ ++/* RF ODM section BIT 24-31 */ ++#define DYNAMIC_RF_TX_PWR_TRACK BIT(24) ++#define DYNAMIC_RF_RX_GAIN_TRACK BIT(25) ++#define DYNAMIC_RF_CALIBRATION BIT(26) ++ ++#define DYNAMIC_ALL_FUNC_ENABLE 0xFFFFFFF ++ ++#define _HW_STATE_NOLINK_ 0x00 ++#define _HW_STATE_ADHOC_ 0x01 ++#define _HW_STATE_STATION_ 0x02 ++#define _HW_STATE_AP_ 0x03 ++ ++#define _1M_RATE_ 0 ++#define _2M_RATE_ 1 ++#define _5M_RATE_ 2 ++#define _11M_RATE_ 3 ++#define _6M_RATE_ 4 ++#define _9M_RATE_ 5 ++#define _12M_RATE_ 6 ++#define _18M_RATE_ 7 ++#define _24M_RATE_ 8 ++#define _36M_RATE_ 9 ++#define _48M_RATE_ 10 ++#define _54M_RATE_ 11 ++ ++extern unsigned char RTW_WPA_OUI[]; ++extern unsigned char WMM_OUI[]; ++extern unsigned char WPS_OUI[]; ++extern unsigned char WFD_OUI[]; ++extern unsigned char P2P_OUI[]; ++ ++extern unsigned char WMM_INFO_OUI[]; ++extern unsigned char WMM_PARA_OUI[]; ++ ++/* Channel Plan Type. */ ++/* Note: */ ++/* We just add new channel plan when the new channel plan is different ++ * from any of the following channel plan. */ ++/* If you just want to customize the actions(scan period or join actions) ++ * about one of the channel plan, */ ++/* customize them in struct rt_channel_info in the RT_CHANNEL_LIST. */ ++enum RT_CHANNEL_DOMAIN { ++ /* old channel plan mapping ===== */ ++ RT_CHANNEL_DOMAIN_FCC = 0x00, ++ RT_CHANNEL_DOMAIN_IC = 0x01, ++ RT_CHANNEL_DOMAIN_ETSI = 0x02, ++ RT_CHANNEL_DOMAIN_SPAIN = 0x03, ++ RT_CHANNEL_DOMAIN_FRANCE = 0x04, ++ RT_CHANNEL_DOMAIN_MKK = 0x05, ++ RT_CHANNEL_DOMAIN_MKK1 = 0x06, ++ RT_CHANNEL_DOMAIN_ISRAEL = 0x07, ++ RT_CHANNEL_DOMAIN_TELEC = 0x08, ++ RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09, ++ RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A, ++ RT_CHANNEL_DOMAIN_TAIWAN = 0x0B, ++ RT_CHANNEL_DOMAIN_CHINA = 0x0C, ++ RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D, ++ RT_CHANNEL_DOMAIN_KOREA = 0x0E, ++ RT_CHANNEL_DOMAIN_TURKEY = 0x0F, ++ RT_CHANNEL_DOMAIN_JAPAN = 0x10, ++ RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11, ++ RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12, ++ RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS = 0x14, ++ ++ /* new channel plan mapping, (2GDOMAIN_5GDOMAIN) ===== */ ++ RT_CHANNEL_DOMAIN_WORLD_NULL = 0x20, ++ RT_CHANNEL_DOMAIN_ETSI1_NULL = 0x21, ++ RT_CHANNEL_DOMAIN_FCC1_NULL = 0x22, ++ RT_CHANNEL_DOMAIN_MKK1_NULL = 0x23, ++ RT_CHANNEL_DOMAIN_ETSI2_NULL = 0x24, ++ RT_CHANNEL_DOMAIN_FCC1_FCC1 = 0x25, ++ RT_CHANNEL_DOMAIN_WORLD_ETSI1 = 0x26, ++ RT_CHANNEL_DOMAIN_MKK1_MKK1 = 0x27, ++ RT_CHANNEL_DOMAIN_WORLD_KCC1 = 0x28, ++ RT_CHANNEL_DOMAIN_WORLD_FCC2 = 0x29, ++ RT_CHANNEL_DOMAIN_WORLD_FCC3 = 0x30, ++ RT_CHANNEL_DOMAIN_WORLD_FCC4 = 0x31, ++ RT_CHANNEL_DOMAIN_WORLD_FCC5 = 0x32, ++ RT_CHANNEL_DOMAIN_WORLD_FCC6 = 0x33, ++ RT_CHANNEL_DOMAIN_FCC1_FCC7 = 0x34, ++ RT_CHANNEL_DOMAIN_WORLD_ETSI2 = 0x35, ++ RT_CHANNEL_DOMAIN_WORLD_ETSI3 = 0x36, ++ RT_CHANNEL_DOMAIN_MKK1_MKK2 = 0x37, ++ RT_CHANNEL_DOMAIN_MKK1_MKK3 = 0x38, ++ RT_CHANNEL_DOMAIN_FCC1_NCC1 = 0x39, ++ RT_CHANNEL_DOMAIN_FCC1_NCC2 = 0x40, ++ RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G = 0x41, ++ /* Add new channel plan above this line=============== */ ++ RT_CHANNEL_DOMAIN_MAX, ++ RT_CHANNEL_DOMAIN_REALTEK_DEFINE = 0x7F, ++}; ++ ++enum RT_CHANNEL_DOMAIN_2G { ++ RT_CHANNEL_DOMAIN_2G_WORLD = 0x00, /* Worldwide 13 */ ++ RT_CHANNEL_DOMAIN_2G_ETSI1 = 0x01, /* Europe */ ++ RT_CHANNEL_DOMAIN_2G_FCC1 = 0x02, /* US */ ++ RT_CHANNEL_DOMAIN_2G_MKK1 = 0x03, /* Japan */ ++ RT_CHANNEL_DOMAIN_2G_ETSI2 = 0x04, /* France */ ++ RT_CHANNEL_DOMAIN_2G_NULL = 0x05, ++ /* Add new channel plan above this line=============== */ ++ RT_CHANNEL_DOMAIN_2G_MAX, ++}; ++ ++#define rtw_is_channel_plan_valid(chplan) \ ++ (chplan < RT_CHANNEL_DOMAIN_MAX || \ ++ chplan == RT_CHANNEL_DOMAIN_REALTEK_DEFINE) ++ ++struct rt_channel_plan { ++ unsigned char Channel[MAX_CHANNEL_NUM]; ++ unsigned char Len; ++}; ++ ++struct rt_channel_plan_2g { ++ unsigned char Channel[MAX_CHANNEL_NUM_2G]; ++ unsigned char Len; ++}; ++ ++struct rt_channel_plan_map { ++ unsigned char Index2G; ++}; ++ ++enum Associated_AP { ++ atherosAP = 0, ++ broadcomAP = 1, ++ ciscoAP = 2, ++ marvellAP = 3, ++ ralinkAP = 4, ++ realtekAP = 5, ++ airgocapAP = 6, ++ unknownAP = 7, ++ maxAP, ++}; ++ ++enum HT_IOT_PEER { ++ HT_IOT_PEER_UNKNOWN = 0, ++ HT_IOT_PEER_REALTEK = 1, ++ HT_IOT_PEER_REALTEK_92SE = 2, ++ HT_IOT_PEER_BROADCOM = 3, ++ HT_IOT_PEER_RALINK = 4, ++ HT_IOT_PEER_ATHEROS = 5, ++ HT_IOT_PEER_CISCO = 6, ++ HT_IOT_PEER_MERU = 7, ++ HT_IOT_PEER_MARVELL = 8, ++ HT_IOT_PEER_REALTEK_SOFTAP = 9,/* peer is RealTek SOFT_AP */ ++ HT_IOT_PEER_SELF_SOFTAP = 10, /* Self is SoftAP */ ++ HT_IOT_PEER_AIRGO = 11, ++ HT_IOT_PEER_INTEL = 12, ++ HT_IOT_PEER_RTK_APCLIENT = 13, ++ HT_IOT_PEER_REALTEK_81XX = 14, ++ HT_IOT_PEER_REALTEK_WOW = 15, ++ HT_IOT_PEER_TENDA = 16, ++ HT_IOT_PEER_MAX = 17 ++}; ++ ++enum SCAN_STATE { ++ SCAN_DISABLE = 0, ++ SCAN_START = 1, ++ SCAN_TXNULL = 2, ++ SCAN_PROCESS = 3, ++ SCAN_COMPLETE = 4, ++ SCAN_STATE_MAX, ++}; ++ ++struct mlme_handler { ++ unsigned int num; ++ char *str; ++ unsigned int (*func)(struct adapter *adapt, struct recv_frame *frame); ++}; ++ ++struct action_handler { ++ unsigned int num; ++ char* str; ++ unsigned int (*func)(struct adapter *adapt, struct recv_frame *frame); ++}; ++ ++struct ss_res { ++ int state; ++ int bss_cnt; ++ int channel_idx; ++ int scan_mode; ++ u8 ssid_num; ++ u8 ch_num; ++ struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT]; ++ struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; ++}; ++ ++/* define AP_MODE 0x0C */ ++/* define STATION_MODE 0x08 */ ++/* define AD_HOC_MODE 0x04 */ ++/* define NO_LINK_MODE 0x00 */ ++ ++#define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_ ++#define WIFI_FW_STATION_STATE _HW_STATE_STATION_ ++#define WIFI_FW_AP_STATE _HW_STATE_AP_ ++#define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_ ++ ++#define WIFI_FW_AUTH_NULL 0x00000100 ++#define WIFI_FW_AUTH_STATE 0x00000200 ++#define WIFI_FW_AUTH_SUCCESS 0x00000400 ++ ++#define WIFI_FW_ASSOC_STATE 0x00002000 ++#define WIFI_FW_ASSOC_SUCCESS 0x00004000 ++ ++#define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | \ ++ WIFI_FW_AUTH_STATE | \ ++ WIFI_FW_AUTH_SUCCESS | \ ++ WIFI_FW_ASSOC_STATE) ++ ++struct FW_Sta_Info { ++ struct sta_info *psta; ++ u32 status; ++ u32 rx_pkt; ++ u32 retry; ++ unsigned char SupportedRates[NDIS_802_11_LENGTH_RATES_EX]; ++}; ++ ++/* ++ * Usage: ++ * When one iface acted as AP mode and the other iface is STA mode and scanning, ++ * it should switch back to AP's operating channel periodically. ++ * Parameters info: ++ * When the driver scanned RTW_SCAN_NUM_OF_CH channels, it would switch back to ++ * AP's operating channel for ++ * RTW_STAY_AP_CH_MILLISECOND * SURVEY_TO milliseconds. ++ * Example: ++ * For chip supports 2.4G + 5GHz and AP mode is operating in channel 1, ++ * RTW_SCAN_NUM_OF_CH is 8, RTW_STAY_AP_CH_MS is 3 and SURVEY_TO is 100. ++ * When it's STA mode gets set_scan command, ++ * it would ++ * 1. Doing the scan on channel 1.2.3.4.5.6.7.8 ++ * 2. Back to channel 1 for 300 milliseconds ++ * 3. Go through doing site survey on channel 9.10.11.36.40.44.48.52 ++ * 4. Back to channel 1 for 300 milliseconds ++ * 5. ... and so on, till survey done. ++ */ ++ ++struct mlme_ext_info { ++ u32 state; ++ u32 reauth_count; ++ u32 reassoc_count; ++ u32 link_count; ++ u32 auth_seq; ++ u32 auth_algo; /* 802.11 auth, could be open, shared, auto */ ++ u32 authModeToggle; ++ u32 enc_algo;/* encrypt algorithm; */ ++ u32 key_index; /* this is only valid for legacy wep, ++ * 0~3 for key id. */ ++ u32 iv; ++ u8 chg_txt[128]; ++ u16 aid; ++ u16 bcn_interval; ++ u16 capability; ++ u8 assoc_AP_vendor; ++ u8 slotTime; ++ u8 preamble_mode; ++ u8 WMM_enable; ++ u8 ERP_enable; ++ u8 ERP_IE; ++ u8 HT_enable; ++ u8 HT_caps_enable; ++ u8 HT_info_enable; ++ u8 HT_protection; ++ u8 turboMode_cts2self; ++ u8 turboMode_rtsen; ++ u8 SM_PS; ++ u8 agg_enable_bitmap; ++ u8 ADDBA_retry_count; ++ u8 candidate_tid_bitmap; ++ u8 dialogToken; ++ /* Accept ADDBA Request */ ++ bool bAcceptAddbaReq; ++ u8 bwmode_updated; ++ u8 hidden_ssid_mode; ++ ++ struct ADDBA_request ADDBA_req; ++ struct WMM_para_element WMM_param; ++ struct HT_caps_element HT_caps; ++ struct HT_info_element HT_info; ++ struct wlan_bssid_ex network;/* join network or bss_network, ++ * if in ap mode, it is the same ++ * as cur_network.network */ ++ struct FW_Sta_Info FW_sta_info[NUM_STA]; ++}; ++ ++/* The channel information about this channel including joining, ++ * scanning, and power constraints. */ ++struct rt_channel_info { ++ u8 ChannelNum; /* The channel number. */ ++ enum rt_scan_type ScanType; /* Scan type such as passive ++ * or active scan. */ ++ u32 rx_count; ++}; ++ ++int rtw_ch_set_search_ch(struct rt_channel_info *ch_set, const u32 ch); ++ ++/* P2P_MAX_REG_CLASSES - Maximum number of regulatory classes */ ++#define P2P_MAX_REG_CLASSES 10 ++ ++/* P2P_MAX_REG_CLASS_CHANNELS - Maximum number of chan per regulatory class */ ++#define P2P_MAX_REG_CLASS_CHANNELS 20 ++ ++/* struct p2p_channels - List of supported channels */ ++struct p2p_channels { ++ /* struct p2p_reg_class - Supported regulatory class */ ++ struct p2p_reg_class { ++ /* reg_class - Regulatory class (IEEE 802.11-2007, Annex J) */ ++ u8 reg_class; ++ ++ /* channel - Supported channels */ ++ u8 channel[P2P_MAX_REG_CLASS_CHANNELS]; ++ ++ /* channels - Number of channel entries in use */ ++ size_t channels; ++ } reg_class[P2P_MAX_REG_CLASSES]; ++ ++ /* reg_classes - Number of reg_class entries in use */ ++ size_t reg_classes; ++}; ++ ++struct p2p_oper_class_map { ++ enum hw_mode {IEEE80211G} mode; ++ u8 op_class; ++ u8 min_chan; ++ u8 max_chan; ++ u8 inc; ++ enum {BW20, BW40PLUS, BW40MINUS} bw; ++}; ++ ++struct mlme_ext_priv { ++ struct adapter *padapter; ++ u8 mlmeext_init; ++ atomic_t event_seq; ++ u16 mgnt_seq; ++ ++ unsigned char cur_channel; ++ unsigned char cur_bwmode; ++ unsigned char cur_ch_offset;/* PRIME_CHNL_OFFSET */ ++ unsigned char cur_wireless_mode; /* NETWORK_TYPE */ ++ ++ unsigned char oper_channel; /* saved chan info when call ++ * set_channel_bw */ ++ unsigned char oper_bwmode; ++ unsigned char oper_ch_offset;/* PRIME_CHNL_OFFSET */ ++ ++ unsigned char max_chan_nums; ++ struct rt_channel_info channel_set[MAX_CHANNEL_NUM]; ++ struct p2p_channels channel_list; ++ unsigned char basicrate[NumRates]; ++ unsigned char datarate[NumRates]; ++ ++ struct ss_res sitesurvey_res; ++ struct mlme_ext_info mlmext_info;/* for sta/adhoc mode, including ++ * current scan/connecting/connected ++ * related info. For ap mode, ++ * network includes ap's cap_info*/ ++ struct timer_list survey_timer; ++ struct timer_list link_timer; ++ u16 chan_scan_time; ++ ++ u8 scan_abort; ++ u8 tx_rate; /* TXRATE when USERATE is set. */ ++ ++ u32 retry; /* retry for issue probereq */ ++ ++ u64 TSFValue; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ unsigned char bstart_bss; ++#endif ++ u8 update_channel_plan_by_ap_done; ++ /* recv_decache check for Action_public frame */ ++ u8 action_public_dialog_token; ++ u16 action_public_rxseq; ++ u8 active_keep_alive_check; ++}; ++ ++int init_mlme_ext_priv(struct adapter *adapter); ++int init_hw_mlme_ext(struct adapter *padapter); ++void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); ++extern void init_mlme_ext_timer(struct adapter *padapter); ++extern void init_addba_retry_timer(struct adapter *adapt, struct sta_info *sta); ++extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); ++ ++unsigned char networktype_to_raid(unsigned char network_type); ++u8 judge_network_type(struct adapter *padapter, unsigned char *rate, int len); ++void get_rate_set(struct adapter *padapter, unsigned char *pbssrate, int *len); ++void UpdateBrateTbl(struct adapter *padapter, u8 *mBratesOS); ++void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen); ++ ++void Save_DM_Func_Flag(struct adapter *padapter); ++void Restore_DM_Func_Flag(struct adapter *padapter); ++void Switch_DM_Func(struct adapter *padapter, u32 mode, u8 enable); ++ ++void Set_MSR(struct adapter *padapter, u8 type); ++ ++u8 rtw_get_oper_ch(struct adapter *adapter); ++void rtw_set_oper_ch(struct adapter *adapter, u8 ch); ++u8 rtw_get_oper_bw(struct adapter *adapter); ++void rtw_set_oper_bw(struct adapter *adapter, u8 bw); ++u8 rtw_get_oper_choffset(struct adapter *adapter); ++void rtw_set_oper_choffset(struct adapter *adapter, u8 offset); ++ ++void set_channel_bwmode(struct adapter *padapter, unsigned char channel, ++ unsigned char channel_offset, unsigned short bwmode); ++void SelectChannel(struct adapter *padapter, unsigned char channel); ++void SetBWMode(struct adapter *padapter, unsigned short bwmode, ++ unsigned char channel_offset); ++ ++unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); ++ ++void write_cam(struct adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); ++void clear_cam_entry(struct adapter *padapter, u8 entry); ++ ++void invalidate_cam_all(struct adapter *padapter); ++void CAM_empty_entry(struct adapter * Adapter, u8 ucIndex); ++ ++int allocate_fw_sta_entry(struct adapter *padapter); ++void flush_all_cam_entry(struct adapter *padapter); ++ ++void site_survey(struct adapter *padapter); ++u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, ++ struct wlan_bssid_ex *bssid); ++void update_network(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src, ++ struct adapter *adapter, bool update_ie); ++ ++int get_bsstype(unsigned short capability); ++u8 *get_my_bssid(struct wlan_bssid_ex *pnetwork); ++u16 get_beacon_interval(struct wlan_bssid_ex *bss); ++ ++int is_client_associated_to_ap(struct adapter *padapter); ++int is_client_associated_to_ibss(struct adapter *padapter); ++int is_IBSS_empty(struct adapter *padapter); ++ ++unsigned char check_assoc_AP(u8 *pframe, uint len); ++ ++int WMM_param_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE); ++void WMMOnAssocRsp(struct adapter *padapter); ++ ++void HT_caps_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE); ++void HT_info_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE); ++void HTOnAssocRsp(struct adapter *padapter); ++ ++void ERP_IE_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE); ++void VCS_update(struct adapter *padapter, struct sta_info *psta); ++ ++void update_beacon_info(struct adapter *padapter, u8 *pframe, uint len, ++ struct sta_info *psta); ++int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len); ++void update_IOT_info(struct adapter *padapter); ++void update_capinfo(struct adapter *adapter, u16 updatecap); ++void update_wireless_mode(struct adapter *padapter); ++void update_tx_basic_rate(struct adapter *padapter, u8 modulation); ++void update_bmc_sta_support_rate(struct adapter *padapter, u32 mac_id); ++int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, ++ uint var_ie_len, int cam_idx); ++ ++/* for sta/adhoc mode */ ++void update_sta_info(struct adapter *padapter, struct sta_info *psta); ++unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); ++unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz); ++unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps); ++void Update_RA_Entry(struct adapter *padapter, u32 mac_id); ++void set_sta_rate(struct adapter *padapter, struct sta_info *psta); ++ ++unsigned int receive_disconnect(struct adapter *padapter, ++ unsigned char *macaddr, unsigned short reason); ++ ++unsigned char get_highest_rate_idx(u32 mask); ++int support_short_GI(struct adapter *padapter, struct HT_caps_element *caps); ++unsigned int is_ap_in_tkip(struct adapter *padapter); ++unsigned int is_ap_in_wep(struct adapter *padapter); ++unsigned int should_forbid_n_rate(struct adapter *padapter); ++ ++void report_join_res(struct adapter *padapter, int res); ++void report_survey_event(struct adapter *padapter, struct recv_frame *precv_frame); ++void report_surveydone_event(struct adapter *padapter); ++void report_del_sta_event(struct adapter *padapter, ++ unsigned char *addr, unsigned short reason); ++void report_add_sta_event(struct adapter *padapter, unsigned char* addr, ++ int cam_idx); ++ ++void beacon_timing_control(struct adapter *padapter); ++extern u8 set_tx_beacon_cmd(struct adapter*padapter); ++unsigned int setup_beacon_frame(struct adapter *padapter, ++ unsigned char *beacon_frame); ++void update_mgnt_tx_rate(struct adapter *padapter, u8 rate); ++void update_mgntframe_attrib(struct adapter *padapter, ++ struct pkt_attrib *pattrib); ++void dump_mgntframe(struct adapter *padapter, struct xmit_frame *pmgntframe); ++s32 dump_mgntframe_and_wait(struct adapter *padapter, ++ struct xmit_frame *pmgntframe, int timeout_ms); ++s32 dump_mgntframe_and_wait_ack(struct adapter *padapter, ++ struct xmit_frame *pmgntframe); ++ ++#ifdef CONFIG_88EU_P2P ++void issue_probersp_p2p(struct adapter *padapter, unsigned char *da); ++void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, ++ u8 ussidlen, u8 *pdev_raddr); ++void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr); ++void issue_probereq_p2p(struct adapter *padapter, u8 *da); ++int issue_probereq_p2p_ex(struct adapter *adapter, u8 *da, int try_cnt, ++ int wait_ms); ++void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, ++ u8 dialogToken, u8 success); ++void issue_p2p_invitation_request(struct adapter *padapter, u8* raddr); ++#endif /* CONFIG_88EU_P2P */ ++void issue_beacon(struct adapter *padapter, int timeout_ms); ++void issue_probersp(struct adapter *padapter, unsigned char *da, ++ u8 is_valid_p2p_probereq); ++void issue_assocreq(struct adapter *padapter); ++void issue_asocrsp(struct adapter *padapter, unsigned short status, ++ struct sta_info *pstat, int pkt_type); ++void issue_auth(struct adapter *padapter, struct sta_info *psta, ++ unsigned short status); ++void issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *pssid, ++ u8 *da); ++s32 issue_probereq_ex(struct adapter *adapter, struct ndis_802_11_ssid *pssid, ++ u8* da, int try_cnt, int wait_ms); ++int issue_nulldata(struct adapter *padapter, unsigned char *da, ++ unsigned int power_mode, int try_cnt, int wait_ms); ++int issue_qos_nulldata(struct adapter *padapter, unsigned char *da, ++ u16 tid, int try_cnt, int wait_ms); ++int issue_deauth(struct adapter *padapter, unsigned char *da, ++ unsigned short reason); ++int issue_deauth_ex(struct adapter *padapter, u8 *da, unsigned short reason, ++ int try_cnt, int wait_ms); ++void issue_action_spct_ch_switch(struct adapter *padapter, u8 *ra, u8 new_ch, ++ u8 ch_offset); ++void issue_action_BA(struct adapter *padapter, unsigned char *raddr, ++ unsigned char action, unsigned short status); ++unsigned int send_delba(struct adapter *padapter, u8 initiator, u8 *addr); ++unsigned int send_beacon(struct adapter *padapter); ++ ++void start_clnt_assoc(struct adapter *padapter); ++void start_clnt_auth(struct adapter *padapter); ++void start_clnt_join(struct adapter *padapter); ++void start_create_ibss(struct adapter *padapter); ++ ++unsigned int OnAssocReq(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAssocRsp(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnProbeReq(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnProbeRsp(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int DoReserved(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnBeacon(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAtim(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnDisassoc(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAuth(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAuthClient(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnDeAuth(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++ ++unsigned int on_action_spct(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_qos(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_dls(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_back(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int on_action_public(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_ht(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_wmm(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++unsigned int OnAction_p2p(struct adapter *padapter, ++ struct recv_frame *precv_frame); ++ ++void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res); ++void mlmeext_sta_del_event_callback(struct adapter *padapter); ++void mlmeext_sta_add_event_callback(struct adapter *padapter, ++ struct sta_info *psta); ++ ++void linked_status_chk(struct adapter *padapter); ++ ++void survey_timer_hdl (struct adapter *padapter); ++void link_timer_hdl (struct adapter *padapter); ++void addba_timer_hdl(struct sta_info *psta); ++ ++#define set_survey_timer(mlmeext, ms) \ ++ do { \ ++ _set_timer(&(mlmeext)->survey_timer, (ms)); \ ++ } while (0) ++ ++#define set_link_timer(mlmeext, ms) \ ++ do { \ ++ _set_timer(&(mlmeext)->link_timer, (ms)); \ ++ } while (0) ++ ++int cckrates_included(unsigned char *rate, int ratelen); ++int cckratesonly_included(unsigned char *rate, int ratelen); ++ ++void process_addba_req(struct adapter *padapter, u8 *paddba_req, u8 *addr); ++ ++void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); ++void correct_TSF(struct adapter *padapter, struct mlme_ext_priv *pmlmeext); ++ ++struct cmd_hdl { ++ uint parmsize; ++ u8 (*h2cfuns)(struct adapter *padapter, u8 *pbuf); ++}; ++ ++u8 read_macreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 write_macreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 read_bbreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 write_bbreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 read_rfreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 write_rfreg_hdl(struct adapter *padapter, u8 *pbuf); ++u8 NULL_hdl(struct adapter *padapter, u8 *pbuf); ++u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf); ++u8 disconnect_hdl(struct adapter *padapter, u8 *pbuf); ++u8 createbss_hdl(struct adapter *padapter, u8 *pbuf); ++u8 setopmode_hdl(struct adapter *padapter, u8 *pbuf); ++u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf); ++u8 setauth_hdl(struct adapter *padapter, u8 *pbuf); ++u8 setkey_hdl(struct adapter *padapter, u8 *pbuf); ++u8 set_stakey_hdl(struct adapter *padapter, u8 *pbuf); ++u8 set_assocsta_hdl(struct adapter *padapter, u8 *pbuf); ++u8 del_assocsta_hdl(struct adapter *padapter, u8 *pbuf); ++u8 add_ba_hdl(struct adapter *padapter, unsigned char *pbuf); ++ ++u8 mlme_evt_hdl(struct adapter *padapter, unsigned char *pbuf); ++u8 h2c_msg_hdl(struct adapter *padapter, unsigned char *pbuf); ++u8 tx_beacon_hdl(struct adapter *padapter, unsigned char *pbuf); ++u8 set_ch_hdl(struct adapter *padapter, u8 *pbuf); ++u8 set_chplan_hdl(struct adapter *padapter, unsigned char *pbuf); ++u8 led_blink_hdl(struct adapter *padapter, unsigned char *pbuf); ++/* Handling DFS channel switch announcement ie. */ ++u8 set_csa_hdl(struct adapter *padapter, unsigned char *pbuf); ++u8 tdls_hdl(struct adapter *padapter, unsigned char *pbuf); ++ ++#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl}, ++#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd}, ++ ++#ifdef _RTW_CMD_C_ ++ ++static struct cmd_hdl wlancmds[] = { ++ GEN_DRV_CMD_HANDLER(0, NULL) /*0*/ ++ GEN_DRV_CMD_HANDLER(0, NULL) ++ GEN_DRV_CMD_HANDLER(0, NULL) ++ GEN_DRV_CMD_HANDLER(0, NULL) ++ GEN_DRV_CMD_HANDLER(0, NULL) ++ GEN_DRV_CMD_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) /*10*/ ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/ ++ GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), ++ sitesurvey_cmd_hdl) /*18*/ ++ GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/ ++ GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/ ++ GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL) ++ GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) /*40*/ ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl) ++ GEN_MLME_EXT_HANDLER(sizeof(struct set_ch_parm), set_ch_hdl) /* 46 */ ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) /*50*/ ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(0, NULL) ++ GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), ++ tx_beacon_hdl) /*55*/ ++ ++ GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/ ++ GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/ ++ ++ GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/ ++ GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), ++ set_chplan_hdl) /*59*/ ++ GEN_MLME_EXT_HANDLER(sizeof(struct LedBlink_param), ++ led_blink_hdl) /*60*/ ++ ++ GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), ++ set_csa_hdl) /*61*/ ++ GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), ++ tdls_hdl) /*62*/ ++}; ++ ++#endif ++ ++struct C2HEvent_Header { ++#ifdef __LITTLE_ENDIAN ++ unsigned int len:16; ++ unsigned int ID:8; ++ unsigned int seq:8; ++#elif defined(__BIG_ENDIAN) ++ unsigned int seq:8; ++ unsigned int ID:8; ++ unsigned int len:16; ++#endif ++ unsigned int rsvd; ++}; ++ ++void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf); ++void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf); ++ ++enum rtw_c2h_event { ++ GEN_EVT_CODE(_Read_MACREG) = 0, /*0*/ ++ GEN_EVT_CODE(_Read_BBREG), ++ GEN_EVT_CODE(_Read_RFREG), ++ GEN_EVT_CODE(_Read_EEPROM), ++ GEN_EVT_CODE(_Read_EFUSE), ++ GEN_EVT_CODE(_Read_CAM), /*5*/ ++ GEN_EVT_CODE(_Get_BasicRate), ++ GEN_EVT_CODE(_Get_DataRate), ++ GEN_EVT_CODE(_Survey), /*8*/ ++ GEN_EVT_CODE(_SurveyDone), /*9*/ ++ ++ GEN_EVT_CODE(_JoinBss) , /*10*/ ++ GEN_EVT_CODE(_AddSTA), ++ GEN_EVT_CODE(_DelSTA), ++ GEN_EVT_CODE(_AtimDone), ++ GEN_EVT_CODE(_TX_Report), ++ GEN_EVT_CODE(_CCX_Report), /*15*/ ++ GEN_EVT_CODE(_DTM_Report), ++ GEN_EVT_CODE(_TX_Rate_Statistics), ++ GEN_EVT_CODE(_C2HLBK), ++ GEN_EVT_CODE(_FWDBG), ++ GEN_EVT_CODE(_C2HFEEDBACK), /*20*/ ++ GEN_EVT_CODE(_ADDBA), ++ GEN_EVT_CODE(_C2HBCN), ++ GEN_EVT_CODE(_ReportPwrState), /* filen: only for PCIE, USB */ ++ GEN_EVT_CODE(_CloseRF), /* filen: only for PCIE, ++ * work around ASPM */ ++ MAX_C2HEVT ++}; ++ ++#ifdef _RTW_MLME_EXT_C_ ++ ++static struct fwevent wlanevents[] = { ++ {0, rtw_dummy_event_callback}, /*0*/ ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, &rtw_survey_event_callback}, /*8*/ ++ {sizeof (struct surveydone_event), &rtw_surveydone_event_callback},/*9*/ ++ {0, &rtw_joinbss_event_callback}, /*10*/ ++ {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, ++ {sizeof(struct stadel_event), &rtw_stadel_event_callback}, ++ {0, NULL}, ++ {0, rtw_dummy_event_callback}, ++ {0, NULL}, /*15*/ ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, rtw_fwdbg_event_callback}, ++ {0, NULL}, /*20*/ ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++ {0, NULL}, ++}; ++ ++#endif/* _RTL_MLME_EXT_C_ */ ++ ++#endif /* __RTW_MLME_EXT_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_mp.h b/drivers/staging/r8188eu/include/rtw_mp.h +new file mode 100644 +index 000000000000..3a259d991348 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_mp.h +@@ -0,0 +1,474 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_MP_H_ ++#define _RTW_MP_H_ ++ ++/* 00 - Success */ ++/* 11 - Error */ ++#define STATUS_SUCCESS (0x00000000L) ++#define STATUS_PENDING (0x00000103L) ++ ++#define STATUS_UNSUCCESSFUL (0xC0000001L) ++#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) ++#define STATUS_NOT_SUPPORTED (0xC00000BBL) ++ ++#define NDIS_STATUS_SUCCESS ((int)STATUS_SUCCESS) ++#define NDIS_STATUS_PENDING ((int)STATUS_PENDING) ++#define NDIS_STATUS_NOT_RECOGNIZED ((int)0x00010001L) ++#define NDIS_STATUS_NOT_COPIED ((int)0x00010002L) ++#define NDIS_STATUS_NOT_ACCEPTED ((int)0x00010003L) ++#define NDIS_STATUS_CALL_ACTIVE ((int)0x00010007L) ++ ++#define NDIS_STATUS_FAILURE ((int)STATUS_UNSUCCESSFUL) ++#define NDIS_STATUS_RESOURCES ((int)STATUS_INSUFFICIENT_RESOURCES) ++#define NDIS_STATUS_CLOSING ((int)0xC0010002L) ++#define NDIS_STATUS_BAD_VERSION ((int)0xC0010004L) ++#define NDIS_STATUS_BAD_CHARACTERISTICS ((int)0xC0010005L) ++#define NDIS_STATUS_ADAPTER_NOT_FOUND ((int)0xC0010006L) ++#define NDIS_STATUS_OPEN_FAILED ((int)0xC0010007L) ++#define NDIS_STATUS_DEVICE_FAILED ((int)0xC0010008L) ++#define NDIS_STATUS_MULTICAST_FULL ((int)0xC0010009L) ++#define NDIS_STATUS_MULTICAST_EXISTS ((int)0xC001000AL) ++#define NDIS_STATUS_MULTICAST_NOT_FOUND ((int)0xC001000BL) ++#define NDIS_STATUS_REQUEST_ABORTED ((int)0xC001000CL) ++#define NDIS_STATUS_RESET_IN_PROGRESS ((int)0xC001000DL) ++#define NDIS_STATUS_CLOSING_INDICATING ((int)0xC001000EL) ++#define NDIS_STATUS_NOT_SUPPORTED ((int)STATUS_NOT_SUPPORTED) ++#define NDIS_STATUS_INVALID_PACKET ((int)0xC001000FL) ++#define NDIS_STATUS_OPEN_LIST_FULL ((int)0xC0010010L) ++#define NDIS_STATUS_ADAPTER_NOT_READY ((int)0xC0010011L) ++#define NDIS_STATUS_ADAPTER_NOT_OPEN ((int)0xC0010012L) ++#define NDIS_STATUS_NOT_INDICATING ((int)0xC0010013L) ++#define NDIS_STATUS_INVALID_LENGTH ((int)0xC0010014L) ++#define NDIS_STATUS_INVALID_DATA ((int)0xC0010015L) ++#define NDIS_STATUS_BUFFER_TOO_SHORT ((int)0xC0010016L) ++#define NDIS_STATUS_INVALID_OID ((int)0xC0010017L) ++#define NDIS_STATUS_ADAPTER_REMOVED ((int)0xC0010018L) ++#define NDIS_STATUS_UNSUPPORTED_MEDIA ((int)0xC0010019L) ++#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((int)0xC001001AL) ++#define NDIS_STATUS_FILE_NOT_FOUND ((int)0xC001001BL) ++#define NDIS_STATUS_ERROR_READING_FILE ((int)0xC001001CL) ++#define NDIS_STATUS_ALREADY_MAPPED ((int)0xC001001DL) ++#define NDIS_STATUS_RESOURCE_CONFLICT ((int)0xC001001EL) ++#define NDIS_STATUS_NO_CABLE ((int)0xC001001FL) ++ ++#define NDIS_STATUS_INVALID_SAP ((int)0xC0010020L) ++#define NDIS_STATUS_SAP_IN_USE ((int)0xC0010021L) ++#define NDIS_STATUS_INVALID_ADDRESS ((int)0xC0010022L) ++#define NDIS_STATUS_VC_NOT_ACTIVATED ((int)0xC0010023L) ++#define NDIS_STATUS_DEST_OUT_OF_ORDER ((int)0xC0010024L) /*cause 27*/ ++#define NDIS_STATUS_VC_NOT_AVAILABLE ((int)0xC0010025L) /*cause 35,45 */ ++#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((int)0xC0010026L) /*cause 37*/ ++#define NDIS_STATUS_INCOMPATABLE_QOS ((int)0xC0010027L) /*cause 49*/ ++#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((int)0xC0010028L) /*cause 93*/ ++#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((int)0xC0010029L) /*cause 3 */ ++ ++enum antenna_path { ++ ANTENNA_NONE = 0x00, ++ ANTENNA_D, ++ ANTENNA_C, ++ ANTENNA_CD, ++ ANTENNA_B, ++ ANTENNA_BD, ++ ANTENNA_BC, ++ ANTENNA_BCD, ++ ANTENNA_A, ++ ANTENNA_AD, ++ ANTENNA_AC, ++ ANTENNA_ACD, ++ ANTENNA_AB, ++ ANTENNA_ABD, ++ ANTENNA_ABC, ++ ANTENNA_ABCD ++}; ++ ++#define MAX_MP_XMITBUF_SZ 2048 ++#define NR_MP_XMITFRAME 8 ++ ++struct mp_xmit_frame { ++ struct list_head list; ++ struct pkt_attrib attrib; ++ struct sk_buff *pkt; ++ int frame_tag; ++ struct adapter *padapter; ++ struct urb *pxmit_urb[8]; ++ /* insert urb, irp, and irpcnt info below... */ ++ u8 *mem_addr; ++ u32 sz[8]; ++ u8 bpending[8]; ++ int ac_tag[8]; ++ int last[8]; ++ uint irpcnt; ++ uint fragcnt; ++ uint mem[(MAX_MP_XMITBUF_SZ >> 2)]; ++}; ++ ++struct mp_wiparam { ++ u32 bcompleted; ++ u32 act_type; ++ u32 io_offset; ++ u32 io_value; ++}; ++ ++typedef void(*wi_act_func)(void *padapter); ++ ++struct mp_tx { ++ u8 stop; ++ u32 count, sended; ++ u8 payload; ++ struct pkt_attrib attrib; ++ struct tx_desc desc; ++ u8 *pallocated_buf; ++ u8 *buf; ++ u32 buf_size, write_size; ++ void *PktTxThread; ++}; ++ ++#include "Hal8188EPhyCfg.h" ++ ++#define MP_MAX_LINES 1000 ++#define MP_MAX_LINES_BYTES 256 ++ ++typedef void (*MPT_WORK_ITEM_HANDLER)(void *Adapter); ++ ++struct mpt_context { ++ /* Indicate if we have started Mass Production Test. */ ++ bool bMassProdTest; ++ ++ /* Indicate if the driver is unloading or unloaded. */ ++ bool bMptDrvUnload; ++ ++ struct semaphore MPh2c_Sema; ++ struct timer_list MPh2c_timeout_timer; ++/* Event used to sync H2c for BT control */ ++ ++ bool MptH2cRspEvent; ++ bool MptBtC2hEvent; ++ bool bMPh2c_timeout; ++ ++ /* 8190 PCI does not support NDIS_WORK_ITEM. */ ++ /* Work Item for Mass Production Test. */ ++ /* Event used to sync the case unloading driver and MptWorkItem ++ * is still in progress. */ ++ /* Indicate a MptWorkItem is scheduled and not yet finished. */ ++ bool bMptWorkItemInProgress; ++ /* An instance which implements function and context of MptWorkItem. */ ++ MPT_WORK_ITEM_HANDLER CurrMptAct; ++ ++ /* 1=Start, 0=Stop from UI. */ ++ u32 MptTestStart; ++ /* _TEST_MODE, defined in MPT_Req2.h */ ++ u32 MptTestItem; ++ /* Variable needed in each implementation of CurrMptAct. */ ++ u32 MptActType; /* Type of action performed in CurrMptAct. */ ++ /* The Offset of IO operation is depend of MptActType. */ ++ u32 MptIoOffset; ++ /* The Value of IO operation is depend of MptActType. */ ++ u32 MptIoValue; ++ /* The RfPath of IO operation is depend of MptActType. */ ++ u32 MptRfPath; ++ ++ enum wireless_mode MptWirelessModeToSw; /* Wireless mode to switch. */ ++ u8 MptChannelToSw; /* Channel to switch. */ ++ u8 MptInitGainToSet; /* Initial gain to set. */ ++ u32 MptBandWidth; /* bandwidth to switch. */ ++ u32 MptRateIndex; /* rate index. */ ++ /* Register value kept for Single Carrier Tx test. */ ++ u8 btMpCckTxPower; ++ /* Register value kept for Single Carrier Tx test. */ ++ u8 btMpOfdmTxPower; ++ /* For MP Tx Power index */ ++ u8 TxPwrLevel[2]; /* rf-A, rf-B */ ++ ++ /* Content of RCR Regsiter for Mass Production Test. */ ++ u32 MptRCR; ++ /* true if we only receive packets with specific pattern. */ ++ bool bMptFilterPattern; ++ /* Rx OK count, statistics used in Mass Production Test. */ ++ u32 MptRxOkCnt; ++ /* Rx CRC32 error count, statistics used in Mass Production Test. */ ++ u32 MptRxCrcErrCnt; ++ ++ bool bCckContTx; /* true if we are in CCK Continuous Tx test. */ ++ bool bOfdmContTx; /* true if we are in OFDM Continuous Tx test. */ ++ bool bStartContTx; /* true if we have start Continuous Tx test. */ ++ /* true if we are in Single Carrier Tx test. */ ++ bool bSingleCarrier; ++ /* true if we are in Carrier Suppression Tx Test. */ ++ bool bCarrierSuppression; ++ /* true if we are in Single Tone Tx test. */ ++ bool bSingleTone; ++ ++ /* ACK counter asked by K.Y.. */ ++ bool bMptEnableAckCounter; ++ u32 MptAckCounter; ++ ++ u8 APK_bound[2]; /* for APK path A/path B */ ++ bool bMptIndexEven; ++ ++ u8 backup0xc50; ++ u8 backup0xc58; ++ u8 backup0xc30; ++ u8 backup0x52_RF_A; ++ u8 backup0x52_RF_B; ++ ++ u8 h2cReqNum; ++ u8 c2hBuf[20]; ++ ++ u8 btInBuf[100]; ++ u32 mptOutLen; ++ u8 mptOutBuf[100]; ++}; ++ ++enum { ++ WRITE_REG = 1, ++ READ_REG, ++ WRITE_RF, ++ READ_RF, ++ MP_START, ++ MP_STOP, ++ MP_RATE, ++ MP_CHANNEL, ++ MP_BANDWIDTH, ++ MP_TXPOWER, ++ MP_ANT_TX, ++ MP_ANT_RX, ++ MP_CTX, ++ MP_QUERY, ++ MP_ARX, ++ MP_PSD, ++ MP_PWRTRK, ++ MP_THER, ++ MP_IOCTL, ++ EFUSE_GET, ++ EFUSE_SET, ++ MP_RESET_STATS, ++ MP_DUMP, ++ MP_PHYPARA, ++ MP_SetRFPathSwh, ++ MP_QueryDrvStats, ++ MP_SetBT, ++ CTA_TEST, ++ MP_NULL, ++}; ++ ++struct mp_priv { ++ struct adapter *papdater; ++ ++ /* Testing Flag */ ++ /* 0 for normal type packet, 1 for loopback packet (16bytes TXCMD) */ ++ u32 mode; ++ ++ u32 prev_fw_state; ++ ++ /* OID cmd handler */ ++ struct mp_wiparam workparam; ++ ++ /* Tx Section */ ++ u8 TID; ++ u32 tx_pktcount; ++ struct mp_tx tx; ++ ++ /* Rx Section */ ++ u32 rx_pktcount; ++ u32 rx_crcerrpktcount; ++ u32 rx_pktloss; ++ ++ struct recv_stat rxstat; ++ ++ /* RF/BB relative */ ++ u8 channel; ++ u8 bandwidth; ++ u8 prime_channel_offset; ++ u8 txpoweridx; ++ u8 txpoweridx_b; ++ u8 rateidx; ++ u32 preamble; ++ u32 CrystalCap; ++ ++ u16 antenna_tx; ++ u16 antenna_rx; ++ ++ u8 check_mp_pkt; ++ ++ u8 bSetTxPower; ++ ++ struct wlan_network mp_network; ++ unsigned char network_macaddr[ETH_ALEN]; ++ ++ u8 *pallocated_mp_xmitframe_buf; ++ u8 *pmp_xmtframe_buf; ++ struct __queue free_mp_xmitqueue; ++ u32 free_mp_xmitframe_cnt; ++ ++ struct mpt_context MptCtx; ++}; ++ ++struct iocmd_struct { ++ u8 cmdclass; ++ u16 value; ++ u8 index; ++}; ++ ++struct rf_reg_param { ++ u32 path; ++ u32 offset; ++ u32 value; ++}; ++ ++struct bb_reg_param { ++ u32 offset; ++ u32 value; ++}; ++/* */ ++ ++#define LOWER true ++#define RAISE false ++ ++/* Hardware Registers */ ++#define BB_REG_BASE_ADDR 0x800 ++ ++/* MP variables */ ++enum mp_mode_{ ++ MP_OFF, ++ MP_ON, ++ MP_ERR, ++ MP_CONTINUOUS_TX, ++ MP_SINGLE_CARRIER_TX, ++ MP_CARRIER_SUPPRISSION_TX, ++ MP_SINGLE_TONE_TX, ++ MP_PACKET_TX, ++ MP_PACKET_RX ++}; ++ ++extern u8 mpdatarate[NumRates]; ++ ++/* MP set force data rate base on the definition. */ ++enum mpt_rate_index { ++ /* CCK rate. */ ++ MPT_RATE_1M, /* 0 */ ++ MPT_RATE_2M, ++ MPT_RATE_55M, ++ MPT_RATE_11M, /* 3 */ ++ ++ /* OFDM rate. */ ++ MPT_RATE_6M, /* 4 */ ++ MPT_RATE_9M, ++ MPT_RATE_12M, ++ MPT_RATE_18M, ++ MPT_RATE_24M, ++ MPT_RATE_36M, ++ MPT_RATE_48M, ++ MPT_RATE_54M, /* 11 */ ++ ++ /* HT rate. */ ++ MPT_RATE_MCS0, /* 12 */ ++ MPT_RATE_MCS1, ++ MPT_RATE_MCS2, ++ MPT_RATE_MCS3, ++ MPT_RATE_MCS4, ++ MPT_RATE_MCS5, ++ MPT_RATE_MCS6, ++ MPT_RATE_MCS7, /* 19 */ ++ MPT_RATE_MCS8, ++ MPT_RATE_MCS9, ++ MPT_RATE_MCS10, ++ MPT_RATE_MCS11, ++ MPT_RATE_MCS12, ++ MPT_RATE_MCS13, ++ MPT_RATE_MCS14, ++ MPT_RATE_MCS15, /* 27 */ ++ MPT_RATE_LAST ++}; ++ ++#define MAX_TX_PWR_INDEX_N_MODE 64 /* 0x3F */ ++ ++enum power_mode { ++ POWER_LOW = 0, ++ POWER_NORMAL ++}; ++ ++#define RX_PKT_BROADCAST 1 ++#define RX_PKT_DEST_ADDR 2 ++#define RX_PKT_PHY_MATCH 3 ++ ++enum encry_ctrl_state { ++ HW_CONTROL, /* hw encryption& decryption */ ++ SW_CONTROL, /* sw encryption& decryption */ ++ HW_ENCRY_SW_DECRY, /* hw encryption & sw decryption */ ++ SW_ENCRY_HW_DECRY /* sw encryption & hw decryption */ ++}; ++ ++s32 init_mp_priv(struct adapter *padapter); ++void free_mp_priv(struct mp_priv *pmp_priv); ++s32 MPT_InitializeAdapter(struct adapter *padapter, u8 Channel); ++void MPT_DeInitAdapter(struct adapter *padapter); ++s32 mp_start_test(struct adapter *padapter); ++void mp_stop_test(struct adapter *padapter); ++ ++u32 _read_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 bitmask); ++void _write_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val); ++ ++u32 read_bbreg(struct adapter *padapter, u32 addr, u32 bitmask); ++void write_bbreg(struct adapter *padapter, u32 addr, u32 bitmask, u32 val); ++u32 read_rfreg(struct adapter *padapter, u8 rfpath, u32 addr); ++void write_rfreg(struct adapter *padapter, u8 rfpath, u32 addr, u32 val); ++ ++void SetChannel(struct adapter *pAdapter); ++void SetBandwidth(struct adapter *pAdapter); ++void SetTxPower(struct adapter *pAdapter); ++void SetAntennaPathPower(struct adapter *pAdapter); ++void SetDataRate(struct adapter *pAdapter); ++ ++void SetAntenna(struct adapter *pAdapter); ++ ++s32 SetThermalMeter(struct adapter *pAdapter, u8 target_ther); ++void GetThermalMeter(struct adapter *pAdapter, u8 *value); ++ ++void SetContinuousTx(struct adapter *pAdapter, u8 bStart); ++void SetSingleCarrierTx(struct adapter *pAdapter, u8 bStart); ++void SetSingleToneTx(struct adapter *pAdapter, u8 bStart); ++void SetCarrierSuppressionTx(struct adapter *pAdapter, u8 bStart); ++void PhySetTxPowerLevel(struct adapter *pAdapter); ++ ++void fill_txdesc_for_mp(struct adapter *padapter, struct tx_desc *ptxdesc); ++void SetPacketTx(struct adapter *padapter); ++void SetPacketRx(struct adapter *pAdapter, u8 bStartRx); ++ ++void ResetPhyRxPktCount(struct adapter *pAdapter); ++u32 GetPhyRxPktReceived(struct adapter *pAdapter); ++u32 GetPhyRxPktCRC32Error(struct adapter *pAdapter); ++ ++s32 SetPowerTracking(struct adapter *padapter, u8 enable); ++void GetPowerTracking(struct adapter *padapter, u8 *enable); ++u32 mp_query_psd(struct adapter *pAdapter, u8 *data); ++void Hal_SetAntenna(struct adapter *pAdapter); ++void Hal_SetBandwidth(struct adapter *pAdapter); ++void Hal_SetTxPower(struct adapter *pAdapter); ++void Hal_SetCarrierSuppressionTx(struct adapter *pAdapter, u8 bStart); ++void Hal_SetSingleToneTx(struct adapter *pAdapter, u8 bStart); ++void Hal_SetSingleCarrierTx (struct adapter *pAdapter, u8 bStart); ++void Hal_SetContinuousTx (struct adapter *pAdapter, u8 bStart); ++void Hal_SetBandwidth(struct adapter *pAdapter); ++void Hal_SetDataRate(struct adapter *pAdapter); ++void Hal_SetChannel(struct adapter *pAdapter); ++void Hal_SetAntennaPathPower(struct adapter *pAdapter); ++s32 Hal_SetThermalMeter(struct adapter *pAdapter, u8 target_ther); ++s32 Hal_SetPowerTracking(struct adapter *padapter, u8 enable); ++void Hal_GetPowerTracking(struct adapter *padapter, u8 * enable); ++void Hal_GetThermalMeter(struct adapter *pAdapter, u8 *value); ++void Hal_mpt_SwitchRfSetting(struct adapter *pAdapter); ++void Hal_MPT_CCKTxPowerAdjust(struct adapter * Adapter, bool bInCH14); ++void Hal_MPT_CCKTxPowerAdjustbyIndex(struct adapter *pAdapter, bool beven); ++void Hal_SetCCKTxPower(struct adapter *pAdapter, u8 * TxPower); ++void Hal_SetOFDMTxPower(struct adapter *pAdapter, u8 * TxPower); ++void Hal_TriggerRFThermalMeter(struct adapter *pAdapter); ++u8 Hal_ReadRFThermalMeter(struct adapter *pAdapter); ++void Hal_SetCCKContinuousTx(struct adapter *pAdapter, u8 bStart); ++void Hal_SetOFDMContinuousTx(struct adapter *pAdapter, u8 bStart); ++void Hal_ProSetCrystalCap (struct adapter *pAdapter , u32 CrystalCapVal); ++void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv); ++void MP_PHY_SetRFPathSwitch(struct adapter *pAdapter ,bool bMain); ++ ++#endif /* _RTW_MP_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_mp_ioctl.h b/drivers/staging/r8188eu/include/rtw_mp_ioctl.h +new file mode 100644 +index 000000000000..cf99f39a582e +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_mp_ioctl.h +@@ -0,0 +1,242 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_MP_IOCTL_H_ ++#define _RTW_MP_IOCTL_H_ ++ ++#include "drv_types.h" ++#include "mp_custom_oid.h" ++#include "rtw_ioctl.h" ++#include "rtw_ioctl_rtl.h" ++#include "rtw_efuse.h" ++#include "rtw_mp.h" ++ ++struct cfg_dbg_msg_struct { ++ u32 DebugLevel; ++ u32 DebugComponent_H32; ++ u32 DebugComponent_L32; ++}; ++ ++struct mp_rw_reg { ++ u32 offset; ++ u32 width; ++ u32 value; ++}; ++ ++struct efuse_access_struct { ++ u16 start_addr; ++ u16 cnts; ++ u8 data[0]; ++}; ++ ++struct burst_rw_reg { ++ u32 offset; ++ u32 len; ++ u8 Data[256]; ++}; ++ ++struct usb_vendor_req { ++ u8 bRequest; ++ u16 wValue; ++ u16 wIndex; ++ u16 wLength; ++ u8 u8Dir;/* 0:OUT, 1:IN */ ++ u8 u8InData; ++}; ++ ++struct dr_variable_struct { ++ u8 offset; ++ u32 variable; ++}; ++ ++#define _irqlevel_changed_(a, b) ++ ++int rtl8188eu_oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv); ++ ++int rtl8188eu_oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *par_priv); ++int rtl8188eu_oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *par_priv); ++int rtl8188eu_oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *par_priv); ++int rtl8188eu_oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* rtl8188eu_oid_rtl_seg_81_87 */ ++int rtl8188eu_oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv); ++ ++int rtl8188eu_oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* rtl8188eu_oid_rtl_seg_87_11_00 */ ++int rtl8188eu_oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv); ++/* rtl8188eu_oid_rtl_seg_87_11_20 */ ++int rtl8188eu_oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv); ++/* rtl8188eu_oid_rtl_seg_87_11_50 */ ++int rtl8188eu_oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv); ++/* rtl8188eu_oid_rtl_seg_87_11_F0 */ ++int rtl8188eu_oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv); ++ ++/* rtl8188eu_oid_rtl_seg_87_12_00 */ ++int rtl8188eu_oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *par_priv); ++int rtl8188eu_oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv); ++int rtl8188eu_oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv); ++ ++struct rwreg_param { ++ u32 offset; ++ u32 width; ++ u32 value; ++}; ++ ++struct bbreg_param { ++ u32 offset; ++ u32 phymask; ++ u32 value; ++}; ++ ++struct txpower_param { ++ u32 pwr_index; ++}; ++ ++struct datarate_param { ++ u32 rate_index; ++}; ++ ++struct rfintfs_parm { ++ u32 rfintfs; ++}; ++ ++struct mp_xmit_parm { ++ u8 enable; ++ u32 count; ++ u16 length; ++ u8 payload_type; ++ u8 da[ETH_ALEN]; ++}; ++ ++struct mp_xmit_packet { ++ u32 len; ++ u32 mem[MAX_MP_XMITBUF_SZ >> 2]; ++}; ++ ++struct psmode_param { ++ u32 ps_mode; ++ u32 smart_ps; ++}; ++ ++/* for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM */ ++struct eeprom_rw_param { ++ u32 offset; ++ u16 value; ++}; ++ ++struct mp_ioctl_handler { ++ u32 paramsize; ++ s32 (*handler)(struct oid_par_priv* poid_par_priv); ++ u32 oid; ++}; ++ ++struct mp_ioctl_param{ ++ u32 subcode; ++ u32 len; ++ u8 data[0]; ++}; ++ ++#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_ ++ ++enum RTL871X_MP_IOCTL_SUBCODE { ++ GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/ ++ GEN_MP_IOCTL_SUBCODE(MP_STOP), ++ GEN_MP_IOCTL_SUBCODE(READ_REG), ++ GEN_MP_IOCTL_SUBCODE(WRITE_REG), ++ GEN_MP_IOCTL_SUBCODE(READ_BB_REG), ++ GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/ ++ GEN_MP_IOCTL_SUBCODE(READ_RF_REG), ++ GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG), ++ GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), ++ GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), ++ GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/ ++ GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), ++ GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), ++ GEN_MP_IOCTL_SUBCODE(CNTU_TX), ++ GEN_MP_IOCTL_SUBCODE(SC_TX), ++ GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/ ++ GEN_MP_IOCTL_SUBCODE(ST_TX), ++ GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), ++ GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), ++ GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), ++ GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/ ++ GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), ++ GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), ++ GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), ++ GEN_MP_IOCTL_SUBCODE(EFUSE), ++ GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/ ++ GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), ++ GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), ++ GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), ++ GEN_MP_IOCTL_SUBCODE(SET_PTM), ++ GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/ ++ GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO), ++ GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*35*/ ++ GEN_MP_IOCTL_SUBCODE(DEL_BA), /*36*/ ++ GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*37*/ ++ MAX_MP_IOCTL_SUBCODE, ++}; ++ ++s32 rtl8188eu_mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv); ++ ++#define GEN_HANDLER(sz, hdl, oid) {sz, hdl, oid}, ++ ++#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) \ ++ {sz, rtl8188eu_mp_ioctl_##subcode##_hdl, oid}, ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_mp_phy_regdef.h b/drivers/staging/r8188eu/include/rtw_mp_phy_regdef.h +new file mode 100644 +index 000000000000..c2be770a5f5d +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_mp_phy_regdef.h +@@ -0,0 +1,1063 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++/***************************************************************************** ++ * ++ * Module: __RTW_MP_PHY_REGDEF_H_ ++ * ++ * ++ * Note: 1. Define PMAC/BB register map ++ * 2. Define RF register map ++ * 3. PMAC/BB register bit mask. ++ * 4. RF reg bit mask. ++ * 5. Other BB/RF relative definition. ++ * ++ * ++ * Export: Constants, macro, functions(API), global variables(None). ++ * ++ * Abbrev: ++ * ++ * History: ++ * Data Who Remark ++ * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. ++ * 2. Reorganize code architecture. ++ * 09/25/2008 MH 1. Add RL6052 register definition ++ * ++ *****************************************************************************/ ++#ifndef __RTW_MP_PHY_REGDEF_H_ ++#define __RTW_MP_PHY_REGDEF_H_ ++ ++/*--------------------------Define Parameters-------------------------------*/ ++ ++/* */ ++/* 8192S Regsiter offset definition */ ++/* */ ++ ++/* */ ++/* BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF */ ++/* 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF */ ++/* 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 */ ++/* 3. RF register 0x00-2E */ ++/* 4. Bit Mask for BB/RF register */ ++/* 5. Other definition for BB/RF R/W */ ++/* */ ++ ++/* */ ++/* 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF */ ++/* 1. Page1(0x100) */ ++/* */ ++#define rPMAC_Reset 0x100 ++#define rPMAC_TxStart 0x104 ++#define rPMAC_TxLegacySIG 0x108 ++#define rPMAC_TxHTSIG1 0x10c ++#define rPMAC_TxHTSIG2 0x110 ++#define rPMAC_PHYDebug 0x114 ++#define rPMAC_TxPacketNum 0x118 ++#define rPMAC_TxIdle 0x11c ++#define rPMAC_TxMACHeader0 0x120 ++#define rPMAC_TxMACHeader1 0x124 ++#define rPMAC_TxMACHeader2 0x128 ++#define rPMAC_TxMACHeader3 0x12c ++#define rPMAC_TxMACHeader4 0x130 ++#define rPMAC_TxMACHeader5 0x134 ++#define rPMAC_TxDataType 0x138 ++#define rPMAC_TxRandomSeed 0x13c ++#define rPMAC_CCKPLCPPreamble 0x140 ++#define rPMAC_CCKPLCPHeader 0x144 ++#define rPMAC_CCKCRC16 0x148 ++#define rPMAC_OFDMRxCRC32OK 0x170 ++#define rPMAC_OFDMRxCRC32Er 0x174 ++#define rPMAC_OFDMRxParityEr 0x178 ++#define rPMAC_OFDMRxCRC8Er 0x17c ++#define rPMAC_CCKCRxRC16Er 0x180 ++#define rPMAC_CCKCRxRC32Er 0x184 ++#define rPMAC_CCKCRxRC32OK 0x188 ++#define rPMAC_TxStatus 0x18c ++ ++/* */ ++/* 2. Page2(0x200) */ ++/* */ ++/* The following two definition are only used for USB interface. */ ++/* define RF_BB_CMD_ADDR 0x02c0 RF/BB read/write command address. */ ++/* define RF_BB_CMD_DATA 0x02c4 RF/BB read/write command data. */ ++ ++/* */ ++/* 3. Page8(0x800) */ ++/* */ ++#define rFPGA0_RFMOD 0x800 /* RF mode & CCK TxSC RF BW Setting?? */ ++ ++#define rFPGA0_TxInfo 0x804 /* Status report?? */ ++#define rFPGA0_PSDFunction 0x808 ++ ++#define rFPGA0_TxGainStage 0x80c /* Set TX PWR init gain? */ ++ ++#define rFPGA0_RFTiming1 0x810 /* Useless now */ ++#define rFPGA0_RFTiming2 0x814 ++/* define rFPGA0_XC_RFTiming 0x818 */ ++/* define rFPGA0_XD_RFTiming 0x81c */ ++ ++#define rFPGA0_XA_HSSIParameter1 0x820 /* RF 3 wire register */ ++#define rFPGA0_XA_HSSIParameter2 0x824 ++#define rFPGA0_XB_HSSIParameter1 0x828 ++#define rFPGA0_XB_HSSIParameter2 0x82c ++#define rFPGA0_XC_HSSIParameter1 0x830 ++#define rFPGA0_XC_HSSIParameter2 0x834 ++#define rFPGA0_XD_HSSIParameter1 0x838 ++#define rFPGA0_XD_HSSIParameter2 0x83c ++#define rFPGA0_XA_LSSIParameter 0x840 ++#define rFPGA0_XB_LSSIParameter 0x844 ++#define rFPGA0_XC_LSSIParameter 0x848 ++#define rFPGA0_XD_LSSIParameter 0x84c ++ ++#define rFPGA0_RFWakeUpParameter 0x850 /* Useless now */ ++#define rFPGA0_RFSleepUpParameter 0x854 ++ ++#define rFPGA0_XAB_SwitchControl 0x858 /* RF Channel switch */ ++#define rFPGA0_XCD_SwitchControl 0x85c ++ ++#define rFPGA0_XA_RFInterfaceOE 0x860 /* RF Channel switch */ ++#define rFPGA0_XB_RFInterfaceOE 0x864 ++#define rFPGA0_XC_RFInterfaceOE 0x868 ++#define rFPGA0_XD_RFInterfaceOE 0x86c ++ ++#define rFPGA0_XAB_RFInterfaceSW 0x870 /* RF Interface Software Control */ ++#define rFPGA0_XCD_RFInterfaceSW 0x874 ++ ++#define rFPGA0_XAB_RFParameter 0x878 /* RF Parameter */ ++#define rFPGA0_XCD_RFParameter 0x87c ++ ++#define rFPGA0_AnalogParameter1 0x880 /* Crystal cap setting RF-R/W protection for parameter4?? */ ++#define rFPGA0_AnalogParameter2 0x884 ++#define rFPGA0_AnalogParameter3 0x888 /* Useless now */ ++#define rFPGA0_AnalogParameter4 0x88c ++ ++#define rFPGA0_XA_LSSIReadBack 0x8a0 /* Tranceiver LSSI Readback */ ++#define rFPGA0_XB_LSSIReadBack 0x8a4 ++#define rFPGA0_XC_LSSIReadBack 0x8a8 ++#define rFPGA0_XD_LSSIReadBack 0x8ac ++ ++#define rFPGA0_PSDReport 0x8b4 /* Useless now */ ++#define rFPGA0_XAB_RFInterfaceRB 0x8e0 /* Useless now RF Interface Readback Value */ ++#define rFPGA0_XCD_RFInterfaceRB 0x8e4 /* Useless now */ ++ ++/* */ ++/* 4. Page9(0x900) */ ++/* */ ++#define rFPGA1_RFMOD 0x900 /* RF mode & OFDM TxSC RF BW Setting?? */ ++ ++#define rFPGA1_TxBlock 0x904 /* Useless now */ ++#define rFPGA1_DebugSelect 0x908 /* Useless now */ ++#define rFPGA1_TxInfo 0x90c /* Useless now Status report?? */ ++ ++/* */ ++/* 5. PageA(0xA00) */ ++/* */ ++/* Set Control channel to upper or lower. These settings are required only for 40MHz */ ++#define rCCK0_System 0xa00 ++ ++#define rCCK0_AFESetting 0xa04 /* Disable init gain now Select RX path by RSSI */ ++#define rCCK0_CCA 0xa08 /* Disable init gain now Init gain */ ++ ++#define rCCK0_RxAGC1 0xa0c /* AGC default value, saturation level Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series */ ++#define rCCK0_RxAGC2 0xa10 /* AGC & DAGC */ ++ ++#define rCCK0_RxHP 0xa14 ++ ++#define rCCK0_DSPParameter1 0xa18 /* Timing recovery & Channel estimation threshold */ ++#define rCCK0_DSPParameter2 0xa1c /* SQ threshold */ ++ ++#define rCCK0_TxFilter1 0xa20 ++#define rCCK0_TxFilter2 0xa24 ++#define rCCK0_DebugPort 0xa28 /* debug port and Tx filter3 */ ++#define rCCK0_FalseAlarmReport 0xa2c /* 0xa2d useless now 0xa30-a4f channel report */ ++#define rCCK0_TRSSIReport 0xa50 ++#define rCCK0_RxReport 0xa54 /* 0xa57 */ ++#define rCCK0_FACounterLower 0xa5c /* 0xa5b */ ++#define rCCK0_FACounterUpper 0xa58 /* 0xa5c */ ++ ++/* */ ++/* 6. PageC(0xC00) */ ++/* */ ++#define rOFDM0_LSTF 0xc00 ++ ++#define rOFDM0_TRxPathEnable 0xc04 ++#define rOFDM0_TRMuxPar 0xc08 ++#define rOFDM0_TRSWIsolation 0xc0c ++ ++#define rOFDM0_XARxAFE 0xc10 /* RxIQ DC offset, Rx digital filter, DC notch filter */ ++#define rOFDM0_XARxIQImbalance 0xc14 /* RxIQ imblance matrix */ ++#define rOFDM0_XBRxAFE 0xc18 ++#define rOFDM0_XBRxIQImbalance 0xc1c ++#define rOFDM0_XCRxAFE 0xc20 ++#define rOFDM0_XCRxIQImbalance 0xc24 ++#define rOFDM0_XDRxAFE 0xc28 ++#define rOFDM0_XDRxIQImbalance 0xc2c ++ ++#define rOFDM0_RxDetector1 0xc30 /* PD,BW & SBD DM tune init gain */ ++#define rOFDM0_RxDetector2 0xc34 /* SBD & Fame Sync. */ ++#define rOFDM0_RxDetector3 0xc38 /* Frame Sync. */ ++#define rOFDM0_RxDetector4 0xc3c /* PD, SBD, Frame Sync & Short-GI */ ++ ++#define rOFDM0_RxDSP 0xc40 /* Rx Sync Path */ ++#define rOFDM0_CFOandDAGC 0xc44 /* CFO & DAGC */ ++#define rOFDM0_CCADropThreshold 0xc48 /* CCA Drop threshold */ ++#define rOFDM0_ECCAThreshold 0xc4c /* energy CCA */ ++ ++#define rOFDM0_XAAGCCore1 0xc50 /* DIG */ ++#define rOFDM0_XAAGCCore2 0xc54 ++#define rOFDM0_XBAGCCore1 0xc58 ++#define rOFDM0_XBAGCCore2 0xc5c ++#define rOFDM0_XCAGCCore1 0xc60 ++#define rOFDM0_XCAGCCore2 0xc64 ++#define rOFDM0_XDAGCCore1 0xc68 ++#define rOFDM0_XDAGCCore2 0xc6c ++ ++#define rOFDM0_AGCParameter1 0xc70 ++#define rOFDM0_AGCParameter2 0xc74 ++#define rOFDM0_AGCRSSITable 0xc78 ++#define rOFDM0_HTSTFAGC 0xc7c ++ ++#define rOFDM0_XATxIQImbalance 0xc80 /* TX PWR TRACK and DIG */ ++#define rOFDM0_XATxAFE 0xc84 ++#define rOFDM0_XBTxIQImbalance 0xc88 ++#define rOFDM0_XBTxAFE 0xc8c ++#define rOFDM0_XCTxIQImbalance 0xc90 ++#define rOFDM0_XCTxAFE 0xc94 ++#define rOFDM0_XDTxIQImbalance 0xc98 ++#define rOFDM0_XDTxAFE 0xc9c ++#define rOFDM0_RxIQExtAnta 0xca0 ++ ++#define rOFDM0_RxHPParameter 0xce0 ++#define rOFDM0_TxPseudoNoiseWgt 0xce4 ++#define rOFDM0_FrameSync 0xcf0 ++#define rOFDM0_DFSReport 0xcf4 ++#define rOFDM0_TxCoeff1 0xca4 ++#define rOFDM0_TxCoeff2 0xca8 ++#define rOFDM0_TxCoeff3 0xcac ++#define rOFDM0_TxCoeff4 0xcb0 ++#define rOFDM0_TxCoeff5 0xcb4 ++#define rOFDM0_TxCoeff6 0xcb8 ++ ++/* 7. PageD(0xD00) */ ++#define rOFDM1_LSTF 0xd00 ++#define rOFDM1_TRxPathEnable 0xd04 ++ ++#define rOFDM1_CFO 0xd08 /* No setting now */ ++#define rOFDM1_CSI1 0xd10 ++#define rOFDM1_SBD 0xd14 ++#define rOFDM1_CSI2 0xd18 ++#define rOFDM1_CFOTracking 0xd2c ++#define rOFDM1_TRxMesaure1 0xd34 ++#define rOFDM1_IntfDet 0xd3c ++#define rOFDM1_PseudoNoiseStateAB 0xd50 ++#define rOFDM1_PseudoNoiseStateCD 0xd54 ++#define rOFDM1_RxPseudoNoiseWgt 0xd58 ++ ++#define rOFDM_PHYCounter1 0xda0 /* cca, parity fail */ ++#define rOFDM_PHYCounter2 0xda4 /* rate illegal, crc8 fail */ ++#define rOFDM_PHYCounter3 0xda8 /* MCS not support */ ++ ++#define rOFDM_ShortCFOAB 0xdac /* No setting now */ ++#define rOFDM_ShortCFOCD 0xdb0 ++#define rOFDM_LongCFOAB 0xdb4 ++#define rOFDM_LongCFOCD 0xdb8 ++#define rOFDM_TailCFOAB 0xdbc ++#define rOFDM_TailCFOCD 0xdc0 ++#define rOFDM_PWMeasure1 0xdc4 ++#define rOFDM_PWMeasure2 0xdc8 ++#define rOFDM_BWReport 0xdcc ++#define rOFDM_AGCReport 0xdd0 ++#define rOFDM_RxSNR 0xdd4 ++#define rOFDM_RxEVMCSI 0xdd8 ++#define rOFDM_SIGReport 0xddc ++ ++/* */ ++/* 8. PageE(0xE00) */ ++/* */ ++#define rTxAGC_Rate18_06 0xe00 ++#define rTxAGC_Rate54_24 0xe04 ++#define rTxAGC_CCK_Mcs32 0xe08 ++#define rTxAGC_Mcs03_Mcs00 0xe10 ++#define rTxAGC_Mcs07_Mcs04 0xe14 ++#define rTxAGC_Mcs11_Mcs08 0xe18 ++#define rTxAGC_Mcs15_Mcs12 0xe1c ++ ++/* Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register] */ ++#define rRx_Wait_CCCA 0xe70 ++#define rAnapar_Ctrl_BB 0xee0 ++ ++/* */ ++/* 7. RF Register 0x00-0x2E (RF 8256) */ ++/* RF-0222D 0x00-3F */ ++/* */ ++/* Zebra1 */ ++#define RTL92SE_FPGA_VERIFY 0 ++#define rZebra1_HSSIEnable 0x0 /* Useless now */ ++#define rZebra1_TRxEnable1 0x1 ++#define rZebra1_TRxEnable2 0x2 ++#define rZebra1_AGC 0x4 ++#define rZebra1_ChargePump 0x5 ++/* if (RTL92SE_FPGA_VERIFY == 1) */ ++#define rZebra1_Channel 0x7 /* RF channel switch */ ++/* else */ ++ ++/* endif */ ++#define rZebra1_TxGain 0x8 /* Useless now */ ++#define rZebra1_TxLPF 0x9 ++#define rZebra1_RxLPF 0xb ++#define rZebra1_RxHPFCorner 0xc ++ ++/* Zebra4 */ ++#define rGlobalCtrl 0 /* Useless now */ ++#define rRTL8256_TxLPF 19 ++#define rRTL8256_RxLPF 11 ++ ++/* RTL8258 */ ++#define rRTL8258_TxLPF 0x11 /* Useless now */ ++#define rRTL8258_RxLPF 0x13 ++#define rRTL8258_RSSILPF 0xa ++ ++/* */ ++/* RL6052 Register definition */ ++#define RF_AC 0x00 /* */ ++ ++#define RF_IQADJ_G1 0x01 /* */ ++#define RF_IQADJ_G2 0x02 /* */ ++#define RF_POW_TRSW 0x05 /* */ ++ ++#define RF_GAIN_RX 0x06 /* */ ++#define RF_GAIN_TX 0x07 /* */ ++ ++#define RF_TXM_IDAC 0x08 /* */ ++#define RF_BS_IQGEN 0x0F /* */ ++ ++#define RF_MODE1 0x10 /* */ ++#define RF_MODE2 0x11 /* */ ++ ++#define RF_RX_AGC_HP 0x12 /* */ ++#define RF_TX_AGC 0x13 /* */ ++#define RF_BIAS 0x14 /* */ ++#define RF_IPA 0x15 /* */ ++#define RF_TXBIAS 0x16 /* */ ++#define RF_POW_ABILITY 0x17 /* */ ++#define RF_MODE_AG 0x18 /* */ ++#define rRfChannel 0x18 /* RF channel and BW switch */ ++#define RF_CHNLBW 0x18 /* RF channel and BW switch */ ++#define RF_TOP 0x19 /* */ ++ ++#define RF_RX_G1 0x1A /* */ ++#define RF_RX_G2 0x1B /* */ ++ ++#define RF_RX_BB2 0x1C /* */ ++#define RF_RX_BB1 0x1D /* */ ++ ++#define RF_RCK1 0x1E /* */ ++#define RF_RCK2 0x1F /* */ ++ ++#define RF_TX_G1 0x20 /* */ ++#define RF_TX_G2 0x21 /* */ ++#define RF_TX_G3 0x22 /* */ ++ ++#define RF_TX_BB1 0x23 /* */ ++ ++#define RF_T_METER 0x24 /* */ ++ ++#define RF_SYN_G1 0x25 /* RF TX Power control */ ++#define RF_SYN_G2 0x26 /* RF TX Power control */ ++#define RF_SYN_G3 0x27 /* RF TX Power control */ ++#define RF_SYN_G4 0x28 /* RF TX Power control */ ++#define RF_SYN_G5 0x29 /* RF TX Power control */ ++#define RF_SYN_G6 0x2A /* RF TX Power control */ ++#define RF_SYN_G7 0x2B /* RF TX Power control */ ++#define RF_SYN_G8 0x2C /* RF TX Power control */ ++ ++#define RF_RCK_OS 0x30 /* RF TX PA control */ ++#define RF_TXPA_G1 0x31 /* RF TX PA control */ ++#define RF_TXPA_G2 0x32 /* RF TX PA control */ ++#define RF_TXPA_G3 0x33 /* RF TX PA control */ ++ ++/* */ ++/* Bit Mask */ ++/* */ ++/* 1. Page1(0x100) */ ++#define bBBResetB 0x100 /* Useless now? */ ++#define bGlobalResetB 0x200 ++#define bOFDMTxStart 0x4 ++#define bCCKTxStart 0x8 ++#define bCRC32Debug 0x100 ++#define bPMACLoopback 0x10 ++#define bTxLSIG 0xffffff ++#define bOFDMTxRate 0xf ++#define bOFDMTxReserved 0x10 ++#define bOFDMTxLength 0x1ffe0 ++#define bOFDMTxParity 0x20000 ++#define bTxHTSIG1 0xffffff ++#define bTxHTMCSRate 0x7f ++#define bTxHTBW 0x80 ++#define bTxHTLength 0xffff00 ++#define bTxHTSIG2 0xffffff ++#define bTxHTSmoothing 0x1 ++#define bTxHTSounding 0x2 ++#define bTxHTReserved 0x4 ++#define bTxHTAggreation 0x8 ++#define bTxHTSTBC 0x30 ++#define bTxHTAdvanceCoding 0x40 ++#define bTxHTShortGI 0x80 ++#define bTxHTNumberHT_LTF 0x300 ++#define bTxHTCRC8 0x3fc00 ++#define bCounterReset 0x10000 ++#define bNumOfOFDMTx 0xffff ++#define bNumOfCCKTx 0xffff0000 ++#define bTxIdleInterval 0xffff ++#define bOFDMService 0xffff0000 ++#define bTxMACHeader 0xffffffff ++#define bTxDataInit 0xff ++#define bTxHTMode 0x100 ++#define bTxDataType 0x30000 ++#define bTxRandomSeed 0xffffffff ++#define bCCKTxPreamble 0x1 ++#define bCCKTxSFD 0xffff0000 ++#define bCCKTxSIG 0xff ++#define bCCKTxService 0xff00 ++#define bCCKLengthExt 0x8000 ++#define bCCKTxLength 0xffff0000 ++#define bCCKTxCRC16 0xffff ++#define bCCKTxStatus 0x1 ++#define bOFDMTxStatus 0x2 ++ ++#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) ++ ++/* 2. Page8(0x800) */ ++#define bRFMOD 0x1 /* Reg 0x800 rFPGA0_RFMOD */ ++#define bJapanMode 0x2 ++#define bCCKTxSC 0x30 ++#define bCCKEn 0x1000000 ++#define bOFDMEn 0x2000000 ++ ++#define bOFDMRxADCPhase 0x10000 /* Useless now */ ++#define bOFDMTxDACPhase 0x40000 ++#define bXATxAGC 0x3f ++ ++#define bXBTxAGC 0xf00 /* Reg 80c rFPGA0_TxGainStage */ ++#define bXCTxAGC 0xf000 ++#define bXDTxAGC 0xf0000 ++ ++#define bPAStart 0xf0000000 /* Useless now */ ++#define bTRStart 0x00f00000 ++#define bRFStart 0x0000f000 ++#define bBBStart 0x000000f0 ++#define bBBCCKStart 0x0000000f ++#define bPAEnd 0xf /* Reg0x814 */ ++#define bTREnd 0x0f000000 ++#define bRFEnd 0x000f0000 ++#define bCCAMask 0x000000f0 /* T2R */ ++#define bR2RCCAMask 0x00000f00 ++#define bHSSI_R2TDelay 0xf8000000 ++#define bHSSI_T2RDelay 0xf80000 ++#define bContTxHSSI 0x400 /* chane gain at continue Tx */ ++#define bIGFromCCK 0x200 ++#define bAGCAddress 0x3f ++#define bRxHPTx 0x7000 ++#define bRxHPT2R 0x38000 ++#define bRxHPCCKIni 0xc0000 ++#define bAGCTxCode 0xc00000 ++#define bAGCRxCode 0x300000 ++ ++#define b3WireDataLength 0x800 /* Reg 0x820~84f rFPGA0_XA_HSSIParameter1 */ ++#define b3WireAddressLength 0x400 ++ ++#define b3WireRFPowerDown 0x1 /* Useless now */ ++/* define bHWSISelect 0x8 */ ++#define b5GPAPEPolarity 0x40000000 ++#define b2GPAPEPolarity 0x80000000 ++#define bRFSW_TxDefaultAnt 0x3 ++#define bRFSW_TxOptionAnt 0x30 ++#define bRFSW_RxDefaultAnt 0x300 ++#define bRFSW_RxOptionAnt 0x3000 ++#define bRFSI_3WireData 0x1 ++#define bRFSI_3WireClock 0x2 ++#define bRFSI_3WireLoad 0x4 ++#define bRFSI_3WireRW 0x8 ++#define bRFSI_3Wire 0xf ++ ++#define bRFSI_RFENV 0x10 /* Reg 0x870 rFPGA0_XAB_RFInterfaceSW */ ++ ++#define bRFSI_TRSW 0x20 /* Useless now */ ++#define bRFSI_TRSWB 0x40 ++#define bRFSI_ANTSW 0x100 ++#define bRFSI_ANTSWB 0x200 ++#define bRFSI_PAPE 0x400 ++#define bRFSI_PAPE5G 0x800 ++#define bBandSelect 0x1 ++#define bHTSIG2_GI 0x80 ++#define bHTSIG2_Smoothing 0x01 ++#define bHTSIG2_Sounding 0x02 ++#define bHTSIG2_Aggreaton 0x08 ++#define bHTSIG2_STBC 0x30 ++#define bHTSIG2_AdvCoding 0x40 ++#define bHTSIG2_NumOfHTLTF 0x300 ++#define bHTSIG2_CRC8 0x3fc ++#define bHTSIG1_MCS 0x7f ++#define bHTSIG1_BandWidth 0x80 ++#define bHTSIG1_HTLength 0xffff ++#define bLSIG_Rate 0xf ++#define bLSIG_Reserved 0x10 ++#define bLSIG_Length 0x1fffe ++#define bLSIG_Parity 0x20 ++#define bCCKRxPhase 0x4 ++#if (RTL92SE_FPGA_VERIFY == 1) ++#define bLSSIReadAddress 0x3f000000 /* LSSI "Read" Address ++ Reg 0x824 rFPGA0_XA_HSSIParameter2 */ ++#else ++#define bLSSIReadAddress 0x7f800000 /* T65 RF */ ++#endif ++#define bLSSIReadEdge 0x80000000 /* LSSI "Read" edge signal */ ++#if (RTL92SE_FPGA_VERIFY == 1) ++#define bLSSIReadBackData 0xfff /* Reg 0x8a0 ++ rFPGA0_XA_LSSIReadBack */ ++#else ++#define bLSSIReadBackData 0xfffff /* T65 RF */ ++#endif ++#define bLSSIReadOKFlag 0x1000 /* Useless now */ ++#define bCCKSampleRate 0x8 /* 0: 44MHz, 1:88MHz */ ++#define bRegulator0Standby 0x1 ++#define bRegulatorPLLStandby 0x2 ++#define bRegulator1Standby 0x4 ++#define bPLLPowerUp 0x8 ++#define bDPLLPowerUp 0x10 ++#define bDA10PowerUp 0x20 ++#define bAD7PowerUp 0x200 ++#define bDA6PowerUp 0x2000 ++#define bXtalPowerUp 0x4000 ++#define b40MDClkPowerUP 0x8000 ++#define bDA6DebugMode 0x20000 ++#define bDA6Swing 0x380000 ++ ++#define bADClkPhase 0x4000000 /* Reg 0x880 ++ rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ */ ++ ++#define b80MClkDelay 0x18000000 /* Useless */ ++#define bAFEWatchDogEnable 0x20000000 ++ ++#define bXtalCap01 0xc0000000 /* Reg 0x884 ++ rFPGA0_AnalogParameter2 Crystal cap */ ++#define bXtalCap23 0x3 ++#define bXtalCap92x 0x0f000000 ++#define bXtalCap 0x0f000000 ++ ++#define bIntDifClkEnable 0x400 /* Useless */ ++#define bExtSigClkEnable 0x800 ++#define bBandgapMbiasPowerUp 0x10000 ++#define bAD11SHGain 0xc0000 ++#define bAD11InputRange 0x700000 ++#define bAD11OPCurrent 0x3800000 ++#define bIPathLoopback 0x4000000 ++#define bQPathLoopback 0x8000000 ++#define bAFELoopback 0x10000000 ++#define bDA10Swing 0x7e0 ++#define bDA10Reverse 0x800 ++#define bDAClkSource 0x1000 ++#define bAD7InputRange 0x6000 ++#define bAD7Gain 0x38000 ++#define bAD7OutputCMMode 0x40000 ++#define bAD7InputCMMode 0x380000 ++#define bAD7Current 0xc00000 ++#define bRegulatorAdjust 0x7000000 ++#define bAD11PowerUpAtTx 0x1 ++#define bDA10PSAtTx 0x10 ++#define bAD11PowerUpAtRx 0x100 ++#define bDA10PSAtRx 0x1000 ++#define bCCKRxAGCFormat 0x200 ++#define bPSDFFTSamplepPoint 0xc000 ++#define bPSDAverageNum 0x3000 ++#define bIQPathControl 0xc00 ++#define bPSDFreq 0x3ff ++#define bPSDAntennaPath 0x30 ++#define bPSDIQSwitch 0x40 ++#define bPSDRxTrigger 0x400000 ++#define bPSDTxTrigger 0x80000000 ++#define bPSDSineToneScale 0x7f000000 ++#define bPSDReport 0xffff ++ ++/* 3. Page9(0x900) */ ++#define bOFDMTxSC 0x30000000 /* Useless */ ++#define bCCKTxOn 0x1 ++#define bOFDMTxOn 0x2 ++#define bDebugPage 0xfff /* reset debug page and HWord, ++ * LWord */ ++#define bDebugItem 0xff /* reset debug page and LWord */ ++#define bAntL 0x10 ++#define bAntNonHT 0x100 ++#define bAntHT1 0x1000 ++#define bAntHT2 0x10000 ++#define bAntHT1S1 0x100000 ++#define bAntNonHTS1 0x1000000 ++ ++/* 4. PageA(0xA00) */ ++#define bCCKBBMode 0x3 /* Useless */ ++#define bCCKTxPowerSaving 0x80 ++#define bCCKRxPowerSaving 0x40 ++ ++#define bCCKSideBand 0x10 /* Reg 0xa00 rCCK0 20/40 sw */ ++ ++#define bCCKScramble 0x8 /* Useless */ ++#define bCCKAntDiversity 0x8000 ++#define bCCKCarrierRecovery 0x4000 ++#define bCCKTxRate 0x3000 ++#define bCCKDCCancel 0x0800 ++#define bCCKISICancel 0x0400 ++#define bCCKMatchFilter 0x0200 ++#define bCCKEqualizer 0x0100 ++#define bCCKPreambleDetect 0x800000 ++#define bCCKFastFalseCCA 0x400000 ++#define bCCKChEstStart 0x300000 ++#define bCCKCCACount 0x080000 ++#define bCCKcs_lim 0x070000 ++#define bCCKBistMode 0x80000000 ++#define bCCKCCAMask 0x40000000 ++#define bCCKTxDACPhase 0x4 ++#define bCCKRxADCPhase 0x20000000 /* r_rx_clk */ ++#define bCCKr_cp_mode0 0x0100 ++#define bCCKTxDCOffset 0xf0 ++#define bCCKRxDCOffset 0xf ++#define bCCKCCAMode 0xc000 ++#define bCCKFalseCS_lim 0x3f00 ++#define bCCKCS_ratio 0xc00000 ++#define bCCKCorgBit_sel 0x300000 ++#define bCCKPD_lim 0x0f0000 ++#define bCCKNewCCA 0x80000000 ++#define bCCKRxHPofIG 0x8000 ++#define bCCKRxIG 0x7f00 ++#define bCCKLNAPolarity 0x800000 ++#define bCCKRx1stGain 0x7f0000 ++#define bCCKRFExtend 0x20000000 /* CCK Rx init gain polar */ ++#define bCCKRxAGCSatLevel 0x1f000000 ++#define bCCKRxAGCSatCount 0xe0 ++#define bCCKRxRFSettle 0x1f /* AGCsamp_dly */ ++#define bCCKFixedRxAGC 0x8000 ++#define bCCKAntennaPolarity 0x2000 ++#define bCCKTxFilterType 0x0c00 ++#define bCCKRxAGCReportType 0x0300 ++#define bCCKRxDAGCEn 0x80000000 ++#define bCCKRxDAGCPeriod 0x20000000 ++#define bCCKRxDAGCSatLevel 0x1f000000 ++#define bCCKTimingRecovery 0x800000 ++#define bCCKTxC0 0x3f0000 ++#define bCCKTxC1 0x3f000000 ++#define bCCKTxC2 0x3f ++#define bCCKTxC3 0x3f00 ++#define bCCKTxC4 0x3f0000 ++#define bCCKTxC5 0x3f000000 ++#define bCCKTxC6 0x3f ++#define bCCKTxC7 0x3f00 ++#define bCCKDebugPort 0xff0000 ++#define bCCKDACDebug 0x0f000000 ++#define bCCKFalseAlarmEnable 0x8000 ++#define bCCKFalseAlarmRead 0x4000 ++#define bCCKTRSSI 0x7f ++#define bCCKRxAGCReport 0xfe ++#define bCCKRxReport_AntSel 0x80000000 ++#define bCCKRxReport_MFOff 0x40000000 ++#define bCCKRxRxReport_SQLoss 0x20000000 ++#define bCCKRxReport_Pktloss 0x10000000 ++#define bCCKRxReport_Lockedbit 0x08000000 ++#define bCCKRxReport_RateError 0x04000000 ++#define bCCKRxReport_RxRate 0x03000000 ++#define bCCKRxFACounterLower 0xff ++#define bCCKRxFACounterUpper 0xff000000 ++#define bCCKRxHPAGCStart 0xe000 ++#define bCCKRxHPAGCFinal 0x1c00 ++#define bCCKRxFalseAlarmEnable 0x8000 ++#define bCCKFACounterFreeze 0x4000 ++#define bCCKTxPathSel 0x10000000 ++#define bCCKDefaultRxPath 0xc000000 ++#define bCCKOptionRxPath 0x3000000 ++ ++/* 5. PageC(0xC00) */ ++#define bNumOfSTF 0x3 /* Useless */ ++#define bShift_L 0xc0 ++#define bGI_TH 0xc ++#define bRxPathA 0x1 ++#define bRxPathB 0x2 ++#define bRxPathC 0x4 ++#define bRxPathD 0x8 ++#define bTxPathA 0x1 ++#define bTxPathB 0x2 ++#define bTxPathC 0x4 ++#define bTxPathD 0x8 ++#define bTRSSIFreq 0x200 ++#define bADCBackoff 0x3000 ++#define bDFIRBackoff 0xc000 ++#define bTRSSILatchPhase 0x10000 ++#define bRxIDCOffset 0xff ++#define bRxQDCOffset 0xff00 ++#define bRxDFIRMode 0x1800000 ++#define bRxDCNFType 0xe000000 ++#define bRXIQImb_A 0x3ff ++#define bRXIQImb_B 0xfc00 ++#define bRXIQImb_C 0x3f0000 ++#define bRXIQImb_D 0xffc00000 ++#define bDC_dc_Notch 0x60000 ++#define bRxNBINotch 0x1f000000 ++#define bPD_TH 0xf ++#define bPD_TH_Opt2 0xc000 ++#define bPWED_TH 0x700 ++#define bIfMF_Win_L 0x800 ++#define bPD_Option 0x1000 ++#define bMF_Win_L 0xe000 ++#define bBW_Search_L 0x30000 ++#define bwin_enh_L 0xc0000 ++#define bBW_TH 0x700000 ++#define bED_TH2 0x3800000 ++#define bBW_option 0x4000000 ++#define bRatio_TH 0x18000000 ++#define bWindow_L 0xe0000000 ++#define bSBD_Option 0x1 ++#define bFrame_TH 0x1c ++#define bFS_Option 0x60 ++#define bDC_Slope_check 0x80 ++#define bFGuard_Counter_DC_L 0xe00 ++#define bFrame_Weight_Short 0x7000 ++#define bSub_Tune 0xe00000 ++#define bFrame_DC_Length 0xe000000 ++#define bSBD_start_offset 0x30000000 ++#define bFrame_TH_2 0x7 ++#define bFrame_GI2_TH 0x38 ++#define bGI2_Sync_en 0x40 ++#define bSarch_Short_Early 0x300 ++#define bSarch_Short_Late 0xc00 ++#define bSarch_GI2_Late 0x70000 ++#define bCFOAntSum 0x1 ++#define bCFOAcc 0x2 ++#define bCFOStartOffset 0xc ++#define bCFOLookBack 0x70 ++#define bCFOSumWeight 0x80 ++#define bDAGCEnable 0x10000 ++#define bTXIQImb_A 0x3ff ++#define bTXIQImb_B 0xfc00 ++#define bTXIQImb_C 0x3f0000 ++#define bTXIQImb_D 0xffc00000 ++#define bTxIDCOffset 0xff ++#define bTxQDCOffset 0xff00 ++#define bTxDFIRMode 0x10000 ++#define bTxPesudoNoiseOn 0x4000000 ++#define bTxPesudoNoise_A 0xff ++#define bTxPesudoNoise_B 0xff00 ++#define bTxPesudoNoise_C 0xff0000 ++#define bTxPesudoNoise_D 0xff000000 ++#define bCCADropOption 0x20000 ++#define bCCADropThres 0xfff00000 ++#define bEDCCA_H 0xf ++#define bEDCCA_L 0xf0 ++#define bLambda_ED 0x300 ++#define bRxInitialGain 0x7f ++#define bRxAntDivEn 0x80 ++#define bRxAGCAddressForLNA 0x7f00 ++#define bRxHighPowerFlow 0x8000 ++#define bRxAGCFreezeThres 0xc0000 ++#define bRxFreezeStep_AGC1 0x300000 ++#define bRxFreezeStep_AGC2 0xc00000 ++#define bRxFreezeStep_AGC3 0x3000000 ++#define bRxFreezeStep_AGC0 0xc000000 ++#define bRxRssi_Cmp_En 0x10000000 ++#define bRxQuickAGCEn 0x20000000 ++#define bRxAGCFreezeThresMode 0x40000000 ++#define bRxOverFlowCheckType 0x80000000 ++#define bRxAGCShift 0x7f ++#define bTRSW_Tri_Only 0x80 ++#define bPowerThres 0x300 ++#define bRxAGCEn 0x1 ++#define bRxAGCTogetherEn 0x2 ++#define bRxAGCMin 0x4 ++#define bRxHP_Ini 0x7 ++#define bRxHP_TRLNA 0x70 ++#define bRxHP_RSSI 0x700 ++#define bRxHP_BBP1 0x7000 ++#define bRxHP_BBP2 0x70000 ++#define bRxHP_BBP3 0x700000 ++#define bRSSI_H 0x7f0000 /* thresh for hi power */ ++#define bRSSI_Gen 0x7f000000 /* thresh for ant div */ ++#define bRxSettle_TRSW 0x7 ++#define bRxSettle_LNA 0x38 ++#define bRxSettle_RSSI 0x1c0 ++#define bRxSettle_BBP 0xe00 ++#define bRxSettle_RxHP 0x7000 ++#define bRxSettle_AntSW_RSSI 0x38000 ++#define bRxSettle_AntSW 0xc0000 ++#define bRxProcessTime_DAGC 0x300000 ++#define bRxSettle_HSSI 0x400000 ++#define bRxProcessTime_BBPPW 0x800000 ++#define bRxAntennaPowerShift 0x3000000 ++#define bRSSITableSelect 0xc000000 ++#define bRxHP_Final 0x7000000 ++#define bRxHTSettle_BBP 0x7 ++#define bRxHTSettle_HSSI 0x8 ++#define bRxHTSettle_RxHP 0x70 ++#define bRxHTSettle_BBPPW 0x80 ++#define bRxHTSettle_Idle 0x300 ++#define bRxHTSettle_Reserved 0x1c00 ++#define bRxHTRxHPEn 0x8000 ++#define bRxHTAGCFreezeThres 0x30000 ++#define bRxHTAGCTogetherEn 0x40000 ++#define bRxHTAGCMin 0x80000 ++#define bRxHTAGCEn 0x100000 ++#define bRxHTDAGCEn 0x200000 ++#define bRxHTRxHP_BBP 0x1c00000 ++#define bRxHTRxHP_Final 0xe0000000 ++#define bRxPWRatioTH 0x3 ++#define bRxPWRatioEn 0x4 ++#define bRxMFHold 0x3800 ++#define bRxPD_Delay_TH1 0x38 ++#define bRxPD_Delay_TH2 0x1c0 ++#define bRxPD_DC_COUNT_MAX 0x600 ++/* define bRxMF_Hold 0x3800 */ ++#define bRxPD_Delay_TH 0x8000 ++#define bRxProcess_Delay 0xf0000 ++#define bRxSearchrange_GI2_Early 0x700000 ++#define bRxFrame_Guard_Counter_L 0x3800000 ++#define bRxSGI_Guard_L 0xc000000 ++#define bRxSGI_Search_L 0x30000000 ++#define bRxSGI_TH 0xc0000000 ++#define bDFSCnt0 0xff ++#define bDFSCnt1 0xff00 ++#define bDFSFlag 0xf0000 ++#define bMFWeightSum 0x300000 ++#define bMinIdxTH 0x7f000000 ++#define bDAFormat 0x40000 ++#define bTxChEmuEnable 0x01000000 ++#define bTRSWIsolation_A 0x7f ++#define bTRSWIsolation_B 0x7f00 ++#define bTRSWIsolation_C 0x7f0000 ++#define bTRSWIsolation_D 0x7f000000 ++#define bExtLNAGain 0x7c00 ++ ++/* 6. PageE(0xE00) */ ++#define bSTBCEn 0x4 /* Useless */ ++#define bAntennaMapping 0x10 ++#define bNss 0x20 ++#define bCFOAntSumD 0x200 ++#define bPHYCounterReset 0x8000000 ++#define bCFOReportGet 0x4000000 ++#define bOFDMContinueTx 0x10000000 ++#define bOFDMSingleCarrier 0x20000000 ++#define bOFDMSingleTone 0x40000000 ++/* define bRxPath1 0x01 */ ++/* define bRxPath2 0x02 */ ++/* define bRxPath3 0x04 */ ++/* define bRxPath4 0x08 */ ++/* define bTxPath1 0x10 */ ++/* define bTxPath2 0x20 */ ++#define bHTDetect 0x100 ++#define bCFOEn 0x10000 ++#define bCFOValue 0xfff00000 ++#define bSigTone_Re 0x3f ++#define bSigTone_Im 0x7f00 ++#define bCounter_CCA 0xffff ++#define bCounter_ParityFail 0xffff0000 ++#define bCounter_RateIllegal 0xffff ++#define bCounter_CRC8Fail 0xffff0000 ++#define bCounter_MCSNoSupport 0xffff ++#define bCounter_FastSync 0xffff ++#define bShortCFO 0xfff ++#define bShortCFOTLength 12 /* total */ ++#define bShortCFOFLength 11 /* fraction */ ++#define bLongCFO 0x7ff ++#define bLongCFOTLength 11 ++#define bLongCFOFLength 11 ++#define bTailCFO 0x1fff ++#define bTailCFOTLength 13 ++#define bTailCFOFLength 12 ++#define bmax_en_pwdB 0xffff ++#define bCC_power_dB 0xffff0000 ++#define bnoise_pwdB 0xffff ++#define bPowerMeasTLength 10 ++#define bPowerMeasFLength 3 ++#define bRx_HT_BW 0x1 ++#define bRxSC 0x6 ++#define bRx_HT 0x8 ++#define bNB_intf_det_on 0x1 ++#define bIntf_win_len_cfg 0x30 ++#define bNB_Intf_TH_cfg 0x1c0 ++#define bRFGain 0x3f ++#define bTableSel 0x40 ++#define bTRSW 0x80 ++#define bRxSNR_A 0xff ++#define bRxSNR_B 0xff00 ++#define bRxSNR_C 0xff0000 ++#define bRxSNR_D 0xff000000 ++#define bSNREVMTLength 8 ++#define bSNREVMFLength 1 ++#define bCSI1st 0xff ++#define bCSI2nd 0xff00 ++#define bRxEVM1st 0xff0000 ++#define bRxEVM2nd 0xff000000 ++#define bSIGEVM 0xff ++#define bPWDB 0xff00 ++#define bSGIEN 0x10000 ++ ++#define bSFactorQAM1 0xf /* Useless */ ++#define bSFactorQAM2 0xf0 ++#define bSFactorQAM3 0xf00 ++#define bSFactorQAM4 0xf000 ++#define bSFactorQAM5 0xf0000 ++#define bSFactorQAM6 0xf0000 ++#define bSFactorQAM7 0xf00000 ++#define bSFactorQAM8 0xf000000 ++#define bSFactorQAM9 0xf0000000 ++#define bCSIScheme 0x100000 ++ ++#define bNoiseLvlTopSet 0x3 /* Useless */ ++#define bChSmooth 0x4 ++#define bChSmoothCfg1 0x38 ++#define bChSmoothCfg2 0x1c0 ++#define bChSmoothCfg3 0xe00 ++#define bChSmoothCfg4 0x7000 ++#define bMRCMode 0x800000 ++#define bTHEVMCfg 0x7000000 ++ ++#define bLoopFitType 0x1 /* Useless */ ++#define bUpdCFO 0x40 ++#define bUpdCFOOffData 0x80 ++#define bAdvUpdCFO 0x100 ++#define bAdvTimeCtrl 0x800 ++#define bUpdClko 0x1000 ++#define bFC 0x6000 ++#define bTrackingMode 0x8000 ++#define bPhCmpEnable 0x10000 ++#define bUpdClkoLTF 0x20000 ++#define bComChCFO 0x40000 ++#define bCSIEstiMode 0x80000 ++#define bAdvUpdEqz 0x100000 ++#define bUChCfg 0x7000000 ++#define bUpdEqz 0x8000000 ++ ++#define bTxAGCRate18_06 0x7f7f7f7f /* Useless */ ++#define bTxAGCRate54_24 0x7f7f7f7f ++#define bTxAGCRateMCS32 0x7f ++#define bTxAGCRateCCK 0x7f00 ++#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f ++#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f ++#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f ++#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f ++ ++/* Rx Pseduo noise */ ++#define bRxPesudoNoiseOn 0x20000000 /* Useless */ ++#define bRxPesudoNoise_A 0xff ++#define bRxPesudoNoise_B 0xff00 ++#define bRxPesudoNoise_C 0xff0000 ++#define bRxPesudoNoise_D 0xff000000 ++#define bPesudoNoiseState_A 0xffff ++#define bPesudoNoiseState_B 0xffff0000 ++#define bPesudoNoiseState_C 0xffff ++#define bPesudoNoiseState_D 0xffff0000 ++ ++/* 7. RF Register */ ++/* Zebra1 */ ++#define bZebra1_HSSIEnable 0x8 /* Useless */ ++#define bZebra1_TRxControl 0xc00 ++#define bZebra1_TRxGainSetting 0x07f ++#define bZebra1_RxCorner 0xc00 ++#define bZebra1_TxChargePump 0x38 ++#define bZebra1_RxChargePump 0x7 ++#define bZebra1_ChannelNum 0xf80 ++#define bZebra1_TxLPFBW 0x400 ++#define bZebra1_RxLPFBW 0x600 ++ ++/* Zebra4 */ ++#define bRTL8256RegModeCtrl1 0x100 /* Useless */ ++#define bRTL8256RegModeCtrl0 0x40 ++#define bRTL8256_TxLPFBW 0x18 ++#define bRTL8256_RxLPFBW 0x600 ++ ++/* RTL8258 */ ++#define bRTL8258_TxLPFBW 0xc /* Useless */ ++#define bRTL8258_RxLPFBW 0xc00 ++#define bRTL8258_RSSILPFBW 0xc0 ++ ++/* */ ++/* Other Definition */ ++/* */ ++ ++/* byte endable for sb_write */ ++#define bByte0 0x1 /* Useless */ ++#define bByte1 0x2 ++#define bByte2 0x4 ++#define bByte3 0x8 ++#define bWord0 0x3 ++#define bWord1 0xc ++#define bDWord 0xf ++ ++/* for PutRegsetting & GetRegSetting BitMask */ ++#define bMaskByte0 0xff /* Reg 0xc50 rOFDM0_XAAGCCore~0xC6f */ ++#define bMaskByte1 0xff00 ++#define bMaskByte2 0xff0000 ++#define bMaskByte3 0xff000000 ++#define bMaskHWord 0xffff0000 ++#define bMaskLWord 0x0000ffff ++#define bMaskDWord 0xffffffff ++#define bMaskH4Bits 0xf0000000 ++#define bMaskOFDM_D 0xffc00000 ++#define bMaskCCK 0x3f3f3f3f ++#define bMask12Bits 0xfff ++ ++/* for PutRFRegsetting & GetRFRegSetting BitMask */ ++#if (RTL92SE_FPGA_VERIFY == 1) ++#define bRFRegOffsetMask 0xfff ++#else ++#define bRFRegOffsetMask 0xfffff ++#endif ++#define bEnable 0x1 /* Useless */ ++#define bDisabl 0x0 ++ ++#define LeftAntenna 0x0 /* Useless */ ++#define RightAntenna 0x1 ++ ++#define tCheckTxStatus 500 /* 500ms Useless */ ++#define tUpdateRxCounter 100 /* 100ms */ ++ ++#define rateCCK 0 /* Useless */ ++#define rateOFDM 1 ++#define rateHT 2 ++ ++/* define Register-End */ ++#define bPMAC_End 0x1ff /* Useless */ ++#define bFPGAPHY0_End 0x8ff ++#define bFPGAPHY1_End 0x9ff ++#define bCCKPHY0_End 0xaff ++#define bOFDMPHY0_End 0xcff ++#define bOFDMPHY1_End 0xdff ++ ++/* define max debug item in each debug page */ ++/* define bMaxItem_FPGA_PHY0 0x9 */ ++/* define bMaxItem_FPGA_PHY1 0x3 */ ++/* define bMaxItem_PHY_11B 0x16 */ ++/* define bMaxItem_OFDM_PHY0 0x29 */ ++/* define bMaxItem_OFDM_PHY1 0x0 */ ++ ++#define bPMACControl 0x0 /* Useless */ ++#define bWMACControl 0x1 ++#define bWNICControl 0x2 ++ ++#define RCR_AAP BIT(0) /* accept all physical address */ ++#define RCR_APM BIT(1) /* accept physical match */ ++#define RCR_AM BIT(2) /* accept multicast */ ++#define RCR_AB BIT(3) /* accept broadcast */ ++#define RCR_ACRC32 BIT(5) /* accept error packet */ ++#define RCR_9356SEL BIT(6) ++#define RCR_AICV BIT(12) /* Accept ICV error packet */ ++#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) /* Rx FIFO threshold */ ++#define RCR_ADF BIT(18) /* Accept Data(frame type) frame */ ++#define RCR_ACF BIT(19) /* Accept control frame */ ++#define RCR_AMF BIT(20) /* Accept management frame */ ++#define RCR_ADD3 BIT(21) ++#define RCR_APWRMGT BIT(22) /* Accept power management packet */ ++#define RCR_CBSSID BIT(23) /* Accept BSSID match packet */ ++#define RCR_ENMARP BIT(28) /* enable mac auto reset phy */ ++#define RCR_EnCS1 BIT(29) /* enable carrier sense method 1 */ ++#define RCR_EnCS2 BIT(30) /* enable carrier sense method 2 */ ++#define RCR_OnlyErlPkt BIT(31) /* Rx Early mode is performed for ++ * packet size greater than 1536 */ ++ ++/*--------------------------Define Parameters-------------------------------*/ ++ ++#endif /* __INC_HAL8192SPHYREG_H */ +diff --git a/drivers/staging/r8188eu/include/rtw_p2p.h b/drivers/staging/r8188eu/include/rtw_p2p.h +new file mode 100644 +index 000000000000..92b9bfe3ea0b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_p2p.h +@@ -0,0 +1,119 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_P2P_H_ ++#define __RTW_P2P_H_ ++ ++#include "drv_types.h" ++ ++u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); ++u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); ++u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, ++ u8 *pbuf, u8 *pssid, u8 ussidlen, ++ u8 *pdev_raddr); ++u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, ++ u8 *pbuf, u8 status_code); ++u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); ++u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len, struct sta_info *psta); ++u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe); ++u8 process_p2p_group_negotation_req(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u8 process_p2p_group_negotation_confirm(struct wifidirect_info *pwdinfo, ++ u8 *pframe, uint len); ++u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, ++ uint len); ++void p2p_protocol_wk_hdl(struct adapter *padapter, int intcmdtype); ++void process_p2p_ps_ie(struct adapter *padapter, u8 *ies, u32 ielength); ++void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state); ++u8 p2p_ps_wk_cmd(struct adapter *padapter, u8 p2p_ps_state, u8 enqueue); ++void reset_global_wifidirect_info(struct adapter *padapter); ++int rtw_init_wifi_display_info(struct adapter *padapter); ++void rtw_init_wifidirect_timers(struct adapter *padapter); ++void rtw_init_wifidirect_addrs(struct adapter *padapter, u8 *dev_addr, ++ u8 *iface_addr); ++void init_wifidirect_info(struct adapter *padapter, enum P2P_ROLE role); ++int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role); ++ ++static inline void _rtw_p2p_set_state(struct wifidirect_info *wdinfo, ++ enum P2P_STATE state) ++{ ++ if (wdinfo->p2p_state != state) ++ wdinfo->p2p_state = state; ++} ++ ++static inline void _rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, ++ enum P2P_STATE state) ++{ ++ if (wdinfo->pre_p2p_state != state) ++ wdinfo->pre_p2p_state = state; ++} ++ ++static inline void _rtw_p2p_set_role(struct wifidirect_info *wdinfo, ++ enum P2P_ROLE role) ++{ ++ if (wdinfo->role != role) ++ wdinfo->role = role; ++} ++ ++static inline int _rtw_p2p_state(struct wifidirect_info *wdinfo) ++{ ++ return wdinfo->p2p_state; ++} ++ ++static inline int _rtw_p2p_pre_state(struct wifidirect_info *wdinfo) ++{ ++ return wdinfo->pre_p2p_state; ++} ++ ++static inline int _rtw_p2p_role(struct wifidirect_info *wdinfo) ++{ ++ return wdinfo->role; ++} ++ ++static inline bool _rtw_p2p_chk_state(struct wifidirect_info *wdinfo, ++ enum P2P_STATE state) ++{ ++ return wdinfo->p2p_state == state; ++} ++ ++static inline bool _rtw_p2p_chk_role(struct wifidirect_info *wdinfo, ++ enum P2P_ROLE role) ++{ ++ return wdinfo->role == role; ++} ++ ++#define rtw_p2p_set_state(wdinfo, state) _rtw_p2p_set_state(wdinfo, state) ++#define rtw_p2p_set_pre_state(wdinfo, state) \ ++ _rtw_p2p_set_pre_state(wdinfo, state) ++#define rtw_p2p_set_role(wdinfo, role) _rtw_p2p_set_role(wdinfo, role) ++ ++#define rtw_p2p_state(wdinfo) _rtw_p2p_state(wdinfo) ++#define rtw_p2p_pre_state(wdinfo) _rtw_p2p_pre_state(wdinfo) ++#define rtw_p2p_role(wdinfo) _rtw_p2p_role(wdinfo) ++#define rtw_p2p_chk_state(wdinfo, state) _rtw_p2p_chk_state(wdinfo, state) ++#define rtw_p2p_chk_role(wdinfo, role) _rtw_p2p_chk_role(wdinfo, role) ++ ++#define rtw_p2p_findphase_ex_set(wdinfo, value) \ ++ ((wdinfo)->find_phase_state_exchange_cnt = (value)) ++ ++/* is this find phase exchange for social channel scan? */ ++#define rtw_p2p_findphase_ex_is_social(wdinfo) \ ++((wdinfo)->find_phase_state_exchange_cnt >= P2P_FINDPHASE_EX_SOCIAL_FIRST) ++ ++/* should we need find phase exchange anymore? */ ++#define rtw_p2p_findphase_ex_is_needed(wdinfo) \ ++ ((wdinfo)->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_MAX && \ ++ (wdinfo)->find_phase_state_exchange_cnt != P2P_FINDPHASE_EX_NONE) ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_pwrctrl.h b/drivers/staging/r8188eu/include/rtw_pwrctrl.h +new file mode 100644 +index 000000000000..543f928e8089 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_pwrctrl.h +@@ -0,0 +1,266 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef __RTW_PWRCTRL_H_ ++#define __RTW_PWRCTRL_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define FW_PWR0 0 ++#define FW_PWR1 1 ++#define FW_PWR2 2 ++#define FW_PWR3 3 ++#define HW_PWR0 7 ++#define HW_PWR1 6 ++#define HW_PWR2 2 ++#define HW_PWR3 0 ++#define HW_PWR4 8 ++ ++#define FW_PWRMSK 0x7 ++ ++#define XMIT_ALIVE BIT(0) ++#define RECV_ALIVE BIT(1) ++#define CMD_ALIVE BIT(2) ++#define EVT_ALIVE BIT(3) ++ ++enum power_mgnt { ++ PS_MODE_ACTIVE = 0, ++ PS_MODE_MIN, ++ PS_MODE_MAX, ++ PS_MODE_DTIM, ++ PS_MODE_VOIP, ++ PS_MODE_UAPSD_WMM, ++ PS_MODE_UAPSD, ++ PS_MODE_IBSS, ++ PS_MODE_WWLAN, ++ PM_Radio_Off, ++ PM_Card_Disable, ++ PS_MODE_NUM ++}; ++ ++/* ++ BIT[2:0] = HW state ++ BIT[3] = Protocol PS state, 0: register active state, ++ 1: register sleep state ++ BIT[4] = sub-state ++*/ ++ ++#define PS_DPS BIT(0) ++#define PS_LCLK (PS_DPS) ++#define PS_RF_OFF BIT(1) ++#define PS_ALL_ON BIT(2) ++#define PS_ST_ACTIVE BIT(3) ++ ++#define PS_ISR_ENABLE BIT(4) ++#define PS_IMR_ENABLE BIT(5) ++#define PS_ACK BIT(6) ++#define PS_TOGGLE BIT(7) ++ ++#define PS_STATE_MASK (0x0F) ++#define PS_STATE_HW_MASK (0x07) ++#define PS_SEQ_MASK (0xc0) ++ ++#define PS_STATE(x) (PS_STATE_MASK & (x)) ++#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x)) ++#define PS_SEQ(x) (PS_SEQ_MASK & (x)) ++ ++#define PS_STATE_S0 (PS_DPS) ++#define PS_STATE_S1 (PS_LCLK) ++#define PS_STATE_S2 (PS_RF_OFF) ++#define PS_STATE_S3 (PS_ALL_ON) ++#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON)) ++ ++#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON)) ++#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE)) ++#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0))) ++ ++struct reportpwrstate_parm { ++ unsigned char mode; ++ unsigned char state; /* the CPWM value */ ++ unsigned short rsvd; ++}; ++ ++static inline void _init_pwrlock(struct semaphore *plock) ++{ ++ sema_init(plock, 1); ++} ++ ++static inline void _free_pwrlock(struct semaphore *plock) ++{ ++} ++ ++static inline void _enter_pwrlock(struct semaphore *plock) ++{ ++ _rtw_down_sema(plock); ++} ++ ++static inline void _exit_pwrlock(struct semaphore *plock) ++{ ++ up(plock); ++} ++ ++#define LPS_DELAY_TIME 1*HZ /* 1 sec */ ++ ++#define EXE_PWR_NONE 0x01 ++#define EXE_PWR_IPS 0x02 ++#define EXE_PWR_LPS 0x04 ++ ++/* RF state. */ ++enum rt_rf_power_state { ++ rf_on, /* RF is on after RFSleep or RFOff */ ++ rf_sleep, /* 802.11 Power Save mode */ ++ rf_off, /* HW/SW Radio OFF or Inactive Power Save */ ++ /* Add the new RF state above this line===== */ ++ rf_max ++}; ++ ++/* RF Off Level for IPS or HW/SW radio off */ ++#define RT_RF_OFF_LEVL_ASPM BIT(0) /* PCI ASPM */ ++#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) /* PCI clock request */ ++#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) /* PCI D3 mode */ ++#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) /* NIC halt, re-init hw param*/ ++#define RT_RF_OFF_LEVL_FREE_FW BIT(4) /* FW free, re-download the FW*/ ++#define RT_RF_OFF_LEVL_FW_32K BIT(5) /* FW in 32k */ ++#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) /* Always enable ASPM and Clock ++ * Req in initialization. */ ++#define RT_RF_LPS_DISALBE_2R BIT(30) /* When LPS is on, disable 2R ++ * if no packet is RX or TX. */ ++#define RT_RF_LPS_LEVEL_ASPM BIT(31) /* LPS with ASPM */ ++ ++#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) \ ++ ((ppsc->cur_ps_level & _PS_FLAG) ? true : false) ++#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) \ ++ (ppsc->cur_ps_level &= (~(_PS_FLAG))) ++#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) \ ++ (ppsc->cur_ps_level |= _PS_FLAG) ++ ++enum _PS_BBRegBackup_ { ++ PSBBREG_RF0 = 0, ++ PSBBREG_RF1, ++ PSBBREG_RF2, ++ PSBBREG_AFE0, ++ PSBBREG_TOTALCNT ++}; ++ ++enum { /* for ips_mode */ ++ IPS_NONE = 0, ++ IPS_NORMAL, ++ IPS_LEVEL_2, ++}; ++ ++struct pwrctrl_priv { ++ struct semaphore lock; ++ volatile u8 rpwm; /* requested power state for fw */ ++ volatile u8 cpwm; /* fw current power state. updated when ++ * 1. read from HCPWM 2. driver lowers power level */ ++ volatile u8 tog; /* toggling */ ++ volatile u8 cpwm_tog; /* toggling */ ++ ++ u8 pwr_mode; ++ u8 smart_ps; ++ u8 bcn_ant_mode; ++ ++ u32 alives; ++ struct work_struct cpwm_event; ++ u8 bpower_saving; ++ ++ u8 b_hw_radio_off; ++ u8 reg_rfoff; ++ u8 reg_pdnmode; /* powerdown mode */ ++ u32 rfoff_reason; ++ ++ /* RF OFF Level */ ++ u32 cur_ps_level; ++ u32 reg_rfps_level; ++ uint ips_enter_cnts; ++ uint ips_leave_cnts; ++ ++ u8 ips_mode; ++ u8 ips_mode_req; /* used to accept the mode setting request, ++ * will update to ipsmode later */ ++ uint bips_processing; ++ u32 ips_deny_time; /* will deny IPS when system time less than this */ ++ u8 ps_processing; /* temp used to mark whether in rtw_ps_processor */ ++ ++ u8 bLeisurePs; ++ u8 LpsIdleCount; ++ u8 power_mgnt; ++ u8 bFwCurrentInPSMode; ++ u32 DelayLPSLastTimeStamp; ++ u8 btcoex_rfon; ++ s32 pnp_current_pwr_state; ++ u8 pnp_bstop_trx; ++ ++ u8 bInternalAutoSuspend; ++ u8 bInSuspend; ++#ifdef CONFIG_BT_COEXIST ++ u8 bAutoResume; ++ u8 autopm_cnt; ++#endif ++ u8 bSupportRemoteWakeup; ++ struct timer_list pwr_state_check_timer; ++ int pwr_state_check_interval; ++ u8 pwr_state_check_cnts; ++ ++ int ps_flag; ++ ++ enum rt_rf_power_state rf_pwrstate;/* cur power state */ ++ enum rt_rf_power_state change_rfpwrstate; ++ ++ u8 wepkeymask; ++ u8 bHWPowerdown;/* if support hw power down */ ++ u8 bHWPwrPindetect; ++ u8 bkeepfwalive; ++ u8 brfoffbyhw; ++ unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT]; ++}; ++ ++#define rtw_get_ips_mode_req(pwrctrlpriv) \ ++ (pwrctrlpriv)->ips_mode_req ++ ++#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ ++ ((pwrctrlpriv)->ips_mode_req = (ips_mode)) ++ ++#define RTW_PWR_STATE_CHK_INTERVAL 2000 ++ ++#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ ++ do { \ ++ _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ ++ } while (0) ++ ++#define rtw_set_pwr_state_check_timer(pwrctrl) \ ++ _rtw_set_pwr_state_check_timer((pwrctrl), \ ++ (pwrctrl)->pwr_state_check_interval) ++ ++void rtw_init_pwrctrl_priv(struct adapter *adapter); ++void rtw_free_pwrctrl_priv(struct adapter *adapter); ++ ++void rtw_set_ps_mode(struct adapter *adapter, u8 ps_mode, u8 smart_ps, ++ u8 bcn_ant_mode); ++void rtw_set_rpwm(struct adapter *adapter, u8 val8); ++void LeaveAllPowerSaveMode(struct adapter *adapter); ++void ips_enter(struct adapter *padapter); ++int ips_leave(struct adapter *padapter); ++ ++void rtw_ps_processor(struct adapter *padapter); ++ ++enum rt_rf_power_state RfOnOffDetect(struct adapter *iadapter); ++ ++s32 LPS_RF_ON_check(struct adapter *adapter, u32 delay_ms); ++void LPS_Enter(struct adapter *adapter); ++void LPS_Leave(struct adapter *adapter); ++ ++u8 rtw_interface_ps_func(struct adapter *adapter, ++ enum hal_intf_ps_func efunc_id, u8 *val); ++void rtw_set_ips_deny(struct adapter *adapter, u32 ms); ++int _rtw_pwr_wakeup(struct adapter *adapter, u32 ips_defer_ms, ++ const char *caller); ++#define rtw_pwr_wakeup(adapter) \ ++ _rtw_pwr_wakeup(adapter, RTW_PWR_STATE_CHK_INTERVAL, __func__) ++#define rtw_pwr_wakeup_ex(adapter, ips_deffer_ms) \ ++ _rtw_pwr_wakeup(adapter, ips_deffer_ms, __func__) ++int rtw_pm_set_ips(struct adapter *adapter, u8 mode); ++int rtw_pm_set_lps(struct adapter *adapter, u8 mode); ++ ++#endif /* __RTL871X_PWRCTRL_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_recv.h b/drivers/staging/r8188eu/include/rtw_recv.h +new file mode 100644 +index 000000000000..d1d1ca0e56d6 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_recv.h +@@ -0,0 +1,413 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef _RTW_RECV_H_ ++#define _RTW_RECV_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define NR_RECVFRAME 256 ++ ++#define RXFRAME_ALIGN 8 ++#define RXFRAME_ALIGN_SZ (1<signal_stat_timer, \ ++ (recvpriv)->signal_stat_sampling_interval) ++ ++struct sta_recv_priv { ++ spinlock_t lock; ++ int option; ++ struct __queue defrag_q; /* keeping the fragment frame until defrag */ ++ struct stainfo_rxcache rxcache; ++}; ++ ++struct recv_buf { ++ struct list_head list; ++ spinlock_t recvbuf_lock; ++ u32 ref_cnt; ++ struct adapter *adapter; ++ u8 *pbuf; ++ u8 *pallocated_buf; ++ u32 len; ++ u8 *phead; ++ u8 *pdata; ++ u8 *ptail; ++ u8 *pend; ++ struct urb *purb; ++ dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ ++ u32 alloc_sz; ++ u8 irp_pending; ++ int transfer_len; ++ struct sk_buff *pskb; ++ u8 reuse; ++}; ++ ++/* ++ head -----> ++ ++ data -----> ++ ++ payload ++ ++ tail -----> ++ ++ end -----> ++ ++ len = (unsigned int )(tail - data); ++ ++*/ ++struct recv_frame { ++ struct list_head list; ++ struct sk_buff *pkt; ++ struct sk_buff *pkt_newalloc; ++ struct adapter *adapter; ++ u8 fragcnt; ++ int frame_tag; ++ struct rx_pkt_attrib attrib; ++ uint len; ++ u8 *rx_head; ++ u8 *rx_data; ++ u8 *rx_tail; ++ u8 *rx_end; ++ void *precvbuf; ++ struct sta_info *psta; ++ /* for A-MPDU Rx reordering buffer control */ ++ struct recv_reorder_ctrl *preorder_ctrl; ++}; ++ ++struct recv_frame *_rtw_alloc_recvframe(struct __queue *pfree_recv_queue); ++struct recv_frame *rtw_alloc_recvframe(struct __queue *pfree_recv_queue); ++void rtw_init_recvframe(struct recv_frame *precvframe, ++ struct recv_priv *precvpriv); ++int rtw_free_recvframe(struct recv_frame *precvframe, ++ struct __queue *pfree_recv_queue); ++#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue) ++int _rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue); ++int rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue); ++void rtw_free_recvframe_queue(struct __queue *pframequeue, ++ struct __queue *pfree_recv_queue); ++u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter); ++int rtw_enqueue_recvbuf_to_head(struct recv_buf *buf, struct __queue *queue); ++int rtw_enqueue_recvbuf(struct recv_buf *precvbuf, struct __queue *queue); ++struct recv_buf *rtw_dequeue_recvbuf(struct __queue *queue); ++ ++void rtw_reordering_ctrl_timeout_handler(void *pcontext); ++ ++static inline u8 *get_rxmem(struct recv_frame *precvframe) ++{ ++ /* always return rx_head... */ ++ if (precvframe == NULL) ++ return NULL; ++ return precvframe->rx_head; ++} ++ ++static inline u8 *get_rx_status(struct recv_frame *precvframe) ++{ ++ return get_rxmem(precvframe); ++} ++ ++static inline u8 *get_recvframe_data(struct recv_frame *precvframe) ++{ ++ /* always return rx_data */ ++ if (precvframe == NULL) ++ return NULL; ++ ++ return precvframe->rx_data; ++} ++ ++static inline u8 *recvframe_push(struct recv_frame *precvframe, int sz) ++{ ++ /* append data before rx_data */ ++ ++ /* add data to the start of recv_frame ++ * ++ * This function extends the used data area of the recv_frame at the buffer ++ * start. rx_data must be still larger than rx_head, after pushing. ++ */ ++ if (precvframe == NULL) ++ return NULL; ++ precvframe->rx_data -= sz ; ++ if (precvframe->rx_data < precvframe->rx_head) { ++ precvframe->rx_data += sz; ++ return NULL; ++ } ++ precvframe->len += sz; ++ return precvframe->rx_data; ++} ++ ++static inline u8 *recvframe_pull(struct recv_frame *precvframe, int sz) ++{ ++ /* rx_data += sz; move rx_data sz bytes hereafter */ ++ ++ /* used for extract sz bytes from rx_data, update rx_data and return ++ * the updated rx_data to the caller */ ++ ++ if (precvframe == NULL) ++ return NULL; ++ precvframe->rx_data += sz; ++ if (precvframe->rx_data > precvframe->rx_tail) { ++ precvframe->rx_data -= sz; ++ return NULL; ++ } ++ precvframe->len -= sz; ++ return precvframe->rx_data; ++} ++ ++static inline u8 *recvframe_put(struct recv_frame *precvframe, int sz) ++{ ++ /* used for append sz bytes from ptr to rx_tail, update rx_tail ++ * and return the updated rx_tail to the caller */ ++ /* after putting, rx_tail must be still larger than rx_end. */ ++ ++ if (precvframe == NULL) ++ return NULL; ++ ++ precvframe->rx_tail += sz; ++ ++ if (precvframe->rx_tail > precvframe->rx_end) { ++ precvframe->rx_tail -= sz; ++ return NULL; ++ } ++ precvframe->len += sz; ++ return precvframe->rx_tail; ++} ++ ++static inline u8 *recvframe_pull_tail(struct recv_frame *precvframe, int sz) ++{ ++ /* rmv data from rx_tail (by yitsen) */ ++ ++ /* used for extract sz bytes from rx_end, update rx_end and return ++ * the updated rx_end to the caller */ ++ /* after pulling, rx_end must be still larger than rx_data. */ ++ ++ if (precvframe == NULL) ++ return NULL; ++ precvframe->rx_tail -= sz; ++ if (precvframe->rx_tail < precvframe->rx_data) { ++ precvframe->rx_tail += sz; ++ return NULL; ++ } ++ precvframe->len -= sz; ++ return precvframe->rx_tail; ++} ++ ++static inline int get_recvframe_len(struct recv_frame *precvframe) ++{ ++ return precvframe->len; ++} ++ ++static inline s32 translate_percentage_to_dbm(u32 sig_stren_index) ++{ ++ s32 power; /* in dBm. */ ++ ++ /* Translate to dBm (x=0.5y-95). */ ++ power = (s32)((sig_stren_index + 1) >> 1); ++ power -= 95; ++ ++ return power; ++} ++ ++struct sta_info; ++ ++void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); ++ ++void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_rf.h b/drivers/staging/r8188eu/include/rtw_rf.h +new file mode 100644 +index 000000000000..48129da9c93f +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_rf.h +@@ -0,0 +1,126 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_RF_H_ ++#define __RTW_RF_H_ ++ ++#include "rtw_cmd.h" ++ ++#define OFDM_PHY 1 ++#define MIXED_PHY 2 ++#define CCK_PHY 3 ++ ++#define NumRates (13) ++ ++/* slot time for 11g */ ++#define SHORT_SLOT_TIME 9 ++#define NON_SHORT_SLOT_TIME 20 ++ ++#define RTL8711_RF_MAX_SENS 6 ++#define RTL8711_RF_DEF_SENS 4 ++ ++/* We now define the following channels as the max channels in each ++ * channel plan. */ ++/* 2G, total 14 chnls */ ++/* {1,2,3,4,5,6,7,8,9,10,11,12,13,14} */ ++#define MAX_CHANNEL_NUM_2G 14 ++#define MAX_CHANNEL_NUM 14 /* 2.4 GHz only */ ++ ++#define NUM_REGULATORYS 1 ++ ++/* Country codes */ ++#define USA 0x555320 ++#define EUROPE 0x1 /* temp, should be provided later */ ++#define JAPAN 0x2 /* temp, should be provided later */ ++ ++struct regulatory_class { ++ u32 starting_freq; /* MHz, */ ++ u8 channel_set[MAX_CHANNEL_NUM]; ++ u8 channel_cck_power[MAX_CHANNEL_NUM]; /* dbm */ ++ u8 channel_ofdm_power[MAX_CHANNEL_NUM]; /* dbm */ ++ u8 txpower_limit; /* dbm */ ++ u8 channel_spacing; /* MHz */ ++ u8 modem; ++}; ++ ++enum capability { ++ cESS = 0x0001, ++ cIBSS = 0x0002, ++ cPollable = 0x0004, ++ cPollReq = 0x0008, ++ cPrivacy = 0x0010, ++ cShortPreamble = 0x0020, ++ cPBCC = 0x0040, ++ cChannelAgility = 0x0080, ++ cSpectrumMgnt = 0x0100, ++ cQos = 0x0200, /* For HCCA, use with CF-Pollable ++ * and CF-PollReq */ ++ cShortSlotTime = 0x0400, ++ cAPSD = 0x0800, ++ cRM = 0x1000, /* RRM (Radio Request Measurement) */ ++ cDSSS_OFDM = 0x2000, ++ cDelayedBA = 0x4000, ++ cImmediateBA = 0x8000, ++}; ++ ++enum _REG_PREAMBLE_MODE { ++ PREAMBLE_LONG = 1, ++ PREAMBLE_AUTO = 2, ++ PREAMBLE_SHORT = 3, ++}; ++ ++enum _RTL8712_RF_MIMO_CONFIG_ { ++ RTL8712_RFCONFIG_1T = 0x10, ++ RTL8712_RFCONFIG_2T = 0x20, ++ RTL8712_RFCONFIG_1R = 0x01, ++ RTL8712_RFCONFIG_2R = 0x02, ++ RTL8712_RFCONFIG_1T1R = 0x11, ++ RTL8712_RFCONFIG_1T2R = 0x12, ++ RTL8712_RFCONFIG_TURBO = 0x92, ++ RTL8712_RFCONFIG_2T2R = 0x22 ++}; ++ ++enum rf90_radio_path { ++ RF90_PATH_A = 0, /* Radio Path A */ ++ RF90_PATH_B = 1, /* Radio Path B */ ++ RF90_PATH_C = 2, /* Radio Path C */ ++ RF90_PATH_D = 3 /* Radio Path D */ ++}; ++ ++/* Bandwidth Offset */ ++#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 ++#define HAL_PRIME_CHNL_OFFSET_LOWER 1 ++#define HAL_PRIME_CHNL_OFFSET_UPPER 2 ++ ++/* Represent Channel Width in HT Capabilities */ ++/* */ ++enum ht_channel_width { ++ HT_CHANNEL_WIDTH_20 = 0, ++ HT_CHANNEL_WIDTH_40 = 1, ++}; ++ ++/* */ ++/* Represent Extension Channel Offset in HT Capabilities */ ++/* This is available only in 40Mhz mode. */ ++/* */ ++enum ht_extchnl_offset { ++ HT_EXTCHNL_OFFSET_NO_EXT = 0, ++ HT_EXTCHNL_OFFSET_UPPER = 1, ++ HT_EXTCHNL_OFFSET_NO_DEF = 2, ++ HT_EXTCHNL_OFFSET_LOWER = 3, ++}; ++ ++/* 2007/11/15 MH Define different RF type. */ ++enum rt_rf_type_def { ++ RF_1T2R = 0, ++ RF_2T4R = 1, ++ RF_2T2R = 2, ++ RF_1T1R = 3, ++ RF_2T2R_GREEN = 4, ++ RF_819X_MAX_TYPE = 5, ++}; ++ ++u32 rtw_ch2freq(u32 ch); ++u32 rtw_freq2ch(u32 freq); ++ ++#endif /* _RTL8711_RF_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_security.h b/drivers/staging/r8188eu/include/rtw_security.h +new file mode 100644 +index 000000000000..ec6ecdb7bc98 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_security.h +@@ -0,0 +1,341 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __RTW_SECURITY_H_ ++#define __RTW_SECURITY_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define _NO_PRIVACY_ 0x0 ++#define _WEP40_ 0x1 ++#define _TKIP_ 0x2 ++#define _TKIP_WTMIC_ 0x3 ++#define _AES_ 0x4 ++#define _WEP104_ 0x5 ++#define _WEP_WPA_MIXED_ 0x07 /* WEP + WPA */ ++#define _SMS4_ 0x06 ++ ++#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_)) ++ ++#define _WPA_IE_ID_ 0xdd ++#define _WPA2_IE_ID_ 0x30 ++ ++#define SHA256_MAC_LEN 32 ++#define AES_BLOCK_SIZE 16 ++#define AES_PRIV_SIZE (4 * 44) ++ ++enum { ++ ENCRYP_PROTOCOL_OPENSYS, /* open system */ ++ ENCRYP_PROTOCOL_WEP, /* WEP */ ++ ENCRYP_PROTOCOL_WPA, /* WPA */ ++ ENCRYP_PROTOCOL_WPA2, /* WPA2 */ ++ ENCRYP_PROTOCOL_WAPI, /* WAPI: Not support in this version */ ++ ENCRYP_PROTOCOL_MAX ++}; ++ ++#ifndef Ndis802_11AuthModeWPA2 ++#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1) ++#endif ++ ++#ifndef Ndis802_11AuthModeWPA2PSK ++#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2) ++#endif ++ ++union pn48 { ++ u64 val; ++ ++#ifdef __LITTLE_ENDIAN ++ struct { ++ u8 TSC0; ++ u8 TSC1; ++ u8 TSC2; ++ u8 TSC3; ++ u8 TSC4; ++ u8 TSC5; ++ u8 TSC6; ++ u8 TSC7; ++ } _byte_; ++ ++#elif defined(__BIG_ENDIAN) ++ ++ struct { ++ u8 TSC7; ++ u8 TSC6; ++ u8 TSC5; ++ u8 TSC4; ++ u8 TSC3; ++ u8 TSC2; ++ u8 TSC1; ++ u8 TSC0; ++ } _byte_; ++#endif ++}; ++ ++union Keytype { ++ u8 skey[16]; ++ u32 lkey[4]; ++}; ++ ++struct rt_pmkid_list { ++ u8 bUsed; ++ u8 Bssid[6]; ++ u8 PMKID[16]; ++ u8 SsidBuf[33]; ++ u8 *ssid_octet; ++ u16 ssid_length; ++}; ++ ++struct security_priv { ++ u32 dot11AuthAlgrthm; /* 802.11 auth, could be open, ++ * shared, 8021x and authswitch */ ++ u32 dot11PrivacyAlgrthm; /* This specify the privacy for ++ * shared auth. algorithm. */ ++ /* WEP */ ++ u32 dot11PrivacyKeyIndex; /* this is only valid for legendary ++ * wep, 0~3 for key id.(tx key index) */ ++ union Keytype dot11DefKey[4]; /* this is only valid for def. key */ ++ u32 dot11DefKeylen[4]; ++ u32 dot118021XGrpPrivacy; /* This specify the privacy algthm. ++ * used for Grp key */ ++ u32 dot118021XGrpKeyid; /* key id used for Grp Key ++ * ( tx key index) */ ++ union Keytype dot118021XGrpKey[4]; /* 802.1x Group Key, ++ * for inx0 and inx1 */ ++ union Keytype dot118021XGrptxmickey[4]; ++ union Keytype dot118021XGrprxmickey[4]; ++ union pn48 dot11Grptxpn; /* PN48 used for Grp Key xmit.*/ ++ union pn48 dot11Grprxpn; /* PN48 used for Grp Key recv.*/ ++#ifdef CONFIG_88EU_AP_MODE ++ /* extend security capabilities for AP_MODE */ ++ unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */ ++ unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */ ++ unsigned int wpa_group_cipher; ++ unsigned int wpa2_group_cipher; ++ unsigned int wpa_pairwise_cipher; ++ unsigned int wpa2_pairwise_cipher; ++#endif ++ u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */ ++ int wps_ie_len; ++ u8 binstallGrpkey; ++ u8 busetkipkey; ++ u8 bcheck_grpkey; ++ u8 bgrpkey_handshake; ++ s32 sw_encrypt;/* from registry_priv */ ++ s32 sw_decrypt;/* from registry_priv */ ++ s32 hw_decrypted;/* if the rx packets is hw_decrypted==false,i ++ * it means the hw has not been ready. */ ++ ++ /* keeps the auth_type & enc_status from upper layer ++ * ioctl(wpa_supplicant or wzc) */ ++ u32 ndisauthtype; /* NDIS_802_11_AUTHENTICATION_MODE */ ++ u32 ndisencryptstatus; /* NDIS_802_11_ENCRYPTION_STATUS */ ++ struct wlan_bssid_ex sec_bss; /* for joinbss (h2c buffer) usage */ ++ struct ndis_802_11_wep ndiswep; ++ u8 assoc_info[600]; ++ u8 szofcapability[256]; /* for wpa2 usage */ ++ u8 oidassociation[512]; /* for wpa/wpa2 usage */ ++ u8 authenticator_ie[256]; /* store ap security information element */ ++ u8 supplicant_ie[256]; /* store sta security information element */ ++ ++ /* for tkip countermeasure */ ++ u32 last_mic_err_time; ++ u8 btkip_countermeasure; ++ u8 btkip_wait_report; ++ u32 btkip_countermeasure_time; ++ ++ /* */ ++ /* For WPA2 Pre-Authentication. */ ++ /* */ ++ struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE]; ++ u8 PMKIDIndex; ++ u8 bWepDefaultKeyIdxSet; ++}; ++ ++#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst) \ ++do { \ ++ switch (psecuritypriv->dot11AuthAlgrthm) { \ ++ case dot11AuthAlgrthm_Open: \ ++ case dot11AuthAlgrthm_Shared: \ ++ case dot11AuthAlgrthm_Auto: \ ++ encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm; \ ++ break; \ ++ case dot11AuthAlgrthm_8021X: \ ++ if (bmcst) \ ++ encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\ ++ else \ ++ encry_algo = (u8)psta->dot118021XPrivacy; \ ++ break; \ ++ case dot11AuthAlgrthm_WAPI: \ ++ encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm; \ ++ break; \ ++ } \ ++} while (0) ++ ++#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt) \ ++do { \ ++ switch (encrypt) { \ ++ case _WEP40_: \ ++ case _WEP104_: \ ++ iv_len = 4; \ ++ icv_len = 4; \ ++ break; \ ++ case _TKIP_: \ ++ iv_len = 8; \ ++ icv_len = 4; \ ++ break; \ ++ case _AES_: \ ++ iv_len = 8; \ ++ icv_len = 8; \ ++ break; \ ++ case _SMS4_: \ ++ iv_len = 18; \ ++ icv_len = 16; \ ++ break; \ ++ default: \ ++ iv_len = 0; \ ++ icv_len = 0; \ ++ break; \ ++ } \ ++} while (0) ++ ++#define GET_TKIP_PN(iv, dot11txpn) \ ++do { \ ++ dot11txpn._byte_.TSC0 = iv[2]; \ ++ dot11txpn._byte_.TSC1 = iv[0]; \ ++ dot11txpn._byte_.TSC2 = iv[4]; \ ++ dot11txpn._byte_.TSC3 = iv[5]; \ ++ dot11txpn._byte_.TSC4 = iv[6]; \ ++ dot11txpn._byte_.TSC5 = iv[7]; \ ++} while (0) ++ ++#define ROL32(A, n) (((A) << (n)) | (((A)>>(32-(n))) & ((1UL << (n)) - 1))) ++#define ROR32(A, n) ROL32((A), 32-(n)) ++ ++struct mic_data { ++ u32 K0, K1; /* Key */ ++ u32 L, R; /* Current state */ ++ u32 M; /* Message accumulator (single word) */ ++ u32 nBytesInM; /* # bytes in M */ ++}; ++ ++extern const u32 Te0[256]; ++extern const u32 Te1[256]; ++extern const u32 Te2[256]; ++extern const u32 Te3[256]; ++extern const u32 Te4[256]; ++extern const u32 Td0[256]; ++extern const u32 Td1[256]; ++extern const u32 Td2[256]; ++extern const u32 Td3[256]; ++extern const u32 Td4[256]; ++extern const u32 rcon[10]; ++extern const u8 Td4s[256]; ++extern const u8 rcons[10]; ++ ++#define RCON(i) (rcons[(i)] << 24) ++ ++static inline u32 rotr(u32 val, int bits) ++{ ++ return (val >> bits) | (val << (32 - bits)); ++} ++ ++#define TE0(i) Te0[((i) >> 24) & 0xff] ++#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) ++#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) ++#define TE3(i) rotr(Te0[(i) & 0xff], 24) ++#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) ++#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) ++#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) ++#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) ++#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) ++#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) ++#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) ++#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) ++#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) ++ ++#define TD0(i) Td0[((i) >> 24) & 0xff] ++#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) ++#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) ++#define TD3(i) rotr(Td0[(i) & 0xff], 24) ++#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) ++#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) ++#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) ++#define TD44(i) (Td4s[(i) & 0xff]) ++#define TD0_(i) Td0[(i) & 0xff] ++#define TD1_(i) rotr(Td0[(i) & 0xff], 8) ++#define TD2_(i) rotr(Td0[(i) & 0xff], 16) ++#define TD3_(i) rotr(Td0[(i) & 0xff], 24) ++ ++#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ ++ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) ++ ++#define PUTU32(ct, st) { \ ++(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ ++(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } ++ ++#define WPA_GET_BE32(a) ((((u32)(a)[0]) << 24) | (((u32)(a)[1]) << 16) | \ ++ (((u32)(a)[2]) << 8) | ((u32)(a)[3])) ++ ++#define WPA_PUT_LE16(a, val) \ ++ do { \ ++ (a)[1] = ((u16)(val)) >> 8; \ ++ (a)[0] = ((u16)(val)) & 0xff; \ ++ } while (0) ++ ++#define WPA_PUT_BE32(a, val) \ ++ do { \ ++ (a)[0] = (u8)((((u32)(val)) >> 24) & 0xff); \ ++ (a)[1] = (u8)((((u32)(val)) >> 16) & 0xff); \ ++ (a)[2] = (u8)((((u32)(val)) >> 8) & 0xff); \ ++ (a)[3] = (u8)(((u32)(val)) & 0xff); \ ++ } while (0) ++ ++#define WPA_PUT_BE64(a, val) \ ++ do { \ ++ (a)[0] = (u8)(((u64)(val)) >> 56); \ ++ (a)[1] = (u8)(((u64)(val)) >> 48); \ ++ (a)[2] = (u8)(((u64)(val)) >> 40); \ ++ (a)[3] = (u8)(((u64)(val)) >> 32); \ ++ (a)[4] = (u8)(((u64)(val)) >> 24); \ ++ (a)[5] = (u8)(((u64)(val)) >> 16); \ ++ (a)[6] = (u8)(((u64)(val)) >> 8); \ ++ (a)[7] = (u8)(((u64)(val)) & 0xff); \ ++ } while (0) ++ ++/* ===== start - public domain SHA256 implementation ===== */ ++ ++/* This is based on SHA256 implementation in LibTomCrypt that was released into ++ * public domain by Tom St Denis. */ ++ ++/* Various logical functions */ ++#define RORc(x, y) \ ++ (((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \ ++ ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) ++#define Ch(x, y ,z) (z ^ (x & (y ^ z))) ++#define Maj(x, y, z) (((x | y) & z) | (x & y)) ++#define S(x, n) RORc((x), (n)) ++#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) ++#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) ++#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) ++#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) ++#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) ++#ifndef MIN ++#define MIN(x, y) (((x) < (y)) ? (x) : (y)) ++#endif ++ ++void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key); ++void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b); ++void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes); ++void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst); ++void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, ++ u8 *Miccode, u8 priority); ++u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe); ++u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe); ++void rtw_wep_encrypt(struct adapter *padapter, u8 *pxmitframe); ++u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe); ++u32 rtw_tkip_decrypt(struct adapter *padapter, u8 *precvframe); ++void rtw_wep_decrypt(struct adapter *padapter, u8 *precvframe); ++void rtw_use_tkipkey_handler(void *FunctionContext); ++ ++#endif /* __RTL871X_SECURITY_H_ */ +diff --git a/drivers/staging/r8188eu/include/rtw_sreset.h b/drivers/staging/r8188eu/include/rtw_sreset.h +new file mode 100644 +index 000000000000..4e97997c305b +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_sreset.h +@@ -0,0 +1,34 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef _RTW_SRESET_C_ ++#define _RTW_SRESET_C_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++struct sreset_priv { ++ struct mutex silentreset_mutex; ++ u8 silent_reset_inprogress; ++ u8 wifi_error_status; ++ unsigned long last_tx_time; ++ unsigned long last_tx_complete_time; ++}; ++ ++#include "rtl8188e_hal.h" ++ ++#define WIFI_STATUS_SUCCESS 0 ++#define USB_VEN_REQ_CMD_FAIL BIT(0) ++#define USB_READ_PORT_FAIL BIT(1) ++#define USB_WRITE_PORT_FAIL BIT(2) ++#define WIFI_MAC_TXDMA_ERROR BIT(3) ++#define WIFI_TX_HANG BIT(4) ++#define WIFI_RX_HANG BIT(5) ++#define WIFI_IF_NOT_EXIST BIT(6) ++ ++void sreset_init_value(struct adapter *padapter); ++void sreset_reset_value(struct adapter *padapter); ++u8 sreset_get_wifi_status(struct adapter *padapter); ++void sreset_set_wifi_error_status(struct adapter *padapter, u32 status); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/rtw_xmit.h b/drivers/staging/r8188eu/include/rtw_xmit.h +new file mode 100644 +index 000000000000..5f6e2402e5c4 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/rtw_xmit.h +@@ -0,0 +1,367 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _RTW_XMIT_H_ ++#define _RTW_XMIT_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++#define MAX_XMITBUF_SZ (20480) /* 20k */ ++#define NR_XMITBUFF (4) ++ ++#define XMITBUF_ALIGN_SZ 4 ++ ++/* xmit extension buff defination */ ++#define MAX_XMIT_EXTBUF_SZ (1536) ++#define NR_XMIT_EXTBUFF (32) ++ ++#define MAX_NUMBLKS (1) ++ ++#define XMIT_VO_QUEUE (0) ++#define XMIT_VI_QUEUE (1) ++#define XMIT_BE_QUEUE (2) ++#define XMIT_BK_QUEUE (3) ++ ++#define VO_QUEUE_INX 0 ++#define VI_QUEUE_INX 1 ++#define BE_QUEUE_INX 2 ++#define BK_QUEUE_INX 3 ++#define BCN_QUEUE_INX 4 ++#define MGT_QUEUE_INX 5 ++#define HIGH_QUEUE_INX 6 ++#define TXCMD_QUEUE_INX 7 ++ ++#define HW_QUEUE_ENTRY 8 ++ ++#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\ ++do {\ ++ pattrib_iv[0] = dot11txpn._byte_.TSC0;\ ++ pattrib_iv[1] = dot11txpn._byte_.TSC1;\ ++ pattrib_iv[2] = dot11txpn._byte_.TSC2;\ ++ pattrib_iv[3] = ((keyidx & 0x3)<<6);\ ++ dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0 : (dot11txpn.val+1);\ ++} while (0) ++ ++#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\ ++do {\ ++ pattrib_iv[0] = dot11txpn._byte_.TSC1;\ ++ pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\ ++ pattrib_iv[2] = dot11txpn._byte_.TSC0;\ ++ pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ ++ pattrib_iv[4] = dot11txpn._byte_.TSC2;\ ++ pattrib_iv[5] = dot11txpn._byte_.TSC3;\ ++ pattrib_iv[6] = dot11txpn._byte_.TSC4;\ ++ pattrib_iv[7] = dot11txpn._byte_.TSC5;\ ++ dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0 : (dot11txpn.val+1);\ ++} while (0) ++ ++#define AES_IV(pattrib_iv, dot11txpn, keyidx)\ ++do { \ ++ pattrib_iv[0] = dot11txpn._byte_.TSC0; \ ++ pattrib_iv[1] = dot11txpn._byte_.TSC1; \ ++ pattrib_iv[2] = 0; \ ++ pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6); \ ++ pattrib_iv[4] = dot11txpn._byte_.TSC2; \ ++ pattrib_iv[5] = dot11txpn._byte_.TSC3; \ ++ pattrib_iv[6] = dot11txpn._byte_.TSC4; \ ++ pattrib_iv[7] = dot11txpn._byte_.TSC5; \ ++ dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0 : (dot11txpn.val+1);\ ++} while (0) ++ ++#define HWXMIT_ENTRY 4 ++ ++#define TXDESC_SIZE 32 ++ ++#define PACKET_OFFSET_SZ (8) ++#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ) ++ ++struct tx_desc { ++ /* DWORD 0 */ ++ __le32 txdw0; ++ __le32 txdw1; ++ __le32 txdw2; ++ __le32 txdw3; ++ __le32 txdw4; ++ __le32 txdw5; ++ __le32 txdw6; ++ __le32 txdw7; ++}; ++ ++union txdesc { ++ struct tx_desc txdesc; ++ unsigned int value[TXDESC_SIZE>>2]; ++}; ++ ++struct hw_xmit { ++ struct __queue *sta_queue; ++ int accnt; ++}; ++ ++/* reduce size */ ++struct pkt_attrib { ++ u8 type; ++ u8 subtype; ++ u8 bswenc; ++ u8 dhcp_pkt; ++ u16 ether_type; ++ u16 seqnum; ++ u16 pkt_hdrlen; /* the original 802.3 pkt header len */ ++ u16 hdrlen; /* the WLAN Header Len */ ++ u32 pktlen; /* the original 802.3 pkt raw_data len (not include ++ * ether_hdr data) */ ++ u32 last_txcmdsz; ++ u8 nr_frags; ++ u8 encrypt; /* when 0 indicate no encrypt. when non-zero, ++ * indicate the encrypt algorith */ ++ u8 iv_len; ++ u8 icv_len; ++ u8 iv[18]; ++ u8 icv[16]; ++ u8 priority; ++ u8 ack_policy; ++ u8 mac_id; ++ u8 vcs_mode; /* virtual carrier sense method */ ++ u8 dst[ETH_ALEN] __aligned(2); ++ u8 src[ETH_ALEN] __aligned(2); ++ u8 ta[ETH_ALEN] __aligned(2); ++ u8 ra[ETH_ALEN] __aligned(2); ++ u8 key_idx; ++ u8 qos_en; ++ u8 ht_en; ++ u8 raid;/* rate adpative id */ ++ u8 bwmode; ++ u8 ch_offset;/* PRIME_CHNL_OFFSET */ ++ u8 sgi;/* short GI */ ++ u8 ampdu_en;/* tx ampdu enable */ ++ u8 mdata;/* more data bit */ ++ u8 pctrl;/* per packet txdesc control enable */ ++ u8 triggered;/* for ap mode handling Power Saving sta */ ++ u8 qsel; ++ u8 eosp; ++ u8 rate; ++ u8 intel_proxim; ++ u8 retry_ctrl; ++ struct sta_info *psta; ++}; ++ ++#define WLANHDR_OFFSET 64 ++ ++#define NULL_FRAMETAG (0x0) ++#define DATA_FRAMETAG 0x01 ++#define L2_FRAMETAG 0x02 ++#define MGNT_FRAMETAG 0x03 ++#define AMSDU_FRAMETAG 0x04 ++ ++#define EII_FRAMETAG 0x05 ++#define IEEE8023_FRAMETAG 0x06 ++ ++#define MP_FRAMETAG 0x07 ++ ++#define TXAGG_FRAMETAG 0x08 ++ ++struct submit_ctx { ++ u32 submit_time; /* */ ++ u32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */ ++ int status; /* status for operation */ ++ struct completion done; ++}; ++ ++enum { ++ RTW_SCTX_SUBMITTED = -1, ++ RTW_SCTX_DONE_SUCCESS = 0, ++ RTW_SCTX_DONE_UNKNOWN, ++ RTW_SCTX_DONE_TIMEOUT, ++ RTW_SCTX_DONE_BUF_ALLOC, ++ RTW_SCTX_DONE_BUF_FREE, ++ RTW_SCTX_DONE_WRITE_PORT_ERR, ++ RTW_SCTX_DONE_TX_DESC_NA, ++ RTW_SCTX_DONE_TX_DENY, ++ RTW_SCTX_DONE_CCX_PKT_FAIL, ++ RTW_SCTX_DONE_DRV_STOP, ++ RTW_SCTX_DONE_DEV_REMOVE, ++}; ++ ++void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms); ++int rtw_sctx_wait(struct submit_ctx *sctx); ++void rtw_sctx_done_err(struct submit_ctx **sctx, int status); ++void rtw_sctx_done(struct submit_ctx **sctx); ++ ++struct xmit_buf { ++ struct list_head list; ++ struct adapter *padapter; ++ u8 *pallocated_buf; ++ u8 *pbuf; ++ void *priv_data; ++ u16 ext_tag; /* 0: Normal xmitbuf, 1: extension xmitbuf. */ ++ u16 flags; ++ u32 alloc_sz; ++ u32 len; ++ struct submit_ctx *sctx; ++ u32 ff_hwaddr; ++ struct urb *pxmit_urb[8]; ++ dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ ++ u8 bpending[8]; ++ int last[8]; ++}; ++ ++struct xmit_frame { ++ struct list_head list; ++ struct pkt_attrib attrib; ++ struct sk_buff *pkt; ++ int frame_tag; ++ struct adapter *padapter; ++ u8 *buf_addr; ++ struct xmit_buf *pxmitbuf; ++ ++ u8 agg_num; ++ s8 pkt_offset; ++ u8 ack_report; ++}; ++ ++struct tx_servq { ++ struct list_head tx_pending; ++ struct __queue sta_pending; ++ int qcnt; ++}; ++ ++struct sta_xmit_priv { ++ spinlock_t lock; ++ int option; ++ int apsd_setting; /* When bit mask is on, the associated edca ++ * queue supports APSD. */ ++ struct tx_servq be_q; /* priority == 0,3 */ ++ struct tx_servq bk_q; /* priority == 1,2 */ ++ struct tx_servq vi_q; /* priority == 4,5 */ ++ struct tx_servq vo_q; /* priority == 6,7 */ ++ struct list_head legacy_dz; ++ struct list_head apsd; ++ u16 txseq_tid[16]; ++}; ++ ++struct hw_txqueue { ++ volatile int head; ++ volatile int tail; ++ volatile int free_sz; /* in units of 64 bytes */ ++ volatile int free_cmdsz; ++ volatile int txsz[8]; ++ uint ff_hwaddr; ++ uint cmd_hwaddr; ++ int ac_tag; ++}; ++ ++struct agg_pkt_info { ++ u16 offset; ++ u16 pkt_len; ++}; ++ ++struct xmit_priv { ++ spinlock_t lock; ++ struct semaphore xmit_sema; ++ struct semaphore terminate_xmitthread_sema; ++ struct __queue be_pending; ++ struct __queue bk_pending; ++ struct __queue vi_pending; ++ struct __queue vo_pending; ++ struct __queue bm_pending; ++ u8 *pallocated_frame_buf; ++ u8 *pxmit_frame_buf; ++ uint free_xmitframe_cnt; ++ struct __queue free_xmit_queue; ++ uint frag_len; ++ struct adapter *adapter; ++ u8 vcs_setting; ++ u8 vcs; ++ u8 vcs_type; ++ u64 tx_bytes; ++ u64 tx_pkts; ++ u64 tx_drop; ++ u64 last_tx_bytes; ++ u64 last_tx_pkts; ++ struct hw_xmit *hwxmits; ++ u8 hwxmit_entry; ++ u8 wmm_para_seq[4];/* sequence for wmm ac parameter strength ++ * from large to small. it's value is 0->vo, ++ * 1->vi, 2->be, 3->bk. */ ++ struct semaphore tx_retevt;/* all tx return event; */ ++ u8 txirp_cnt;/* */ ++ struct tasklet_struct xmit_tasklet; ++ /* per AC pending irp */ ++ int beq_cnt; ++ int bkq_cnt; ++ int viq_cnt; ++ int voq_cnt; ++ struct __queue free_xmitbuf_queue; ++ struct __queue pending_xmitbuf_queue; ++ u8 *pallocated_xmitbuf; ++ u8 *pxmitbuf; ++ uint free_xmitbuf_cnt; ++ struct __queue free_xmit_extbuf_queue; ++ u8 *pallocated_xmit_extbuf; ++ u8 *pxmit_extbuf; ++ uint free_xmit_extbuf_cnt; ++ u16 nqos_ssn; ++ int ack_tx; ++ struct mutex ack_tx_mutex; ++ struct submit_ctx ack_tx_ops; ++}; ++ ++struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv); ++s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, ++ struct xmit_buf *pxmitbuf); ++struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv); ++s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, ++ struct xmit_buf *pxmitbuf); ++void rtw_count_tx_stats(struct adapter *padapter, ++ struct xmit_frame *pxmitframe, int sz); ++void rtw_update_protection(struct adapter *padapter, u8 *ie, uint ie_len); ++s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, ++ struct pkt_attrib *pattrib); ++s32 rtw_put_snap(u8 *data, u16 h_proto); ++ ++struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); ++s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, ++ struct xmit_frame *pxmitframe); ++void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, ++ struct __queue *pframequeue); ++struct tx_servq *rtw_get_sta_pending(struct adapter *padapter, ++ struct sta_info *psta, int up, u8 *ac); ++s32 rtw_xmitframe_enqueue(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++struct xmit_frame *rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, ++ struct hw_xmit *phwxmit_i, int entry); ++ ++s32 rtw_xmit_classifier(struct adapter *padapter, ++ struct xmit_frame *pxmitframe); ++u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib); ++#define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib) ++s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, ++ struct xmit_frame *pxmitframe); ++s32 _rtw_init_hw_txqueue(struct hw_txqueue *phw_txqueue, u8 ac_tag); ++void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv); ++s32 rtw_txframes_pending(struct adapter *padapter); ++s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, ++ struct pkt_attrib *pattrib); ++void rtw_init_hwxmits(struct hw_xmit *phwxmit, int entry); ++s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter); ++void _rtw_free_xmit_priv(struct xmit_priv *pxmitpriv); ++void rtw_alloc_hwxmits(struct adapter *padapter); ++void rtw_free_hwxmits(struct adapter *padapter); ++s32 rtw_xmit(struct adapter *padapter, struct sk_buff **pkt); ++ ++#if defined(CONFIG_88EU_AP_MODE) ++int xmitframe_enqueue_for_sleeping_sta(struct adapter *padapter, struct xmit_frame *pxmitframe); ++void stop_sta_xmit(struct adapter *padapter, struct sta_info *psta); ++void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta); ++void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *psta); ++#endif ++ ++u8 qos_acm(u8 acm_mask, u8 priority); ++u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe); ++int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms); ++void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status); ++ ++/* include after declaring struct xmit_buf, in order to avoid warning */ ++#include "xmit_osdep.h" ++ ++#endif /* _RTL871X_XMIT_H_ */ +diff --git a/drivers/staging/r8188eu/include/sta_info.h b/drivers/staging/r8188eu/include/sta_info.h +new file mode 100644 +index 000000000000..8ff99fc6381d +--- /dev/null ++++ b/drivers/staging/r8188eu/include/sta_info.h +@@ -0,0 +1,368 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __STA_INFO_H_ ++#define __STA_INFO_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "wifi.h" ++ ++#define IBSS_START_MAC_ID 2 ++#define NUM_STA 32 ++#define NUM_ACL 16 ++ ++/* if mode ==0, then the sta is allowed once the addr is hit. */ ++/* if mode ==1, then the sta is rejected once the addr is non-hit. */ ++struct rtw_wlan_acl_node { ++ struct list_head list; ++ u8 addr[ETH_ALEN]; ++ u8 valid; ++}; ++ ++/* mode=0, disable */ ++/* mode=1, accept unless in deny list */ ++/* mode=2, deny unless in accept list */ ++struct wlan_acl_pool { ++ int mode; ++ int num; ++ struct rtw_wlan_acl_node aclnode[NUM_ACL]; ++ struct __queue acl_node_q; ++}; ++ ++struct rssi_sta { ++ s32 UndecoratedSmoothedPWDB; ++ s32 UndecoratedSmoothedCCK; ++ s32 UndecoratedSmoothedOFDM; ++ u64 PacketMap; ++ u8 ValidBit; ++}; ++ ++struct stainfo_stats { ++ u64 rx_mgnt_pkts; ++ u64 rx_beacon_pkts; ++ u64 rx_probereq_pkts; ++ u64 rx_probersp_pkts; ++ u64 rx_probersp_bm_pkts; ++ u64 rx_probersp_uo_pkts; ++ u64 rx_ctrl_pkts; ++ u64 rx_data_pkts; ++ ++ u64 last_rx_mgnt_pkts; ++ u64 last_rx_beacon_pkts; ++ u64 last_rx_probereq_pkts; ++ u64 last_rx_probersp_pkts; ++ u64 last_rx_probersp_bm_pkts; ++ u64 last_rx_probersp_uo_pkts; ++ u64 last_rx_ctrl_pkts; ++ u64 last_rx_data_pkts; ++ u64 rx_bytes; ++ u64 rx_drops; ++ u64 tx_pkts; ++ u64 tx_bytes; ++ u64 tx_drops; ++}; ++ ++struct sta_info { ++ spinlock_t lock; ++ struct list_head list; /* free_sta_queue */ ++ struct list_head hash_list; /* sta_hash */ ++ ++ struct sta_xmit_priv sta_xmitpriv; ++ struct sta_recv_priv sta_recvpriv; ++ ++ struct __queue sleep_q; ++ unsigned int sleepq_len; ++ ++ uint state; ++ uint aid; ++ uint mac_id; ++ uint qos_option; ++ u8 hwaddr[ETH_ALEN]; ++ ++ uint ieee8021x_blocked; /* 0: allowed, 1:blocked */ ++ uint dot118021XPrivacy; /* aes, tkip... */ ++ union Keytype dot11tkiptxmickey; ++ union Keytype dot11tkiprxmickey; ++ union Keytype dot118021x_UncstKey; ++ union pn48 dot11txpn; /* PN48 used for Unicast xmit. */ ++ union pn48 dot11rxpn; /* PN48 used for Unicast recv. */ ++ u8 bssrateset[16]; ++ u32 bssratelen; ++ s32 rssi; ++ s32 signal_quality; ++ ++ u8 cts2self; ++ u8 rtsen; ++ ++ u8 raid; ++ u8 init_rate; ++ u32 ra_mask; ++ u8 wireless_mode; /* NETWORK_TYPE */ ++ struct stainfo_stats sta_stats; ++ ++ /* for A-MPDU TX, ADDBA timeout check */ ++ struct timer_list addba_retry_timer; ++ ++ /* for A-MPDU Rx reordering buffer control */ ++ struct recv_reorder_ctrl recvreorder_ctrl[16]; ++ ++ /* for A-MPDU Tx */ ++ /* unsigned char ampdu_txen_bitmap; */ ++ u16 BA_starting_seqctrl[16]; ++ ++ struct ht_priv htpriv; ++ ++ /* Notes: */ ++ /* STA_Mode: */ ++ /* curr_network(mlme_priv/security_priv/qos/ht) + ++ * sta_info: (STA & AP) CAP/INFO */ ++ /* scan_q: AP CAP/INFO */ ++ ++ /* AP_Mode: */ ++ /* curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO */ ++ /* sta_info: (AP & STA) CAP/INFO */ ++ ++ struct list_head asoc_list; ++#ifdef CONFIG_88EU_AP_MODE ++ struct list_head auth_list; ++ ++ unsigned int expire_to; ++ unsigned int auth_seq; ++ unsigned int authalg; ++ unsigned char chg_txt[128]; ++ ++ u16 capability; ++ int flags; ++ ++ int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */ ++ int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */ ++ int wpa_group_cipher; ++ int wpa2_group_cipher; ++ int wpa_pairwise_cipher; ++ int wpa2_pairwise_cipher; ++ ++ u8 bpairwise_key_installed; ++ ++ u8 wpa_ie[32]; ++ ++ u8 nonerp_set; ++ u8 no_short_slot_time_set; ++ u8 no_short_preamble_set; ++ u8 no_ht_gf_set; ++ u8 no_ht_set; ++ u8 ht_20mhz_set; ++ ++ unsigned int tx_ra_bitmap; ++ u8 qos_info; ++ ++ u8 max_sp_len; ++ u8 uapsd_bk;/* BIT(0): Delivery enabled, BIT(1): Trigger enabled */ ++ u8 uapsd_be; ++ u8 uapsd_vi; ++ u8 uapsd_vo; ++ ++ u8 has_legacy_ac; ++ unsigned int sleepq_ac_len; ++#endif /* CONFIG_88EU_AP_MODE */ ++ ++#ifdef CONFIG_88EU_P2P ++ /* p2p priv data */ ++ u8 is_p2p_device; ++ u8 p2p_status_code; ++ ++ /* p2p client info */ ++ u8 dev_addr[ETH_ALEN]; ++ u8 dev_cap; ++ u16 config_methods; ++ u8 primary_dev_type[8]; ++ u8 num_of_secdev_type; ++ u8 secdev_types_list[32];/* 32/8 == 4; */ ++ u16 dev_name_len; ++ u8 dev_name[32]; ++#endif /* CONFIG_88EU_P2P */ ++ u8 under_exist_checking; ++ u8 keep_alive_trycnt; ++ ++ /* for DM */ ++ struct rssi_sta rssi_stat; ++ ++ /* ================ODM Relative Info======================= */ ++ /* Please be careful, don't declare too much structure here. ++ * It will cost memory * STA support num. */ ++ /* 2011/10/20 MH Add for ODM STA info. */ ++ /* Driver Write */ ++ u8 bValid; /* record the sta status link or not? */ ++ u8 IOTPeer; /* Enum value. HT_IOT_PEER_E */ ++ u8 rssi_level; /* for Refresh RA mask */ ++ /* ODM Write */ ++ /* 1 PHY_STATUS_INFO */ ++ u8 RSSI_Path[4]; /* */ ++ u8 RSSI_Ave; ++ u8 RXEVM[4]; ++ u8 RXSNR[4]; ++ ++ /* ================ODM Relative Info======================= */ ++ /* */ ++ ++ /* To store the sequence number of received management frame */ ++ u16 RxMgmtFrameSeqNum; ++}; ++ ++#define sta_rx_pkts(sta) \ ++ (sta->sta_stats.rx_mgnt_pkts \ ++ + sta->sta_stats.rx_ctrl_pkts \ ++ + sta->sta_stats.rx_data_pkts) ++ ++#define sta_last_rx_pkts(sta) \ ++ (sta->sta_stats.last_rx_mgnt_pkts \ ++ + sta->sta_stats.last_rx_ctrl_pkts \ ++ + sta->sta_stats.last_rx_data_pkts) ++ ++#define sta_rx_data_pkts(sta) \ ++ (sta->sta_stats.rx_data_pkts) ++ ++#define sta_last_rx_data_pkts(sta) \ ++ (sta->sta_stats.last_rx_data_pkts) ++ ++#define sta_rx_mgnt_pkts(sta) \ ++ (sta->sta_stats.rx_mgnt_pkts) ++ ++#define sta_last_rx_mgnt_pkts(sta) \ ++ (sta->sta_stats.last_rx_mgnt_pkts) ++ ++#define sta_rx_beacon_pkts(sta) \ ++ (sta->sta_stats.rx_beacon_pkts) ++ ++#define sta_last_rx_beacon_pkts(sta) \ ++ (sta->sta_stats.last_rx_beacon_pkts) ++ ++#define sta_rx_probereq_pkts(sta) \ ++ (sta->sta_stats.rx_probereq_pkts) ++ ++#define sta_last_rx_probereq_pkts(sta) \ ++ (sta->sta_stats.last_rx_probereq_pkts) ++ ++#define sta_rx_probersp_pkts(sta) \ ++ (sta->sta_stats.rx_probersp_pkts) ++ ++#define sta_last_rx_probersp_pkts(sta) \ ++ (sta->sta_stats.last_rx_probersp_pkts) ++ ++#define sta_rx_probersp_bm_pkts(sta) \ ++ (sta->sta_stats.rx_probersp_bm_pkts) ++ ++#define sta_last_rx_probersp_bm_pkts(sta) \ ++ (sta->sta_stats.last_rx_probersp_bm_pkts) ++ ++#define sta_rx_probersp_uo_pkts(sta) \ ++ (sta->sta_stats.rx_probersp_uo_pkts) ++ ++#define sta_last_rx_probersp_uo_pkts(sta) \ ++ (sta->sta_stats.last_rx_probersp_uo_pkts) ++ ++#define sta_update_last_rx_pkts(sta) \ ++do { \ ++ sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \ ++ sta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \ ++ sta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \ ++ sta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \ ++ sta->sta_stats.last_rx_probersp_bm_pkts = sta->sta_stats.rx_probersp_bm_pkts; \ ++ sta->sta_stats.last_rx_probersp_uo_pkts = sta->sta_stats.rx_probersp_uo_pkts; \ ++ sta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \ ++ sta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \ ++} while (0) ++ ++#define STA_RX_PKTS_ARG(sta) \ ++ sta->sta_stats.rx_mgnt_pkts \ ++ , sta->sta_stats.rx_ctrl_pkts \ ++ , sta->sta_stats.rx_data_pkts ++ ++#define STA_LAST_RX_PKTS_ARG(sta) \ ++ sta->sta_stats.last_rx_mgnt_pkts \ ++ , sta->sta_stats.last_rx_ctrl_pkts \ ++ , sta->sta_stats.last_rx_data_pkts ++ ++#define STA_RX_PKTS_DIFF_ARG(sta) \ ++ sta->sta_stats.rx_mgnt_pkts - sta->sta_stats.last_rx_mgnt_pkts \ ++ , sta->sta_stats.rx_ctrl_pkts - sta->sta_stats.last_rx_ctrl_pkts \ ++ , sta->sta_stats.rx_data_pkts - sta->sta_stats.last_rx_data_pkts ++ ++#define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)" ++ ++struct sta_priv { ++ u8 *pallocated_stainfo_buf; ++ u8 *pstainfo_buf; ++ struct __queue free_sta_queue; ++ ++ spinlock_t sta_hash_lock; ++ struct list_head sta_hash[NUM_STA]; ++ int asoc_sta_count; ++ struct __queue sleep_q; ++ struct __queue wakeup_q; ++ ++ struct adapter *padapter; ++ ++ spinlock_t asoc_list_lock; ++ struct list_head asoc_list; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ struct list_head auth_list; ++ spinlock_t auth_list_lock; ++ u8 asoc_list_cnt; ++ u8 auth_list_cnt; ++ ++ unsigned int auth_to; /* sec, time to expire in authenticating. */ ++ unsigned int assoc_to; /* sec, time to expire before associating. */ ++ unsigned int expire_to; /* sec , time to expire after associated. */ ++ ++ /* pointers to STA info; based on allocated AID or NULL if AID free ++ * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 ++ * and so on ++ */ ++ struct sta_info *sta_aid[NUM_STA]; ++ ++ u16 sta_dz_bitmap;/* only support 15 stations, station aid bitmap ++ * for sleeping sta. */ ++ u16 tim_bitmap; /* only support 15 stations, aid=0~15 mapping ++ * bit0~bit15 */ ++ ++ u16 max_num_sta; ++ ++ struct wlan_acl_pool acl_list; ++#endif ++ ++}; ++ ++static inline u32 wifi_mac_hash(u8 *mac) ++{ ++ u32 x; ++ ++ x = mac[0]; ++ x = (x << 2) ^ mac[1]; ++ x = (x << 2) ^ mac[2]; ++ x = (x << 2) ^ mac[3]; ++ x = (x << 2) ^ mac[4]; ++ x = (x << 2) ^ mac[5]; ++ ++ x ^= x >> 8; ++ x = x & (NUM_STA - 1); ++ return x; ++} ++ ++extern u32 _rtw_init_sta_priv(struct sta_priv *pstapriv); ++extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); ++ ++#define stainfo_offset_valid(offset) (offset < NUM_STA && offset >= 0) ++int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta); ++struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int off); ++ ++extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *stapriv, u8 *hwaddr); ++extern u32 rtw_free_stainfo(struct adapter *adapt, struct sta_info *psta); ++extern void rtw_free_all_stainfo(struct adapter *adapt); ++extern struct sta_info *rtw_get_stainfo(struct sta_priv *stapriv, u8 *hwaddr); ++extern u32 rtw_init_bcmc_stainfo(struct adapter *adapt); ++extern struct sta_info *rtw_get_bcmc_stainfo(struct adapter *padapter); ++extern u8 rtw_access_ctrl(struct adapter *padapter, u8 *mac_addr); ++ ++#endif /* _STA_INFO_H_ */ +diff --git a/drivers/staging/r8188eu/include/usb_ops.h b/drivers/staging/r8188eu/include/usb_ops.h +new file mode 100644 +index 000000000000..c53cc54b6b87 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/usb_ops.h +@@ -0,0 +1,72 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __USB_OPS_H_ ++#define __USB_OPS_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "osdep_intf.h" ++ ++#define REALTEK_USB_VENQT_READ (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) ++#define REALTEK_USB_VENQT_WRITE (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) ++#define REALTEK_USB_VENQT_CMD_REQ 0x05 ++#define REALTEK_USB_VENQT_CMD_IDX 0x00 ++ ++#define ALIGNMENT_UNIT 16 ++#define MAX_VENDOR_REQ_CMD_SIZE 254 /* 8188cu SIE Support */ ++#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE + ALIGNMENT_UNIT) ++ ++#include "usb_ops_linux.h" ++ ++void rtl8188eu_set_hw_type(struct adapter *padapter); ++#define hal_set_hw_type rtl8188eu_set_hw_type ++void rtl8188eu_set_intf_ops(struct _io_ops *pops); ++#define usb_set_intf_ops rtl8188eu_set_intf_ops ++ ++/* ++ * Increase and check if the continual_urb_error of this @param dvobjprivei ++ * is larger than MAX_CONTINUAL_URB_ERR ++ * @return true: ++ * @return false: ++ */ ++static inline int rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobj) ++{ ++ int ret = false; ++ int value; ++ value = atomic_inc_return(&dvobj->continual_urb_error); ++ if (value > MAX_CONTINUAL_URB_ERR) { ++ DBG_88E("[dvobj:%p][ERROR] continual_urb_error:%d > %d\n", ++ dvobj, value, MAX_CONTINUAL_URB_ERR); ++ ret = true; ++ } ++ return ret; ++} ++ ++/* ++* Set the continual_urb_error of this @param dvobjprive to 0 ++*/ ++static inline void rtw_reset_continual_urb_error(struct dvobj_priv *dvobj) ++{ ++ atomic_set(&dvobj->continual_urb_error, 0); ++} ++ ++#define USB_HIGH_SPEED_BULK_SIZE 512 ++#define USB_FULL_SPEED_BULK_SIZE 64 ++ ++static inline u8 rtw_usb_bulk_size_boundary(struct adapter *padapter, ++ int buf_len) ++{ ++ u8 rst = true; ++ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); ++ ++ if (pdvobjpriv->ishighspeed) ++ rst = (0 == (buf_len) % USB_HIGH_SPEED_BULK_SIZE) ? ++ true : false; ++ else ++ rst = (0 == (buf_len) % USB_FULL_SPEED_BULK_SIZE) ? ++ true : false; ++ return rst; ++} ++ ++#endif /* __USB_OPS_H_ */ +diff --git a/drivers/staging/r8188eu/include/usb_ops_linux.h b/drivers/staging/r8188eu/include/usb_ops_linux.h +new file mode 100644 +index 000000000000..c357a3b1560e +--- /dev/null ++++ b/drivers/staging/r8188eu/include/usb_ops_linux.h +@@ -0,0 +1,39 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __USB_OPS_LINUX_H__ ++#define __USB_OPS_LINUX_H__ ++ ++#define VENDOR_CMD_MAX_DATA_LEN 254 ++ ++#define RTW_USB_CONTROL_MSG_TIMEOUT_TEST 10/* ms */ ++#define RTW_USB_CONTROL_MSG_TIMEOUT 500/* ms */ ++ ++#define MAX_USBCTRL_VENDORREQ_TIMES 10 ++ ++#define RTW_USB_BULKOUT_TIME 5000/* ms */ ++ ++#define _usbctrl_vendorreq_async_callback(urb, regs) \ ++ _usbctrl_vendorreq_async_callback(urb) ++#define usb_bulkout_zero_complete(purb, regs) \ ++ usb_bulkout_zero_complete(purb) ++#define usb_write_mem_complete(purb, regs) \ ++ usb_write_mem_complete(purb) ++#define usb_write_port_complete(purb, regs) \ ++ usb_write_port_complete(purb) ++#define usb_read_port_complete(purb, regs) \ ++ usb_read_port_complete(purb) ++#define usb_read_interrupt_complete(purb, regs) \ ++ usb_read_interrupt_complete(purb) ++ ++unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr); ++ ++void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem); ++void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem); ++ ++void usb_read_port_cancel(struct intf_hdl *pintfhdl); ++ ++u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem); ++void usb_write_port_cancel(struct intf_hdl *pintfhdl); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/usb_osintf.h b/drivers/staging/r8188eu/include/usb_osintf.h +new file mode 100644 +index 000000000000..d1a1f739309c +--- /dev/null ++++ b/drivers/staging/r8188eu/include/usb_osintf.h +@@ -0,0 +1,29 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __USB_OSINTF_H ++#define __USB_OSINTF_H ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++#include "usb_vendor_req.h" ++ ++extern char *rtw_initmac; ++extern int rtw_mc2u_disable; ++ ++#define USBD_HALTED(Status) ((u32)(Status) >> 30 == 3) ++ ++u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, enum bt_usb_request brequest, ++ enum rt_usb_wvalue wvalue, u8 windex, void *data, ++ u8 datalen, u8 isdirectionin); ++int pm_netdev_open(struct net_device *pnetdev, u8 bnormal); ++void netdev_br_init(struct net_device *netdev); ++void dhcp_flag_bcast(struct adapter *priv, struct sk_buff *skb); ++void *scdb_findEntry(struct adapter *priv, unsigned char *macAddr, ++ unsigned char *ipAddr); ++void nat25_db_expire(struct adapter *priv); ++int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method); ++ ++int rtw_resume_process(struct adapter *padapter); ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/usb_vendor_req.h b/drivers/staging/r8188eu/include/usb_vendor_req.h +new file mode 100644 +index 000000000000..7337b1b7419f +--- /dev/null ++++ b/drivers/staging/r8188eu/include/usb_vendor_req.h +@@ -0,0 +1,35 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef _USB_VENDOR_REQUEST_H_ ++#define _USB_VENDOR_REQUEST_H_ ++ ++/* 4 Set/Get Register related wIndex/Data */ ++#define RT_USB_RESET_MASK_OFF 0 ++#define RT_USB_RESET_MASK_ON 1 ++#define RT_USB_SLEEP_MASK_OFF 0 ++#define RT_USB_SLEEP_MASK_ON 1 ++#define RT_USB_LDO_ON 1 ++#define RT_USB_LDO_OFF 0 ++ ++/* 4 Set/Get SYSCLK related wValue or Data */ ++#define RT_USB_SYSCLK_32KHZ 0 ++#define RT_USB_SYSCLK_40MHZ 1 ++#define RT_USB_SYSCLK_60MHZ 2 ++ ++enum bt_usb_request { ++ RT_USB_SET_REGISTER = 1, ++ RT_USB_SET_SYSCLK = 2, ++ RT_USB_GET_SYSCLK = 3, ++ RT_USB_GET_REGISTER = 4 ++}; ++ ++enum rt_usb_wvalue { ++ RT_USB_RESET_MASK = 1, ++ RT_USB_SLEEP_MASK = 2, ++ RT_USB_USB_HRCPWM = 3, ++ RT_USB_LDO = 4, ++ RT_USB_BOOT_TYPE = 5 ++}; ++ ++#endif +diff --git a/drivers/staging/r8188eu/include/wifi.h b/drivers/staging/r8188eu/include/wifi.h +new file mode 100644 +index 000000000000..0b3fd94cea18 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/wifi.h +@@ -0,0 +1,1029 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#ifndef _WIFI_H_ ++#define _WIFI_H_ ++ ++#include ++ ++#ifdef BIT ++/* error "BIT define occurred earlier elsewhere!\n" */ ++#undef BIT ++#endif ++#define BIT(x) (1 << (x)) ++ ++#define WLAN_ETHHDR_LEN 14 ++#define WLAN_ETHADDR_LEN 6 ++#define WLAN_IEEE_OUI_LEN 3 ++#define WLAN_ADDR_LEN 6 ++#define WLAN_CRC_LEN 4 ++#define WLAN_BSSID_LEN 6 ++#define WLAN_BSS_TS_LEN 8 ++#define WLAN_HDR_A3_LEN 24 ++#define WLAN_HDR_A4_LEN 30 ++#define WLAN_HDR_A3_QOS_LEN 26 ++#define WLAN_HDR_A4_QOS_LEN 32 ++#define WLAN_SSID_MAXLEN 32 ++#define WLAN_DATA_MAXLEN 2312 ++ ++#define WLAN_A3_PN_OFFSET 24 ++#define WLAN_A4_PN_OFFSET 30 ++ ++#define WLAN_MIN_ETHFRM_LEN 60 ++#define WLAN_MAX_ETHFRM_LEN 1514 ++#define WLAN_ETHHDR_LEN 14 ++ ++#define P80211CAPTURE_VERSION 0x80211001 ++ ++/* This value is tested by WiFi 11n Test Plan 5.2.3. */ ++/* This test verifies the WLAN NIC can update the NAV through sending ++ * the CTS with large duration. */ ++#define WiFiNavUpperUs 30000 /* 30 ms */ ++ ++enum WIFI_FRAME_TYPE { ++ WIFI_MGT_TYPE = (0), ++ WIFI_CTRL_TYPE = (BIT(2)), ++ WIFI_DATA_TYPE = (BIT(3)), ++ WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), /* QoS Data */ ++}; ++ ++enum WIFI_FRAME_SUBTYPE { ++ /* below is for mgt frame */ ++ WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE), ++ WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE), ++ WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE), ++ WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE), ++ WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE), ++ WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE), ++ WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE), ++ WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE), ++ WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE), ++ WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE), ++ WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE), ++ WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE), ++ ++ /* below is for control frame */ ++ WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), ++ WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), ++ WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), ++ WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), ++ WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), ++ WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | ++ WIFI_CTRL_TYPE), ++ ++ /* below is for data frame */ ++ WIFI_DATA = (0 | WIFI_DATA_TYPE), ++ WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), ++ WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), ++ WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), ++ WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), ++ WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), ++ WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), ++ WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), ++ WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), ++}; ++ ++enum WIFI_REASON_CODE { ++ _RSON_RESERVED_ = 0, ++ _RSON_UNSPECIFIED_ = 1, ++ _RSON_AUTH_NO_LONGER_VALID_ = 2, ++ _RSON_DEAUTH_STA_LEAVING_ = 3, ++ _RSON_INACTIVITY_ = 4, ++ _RSON_UNABLE_HANDLE_ = 5, ++ _RSON_CLS2_ = 6, ++ _RSON_CLS3_ = 7, ++ _RSON_DISAOC_STA_LEAVING_ = 8, ++ _RSON_ASOC_NOT_AUTH_ = 9, ++ ++ /* WPA reason */ ++ _RSON_INVALID_IE_ = 13, ++ _RSON_MIC_FAILURE_ = 14, ++ _RSON_4WAY_HNDSHK_TIMEOUT_ = 15, ++ _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16, ++ _RSON_DIFF_IE_ = 17, ++ _RSON_MLTCST_CIPHER_NOT_VALID_ = 18, ++ _RSON_UNICST_CIPHER_NOT_VALID_ = 19, ++ _RSON_AKMP_NOT_VALID_ = 20, ++ _RSON_UNSUPPORT_RSNE_VER_ = 21, ++ _RSON_INVALID_RSNE_CAP_ = 22, ++ _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23, ++ ++ /* belowing are Realtek definition */ ++ _RSON_PMK_NOT_AVAILABLE_ = 24, ++ _RSON_TDLS_TEAR_TOOFAR_ = 25, ++ _RSON_TDLS_TEAR_UN_RSN_ = 26, ++}; ++ ++/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) ++ ++#define WLAN_REASON_UNSPECIFIED 1 ++#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 ++#define WLAN_REASON_DEAUTH_LEAVING 3 ++#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 ++#define WLAN_REASON_DISASSOC_AP_BUSY 5 ++#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 ++#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 ++#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 ++#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 */ ++/* IEEE 802.11h */ ++#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 ++#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 ++ ++/* IEEE 802.11i ++#define WLAN_REASON_INVALID_IE 13 ++#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 ++#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 ++#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 ++#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 ++#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 ++#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 ++#define WLAN_REASON_AKMP_NOT_VALID 20 ++#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 ++#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 ++#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 ++#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 */ ++ ++enum WIFI_STATUS_CODE { ++ _STATS_SUCCESSFUL_ = 0, ++ _STATS_FAILURE_ = 1, ++ _STATS_CAP_FAIL_ = 10, ++ _STATS_NO_ASOC_ = 11, ++ _STATS_OTHER_ = 12, ++ _STATS_NO_SUPP_ALG_ = 13, ++ _STATS_OUT_OF_AUTH_SEQ_ = 14, ++ _STATS_CHALLENGE_FAIL_ = 15, ++ _STATS_AUTH_TIMEOUT_ = 16, ++ _STATS_UNABLE_HANDLE_STA_ = 17, ++ _STATS_RATE_FAIL_ = 18, ++}; ++ ++/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) ++#define WLAN_STATUS_SUCCESS 0 ++#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 ++#define WLAN_STATUS_CAPS_UNSUPPORTED 10 ++#define WLAN_STATUS_REASSOC_NO_ASSOC 11 ++#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 ++#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 ++#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 ++#define WLAN_STATUS_CHALLENGE_FAIL 15 ++#define WLAN_STATUS_AUTH_TIMEOUT 16 ++#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 ++#define WLAN_STATUS_ASSOC_DENIED_RATES 18 */ ++ ++/* entended */ ++/* IEEE 802.11b */ ++#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 ++#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 ++#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 ++/* IEEE 802.11h */ ++#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 ++#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 ++#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 ++/* IEEE 802.11g */ ++#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 ++#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 ++#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 ++/* IEEE 802.11w */ ++#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 ++#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 ++/* IEEE 802.11i */ ++#define WLAN_STATUS_INVALID_IE 40 ++#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 ++#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 ++#define WLAN_STATUS_AKMP_NOT_VALID 43 ++#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 ++#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 ++#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 ++#define WLAN_STATUS_TS_NOT_CREATED 47 ++#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 ++#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 ++#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 ++#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 ++/* IEEE 802.11r */ ++#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 ++#define WLAN_STATUS_INVALID_PMKID 53 ++#define WLAN_STATUS_INVALID_MDIE 54 ++#define WLAN_STATUS_INVALID_FTIE 55 ++ ++enum WIFI_REG_DOMAIN { ++ DOMAIN_FCC = 1, ++ DOMAIN_IC = 2, ++ DOMAIN_ETSI = 3, ++ DOMAIN_SPA = 4, ++ DOMAIN_FRANCE = 5, ++ DOMAIN_MKK = 6, ++ DOMAIN_ISRAEL = 7, ++ DOMAIN_MKK1 = 8, ++ DOMAIN_MKK2 = 9, ++ DOMAIN_MKK3 = 10, ++ DOMAIN_MAX ++}; ++ ++#define _TO_DS_ BIT(8) ++#define _FROM_DS_ BIT(9) ++#define _MORE_FRAG_ BIT(10) ++#define _RETRY_ BIT(11) ++#define _PWRMGT_ BIT(12) ++#define _MORE_DATA_ BIT(13) ++#define _PRIVACY_ BIT(14) ++#define _ORDER_ BIT(15) ++ ++#define SetToDs(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_TO_DS_) ++ ++#define GetToDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_TO_DS_)) != 0) ++ ++#define ClearToDs(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_TO_DS_)) ++ ++#define SetFrDs(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_FROM_DS_) ++ ++#define GetFrDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_FROM_DS_)) != 0) ++ ++#define ClearFrDs(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)) ++ ++#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) ++ ++#define SetMFrag(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_MORE_FRAG_) ++ ++#define GetMFrag(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_MORE_FRAG_)) != 0) ++ ++#define ClearMFrag(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)) ++ ++#define SetRetry(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_RETRY_) ++ ++#define GetRetry(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_RETRY_)) != 0) ++ ++#define ClearRetry(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_RETRY_)) ++ ++#define SetPwrMgt(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_PWRMGT_) ++ ++#define GetPwrMgt(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_PWRMGT_)) != 0) ++ ++#define ClearPwrMgt(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)) ++ ++#define SetMData(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_MORE_DATA_) ++ ++#define GetMData(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_MORE_DATA_)) != 0) ++ ++#define ClearMData(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)) ++ ++#define SetPrivacy(pbuf) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(_PRIVACY_) ++ ++#define GetPrivacy(pbuf) \ ++ (((*(__le16 *)(pbuf)) & cpu_to_le16(_PRIVACY_)) != 0) ++ ++#define ClearPrivacy(pbuf) \ ++ *(__le16 *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)) ++ ++#define GetOrder(pbuf) \ ++ (((*(__le16 *)(pbuf)) & cpu_to_le16(_ORDER_)) != 0) ++ ++#define GetFrameType(pbuf) \ ++ (le16_to_cpu(*(__le16 *)(pbuf)) & (BIT(3) | BIT(2))) ++ ++#define SetFrameType(pbuf, type) \ ++ do { \ ++ *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \ ++ *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \ ++ } while (0) ++ ++#define GetFrameSubType(pbuf) (le16_to_cpu(*(__le16 *)(pbuf)) & (BIT(7) |\ ++ BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))) ++ ++#define SetFrameSubType(pbuf, type) \ ++ do { \ ++ *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \ ++ BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(type); \ ++ } while (0) ++ ++#define GetSequence(pbuf) \ ++ (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) >> 4) ++ ++#define GetFragNum(pbuf) \ ++ (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) & 0x0f) ++ ++#define GetTupleCache(pbuf) \ ++ (cpu_to_le16(*(unsigned short *)((size_t)(pbuf) + 22))) ++ ++#define SetFragNum(pbuf, num) \ ++ do { \ ++ *(unsigned short *)((size_t)(pbuf) + 22) = \ ++ ((*(unsigned short *)((size_t)(pbuf) + 22)) & \ ++ le16_to_cpu(~(0x000f))) | \ ++ cpu_to_le16(0x0f & (num)); \ ++ } while (0) ++ ++#define SetSeqNum(pbuf, num) \ ++ do { \ ++ *(__le16 *)((size_t)(pbuf) + 22) = \ ++ ((*(__le16 *)((size_t)(pbuf) + 22)) & cpu_to_le16((unsigned short)0x000f)) | \ ++ cpu_to_le16((unsigned short)(0xfff0 & (num << 4))); \ ++ } while (0) ++ ++#define SetDuration(pbuf, dur) \ ++ *(__le16 *)((size_t)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)) ++ ++#define SetPriority(pbuf, tid) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf) ++ ++#define GetPriority(pbuf) ((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf) ++ ++#define SetEOSP(pbuf, eosp) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16((eosp & 1) << 4) ++ ++#define SetAckpolicy(pbuf, ack) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16((ack & 3) << 5) ++ ++#define GetAckpolicy(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 5) & 0x3) ++ ++#define GetAMsdu(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 7) & 0x1) ++ ++#define SetAMsdu(pbuf, amsdu) \ ++ *(__le16 *)(pbuf) |= cpu_to_le16((amsdu & 1) << 7) ++ ++#define GetAid(pbuf) (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 2)) & 0x3fff) ++ ++#define GetTid(pbuf) (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + \ ++ (((GetToDs(pbuf)<<1) | GetFrDs(pbuf)) == 3 ? \ ++ 30 : 24))) & 0x000f) ++ ++#define GetAddr1Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 4)) ++ ++#define GetAddr2Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 10)) ++ ++#define GetAddr3Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 16)) ++ ++#define GetAddr4Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 24)) ++ ++static inline int IS_MCAST(unsigned char *da) ++{ ++ if ((*da) & 0x01) ++ return true; ++ else ++ return false; ++} ++ ++static inline unsigned char *get_da(unsigned char *pframe) ++{ ++ unsigned char *da; ++ unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); ++ ++ switch (to_fr_ds) { ++ case 0x00: /* ToDs=0, FromDs=0 */ ++ da = GetAddr1Ptr(pframe); ++ break; ++ case 0x01: /* ToDs=0, FromDs=1 */ ++ da = GetAddr1Ptr(pframe); ++ break; ++ case 0x02: /* ToDs=1, FromDs=0 */ ++ da = GetAddr3Ptr(pframe); ++ break; ++ default: /* ToDs=1, FromDs=1 */ ++ da = GetAddr3Ptr(pframe); ++ break; ++ } ++ return da; ++} ++ ++static inline unsigned char *get_sa(unsigned char *pframe) ++{ ++ unsigned char *sa; ++ unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); ++ ++ switch (to_fr_ds) { ++ case 0x00: /* ToDs=0, FromDs=0 */ ++ sa = GetAddr2Ptr(pframe); ++ break; ++ case 0x01: /* ToDs=0, FromDs=1 */ ++ sa = GetAddr3Ptr(pframe); ++ break; ++ case 0x02: /* ToDs=1, FromDs=0 */ ++ sa = GetAddr2Ptr(pframe); ++ break; ++ default: /* ToDs=1, FromDs=1 */ ++ sa = GetAddr4Ptr(pframe); ++ break; ++ } ++ return sa; ++} ++ ++static inline unsigned char *get_hdr_bssid(unsigned char *pframe) ++{ ++ unsigned char *sa; ++ unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); ++ ++ switch (to_fr_ds) { ++ case 0x00: /* ToDs=0, FromDs=0 */ ++ sa = GetAddr3Ptr(pframe); ++ break; ++ case 0x01: /* ToDs=0, FromDs=1 */ ++ sa = GetAddr2Ptr(pframe); ++ break; ++ case 0x02: /* ToDs=1, FromDs=0 */ ++ sa = GetAddr1Ptr(pframe); ++ break; ++ case 0x03: /* ToDs=1, FromDs=1 */ ++ sa = GetAddr1Ptr(pframe); ++ break; ++ default: ++ sa = NULL; /* */ ++ break; ++ } ++ return sa; ++} ++ ++static inline int IsFrameTypeCtrl(unsigned char *pframe) ++{ ++ if (WIFI_CTRL_TYPE == GetFrameType(pframe)) ++ return true; ++ else ++ return false; ++} ++/*----------------------------------------------------------------------------- ++ Below is for the security related definition ++------------------------------------------------------------------------------*/ ++#define _RESERVED_FRAME_TYPE_ 0 ++#define _SKB_FRAME_TYPE_ 2 ++#define _PRE_ALLOCMEM_ 1 ++#define _PRE_ALLOCHDR_ 3 ++#define _PRE_ALLOCLLCHDR_ 4 ++#define _PRE_ALLOCICVHDR_ 5 ++#define _PRE_ALLOCMICHDR_ 6 ++ ++#define _SIFSTIME_ \ ++ (priv->pmib->dot11BssType.net_work_type = 10) ++#define _ACKCTSLNG_ 14 /* 14 bytes long, including crclng */ ++#define _CRCLNG_ 4 ++ ++#define _ASOCREQ_IE_OFFSET_ 4 /* excluding wlan_hdr */ ++#define _ASOCRSP_IE_OFFSET_ 6 ++#define _REASOCREQ_IE_OFFSET_ 10 ++#define _REASOCRSP_IE_OFFSET_ 6 ++#define _PROBEREQ_IE_OFFSET_ 0 ++#define _PROBERSP_IE_OFFSET_ 12 ++#define _AUTH_IE_OFFSET_ 6 ++#define _DEAUTH_IE_OFFSET_ 0 ++#define _BEACON_IE_OFFSET_ 12 ++#define _PUBLIC_ACTION_IE_OFFSET_ 8 ++ ++#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_ ++ ++#define _SSID_IE_ 0 ++#define _SUPPORTEDRATES_IE_ 1 ++#define _DSSET_IE_ 3 ++#define _TIM_IE_ 5 ++#define _IBSS_PARA_IE_ 6 ++#define _COUNTRY_IE_ 7 ++#define _CHLGETXT_IE_ 16 ++#define _SUPPORTED_CH_IE_ 36 ++#define _CH_SWTICH_ANNOUNCE_ 37 /* Secondary Channel Offset */ ++#define _RSN_IE_2_ 48 ++#define _SSN_IE_1_ 221 ++#define _ERPINFO_IE_ 42 ++#define _EXT_SUPPORTEDRATES_IE_ 50 ++ ++#define _HT_CAPABILITY_IE_ 45 ++#define _FTIE_ 55 ++#define _TIMEOUT_ITVL_IE_ 56 ++#define _SRC_IE_ 59 ++#define _HT_EXTRA_INFO_IE_ 61 ++#define _HT_ADD_INFO_IE_ 61 /* _HT_EXTRA_INFO_IE_ */ ++#define _WAPI_IE_ 68 ++ ++#define EID_BSSCoexistence 72 /* 20/40 BSS Coexistence */ ++#define EID_BSSIntolerantChlReport 73 ++#define _RIC_Descriptor_IE_ 75 ++ ++#define _LINK_ID_IE_ 101 ++#define _CH_SWITCH_TIMING_ 104 ++#define _PTI_BUFFER_STATUS_ 106 ++#define _EXT_CAP_IE_ 127 ++#define _VENDOR_SPECIFIC_IE_ 221 ++ ++#define _RESERVED47_ 47 ++ ++/* --------------------------------------------------------------------------- ++ Below is the fixed elements... ++-----------------------------------------------------------------------------*/ ++#define _AUTH_ALGM_NUM_ 2 ++#define _AUTH_SEQ_NUM_ 2 ++#define _BEACON_ITERVAL_ 2 ++#define _CAPABILITY_ 2 ++#define _CURRENT_APADDR_ 6 ++#define _LISTEN_INTERVAL_ 2 ++#define _RSON_CODE_ 2 ++#define _ASOC_ID_ 2 ++#define _STATUS_CODE_ 2 ++#define _TIMESTAMP_ 8 ++ ++#define AUTH_ODD_TO 0 ++#define AUTH_EVEN_TO 1 ++ ++#define WLAN_ETHCONV_ENCAP 1 ++#define WLAN_ETHCONV_RFC1042 2 ++#define WLAN_ETHCONV_8021h 3 ++ ++#define cap_ESS BIT(0) ++#define cap_IBSS BIT(1) ++#define cap_CFPollable BIT(2) ++#define cap_CFRequest BIT(3) ++#define cap_Privacy BIT(4) ++#define cap_ShortPremble BIT(5) ++#define cap_PBCC BIT(6) ++#define cap_ChAgility BIT(7) ++#define cap_SpecMgmt BIT(8) ++#define cap_QoSi BIT(9) ++#define cap_ShortSlot BIT(10) ++ ++/*----------------------------------------------------------------------------- ++ Below is the definition for 802.11i / 802.1x ++------------------------------------------------------------------------------*/ ++#define _IEEE8021X_MGT_ 1 /* WPA */ ++#define _IEEE8021X_PSK_ 2 /* WPA with pre-shared key */ ++ ++/* ++#define _NO_PRIVACY_ 0 ++#define _WEP_40_PRIVACY_ 1 ++#define _TKIP_PRIVACY_ 2 ++#define _WRAP_PRIVACY_ 3 ++#define _CCMP_PRIVACY_ 4 ++#define _WEP_104_PRIVACY_ 5 ++#define _WEP_WPA_MIXED_PRIVACY_ 6 WEP + WPA ++*/ ++ ++/*----------------------------------------------------------------------------- ++ Below is the definition for WMM ++------------------------------------------------------------------------------*/ ++#define _WMM_IE_Length_ 7 /* for WMM STA */ ++#define _WMM_Para_Element_Length_ 24 ++ ++/*----------------------------------------------------------------------------- ++ Below is the definition for 802.11n ++------------------------------------------------------------------------------*/ ++ ++#define SetOrderBit(pbuf) \ ++ do { \ ++ *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \ ++ } while (0) ++ ++#define GetOrderBit(pbuf) \ ++ (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) ++ ++/** ++ * struct rtw_ieee80211_bar - HT Block Ack Request ++ * ++ * This structure refers to "HT BlockAckReq" as ++ * described in 802.11n draft section 7.2.1.7.1 ++ */ ++struct rtw_ieee80211_bar { ++ __le16 frame_control; ++ __le16 duration; ++ unsigned char ra[ETH_ALEN]; ++ unsigned char ta[ETH_ALEN]; ++ __le16 control; ++ __le16 start_seq_num; ++} __packed; ++ ++/** ++ * struct ieee80211_ht_cap - HT additional information ++ * ++ * This structure refers to "HT information element" as ++ * described in 802.11n draft section 7.3.2.53 ++ */ ++struct ieee80211_ht_addt_info { ++ unsigned char control_chan; ++ unsigned char ht_param; ++ __le16 operation_mode; ++ __le16 stbc_param; ++ unsigned char basic_set[16]; ++} __packed; ++ ++struct HT_caps_element { ++ union { ++ struct { ++ __le16 HT_caps_info; ++ unsigned char AMPDU_para; ++ unsigned char MCS_rate[16]; ++ __le16 HT_ext_caps; ++ __le16 Beamforming_caps; ++ unsigned char ASEL_caps; ++ } HT_cap_element; ++ unsigned char HT_cap[26]; ++ } u; ++} __packed; ++ ++struct HT_info_element { ++ unsigned char primary_channel; ++ unsigned char infos[5]; ++ unsigned char MCS_rate[16]; ++} __packed; ++ ++struct AC_param { ++ unsigned char ACI_AIFSN; ++ unsigned char CW; ++ __le16 TXOP_limit; ++} __packed; ++ ++struct WMM_para_element { ++ unsigned char QoS_info; ++ unsigned char reserved; ++ struct AC_param ac_param[4]; ++} __packed; ++ ++struct ADDBA_request { ++ unsigned char action_code; ++ unsigned char dialog_token; ++ __le16 BA_para_set; ++ __le16 BA_timeout_value; ++ __le16 BA_starting_seqctrl; ++} __packed; ++ ++enum ht_cap_ampdu_factor { ++ MAX_AMPDU_FACTOR_8K = 0, ++ MAX_AMPDU_FACTOR_16K = 1, ++ MAX_AMPDU_FACTOR_32K = 2, ++ MAX_AMPDU_FACTOR_64K = 3, ++}; ++ ++/* Spatial Multiplexing Power Save Modes */ ++#define WLAN_HT_CAP_SM_PS_STATIC 0 ++#define WLAN_HT_CAP_SM_PS_DYNAMIC 1 ++#define WLAN_HT_CAP_SM_PS_INVALID 2 ++#define WLAN_HT_CAP_SM_PS_DISABLED 3 ++ ++#define OP_MODE_PURE 0 ++#define OP_MODE_MAY_BE_LEGACY_STAS 1 ++#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 ++#define OP_MODE_MIXED 3 ++ ++#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) ++#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) ++#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) ++#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) ++#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) ++#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) ++#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) ++ ++#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ ++ ((u16) (0x0001 | 0x0002)) ++#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 ++#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) ++#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) ++#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) ++ ++#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) ++#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) ++#define HT_INFO_STBC_PARAM_SECONDARY_BC ((u16) BIT(8)) ++#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) ++#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) ++#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) ++ ++/* ===============WPS Section=============== */ ++/* For WPSv1.0 */ ++#define WPSOUI 0x0050f204 ++/* WPS attribute ID */ ++#define WPS_ATTR_VER1 0x104A ++#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044 ++#define WPS_ATTR_RESP_TYPE 0x103B ++#define WPS_ATTR_UUID_E 0x1047 ++#define WPS_ATTR_MANUFACTURER 0x1021 ++#define WPS_ATTR_MODEL_NAME 0x1023 ++#define WPS_ATTR_MODEL_NUMBER 0x1024 ++#define WPS_ATTR_SERIAL_NUMBER 0x1042 ++#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054 ++#define WPS_ATTR_SEC_DEV_TYPE_LIST 0x1055 ++#define WPS_ATTR_DEVICE_NAME 0x1011 ++#define WPS_ATTR_CONF_METHOD 0x1008 ++#define WPS_ATTR_RF_BANDS 0x103C ++#define WPS_ATTR_DEVICE_PWID 0x1012 ++#define WPS_ATTR_REQUEST_TYPE 0x103A ++#define WPS_ATTR_ASSOCIATION_STATE 0x1002 ++#define WPS_ATTR_CONFIG_ERROR 0x1009 ++#define WPS_ATTR_VENDOR_EXT 0x1049 ++#define WPS_ATTR_SELECTED_REGISTRAR 0x1041 ++ ++/* Value of WPS attribute "WPS_ATTR_DEVICE_NAME */ ++#define WPS_MAX_DEVICE_NAME_LEN 32 ++ ++/* Value of WPS Request Type Attribute */ ++#define WPS_REQ_TYPE_ENROLLEE_INFO_ONLY 0x00 ++#define WPS_REQ_TYPE_ENROLLEE_OPEN_8021X 0x01 ++#define WPS_REQ_TYPE_REGISTRAR 0x02 ++#define WPS_REQ_TYPE_WLAN_MANAGER_REGISTRAR 0x03 ++ ++/* Value of WPS Response Type Attribute */ ++#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00 ++#define WPS_RESPONSE_TYPE_8021X 0x01 ++#define WPS_RESPONSE_TYPE_REGISTRAR 0x02 ++#define WPS_RESPONSE_TYPE_AP 0x03 ++ ++/* Value of WPS WiFi Simple Configuration State Attribute */ ++#define WPS_WSC_STATE_NOT_CONFIG 0x01 ++#define WPS_WSC_STATE_CONFIG 0x02 ++ ++/* Value of WPS Version Attribute */ ++#define WPS_VERSION_1 0x10 ++ ++/* Value of WPS Configuration Method Attribute */ ++#define WPS_CONFIG_METHOD_FLASH 0x0001 ++#define WPS_CONFIG_METHOD_ETHERNET 0x0002 ++#define WPS_CONFIG_METHOD_LABEL 0x0004 ++#define WPS_CONFIG_METHOD_DISPLAY 0x0008 ++#define WPS_CONFIG_METHOD_E_NFC 0x0010 ++#define WPS_CONFIG_METHOD_I_NFC 0x0020 ++#define WPS_CONFIG_METHOD_NFC 0x0040 ++#define WPS_CONFIG_METHOD_PBC 0x0080 ++#define WPS_CONFIG_METHOD_KEYPAD 0x0100 ++#define WPS_CONFIG_METHOD_VPBC 0x0280 ++#define WPS_CONFIG_METHOD_PPBC 0x0480 ++#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 ++#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 ++ ++/* Value of Category ID of WPS Primary Device Type Attribute */ ++#define WPS_PDT_CID_DISPLAYS 0x0007 ++#define WPS_PDT_CID_MULIT_MEDIA 0x0008 ++#define WPS_PDT_CID_RTK_WIDI WPS_PDT_CID_MULIT_MEDIA ++ ++/* Value of Sub Category ID of WPS Primary Device Type Attribute */ ++#define WPS_PDT_SCID_MEDIA_SERVER 0x0005 ++#define WPS_PDT_SCID_RTK_DMP WPS_PDT_SCID_MEDIA_SERVER ++ ++/* Value of Device Password ID */ ++#define WPS_DPID_P 0x0000 ++#define WPS_DPID_USER_SPEC 0x0001 ++#define WPS_DPID_MACHINE_SPEC 0x0002 ++#define WPS_DPID_REKEY 0x0003 ++#define WPS_DPID_PBC 0x0004 ++#define WPS_DPID_REGISTRAR_SPEC 0x0005 ++ ++/* Value of WPS RF Bands Attribute */ ++#define WPS_RF_BANDS_2_4_GHZ 0x01 ++#define WPS_RF_BANDS_5_GHZ 0x02 ++ ++/* Value of WPS Association State Attribute */ ++#define WPS_ASSOC_STATE_NOT_ASSOCIATED 0x00 ++#define WPS_ASSOC_STATE_CONNECTION_SUCCESS 0x01 ++#define WPS_ASSOC_STATE_CONFIGURATION_FAILURE 0x02 ++#define WPS_ASSOC_STATE_ASSOCIATION_FAILURE 0x03 ++#define WPS_ASSOC_STATE_IP_FAILURE 0x04 ++ ++/* =====================P2P Section===================== */ ++/* For P2P */ ++#define P2POUI 0x506F9A09 ++ ++/* P2P Attribute ID */ ++#define P2P_ATTR_STATUS 0x00 ++#define P2P_ATTR_MINOR_REASON_CODE 0x01 ++#define P2P_ATTR_CAPABILITY 0x02 ++#define P2P_ATTR_DEVICE_ID 0x03 ++#define P2P_ATTR_GO_INTENT 0x04 ++#define P2P_ATTR_CONF_TIMEOUT 0x05 ++#define P2P_ATTR_LISTEN_CH 0x06 ++#define P2P_ATTR_GROUP_BSSID 0x07 ++#define P2P_ATTR_EX_LISTEN_TIMING 0x08 ++#define P2P_ATTR_INTENTED_IF_ADDR 0x09 ++#define P2P_ATTR_MANAGEABILITY 0x0A ++#define P2P_ATTR_CH_LIST 0x0B ++#define P2P_ATTR_NOA 0x0C ++#define P2P_ATTR_DEVICE_INFO 0x0D ++#define P2P_ATTR_GROUP_INFO 0x0E ++#define P2P_ATTR_GROUP_ID 0x0F ++#define P2P_ATTR_INTERFACE 0x10 ++#define P2P_ATTR_OPERATING_CH 0x11 ++#define P2P_ATTR_INVITATION_FLAGS 0x12 ++ ++/* Value of Status Attribute */ ++#define P2P_STATUS_SUCCESS 0x00 ++#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01 ++#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02 ++#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03 ++#define P2P_STATUS_FAIL_INVALID_PARAM 0x04 ++#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05 ++#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06 ++#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07 ++#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08 ++#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09 ++#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A ++#define P2P_STATUS_FAIL_USER_REJECT 0x0B ++ ++/* Value of Inviation Flags Attribute */ ++#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0) ++ ++#define DMP_P2P_DEVCAP_SUPPORT (P2P_DEVCAP_SERVICE_DISCOVERY | \ ++ P2P_DEVCAP_CLIENT_DISCOVERABILITY | \ ++ P2P_DEVCAP_CONCURRENT_OPERATION | \ ++ P2P_DEVCAP_INVITATION_PROC) ++ ++#define DMP_P2P_GRPCAP_SUPPORT (P2P_GRPCAP_INTRABSS) ++ ++/* Value of Device Capability Bitmap */ ++#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0) ++#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1) ++#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2) ++#define P2P_DEVCAP_INFRA_MANAGED BIT(3) ++#define P2P_DEVCAP_DEVICE_LIMIT BIT(4) ++#define P2P_DEVCAP_INVITATION_PROC BIT(5) ++ ++/* Value of Group Capability Bitmap */ ++#define P2P_GRPCAP_GO BIT(0) ++#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1) ++#define P2P_GRPCAP_GROUP_LIMIT BIT(2) ++#define P2P_GRPCAP_INTRABSS BIT(3) ++#define P2P_GRPCAP_CROSS_CONN BIT(4) ++#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5) ++#define P2P_GRPCAP_GROUP_FORMATION BIT(6) ++ ++/* P2P Public Action Frame (Management Frame) */ ++#define P2P_PUB_ACTION_ACTION 0x09 ++ ++/* P2P Public Action Frame Type */ ++#define P2P_GO_NEGO_REQ 0 ++#define P2P_GO_NEGO_RESP 1 ++#define P2P_GO_NEGO_CONF 2 ++#define P2P_INVIT_REQ 3 ++#define P2P_INVIT_RESP 4 ++#define P2P_DEVDISC_REQ 5 ++#define P2P_DEVDISC_RESP 6 ++#define P2P_PROVISION_DISC_REQ 7 ++#define P2P_PROVISION_DISC_RESP 8 ++ ++/* P2P Action Frame Type */ ++#define P2P_NOTICE_OF_ABSENCE 0 ++#define P2P_PRESENCE_REQUEST 1 ++#define P2P_PRESENCE_RESPONSE 2 ++#define P2P_GO_DISC_REQUEST 3 ++ ++#define P2P_MAX_PERSISTENT_GROUP_NUM 10 ++ ++#define P2P_PROVISIONING_SCAN_CNT 3 ++ ++#define P2P_WILDCARD_SSID_LEN 7 ++ ++/* default value, used when: (1)p2p disabed or (2)p2p enabled ++ * but only do 1 scan phase */ ++#define P2P_FINDPHASE_EX_NONE 0 ++/* used when p2p enabled and want to do 1 scan phase and ++ * P2P_FINDPHASE_EX_MAX-1 find phase */ ++#define P2P_FINDPHASE_EX_FULL 1 ++#define P2P_FINDPHASE_EX_SOCIAL_FIRST (P2P_FINDPHASE_EX_FULL+1) ++#define P2P_FINDPHASE_EX_MAX 4 ++#define P2P_FINDPHASE_EX_SOCIAL_LAST P2P_FINDPHASE_EX_MAX ++ ++/* 5 seconds timeout for sending the provision discovery request */ ++#define P2P_PROVISION_TIMEOUT 5000 ++/* 3 seconds timeout for sending the prov disc request concurrent mode */ ++#define P2P_CONCURRENT_PROVISION_TIME 3000 ++/* 5 seconds timeout for receiving the group negotiation response */ ++#define P2P_GO_NEGO_TIMEOUT 5000 ++/* 3 seconds timeout for sending the negotiation request under concurrent mode */ ++#define P2P_CONCURRENT_GO_NEGO_TIME 3000 ++/* 100ms */ ++#define P2P_TX_PRESCAN_TIMEOUT 100 ++/* 5 seconds timeout for sending the invitation request */ ++#define P2P_INVITE_TIMEOUT 5000 ++/* 3 seconds timeout for sending the invitation request under concurrent mode */ ++#define P2P_CONCURRENT_INVITE_TIME 3000 ++/* 25 seconds timeout to reset the scan channel (based on channel plan) */ ++#define P2P_RESET_SCAN_CH 25000 ++#define P2P_MAX_INTENT 15 ++ ++#define P2P_MAX_NOA_NUM 2 ++ ++/* WPS Configuration Method */ ++#define WPS_CM_NONE 0x0000 ++#define WPS_CM_LABEL 0x0004 ++#define WPS_CM_DISPLYA 0x0008 ++#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010 ++#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020 ++#define WPS_CM_NFC_INTERFACE 0x0040 ++#define WPS_CM_PUSH_BUTTON 0x0080 ++#define WPS_CM_KEYPAD 0x0100 ++#define WPS_CM_SW_PUHS_BUTTON 0x0280 ++#define WPS_CM_HW_PUHS_BUTTON 0x0480 ++#define WPS_CM_SW_DISPLAY_P 0x2008 ++#define WPS_CM_LCD_DISPLAY_P 0x4008 ++ ++enum P2P_ROLE { ++ P2P_ROLE_DISABLE = 0, ++ P2P_ROLE_DEVICE = 1, ++ P2P_ROLE_CLIENT = 2, ++ P2P_ROLE_GO = 3 ++}; ++ ++enum P2P_STATE { ++ P2P_STATE_NONE = 0, /* P2P disable */ ++ /* P2P had enabled and do nothing */ ++ P2P_STATE_IDLE = 1, ++ P2P_STATE_LISTEN = 2, /* In pure listen state */ ++ P2P_STATE_SCAN = 3, /* In scan phase */ ++ /* In the listen state of find phase */ ++ P2P_STATE_FIND_PHASE_LISTEN = 4, ++ /* In the search state of find phase */ ++ P2P_STATE_FIND_PHASE_SEARCH = 5, ++ /* In P2P provisioning discovery */ ++ P2P_STATE_TX_PROVISION_DIS_REQ = 6, ++ P2P_STATE_RX_PROVISION_DIS_RSP = 7, ++ P2P_STATE_RX_PROVISION_DIS_REQ = 8, ++ /* Doing the group owner negoitation handshake */ ++ P2P_STATE_GONEGO_ING = 9, ++ /* finish the group negoitation handshake with success */ ++ P2P_STATE_GONEGO_OK = 10, ++ /* finish the group negoitation handshake with failure */ ++ P2P_STATE_GONEGO_FAIL = 11, ++ /* receiving the P2P Inviation request and match with the profile. */ ++ P2P_STATE_RECV_INVITE_REQ_MATCH = 12, ++ /* Doing the P2P WPS */ ++ P2P_STATE_PROVISIONING_ING = 13, ++ /* Finish the P2P WPS */ ++ P2P_STATE_PROVISIONING_DONE = 14, ++ /* Transmit the P2P Invitation request */ ++ P2P_STATE_TX_INVITE_REQ = 15, ++ /* Receiving the P2P Invitation response */ ++ P2P_STATE_RX_INVITE_RESP_OK = 16, ++ /* receiving the P2P Inviation request and dismatch with the profile. */ ++ P2P_STATE_RECV_INVITE_REQ_DISMATCH = 17, ++ /* receiving the P2P Inviation request and this wifi is GO. */ ++ P2P_STATE_RECV_INVITE_REQ_GO = 18, ++ /* receiving the P2P Inviation request to join an existing P2P Group. */ ++ P2P_STATE_RECV_INVITE_REQ_JOIN = 19, ++ /* recveing the P2P Inviation response with failure */ ++ P2P_STATE_RX_INVITE_RESP_FAIL = 20, ++ /* receiving p2p negoitation response with information is not available */ ++ P2P_STATE_RX_INFOR_NOREADY = 21, ++ /* sending p2p negoitation response with information is not available */ ++ P2P_STATE_TX_INFOR_NOREADY = 22, ++}; ++ ++enum P2P_WPSINFO { ++ P2P_NO_WPSINFO = 0, ++ P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, ++ P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, ++ P2P_GOT_WPSINFO_PBC = 3, ++}; ++ ++#define P2P_PRIVATE_IOCTL_SET_LEN 64 ++ ++enum P2P_PROTO_WK_ID { ++ P2P_FIND_PHASE_WK = 0, ++ P2P_RESTORE_STATE_WK = 1, ++ P2P_PRE_TX_PROVDISC_PROCESS_WK = 2, ++ P2P_PRE_TX_NEGOREQ_PROCESS_WK = 3, ++ P2P_PRE_TX_INVITEREQ_PROCESS_WK = 4, ++ P2P_AP_P2P_CH_SWITCH_PROCESS_WK =5, ++ P2P_RO_CH_WK = 6, ++}; ++ ++enum P2P_PS_STATE { ++ P2P_PS_DISABLE = 0, ++ P2P_PS_ENABLE = 1, ++ P2P_PS_SCAN = 2, ++ P2P_PS_SCAN_DONE = 3, ++ P2P_PS_ALLSTASLEEP = 4, /* for P2P GO */ ++}; ++ ++enum P2P_PS_MODE { ++ P2P_PS_NONE = 0, ++ P2P_PS_CTWINDOW = 1, ++ P2P_PS_NOA = 2, ++ P2P_PS_MIX = 3, /* CTWindow and NoA */ ++}; ++ ++/* =====================WFD Section===================== */ ++/* For Wi-Fi Display */ ++#define WFD_ATTR_DEVICE_INFO 0x00 ++#define WFD_ATTR_ASSOC_BSSID 0x01 ++#define WFD_ATTR_COUPLED_SINK_INFO 0x06 ++#define WFD_ATTR_LOCAL_IP_ADDR 0x08 ++#define WFD_ATTR_SESSION_INFO 0x09 ++#define WFD_ATTR_ALTER_MAC 0x0a ++ ++/* For WFD Device Information Attribute */ ++#define WFD_DEVINFO_SOURCE 0x0000 ++#define WFD_DEVINFO_PSINK 0x0001 ++#define WFD_DEVINFO_SSINK 0x0002 ++#define WFD_DEVINFO_DUAL 0x0003 ++ ++#define WFD_DEVINFO_SESSION_AVAIL 0x0010 ++#define WFD_DEVINFO_WSD 0x0040 ++#define WFD_DEVINFO_PC_TDLS 0x0080 ++#define WFD_DEVINFO_HDCP_SUPPORT 0x0100 ++ ++#define IP_MCAST_MAC(mac) \ ++ ((mac[0] == 0x01) && (mac[1] == 0x00) && (mac[2] == 0x5e)) ++#define ICMPV6_MCAST_MAC(mac) \ ++ ((mac[0] == 0x33) && (mac[1] == 0x33) && (mac[2] != 0xff)) ++ ++#endif /* _WIFI_H_ */ +diff --git a/drivers/staging/r8188eu/include/wlan_bssdef.h b/drivers/staging/r8188eu/include/wlan_bssdef.h +new file mode 100644 +index 000000000000..99ca097b8edd +--- /dev/null ++++ b/drivers/staging/r8188eu/include/wlan_bssdef.h +@@ -0,0 +1,327 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __WLAN_BSSDEF_H__ ++#define __WLAN_BSSDEF_H__ ++ ++#define MAX_IE_SZ 768 ++ ++#define NDIS_802_11_LENGTH_SSID 32 ++#define NDIS_802_11_LENGTH_RATES 8 ++#define NDIS_802_11_LENGTH_RATES_EX 16 ++ ++#define NDIS_802_11_RSSI long /* in dBm */ ++ ++struct ndis_802_11_ssid { ++ u32 SsidLength; ++ u8 Ssid[32]; ++}; ++ ++enum NDIS_802_11_NETWORK_TYPE { ++ Ndis802_11FH, ++ Ndis802_11DS, ++ Ndis802_11OFDM5, ++ Ndis802_11OFDM24, ++ Ndis802_11NetworkTypeMax /* dummy upper bound */ ++}; ++ ++struct ndis_802_11_config_fh { ++ u32 Length; /* Length of structure */ ++ u32 HopPattern; /* As defined by 802.11, MSB set */ ++ u32 HopSet; /* to one if non-802.11 */ ++ u32 DwellTime; /* units are Kusec */ ++}; ++ ++/* ++ * FW will only save the channel number in DSConfig. ++ * ODI Handler will convert the channel number to freq. number. ++ */ ++struct ndis_802_11_config { ++ u32 Length; /* Length of structure */ ++ u32 BeaconPeriod; /* units are Kusec */ ++ u32 ATIMWindow; /* units are Kusec */ ++ u32 DSConfig; /* Frequency, units are kHz */ ++ struct ndis_802_11_config_fh FHConfig; ++}; ++ ++enum ndis_802_11_network_infra { ++ Ndis802_11IBSS, ++ Ndis802_11Infrastructure, ++ Ndis802_11AutoUnknown, ++ Ndis802_11InfrastructureMax, /* dummy upper bound */ ++ Ndis802_11APMode ++}; ++ ++struct ndis_802_11_fixed_ie { ++ u8 Timestamp[8]; ++ u16 BeaconInterval; ++ u16 Capabilities; ++}; ++ ++struct ndis_802_11_var_ie { ++ u8 ElementID; ++ u8 Length; ++ u8 data[1]; ++}; ++ ++/* ++ * Length is the 4 bytes multiples of the sume of ++ * [ETH_ALEN] + 2 + sizeof (struct ndis_802_11_ssid) + sizeof (u32) ++ * + sizeof (NDIS_802_11_RSSI) + sizeof (enum NDIS_802_11_NETWORK_TYPE) ++ * + sizeof (struct ndis_802_11_config) ++ * + NDIS_802_11_LENGTH_RATES_EX + IELength ++ * ++ * Except the IELength, all other fields are fixed length. ++ * Therefore, we can define a macro to represent the partial sum. */ ++ ++enum ndis_802_11_auth_mode { ++ Ndis802_11AuthModeOpen, ++ Ndis802_11AuthModeShared, ++ Ndis802_11AuthModeAutoSwitch, ++ Ndis802_11AuthModeWPA, ++ Ndis802_11AuthModeWPAPSK, ++ Ndis802_11AuthModeWPANone, ++ Ndis802_11AuthModeWAPI, ++ Ndis802_11AuthModeMax /* Not a real mode, upper bound */ ++}; ++ ++enum ndis_802_11_wep_status { ++ Ndis802_11WEPEnabled, ++ Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, ++ Ndis802_11WEPDisabled, ++ Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, ++ Ndis802_11WEPKeyAbsent, ++ Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, ++ Ndis802_11WEPNotSupported, ++ Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, ++ Ndis802_11Encryption2Enabled, ++ Ndis802_11Encryption2KeyAbsent, ++ Ndis802_11Encryption3Enabled, ++ Ndis802_11Encryption3KeyAbsent, ++ Ndis802_11_EncryptionWAPI ++}; ++ ++#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 ++#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 ++#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 ++ ++#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 ++#define NDIS_802_11_AI_RESFI_STATUSCODE 2 ++#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 ++ ++struct ndis_802_11_ai_reqfi { ++ u16 Capabilities; ++ u16 ListenInterval; ++ unsigned char CurrentAPAddress[ETH_ALEN]; ++}; ++ ++struct ndis_802_11_ai_resfi { ++ u16 Capabilities; ++ u16 StatusCode; ++ u16 AssociationId; ++}; ++ ++struct ndis_802_11_assoc_info { ++ u32 Length; ++ u16 AvailableRequestFixedIEs; ++ struct ndis_802_11_ai_reqfi RequestFixedIEs; ++ u32 RequestIELength; ++ u32 OffsetRequestIEs; ++ u16 AvailableResponseFixedIEs; ++ struct ndis_802_11_ai_resfi ResponseFixedIEs; ++ u32 ResponseIELength; ++ u32 OffsetResponseIEs; ++}; ++ ++enum ndis_802_11_reload_def { ++ Ndis802_11ReloadWEPKeys ++}; ++ ++/* Key mapping keys require a BSSID */ ++struct ndis_802_11_key { ++ u32 Length; /* Length of this structure */ ++ u32 KeyIndex; ++ u32 KeyLength; /* length of key in bytes */ ++ unsigned char BSSID[ETH_ALEN]; ++ unsigned long long KeyRSC; ++ u8 KeyMaterial[32]; /* var len depending on above field */ ++}; ++ ++struct ndis_802_11_remove_key { ++ u32 Length; /* Length */ ++ u32 KeyIndex; ++ unsigned char BSSID[ETH_ALEN]; ++}; ++ ++struct ndis_802_11_wep { ++ u32 Length; /* Length of this structure */ ++ u32 KeyIndex; /* 0 is the per-client key, ++ * 1-N are the global keys */ ++ u32 KeyLength; /* length of key in bytes */ ++ u8 KeyMaterial[16];/* variable len depending on above field */ ++}; ++ ++struct ndis_802_11_auth_req { ++ u32 Length; /* Length of structure */ ++ unsigned char Bssid[ETH_ALEN]; ++ u32 Flags; ++}; ++ ++enum ndis_802_11_status_type { ++ Ndis802_11StatusType_Authentication, ++ Ndis802_11StatusType_MediaStreamMode, ++ Ndis802_11StatusType_PMKID_CandidateList, ++ Ndis802_11StatusTypeMax /* not a real type, defined as ++ * an upper bound */ ++}; ++ ++struct ndis_802_11_status_ind { ++ enum ndis_802_11_status_type StatusType; ++}; ++ ++/* mask for authentication/integrity fields */ ++#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f ++#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 ++#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 ++#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 ++#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E ++ ++/* MIC check time, 60 seconds. */ ++#define MIC_CHECK_TIME 60000000 ++ ++struct ndis_802_11_auth_evt { ++ struct ndis_802_11_status_ind Status; ++ struct ndis_802_11_auth_req Request[1]; ++}; ++ ++struct ndis_802_11_test { ++ u32 Length; ++ u32 Type; ++ union { ++ struct ndis_802_11_auth_evt AuthenticationEvent; ++ NDIS_802_11_RSSI RssiTrigger; ++ } tt; ++}; ++ ++#ifndef Ndis802_11APMode ++#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1) ++#endif ++ ++struct wlan_phy_info { ++ u8 SignalStrength;/* in percentage) */ ++ u8 SignalQuality;/* in percentage) */ ++ u8 Optimum_antenna; /* for Antenna diversity */ ++ u8 Reserved_0; ++}; ++ ++struct wlan_bcn_info { ++ /* these infor get from rtw_get_encrypt_info when ++ * * translate scan to UI */ ++ u8 encryp_protocol;/* ENCRYP_PROTOCOL_E: OPEN/WEP/WPA/WPA2/WAPI */ ++ int group_cipher; /* WPA/WPA2 group cipher */ ++ int pairwise_cipher;/* WPA/WPA2/WEP pairwise cipher */ ++ int is_8021x; ++ ++ /* bwmode 20/40 and ch_offset UP/LOW */ ++ unsigned short ht_cap_info; ++ unsigned char ht_info_infos_0; ++}; ++ ++/* temporally add #pragma pack for structure alignment issue of ++* struct wlan_bssid_ex and get_struct wlan_bssid_ex_sz() ++*/ ++struct wlan_bssid_ex { ++ u32 Length; ++ unsigned char MacAddress[ETH_ALEN]; ++ u8 Reserved[2];/* 0]: IS beacon frame */ ++ struct ndis_802_11_ssid Ssid; ++ u32 Privacy; ++ NDIS_802_11_RSSI Rssi;/* in dBM,raw data ,get from PHY) */ ++ enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; ++ struct ndis_802_11_config Configuration; ++ enum ndis_802_11_network_infra InfrastructureMode; ++ unsigned char SupportedRates[NDIS_802_11_LENGTH_RATES_EX]; ++ struct wlan_phy_info PhyInfo; ++ u32 IELength; ++ u8 IEs[MAX_IE_SZ]; /* timestamp, beacon interval, and ++ * capability information) */ ++} __packed; ++ ++static inline uint get_wlan_bssid_ex_sz(struct wlan_bssid_ex *bss) ++{ ++ return sizeof(struct wlan_bssid_ex) - MAX_IE_SZ + bss->IELength; ++} ++ ++struct wlan_network { ++ struct list_head list; ++ int network_type; /* refer to ieee80211.h for WIRELESS_11B/G */ ++ int fixed; /* set fixed when not to be removed ++ * in site-surveying */ ++ unsigned long last_scanned; /* timestamp for the network */ ++ int aid; /* will only be valid when a BSS is joinned. */ ++ int join_res; ++ struct wlan_bssid_ex network; /* must be the last item */ ++ struct wlan_bcn_info BcnInfo; ++}; ++ ++enum VRTL_CARRIER_SENSE { ++ DISABLE_VCS, ++ ENABLE_VCS, ++ AUTO_VCS ++}; ++ ++enum VCS_TYPE { ++ NONE_VCS, ++ RTS_CTS, ++ CTS_TO_SELF ++}; ++ ++#define PWR_CAM 0 ++#define PWR_MINPS 1 ++#define PWR_MAXPS 2 ++#define PWR_UAPSD 3 ++#define PWR_VOIP 4 ++ ++enum UAPSD_MAX_SP { ++ NO_LIMIT, ++ TWO_MSDU, ++ FOUR_MSDU, ++ SIX_MSDU ++}; ++ ++#define NUM_PRE_AUTH_KEY 16 ++#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY ++ ++/* ++* WPA2 ++*/ ++ ++struct pmkid_candidate { ++ unsigned char BSSID[ETH_ALEN]; ++ u32 Flags; ++}; ++ ++struct ndis_802_11_pmkid_list { ++ u32 Version; /* Version of the structure */ ++ u32 NumCandidates; /* No. of pmkid candidates */ ++ struct pmkid_candidate CandidateList[1]; ++}; ++ ++struct ndis_802_11_auth_encrypt { ++ enum ndis_802_11_auth_mode AuthModeSupported; ++ enum ndis_802_11_wep_status EncryptStatusSupported; ++}; ++ ++struct ndis_802_11_cap { ++ u32 Length; ++ u32 Version; ++ u32 NoOfPMKIDs; ++ u32 NoOfAuthEncryptPairsSupported; ++ struct ndis_802_11_auth_encrypt AuthenticationEncryptionSupported[1]; ++}; ++ ++u8 key_2char2num(u8 hch, u8 lch); ++u8 key_char2num(u8 ch); ++u8 str_2char2num(u8 hch, u8 lch); ++ ++#endif /* ifndef WLAN_BSSDEF_H_ */ +diff --git a/drivers/staging/r8188eu/include/xmit_osdep.h b/drivers/staging/r8188eu/include/xmit_osdep.h +new file mode 100644 +index 000000000000..191c36361b63 +--- /dev/null ++++ b/drivers/staging/r8188eu/include/xmit_osdep.h +@@ -0,0 +1,51 @@ ++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#ifndef __XMIT_OSDEP_H_ ++#define __XMIT_OSDEP_H_ ++ ++#include "osdep_service.h" ++#include "drv_types.h" ++ ++struct pkt_file { ++ struct sk_buff *pkt; ++ size_t pkt_len; /* the remainder length of the open_file */ ++ unsigned char *cur_buffer; ++ u8 *buf_start; ++ u8 *cur_addr; ++ size_t buf_len; ++}; ++ ++extern int rtw_ht_enable; ++extern int rtw_cbw40_enable; ++extern int rtw_ampdu_enable;/* for enable tx_ampdu */ ++ ++#define NR_XMITFRAME 256 ++ ++struct xmit_priv; ++struct pkt_attrib; ++struct sta_xmit_priv; ++struct xmit_frame; ++struct xmit_buf; ++ ++int rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev); ++ ++void rtw_os_xmit_schedule(struct adapter *padapter); ++ ++int rtw_os_xmit_resource_alloc(struct adapter *padapter, ++ struct xmit_buf *pxmitbuf, u32 alloc_sz); ++void rtw_os_xmit_resource_free(struct adapter *padapter, ++ struct xmit_buf *pxmitbuf, u32 free_sz); ++ ++void rtw_set_tx_chksum_offload(struct sk_buff *pkt, struct pkt_attrib *pattrib); ++ ++uint rtw_remainder_len(struct pkt_file *pfile); ++void _rtw_open_pktfile(struct sk_buff *pkt, struct pkt_file *pfile); ++uint _rtw_pktfile_read(struct pkt_file *pfile, u8 *rmem, uint rlen); ++int rtw_endofpktfile(struct pkt_file *pfile); ++ ++void rtw_os_pkt_complete(struct adapter *padapter, struct sk_buff *pkt); ++void rtw_os_xmit_complete(struct adapter *padapter, ++ struct xmit_frame *pxframe); ++ ++#endif /* __XMIT_OSDEP_H_ */ +diff --git a/drivers/staging/r8188eu/os_dep/ioctl_linux.c b/drivers/staging/r8188eu/os_dep/ioctl_linux.c +new file mode 100644 +index 000000000000..1fd375076001 +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c +@@ -0,0 +1,6649 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _IOCTL_LINUX_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wlan_bssdef.h" ++#include "../include/rtw_debug.h" ++#include "../include/wifi.h" ++#include "../include/rtw_mlme.h" ++#include "../include/rtw_mlme_ext.h" ++#include "../include/rtw_ioctl.h" ++#include "../include/rtw_ioctl_set.h" ++#include "../include/rtw_mp_ioctl.h" ++#include "../include/usb_ops.h" ++#include "../include/rtl8188e_hal.h" ++ ++#include "../include/rtw_mp.h" ++#include "../include/rtw_iol.h" ++ ++#define RTL_IOCTL_WPA_SUPPLICANT (SIOCIWFIRSTPRIV + 30) ++ ++#define SCAN_ITEM_SIZE 768 ++#define MAX_CUSTOM_LEN 64 ++#define RATE_COUNT 4 ++ ++/* combo scan */ ++#define WEXT_CSCAN_AMOUNT 9 ++#define WEXT_CSCAN_BUF_LEN 360 ++#define WEXT_CSCAN_HEADER "CSCAN S\x01\x00\x00S\x00" ++#define WEXT_CSCAN_HEADER_SIZE 12 ++#define WEXT_CSCAN_SSID_SECTION 'S' ++#define WEXT_CSCAN_CHANNEL_SECTION 'C' ++#define WEXT_CSCAN_NPROBE_SECTION 'N' ++#define WEXT_CSCAN_ACTV_DWELL_SECTION 'A' ++#define WEXT_CSCAN_PASV_DWELL_SECTION 'P' ++#define WEXT_CSCAN_HOME_DWELL_SECTION 'H' ++#define WEXT_CSCAN_TYPE_SECTION 'T' ++ ++static struct mp_ioctl_handler mp_ioctl_hdl[] = { ++/*0*/ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST) ++ ++ GEN_HANDLER(sizeof(struct rwreg_param), rtl8188eu_oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER) ++ GEN_HANDLER(sizeof(struct rwreg_param), rtl8188eu_oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER) ++ GEN_HANDLER(sizeof(struct bb_reg_param), rtl8188eu_oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG) ++/*5*/ GEN_HANDLER(sizeof(struct bb_reg_param), rtl8188eu_oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG) ++ GEN_HANDLER(sizeof(struct rf_reg_param), rtl8188eu_oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY) ++ GEN_HANDLER(sizeof(struct rf_reg_param), rtl8188eu_oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY) ++ ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL) ++ GEN_HANDLER(sizeof(struct txpower_param), rtl8188eu_oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL) ++/*10*/ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB) ++ ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX) ++/*15*/ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX) ++ ++ EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0) ++ ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE) ++ GEN_HANDLER(0, rtl8188eu_oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT) ++/*20*/ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR) ++ ++ GEN_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) ++ GEN_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) ++ GEN_HANDLER(sizeof(struct efuse_access_struct), rtl8188eu_oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE) ++/*25*/ GEN_HANDLER(0, rtl8188eu_oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE) ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE) ++ ++ GEN_HANDLER(sizeof(u32), rtl8188eu_oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER) ++ GEN_HANDLER(sizeof(u8), rtl8188eu_oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING) ++/*30*/ GEN_HANDLER(sizeof(u8), rtl8188eu_oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN) ++/*31*/ GEN_HANDLER(0, rtl8188eu_oid_rt_pro_trigger_gpio_hdl, 0) ++}; ++ ++static u32 rtw_rates[] = {1000000, 2000000, 5500000, 11000000, ++ 6000000, 9000000, 12000000, 18000000, 24000000, 36000000, ++ 48000000, 54000000}; ++ ++void indicate_wx_scan_complete_event(struct adapter *padapter) ++{ ++ union iwreq_data wrqu; ++ ++ memset(&wrqu, 0, sizeof(union iwreq_data)); ++ wireless_send_event(padapter->pnetdev, SIOCGIWSCAN, &wrqu, NULL); ++} ++ ++void rtw_indicate_wx_assoc_event(struct adapter *padapter) ++{ ++ union iwreq_data wrqu; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ memset(&wrqu, 0, sizeof(union iwreq_data)); ++ ++ wrqu.ap_addr.sa_family = ARPHRD_ETHER; ++ ++ memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN); ++ ++ DBG_88E_LEVEL(_drv_always_, "assoc success\n"); ++ wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL); ++} ++ ++void rtw_indicate_wx_disassoc_event(struct adapter *padapter) ++{ ++ union iwreq_data wrqu; ++ ++ memset(&wrqu, 0, sizeof(union iwreq_data)); ++ ++ wrqu.ap_addr.sa_family = ARPHRD_ETHER; ++ memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); ++ ++ DBG_88E_LEVEL(_drv_always_, "indicate disassoc\n"); ++ wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL); ++} ++ ++static char *translate_scan(struct adapter *padapter, ++ struct iw_request_info *info, ++ struct wlan_network *pnetwork, ++ char *start, char *stop) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct iw_event iwe; ++ u16 cap; ++ __le16 le_tmp; ++ u32 ht_ielen = 0; ++ char *custom; ++ char *p; ++ u16 max_rate = 0, rate, ht_cap = false; ++ u32 i = 0; ++ u8 bw_40MHz = 0, short_GI = 0; ++ u16 mcs_rate = 0; ++ u8 ss, sq; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ u32 blnGotP2PIE = false; ++ ++ /* User is doing the P2P device discovery */ ++ /* The prefix of SSID should be "DIRECT-" and the IE should contains the P2P IE. */ ++ /* If not, the driver should ignore this AP and go to the next AP. */ ++ ++ /* Verifying the SSID */ ++ if (!memcmp(pnetwork->network.Ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN)) { ++ u32 p2pielen = 0; ++ ++ if (pnetwork->network.Reserved[0] == 2) {/* Probe Request */ ++ /* Verifying the P2P IE */ ++ if (rtw_get_p2p_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &p2pielen)) ++ blnGotP2PIE = true; ++ } else {/* Beacon or Probe Respones */ ++ /* Verifying the P2P IE */ ++ if (rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) ++ blnGotP2PIE = true; ++ } ++ } ++ ++ if (!blnGotP2PIE) ++ return start; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ /* AP MAC address */ ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ ++ memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN); ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN); ++ ++ /* Add the ESSID */ ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.flags = 1; ++ iwe.u.data.length = min_t(u16, pnetwork->network.Ssid.SsidLength, 32); ++ start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid); ++ ++ /* parsing HT_CAP_IE */ ++ p = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength - 12); ++ ++ if (p && ht_ielen > 0) { ++ struct ieee80211_ht_cap *pht_capie; ++ ++ ht_cap = true; ++ pht_capie = (struct ieee80211_ht_cap *)(p + 2); ++ memcpy(&mcs_rate, pht_capie->mcs.rx_mask, 2); ++ bw_40MHz = (le16_to_cpu(pht_capie->cap_info) & ++ IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0; ++ short_GI = (le16_to_cpu(pht_capie->cap_info) & ++ (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) ? 1 : 0; ++ } ++ ++ /* Add the protocol name */ ++ iwe.cmd = SIOCGIWNAME; ++ if ((rtw_is_cckratesonly_included((u8 *)&pnetwork->network.SupportedRates))) { ++ if (ht_cap) ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bn"); ++ else ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11b"); ++ } else if ((rtw_is_cckrates_included((u8 *)&pnetwork->network.SupportedRates))) { ++ if (ht_cap) ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bgn"); ++ else ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg"); ++ } else { ++ if (ht_cap) ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11gn"); ++ else ++ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11g"); ++ } ++ ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN); ++ ++ /* Add mode */ ++ iwe.cmd = SIOCGIWMODE; ++ memcpy(&le_tmp, rtw_get_capability_from_ie(pnetwork->network.IEs), 2); ++ ++ cap = le16_to_cpu(le_tmp); ++ ++ if (cap & (WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_BSS)) { ++ if (cap & WLAN_CAPABILITY_BSS) ++ iwe.u.mode = IW_MODE_MASTER; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN); ++ } ++ ++ if (pnetwork->network.Configuration.DSConfig < 1) ++ pnetwork->network.Configuration.DSConfig = 1; ++ ++ /* Add frequency/channel */ ++ iwe.cmd = SIOCGIWFREQ; ++ iwe.u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000; ++ iwe.u.freq.e = 1; ++ iwe.u.freq.i = pnetwork->network.Configuration.DSConfig; ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN); ++ ++ /* Add encryption capability */ ++ iwe.cmd = SIOCGIWENCODE; ++ if (cap & WLAN_CAPABILITY_PRIVACY) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid); ++ ++ /*Add basic and extended rates */ ++ max_rate = 0; ++ custom = kzalloc(MAX_CUSTOM_LEN, GFP_ATOMIC); ++ if (!custom) ++ return start; ++ p = custom; ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): "); ++ while (pnetwork->network.SupportedRates[i] != 0) { ++ rate = pnetwork->network.SupportedRates[i] & 0x7F; ++ if (rate > max_rate) ++ max_rate = rate; ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); ++ i++; ++ } ++ ++ if (ht_cap) { ++ if (mcs_rate & 0x8000)/* MCS15 */ ++ max_rate = (bw_40MHz) ? ((short_GI) ? 300 : 270) : ((short_GI) ? 144 : 130); ++ else if (mcs_rate & 0x0080)/* MCS7 */ ++ ; ++ else/* default MCS7 */ ++ max_rate = (bw_40MHz) ? ((short_GI) ? 150 : 135) : ((short_GI) ? 72 : 65); ++ ++ max_rate = max_rate * 2;/* Mbps/2; */ ++ } ++ ++ iwe.cmd = SIOCGIWRATE; ++ iwe.u.bitrate.fixed = 0; ++ iwe.u.bitrate.disabled = 0; ++ iwe.u.bitrate.value = max_rate * 500000; ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN); ++ ++ /* parsing WPA/WPA2 IE */ ++ { ++ u8 *buf; ++ u8 *wpa_ie, *rsn_ie; ++ u16 wpa_len = 0, rsn_len = 0; ++ u8 *p; ++ ++ buf = kzalloc(MAX_WPA_IE_LEN, GFP_ATOMIC); ++ if (!buf) ++ goto exit; ++ wpa_ie = kzalloc(255, GFP_ATOMIC); ++ if (!wpa_ie) { ++ kfree(buf); ++ goto exit; ++ } ++ rsn_ie = kzalloc(255, GFP_ATOMIC); ++ if (!rsn_ie) { ++ kfree(buf); ++ kfree(wpa_ie); ++ goto exit; ++ } ++ rtw_get_sec_ie(pnetwork->network.IEs, pnetwork->network.IELength, rsn_ie, &rsn_len, wpa_ie, &wpa_len); ++ ++ if (wpa_len > 0) { ++ p = buf; ++ memset(buf, 0, MAX_WPA_IE_LEN); ++ p += sprintf(p, "wpa_ie ="); ++ for (i = 0; i < wpa_len; i++) ++ p += sprintf(p, "%02x", wpa_ie[i]); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVCUSTOM; ++ iwe.u.data.length = strlen(buf); ++ start = iwe_stream_add_point(info, start, stop, &iwe, buf); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = wpa_len; ++ start = iwe_stream_add_point(info, start, stop, &iwe, wpa_ie); ++ } ++ if (rsn_len > 0) { ++ p = buf; ++ memset(buf, 0, MAX_WPA_IE_LEN); ++ p += sprintf(p, "rsn_ie ="); ++ for (i = 0; i < rsn_len; i++) ++ p += sprintf(p, "%02x", rsn_ie[i]); ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVCUSTOM; ++ iwe.u.data.length = strlen(buf); ++ start = iwe_stream_add_point(info, start, stop, &iwe, buf); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = rsn_len; ++ start = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie); ++ } ++ kfree(buf); ++ kfree(wpa_ie); ++ kfree(rsn_ie); ++ } ++ ++ {/* parsing WPS IE */ ++ uint cnt = 0, total_ielen; ++ u8 *wpsie_ptr = NULL; ++ uint wps_ielen = 0; ++ ++ u8 *ie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_; ++ total_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_; ++ ++ while (cnt < total_ielen) { ++ if (rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen > 2)) { ++ wpsie_ptr = &ie_ptr[cnt]; ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = (u16)wps_ielen; ++ start = iwe_stream_add_point(info, start, stop, &iwe, wpsie_ptr); ++ } ++ cnt += ie_ptr[cnt + 1] + 2; /* goto next */ ++ } ++ } ++ ++ /* Add quality statistics */ ++ iwe.cmd = IWEVQUAL; ++ iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED) && ++ is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { ++ ss = padapter->recvpriv.signal_strength; ++ sq = padapter->recvpriv.signal_qual; ++ } else { ++ ss = pnetwork->network.PhyInfo.SignalStrength; ++ sq = pnetwork->network.PhyInfo.SignalQuality; ++ } ++ ++ iwe.u.qual.level = (u8)ss; ++ iwe.u.qual.qual = (u8)sq; /* signal quality */ ++ iwe.u.qual.noise = 0; /* noise level */ ++ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN); ++exit: ++ kfree(custom); ++ return start; ++} ++ ++static int wpa_set_auth_algs(struct net_device *dev, u32 value) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ int ret = 0; ++ ++ if ((value & AUTH_ALG_SHARED_KEY) && (value & AUTH_ALG_OPEN_SYSTEM)) { ++ DBG_88E("wpa_set_auth_algs, AUTH_ALG_SHARED_KEY and AUTH_ALG_OPEN_SYSTEM [value:0x%x]\n", value); ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; ++ } else if (value & AUTH_ALG_SHARED_KEY) { ++ DBG_88E("wpa_set_auth_algs, AUTH_ALG_SHARED_KEY [value:0x%x]\n", value); ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeShared; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; ++ } else if (value & AUTH_ALG_OPEN_SYSTEM) { ++ DBG_88E("wpa_set_auth_algs, AUTH_ALG_OPEN_SYSTEM\n"); ++ if (padapter->securitypriv.ndisauthtype < Ndis802_11AuthModeWPAPSK) { ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open; ++ } ++ } else if (value & AUTH_ALG_LEAP) { ++ DBG_88E("wpa_set_auth_algs, AUTH_ALG_LEAP\n"); ++ } else { ++ DBG_88E("wpa_set_auth_algs, error!\n"); ++ ret = -EINVAL; ++ } ++ return ret; ++} ++ ++static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) ++{ ++ int ret = 0; ++ u32 wep_key_idx, wep_key_len, wep_total_len; ++ struct ndis_802_11_wep *pwep = NULL; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ param->u.crypt.err = 0; ++ param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; ++ ++ if (param_len < (u32)((u8 *)param->u.crypt.key - (u8 *)param) + param->u.crypt.key_len) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && ++ param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && ++ param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) { ++ if (param->u.crypt.idx >= WEP_KEYS) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ } else { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ if (strcmp(param->u.crypt.alg, "WEP") == 0) { ++ DBG_88E("wpa_set_encryption, crypt.alg = WEP\n"); ++ ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_; ++ ++ wep_key_idx = param->u.crypt.idx; ++ wep_key_len = param->u.crypt.key_len; ++ ++ DBG_88E("(1)wep_key_idx =%d\n", wep_key_idx); ++ ++ if (wep_key_idx > WEP_KEYS) ++ return -EINVAL; ++ ++ if (wep_key_len > 0) { ++ wep_key_len = wep_key_len <= 5 ? 5 : 13; ++ wep_total_len = wep_key_len + FIELD_OFFSET(struct ndis_802_11_wep, KeyMaterial); ++ pwep = kmalloc(wep_total_len, GFP_KERNEL); ++ if (!pwep) ++ goto exit; ++ ++ memset(pwep, 0, wep_total_len); ++ pwep->KeyLength = wep_key_len; ++ pwep->Length = wep_total_len; ++ if (wep_key_len == 13) { ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_; ++ } ++ } else { ++ ret = -EINVAL; ++ goto exit; ++ } ++ pwep->KeyIndex = wep_key_idx; ++ pwep->KeyIndex |= 0x80000000; ++ memcpy(pwep->KeyMaterial, param->u.crypt.key, pwep->KeyLength); ++ if (param->u.crypt.set_tx) { ++ DBG_88E("wep, set_tx = 1\n"); ++ if (rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) ++ ret = -EOPNOTSUPP; ++ } else { ++ DBG_88E("wep, set_tx = 0\n"); ++ if (wep_key_idx >= WEP_KEYS) { ++ ret = -EOPNOTSUPP; ++ goto exit; ++ } ++ memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0], pwep->KeyMaterial, pwep->KeyLength); ++ psecuritypriv->dot11DefKeylen[wep_key_idx] = pwep->KeyLength; ++ rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); ++ } ++ goto exit; ++ } ++ ++ if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { /* 802_1x */ ++ struct sta_info *psta, *pbcmc_sta; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE)) { /* sta mode */ ++ psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); ++ if (!psta) { ++ ; ++ } else { ++ if (strcmp(param->u.crypt.alg, "none") != 0) ++ psta->ieee8021x_blocked = false; ++ ++ if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || ++ (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) ++ psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; ++ ++ if (param->u.crypt.set_tx == 1) { /* pairwise key */ ++ memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); ++ ++ if (strcmp(param->u.crypt.alg, "TKIP") == 0) { /* set mic key */ ++ memcpy(psta->dot11tkiptxmickey.skey, ¶m->u.crypt.key[16], 8); ++ memcpy(psta->dot11tkiprxmickey.skey, ¶m->u.crypt.key[24], 8); ++ padapter->securitypriv.busetkipkey = false; ++ } ++ ++ DBG_88E(" ~~~~set sta key:unicastkey\n"); ++ ++ rtw_setstakey_cmd(padapter, (unsigned char *)psta, true); ++ } else { /* group key */ ++ memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); ++ memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey, ¶m->u.crypt.key[16], 8); ++ memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey, ¶m->u.crypt.key[24], 8); ++ padapter->securitypriv.binstallGrpkey = true; ++ DBG_88E(" ~~~~set sta key:groupkey\n"); ++ ++ padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; ++ ++ rtw_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx, 1); ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); ++#endif /* CONFIG_88EU_P2P */ ++ } ++ } ++ pbcmc_sta = rtw_get_bcmc_stainfo(padapter); ++ if (!pbcmc_sta) { ++ ; ++ } else { ++ /* Jeff: don't disable ieee8021x_blocked while clearing key */ ++ if (strcmp(param->u.crypt.alg, "none") != 0) ++ pbcmc_sta->ieee8021x_blocked = false; ++ ++ if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || ++ (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) ++ pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; ++ } ++ } ++ } ++ ++exit: ++ ++ kfree(pwep); ++ ++ return ret; ++} ++ ++static int rtw_set_wpa_ie(struct adapter *padapter, char *pie, unsigned short ielen) ++{ ++ u8 *buf = NULL; ++ int group_cipher = 0, pairwise_cipher = 0; ++ int ret = 0; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (ielen > MAX_WPA_IE_LEN || !pie) { ++ _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); ++ if (!pie) ++ return ret; ++ else ++ return -EINVAL; ++ } ++ ++ if (ielen) { ++ buf = kzalloc(ielen, GFP_KERNEL); ++ if (!buf) { ++ ret = -ENOMEM; ++ goto exit; ++ } ++ ++ memcpy(buf, pie, ielen); ++ ++ /* dump */ ++ { ++ int i; ++ DBG_88E("\n wpa_ie(length:%d):\n", ielen); ++ for (i = 0; i < ielen; i += 8) ++ DBG_88E("0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n", buf[i], buf[i + 1], buf[i + 2], buf[i + 3], buf[i + 4], buf[i + 5], buf[i + 6], buf[i + 7]); ++ } ++ ++ if (ielen < RSN_HEADER_LEN) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (rtw_parse_wpa_ie(buf, ielen, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPAPSK; ++ memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen); ++ } ++ ++ if (rtw_parse_wpa2_ie(buf, ielen, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPA2PSK; ++ memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen); ++ } ++ ++ switch (group_cipher) { ++ case WPA_CIPHER_NONE: ++ padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ++ break; ++ case WPA_CIPHER_WEP40: ++ padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ break; ++ case WPA_CIPHER_TKIP: ++ padapter->securitypriv.dot118021XGrpPrivacy = _TKIP_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; ++ break; ++ case WPA_CIPHER_CCMP: ++ padapter->securitypriv.dot118021XGrpPrivacy = _AES_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; ++ break; ++ case WPA_CIPHER_WEP104: ++ padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ break; ++ } ++ ++ switch (pairwise_cipher) { ++ case WPA_CIPHER_NONE: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ++ break; ++ case WPA_CIPHER_WEP40: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ break; ++ case WPA_CIPHER_TKIP: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _TKIP_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; ++ break; ++ case WPA_CIPHER_CCMP: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _AES_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; ++ break; ++ case WPA_CIPHER_WEP104: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ break; ++ } ++ ++ _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); ++ {/* set wps_ie */ ++ u16 cnt = 0; ++ u8 eid, wps_oui[4] = {0x0, 0x50, 0xf2, 0x04}; ++ ++ while (cnt < ielen) { ++ eid = buf[cnt]; ++ if ((eid == _VENDOR_SPECIFIC_IE_) && (!memcmp(&buf[cnt + 2], wps_oui, 4))) { ++ DBG_88E("SET WPS_IE\n"); ++ ++ padapter->securitypriv.wps_ie_len = ((buf[cnt + 1] + 2) < (MAX_WPA_IE_LEN << 2)) ? (buf[cnt + 1] + 2) : (MAX_WPA_IE_LEN << 2); ++ ++ memcpy(padapter->securitypriv.wps_ie, &buf[cnt], padapter->securitypriv.wps_ie_len); ++ ++ set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); ++#ifdef CONFIG_88EU_P2P ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK)) ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_ING); ++#endif /* CONFIG_88EU_P2P */ ++ cnt += buf[cnt + 1] + 2; ++ break; ++ } else { ++ cnt += buf[cnt + 1] + 2; /* goto next */ ++ } ++ } ++ } ++ } ++ ++exit: ++ kfree(buf); ++ return ret; ++} ++ ++typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; ++ ++static int rtw_wx_get_name(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u32 ht_ielen = 0; ++ char *p; ++ u8 ht_cap = false; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; ++ NDIS_802_11_RATES_EX *prates = NULL; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE)) { ++ /* parsing HT_CAP_IE */ ++ p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength - 12); ++ if (p && ht_ielen > 0) ++ ht_cap = true; ++ ++ prates = &pcur_bss->SupportedRates; ++ ++ if (rtw_is_cckratesonly_included((u8 *)prates)) { ++ if (ht_cap) ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bn"); ++ else ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b"); ++ } else if (rtw_is_cckrates_included((u8 *)prates)) { ++ if (ht_cap) ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bgn"); ++ else ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bg"); ++ } else { ++ if (ht_cap) ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11gn"); ++ else ++ snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11g"); ++ } ++ } else { ++ snprintf(wrqu->name, IFNAMSIZ, "unassociated"); ++ } ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_get_freq(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ /* wrqu->freq.m = ieee80211_wlan_frequencies[pcur_bss->Configuration.DSConfig-1] * 100000; */ ++ wrqu->freq.m = rtw_ch2freq(pcur_bss->Configuration.DSConfig) * 100000; ++ wrqu->freq.e = 1; ++ wrqu->freq.i = pcur_bss->Configuration.DSConfig; ++ } else { ++ wrqu->freq.m = rtw_ch2freq(padapter->mlmeextpriv.cur_channel) * 100000; ++ wrqu->freq.e = 1; ++ wrqu->freq.i = padapter->mlmeextpriv.cur_channel; ++ } ++ ++ return 0; ++} ++ ++static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *b) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ enum ndis_802_11_network_infra networkType; ++ int ret = 0; ++ ++ ++ ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = -EPERM; ++ goto exit; ++ } ++ ++ if (!padapter->hw_init_completed) { ++ ret = -EPERM; ++ goto exit; ++ } ++ ++ switch (wrqu->mode) { ++ case IW_MODE_AUTO: ++ networkType = Ndis802_11AutoUnknown; ++ DBG_88E("set_mode = IW_MODE_AUTO\n"); ++ break; ++ case IW_MODE_ADHOC: ++ networkType = Ndis802_11IBSS; ++ DBG_88E("set_mode = IW_MODE_ADHOC\n"); ++ break; ++ case IW_MODE_MASTER: ++ networkType = Ndis802_11APMode; ++ DBG_88E("set_mode = IW_MODE_MASTER\n"); ++ break; ++ case IW_MODE_INFRA: ++ networkType = Ndis802_11Infrastructure; ++ DBG_88E("set_mode = IW_MODE_INFRA\n"); ++ break; ++ default: ++ ret = -EINVAL; ++ goto exit; ++ } ++ if (!rtw_set_802_11_infrastructure_mode(padapter, networkType)) { ++ ret = -EPERM; ++ goto exit; ++ } ++ rtw_setopmode_cmd(padapter, networkType); ++exit: ++ ++ return ret; ++} ++ ++static int rtw_wx_get_mode(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *b) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) ++ wrqu->mode = IW_MODE_INFRA; ++ else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))) ++ wrqu->mode = IW_MODE_ADHOC; ++ else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ wrqu->mode = IW_MODE_MASTER; ++ else ++ wrqu->mode = IW_MODE_AUTO; ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_set_pmkid(struct net_device *dev, ++ struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 j, blInserted = false; ++ int ret = false; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct iw_pmksa *pPMK = (struct iw_pmksa *)extra; ++ u8 strZeroMacAddress[ETH_ALEN] = {0x00}; ++ u8 strIssueBssid[ETH_ALEN] = {0x00}; ++ ++ memcpy(strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN); ++ if (pPMK->cmd == IW_PMKSA_ADD) { ++ DBG_88E("[rtw_wx_set_pmkid] IW_PMKSA_ADD!\n"); ++ if (!memcmp(strIssueBssid, strZeroMacAddress, ETH_ALEN)) ++ return ret; ++ else ++ ret = true; ++ blInserted = false; ++ ++ /* overwrite PMKID */ ++ for (j = 0; j < NUM_PMKID_CACHE; j++) { ++ if (!memcmp(psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN)) { ++ /* BSSID is matched, the same AP => rewrite with new PMKID. */ ++ DBG_88E("[rtw_wx_set_pmkid] BSSID exists in the PMKList.\n"); ++ memcpy(psecuritypriv->PMKIDList[j].PMKID, pPMK->pmkid, IW_PMKID_LEN); ++ psecuritypriv->PMKIDList[j].bUsed = true; ++ psecuritypriv->PMKIDIndex = j + 1; ++ blInserted = true; ++ break; ++ } ++ } ++ ++ if (!blInserted) { ++ /* Find a new entry */ ++ DBG_88E("[rtw_wx_set_pmkid] Use the new entry index = %d for this PMKID.\n", ++ psecuritypriv->PMKIDIndex); ++ ++ memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, strIssueBssid, ETH_ALEN); ++ memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pPMK->pmkid, IW_PMKID_LEN); ++ ++ psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = true; ++ psecuritypriv->PMKIDIndex++; ++ if (psecuritypriv->PMKIDIndex == 16) ++ psecuritypriv->PMKIDIndex = 0; ++ } ++ } else if (pPMK->cmd == IW_PMKSA_REMOVE) { ++ DBG_88E("[rtw_wx_set_pmkid] IW_PMKSA_REMOVE!\n"); ++ ret = true; ++ for (j = 0; j < NUM_PMKID_CACHE; j++) { ++ if (!memcmp(psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN)) { ++ /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */ ++ memset(psecuritypriv->PMKIDList[j].Bssid, 0x00, ETH_ALEN); ++ psecuritypriv->PMKIDList[j].bUsed = false; ++ break; ++ } ++ } ++ } else if (pPMK->cmd == IW_PMKSA_FLUSH) { ++ DBG_88E("[rtw_wx_set_pmkid] IW_PMKSA_FLUSH!\n"); ++ memset(&psecuritypriv->PMKIDList[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); ++ psecuritypriv->PMKIDIndex = 0; ++ ret = true; ++ } ++ return ret; ++} ++ ++static int rtw_wx_get_sens(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ wrqu->sens.value = 0; ++ wrqu->sens.fixed = 0; /* no auto select */ ++ wrqu->sens.disabled = 1; ++ return 0; ++} ++ ++static int rtw_wx_get_range(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct iw_range *range = (struct iw_range *)extra; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ u16 val; ++ int i; ++ ++ wrqu->data.length = sizeof(*range); ++ memset(range, 0, sizeof(*range)); ++ ++ /* Let's try to keep this struct in the same order as in ++ * linux/include/wireless.h ++ */ ++ ++ /* TODO: See what values we can set, and remove the ones we can't ++ * set, or fill them with some default data. ++ */ ++ ++ /* ~5 Mb/s real (802.11b) */ ++ range->throughput = 5 * 1000 * 1000; ++ ++ /* signal level threshold range */ ++ ++ /* percent values between 0 and 100. */ ++ range->max_qual.qual = 100; ++ range->max_qual.level = 100; ++ range->max_qual.noise = 100; ++ range->max_qual.updated = 7; /* Updated all three */ ++ ++ range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */ ++ /* TODO: Find real 'good' to 'bad' threshol value for RSSI */ ++ range->avg_qual.level = 178; /* -78 dBm */ ++ range->avg_qual.noise = 0; ++ range->avg_qual.updated = 7; /* Updated all three */ ++ ++ range->num_bitrates = RATE_COUNT; ++ ++ for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) ++ range->bitrate[i] = rtw_rates[i]; ++ ++ range->min_frag = MIN_FRAG_THRESHOLD; ++ range->max_frag = MAX_FRAG_THRESHOLD; ++ ++ range->pm_capa = 0; ++ ++ range->we_version_compiled = WIRELESS_EXT; ++ range->we_version_source = 16; ++ ++ for (i = 0, val = 0; i < MAX_CHANNEL_NUM; i++) { ++ /* Include only legal frequencies for some countries */ ++ if (pmlmeext->channel_set[i].ChannelNum != 0) { ++ range->freq[val].i = pmlmeext->channel_set[i].ChannelNum; ++ range->freq[val].m = rtw_ch2freq(pmlmeext->channel_set[i].ChannelNum) * 100000; ++ range->freq[val].e = 1; ++ val++; ++ } ++ ++ if (val == IW_MAX_FREQUENCIES) ++ break; ++ } ++ ++ range->num_channels = val; ++ range->num_frequency = val; ++ ++/* The following code will proivde the security capability to network manager. */ ++/* If the driver doesn't provide this capability to network manager, */ ++/* the WPA/WPA2 routers can't be chosen in the network manager. */ ++ ++/* ++#define IW_SCAN_CAPA_NONE 0x00 ++#define IW_SCAN_CAPA_ESSID 0x01 ++#define IW_SCAN_CAPA_BSSID 0x02 ++#define IW_SCAN_CAPA_CHANNEL 0x04 ++#define IW_SCAN_CAPA_MODE 0x08 ++#define IW_SCAN_CAPA_RATE 0x10 ++#define IW_SCAN_CAPA_TYPE 0x20 ++#define IW_SCAN_CAPA_TIME 0x40 ++*/ ++ ++ range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | ++ IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; ++ ++ range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE | ++ IW_SCAN_CAPA_BSSID | IW_SCAN_CAPA_CHANNEL | ++ IW_SCAN_CAPA_MODE | IW_SCAN_CAPA_RATE; ++ ++ ++ return 0; ++} ++ ++/* set bssid flow */ ++/* s1. rtw_set_802_11_infrastructure_mode() */ ++/* s2. rtw_set_802_11_authentication_mode() */ ++/* s3. set_802_11_encryption_mode() */ ++/* s4. rtw_set_802_11_bssid() */ ++static int rtw_wx_set_wap(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *awrq, ++ char *extra) ++{ ++ uint ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct sockaddr *temp = (struct sockaddr *)awrq; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *phead; ++ u8 *dst_bssid, *src_bssid; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ enum ndis_802_11_auth_mode authmode; ++ ++ ++ ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (!padapter->bup) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (temp->sa_family != ARPHRD_ETHER) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ authmode = padapter->securitypriv.ndisauthtype; ++ spin_lock_bh(&queue->lock); ++ phead = get_list_head(queue); ++ pmlmepriv->pscanned = phead->next; ++ ++ while (phead != pmlmepriv->pscanned) { ++ ++ pnetwork = container_of(pmlmepriv->pscanned, struct wlan_network, list); ++ ++ pmlmepriv->pscanned = pmlmepriv->pscanned->next; ++ ++ dst_bssid = pnetwork->network.MacAddress; ++ ++ src_bssid = temp->sa_data; ++ ++ if ((!memcmp(dst_bssid, src_bssid, ETH_ALEN))) { ++ if (!rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode)) { ++ ret = -1; ++ spin_unlock_bh(&queue->lock); ++ goto exit; ++ } ++ ++ break; ++ } ++ } ++ spin_unlock_bh(&queue->lock); ++ ++ rtw_set_802_11_authentication_mode(padapter, authmode); ++ /* set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); */ ++ if (!rtw_set_802_11_bssid(padapter, temp->sa_data)) { ++ ret = -1; ++ goto exit; ++ } ++ ++exit: ++ ++ ++ ++ return ret; ++} ++ ++static int rtw_wx_get_wap(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; ++ ++ wrqu->ap_addr.sa_family = ARPHRD_ETHER; ++ ++ memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED) || ++ check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || ++ check_fwstate(pmlmepriv, WIFI_AP_STATE)) ++ memcpy(wrqu->ap_addr.sa_data, pcur_bss->MacAddress, ETH_ALEN); ++ else ++ memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_set_mlme(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ u16 reason; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_mlme *mlme = (struct iw_mlme *)extra; ++ ++ if (!mlme) ++ return -1; ++ ++ DBG_88E("%s\n", __func__); ++ ++ reason = mlme->reason_code; ++ ++ DBG_88E("%s, cmd =%d, reason =%d\n", __func__, mlme->cmd, reason); ++ ++ switch (mlme->cmd) { ++ case IW_MLME_DEAUTH: ++ if (!rtw_set_802_11_disassociate(padapter)) ++ ret = -1; ++ break; ++ case IW_MLME_DISASSOC: ++ if (!rtw_set_802_11_disassociate(padapter)) ++ ret = -1; ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ return ret; ++} ++ ++static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ u8 _status = false; ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT]; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (padapter->registrypriv.mp_mode == 1) { ++ if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) { ++ ret = -1; ++ goto exit; ++ } ++ } ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (padapter->bDriverStopped) { ++ DBG_88E("bDriverStopped =%d\n", padapter->bDriverStopped); ++ ret = -1; ++ goto exit; ++ } ++ ++ if (!padapter->bup) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (!padapter->hw_init_completed) { ++ ret = -1; ++ goto exit; ++ } ++ ++ /* When Busy Traffic, driver do not site survey. So driver return success. */ ++ /* wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout. */ ++ /* modify by thomas 2011-02-22. */ ++ if (pmlmepriv->LinkDetectInfo.bBusyTraffic) { ++ indicate_wx_scan_complete_event(padapter); ++ goto exit; ++ } ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING)) { ++ indicate_wx_scan_complete_event(padapter); ++ goto exit; ++ } ++ ++/* For the DMP WiFi Display project, the driver won't to scan because */ ++/* the pmlmepriv->scan_interval is always equal to 3. */ ++/* So, the wpa_supplicant won't find out the WPS SoftAP. */ ++ ++#ifdef CONFIG_88EU_P2P ++ if (pwdinfo->p2p_state != P2P_STATE_NONE) { ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); ++ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_FULL); ++ rtw_free_network_queue(padapter, true); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ memset(ssid, 0, sizeof(struct ndis_802_11_ssid) * RTW_SSID_SCAN_AMOUNT); ++ ++ if (wrqu->data.length == sizeof(struct iw_scan_req)) { ++ struct iw_scan_req *req = (struct iw_scan_req *)extra; ++ ++ if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { ++ int len = min((int)req->essid_len, IW_ESSID_MAX_SIZE); ++ ++ memcpy(ssid[0].Ssid, req->essid, len); ++ ssid[0].SsidLength = len; ++ ++ DBG_88E("IW_SCAN_THIS_ESSID, ssid =%s, len =%d\n", req->essid, req->essid_len); ++ ++ spin_lock_bh(&pmlmepriv->lock); ++ ++ _status = rtw_sitesurvey_cmd(padapter, ssid, 1, NULL, 0); ++ ++ spin_unlock_bh(&pmlmepriv->lock); ++ } else if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { ++ DBG_88E("rtw_wx_set_scan, req->scan_type == IW_SCAN_TYPE_PASSIVE\n"); ++ } ++ } else { ++ if (wrqu->data.length >= WEXT_CSCAN_HEADER_SIZE && ++ !memcmp(extra, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE)) { ++ int len = wrqu->data.length - WEXT_CSCAN_HEADER_SIZE; ++ char *pos = extra + WEXT_CSCAN_HEADER_SIZE; ++ char section; ++ char sec_len; ++ int ssid_index = 0; ++ ++ while (len >= 1) { ++ section = *(pos++); ++ len -= 1; ++ ++ switch (section) { ++ case WEXT_CSCAN_SSID_SECTION: ++ if (len < 1) { ++ len = 0; ++ break; ++ } ++ sec_len = *(pos++); len -= 1; ++ if (sec_len > 0 && sec_len <= len) { ++ ssid[ssid_index].SsidLength = sec_len; ++ memcpy(ssid[ssid_index].Ssid, pos, ssid[ssid_index].SsidLength); ++ ssid_index++; ++ } ++ pos += sec_len; ++ len -= sec_len; ++ break; ++ case WEXT_CSCAN_TYPE_SECTION: ++ case WEXT_CSCAN_CHANNEL_SECTION: ++ pos += 1; ++ len -= 1; ++ break; ++ case WEXT_CSCAN_PASV_DWELL_SECTION: ++ case WEXT_CSCAN_HOME_DWELL_SECTION: ++ case WEXT_CSCAN_ACTV_DWELL_SECTION: ++ pos += 2; ++ len -= 2; ++ break; ++ default: ++ len = 0; /* stop parsing */ ++ } ++ } ++ ++ /* it has still some scan parameter to parse, we only do this now... */ ++ _status = rtw_set_802_11_bssid_list_scan(padapter, ssid, RTW_SSID_SCAN_AMOUNT); ++ } else { ++ _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0); ++ } ++ } ++ ++ if (!_status) ++ ret = -1; ++ ++exit: ++ ++ return ret; ++} ++ ++static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct list_head *plist, *phead; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ char *ev = extra; ++ char *stop = ev + wrqu->data.length; ++ u32 ret = 0; ++ u32 cnt = 0; ++ u32 wait_for_surveydone; ++ int wait_status; ++#ifdef CONFIG_88EU_P2P ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (padapter->pwrctrlpriv.brfoffbyhw && padapter->bDriverStopped) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++#ifdef CONFIG_88EU_P2P ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ /* P2P is enabled */ ++ wait_for_surveydone = 200; ++ } else { ++ /* P2P is disabled */ ++ wait_for_surveydone = 100; ++ } ++#else ++ { ++ wait_for_surveydone = 100; ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ wait_status = _FW_UNDER_SURVEY | _FW_UNDER_LINKING; ++ ++ while (check_fwstate(pmlmepriv, wait_status)) { ++ msleep(30); ++ cnt++; ++ if (cnt > wait_for_surveydone) ++ break; ++ } ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ if ((stop - ev) < SCAN_ITEM_SIZE) { ++ ret = -E2BIG; ++ break; ++ } ++ ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ /* report network only if the current channel set contains the channel to which this network belongs */ ++ if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0) ++ ev = translate_scan(padapter, a, pnetwork, ev, stop); ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ wrqu->data.length = ev - extra; ++ wrqu->data.flags = 0; ++ ++exit: ++ ++ return ret; ++} ++ ++/* set ssid flow */ ++/* s1. rtw_set_802_11_infrastructure_mode() */ ++/* s2. set_802_11_authenticaion_mode() */ ++/* s3. set_802_11_encryption_mode() */ ++/* s4. rtw_set_802_11_ssid() */ ++static int rtw_wx_set_essid(struct net_device *dev, ++ struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct list_head *phead; ++ struct wlan_network *pnetwork = NULL; ++ enum ndis_802_11_auth_mode authmode; ++ struct ndis_802_11_ssid ndis_ssid; ++ u8 *dst_ssid, *src_ssid; ++ ++ uint ret = 0, len; ++ ++ if (_FAIL == rtw_pwr_wakeup(padapter)) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (!padapter->bup) { ++ ret = -1; ++ goto exit; ++ } ++ ++ if (wrqu->essid.length > IW_ESSID_MAX_SIZE) { ++ ret = -E2BIG; ++ goto exit; ++ } ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ ret = -1; ++ goto exit; ++ } ++ ++ authmode = padapter->securitypriv.ndisauthtype; ++ DBG_88E("=>%s\n", __func__); ++ if (wrqu->essid.flags && wrqu->essid.length) { ++ len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : IW_ESSID_MAX_SIZE; ++ ++ if (wrqu->essid.length != 33) ++ DBG_88E("ssid =%s, len =%d\n", extra, wrqu->essid.length); ++ ++ memset(&ndis_ssid, 0, sizeof(struct ndis_802_11_ssid)); ++ ndis_ssid.SsidLength = len; ++ memcpy(ndis_ssid.Ssid, extra, len); ++ src_ssid = ndis_ssid.Ssid; ++ ++ spin_lock_bh(&queue->lock); ++ phead = get_list_head(queue); ++ pmlmepriv->pscanned = phead->next; ++ ++ while (phead != pmlmepriv->pscanned) { ++ pnetwork = container_of(pmlmepriv->pscanned, struct wlan_network, list); ++ ++ pmlmepriv->pscanned = pmlmepriv->pscanned->next; ++ ++ dst_ssid = pnetwork->network.Ssid.Ssid; ++ ++ if ((!memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength)) && ++ (pnetwork->network.Ssid.SsidLength == ndis_ssid.SsidLength)) { ++ ++ if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { ++ if (pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) ++ continue; ++ } ++ ++ if (!rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode)) { ++ ret = -1; ++ spin_unlock_bh(&queue->lock); ++ goto exit; ++ } ++ ++ break; ++ } ++ } ++ spin_unlock_bh(&queue->lock); ++ rtw_set_802_11_authentication_mode(padapter, authmode); ++ if (!rtw_set_802_11_ssid(padapter, &ndis_ssid)) { ++ ret = -1; ++ goto exit; ++ } ++ } ++ ++exit: ++ ++ DBG_88E("<=%s, ret %d\n", __func__, ret); ++ ++ ++ ++ return ret; ++} ++ ++static int rtw_wx_get_essid(struct net_device *dev, ++ struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ u32 len, ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; ++ ++ if ((check_fwstate(pmlmepriv, _FW_LINKED)) || ++ (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))) { ++ len = pcur_bss->Ssid.SsidLength; ++ memcpy(extra, pcur_bss->Ssid.Ssid, len); ++ } else { ++ len = 0; ++ *extra = 0; ++ } ++ wrqu->essid.length = len; ++ wrqu->essid.flags = 1; ++ ++ return ret; ++} ++ ++static int rtw_wx_set_rate(struct net_device *dev, ++ struct iw_request_info *a, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int i, ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 datarates[NumRates]; ++ u32 target_rate = wrqu->bitrate.value; ++ u32 fixed = wrqu->bitrate.fixed; ++ u32 ratevalue = 0; ++ u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff}; ++ ++ if (target_rate == -1) { ++ ratevalue = 11; ++ goto set_rate; ++ } ++ target_rate = target_rate / 100000; ++ ++ switch (target_rate) { ++ case 10: ++ ratevalue = 0; ++ break; ++ case 20: ++ ratevalue = 1; ++ break; ++ case 55: ++ ratevalue = 2; ++ break; ++ case 60: ++ ratevalue = 3; ++ break; ++ case 90: ++ ratevalue = 4; ++ break; ++ case 110: ++ ratevalue = 5; ++ break; ++ case 120: ++ ratevalue = 6; ++ break; ++ case 180: ++ ratevalue = 7; ++ break; ++ case 240: ++ ratevalue = 8; ++ break; ++ case 360: ++ ratevalue = 9; ++ break; ++ case 480: ++ ratevalue = 10; ++ break; ++ case 540: ++ ratevalue = 11; ++ break; ++ default: ++ ratevalue = 11; ++ break; ++ } ++ ++set_rate: ++ ++ for (i = 0; i < NumRates; i++) { ++ if (ratevalue == mpdatarate[i]) { ++ datarates[i] = mpdatarate[i]; ++ if (fixed == 0) ++ break; ++ } else { ++ datarates[i] = 0xff; ++ } ++ } ++ ++ if (rtw_setdatarate_cmd(padapter, datarates) != _SUCCESS) ++ ret = -1; ++ ++ return ret; ++} ++ ++static int rtw_wx_get_rate(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ u16 max_rate = 0; ++ ++ max_rate = rtw_get_cur_max_rate((struct adapter *)rtw_netdev_priv(dev)); ++ ++ if (max_rate == 0) ++ return -EPERM; ++ ++ wrqu->bitrate.fixed = 0; /* no auto select */ ++ wrqu->bitrate.value = max_rate * 100000; ++ ++ return 0; ++} ++ ++static int rtw_wx_set_rts(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ ++ ++ if (wrqu->rts.disabled) { ++ padapter->registrypriv.rts_thresh = 2347; ++ } else { ++ if (wrqu->rts.value < 0 || ++ wrqu->rts.value > 2347) ++ return -EINVAL; ++ ++ padapter->registrypriv.rts_thresh = wrqu->rts.value; ++ } ++ ++ DBG_88E("%s, rts_thresh =%d\n", __func__, padapter->registrypriv.rts_thresh); ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_get_rts(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ ++ ++ DBG_88E("%s, rts_thresh =%d\n", __func__, padapter->registrypriv.rts_thresh); ++ ++ wrqu->rts.value = padapter->registrypriv.rts_thresh; ++ wrqu->rts.fixed = 0; /* no auto select */ ++ /* wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); */ ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_set_frag(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ ++ ++ if (wrqu->frag.disabled) { ++ padapter->xmitpriv.frag_len = MAX_FRAG_THRESHOLD; ++ } else { ++ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || ++ wrqu->frag.value > MAX_FRAG_THRESHOLD) ++ return -EINVAL; ++ ++ padapter->xmitpriv.frag_len = wrqu->frag.value & ~0x1; ++ } ++ ++ DBG_88E("%s, frag_len =%d\n", __func__, padapter->xmitpriv.frag_len); ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_get_frag(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ ++ ++ DBG_88E("%s, frag_len =%d\n", __func__, padapter->xmitpriv.frag_len); ++ ++ wrqu->frag.value = padapter->xmitpriv.frag_len; ++ wrqu->frag.fixed = 0; /* no auto select */ ++ ++ ++ ++ return 0; ++} ++ ++static int rtw_wx_get_retry(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ wrqu->retry.value = 7; ++ wrqu->retry.fixed = 0; /* no auto select */ ++ wrqu->retry.disabled = 1; ++ ++ return 0; ++} ++ ++static int rtw_wx_set_enc(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *keybuf) ++{ ++ u32 key, ret = 0; ++ u32 keyindex_provided; ++ struct ndis_802_11_wep wep; ++ enum ndis_802_11_auth_mode authmode; ++ ++ struct iw_point *erq = &wrqu->encoding; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ DBG_88E("+rtw_wx_set_enc, flags = 0x%x\n", erq->flags); ++ ++ memset(&wep, 0, sizeof(struct ndis_802_11_wep)); ++ ++ key = erq->flags & IW_ENCODE_INDEX; ++ ++ ++ ++ if (erq->flags & IW_ENCODE_DISABLED) { ++ DBG_88E("EncryptionDisabled\n"); ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ ++ authmode = Ndis802_11AuthModeOpen; ++ padapter->securitypriv.ndisauthtype = authmode; ++ ++ goto exit; ++ } ++ ++ if (key) { ++ if (key > WEP_KEYS) ++ return -EINVAL; ++ key--; ++ keyindex_provided = 1; ++ } else { ++ keyindex_provided = 0; ++ key = padapter->securitypriv.dot11PrivacyKeyIndex; ++ DBG_88E("rtw_wx_set_enc, key =%d\n", key); ++ } ++ ++ /* set authentication mode */ ++ if (erq->flags & IW_ENCODE_OPEN) { ++ DBG_88E("rtw_wx_set_enc():IW_ENCODE_OPEN\n"); ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;/* Ndis802_11EncryptionDisabled; */ ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open; ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; ++ authmode = Ndis802_11AuthModeOpen; ++ padapter->securitypriv.ndisauthtype = authmode; ++ } else if (erq->flags & IW_ENCODE_RESTRICTED) { ++ DBG_88E("rtw_wx_set_enc():IW_ENCODE_RESTRICTED\n"); ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_; ++ authmode = Ndis802_11AuthModeShared; ++ padapter->securitypriv.ndisauthtype = authmode; ++ } else { ++ DBG_88E("rtw_wx_set_enc():erq->flags = 0x%x\n", erq->flags); ++ ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;/* Ndis802_11EncryptionDisabled; */ ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; ++ authmode = Ndis802_11AuthModeOpen; ++ padapter->securitypriv.ndisauthtype = authmode; ++ } ++ ++ wep.KeyIndex = key; ++ if (erq->length > 0) { ++ wep.KeyLength = erq->length <= 5 ? 5 : 13; ++ ++ wep.Length = wep.KeyLength + FIELD_OFFSET(struct ndis_802_11_wep, KeyMaterial); ++ } else { ++ wep.KeyLength = 0; ++ ++ if (keyindex_provided == 1) { ++ /* set key_id only, no given KeyMaterial(erq->length == 0). */ ++ padapter->securitypriv.dot11PrivacyKeyIndex = key; ++ ++ DBG_88E("(keyindex_provided == 1), keyid =%d, key_len =%d\n", key, padapter->securitypriv.dot11DefKeylen[key]); ++ ++ switch (padapter->securitypriv.dot11DefKeylen[key]) { ++ case 5: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; ++ break; ++ case 13: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; ++ break; ++ default: ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ break; ++ } ++ ++ goto exit; ++ } ++ } ++ ++ wep.KeyIndex |= 0x80000000; ++ ++ memcpy(wep.KeyMaterial, keybuf, wep.KeyLength); ++ ++ if (!rtw_set_802_11_add_wep(padapter, &wep)) { ++ if (rf_on == pwrpriv->rf_pwrstate) ++ ret = -EOPNOTSUPP; ++ goto exit; ++ } ++ ++exit: ++ ++ ++ ++ return ret; ++} ++ ++static int rtw_wx_get_enc(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *keybuf) ++{ ++ uint key, ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_point *erq = &wrqu->encoding; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED) != true) { ++ if (!check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_DISABLED; ++ return 0; ++ } ++ } ++ ++ key = erq->flags & IW_ENCODE_INDEX; ++ ++ if (key) { ++ if (key > WEP_KEYS) ++ return -EINVAL; ++ key--; ++ } else { ++ key = padapter->securitypriv.dot11PrivacyKeyIndex; ++ } ++ ++ erq->flags = key + 1; ++ ++ switch (padapter->securitypriv.ndisencryptstatus) { ++ case Ndis802_11EncryptionNotSupported: ++ case Ndis802_11EncryptionDisabled: ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_DISABLED; ++ break; ++ case Ndis802_11Encryption1Enabled: ++ erq->length = padapter->securitypriv.dot11DefKeylen[key]; ++ if (erq->length) { ++ memcpy(keybuf, padapter->securitypriv.dot11DefKey[key].skey, padapter->securitypriv.dot11DefKeylen[key]); ++ ++ erq->flags |= IW_ENCODE_ENABLED; ++ ++ if (padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeOpen) ++ erq->flags |= IW_ENCODE_OPEN; ++ else if (padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeShared) ++ erq->flags |= IW_ENCODE_RESTRICTED; ++ } else { ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_DISABLED; ++ } ++ break; ++ case Ndis802_11Encryption2Enabled: ++ case Ndis802_11Encryption3Enabled: ++ erq->length = 16; ++ erq->flags |= (IW_ENCODE_ENABLED | IW_ENCODE_OPEN | IW_ENCODE_NOKEY); ++ break; ++ default: ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_DISABLED; ++ break; ++ } ++ ++ ++ return ret; ++} ++ ++static int rtw_wx_get_power(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ wrqu->power.value = 0; ++ wrqu->power.fixed = 0; /* no auto select */ ++ wrqu->power.disabled = 1; ++ ++ return 0; ++} ++ ++static int rtw_wx_set_gen_ie(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ ret = rtw_set_wpa_ie(padapter, extra, wrqu->data.length); ++ return ret; ++} ++ ++static int rtw_wx_set_auth(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_param *param = (struct iw_param *)&wrqu->param; ++ int ret = 0; ++ ++ switch (param->flags & IW_AUTH_INDEX) { ++ case IW_AUTH_WPA_VERSION: ++ break; ++ case IW_AUTH_CIPHER_PAIRWISE: ++ ++ break; ++ case IW_AUTH_CIPHER_GROUP: ++ ++ break; ++ case IW_AUTH_KEY_MGMT: ++ /* ++ * ??? does not use these parameters ++ */ ++ break; ++ case IW_AUTH_TKIP_COUNTERMEASURES: ++ if (param->value) { ++ /* wpa_supplicant is enabling the tkip countermeasure. */ ++ padapter->securitypriv.btkip_countermeasure = true; ++ } else { ++ /* wpa_supplicant is disabling the tkip countermeasure. */ ++ padapter->securitypriv.btkip_countermeasure = false; ++ } ++ break; ++ case IW_AUTH_DROP_UNENCRYPTED: ++ /* HACK: ++ * ++ * wpa_supplicant calls set_wpa_enabled when the driver ++ * is loaded and unloaded, regardless of if WPA is being ++ * used. No other calls are made which can be used to ++ * determine if encryption will be used or not prior to ++ * association being expected. If encryption is not being ++ * used, drop_unencrypted is set to false, else true -- we ++ * can use this to determine if the CAP_PRIVACY_ON bit should ++ * be set. ++ */ ++ ++ if (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption1Enabled) ++ break;/* it means init value, or using wep, ndisencryptstatus = Ndis802_11Encryption1Enabled, */ ++ /* then it needn't reset it; */ ++ ++ if (param->value) { ++ padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ++ padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; ++ padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ ++ padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; ++ } ++ ++ break; ++ case IW_AUTH_80211_AUTH_ALG: ++ /* ++ * It's the starting point of a link layer connection using wpa_supplicant ++ */ ++ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { ++ LeaveAllPowerSaveMode(padapter); ++ rtw_disassoc_cmd(padapter, 500, false); ++ DBG_88E("%s...call rtw_indicate_disconnect\n ", __func__); ++ rtw_indicate_disconnect(padapter); ++ rtw_free_assoc_resources(padapter, 1); ++ } ++ ret = wpa_set_auth_algs(dev, (u32)param->value); ++ break; ++ case IW_AUTH_WPA_ENABLED: ++ break; ++ case IW_AUTH_RX_UNENCRYPTED_EAPOL: ++ break; ++ case IW_AUTH_PRIVACY_INVOKED: ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return ret; ++} ++ ++static int rtw_wx_set_enc_ext(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ char *alg_name; ++ u32 param_len; ++ struct ieee_param *param = NULL; ++ struct iw_point *pencoding = &wrqu->encoding; ++ struct iw_encode_ext *pext = (struct iw_encode_ext *)extra; ++ int ret = 0; ++ ++ param_len = sizeof(struct ieee_param) + pext->key_len; ++ param = kzalloc(param_len, GFP_KERNEL); ++ if (!param) ++ return -ENOMEM; ++ ++ param->cmd = IEEE_CMD_SET_ENCRYPTION; ++ memset(param->sta_addr, 0xff, ETH_ALEN); ++ ++ switch (pext->alg) { ++ case IW_ENCODE_ALG_NONE: ++ /* todo: remove key */ ++ /* remove = 1; */ ++ alg_name = "none"; ++ break; ++ case IW_ENCODE_ALG_WEP: ++ alg_name = "WEP"; ++ break; ++ case IW_ENCODE_ALG_TKIP: ++ alg_name = "TKIP"; ++ break; ++ case IW_ENCODE_ALG_CCMP: ++ alg_name = "CCMP"; ++ break; ++ default: ++ return -1; ++ } ++ ++ strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); ++ ++ if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) ++ param->u.crypt.set_tx = 1; ++ ++ /* cliW: WEP does not have group key ++ * just not checking GROUP key setting ++ */ ++ if ((pext->alg != IW_ENCODE_ALG_WEP) && ++ (pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)) ++ param->u.crypt.set_tx = 0; ++ ++ param->u.crypt.idx = (pencoding->flags & 0x00FF) - 1; ++ ++ if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) ++ memcpy(param->u.crypt.seq, pext->rx_seq, 8); ++ ++ if (pext->key_len) { ++ param->u.crypt.key_len = pext->key_len; ++ memcpy(param->u.crypt.key, pext + 1, pext->key_len); ++ } ++ ++ ret = wpa_set_encryption(dev, param, param_len); ++ ++ kfree(param); ++ return ret; ++} ++ ++static int rtw_wx_get_nick(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ if (extra) { ++ wrqu->data.length = 14; ++ wrqu->data.flags = 1; ++ memcpy(extra, "", 14); ++ } ++ ++ /* dump debug info here */ ++ return 0; ++} ++ ++static int rtw_wx_read32(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter; ++ struct iw_point *p; ++ u16 len; ++ u32 addr; ++ u32 data32; ++ u32 bytes; ++ u8 *ptmp; ++ ++ padapter = (struct adapter *)rtw_netdev_priv(dev); ++ p = &wrqu->data; ++ len = p->length; ++ ptmp = kmalloc(len, GFP_KERNEL); ++ if (!ptmp) ++ return -ENOMEM; ++ ++ if (copy_from_user(ptmp, p->pointer, len)) { ++ kfree(ptmp); ++ return -EFAULT; ++ } ++ ++ bytes = 0; ++ addr = 0; ++ sscanf(ptmp, "%d,%x", &bytes, &addr); ++ ++ switch (bytes) { ++ case 1: ++ data32 = rtw_read8(padapter, addr); ++ sprintf(extra, "0x%02X", data32); ++ break; ++ case 2: ++ data32 = rtw_read16(padapter, addr); ++ sprintf(extra, "0x%04X", data32); ++ break; ++ case 4: ++ data32 = rtw_read32(padapter, addr); ++ sprintf(extra, "0x%08X", data32); ++ break; ++ default: ++ DBG_88E(KERN_INFO "%s: usage> read [bytes],[address(hex)]\n", __func__); ++ return -EINVAL; ++ } ++ DBG_88E(KERN_INFO "%s: addr = 0x%08X data =%s\n", __func__, addr, extra); ++ ++ kfree(ptmp); ++ return 0; ++} ++ ++static int rtw_wx_write32(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ u32 addr; ++ u32 data32; ++ u32 bytes; ++ ++ bytes = 0; ++ addr = 0; ++ data32 = 0; ++ sscanf(extra, "%d,%x,%x", &bytes, &addr, &data32); ++ ++ switch (bytes) { ++ case 1: ++ rtw_write8(padapter, addr, (u8)data32); ++ DBG_88E(KERN_INFO "%s: addr = 0x%08X data = 0x%02X\n", __func__, addr, (u8)data32); ++ break; ++ case 2: ++ rtw_write16(padapter, addr, (u16)data32); ++ DBG_88E(KERN_INFO "%s: addr = 0x%08X data = 0x%04X\n", __func__, addr, (u16)data32); ++ break; ++ case 4: ++ rtw_write32(padapter, addr, data32); ++ DBG_88E(KERN_INFO "%s: addr = 0x%08X data = 0x%08X\n", __func__, addr, data32); ++ break; ++ default: ++ DBG_88E(KERN_INFO "%s: usage> write [bytes],[address(hex)],[data(hex)]\n", __func__); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int rtw_wx_read_rf(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u32 path, addr, data32; ++ ++ path = *(u32 *)extra; ++ addr = *((u32 *)extra + 1); ++ data32 = rtw_hal_read_rfreg(padapter, path, addr, 0xFFFFF); ++ /* ++ * IMPORTANT!! ++ * Only when wireless private ioctl is at odd order, ++ * "extra" would be copied to user space. ++ */ ++ sprintf(extra, "0x%05x", data32); ++ ++ return 0; ++} ++ ++static int rtw_wx_write_rf(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u32 path, addr, data32; ++ ++ path = *(u32 *)extra; ++ addr = *((u32 *)extra + 1); ++ data32 = *((u32 *)extra + 2); ++ rtw_hal_write_rfreg(padapter, path, addr, 0xFFFFF, data32); ++ ++ return 0; ++} ++ ++static int rtw_wx_priv_null(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *b) ++{ ++ return -1; ++} ++ ++static int dummy(struct net_device *dev, struct iw_request_info *a, ++ union iwreq_data *wrqu, char *b) ++{ ++ return -1; ++} ++ ++static int rtw_wx_set_channel_plan(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 channel_plan_req = (u8)(*((int *)wrqu)); ++ ++ if (_SUCCESS == rtw_set_chplan_cmd(padapter, channel_plan_req, 1)) ++ DBG_88E("%s set channel_plan = 0x%02X\n", __func__, pmlmepriv->ChannelPlan); ++ else ++ return -EPERM; ++ ++ return 0; ++} ++ ++static int rtw_wx_set_mtk_wps_probe_ie(struct net_device *dev, ++ struct iw_request_info *a, ++ union iwreq_data *wrqu, char *b) ++{ ++ return 0; ++} ++ ++static int rtw_wx_get_sensitivity(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *buf) ++{ ++ return 0; ++} ++ ++static int rtw_wx_set_mtk_wps_ie(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ return 0; ++} ++ ++/* ++ * For all data larger than 16 octets, we need to use a ++ * pointer to memory allocated in user space. ++ */ ++static int rtw_drvext_hdl(struct net_device *dev, struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ return 0; ++} ++ ++static void rtw_dbg_mode_hdl(struct adapter *padapter, u32 id, u8 *pdata, u32 len) ++{ ++ struct mp_rw_reg *RegRWStruct; ++ struct rf_reg_param *prfreg; ++ u8 path; ++ u8 offset; ++ u32 value; ++ ++ DBG_88E("%s\n", __func__); ++ ++ switch (id) { ++ case GEN_MP_IOCTL_SUBCODE(MP_START): ++ DBG_88E("871x_driver is only for normal mode, can't enter mp mode\n"); ++ break; ++ case GEN_MP_IOCTL_SUBCODE(READ_REG): ++ RegRWStruct = (struct mp_rw_reg *)pdata; ++ switch (RegRWStruct->width) { ++ case 1: ++ RegRWStruct->value = rtw_read8(padapter, RegRWStruct->offset); ++ break; ++ case 2: ++ RegRWStruct->value = rtw_read16(padapter, RegRWStruct->offset); ++ break; ++ case 4: ++ RegRWStruct->value = rtw_read32(padapter, RegRWStruct->offset); ++ break; ++ default: ++ break; ++ } ++ ++ break; ++ case GEN_MP_IOCTL_SUBCODE(WRITE_REG): ++ RegRWStruct = (struct mp_rw_reg *)pdata; ++ switch (RegRWStruct->width) { ++ case 1: ++ rtw_write8(padapter, RegRWStruct->offset, (u8)RegRWStruct->value); ++ break; ++ case 2: ++ rtw_write16(padapter, RegRWStruct->offset, (u16)RegRWStruct->value); ++ break; ++ case 4: ++ rtw_write32(padapter, RegRWStruct->offset, (u32)RegRWStruct->value); ++ break; ++ default: ++ break; ++ } ++ ++ break; ++ case GEN_MP_IOCTL_SUBCODE(READ_RF_REG): ++ ++ prfreg = (struct rf_reg_param *)pdata; ++ ++ path = (u8)prfreg->path; ++ offset = (u8)prfreg->offset; ++ ++ value = rtw_hal_read_rfreg(padapter, path, offset, 0xffffffff); ++ ++ prfreg->value = value; ++ ++ break; ++ case GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG): ++ ++ prfreg = (struct rf_reg_param *)pdata; ++ ++ path = (u8)prfreg->path; ++ offset = (u8)prfreg->offset; ++ value = prfreg->value; ++ ++ rtw_hal_write_rfreg(padapter, path, offset, 0xffffffff, value); ++ ++ break; ++ case GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO): ++ DBG_88E("==> trigger gpio 0\n"); ++ rtw_hal_set_hwreg(padapter, HW_VAR_TRIGGER_GPIO_0, NULL); ++ break; ++ case GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS): ++ *pdata = rtw_hal_sreset_get_wifi_status(padapter); ++ break; ++ default: ++ break; ++ } ++} ++ ++static int rtw_mp_ioctl_hdl(struct net_device *dev, struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ u32 BytesRead, BytesWritten, BytesNeeded; ++ struct oid_par_priv oid_par; ++ struct mp_ioctl_handler *phandler; ++ struct mp_ioctl_param *poidparam; ++ uint status = 0; ++ u16 len; ++ u8 *pparmbuf = NULL, bset; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_point *p = &wrqu->data; ++ ++ if ((!p->length) || (!p->pointer)) { ++ ret = -EINVAL; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ pparmbuf = NULL; ++ bset = (u8)(p->flags & 0xFFFF); ++ len = p->length; ++ pparmbuf = kmalloc(len, GFP_KERNEL); ++ if (!pparmbuf) { ++ ret = -ENOMEM; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ ++ if (copy_from_user(pparmbuf, p->pointer, len)) { ++ ret = -EFAULT; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ ++ poidparam = (struct mp_ioctl_param *)pparmbuf; ++ ++ if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) { ++ ret = -EINVAL; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ ++ if (padapter->registrypriv.mp_mode == 1) { ++ phandler = mp_ioctl_hdl + poidparam->subcode; ++ ++ if ((phandler->paramsize != 0) && (poidparam->len < phandler->paramsize)) { ++ ret = -EINVAL; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ ++ if (phandler->handler) { ++ oid_par.adapter_context = padapter; ++ oid_par.oid = phandler->oid; ++ oid_par.information_buf = poidparam->data; ++ oid_par.information_buf_len = poidparam->len; ++ oid_par.dbg = 0; ++ ++ BytesWritten = 0; ++ BytesNeeded = 0; ++ ++ if (bset) { ++ oid_par.bytes_rw = &BytesRead; ++ oid_par.bytes_needed = &BytesNeeded; ++ oid_par.type_of_oid = SET_OID; ++ } else { ++ oid_par.bytes_rw = &BytesWritten; ++ oid_par.bytes_needed = &BytesNeeded; ++ oid_par.type_of_oid = QUERY_OID; ++ } ++ ++ status = phandler->handler(&oid_par); ++ } else { ++ DBG_88E("rtw_mp_ioctl_hdl(): err!, subcode =%d, oid =%d, handler =%p\n", ++ poidparam->subcode, phandler->oid, phandler->handler); ++ ret = -EFAULT; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ } else { ++ rtw_dbg_mode_hdl(padapter, poidparam->subcode, poidparam->data, poidparam->len); ++ } ++ ++ if (bset == 0x00) {/* query info */ ++ if (copy_to_user(p->pointer, pparmbuf, len)) ++ ret = -EFAULT; ++ } ++ ++ if (status) { ++ ret = -EFAULT; ++ goto _rtw_mp_ioctl_hdl_exit; ++ } ++ ++_rtw_mp_ioctl_hdl_exit: ++ ++ kfree(pparmbuf); ++ return ret; ++} ++ ++static int rtw_get_ap_info(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ u32 cnt = 0, wpa_ielen; ++ struct list_head *plist, *phead; ++ unsigned char *pbuf; ++ u8 bssid[ETH_ALEN]; ++ char data[32]; ++ struct wlan_network *pnetwork = NULL; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct iw_point *pdata = &wrqu->data; ++ ++ DBG_88E("+rtw_get_aplist_info\n"); ++ ++ if (padapter->bDriverStopped || !pdata) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ while ((check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)))) { ++ msleep(30); ++ cnt++; ++ if (cnt > 100) ++ break; ++ } ++ pdata->flags = 0; ++ if (pdata->length >= 32) { ++ if (copy_from_user(data, pdata->pointer, 32)) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ } else { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ if (!mac_pton(data, bssid)) { ++ DBG_88E("Invalid BSSID '%s'.\n", (u8 *)data); ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ return -EINVAL; ++ } ++ ++ if (!memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN)) { ++ /* BSSID match, then check if supporting wpa/wpa2 */ ++ DBG_88E("BSSID:%pM\n", (bssid)); ++ ++ pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); ++ if (pbuf && (wpa_ielen > 0)) { ++ pdata->flags = 1; ++ break; ++ } ++ ++ pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); ++ if (pbuf && (wpa_ielen > 0)) { ++ pdata->flags = 2; ++ break; ++ } ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (pdata->length >= 34) { ++ if (copy_to_user(pdata->pointer + 32, (u8 *)&pdata->flags, 1)) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ } ++ ++exit: ++ ++ return ret; ++} ++ ++static int rtw_set_pid(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ int *pdata = (int *)wrqu; ++ int selector; ++ ++ if (padapter->bDriverStopped || !pdata) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ selector = *pdata; ++ if (selector < 3 && selector >= 0) { ++ padapter->pid[selector] = *(pdata + 1); ++ ui_pid[selector] = *(pdata + 1); ++ DBG_88E("%s set pid[%d] =%d\n", __func__, selector, padapter->pid[selector]); ++ } else { ++ DBG_88E("%s selector %d error\n", __func__, selector); ++ } ++exit: ++ return ret; ++} ++ ++static int rtw_wps_start(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_point *pdata = &wrqu->data; ++ u32 u32wps_start = 0; ++ ++ if (!pdata) ++ return -EINVAL; ++ ret = copy_from_user((void *)&u32wps_start, pdata->pointer, 4); ++ if (ret) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ if (padapter->bDriverStopped) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ ++ if (u32wps_start == 0) ++ u32wps_start = *extra; ++ ++ DBG_88E("[%s] wps_start = %d\n", __func__, u32wps_start); ++ ++ if (u32wps_start == 1) /* WPS Start */ ++ rtw_led_control(padapter, LED_CTL_START_WPS); ++ else if (u32wps_start == 2) /* WPS Stop because of wps success */ ++ rtw_led_control(padapter, LED_CTL_STOP_WPS); ++ else if (u32wps_start == 3) /* WPS Stop because of wps fail */ ++ rtw_led_control(padapter, LED_CTL_STOP_WPS_FAIL); ++ ++exit: ++ return ret; ++} ++ ++#ifdef CONFIG_88EU_P2P ++static int rtw_wext_p2p_enable(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ enum P2P_ROLE init_role = P2P_ROLE_DISABLE; ++ ++ if (*extra == '0') ++ init_role = P2P_ROLE_DISABLE; ++ else if (*extra == '1') ++ init_role = P2P_ROLE_DEVICE; ++ else if (*extra == '2') ++ init_role = P2P_ROLE_CLIENT; ++ else if (*extra == '3') ++ init_role = P2P_ROLE_GO; ++ ++ if (_FAIL == rtw_p2p_enable(padapter, init_role)) { ++ ret = -EFAULT; ++ goto exit; ++ } ++ ++ /* set channel/bandwidth */ ++ if (init_role != P2P_ROLE_DISABLE) { ++ u8 channel, ch_offset; ++ u16 bwmode; ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN)) { ++ /* Stay at the listen state and wait for discovery. */ ++ channel = pwdinfo->listen_channel; ++ pwdinfo->operating_channel = pwdinfo->listen_channel; ++ ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ bwmode = HT_CHANNEL_WIDTH_20; ++ } else { ++ pwdinfo->operating_channel = pmlmeext->cur_channel; ++ ++ channel = pwdinfo->operating_channel; ++ ch_offset = pmlmeext->cur_ch_offset; ++ bwmode = pmlmeext->cur_bwmode; ++ } ++ ++ set_channel_bwmode(padapter, channel, ch_offset, bwmode); ++ } ++ ++exit: ++ return ret; ++} ++ ++static int rtw_p2p_set_go_nego_ssid(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] ssid = %s, len = %zu\n", __func__, extra, strlen(extra)); ++ memcpy(pwdinfo->nego_ssid, extra, strlen(extra)); ++ pwdinfo->nego_ssidlen = strlen(extra); ++ ++ return ret; ++} ++ ++static int rtw_p2p_set_intent(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 intent = pwdinfo->intent; ++ ++ switch (wrqu->data.length) { ++ case 1: ++ intent = extra[0] - '0'; ++ break; ++ case 2: ++ intent = str_2char2num(extra[0], extra[1]); ++ break; ++ } ++ if (intent <= 15) ++ pwdinfo->intent = intent; ++ else ++ ret = -1; ++ DBG_88E("[%s] intent = %d\n", __func__, intent); ++ return ret; ++} ++ ++static int rtw_p2p_set_listen_ch(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 listen_ch = pwdinfo->listen_channel; /* Listen channel number */ ++ ++ switch (wrqu->data.length) { ++ case 1: ++ listen_ch = extra[0] - '0'; ++ break; ++ case 2: ++ listen_ch = str_2char2num(extra[0], extra[1]); ++ break; ++ } ++ ++ if ((listen_ch == 1) || (listen_ch == 6) || (listen_ch == 11)) { ++ pwdinfo->listen_channel = listen_ch; ++ set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ } else { ++ ret = -1; ++ } ++ ++ DBG_88E("[%s] listen_ch = %d\n", __func__, pwdinfo->listen_channel); ++ ++ return ret; ++} ++ ++static int rtw_p2p_set_op_ch(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++/* Commented by Albert 20110524 */ ++/* This function is used to set the operating channel if the driver will become the group owner */ ++ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 op_ch = pwdinfo->operating_channel; /* Operating channel number */ ++ ++ switch (wrqu->data.length) { ++ case 1: ++ op_ch = extra[0] - '0'; ++ break; ++ case 2: ++ op_ch = str_2char2num(extra[0], extra[1]); ++ break; ++ } ++ ++ if (op_ch > 0) ++ pwdinfo->operating_channel = op_ch; ++ else ++ ret = -1; ++ ++ DBG_88E("[%s] op_ch = %d\n", __func__, pwdinfo->operating_channel); ++ ++ return ret; ++} ++ ++static int rtw_p2p_profilefound(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ /* Comment by Albert 2010/10/13 */ ++ /* Input data format: */ ++ /* Ex: 0 */ ++ /* Ex: 1XX:XX:XX:XX:XX:XXYYSSID */ ++ /* 0 => Reflush the profile record list. */ ++ /* 1 => Add the profile list */ ++ /* XX:XX:XX:XX:XX:XX => peer's MAC Address (ex: 00:E0:4C:00:00:01) */ ++ /* YY => SSID Length */ ++ /* SSID => SSID for persistence group */ ++ ++ DBG_88E("[%s] In value = %s, len = %d\n", __func__, extra, wrqu->data.length - 1); ++ ++ /* The upper application should pass the SSID to driver by using this rtw_p2p_profilefound function. */ ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ if (extra[0] == '0') { ++ /* Remove all the profile information of wifidirect_info structure. */ ++ memset(&pwdinfo->profileinfo[0], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM); ++ pwdinfo->profileindex = 0; ++ } else { ++ if (pwdinfo->profileindex >= P2P_MAX_PERSISTENT_GROUP_NUM) { ++ ret = -1; ++ } else { ++ int jj, kk; ++ ++ /* Add this profile information into pwdinfo->profileinfo */ ++ /* Ex: 1XX:XX:XX:XX:XX:XXYYSSID */ ++ for (jj = 0, kk = 1; jj < ETH_ALEN; jj++, kk += 3) ++ pwdinfo->profileinfo[pwdinfo->profileindex].peermac[jj] = key_2char2num(extra[kk], extra[kk + 1]); ++ ++ pwdinfo->profileinfo[pwdinfo->profileindex].ssidlen = (extra[18] - '0') * 10 + (extra[19] - '0'); ++ memcpy(pwdinfo->profileinfo[pwdinfo->profileindex].ssid, &extra[20], pwdinfo->profileinfo[pwdinfo->profileindex].ssidlen); ++ pwdinfo->profileindex++; ++ } ++ } ++ } ++ ++ return ret; ++} ++ ++static int rtw_p2p_setDN(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] %s %d\n", __func__, extra, wrqu->data.length - 1); ++ memset(pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN); ++ memcpy(pwdinfo->device_name, extra, wrqu->data.length - 1); ++ pwdinfo->device_name_len = wrqu->data.length - 1; ++ ++ return ret; ++} ++ ++static int rtw_p2p_get_status(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ if (padapter->bShowGetP2PState) ++ DBG_88E("[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), ++ pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], pwdinfo->p2p_peer_interface_addr[2], ++ pwdinfo->p2p_peer_interface_addr[3], pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]); ++ ++ /* Commented by Albert 2010/10/12 */ ++ /* Because of the output size limitation, I had removed the "Role" information. */ ++ /* About the "Role" information, we will use the new private IOCTL to get the "Role" information. */ ++ sprintf(extra, "\n\nStatus =%.2d\n", rtw_p2p_state(pwdinfo)); ++ wrqu->data.length = strlen(extra); ++ ++ return ret; ++} ++ ++/* Commented by Albert 20110520 */ ++/* This function will return the config method description */ ++/* This config method description will show us which config method the remote P2P device is intended to use */ ++/* by sending the provisioning discovery request frame. */ ++ ++static int rtw_p2p_get_req_cm(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ sprintf(extra, "\n\nCM =%s\n", pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_role(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), ++ pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], pwdinfo->p2p_peer_interface_addr[2], ++ pwdinfo->p2p_peer_interface_addr[3], pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]); ++ ++ sprintf(extra, "\n\nRole =%.2d\n", rtw_p2p_role(pwdinfo)); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_peer_ifaddr(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] Role = %d, Status = %d, peer addr = %pM\n", __func__, ++ rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), ++ pwdinfo->p2p_peer_interface_addr); ++ sprintf(extra, "\nMAC %pM", ++ pwdinfo->p2p_peer_interface_addr); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_peer_devaddr(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++ ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] Role = %d, Status = %d, peer addr = %pM\n", __func__, ++ rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), ++ pwdinfo->rx_prov_disc_info.peerDevAddr); ++ sprintf(extra, "\n%pM", ++ pwdinfo->rx_prov_disc_info.peerDevAddr); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_peer_devaddr_by_invitation(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++ ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] Role = %d, Status = %d, peer addr = %pM\n", ++ __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), ++ pwdinfo->p2p_peer_device_addr); ++ sprintf(extra, "\nMAC %pM", ++ pwdinfo->p2p_peer_device_addr); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_groupid(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++ ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ sprintf(extra, "\n%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s", ++ pwdinfo->groupid_info.go_device_addr[0], pwdinfo->groupid_info.go_device_addr[1], ++ pwdinfo->groupid_info.go_device_addr[2], pwdinfo->groupid_info.go_device_addr[3], ++ pwdinfo->groupid_info.go_device_addr[4], pwdinfo->groupid_info.go_device_addr[5], ++ pwdinfo->groupid_info.ssid); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_op_ch(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++ ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] Op_ch = %02x\n", __func__, pwdinfo->operating_channel); ++ ++ sprintf(extra, "\n\nOp_ch =%.2d\n", pwdinfo->operating_channel); ++ wrqu->data.length = strlen(extra); ++ return ret; ++} ++ ++static int rtw_p2p_get_wps_configmethod(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ u8 peerMACStr[17] = {0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ u8 blnMatch = 0; ++ u16 attr_content = 0; ++ uint attr_contentlen = 0; ++ /* 6 is the string "wpsCM =", 17 is the MAC addr, we have to clear it at wrqu->data.pointer */ ++ u8 attr_content_str[6 + 17] = {0x00}; ++ ++ /* Commented by Albert 20110727 */ ++ /* The input data is the MAC address which the application wants to know its WPS config method. */ ++ /* After knowing its WPS config method, the application can decide the config method for provisioning discovery. */ ++ /* Format: iwpriv wlanx p2p_get_wpsCM 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, (char *)extra); ++ if (copy_from_user(peerMACStr, wrqu->data.pointer + 6, 17)) ++ return -EFAULT; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ u8 *wpsie; ++ uint wpsie_len = 0; ++ __be16 be_tmp; ++ ++ /* The mac address is matched. */ ++ wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len); ++ if (wpsie) { ++ rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_CONF_METHOD, (u8 *)&be_tmp, &attr_contentlen); ++ if (attr_contentlen) { ++ attr_content = be16_to_cpu(be_tmp); ++ sprintf(attr_content_str, "\n\nM =%.4d", attr_content); ++ blnMatch = 1; ++ } ++ } ++ break; ++ } ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (!blnMatch) ++ sprintf(attr_content_str, "\n\nM = 0000"); ++ ++ if (copy_to_user(wrqu->data.pointer, attr_content_str, 6 + 17)) ++ return -EFAULT; ++ return ret; ++} ++ ++static int rtw_p2p_get_go_device_address(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ u8 peerMACStr[17] = {0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ u8 blnMatch = 0; ++ u8 *p2pie; ++ uint p2pielen = 0, attr_contentlen = 0; ++ u8 attr_content[100] = {0x00}; ++ ++ u8 go_devadd_str[100 + 10] = {0x00}; ++ /* +10 is for the str "go_devadd =", we have to clear it at wrqu->data.pointer */ ++ ++ /* Commented by Albert 20121209 */ ++ /* The input data is the GO's interface address which the application wants to know its device address. */ ++ /* Format: iwpriv wlanx p2p_get2 go_devadd = 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, (char *)extra); ++ if (copy_from_user(peerMACStr, wrqu->data.pointer + 10, 17)) ++ return -EFAULT; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ /* Commented by Albert 2011/05/18 */ ++ /* Match the device address located in the P2P IE */ ++ /* This is for the case that the P2P device address is not the same as the P2P interface address. */ ++ ++ p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen); ++ if (p2pie) { ++ while (p2pie) { ++ /* The P2P Device ID attribute is included in the Beacon frame. */ ++ /* The P2P Device Info attribute is included in the probe response frame. */ ++ ++ memset(attr_content, 0x00, 100); ++ if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device ID attribute of Beacon first */ ++ blnMatch = 1; ++ break; ++ } else if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device Info attribute of probe response */ ++ blnMatch = 1; ++ break; ++ } ++ ++ /* Get the next P2P IE */ ++ p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen); ++ } ++ } ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (!blnMatch) ++ sprintf(go_devadd_str, "\n\ndev_add = NULL"); ++ else ++ sprintf(go_devadd_str, "\ndev_add =%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", ++ attr_content[0], attr_content[1], attr_content[2], attr_content[3], attr_content[4], attr_content[5]); ++ ++ if (copy_to_user(wrqu->data.pointer, go_devadd_str, 10 + 17)) ++ return -EFAULT; ++ return ret; ++} ++ ++static int rtw_p2p_get_device_type(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ u8 peerMACStr[17] = {0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ u8 blnMatch = 0; ++ u8 dev_type[8] = {0x00}; ++ uint dev_type_len = 0; ++ u8 dev_type_str[17 + 9] = {0x00}; /* +9 is for the str "dev_type =", we have to clear it at wrqu->data.pointer */ ++ ++ /* Commented by Albert 20121209 */ ++ /* The input data is the MAC address which the application wants to know its device type. */ ++ /* Such user interface could know the device type. */ ++ /* Format: iwpriv wlanx p2p_get2 dev_type = 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, (char *)extra); ++ if (copy_from_user(peerMACStr, wrqu->data.pointer + 9, 17)) ++ return -EFAULT; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ u8 *wpsie; ++ uint wpsie_len = 0; ++ ++ /* The mac address is matched. */ ++ ++ wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], ++ pnetwork->network.IELength - 12, ++ NULL, &wpsie_len); ++ if (wpsie) { ++ rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_PRIMARY_DEV_TYPE, dev_type, &dev_type_len); ++ if (dev_type_len) { ++ u16 type = 0; ++ __be16 be_tmp; ++ ++ memcpy(&be_tmp, dev_type, 2); ++ type = be16_to_cpu(be_tmp); ++ sprintf(dev_type_str, "\n\nN =%.2d", type); ++ blnMatch = 1; ++ } ++ } ++ break; ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (!blnMatch) ++ sprintf(dev_type_str, "\n\nN = 00"); ++ ++ if (copy_to_user(wrqu->data.pointer, dev_type_str, 9 + 17)) { ++ return -EFAULT; ++ } ++ ++ return ret; ++} ++ ++static int rtw_p2p_get_device_name(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ u8 peerMACStr[17] = {0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ u8 blnMatch = 0; ++ u8 dev_name[WPS_MAX_DEVICE_NAME_LEN] = {0x00}; ++ uint dev_len = 0; ++ u8 dev_name_str[WPS_MAX_DEVICE_NAME_LEN + 5] = {0x00}; /* +5 is for the str "devN =", we have to clear it at wrqu->data.pointer */ ++ ++ /* Commented by Albert 20121225 */ ++ /* The input data is the MAC address which the application wants to know its device name. */ ++ /* Such user interface could show peer device's device name instead of ssid. */ ++ /* Format: iwpriv wlanx p2p_get2 devN = 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, (char *)extra); ++ if (copy_from_user(peerMACStr, wrqu->data.pointer + 5, 17)) ++ return -EFAULT; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ u8 *wpsie; ++ uint wpsie_len = 0; ++ ++ /* The mac address is matched. */ ++ wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len); ++ if (wpsie) { ++ rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_DEVICE_NAME, dev_name, &dev_len); ++ if (dev_len) { ++ sprintf(dev_name_str, "\n\nN =%s", dev_name); ++ blnMatch = 1; ++ } ++ } ++ break; ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (!blnMatch) ++ sprintf(dev_name_str, "\n\nN = 0000"); ++ ++ if (copy_to_user(wrqu->data.pointer, dev_name_str, 5 + ((dev_len > 17) ? dev_len : 17))) ++ return -EFAULT; ++ return ret; ++} ++ ++static int rtw_p2p_get_invitation_procedure(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ u8 peerMACStr[17] = {0x00}; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ u8 blnMatch = 0; ++ u8 *p2pie; ++ uint p2pielen = 0, attr_contentlen = 0; ++ u8 attr_content[2] = {0x00}; ++ ++ u8 inv_proc_str[17 + 8] = {0x00}; ++ /* +8 is for the str "InvProc =", we have to clear it at wrqu->data.pointer */ ++ ++ /* Commented by Ouden 20121226 */ ++ /* The application wants to know P2P initiation procedure is supported or not. */ ++ /* Format: iwpriv wlanx p2p_get2 InvProc = 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, (char *)extra); ++ if (copy_from_user(peerMACStr, wrqu->data.pointer + 8, 17)) ++ return -EFAULT; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ /* Commented by Albert 20121226 */ ++ /* Match the device address located in the P2P IE */ ++ /* This is for the case that the P2P device address is not the same as the P2P interface address. */ ++ ++ p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen); ++ if (p2pie) { ++ while (p2pie) { ++ if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_CAPABILITY, attr_content, &attr_contentlen)) { ++ /* Handle the P2P capability attribute */ ++ blnMatch = 1; ++ break; ++ } ++ ++ /* Get the next P2P IE */ ++ p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen); ++ } ++ } ++ } ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (!blnMatch) { ++ sprintf(inv_proc_str, "\nIP =-1"); ++ } else { ++ if (attr_content[0] & 0x20) ++ sprintf(inv_proc_str, "\nIP = 1"); ++ else ++ sprintf(inv_proc_str, "\nIP = 0"); ++ } ++ if (copy_to_user(wrqu->data.pointer, inv_proc_str, 8 + 17)) ++ return -EFAULT; ++ return ret; ++} ++ ++static int rtw_p2p_connect(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ uint uintPeerChannel = 0; ++ ++ /* Commented by Albert 20110304 */ ++ /* The input data contains two informations. */ ++ /* 1. First information is the MAC address which wants to formate with */ ++ /* 2. Second information is the WPS PINCode or "pbc" string for push button method */ ++ /* Format: 00:E0:4C:00:00:05 */ ++ /* Format: 00:E0:4C:00:00:05 */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, extra); ++ ++ if (pwdinfo->p2p_state == P2P_STATE_NONE) { ++ DBG_88E("[%s] WiFi Direct is disable!\n", __func__); ++ return ret; ++ } ++ ++ if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO) ++ return -1; ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(extra[kk], extra[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ if (!memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN)) { ++ uintPeerChannel = pnetwork->network.Configuration.DSConfig; ++ break; ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (uintPeerChannel) { ++ memset(&pwdinfo->nego_req_info, 0x00, sizeof(struct tx_nego_req_info)); ++ memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info)); ++ ++ pwdinfo->nego_req_info.peer_channel_num[0] = uintPeerChannel; ++ memcpy(pwdinfo->nego_req_info.peerDevAddr, pnetwork->network.MacAddress, ETH_ALEN); ++ pwdinfo->nego_req_info.benable = true; ++ ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ if (rtw_p2p_state(pwdinfo) != P2P_STATE_GONEGO_OK) { ++ /* Restore to the listen state if the current p2p state is not nego OK */ ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); ++ } ++ ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING); ++ ++ DBG_88E("[%s] Start PreTx Procedure!\n", __func__); ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_GO_NEGO_TIMEOUT); ++ } else { ++ DBG_88E("[%s] Not Found in Scanning Queue~\n", __func__); ++ ret = -1; ++ } ++ return ret; ++} ++ ++static int rtw_p2p_invite_req(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ int jj, kk; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ uint uintPeerChannel = 0; ++ u8 attr_content[50] = {0x00}; ++ u8 *p2pie; ++ uint p2pielen = 0, attr_contentlen = 0; ++ struct tx_invite_req_info *pinvite_req_info = &pwdinfo->invitereq_info; ++ ++ /* The input data contains two informations. */ ++ /* 1. First information is the P2P device address which you want to send to. */ ++ /* 2. Second information is the group id which combines with GO's mac address, space and GO's ssid. */ ++ /* Command line sample: iwpriv wlan0 p2p_set invite ="00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy" */ ++ /* Format: 00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, extra); ++ ++ if (wrqu->data.length <= 37) { ++ DBG_88E("[%s] Wrong format!\n", __func__); ++ return ret; ++ } ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ DBG_88E("[%s] WiFi Direct is disable!\n", __func__); ++ return ret; ++ } else { ++ /* Reset the content of struct tx_invite_req_info */ ++ pinvite_req_info->benable = false; ++ memset(pinvite_req_info->go_bssid, 0x00, ETH_ALEN); ++ memset(pinvite_req_info->go_ssid, 0x00, WLAN_SSID_MAXLEN); ++ pinvite_req_info->ssidlen = 0x00; ++ pinvite_req_info->operating_ch = pwdinfo->operating_channel; ++ memset(pinvite_req_info->peer_macaddr, 0x00, ETH_ALEN); ++ pinvite_req_info->token = 3; ++ } ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ pinvite_req_info->peer_macaddr[jj] = key_2char2num(extra[kk], extra[kk + 1]); ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ /* Commented by Albert 2011/05/18 */ ++ /* Match the device address located in the P2P IE */ ++ /* This is for the case that the P2P device address is not the same as the P2P interface address. */ ++ ++ p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen); ++ if (p2pie) { ++ /* The P2P Device ID attribute is included in the Beacon frame. */ ++ /* The P2P Device Info attribute is included in the probe response frame. */ ++ ++ if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device ID attribute of Beacon first */ ++ if (!memcmp(attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN)) { ++ uintPeerChannel = pnetwork->network.Configuration.DSConfig; ++ break; ++ } ++ } else if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device Info attribute of probe response */ ++ if (!memcmp(attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN)) { ++ uintPeerChannel = pnetwork->network.Configuration.DSConfig; ++ break; ++ } ++ } ++ } ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (uintPeerChannel) { ++ /* Store the GO's bssid */ ++ for (jj = 0, kk = 18; jj < ETH_ALEN; jj++, kk += 3) ++ pinvite_req_info->go_bssid[jj] = key_2char2num(extra[kk], extra[kk + 1]); ++ ++ /* Store the GO's ssid */ ++ pinvite_req_info->ssidlen = wrqu->data.length - 36; ++ memcpy(pinvite_req_info->go_ssid, &extra[36], (u32)pinvite_req_info->ssidlen); ++ pinvite_req_info->benable = true; ++ pinvite_req_info->peer_ch = uintPeerChannel; ++ ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INVITE_REQ); ++ ++ set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ ++ _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_INVITE_TIMEOUT); ++ } else { ++ DBG_88E("[%s] NOT Found in the Scanning Queue!\n", __func__); ++ } ++ return ret; ++} ++ ++static int rtw_p2p_set_persistent(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ /* The input data is 0 or 1 */ ++ /* 0: disable persistent group functionality */ ++ /* 1: enable persistent group founctionality */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, extra); ++ ++ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ DBG_88E("[%s] WiFi Direct is disable!\n", __func__); ++ return ret; ++ } else { ++ if (extra[0] == '0') /* Disable the persistent group function. */ ++ pwdinfo->persistent_supported = false; ++ else if (extra[0] == '1') /* Enable the persistent group function. */ ++ pwdinfo->persistent_supported = true; ++ else ++ pwdinfo->persistent_supported = false; ++ } ++ pr_info("[%s] persistent_supported = %d\n", __func__, pwdinfo->persistent_supported); ++ return ret; ++} ++ ++static int rtw_p2p_prov_disc(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ u8 peerMAC[ETH_ALEN] = {0x00}; ++ int jj, kk; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct list_head *plist, *phead; ++ struct __queue *queue = &pmlmepriv->scanned_queue; ++ struct wlan_network *pnetwork = NULL; ++ uint uintPeerChannel = 0; ++ u8 attr_content[100] = {0x00}; ++ u8 *p2pie; ++ uint p2pielen = 0, attr_contentlen = 0; ++ ++ /* The input data contains two informations. */ ++ /* 1. First information is the MAC address which wants to issue the provisioning discovery request frame. */ ++ /* 2. Second information is the WPS configuration method which wants to discovery */ ++ /* Format: 00:E0:4C:00:00:05_display */ ++ /* Format: 00:E0:4C:00:00:05_keypad */ ++ /* Format: 00:E0:4C:00:00:05_pbc */ ++ /* Format: 00:E0:4C:00:00:05_label */ ++ ++ DBG_88E("[%s] data = %s\n", __func__, extra); ++ ++ if (pwdinfo->p2p_state == P2P_STATE_NONE) { ++ DBG_88E("[%s] WiFi Direct is disable!\n", __func__); ++ return ret; ++ } else { ++ /* Reset the content of struct tx_provdisc_req_info excluded the wps_config_method_request. */ ++ memset(pwdinfo->tx_prov_disc_info.peerDevAddr, 0x00, ETH_ALEN); ++ memset(pwdinfo->tx_prov_disc_info.peerIFAddr, 0x00, ETH_ALEN); ++ memset(&pwdinfo->tx_prov_disc_info.ssid, 0x00, sizeof(struct ndis_802_11_ssid)); ++ pwdinfo->tx_prov_disc_info.peer_channel_num[0] = 0; ++ pwdinfo->tx_prov_disc_info.peer_channel_num[1] = 0; ++ pwdinfo->tx_prov_disc_info.benable = false; ++ } ++ ++ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) ++ peerMAC[jj] = key_2char2num(extra[kk], extra[kk + 1]); ++ ++ if (!memcmp(&extra[18], "display", 7)) { ++ pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; ++ } else if (!memcmp(&extra[18], "keypad", 7)) { ++ pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; ++ } else if (!memcmp(&extra[18], "pbc", 3)) { ++ pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; ++ } else if (!memcmp(&extra[18], "label", 5)) { ++ pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; ++ } else { ++ DBG_88E("[%s] Unknown WPS config methodn", __func__); ++ return ret; ++ } ++ ++ spin_lock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ phead = get_list_head(queue); ++ plist = phead->next; ++ ++ while (phead != plist) { ++ if (uintPeerChannel != 0) ++ break; ++ ++ pnetwork = container_of(plist, struct wlan_network, list); ++ ++ /* Commented by Albert 2011/05/18 */ ++ /* Match the device address located in the P2P IE */ ++ /* This is for the case that the P2P device address is not the same as the P2P interface address. */ ++ ++ p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen); ++ if (p2pie) { ++ while (p2pie) { ++ /* The P2P Device ID attribute is included in the Beacon frame. */ ++ /* The P2P Device Info attribute is included in the probe response frame. */ ++ ++ if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device ID attribute of Beacon first */ ++ if (!memcmp(attr_content, peerMAC, ETH_ALEN)) { ++ uintPeerChannel = pnetwork->network.Configuration.DSConfig; ++ break; ++ } ++ } else if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen)) { ++ /* Handle the P2P Device Info attribute of probe response */ ++ if (!memcmp(attr_content, peerMAC, ETH_ALEN)) { ++ uintPeerChannel = pnetwork->network.Configuration.DSConfig; ++ break; ++ } ++ } ++ ++ /* Get the next P2P IE */ ++ p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen); ++ } ++ } ++ ++ plist = plist->next; ++ } ++ ++ spin_unlock_bh(&pmlmepriv->scanned_queue.lock); ++ ++ if (uintPeerChannel) { ++ DBG_88E("[%s] peer channel: %d!\n", __func__, uintPeerChannel); ++ memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, pnetwork->network.MacAddress, ETH_ALEN); ++ memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, peerMAC, ETH_ALEN); ++ pwdinfo->tx_prov_disc_info.peer_channel_num[0] = (u16)uintPeerChannel; ++ pwdinfo->tx_prov_disc_info.benable = true; ++ rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ); ++ ++ if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { ++ memcpy(&pwdinfo->tx_prov_disc_info.ssid, &pnetwork->network.Ssid, sizeof(struct ndis_802_11_ssid)); ++ } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { ++ memcpy(pwdinfo->tx_prov_disc_info.ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN); ++ pwdinfo->tx_prov_disc_info.ssid.SsidLength = P2P_WILDCARD_SSID_LEN; ++ } ++ ++ set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); ++ ++ _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); ++ ++ _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT); ++ } else { ++ DBG_88E("[%s] NOT Found in the Scanning Queue!\n", __func__); ++ } ++ return ret; ++} ++ ++/* This function is used to inform the driver the user had specified the pin code value or pbc */ ++/* to application. */ ++ ++static int rtw_p2p_got_wpsinfo(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ ++ DBG_88E("[%s] data = %s\n", __func__, extra); ++ /* Added by Albert 20110328 */ ++ /* if the input data is P2P_NO_WPSINFO -> reset the wpsinfo */ ++ /* if the input data is P2P_GOT_WPSINFO_PEER_DISPLAY_PIN -> the utility just input the PIN code got from the peer P2P device. */ ++ /* if the input data is P2P_GOT_WPSINFO_SELF_DISPLAY_PIN -> the utility just got the PIN code from itself. */ ++ /* if the input data is P2P_GOT_WPSINFO_PBC -> the utility just determine to use the PBC */ ++ ++ if (*extra == '0') ++ pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO; ++ else if (*extra == '1') ++ pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PEER_DISPLAY_PIN; ++ else if (*extra == '2') ++ pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_SELF_DISPLAY_PIN; ++ else if (*extra == '3') ++ pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PBC; ++ else ++ pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO; ++ return ret; ++} ++ ++#endif /* CONFIG_88EU_P2P */ ++ ++static int rtw_p2p_set(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ ++#ifdef CONFIG_88EU_P2P ++ DBG_88E("[%s] extra = %s\n", __func__, extra); ++ if (!memcmp(extra, "enable =", 7)) { ++ rtw_wext_p2p_enable(dev, info, wrqu, &extra[7]); ++ } else if (!memcmp(extra, "setDN =", 6)) { ++ wrqu->data.length -= 6; ++ rtw_p2p_setDN(dev, info, wrqu, &extra[6]); ++ } else if (!memcmp(extra, "profilefound =", 13)) { ++ wrqu->data.length -= 13; ++ rtw_p2p_profilefound(dev, info, wrqu, &extra[13]); ++ } else if (!memcmp(extra, "prov_disc =", 10)) { ++ wrqu->data.length -= 10; ++ rtw_p2p_prov_disc(dev, info, wrqu, &extra[10]); ++ } else if (!memcmp(extra, "nego =", 5)) { ++ wrqu->data.length -= 5; ++ rtw_p2p_connect(dev, info, wrqu, &extra[5]); ++ } else if (!memcmp(extra, "intent =", 7)) { ++ /* Commented by Albert 2011/03/23 */ ++ /* The wrqu->data.length will include the null character */ ++ /* So, we will decrease 7 + 1 */ ++ wrqu->data.length -= 8; ++ rtw_p2p_set_intent(dev, info, wrqu, &extra[7]); ++ } else if (!memcmp(extra, "ssid =", 5)) { ++ wrqu->data.length -= 5; ++ rtw_p2p_set_go_nego_ssid(dev, info, wrqu, &extra[5]); ++ } else if (!memcmp(extra, "got_wpsinfo =", 12)) { ++ wrqu->data.length -= 12; ++ rtw_p2p_got_wpsinfo(dev, info, wrqu, &extra[12]); ++ } else if (!memcmp(extra, "listen_ch =", 10)) { ++ /* Commented by Albert 2011/05/24 */ ++ /* The wrqu->data.length will include the null character */ ++ /* So, we will decrease (10 + 1) */ ++ wrqu->data.length -= 11; ++ rtw_p2p_set_listen_ch(dev, info, wrqu, &extra[10]); ++ } else if (!memcmp(extra, "op_ch =", 6)) { ++ /* Commented by Albert 2011/05/24 */ ++ /* The wrqu->data.length will include the null character */ ++ /* So, we will decrease (6 + 1) */ ++ wrqu->data.length -= 7; ++ rtw_p2p_set_op_ch(dev, info, wrqu, &extra[6]); ++ } else if (!memcmp(extra, "invite =", 7)) { ++ wrqu->data.length -= 8; ++ rtw_p2p_invite_req(dev, info, wrqu, &extra[7]); ++ } else if (!memcmp(extra, "persistent =", 11)) { ++ wrqu->data.length -= 11; ++ rtw_p2p_set_persistent(dev, info, wrqu, &extra[11]); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ ++ return ret; ++} ++ ++static int rtw_p2p_get(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ ++#ifdef CONFIG_88EU_P2P ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ if (padapter->bShowGetP2PState) ++ DBG_88E("[%s] extra = %s\n", __func__, (char *)wrqu->data.pointer); ++ if (!memcmp(wrqu->data.pointer, "status", 6)) { ++ rtw_p2p_get_status(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "role", 4)) { ++ rtw_p2p_get_role(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "peer_ifa", 8)) { ++ rtw_p2p_get_peer_ifaddr(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "req_cm", 6)) { ++ rtw_p2p_get_req_cm(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "peer_deva", 9)) { ++ /* Get the P2P device address when receiving the provision discovery request frame. */ ++ rtw_p2p_get_peer_devaddr(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "group_id", 8)) { ++ rtw_p2p_get_groupid(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "peer_deva_inv", 9)) { ++ /* Get the P2P device address when receiving the P2P Invitation request frame. */ ++ rtw_p2p_get_peer_devaddr_by_invitation(dev, info, wrqu, extra); ++ } else if (!memcmp(wrqu->data.pointer, "op_ch", 5)) { ++ rtw_p2p_get_op_ch(dev, info, wrqu, extra); ++ } ++#endif /* CONFIG_88EU_P2P */ ++ return ret; ++} ++ ++static int rtw_p2p_get2(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ ++#ifdef CONFIG_88EU_P2P ++ DBG_88E("[%s] extra = %s\n", __func__, (char *)wrqu->data.pointer); ++ if (!memcmp(extra, "wpsCM =", 6)) { ++ wrqu->data.length -= 6; ++ rtw_p2p_get_wps_configmethod(dev, info, wrqu, &extra[6]); ++ } else if (!memcmp(extra, "devN =", 5)) { ++ wrqu->data.length -= 5; ++ rtw_p2p_get_device_name(dev, info, wrqu, &extra[5]); ++ } else if (!memcmp(extra, "dev_type =", 9)) { ++ wrqu->data.length -= 9; ++ rtw_p2p_get_device_type(dev, info, wrqu, &extra[9]); ++ } else if (!memcmp(extra, "go_devadd =", 10)) { ++ wrqu->data.length -= 10; ++ rtw_p2p_get_go_device_address(dev, info, wrqu, &extra[10]); ++ } else if (!memcmp(extra, "InvProc =", 8)) { ++ wrqu->data.length -= 8; ++ rtw_p2p_get_invitation_procedure(dev, info, wrqu, &extra[8]); ++ } ++ ++#endif /* CONFIG_88EU_P2P */ ++ ++ return ret; ++} ++ ++static int rtw_cta_test_start(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ DBG_88E("%s %s\n", __func__, extra); ++ if (!strcmp(extra, "1")) ++ padapter->in_cta_test = 1; ++ else ++ padapter->in_cta_test = 0; ++ ++ if (padapter->in_cta_test) { ++ u32 v = rtw_read32(padapter, REG_RCR); ++ v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);/* RCR_ADF */ ++ rtw_write32(padapter, REG_RCR, v); ++ DBG_88E("enable RCR_ADF\n"); ++ } else { ++ u32 v = rtw_read32(padapter, REG_RCR); ++ v |= RCR_CBSSID_DATA | RCR_CBSSID_BCN;/* RCR_ADF */ ++ rtw_write32(padapter, REG_RCR, v); ++ DBG_88E("disable RCR_ADF\n"); ++ } ++ return ret; ++} ++ ++static int rtw_rereg_nd_name(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ struct rereg_nd_name_data *rereg_priv = &padapter->rereg_nd_name_priv; ++ char new_ifname[IFNAMSIZ]; ++ ++ if (rereg_priv->old_ifname[0] == 0) { ++ char *reg_ifname; ++ reg_ifname = padapter->registrypriv.if2name; ++ ++ strncpy(rereg_priv->old_ifname, reg_ifname, IFNAMSIZ); ++ rereg_priv->old_ifname[IFNAMSIZ - 1] = 0; ++ } ++ ++ if (wrqu->data.length > IFNAMSIZ) ++ return -EFAULT; ++ ++ if (copy_from_user(new_ifname, wrqu->data.pointer, IFNAMSIZ)) ++ return -EFAULT; ++ ++ if (0 == strcmp(rereg_priv->old_ifname, new_ifname)) ++ return ret; ++ ++ DBG_88E("%s new_ifname:%s\n", __func__, new_ifname); ++ ret = rtw_change_ifname(padapter, new_ifname); ++ if (0 != ret) ++ goto exit; ++ ++ if (!memcmp(rereg_priv->old_ifname, "disable%d", 9)) { ++ padapter->ledpriv.bRegUseLed = rereg_priv->old_bRegUseLed; ++ rtw_hal_sw_led_init(padapter); ++ rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode); ++ } ++ ++ strncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ); ++ rereg_priv->old_ifname[IFNAMSIZ - 1] = 0; ++ ++ if (!memcmp(new_ifname, "disable%d", 9)) { ++ DBG_88E("%s disable\n", __func__); ++ /* free network queue for Android's timming issue */ ++ rtw_free_network_queue(padapter, true); ++ ++ /* close led */ ++ rtw_led_control(padapter, LED_CTL_POWER_OFF); ++ rereg_priv->old_bRegUseLed = padapter->ledpriv.bRegUseLed; ++ padapter->ledpriv.bRegUseLed = false; ++ rtw_hal_sw_led_deinit(padapter); ++ ++ /* the interface is being "disabled", we can do deeper IPS */ ++ rereg_priv->old_ips_mode = rtw_get_ips_mode_req(&padapter->pwrctrlpriv); ++ rtw_ips_mode_req(&padapter->pwrctrlpriv, IPS_NORMAL); ++ } ++exit: ++ return ret; ++} ++ ++static void mac_reg_dump(struct adapter *padapter) ++{ ++ int i, j = 1; ++ pr_info("\n ======= MAC REG =======\n"); ++ for (i = 0x0; i < 0x300; i += 4) { ++ if (j % 4 == 1) ++ pr_info("0x%02x", i); ++ pr_info(" 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ pr_info("\n"); ++ } ++ for (i = 0x400; i < 0x800; i += 4) { ++ if (j % 4 == 1) ++ pr_info("0x%02x", i); ++ pr_info(" 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ pr_info("\n"); ++ } ++} ++ ++static void bb_reg_dump(struct adapter *padapter) ++{ ++ int i, j = 1; ++ pr_info("\n ======= BB REG =======\n"); ++ for (i = 0x800; i < 0x1000; i += 4) { ++ if (j % 4 == 1) ++ pr_info("0x%02x", i); ++ ++ pr_info(" 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ pr_info("\n"); ++ } ++} ++ ++static void rf_reg_dump(struct adapter *padapter) ++{ ++ int i, j = 1, path; ++ u32 value; ++ u8 rf_type, path_nums = 0; ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ ++ pr_info("\n ======= RF REG =======\n"); ++ if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) ++ path_nums = 1; ++ else ++ path_nums = 2; ++ ++ for (path = 0; path < path_nums; path++) { ++ pr_info("\nRF_Path(%x)\n", path); ++ for (i = 0; i < 0x100; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ pr_info("0x%02x ", i); ++ pr_info(" 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ pr_info("\n"); ++ } ++ } ++} ++ ++static int rtw_dbg_port(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ u8 major_cmd, minor_cmd; ++ u16 arg; ++ s32 extra_arg; ++ u32 *pdata, val32; ++ struct sta_info *psta; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ struct wlan_network *cur_network = &pmlmepriv->cur_network; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ pdata = (u32 *)&wrqu->data; ++ ++ val32 = *pdata; ++ arg = (u16)(val32 & 0x0000ffff); ++ major_cmd = (u8)(val32 >> 24); ++ minor_cmd = (u8)((val32 >> 16) & 0x00ff); ++ ++ extra_arg = *(pdata + 1); ++ ++ switch (major_cmd) { ++ case 0x70:/* read_reg */ ++ switch (minor_cmd) { ++ case 1: ++ DBG_88E("rtw_read8(0x%x) = 0x%02x\n", arg, rtw_read8(padapter, arg)); ++ break; ++ case 2: ++ DBG_88E("rtw_read16(0x%x) = 0x%04x\n", arg, rtw_read16(padapter, arg)); ++ break; ++ case 4: ++ DBG_88E("rtw_read32(0x%x) = 0x%08x\n", arg, rtw_read32(padapter, arg)); ++ break; ++ } ++ break; ++ case 0x71:/* write_reg */ ++ switch (minor_cmd) { ++ case 1: ++ rtw_write8(padapter, arg, extra_arg); ++ DBG_88E("rtw_write8(0x%x) = 0x%02x\n", arg, rtw_read8(padapter, arg)); ++ break; ++ case 2: ++ rtw_write16(padapter, arg, extra_arg); ++ DBG_88E("rtw_write16(0x%x) = 0x%04x\n", arg, rtw_read16(padapter, arg)); ++ break; ++ case 4: ++ rtw_write32(padapter, arg, extra_arg); ++ DBG_88E("rtw_write32(0x%x) = 0x%08x\n", arg, rtw_read32(padapter, arg)); ++ break; ++ } ++ break; ++ case 0x72:/* read_bb */ ++ DBG_88E("read_bbreg(0x%x) = 0x%x\n", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff)); ++ break; ++ case 0x73:/* write_bb */ ++ rtw_hal_write_bbreg(padapter, arg, 0xffffffff, extra_arg); ++ DBG_88E("write_bbreg(0x%x) = 0x%x\n", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff)); ++ break; ++ case 0x74:/* read_rf */ ++ DBG_88E("read RF_reg path(0x%02x), offset(0x%x), value(0x%08x)\n", minor_cmd, arg, rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff)); ++ break; ++ case 0x75:/* write_rf */ ++ rtw_hal_write_rfreg(padapter, minor_cmd, arg, 0xffffffff, extra_arg); ++ DBG_88E("write RF_reg path(0x%02x), offset(0x%x), value(0x%08x)\n", minor_cmd, arg, rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff)); ++ break; ++ ++ case 0x76: ++ switch (minor_cmd) { ++ case 0x00: /* normal mode, */ ++ padapter->recvpriv.is_signal_dbg = 0; ++ break; ++ case 0x01: /* dbg mode */ ++ padapter->recvpriv.is_signal_dbg = 1; ++ extra_arg = extra_arg > 100 ? 100 : extra_arg; ++ extra_arg = extra_arg < 0 ? 0 : extra_arg; ++ padapter->recvpriv.signal_strength_dbg = extra_arg; ++ break; ++ } ++ break; ++ case 0x78: /* IOL test */ ++ switch (minor_cmd) { ++ case 0x04: /* LLT table initialization test */ ++ { ++ u8 page_boundary = 0xf9; ++ struct xmit_frame *xmit_frame; ++ ++ xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ++ if (!xmit_frame) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ rtw_IOL_append_LLT_cmd(xmit_frame, page_boundary); ++ ++ if (_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 500, 0)) ++ ret = -EPERM; ++ } ++ break; ++ case 0x05: /* blink LED test */ ++ { ++ u16 reg = 0x4c; ++ u32 blink_num = 50; ++ u32 blink_delay_ms = 200; ++ int i; ++ struct xmit_frame *xmit_frame; ++ ++ xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ++ if (!xmit_frame) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ for (i = 0; i < blink_num; i++) { ++ rtw_IOL_append_WB_cmd(xmit_frame, reg, 0x00, 0xff); ++ rtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms); ++ rtw_IOL_append_WB_cmd(xmit_frame, reg, 0x08, 0xff); ++ rtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms); ++ } ++ if (_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, (blink_delay_ms * blink_num * 2) + 200, 0)) ++ ret = -EPERM; ++ } ++ break; ++ ++ case 0x06: /* continuous write byte test */ ++ { ++ u16 reg = arg; ++ u16 start_value = 0; ++ u32 write_num = extra_arg; ++ int i; ++ u8 final; ++ struct xmit_frame *xmit_frame; ++ ++ xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ++ if (!xmit_frame) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ for (i = 0; i < write_num; i++) ++ rtw_IOL_append_WB_cmd(xmit_frame, reg, i + start_value, 0xFF); ++ if (_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0)) ++ ret = -EPERM; ++ ++ final = rtw_read8(padapter, reg); ++ if (start_value + write_num - 1 == final) ++ DBG_88E("continuous IOL_CMD_WB_REG to 0x%x %u times Success, start:%u, final:%u\n", reg, write_num, start_value, final); ++ else ++ DBG_88E("continuous IOL_CMD_WB_REG to 0x%x %u times Fail, start:%u, final:%u\n", reg, write_num, start_value, final); ++ } ++ break; ++ ++ case 0x07: /* continuous write word test */ ++ { ++ u16 reg = arg; ++ u16 start_value = 200; ++ u32 write_num = extra_arg; ++ ++ int i; ++ u16 final; ++ struct xmit_frame *xmit_frame; ++ ++ xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ++ if (!xmit_frame) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ for (i = 0; i < write_num; i++) ++ rtw_IOL_append_WW_cmd(xmit_frame, reg, i + start_value, 0xFFFF); ++ if (_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0)) ++ ret = -EPERM; ++ ++ final = rtw_read16(padapter, reg); ++ if (start_value + write_num - 1 == final) ++ DBG_88E("continuous IOL_CMD_WW_REG to 0x%x %u times Success, start:%u, final:%u\n", reg, write_num, start_value, final); ++ else ++ DBG_88E("continuous IOL_CMD_WW_REG to 0x%x %u times Fail, start:%u, final:%u\n", reg, write_num, start_value, final); ++ } ++ break; ++ case 0x08: /* continuous write dword test */ ++ { ++ u16 reg = arg; ++ u32 start_value = 0x110000c7; ++ u32 write_num = extra_arg; ++ ++ int i; ++ u32 final; ++ struct xmit_frame *xmit_frame; ++ ++ xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ++ if (!xmit_frame) { ++ ret = -ENOMEM; ++ break; ++ } ++ ++ for (i = 0; i < write_num; i++) ++ rtw_IOL_append_WD_cmd(xmit_frame, reg, i + start_value, 0xFFFFFFFF); ++ if (_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0)) ++ ret = -EPERM; ++ ++ final = rtw_read32(padapter, reg); ++ if (start_value + write_num - 1 == final) ++ DBG_88E("continuous IOL_CMD_WD_REG to 0x%x %u times Success, start:%u, final:%u\n", ++ reg, write_num, start_value, final); ++ else ++ DBG_88E("continuous IOL_CMD_WD_REG to 0x%x %u times Fail, start:%u, final:%u\n", ++ reg, write_num, start_value, final); ++ } ++ break; ++ } ++ break; ++ case 0x79: ++ { ++ /* ++ * dbg 0x79000000 [value], set RESP_TXAGC to + value, value:0~15 ++ * dbg 0x79010000 [value], set RESP_TXAGC to - value, value:0~15 ++ */ ++ u8 value = extra_arg & 0x0f; ++ u8 sign = minor_cmd; ++ u16 write_value = 0; ++ ++ DBG_88E("%s set RESP_TXAGC to %s %u\n", __func__, sign ? "minus" : "plus", value); ++ ++ if (sign) ++ value = value | 0x10; ++ ++ write_value = value | (value << 5); ++ rtw_write16(padapter, 0x6d9, write_value); ++ } ++ break; ++ case 0x7a: ++ receive_disconnect(padapter, pmlmeinfo->network.MacAddress ++ , WLAN_REASON_EXPIRATION_CHK); ++ break; ++ case 0x7F: ++ switch (minor_cmd) { ++ case 0x0: ++ DBG_88E("fwstate = 0x%x\n", get_fwstate(pmlmepriv)); ++ break; ++ case 0x01: ++ DBG_88E("auth_alg = 0x%x, enc_alg = 0x%x, auth_type = 0x%x, enc_type = 0x%x\n", ++ psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, ++ psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus); ++ break; ++ case 0x02: ++ DBG_88E("pmlmeinfo->state = 0x%x\n", pmlmeinfo->state); ++ break; ++ case 0x03: ++ DBG_88E("qos_option =%d\n", pmlmepriv->qospriv.qos_option); ++ DBG_88E("ht_option =%d\n", pmlmepriv->htpriv.ht_option); ++ break; ++ case 0x04: ++ DBG_88E("cur_ch =%d\n", pmlmeext->cur_channel); ++ DBG_88E("cur_bw =%d\n", pmlmeext->cur_bwmode); ++ DBG_88E("cur_ch_off =%d\n", pmlmeext->cur_ch_offset); ++ break; ++ case 0x05: ++ psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); ++ if (psta) { ++ int i; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ ++ DBG_88E("SSID =%s\n", cur_network->network.Ssid.Ssid); ++ DBG_88E("sta's macaddr: %pM\n", psta->hwaddr); ++ DBG_88E("cur_channel =%d, cur_bwmode =%d, cur_ch_offset =%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); ++ DBG_88E("rtsen =%d, cts2slef =%d\n", psta->rtsen, psta->cts2self); ++ DBG_88E("state = 0x%x, aid =%d, macid =%d, raid =%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); ++ DBG_88E("qos_en =%d, ht_en =%d, init_rate =%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); ++ DBG_88E("bwmode =%d, ch_offset =%d, sgi =%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); ++ DBG_88E("ampdu_enable = %d\n", psta->htpriv.ampdu_enable); ++ DBG_88E("agg_enable_bitmap =%x, candidate_tid_bitmap =%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); ++ for (i = 0; i < 16; i++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[i]; ++ if (preorder_ctrl->enable) ++ DBG_88E("tid =%d, indicate_seq =%d\n", i, preorder_ctrl->indicate_seq); ++ } ++ } else { ++ DBG_88E("can't get sta's macaddr, cur_network's macaddr:%pM\n", (cur_network->network.MacAddress)); ++ } ++ break; ++ case 0x06: ++ { ++ u32 ODMFlag; ++ rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); ++ DBG_88E("(B)DMFlag = 0x%x, arg = 0x%x\n", ODMFlag, arg); ++ ODMFlag = (u32)(0x0f & arg); ++ DBG_88E("(A)DMFlag = 0x%x\n", ODMFlag); ++ rtw_hal_set_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); ++ } ++ break; ++ case 0x07: ++ DBG_88E("bSurpriseRemoved =%d, bDriverStopped =%d\n", ++ padapter->bSurpriseRemoved, padapter->bDriverStopped); ++ break; ++ case 0x08: ++ { ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ DBG_88E("free_xmitbuf_cnt =%d, free_xmitframe_cnt =%d, free_xmit_extbuf_cnt =%d\n", ++ pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmit_extbuf_cnt); ++ DBG_88E("rx_urb_pending_cn =%d\n", precvpriv->rx_pending_cnt); ++ } ++ break; ++ case 0x09: ++ { ++ int i, j; ++ struct list_head *plist, *phead; ++ struct recv_reorder_ctrl *preorder_ctrl; ++ ++#ifdef CONFIG_88EU_AP_MODE ++ DBG_88E("sta_dz_bitmap = 0x%x, tim_bitmap = 0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); ++#endif ++ spin_lock_bh(&pstapriv->sta_hash_lock); ++ ++ for (i = 0; i < NUM_STA; i++) { ++ phead = &pstapriv->sta_hash[i]; ++ plist = phead->next; ++ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, hash_list); ++ ++ plist = plist->next; ++ ++ if (extra_arg == psta->aid) { ++ DBG_88E("sta's macaddr:%pM\n", (psta->hwaddr)); ++ DBG_88E("rtsen =%d, cts2slef =%d\n", psta->rtsen, psta->cts2self); ++ DBG_88E("state = 0x%x, aid =%d, macid =%d, raid =%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); ++ DBG_88E("qos_en =%d, ht_en =%d, init_rate =%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); ++ DBG_88E("bwmode =%d, ch_offset =%d, sgi =%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); ++ DBG_88E("ampdu_enable = %d\n", psta->htpriv.ampdu_enable); ++ DBG_88E("agg_enable_bitmap =%x, candidate_tid_bitmap =%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ DBG_88E("capability = 0x%x\n", psta->capability); ++ DBG_88E("flags = 0x%x\n", psta->flags); ++ DBG_88E("wpa_psk = 0x%x\n", psta->wpa_psk); ++ DBG_88E("wpa2_group_cipher = 0x%x\n", psta->wpa2_group_cipher); ++ DBG_88E("wpa2_pairwise_cipher = 0x%x\n", psta->wpa2_pairwise_cipher); ++ DBG_88E("qos_info = 0x%x\n", psta->qos_info); ++#endif ++ DBG_88E("dot118021XPrivacy = 0x%x\n", psta->dot118021XPrivacy); ++ ++ for (j = 0; j < 16; j++) { ++ preorder_ctrl = &psta->recvreorder_ctrl[j]; ++ if (preorder_ctrl->enable) ++ DBG_88E("tid =%d, indicate_seq =%d\n", j, preorder_ctrl->indicate_seq); ++ } ++ } ++ } ++ } ++ spin_unlock_bh(&pstapriv->sta_hash_lock); ++ } ++ break; ++ case 0x0c:/* dump rx/tx packet */ ++ if (arg == 0) { ++ DBG_88E("dump rx packet (%d)\n", extra_arg); ++ rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DUMP_RXPKT, &(extra_arg)); ++ } else if (arg == 1) { ++ DBG_88E("dump tx packet (%d)\n", extra_arg); ++ rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DUMP_TXPKT, &(extra_arg)); ++ } ++ break; ++ case 0x0f: ++ if (extra_arg == 0) { ++ DBG_88E("###### silent reset test.......#####\n"); ++ rtw_hal_sreset_reset(padapter); ++ } ++ break; ++ case 0x15: ++ { ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ DBG_88E("==>silent resete cnts:%d\n", pwrpriv->ips_enter_cnts); ++ } ++ break; ++ case 0x10:/* driver version display */ ++ DBG_88E("rtw driver version =%s\n", DRIVERVERSION); ++ break; ++ case 0x11: ++ DBG_88E("turn %s Rx RSSI display function\n", (extra_arg == 1) ? "on" : "off"); ++ padapter->bRxRSSIDisplay = extra_arg; ++ break; ++ case 0x12: /* set rx_stbc */ ++ { ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ /* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, 0x3: enable both 2.4g and 5g */ ++ /* default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */ ++ if (pregpriv && ++ (extra_arg == 0 || ++ extra_arg == 1 || ++ extra_arg == 2 || ++ extra_arg == 3)) { ++ pregpriv->rx_stbc = extra_arg; ++ DBG_88E("set rx_stbc =%d\n", pregpriv->rx_stbc); ++ } else { ++ DBG_88E("get rx_stbc =%d\n", pregpriv->rx_stbc); ++ } ++ } ++ break; ++ case 0x13: /* set ampdu_enable */ ++ { ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ /* 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec) */ ++ if (pregpriv && extra_arg >= 0 && extra_arg < 3) { ++ pregpriv->ampdu_enable = extra_arg; ++ DBG_88E("set ampdu_enable =%d\n", pregpriv->ampdu_enable); ++ } else { ++ DBG_88E("get ampdu_enable =%d\n", pregpriv->ampdu_enable); ++ } ++ } ++ break; ++ case 0x14: /* get wifi_spec */ ++ { ++ struct registry_priv *pregpriv = &padapter->registrypriv; ++ DBG_88E("get wifi_spec =%d\n", pregpriv->wifi_spec); ++ } ++ break; ++ case 0x23: ++ DBG_88E("turn %s the bNotifyChannelChange Variable\n", (extra_arg == 1) ? "on" : "off"); ++ padapter->bNotifyChannelChange = extra_arg; ++ break; ++ case 0x24: ++#ifdef CONFIG_88EU_P2P ++ DBG_88E("turn %s the bShowGetP2PState Variable\n", (extra_arg == 1) ? "on" : "off"); ++ padapter->bShowGetP2PState = extra_arg; ++#endif /* CONFIG_88EU_P2P */ ++ break; ++ case 0xaa: ++ if (extra_arg > 0x13) ++ extra_arg = 0xFF; ++ DBG_88E("chang data rate to :0x%02x\n", extra_arg); ++ padapter->fix_rate = extra_arg; ++ break; ++ case 0xdd:/* registers dump, 0 for mac reg, 1 for bb reg, 2 for rf reg */ ++ if (extra_arg == 0) ++ mac_reg_dump(padapter); ++ else if (extra_arg == 1) ++ bb_reg_dump(padapter); ++ else if (extra_arg == 2) ++ rf_reg_dump(padapter); ++ break; ++ case 0xee:/* turn on/off dynamic funcs */ ++ { ++ u32 odm_flag; ++ ++ if (0xf == extra_arg) { ++ rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &odm_flag); ++ DBG_88E(" === DMFlag(0x%08x) ===\n", odm_flag); ++ DBG_88E("extra_arg = 0 - disable all dynamic func\n"); ++ DBG_88E("extra_arg = 1 - disable DIG- BIT(0)\n"); ++ DBG_88E("extra_arg = 2 - disable High power - BIT(1)\n"); ++ DBG_88E("extra_arg = 3 - disable tx power tracking - BIT(2)\n"); ++ DBG_88E("extra_arg = 4 - disable BT coexistence - BIT(3)\n"); ++ DBG_88E("extra_arg = 5 - disable antenna diversity - BIT(4)\n"); ++ DBG_88E("extra_arg = 6 - enable all dynamic func\n"); ++ } else { ++ /* extra_arg = 0 - disable all dynamic func ++ extra_arg = 1 - disable DIG ++ extra_arg = 2 - disable tx power tracking ++ extra_arg = 3 - turn on all dynamic func ++ */ ++ rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &(extra_arg)); ++ rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &odm_flag); ++ DBG_88E(" === DMFlag(0x%08x) ===\n", odm_flag); ++ } ++ } ++ break; ++ ++ case 0xfd: ++ rtw_write8(padapter, 0xc50, arg); ++ DBG_88E("wr(0xc50) = 0x%x\n", rtw_read8(padapter, 0xc50)); ++ rtw_write8(padapter, 0xc58, arg); ++ DBG_88E("wr(0xc58) = 0x%x\n", rtw_read8(padapter, 0xc58)); ++ break; ++ case 0xfe: ++ DBG_88E("rd(0xc50) = 0x%x\n", rtw_read8(padapter, 0xc50)); ++ DBG_88E("rd(0xc58) = 0x%x\n", rtw_read8(padapter, 0xc58)); ++ break; ++ case 0xff: ++ DBG_88E("dbg(0x210) = 0x%x\n", rtw_read32(padapter, 0x210)); ++ DBG_88E("dbg(0x608) = 0x%x\n", rtw_read32(padapter, 0x608)); ++ DBG_88E("dbg(0x280) = 0x%x\n", rtw_read32(padapter, 0x280)); ++ DBG_88E("dbg(0x284) = 0x%x\n", rtw_read32(padapter, 0x284)); ++ DBG_88E("dbg(0x288) = 0x%x\n", rtw_read32(padapter, 0x288)); ++ ++ DBG_88E("dbg(0x664) = 0x%x\n", rtw_read32(padapter, 0x664)); ++ ++ DBG_88E("\n"); ++ ++ DBG_88E("dbg(0x430) = 0x%x\n", rtw_read32(padapter, 0x430)); ++ DBG_88E("dbg(0x438) = 0x%x\n", rtw_read32(padapter, 0x438)); ++ ++ DBG_88E("dbg(0x440) = 0x%x\n", rtw_read32(padapter, 0x440)); ++ ++ DBG_88E("dbg(0x458) = 0x%x\n", rtw_read32(padapter, 0x458)); ++ ++ DBG_88E("dbg(0x484) = 0x%x\n", rtw_read32(padapter, 0x484)); ++ DBG_88E("dbg(0x488) = 0x%x\n", rtw_read32(padapter, 0x488)); ++ ++ DBG_88E("dbg(0x444) = 0x%x\n", rtw_read32(padapter, 0x444)); ++ DBG_88E("dbg(0x448) = 0x%x\n", rtw_read32(padapter, 0x448)); ++ DBG_88E("dbg(0x44c) = 0x%x\n", rtw_read32(padapter, 0x44c)); ++ DBG_88E("dbg(0x450) = 0x%x\n", rtw_read32(padapter, 0x450)); ++ break; ++ } ++ break; ++ default: ++ DBG_88E("error dbg cmd!\n"); ++ break; ++ } ++ return ret; ++} ++ ++static int rtw_wx_set_priv(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *awrq, ++ char *extra) ++{ ++ int ret = 0; ++ int len = 0; ++ char *ext; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_point *dwrq = (struct iw_point *)awrq; ++ ++ if (dwrq->length == 0) ++ return -EFAULT; ++ ++ len = dwrq->length; ++ ext = vmalloc(len); ++ if (!ext) ++ return -ENOMEM; ++ ++ if (copy_from_user(ext, dwrq->pointer, len)) { ++ vfree(ext); ++ return -EFAULT; ++ } ++ ++ /* added for wps2.0 @20110524 */ ++ if (dwrq->flags == 0x8766 && len > 8) { ++ u32 cp_sz; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ u8 *probereq_wpsie = ext; ++ int probereq_wpsie_len = len; ++ u8 wps_oui[4] = {0x0, 0x50, 0xf2, 0x04}; ++ ++ if ((_VENDOR_SPECIFIC_IE_ == probereq_wpsie[0]) && ++ (!memcmp(&probereq_wpsie[2], wps_oui, 4))) { ++ cp_sz = probereq_wpsie_len > MAX_WPS_IE_LEN ? MAX_WPS_IE_LEN : probereq_wpsie_len; ++ ++ pmlmepriv->wps_probe_req_ie_len = 0; ++ kfree(pmlmepriv->wps_probe_req_ie); ++ pmlmepriv->wps_probe_req_ie = NULL; ++ ++ pmlmepriv->wps_probe_req_ie = kmalloc(cp_sz, GFP_KERNEL); ++ if (!pmlmepriv->wps_probe_req_ie) { ++ ret = -EINVAL; ++ goto FREE_EXT; ++ } ++ memcpy(pmlmepriv->wps_probe_req_ie, probereq_wpsie, cp_sz); ++ pmlmepriv->wps_probe_req_ie_len = cp_sz; ++ } ++ goto FREE_EXT; ++ } ++ ++ if (len >= WEXT_CSCAN_HEADER_SIZE && ++ !memcmp(ext, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE)) { ++ ret = rtw_wx_set_scan(dev, info, awrq, ext); ++ goto FREE_EXT; ++ } ++ ++FREE_EXT: ++ ++ vfree(ext); ++ ++ return ret; ++} ++ ++static int rtw_pm_set(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ int ret = 0; ++ unsigned mode = 0; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ ++ DBG_88E("[%s] extra = %s\n", __func__, extra); ++ ++ if (!memcmp(extra, "lps =", 4)) { ++ sscanf(extra + 4, "%u", &mode); ++ ret = rtw_pm_set_lps(padapter, mode); ++ } else if (!memcmp(extra, "ips =", 4)) { ++ sscanf(extra + 4, "%u", &mode); ++ ret = rtw_pm_set_ips(padapter, mode); ++ } else { ++ ret = -EINVAL; ++ } ++ ++ return ret; ++} ++ ++static int rtw_mp_efuse_get(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wdata, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); ++ struct hal_data_8188e *haldata = GET_HAL_DATA(padapter); ++ struct efuse_hal *pEfuseHal; ++ struct iw_point *wrqu; ++ ++ u8 *PROMContent = pEEPROM->efuse_eeprom_data; ++ u8 ips_mode = 0, lps_mode = 0; ++ struct pwrctrl_priv *pwrctrlpriv; ++ u8 *data = NULL; ++ u8 *rawdata = NULL; ++ char *pch, *ptmp, *token, *tmp[3] = {NULL, NULL, NULL}; ++ u16 i = 0, j = 0, mapLen = 0, addr = 0, cnts = 0; ++ u16 max_available_size = 0, raw_cursize = 0, raw_maxsize = 0; ++ int err; ++ u8 org_fw_iol = padapter->registrypriv.fw_iol;/* 0:Disable, 1:enable, 2:by usb speed */ ++ ++ wrqu = (struct iw_point *)wdata; ++ pwrctrlpriv = &padapter->pwrctrlpriv; ++ pEfuseHal = &haldata->EfuseHal; ++ ++ err = 0; ++ data = kzalloc(EFUSE_BT_MAX_MAP_LEN, GFP_KERNEL); ++ if (!data) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ rawdata = kzalloc(EFUSE_BT_MAX_MAP_LEN, GFP_KERNEL); ++ if (!rawdata) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ++ if (copy_from_user(extra, wrqu->pointer, wrqu->length)) { ++ err = -EFAULT; ++ goto exit; ++ } ++ lps_mode = pwrctrlpriv->power_mgnt;/* keep org value */ ++ rtw_pm_set_lps(padapter, PS_MODE_ACTIVE); ++ ++ ips_mode = pwrctrlpriv->ips_mode;/* keep org value */ ++ rtw_pm_set_ips(padapter, IPS_NONE); ++ ++ pch = extra; ++ DBG_88E("%s: in =%s\n", __func__, extra); ++ ++ i = 0; ++ /* mac 16 "00e04c871200" rmap, 00, 2 */ ++ while ((token = strsep(&pch, ",")) != NULL) { ++ if (i > 2) ++ break; ++ tmp[i] = token; ++ i++; ++ } ++ padapter->registrypriv.fw_iol = 0;/* 0:Disable, 1:enable, 2:by usb speed */ ++ ++ if (strcmp(tmp[0], "status") == 0) { ++ sprintf(extra, "Load File efuse =%s, Load File MAC =%s", (pEEPROM->bloadfile_fail_flag ? "FAIL" : "OK"), (pEEPROM->bloadmac_fail_flag ? "FAIL" : "OK")); ++ ++ goto exit; ++ } else if (strcmp(tmp[0], "filemap") == 0) { ++ mapLen = EFUSE_MAP_SIZE; ++ ++ sprintf(extra, "\n"); ++ for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { ++ sprintf(extra + strlen(extra), "0x%02x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", PROMContent[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", PROMContent[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "realmap") == 0) { ++ mapLen = EFUSE_MAP_SIZE; ++ if (rtw_efuse_map_read(padapter, 0, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) { ++ DBG_88E("%s: read realmap Fail!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ sprintf(extra, "\n"); ++ for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { ++ sprintf(extra + strlen(extra), "0x%02x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "rmap") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ DBG_88E("%s: rmap Fail!! Parameters error!\n", __func__); ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ /* rmap addr cnts */ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ DBG_88E("%s: addr =%x\n", __func__, addr); ++ ++ cnts = simple_strtoul(tmp[2], &ptmp, 10); ++ if (cnts == 0) { ++ DBG_88E("%s: rmap Fail!! cnts error!\n", __func__); ++ err = -EINVAL; ++ goto exit; ++ } ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_read error!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ *extra = 0; ++ for (i = 0; i < cnts; i++) ++ sprintf(extra + strlen(extra), "0x%02X ", data[i]); ++ } else if (strcmp(tmp[0], "realraw") == 0) { ++ addr = 0; ++ mapLen = EFUSE_MAX_SIZE; ++ if (rtw_efuse_access(padapter, false, addr, mapLen, rawdata) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_access Fail!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ sprintf(extra, "\n"); ++ for (i = 0; i < mapLen; i++) { ++ sprintf(extra + strlen(extra), "%02X", rawdata[i]); ++ ++ if ((i & 0xF) == 0xF) ++ sprintf(extra + strlen(extra), "\n"); ++ else if ((i & 0x7) == 0x7) ++ sprintf(extra + strlen(extra), "\t"); ++ else ++ sprintf(extra + strlen(extra), " "); ++ } ++ } else if (strcmp(tmp[0], "mac") == 0) { ++ cnts = 6; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_read error!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ *extra = 0; ++ for (i = 0; i < cnts; i++) { ++ sprintf(extra + strlen(extra), "%02X", data[i]); ++ if (i != (cnts - 1)) ++ sprintf(extra + strlen(extra), ":"); ++ } ++ } else if (strcmp(tmp[0], "vidpid") == 0) { ++ cnts = 4; ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_access error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ *extra = 0; ++ for (i = 0; i < cnts; i++) { ++ sprintf(extra + strlen(extra), "0x%02X", data[i]); ++ if (i != (cnts - 1)) ++ sprintf(extra + strlen(extra), ","); ++ } ++ } else if (strcmp(tmp[0], "ableraw") == 0) { ++ efuse_GetCurrentSize(padapter, &raw_cursize); ++ raw_maxsize = efuse_GetMaxSize(padapter); ++ sprintf(extra, "[available raw size] = %d bytes", raw_maxsize - raw_cursize); ++ } else if (strcmp(tmp[0], "btfmap") == 0) { ++ mapLen = EFUSE_BT_MAX_MAP_LEN; ++ if (rtw_BT_efuse_map_read(padapter, 0, mapLen, pEfuseHal->BTEfuseInitMap) == _FAIL) { ++ DBG_88E("%s: rtw_BT_efuse_map_read Fail!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ sprintf(extra, "\n"); ++ for (i = 0; i < 512; i += 16) { ++ /* set 512 because the iwpriv's extra size have limit 0x7FF */ ++ sprintf(extra + strlen(extra), "0x%03x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "btbmap") == 0) { ++ mapLen = EFUSE_BT_MAX_MAP_LEN; ++ if (rtw_BT_efuse_map_read(padapter, 0, mapLen, pEfuseHal->BTEfuseInitMap) == _FAIL) { ++ DBG_88E("%s: rtw_BT_efuse_map_read Fail!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ sprintf(extra, "\n"); ++ for (i = 512; i < 1024; i += 16) { ++ sprintf(extra + strlen(extra), "0x%03x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->BTEfuseInitMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "btrmap") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ /* rmap addr cnts */ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ ++ cnts = simple_strtoul(tmp[2], &ptmp, 10); ++ if (cnts == 0) { ++ DBG_88E("%s: btrmap Fail!! cnts error!\n", __func__); ++ err = -EINVAL; ++ goto exit; ++ } ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_BT_efuse_map_read(padapter, addr, cnts, data) == _FAIL) { ++ DBG_88E("%s: rtw_BT_efuse_map_read error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ *extra = 0; ++ for (i = 0; i < cnts; i++) ++ sprintf(extra + strlen(extra), " 0x%02X ", data[i]); ++ } else if (strcmp(tmp[0], "btffake") == 0) { ++ sprintf(extra, "\n"); ++ for (i = 0; i < 512; i += 16) { ++ sprintf(extra + strlen(extra), "0x%03x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "btbfake") == 0) { ++ sprintf(extra, "\n"); ++ for (i = 512; i < 1024; i += 16) { ++ sprintf(extra + strlen(extra), "0x%03x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeBTEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else if (strcmp(tmp[0], "wlrfkmap") == 0) { ++ sprintf(extra, "\n"); ++ for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { ++ sprintf(extra + strlen(extra), "0x%02x\t", i); ++ for (j = 0; j < 8; j++) ++ sprintf(extra + strlen(extra), "%02X ", pEfuseHal->fakeEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\t"); ++ for (; j < 16; j++) ++ sprintf(extra + strlen(extra), " %02X", pEfuseHal->fakeEfuseModifiedMap[i + j]); ++ sprintf(extra + strlen(extra), "\n"); ++ } ++ } else { ++ sprintf(extra, "Command not found!"); ++ } ++ ++exit: ++ kfree(data); ++ kfree(rawdata); ++ if (!err) ++ wrqu->length = strlen(extra); ++ ++ rtw_pm_set_ips(padapter, ips_mode); ++ rtw_pm_set_lps(padapter, lps_mode); ++ padapter->registrypriv.fw_iol = org_fw_iol;/* 0:Disable, 1:enable, 2:by usb speed */ ++ return err; ++} ++ ++static int rtw_mp_efuse_set(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wdata, char *extra) ++{ ++ struct adapter *padapter; ++ struct pwrctrl_priv *pwrctrlpriv; ++ struct hal_data_8188e *haldata; ++ struct efuse_hal *pEfuseHal; ++ ++ u8 ips_mode = 0, lps_mode = 0; ++ u32 i, jj, kk; ++ u8 *setdata = NULL; ++ u8 *ShadowMapBT = NULL; ++ u8 *ShadowMapWiFi = NULL; ++ u8 *setrawdata = NULL; ++ char *pch, *ptmp, *token, *tmp[3] = {NULL, NULL, NULL}; ++ u16 addr = 0, cnts = 0, max_available_size = 0; ++ int err; ++ ++ padapter = rtw_netdev_priv(dev); ++ pwrctrlpriv = &padapter->pwrctrlpriv; ++ haldata = GET_HAL_DATA(padapter); ++ pEfuseHal = &haldata->EfuseHal; ++ err = 0; ++ setdata = kzalloc(1024, GFP_KERNEL); ++ if (!setdata) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ShadowMapBT = kmalloc(EFUSE_BT_MAX_MAP_LEN, GFP_KERNEL); ++ if (!ShadowMapBT) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ShadowMapWiFi = kmalloc(EFUSE_MAP_SIZE, GFP_KERNEL); ++ if (!ShadowMapWiFi) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ setrawdata = kmalloc(EFUSE_MAX_SIZE, GFP_KERNEL); ++ if (!setrawdata) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ++ lps_mode = pwrctrlpriv->power_mgnt;/* keep org value */ ++ rtw_pm_set_lps(padapter, PS_MODE_ACTIVE); ++ ++ ips_mode = pwrctrlpriv->ips_mode;/* keep org value */ ++ rtw_pm_set_ips(padapter, IPS_NONE); ++ ++ pch = extra; ++ DBG_88E("%s: in =%s\n", __func__, extra); ++ ++ i = 0; ++ while ((token = strsep(&pch, ",")) != NULL) { ++ if (i > 2) ++ break; ++ tmp[i] = token; ++ i++; ++ } ++ ++ /* tmp[0],[1],[2] */ ++ /* wmap, addr, 00e04c871200 */ ++ if (strcmp(tmp[0], "wmap") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ addr &= 0xFFF; ++ ++ cnts = strlen(tmp[2]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: map data =%s\n", __func__, tmp[2]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); ++ /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_write error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "wraw") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ addr &= 0xFFF; ++ ++ cnts = strlen(tmp[2]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: raw data =%s\n", __func__, tmp[2]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ setrawdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); ++ ++ if (rtw_efuse_access(padapter, true, addr, cnts, setrawdata) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_access error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "mac") == 0) { ++ if (!tmp[1]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ /* mac, 00e04c871200 */ ++ addr = EEPROM_MAC_ADDR_88EU; ++ cnts = strlen(tmp[1]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ if (cnts > 6) { ++ DBG_88E("%s: error data for mac addr =\"%s\"\n", __func__, tmp[1]); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: MAC address =%s\n", __func__, tmp[1]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]); ++ /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_write error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "vidpid") == 0) { ++ if (!tmp[1]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ /* pidvid, da0b7881 */ ++ addr = EEPROM_VID_88EE; ++ cnts = strlen(tmp[1]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: VID/PID =%s\n", __func__, tmp[1]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_write error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "btwmap") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ addr &= 0xFFF; ++ ++ cnts = strlen(tmp[2]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: BT data =%s\n", __func__, tmp[2]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if ((addr + cnts) > max_available_size) { ++ DBG_88E("%s: addr(0x%X)+cnts(%d) parameter error!\n", __func__, addr, cnts); ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_BT_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL) { ++ DBG_88E("%s: rtw_BT_efuse_map_write error!!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "btwfake") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ addr &= 0xFFF; ++ ++ cnts = strlen(tmp[2]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: BT tmp data =%s\n", __func__, tmp[2]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ pEfuseHal->fakeBTEfuseModifiedMap[addr + jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); ++ } else if (strcmp(tmp[0], "btdumpfake") == 0) { ++ if (rtw_BT_efuse_map_read(padapter, 0, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _SUCCESS) { ++ DBG_88E("%s: BT read all map success\n", __func__); ++ } else { ++ DBG_88E("%s: BT read all map Fail!\n", __func__); ++ err = -EFAULT; ++ } ++ } else if (strcmp(tmp[0], "wldumpfake") == 0) { ++ if (rtw_efuse_map_read(padapter, 0, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) { ++ DBG_88E("%s: BT read all map success\n", __func__); ++ } else { ++ DBG_88E("%s: BT read all map Fail\n", __func__); ++ err = -EFAULT; ++ } ++ } else if (strcmp(tmp[0], "btfk2map") == 0) { ++ memcpy(pEfuseHal->BTEfuseModifiedMap, pEfuseHal->fakeBTEfuseModifiedMap, EFUSE_BT_MAX_MAP_LEN); ++ ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if (max_available_size < 1) { ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_BT_efuse_map_write(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _FAIL) { ++ DBG_88E("%s: rtw_BT_efuse_map_write error!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "wlfk2map") == 0) { ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if (max_available_size < 1) { ++ err = -EFAULT; ++ goto exit; ++ } ++ ++ if (rtw_efuse_map_write(padapter, 0x00, EFUSE_MAX_MAP_LEN, pEfuseHal->fakeEfuseModifiedMap) == _FAIL) { ++ DBG_88E("%s: rtw_efuse_map_write error!\n", __func__); ++ err = -EFAULT; ++ goto exit; ++ } ++ } else if (strcmp(tmp[0], "wlwfake") == 0) { ++ if (!tmp[1] || !tmp[2]) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ addr = simple_strtoul(tmp[1], &ptmp, 16); ++ addr &= 0xFFF; ++ ++ cnts = strlen(tmp[2]); ++ if (cnts % 2) { ++ err = -EINVAL; ++ goto exit; ++ } ++ cnts /= 2; ++ if (cnts == 0) { ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ DBG_88E("%s: addr = 0x%X\n", __func__, addr); ++ DBG_88E("%s: cnts =%d\n", __func__, cnts); ++ DBG_88E("%s: map tmp data =%s\n", __func__, tmp[2]); ++ ++ for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) ++ pEfuseHal->fakeEfuseModifiedMap[addr + jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); ++ } ++ ++exit: ++ kfree(setdata); ++ kfree(ShadowMapBT); ++ kfree(ShadowMapWiFi); ++ kfree(setrawdata); ++ ++ rtw_pm_set_ips(padapter, ips_mode); ++ rtw_pm_set_lps(padapter, lps_mode); ++ ++ return err; ++} ++ ++/* ++ * Input Format: %s,%d,%d ++ * %s is width, could be ++ * "b" for 1 byte ++ * "w" for WORD (2 bytes) ++ * "dw" for DWORD (4 bytes) ++ * 1st %d is address(offset) ++ * 2st %d is data to write ++ */ ++static int rtw_mp_write_reg(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ char *pch, *pnext, *ptmp; ++ char *width_str; ++ char width; ++ u32 addr, data; ++ int ret; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ pch = extra; ++ pnext = strpbrk(pch, ",.-"); ++ if (!pnext) ++ return -EINVAL; ++ *pnext = 0; ++ width_str = pch; ++ ++ pch = pnext + 1; ++ pnext = strpbrk(pch, ",.-"); ++ if (!pnext) ++ return -EINVAL; ++ *pnext = 0; ++ addr = simple_strtoul(pch, &ptmp, 16); ++ if (addr > 0x3FFF) ++ return -EINVAL; ++ ++ pch = pnext + 1; ++ if ((pch - extra) >= wrqu->length) ++ return -EINVAL; ++ data = simple_strtoul(pch, &ptmp, 16); ++ ++ ret = 0; ++ width = width_str[0]; ++ switch (width) { ++ case 'b': ++ /* 1 byte */ ++ if (data > 0xFF) { ++ ret = -EINVAL; ++ break; ++ } ++ rtw_write8(padapter, addr, data); ++ break; ++ case 'w': ++ /* 2 bytes */ ++ if (data > 0xFFFF) { ++ ret = -EINVAL; ++ break; ++ } ++ rtw_write16(padapter, addr, data); ++ break; ++ case 'd': ++ /* 4 bytes */ ++ rtw_write32(padapter, addr, data); ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Input Format: %s,%d ++ * %s is width, could be ++ * "b" for 1 byte ++ * "w" for WORD (2 bytes) ++ * "dw" for DWORD (4 bytes) ++ * %d is address(offset) ++ * ++ * Return: ++ * %d for data readed ++ */ ++static int rtw_mp_read_reg(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ char *pch, *pnext, *ptmp; ++ char *width_str; ++ char width; ++ char data[20], tmp[20]; ++ u32 addr; ++ u32 ret, i = 0, j = 0, strtout = 0; ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ memset(data, 0, 20); ++ memset(tmp, 0, 20); ++ memset(extra, 0, wrqu->length); ++ ++ pch = input; ++ pnext = strpbrk(pch, ",.-"); ++ if (!pnext) { ++ kfree(input); ++ return -EINVAL; ++ } ++ *pnext = 0; ++ width_str = pch; ++ ++ pch = pnext + 1; ++ if ((pch - input) >= wrqu->length) { ++ kfree(input); ++ return -EINVAL; ++ } ++ kfree(input); ++ addr = simple_strtoul(pch, &ptmp, 16); ++ if (addr > 0x3FFF) ++ return -EINVAL; ++ ++ ret = 0; ++ width = width_str[0]; ++ switch (width) { ++ case 'b': ++ /* 1 byte */ ++ sprintf(extra, "%d\n", rtw_read8(padapter, addr)); ++ wrqu->length = strlen(extra); ++ break; ++ case 'w': ++ /* 2 bytes */ ++ sprintf(data, "%04x\n", rtw_read16(padapter, addr)); ++ for (i = 0; i <= strlen(data); i++) { ++ if (i % 2 == 0) { ++ tmp[j] = ' '; ++ j++; ++ } ++ if (data[i] != '\0') ++ tmp[j] = data[i]; ++ j++; ++ } ++ pch = tmp; ++ DBG_88E("pch =%s", pch); ++ ++ while (*pch != '\0') { ++ pnext = strpbrk(pch, " "); ++ if (!pnext) ++ break; ++ ++ pnext++; ++ if (*pnext != '\0') { ++ strtout = simple_strtoul(pnext, &ptmp, 16); ++ sprintf(extra + strlen(extra), " %d", strtout); ++ } else { ++ break; ++ } ++ pch = pnext; ++ } ++ wrqu->length = 6; ++ break; ++ case 'd': ++ /* 4 bytes */ ++ sprintf(data, "%08x", rtw_read32(padapter, addr)); ++ /* add read data format blank */ ++ for (i = 0; i <= strlen(data); i++) { ++ if (i % 2 == 0) { ++ tmp[j] = ' '; ++ j++; ++ } ++ if (data[i] != '\0') ++ tmp[j] = data[i]; ++ ++ j++; ++ } ++ pch = tmp; ++ DBG_88E("pch =%s", pch); ++ ++ while (*pch != '\0') { ++ pnext = strpbrk(pch, " "); ++ if (!pnext) ++ break; ++ pnext++; ++ if (*pnext != '\0') { ++ strtout = simple_strtoul(pnext, &ptmp, 16); ++ sprintf(extra + strlen(extra), " %d", strtout); ++ } else { ++ break; ++ } ++ pch = pnext; ++ } ++ wrqu->length = strlen(extra); ++ break; ++ default: ++ wrqu->length = 0; ++ ret = -EINVAL; ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Input Format: %d,%x,%x ++ * %d is RF path, should be smaller than RF_PATH_MAX ++ * 1st %x is address(offset) ++ * 2st %x is data to write ++ */ ++ static int rtw_mp_write_rf(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 path, addr, data; ++ int ret; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ ret = sscanf(extra, "%d,%x,%x", &path, &addr, &data); ++ if (ret < 3) ++ return -EINVAL; ++ ++ if (path >= RF_PATH_MAX) ++ return -EINVAL; ++ if (addr > 0xFF) ++ return -EINVAL; ++ if (data > 0xFFFFF) ++ return -EINVAL; ++ ++ memset(extra, 0, wrqu->length); ++ ++ write_rfreg(padapter, path, addr, data); ++ ++ sprintf(extra, "write_rf completed\n"); ++ wrqu->length = strlen(extra); ++ ++ return 0; ++} ++ ++/* ++ * Input Format: %d,%x ++ * %d is RF path, should be smaller than RF_PATH_MAX ++ * %x is address(offset) ++ * ++ * Return: ++ * %d for data readed ++ */ ++static int rtw_mp_read_rf(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ char *pch, *pnext, *ptmp; ++ char data[20], tmp[20]; ++ u32 path, addr; ++ u32 ret, i = 0, j = 0, strtou = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ ret = sscanf(input, "%d,%x", &path, &addr); ++ kfree(input); ++ if (ret < 2) ++ return -EINVAL; ++ ++ if (path >= RF_PATH_MAX) ++ return -EINVAL; ++ if (addr > 0xFF) ++ return -EINVAL; ++ ++ memset(extra, 0, wrqu->length); ++ ++ sprintf(data, "%08x", read_rfreg(padapter, path, addr)); ++ /* add read data format blank */ ++ for (i = 0; i <= strlen(data); i++) { ++ if (i % 2 == 0) { ++ tmp[j] = ' '; ++ j++; ++ } ++ tmp[j] = data[i]; ++ j++; ++ } ++ pch = tmp; ++ DBG_88E("pch =%s", pch); ++ ++ while (*pch != '\0') { ++ pnext = strpbrk(pch, " "); ++ pnext++; ++ if (*pnext != '\0') { ++ strtou = simple_strtoul(pnext, &ptmp, 16); ++ sprintf(extra + strlen(extra), " %d", strtou); ++ } else { ++ break; ++ } ++ pch = pnext; ++ } ++ wrqu->length = strlen(extra); ++ return 0; ++} ++ ++static int rtw_mp_start(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (padapter->registrypriv.mp_mode == 0) { ++ padapter->registrypriv.mp_mode = 1; ++ ++ rtw_pm_set_ips(padapter, IPS_NONE); ++ LeaveAllPowerSaveMode(padapter); ++ ++ MPT_InitializeAdapter(padapter, 1); ++ } ++ if (padapter->registrypriv.mp_mode == 0) ++ return -EPERM; ++ if (padapter->mppriv.mode == MP_OFF) { ++ if (mp_start_test(padapter) == _FAIL) ++ return -EPERM; ++ padapter->mppriv.mode = MP_ON; ++ } ++ return 0; ++} ++ ++static int rtw_mp_stop(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (padapter->registrypriv.mp_mode == 1) { ++ MPT_DeInitAdapter(padapter); ++ padapter->registrypriv.mp_mode = 0; ++ } ++ ++ if (padapter->mppriv.mode != MP_OFF) { ++ mp_stop_test(padapter); ++ padapter->mppriv.mode = MP_OFF; ++ } ++ ++ return 0; ++} ++ ++extern int wifirate2_ratetbl_inx(unsigned char rate); ++ ++static int rtw_mp_rate(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 rate = MPT_RATE_1M; ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ rate = rtw_atoi(input); ++ sprintf(extra, "Set data rate to %d", rate); ++ kfree(input); ++ if (rate <= 0x7f) ++ rate = wifirate2_ratetbl_inx((u8)rate); ++ else ++ rate = (rate - 0x80 + MPT_RATE_MCS0); ++ ++ if (rate >= MPT_RATE_LAST) ++ return -EINVAL; ++ ++ padapter->mppriv.rateidx = rate; ++ Hal_SetDataRate(padapter); ++ ++ wrqu->length = strlen(extra) + 1; ++ return 0; ++} ++ ++static int rtw_mp_channel(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ u32 channel = 1; ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ channel = rtw_atoi(input); ++ sprintf(extra, "Change channel %d to channel %d", padapter->mppriv.channel, channel); ++ ++ padapter->mppriv.channel = channel; ++ Hal_SetChannel(padapter); ++ ++ wrqu->length = strlen(extra) + 1; ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_bandwidth(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 bandwidth = 0, sg = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ sscanf(extra, "40M =%d, shortGI =%d", &bandwidth, &sg); ++ ++ if (bandwidth != HT_CHANNEL_WIDTH_40) ++ bandwidth = HT_CHANNEL_WIDTH_20; ++ ++ padapter->mppriv.bandwidth = (u8)bandwidth; ++ padapter->mppriv.preamble = sg; ++ ++ SetBandwidth(padapter); ++ ++ return 0; ++} ++ ++static int rtw_mp_txpower(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 idx_a = 0, idx_b = 0; ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ sscanf(input, "patha =%d, pathb =%d", &idx_a, &idx_b); ++ ++ sprintf(extra, "Set power level path_A:%d path_B:%d", idx_a, idx_b); ++ padapter->mppriv.txpoweridx = (u8)idx_a; ++ padapter->mppriv.txpoweridx_b = (u8)idx_b; ++ padapter->mppriv.bSetTxPower = 1; ++ Hal_SetAntennaPathPower(padapter); ++ ++ wrqu->length = strlen(extra) + 1; ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_ant_tx(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u8 i; ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ u16 antenna = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ ++ sprintf(extra, "switch Tx antenna to %s", input); ++ ++ for (i = 0; i < strlen(input); i++) { ++ switch (input[i]) { ++ case 'a': ++ antenna |= ANTENNA_A; ++ break; ++ case 'b': ++ antenna |= ANTENNA_B; ++ break; ++ } ++ } ++ padapter->mppriv.antenna_tx = antenna; ++ ++ Hal_SetAntenna(padapter); ++ ++ wrqu->length = strlen(extra) + 1; ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_ant_rx(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u8 i; ++ u16 antenna = 0; ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ memset(extra, 0, wrqu->length); ++ ++ sprintf(extra, "switch Rx antenna to %s", input); ++ ++ for (i = 0; i < strlen(input); i++) { ++ switch (input[i]) { ++ case 'a': ++ antenna |= ANTENNA_A; ++ break; ++ case 'b': ++ antenna |= ANTENNA_B; ++ break; ++ } ++ } ++ ++ padapter->mppriv.antenna_rx = antenna; ++ Hal_SetAntenna(padapter); ++ wrqu->length = strlen(extra); ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_ctx(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 pkTx = 1, countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1; ++ u32 bStartTest = 1; ++ u32 count = 0; ++ struct mp_priv *pmp_priv; ++ struct pkt_attrib *pattrib; ++ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ pmp_priv = &padapter->mppriv; ++ ++ if (copy_from_user(extra, wrqu->pointer, wrqu->length)) ++ return -EFAULT; ++ ++ DBG_88E("%s: in =%s\n", __func__, extra); ++ ++ countPkTx = strncmp(extra, "count =", 5); /* strncmp true is 0 */ ++ cotuTx = strncmp(extra, "background", 20); ++ CarrSprTx = strncmp(extra, "background, cs", 20); ++ scTx = strncmp(extra, "background, sc", 20); ++ sgleTx = strncmp(extra, "background, stone", 20); ++ pkTx = strncmp(extra, "background, pkt", 20); ++ stop = strncmp(extra, "stop", 4); ++ sscanf(extra, "count =%d, pkt", &count); ++ ++ memset(extra, '\0', sizeof(*extra)); ++ ++ if (stop == 0) { ++ bStartTest = 0; /* To set Stop */ ++ pmp_priv->tx.stop = 1; ++ sprintf(extra, "Stop continuous Tx"); ++ } else { ++ bStartTest = 1; ++ if (pmp_priv->mode != MP_ON) { ++ if (pmp_priv->tx.stop != 1) { ++ DBG_88E("%s: MP_MODE != ON %d\n", __func__, pmp_priv->mode); ++ return -EFAULT; ++ } ++ } ++ } ++ ++ if (pkTx == 0 || countPkTx == 0) ++ pmp_priv->mode = MP_PACKET_TX; ++ if (sgleTx == 0) ++ pmp_priv->mode = MP_SINGLE_TONE_TX; ++ if (cotuTx == 0) ++ pmp_priv->mode = MP_CONTINUOUS_TX; ++ if (CarrSprTx == 0) ++ pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX; ++ if (scTx == 0) ++ pmp_priv->mode = MP_SINGLE_CARRIER_TX; ++ ++ switch (pmp_priv->mode) { ++ case MP_PACKET_TX: ++ if (bStartTest == 0) { ++ pmp_priv->tx.stop = 1; ++ pmp_priv->mode = MP_ON; ++ sprintf(extra, "Stop continuous Tx"); ++ } else if (pmp_priv->tx.stop == 1) { ++ sprintf(extra, "Start continuous DA = ffffffffffff len = 1500 count =%u,\n", count); ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = count; ++ pmp_priv->tx.payload = 2; ++ pattrib = &pmp_priv->tx.attrib; ++ pattrib->pktlen = 1500; ++ memset(pattrib->dst, 0xFF, ETH_ALEN); ++ SetPacketTx(padapter); ++ } else { ++ return -EFAULT; ++ } ++ wrqu->length = strlen(extra); ++ return 0; ++ case MP_SINGLE_TONE_TX: ++ if (bStartTest != 0) ++ sprintf(extra, "Start continuous DA = ffffffffffff len = 1500\n infinite = yes."); ++ Hal_SetSingleToneTx(padapter, (u8)bStartTest); ++ break; ++ case MP_CONTINUOUS_TX: ++ if (bStartTest != 0) ++ sprintf(extra, "Start continuous DA = ffffffffffff len = 1500\n infinite = yes."); ++ Hal_SetContinuousTx(padapter, (u8)bStartTest); ++ break; ++ case MP_CARRIER_SUPPRISSION_TX: ++ if (bStartTest != 0) { ++ if (pmp_priv->rateidx <= MPT_RATE_11M) { ++ sprintf(extra, "Start continuous DA = ffffffffffff len = 1500\n infinite = yes."); ++ Hal_SetCarrierSuppressionTx(padapter, (u8)bStartTest); ++ } else { ++ sprintf(extra, "Specify carrier suppression but not CCK rate"); ++ } ++ } ++ break; ++ case MP_SINGLE_CARRIER_TX: ++ if (bStartTest != 0) ++ sprintf(extra, "Start continuous DA = ffffffffffff len = 1500\n infinite = yes."); ++ Hal_SetSingleCarrierTx(padapter, (u8)bStartTest); ++ break; ++ default: ++ sprintf(extra, "Error! Continuous-Tx is not on-going."); ++ return -EFAULT; ++ } ++ ++ if (bStartTest == 1 && pmp_priv->mode != MP_ON) { ++ struct mp_priv *pmp_priv = &padapter->mppriv; ++ if (pmp_priv->tx.stop == 0) { ++ pmp_priv->tx.stop = 1; ++ msleep(5); ++ } ++ pmp_priv->tx.stop = 0; ++ pmp_priv->tx.count = 1; ++ SetPacketTx(padapter); ++ } else { ++ pmp_priv->mode = MP_ON; ++ } ++ ++ wrqu->length = strlen(extra); ++ return 0; ++} ++ ++static int rtw_mp_arx(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u8 bStartRx = 0, bStopRx = 0, bQueryPhy; ++ u32 cckok = 0, cckcrc = 0, ofdmok = 0, ofdmcrc = 0, htok = 0, htcrc = 0, OFDM_FA = 0, CCK_FA = 0; ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!input) ++ return -ENOMEM; ++ ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ DBG_88E("%s: %s\n", __func__, input); ++ ++ bStartRx = (strncmp(input, "start", 5) == 0) ? 1 : 0; /* strncmp true is 0 */ ++ bStopRx = (strncmp(input, "stop", 5) == 0) ? 1 : 0; /* strncmp true is 0 */ ++ bQueryPhy = (strncmp(input, "phy", 3) == 0) ? 1 : 0; /* strncmp true is 0 */ ++ ++ if (bStartRx) { ++ sprintf(extra, "start"); ++ SetPacketRx(padapter, bStartRx); ++ } else if (bStopRx) { ++ SetPacketRx(padapter, 0); ++ sprintf(extra, "Received packet OK:%d CRC error:%d", padapter->mppriv.rx_pktcount, padapter->mppriv.rx_crcerrpktcount); ++ } else if (bQueryPhy) { ++ /* ++ OFDM FA ++ RegCF0[15:0] ++ RegCF2[31:16] ++ RegDA0[31:16] ++ RegDA4[15:0] ++ RegDA4[31:16] ++ RegDA8[15:0] ++ CCK FA ++ (RegA5B<<8) | RegA5C ++ */ ++ cckok = read_bbreg(padapter, 0xf88, 0xffffffff); ++ cckcrc = read_bbreg(padapter, 0xf84, 0xffffffff); ++ ofdmok = read_bbreg(padapter, 0xf94, 0x0000FFFF); ++ ofdmcrc = read_bbreg(padapter, 0xf94, 0xFFFF0000); ++ htok = read_bbreg(padapter, 0xf90, 0x0000FFFF); ++ htcrc = read_bbreg(padapter, 0xf90, 0xFFFF0000); ++ ++ OFDM_FA = read_bbreg(padapter, 0xcf0, 0x0000FFFF); ++ OFDM_FA = read_bbreg(padapter, 0xcf2, 0xFFFF0000); ++ OFDM_FA = read_bbreg(padapter, 0xda0, 0xFFFF0000); ++ OFDM_FA = read_bbreg(padapter, 0xda4, 0x0000FFFF); ++ OFDM_FA = read_bbreg(padapter, 0xda4, 0xFFFF0000); ++ OFDM_FA = read_bbreg(padapter, 0xda8, 0x0000FFFF); ++ CCK_FA = (rtw_read8(padapter, 0xa5b) << 8) | (rtw_read8(padapter, 0xa5c)); ++ ++ sprintf(extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d", cckok + ofdmok + htok, cckcrc + ofdmcrc + htcrc, OFDM_FA + CCK_FA); ++ } ++ wrqu->length = strlen(extra) + 1; ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_trx_query(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 txok, txfail, rxok, rxfail; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ txok = padapter->mppriv.tx.sended; ++ txfail = 0; ++ rxok = padapter->mppriv.rx_pktcount; ++ rxfail = padapter->mppriv.rx_crcerrpktcount; ++ ++ memset(extra, '\0', 128); ++ ++ sprintf(extra, "Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ", txok, txfail, rxok, rxfail); ++ ++ wrqu->length = strlen(extra) + 1; ++ ++ return 0; ++} ++ ++static int rtw_mp_pwrtrk(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u8 enable; ++ u32 thermal; ++ s32 ret; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ memset(extra, 0, wrqu->length); ++ ++ enable = 1; ++ if (wrqu->length > 1) {/* not empty string */ ++ if (strncmp(input, "stop", 4) == 0) { ++ enable = 0; ++ sprintf(extra, "mp tx power tracking stop"); ++ } else if (sscanf(input, "ther =%d", &thermal)) { ++ ret = Hal_SetThermalMeter(padapter, (u8)thermal); ++ if (ret == _FAIL) ++ return -EPERM; ++ sprintf(extra, "mp tx power tracking start, target value =%d ok ", thermal); ++ } else { ++ kfree(input); ++ return -EINVAL; ++ } ++ } ++ ++ kfree(input); ++ ret = Hal_SetPowerTracking(padapter, enable); ++ if (ret == _FAIL) ++ return -EPERM; ++ ++ wrqu->length = strlen(extra); ++ return 0; ++} ++ ++static int rtw_mp_psd(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ ++ strcpy(extra, input); ++ ++ wrqu->length = mp_query_psd(padapter, extra); ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_thermal(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u8 val; ++ u16 bwrite = 1; ++ u16 addr = EEPROM_THERMAL_METER_88E; ++ ++ u16 cnt = 1; ++ u16 max_available_size = 0; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (copy_from_user(extra, wrqu->pointer, wrqu->length)) ++ return -EFAULT; ++ ++ bwrite = strncmp(extra, "write", 6); /* strncmp true is 0 */ ++ ++ Hal_GetThermalMeter(padapter, &val); ++ ++ if (bwrite == 0) { ++ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false); ++ if (2 > max_available_size) { ++ DBG_88E("no available efuse!\n"); ++ return -EFAULT; ++ } ++ if (rtw_efuse_map_write(padapter, addr, cnt, &val) == _FAIL) { ++ DBG_88E("rtw_efuse_map_write error\n"); ++ return -EFAULT; ++ } else { ++ sprintf(extra, " efuse write ok :%d", val); ++ } ++ } else { ++ sprintf(extra, "%d", val); ++ } ++ wrqu->length = strlen(extra); ++ ++ return 0; ++} ++ ++static int rtw_mp_reset_stats(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ struct mp_priv *pmp_priv; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ pmp_priv = &padapter->mppriv; ++ ++ pmp_priv->tx.sended = 0; ++ pmp_priv->tx_pktcount = 0; ++ pmp_priv->rx_pktcount = 0; ++ pmp_priv->rx_crcerrpktcount = 0; ++ ++ /* reset phy counter */ ++ write_bbreg(padapter, 0xf14, BIT(16), 0x1); ++ msleep(10); ++ write_bbreg(padapter, 0xf14, BIT(16), 0x0); ++ ++ return 0; ++} ++ ++static int rtw_mp_dump(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ u32 value; ++ u8 rf_type, path_nums = 0; ++ u32 i, j = 1, path; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (strncmp(extra, "all", 4) == 0) { ++ DBG_88E("\n ======= MAC REG =======\n"); ++ for (i = 0x0; i < 0x300; i += 4) { ++ if (j % 4 == 1) ++ DBG_88E("0x%02x", i); ++ DBG_88E(" 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ DBG_88E("\n"); ++ } ++ for (i = 0x400; i < 0x1000; i += 4) { ++ if (j % 4 == 1) ++ DBG_88E("0x%02x", i); ++ DBG_88E(" 0x%08x ", rtw_read32(padapter, i)); ++ if ((j++) % 4 == 0) ++ DBG_88E("\n"); ++ } ++ ++ j = 1; ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ ++ DBG_88E("\n ======= RF REG =======\n"); ++ if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) ++ path_nums = 1; ++ else ++ path_nums = 2; ++ ++ for (path = 0; path < path_nums; path++) { ++ for (i = 0; i < 0x34; i++) { ++ value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); ++ if (j % 4 == 1) ++ DBG_88E("0x%02x ", i); ++ DBG_88E(" 0x%08x ", value); ++ if ((j++) % 4 == 0) ++ DBG_88E("\n"); ++ } ++ } ++ } ++ return 0; ++} ++ ++static int rtw_mp_phypara(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *wrqu, char *extra) ++{ ++ char *input = kmalloc(wrqu->length, GFP_KERNEL); ++ u32 valxcap; ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->pointer, wrqu->length)) { ++ kfree(input); ++ return -EFAULT; ++ } ++ ++ DBG_88E("%s:iwpriv in =%s\n", __func__, input); ++ ++ sscanf(input, "xcap =%d", &valxcap); ++ ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_SetRFPath(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->data.length, GFP_KERNEL); ++ u8 bMain = 1, bTurnoff = 1; ++ ++ if (!input) ++ return -ENOMEM; ++ if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) ++ return -EFAULT; ++ DBG_88E("%s:iwpriv in =%s\n", __func__, input); ++ ++ bMain = strncmp(input, "1", 2); /* strncmp true is 0 */ ++ bTurnoff = strncmp(input, "0", 3); /* strncmp true is 0 */ ++ ++ if (bMain == 0) { ++ MP_PHY_SetRFPathSwitch(padapter, true); ++ DBG_88E("%s:PHY_SetRFPathSwitch = true\n", __func__); ++ } else if (bTurnoff == 0) { ++ MP_PHY_SetRFPathSwitch(padapter, false); ++ DBG_88E("%s:PHY_SetRFPathSwitch = false\n", __func__); ++ } ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_QueryDrv(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ char *input = kmalloc(wrqu->data.length, GFP_KERNEL); ++ u8 qAutoLoad = 1; ++ struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); ++ ++ if (!input) ++ return -ENOMEM; ++ ++ if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) ++ return -EFAULT; ++ DBG_88E("%s:iwpriv in =%s\n", __func__, input); ++ ++ qAutoLoad = strncmp(input, "autoload", 8); /* strncmp true is 0 */ ++ ++ if (qAutoLoad == 0) { ++ DBG_88E("%s:qAutoLoad\n", __func__); ++ ++ if (pEEPROM->bautoload_fail_flag) ++ sprintf(extra, "fail"); ++ else ++ sprintf(extra, "ok"); ++ } ++ wrqu->data.length = strlen(extra) + 1; ++ kfree(input); ++ return 0; ++} ++ ++static int rtw_mp_set(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wdata, char *extra) ++{ ++ struct iw_point *wrqu = (struct iw_point *)wdata; ++ u32 subcmd = wrqu->flags; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!padapter) ++ return -ENETDOWN; ++ ++ if (!extra) { ++ wrqu->length = 0; ++ return -EIO; ++ } ++ ++ switch (subcmd) { ++ case MP_START: ++ DBG_88E("set case mp_start\n"); ++ rtw_mp_start(dev, info, wrqu, extra); ++ break; ++ case MP_STOP: ++ DBG_88E("set case mp_stop\n"); ++ rtw_mp_stop(dev, info, wrqu, extra); ++ break; ++ case MP_BANDWIDTH: ++ DBG_88E("set case mp_bandwidth\n"); ++ rtw_mp_bandwidth(dev, info, wrqu, extra); ++ break; ++ case MP_RESET_STATS: ++ DBG_88E("set case MP_RESET_STATS\n"); ++ rtw_mp_reset_stats(dev, info, wrqu, extra); ++ break; ++ case MP_SetRFPathSwh: ++ DBG_88E("set MP_SetRFPathSwitch\n"); ++ rtw_mp_SetRFPath(dev, info, wdata, extra); ++ break; ++ case CTA_TEST: ++ DBG_88E("set CTA_TEST\n"); ++ rtw_cta_test_start(dev, info, wdata, extra); ++ break; ++ } ++ ++ return 0; ++} ++ ++static int rtw_mp_get(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wdata, char *extra) ++{ ++ struct iw_point *wrqu = (struct iw_point *)wdata; ++ u32 subcmd = wrqu->flags; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ ++ if (!padapter) ++ return -ENETDOWN; ++ if (!extra) { ++ wrqu->length = 0; ++ return -EIO; ++ } ++ ++ switch (subcmd) { ++ case WRITE_REG: ++ rtw_mp_write_reg(dev, info, wrqu, extra); ++ break; ++ case WRITE_RF: ++ rtw_mp_write_rf(dev, info, wrqu, extra); ++ break; ++ case MP_PHYPARA: ++ DBG_88E("mp_get MP_PHYPARA\n"); ++ rtw_mp_phypara(dev, info, wrqu, extra); ++ break; ++ case MP_CHANNEL: ++ DBG_88E("set case mp_channel\n"); ++ rtw_mp_channel(dev, info, wrqu, extra); ++ break; ++ case READ_REG: ++ DBG_88E("mp_get READ_REG\n"); ++ rtw_mp_read_reg(dev, info, wrqu, extra); ++ break; ++ case READ_RF: ++ DBG_88E("mp_get READ_RF\n"); ++ rtw_mp_read_rf(dev, info, wrqu, extra); ++ break; ++ case MP_RATE: ++ DBG_88E("set case mp_rate\n"); ++ rtw_mp_rate(dev, info, wrqu, extra); ++ break; ++ case MP_TXPOWER: ++ DBG_88E("set case MP_TXPOWER\n"); ++ rtw_mp_txpower(dev, info, wrqu, extra); ++ break; ++ case MP_ANT_TX: ++ DBG_88E("set case MP_ANT_TX\n"); ++ rtw_mp_ant_tx(dev, info, wrqu, extra); ++ break; ++ case MP_ANT_RX: ++ DBG_88E("set case MP_ANT_RX\n"); ++ rtw_mp_ant_rx(dev, info, wrqu, extra); ++ break; ++ case MP_QUERY: ++ rtw_mp_trx_query(dev, info, wrqu, extra); ++ break; ++ case MP_CTX: ++ DBG_88E("set case MP_CTX\n"); ++ rtw_mp_ctx(dev, info, wrqu, extra); ++ break; ++ case MP_ARX: ++ DBG_88E("set case MP_ARX\n"); ++ rtw_mp_arx(dev, info, wrqu, extra); ++ break; ++ case EFUSE_GET: ++ DBG_88E("efuse get EFUSE_GET\n"); ++ rtw_mp_efuse_get(dev, info, wdata, extra); ++ break; ++ case MP_DUMP: ++ DBG_88E("set case MP_DUMP\n"); ++ rtw_mp_dump(dev, info, wrqu, extra); ++ break; ++ case MP_PSD: ++ DBG_88E("set case MP_PSD\n"); ++ rtw_mp_psd(dev, info, wrqu, extra); ++ break; ++ case MP_THER: ++ DBG_88E("set case MP_THER\n"); ++ rtw_mp_thermal(dev, info, wrqu, extra); ++ break; ++ case MP_QueryDrvStats: ++ DBG_88E("mp_get MP_QueryDrvStats\n"); ++ rtw_mp_QueryDrv(dev, info, wdata, extra); ++ break; ++ case MP_PWRTRK: ++ DBG_88E("set case MP_PWRTRK\n"); ++ rtw_mp_pwrtrk(dev, info, wrqu, extra); ++ break; ++ case EFUSE_SET: ++ DBG_88E("set case efuse set\n"); ++ rtw_mp_efuse_set(dev, info, wdata, extra); ++ break; ++ } ++ ++ msleep(10); /* delay 5ms for sending pkt before exit adb shell operation */ ++ return 0; ++} ++ ++static int rtw_tdls(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ return 0; ++} ++ ++static int rtw_tdls_get(struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ return 0; ++} ++ ++static int rtw_test( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ u32 len; ++ u8 *pbuf, *pch; ++ char *ptmp; ++ u8 *delim = ","; ++ ++ DBG_88E("+%s\n", __func__); ++ len = wrqu->data.length; ++ ++ pbuf = kzalloc(len, GFP_KERNEL); ++ if (!pbuf) { ++ DBG_88E("%s: no memory!\n", __func__); ++ return -ENOMEM; ++ } ++ ++ if (copy_from_user(pbuf, wrqu->data.pointer, len)) { ++ kfree(pbuf); ++ DBG_88E("%s: copy from user fail!\n", __func__); ++ return -EFAULT; ++ } ++ DBG_88E("%s: string =\"%s\"\n", __func__, pbuf); ++ ++ ptmp = (char *)pbuf; ++ pch = strsep(&ptmp, delim); ++ if (!pch || strlen(pch) == 0) { ++ kfree(pbuf); ++ DBG_88E("%s: parameter error(level 1)!\n", __func__); ++ return -EFAULT; ++ } ++ kfree(pbuf); ++ return 0; ++} ++ ++static iw_handler rtw_handlers[] = { ++ IW_HANDLER(SIOCGIWNAME, rtw_wx_get_name), ++ IW_HANDLER(SIOCSIWNWID, dummy), ++ IW_HANDLER(SIOCGIWNWID, dummy), ++ IW_HANDLER(SIOCGIWFREQ, rtw_wx_get_freq), ++ IW_HANDLER(SIOCSIWMODE, rtw_wx_set_mode), ++ IW_HANDLER(SIOCGIWMODE, rtw_wx_get_mode), ++ IW_HANDLER(SIOCSIWSENS, dummy), ++ IW_HANDLER(SIOCGIWSENS, rtw_wx_get_sens), ++ IW_HANDLER(SIOCGIWRANGE, rtw_wx_get_range), ++ IW_HANDLER(SIOCSIWPRIV, rtw_wx_set_priv), ++ IW_HANDLER(SIOCSIWSPY, dummy), ++ IW_HANDLER(SIOCGIWSPY, dummy), ++ IW_HANDLER(SIOCSIWAP, rtw_wx_set_wap), ++ IW_HANDLER(SIOCGIWAP, rtw_wx_get_wap), ++ IW_HANDLER(SIOCSIWMLME, rtw_wx_set_mlme), ++ IW_HANDLER(SIOCGIWAPLIST, dummy), ++ IW_HANDLER(SIOCSIWSCAN, rtw_wx_set_scan), ++ IW_HANDLER(SIOCGIWSCAN, rtw_wx_get_scan), ++ IW_HANDLER(SIOCSIWESSID, rtw_wx_set_essid), ++ IW_HANDLER(SIOCGIWESSID, rtw_wx_get_essid), ++ IW_HANDLER(SIOCSIWNICKN, dummy), ++ IW_HANDLER(SIOCGIWNICKN, rtw_wx_get_nick), ++ IW_HANDLER(SIOCSIWRATE, rtw_wx_set_rate), ++ IW_HANDLER(SIOCGIWRATE, rtw_wx_get_rate), ++ IW_HANDLER(SIOCSIWRTS, rtw_wx_set_rts), ++ IW_HANDLER(SIOCGIWRTS, rtw_wx_get_rts), ++ IW_HANDLER(SIOCSIWFRAG, rtw_wx_set_frag), ++ IW_HANDLER(SIOCGIWFRAG, rtw_wx_get_frag), ++ IW_HANDLER(SIOCSIWTXPOW, dummy), ++ IW_HANDLER(SIOCGIWTXPOW, dummy), ++ IW_HANDLER(SIOCSIWRETRY, dummy), ++ IW_HANDLER(SIOCGIWRETRY, rtw_wx_get_retry), ++ IW_HANDLER(SIOCSIWENCODE, rtw_wx_set_enc), ++ IW_HANDLER(SIOCGIWENCODE, rtw_wx_get_enc), ++ IW_HANDLER(SIOCSIWPOWER, dummy), ++ IW_HANDLER(SIOCGIWPOWER, rtw_wx_get_power), ++ IW_HANDLER(SIOCSIWGENIE, rtw_wx_set_gen_ie), ++ IW_HANDLER(SIOCSIWAUTH, rtw_wx_set_auth), ++ IW_HANDLER(SIOCSIWENCODEEXT, rtw_wx_set_enc_ext), ++ IW_HANDLER(SIOCSIWPMKSA, rtw_wx_set_pmkid), ++}; ++ ++static const struct iw_priv_args rtw_private_args[] = { ++ { ++ SIOCIWFIRSTPRIV + 0x0, ++ IW_PRIV_TYPE_CHAR | 0x7FF, 0, "write" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x1, ++ IW_PRIV_TYPE_CHAR | 0x7FF, ++ IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "read" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x2, 0, 0, "driver_ext" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x3, 0, 0, "mp_ioctl" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x4, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "apinfo" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x5, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setpid" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x6, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_start" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x7, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "get_sensitivity" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x8, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_prob_req_ie" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x9, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_assoc_req_ie" ++ }, ++ ++ { ++ SIOCIWFIRSTPRIV + 0xA, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "channel_plan" ++ }, ++ ++ { ++ SIOCIWFIRSTPRIV + 0xB, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "dbg" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0xC, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "rfw" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0xD, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "rfr" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x10, ++ IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, 0, "p2p_set" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x11, ++ IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P2P_PRIVATE_IOCTL_SET_LEN, "p2p_get" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x12, ++ IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IFNAMSIZ, "p2p_get2" ++ }, ++ {SIOCIWFIRSTPRIV + 0x13, IW_PRIV_TYPE_CHAR | 128, 0, "NULL"}, ++ { ++ SIOCIWFIRSTPRIV + 0x14, ++ IW_PRIV_TYPE_CHAR | 64, 0, "tdls" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x15, ++ IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P2P_PRIVATE_IOCTL_SET_LEN, "tdls_get" ++ }, ++ { ++ SIOCIWFIRSTPRIV + 0x16, ++ IW_PRIV_TYPE_CHAR | 64, 0, "pm_set" ++ }, ++ ++ {SIOCIWFIRSTPRIV + 0x18, IW_PRIV_TYPE_CHAR | IFNAMSIZ, 0, "rereg_nd_name"}, ++ ++ {SIOCIWFIRSTPRIV + 0x1A, IW_PRIV_TYPE_CHAR | 1024, 0, "efuse_set"}, ++ {SIOCIWFIRSTPRIV + 0x1B, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get"}, ++ {SIOCIWFIRSTPRIV + 0x1D, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 0x7FF, "test" ++ }, ++ ++ {SIOCIWFIRSTPRIV + 0x0E, IW_PRIV_TYPE_CHAR | 1024, 0, ""}, /* set */ ++ {SIOCIWFIRSTPRIV + 0x0F, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, ""},/* get */ ++/* --- sub-ioctls definitions --- */ ++ ++ {MP_START, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_start"}, /* set */ ++ {MP_PHYPARA, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_phypara"},/* get */ ++ {MP_STOP, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_stop"}, /* set */ ++ {MP_CHANNEL, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_channel"},/* get */ ++ {MP_BANDWIDTH, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_bandwidth"}, /* set */ ++ {MP_RATE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate"},/* get */ ++ {MP_RESET_STATS, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_reset_stats"}, ++ {MP_QUERY, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_query"}, /* get */ ++ {READ_REG, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_reg"}, ++ {MP_RATE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate"}, ++ {READ_RF, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_rf"}, ++ {MP_PSD, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_psd"}, ++ {MP_DUMP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_dump"}, ++ {MP_TXPOWER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_txpower"}, ++ {MP_ANT_TX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_tx"}, ++ {MP_ANT_RX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_rx"}, ++ {WRITE_REG, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "write_reg"}, ++ {WRITE_RF, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "write_rf"}, ++ {MP_CTX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ctx"}, ++ {MP_ARX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_arx"}, ++ {MP_THER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ther"}, ++ {EFUSE_SET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_set"}, ++ {EFUSE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get"}, ++ {MP_PWRTRK, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_pwrtrk"}, ++ {MP_QueryDrvStats, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_drvquery"}, ++ {MP_IOCTL, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_ioctl"}, /* mp_ioctl */ ++ {MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_setrfpath"}, ++ {CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, "cta_test"}, ++}; ++ ++static iw_handler rtw_private_handler[] = { ++rtw_wx_write32, /* 0x00 */ ++rtw_wx_read32, /* 0x01 */ ++rtw_drvext_hdl, /* 0x02 */ ++rtw_mp_ioctl_hdl, /* 0x03 */ ++ ++/* for MM DTV platform */ ++ rtw_get_ap_info, /* 0x04 */ ++ ++ rtw_set_pid, /* 0x05 */ ++ rtw_wps_start, /* 0x06 */ ++ ++ rtw_wx_get_sensitivity, /* 0x07 */ ++ rtw_wx_set_mtk_wps_probe_ie, /* 0x08 */ ++ rtw_wx_set_mtk_wps_ie, /* 0x09 */ ++ ++/* Set Channel depend on the country code */ ++ rtw_wx_set_channel_plan, /* 0x0A */ ++ ++ rtw_dbg_port, /* 0x0B */ ++ rtw_wx_write_rf, /* 0x0C */ ++ rtw_wx_read_rf, /* 0x0D */ ++ ++ rtw_mp_set, /* 0x0E */ ++ rtw_mp_get, /* 0x0F */ ++ rtw_p2p_set, /* 0x10 */ ++ rtw_p2p_get, /* 0x11 */ ++ rtw_p2p_get2, /* 0x12 */ ++ ++ NULL, /* 0x13 */ ++ rtw_tdls, /* 0x14 */ ++ rtw_tdls_get, /* 0x15 */ ++ ++ rtw_pm_set, /* 0x16 */ ++ rtw_wx_priv_null, /* 0x17 */ ++ rtw_rereg_nd_name, /* 0x18 */ ++ rtw_wx_priv_null, /* 0x19 */ ++ ++ rtw_mp_efuse_set, /* 0x1A */ ++ rtw_mp_efuse_get, /* 0x1B */ ++ NULL, /* 0x1C is reserved for hostapd */ ++ rtw_test, /* 0x1D */ ++}; ++ ++static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); ++ struct iw_statistics *piwstats = &padapter->iwstats; ++ int tmp_noise = 0; ++ int tmp; ++ ++ if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { ++ piwstats->qual.qual = 0; ++ piwstats->qual.level = 0; ++ piwstats->qual.noise = 0; ++ } else { ++ tmp_noise = padapter->recvpriv.noise; ++ ++ piwstats->qual.level = padapter->signal_strength; ++ tmp = 219 + 3 * padapter->signal_strength; ++ tmp = min(100, tmp); ++ tmp = max(0, tmp); ++ piwstats->qual.qual = tmp; ++ piwstats->qual.noise = tmp_noise; ++ } ++ piwstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; ++ return &padapter->iwstats; ++} ++ ++struct iw_handler_def rtw_handlers_def = { ++ .standard = rtw_handlers, ++ .num_standard = sizeof(rtw_handlers) / sizeof(iw_handler), ++ .private = rtw_private_handler, ++ .private_args = (struct iw_priv_args *)rtw_private_args, ++ .num_private = sizeof(rtw_private_handler) / sizeof(iw_handler), ++ .num_private_args = sizeof(rtw_private_args) / sizeof(struct iw_priv_args), ++ .get_wireless_stats = rtw_get_wireless_stats, ++}; +diff --git a/drivers/staging/r8188eu/os_dep/mlme_linux.c b/drivers/staging/r8188eu/os_dep/mlme_linux.c +new file mode 100644 +index 000000000000..e3ee9dc7ab90 +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/mlme_linux.c +@@ -0,0 +1,216 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. i*/ ++ ++#define _MLME_OSDEP_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/mlme_osdep.h" ++ ++void rtw_join_timeout_handler (struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, mlmepriv.assoc_timer); ++ ++ _rtw_join_timeout_handler(adapter); ++} ++ ++void _rtw_scan_timeout_handler (struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, mlmepriv.scan_to_timer); ++ ++ rtw_scan_timeout_handler(adapter); ++} ++ ++static void _dynamic_check_timer_handlder(struct timer_list *t) ++{ ++ struct adapter *adapter = from_timer(adapter, t, mlmepriv.dynamic_chk_timer); ++ ++ if (adapter->registrypriv.mp_mode == 1) ++ return; ++ rtw_dynamic_check_timer_handlder(adapter); ++ _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); ++} ++ ++void rtw_init_mlme_timer(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ timer_setup(&pmlmepriv->assoc_timer, rtw_join_timeout_handler, 0); ++ timer_setup(&pmlmepriv->scan_to_timer, _rtw_scan_timeout_handler, 0); ++ timer_setup(&pmlmepriv->dynamic_chk_timer, _dynamic_check_timer_handlder, 0); ++} ++ ++void rtw_os_indicate_connect(struct adapter *adapter) ++{ ++ ++ rtw_indicate_wx_assoc_event(adapter); ++ netif_carrier_on(adapter->pnetdev); ++ if (adapter->pid[2] != 0) ++ rtw_signal_process(adapter->pid[2], SIGALRM); ++ ++} ++ ++void rtw_os_indicate_scan_done(struct adapter *padapter, bool aborted) ++{ ++ indicate_wx_scan_complete_event(padapter); ++} ++ ++static struct rt_pmkid_list backup_pmkid[NUM_PMKID_CACHE]; ++ ++void rtw_reset_securitypriv(struct adapter *adapter) ++{ ++ u8 backup_index = 0; ++ u8 backup_counter = 0x00; ++ u32 backup_time = 0; ++ ++ if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { ++ /* 802.1x */ ++ /* We have to backup the PMK information for WiFi PMK Caching test item. */ ++ /* Backup the btkip_countermeasure information. */ ++ /* When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. */ ++ memset(&backup_pmkid[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); ++ memcpy(&backup_pmkid[0], &adapter->securitypriv.PMKIDList[0], sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); ++ backup_index = adapter->securitypriv.PMKIDIndex; ++ backup_counter = adapter->securitypriv.btkip_countermeasure; ++ backup_time = adapter->securitypriv.btkip_countermeasure_time; ++ memset((unsigned char *)&adapter->securitypriv, 0, sizeof(struct security_priv)); ++ ++ /* Restore the PMK information to securitypriv structure for the following connection. */ ++ memcpy(&adapter->securitypriv.PMKIDList[0], ++ &backup_pmkid[0], ++ sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); ++ adapter->securitypriv.PMKIDIndex = backup_index; ++ adapter->securitypriv.btkip_countermeasure = backup_counter; ++ adapter->securitypriv.btkip_countermeasure_time = backup_time; ++ adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; ++ adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; ++ } else { ++ /* reset values in securitypriv */ ++ struct security_priv *psec_priv = &adapter->securitypriv; ++ ++ psec_priv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ ++ psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ psec_priv->dot11PrivacyKeyIndex = 0; ++ psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_; ++ psec_priv->dot118021XGrpKeyid = 1; ++ psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; ++ psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; ++ } ++} ++ ++void rtw_os_indicate_disconnect(struct adapter *adapter) ++{ ++ ++ netif_carrier_off(adapter->pnetdev); /* Do it first for tx broadcast pkt after disconnection issue! */ ++ rtw_indicate_wx_disassoc_event(adapter); ++ rtw_reset_securitypriv(adapter); ++} ++ ++void rtw_report_sec_ie(struct adapter *adapter, u8 authmode, u8 *sec_ie) ++{ ++ uint len; ++ u8 *buff, *p, i; ++ union iwreq_data wrqu; ++ ++ buff = NULL; ++ if (authmode == _WPA_IE_ID_) { ++ buff = kzalloc(IW_CUSTOM_MAX, GFP_KERNEL); ++ if (!buff) ++ return; ++ p = buff; ++ p += sprintf(p, "ASSOCINFO(ReqIEs ="); ++ len = sec_ie[1] + 2; ++ len = (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX; ++ for (i = 0; i < len; i++) ++ p += sprintf(p, "%02x", sec_ie[i]); ++ p += sprintf(p, ")"); ++ memset(&wrqu, 0, sizeof(wrqu)); ++ wrqu.data.length = p - buff; ++ wrqu.data.length = (wrqu.data.length < IW_CUSTOM_MAX) ? ++ wrqu.data.length : IW_CUSTOM_MAX; ++ wireless_send_event(adapter->pnetdev, IWEVCUSTOM, &wrqu, buff); ++ kfree(buff); ++ } ++} ++ ++static void _survey_timer_hdl(struct timer_list *t) ++{ ++ struct adapter *padapter = from_timer(padapter, t, mlmeextpriv.survey_timer); ++ ++ survey_timer_hdl(padapter); ++} ++ ++static void _link_timer_hdl(struct timer_list *t) ++{ ++ struct adapter *padapter = from_timer(padapter, t, mlmeextpriv.link_timer); ++ link_timer_hdl(padapter); ++} ++ ++static void _addba_timer_hdl(struct timer_list *t) ++{ ++ struct sta_info *psta = from_timer(psta, t, addba_retry_timer); ++ addba_timer_hdl(psta); ++} ++ ++void init_addba_retry_timer(struct adapter *padapter, struct sta_info *psta) ++{ ++ timer_setup(&psta->addba_retry_timer, _addba_timer_hdl, 0); ++} ++ ++void init_mlme_ext_timer(struct adapter *padapter) ++{ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ ++ timer_setup(&pmlmeext->survey_timer, _survey_timer_hdl, 0); ++ timer_setup(&pmlmeext->link_timer, _link_timer_hdl, 0); ++} ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++void rtw_indicate_sta_assoc_event(struct adapter *padapter, struct sta_info *psta) ++{ ++ union iwreq_data wrqu; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (!psta) ++ return; ++ ++ if (psta->aid > NUM_STA) ++ return; ++ ++ if (pstapriv->sta_aid[psta->aid - 1] != psta) ++ return; ++ ++ wrqu.addr.sa_family = ARPHRD_ETHER; ++ ++ memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); ++ ++ DBG_88E("+rtw_indicate_sta_assoc_event\n"); ++ ++ wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL); ++} ++ ++void rtw_indicate_sta_disassoc_event(struct adapter *padapter, struct sta_info *psta) ++{ ++ union iwreq_data wrqu; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ ++ if (!psta) ++ return; ++ ++ if (psta->aid > NUM_STA) ++ return; ++ ++ if (pstapriv->sta_aid[psta->aid - 1] != psta) ++ return; ++ ++ wrqu.addr.sa_family = ARPHRD_ETHER; ++ ++ memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); ++ ++ DBG_88E("+rtw_indicate_sta_disassoc_event\n"); ++ ++ wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL); ++} ++ ++#endif +diff --git a/drivers/staging/r8188eu/os_dep/os_intfs.c b/drivers/staging/r8188eu/os_dep/os_intfs.c +new file mode 100644 +index 000000000000..8d0158f4a45d +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/os_intfs.c +@@ -0,0 +1,1199 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _OS_INTFS_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/xmit_osdep.h" ++#include "../include/recv_osdep.h" ++#include "../include/hal_intf.h" ++#include "../include/rtw_ioctl.h" ++ ++#include "../include/usb_osintf.h" ++#include "../include/rtw_br_ext.h" ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); ++MODULE_AUTHOR("Realtek Semiconductor Corp."); ++MODULE_VERSION(DRIVERVERSION); ++ ++#define CONFIG_BR_EXT_BRNAME "br0" ++#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */ ++ ++/* module param defaults */ ++static int rtw_chip_version = 0x00; ++static int rtw_rfintfs = HWPI; ++static int rtw_lbkmode;/* RTL8712_AIR_TRX; */ ++static int rtw_network_mode = Ndis802_11IBSS;/* Ndis802_11Infrastructure; infra, ad-hoc, auto */ ++static int rtw_channel = 1;/* ad-hoc support requirement */ ++static int rtw_wireless_mode = WIRELESS_11BG_24N; ++static int rtw_vrtl_carrier_sense = AUTO_VCS; ++static int rtw_vcs_type = RTS_CTS;/* */ ++static int rtw_rts_thresh = 2347;/* */ ++static int rtw_frag_thresh = 2346;/* */ ++static int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */ ++static int rtw_scan_mode = 1;/* active, passive */ ++static int rtw_adhoc_tx_pwr = 1; ++static int rtw_soft_ap; ++static int rtw_power_mgnt = 1; ++static int rtw_ips_mode = IPS_NORMAL; ++ ++static int rtw_smart_ps = 2; ++ ++module_param(rtw_ips_mode, int, 0644); ++MODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode"); ++ ++static int rtw_debug = 1; ++static int rtw_radio_enable = 1; ++static int rtw_long_retry_lmt = 7; ++static int rtw_short_retry_lmt = 7; ++static int rtw_busy_thresh = 40; ++static int rtw_ack_policy = NORMAL_ACK; ++ ++static int rtw_mp_mode; ++ ++static int rtw_software_encrypt; ++static int rtw_software_decrypt; ++ ++static int rtw_acm_method;/* 0:By SW 1:By HW. */ ++ ++static int rtw_wmm_enable = 1;/* default is set to enable the wmm. */ ++static int rtw_uapsd_enable; ++static int rtw_uapsd_max_sp = NO_LIMIT; ++static int rtw_uapsd_acbk_en; ++static int rtw_uapsd_acbe_en; ++static int rtw_uapsd_acvi_en; ++static int rtw_uapsd_acvo_en; ++ ++static int rtw_led_enable = 1; ++ ++int rtw_ht_enable = 1; ++int rtw_cbw40_enable = 3; /* 0 :disable, bit(0): enable 2.4g, bit(1): enable 5g */ ++int rtw_ampdu_enable = 1;/* for enable tx_ampdu */ ++static int rtw_rx_stbc = 1;/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ */ ++static int rtw_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto */ ++ ++static int rtw_lowrate_two_xmit = 1;/* Use 2 path Tx to transmit MCS0~7 and legacy mode */ ++ ++static int rtw_rf_config = RF_819X_MAX_TYPE; /* auto */ ++static int rtw_low_power; ++static int rtw_wifi_spec; ++static int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; ++static int rtw_AcceptAddbaReq = true;/* 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */ ++ ++static int rtw_antdiv_cfg = 2; /* 0:OFF , 1:ON, 2:decide by Efuse config */ ++static int rtw_antdiv_type; /* 0:decide by efuse 1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2: for 88EE, 1Tx and 2Rx are diversity.(2 Ant, Tx and RxCG are both on aux port, RxCS is on main port), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) */ ++ ++static int rtw_enusbss;/* 0:disable, 1:enable */ ++ ++static int rtw_hwpdn_mode = 2;/* 0:disable, 1:enable, 2: by EFUSE config */ ++ ++static int rtw_hwpwrp_detect; /* HW power ping detect 0:disable , 1:enable */ ++ ++static int rtw_hw_wps_pbc = 1; ++ ++int rtw_mc2u_disable; ++ ++static int rtw_80211d; ++ ++static char *ifname = "wlan%d"; ++module_param(ifname, charp, 0644); ++MODULE_PARM_DESC(ifname, "The default name to allocate for first interface"); ++ ++static char *if2name = "wlan%d"; ++module_param(if2name, charp, 0644); ++MODULE_PARM_DESC(if2name, "The default name to allocate for second interface"); ++ ++char *rtw_initmac; /* temp mac address if users want to use instead of the mac address in Efuse */ ++ ++module_param(rtw_initmac, charp, 0644); ++module_param(rtw_channel_plan, int, 0644); ++module_param(rtw_chip_version, int, 0644); ++module_param(rtw_rfintfs, int, 0644); ++module_param(rtw_lbkmode, int, 0644); ++module_param(rtw_network_mode, int, 0644); ++module_param(rtw_channel, int, 0644); ++module_param(rtw_mp_mode, int, 0644); ++module_param(rtw_wmm_enable, int, 0644); ++module_param(rtw_vrtl_carrier_sense, int, 0644); ++module_param(rtw_vcs_type, int, 0644); ++module_param(rtw_busy_thresh, int, 0644); ++module_param(rtw_led_enable, int, 0644); ++module_param(rtw_ht_enable, int, 0644); ++module_param(rtw_cbw40_enable, int, 0644); ++module_param(rtw_ampdu_enable, int, 0644); ++module_param(rtw_rx_stbc, int, 0644); ++module_param(rtw_ampdu_amsdu, int, 0644); ++module_param(rtw_lowrate_two_xmit, int, 0644); ++module_param(rtw_rf_config, int, 0644); ++module_param(rtw_power_mgnt, int, 0644); ++module_param(rtw_smart_ps, int, 0644); ++module_param(rtw_low_power, int, 0644); ++module_param(rtw_wifi_spec, int, 0644); ++module_param(rtw_antdiv_cfg, int, 0644); ++module_param(rtw_antdiv_type, int, 0644); ++module_param(rtw_enusbss, int, 0644); ++module_param(rtw_hwpdn_mode, int, 0644); ++module_param(rtw_hwpwrp_detect, int, 0644); ++module_param(rtw_hw_wps_pbc, int, 0644); ++ ++static uint rtw_max_roaming_times = 2; ++module_param(rtw_max_roaming_times, uint, 0644); ++MODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try"); ++ ++static int rtw_fw_iol = 1;/* 0:Disable, 1:enable, 2:by usb speed */ ++module_param(rtw_fw_iol, int, 0644); ++MODULE_PARM_DESC(rtw_fw_iol, "FW IOL"); ++ ++module_param(rtw_mc2u_disable, int, 0644); ++ ++module_param(rtw_80211d, int, 0644); ++MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism"); ++ ++static uint rtw_notch_filter = RTW_NOTCH_FILTER; ++module_param(rtw_notch_filter, uint, 0644); ++MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P"); ++module_param_named(debug, rtw_debug, int, 0444); ++MODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)"); ++ ++/* dummy routines */ ++void rtw_proc_remove_one(struct net_device *dev) ++{ ++} ++ ++void rtw_proc_init_one(struct net_device *dev) ++{ ++} ++ ++#if 0 /* TODO: Convert these to /sys */ ++void rtw_proc_init_one(struct net_device *dev) ++{ ++ struct proc_dir_entry *dir_dev = NULL; ++ struct proc_dir_entry *entry = NULL; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ u8 rf_type; ++ ++ if (!rtw_proc) { ++ memcpy(rtw_proc_name, DRV_NAME, sizeof(DRV_NAME)); ++ ++ rtw_proc = create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net); ++ if (!rtw_proc) { ++ DBG_88E(KERN_ERR "Unable to create rtw_proc directory\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ } ++ ++ if (!padapter->dir_dev) { ++ padapter->dir_dev = create_proc_entry(dev->name, ++ S_IFDIR | S_IRUGO | S_IXUGO, ++ rtw_proc); ++ dir_dev = padapter->dir_dev; ++ if (!dir_dev) { ++ if (rtw_proc_cnt == 0) { ++ if (rtw_proc) { ++ remove_proc_entry(rtw_proc_name, init_net.proc_net); ++ rtw_proc = NULL; ++ } ++ } ++ ++ pr_info("Unable to create dir_dev directory\n"); ++ return; ++ } ++ } else { ++ return; ++ } ++ ++ rtw_proc_cnt++; ++ ++ entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_write_reg, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_write_reg; ++ ++ entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_read_reg, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_read_reg; ++ ++ entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_fwstate, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_sec_info, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_mlmext_state, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_qos_option, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_ht_option, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rf_info, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_ap_info, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO, ++ dir_dev, proc_getstruct adapter_state, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_trx_info, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("mac_reg_dump1", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_mac_reg_dump1, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("mac_reg_dump2", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_mac_reg_dump2, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("mac_reg_dump3", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_mac_reg_dump3, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("bb_reg_dump1", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_bb_reg_dump1, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("bb_reg_dump2", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_bb_reg_dump2, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("bb_reg_dump3", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_bb_reg_dump3, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("rf_reg_dump1", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rf_reg_dump1, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("rf_reg_dump2", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rf_reg_dump2, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) { ++ entry = create_proc_read_entry("rf_reg_dump3", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rf_reg_dump3, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("rf_reg_dump4", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rf_reg_dump4, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ } ++ ++#ifdef CONFIG_88EU_AP_MODE ++ ++ entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_all_sta_info, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++#endif ++ ++ entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_best_channel, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ ++ entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rx_signal, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_rx_signal; ++ entry = create_proc_read_entry("ht_enable", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_ht_enable, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_ht_enable; ++ ++ entry = create_proc_read_entry("cbw40_enable", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_cbw40_enable, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_cbw40_enable; ++ ++ entry = create_proc_read_entry("ampdu_enable", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_ampdu_enable, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_ampdu_enable; ++ ++ entry = create_proc_read_entry("rx_stbc", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rx_stbc, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_rx_stbc; ++ ++ entry = create_proc_read_entry("path_rssi", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_two_path_rssi, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry = create_proc_read_entry("rssi_disp", S_IFREG | S_IRUGO, ++ dir_dev, proc_get_rssi_disp, dev); ++ if (!entry) { ++ pr_info("Unable to create_proc_read_entry!\n"); ++ return; ++ } ++ entry->write_proc = proc_set_rssi_disp; ++} ++ ++void rtw_proc_remove_one(struct net_device *dev) ++{ ++ struct proc_dir_entry *dir_dev = NULL; ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ u8 rf_type; ++ ++ dir_dev = padapter->dir_dev; ++ padapter->dir_dev = NULL; ++ ++ if (dir_dev) { ++ remove_proc_entry("write_reg", dir_dev); ++ remove_proc_entry("read_reg", dir_dev); ++ remove_proc_entry("fwstate", dir_dev); ++ remove_proc_entry("sec_info", dir_dev); ++ remove_proc_entry("mlmext_state", dir_dev); ++ remove_proc_entry("qos_option", dir_dev); ++ remove_proc_entry("ht_option", dir_dev); ++ remove_proc_entry("rf_info", dir_dev); ++ remove_proc_entry("ap_info", dir_dev); ++ remove_proc_entry("adapter_state", dir_dev); ++ remove_proc_entry("trx_info", dir_dev); ++ remove_proc_entry("mac_reg_dump1", dir_dev); ++ remove_proc_entry("mac_reg_dump2", dir_dev); ++ remove_proc_entry("mac_reg_dump3", dir_dev); ++ remove_proc_entry("bb_reg_dump1", dir_dev); ++ remove_proc_entry("bb_reg_dump2", dir_dev); ++ remove_proc_entry("bb_reg_dump3", dir_dev); ++ remove_proc_entry("rf_reg_dump1", dir_dev); ++ remove_proc_entry("rf_reg_dump2", dir_dev); ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) { ++ remove_proc_entry("rf_reg_dump3", dir_dev); ++ remove_proc_entry("rf_reg_dump4", dir_dev); ++ } ++#ifdef CONFIG_88EU_AP_MODE ++ remove_proc_entry("all_sta_info", dir_dev); ++#endif ++ ++ remove_proc_entry("best_channel", dir_dev); ++ remove_proc_entry("rx_signal", dir_dev); ++ remove_proc_entry("cbw40_enable", dir_dev); ++ remove_proc_entry("ht_enable", dir_dev); ++ remove_proc_entry("ampdu_enable", dir_dev); ++ remove_proc_entry("rx_stbc", dir_dev); ++ remove_proc_entry("path_rssi", dir_dev); ++ remove_proc_entry("rssi_disp", dir_dev); ++ remove_proc_entry(dev->name, rtw_proc); ++ dir_dev = NULL; ++ } else { ++ return; ++ } ++ rtw_proc_cnt--; ++ ++ if (rtw_proc_cnt == 0) { ++ if (rtw_proc) { ++ remove_proc_entry("ver_info", rtw_proc); ++ ++ remove_proc_entry(rtw_proc_name, init_net.proc_net); ++ rtw_proc = NULL; ++ } ++ } ++} ++#endif ++ ++static uint loadparam(struct adapter *padapter, struct net_device *pnetdev) ++{ ++ struct registry_priv *registry_par = &padapter->registrypriv; ++ ++ GlobalDebugLevel = rtw_debug; ++ registry_par->chip_version = (u8)rtw_chip_version; ++ registry_par->rfintfs = (u8)rtw_rfintfs; ++ registry_par->lbkmode = (u8)rtw_lbkmode; ++ registry_par->network_mode = (u8)rtw_network_mode; ++ ++ memcpy(registry_par->ssid.Ssid, "ANY", 3); ++ registry_par->ssid.SsidLength = 3; ++ ++ registry_par->channel = (u8)rtw_channel; ++ registry_par->wireless_mode = (u8)rtw_wireless_mode; ++ registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense; ++ registry_par->vcs_type = (u8)rtw_vcs_type; ++ registry_par->rts_thresh = (u16)rtw_rts_thresh; ++ registry_par->frag_thresh = (u16)rtw_frag_thresh; ++ registry_par->preamble = (u8)rtw_preamble; ++ registry_par->scan_mode = (u8)rtw_scan_mode; ++ registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; ++ registry_par->soft_ap = (u8)rtw_soft_ap; ++ registry_par->smart_ps = (u8)rtw_smart_ps; ++ registry_par->power_mgnt = (u8)rtw_power_mgnt; ++ registry_par->ips_mode = (u8)rtw_ips_mode; ++ registry_par->radio_enable = (u8)rtw_radio_enable; ++ registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; ++ registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; ++ registry_par->busy_thresh = (u16)rtw_busy_thresh; ++ registry_par->ack_policy = (u8)rtw_ack_policy; ++ registry_par->mp_mode = (u8)rtw_mp_mode; ++ registry_par->software_encrypt = (u8)rtw_software_encrypt; ++ registry_par->software_decrypt = (u8)rtw_software_decrypt; ++ registry_par->acm_method = (u8)rtw_acm_method; ++ ++ /* UAPSD */ ++ registry_par->wmm_enable = (u8)rtw_wmm_enable; ++ registry_par->uapsd_enable = (u8)rtw_uapsd_enable; ++ registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp; ++ registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en; ++ registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en; ++ registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; ++ registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; ++ ++ registry_par->led_enable = (u8)rtw_led_enable; ++ ++ registry_par->ht_enable = (u8)rtw_ht_enable; ++ registry_par->cbw40_enable = (u8)rtw_cbw40_enable; ++ registry_par->ampdu_enable = (u8)rtw_ampdu_enable; ++ registry_par->rx_stbc = (u8)rtw_rx_stbc; ++ registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu; ++ registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit; ++ registry_par->rf_config = (u8)rtw_rf_config; ++ registry_par->low_power = (u8)rtw_low_power; ++ registry_par->wifi_spec = (u8)rtw_wifi_spec; ++ registry_par->channel_plan = (u8)rtw_channel_plan; ++ registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; ++ registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; ++ registry_par->antdiv_type = (u8)rtw_antdiv_type; ++ registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable, 1:enable, 2:by EFUSE config */ ++ registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable, 1:enable */ ++ registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; ++ ++ registry_par->max_roaming_times = (u8)rtw_max_roaming_times; ++ ++ registry_par->fw_iol = rtw_fw_iol; ++ ++ registry_par->enable80211d = (u8)rtw_80211d; ++ snprintf(registry_par->ifname, 16, "%s", ifname); ++ snprintf(registry_par->if2name, 16, "%s", if2name); ++ registry_par->notch_filter = (u8)rtw_notch_filter; ++ ++ return _SUCCESS; ++} ++ ++static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ struct sockaddr *addr = p; ++ ++ if (!padapter->bup) ++ memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN); ++ ++ return 0; ++} ++ ++static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ padapter->stats.tx_packets = pxmitpriv->tx_pkts;/* pxmitpriv->tx_pkts++; */ ++ padapter->stats.rx_packets = precvpriv->rx_pkts;/* precvpriv->rx_pkts++; */ ++ padapter->stats.tx_dropped = pxmitpriv->tx_drop; ++ padapter->stats.rx_dropped = precvpriv->rx_drop; ++ padapter->stats.tx_bytes = pxmitpriv->tx_bytes; ++ padapter->stats.rx_bytes = precvpriv->rx_bytes; ++ return &padapter->stats; ++} ++ ++/* ++ * AC to queue mapping ++ * ++ * AC_VO -> queue 0 ++ * AC_VI -> queue 1 ++ * AC_BE -> queue 2 ++ * AC_BK -> queue 3 ++ */ ++static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 }; ++ ++/* Given a data frame determine the 802.1p/1d tag to use. */ ++static unsigned int rtw_classify8021d(struct sk_buff *skb) ++{ ++ unsigned int dscp; ++ ++ /* skb->priority values from 256->263 are magic values to ++ * directly indicate a specific 802.1d priority. This is used ++ * to allow 802.1d priority to be passed directly in from VLAN ++ * tags, etc. ++ */ ++ if (skb->priority >= 256 && skb->priority <= 263) ++ return skb->priority - 256; ++ ++ switch (skb->protocol) { ++ case htons(ETH_P_IP): ++ dscp = ip_hdr(skb)->tos & 0xfc; ++ break; ++ default: ++ return 0; ++ } ++ ++ return dscp >> 5; ++} ++ ++static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, struct net_device *sb_dev) ++{ ++ struct adapter *padapter = rtw_netdev_priv(dev); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ skb->priority = rtw_classify8021d(skb); ++ ++ if (pmlmepriv->acm_mask != 0) ++ skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority); ++ ++ return rtw_1d_to_queue[skb->priority]; ++} ++ ++u16 rtw_recv_select_queue(struct sk_buff *skb) ++{ ++ struct iphdr *piphdr; ++ unsigned int dscp; ++ __be16 eth_type; ++ u32 priority; ++ u8 *pdata = skb->data; ++ ++ memcpy(ð_type, pdata + (ETH_ALEN << 1), 2); ++ ++ switch (eth_type) { ++ case htons(ETH_P_IP): ++ piphdr = (struct iphdr *)(pdata + ETH_HLEN); ++ dscp = piphdr->tos & 0xfc; ++ priority = dscp >> 5; ++ break; ++ default: ++ priority = 0; ++ } ++ ++ return rtw_1d_to_queue[priority]; ++} ++ ++static const struct net_device_ops rtw_netdev_ops = { ++ .ndo_open = netdev_open, ++ .ndo_stop = netdev_close, ++ .ndo_start_xmit = rtw_xmit_entry, ++ .ndo_select_queue = rtw_select_queue, ++ .ndo_set_mac_address = rtw_net_set_mac_address, ++ .ndo_get_stats = rtw_net_get_stats, ++}; ++ ++int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) ++{ ++ int err; ++ ++ err = dev_alloc_name(pnetdev, ifname); ++ if (err < 0) ++ return err; ++ ++ netif_carrier_off(pnetdev); ++ return 0; ++} ++ ++static const struct device_type wlan_type = { ++ .name = "wlan", ++}; ++ ++struct net_device *rtw_init_netdev(struct adapter *old_padapter) ++{ ++ struct adapter *padapter; ++ struct net_device *pnetdev; ++ ++ if (old_padapter) ++ pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(struct adapter), (void *)old_padapter); ++ else ++ pnetdev = rtw_alloc_etherdev(sizeof(struct adapter)); ++ ++ if (!pnetdev) ++ return NULL; ++ ++ pnetdev->dev.type = &wlan_type; ++ padapter = rtw_netdev_priv(pnetdev); ++ padapter->pnetdev = pnetdev; ++ DBG_88E("register rtw_netdev_ops to netdev_ops\n"); ++ pnetdev->netdev_ops = &rtw_netdev_ops; ++ pnetdev->watchdog_timeo = HZ * 3; /* 3 second timeout */ ++ pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def; ++ ++ /* step 2. */ ++ loadparam(padapter, pnetdev); ++ ++ return pnetdev; ++} ++ ++u32 rtw_start_drv_threads(struct adapter *padapter) ++{ ++ u32 _status = _SUCCESS; ++ ++ padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD"); ++ if (IS_ERR(padapter->cmdThread)) ++ _status = _FAIL; ++ else ++ _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); /* wait for cmd_thread to run */ ++ ++ rtw_hal_start_thread(padapter); ++ return _status; ++} ++ ++void rtw_stop_drv_threads(struct adapter *padapter) ++{ ++ /* Below is to termindate rtw_cmd_thread & event_thread... */ ++ up(&padapter->cmdpriv.cmd_queue_sema); ++ if (padapter->cmdThread) ++ _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); ++ ++ rtw_hal_stop_thread(padapter); ++} ++ ++static u8 rtw_init_default_value(struct adapter *padapter) ++{ ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ ++ /* xmit_priv */ ++ pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; ++ pxmitpriv->vcs = pregistrypriv->vcs_type; ++ pxmitpriv->vcs_type = pregistrypriv->vcs_type; ++ pxmitpriv->frag_len = pregistrypriv->frag_thresh; ++ ++ /* mlme_priv */ ++ pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ ++ pmlmepriv->scan_mode = SCAN_ACTIVE; ++ ++ /* ht_priv */ ++ pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */ ++ ++ /* security_priv */ ++ psecuritypriv->binstallGrpkey = _FAIL; ++ psecuritypriv->sw_encrypt = pregistrypriv->software_encrypt; ++ psecuritypriv->sw_decrypt = pregistrypriv->software_decrypt; ++ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ ++ psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; ++ psecuritypriv->dot11PrivacyKeyIndex = 0; ++ psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; ++ psecuritypriv->dot118021XGrpKeyid = 1; ++ psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; ++ psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; ++ ++ /* registry_priv */ ++ rtw_init_registrypriv_dev_network(padapter); ++ rtw_update_registrypriv_dev_network(padapter); ++ ++ /* hal_priv */ ++ rtw_hal_def_value_init(padapter); ++ ++ /* misc. */ ++ padapter->bReadPortCancel = false; ++ padapter->bWritePortCancel = false; ++ padapter->bRxRSSIDisplay = 0; ++ padapter->bNotifyChannelChange = 0; ++#ifdef CONFIG_88EU_P2P ++ padapter->bShowGetP2PState = 1; ++#endif ++ return _SUCCESS; ++} ++ ++u8 rtw_reset_drv_sw(struct adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; ++ ++ /* hal_priv */ ++ rtw_hal_def_value_init(padapter); ++ padapter->bReadPortCancel = false; ++ padapter->bWritePortCancel = false; ++ padapter->bRxRSSIDisplay = 0; ++ pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ ++ ++ padapter->xmitpriv.tx_pkts = 0; ++ padapter->recvpriv.rx_pkts = 0; ++ ++ pmlmepriv->LinkDetectInfo.bBusyTraffic = false; ++ ++ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); ++ ++ rtw_hal_sreset_reset_value(padapter); ++ pwrctrlpriv->pwr_state_check_cnts = 0; ++ ++ /* mlmeextpriv */ ++ padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE; ++ ++ rtw_set_signal_stat_timer(&padapter->recvpriv); ++ ++ return _SUCCESS; ++} ++ ++u8 rtw_init_drv_sw(struct adapter *padapter) ++{ ++ u8 ret8 = _SUCCESS; ++ ++ if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) { ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ padapter->cmdpriv.padapter = padapter; ++ ++ if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) { ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ if (rtw_init_mlme_priv(padapter) == _FAIL) { ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++#ifdef CONFIG_88EU_P2P ++ rtw_init_wifidirect_timers(padapter); ++ init_wifidirect_info(padapter, P2P_ROLE_DISABLE); ++ reset_global_wifidirect_info(padapter); ++#endif /* CONFIG_88EU_P2P */ ++ ++ if (init_mlme_ext_priv(padapter) == _FAIL) { ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) { ++ DBG_88E("Can't _rtw_init_xmit_priv\n"); ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ if (_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) { ++ DBG_88E("Can't _rtw_init_recv_priv\n"); ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ if (_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) { ++ DBG_88E("Can't _rtw_init_sta_priv\n"); ++ ret8 = _FAIL; ++ goto exit; ++ } ++ ++ padapter->stapriv.padapter = padapter; ++ ++ rtw_init_bcmc_stainfo(padapter); ++ ++ rtw_init_pwrctrl_priv(padapter); ++ ++ if (init_mp_priv(padapter) == _FAIL) ++ DBG_88E("%s: initialize MP private data Fail!\n", __func__); ++ ++ ret8 = rtw_init_default_value(padapter); ++ ++ rtw_hal_dm_init(padapter); ++ rtw_hal_sw_led_init(padapter); ++ ++ rtw_hal_sreset_init(padapter); ++ ++ spin_lock_init(&padapter->br_ext_lock); ++ ++exit: ++ return ret8; ++} ++ ++void rtw_cancel_all_timer(struct adapter *padapter) ++{ ++ _cancel_timer_ex(&padapter->mlmepriv.assoc_timer); ++ ++ _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer); ++ ++ _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer); ++ ++ /* cancel sw led timer */ ++ rtw_hal_sw_led_deinit(padapter); ++ ++ _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); ++ ++ _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); ++ /* cancel dm timer */ ++ rtw_hal_dm_deinit(padapter); ++} ++ ++u8 rtw_free_drv_sw(struct adapter *padapter) ++{ ++ /* we can call rtw_p2p_enable here, but: */ ++ /* 1. rtw_p2p_enable may have IO operation */ ++ /* 2. rtw_p2p_enable is bundled with wext interface */ ++ #ifdef CONFIG_88EU_P2P ++ { ++ struct wifidirect_info *pwdinfo = &padapter->wdinfo; ++ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { ++ _cancel_timer_ex(&pwdinfo->find_phase_timer); ++ _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); ++ _cancel_timer_ex(&pwdinfo->pre_tx_scan_timer); ++ rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); ++ } ++ } ++ #endif ++ ++ free_mlme_ext_priv(&padapter->mlmeextpriv); ++ ++ rtw_free_cmd_priv(&padapter->cmdpriv); ++ ++ rtw_free_evt_priv(&padapter->evtpriv); ++ ++ rtw_free_mlme_priv(&padapter->mlmepriv); ++ _rtw_free_xmit_priv(&padapter->xmitpriv); ++ ++ _rtw_free_sta_priv(&padapter->stapriv); /* will free bcmc_stainfo here */ ++ ++ _rtw_free_recv_priv(&padapter->recvpriv); ++ ++ rtw_free_pwrctrl_priv(padapter); ++ ++ rtw_hal_free_data(padapter); ++ ++ /* free the old_pnetdev */ ++ if (padapter->rereg_nd_name_priv.old_pnetdev) { ++ free_netdev(padapter->rereg_nd_name_priv.old_pnetdev); ++ padapter->rereg_nd_name_priv.old_pnetdev = NULL; ++ } ++ ++ /* clear pbuddystruct adapter to avoid access wrong pointer. */ ++ if (padapter->pbuddy_adapter) ++ padapter->pbuddy_adapter->pbuddy_adapter = NULL; ++ ++ return _SUCCESS; ++} ++ ++void netdev_br_init(struct net_device *netdev) ++{ ++ struct adapter *adapter = (struct adapter *)rtw_netdev_priv(netdev); ++ ++ rcu_read_lock(); ++ ++ if (rcu_dereference(adapter->pnetdev->rx_handler_data)) { ++ struct net_device *br_netdev; ++ struct net *devnet = NULL; ++ ++ devnet = dev_net(netdev); ++ br_netdev = dev_get_by_name(devnet, CONFIG_BR_EXT_BRNAME); ++ if (br_netdev) { ++ memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN); ++ dev_put(br_netdev); ++ } else { ++ pr_info("%s()-%d: dev_get_by_name(%s) failed!", ++ __func__, __LINE__, CONFIG_BR_EXT_BRNAME); ++ } ++ } ++ adapter->ethBrExtInfo.addPPPoETag = 1; ++ ++ rcu_read_unlock(); ++} ++ ++int _netdev_open(struct net_device *pnetdev) ++{ ++ uint status; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; ++ ++ DBG_88E("+88eu_drv - drv_open, bup =%d\n", padapter->bup); ++ ++ if (pwrctrlpriv->ps_flag) { ++ padapter->net_closed = false; ++ goto netdev_open_normal_process; ++ } ++ ++ if (!padapter->bup) { ++ padapter->bDriverStopped = false; ++ padapter->bSurpriseRemoved = false; ++ padapter->bCardDisableWOHSM = false; ++ ++ status = rtw_hal_init(padapter); ++ if (status == _FAIL) ++ goto netdev_open_error; ++ ++ pr_info("MAC Address = %pM\n", pnetdev->dev_addr); ++ ++ status = rtw_start_drv_threads(padapter); ++ if (status == _FAIL) { ++ pr_info("Initialize driver software resource Failed!\n"); ++ goto netdev_open_error; ++ } ++ ++ if (init_hw_mlme_ext(padapter) == _FAIL) { ++ pr_info("can't init mlme_ext_priv\n"); ++ goto netdev_open_error; ++ } ++ if (padapter->intf_start) ++ padapter->intf_start(padapter); ++ rtw_proc_init_one(pnetdev); ++ ++ rtw_led_control(padapter, LED_CTL_NO_LINK); ++ ++ padapter->bup = true; ++ } ++ padapter->net_closed = false; ++ ++ _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); ++ ++ padapter->pwrctrlpriv.bips_processing = false; ++ rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); ++ ++ if (!rtw_netif_queue_stopped(pnetdev)) ++ rtw_netif_start_queue(pnetdev); ++ else ++ rtw_netif_wake_queue(pnetdev); ++ ++ netdev_br_init(pnetdev); ++ ++netdev_open_normal_process: ++ DBG_88E("-88eu_drv - drv_open, bup =%d\n", padapter->bup); ++ return 0; ++ ++netdev_open_error: ++ padapter->bup = false; ++ netif_carrier_off(pnetdev); ++ rtw_netif_stop_queue(pnetdev); ++ DBG_88E("-88eu_drv - drv_open fail, bup =%d\n", padapter->bup); ++ return -1; ++} ++ ++int netdev_open(struct net_device *pnetdev) ++{ ++ int ret; ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ ++ _enter_critical_mutex(padapter->hw_init_mutex, NULL); ++ ret = _netdev_open(pnetdev); ++ _exit_critical_mutex(padapter->hw_init_mutex, NULL); ++ return ret; ++} ++ ++static int ips_netdrv_open(struct adapter *padapter) ++{ ++ int status = _SUCCESS; ++ padapter->net_closed = false; ++ DBG_88E("===> %s.........\n", __func__); ++ ++ padapter->bDriverStopped = false; ++ padapter->bSurpriseRemoved = false; ++ padapter->bCardDisableWOHSM = false; ++ ++ status = rtw_hal_init(padapter); ++ if (status == _FAIL) ++ goto netdev_open_error; ++ ++ if (padapter->intf_start) ++ padapter->intf_start(padapter); ++ ++ rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); ++ _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 5000); ++ ++ return _SUCCESS; ++ ++netdev_open_error: ++ DBG_88E("-ips_netdrv_open - drv_open failure, bup =%d\n", padapter->bup); ++ ++ return _FAIL; ++} ++ ++int rtw_ips_pwr_up(struct adapter *padapter) ++{ ++ int result; ++ u32 start_time = jiffies; ++ DBG_88E("===> rtw_ips_pwr_up..............\n"); ++ rtw_reset_drv_sw(padapter); ++ ++ result = ips_netdrv_open(padapter); ++ ++ rtw_led_control(padapter, LED_CTL_NO_LINK); ++ ++ DBG_88E("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time)); ++ return result; ++} ++ ++void rtw_ips_pwr_down(struct adapter *padapter) ++{ ++ u32 start_time = jiffies; ++ DBG_88E("===> rtw_ips_pwr_down...................\n"); ++ ++ padapter->bCardDisableWOHSM = true; ++ padapter->net_closed = true; ++ ++ rtw_led_control(padapter, LED_CTL_POWER_OFF); ++ ++ rtw_ips_dev_unload(padapter); ++ padapter->bCardDisableWOHSM = false; ++ DBG_88E("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time)); ++} ++ ++void rtw_ips_dev_unload(struct adapter *padapter) ++{ ++ DBG_88E("====> %s...\n", __func__); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, NULL); ++ ++ if (padapter->intf_stop) ++ padapter->intf_stop(padapter); ++ ++ /* s5. */ ++ if (!padapter->bSurpriseRemoved) ++ rtw_hal_deinit(padapter); ++} ++ ++int pm_netdev_open(struct net_device *pnetdev, u8 bnormal) ++{ ++ int status; ++ ++ if (bnormal) ++ status = netdev_open(pnetdev); ++ else ++ status = (_SUCCESS == ips_netdrv_open((struct adapter *)rtw_netdev_priv(pnetdev))) ? (0) : (-1); ++ return status; ++} ++ ++int netdev_close(struct net_device *pnetdev) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); ++ ++ if (padapter->pwrctrlpriv.bInternalAutoSuspend) { ++ if (padapter->pwrctrlpriv.rf_pwrstate == rf_off) ++ padapter->pwrctrlpriv.ps_flag = true; ++ } ++ padapter->net_closed = true; ++ ++ if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) { ++ DBG_88E("(2)88eu_drv - drv_close, bup =%d, hw_init_completed =%d\n", ++ padapter->bup, padapter->hw_init_completed); ++ ++ /* s1. */ ++ if (pnetdev) { ++ if (!rtw_netif_queue_stopped(pnetdev)) ++ rtw_netif_stop_queue(pnetdev); ++ } ++ ++ /* s2. */ ++ LeaveAllPowerSaveMode(padapter); ++ rtw_disassoc_cmd(padapter, 500, false); ++ /* s2-2. indicate disconnect to os */ ++ rtw_indicate_disconnect(padapter); ++ /* s2-3. */ ++ rtw_free_assoc_resources(padapter, 1); ++ /* s2-4. */ ++ rtw_free_network_queue(padapter, true); ++ /* Close LED */ ++ rtw_led_control(padapter, LED_CTL_POWER_OFF); ++ } ++ ++ nat25_db_cleanup(padapter); ++ ++#ifdef CONFIG_88EU_P2P ++ rtw_p2p_enable(padapter, P2P_ROLE_DISABLE); ++#endif /* CONFIG_88EU_P2P */ ++ ++ kfree(dvobj->firmware.szFwBuffer); ++ dvobj->firmware.szFwBuffer = NULL; ++ ++ DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup); ++ return 0; ++} +diff --git a/drivers/staging/r8188eu/os_dep/osdep_service.c b/drivers/staging/r8188eu/os_dep/osdep_service.c +new file mode 100644 +index 000000000000..95ac6086370b +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/osdep_service.c +@@ -0,0 +1,343 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _OSDEP_SERVICE_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/rtw_ioctl_set.h" ++ ++/* ++* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE ++* @return: one of RTW_STATUS_CODE ++*/ ++inline int RTW_STATUS_CODE(int error_code) ++{ ++ if (error_code >= 0) ++ return _SUCCESS; ++ return _FAIL; ++} ++ ++u32 rtw_atoi(u8 *s) ++{ ++ int num = 0, flag = 0; ++ int i; ++ for (i = 0; i <= strlen(s); i++) { ++ if (s[i] >= '0' && s[i] <= '9') ++ num = num * 10 + s[i] - '0'; ++ else if (s[0] == '-' && i == 0) ++ flag = 1; ++ else ++ break; ++ } ++ if (flag == 1) ++ num = num * -1; ++ return num; ++} ++ ++void *rtw_malloc2d(int h, int w, int size) ++{ ++ int j; ++ ++ void **a = kzalloc(h * sizeof(void *) + h * w * size, GFP_KERNEL); ++ if (!a) ++ return NULL; ++ ++ for (j = 0; j < h; j++) ++ a[j] = ((char *)(a + h)) + j * w * size; ++ ++ return a; ++} ++ ++/* ++For the following list_xxx operations, ++caller must guarantee the atomic context. ++Otherwise, there will be racing condition. ++*/ ++/* ++Caller must check if the list is empty before calling rtw_list_delete ++*/ ++ ++u32 _rtw_down_sema(struct semaphore *sema) ++{ ++ if (down_interruptible(sema)) ++ return _FAIL; ++ else ++ return _SUCCESS; ++} ++ ++void _rtw_mutex_init(struct mutex *pmutex) ++{ ++ mutex_init(pmutex); ++} ++ ++void _rtw_mutex_free(struct mutex *pmutex) ++{ ++ mutex_destroy(pmutex); ++} ++ ++void _rtw_init_queue(struct __queue *pqueue) ++{ ++ INIT_LIST_HEAD(&pqueue->queue); ++ spin_lock_init(&pqueue->lock); ++} ++ ++inline u32 rtw_systime_to_ms(u32 systime) ++{ ++ return systime * 1000 / HZ; ++} ++ ++inline u32 rtw_ms_to_systime(u32 ms) ++{ ++ return ms * HZ / 1000; ++} ++ ++/* the input parameter start use the same unit as jiffies */ ++inline s32 rtw_get_passing_time_ms(u32 start) ++{ ++ return rtw_systime_to_ms(jiffies - start); ++} ++ ++void rtw_usleep_os(int us) ++{ ++ if (1 < (us / 1000)) ++ msleep(1); ++ else ++ msleep((us / 1000) + 1); ++} ++ ++#define RTW_SUSPEND_LOCK_NAME "rtw_wifi" ++ ++static const struct device_type wlan_type = { ++ .name = "wlan", ++}; ++ ++struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, ++ void *old_priv) ++{ ++ struct net_device *pnetdev; ++ struct rtw_netdev_priv_indicator *pnpi; ++ ++ pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4); ++ if (!pnetdev) ++ goto RETURN; ++ ++ pnetdev->dev.type = &wlan_type; ++ pnpi = netdev_priv(pnetdev); ++ pnpi->priv = old_priv; ++ pnpi->sizeof_priv = sizeof_priv; ++ ++RETURN: ++ return pnetdev; ++} ++ ++struct net_device *rtw_alloc_etherdev(int sizeof_priv) ++{ ++ struct net_device *pnetdev; ++ struct rtw_netdev_priv_indicator *pnpi; ++ ++ pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4); ++ if (!pnetdev) ++ goto RETURN; ++ ++ pnpi = netdev_priv(pnetdev); ++ ++ pnpi->priv = vzalloc(sizeof_priv); ++ if (!pnpi->priv) { ++ free_netdev(pnetdev); ++ pnetdev = NULL; ++ goto RETURN; ++ } ++ ++ pnpi->sizeof_priv = sizeof_priv; ++RETURN: ++ return pnetdev; ++} ++ ++void rtw_free_netdev(struct net_device *netdev) ++{ ++ struct rtw_netdev_priv_indicator *pnpi; ++ ++ if (!netdev) ++ goto RETURN; ++ ++ pnpi = netdev_priv(netdev); ++ ++ if (!pnpi->priv) ++ goto RETURN; ++ ++ vfree(pnpi->priv); ++ free_netdev(netdev); ++ ++RETURN: ++ return; ++} ++ ++int rtw_change_ifname(struct adapter *padapter, const char *ifname) ++{ ++ struct net_device *pnetdev; ++ struct net_device *cur_pnetdev; ++ struct rereg_nd_name_data *rereg_priv; ++ int ret; ++ ++ if (!padapter) ++ goto error; ++ ++ cur_pnetdev = padapter->pnetdev; ++ rereg_priv = &padapter->rereg_nd_name_priv; ++ ++ /* free the old_pnetdev */ ++ if (rereg_priv->old_pnetdev) { ++ free_netdev(rereg_priv->old_pnetdev); ++ rereg_priv->old_pnetdev = NULL; ++ } ++ ++ if (!rtnl_is_locked()) ++ unregister_netdev(cur_pnetdev); ++ else ++ unregister_netdevice(cur_pnetdev); ++ ++ rtw_proc_remove_one(cur_pnetdev); ++ ++ rereg_priv->old_pnetdev = cur_pnetdev; ++ ++ pnetdev = rtw_init_netdev(padapter); ++ if (!pnetdev) { ++ ret = -1; ++ goto error; ++ } ++ ++ SET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter))); ++ ++ rtw_init_netdev_name(pnetdev, ifname); ++ ++ memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); ++ ++ if (!rtnl_is_locked()) ++ ret = register_netdev(pnetdev); ++ else ++ ret = register_netdevice(pnetdev); ++ if (ret != 0) ++ goto error; ++ ++ rtw_proc_init_one(pnetdev); ++ return 0; ++error: ++ return -1; ++} ++ ++void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len) ++{ ++ u32 dup_len = 0; ++ u8 *ori = NULL; ++ u8 *dup = NULL; ++ ++ if (!buf || !buf_len) ++ return; ++ ++ if (!src || !src_len) ++ goto keep_ori; ++ ++ /* duplicate src */ ++ dup = kmalloc(src_len, GFP_ATOMIC); ++ if (dup) { ++ dup_len = src_len; ++ memcpy(dup, src, dup_len); ++ } ++ ++keep_ori: ++ ori = *buf; ++ ++ /* replace buf with dup */ ++ *buf_len = 0; ++ *buf = dup; ++ *buf_len = dup_len; ++ ++ /* free ori */ ++ kfree(ori); ++} ++ ++/** ++ * rtw_cbuf_full - test if cbuf is full ++ * @cbuf: pointer of struct rtw_cbuf ++ * ++ * Returns: true if cbuf is full ++ */ ++inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf) ++{ ++ return (cbuf->write == cbuf->read - 1) ? true : false; ++} ++ ++/** ++ * rtw_cbuf_empty - test if cbuf is empty ++ * @cbuf: pointer of struct rtw_cbuf ++ * ++ * Returns: true if cbuf is empty ++ */ ++inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf) ++{ ++ return (cbuf->write == cbuf->read) ? true : false; ++} ++ ++/** ++ * rtw_cbuf_push - push a pointer into cbuf ++ * @cbuf: pointer of struct rtw_cbuf ++ * @buf: pointer to push in ++ * ++ * Lock free operation, be careful of the use scheme ++ * Returns: true push success ++ */ ++bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf) ++{ ++ if (rtw_cbuf_full(cbuf)) ++ return _FAIL; ++ ++ if (0) ++ DBG_88E("%s on %u\n", __func__, cbuf->write); ++ cbuf->bufs[cbuf->write] = buf; ++ cbuf->write = (cbuf->write + 1) % cbuf->size; ++ ++ return _SUCCESS; ++} ++ ++/** ++ * rtw_cbuf_pop - pop a pointer from cbuf ++ * @cbuf: pointer of struct rtw_cbuf ++ * ++ * Lock free operation, be careful of the use scheme ++ * Returns: pointer popped out ++ */ ++void *rtw_cbuf_pop(struct rtw_cbuf *cbuf) ++{ ++ void *buf; ++ if (rtw_cbuf_empty(cbuf)) ++ return NULL; ++ ++ if (0) ++ DBG_88E("%s on %u\n", __func__, cbuf->read); ++ buf = cbuf->bufs[cbuf->read]; ++ cbuf->read = (cbuf->read + 1) % cbuf->size; ++ ++ return buf; ++} ++ ++/** ++ * rtw_cbuf_alloc - allocate a rtw_cbuf with given size and do initialization ++ * @size: size of pointer ++ * ++ * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure ++ */ ++struct rtw_cbuf *rtw_cbuf_alloc(u32 size) ++{ ++ struct rtw_cbuf *cbuf; ++ ++ cbuf = kmalloc(sizeof(*cbuf) + sizeof(void *) * size, GFP_KERNEL); ++ ++ if (cbuf) { ++ cbuf->write = 0; ++ cbuf->read = 0; ++ cbuf->size = size; ++ } ++ return cbuf; ++} +diff --git a/drivers/staging/r8188eu/os_dep/recv_linux.c b/drivers/staging/r8188eu/os_dep/recv_linux.c +new file mode 100644 +index 000000000000..917a63e3e94c +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/recv_linux.c +@@ -0,0 +1,214 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _RECV_OSDEP_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++ ++#include "../include/wifi.h" ++#include "../include/recv_osdep.h" ++ ++#include "../include/osdep_intf.h" ++#include "../include/usb_ops.h" ++ ++/* init os related resource in struct recv_priv */ ++int rtw_os_recv_resource_init(struct recv_priv *precvpriv, ++ struct adapter *padapter) ++{ ++ return _SUCCESS; ++} ++ ++/* alloc os related resource in struct recv_frame */ ++int rtw_os_recv_resource_alloc(struct adapter *padapter, ++ struct recv_frame *precvframe) ++{ ++ precvframe->pkt_newalloc = NULL; ++ precvframe->pkt = NULL; ++ return _SUCCESS; ++} ++ ++/* free os related resource in struct recv_frame */ ++void rtw_os_recv_resource_free(struct recv_priv *precvpriv) ++{ ++} ++ ++/* alloc os related resource in struct recv_buf */ ++int rtw_os_recvbuf_resource_alloc(struct adapter *padapter, ++ struct recv_buf *precvbuf) ++{ ++ int res = _SUCCESS; ++ ++ precvbuf->irp_pending = false; ++ precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL); ++ if (!precvbuf->purb) ++ res = _FAIL; ++ precvbuf->pskb = NULL; ++ precvbuf->reuse = false; ++ precvbuf->pallocated_buf = NULL; ++ precvbuf->pbuf = NULL; ++ precvbuf->pdata = NULL; ++ precvbuf->phead = NULL; ++ precvbuf->ptail = NULL; ++ precvbuf->pend = NULL; ++ precvbuf->transfer_len = 0; ++ precvbuf->len = 0; ++ return res; ++} ++ ++/* free os related resource in struct recv_buf */ ++int rtw_os_recvbuf_resource_free(struct adapter *padapter, ++ struct recv_buf *precvbuf) ++{ ++ usb_free_urb(precvbuf->purb); ++ return _SUCCESS; ++} ++ ++void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup) ++{ ++ union iwreq_data wrqu; ++ struct iw_michaelmicfailure ev; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct security_priv *psecuritypriv = &padapter->securitypriv; ++ u32 cur_time = 0; ++ ++ if (psecuritypriv->last_mic_err_time == 0) { ++ psecuritypriv->last_mic_err_time = jiffies; ++ } else { ++ cur_time = jiffies; ++ ++ if (cur_time - psecuritypriv->last_mic_err_time < 60 * HZ) { ++ psecuritypriv->btkip_countermeasure = true; ++ psecuritypriv->last_mic_err_time = 0; ++ psecuritypriv->btkip_countermeasure_time = cur_time; ++ } else { ++ psecuritypriv->last_mic_err_time = jiffies; ++ } ++ } ++ ++ memset(&ev, 0x00, sizeof(ev)); ++ if (bgroup) ++ ev.flags |= IW_MICFAILURE_GROUP; ++ else ++ ev.flags |= IW_MICFAILURE_PAIRWISE; ++ ++ ev.src_addr.sa_family = ARPHRD_ETHER; ++ memcpy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0], ETH_ALEN); ++ memset(&wrqu, 0x00, sizeof(wrqu)); ++ wrqu.data.length = sizeof(ev); ++ wireless_send_event(padapter->pnetdev, IWEVMICHAELMICFAILURE, ++ &wrqu, (char *)&ev); ++} ++ ++void rtw_hostapd_mlme_rx(struct adapter *padapter, ++ struct recv_frame *precv_frame) ++{ ++} ++ ++int rtw_recv_indicatepkt(struct adapter *padapter, ++ struct recv_frame *precv_frame) ++{ ++ struct recv_priv *precvpriv; ++ struct __queue *pfree_recv_queue; ++ struct sk_buff *skb; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ precvpriv = &padapter->recvpriv; ++ pfree_recv_queue = &precvpriv->free_recv_queue; ++ ++ skb = precv_frame->pkt; ++ if (!skb) ++ goto _recv_indicatepkt_drop; ++ ++ skb->data = precv_frame->rx_data; ++ ++ skb_set_tail_pointer(skb, precv_frame->len); ++ ++ skb->len = precv_frame->len; ++ ++ if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { ++ struct sk_buff *pskb2 = NULL; ++ struct sta_info *psta = NULL; ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct rx_pkt_attrib *pattrib = &precv_frame->attrib; ++ bool bmcast = is_multicast_ether_addr(pattrib->dst); ++ ++ if (memcmp(pattrib->dst, myid(&padapter->eeprompriv), ++ ETH_ALEN)) { ++ if (bmcast) { ++ psta = rtw_get_bcmc_stainfo(padapter); ++ pskb2 = skb_clone(skb, GFP_ATOMIC); ++ } else { ++ psta = rtw_get_stainfo(pstapriv, pattrib->dst); ++ } ++ ++ if (psta) { ++ struct net_device *pnetdev; ++ ++ pnetdev = (struct net_device *)padapter->pnetdev; ++ skb->dev = pnetdev; ++ skb_set_queue_mapping(skb, rtw_recv_select_queue(skb)); ++ ++ rtw_xmit_entry(skb, pnetdev); ++ ++ if (bmcast) ++ skb = pskb2; ++ else ++ goto _recv_indicatepkt_end; ++ } ++ } ++ } ++ ++ rcu_read_lock(); ++ rcu_dereference(padapter->pnetdev->rx_handler_data); ++ rcu_read_unlock(); ++ ++ skb->ip_summed = CHECKSUM_NONE; ++ skb->dev = padapter->pnetdev; ++ skb->protocol = eth_type_trans(skb, padapter->pnetdev); ++ ++ netif_rx(skb); ++ ++_recv_indicatepkt_end: ++ ++ /* pointers to NULL before rtw_free_recvframe() */ ++ precv_frame->pkt = NULL; ++ ++ rtw_free_recvframe(precv_frame, pfree_recv_queue); ++ ++ return _SUCCESS; ++ ++_recv_indicatepkt_drop: ++ ++ /* enqueue back to free_recv_queue */ ++ rtw_free_recvframe(precv_frame, pfree_recv_queue); ++ ++ return _FAIL; ++} ++ ++void rtw_os_read_port(struct adapter *padapter, struct recv_buf *precvbuf) ++{ ++ struct recv_priv *precvpriv = &padapter->recvpriv; ++ ++ precvbuf->ref_cnt--; ++ /* free skb in recv_buf */ ++ dev_kfree_skb_any(precvbuf->pskb); ++ precvbuf->pskb = NULL; ++ precvbuf->reuse = false; ++ if (!precvbuf->irp_pending) ++ rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, ++ (unsigned char *)precvbuf); ++} ++ ++static void _rtw_reordering_ctrl_timeout_handler(struct timer_list *t) ++{ ++ struct recv_reorder_ctrl *preorder_ctrl; ++ ++ preorder_ctrl = from_timer(preorder_ctrl, t, reordering_ctrl_timer); ++ rtw_reordering_ctrl_timeout_handler(preorder_ctrl); ++} ++ ++void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl) ++{ ++ timer_setup(&preorder_ctrl->reordering_ctrl_timer, _rtw_reordering_ctrl_timeout_handler, 0); ++} +diff --git a/drivers/staging/r8188eu/os_dep/usb_intf.c b/drivers/staging/r8188eu/os_dep/usb_intf.c +new file mode 100644 +index 000000000000..bb85ab77fd26 +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/usb_intf.c +@@ -0,0 +1,781 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2011 Realtek Corporation. */ ++ ++#define _HCI_INTF_C_ ++ ++#include ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/recv_osdep.h" ++#include "../include/xmit_osdep.h" ++#include "../include/hal_intf.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_vendor_req.h" ++#include "../include/usb_ops.h" ++#include "../include/usb_osintf.h" ++#include "../include/rtw_ioctl.h" ++ ++int ui_pid[3] = {0, 0, 0}; ++ ++static int rtw_suspend(struct usb_interface *intf, pm_message_t message); ++static int rtw_resume(struct usb_interface *intf); ++ ++static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid); ++static void rtw_dev_remove(struct usb_interface *pusb_intf); ++ ++#define USB_VENDER_ID_REALTEK 0x0bda ++ ++/* DID_USB_v916_20130116 */ ++static struct usb_device_id rtw_usb_id_tbl[] = { ++ /*=== Realtek demoboard ===*/ ++ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */ ++ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */ ++ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xf179)}, /* 8188FU */ ++ /*=== Customer ID ===*/ ++ /****** 8188EUS ********/ ++ {USB_DEVICE(0x07B8, 0x8179)}, /* Abocom - Abocom */ ++ {USB_DEVICE(0x0DF6, 0x0076)}, /* Sitecom N150 v2 */ ++ {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ ++ {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ ++ {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */ ++ {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ ++ {USB_DEVICE(0x056E, 0x4008)}, /* Elecom WDC-150SU2M */ ++ {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ ++ {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ ++ {USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */ ++ {USB_DEVICE(0x0B05, 0x18F0)}, /* ASUS USB-N10 Nano B1 */ ++ {USB_DEVICE(0x7392, 0xb811)}, /* Edimax EW-7811Un V2 */ ++ {} /* Terminating entry */ ++}; ++ ++MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl); ++ ++static struct specific_device_id specific_device_id_tbl[] = { ++ {} /* empty table for now */ ++}; ++ ++struct rtw_usb_drv { ++ struct usb_driver usbdrv; ++ int drv_registered; ++ struct mutex hw_init_mutex; ++}; ++ ++static struct rtw_usb_drv rtl8188e_usb_drv = { ++ .usbdrv.name = "r8188eu", ++ .usbdrv.probe = rtw_drv_init, ++ .usbdrv.disconnect = rtw_dev_remove, ++ .usbdrv.id_table = rtw_usb_id_tbl, ++ .usbdrv.suspend = rtw_suspend, ++ .usbdrv.resume = rtw_resume, ++ .usbdrv.reset_resume = rtw_resume, ++}; ++ ++static struct rtw_usb_drv *usb_drv = &rtl8188e_usb_drv; ++ ++static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) ++{ ++ return (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN; ++} ++ ++static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) ++{ ++ return (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT; ++} ++ ++static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) ++{ ++ return (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT; ++} ++ ++static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) ++{ ++ return (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK; ++} ++ ++static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) ++{ ++ return RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd); ++} ++ ++static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) ++{ ++ return RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd); ++} ++ ++static inline int usb_endpoint_is_int(const struct usb_endpoint_descriptor *epd) ++{ ++ return RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd); ++} ++ ++static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd) ++{ ++ return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ++} ++ ++static u8 rtw_init_intf_priv(struct dvobj_priv *dvobj) ++{ ++ u8 rst = _SUCCESS; ++ ++ _rtw_mutex_init(&dvobj->usb_vendor_req_mutex); ++ ++ dvobj->usb_alloc_vendor_req_buf = kzalloc(MAX_USB_IO_CTL_SIZE, GFP_KERNEL); ++ if (!dvobj->usb_alloc_vendor_req_buf) { ++ DBG_88E("alloc usb_vendor_req_buf failed... /n"); ++ rst = _FAIL; ++ goto exit; ++ } ++ dvobj->usb_vendor_req_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(dvobj->usb_alloc_vendor_req_buf), ALIGNMENT_UNIT); ++exit: ++ return rst; ++} ++ ++static void rtw_deinit_intf_priv(struct dvobj_priv *dvobj) ++{ ++ kfree(dvobj->usb_alloc_vendor_req_buf); ++ _rtw_mutex_free(&dvobj->usb_vendor_req_mutex); ++} ++ ++static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf) ++{ ++ int i; ++ int status = _FAIL; ++ struct dvobj_priv *pdvobjpriv; ++ struct usb_host_config *phost_conf; ++ struct usb_config_descriptor *pconf_desc; ++ struct usb_host_interface *phost_iface; ++ struct usb_interface_descriptor *piface_desc; ++ struct usb_endpoint_descriptor *pendp_desc; ++ struct usb_device *pusbd; ++ ++ pdvobjpriv = kzalloc(sizeof(*pdvobjpriv), GFP_KERNEL); ++ if (!pdvobjpriv) ++ goto exit; ++ ++ pdvobjpriv->pusbintf = usb_intf; ++ pusbd = interface_to_usbdev(usb_intf); ++ pdvobjpriv->pusbdev = pusbd; ++ usb_set_intfdata(usb_intf, pdvobjpriv); ++ ++ pdvobjpriv->RtNumInPipes = 0; ++ pdvobjpriv->RtNumOutPipes = 0; ++ ++ phost_conf = pusbd->actconfig; ++ pconf_desc = &phost_conf->desc; ++ ++ phost_iface = &usb_intf->altsetting[0]; ++ piface_desc = &phost_iface->desc; ++ ++ pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; ++ pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber; ++ pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; ++ ++ for (i = 0; i < pdvobjpriv->nr_endpoint; i++) { ++ int ep_num; ++ pendp_desc = &phost_iface->endpoint[i].desc; ++ ++ ep_num = usb_endpoint_num(pendp_desc); ++ ++ if (usb_endpoint_is_bulk_in(pendp_desc)) { ++ pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = ep_num; ++ pdvobjpriv->RtNumInPipes++; ++ } else if (usb_endpoint_is_int_in(pendp_desc)) { ++ pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = ep_num; ++ pdvobjpriv->RtNumInPipes++; ++ } else if (usb_endpoint_is_bulk_out(pendp_desc)) { ++ pdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] = ++ ep_num; ++ pdvobjpriv->RtNumOutPipes++; ++ } ++ pdvobjpriv->ep_num[i] = ep_num; ++ } ++ ++ if (pusbd->speed == USB_SPEED_HIGH) { ++ pdvobjpriv->ishighspeed = true; ++ DBG_88E("USB_SPEED_HIGH\n"); ++ } else { ++ pdvobjpriv->ishighspeed = false; ++ DBG_88E("NON USB_SPEED_HIGH\n"); ++ } ++ ++ if (rtw_init_intf_priv(pdvobjpriv) == _FAIL) ++ goto free_dvobj; ++ ++ /* 3 misc */ ++ sema_init(&pdvobjpriv->usb_suspend_sema, 0); ++ rtw_reset_continual_urb_error(pdvobjpriv); ++ ++ usb_get_dev(pusbd); ++ ++ status = _SUCCESS; ++ ++free_dvobj: ++ if (status != _SUCCESS && pdvobjpriv) { ++ usb_set_intfdata(usb_intf, NULL); ++ kfree(pdvobjpriv); ++ pdvobjpriv = NULL; ++ } ++exit: ++ return pdvobjpriv; ++} ++ ++static void usb_dvobj_deinit(struct usb_interface *usb_intf) ++{ ++ struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf); ++ ++ usb_set_intfdata(usb_intf, NULL); ++ if (dvobj) { ++ /* Modify condition for 92DU DMDP 2010.11.18, by Thomas */ ++ if ((dvobj->NumInterfaces != 2 && ++ dvobj->NumInterfaces != 3) || ++ (dvobj->InterfaceNumber == 1)) { ++ if (interface_to_usbdev(usb_intf)->state != ++ USB_STATE_NOTATTACHED) { ++ /* If we didn't unplug usb dongle and ++ * remove/insert module, driver fails ++ * on sitesurvey for the first time when ++ * device is up . Reset usb port for sitesurvey ++ * fail issue. */ ++ DBG_88E("usb attached..., try to reset usb device\n"); ++ usb_reset_device(interface_to_usbdev(usb_intf)); ++ } ++ } ++ rtw_deinit_intf_priv(dvobj); ++ kfree(dvobj); ++ } ++ ++ usb_put_dev(interface_to_usbdev(usb_intf)); ++ ++} ++ ++static void chip_by_usb_id(struct adapter *padapter) ++{ ++ padapter->chip_type = NULL_CHIP_TYPE; ++ hal_set_hw_type(padapter); ++} ++ ++static void usb_intf_start(struct adapter *padapter) ++{ ++ rtw_hal_inirp_init(padapter); ++} ++ ++static void usb_intf_stop(struct adapter *padapter) ++{ ++ /* cancel in irp */ ++ rtw_hal_inirp_deinit(padapter); ++ ++ /* cancel out irp */ ++ rtw_write_port_cancel(padapter); ++ ++ /* todo:cancel other irps */ ++} ++ ++static void rtw_dev_unload(struct adapter *padapter) ++{ ++ if (padapter->bup) { ++ DBG_88E("===> rtw_dev_unload\n"); ++ padapter->bDriverStopped = true; ++ if (padapter->xmitpriv.ack_tx) ++ rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP); ++ /* s3. */ ++ if (padapter->intf_stop) ++ padapter->intf_stop(padapter); ++ /* s4. */ ++ if (!padapter->pwrctrlpriv.bInternalAutoSuspend) ++ rtw_stop_drv_threads(padapter); ++ ++ /* s5. */ ++ if (!padapter->bSurpriseRemoved) { ++ rtw_hal_deinit(padapter); ++ padapter->bSurpriseRemoved = true; ++ } ++ ++ padapter->bup = false; ++ } ++ ++ DBG_88E("<=== rtw_dev_unload\n"); ++} ++ ++static void process_spec_devid(const struct usb_device_id *pdid) ++{ ++ u16 vid, pid; ++ u32 flags; ++ int i; ++ int num = sizeof(specific_device_id_tbl) / ++ sizeof(struct specific_device_id); ++ ++ for (i = 0; i < num; i++) { ++ vid = specific_device_id_tbl[i].idVendor; ++ pid = specific_device_id_tbl[i].idProduct; ++ flags = specific_device_id_tbl[i].flags; ++ ++ if ((pdid->idVendor == vid) && (pdid->idProduct == pid) && ++ (flags & SPEC_DEV_ID_DISABLE_HT)) { ++ rtw_ht_enable = 0; ++ rtw_cbw40_enable = 0; ++ rtw_ampdu_enable = 0; ++ } ++ } ++} ++ ++int rtw_hw_suspend(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ struct net_device *pnetdev = padapter->pnetdev; ++ ++ ++ if (!padapter) ++ goto error_exit; ++ if ((!padapter->bup) || (padapter->bDriverStopped) || ++ (padapter->bSurpriseRemoved)) { ++ DBG_88E("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", ++ padapter->bup, padapter->bDriverStopped, ++ padapter->bSurpriseRemoved); ++ goto error_exit; ++ } ++ ++ LeaveAllPowerSaveMode(padapter); ++ ++ DBG_88E("==> rtw_hw_suspend\n"); ++ _enter_pwrlock(&pwrpriv->lock); ++ pwrpriv->bips_processing = true; ++ /* s1. */ ++ if (pnetdev) { ++ netif_carrier_off(pnetdev); ++ rtw_netif_stop_queue(pnetdev); ++ } ++ ++ /* s2. */ ++ rtw_disassoc_cmd(padapter, 500, false); ++ ++ /* s2-2. indicate disconnect to os */ ++ { ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ++ _clr_fwstate_(pmlmepriv, _FW_LINKED); ++ ++ rtw_led_control(padapter, LED_CTL_NO_LINK); ++ ++ rtw_os_indicate_disconnect(padapter); ++ ++ /* donnot enqueue cmd */ ++ rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0); ++ } ++ } ++ /* s2-3. */ ++ rtw_free_assoc_resources(padapter, 1); ++ ++ /* s2-4. */ ++ rtw_free_network_queue(padapter, true); ++ rtw_ips_dev_unload(padapter); ++ pwrpriv->rf_pwrstate = rf_off; ++ pwrpriv->bips_processing = false; ++ ++ _exit_pwrlock(&pwrpriv->lock); ++ return 0; ++ ++error_exit: ++ DBG_88E("%s, failed\n", __func__); ++ return -1; ++} ++ ++int rtw_hw_resume(struct adapter *padapter) ++{ ++ struct pwrctrl_priv *pwrpriv; ++ struct net_device *pnetdev = padapter->pnetdev; ++ ++ if (!padapter) ++ goto error_exit; ++ pwrpriv = &padapter->pwrctrlpriv; ++ DBG_88E("==> rtw_hw_resume\n"); ++ _enter_pwrlock(&pwrpriv->lock); ++ pwrpriv->bips_processing = true; ++ rtw_reset_drv_sw(padapter); ++ ++ if (pm_netdev_open(pnetdev, false) != 0) { ++ _exit_pwrlock(&pwrpriv->lock); ++ goto error_exit; ++ } ++ ++ netif_device_attach(pnetdev); ++ netif_carrier_on(pnetdev); ++ ++ if (!netif_queue_stopped(pnetdev)) ++ netif_start_queue(pnetdev); ++ else ++ netif_wake_queue(pnetdev); ++ ++ pwrpriv->bkeepfwalive = false; ++ pwrpriv->brfoffbyhw = false; ++ ++ pwrpriv->rf_pwrstate = rf_on; ++ pwrpriv->bips_processing = false; ++ ++ _exit_pwrlock(&pwrpriv->lock); ++ ++ return 0; ++error_exit: ++ DBG_88E("%s, Open net dev failed\n", __func__); ++ return -1; ++} ++ ++static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) ++{ ++ struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); ++ struct adapter *padapter = dvobj->if1; ++ struct net_device *pnetdev = padapter->pnetdev; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ ++ int ret = 0; ++ u32 start_time = jiffies; ++ ++ ++ DBG_88E("==> %s (%s:%d)\n", __func__, current->comm, current->pid); ++ ++ if ((!padapter->bup) || (padapter->bDriverStopped) || ++ (padapter->bSurpriseRemoved)) { ++ DBG_88E("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", ++ padapter->bup, padapter->bDriverStopped, ++ padapter->bSurpriseRemoved); ++ goto exit; ++ } ++ ++ pwrpriv->bInSuspend = true; ++ rtw_cancel_all_timer(padapter); ++ LeaveAllPowerSaveMode(padapter); ++ ++ _enter_pwrlock(&pwrpriv->lock); ++ /* s1. */ ++ if (pnetdev) { ++ netif_carrier_off(pnetdev); ++ rtw_netif_stop_queue(pnetdev); ++ } ++ ++ /* s2. */ ++ rtw_disassoc_cmd(padapter, 0, false); ++ ++ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && ++ check_fwstate(pmlmepriv, _FW_LINKED)) { ++ DBG_88E("%s:%d %s(%pM), length:%d assoc_ssid.length:%d\n", ++ __func__, __LINE__, ++ pmlmepriv->cur_network.network.Ssid.Ssid, ++ pmlmepriv->cur_network.network.MacAddress, ++ pmlmepriv->cur_network.network.Ssid.SsidLength, ++ pmlmepriv->assoc_ssid.SsidLength); ++ ++ pmlmepriv->to_roaming = 1; ++ } ++ /* s2-2. indicate disconnect to os */ ++ rtw_indicate_disconnect(padapter); ++ /* s2-3. */ ++ rtw_free_assoc_resources(padapter, 1); ++ /* s2-4. */ ++ rtw_free_network_queue(padapter, true); ++ ++ rtw_dev_unload(padapter); ++ _exit_pwrlock(&pwrpriv->lock); ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) ++ rtw_indicate_scan_done(padapter, 1); ++ ++ if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) ++ rtw_indicate_disconnect(padapter); ++ ++exit: ++ DBG_88E("<=== %s return %d.............. in %dms\n", __func__ ++ , ret, rtw_get_passing_time_ms(start_time)); ++ ++ return ret; ++} ++ ++static int rtw_resume(struct usb_interface *pusb_intf) ++{ ++ struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); ++ struct adapter *padapter = dvobj->if1; ++ struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; ++ int ret = 0; ++ ++ if (pwrpriv->bInternalAutoSuspend) ++ ret = rtw_resume_process(padapter); ++ else ++ ret = rtw_resume_process(padapter); ++ return ret; ++} ++ ++int rtw_resume_process(struct adapter *padapter) ++{ ++ struct net_device *pnetdev; ++ struct pwrctrl_priv *pwrpriv = NULL; ++ int ret = -1; ++ u32 start_time = jiffies; ++ ++ DBG_88E("==> %s (%s:%d)\n", __func__, current->comm, current->pid); ++ ++ if (padapter) { ++ pnetdev = padapter->pnetdev; ++ pwrpriv = &padapter->pwrctrlpriv; ++ } else { ++ goto exit; ++ } ++ ++ _enter_pwrlock(&pwrpriv->lock); ++ rtw_reset_drv_sw(padapter); ++ if (pwrpriv) ++ pwrpriv->bkeepfwalive = false; ++ ++ DBG_88E("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive); ++ if (pm_netdev_open(pnetdev, true) != 0) ++ goto exit; ++ ++ netif_device_attach(pnetdev); ++ netif_carrier_on(pnetdev); ++ ++ _exit_pwrlock(&pwrpriv->lock); ++ ++ if (padapter->pid[1] != 0) { ++ DBG_88E("pid[1]:%d\n", padapter->pid[1]); ++ rtw_signal_process(padapter->pid[1], SIGUSR2); ++ } ++ ++ rtw_roaming(padapter, NULL); ++ ++ ret = 0; ++exit: ++ if (pwrpriv) ++ pwrpriv->bInSuspend = false; ++ DBG_88E("<=== %s return %d.............. in %dms\n", __func__, ++ ret, rtw_get_passing_time_ms(start_time)); ++ ++ ++ return ret; ++} ++ ++/* ++ * drv_init() - a device potentially for us ++ * ++ * notes: drv_init() is called when the bus driver has located ++ * a card for us to support. ++ * We accept the new device by returning 0. ++ */ ++ ++static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, ++ struct usb_interface *pusb_intf) ++{ ++ struct adapter *padapter = NULL; ++ struct net_device *pnetdev = NULL; ++ int status = _FAIL; ++ ++ padapter = vzalloc(sizeof(*padapter)); ++ if (!padapter) ++ goto exit; ++ padapter->dvobj = dvobj; ++ dvobj->if1 = padapter; ++ ++ padapter->bDriverStopped = true; ++ ++ padapter->hw_init_mutex = &usb_drv->hw_init_mutex; ++ ++ /* step 1-1., decide the chip_type via vid/pid */ ++ padapter->interface_type = RTW_USB; ++ chip_by_usb_id(padapter); ++ ++ if (rtw_handle_dualmac(padapter, 1) != _SUCCESS) ++ goto free_adapter; ++ ++ pnetdev = rtw_init_netdev(padapter); ++ if (!pnetdev) ++ goto handle_dualmac; ++ SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); ++ padapter = rtw_netdev_priv(pnetdev); ++ ++ /* step 2. hook HalFunc, allocate HalData */ ++ rtl8188eu_set_hal_ops(padapter); ++ ++ padapter->intf_start = &usb_intf_start; ++ padapter->intf_stop = &usb_intf_stop; ++ ++ /* step init_io_priv */ ++ rtw_init_io_priv(padapter, usb_set_intf_ops); ++ ++ /* step read_chip_version */ ++ rtw_hal_read_chip_version(padapter); ++ ++ /* step usb endpoint mapping */ ++ rtw_hal_chip_configure(padapter); ++ ++ /* step read efuse/eeprom data and get mac_addr */ ++ rtw_hal_read_chip_info(padapter); ++ ++ /* step 5. */ ++ if (rtw_init_drv_sw(padapter) == _FAIL) ++ goto free_hal_data; ++ ++#ifdef CONFIG_PM ++ if (padapter->pwrctrlpriv.bSupportRemoteWakeup) { ++ dvobj->pusbdev->do_remote_wakeup = 1; ++ pusb_intf->needs_remote_wakeup = 1; ++ device_init_wakeup(&pusb_intf->dev, 1); ++ DBG_88E("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n", ++ device_may_wakeup(&pusb_intf->dev)); ++ } ++#endif ++ ++ /* 2012-07-11 Move here to prevent the 8723AS-VAU BT auto ++ * suspend influence */ ++ if (usb_autopm_get_interface(pusb_intf) < 0) ++ DBG_88E("can't get autopm:\n"); ++ ++ /* alloc dev name after read efuse. */ ++ rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname); ++ rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); ++#ifdef CONFIG_88EU_P2P ++ rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, ++ padapter->eeprompriv.mac_addr); ++#endif ++ memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); ++ DBG_88E("MAC Address from pnetdev->dev_addr = %pM\n", ++ pnetdev->dev_addr); ++ ++ /* step 6. Tell the network stack we exist */ ++ if (register_netdev(pnetdev) != 0) ++ goto free_hal_data; ++ ++ DBG_88E("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" ++ , padapter->bDriverStopped ++ , padapter->bSurpriseRemoved ++ , padapter->bup ++ , padapter->hw_init_completed ++ ); ++ ++ status = _SUCCESS; ++ ++free_hal_data: ++ if (status != _SUCCESS) ++ kfree(padapter->HalData); ++handle_dualmac: ++ if (status != _SUCCESS) ++ rtw_handle_dualmac(padapter, 0); ++free_adapter: ++ if (status != _SUCCESS) { ++ if (pnetdev) ++ rtw_free_netdev(pnetdev); ++ else if (padapter) ++ vfree(padapter); ++ padapter = NULL; ++ } ++exit: ++ return padapter; ++} ++ ++static void rtw_usb_if1_deinit(struct adapter *if1) ++{ ++ struct net_device *pnetdev = if1->pnetdev; ++ struct mlme_priv *pmlmepriv = &if1->mlmepriv; ++ ++ if (check_fwstate(pmlmepriv, _FW_LINKED)) ++ rtw_disassoc_cmd(if1, 0, false); ++ ++#ifdef CONFIG_88EU_AP_MODE ++ free_mlme_ap_info(if1); ++#endif ++ ++ if (if1->DriverState != DRIVER_DISAPPEAR) { ++ if (pnetdev) { ++ /* will call netdev_close() */ ++ unregister_netdev(pnetdev); ++ rtw_proc_remove_one(pnetdev); ++ } ++ } ++ rtw_cancel_all_timer(if1); ++ ++ rtw_dev_unload(if1); ++ DBG_88E("+r871xu_dev_remove, hw_init_completed=%d\n", ++ if1->hw_init_completed); ++ rtw_handle_dualmac(if1, 0); ++ rtw_free_drv_sw(if1); ++ if (pnetdev) ++ rtw_free_netdev(pnetdev); ++} ++ ++static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid) ++{ ++ struct adapter *if1 = NULL; ++ struct dvobj_priv *dvobj; ++ ++ /* step 0. */ ++ process_spec_devid(pdid); ++ ++ /* Initialize dvobj_priv */ ++ dvobj = usb_dvobj_init(pusb_intf); ++ if (!dvobj) ++ goto err; ++ ++ if1 = rtw_usb_if1_init(dvobj, pusb_intf); ++ if (!if1) { ++ DBG_88E("rtw_init_primarystruct adapter Failed!\n"); ++ goto free_dvobj; ++ } ++ ++ if (ui_pid[1] != 0) { ++ DBG_88E("ui_pid[1]:%d\n", ui_pid[1]); ++ rtw_signal_process(ui_pid[1], SIGUSR2); ++ } ++ ++ return 0; ++ ++free_dvobj: ++ usb_dvobj_deinit(pusb_intf); ++err: ++ return -ENODEV; ++} ++ ++/* ++ * dev_remove() - our device is being removed ++*/ ++/* rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both */ ++static void rtw_dev_remove(struct usb_interface *pusb_intf) ++{ ++ struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); ++ struct adapter *padapter = dvobj->if1; ++ ++ DBG_88E("+rtw_dev_remove\n"); ++ ++ if (usb_drv->drv_registered) ++ padapter->bSurpriseRemoved = true; ++ ++ rtw_pm_set_ips(padapter, IPS_NONE); ++ rtw_pm_set_lps(padapter, PS_MODE_ACTIVE); ++ ++ LeaveAllPowerSaveMode(padapter); ++ ++ rtw_usb_if1_deinit(padapter); ++ ++ usb_dvobj_deinit(pusb_intf); ++ ++ DBG_88E("-r871xu_dev_remove, done\n"); ++} ++ ++static int __init rtw_drv_entry(void) ++{ ++ DBG_88E(DRV_NAME " driver version=%s\n", DRIVERVERSION); ++ ++ _rtw_mutex_init(&usb_drv->hw_init_mutex); ++ ++ usb_drv->drv_registered = true; ++ return usb_register(&usb_drv->usbdrv); ++} ++ ++static void __exit rtw_drv_halt(void) ++{ ++ DBG_88E("+rtw_drv_halt\n"); ++ ++ usb_drv->drv_registered = false; ++ usb_deregister(&usb_drv->usbdrv); ++ ++ _rtw_mutex_free(&usb_drv->hw_init_mutex); ++ DBG_88E("-rtw_drv_halt\n"); ++} ++ ++module_init(rtw_drv_entry); ++module_exit(rtw_drv_halt); +diff --git a/drivers/staging/r8188eu/os_dep/usb_ops_linux.c b/drivers/staging/r8188eu/os_dep/usb_ops_linux.c +new file mode 100644 +index 000000000000..62dd4a131534 +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/usb_ops_linux.c +@@ -0,0 +1,253 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _USB_OPS_LINUX_C_ ++ ++#include "../include/drv_types.h" ++#include "../include/usb_ops_linux.h" ++#include "../include/rtw_sreset.h" ++ ++unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) ++{ ++ unsigned int pipe = 0, ep_num = 0; ++ struct usb_device *pusbd = pdvobj->pusbdev; ++ ++ if (addr == RECV_BULK_IN_ADDR) { ++ pipe = usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]); ++ } else if (addr == RECV_INT_IN_ADDR) { ++ pipe = usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]); ++ } else if (addr < HW_QUEUE_ENTRY) { ++ ep_num = pdvobj->Queue2Pipe[addr]; ++ pipe = usb_sndbulkpipe(pusbd, ep_num); ++ } ++ ++ return pipe; ++} ++ ++struct zero_bulkout_context { ++ void *pbuf; ++ void *purb; ++ void *pirp; ++ void *padapter; ++}; ++ ++void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) ++{ ++} ++ ++void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) ++{ ++} ++ ++void usb_read_port_cancel(struct intf_hdl *pintfhdl) ++{ ++ int i; ++ struct recv_buf *precvbuf; ++ struct adapter *padapter = pintfhdl->padapter; ++ precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; ++ ++ DBG_88E("%s\n", __func__); ++ ++ padapter->bReadPortCancel = true; ++ ++ for (i = 0; i < NR_RECVBUFF; i++) { ++ precvbuf->reuse = true; ++ if (precvbuf->purb) ++ usb_kill_urb(precvbuf->purb); ++ precvbuf++; ++ } ++} ++ ++static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) ++{ ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; ++ struct adapter *padapter = pxmitbuf->padapter; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct hal_data_8188e *haldata; ++ ++ switch (pxmitbuf->flags) { ++ case VO_QUEUE_INX: ++ pxmitpriv->voq_cnt--; ++ break; ++ case VI_QUEUE_INX: ++ pxmitpriv->viq_cnt--; ++ break; ++ case BE_QUEUE_INX: ++ pxmitpriv->beq_cnt--; ++ break; ++ case BK_QUEUE_INX: ++ pxmitpriv->bkq_cnt--; ++ break; ++ case HIGH_QUEUE_INX: ++#ifdef CONFIG_88EU_AP_MODE ++ rtw_chk_hi_queue_cmd(padapter); ++#endif ++ break; ++ default: ++ break; ++ } ++ ++ if (padapter->bSurpriseRemoved || padapter->bDriverStopped || ++ padapter->bWritePortCancel) { ++ DBG_88E("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->ext_tag(%x)\n", ++ __func__, padapter->bDriverStopped, ++ padapter->bSurpriseRemoved, padapter->bReadPortCancel, ++ pxmitbuf->ext_tag); ++ ++ goto check_completion; ++ } ++ ++ if (purb->status) { ++ DBG_88E("###=> urb_write_port_complete status(%d)\n", purb->status); ++ if ((purb->status == -EPIPE) || (purb->status == -EPROTO)) { ++ sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL); ++ } else if (purb->status == -EINPROGRESS) { ++ goto check_completion; ++ } else if (purb->status == -ENOENT) { ++ DBG_88E("%s: -ENOENT\n", __func__); ++ goto check_completion; ++ } else if (purb->status == -ECONNRESET) { ++ DBG_88E("%s: -ECONNRESET\n", __func__); ++ goto check_completion; ++ } else if (purb->status == -ESHUTDOWN) { ++ padapter->bDriverStopped = true; ++ goto check_completion; ++ } else { ++ padapter->bSurpriseRemoved = true; ++ DBG_88E("bSurpriseRemoved = true\n"); ++ ++ goto check_completion; ++ } ++ } ++ ++ haldata = GET_HAL_DATA(padapter); ++ haldata->srestpriv.last_tx_complete_time = jiffies; ++ ++check_completion: ++ rtw_sctx_done_err(&pxmitbuf->sctx, ++ purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : ++ RTW_SCTX_DONE_SUCCESS); ++ ++ rtw_free_xmitbuf(pxmitpriv, pxmitbuf); ++ ++ tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); ++ ++} ++ ++u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) ++{ ++ unsigned long irqL; ++ unsigned int pipe; ++ int status; ++ u32 ret = _FAIL; ++ struct urb *purb = NULL; ++ struct adapter *padapter = (struct adapter *)pintfhdl->padapter; ++ struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; ++ struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; ++ struct usb_device *pusbd = pdvobj->pusbdev; ++ ++ if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) || ++ (padapter->pwrctrlpriv.pnp_bstop_trx)) { ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); ++ goto exit; ++ } ++ ++ spin_lock_irqsave(&pxmitpriv->lock, irqL); ++ ++ switch (addr) { ++ case VO_QUEUE_INX: ++ pxmitpriv->voq_cnt++; ++ pxmitbuf->flags = VO_QUEUE_INX; ++ break; ++ case VI_QUEUE_INX: ++ pxmitpriv->viq_cnt++; ++ pxmitbuf->flags = VI_QUEUE_INX; ++ break; ++ case BE_QUEUE_INX: ++ pxmitpriv->beq_cnt++; ++ pxmitbuf->flags = BE_QUEUE_INX; ++ break; ++ case BK_QUEUE_INX: ++ pxmitpriv->bkq_cnt++; ++ pxmitbuf->flags = BK_QUEUE_INX; ++ break; ++ case HIGH_QUEUE_INX: ++ pxmitbuf->flags = HIGH_QUEUE_INX; ++ break; ++ default: ++ pxmitbuf->flags = MGT_QUEUE_INX; ++ break; ++ } ++ ++ spin_unlock_irqrestore(&pxmitpriv->lock, irqL); ++ ++ purb = pxmitbuf->pxmit_urb[0]; ++ ++ /* translate DMA FIFO addr to pipehandle */ ++ pipe = ffaddr2pipehdl(pdvobj, addr); ++ ++ usb_fill_bulk_urb(purb, pusbd, pipe, ++ pxmitframe->buf_addr, /* pxmitbuf->pbuf */ ++ cnt, ++ usb_write_port_complete, ++ pxmitbuf);/* context is pxmitbuf */ ++ ++ status = usb_submit_urb(purb, GFP_ATOMIC); ++ if (!status) { ++ struct hal_data_8188e *haldata = GET_HAL_DATA(padapter); ++ ++ haldata->srestpriv.last_tx_time = jiffies; ++ } else { ++ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); ++ DBG_88E("usb_write_port, status =%d\n", status); ++ ++ switch (status) { ++ case -ENODEV: ++ padapter->bDriverStopped = true; ++ break; ++ default: ++ break; ++ } ++ goto exit; ++ } ++ ++ ret = _SUCCESS; ++ ++/* We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. */ ++ ++exit: ++ if (ret != _SUCCESS) ++ rtw_free_xmitbuf(pxmitpriv, pxmitbuf); ++ ++ return ret; ++} ++ ++void usb_write_port_cancel(struct intf_hdl *pintfhdl) ++{ ++ int i, j; ++ struct adapter *padapter = pintfhdl->padapter; ++ struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; ++ ++ DBG_88E("%s\n", __func__); ++ ++ padapter->bWritePortCancel = true; ++ ++ for (i = 0; i < NR_XMITBUFF; i++) { ++ for (j = 0; j < 8; j++) { ++ if (pxmitbuf->pxmit_urb[j]) ++ usb_kill_urb(pxmitbuf->pxmit_urb[j]); ++ } ++ pxmitbuf++; ++ } ++ ++ pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmit_extbuf; ++ for (i = 0; i < NR_XMIT_EXTBUFF; i++) { ++ for (j = 0; j < 8; j++) { ++ if (pxmitbuf->pxmit_urb[j]) ++ usb_kill_urb(pxmitbuf->pxmit_urb[j]); ++ } ++ pxmitbuf++; ++ } ++} +diff --git a/drivers/staging/r8188eu/os_dep/xmit_linux.c b/drivers/staging/r8188eu/os_dep/xmit_linux.c +new file mode 100644 +index 000000000000..565ac5be7db3 +--- /dev/null ++++ b/drivers/staging/r8188eu/os_dep/xmit_linux.c +@@ -0,0 +1,251 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* Copyright(c) 2007 - 2012 Realtek Corporation. */ ++ ++#define _XMIT_OSDEP_C_ ++ ++#include "../include/osdep_service.h" ++#include "../include/drv_types.h" ++#include "../include/wifi.h" ++#include "../include/mlme_osdep.h" ++#include "../include/xmit_osdep.h" ++#include "../include/osdep_intf.h" ++#include "../include/usb_osintf.h" ++ ++uint rtw_remainder_len(struct pkt_file *pfile) ++{ ++ return pfile->buf_len - ((size_t)(pfile->cur_addr) - ++ (size_t)(pfile->buf_start)); ++} ++ ++void _rtw_open_pktfile(struct sk_buff *pktptr, struct pkt_file *pfile) ++{ ++ ++ if (!pktptr) { ++ pr_err("8188eu: pktptr is NULL\n"); ++ return; ++ } ++ if (!pfile) { ++ pr_err("8188eu: pfile is NULL\n"); ++ return; ++ } ++ pfile->pkt = pktptr; ++ pfile->cur_addr = pktptr->data; ++ pfile->buf_start = pktptr->data; ++ pfile->pkt_len = pktptr->len; ++ pfile->buf_len = pktptr->len; ++ ++ pfile->cur_buffer = pfile->buf_start; ++ ++} ++ ++uint _rtw_pktfile_read(struct pkt_file *pfile, u8 *rmem, uint rlen) ++{ ++ uint len = 0; ++ ++ len = rtw_remainder_len(pfile); ++ len = (rlen > len) ? len : rlen; ++ ++ if (rmem) ++ skb_copy_bits(pfile->pkt, pfile->buf_len - pfile->pkt_len, rmem, len); ++ ++ pfile->cur_addr += len; ++ pfile->pkt_len -= len; ++ ++ return len; ++} ++ ++int rtw_endofpktfile(struct pkt_file *pfile) ++{ ++ ++ if (pfile->pkt_len == 0) { ++ ++ return true; ++ } ++ ++ return false; ++} ++ ++void rtw_set_tx_chksum_offload(struct sk_buff *pkt, struct pkt_attrib *pattrib) ++{ ++} ++ ++int rtw_os_xmit_resource_alloc(struct adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz) ++{ ++ int i; ++ ++ pxmitbuf->pallocated_buf = kzalloc(alloc_sz, GFP_KERNEL); ++ if (!pxmitbuf->pallocated_buf) ++ return _FAIL; ++ ++ pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); ++ pxmitbuf->dma_transfer_addr = 0; ++ ++ for (i = 0; i < 8; i++) { ++ pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); ++ if (!pxmitbuf->pxmit_urb[i]) { ++ DBG_88E("pxmitbuf->pxmit_urb[i]==NULL"); ++ return _FAIL; ++ } ++ } ++ return _SUCCESS; ++} ++ ++void rtw_os_xmit_resource_free(struct adapter *padapter, ++ struct xmit_buf *pxmitbuf, u32 free_sz) ++{ ++ int i; ++ ++ for (i = 0; i < 8; i++) ++ usb_free_urb(pxmitbuf->pxmit_urb[i]); ++ ++ kfree(pxmitbuf->pallocated_buf); ++} ++ ++#define WMM_XMIT_THRESHOLD (NR_XMITFRAME * 2 / 5) ++ ++void rtw_os_pkt_complete(struct adapter *padapter, struct sk_buff *pkt) ++{ ++ u16 queue; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ ++ queue = skb_get_queue_mapping(pkt); ++ if (padapter->registrypriv.wifi_spec) { ++ if (__netif_subqueue_stopped(padapter->pnetdev, queue) && ++ (pxmitpriv->hwxmits[queue].accnt < WMM_XMIT_THRESHOLD)) ++ netif_wake_subqueue(padapter->pnetdev, queue); ++ } else { ++ if (__netif_subqueue_stopped(padapter->pnetdev, queue)) ++ netif_wake_subqueue(padapter->pnetdev, queue); ++ } ++ ++ dev_kfree_skb_any(pkt); ++} ++ ++void rtw_os_xmit_complete(struct adapter *padapter, struct xmit_frame *pxframe) ++{ ++ if (pxframe->pkt) ++ rtw_os_pkt_complete(padapter, pxframe->pkt); ++ pxframe->pkt = NULL; ++} ++ ++void rtw_os_xmit_schedule(struct adapter *padapter) ++{ ++ struct xmit_priv *pxmitpriv; ++ ++ if (!padapter) ++ return; ++ ++ pxmitpriv = &padapter->xmitpriv; ++ ++ spin_lock_bh(&pxmitpriv->lock); ++ ++ if (rtw_txframes_pending(padapter)) ++ tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); ++ ++ spin_unlock_bh(&pxmitpriv->lock); ++} ++ ++static void rtw_check_xmit_resource(struct adapter *padapter, struct sk_buff *pkt) ++{ ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ u16 queue; ++ ++ queue = skb_get_queue_mapping(pkt); ++ if (padapter->registrypriv.wifi_spec) { ++ /* No free space for Tx, tx_worker is too slow */ ++ if (pxmitpriv->hwxmits[queue].accnt > WMM_XMIT_THRESHOLD) ++ netif_stop_subqueue(padapter->pnetdev, queue); ++ } else { ++ if (pxmitpriv->free_xmitframe_cnt <= 4) { ++ if (!netif_tx_queue_stopped(netdev_get_tx_queue(padapter->pnetdev, queue))) ++ netif_stop_subqueue(padapter->pnetdev, queue); ++ } ++ } ++} ++ ++static int rtw_mlcst2unicst(struct adapter *padapter, struct sk_buff *skb) ++{ ++ struct sta_priv *pstapriv = &padapter->stapriv; ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct list_head *phead, *plist; ++ struct sk_buff *newskb; ++ struct sta_info *psta = NULL; ++ s32 res; ++ ++ spin_lock_bh(&pstapriv->asoc_list_lock); ++ phead = &pstapriv->asoc_list; ++ plist = phead->next; ++ ++ /* free sta asoc_queue */ ++ while (phead != plist) { ++ psta = container_of(plist, struct sta_info, asoc_list); ++ ++ plist = plist->next; ++ ++ /* avoid come from STA1 and send back STA1 */ ++ if (!memcmp(psta->hwaddr, &skb->data[6], 6)) ++ continue; ++ ++ newskb = skb_copy(skb, GFP_ATOMIC); ++ ++ if (newskb) { ++ memcpy(newskb->data, psta->hwaddr, 6); ++ res = rtw_xmit(padapter, &newskb); ++ if (res < 0) { ++ DBG_88E("%s()-%d: rtw_xmit() return error!\n", __func__, __LINE__); ++ pxmitpriv->tx_drop++; ++ dev_kfree_skb_any(newskb); ++ } else { ++ pxmitpriv->tx_pkts++; ++ } ++ } else { ++ DBG_88E("%s-%d: skb_copy() failed!\n", __func__, __LINE__); ++ pxmitpriv->tx_drop++; ++ ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ return false; /* Caller shall tx this multicast frame via normal way. */ ++ } ++ } ++ ++ spin_unlock_bh(&pstapriv->asoc_list_lock); ++ dev_kfree_skb_any(skb); ++ return true; ++} ++ ++int rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev) ++{ ++ struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); ++ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ s32 res = 0; ++ ++ if (!rtw_if_up(padapter)) ++ goto drop_packet; ++ ++ rtw_check_xmit_resource(padapter, pkt); ++ ++ if (!rtw_mc2u_disable && check_fwstate(pmlmepriv, WIFI_AP_STATE) && ++ (IP_MCAST_MAC(pkt->data) || ICMPV6_MCAST_MAC(pkt->data)) && ++ (padapter->registrypriv.wifi_spec == 0)) { ++ if (pxmitpriv->free_xmitframe_cnt > (NR_XMITFRAME / 4)) { ++ res = rtw_mlcst2unicst(padapter, pkt); ++ if (res) ++ goto exit; ++ } ++ } ++ ++ res = rtw_xmit(padapter, &pkt); ++ if (res < 0) ++ goto drop_packet; ++ ++ pxmitpriv->tx_pkts++; ++ goto exit; ++ ++drop_packet: ++ pxmitpriv->tx_drop++; ++ dev_kfree_skb_any(pkt); ++ ++exit: ++ ++ return 0; ++} diff --git a/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-20231117.patch b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-20231117.patch new file mode 100644 index 0000000000..0ebc0c6aca --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-20231117.patch @@ -0,0 +1,1720 @@ +From 8bb11a9489a5af4f23949f0109bf40d65d787095 Mon Sep 17 00:00:00 2001 +From: kimocoder +Date: Tue, 6 Jun 2023 17:50:45 +0200 +Subject: [PATCH 01/13] Revert "Some cleanup of unused chips" + +This reverts commit b3227c731ec957b706f8eb2ebcf42ba1c2f0d610. +--- + drivers/staging/rtl8812au/hal/hal_com.c | 280 ++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_intf.c | 18 ++ + drivers/staging/rtl8812au/hal/hal_mp.c | 27 ++ + .../hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c | 18 +- + .../hal/phydm/rtl8814a/halphyrf_8814a_ap.c | 28 +- + .../rtl8812au/hal/rtl8814a/usb/usb_halinit.c | 30 +- + .../staging/rtl8812au/include/gspi_osintf.h | 7 + + .../staging/rtl8812au/include/rtl8812a_recv.h | 4 + + .../staging/rtl8812au/include/rtl8814a_recv.h | 4 + + drivers/staging/rtl8812au/include/rtw_cmd.h | 9 +- + drivers/staging/rtl8812au/include/rtw_debug.h | 4 + + drivers/staging/rtl8812au/include/rtw_recv.h | 36 ++- + drivers/staging/rtl8812au/include/rtw_xmit.h | 5 + + .../staging/rtl8812au/include/sdio_osintf.h | 7 + + .../staging/rtl8812au/os_dep/osdep_service.c | 31 ++ + 15 files changed, 478 insertions(+), 30 deletions(-) + +diff --git a/drivers/staging/rtl8812au/hal/hal_com.c b/drivers/staging/rtl8812au/hal/hal_com.c +index 3b7d7dc52..b3b1e16c8 100644 +--- a/drivers/staging/rtl8812au/hal/hal_com.c ++++ b/drivers/staging/rtl8812au/hal/hal_com.c +@@ -4330,6 +4330,28 @@ s32 rtw_hal_set_FwMediaStatusRpt_cmd(_adapter *adapter, bool opmode, bool miraca + if (ret != _SUCCESS) + goto exit; + ++#if defined(CONFIG_RTL8188E) ++ if (rtw_get_chip_type(adapter) == RTL8188E) { ++ HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); ++ ++ /* 8188E FW doesn't set macid no link, driver does it by self */ ++ if (opmode) ++ rtw_hal_set_hwreg(adapter, HW_VAR_MACID_LINK, &macid); ++ else ++ rtw_hal_set_hwreg(adapter, HW_VAR_MACID_NOLINK, &macid); ++ ++ /* for 8188E RA */ ++#if (RATE_ADAPTIVE_SUPPORT == 1) ++ if (hal_data->fw_ractrl == _FALSE) { ++ u8 max_macid; ++ ++ max_macid = rtw_search_max_mac_id(adapter); ++ rtw_hal_set_hwreg(adapter, HW_VAR_TX_RPT_MAX_MACID, &max_macid); ++ } ++#endif ++ } ++#endif ++ + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + /* TODO: this should move to IOT issue area */ + if (rtw_get_chip_type(adapter) == RTL8812 +@@ -4734,6 +4756,21 @@ static void rtw_hal_force_enable_rxdma(_adapter *adapter) + rtw_write32(adapter, REG_RXPKT_NUM, + (rtw_read32(adapter, REG_RXPKT_NUM) & (~RW_RELEASE_EN))); + } ++#if defined(CONFIG_RTL8188E) ++static void rtw_hal_disable_tx_report(_adapter *adapter) ++{ ++ rtw_write8(adapter, REG_TX_RPT_CTRL, ++ ((rtw_read8(adapter, REG_TX_RPT_CTRL) & ~BIT(1))) & ~BIT(5)); ++ RTW_INFO("disable TXRPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL)); ++} ++ ++static void rtw_hal_enable_tx_report(_adapter *adapter) ++{ ++ rtw_write8(adapter, REG_TX_RPT_CTRL, ++ ((rtw_read8(adapter, REG_TX_RPT_CTRL) | BIT(1))) | BIT(5)); ++ RTW_INFO("enable TX_RPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL)); ++} ++#endif + static void rtw_hal_release_rx_dma(_adapter *adapter) + { + u32 val32 = 0; +@@ -5819,6 +5856,10 @@ static void rtw_hal_ap_wow_enable(_adapter *padapter) + issue_beacon(padapter, 0); + + rtw_msleep_os(2); ++ #if defined(CONFIG_RTL8188E) ++ if (IS_HARDWARE_TYPE_8188E(padapter)) ++ rtw_hal_disable_tx_report(padapter); ++ #endif + /* RX DMA stop */ + res = rtw_hal_pause_rx_dma(padapter); + if (res == _FAIL) +@@ -5879,6 +5920,11 @@ static void rtw_hal_ap_wow_disable(_adapter *padapter) + } + #endif /*DBG_CHECK_FW_PS_STATE*/ + ++ #if defined(CONFIG_RTL8188E) ++ if (IS_HARDWARE_TYPE_8188E(padapter)) ++ rtw_hal_enable_tx_report(padapter); ++ #endif ++ + rtw_hal_force_enable_rxdma(padapter); + + rtw_hal_fw_dl(padapter, _FALSE); +@@ -9558,6 +9604,10 @@ static void rtw_hal_wow_enable(_adapter *adapter) + (u8 *)&media_status_rpt); + + /* RX DMA stop */ ++ #if defined(CONFIG_RTL8188E) ++ if (IS_HARDWARE_TYPE_8188E(adapter)) ++ rtw_hal_disable_tx_report(adapter); ++ #endif + + res = rtw_hal_pause_rx_dma(adapter); + if (res == _FAIL) +@@ -9746,6 +9796,11 @@ static void rtw_hal_wow_disable(_adapter *adapter) + #endif + rtw_hal_release_rx_dma(adapter); + ++ #if defined(CONFIG_RTL8188E) ++ if (IS_HARDWARE_TYPE_8188E(adapter)) ++ rtw_hal_enable_tx_report(adapter); ++ #endif ++ + if ((pwrctl->wowlan_wake_reason != RX_DISASSOC) && + (pwrctl->wowlan_wake_reason != RX_DEAUTH) && + (pwrctl->wowlan_wake_reason != FW_DECISION_DISCONNECT)) { +@@ -12549,6 +12604,61 @@ int hal_efuse_macaddr_offset(_adapter *adapter) + interface_type = rtw_get_intf_type(adapter); + + switch (rtw_get_chip_type(adapter)) { ++#ifdef CONFIG_RTL8723B ++ case RTL8723B: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8723BU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8723BS; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8723BE; ++ break; ++#endif ++#ifdef CONFIG_RTL8703B ++ case RTL8703B: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8703BU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8703BS; ++ break; ++#endif ++#ifdef CONFIG_RTL8723D ++ case RTL8723D: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8723DU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8723DS; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8723DE; ++ break; ++#endif ++ ++#ifdef CONFIG_RTL8188E ++ case RTL8188E: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_88EU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_88ES; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_88EE; ++ break; ++#endif ++#ifdef CONFIG_RTL8188F ++ case RTL8188F: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8188FU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8188FS; ++ break; ++#endif ++#ifdef CONFIG_RTL8188GTV ++ case RTL8188GTV: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8188GTVU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8188GTVS; ++ break; ++#endif + #ifdef CONFIG_RTL8812A + case RTL8812: + if (interface_type == RTW_USB) +@@ -12567,6 +12677,16 @@ int hal_efuse_macaddr_offset(_adapter *adapter) + addr_offset = EEPROM_MAC_ADDR_8821AE; + break; + #endif ++#ifdef CONFIG_RTL8192E ++ case RTL8192E: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8192EU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8192ES; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8192EE; ++ break; ++#endif + #ifdef CONFIG_RTL8814A + case RTL8814A: + if (interface_type == RTW_USB) +@@ -12576,6 +12696,46 @@ int hal_efuse_macaddr_offset(_adapter *adapter) + break; + #endif + ++#ifdef CONFIG_RTL8822B ++ case RTL8822B: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8822BU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8822BS; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8822BE; ++ break; ++#endif /* CONFIG_RTL8822B */ ++ ++#ifdef CONFIG_RTL8821C ++ case RTL8821C: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8821CU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8821CS; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8821CE; ++ break; ++#endif /* CONFIG_RTL8821C */ ++ ++#ifdef CONFIG_RTL8710B ++ case RTL8710B: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8710B; ++ break; ++#endif ++ ++#ifdef CONFIG_RTL8192F ++ case RTL8192F: ++ if (interface_type == RTW_USB) ++ addr_offset = EEPROM_MAC_ADDR_8192FU; ++ else if (interface_type == RTW_SDIO) ++ addr_offset = EEPROM_MAC_ADDR_8192FS; ++ else if (interface_type == RTW_PCIE) ++ addr_offset = EEPROM_MAC_ADDR_8192FE; ++ break; ++#endif /* CONFIG_RTL8192F */ ++ + } + + if (addr_offset == -1) { +@@ -12793,6 +12953,32 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) + } else + RTW_INFO("Using the default RF gain.\n"); + ++#elif defined(CONFIG_RTL8188E) ++ if (value & BIT4 && (registry_par->RegPwrTrimEnable == 1)) { ++ RTW_INFO("8188ES Offset RF Gain.\n"); ++ RTW_INFO("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n", ++ pHalData->EEPROMRFGainVal); ++ ++ if (pHalData->EEPROMRFGainVal != 0xff) { ++ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, ++ REG_RF_BB_GAIN_OFFSET, 0xffffffff); ++ ++ RTW_INFO("Offset RF Gain. reg 0x55=0x%x\n", res); ++ res &= 0xfff87fff; ++ ++ res |= (pHalData->EEPROMRFGainVal & 0x0f) << 15; ++ RTW_INFO("Offset RF Gain. res=0x%x\n", res); ++ ++ rtw_hal_write_rfreg(padapter, RF_PATH_A, ++ REG_RF_BB_GAIN_OFFSET, ++ RF_GAIN_OFFSET_MASK, res); ++ } else { ++ RTW_INFO("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n", ++ pHalData->EEPROMRFGainVal); ++ } ++ } else ++ RTW_INFO("Using the default RF gain.\n"); ++#else + /* TODO: call this when channel switch */ + if (kfree_data->flag & KFREE_FLAG_ON) + rtw_rf_apply_tx_gain_offset(padapter, 6); /* input ch6 to select BB_GAIN_2G */ +@@ -13524,8 +13710,14 @@ u8 rtw_get_current_tx_sgi(_adapter *padapter, struct sta_info *psta) + return curr_tx_sgi; + + if (padapter->fix_rate == 0xff) { ++#if defined(CONFIG_RTL8188E) ++#if (RATE_ADAPTIVE_SUPPORT == 1) ++ curr_tx_sgi = hal_data->odmpriv.ra_info[psta->cmn.mac_id].rate_sgi; ++#endif /* (RATE_ADAPTIVE_SUPPORT == 1)*/ ++#else + ra_info = &psta->cmn.ra_info; + curr_tx_sgi = ((ra_info->curr_tx_rate) & 0x80) >> 7; ++#endif + } else { + curr_tx_sgi = ((padapter->fix_rate) & 0x80) >> 7; + } +@@ -13543,8 +13735,14 @@ u8 rtw_get_current_tx_rate(_adapter *padapter, struct sta_info *psta) + return rate_id; + + if (padapter->fix_rate == 0xff) { ++#if defined(CONFIG_RTL8188E) ++#if (RATE_ADAPTIVE_SUPPORT == 1) ++ rate_id = hal_data->odmpriv.ra_info[psta->cmn.mac_id].decision_rate; ++#endif /* (RATE_ADAPTIVE_SUPPORT == 1)*/ ++#else + ra_info = &psta->cmn.ra_info; + rate_id = ra_info->curr_tx_rate & 0x7f; ++#endif + } else { + rate_id = padapter->fix_rate & 0x7f; + } +@@ -13628,6 +13826,14 @@ void hal_set_crystal_cap(_adapter *adapter, u8 crystal_cap) + crystal_cap = crystal_cap & 0x3F; + + switch (rtw_get_chip_type(adapter)) { ++#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV) ++ case RTL8188E: ++ case RTL8188F: ++ case RTL8188GTV: ++ /* write 0x24[16:11] = 0x24[22:17] = CrystalCap */ ++ phy_set_bb_reg(adapter, REG_AFE_XTAL_CTRL, 0x007FF800, (crystal_cap | (crystal_cap << 6))); ++ break; ++#endif + #if defined(CONFIG_RTL8812A) + case RTL8812: + /* write 0x2C[30:25] = 0x2C[24:19] = CrystalCap */ +@@ -13651,6 +13857,25 @@ void hal_set_crystal_cap(_adapter *adapter, u8 crystal_cap) + /* write 0x2C[26:21] = 0x2C[20:15] = CrystalCap*/ + phy_set_bb_reg(adapter, REG_MAC_PHY_CTRL, 0x07FF8000, (crystal_cap | (crystal_cap << 6))); + break; ++#endif ++#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8192F) ++ ++ case RTL8822B: ++ case RTL8821C: ++ case RTL8192F: ++ /* write 0x28[6:1] = 0x24[30:25] = CrystalCap */ ++ crystal_cap = crystal_cap & 0x3F; ++ phy_set_bb_reg(adapter, REG_AFE_XTAL_CTRL, 0x7E000000, crystal_cap); ++ phy_set_bb_reg(adapter, REG_AFE_PLL_CTRL, 0x7E, crystal_cap); ++ break; ++#endif ++#if defined(CONFIG_RTL8710B) ++ case RTL8710B: ++ /*Change by ylb 20160728, Becase 0x2C[23:12] is removed to syson 0x60[29:18] */ ++ /* 0x2C[23:18] = 0x2C[29:24] = CrystalCap //Xo:[29:24], Xi:[23:18]*/ ++ crystal_cap = crystal_cap & 0x3F; ++ hal_set_syson_reg(adapter, REG_SYS_XTAL_CTRL0, 0x3FFC0000, (crystal_cap | (crystal_cap << 6))); ++ break; + #endif + default: + rtw_warn_on(1); +@@ -13665,6 +13890,36 @@ int hal_spec_init(_adapter *adapter) + interface_type = rtw_get_intf_type(adapter); + + switch (rtw_get_chip_type(adapter)) { ++#ifdef CONFIG_RTL8723B ++ case RTL8723B: ++ init_hal_spec_8723b(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8703B ++ case RTL8703B: ++ init_hal_spec_8703b(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8723D ++ case RTL8723D: ++ init_hal_spec_8723d(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8188E ++ case RTL8188E: ++ init_hal_spec_8188e(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8188F ++ case RTL8188F: ++ init_hal_spec_8188f(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8188GTV ++ case RTL8188GTV: ++ init_hal_spec_8188gtv(adapter); ++ break; ++#endif + #ifdef CONFIG_RTL8812A + case RTL8812: + init_hal_spec_8812a(adapter); +@@ -13675,11 +13930,36 @@ int hal_spec_init(_adapter *adapter) + init_hal_spec_8821a(adapter); + break; + #endif ++#ifdef CONFIG_RTL8192E ++ case RTL8192E: ++ init_hal_spec_8192e(adapter); ++ break; ++#endif + #ifdef CONFIG_RTL8814A + case RTL8814A: + init_hal_spec_8814a(adapter); + break; + #endif ++#ifdef CONFIG_RTL8822B ++ case RTL8822B: ++ rtl8822b_init_hal_spec(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8821C ++ case RTL8821C: ++ init_hal_spec_rtl8821c(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8710B ++ case RTL8710B: ++ init_hal_spec_8710b(adapter); ++ break; ++#endif ++#ifdef CONFIG_RTL8192F ++ case RTL8192F: ++ init_hal_spec_8192f(adapter); ++ break; ++#endif + + default: + RTW_ERR("%s: unknown chip_type:%u\n" +diff --git a/drivers/staging/rtl8812au/hal/hal_intf.c b/drivers/staging/rtl8812au/hal/hal_intf.c +index b20ef6322..66a2954c5 100644 +--- a/drivers/staging/rtl8812au/hal/hal_intf.c ++++ b/drivers/staging/rtl8812au/hal/hal_intf.c +@@ -20,9 +20,20 @@ + + const u32 _chip_type_to_odm_ic_type[] = { + 0, ++ ODM_RTL8188E, ++ ODM_RTL8192E, + ODM_RTL8812, + ODM_RTL8821, ++ ODM_RTL8723B, + ODM_RTL8814A, ++ ODM_RTL8703B, ++ ODM_RTL8188F, ++ ODM_RTL8188F, ++ ODM_RTL8822B, ++ ODM_RTL8723D, ++ ODM_RTL8821C, ++ ODM_RTL8710B, ++ ODM_RTL8192F, + 0, + }; + +@@ -1402,6 +1413,7 @@ bool rtw_hal_rfkill_poll(_adapter *adapter, u8 *valid) + u8 rtw_hal_ops_check(_adapter *padapter) + { + u8 ret = _SUCCESS; ++#if 1 + /*** initialize section ***/ + if (NULL == padapter->hal_func.read_chip_version) { + rtw_hal_error_msg("read_chip_version"); +@@ -1591,6 +1603,12 @@ u8 rtw_hal_ops_check(_adapter *padapter) + rtw_hal_error_msg("hal_mac_c2h_handler"); + ret = _FAIL; + } ++#elif !defined(CONFIG_RTL8188E) ++ if (NULL == padapter->hal_func.c2h_handler) { ++ rtw_hal_error_msg("c2h_handler"); ++ ret = _FAIL; ++ } ++#endif + + #if defined(CONFIG_LPS) || defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) + if (NULL == padapter->hal_func.fill_fake_txdesc) { +diff --git a/drivers/staging/rtl8812au/hal/hal_mp.c b/drivers/staging/rtl8812au/hal/hal_mp.c +index 5dfaf91fe..7960556f2 100644 +--- a/drivers/staging/rtl8812au/hal/hal_mp.c ++++ b/drivers/staging/rtl8812au/hal/hal_mp.c +@@ -21,12 +21,39 @@ + #ifdef RTW_HALMAC + #include /* struct HAL_DATA_TYPE, RF register definition and etc. */ + #else /* !RTW_HALMAC */ ++ #ifdef CONFIG_RTL8188E ++ #include ++ #endif ++ #ifdef CONFIG_RTL8723B ++ #include ++ #endif ++ #ifdef CONFIG_RTL8192E ++ #include ++ #endif + #if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8812A) + #include + #endif + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + #include + #endif ++ #ifdef CONFIG_RTL8703B ++ #include ++ #endif ++ #ifdef CONFIG_RTL8723D ++ #include ++ #endif ++ #ifdef CONFIG_RTL8710B ++ #include ++ #endif ++ #ifdef CONFIG_RTL8188F ++ #include ++ #endif ++ #ifdef CONFIG_RTL8188GTV ++ #include ++ #endif ++ #ifdef CONFIG_RTL8192F ++ #include ++ #endif + #endif /* !RTW_HALMAC */ + + +diff --git a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c +index 5bfb27041..6c93e5f6f 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c ++++ b/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c +@@ -1202,6 +1202,16 @@ VOID + IN BOOLEAN is2T + ) + { ++#if (RT_PLATFORM == PLATFORM_WINDOWS) ++#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) ++ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); ++#if (DM_ODM_SUPPORT_TYPE == ODM_CE) ++ PDM_ODM_T pDM_Odm = &pHalData->odmpriv; ++#endif ++#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) ++ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; ++#endif ++#endif + + u4Byte tmpReg, tmpReg2, index, i; + u1Byte path, pathbound = PATH_NUM; +@@ -1216,12 +1226,12 @@ VOID + rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + +- u4Byte BB_backup[DP_BB_REG_NUM]; ++ u4Byte BB_backup[DP_BB_REG_NUM]; + u4Byte BB_REG[DP_BB_REG_NUM] = { +- rOFDM0_TRxPathEnable, rFPGA0_RFMOD, ++ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, +- rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, +- rFPGA0_XB_RFInterfaceOE}; ++ rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, ++ rFPGA0_XB_RFInterfaceOE}; + u4Byte BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; +diff --git a/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c b/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c +index 81ea9a614..adf2cd9c6 100644 +--- a/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c ++++ b/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c +@@ -1201,29 +1201,39 @@ VOID + IN BOOLEAN is2T + ) + { ++#if (RT_PLATFORM == PLATFORM_WINDOWS) ++#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) ++ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); ++#if (DM_ODM_SUPPORT_TYPE == ODM_CE) ++ PDM_ODM_T pDM_Odm = &pHalData->odmpriv; ++#endif ++#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) ++ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; ++#endif ++#endif + + u32 tmpReg, tmpReg2, index, i; + u8 path, pathbound = PATH_NUM; + u32 AFE_backup[IQK_ADDA_REG_NUM]; +- u32 AFE_REG[IQK_ADDA_REG_NUM] = { +- rFPGA0_XCD_SwitchControl, rBlue_Tooth, ++ u32 AFE_REG[IQK_ADDA_REG_NUM] = { ++ rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, +- rTx_CCK_BBON, rTx_OFDM_RFON, ++ rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, +- rTx_To_Tx, rRx_CCK, ++ rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, +- rRx_TO_Rx, rStandby, ++ rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + +- u32 BB_backup[DP_BB_REG_NUM]; ++ u32 BB_backup[DP_BB_REG_NUM]; + u32 BB_REG[DP_BB_REG_NUM] = { +- rOFDM0_TRxPathEnable, rFPGA0_RFMOD, ++ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, + rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, +- rFPGA0_XB_RFInterfaceOE}; ++ rFPGA0_XB_RFInterfaceOE}; + u32 BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, +- 0x0, 0x0, 0x0}; ++ 0x0, 0x0, 0x0}; + + u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u32 RF_REG[DP_RF_REG_NUM] = { +diff --git a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +index b2427fe25..5c0bf0d03 100644 +--- a/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c ++++ b/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +@@ -1585,9 +1585,9 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM); + // Reset USB mode switch setting + rtw_write8(Adapter, REG_SDIO_CTRL_8814A, 0x0); + rtw_write8(Adapter, REG_ACLK_MON, 0x0); +- ++ + //RT_TRACE(COMP_INIT, DBG_TRACE, ("InitializeAdapter8188EUsb() <====\n")); +- ++ + HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK); + // 2010/08/26 MH Merge from 8192CE. + if(pwrctrlpriv->rf_pwrstate == rf_on) +@@ -2048,19 +2048,19 @@ InitAdapterVariablesByPROM_8814AU( + hal_ReadTxPowerInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadBoardType8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_Read_TRX_antenna_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); +- ++ + // + // Read Bluetooth co-exist and initialize + // + hal_EfuseParseBTCoexistInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); +- ++ + hal_ReadChannelPlan8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_EfuseParseXtal_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadThermalMeter_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRemoteWakeup_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadAntennaDiversity8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRFEType_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); +- ++ + ReadLEDSetting_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + hal_ReadUsbModeSwitch_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); +@@ -2074,7 +2074,7 @@ InitAdapterVariablesByPROM_8814AU( + static void hal_ReadPROMContent_8814A( + IN PADAPTER Adapter + ) +-{ ++{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 eeValue; + +@@ -2097,7 +2097,7 @@ ReadAdapterInfo8814AU( + ) + { + Hal_InitEfuseVars_8814A(Adapter); +- ++ + /* Read all content in Efuse/EEPROM. */ + hal_ReadPROMContent_8814A(Adapter); + +@@ -2118,17 +2118,17 @@ void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 Remo + himr = &(pHalData->IntrMask[0]); + else + himr = &(pHalData->IntrMask[1]); +- ++ + if (AddMSR) + *himr |= AddMSR; + + if (RemoveMSR) + *himr &= (~RemoveMSR); + +- if(bHIMR0) ++ if(bHIMR0) + rtw_write32(padapter, REG_HIMR0_8814A, *himr); + else +- rtw_write32(padapter, REG_HIMR1_8814A, *himr); ++ rtw_write32(padapter, REG_HIMR1_8814A, *himr); + + } + +@@ -2223,7 +2223,7 @@ u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + + void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) + { +- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); ++ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(variable) + { +@@ -2340,7 +2340,7 @@ static void rtl8814au_init_default_value(_adapter * padapter) + } + + static u8 rtl8814au_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) +-{ ++{ + u8 bResult = _TRUE; + switch(efunc_id){ + +@@ -2365,7 +2365,7 @@ void rtl8814au_set_hal_ops(_adapter * padapter) + + pHalFunc->hal_power_on = _InitPowerOn_8814AU; + pHalFunc->hal_power_off = hal_carddisable_8814; +- ++ + pHalFunc->hal_init = &rtl8814au_hal_init; + pHalFunc->hal_deinit = &rtl8814au_hal_deinit; + +@@ -2384,11 +2384,11 @@ void rtl8814au_set_hal_ops(_adapter * padapter) + // pHalFunc->InitSwLeds = NULL; + // pHalFunc->DeInitSwLeds = NULL; + #endif//CONFIG_RTW_LED +- ++ + pHalFunc->init_default_value = &rtl8814au_init_default_value; + pHalFunc->intf_chip_configure = &rtl8814au_interface_configure; + pHalFunc->read_adapter_info = &ReadAdapterInfo8814AU; +- ++ + pHalFunc->set_hw_reg_handler = &SetHwReg8814AU; + pHalFunc->GetHwRegHandler = &GetHwReg8814AU; + pHalFunc->get_hal_def_var_handler = &GetHalDefVar8814AUsb; +diff --git a/drivers/staging/rtl8812au/include/gspi_osintf.h b/drivers/staging/rtl8812au/include/gspi_osintf.h +index 2bff22ffd..6393f779d 100644 +--- a/drivers/staging/rtl8812au/include/gspi_osintf.h ++++ b/drivers/staging/rtl8812au/include/gspi_osintf.h +@@ -15,4 +15,11 @@ + #ifndef __SDIO_OSINTF_H__ + #define __SDIO_OSINTF_H__ + ++ ++#ifdef PLATFORM_OS_CE ++ extern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter); ++ SD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter); ++ extern void sd_setup_irs(PADAPTER padapter); ++#endif ++ + #endif +diff --git a/drivers/staging/rtl8812au/include/rtl8812a_recv.h b/drivers/staging/rtl8812au/include/rtl8812a_recv.h +index 07b824550..bf1d4b651 100644 +--- a/drivers/staging/rtl8812au/include/rtl8812a_recv.h ++++ b/drivers/staging/rtl8812au/include/rtl8812a_recv.h +@@ -18,6 +18,9 @@ + #if defined(CONFIG_USB_HCI) + + #ifndef MAX_RECVBUF_SZ ++ #ifdef PLATFORM_OS_CE ++ #define MAX_RECVBUF_SZ (8192+1024) /* 8K+1k */ ++ #else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER + #define MAX_RECVBUF_SZ (rtw_rtkm_get_buff_size()) /*depend rtkm*/ +@@ -36,6 +39,7 @@ + #else + #define MAX_RECVBUF_SZ (4000) /* about 4K */ + #endif ++ #endif + #endif /* !MAX_RECVBUF_SZ */ + + #elif defined(CONFIG_PCI_HCI) +diff --git a/drivers/staging/rtl8812au/include/rtl8814a_recv.h b/drivers/staging/rtl8812au/include/rtl8814a_recv.h +index f723c0a10..c6792d8a5 100644 +--- a/drivers/staging/rtl8812au/include/rtl8814a_recv.h ++++ b/drivers/staging/rtl8812au/include/rtl8814a_recv.h +@@ -18,6 +18,9 @@ + #if defined(CONFIG_USB_HCI) + + #ifndef MAX_RECVBUF_SZ ++ #ifdef PLATFORM_OS_CE ++ #define MAX_RECVBUF_SZ (8192+1024) /* 8K+1k */ ++ #else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + #ifdef CONFIG_PLATFORM_MSTAR + #define MAX_RECVBUF_SZ (8192) /* 8K */ +@@ -32,6 +35,7 @@ + #else + #define MAX_RECVBUF_SZ (4000) /* about 4K */ + #endif ++ #endif + #endif /* !MAX_RECVBUF_SZ */ + + #elif defined(CONFIG_PCI_HCI) +diff --git a/drivers/staging/rtl8812au/include/rtw_cmd.h b/drivers/staging/rtl8812au/include/rtw_cmd.h +index 0f549a65a..4df67602f 100644 +--- a/drivers/staging/rtl8812au/include/rtw_cmd.h ++++ b/drivers/staging/rtl8812au/include/rtw_cmd.h +@@ -26,7 +26,11 @@ + #define MAX_RSPSZ 512 + #define MAX_EVTSZ 1024 + +-#define CMDBUFF_ALIGN_SZ 512 ++#ifdef PLATFORM_OS_CE ++ #define CMDBUFF_ALIGN_SZ 4 ++#else ++ #define CMDBUFF_ALIGN_SZ 512 ++#endif + + struct cmd_obj { + _adapter *padapter; +@@ -110,6 +114,9 @@ struct evt_priv { + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 *c2h_mem; + u8 *allocated_c2h_mem; ++#ifdef PLATFORM_OS_XP ++ PMDL pc2h_mdl; ++#endif + #endif + + }; +diff --git a/drivers/staging/rtl8812au/include/rtw_debug.h b/drivers/staging/rtl8812au/include/rtw_debug.h +index 93f9e6e3c..e3562ca4a 100644 +--- a/drivers/staging/rtl8812au/include/rtw_debug.h ++++ b/drivers/staging/rtl8812au/include/rtw_debug.h +@@ -28,6 +28,10 @@ enum { + + #define DRIVER_PREFIX "RTW: " + ++#ifdef PLATFORM_OS_CE ++extern void rtl871x_cedbg(const char *fmt, ...); ++#endif ++ + #define RTW_PRINT(x, ...) do {} while (0) + #define RTW_ERR(x, ...) do {} while (0) + #define RTW_WARN(x,...) do {} while (0) +diff --git a/drivers/staging/rtl8812au/include/rtw_recv.h b/drivers/staging/rtl8812au/include/rtw_recv.h +index ee0ec77cb..d6422a1d2 100644 +--- a/drivers/staging/rtl8812au/include/rtw_recv.h ++++ b/drivers/staging/rtl8812au/include/rtw_recv.h +@@ -19,6 +19,19 @@ + #define RTW_RX_MSDU_ACT_INDICATE BIT0 + #define RTW_RX_MSDU_ACT_FORWARD BIT1 + ++#ifdef PLATFORM_OS_XP ++ #ifdef CONFIG_SDIO_HCI ++ #define NR_RECVBUFF 1024/* 512 */ /* 128 */ ++ #else ++ #define NR_RECVBUFF (16) ++ #endif ++#elif defined(PLATFORM_OS_CE) ++ #ifdef CONFIG_SDIO_HCI ++ #define NR_RECVBUFF (128) ++ #else ++ #define NR_RECVBUFF (4) ++ #endif ++#else /* PLATFORM_LINUX /PLATFORM_BSD */ + + #include + +@@ -42,6 +55,7 @@ + #ifdef CONFIG_RTW_NAPI + #define RTL_NAPI_WEIGHT (32) + #endif ++#endif + + #if defined(CONFIG_RTL8821C) && defined(CONFIG_SDIO_HCI) && defined(CONFIG_RECV_THREAD_MODE) + #ifdef NR_RECVBUFF +@@ -340,6 +354,17 @@ struct recv_priv { + + _adapter *adapter; + ++#ifdef PLATFORM_WINDOWS ++ _nic_hdl RxPktPoolHdl; ++ _nic_hdl RxBufPoolHdl; ++ ++#ifdef PLATFORM_OS_XP ++ PMDL pbytecnt_mdl; ++#endif ++ uint counter; /* record the number that up-layer will return to drv; only when counter==0 can we release recv_priv */ ++ NDIS_EVENT recv_resource_evt ; ++#endif ++ + + u32 is_any_non_be_pkts; + +@@ -508,11 +533,20 @@ struct recv_buf { + + #ifdef CONFIG_USB_HCI + +-#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) ++#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) + PURB purb; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ + u32 alloc_sz; + #endif ++ ++#ifdef PLATFORM_OS_XP ++ PIRP pirp; ++#endif ++ ++#ifdef PLATFORM_OS_CE ++ USB_TRANSFER usb_transfer_read_port; ++#endif ++ + u8 irp_pending; + int transfer_len; + +diff --git a/drivers/staging/rtl8812au/include/rtw_xmit.h b/drivers/staging/rtl8812au/include/rtw_xmit.h +index 69ec205f4..660a29ae2 100644 +--- a/drivers/staging/rtl8812au/include/rtw_xmit.h ++++ b/drivers/staging/rtl8812au/include/rtw_xmit.h +@@ -60,6 +60,10 @@ + #endif + #define NR_XMITBUFF (128) + #endif ++ ++#ifdef PLATFORM_OS_CE ++ #define XMITBUF_ALIGN_SZ 4 ++#else + #ifdef CONFIG_PCI_HCI + #define XMITBUF_ALIGN_SZ 4 + #else +@@ -68,6 +72,7 @@ + #else + #define XMITBUF_ALIGN_SZ 512 + #endif ++ #endif + #endif + + /* xmit extension buff defination */ +diff --git a/drivers/staging/rtl8812au/include/sdio_osintf.h b/drivers/staging/rtl8812au/include/sdio_osintf.h +index 2bff22ffd..7c2abd14d 100644 +--- a/drivers/staging/rtl8812au/include/sdio_osintf.h ++++ b/drivers/staging/rtl8812au/include/sdio_osintf.h +@@ -15,4 +15,11 @@ + #ifndef __SDIO_OSINTF_H__ + #define __SDIO_OSINTF_H__ + ++ ++#ifdef PLATFORM_OS_CE ++extern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter); ++SD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter); ++extern void sd_setup_irs(PADAPTER padapter); ++#endif ++ + #endif +diff --git a/drivers/staging/rtl8812au/os_dep/osdep_service.c b/drivers/staging/rtl8812au/os_dep/osdep_service.c +index 7d10c0ce5..7553f2c98 100644 +--- a/drivers/staging/rtl8812au/os_dep/osdep_service.c ++++ b/drivers/staging/rtl8812au/os_dep/osdep_service.c +@@ -1135,6 +1135,11 @@ void _rtw_init_sema(_sema *sema, int init_val) + sema_init(sema, init_val, "rtw_drv"); + #endif + ++#ifdef PLATFORM_OS_CE ++ if (*sema == NULL) ++ *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL); ++#endif ++ + } + + void _rtw_free_sema(_sema *sema) +@@ -1142,6 +1147,9 @@ void _rtw_free_sema(_sema *sema) + #ifdef PLATFORM_FREEBSD + sema_destroy(sema); + #endif ++#ifdef PLATFORM_OS_CE ++ CloseHandle(*sema); ++#endif + + } + +@@ -1156,6 +1164,10 @@ void _rtw_up_sema(_sema *sema) + #ifdef PLATFORM_FREEBSD + sema_post(sema); + #endif ++ ++#ifdef PLATFORM_OS_CE ++ ReleaseSemaphore(*sema, 1, NULL); ++#endif + } + + u32 _rtw_down_sema(_sema *sema) +@@ -1173,6 +1185,13 @@ u32 _rtw_down_sema(_sema *sema) + sema_wait(sema); + return _SUCCESS; + #endif ++ ++#ifdef PLATFORM_OS_CE ++ if (WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE)) ++ return _SUCCESS; ++ else ++ return _FAIL; ++#endif + } + + #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) +@@ -1192,6 +1211,10 @@ inline void kthread_thread_exit(_completion *comp) + #ifdef PLATFORM_FREEBSD + printf("%s", "RTKTHREAD_exit"); + #endif ++ ++#ifdef PLATFORM_OS_CE ++ ExitThread(STATUS_SUCCESS); ++#endif + } + + inline void _rtw_init_completion(_completion *comp) +@@ -1227,6 +1250,10 @@ void _rtw_mutex_init(_mutex *pmutex) + #ifdef PLATFORM_FREEBSD + mtx_init(pmutex, "", NULL, MTX_DEF | MTX_RECURSE); + #endif ++ ++#ifdef PLATFORM_OS_CE ++ *pmutex = CreateMutex(NULL, _FALSE, NULL); ++#endif + } + + void _rtw_mutex_free(_mutex *pmutex); +@@ -1243,6 +1270,10 @@ void _rtw_mutex_free(_mutex *pmutex) + sema_destroy(pmutex); + #endif + ++#endif ++ ++#ifdef PLATFORM_OS_CE ++ + #endif + } + +-- +2.41.0 + + +From aae6908f32010c261877371d891c8163a1482572 Mon Sep 17 00:00:00 2001 +From: kimocoder +Date: Sun, 2 Jul 2023 02:50:24 +0200 +Subject: [PATCH 02/13] Address warning in createbss_hdl() + +--- + drivers/staging/rtl8812au/core/rtw_mlme_ext.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +index 01136fb37..57e7536c0 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c ++++ b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +@@ -13941,14 +13941,14 @@ u8 createbss_hdl(_adapter *padapter, u8 *pbuf) + flush_all_cam_entry(padapter); + + pdev_network->Length = get_WLAN_BSSID_EX_sz(pdev_network); +- _rtw_memcpy(pnetwork, pdev_network, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); +- pnetwork->IELength = pdev_network->IELength; +- +- if (pnetwork->IELength > MAX_IE_SZ) { ++ if (FIELD_OFFSET(WLAN_BSSID_EX, IELength) > MAX_IE_SZ) { + ret = H2C_PARAMETERS_ERROR; + goto ibss_post_hdl; + } + ++ memcpy(pnetwork, pdev_network, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); ++ pnetwork->IELength = pdev_network->IELength; ++ + _rtw_memcpy(pnetwork->IEs, pdev_network->IEs, pnetwork->IELength); + start_create_ibss(padapter); + } else { +-- +2.41.0 + + +From c80d9acb9ea350300cfe0e06065818640d989583 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Carlos=20Garc=C3=A9s?= +Date: Sun, 2 Jul 2023 12:11:29 +0000 +Subject: [PATCH 03/13] Use eth_hw_addr_set instead of dev_addr_set + +--- + drivers/staging/rtl8812au/include/drv_types_linux.h | 6 +++++- + drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c | 2 +- + drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c | 2 +- + drivers/staging/rtl8812au/os_dep/linux/os_intfs.c | 4 ++-- + drivers/staging/rtl8812au/os_dep/osdep_service.c | 2 +- + 5 files changed, 10 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/rtl8812au/include/drv_types_linux.h b/drivers/staging/rtl8812au/include/drv_types_linux.h +index 3d428d4d0..97c8576a2 100644 +--- a/drivers/staging/rtl8812au/include/drv_types_linux.h ++++ b/drivers/staging/rtl8812au/include/drv_types_linux.h +@@ -16,7 +16,11 @@ + #define __DRV_TYPES_LINUX_H__ + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) +-#define dev_addr_set(netdev, ethdata) _rtw_memcpy(netdev->dev_addr, ethdata, ETH_ALEN) ++/* Porting from linux kernel v5.15 48eab831ae8b9f7002a533fa4235eed63ea1f1a3 3f6cffb8604b537e3d7ea040d7f4368689638eaf*/ ++static inline void eth_hw_addr_set(struct net_device *dev, const u8 *addr) ++{ ++ memcpy(dev->dev_addr, addr, ETH_ALEN) ++} + #endif + + #endif +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c +index b2a7560d9..c5776117f 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c +@@ -9725,7 +9725,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, + rtw_hal_read_chip_info(padapter); + /* set mac addr*/ + rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); +- dev_addr_set(padapter->pnetdev, get_hal_mac_addr(padapter)); /* set mac addr to net_device */ ++ eth_hw_addr_set(padapter->pnetdev, get_hal_mac_addr(padapter)); /* set mac addr to net_device */ + + #ifdef CONFIG_P2P + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); +diff --git a/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c b/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c +index 771c6272e..74f098277 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c +@@ -404,7 +404,7 @@ int hostapd_mode_init(_adapter *padapter) + mac[4] = 0x11; + mac[5] = 0x12; + +- dev_addr_set(pnetdev, mac); ++ eth_hw_addr_set(pnetdev, mac); + + + rtw_netif_carrier_off(pnetdev); +diff --git a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +index 6d2801357..2dadae098 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +@@ -1285,7 +1285,7 @@ static int rtw_net_set_mac_address(struct net_device *pnetdev, void *addr) + } + + _rtw_memcpy(adapter_mac_addr(padapter), sa->sa_data, ETH_ALEN); /* set mac addr to adapter */ +- dev_addr_set(pnetdev, sa->sa_data); /* set mac addr to net_device */ ++ eth_hw_addr_set(pnetdev, sa->sa_data); /* set mac addr to net_device */ + + #if 0 + if (rtw_is_hw_init_completed(padapter)) { +@@ -1754,7 +1754,7 @@ int rtw_os_ndev_register(_adapter *adapter, const char *name) + /* alloc netdev name */ + rtw_init_netdev_name(ndev, name); + +- dev_addr_set(ndev, adapter_mac_addr(adapter)); ++ eth_hw_addr_set(ndev, adapter_mac_addr(adapter)); + #if defined(CONFIG_NET_NS) + dev_net_set(ndev, wiphy_net(adapter_to_wiphy(adapter))); + #endif //defined(CONFIG_NET_NS) +diff --git a/drivers/staging/rtl8812au/os_dep/osdep_service.c b/drivers/staging/rtl8812au/os_dep/osdep_service.c +index 7553f2c98..d24b3e1f0 100644 +--- a/drivers/staging/rtl8812au/os_dep/osdep_service.c ++++ b/drivers/staging/rtl8812au/os_dep/osdep_service.c +@@ -2299,7 +2299,7 @@ int rtw_change_ifname(_adapter *padapter, const char *ifname) + + rtw_init_netdev_name(pnetdev, ifname); + +- dev_addr_set(pnetdev, adapter_mac_addr(padapter)); ++ eth_hw_addr_set(pnetdev, adapter_mac_addr(padapter)); + + if (rtnl_lock_needed) + ret = register_netdev(pnetdev); +-- +2.41.0 + + +From 8084e3fe2acd66f315c221184acea9576039fd35 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Carlos=20Garc=C3=A9s?= +Date: Mon, 3 Jul 2023 18:19:34 +0200 +Subject: [PATCH 04/13] Fix compilation error on kernels < 5.15 + +--- + drivers/staging/rtl8812au/include/drv_types_linux.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/include/drv_types_linux.h b/drivers/staging/rtl8812au/include/drv_types_linux.h +index 97c8576a2..6264a4d30 100644 +--- a/drivers/staging/rtl8812au/include/drv_types_linux.h ++++ b/drivers/staging/rtl8812au/include/drv_types_linux.h +@@ -19,7 +19,7 @@ + /* Porting from linux kernel v5.15 48eab831ae8b9f7002a533fa4235eed63ea1f1a3 3f6cffb8604b537e3d7ea040d7f4368689638eaf*/ + static inline void eth_hw_addr_set(struct net_device *dev, const u8 *addr) + { +- memcpy(dev->dev_addr, addr, ETH_ALEN) ++ memcpy(dev->dev_addr, addr, ETH_ALEN); + } + #endif + +-- +2.41.0 + + +From b042f942026520d86350983bee7419267ba35e6c Mon Sep 17 00:00:00 2001 +From: Christian Stewart +Date: Mon, 3 Jul 2023 13:54:27 -0700 +Subject: [PATCH 05/13] ioctl_cfg80211: fix build against kernels < 4.10.x + +Kernel 4.10.x adjusted cfg80211_connect_bss to accept a timeout as the last +argument. Add a conditional statement which removes this extra parameter if the +kernel is less than version 4.10.x to fix build errors against version 4.9.x. + +Note that the Jetson TX2 kernel is still version 4.9.x even though this version +is technically deprecated upstream. + +Signed-off-by: Christian Stewart +--- + .../staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index 0d2a01326..6cf89b24c 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -1193,12 +1193,22 @@ void rtw_cfg80211_indicate_connect(_adapter *padapter) + struct cfg80211_bss *bss; + bss = cfg80211_get_bss(pwdev->wiphy, NULL, cur_network->network.MacAddress, NULL, 0, + IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) + cfg80211_connect_bss(wdev_to_ndev(pwdev), cur_network->network.MacAddress, bss + , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 + , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 + , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 + , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 + , WLAN_STATUS_SUCCESS, GFP_ATOMIC, NL80211_TIMEOUT_UNSPECIFIED); ++ #else // (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) ++ // Linux < 4.10.x does not accept the last argument (timeout). ++ cfg80211_connect_bss(wdev_to_ndev(pwdev), cur_network->network.MacAddress, bss ++ , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 ++ , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 ++ , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 ++ , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 ++ , WLAN_STATUS_SUCCESS, GFP_ATOMIC); ++ #endif + } + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO("pwdev->sme_state(a)=%d\n", pwdev->sme_state); +-- +2.41.0 + + +From 1d7babf42e6f7bd41f772ff9b78f1c242cc9a9c4 Mon Sep 17 00:00:00 2001 +From: seppzer0 +Date: Wed, 19 Jul 2023 00:12:47 +0200 +Subject: [PATCH 06/13] Add an extra definition for cfg80211_connect_bss() + usage + +--- + drivers/staging/rtl8812au/Makefile | 2 ++ + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/Makefile b/drivers/staging/rtl8812au/Makefile +index aa3cd789c..127850786 100644 +--- a/drivers/staging/rtl8812au/Makefile ++++ b/drivers/staging/rtl8812au/Makefile +@@ -851,6 +851,8 @@ EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC -DCONFIG_RADIO_WORK + #EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE + EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT + EXTRA_CFLAGS += -DCONFIG_P2P_IPS ++# A special rule for cfg80211_connect_bss() to receive all 10 arguments in an Android build ++EXTRA_CFLAGS += -DCONFIG_CFG80211_CONNECT_BSS_ANDROID + endif + + ifeq ($(CONFIG_PLATFORM_ANDROID_X86), y) +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index 6cf89b24c..24cd0c540 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -1193,7 +1193,7 @@ void rtw_cfg80211_indicate_connect(_adapter *padapter) + struct cfg80211_bss *bss; + bss = cfg80211_get_bss(pwdev->wiphy, NULL, cur_network->network.MacAddress, NULL, 0, + IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); +- #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) || defined(CONFIG_CFG80211_CONNECT_BSS_ANDROID)) + cfg80211_connect_bss(wdev_to_ndev(pwdev), cur_network->network.MacAddress, bss + , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 + , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 +-- +2.41.0 + + +From 123f15677922b20434acdd63cfc96de4772dd08b Mon Sep 17 00:00:00 2001 +From: kimocoder +Date: Sun, 29 Oct 2023 15:15:50 +0100 +Subject: [PATCH 07/13] Fix the VFS internal message + +--- + drivers/staging/rtl8812au/os_dep/linux/usb_intf.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index b319e58c5..2ef96b386 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -1640,6 +1640,8 @@ static void __exit rtw_drv_halt(void) + rtw_mstat_dump(RTW_DBGDUMP); + } + ++MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); ++ + module_init(rtw_drv_entry); + module_exit(rtw_drv_halt); + +-- +2.41.0 + + +From 7e786378cc760e2e37d38669ba18488a1be5b139 Mon Sep 17 00:00:00 2001 +From: kimocoder +Date: Sun, 29 Oct 2023 16:29:30 +0100 +Subject: [PATCH 08/13] Add kernel v6.6 support + +--- + drivers/staging/rtl8812au/Makefile | 2 ++ + .../rtl8812au/os_dep/linux/ioctl_cfg80211.c | 19 ++++++++++++------- + .../rtl8812au/os_dep/linux/wifi_regd.c | 4 ++++ + 3 files changed, 18 insertions(+), 7 deletions(-) + +diff --git a/drivers/staging/rtl8812au/Makefile b/drivers/staging/rtl8812au/Makefile +index 127850786..ed3126ec3 100644 +--- a/drivers/staging/rtl8812au/Makefile ++++ b/drivers/staging/rtl8812au/Makefile +@@ -9,6 +9,8 @@ EXTRA_CFLAGS += -Wno-implicit-fallthrough + EXTRA_CFLAGS += -Wno-cast-function-type + #EXTRA_CFLAGS += -Wno-error=cast-function-type + #EXTRA_CFLAGS += -Wno-parentheses-equality ++EXTRA_CFLAGS += -Wno-error=incompatible-pointer-types ++EXTRA_CFLAGS += -Wno-stringop-overread + #EXTRA_CFLAGS += -Wno-pointer-bool-conversion + EXTRA_CFLAGS += -Wno-unknown-pragmas + #EXTRA_CFLAGS += -Wno-unused +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index 24cd0c540..af77f4c5d 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -478,7 +478,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); +-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); + #else + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); +@@ -5267,10 +5267,10 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *nd + return ret; + } + +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) +-static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) +-#else ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 2)) + static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) ++#else ++static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) + #endif + { + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); +@@ -7813,6 +7813,9 @@ static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy, + const u8 *peer, + #else + u8 *peer, ++#endif ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)) ++ int link_id, + #endif + u8 action_code, + u8 dialog_token, +@@ -10155,12 +10158,12 @@ static struct cfg80211_ops rtw_cfg80211_ops = { + .del_pmksa = cfg80211_rtw_del_pmksa, + .flush_pmksa = cfg80211_rtw_flush_pmksa, + +-#ifdef CONFIG_AP_MODE + #ifdef RTW_VIRTUAL_INT + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, + .del_virtual_intf = cfg80211_rtw_del_virtual_intf, + #endif + ++#ifdef CONFIG_AP_MODE + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + .add_beacon = cfg80211_rtw_add_beacon, + .set_beacon = cfg80211_rtw_set_beacon, +@@ -10432,7 +10435,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) + rtw_cfg80211_indicate_scan_done(adapter, _TRUE); + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) +- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) + if (wdev->links[0].client.current_bss) { + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) + if (wdev->connected) { +@@ -10473,9 +10476,10 @@ int rtw_cfg80211_ndev_res_alloc(_adapter *adapter) + rtw_wiphy_free(wiphy); + adapter->wiphy = NULL; + } +-#endif + + exit: ++#endif ++ + return ret; + } + +@@ -10489,6 +10493,7 @@ void rtw_cfg80211_ndev_res_free(_adapter *adapter) + #endif + } + ++ + int rtw_cfg80211_ndev_res_register(_adapter *adapter) + { + int ret = _FAIL; +diff --git a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +index 5f2f90506..a36b7dcd0 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +@@ -396,6 +396,10 @@ static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy + wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; + #endif + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 5, 0)) ++ wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF; ++#endif ++ + regd = _rtw_regdomain_select(reg); + wiphy_apply_custom_regulatory(wiphy, regd); + +-- +2.41.0 + + +From 5e3274cbffe62f0baf4bd39a36af7edd3d359e37 Mon Sep 17 00:00:00 2001 +From: Christian Sarre +Date: Tue, 31 Oct 2023 21:04:54 +0200 +Subject: [PATCH 09/13] Fix build on 6.x kernels. + +It was broken due to kernel changes backported from 6.5 (torvalds/linux@e8c2af6). +Changes have been tested on the following configurations and observed to build: + - Debian Bullseye, kernel 6.1.38-4 (bullseye-backports) + - Debian Bookworm, kernel 6.1.52-1 + - Ubuntu 23.04 Lunar, kernel 6.2.0-36 + +There are also other kernel versions which are affected up to some point in their history, +but there were a few reasons I ended up not including them: + - Kernel 6.2: Not in use on Debian, likely skipped in favor of 6.4+. Ubuntu though has backported the change to 6.2 on Lunar. + - Kernel 6.3: Not in use on Debian/Ubuntu, seems to have been skipped in favor of 6.4/6.5+. + - Kernel 6.4: Not in use on Ubuntu. Debian Bookworm has this available in backports, but they now also offer 6.5 which does not have the issue. + +In case someone tries to build this module running kernel 6.2 on something other than Ubuntu, this fix is most likely necessary. +--- + drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +index a36b7dcd0..2f642f4c4 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +@@ -396,7 +396,7 @@ static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy + wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; + #endif + +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 5, 0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 39)) + wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF; + #endif + +-- +2.41.0 + + +From 517a6f38648501a02c97cac3ddc3be8e61843cd4 Mon Sep 17 00:00:00 2001 +From: Christian Sarre +Date: Wed, 1 Nov 2023 09:49:57 +0200 +Subject: [PATCH 10/13] Fix build on Ubuntu 23.04 (kernel 6.2). + +This is done by specifying the ranges for 6.3 and 6.4 versions which need the fix. +Kernel 6.2, to my knowledge, is not used in other popular distros than Ubuntu. + +Ubuntu had backported the change from kernel 6.5 to 6.2, which is why this is needed. + +Added a comment instructing what to do if one wants to build the module +running kernel 6.2 on something else than Ubuntu. +--- + drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +index 2f642f4c4..45c5bd1a9 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +@@ -396,7 +396,15 @@ static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy + wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; + #endif + +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 39)) ++/* ++ * Ubuntu backported a specific upstream change to kernel 6.2 while others skipped 6.2 altogether. ++ * If build fails on kernel 6.2.x and you're not using Ubuntu, ++ * try changing the version "(6, 3, 0)" below to "(6, 2, 0)". ++ */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 39)) \ ++ || (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 13)) \ ++ || (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 4)) + wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF; + #endif + +-- +2.41.0 + + +From e6da86ee01805bb64cf2db498767984b90d79877 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Thu, 2 Nov 2023 20:36:13 +0100 +Subject: [PATCH 11/13] ioctl_cfg80211: Add support for standard RSSI + notifications + +Currently background scanning with wpa_supplicant does not work very +well because rtl8812au does not notify it about changes to RSSI. To +fix this: + +* Implement the cfg80211_ops::set_cqm_rssi_config operation to set the + parameters for RSSI notifications. +* Add a rtw_cfg80211_cqm_rssi_update() function that calls + cfg80211_cqm_rssi_notify() if the RSSI has changed significantly + (based on those parameters). +* When connected in infrastructure mode, call + rtw_cfg80211_cqm_rssi_update() after processing a beacon and + updating the RSSI. + +Signed-off-by: Ben Hutchings +--- + drivers/staging/rtl8812au/core/rtw_mlme_ext.c | 6 +++ + .../rtl8812au/os_dep/linux/ioctl_cfg80211.c | 42 +++++++++++++++++++ + .../rtl8812au/os_dep/linux/ioctl_cfg80211.h | 7 ++++ + 3 files changed, 55 insertions(+) + +diff --git a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +index 57e7536c0..527e06dd5 100644 +--- a/drivers/staging/rtl8812au/core/rtw_mlme_ext.c ++++ b/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +@@ -1971,6 +1971,12 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) + #if 0 /* move to validate_recv_mgnt_frame */ + psta->sta_stats.rx_mgnt_pkts++; + #endif ++ ++#if defined(CONFIG_IOCTL_CFG80211) ++ rtw_cfg80211_cqm_rssi_update( ++ padapter, ++ pmlmepriv->cur_network_scanned->network.Rssi); ++#endif + } + + } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +index af77f4c5d..8dd6ea924 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +@@ -4476,6 +4476,47 @@ static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, + return 0; + } + ++static int cfg80211_rtw_set_cqm_rssi_config(struct wiphy *wiphy, ++ struct net_device *ndev, ++ s32 rssi_thold, u32 rssi_hyst) ++{ ++ _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); ++ struct rtw_wdev_priv *priv = adapter_wdev_data(padapter); ++ ++ priv->cqm_rssi_thold = rssi_thold; ++ priv->cqm_rssi_hyst = rssi_hyst; ++ priv->cqm_rssi_last = 0; ++ ++ return 0; ++} ++ ++void rtw_cfg80211_cqm_rssi_update(_adapter *padapter, s32 rssi) ++{ ++ struct rtw_wdev_priv *priv = adapter_wdev_data(padapter); ++ enum nl80211_cqm_rssi_threshold_event event; ++ ++ if (priv->cqm_rssi_thold == 0) ++ return; ++ ++ if (rssi < priv->cqm_rssi_thold && ++ (priv->cqm_rssi_last == 0 || ++ rssi < priv->cqm_rssi_last - priv->cqm_rssi_hyst)) ++ event = NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW; ++ else if (rssi > priv->cqm_rssi_thold && ++ (priv->cqm_rssi_last == 0 || ++ rssi > priv->cqm_rssi_last + priv->cqm_rssi_hyst)) ++ event = NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH; ++ else ++ return; ++ ++ priv->cqm_rssi_last = rssi; ++ cfg80211_cqm_rssi_notify(padapter->pnetdev, event, ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0) ++ rssi, ++#endif ++ GFP_ATOMIC); ++} ++ + #ifdef CONFIG_AP_MODE + void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) + { +@@ -10157,6 +10198,7 @@ static struct cfg80211_ops rtw_cfg80211_ops = { + .set_pmksa = cfg80211_rtw_set_pmksa, + .del_pmksa = cfg80211_rtw_del_pmksa, + .flush_pmksa = cfg80211_rtw_flush_pmksa, ++ .set_cqm_rssi_config = cfg80211_rtw_set_cqm_rssi_config, + + #ifdef RTW_VIRTUAL_INT + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, +diff --git a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h +index e7dd8050e..d40a36e64 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h ++++ b/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h +@@ -185,6 +185,11 @@ struct rtw_wdev_priv { + u16 pno_scan_seq_num; + #endif + ++ /* Standard RSSI notification parameters */ ++ s32 cqm_rssi_thold; ++ u32 cqm_rssi_hyst; ++ s32 cqm_rssi_last; ++ + #ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR + s8 rssi_monitor_max; + s8 rssi_monitor_min; +@@ -351,6 +356,8 @@ void rtw_cfg80211_init_rfkill(struct wiphy *wiphy); + void rtw_cfg80211_deinit_rfkill(struct wiphy *wiphy); + #endif + ++void rtw_cfg80211_cqm_rssi_update(_adapter *padapter, s32 rssi); ++ + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + #define rtw_cfg80211_rx_mgmt(wdev, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt(wdev_to_ndev(wdev), freq, buf, len, gfp) + #elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) +-- +2.41.0 + + +From 18ed5cbdfc47c7021a42277f4c2c89eefd8886c2 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Tue, 7 Nov 2023 17:09:16 +0100 +Subject: [PATCH 12/13] Make use of MODULE_IMPORT_NS conditional + +Commit 8954f2b8d8a06db44bef9a1318f6e1cdb001b98d added an unconditional: + + MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); + +For compatibility with old kernel versions, guard this declaration +with #ifdef MODULE_IMPORT_NS. + +This specific symbol namespace is also Android-specific, so the +declaration should also be conditional on building for Android, but +there doesn't seem to be a single preprocessor symbol that indicates +that. + +Signed-off-by: Ben Hutchings +--- + drivers/staging/rtl8812au/os_dep/linux/usb_intf.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +index 2ef96b386..be0f654f0 100644 +--- a/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c ++++ b/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +@@ -1640,7 +1640,9 @@ static void __exit rtw_drv_halt(void) + rtw_mstat_dump(RTW_DBGDUMP); + } + ++#ifdef MODULE_IMPORT_NS + MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); ++#endif + + module_init(rtw_drv_entry); + module_exit(rtw_drv_halt); +-- +2.41.0 + + +From cc61eb8dd2bf753e5c70ea91414c299a6acdf665 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Tue, 7 Nov 2023 18:12:18 +0100 +Subject: [PATCH 13/13] Fix eth_hw_addr_set() definition for compatibility with + stable branches + +eth_hw_addr_set() was added in Linux 5.15 but has now been backported +to 4.19.291, 5.4.251, and 5.10.188. This currently results in build +failure for these stable branches. + +There's no simple way to test for the addition of this function since +LINUX_VERSION_CODE limits version components to 255. + +Work around this by defining an inline function rtw_eth_hw_addr_set() +and a macro eth_hw_addr_set(). This effectively shadows any +backported definition of the eth_hw_addr_set() function without any +conflict. + +Signed-off-by: Ben Hutchings +--- + drivers/staging/rtl8812au/include/drv_types_linux.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8812au/include/drv_types_linux.h b/drivers/staging/rtl8812au/include/drv_types_linux.h +index 6264a4d30..56435c855 100644 +--- a/drivers/staging/rtl8812au/include/drv_types_linux.h ++++ b/drivers/staging/rtl8812au/include/drv_types_linux.h +@@ -17,10 +17,11 @@ + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) + /* Porting from linux kernel v5.15 48eab831ae8b9f7002a533fa4235eed63ea1f1a3 3f6cffb8604b537e3d7ea040d7f4368689638eaf*/ +-static inline void eth_hw_addr_set(struct net_device *dev, const u8 *addr) ++static inline void rtw_eth_hw_addr_set(struct net_device *dev, const u8 *addr) + { + memcpy(dev->dev_addr, addr, ETH_ALEN); + } ++#define eth_hw_addr_set rtw_eth_hw_addr_set + #endif + + #endif +-- +2.41.0 + diff --git a/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-Kconfig-Makefile.patch b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-Kconfig-Makefile.patch new file mode 100644 index 0000000000..be0c79d0eb --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-Kconfig-Makefile.patch @@ -0,0 +1,33 @@ + +Hook up to module buildsystem. + +Signed-off-by: Thomas Backlund + +--- + drivers/staging/Kconfig | 2 ++ + drivers/staging/Makefile | 1 + + 2 files changed, 3 insertions(+) + +diff -Nurp linux-6.3/drivers/staging/Kconfig linux-6.3.rtl/drivers/staging/Kconfig +--- linux-6.3/drivers/staging/Kconfig 2023-04-23 22:02:52.000000000 +0300 ++++ linux-6.3.rtl/drivers/staging/Kconfig 2023-04-24 20:35:51.404482116 +0300 +@@ -36,6 +36,8 @@ source "drivers/staging/rtl8723bs/Kconfi + + source "drivers/staging/rtl8712/Kconfig" + ++source "drivers/staging/rtl8812au/Kconfig" ++ + source "drivers/staging/rts5208/Kconfig" + + source "drivers/staging/octeon/Kconfig" +diff -Nurp linux-6.3/drivers/staging/Makefile linux-6.3.rtl/drivers/staging/Makefile +--- linux-6.3/drivers/staging/Makefile 2023-04-23 22:02:52.000000000 +0300 ++++ linux-6.3.rtl/drivers/staging/Makefile 2023-04-24 20:36:34.117485089 +0300 +@@ -8,6 +8,7 @@ obj-$(CONFIG_RTL8192U) += rtl8192u/ + obj-$(CONFIG_RTL8192E) += rtl8192e/ + obj-$(CONFIG_RTL8723BS) += rtl8723bs/ + obj-$(CONFIG_R8712U) += rtl8712/ ++obj-$(CONFIG_RTL8812AU) += rtl8812au/ + obj-$(CONFIG_RTS5208) += rts5208/ + obj-$(CONFIG_OCTEON_ETHERNET) += octeon/ + obj-$(CONFIG_VT6655) += vt6655/ diff --git a/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-rename.patch b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-rename.patch new file mode 100644 index 0000000000..8eb29f2b56 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au-rename.patch @@ -0,0 +1,78 @@ + +Adjust driver bits so it keeps the name of the replaced driver + +Signed-off-by: Thomas Backlund + +--- + drivers/staging/rtl8812au/Kconfig | 7 +++---- + drivers/staging/rtl8812au/Makefile | 8 ++++---- + drivers/staging/rtl8812au/hal/hal_com.c | 2 +- + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c | 2 +- + 4 files changed, 9 insertions(+), 10 deletions(-) + +diff -Nurp linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com.c linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/hal/hal_com.c +--- linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com.c 2023-05-26 22:35:36.543136899 +0300 ++++ linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/hal/hal_com.c 2023-05-26 22:45:07.045079148 +0300 +@@ -12719,7 +12719,7 @@ bypass_hw_pg: + _rtw_memset(hal_data->EEPROMMACAddr, 0, ETH_ALEN); + ret = _FAIL; + exit: +- dev_info(&udev->dev, "88XXau %pM hw_info[%02x]", hw_addr, addr_offset); ++ dev_info(&udev->dev, "8812au %pM hw_info[%02x]", hw_addr, addr_offset); + return ret; + } + +diff -Nurp linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Kconfig linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/Kconfig +--- linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Kconfig 2022-01-28 22:59:35.486648197 +0200 ++++ linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/Kconfig 2023-05-26 22:45:07.045079148 +0300 +@@ -1,6 +1,5 @@ +-config 88XXAU +- tristate "Realtek 88XXau USB WiFi" ++config RTL8812AU ++ tristate "Realtek 8812au USB WiFi" + depends on USB + help +- Help message of 88XXau +- ++ Help message of 8812au +diff -Nurp linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Makefile linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/Makefile +--- linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Makefile 2023-05-26 22:35:36.539136900 +0300 ++++ linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/Makefile 2023-05-26 22:45:07.045079148 +0300 +@@ -185,9 +185,9 @@ endif + + ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_y_y) + +-EXTRA_CFLAGS += -DDRV_NAME=\"rtl88XXau\" ++EXTRA_CFLAGS += -DDRV_NAME=\"rtl8812au\" + ifeq ($(CONFIG_USB_HCI), y) +-USER_MODULE_NAME = 88XXau ++USER_MODULE_NAME = 8812au + endif + else + EXTRA_CFLAGS += -DDRV_NAME=\"rtl8812au\" +@@ -1712,11 +1712,11 @@ $(MODULE_NAME)-y += $(_PLATFORM_FILES) + + $(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o + +-obj-$(CONFIG_88XXAU) := $(MODULE_NAME).o ++obj-$(CONFIG_RTL8812AU) := $(MODULE_NAME).o + + else + +-export CONFIG_88XXAU = m ++export CONFIG_RTL8812AU = m + + all: modules + +diff -Nurp linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +--- linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c 2023-05-26 22:35:36.547136899 +0300 ++++ linux-6.3.4-rtl8812au-rename/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c 2023-05-26 22:45:07.046079148 +0300 +@@ -2682,7 +2682,7 @@ void rtw_cfg80211_unlink_bss(_adapter *p + #endif + + if (!wiphy) { +- pr_info("88XXAU: rtw_cfg80211_unlink_bss: wiphy is NULL\n"); ++ pr_info("8812AU: rtw_cfg80211_unlink_bss: wiphy is NULL\n"); + return; + } + diff --git a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au.patch b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au.patch similarity index 95% rename from kernel/tools/perf/files/patches/mageia/3rd-rtl8812au.patch rename to kernel/tools/perf/files/patches/mageia/staging-rtl8812au.patch index 891f72c573..c7c7c0e125 100644 --- a/kernel/tools/perf/files/patches/mageia/3rd-rtl8812au.patch +++ b/kernel/tools/perf/files/patches/mageia/staging-rtl8812au.patch @@ -1,7 +1,509 @@ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/efuse/rtw_efuse.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/efuse/rtw_efuse.c ---- linux-5.11.4/3rdparty/rtl8812au/core/efuse/rtw_efuse.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/efuse/rtw_efuse.c 2021-03-07 18:16:17.015954210 +0200 -@@ -0,0 +1,3278 @@ + +Cloned from: https://github.com/aircrack-ng/rtl8812au + +Topmost commit: + +commit b3227c731ec957b706f8eb2ebcf42ba1c2f0d610 (HEAD -> v5.6.4.2, origin/v5.6.4.2, origin/HEAD) +Author: kimocoder +Date: Fri May 26 06:36:51 2023 +0200 + + Some cleanup of unused chips + +--- + drivers/staging/rtl8812au/Kconfig | 6 + drivers/staging/rtl8812au/Makefile | 1819 +++++++++++ + drivers/staging/rtl8812au/core/efuse/rtw_efuse.c | 3279 +++++++++++++++++++ + drivers/staging/rtl8812au/core/mesh/rtw_mesh.c | 4080 ++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/mesh/rtw_mesh.h | 534 +++ + drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.c | 1665 ++++++++++ + drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.h | 60 + drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.c | 1237 +++++++ + drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.h | 208 + + drivers/staging/rtl8812au/core/rtw_ap.c | 5478 +++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_beamforming.c | 3155 +++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_br_ext.c | 1393 ++++++++ + drivers/staging/rtl8812au/core/rtw_bt_mp.c | 1575 +++++++++ + drivers/staging/rtl8812au/core/rtw_btcoex.c | 1767 ++++++++++ + drivers/staging/rtl8812au/core/rtw_btcoex_wifionly.c | 47 + drivers/staging/rtl8812au/core/rtw_chplan.c | 1193 +++++++ + drivers/staging/rtl8812au/core/rtw_chplan.h | 181 + + drivers/staging/rtl8812au/core/rtw_cmd.c | 5726 ++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_debug.c | 7096 +++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_eeprom.c | 369 ++ + drivers/staging/rtl8812au/core/rtw_ieee80211.c | 2896 +++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_io.c | 899 +++++ + drivers/staging/rtl8812au/core/rtw_ioctl_query.c | 19 + drivers/staging/rtl8812au/core/rtw_ioctl_rtl.c | 901 +++++ + drivers/staging/rtl8812au/core/rtw_ioctl_set.c | 853 +++++ + drivers/staging/rtl8812au/core/rtw_iol.c | 394 ++ + drivers/staging/rtl8812au/core/rtw_mem.c | 128 + drivers/staging/rtl8812au/core/rtw_mi.c | 1571 +++++++++ + drivers/staging/rtl8812au/core/rtw_mlme.c | 5358 ++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_mlme_ext.c |16825 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_mp.c | 3871 +++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_mp_ioctl.c | 2382 ++++++++++++++ + drivers/staging/rtl8812au/core/rtw_odm.c | 420 ++ + drivers/staging/rtl8812au/core/rtw_p2p.c | 5456 +++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_pwrctrl.c | 2761 ++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_recv.c | 5125 +++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_rf.c | 1395 ++++++++ + drivers/staging/rtl8812au/core/rtw_rm.c | 2470 +++++++++++++++ + drivers/staging/rtl8812au/core/rtw_rm_fsm.c | 998 ++++++ + drivers/staging/rtl8812au/core/rtw_rson.c | 595 +++ + drivers/staging/rtl8812au/core/rtw_sdio.c | 130 + drivers/staging/rtl8812au/core/rtw_security.c | 3122 ++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_sreset.c | 314 + + drivers/staging/rtl8812au/core/rtw_sta_mgt.c | 1319 ++++++++ + drivers/staging/rtl8812au/core/rtw_tdls.c | 3505 +++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_vht.c | 1135 ++++++ + drivers/staging/rtl8812au/core/rtw_wapi.c | 1312 +++++++ + drivers/staging/rtl8812au/core/rtw_wapi_sms4.c | 922 +++++ + drivers/staging/rtl8812au/core/rtw_wlan_util.c | 4973 ++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/core/rtw_xmit.c | 6097 +++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/HalPwrSeqCmd.c | 185 + + drivers/staging/rtl8812au/hal/efuse/efuse_mask.h | 164 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c | 94 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h | 33 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c | 94 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h | 34 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c | 93 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h | 33 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c | 96 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h | 31 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c | 95 + drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h | 31 + drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c | 93 + drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h | 33 + drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c | 90 + drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h | 33 + drivers/staging/rtl8812au/hal/hal_btcoex.c | 5706 ++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_btcoex_wifionly.c | 224 + + drivers/staging/rtl8812au/hal/hal_com.c |14360 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_com_c2h.h | 123 + drivers/staging/rtl8812au/hal/hal_com_phycfg.c | 5408 ++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_dm.c | 1616 +++++++++ + drivers/staging/rtl8812au/hal/hal_dm.h | 111 + drivers/staging/rtl8812au/hal/hal_dm_acs.c | 556 +++ + drivers/staging/rtl8812au/hal/hal_dm_acs.h | 167 + + drivers/staging/rtl8812au/hal/hal_halmac.c | 5555 +++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_halmac.h | 245 + + drivers/staging/rtl8812au/hal/hal_hci/hal_usb.c | 564 +++ + drivers/staging/rtl8812au/hal/hal_intf.c | 1698 ++++++++++ + drivers/staging/rtl8812au/hal/hal_mcc.c | 3488 +++++++++++++++++++++ + drivers/staging/rtl8812au/hal/hal_mp.c | 2244 +++++++++++++ + drivers/staging/rtl8812au/hal/hal_phy.c | 257 + + drivers/staging/rtl8812au/hal/led/hal_led.c | 254 + + drivers/staging/rtl8812au/hal/led/hal_usb_led.c | 4291 ++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/ap_makefile.mk | 188 + + drivers/staging/rtl8812au/hal/phydm/halhwimg.h | 96 + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.c | 1359 ++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.h | 139 + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c | 920 +++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.h | 114 + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.c | 528 +++ + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.h | 124 + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.c | 841 +++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.h | 125 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c | 2395 ++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf.h | 573 +++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c | 267 + + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.h | 123 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_dpk.h | 86 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_features.h | 43 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_iqk.h | 103 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c | 1191 +++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.h | 119 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.c | 152 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.h | 41 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c | 1220 +++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h | 398 ++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c | 869 +++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h | 327 + + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c | 741 ++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h | 349 ++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c | 861 +++++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h | 302 + + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.c | 428 ++ + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.h | 52 + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c | 300 + + drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h | 31 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c | 2169 +++++++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h | 82 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c | 1975 +++++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h | 63 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c | 2881 +++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h | 99 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c | 1742 ++++++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h | 164 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c | 564 +++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h | 112 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c | 528 +++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h | 106 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c | 557 +++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h | 58 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c | 313 + + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h | 53 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c | 1046 ++++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h | 72 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c | 731 ++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h | 42 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c | 773 ++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h | 41 + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c | 774 ++++ + drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h | 42 + drivers/staging/rtl8812au/hal/phydm/mp_precomp.h | 24 + drivers/staging/rtl8812au/hal/phydm/phydm.c | 3265 +++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm.h | 1356 ++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm.mk | 226 + + drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c | 764 ++++ + drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.h | 122 + drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c | 1291 +++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.h | 151 + drivers/staging/rtl8812au/hal/phydm/phydm_antdect.c | 891 +++++ + drivers/staging/rtl8812au/hal/phydm/phydm_antdect.h | 78 + drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.c | 5897 +++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.h | 519 +++ + drivers/staging/rtl8812au/hal/phydm/phydm_api.c | 2949 +++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_api.h | 186 + + drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.c | 713 ++++ + drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.h | 113 + drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c | 2050 ++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.h | 363 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c | 1086 ++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.h | 155 + drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c | 1802 ++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_ccx.h | 268 + + drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c | 594 +++ + drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.h | 73 + drivers/staging/rtl8812au/hal/phydm/phydm_debug.c | 4728 ++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_debug.h | 480 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_dfs.c | 2323 ++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_dfs.h | 190 + + drivers/staging/rtl8812au/hal/phydm/phydm_dig.c | 2858 +++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_dig.h | 337 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.c | 517 +++ + drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.h | 103 + drivers/staging/rtl8812au/hal/phydm/phydm_features.h | 72 + drivers/staging/rtl8812au/hal/phydm/phydm_features_ap.h | 196 + + drivers/staging/rtl8812au/hal/phydm/phydm_features_ce.h | 214 + + drivers/staging/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h | 84 + drivers/staging/rtl8812au/hal/phydm/phydm_features_iot.h | 174 + + drivers/staging/rtl8812au/hal/phydm/phydm_features_win.h | 185 + + drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.c | 1419 ++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.h | 79 + drivers/staging/rtl8812au/hal/phydm/phydm_interface.c | 1468 ++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_interface.h | 343 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.c | 1343 ++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.h | 173 + + drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.c | 248 + + drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.h | 114 + drivers/staging/rtl8812au/hal/phydm/phydm_mp.c | 348 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_mp.h | 94 + drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c | 457 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.h | 48 + drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.c | 928 +++++ + drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.h | 123 + drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c | 3192 +++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.h | 1137 ++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c | 543 +++ + drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h | 152 + drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.c | 171 + + drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.h | 84 + drivers/staging/rtl8812au/hal/phydm/phydm_pre_define.h | 849 +++++ + drivers/staging/rtl8812au/hal/phydm/phydm_precomp.h | 514 +++ + drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.c | 173 + + drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.h | 87 + drivers/staging/rtl8812au/hal/phydm/phydm_psd.c | 459 ++ + drivers/staging/rtl8812au/hal/phydm/phydm_psd.h | 66 + drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c | 2085 ++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.h | 276 + + drivers/staging/rtl8812au/hal/phydm/phydm_reg.h | 241 + + drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11ac.h | 109 + drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11n.h | 219 + + drivers/staging/rtl8812au/hal/phydm/phydm_regtable.h | 849 +++++ + drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c | 170 + + drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.h | 55 + drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.c | 2277 +++++++++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.h | 210 + + drivers/staging/rtl8812au/hal/phydm/phydm_soml.c | 1111 ++++++ + drivers/staging/rtl8812au/hal/phydm/phydm_soml.h | 185 + + drivers/staging/rtl8812au/hal/phydm/phydm_types.h | 330 ++ + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c | 1469 ++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h | 107 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c | 301 + + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h | 33 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c | 3848 +++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h | 124 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c | 149 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h | 44 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c | 113 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h | 27 + drivers/staging/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h | 24 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h | 47 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c | 4308 ++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h | 99 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h | 56 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c | 325 + + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h | 39 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c | 8838 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h | 149 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c | 1741 ++++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h | 164 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c | 528 +++ + drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h | 106 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c | 219 + + drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h | 109 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c | 503 +++ + drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h | 78 + drivers/staging/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h | 10 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c | 923 +++++ + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h | 83 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c | 279 + + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h | 33 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c | 5457 +++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h | 143 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c | 206 + + drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h | 90 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c | 129 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h | 31 + drivers/staging/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h | 24 + drivers/staging/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk | 188 + + drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c | 520 +++ + drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.h | 183 + + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.c | 384 ++ + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.h | 71 + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c | 675 ++++ + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.h | 77 + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.c | 1087 ++++++ + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.h | 78 + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.c | 1484 +++++++++ + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.h | 167 + + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c | 510 +++ + drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h | 78 + drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c | 425 ++ + drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h | 74 + drivers/staging/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c | 83 + drivers/staging/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c | 86 + drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.c |17941 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.h | 47 + drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.c |14005 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.h | 47 + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c | 860 +++++ + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_dm.c | 360 ++ + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c | 5777 +++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c | 2045 ++++++++++++ + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c | 158 + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c | 62 + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c | 106 + drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c | 515 +++ + drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c | 389 ++ + drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c | 28 + drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c | 1169 +++++++ + drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c | 2716 ++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c | 244 + + drivers/staging/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c | 98 + drivers/staging/rtl8812au/hal/rtl8814a/hal8814a_fw.c | 7741 +++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c | 1515 +++++++++ + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_dm.c | 407 ++ + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c | 6769 +++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c | 3027 ++++++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c | 210 + + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c | 68 + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c | 114 + drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c | 515 +++ + drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c | 147 + drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c | 34 + drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c | 1129 ++++++ + drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c | 2416 ++++++++++++++ + drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c | 312 + + drivers/staging/rtl8812au/include/Hal8812PhyCfg.h | 143 + drivers/staging/rtl8812au/include/Hal8812PhyReg.h | 735 ++++ + drivers/staging/rtl8812au/include/Hal8812PwrSeq.h | 208 + + drivers/staging/rtl8812au/include/Hal8814PhyCfg.h | 264 + + drivers/staging/rtl8812au/include/Hal8814PhyReg.h | 863 +++++ + drivers/staging/rtl8812au/include/Hal8814PwrSeq.h | 231 + + drivers/staging/rtl8812au/include/Hal8821APwrSeq.h | 200 + + drivers/staging/rtl8812au/include/HalPwrSeqCmd.h | 130 + drivers/staging/rtl8812au/include/HalVerDef.h | 201 + + drivers/staging/rtl8812au/include/basic_types.h | 379 ++ + drivers/staging/rtl8812au/include/byteorder/big_endian.h | 82 + drivers/staging/rtl8812au/include/byteorder/generic.h | 195 + + drivers/staging/rtl8812au/include/byteorder/little_endian.h | 84 + drivers/staging/rtl8812au/include/byteorder/swab.h | 136 + drivers/staging/rtl8812au/include/byteorder/swabb.h | 151 + drivers/staging/rtl8812au/include/circ_buf.h | 23 + drivers/staging/rtl8812au/include/cmd_osdep.h | 26 + drivers/staging/rtl8812au/include/cmn_info/rtw_sta_info.h | 257 + + drivers/staging/rtl8812au/include/custom_gpio.h | 39 + drivers/staging/rtl8812au/include/drv_conf.h | 510 +++ + drivers/staging/rtl8812au/include/drv_types.h | 1797 ++++++++++ + drivers/staging/rtl8812au/include/drv_types_ce.h | 86 + drivers/staging/rtl8812au/include/drv_types_gspi.h | 49 + drivers/staging/rtl8812au/include/drv_types_linux.h | 22 + drivers/staging/rtl8812au/include/drv_types_pci.h | 266 + + drivers/staging/rtl8812au/include/drv_types_sdio.h | 64 + drivers/staging/rtl8812au/include/drv_types_xp.h | 88 + drivers/staging/rtl8812au/include/ethernet.h | 36 + drivers/staging/rtl8812au/include/gspi_hal.h | 30 + drivers/staging/rtl8812au/include/gspi_ops.h | 180 + + drivers/staging/rtl8812au/include/gspi_ops_linux.h | 18 + drivers/staging/rtl8812au/include/gspi_osintf.h | 18 + drivers/staging/rtl8812au/include/h2clbk.h | 26 + drivers/staging/rtl8812au/include/hal_btcoex.h | 97 + drivers/staging/rtl8812au/include/hal_btcoex_wifionly.h | 81 + drivers/staging/rtl8812au/include/hal_com.h | 719 ++++ + drivers/staging/rtl8812au/include/hal_com_h2c.h | 635 +++ + drivers/staging/rtl8812au/include/hal_com_led.h | 437 ++ + drivers/staging/rtl8812au/include/hal_com_phycfg.h | 299 + + drivers/staging/rtl8812au/include/hal_com_reg.h | 1887 +++++++++++ + drivers/staging/rtl8812au/include/hal_data.h | 1105 ++++++ + drivers/staging/rtl8812au/include/hal_gspi.h | 26 + drivers/staging/rtl8812au/include/hal_ic_cfg.h | 313 + + drivers/staging/rtl8812au/include/hal_intf.h | 849 +++++ + drivers/staging/rtl8812au/include/hal_pg.h | 880 +++++ + drivers/staging/rtl8812au/include/hal_phy.h | 234 + + drivers/staging/rtl8812au/include/hal_phy_reg.h | 25 + drivers/staging/rtl8812au/include/hal_sdio.h | 56 + drivers/staging/rtl8812au/include/ieee80211.h | 2044 ++++++++++++ + drivers/staging/rtl8812au/include/ieee80211_ext.h | 309 + + drivers/staging/rtl8812au/include/if_ether.h | 106 + drivers/staging/rtl8812au/include/ip.h | 135 + drivers/staging/rtl8812au/include/linux/old_unused_rtl_wireless.h | 87 + drivers/staging/rtl8812au/include/mlme_osdep.h | 25 + drivers/staging/rtl8812au/include/mp_custom_oid.h | 348 ++ + drivers/staging/rtl8812au/include/nic_spec.h | 41 + drivers/staging/rtl8812au/include/osdep_intf.h | 146 + drivers/staging/rtl8812au/include/osdep_service.h | 781 ++++ + drivers/staging/rtl8812au/include/osdep_service_bsd.h | 756 ++++ + drivers/staging/rtl8812au/include/osdep_service_ce.h | 200 + + drivers/staging/rtl8812au/include/osdep_service_linux.h | 543 +++ + drivers/staging/rtl8812au/include/osdep_service_xp.h | 210 + + drivers/staging/rtl8812au/include/pci_hal.h | 52 + drivers/staging/rtl8812au/include/pci_ops.h | 109 + drivers/staging/rtl8812au/include/pci_osintf.h | 50 + drivers/staging/rtl8812au/include/recv_osdep.h | 67 + drivers/staging/rtl8812au/include/rtl8812a_cmd.h | 158 + drivers/staging/rtl8812au/include/rtl8812a_dm.h | 27 + drivers/staging/rtl8812au/include/rtl8812a_hal.h | 369 ++ + drivers/staging/rtl8812au/include/rtl8812a_led.h | 41 + drivers/staging/rtl8812au/include/rtl8812a_recv.h | 149 + drivers/staging/rtl8812au/include/rtl8812a_rf.h | 28 + drivers/staging/rtl8812au/include/rtl8812a_spec.h | 263 + + drivers/staging/rtl8812au/include/rtl8812a_sreset.h | 24 + drivers/staging/rtl8812au/include/rtl8812a_xmit.h | 367 ++ + drivers/staging/rtl8812au/include/rtl8814a_cmd.h | 162 + drivers/staging/rtl8812au/include/rtl8814a_dm.h | 23 + drivers/staging/rtl8812au/include/rtl8814a_hal.h | 330 ++ + drivers/staging/rtl8812au/include/rtl8814a_led.h | 36 + drivers/staging/rtl8812au/include/rtl8814a_recv.h | 182 + + drivers/staging/rtl8812au/include/rtl8814a_rf.h | 28 + drivers/staging/rtl8812au/include/rtl8814a_spec.h | 656 +++ + drivers/staging/rtl8812au/include/rtl8814a_sreset.h | 24 + drivers/staging/rtl8812au/include/rtl8814a_xmit.h | 311 + + drivers/staging/rtl8812au/include/rtl8821a_spec.h | 90 + drivers/staging/rtl8812au/include/rtl8821a_xmit.h | 173 + + drivers/staging/rtl8812au/include/rtl_autoconf.h | 363 ++ + drivers/staging/rtl8812au/include/rtw_android.h | 108 + drivers/staging/rtl8812au/include/rtw_ap.h | 112 + drivers/staging/rtl8812au/include/rtw_beamforming.h | 401 ++ + drivers/staging/rtl8812au/include/rtw_br_ext.h | 69 + drivers/staging/rtl8812au/include/rtw_bt_mp.h | 287 + + drivers/staging/rtl8812au/include/rtw_btcoex.h | 455 ++ + drivers/staging/rtl8812au/include/rtw_btcoex_wifionly.h | 24 + drivers/staging/rtl8812au/include/rtw_byteorder.h | 45 + drivers/staging/rtl8812au/include/rtw_cmd.h | 1356 ++++++++ + drivers/staging/rtl8812au/include/rtw_debug.h | 624 +++ + drivers/staging/rtl8812au/include/rtw_eeprom.h | 116 + drivers/staging/rtl8812au/include/rtw_efuse.h | 255 + + drivers/staging/rtl8812au/include/rtw_event.h | 130 + drivers/staging/rtl8812au/include/rtw_ht.h | 217 + + drivers/staging/rtl8812au/include/rtw_io.h | 548 +++ + drivers/staging/rtl8812au/include/rtw_ioctl.h | 127 + drivers/staging/rtl8812au/include/rtw_ioctl_rtl.h | 75 + drivers/staging/rtl8812au/include/rtw_ioctl_set.h | 45 + drivers/staging/rtl8812au/include/rtw_iol.h | 131 + drivers/staging/rtl8812au/include/rtw_mcc.h | 271 + + drivers/staging/rtl8812au/include/rtw_mem.h | 36 + drivers/staging/rtl8812au/include/rtw_mi.h | 306 + + drivers/staging/rtl8812au/include/rtw_mlme.h | 1427 ++++++++ + drivers/staging/rtl8812au/include/rtw_mlme_ext.h | 1311 +++++++ + drivers/staging/rtl8812au/include/rtw_mp.h | 894 +++++ + drivers/staging/rtl8812au/include/rtw_mp_ioctl.h | 553 +++ + drivers/staging/rtl8812au/include/rtw_mp_phy_regdef.h | 1094 ++++++ + drivers/staging/rtl8812au/include/rtw_odm.h | 97 + drivers/staging/rtl8812au/include/rtw_p2p.h | 169 + + drivers/staging/rtl8812au/include/rtw_pwrctrl.h | 609 +++ + drivers/staging/rtl8812au/include/rtw_qos.h | 66 + drivers/staging/rtl8812au/include/rtw_recv.h | 852 +++++ + drivers/staging/rtl8812au/include/rtw_rf.h | 240 + + drivers/staging/rtl8812au/include/rtw_rm.h | 88 + drivers/staging/rtl8812au/include/rtw_rm_fsm.h | 389 ++ + drivers/staging/rtl8812au/include/rtw_rson.h | 61 + drivers/staging/rtl8812au/include/rtw_sdio.h | 26 + drivers/staging/rtl8812au/include/rtw_security.h | 499 +++ + drivers/staging/rtl8812au/include/rtw_sreset.h | 66 + drivers/staging/rtl8812au/include/rtw_tdls.h | 185 + + drivers/staging/rtl8812au/include/rtw_version.h | 1 + drivers/staging/rtl8812au/include/rtw_vht.h | 176 + + drivers/staging/rtl8812au/include/rtw_wapi.h | 230 + + drivers/staging/rtl8812au/include/rtw_wifi_regd.h | 34 + drivers/staging/rtl8812au/include/rtw_xmit.h | 1045 ++++++ + drivers/staging/rtl8812au/include/sdio_hal.h | 57 + drivers/staging/rtl8812au/include/sdio_ops.h | 206 + + drivers/staging/rtl8812au/include/sdio_ops_linux.h | 58 + drivers/staging/rtl8812au/include/sdio_osintf.h | 18 + drivers/staging/rtl8812au/include/sta_info.h | 748 ++++ + drivers/staging/rtl8812au/include/usb_hal.h | 74 + drivers/staging/rtl8812au/include/usb_ops.h | 153 + drivers/staging/rtl8812au/include/usb_ops_linux.h | 98 + drivers/staging/rtl8812au/include/usb_osintf.h | 26 + drivers/staging/rtl8812au/include/usb_vendor_req.h | 56 + drivers/staging/rtl8812au/include/wifi.h | 1349 ++++++++ + drivers/staging/rtl8812au/include/wlan_bssdef.h | 655 +++ + drivers/staging/rtl8812au/include/xmit_osdep.h | 68 + drivers/staging/rtl8812au/os_dep/linux/custom_gpio_linux.c | 340 ++ + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c |10566 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h | 427 ++ + drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c |12823 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/os_dep/linux/ioctl_mp.c | 2591 +++++++++++++++ + drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c | 436 ++ + drivers/staging/rtl8812au/os_dep/linux/os_intfs.c | 5188 +++++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/os_dep/linux/recv_linux.c | 729 ++++ + drivers/staging/rtl8812au/os_dep/linux/rhashtable.c | 844 +++++ + drivers/staging/rtl8812au/os_dep/linux/rhashtable.h | 827 +++++ + drivers/staging/rtl8812au/os_dep/linux/rtw_android.c | 1304 +++++++ + drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c | 4777 +++++++++++++++++++++++++++++ + drivers/staging/rtl8812au/os_dep/linux/rtw_proc.h | 63 + drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.c | 74 + drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.h | 55 + drivers/staging/rtl8812au/os_dep/linux/usb_intf.c | 1652 ++++++++++ + drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c | 1135 ++++++ + drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c | 437 ++ + drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c | 567 +++ + drivers/staging/rtl8812au/os_dep/osdep_service.c | 2928 +++++++++++++++++ + drivers/staging/rtl8812au/platform/custom_country_chplan.h | 22 + drivers/staging/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c | 86 + drivers/staging/rtl8812au/platform/platform_ARM_SUNnI_sdio.c | 130 + drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_sdio.c | 90 + drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_usb.c | 136 + drivers/staging/rtl8812au/platform/platform_ARM_WMT_sdio.c | 46 + drivers/staging/rtl8812au/platform/platform_RTK_DMP_usb.c | 30 + drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.c | 54 + drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.h | 32 + drivers/staging/rtl8812au/platform/platform_arm_act_sdio.c | 53 + drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c | 110 + drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h | 28 + drivers/staging/rtl8812au/platform/platform_ops.c | 32 + drivers/staging/rtl8812au/platform/platform_ops.h | 26 + drivers/staging/rtl8812au/platform/platform_sprd_sdio.c | 84 + drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.c | 53 + drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.h | 25 + 488 files changed, 458937 insertions(+) + +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/efuse/rtw_efuse.c 2022-01-28 22:59:35.551651278 +0200 +@@ -0,0 +1,3279 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -782,13 +1284,14 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/efuse/rtw_efuse.c linux-5.11.4-r + j = 0; + + for (i = 0; i < mapLen; i++) { -+ if (i % 16 == 0) ++ if (i % 16 == 0) { + RTW_PRINT_SEL(RTW_DBGDUMP, "0x%03x: ", i); + _RTW_PRINT_SEL(RTW_DBGDUMP, "%02X%s" + , pEfuseHal->fakeEfuseInitMap[i] + , ((i + 1) % 16 == 0) ? "\n" : (((i + 1) % 8 == 0) ? " " : " ") + ); + } ++ } + _RTW_PRINT_SEL(RTW_DBGDUMP, "\n"); + +out_free_buffer: @@ -3280,9 +3783,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/efuse/rtw_efuse.c linux-5.11.4-r +#endif /* CONFIG_EFUSE_CONFIG_FILE */ + +#endif /* PLATFORM_LINUX */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh.c ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh.c 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh.c 2022-01-28 22:59:35.551651278 +0200 @@ -0,0 +1,4080 @@ +/****************************************************************************** + * @@ -7364,9 +7867,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.c linux-5.11.4-rtl +} +#endif /* CONFIG_RTW_MESH */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh.h ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh.h 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh.h +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh.h 2022-01-28 22:59:35.551651278 +0200 @@ -0,0 +1,534 @@ +/****************************************************************************** + * @@ -7902,9 +8405,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh.h linux-5.11.4-rtl +#include "rtw_mesh_hwmp.h" +#endif /* __RTW_MESH_H_ */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.c ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.c 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.c 2022-01-28 22:59:35.551651278 +0200 @@ -0,0 +1,1665 @@ +/****************************************************************************** + * @@ -9571,9 +10074,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.c linux-5.11. + +#endif /* CONFIG_RTW_MESH */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.h ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.h 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.h +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_hwmp.h 2022-01-28 22:59:35.551651278 +0200 @@ -0,0 +1,60 @@ +/****************************************************************************** + * @@ -9635,9 +10138,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_hwmp.h linux-5.11. +#endif /* __RTW_MESH_HWMP_H_ */ + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.c ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.c 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.c 2022-01-28 22:59:35.552651326 +0200 @@ -0,0 +1,1237 @@ +/****************************************************************************** + * @@ -10876,9 +11379,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.c linux-5. +} +#endif /* CONFIG_RTW_MESH */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.h ---- linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.h 2021-03-07 18:16:17.016954257 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.h +--- linux-6.3.4/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/mesh/rtw_mesh_pathtbl.h 2022-01-28 22:59:35.552651326 +0200 @@ -0,0 +1,208 @@ +/****************************************************************************** + * @@ -11088,10 +11591,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/mesh/rtw_mesh_pathtbl.h linux-5. + +#endif /* __RTW_MESH_PATHTBL_H_ */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ap.c 2021-03-07 18:16:17.017954304 +0200 -@@ -0,0 +1,5476 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ap.c 2022-01-28 22:59:35.552651326 +0200 +@@ -0,0 +1,5478 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -15601,12 +16104,14 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ap.c linux-5.11.4-rtl8812au/ + RT_CHANNEL_INFO *chset = adapter_to_chset(adapter); + u8 ret = _SUCCESS; + ++ // ignore reg domain check ++#if 0 + if (rtw_chset_search_ch(chset, ch) < 0) { + RTW_WARN("%s ch:%u doesn't fit in chplan\n", caller, ch); + ret = _FAIL; + goto exit; + } -+ ++#endif + rtw_adjust_chbw(adapter, ch, bw, offset); + + if (!rtw_get_offset_by_chbw(ch, *bw, offset)) { @@ -16568,9 +17073,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ap.c linux-5.11.4-rtl8812au/ +} +#endif /* CONFIG_AP_MODE */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_beamforming.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_beamforming.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_beamforming.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_beamforming.c 2021-03-07 18:16:17.017954304 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_beamforming.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_beamforming.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_beamforming.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_beamforming.c 2022-01-28 22:59:35.552651326 +0200 @@ -0,0 +1,3155 @@ +/****************************************************************************** + * @@ -19727,10 +20232,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_beamforming.c linux-5.11.4-r +#endif /* !RTW_BEAMFORMING_VERSION_2 */ + +#endif /* CONFIG_BEAMFORMING */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_br_ext.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_br_ext.c 2021-03-07 18:16:17.017954304 +0200 -@@ -0,0 +1,1581 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_br_ext.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_br_ext.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_br_ext.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_br_ext.c 2023-05-26 22:35:36.539136900 +0300 +@@ -0,0 +1,1393 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -19750,7 +20255,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 +#ifdef __KERNEL__ + #include + #include -+ #include ++ #include + #include + #include + #include @@ -19801,6 +20306,29 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 +#define MAGIC_CODE_LEN 2 +#define WAIT_TIME_PPPOE 5 /* waiting time for pppoe server in sec */ + ++#define IPX_NODE_LEN 6 ++struct ipx_address { ++ __be32 net; ++ __u8 node[IPX_NODE_LEN]; ++ __be16 sock; ++}; ++ ++struct ipxhdr { ++ __be16 ipx_checksum __packed; ++#define IPX_NO_CHECKSUM cpu_to_be16(0xFFFF) ++ __be16 ipx_pktsize __packed; ++ __u8 ipx_tctrl; ++ __u8 ipx_type; ++#define IPX_TYPE_UNKNOWN 0x00 ++#define IPX_TYPE_RIP 0x01 /* may also be 0 */ ++#define IPX_TYPE_SAP 0x04 /* may also be 0 */ ++#define IPX_TYPE_SPX 0x05 /* SPX protocol */ ++#define IPX_TYPE_NCP 0x11 /* $lots for docs on this (SPIT) */ ++#define IPX_TYPE_PPROP 0x14 /* complicated flood fill brdcast */ ++ struct ipx_address ipx_dest __packed; ++ struct ipx_address ipx_source __packed; ++}; ++ +/*----------------------------------------------------------------- + How database records network address: + 0 1 2 3 4 5 6 7 8 9 10 @@ -19847,7 +20375,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 + /* have a room for new tag */ + memmove(((unsigned char *)ph->tag + data_len), (unsigned char *)ph->tag, ntohs(ph->length)); + ph->length = htons(ntohs(ph->length) + data_len); ++#if (defined __GNUC__) && (__GNUC__ > 10) ++ #pragma GCC diagnostic ignored "-Wstringop-overread" ++#endif + memcpy((unsigned char *)ph->tag, tag, data_len); ++#if (defined __GNUC__) && (__GNUC__ > 10) ++ #pragma GCC diagnostic pop ++#endif + return data_len; +} + @@ -19902,6 +20436,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 +} + + ++#ifdef _NET_INET_IPX_H_ +static __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr, + unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr) +{ @@ -19922,6 +20457,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 + memcpy(networkAddr + 1, (unsigned char *)ipxNetAddr, 4); + memcpy(networkAddr + 5, (unsigned char *)ipxSocketAddr, 2); +} ++#endif + + +static __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr, @@ -20063,6 +20599,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 + x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; + + return x & (NAT25_HASH_SIZE - 1); ++#ifdef _NET_INET_IPX_H_ + } else if (networkAddr[0] == NAT25_IPX) { + unsigned long x; + @@ -20070,6 +20607,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 + networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; + + return x & (NAT25_HASH_SIZE - 1); ++#endif + } else if (networkAddr[0] == NAT25_APPLE) { + unsigned long x; + @@ -20623,227 +21161,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 + } + + /*---------------------------------------------------*/ -+ /* Handle IPX and Apple Talk frame */ -+ /*---------------------------------------------------*/ -+ else if ((protocol == __constant_htons(ETH_P_IPX)) || -+ (protocol == __constant_htons(ETH_P_ATALK)) || -+ (protocol == __constant_htons(ETH_P_AARP))) { -+ unsigned char ipx_header[2] = {0xFF, 0xFF}; -+ struct ipxhdr *ipx = NULL; -+ struct elapaarp *ea = NULL; -+ struct ddpehdr *ddp = NULL; -+ unsigned char *framePtr = skb->data + ETH_HLEN; -+ -+ if (protocol == __constant_htons(ETH_P_IPX)) { -+ RTW_INFO("NAT25: Protocol=IPX (Ethernet II)\n"); -+ ipx = (struct ipxhdr *)framePtr; -+ } else { /* if(protocol <= __constant_htons(ETH_FRAME_LEN)) */ -+ if (!memcmp(ipx_header, framePtr, 2)) { -+ RTW_INFO("NAT25: Protocol=IPX (Ethernet 802.3)\n"); -+ ipx = (struct ipxhdr *)framePtr; -+ } else { -+ unsigned char ipx_8022_type = 0xE0; -+ unsigned char snap_8022_type = 0xAA; -+ -+ if (*framePtr == snap_8022_type) { -+ unsigned char ipx_snap_id[5] = {0x0, 0x0, 0x0, 0x81, 0x37}; /* IPX SNAP ID */ -+ unsigned char aarp_snap_id[5] = {0x00, 0x00, 0x00, 0x80, 0xF3}; /* Apple Talk AARP SNAP ID */ -+ unsigned char ddp_snap_id[5] = {0x08, 0x00, 0x07, 0x80, 0x9B}; /* Apple Talk DDP SNAP ID */ -+ -+ framePtr += 3; /* eliminate the 802.2 header */ -+ -+ if (!memcmp(ipx_snap_id, framePtr, 5)) { -+ framePtr += 5; /* eliminate the SNAP header */ -+ -+ RTW_INFO("NAT25: Protocol=IPX (Ethernet SNAP)\n"); -+ ipx = (struct ipxhdr *)framePtr; -+ } else if (!memcmp(aarp_snap_id, framePtr, 5)) { -+ framePtr += 5; /* eliminate the SNAP header */ -+ -+ ea = (struct elapaarp *)framePtr; -+ } else if (!memcmp(ddp_snap_id, framePtr, 5)) { -+ framePtr += 5; /* eliminate the SNAP header */ -+ -+ ddp = (struct ddpehdr *)framePtr; -+ } else { -+ DEBUG_WARN("NAT25: Protocol=Ethernet SNAP %02x%02x%02x%02x%02x\n", framePtr[0], -+ framePtr[1], framePtr[2], framePtr[3], framePtr[4]); -+ return -1; -+ } -+ } else if (*framePtr == ipx_8022_type) { -+ framePtr += 3; /* eliminate the 802.2 header */ -+ -+ if (!memcmp(ipx_header, framePtr, 2)) { -+ RTW_INFO("NAT25: Protocol=IPX (Ethernet 802.2)\n"); -+ ipx = (struct ipxhdr *)framePtr; -+ } else -+ return -1; -+ } -+ } -+ } -+ -+ /* IPX */ -+ if (ipx != NULL) { -+ switch (method) { -+ case NAT25_CHECK: -+ if (!memcmp(skb->data + ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) { -+ RTW_INFO("NAT25: Check IPX skb_copy\n"); -+ return 0; -+ } -+ return -1; -+ -+ case NAT25_INSERT: { -+ RTW_INFO("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n", -+ ipx->ipx_dest.net, -+ ipx->ipx_dest.node[0], -+ ipx->ipx_dest.node[1], -+ ipx->ipx_dest.node[2], -+ ipx->ipx_dest.node[3], -+ ipx->ipx_dest.node[4], -+ ipx->ipx_dest.node[5], -+ ipx->ipx_dest.sock, -+ ipx->ipx_source.net, -+ ipx->ipx_source.node[0], -+ ipx->ipx_source.node[1], -+ ipx->ipx_source.node[2], -+ ipx->ipx_source.node[3], -+ ipx->ipx_source.node[4], -+ ipx->ipx_source.node[5], -+ ipx->ipx_source.sock); -+ -+ if (!memcmp(skb->data + ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) { -+ RTW_INFO("NAT25: Use IPX Net, and Socket as network addr\n"); -+ -+ __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock); -+ -+ /* change IPX source node addr to wlan STA address */ -+ memcpy(ipx->ipx_source.node, GET_MY_HWADDR(priv), ETH_ALEN); -+ } else -+ __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_source.net, ipx->ipx_source.node); -+ -+ __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); -+ -+ __nat25_db_print(priv); -+ } -+ return 0; -+ -+ case NAT25_LOOKUP: { -+ if (!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN)) { -+ RTW_INFO("NAT25: Lookup IPX, Modify Destination IPX Node addr\n"); -+ -+ __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock); -+ -+ __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); -+ -+ /* replace IPX destination node addr with Lookup destination MAC addr */ -+ memcpy(ipx->ipx_dest.node, skb->data, ETH_ALEN); -+ } else { -+ __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_dest.net, ipx->ipx_dest.node); -+ -+ __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); -+ } -+ } -+ return 0; -+ -+ default: -+ return -1; -+ } -+ } -+ -+ /* AARP */ -+ else if (ea != NULL) { -+ /* Sanity check fields. */ -+ if (ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN) { -+ DEBUG_WARN("NAT25: Appletalk AARP Sanity check fail!\n"); -+ return -1; -+ } -+ -+ switch (method) { -+ case NAT25_CHECK: -+ return 0; -+ -+ case NAT25_INSERT: { -+ /* change to AARP source mac address to wlan STA address */ -+ memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN); -+ -+ RTW_INFO("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n", -+ ea->pa_src_net, -+ ea->pa_src_node, -+ ea->pa_dst_net, -+ ea->pa_dst_node); -+ -+ __nat25_generate_apple_network_addr(networkAddr, &ea->pa_src_net, &ea->pa_src_node); -+ -+ __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); -+ -+ __nat25_db_print(priv); -+ } -+ return 0; -+ -+ case NAT25_LOOKUP: { -+ RTW_INFO("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n", -+ ea->pa_src_net, -+ ea->pa_src_node, -+ ea->pa_dst_net, -+ ea->pa_dst_node); -+ -+ __nat25_generate_apple_network_addr(networkAddr, &ea->pa_dst_net, &ea->pa_dst_node); -+ -+ __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); -+ -+ /* change to AARP destination mac address to Lookup result */ -+ memcpy(ea->hw_dst, skb->data, ETH_ALEN); -+ } -+ return 0; -+ -+ default: -+ return -1; -+ } -+ } -+ -+ /* DDP */ -+ else if (ddp != NULL) { -+ switch (method) { -+ case NAT25_CHECK: -+ return -1; -+ -+ case NAT25_INSERT: { -+ RTW_INFO("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n", -+ ddp->deh_snet, -+ ddp->deh_snode, -+ ddp->deh_dnet, -+ ddp->deh_dnode); -+ -+ __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_snet, &ddp->deh_snode); -+ -+ __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); -+ -+ __nat25_db_print(priv); -+ } -+ return 0; -+ -+ case NAT25_LOOKUP: { -+ RTW_INFO("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n", -+ ddp->deh_snet, -+ ddp->deh_snode, -+ ddp->deh_dnet, -+ ddp->deh_dnode); -+ -+ __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_dnet, &ddp->deh_dnode); -+ -+ __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); -+ } -+ return 0; -+ -+ default: -+ return -1; -+ } -+ } -+ -+ return -1; -+ } -+ -+ /*---------------------------------------------------*/ + /* Handle PPPoE frame */ + /*---------------------------------------------------*/ + else if ((protocol == __constant_htons(ETH_P_PPP_DISC)) || @@ -21312,9 +21629,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_br_ext.c linux-5.11.4-rtl881 +} + +#endif /* CONFIG_BR_EXT */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_btcoex.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_btcoex.c 2021-03-07 18:16:17.017954304 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_btcoex.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_btcoex.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_btcoex.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_btcoex.c 2022-01-28 22:59:35.553651373 +0200 @@ -0,0 +1,1767 @@ +/****************************************************************************** + * @@ -23083,9 +23400,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex.c linux-5.11.4-rtl881 + rtw_btcoex_wifionly_AntInfoSetting(padapter); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex_wifionly.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_btcoex_wifionly.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex_wifionly.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_btcoex_wifionly.c 2021-03-07 18:16:17.018954351 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_btcoex_wifionly.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_btcoex_wifionly.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_btcoex_wifionly.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_btcoex_wifionly.c 2022-01-28 22:59:35.553651373 +0200 @@ -0,0 +1,47 @@ +/****************************************************************************** + * @@ -23134,9 +23451,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_btcoex_wifionly.c linux-5.11 +{ + hal_btcoex_wifionly_AntInfoSetting(padapter); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_bt_mp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_bt_mp.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_bt_mp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_bt_mp.c 2021-03-07 18:16:17.017954304 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_bt_mp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_bt_mp.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_bt_mp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_bt_mp.c 2022-01-28 22:59:35.553651373 +0200 @@ -0,0 +1,1575 @@ +/****************************************************************************** + * @@ -24713,9 +25030,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_bt_mp.c linux-5.11.4-rtl8812 +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_chplan.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_chplan.c 2021-03-07 18:16:17.018954351 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_chplan.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_chplan.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_chplan.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_chplan.c 2022-01-28 22:59:35.553651373 +0200 @@ -0,0 +1,1193 @@ +/****************************************************************************** + * @@ -25910,9 +26227,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.c linux-5.11.4-rtl881 +{ + RTW_PRINT_SEL(sel, "%s-%s\n", RTW_DOMAIN_MAP_VER, RTW_COUNTRY_MAP_VER); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_chplan.h ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_chplan.h 2021-03-07 18:16:17.018954351 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_chplan.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_chplan.h +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_chplan.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_chplan.h 2022-01-28 22:59:35.553651373 +0200 @@ -0,0 +1,181 @@ +/****************************************************************************** + * @@ -26095,10 +26412,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_chplan.h linux-5.11.4-rtl881 +void dump_chplan_ver(void *sel); + +#endif /* __RTW_CHPLAN_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_cmd.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_cmd.c 2021-03-07 18:16:17.018954351 +0200 -@@ -0,0 +1,5765 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_cmd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_cmd.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_cmd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_cmd.c 2022-12-18 17:40:24.573937030 +0200 +@@ -0,0 +1,5726 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -26265,21 +26582,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + + pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4\ + - ((u32)(pevtpriv->allocated_c2h_mem) & 3); -+#ifdef PLATFORM_OS_XP -+ pevtpriv->pc2h_mdl = IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); -+ -+ if (pevtpriv->pc2h_mdl == NULL) { -+ res = _FAIL; -+ goto exit; -+ } -+ MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl); -+#endif +#endif /* end of CONFIG_SDIO_HCI */ -+ + _rtw_init_queue(&(pevtpriv->evt_queue)); + +exit: -+ +#endif /* end of CONFIG_EVENT_THREAD_MODE */ + +#ifdef CONFIG_C2H_WK @@ -26287,15 +26593,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + pevtpriv->c2h_wk_alive = _FALSE; + pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN + 1); +#endif -+ -+ + return res; +} + +void _rtw_free_evt_priv(struct evt_priv *pevtpriv) +{ + -+ +#ifdef CONFIG_EVENT_THREAD_MODE + _rtw_free_sema(&(pevtpriv->evt_notify)); + @@ -26316,9 +26619,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + } + rtw_cbuf_free(pevtpriv->c2h_queue); +#endif -+ -+ -+ +} + +void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) @@ -26410,7 +26710,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + +exit: + -+ + return _SUCCESS; +} + @@ -26419,7 +26718,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + _irqL irqL; + struct cmd_obj *obj; + -+ + /* _enter_critical_bh(&(queue->lock), &irqL); */ + _enter_critical(&queue->lock, &irqL); + @@ -26430,7 +26728,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + } +#endif /* DBG_CMD_QUEUE */ + -+ + if (rtw_is_list_empty(&(queue->queue))) + obj = NULL; + else { @@ -27624,25 +27921,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + + pcmd->cmdsz = sizeof(WLAN_BSSID_EX); + -+#ifdef CONFIG_RTL8712 -+ /* wlan_network endian conversion */ -+ psecnetwork->Length = cpu_to_le32(psecnetwork->Length); -+ psecnetwork->Ssid.SsidLength = cpu_to_le32(psecnetwork->Ssid.SsidLength); -+ psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); -+ psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); -+ psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); -+ psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); -+ psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); -+ psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); -+ psecnetwork->Configuration.FHConfig.DwellTime = cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); -+ psecnetwork->Configuration.FHConfig.HopPattern = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); -+ psecnetwork->Configuration.FHConfig.HopSet = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); -+ psecnetwork->Configuration.FHConfig.Length = cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); -+ psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); -+ psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); -+ psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); -+#endif -+ + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = _JoinBss_CMD_;/* GEN_CMD_CODE(_JoinBss) */ + pcmd->parmbuf = (unsigned char *)psecnetwork; @@ -31864,9 +32142,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_cmd.c linux-5.11.4-rtl8812au + + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_debug.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_debug.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_debug.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_debug.c 2021-03-07 18:16:17.019954399 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_debug.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_debug.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_debug.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_debug.c 2022-01-28 22:59:35.554651420 +0200 @@ -0,0 +1,7096 @@ +/****************************************************************************** + * @@ -38964,9 +39242,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_debug.c linux-5.11.4-rtl8812 + return count; +} +#endif /* CONFIG_RTW_SW_LED */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_eeprom.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_eeprom.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_eeprom.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_eeprom.c 2021-03-07 18:16:17.019954399 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_eeprom.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_eeprom.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_eeprom.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_eeprom.c 2022-01-28 22:59:35.554651420 +0200 @@ -0,0 +1,369 @@ +/****************************************************************************** + * @@ -39337,10 +39615,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_eeprom.c linux-5.11.4-rtl881 + + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ieee80211.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ieee80211.c 2021-03-07 18:16:17.019954399 +0200 -@@ -0,0 +1,2934 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ieee80211.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ieee80211.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ieee80211.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ieee80211.c 2023-05-26 22:35:36.540136899 +0300 +@@ -0,0 +1,2896 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -39357,9 +39635,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c linux-5.11.4-rtl + *****************************************************************************/ +#define _IEEE80211_C + -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ #include -+#endif +#include + + @@ -40894,35 +41169,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c linux-5.11.4-rtl + return (key_char2num(hch) * 100) + (key_char2num(mch) * 10) + key_char2num(lch); +} + -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+#define MAC_ADDRESS_LEN 12 -+ -+int rtw_get_mac_addr_intel(unsigned char *buf) -+{ -+ int ret = 0; -+ int i; -+ struct file *fp = NULL; -+ mm_segment_t oldfs; -+ unsigned char c_mac[MAC_ADDRESS_LEN]; -+ char fname[] = "/config/wifi/mac.txt"; -+ int jj, kk; -+ -+ RTW_INFO("%s Enter\n", __FUNCTION__); -+ -+ ret = rtw_retrieve_from_file(fname, c_mac, MAC_ADDRESS_LEN); -+ if (ret < MAC_ADDRESS_LEN) -+ return -1; -+ -+ for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 2) -+ buf[jj] = key_2char2num(c_mac[kk], c_mac[kk + 1]); -+ -+ RTW_INFO("%s: read from file mac address: "MAC_FMT"\n", -+ __FUNCTION__, MAC_ARG(buf)); -+ -+ return 0; -+} -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ -+ +/* + * Description: + * rtw_check_invalid_mac_address: @@ -40996,12 +41242,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c linux-5.11.4-rtl + goto err_chk; + } + -+ /* platform specified */ -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ if (rtw_get_mac_addr_intel(mac) == 0) -+ goto err_chk; -+#endif -+ + /* Use the mac address stored in the Efuse */ + if (hw_mac_addr) { + _rtw_memcpy(mac, hw_mac_addr, ETH_ALEN); @@ -42275,9 +42515,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ieee80211.c linux-5.11.4-rtl + return _action_public_str[action]; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_io.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_io.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_io.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_io.c 2021-03-07 18:16:17.019954399 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_io.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_io.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_io.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_io.c 2022-01-28 22:59:35.555651468 +0200 @@ -0,0 +1,899 @@ +/****************************************************************************** + * @@ -43178,10 +43418,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_io.c linux-5.11.4-rtl8812au/ +#endif /* CONFIG_SDIO_HCI */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_query.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_query.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_query.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_query.c 2021-03-07 18:16:17.019954399 +0200 -@@ -0,0 +1,166 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_query.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_query.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_query.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_query.c 2023-05-26 22:35:36.540136899 +0300 +@@ -0,0 +1,19 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -43201,156 +43441,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_query.c linux-5.11.4-r +#include + + -+#ifdef PLATFORM_WINDOWS -+/* -+ * Added for WPA2-PSK, by Annie, 2005-09-20. -+ * */ -+u8 -+query_802_11_capability( -+ _adapter *Adapter, -+ u8 *pucBuf, -+ u32 *pulOutLen -+) -+{ -+ static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = { -+ {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, -+ {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled}, -+ {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, -+ {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled}, -+ {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, -+ {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled}, -+ {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, -+ {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled}, -+ {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, -+ {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled}, -+ {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, -+ {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled}, -+ {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, -+ {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled} -+ }; -+ static ULONG ulNumOfPairSupported = sizeof(szAuthEnc) / sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); -+ NDIS_802_11_CAPABILITY *pCap = (NDIS_802_11_CAPABILITY *)pucBuf; -+ u8 *pucAuthEncryptionSupported = (u8 *) pCap->AuthenticationEncryptionSupported; -+ -+ -+ pCap->Length = sizeof(NDIS_802_11_CAPABILITY); -+ if (ulNumOfPairSupported > 1) -+ pCap->Length += (ulNumOfPairSupported - 1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); -+ -+ pCap->Version = 2; -+ pCap->NoOfPMKIDs = NUM_PMKID_CACHE; -+ pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported; -+ -+ if (sizeof(szAuthEnc) <= 240) /* 240 = 256 - 4*4 */ { /* SecurityInfo.szCapability: only 256 bytes in size. */ -+ _rtw_memcpy(pucAuthEncryptionSupported, (u8 *)szAuthEnc, sizeof(szAuthEnc)); -+ *pulOutLen = pCap->Length; -+ return _TRUE; -+ } else { -+ *pulOutLen = 0; -+ return _FALSE; -+ } -+} -+ -+u8 query_802_11_association_information(_adapter *padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) -+{ -+ struct wlan_network *tgt_network; -+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ struct security_priv *psecuritypriv = &(padapter->securitypriv); -+ WLAN_BSSID_EX *psecnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; -+ u8 *pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); -+ unsigned char i, *auth_ie, *supp_ie; -+ -+ /* NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); */ -+ _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); -+ /* pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); */ -+ -+ /* ------------------------------------------------------ */ -+ /* Association Request related information */ -+ /* ------------------------------------------------------ */ -+ /* Req_1. AvailableRequestFixedIEs */ -+ if (psecnetwork != NULL) { -+ -+ pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; -+ pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short) *&psecnetwork->IEs[10]; -+ _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, -+ &psecnetwork->MacAddress, 6); -+ -+ pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); -+ -+ if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING | _FW_LINKED) == _TRUE) { -+ -+ if (psecuritypriv->ndisauthtype >= Ndis802_11AuthModeWPA2) -+ pDest[0] = 48; /* RSN Information Element */ -+ else -+ pDest[0] = 221; /* WPA(SSN) Information Element */ -+ -+ supp_ie = &psecuritypriv->supplicant_ie[0]; -+ -+ i = 13; /* 0~11 is fixed information element */ -+ while ((i < supp_ie[0]) && (i < 256)) { -+ if ((unsigned char)supp_ie[i] == pDest[0]) { -+ _rtw_memcpy((u8 *)(pDest), -+ &supp_ie[i], -+ supp_ie[1 + i] + 2); -+ -+ break; -+ } -+ -+ i = i + supp_ie[i + 1] + 2; -+ if (supp_ie[1 + i] == 0) -+ i = i + 1; -+ -+ } -+ -+ -+ pAssocInfo->RequestIELength += (2 + supp_ie[1 + i]); /* (2 + psecnetwork->IEs[1+i]+4); */ -+ -+ } -+ -+ -+ -+ } -+ -+ -+ /* ------------------------------------------------------ */ -+ /* Association Response related information */ -+ /* ------------------------------------------------------ */ -+ -+ if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { -+ tgt_network = &(pmlmepriv->cur_network); -+ if (tgt_network != NULL) { -+ pAssocInfo->AvailableResponseFixedIEs = -+ NDIS_802_11_AI_RESFI_CAPABILITIES -+ | NDIS_802_11_AI_RESFI_ASSOCIATIONID -+ ; -+ -+ pAssocInfo->ResponseFixedIEs.Capabilities = (unsigned short) *&tgt_network->network.IEs[10]; -+ pAssocInfo->ResponseFixedIEs.StatusCode = 0; -+ pAssocInfo->ResponseFixedIEs.AssociationId = (unsigned short) tgt_network->aid; -+ -+ pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; -+ auth_ie = &psecuritypriv->authenticator_ie[0]; -+ -+ -+ i = auth_ie[0] - 12; -+ if (i > 0) { -+ _rtw_memcpy((u8 *)&pDest[0], &auth_ie[1], i); -+ pAssocInfo->ResponseIELength = i; -+ } -+ -+ -+ pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; -+ -+ -+ } -+ } -+ -+ return _TRUE; -+} -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_rtl.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_rtl.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_rtl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_rtl.c 2021-03-07 18:16:17.020954446 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_rtl.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_rtl.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_rtl.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_rtl.c 2022-01-28 22:59:35.555651468 +0200 @@ -0,0 +1,901 @@ +/****************************************************************************** + * @@ -44253,10 +44346,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_rtl.c linux-5.11.4-rtl + return status; +} +/* ************** oid_rtl_seg_03_00 section end ************** */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_set.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_set.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_set.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_ioctl_set.c 2021-03-07 18:16:17.020954446 +0200 -@@ -0,0 +1,930 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_set.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_set.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_ioctl_set.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_ioctl_set.c 2023-05-26 22:35:36.540136899 +0300 +@@ -0,0 +1,853 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -44456,83 +44549,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_set.c linux-5.11.4-rtl + return ret; +} + -+#ifdef PLATFORM_WINDOWS -+u8 rtw_pnp_set_power_wakeup(_adapter *padapter) -+{ -+ u8 res = _SUCCESS; -+ -+ -+ -+ res = rtw_setstandby_cmd(padapter, 0); -+ -+ -+ -+ return res; -+} -+ -+u8 rtw_pnp_set_power_sleep(_adapter *padapter) -+{ -+ u8 res = _SUCCESS; -+ -+ -+ /* DbgPrint("+rtw_pnp_set_power_sleep\n"); */ -+ -+ res = rtw_setstandby_cmd(padapter, 1); -+ -+ -+ -+ return res; -+} -+ -+u8 rtw_set_802_11_reload_defaults(_adapter *padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults) -+{ -+ -+ -+ -+ /* SecClearAllKeys(Adapter); */ -+ /* 8711 CAM was not for En/Decrypt only */ -+ /* so, we can't clear all keys. */ -+ /* should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM */ -+ -+ /* TO DO... */ -+ -+ -+ return _TRUE; -+} -+ -+u8 set_802_11_test(_adapter *padapter, NDIS_802_11_TEST *test) -+{ -+ u8 ret = _TRUE; -+ -+ -+ switch (test->Type) { -+ case 1: -+ NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8); -+ NdisMIndicateStatusComplete(padapter->hndis_adapter); -+ break; -+ -+ case 2: -+ NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI)); -+ NdisMIndicateStatusComplete(padapter->hndis_adapter); -+ break; -+ -+ default: -+ ret = _FALSE; -+ break; -+ } -+ -+ -+ return ret; -+} -+ -+u8 rtw_set_802_11_pmkid(_adapter *padapter, NDIS_802_11_PMKID *pmkid) -+{ -+ u8 ret = _SUCCESS; -+ -+ return ret; -+} -+ -+#endif + +u8 rtw_set_802_11_bssid(_adapter *padapter, u8 *bssid) +{ @@ -45187,9 +45203,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_ioctl_set.c linux-5.11.4-rtl + RTW_PRINT(FUNC_ADPT_FMT" band:%d fail\n", FUNC_ADPT_ARG(adapter), band); + return _FAIL; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_iol.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_iol.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_iol.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_iol.c 2021-03-07 18:16:17.020954446 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_iol.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_iol.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_iol.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_iol.c 2022-01-28 22:59:35.555651468 +0200 @@ -0,0 +1,394 @@ +/****************************************************************************** + * @@ -45585,9 +45601,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_iol.c linux-5.11.4-rtl8812au + + +#endif /* CONFIG_IOL */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mem.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mem.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mem.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mem.c 2021-03-07 18:16:17.020954446 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mem.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mem.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mem.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mem.c 2022-01-28 22:59:35.555651468 +0200 @@ -0,0 +1,128 @@ +/****************************************************************************** + * @@ -45717,9 +45733,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mem.c linux-5.11.4-rtl8812au + +module_init(rtw_mem_init); +module_exit(rtw_mem_exit); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mi.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mi.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mi.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mi.c 2021-03-07 18:16:17.020954446 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mi.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mi.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mi.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mi.c 2022-01-28 22:59:35.555651468 +0200 @@ -0,0 +1,1571 @@ +/****************************************************************************** + * @@ -47292,10 +47308,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mi.c linux-5.11.4-rtl8812au/ +#endif + return n_assoc_iface; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mlme.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mlme.c 2021-03-07 18:16:17.021954493 +0200 -@@ -0,0 +1,5359 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mlme.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mlme.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mlme.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mlme.c 2023-05-26 22:35:36.540136899 +0300 +@@ -0,0 +1,5358 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -50139,10 +50155,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme.c linux-5.11.4-rtl8812a + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); + if (psta) + rtw_sta_mstatus_disc_rpt(adapter, psta->cmn.mac_id); -+ else { ++ else + RTW_INFO("%s "ADPT_FMT" - mac_addr: "MAC_FMT" psta == NULL\n", __func__, ADPT_ARG(adapter), MAC_ARG(tgt_network->network.MacAddress)); -+ rtw_warn_on(1); -+ } + } +} + @@ -50491,10 +50505,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme.c linux-5.11.4-rtl8812a + #ifdef CONFIG_LAYER2_ROAMING + if (rtw_chk_roam_flags(padapter, RTW_ROAM_ACTIVE) && pmlmepriv->need_to_roam == _TRUE) + RTW_INFO(FUNC_ADPT_FMT" need to roam, don't care BusyTraffic\n", FUNC_ADPT_ARG(padapter)); -+ else ++ else { + #endif + RTW_INFO(FUNC_ADPT_FMT" exit BusyTraffic\n", FUNC_ADPT_ARG(padapter)); + goto exit; ++ } + } + else if (ssc_chk != SS_ALLOW) + goto exit; @@ -52655,9 +52670,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme.c linux-5.11.4-rtl8812a + , MAC_ARG(ARP_TARGET_MAC_ADDR(arp)), IP_ARG(ARP_TARGET_IP_ADDR(arp))); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme_ext.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mlme_ext.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme_ext.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mlme_ext.c 2021-03-07 18:16:17.023954587 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mlme_ext.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mlme_ext.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mlme_ext.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mlme_ext.c 2022-01-28 22:59:35.558651610 +0200 @@ -0,0 +1,16825 @@ +/****************************************************************************** + * @@ -69484,10 +69499,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mlme_ext.c linux-5.11.4-rtl8 +#endif /* CONFIG_IOCTL_CFG80211 */ +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mp.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mp.c 2021-03-07 18:16:17.023954587 +0200 -@@ -0,0 +1,3867 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mp.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mp.c 2022-12-18 17:40:24.573937030 +0200 +@@ -0,0 +1,3871 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -70904,7 +70919,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp.c linux-5.11.4-rtl8812au/ + pmptx->pallocated_buf = NULL; + pmptx->stop = 1; + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + thread_exit(NULL); ++#else ++ kthread_thread_exit(NULL); ++#endif + return 0; +} + @@ -73355,10 +73374,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp.c linux-5.11.4-rtl8812au/ + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mp_ioctl.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_mp_ioctl.c 2021-03-07 18:16:17.023954587 +0200 -@@ -0,0 +1,2529 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mp_ioctl.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mp_ioctl.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_mp_ioctl.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_mp_ioctl.c 2023-05-26 22:35:36.541136899 +0300 +@@ -0,0 +1,2382 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -73403,9 +73422,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* **************** oid_rtl_seg_81_87_80 section start **************** */ +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; @@ -73439,9 +73455,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; @@ -73475,9 +73488,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; @@ -73517,9 +73527,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; @@ -73564,9 +73571,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + * ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 ratevalue;/* 4 */ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -73595,9 +73599,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 mode; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -73632,9 +73633,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + @@ -73654,9 +73652,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 Channel; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -73689,9 +73684,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u16 bandwidth; + u16 channel_offset; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; @@ -73724,9 +73716,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 antenna; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -73756,9 +73745,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 tx_pwr_idx; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -73891,9 +73877,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + @@ -73913,9 +73896,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + @@ -73940,9 +73920,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + @@ -73968,9 +73945,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* **************** oid_rtl_seg_81_80_20 section end **************** */ +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74003,9 +73977,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74038,9 +74009,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74073,9 +74041,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74104,9 +74069,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + if (poid_par_priv->type_of_oid != SET_OID) @@ -74126,9 +74088,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + PNDIS_802_11_SSID pssid; @@ -74162,9 +74121,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pRW_Reg RegRWStruct; + u32 offset, width; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; @@ -74207,9 +74163,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pRW_Reg RegRWStruct; + u32 offset, width, value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; @@ -74263,9 +74216,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pBurst_RW_Reg pBstRwReg; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74294,9 +74244,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pBurst_RW_Reg pBstRwReg; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74327,9 +74274,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + + TX_CMD_Desc *TxCmd_Info; + @@ -74360,9 +74304,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pEEPROM_RWParam pEEPROM; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74392,9 +74333,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + pEEPROM_RWParam pEEPROM; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74487,9 +74425,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI @@ -74527,9 +74462,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI @@ -74563,9 +74495,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + @@ -74648,9 +74577,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + @@ -74671,9 +74597,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ----------------------------------------------------------------------------- */ +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + u8 thermal = 0; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -74702,9 +74625,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + @@ -74741,9 +74661,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + @@ -74773,9 +74690,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u32 ratevalue; + u8 datarates[NumRates]; + int i; @@ -74874,9 +74788,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct setratable_parm *prate_table; @@ -75048,9 +74959,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; @@ -75092,9 +75000,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; @@ -75227,9 +75132,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + DR_VARIABLE_STRUCT *pdrv_var; @@ -75291,9 +75193,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; @@ -75332,9 +75231,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; @@ -75369,9 +75265,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + PPGPKT_STRUCT ppgpkt; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -75414,9 +75307,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u16 size; + u8 ret; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; @@ -75480,9 +75370,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u8 *data; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -75531,9 +75418,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + + u32 crystal_cap = 0; + @@ -75561,9 +75445,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u8 rx_pkt_type; + /* u32 rcr_val32; */ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; @@ -75643,9 +75524,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + u32 txagc; @@ -75821,9 +75699,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) +{ -+#ifdef PLATFORM_OS_XP -+ _irqL oldirql; -+#endif + u8 bpwrup; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#ifdef PLATFORM_LINUX @@ -75862,9 +75737,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 +#if 0 + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -+ /* #ifdef PLATFORM_OS_XP */ -+ /* _irqL oldirql; -+ * #endif */ + + + if (poid_par_priv->type_of_oid != QUERY_OID) { @@ -75888,9 +75760,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_mp_ioctl.c linux-5.11.4-rtl8 + return 0; +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_odm.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_odm.c 2021-03-07 18:16:17.023954587 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_odm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_odm.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_odm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_odm.c 2023-05-26 22:35:36.541136899 +0300 @@ -0,0 +1,420 @@ +/****************************************************************************** + * @@ -76167,7 +76039,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c linux-5.11.4-rtl8812au + RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u)\n" + , *phys & 0xf + , MAC_ARG(get_ta(wlanhdr)) -+ , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC" ++ , is_broadcast_mac_addr(wifi_get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(wifi_get_ra(wlanhdr)) ? "MC" : "UC" + , HDATA_RATE(attrib->data_rate) + , phys_t0->band, phys_t0->channel, phys_t0->rxsc + ); @@ -76283,7 +76155,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c linux-5.11.4-rtl8812au + RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, rf_mode:%u, l_rxsc:%u, ht_rxsc:%u) => %u,%u\n" + , *phys & 0xf + , MAC_ARG(get_ta(wlanhdr)) -+ , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC" ++ , is_broadcast_mac_addr(wifi_get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(wifi_get_ra(wlanhdr)) ? "MC" : "UC" + , HDATA_RATE(attrib->data_rate) + , phys_t1->band, phys_t1->channel, phys_t1->rf_mode, phys_t1->l_rxsc, phys_t1->ht_rxsc + , pkt_cch, pkt_bw @@ -76301,7 +76173,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c linux-5.11.4-rtl8812au + RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u, ht_rxsc:%u)\n" + , *phys & 0xf + , MAC_ARG(get_ta(wlanhdr)) -+ , is_broadcast_mac_addr(get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(get_ra(wlanhdr)) ? "MC" : "UC" ++ , is_broadcast_mac_addr(wifi_get_ra(wlanhdr)) ? "BC" : is_multicast_mac_addr(wifi_get_ra(wlanhdr)) ? "MC" : "UC" + , HDATA_RATE(attrib->data_rate) + , phys_t2->band, phys_t2->channel, phys_t2->l_rxsc, phys_t2->ht_rxsc + ); @@ -76312,9 +76184,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_odm.c linux-5.11.4-rtl8812au + +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_p2p.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_p2p.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_p2p.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_p2p.c 2021-03-07 18:16:17.024954635 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_p2p.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_p2p.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_p2p.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_p2p.c 2022-01-28 22:59:35.559651657 +0200 @@ -0,0 +1,5456 @@ +/****************************************************************************** + * @@ -81772,10 +81644,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_p2p.c linux-5.11.4-rtl8812au +} + +#endif /* CONFIG_P2P */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_pwrctrl.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_pwrctrl.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_pwrctrl.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_pwrctrl.c 2021-03-07 18:16:17.024954635 +0200 -@@ -0,0 +1,2765 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_pwrctrl.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_pwrctrl.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_pwrctrl.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_pwrctrl.c 2023-05-26 22:35:36.541136899 +0300 +@@ -0,0 +1,2761 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -83868,10 +83740,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_pwrctrl.c linux-5.11.4-rtl88 + return; +#endif + -+#ifdef PLATFORM_WINDOWS -+ pwrctrlpriv->pnp_current_pwr_state = NdisDeviceStateD0; -+#endif -+ + _init_pwrlock(&pwrctrlpriv->lock); + _init_pwrlock(&pwrctrlpriv->check_32k_lock); + pwrctrlpriv->rf_pwrstate = rf_on; @@ -84541,10 +84409,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_pwrctrl.c linux-5.11.4-rtl88 + _rtw_ssmps(adapter, sta); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_recv.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_recv.c 2021-03-07 18:16:17.025954682 +0200 -@@ -0,0 +1,5141 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_recv.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_recv.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_recv.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_recv.c 2023-05-26 22:35:36.541136899 +0300 +@@ -0,0 +1,5125 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -87119,21 +86987,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812a + /* ptr -= 16; */ + /* _rtw_memcpy(ptr, get_rxmem(precvframe), 16); */ + } else { -+#ifdef PLATFORM_OS_XP -+ NDIS_PACKET_8021Q_INFO VlanPriInfo; -+ UINT32 UserPriority = precvframe->u.hdr.attrib.priority; -+ UINT32 VlanID = (pvlan != NULL ? get_vlan_id(pvlan) : 0); + -+ VlanPriInfo.Value = /* Get current value. */ -+ NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); -+ -+ VlanPriInfo.TagHeader.UserPriority = UserPriority; -+ VlanPriInfo.TagHeader.VlanId = VlanID ; -+ -+ VlanPriInfo.TagHeader.CanonicalFormatId = 0; /* Should be zero. */ -+ VlanPriInfo.TagHeader.Reserved = 0; /* Should be zero. */ -+ NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; -+#endif + } + + if (eth_type == 0x8712) { /* append rx status for mp test packets */ @@ -87150,8 +87004,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812a + _rtw_memcpy(ptr + 12, ð_type, 2); + +exit: -+ -+ + return ret; +} +#endif @@ -89398,7 +89250,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812a + wlanhdr = get_recvframe_data(precvframe); + + ta = get_ta(wlanhdr); -+ ra = get_ra(wlanhdr); ++ ra = wifi_get_ra(wlanhdr); + is_ra_bmc = IS_MCAST(ra); + + if (_rtw_memcmp(adapter_mac_addr(padapter), ta, ETH_ALEN) == _TRUE) { @@ -89538,7 +89390,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812a +{ + s32 ret = _SUCCESS; + u8 *pbuf = precvframe->u.hdr.rx_data; -+ u8 *pda = get_ra(pbuf); ++ u8 *pda = wifi_get_ra(pbuf); + u8 ra_is_bmc = IS_MCAST(pda); + _adapter *primary_padapter = precvframe->u.hdr.adapter; +#ifdef CONFIG_CONCURRENT_MODE @@ -89686,10 +89538,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_recv.c linux-5.11.4-rtl8812a + ); +} +#endif /* DBG_RX_BH_TRACKING */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rf.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_rf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rf.c 2021-03-07 18:16:17.025954682 +0200 -@@ -0,0 +1,1394 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rf.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rf.c 2022-01-28 22:59:35.560651705 +0200 +@@ -0,0 +1,1395 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -90143,7 +89995,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rf.c linux-5.11.4-rtl8812au/ + return 2484; + else if (chan < 14) + return 2407 + chan * 5; -+ } else if (chan >= 36 && chan <= 177) ++ } else if (chan >= 15 && chan <= 177) + return 5000 + chan * 5; + + return 0; /* not supported */ @@ -90464,9 +90316,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rf.c linux-5.11.4-rtl8812au/ + + RTW_PRINT_SEL(sel, "txpwr_lmt_2g_cck_ofdm_state:0x%02x\n", rfctl->txpwr_lmt_2g_cck_ofdm_state); + #ifdef CONFIG_IEEE80211_BAND_5GHZ -+ if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) ++ if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) { + RTW_PRINT_SEL(sel, "txpwr_lmt_5g_cck_ofdm_state:0x%02x\n", rfctl->txpwr_lmt_5g_cck_ofdm_state); + RTW_PRINT_SEL(sel, "txpwr_lmt_5g_20_40_ref:0x%02x\n", rfctl->txpwr_lmt_5g_20_40_ref); ++ } + #endif + RTW_PRINT_SEL(sel, "\n"); + @@ -91084,9 +90937,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rf.c linux-5.11.4-rtl8812au/ + + return rtw_is_long_cac_range(hi, lo, dfs_region) ? _TRUE : _FALSE; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rm.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rm.c 2021-03-07 18:16:17.025954682 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rm.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rm.c 2022-01-28 22:59:35.561651752 +0200 @@ -0,0 +1,2470 @@ +/****************************************************************************** + * @@ -93558,9 +93411,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm.c linux-5.11.4-rtl8812au/ +#endif +} +#endif /* CONFIG_RTW_80211K */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm_fsm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rm_fsm.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm_fsm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rm_fsm.c 2021-03-07 18:16:17.025954682 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rm_fsm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rm_fsm.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rm_fsm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rm_fsm.c 2022-01-28 22:59:35.561651752 +0200 @@ -0,0 +1,998 @@ +/****************************************************************************** + * @@ -94560,9 +94413,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rm_fsm.c linux-5.11.4-rtl881 + rm_state_run(prm, RM_EV_state_in); +} +#endif /* CONFIG_RTW_80211K */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rson.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rson.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_rson.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_rson.c 2021-03-07 18:16:17.025954682 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rson.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rson.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_rson.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_rson.c 2022-01-28 22:59:35.561651752 +0200 @@ -0,0 +1,595 @@ +/****************************************************************************** + * @@ -95159,9 +95012,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_rson.c linux-5.11.4-rtl8812a +} + +#endif /* CONFIG_RTW_REPEATER_SON */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sdio.c 2021-03-07 18:16:17.025954682 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sdio.c 2022-01-28 22:59:35.561651752 +0200 @@ -0,0 +1,130 @@ +/****************************************************************************** + * @@ -95293,9 +95146,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sdio.c linux-5.11.4-rtl8812a + + return ret; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_security.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_security.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_security.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_security.c 2021-03-07 18:16:17.026954729 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_security.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_security.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_security.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_security.c 2022-12-18 17:40:24.573937030 +0200 @@ -0,0 +1,3122 @@ +/****************************************************************************** + * @@ -96872,7 +96725,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_security.c linux-5.11.4-rtl8 + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; + + /* 4 start to encrypt each fragment */ -+ if ((pattrib->encrypt == _AES_)) { ++ if (pattrib->encrypt == _AES_) { + /* + if(pattrib->psta) + { @@ -97227,7 +97080,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_security.c linux-5.11.4-rtl8 + u32 res = _SUCCESS; + pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data; + /* 4 start to encrypt each fragment */ -+ if ((prxattrib->encrypt == _AES_)) { ++ if (prxattrib->encrypt == _AES_) { + + stainfo = rtw_get_stainfo(&padapter->stapriv , &prxattrib->ta[0]); + if (stainfo != NULL) { @@ -98419,9 +98272,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_security.c linux-5.11.4-rtl8 + return crc; +} +#endif /*CONFIG_WOWLAN*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sreset.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sreset.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_sreset.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sreset.c 2021-03-07 18:16:17.026954729 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sreset.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sreset.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sreset.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sreset.c 2022-01-28 22:59:35.561651752 +0200 @@ -0,0 +1,314 @@ +/****************************************************************************** + * @@ -98737,10 +98590,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sreset.c linux-5.11.4-rtl881 + psrtpriv->rx_cnt = 0; +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sta_mgt.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sta_mgt.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_sta_mgt.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_sta_mgt.c 2021-03-07 18:16:17.026954729 +0200 -@@ -0,0 +1,1323 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sta_mgt.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sta_mgt.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_sta_mgt.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_sta_mgt.c 2022-12-18 17:40:24.573937030 +0200 +@@ -0,0 +1,1319 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -99108,21 +98961,17 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sta_mgt.c linux-5.11.4-rtl88 + +} + -+void rtw_mfree_stainfo(struct sta_info *psta); +void rtw_mfree_stainfo(struct sta_info *psta) +{ + -+ if (&psta->lock != NULL) -+ _rtw_spinlock_free(&psta->lock); ++ _rtw_spinlock_free(&psta->lock); + + _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv); + _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv); + +} + -+ +/* this function is used to free the memory of lock || sema for all stainfos */ -+void rtw_mfree_all_stainfo(struct sta_priv *pstapriv); +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv) +{ + _irqL irqL; @@ -100064,9 +99913,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_sta_mgt.c linux-5.11.4-rtl88 +} +#endif /* CONFIG_RTW_PRE_LINK_STA */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_tdls.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_tdls.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_tdls.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_tdls.c 2021-03-07 18:16:17.026954729 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_tdls.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_tdls.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_tdls.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_tdls.c 2022-01-28 22:59:35.562651800 +0200 @@ -0,0 +1,3505 @@ +/****************************************************************************** + * @@ -103573,9 +103422,1148 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_tdls.c linux-5.11.4-rtl8812a +} + +#endif /* CONFIG_TDLS */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wapi.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wapi.c 2021-03-07 18:16:17.027954777 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_vht.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_vht.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_vht.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_vht.c 2022-01-28 22:59:35.562651800 +0200 +@@ -0,0 +1,1135 @@ ++/****************************************************************************** ++ * ++ * Copyright(c) 2007 - 2017 Realtek Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of version 2 of the GNU General Public License as ++ * published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ *****************************************************************************/ ++#define _RTW_VHT_C ++ ++#include ++#include ++ ++#ifdef CONFIG_80211AC_VHT ++const u16 _vht_max_mpdu_len[] = { ++ 3895, ++ 7991, ++ 11454, ++ 0, ++}; ++ ++const u8 _vht_sup_ch_width_set_to_bw_cap[] = { ++ BW_CAP_80M, ++ BW_CAP_80M | BW_CAP_160M, ++ BW_CAP_80M | BW_CAP_160M | BW_CAP_80_80M, ++ 0, ++}; ++ ++const char *const _vht_sup_ch_width_set_str[] = { ++ "80MHz", ++ "160MHz", ++ "160MHz & 80+80MHz", ++ "BW-RSVD", ++}; ++ ++void dump_vht_cap_ie_content(void *sel, const u8 *buf, u32 buf_len) ++{ ++ if (buf_len != VHT_CAP_IE_LEN) { ++ RTW_PRINT_SEL(sel, "Invalid VHT capability IE len:%d != %d\n", buf_len, VHT_CAP_IE_LEN); ++ return; ++ } ++ ++ RTW_PRINT_SEL(sel, "cap_info:%02x %02x %02x %02x: MAX_MPDU_LEN:%u %s%s%s%s%s RX-STBC:%u MAX_AMPDU_LEN:%u\n" ++ , *(buf), *(buf + 1), *(buf + 2), *(buf + 3) ++ , vht_max_mpdu_len(GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(buf)) ++ , vht_sup_ch_width_set_str(GET_VHT_CAPABILITY_ELE_CHL_WIDTH(buf)) ++ , GET_VHT_CAPABILITY_ELE_RX_LDPC(buf) ? " RX-LDPC" : "" ++ , GET_VHT_CAPABILITY_ELE_SHORT_GI80M(buf) ? " SGI-80" : "" ++ , GET_VHT_CAPABILITY_ELE_SHORT_GI160M(buf) ? " SGI-160" : "" ++ , GET_VHT_CAPABILITY_ELE_TX_STBC(buf) ? " TX-STBC" : "" ++ , GET_VHT_CAPABILITY_ELE_RX_STBC(buf) ++ , VHT_MAX_AMPDU_LEN(GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(buf)) ++ ); ++} ++ ++void dump_vht_cap_ie(void *sel, const u8 *ie, u32 ie_len) ++{ ++ const u8 *vht_cap_ie; ++ sint vht_cap_ielen; ++ ++ vht_cap_ie = rtw_get_ie(ie, WLAN_EID_VHT_CAPABILITY, &vht_cap_ielen, ie_len); ++ if (!ie || vht_cap_ie != ie) ++ return; ++ ++ dump_vht_cap_ie_content(sel, vht_cap_ie + 2, vht_cap_ielen); ++} ++ ++const char *const _vht_op_ch_width_str[] = { ++ "20 or 40MHz", ++ "80MHz", ++ "160MHz", ++ "80+80MHz", ++ "BW-RSVD", ++}; ++ ++void dump_vht_op_ie_content(void *sel, const u8 *buf, u32 buf_len) ++{ ++ if (buf_len != VHT_OP_IE_LEN) { ++ RTW_PRINT_SEL(sel, "Invalid VHT operation IE len:%d != %d\n", buf_len, VHT_OP_IE_LEN); ++ return; ++ } ++ ++ RTW_PRINT_SEL(sel, "%s, ch0:%u, ch1:%u\n" ++ , vht_op_ch_width_str(GET_VHT_OPERATION_ELE_CHL_WIDTH(buf)) ++ , GET_VHT_OPERATION_ELE_CENTER_FREQ1(buf) ++ , GET_VHT_OPERATION_ELE_CENTER_FREQ2(buf) ++ ); ++} ++ ++void dump_vht_op_ie(void *sel, const u8 *ie, u32 ie_len) ++{ ++ const u8 *vht_op_ie; ++ sint vht_op_ielen; ++ ++ vht_op_ie = rtw_get_ie(ie, WLAN_EID_VHT_OPERATION, &vht_op_ielen, ie_len); ++ if (!ie || vht_op_ie != ie) ++ return; ++ ++ dump_vht_op_ie_content(sel, vht_op_ie + 2, vht_op_ielen); ++} ++ ++/* 20/40/80, ShortGI, MCS Rate */ ++const u16 VHT_MCS_DATA_RATE[3][2][30] = { ++ { { ++ 13, 26, 39, 52, 78, 104, 117, 130, 156, 156, ++ 26, 52, 78, 104, 156, 208, 234, 260, 312, 312, ++ 39, 78, 117, 156, 234, 312, 351, 390, 468, 520 ++ }, /* Long GI, 20MHz */ ++ { ++ 14, 29, 43, 58, 87, 116, 130, 144, 173, 173, ++ 29, 58, 87, 116, 173, 231, 260, 289, 347, 347, ++ 43, 87, 130, 173, 260, 347, 390, 433, 520, 578 ++ } ++ }, /* Short GI, 20MHz */ ++ { { ++ 27, 54, 81, 108, 162, 216, 243, 270, 324, 360, ++ 54, 108, 162, 216, 324, 432, 486, 540, 648, 720, ++ 81, 162, 243, 324, 486, 648, 729, 810, 972, 1080 ++ }, /* Long GI, 40MHz */ ++ { ++ 30, 60, 90, 120, 180, 240, 270, 300, 360, 400, ++ 60, 120, 180, 240, 360, 480, 540, 600, 720, 800, ++ 90, 180, 270, 360, 540, 720, 810, 900, 1080, 1200 ++ } ++ }, /* Short GI, 40MHz */ ++ { { ++ 59, 117, 176, 234, 351, 468, 527, 585, 702, 780, ++ 117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560, ++ 176, 351, 527, 702, 1053, 1404, 1580, 1755, 2106, 2340 ++ }, /* Long GI, 80MHz */ ++ { ++ 65, 130, 195, 260, 390, 520, 585, 650, 780, 867, ++ 130, 260, 390, 520, 780, 1040, 1170, 1300, 1560, 1734, ++ 195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2600 ++ } ++ } /* Short GI, 80MHz */ ++}; ++ ++u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map) ++{ ++ u8 i, j; ++ u8 bit_map; ++ u8 vht_mcs_rate = 0; ++ ++ for (i = 0; i < 2; i++) { ++ if (pvht_mcs_map[i] != 0xff) { ++ for (j = 0; j < 8; j += 2) { ++ bit_map = (pvht_mcs_map[i] >> j) & 3; ++ ++ if (bit_map != 3) ++ vht_mcs_rate = MGN_VHT1SS_MCS7 + 10 * j / 2 + i * 40 + bit_map; /* VHT rate indications begin from 0x90 */ ++ } ++ } ++ } ++ ++ /* RTW_INFO("HighestVHTMCSRate is %x\n", vht_mcs_rate); */ ++ return vht_mcs_rate; ++} ++ ++u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map) ++{ ++ u8 i, j; ++ u8 bit_map; ++ u8 nss = 0; ++ ++ for (i = 0; i < 2; i++) { ++ if (pvht_mcs_map[i] != 0xff) { ++ for (j = 0; j < 8; j += 2) { ++ bit_map = (pvht_mcs_map[i] >> j) & 3; ++ ++ if (bit_map != 3) ++ nss++; ++ } ++ } ++ } ++ ++ /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ ++ return nss; ++} ++ ++void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map) ++{ ++ u8 i, j; ++ u8 cur_rate, target_rate; ++ ++ for (i = 0; i < 2; i++) { ++ target_mcs_map[i] = 0; ++ for (j = 0; j < 8; j += 2) { ++ cur_rate = (cur_mcs_map[i] >> j) & 3; ++ if (cur_rate == 3) /* 0x3 indicates not supported that num of SS */ ++ target_rate = 3; ++ else if (nss <= ((j / 2) + i * 4)) ++ target_rate = 3; ++ else ++ target_rate = cur_rate; ++ ++ target_mcs_map[i] |= (target_rate << j); ++ } ++ } ++ ++ /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ ++} ++ ++u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate) ++{ ++ if (vht_mcs_rate > MGN_VHT3SS_MCS9) ++ vht_mcs_rate = MGN_VHT3SS_MCS9; ++ /* RTW_INFO("bw=%d, short_GI=%d, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)=%d\n", bw, short_GI, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)); */ ++ return VHT_MCS_DATA_RATE[bw][short_GI][((vht_mcs_rate - MGN_VHT1SS_MCS0) & 0x3f)]; ++} ++ ++void rtw_vht_use_default_setting(_adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ BOOLEAN bHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE; ++#ifdef CONFIG_BEAMFORMING ++ BOOLEAN bHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE; ++ u8 mu_bfer, mu_bfee; ++#endif /* CONFIG_BEAMFORMING */ ++ u8 rf_type = 0; ++ u8 tx_nss, rx_nss; ++ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); ++ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ pvhtpriv->sgi_80m = TEST_FLAG(pregistrypriv->short_gi, BIT2) ? _TRUE : _FALSE; ++ ++ /* LDPC support */ ++ rtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport); ++ CLEAR_FLAGS(pvhtpriv->ldpc_cap); ++ if (bHwLDPCSupport) { ++ if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT0)) ++ SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX); ++ } ++ rtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport); ++ if (bHwLDPCSupport) { ++ if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT1)) ++ SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX); ++ } ++ if (pvhtpriv->ldpc_cap) ++ RTW_INFO("[VHT] Support LDPC = 0x%02X\n", pvhtpriv->ldpc_cap); ++ ++ /* STBC */ ++ rtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport); ++ CLEAR_FLAGS(pvhtpriv->stbc_cap); ++ if (bHwSTBCSupport) { ++ if (TEST_FLAG(pregistrypriv->stbc_cap, BIT1)) ++ SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX); ++ } ++ rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport); ++ if (bHwSTBCSupport) { ++ if (TEST_FLAG(pregistrypriv->stbc_cap, BIT0)) ++ SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX); ++ } ++ if (pvhtpriv->stbc_cap) ++ RTW_INFO("[VHT] Support STBC = 0x%02X\n", pvhtpriv->stbc_cap); ++ ++ /* Beamforming setting */ ++ CLEAR_FLAGS(pvhtpriv->beamform_cap); ++#ifdef CONFIG_BEAMFORMING ++#ifdef RTW_BEAMFORMING_VERSION_2 ++ /* only enable beamforming in STA client mode */ ++ if (MLME_IS_STA(padapter) && !MLME_IS_GC(padapter) ++ && !MLME_IS_ADHOC(padapter) ++ && !MLME_IS_MESH(padapter)) ++#endif ++ { ++ rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, ++ (u8 *)&bHwSupportBeamformer); ++ rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, ++ (u8 *)&bHwSupportBeamformee); ++ mu_bfer = _FALSE; ++ mu_bfee = _FALSE; ++ rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMER, &mu_bfer); ++ rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMEE, &mu_bfee); ++ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT0) && bHwSupportBeamformer) { ++#ifdef CONFIG_CONCURRENT_MODE ++ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ RTW_INFO("[VHT] CONCURRENT AP Support Beamformer\n"); ++ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) ++ && (_TRUE == mu_bfer)) { ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); ++ RTW_INFO("[VHT] Support MU-MIMO AP\n"); ++ } ++ } else ++ RTW_INFO("[VHT] CONCURRENT not AP ;not allow Support Beamformer\n"); ++#else ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ RTW_INFO("[VHT] Support Beamformer\n"); ++ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) ++ && (_TRUE == mu_bfer) ++ && ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); ++ RTW_INFO("[VHT] Support MU-MIMO AP\n"); ++ } ++#endif ++ } ++ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee) { ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); ++ RTW_INFO("[VHT] Support Beamformee\n"); ++ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(3)) ++ && (_TRUE == mu_bfee) ++ && ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)) { ++ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); ++ RTW_INFO("[VHT] Support MU-MIMO STA\n"); ++ } ++ } ++ } ++#endif /* CONFIG_BEAMFORMING */ ++ ++ pvhtpriv->ampdu_len = pregistrypriv->ampdu_factor; ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); ++ rx_nss = rtw_min(rf_type_to_rf_rx_cnt(rf_type), hal_spec->rx_nss_num); ++ ++ /* for now, vhtpriv.vht_mcs_map comes from RX NSS */ ++ rtw_vht_nss_to_mcsmap(rx_nss, pvhtpriv->vht_mcs_map, pregistrypriv->vht_rx_mcs_map); ++ pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); ++} ++ ++u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss) ++{ ++ u8 i, j, tmp; ++ u64 bitmap = 0; ++ u8 bits_nss = nss * 2; ++ ++ for (i = j = 0; i < bits_nss; i += 2, j += 10) { ++ /* every two bits means single sptial stream */ ++ tmp = (mcs_map[i / 8] >> i) & 3; ++ ++ switch (tmp) { ++ case 2: ++ bitmap = bitmap | (0x03ff << j); ++ break; ++ case 1: ++ bitmap = bitmap | (0x01ff << j); ++ break; ++ case 0: ++ bitmap = bitmap | (0x00ff << j); ++ break; ++ default: ++ break; ++ } ++ } ++ ++ RTW_INFO("vht_mcs_map=%02x %02x, nss=%u => bitmap=%016llx\n" ++ , mcs_map[0], mcs_map[1], nss, bitmap); ++ ++ return bitmap; ++} ++ ++#ifdef CONFIG_BEAMFORMING ++void update_sta_vht_info_apmode_bf_cap(_adapter *padapter, struct sta_info *psta) ++{ ++ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); ++ struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv; ++ struct vht_priv *pvhtpriv_sta = &psta->vhtpriv; ++ u16 cur_beamform_cap = 0; ++ ++ /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ ++ if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && ++ GET_VHT_CAPABILITY_ELE_SU_BFEE(pvhtpriv_sta->vht_cap)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); ++ /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pvhtpriv_sta->vht_cap) << 8); ++ } ++ ++ /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ ++ if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && ++ GET_VHT_CAPABILITY_ELE_SU_BFER(pvhtpriv_sta->vht_cap)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pvhtpriv_sta->vht_cap) << 12); ++ } ++ ++ if (cur_beamform_cap) ++ RTW_INFO("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->cmn.aid, cur_beamform_cap); ++ ++ pvhtpriv_sta->beamform_cap = cur_beamform_cap; ++ psta->cmn.bf_info.vht_beamform_cap = cur_beamform_cap; ++} ++#endif ++ ++void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta) ++{ ++ struct sta_info *psta = (struct sta_info *)sta; ++ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv; ++ struct vht_priv *pvhtpriv_sta = &psta->vhtpriv; ++ u8 cur_ldpc_cap = 0, cur_stbc_cap = 0; ++ s8 bw_mode = -1; ++ u8 *pcap_mcs; ++ ++ if (pvhtpriv_sta->vht_option == _FALSE) ++ return; ++ ++ if (pvhtpriv_sta->op_present) { ++ switch (GET_VHT_OPERATION_ELE_CHL_WIDTH(pvhtpriv_sta->vht_op)) { ++ case 1: /* 80MHz */ ++ case 2: /* 160MHz */ ++ case 3: /* 80+80 */ ++ bw_mode = CHANNEL_WIDTH_80; /* only support up to 80MHz for now */ ++ break; ++ } ++ } ++ ++ if (pvhtpriv_sta->notify_present) ++ bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify); ++ else if (MLME_IS_AP(padapter)) { ++ /* for VHT client without Operating Mode Notify IE; minimal 80MHz */ ++ if (bw_mode < CHANNEL_WIDTH_80) ++ bw_mode = CHANNEL_WIDTH_80; ++ } ++ ++ if (bw_mode != -1) ++ psta->cmn.bw_mode = bw_mode; /* update bw_mode only if get value from VHT IEs */ ++ ++ psta->cmn.ra_info.is_vht_enable = _TRUE; ++ ++ /* B4 Rx LDPC */ ++ if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && ++ GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap)) { ++ SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); ++ RTW_INFO("Current STA(%d) VHT LDPC = %02X\n", psta->cmn.aid, cur_ldpc_cap); ++ } ++ pvhtpriv_sta->ldpc_cap = cur_ldpc_cap; ++ ++ if (psta->cmn.bw_mode > pmlmeext->cur_bwmode) ++ psta->cmn.bw_mode = pmlmeext->cur_bwmode; ++ ++ if (psta->cmn.bw_mode == CHANNEL_WIDTH_80) { ++ /* B5 Short GI for 80 MHz */ ++ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; ++ /* RTW_INFO("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m); */ ++ } else if (psta->cmn.bw_mode >= CHANNEL_WIDTH_160) { ++ /* B5 Short GI for 80 MHz */ ++ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; ++ /* RTW_INFO("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m); */ ++ } ++ ++ /* B8 B9 B10 Rx STBC */ ++ if (TEST_FLAG(pvhtpriv_ap->stbc_cap, STBC_VHT_ENABLE_TX) && ++ GET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap)) { ++ SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); ++ RTW_INFO("Current STA(%d) VHT STBC = %02X\n", psta->cmn.aid, cur_stbc_cap); ++ } ++ pvhtpriv_sta->stbc_cap = cur_stbc_cap; ++ ++#ifdef CONFIG_BEAMFORMING ++ update_sta_vht_info_apmode_bf_cap(padapter, psta); ++#endif ++ ++ /* B23 B24 B25 Maximum A-MPDU Length Exponent */ ++ pvhtpriv_sta->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pvhtpriv_sta->vht_cap); ++ ++ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap); ++ _rtw_memcpy(pvhtpriv_sta->vht_mcs_map, pcap_mcs, 2); ++ pvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv_sta->vht_mcs_map); ++} ++ ++void update_hw_vht_param(_adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ u8 ht_AMPDU_len; ++ ++ ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; ++ ++ if (pvhtpriv->ampdu_len > ht_AMPDU_len) ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); ++} ++ ++#ifdef ROKU_PRIVATE ++u8 VHT_get_ss_from_map(u8 *vht_mcs_map) ++{ ++ u8 i, j; ++ u8 ss = 0; ++ ++ for (i = 0; i < 2; i++) { ++ if (vht_mcs_map[i] != 0xff) { ++ for (j = 0; j < 8; j += 2) { ++ if (((vht_mcs_map[i] >> j) & 0x03) == 0x03) ++ break; ++ ss++; ++ } ++ } ++ ++ } ++ ++return ss; ++} ++ ++void VHT_caps_handler_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv_infra_ap *pvhtpriv = &pmlmepriv->vhtpriv_infra_ap; ++ u8 cur_stbc_cap_infra_ap = 0; ++ u16 cur_beamform_cap_infra_ap = 0; ++ u8 *pcap_mcs; ++ u8 *pcap_mcs_tx; ++ u8 Rx_ss = 0, Tx_ss = 0; ++ ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ ++ if (pIE == NULL) ++ return; ++ ++ pmlmeinfo->ht_vht_received |= BIT(1); ++ ++ pvhtpriv->ldpc_cap_infra_ap = GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data); ++ ++ if (GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) ++ SET_FLAG(cur_stbc_cap_infra_ap, STBC_VHT_ENABLE_RX); ++ if (GET_VHT_CAPABILITY_ELE_TX_STBC(pIE->data)) ++ SET_FLAG(cur_stbc_cap_infra_ap, STBC_VHT_ENABLE_TX); ++ pvhtpriv->stbc_cap_infra_ap = cur_stbc_cap_infra_ap; ++ ++ /*store ap info for channel bandwidth*/ ++ pvhtpriv->channel_width_infra_ap = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(pIE->data); ++ ++ /*check B11: SU Beamformer Capable and B12: SU Beamformee B19: MU Beamformer B20:MU Beamformee*/ ++ if (GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) ++ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ if (GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) ++ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); ++ if (GET_VHT_CAPABILITY_ELE_MU_BFER(pIE->data)) ++ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); ++ if (GET_VHT_CAPABILITY_ELE_MU_BFEE(pIE->data)) ++ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); ++ pvhtpriv->beamform_cap_infra_ap = cur_beamform_cap_infra_ap; ++ ++ /*store information about vht_mcs_set*/ ++ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data); ++ pcap_mcs_tx = GET_VHT_CAPABILITY_ELE_TX_MCS(pIE->data); ++ _rtw_memcpy(pvhtpriv->vht_mcs_map_infra_ap, pcap_mcs, 2); ++ _rtw_memcpy(pvhtpriv->vht_mcs_map_tx_infra_ap, pcap_mcs_tx, 2); ++ ++ Rx_ss = VHT_get_ss_from_map(pvhtpriv->vht_mcs_map_infra_ap); ++ Tx_ss = VHT_get_ss_from_map(pvhtpriv->vht_mcs_map_tx_infra_ap); ++ if (Rx_ss >= Tx_ss) { ++ pvhtpriv->number_of_streams_infra_ap = Rx_ss; ++ } else{ ++ pvhtpriv->number_of_streams_infra_ap = Tx_ss; ++ } ++ ++} ++#endif /* ROKU_PRIVATE */ ++ ++void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) ++{ ++ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, rf_type = RF_1T1R, tx_nss = 0; ++ u16 cur_beamform_cap = 0; ++ u8 *pcap_mcs; ++ ++ if (pIE == NULL) ++ return; ++ ++ if (pvhtpriv->vht_option == _FALSE) ++ return; ++ ++ pmlmeinfo->VHT_enable = 1; ++ ++ /* B4 Rx LDPC */ ++ if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && ++ GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data)) { ++ SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); ++ RTW_INFO("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); ++ } ++ pvhtpriv->ldpc_cap = cur_ldpc_cap; ++ ++ /* B5 Short GI for 80 MHz */ ++ pvhtpriv->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pIE->data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE; ++ /* RTW_INFO("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m); */ ++ ++ /* B8 B9 B10 Rx STBC */ ++ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && ++ GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) { ++ SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); ++ RTW_INFO("Current VHT STBC Setting = %02X\n", cur_stbc_cap); ++ } ++ pvhtpriv->stbc_cap = cur_stbc_cap; ++#ifdef CONFIG_BEAMFORMING ++#ifdef RTW_BEAMFORMING_VERSION_2 ++ /* ++ * B11 SU Beamformer Capable, ++ * the target supports Beamformer and we are Beamformee ++ */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) ++ && GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); ++ ++ /* Shift to BEAMFORMING_VHT_BEAMFORMEE_STS_CAP */ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); ++ ++ /* ++ * B19 MU Beamformer Capable, ++ * the target supports Beamformer and we are Beamformee ++ */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE) ++ && GET_VHT_CAPABILITY_ELE_MU_BFER(pIE->data)) ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); ++ } ++ ++ /* ++ * B12 SU Beamformee Capable, ++ * the target supports Beamformee and we are Beamformer ++ */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) ++ && GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ ++ /* Shit to BEAMFORMING_VHT_BEAMFORMER_SOUND_DIM */ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); ++ ++ /* ++ * B20 MU Beamformee Capable, ++ * the target supports Beamformee and we are Beamformer ++ */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE) ++ && GET_VHT_CAPABILITY_ELE_MU_BFEE(pIE->data)) ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); ++ } ++ ++ pvhtpriv->beamform_cap = cur_beamform_cap; ++ RTW_INFO("Current VHT Beamforming Setting=0x%04X\n", cur_beamform_cap); ++#else /* !RTW_BEAMFORMING_VERSION_2 */ ++ /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && ++ GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); ++ /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); ++ } ++ ++ /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && ++ GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { ++ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); ++ /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ ++ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); ++ ++ } ++ pvhtpriv->beamform_cap = cur_beamform_cap; ++ if (cur_beamform_cap) ++ RTW_INFO("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); ++#endif /* !RTW_BEAMFORMING_VERSION_2 */ ++#endif /* CONFIG_BEAMFORMING */ ++ /* B23 B24 B25 Maximum A-MPDU Length Exponent */ ++ pvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data); ++ ++ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data); ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); ++ rtw_vht_nss_to_mcsmap(tx_nss, pvhtpriv->vht_mcs_map, pcap_mcs); ++ pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); ++} ++ ++void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ ++ if (pIE == NULL) ++ return; ++ ++ if (pvhtpriv->vht_option == _FALSE) ++ return; ++} ++ ++void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta) ++{ ++ struct sta_info *psta = (struct sta_info *)sta; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct registry_priv *regsty = adapter_to_regsty(padapter); ++ u8 target_bw; ++ u8 target_rxss, current_rxss; ++ u8 update_ra = _FALSE; ++ u8 tx_nss = 0, rf_type = RF_1T1R; ++ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); ++ ++ if (pvhtpriv->vht_option == _FALSE) ++ return; ++ ++ target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe); ++ ++ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); ++ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); ++ target_rxss = rtw_min(tx_nss, (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe) + 1)); ++ ++ if (target_bw != psta->cmn.bw_mode) { ++ if (hal_is_bw_support(padapter, target_bw) ++ && REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw) ++ ) { ++ update_ra = _TRUE; ++ psta->cmn.bw_mode = target_bw; ++ } ++ } ++ ++ current_rxss = rtw_vht_mcsmap_to_nss(psta->vhtpriv.vht_mcs_map); ++ if (target_rxss != current_rxss) { ++ u8 vht_mcs_map[2] = {}; ++ ++ update_ra = _TRUE; ++ ++ rtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, psta->vhtpriv.vht_mcs_map); ++ _rtw_memcpy(psta->vhtpriv.vht_mcs_map, vht_mcs_map, 2); ++ ++ rtw_hal_update_sta_ra_info(padapter, psta); ++ } ++ ++ if (update_ra) ++ rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); ++} ++ ++u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel) ++{ ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ /* struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; */ ++ u8 ChnlWidth, center_freq, bw_mode; ++ u32 len = 0; ++ u8 operation[5]; ++ ++ _rtw_memset(operation, 0, 5); ++ ++ bw_mode = REGSTY_BW_5G(pregistrypriv); /* TODO: control op bw with other info */ ++ ++ if (hal_chk_bw_cap(padapter, BW_CAP_80M | BW_CAP_160M) ++ && REGSTY_BW_5G(pregistrypriv) >= CHANNEL_WIDTH_80 ++ ) { ++ center_freq = rtw_get_center_ch(channel, bw_mode, HAL_PRIME_CHNL_OFFSET_LOWER); ++ ChnlWidth = 1; ++ } else { ++ center_freq = 0; ++ ChnlWidth = 0; ++ } ++ ++ ++ SET_VHT_OPERATION_ELE_CHL_WIDTH(operation, ChnlWidth); ++ /* center frequency */ ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);/* Todo: need to set correct center channel */ ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation, 0); ++ ++ _rtw_memcpy(operation + 3, pvhtpriv->vht_mcs_map, 2); ++ ++ rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len); ++ ++ return len; ++} ++ ++u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw) ++{ ++ /* struct registry_priv *pregistrypriv = &padapter->registrypriv; */ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ u32 len = 0; ++ u8 opmode = 0; ++ u8 chnl_width, rx_nss; ++ ++ chnl_width = bw; ++ rx_nss = rtw_vht_mcsmap_to_nss(pvhtpriv->vht_mcs_map); ++ ++ SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, chnl_width); ++ SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss - 1)); ++ SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); /* Todo */ ++ ++ pvhtpriv->vht_op_mode_notify = opmode; ++ ++ pbuf = rtw_set_ie(pbuf, EID_OpModeNotification, 1, &opmode, &len); ++ ++ return len; ++} ++ ++u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) ++{ ++ u8 bw, rf_num, rx_stbc_nss = 0; ++ u16 HighestRate; ++ u8 *pcap, *pcap_mcs; ++ u32 len = 0; ++ u32 rx_packet_offset, max_recvbuf_sz; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ ++ pcap = pvhtpriv->vht_cap; ++ _rtw_memset(pcap, 0, 32); ++ ++ /* B0 B1 Maximum MPDU Length */ ++ rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); ++ rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); ++ ++ RTW_DBG("%s, line%d, Available RX buf size = %d bytes\n", __FUNCTION__, __LINE__, max_recvbuf_sz - rx_packet_offset); ++ ++ if ((max_recvbuf_sz - rx_packet_offset) >= 11454) { ++ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); ++ RTW_INFO("%s, line%d, Set MAX MPDU len = 11454 bytes\n", __FUNCTION__, __LINE__); ++ } else if ((max_recvbuf_sz - rx_packet_offset) >= 7991) { ++ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 1); ++ RTW_INFO("%s, line%d, Set MAX MPDU len = 7991 bytes\n", __FUNCTION__, __LINE__); ++ } else if ((max_recvbuf_sz - rx_packet_offset) >= 3895) { ++ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 0); ++ RTW_INFO("%s, line%d, Set MAX MPDU len = 3895 bytes\n", __FUNCTION__, __LINE__); ++ } else ++ RTW_ERR("%s, line%d, Error!! Available RX buf size < 3895 bytes\n", __FUNCTION__, __LINE__); ++ ++ /* B2 B3 Supported Channel Width Set */ ++ if (hal_chk_bw_cap(padapter, BW_CAP_160M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_160)) { ++ if (hal_chk_bw_cap(padapter, BW_CAP_80_80M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_80_80)) ++ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 2); ++ else ++ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 1); ++ } else ++ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0); ++ ++ /* B4 Rx LDPC */ ++ if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) { ++ SET_VHT_CAPABILITY_ELE_RX_LDPC(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting RX LDPC\n"); ++ } ++ ++ /* B5 ShortGI for 80MHz */ ++ SET_VHT_CAPABILITY_ELE_SHORT_GI80M(pcap, pvhtpriv->sgi_80m ? 1 : 0); /* We can receive Short GI of 80M */ ++ if (pvhtpriv->sgi_80m) ++ RTW_INFO("[VHT] Declare supporting SGI 80MHz\n"); ++ ++ /* B6 ShortGI for 160MHz */ ++ /* SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pcap, pvhtpriv->sgi_80m? 1 : 0); */ ++ ++ /* B7 Tx STBC */ ++ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) { ++ SET_VHT_CAPABILITY_ELE_TX_STBC(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting TX STBC\n"); ++ } ++ ++ /* B8 B9 B10 Rx STBC */ ++ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) { ++ rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss)); ++ ++ SET_VHT_CAPABILITY_ELE_RX_STBC(pcap, rx_stbc_nss); ++ RTW_INFO("[VHT] Declare supporting RX STBC = %d\n", rx_stbc_nss); ++ } ++ #ifdef CONFIG_BEAMFORMING ++ /* B11 SU Beamformer Capable */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) { ++ SET_VHT_CAPABILITY_ELE_SU_BFER(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting SU Bfer\n"); ++ /* B16 17 18 Number of Sounding Dimensions */ ++ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num); ++ SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(pcap, rf_num); ++ /* B19 MU Beamformer Capable */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) { ++ SET_VHT_CAPABILITY_ELE_MU_BFER(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting MU Bfer\n"); ++ } ++ } ++ ++ /* B12 SU Beamformee Capable */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) { ++ SET_VHT_CAPABILITY_ELE_SU_BFEE(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting SU Bfee\n"); ++ ++ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num); ++ ++ /* IOT action suggested by Yu Chen 2017/3/3 */ ++#ifdef CONFIG_80211AC_VHT ++ if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM) && ++ !pvhtpriv->ap_is_mu_bfer) ++ rf_num = (rf_num >= 2 ? 2 : rf_num); ++#endif ++ /* B13 14 15 Compressed Steering Number of Beamformer Antennas Supported */ ++ SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(pcap, rf_num); ++ /* B20 SU Beamformee Capable */ ++ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) { ++ SET_VHT_CAPABILITY_ELE_MU_BFEE(pcap, 1); ++ RTW_INFO("[VHT] Declare supporting MU Bfee\n"); ++ } ++ } ++ #endif/*CONFIG_BEAMFORMING*/ ++ ++ /* B21 VHT TXOP PS */ ++ SET_VHT_CAPABILITY_ELE_TXOP_PS(pcap, 0); ++ /* B22 +HTC-VHT Capable */ ++ SET_VHT_CAPABILITY_ELE_HTC_VHT(pcap, 1); ++ /* B23 24 25 Maximum A-MPDU Length Exponent */ ++ if (pregistrypriv->ampdu_factor != 0xFE) ++ SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, pregistrypriv->ampdu_factor); ++ else ++ SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, 7); ++ /* B26 27 VHT Link Adaptation Capable */ ++ SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(pcap, 0); ++ ++ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pcap); ++ _rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2); ++ ++ pcap_mcs = GET_VHT_CAPABILITY_ELE_TX_MCS(pcap); ++ _rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2); ++ ++ /* find the largest bw supported by both registry and hal */ ++ bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv)); ++ ++ HighestRate = VHT_MCS_DATA_RATE[bw][pvhtpriv->sgi_80m][((pvhtpriv->vht_highest_rate - MGN_VHT1SS_MCS0) & 0x3f)]; ++ HighestRate = (HighestRate + 1) >> 1; ++ ++ SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest rx rate is 600Mbps. */ ++ SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest tx rate is 600Mbps. */ ++ ++ pbuf = rtw_set_ie(pbuf, EID_VHTCapability, 12, pcap, &len); ++ ++ return len; ++} ++ ++u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) ++{ ++ struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); ++ RT_CHANNEL_INFO *chset = rfctl->channel_set; ++ u32 ielen; ++ u8 max_bw; ++ u8 oper_ch, oper_bw = CHANNEL_WIDTH_20, oper_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ u8 *out_vht_op_ie, *ht_op_ie, *vht_cap_ie, *vht_op_ie; ++ struct registry_priv *pregistrypriv = &padapter->registrypriv; ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ ++ rtw_vht_use_default_setting(padapter); ++ ++ ht_op_ie = rtw_get_ie(in_ie + 12, WLAN_EID_HT_OPERATION, &ielen, in_len - 12); ++ if (!ht_op_ie || ielen != HT_OP_IE_LEN) ++ goto exit; ++ vht_cap_ie = rtw_get_ie(in_ie + 12, EID_VHTCapability, &ielen, in_len - 12); ++ if (!vht_cap_ie || ielen != VHT_CAP_IE_LEN) ++ goto exit; ++ vht_op_ie = rtw_get_ie(in_ie + 12, EID_VHTOperation, &ielen, in_len - 12); ++ if (!vht_op_ie || ielen != VHT_OP_IE_LEN) ++ goto exit; ++ ++ /* VHT Capabilities element */ ++ *pout_len += rtw_build_vht_cap_ie(padapter, out_ie + *pout_len); ++ ++ ++ /* VHT Operation element */ ++ out_vht_op_ie = out_ie + *pout_len; ++ rtw_set_ie(out_vht_op_ie, EID_VHTOperation, VHT_OP_IE_LEN, vht_op_ie + 2 , pout_len); ++ ++ /* get primary channel from HT_OP_IE */ ++ oper_ch = GET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2); ++ ++ /* find the largest bw supported by both registry and hal */ ++ max_bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv)); ++ ++ if (max_bw >= CHANNEL_WIDTH_40) { ++ /* get bw offset form HT_OP_IE */ ++ if (GET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2)) { ++ switch (GET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2)) { ++ case SCA: ++ oper_bw = CHANNEL_WIDTH_40; ++ oper_offset = HAL_PRIME_CHNL_OFFSET_LOWER; ++ break; ++ case SCB: ++ oper_bw = CHANNEL_WIDTH_40; ++ oper_offset = HAL_PRIME_CHNL_OFFSET_UPPER; ++ break; ++ } ++ } ++ ++ if (oper_bw == CHANNEL_WIDTH_40) { ++ switch (GET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2)) { ++ case 1: /* 80MHz */ ++ case 2: /* 160MHz */ ++ case 3: /* 80+80 */ ++ oper_bw = CHANNEL_WIDTH_80; /* only support up to 80MHz for now */ ++ break; ++ } ++ ++ oper_bw = rtw_min(oper_bw, max_bw); ++ ++ /* try downgrage bw to fit in channel plan setting */ ++ while (!rtw_chset_is_chbw_valid(chset, oper_ch, oper_bw, oper_offset) ++ || (IS_DFS_SLAVE_WITH_RD(rfctl) ++ && !rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl)) ++ && rtw_chset_is_chbw_non_ocp(chset, oper_ch, oper_bw, oper_offset)) ++ ) { ++ oper_bw--; ++ if (oper_bw == CHANNEL_WIDTH_20) { ++ oper_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; ++ break; ++ } ++ } ++ } ++ } ++ ++ rtw_warn_on(!rtw_chset_is_chbw_valid(chset, oper_ch, oper_bw, oper_offset)); ++ if (IS_DFS_SLAVE_WITH_RD(rfctl) && !rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl))) ++ rtw_warn_on(rtw_chset_is_chbw_non_ocp(chset, oper_ch, oper_bw, oper_offset)); ++ ++ /* update VHT_OP_IE */ ++ if (oper_bw < CHANNEL_WIDTH_80) { ++ SET_VHT_OPERATION_ELE_CHL_WIDTH(out_vht_op_ie + 2, 0); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(out_vht_op_ie + 2, 0); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(out_vht_op_ie + 2, 0); ++ } else if (oper_bw == CHANNEL_WIDTH_80) { ++ u8 cch = rtw_get_center_ch(oper_ch, oper_bw, oper_offset); ++ ++ SET_VHT_OPERATION_ELE_CHL_WIDTH(out_vht_op_ie + 2, 1); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(out_vht_op_ie + 2, cch); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(out_vht_op_ie + 2, 0); ++ } else { ++ RTW_ERR(FUNC_ADPT_FMT" unsupported BW:%u\n", FUNC_ADPT_ARG(padapter), oper_bw); ++ rtw_warn_on(1); ++ } ++ ++ /* Operating Mode Notification element */ ++ *pout_len += rtw_build_vht_op_mode_notify_ie(padapter, out_ie + *pout_len, oper_bw); ++ ++ pvhtpriv->vht_option = _TRUE; ++ ++exit: ++ return pvhtpriv->vht_option; ++ ++} ++ ++void VHTOnAssocRsp(_adapter *padapter) ++{ ++ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; ++ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; ++ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; ++ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ++ u8 ht_AMPDU_len; ++ ++ RTW_INFO("%s\n", __FUNCTION__); ++ ++ if (!pmlmeinfo->HT_enable) ++ return; ++ ++ if (!pmlmeinfo->VHT_enable) ++ return; ++ ++ ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; ++ ++ if (pvhtpriv->ampdu_len > ht_AMPDU_len) ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); ++ ++ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MAX_TIME, (u8 *)(&pvhtpriv->vht_highest_rate)); ++} ++ ++void rtw_vht_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pnetwork) ++{ ++ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); ++ u8 cap_len, operation_len; ++ uint len = 0; ++ sint ie_len = 0; ++ u8 *p = NULL; ++ ++ p = rtw_get_ie(pnetwork->IEs + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, ++ (pnetwork->IELength - _BEACON_IE_OFFSET_)); ++ if (p && ie_len > 0) ++ return; ++ ++ rtw_vht_use_default_setting(padapter); ++ ++ /* VHT Operation mode notifiy bit in Extended IE (127) */ ++ SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1); ++ pmlmepriv->ext_capab_ie_len = 10; ++ rtw_set_ie(pnetwork->IEs + pnetwork->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); ++ pnetwork->IELength += pmlmepriv->ext_capab_ie_len; ++ ++ /* VHT Capabilities element */ ++ cap_len = rtw_build_vht_cap_ie(padapter, pnetwork->IEs + pnetwork->IELength); ++ pnetwork->IELength += cap_len; ++ ++ /* VHT Operation element */ ++ operation_len = rtw_build_vht_operation_ie(padapter, pnetwork->IEs + pnetwork->IELength, ++ pnetwork->Configuration.DSConfig); ++ pnetwork->IELength += operation_len; ++ ++ rtw_check_for_vht20(padapter, pnetwork->IEs + _BEACON_IE_OFFSET_, pnetwork->IELength - _BEACON_IE_OFFSET_); ++ ++ pmlmepriv->vhtpriv.vht_option = _TRUE; ++} ++ ++void rtw_vht_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pnetwork) ++{ ++ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); ++ ++ rtw_remove_bcn_ie(padapter, pnetwork, EID_EXTCapability); ++ rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTCapability); ++ rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTOperation); ++ ++ pmlmepriv->vhtpriv.vht_option = _FALSE; ++} ++ ++void rtw_check_for_vht20(_adapter *adapter, u8 *ies, int ies_len) ++{ ++ u8 ht_ch, ht_bw, ht_offset; ++ u8 vht_ch, vht_bw, vht_offset; ++ ++ rtw_ies_get_chbw(ies, ies_len, &ht_ch, &ht_bw, &ht_offset, 1, 0); ++ rtw_ies_get_chbw(ies, ies_len, &vht_ch, &vht_bw, &vht_offset, 1, 1); ++ ++ if (ht_bw == CHANNEL_WIDTH_20 && vht_bw >= CHANNEL_WIDTH_80) { ++ u8 *vht_op_ie; ++ int vht_op_ielen; ++ ++ RTW_INFO(FUNC_ADPT_FMT" vht80 is not allowed without ht40\n", FUNC_ADPT_ARG(adapter)); ++ vht_op_ie = rtw_get_ie(ies, EID_VHTOperation, &vht_op_ielen, ies_len); ++ if (vht_op_ie && vht_op_ielen) { ++ RTW_INFO(FUNC_ADPT_FMT" switch to vht20\n", FUNC_ADPT_ARG(adapter)); ++ SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0); ++ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); ++ } ++ } ++} ++#endif /* CONFIG_80211AC_VHT */ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wapi.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wapi.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wapi.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wapi.c 2022-01-28 22:59:35.562651800 +0200 @@ -0,0 +1,1312 @@ +/****************************************************************************** + * @@ -104889,9 +105877,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi.c linux-5.11.4-rtl8812a + } +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi_sms4.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wapi_sms4.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi_sms4.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wapi_sms4.c 2021-03-07 18:16:17.027954777 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wapi_sms4.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wapi_sms4.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wapi_sms4.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wapi_sms4.c 2022-01-28 22:59:35.562651800 +0200 @@ -0,0 +1,922 @@ +/****************************************************************************** + * @@ -105815,1149 +106803,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wapi_sms4.c linux-5.11.4-rtl +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_vht.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_vht.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_vht.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_vht.c 2021-03-07 18:16:17.027954777 +0200 -@@ -0,0 +1,1135 @@ -+/****************************************************************************** -+ * -+ * Copyright(c) 2007 - 2017 Realtek Corporation. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ *****************************************************************************/ -+#define _RTW_VHT_C -+ -+#include -+#include -+ -+#ifdef CONFIG_80211AC_VHT -+const u16 _vht_max_mpdu_len[] = { -+ 3895, -+ 7991, -+ 11454, -+ 0, -+}; -+ -+const u8 _vht_sup_ch_width_set_to_bw_cap[] = { -+ BW_CAP_80M, -+ BW_CAP_80M | BW_CAP_160M, -+ BW_CAP_80M | BW_CAP_160M | BW_CAP_80_80M, -+ 0, -+}; -+ -+const char *const _vht_sup_ch_width_set_str[] = { -+ "80MHz", -+ "160MHz", -+ "160MHz & 80+80MHz", -+ "BW-RSVD", -+}; -+ -+void dump_vht_cap_ie_content(void *sel, const u8 *buf, u32 buf_len) -+{ -+ if (buf_len != VHT_CAP_IE_LEN) { -+ RTW_PRINT_SEL(sel, "Invalid VHT capability IE len:%d != %d\n", buf_len, VHT_CAP_IE_LEN); -+ return; -+ } -+ -+ RTW_PRINT_SEL(sel, "cap_info:%02x %02x %02x %02x: MAX_MPDU_LEN:%u %s%s%s%s%s RX-STBC:%u MAX_AMPDU_LEN:%u\n" -+ , *(buf), *(buf + 1), *(buf + 2), *(buf + 3) -+ , vht_max_mpdu_len(GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(buf)) -+ , vht_sup_ch_width_set_str(GET_VHT_CAPABILITY_ELE_CHL_WIDTH(buf)) -+ , GET_VHT_CAPABILITY_ELE_RX_LDPC(buf) ? " RX-LDPC" : "" -+ , GET_VHT_CAPABILITY_ELE_SHORT_GI80M(buf) ? " SGI-80" : "" -+ , GET_VHT_CAPABILITY_ELE_SHORT_GI160M(buf) ? " SGI-160" : "" -+ , GET_VHT_CAPABILITY_ELE_TX_STBC(buf) ? " TX-STBC" : "" -+ , GET_VHT_CAPABILITY_ELE_RX_STBC(buf) -+ , VHT_MAX_AMPDU_LEN(GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(buf)) -+ ); -+} -+ -+void dump_vht_cap_ie(void *sel, const u8 *ie, u32 ie_len) -+{ -+ const u8 *vht_cap_ie; -+ sint vht_cap_ielen; -+ -+ vht_cap_ie = rtw_get_ie(ie, WLAN_EID_VHT_CAPABILITY, &vht_cap_ielen, ie_len); -+ if (!ie || vht_cap_ie != ie) -+ return; -+ -+ dump_vht_cap_ie_content(sel, vht_cap_ie + 2, vht_cap_ielen); -+} -+ -+const char *const _vht_op_ch_width_str[] = { -+ "20 or 40MHz", -+ "80MHz", -+ "160MHz", -+ "80+80MHz", -+ "BW-RSVD", -+}; -+ -+void dump_vht_op_ie_content(void *sel, const u8 *buf, u32 buf_len) -+{ -+ if (buf_len != VHT_OP_IE_LEN) { -+ RTW_PRINT_SEL(sel, "Invalid VHT operation IE len:%d != %d\n", buf_len, VHT_OP_IE_LEN); -+ return; -+ } -+ -+ RTW_PRINT_SEL(sel, "%s, ch0:%u, ch1:%u\n" -+ , vht_op_ch_width_str(GET_VHT_OPERATION_ELE_CHL_WIDTH(buf)) -+ , GET_VHT_OPERATION_ELE_CENTER_FREQ1(buf) -+ , GET_VHT_OPERATION_ELE_CENTER_FREQ2(buf) -+ ); -+} -+ -+void dump_vht_op_ie(void *sel, const u8 *ie, u32 ie_len) -+{ -+ const u8 *vht_op_ie; -+ sint vht_op_ielen; -+ -+ vht_op_ie = rtw_get_ie(ie, WLAN_EID_VHT_OPERATION, &vht_op_ielen, ie_len); -+ if (!ie || vht_op_ie != ie) -+ return; -+ -+ dump_vht_op_ie_content(sel, vht_op_ie + 2, vht_op_ielen); -+} -+ -+/* 20/40/80, ShortGI, MCS Rate */ -+const u16 VHT_MCS_DATA_RATE[3][2][30] = { -+ { { -+ 13, 26, 39, 52, 78, 104, 117, 130, 156, 156, -+ 26, 52, 78, 104, 156, 208, 234, 260, 312, 312, -+ 39, 78, 117, 156, 234, 312, 351, 390, 468, 520 -+ }, /* Long GI, 20MHz */ -+ { -+ 14, 29, 43, 58, 87, 116, 130, 144, 173, 173, -+ 29, 58, 87, 116, 173, 231, 260, 289, 347, 347, -+ 43, 87, 130, 173, 260, 347, 390, 433, 520, 578 -+ } -+ }, /* Short GI, 20MHz */ -+ { { -+ 27, 54, 81, 108, 162, 216, 243, 270, 324, 360, -+ 54, 108, 162, 216, 324, 432, 486, 540, 648, 720, -+ 81, 162, 243, 324, 486, 648, 729, 810, 972, 1080 -+ }, /* Long GI, 40MHz */ -+ { -+ 30, 60, 90, 120, 180, 240, 270, 300, 360, 400, -+ 60, 120, 180, 240, 360, 480, 540, 600, 720, 800, -+ 90, 180, 270, 360, 540, 720, 810, 900, 1080, 1200 -+ } -+ }, /* Short GI, 40MHz */ -+ { { -+ 59, 117, 176, 234, 351, 468, 527, 585, 702, 780, -+ 117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560, -+ 176, 351, 527, 702, 1053, 1404, 1580, 1755, 2106, 2340 -+ }, /* Long GI, 80MHz */ -+ { -+ 65, 130, 195, 260, 390, 520, 585, 650, 780, 867, -+ 130, 260, 390, 520, 780, 1040, 1170, 1300, 1560, 1734, -+ 195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2600 -+ } -+ } /* Short GI, 80MHz */ -+}; -+ -+u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map) -+{ -+ u8 i, j; -+ u8 bit_map; -+ u8 vht_mcs_rate = 0; -+ -+ for (i = 0; i < 2; i++) { -+ if (pvht_mcs_map[i] != 0xff) { -+ for (j = 0; j < 8; j += 2) { -+ bit_map = (pvht_mcs_map[i] >> j) & 3; -+ -+ if (bit_map != 3) -+ vht_mcs_rate = MGN_VHT1SS_MCS7 + 10 * j / 2 + i * 40 + bit_map; /* VHT rate indications begin from 0x90 */ -+ } -+ } -+ } -+ -+ /* RTW_INFO("HighestVHTMCSRate is %x\n", vht_mcs_rate); */ -+ return vht_mcs_rate; -+} -+ -+u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map) -+{ -+ u8 i, j; -+ u8 bit_map; -+ u8 nss = 0; -+ -+ for (i = 0; i < 2; i++) { -+ if (pvht_mcs_map[i] != 0xff) { -+ for (j = 0; j < 8; j += 2) { -+ bit_map = (pvht_mcs_map[i] >> j) & 3; -+ -+ if (bit_map != 3) -+ nss++; -+ } -+ } -+ } -+ -+ /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ -+ return nss; -+} -+ -+void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map) -+{ -+ u8 i, j; -+ u8 cur_rate, target_rate; -+ -+ for (i = 0; i < 2; i++) { -+ target_mcs_map[i] = 0; -+ for (j = 0; j < 8; j += 2) { -+ cur_rate = (cur_mcs_map[i] >> j) & 3; -+ if (cur_rate == 3) /* 0x3 indicates not supported that num of SS */ -+ target_rate = 3; -+ else if (nss <= ((j / 2) + i * 4)) -+ target_rate = 3; -+ else -+ target_rate = cur_rate; -+ -+ target_mcs_map[i] |= (target_rate << j); -+ } -+ } -+ -+ /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ -+} -+ -+u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate) -+{ -+ if (vht_mcs_rate > MGN_VHT3SS_MCS9) -+ vht_mcs_rate = MGN_VHT3SS_MCS9; -+ /* RTW_INFO("bw=%d, short_GI=%d, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)=%d\n", bw, short_GI, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)); */ -+ return VHT_MCS_DATA_RATE[bw][short_GI][((vht_mcs_rate - MGN_VHT1SS_MCS0) & 0x3f)]; -+} -+ -+void rtw_vht_use_default_setting(_adapter *padapter) -+{ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct registry_priv *pregistrypriv = &padapter->registrypriv; -+ BOOLEAN bHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE; -+#ifdef CONFIG_BEAMFORMING -+ BOOLEAN bHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE; -+ u8 mu_bfer, mu_bfee; -+#endif /* CONFIG_BEAMFORMING */ -+ u8 rf_type = 0; -+ u8 tx_nss, rx_nss; -+ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); -+ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ pvhtpriv->sgi_80m = TEST_FLAG(pregistrypriv->short_gi, BIT2) ? _TRUE : _FALSE; -+ -+ /* LDPC support */ -+ rtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport); -+ CLEAR_FLAGS(pvhtpriv->ldpc_cap); -+ if (bHwLDPCSupport) { -+ if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT0)) -+ SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX); -+ } -+ rtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport); -+ if (bHwLDPCSupport) { -+ if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT1)) -+ SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX); -+ } -+ if (pvhtpriv->ldpc_cap) -+ RTW_INFO("[VHT] Support LDPC = 0x%02X\n", pvhtpriv->ldpc_cap); -+ -+ /* STBC */ -+ rtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport); -+ CLEAR_FLAGS(pvhtpriv->stbc_cap); -+ if (bHwSTBCSupport) { -+ if (TEST_FLAG(pregistrypriv->stbc_cap, BIT1)) -+ SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX); -+ } -+ rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport); -+ if (bHwSTBCSupport) { -+ if (TEST_FLAG(pregistrypriv->stbc_cap, BIT0)) -+ SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX); -+ } -+ if (pvhtpriv->stbc_cap) -+ RTW_INFO("[VHT] Support STBC = 0x%02X\n", pvhtpriv->stbc_cap); -+ -+ /* Beamforming setting */ -+ CLEAR_FLAGS(pvhtpriv->beamform_cap); -+#ifdef CONFIG_BEAMFORMING -+#ifdef RTW_BEAMFORMING_VERSION_2 -+ /* only enable beamforming in STA client mode */ -+ if (MLME_IS_STA(padapter) && !MLME_IS_GC(padapter) -+ && !MLME_IS_ADHOC(padapter) -+ && !MLME_IS_MESH(padapter)) -+#endif -+ { -+ rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, -+ (u8 *)&bHwSupportBeamformer); -+ rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, -+ (u8 *)&bHwSupportBeamformee); -+ mu_bfer = _FALSE; -+ mu_bfee = _FALSE; -+ rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMER, &mu_bfer); -+ rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMEE, &mu_bfee); -+ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT0) && bHwSupportBeamformer) { -+#ifdef CONFIG_CONCURRENT_MODE -+ if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ RTW_INFO("[VHT] CONCURRENT AP Support Beamformer\n"); -+ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) -+ && (_TRUE == mu_bfer)) { -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); -+ RTW_INFO("[VHT] Support MU-MIMO AP\n"); -+ } -+ } else -+ RTW_INFO("[VHT] CONCURRENT not AP ;not allow Support Beamformer\n"); -+#else -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ RTW_INFO("[VHT] Support Beamformer\n"); -+ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) -+ && (_TRUE == mu_bfer) -+ && ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); -+ RTW_INFO("[VHT] Support MU-MIMO AP\n"); -+ } -+#endif -+ } -+ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee) { -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); -+ RTW_INFO("[VHT] Support Beamformee\n"); -+ if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(3)) -+ && (_TRUE == mu_bfee) -+ && ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)) { -+ SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); -+ RTW_INFO("[VHT] Support MU-MIMO STA\n"); -+ } -+ } -+ } -+#endif /* CONFIG_BEAMFORMING */ -+ -+ pvhtpriv->ampdu_len = pregistrypriv->ampdu_factor; -+ -+ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); -+ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); -+ rx_nss = rtw_min(rf_type_to_rf_rx_cnt(rf_type), hal_spec->rx_nss_num); -+ -+ /* for now, vhtpriv.vht_mcs_map comes from RX NSS */ -+ rtw_vht_nss_to_mcsmap(rx_nss, pvhtpriv->vht_mcs_map, pregistrypriv->vht_rx_mcs_map); -+ pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); -+} -+ -+u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss) -+{ -+ u8 i, j, tmp; -+ u64 bitmap = 0; -+ u8 bits_nss = nss * 2; -+ -+ for (i = j = 0; i < bits_nss; i += 2, j += 10) { -+ /* every two bits means single sptial stream */ -+ tmp = (mcs_map[i / 8] >> i) & 3; -+ -+ switch (tmp) { -+ case 2: -+ bitmap = bitmap | (0x03ff << j); -+ break; -+ case 1: -+ bitmap = bitmap | (0x01ff << j); -+ break; -+ case 0: -+ bitmap = bitmap | (0x00ff << j); -+ break; -+ default: -+ break; -+ } -+ } -+ -+ RTW_INFO("vht_mcs_map=%02x %02x, nss=%u => bitmap=%016llx\n" -+ , mcs_map[0], mcs_map[1], nss, bitmap); -+ -+ return bitmap; -+} -+ -+#ifdef CONFIG_BEAMFORMING -+void update_sta_vht_info_apmode_bf_cap(_adapter *padapter, struct sta_info *psta) -+{ -+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv; -+ struct vht_priv *pvhtpriv_sta = &psta->vhtpriv; -+ u16 cur_beamform_cap = 0; -+ -+ /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ -+ if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && -+ GET_VHT_CAPABILITY_ELE_SU_BFEE(pvhtpriv_sta->vht_cap)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); -+ /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pvhtpriv_sta->vht_cap) << 8); -+ } -+ -+ /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ -+ if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && -+ GET_VHT_CAPABILITY_ELE_SU_BFER(pvhtpriv_sta->vht_cap)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pvhtpriv_sta->vht_cap) << 12); -+ } -+ -+ if (cur_beamform_cap) -+ RTW_INFO("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->cmn.aid, cur_beamform_cap); -+ -+ pvhtpriv_sta->beamform_cap = cur_beamform_cap; -+ psta->cmn.bf_info.vht_beamform_cap = cur_beamform_cap; -+} -+#endif -+ -+void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta) -+{ -+ struct sta_info *psta = (struct sta_info *)sta; -+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv; -+ struct vht_priv *pvhtpriv_sta = &psta->vhtpriv; -+ u8 cur_ldpc_cap = 0, cur_stbc_cap = 0; -+ s8 bw_mode = -1; -+ u8 *pcap_mcs; -+ -+ if (pvhtpriv_sta->vht_option == _FALSE) -+ return; -+ -+ if (pvhtpriv_sta->op_present) { -+ switch (GET_VHT_OPERATION_ELE_CHL_WIDTH(pvhtpriv_sta->vht_op)) { -+ case 1: /* 80MHz */ -+ case 2: /* 160MHz */ -+ case 3: /* 80+80 */ -+ bw_mode = CHANNEL_WIDTH_80; /* only support up to 80MHz for now */ -+ break; -+ } -+ } -+ -+ if (pvhtpriv_sta->notify_present) -+ bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify); -+ else if (MLME_IS_AP(padapter)) { -+ /* for VHT client without Operating Mode Notify IE; minimal 80MHz */ -+ if (bw_mode < CHANNEL_WIDTH_80) -+ bw_mode = CHANNEL_WIDTH_80; -+ } -+ -+ if (bw_mode != -1) -+ psta->cmn.bw_mode = bw_mode; /* update bw_mode only if get value from VHT IEs */ -+ -+ psta->cmn.ra_info.is_vht_enable = _TRUE; -+ -+ /* B4 Rx LDPC */ -+ if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && -+ GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap)) { -+ SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); -+ RTW_INFO("Current STA(%d) VHT LDPC = %02X\n", psta->cmn.aid, cur_ldpc_cap); -+ } -+ pvhtpriv_sta->ldpc_cap = cur_ldpc_cap; -+ -+ if (psta->cmn.bw_mode > pmlmeext->cur_bwmode) -+ psta->cmn.bw_mode = pmlmeext->cur_bwmode; -+ -+ if (psta->cmn.bw_mode == CHANNEL_WIDTH_80) { -+ /* B5 Short GI for 80 MHz */ -+ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; -+ /* RTW_INFO("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m); */ -+ } else if (psta->cmn.bw_mode >= CHANNEL_WIDTH_160) { -+ /* B5 Short GI for 80 MHz */ -+ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; -+ /* RTW_INFO("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m); */ -+ } -+ -+ /* B8 B9 B10 Rx STBC */ -+ if (TEST_FLAG(pvhtpriv_ap->stbc_cap, STBC_VHT_ENABLE_TX) && -+ GET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap)) { -+ SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); -+ RTW_INFO("Current STA(%d) VHT STBC = %02X\n", psta->cmn.aid, cur_stbc_cap); -+ } -+ pvhtpriv_sta->stbc_cap = cur_stbc_cap; -+ -+#ifdef CONFIG_BEAMFORMING -+ update_sta_vht_info_apmode_bf_cap(padapter, psta); -+#endif -+ -+ /* B23 B24 B25 Maximum A-MPDU Length Exponent */ -+ pvhtpriv_sta->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pvhtpriv_sta->vht_cap); -+ -+ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap); -+ _rtw_memcpy(pvhtpriv_sta->vht_mcs_map, pcap_mcs, 2); -+ pvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv_sta->vht_mcs_map); -+} -+ -+void update_hw_vht_param(_adapter *padapter) -+{ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ u8 ht_AMPDU_len; -+ -+ ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; -+ -+ if (pvhtpriv->ampdu_len > ht_AMPDU_len) -+ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); -+} -+ -+#ifdef ROKU_PRIVATE -+u8 VHT_get_ss_from_map(u8 *vht_mcs_map) -+{ -+ u8 i, j; -+ u8 ss = 0; -+ -+ for (i = 0; i < 2; i++) { -+ if (vht_mcs_map[i] != 0xff) { -+ for (j = 0; j < 8; j += 2) { -+ if (((vht_mcs_map[i] >> j) & 0x03) == 0x03) -+ break; -+ ss++; -+ } -+ } -+ -+ } -+ -+return ss; -+} -+ -+void VHT_caps_handler_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -+{ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv_infra_ap *pvhtpriv = &pmlmepriv->vhtpriv_infra_ap; -+ u8 cur_stbc_cap_infra_ap = 0; -+ u16 cur_beamform_cap_infra_ap = 0; -+ u8 *pcap_mcs; -+ u8 *pcap_mcs_tx; -+ u8 Rx_ss = 0, Tx_ss = 0; -+ -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ -+ if (pIE == NULL) -+ return; -+ -+ pmlmeinfo->ht_vht_received |= BIT(1); -+ -+ pvhtpriv->ldpc_cap_infra_ap = GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data); -+ -+ if (GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) -+ SET_FLAG(cur_stbc_cap_infra_ap, STBC_VHT_ENABLE_RX); -+ if (GET_VHT_CAPABILITY_ELE_TX_STBC(pIE->data)) -+ SET_FLAG(cur_stbc_cap_infra_ap, STBC_VHT_ENABLE_TX); -+ pvhtpriv->stbc_cap_infra_ap = cur_stbc_cap_infra_ap; -+ -+ /*store ap info for channel bandwidth*/ -+ pvhtpriv->channel_width_infra_ap = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(pIE->data); -+ -+ /*check B11: SU Beamformer Capable and B12: SU Beamformee B19: MU Beamformer B20:MU Beamformee*/ -+ if (GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) -+ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ if (GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) -+ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); -+ if (GET_VHT_CAPABILITY_ELE_MU_BFER(pIE->data)) -+ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); -+ if (GET_VHT_CAPABILITY_ELE_MU_BFEE(pIE->data)) -+ SET_FLAG(cur_beamform_cap_infra_ap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); -+ pvhtpriv->beamform_cap_infra_ap = cur_beamform_cap_infra_ap; -+ -+ /*store information about vht_mcs_set*/ -+ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data); -+ pcap_mcs_tx = GET_VHT_CAPABILITY_ELE_TX_MCS(pIE->data); -+ _rtw_memcpy(pvhtpriv->vht_mcs_map_infra_ap, pcap_mcs, 2); -+ _rtw_memcpy(pvhtpriv->vht_mcs_map_tx_infra_ap, pcap_mcs_tx, 2); -+ -+ Rx_ss = VHT_get_ss_from_map(pvhtpriv->vht_mcs_map_infra_ap); -+ Tx_ss = VHT_get_ss_from_map(pvhtpriv->vht_mcs_map_tx_infra_ap); -+ if (Rx_ss >= Tx_ss) { -+ pvhtpriv->number_of_streams_infra_ap = Rx_ss; -+ } else{ -+ pvhtpriv->number_of_streams_infra_ap = Tx_ss; -+ } -+ -+} -+#endif /* ROKU_PRIVATE */ -+ -+void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -+{ -+ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, rf_type = RF_1T1R, tx_nss = 0; -+ u16 cur_beamform_cap = 0; -+ u8 *pcap_mcs; -+ -+ if (pIE == NULL) -+ return; -+ -+ if (pvhtpriv->vht_option == _FALSE) -+ return; -+ -+ pmlmeinfo->VHT_enable = 1; -+ -+ /* B4 Rx LDPC */ -+ if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && -+ GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data)) { -+ SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); -+ RTW_INFO("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); -+ } -+ pvhtpriv->ldpc_cap = cur_ldpc_cap; -+ -+ /* B5 Short GI for 80 MHz */ -+ pvhtpriv->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pIE->data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE; -+ /* RTW_INFO("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m); */ -+ -+ /* B8 B9 B10 Rx STBC */ -+ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && -+ GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) { -+ SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); -+ RTW_INFO("Current VHT STBC Setting = %02X\n", cur_stbc_cap); -+ } -+ pvhtpriv->stbc_cap = cur_stbc_cap; -+#ifdef CONFIG_BEAMFORMING -+#ifdef RTW_BEAMFORMING_VERSION_2 -+ /* -+ * B11 SU Beamformer Capable, -+ * the target supports Beamformer and we are Beamformee -+ */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) -+ && GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); -+ -+ /* Shift to BEAMFORMING_VHT_BEAMFORMEE_STS_CAP */ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); -+ -+ /* -+ * B19 MU Beamformer Capable, -+ * the target supports Beamformer and we are Beamformee -+ */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE) -+ && GET_VHT_CAPABILITY_ELE_MU_BFER(pIE->data)) -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); -+ } -+ -+ /* -+ * B12 SU Beamformee Capable, -+ * the target supports Beamformee and we are Beamformer -+ */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) -+ && GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ -+ /* Shit to BEAMFORMING_VHT_BEAMFORMER_SOUND_DIM */ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); -+ -+ /* -+ * B20 MU Beamformee Capable, -+ * the target supports Beamformee and we are Beamformer -+ */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE) -+ && GET_VHT_CAPABILITY_ELE_MU_BFEE(pIE->data)) -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); -+ } -+ -+ pvhtpriv->beamform_cap = cur_beamform_cap; -+ RTW_INFO("Current VHT Beamforming Setting=0x%04X\n", cur_beamform_cap); -+#else /* !RTW_BEAMFORMING_VERSION_2 */ -+ /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && -+ GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); -+ /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); -+ } -+ -+ /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && -+ GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { -+ SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); -+ /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ -+ SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); -+ -+ } -+ pvhtpriv->beamform_cap = cur_beamform_cap; -+ if (cur_beamform_cap) -+ RTW_INFO("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); -+#endif /* !RTW_BEAMFORMING_VERSION_2 */ -+#endif /* CONFIG_BEAMFORMING */ -+ /* B23 B24 B25 Maximum A-MPDU Length Exponent */ -+ pvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data); -+ -+ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data); -+ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); -+ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); -+ rtw_vht_nss_to_mcsmap(tx_nss, pvhtpriv->vht_mcs_map, pcap_mcs); -+ pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); -+} -+ -+void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -+{ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ -+ if (pIE == NULL) -+ return; -+ -+ if (pvhtpriv->vht_option == _FALSE) -+ return; -+} -+ -+void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta) -+{ -+ struct sta_info *psta = (struct sta_info *)sta; -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct registry_priv *regsty = adapter_to_regsty(padapter); -+ u8 target_bw; -+ u8 target_rxss, current_rxss; -+ u8 update_ra = _FALSE; -+ u8 tx_nss = 0, rf_type = RF_1T1R; -+ struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); -+ -+ if (pvhtpriv->vht_option == _FALSE) -+ return; -+ -+ target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe); -+ -+ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); -+ tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num); -+ target_rxss = rtw_min(tx_nss, (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe) + 1)); -+ -+ if (target_bw != psta->cmn.bw_mode) { -+ if (hal_is_bw_support(padapter, target_bw) -+ && REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw) -+ ) { -+ update_ra = _TRUE; -+ psta->cmn.bw_mode = target_bw; -+ } -+ } -+ -+ current_rxss = rtw_vht_mcsmap_to_nss(psta->vhtpriv.vht_mcs_map); -+ if (target_rxss != current_rxss) { -+ u8 vht_mcs_map[2] = {}; -+ -+ update_ra = _TRUE; -+ -+ rtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, psta->vhtpriv.vht_mcs_map); -+ _rtw_memcpy(psta->vhtpriv.vht_mcs_map, vht_mcs_map, 2); -+ -+ rtw_hal_update_sta_ra_info(padapter, psta); -+ } -+ -+ if (update_ra) -+ rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); -+} -+ -+u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel) -+{ -+ struct registry_priv *pregistrypriv = &padapter->registrypriv; -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ /* struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; */ -+ u8 ChnlWidth, center_freq, bw_mode; -+ u32 len = 0; -+ u8 operation[5]; -+ -+ _rtw_memset(operation, 0, 5); -+ -+ bw_mode = REGSTY_BW_5G(pregistrypriv); /* TODO: control op bw with other info */ -+ -+ if (hal_chk_bw_cap(padapter, BW_CAP_80M | BW_CAP_160M) -+ && REGSTY_BW_5G(pregistrypriv) >= CHANNEL_WIDTH_80 -+ ) { -+ center_freq = rtw_get_center_ch(channel, bw_mode, HAL_PRIME_CHNL_OFFSET_LOWER); -+ ChnlWidth = 1; -+ } else { -+ center_freq = 0; -+ ChnlWidth = 0; -+ } -+ -+ -+ SET_VHT_OPERATION_ELE_CHL_WIDTH(operation, ChnlWidth); -+ /* center frequency */ -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);/* Todo: need to set correct center channel */ -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation, 0); -+ -+ _rtw_memcpy(operation + 3, pvhtpriv->vht_mcs_map, 2); -+ -+ rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len); -+ -+ return len; -+} -+ -+u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw) -+{ -+ /* struct registry_priv *pregistrypriv = &padapter->registrypriv; */ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ u32 len = 0; -+ u8 opmode = 0; -+ u8 chnl_width, rx_nss; -+ -+ chnl_width = bw; -+ rx_nss = rtw_vht_mcsmap_to_nss(pvhtpriv->vht_mcs_map); -+ -+ SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, chnl_width); -+ SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss - 1)); -+ SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); /* Todo */ -+ -+ pvhtpriv->vht_op_mode_notify = opmode; -+ -+ pbuf = rtw_set_ie(pbuf, EID_OpModeNotification, 1, &opmode, &len); -+ -+ return len; -+} -+ -+u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) -+{ -+ u8 bw, rf_num, rx_stbc_nss = 0; -+ u16 HighestRate; -+ u8 *pcap, *pcap_mcs; -+ u32 len = 0; -+ u32 rx_packet_offset, max_recvbuf_sz; -+ struct registry_priv *pregistrypriv = &padapter->registrypriv; -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ -+ pcap = pvhtpriv->vht_cap; -+ _rtw_memset(pcap, 0, 32); -+ -+ /* B0 B1 Maximum MPDU Length */ -+ rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); -+ rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); -+ -+ RTW_DBG("%s, line%d, Available RX buf size = %d bytes\n", __FUNCTION__, __LINE__, max_recvbuf_sz - rx_packet_offset); -+ -+ if ((max_recvbuf_sz - rx_packet_offset) >= 11454) { -+ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); -+ RTW_INFO("%s, line%d, Set MAX MPDU len = 11454 bytes\n", __FUNCTION__, __LINE__); -+ } else if ((max_recvbuf_sz - rx_packet_offset) >= 7991) { -+ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 1); -+ RTW_INFO("%s, line%d, Set MAX MPDU len = 7991 bytes\n", __FUNCTION__, __LINE__); -+ } else if ((max_recvbuf_sz - rx_packet_offset) >= 3895) { -+ SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 0); -+ RTW_INFO("%s, line%d, Set MAX MPDU len = 3895 bytes\n", __FUNCTION__, __LINE__); -+ } else -+ RTW_ERR("%s, line%d, Error!! Available RX buf size < 3895 bytes\n", __FUNCTION__, __LINE__); -+ -+ /* B2 B3 Supported Channel Width Set */ -+ if (hal_chk_bw_cap(padapter, BW_CAP_160M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_160)) { -+ if (hal_chk_bw_cap(padapter, BW_CAP_80_80M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_80_80)) -+ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 2); -+ else -+ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 1); -+ } else -+ SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0); -+ -+ /* B4 Rx LDPC */ -+ if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) { -+ SET_VHT_CAPABILITY_ELE_RX_LDPC(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting RX LDPC\n"); -+ } -+ -+ /* B5 ShortGI for 80MHz */ -+ SET_VHT_CAPABILITY_ELE_SHORT_GI80M(pcap, pvhtpriv->sgi_80m ? 1 : 0); /* We can receive Short GI of 80M */ -+ if (pvhtpriv->sgi_80m) -+ RTW_INFO("[VHT] Declare supporting SGI 80MHz\n"); -+ -+ /* B6 ShortGI for 160MHz */ -+ /* SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pcap, pvhtpriv->sgi_80m? 1 : 0); */ -+ -+ /* B7 Tx STBC */ -+ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) { -+ SET_VHT_CAPABILITY_ELE_TX_STBC(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting TX STBC\n"); -+ } -+ -+ /* B8 B9 B10 Rx STBC */ -+ if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) { -+ rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss)); -+ -+ SET_VHT_CAPABILITY_ELE_RX_STBC(pcap, rx_stbc_nss); -+ RTW_INFO("[VHT] Declare supporting RX STBC = %d\n", rx_stbc_nss); -+ } -+ #ifdef CONFIG_BEAMFORMING -+ /* B11 SU Beamformer Capable */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) { -+ SET_VHT_CAPABILITY_ELE_SU_BFER(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting SU Bfer\n"); -+ /* B16 17 18 Number of Sounding Dimensions */ -+ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num); -+ SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(pcap, rf_num); -+ /* B19 MU Beamformer Capable */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) { -+ SET_VHT_CAPABILITY_ELE_MU_BFER(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting MU Bfer\n"); -+ } -+ } -+ -+ /* B12 SU Beamformee Capable */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) { -+ SET_VHT_CAPABILITY_ELE_SU_BFEE(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting SU Bfee\n"); -+ -+ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num); -+ -+ /* IOT action suggested by Yu Chen 2017/3/3 */ -+#ifdef CONFIG_80211AC_VHT -+ if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM) && -+ !pvhtpriv->ap_is_mu_bfer) -+ rf_num = (rf_num >= 2 ? 2 : rf_num); -+#endif -+ /* B13 14 15 Compressed Steering Number of Beamformer Antennas Supported */ -+ SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(pcap, rf_num); -+ /* B20 SU Beamformee Capable */ -+ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) { -+ SET_VHT_CAPABILITY_ELE_MU_BFEE(pcap, 1); -+ RTW_INFO("[VHT] Declare supporting MU Bfee\n"); -+ } -+ } -+ #endif/*CONFIG_BEAMFORMING*/ -+ -+ /* B21 VHT TXOP PS */ -+ SET_VHT_CAPABILITY_ELE_TXOP_PS(pcap, 0); -+ /* B22 +HTC-VHT Capable */ -+ SET_VHT_CAPABILITY_ELE_HTC_VHT(pcap, 1); -+ /* B23 24 25 Maximum A-MPDU Length Exponent */ -+ if (pregistrypriv->ampdu_factor != 0xFE) -+ SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, pregistrypriv->ampdu_factor); -+ else -+ SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, 7); -+ /* B26 27 VHT Link Adaptation Capable */ -+ SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(pcap, 0); -+ -+ pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pcap); -+ _rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2); -+ -+ pcap_mcs = GET_VHT_CAPABILITY_ELE_TX_MCS(pcap); -+ _rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2); -+ -+ /* find the largest bw supported by both registry and hal */ -+ bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv)); -+ -+ HighestRate = VHT_MCS_DATA_RATE[bw][pvhtpriv->sgi_80m][((pvhtpriv->vht_highest_rate - MGN_VHT1SS_MCS0) & 0x3f)]; -+ HighestRate = (HighestRate + 1) >> 1; -+ -+ SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest rx rate is 600Mbps. */ -+ SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest tx rate is 600Mbps. */ -+ -+ pbuf = rtw_set_ie(pbuf, EID_VHTCapability, 12, pcap, &len); -+ -+ return len; -+} -+ -+u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) -+{ -+ struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); -+ RT_CHANNEL_INFO *chset = rfctl->channel_set; -+ u32 ielen; -+ u8 max_bw; -+ u8 oper_ch, oper_bw = CHANNEL_WIDTH_20, oper_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -+ u8 *out_vht_op_ie, *ht_op_ie, *vht_cap_ie, *vht_op_ie; -+ struct registry_priv *pregistrypriv = &padapter->registrypriv; -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ -+ rtw_vht_use_default_setting(padapter); -+ -+ ht_op_ie = rtw_get_ie(in_ie + 12, WLAN_EID_HT_OPERATION, &ielen, in_len - 12); -+ if (!ht_op_ie || ielen != HT_OP_IE_LEN) -+ goto exit; -+ vht_cap_ie = rtw_get_ie(in_ie + 12, EID_VHTCapability, &ielen, in_len - 12); -+ if (!vht_cap_ie || ielen != VHT_CAP_IE_LEN) -+ goto exit; -+ vht_op_ie = rtw_get_ie(in_ie + 12, EID_VHTOperation, &ielen, in_len - 12); -+ if (!vht_op_ie || ielen != VHT_OP_IE_LEN) -+ goto exit; -+ -+ /* VHT Capabilities element */ -+ *pout_len += rtw_build_vht_cap_ie(padapter, out_ie + *pout_len); -+ -+ -+ /* VHT Operation element */ -+ out_vht_op_ie = out_ie + *pout_len; -+ rtw_set_ie(out_vht_op_ie, EID_VHTOperation, VHT_OP_IE_LEN, vht_op_ie + 2 , pout_len); -+ -+ /* get primary channel from HT_OP_IE */ -+ oper_ch = GET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2); -+ -+ /* find the largest bw supported by both registry and hal */ -+ max_bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv)); -+ -+ if (max_bw >= CHANNEL_WIDTH_40) { -+ /* get bw offset form HT_OP_IE */ -+ if (GET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2)) { -+ switch (GET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2)) { -+ case SCA: -+ oper_bw = CHANNEL_WIDTH_40; -+ oper_offset = HAL_PRIME_CHNL_OFFSET_LOWER; -+ break; -+ case SCB: -+ oper_bw = CHANNEL_WIDTH_40; -+ oper_offset = HAL_PRIME_CHNL_OFFSET_UPPER; -+ break; -+ } -+ } -+ -+ if (oper_bw == CHANNEL_WIDTH_40) { -+ switch (GET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2)) { -+ case 1: /* 80MHz */ -+ case 2: /* 160MHz */ -+ case 3: /* 80+80 */ -+ oper_bw = CHANNEL_WIDTH_80; /* only support up to 80MHz for now */ -+ break; -+ } -+ -+ oper_bw = rtw_min(oper_bw, max_bw); -+ -+ /* try downgrage bw to fit in channel plan setting */ -+ while (!rtw_chset_is_chbw_valid(chset, oper_ch, oper_bw, oper_offset) -+ || (IS_DFS_SLAVE_WITH_RD(rfctl) -+ && !rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl)) -+ && rtw_chset_is_chbw_non_ocp(chset, oper_ch, oper_bw, oper_offset)) -+ ) { -+ oper_bw--; -+ if (oper_bw == CHANNEL_WIDTH_20) { -+ oper_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -+ break; -+ } -+ } -+ } -+ } -+ -+ rtw_warn_on(!rtw_chset_is_chbw_valid(chset, oper_ch, oper_bw, oper_offset)); -+ if (IS_DFS_SLAVE_WITH_RD(rfctl) && !rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl))) -+ rtw_warn_on(rtw_chset_is_chbw_non_ocp(chset, oper_ch, oper_bw, oper_offset)); -+ -+ /* update VHT_OP_IE */ -+ if (oper_bw < CHANNEL_WIDTH_80) { -+ SET_VHT_OPERATION_ELE_CHL_WIDTH(out_vht_op_ie + 2, 0); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(out_vht_op_ie + 2, 0); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(out_vht_op_ie + 2, 0); -+ } else if (oper_bw == CHANNEL_WIDTH_80) { -+ u8 cch = rtw_get_center_ch(oper_ch, oper_bw, oper_offset); -+ -+ SET_VHT_OPERATION_ELE_CHL_WIDTH(out_vht_op_ie + 2, 1); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(out_vht_op_ie + 2, cch); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(out_vht_op_ie + 2, 0); -+ } else { -+ RTW_ERR(FUNC_ADPT_FMT" unsupported BW:%u\n", FUNC_ADPT_ARG(padapter), oper_bw); -+ rtw_warn_on(1); -+ } -+ -+ /* Operating Mode Notification element */ -+ *pout_len += rtw_build_vht_op_mode_notify_ie(padapter, out_ie + *pout_len, oper_bw); -+ -+ pvhtpriv->vht_option = _TRUE; -+ -+exit: -+ return pvhtpriv->vht_option; -+ -+} -+ -+void VHTOnAssocRsp(_adapter *padapter) -+{ -+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -+ struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -+ u8 ht_AMPDU_len; -+ -+ RTW_INFO("%s\n", __FUNCTION__); -+ -+ if (!pmlmeinfo->HT_enable) -+ return; -+ -+ if (!pmlmeinfo->VHT_enable) -+ return; -+ -+ ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; -+ -+ if (pvhtpriv->ampdu_len > ht_AMPDU_len) -+ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); -+ -+ rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MAX_TIME, (u8 *)(&pvhtpriv->vht_highest_rate)); -+} -+ -+void rtw_vht_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pnetwork) -+{ -+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ u8 cap_len, operation_len; -+ uint len = 0; -+ sint ie_len = 0; -+ u8 *p = NULL; -+ -+ p = rtw_get_ie(pnetwork->IEs + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, -+ (pnetwork->IELength - _BEACON_IE_OFFSET_)); -+ if (p && ie_len > 0) -+ return; -+ -+ rtw_vht_use_default_setting(padapter); -+ -+ /* VHT Operation mode notifiy bit in Extended IE (127) */ -+ SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1); -+ pmlmepriv->ext_capab_ie_len = 10; -+ rtw_set_ie(pnetwork->IEs + pnetwork->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); -+ pnetwork->IELength += pmlmepriv->ext_capab_ie_len; -+ -+ /* VHT Capabilities element */ -+ cap_len = rtw_build_vht_cap_ie(padapter, pnetwork->IEs + pnetwork->IELength); -+ pnetwork->IELength += cap_len; -+ -+ /* VHT Operation element */ -+ operation_len = rtw_build_vht_operation_ie(padapter, pnetwork->IEs + pnetwork->IELength, -+ pnetwork->Configuration.DSConfig); -+ pnetwork->IELength += operation_len; -+ -+ rtw_check_for_vht20(padapter, pnetwork->IEs + _BEACON_IE_OFFSET_, pnetwork->IELength - _BEACON_IE_OFFSET_); -+ -+ pmlmepriv->vhtpriv.vht_option = _TRUE; -+} -+ -+void rtw_vht_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pnetwork) -+{ -+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ -+ rtw_remove_bcn_ie(padapter, pnetwork, EID_EXTCapability); -+ rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTCapability); -+ rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTOperation); -+ -+ pmlmepriv->vhtpriv.vht_option = _FALSE; -+} -+ -+void rtw_check_for_vht20(_adapter *adapter, u8 *ies, int ies_len) -+{ -+ u8 ht_ch, ht_bw, ht_offset; -+ u8 vht_ch, vht_bw, vht_offset; -+ -+ rtw_ies_get_chbw(ies, ies_len, &ht_ch, &ht_bw, &ht_offset, 1, 0); -+ rtw_ies_get_chbw(ies, ies_len, &vht_ch, &vht_bw, &vht_offset, 1, 1); -+ -+ if (ht_bw == CHANNEL_WIDTH_20 && vht_bw >= CHANNEL_WIDTH_80) { -+ u8 *vht_op_ie; -+ int vht_op_ielen; -+ -+ RTW_INFO(FUNC_ADPT_FMT" vht80 is not allowed without ht40\n", FUNC_ADPT_ARG(adapter)); -+ vht_op_ie = rtw_get_ie(ies, EID_VHTOperation, &vht_op_ielen, ies_len); -+ if (vht_op_ie && vht_op_ielen) { -+ RTW_INFO(FUNC_ADPT_FMT" switch to vht20\n", FUNC_ADPT_ARG(adapter)); -+ SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0); -+ SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); -+ } -+ } -+} -+#endif /* CONFIG_80211AC_VHT */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wlan_util.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wlan_util.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_wlan_util.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_wlan_util.c 2021-03-07 18:16:17.027954777 +0200 -@@ -0,0 +1,4972 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wlan_util.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wlan_util.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_wlan_util.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_wlan_util.c 2022-01-28 22:59:35.563651847 +0200 +@@ -0,0 +1,4973 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -110183,12 +110032,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wlan_util.c linux-5.11.4-rtl + goto exit; + else { + if(*(p+1) > 6 ) { -+ for(i=0; i<9;i++) ++ for(i=0; i<9;i++) { + RTW_INFO("p[%d]=0x%x",i,*(p+i) ); + RTW_INFO("\n"); ++ } + if(*(p+6) != 2) + goto exit; -+ ++ + if(*(p+8) == RT_HT_CAP_USE_JAGUAR_BCUT) + sta->vendor_8812 = TRUE; + else if (*(p+8) == RT_HT_CAP_USE_JAGUAR_CCUT) @@ -111930,9 +111780,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_wlan_util.c linux-5.11.4-rtl + /*TODO get offset of bcn's timestamp*/ + /*pmlmeext->bcn_timestamp;*/ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_xmit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_xmit.c ---- linux-5.11.4/3rdparty/rtl8812au/core/rtw_xmit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/core/rtw_xmit.c 2021-03-07 18:16:17.028954824 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/core/rtw_xmit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_xmit.c +--- linux-6.3.4/drivers/staging/rtl8812au/core/rtw_xmit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/core/rtw_xmit.c 2022-01-28 22:59:35.563651847 +0200 @@ -0,0 +1,6097 @@ +/****************************************************************************** + * @@ -118031,9 +117881,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/core/rtw_xmit.c linux-5.11.4-rtl8812a + RTW_INFO("%s ack_tx not set\n", __func__); +} +#endif /* CONFIG_XMIT_ACK */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/efuse_mask.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/efuse_mask.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/efuse_mask.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/efuse_mask.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/efuse_mask.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/efuse_mask.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/efuse_mask.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/efuse_mask.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,164 @@ +/****************************************************************************** + * @@ -118199,9 +118049,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/efuse_mask.h linux-5.11.4-r + #endif + +#endif /*CONFIG_SDIO_HCI*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,94 @@ +/****************************************************************************** + * @@ -118297,9 +118147,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_ + + return (result > 0) ? 0 : 1; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_PCIE.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** + * @@ -118334,9 +118184,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_ +EFUSE_IsAddressMasked_MP_8812A_MPCIE(/* TC: Test Chip, MP: MP Chip */ + IN u2Byte Offset +); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,94 @@ +/****************************************************************************** + * @@ -118432,9 +118282,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_ + + return (result > 0) ? 0 : 1; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_USB.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,34 @@ +/****************************************************************************** + * @@ -118470,9 +118320,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8812A_ +EFUSE_IsAddressMasked_MP_8812A_MUSB(/* TC: Test Chip, MP: MP Chip */ + IN u2Byte Offset +); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,93 @@ +/****************************************************************************** + * @@ -118567,9 +118417,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ + + return (result > 0) ? 0 : 1; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_PCIE.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** + * @@ -118604,9 +118454,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ +EFUSE_IsAddressMasked_MP_8821A_MPCIE(/* TC: Test Chip, MP: MP Chip */ + IN u2Byte Offset +); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,96 @@ +/****************************************************************************** + * @@ -118704,9 +118554,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ + + return (result > 0) ? 0 : 1; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_SDIO.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,31 @@ +/****************************************************************************** + * @@ -118739,9 +118589,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ +EFUSE_IsAddressMasked_MP_8821A_MSDIO(/* TC: Test Chip, MP: MP Chip */ + IN u2Byte Offset +); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,95 @@ +/****************************************************************************** + * @@ -118838,9 +118688,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ + + return (result > 0) ? 0 : 1; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_USB.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,31 @@ +/****************************************************************************** + * @@ -118873,9 +118723,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8812a/HalEfuseMask8821A_ +EFUSE_IsAddressMasked_MP_8821A_MUSB(/* TC: Test Chip, MP: MP Chip */ + IN u2Byte Offset +); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,93 @@ +/****************************************************************************** +* @@ -118970,9 +118820,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_ + return (result > 0) ? 0 : 1; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** +* @@ -119007,9 +118857,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_ +BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte Offset); + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,90 @@ +/****************************************************************************** +* @@ -119101,9 +118951,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_ + return (result > 0) ? 0 : 1; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** +* @@ -119138,9 +118988,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_ + +BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte Offset); + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_btcoex.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_btcoex.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_btcoex.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_btcoex.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_btcoex.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_btcoex.c 2022-01-28 22:59:35.585652890 +0200 @@ -0,0 +1,5706 @@ +/****************************************************************************** + * @@ -124848,9 +124698,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex.c linux-5.11.4-rtl8812 + EXhalbtcoutsrc_rx_rate_change_notify(&GLBtCoexist, is_data_frame, EXhalbtcoutsrc_rate_id_to_btc_rate_id(rate_id)); +} +#endif /* CONFIG_BT_COEXIST */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex_wifionly.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_btcoex_wifionly.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex_wifionly.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_btcoex_wifionly.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_btcoex_wifionly.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_btcoex_wifionly.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_btcoex_wifionly.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_btcoex_wifionly.c 2022-01-28 22:59:35.585652890 +0200 @@ -0,0 +1,224 @@ +/****************************************************************************** + * @@ -125076,10 +124926,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_btcoex_wifionly.c linux-5.11. + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com.c 2021-03-07 18:16:17.051955911 +0200 -@@ -0,0 +1,14640 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com.c 2023-05-26 22:35:36.543136899 +0300 +@@ -0,0 +1,14360 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -129412,28 +129262,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + if (ret != _SUCCESS) + goto exit; + -+#if defined(CONFIG_RTL8188E) -+ if (rtw_get_chip_type(adapter) == RTL8188E) { -+ HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); -+ -+ /* 8188E FW doesn't set macid no link, driver does it by self */ -+ if (opmode) -+ rtw_hal_set_hwreg(adapter, HW_VAR_MACID_LINK, &macid); -+ else -+ rtw_hal_set_hwreg(adapter, HW_VAR_MACID_NOLINK, &macid); -+ -+ /* for 8188E RA */ -+#if (RATE_ADAPTIVE_SUPPORT == 1) -+ if (hal_data->fw_ractrl == _FALSE) { -+ u8 max_macid; -+ -+ max_macid = rtw_search_max_mac_id(adapter); -+ rtw_hal_set_hwreg(adapter, HW_VAR_TX_RPT_MAX_MACID, &max_macid); -+ } -+#endif -+ } -+#endif -+ +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + /* TODO: this should move to IOT issue area */ + if (rtw_get_chip_type(adapter) == RTL8812 @@ -129838,21 +129666,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + rtw_write32(adapter, REG_RXPKT_NUM, + (rtw_read32(adapter, REG_RXPKT_NUM) & (~RW_RELEASE_EN))); +} -+#if defined(CONFIG_RTL8188E) -+static void rtw_hal_disable_tx_report(_adapter *adapter) -+{ -+ rtw_write8(adapter, REG_TX_RPT_CTRL, -+ ((rtw_read8(adapter, REG_TX_RPT_CTRL) & ~BIT(1))) & ~BIT(5)); -+ RTW_INFO("disable TXRPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL)); -+} -+ -+static void rtw_hal_enable_tx_report(_adapter *adapter) -+{ -+ rtw_write8(adapter, REG_TX_RPT_CTRL, -+ ((rtw_read8(adapter, REG_TX_RPT_CTRL) | BIT(1))) | BIT(5)); -+ RTW_INFO("enable TX_RPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL)); -+} -+#endif +static void rtw_hal_release_rx_dma(_adapter *adapter) +{ + u32 val32 = 0; @@ -130938,10 +130751,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + issue_beacon(padapter, 0); + + rtw_msleep_os(2); -+ #if defined(CONFIG_RTL8188E) -+ if (IS_HARDWARE_TYPE_8188E(padapter)) -+ rtw_hal_disable_tx_report(padapter); -+ #endif + /* RX DMA stop */ + res = rtw_hal_pause_rx_dma(padapter); + if (res == _FAIL) @@ -131002,11 +130811,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + } +#endif /*DBG_CHECK_FW_PS_STATE*/ + -+ #if defined(CONFIG_RTL8188E) -+ if (IS_HARDWARE_TYPE_8188E(padapter)) -+ rtw_hal_enable_tx_report(padapter); -+ #endif -+ + rtw_hal_force_enable_rxdma(padapter); + + rtw_hal_fw_dl(padapter, _FALSE); @@ -134686,10 +134490,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + (u8 *)&media_status_rpt); + + /* RX DMA stop */ -+ #if defined(CONFIG_RTL8188E) -+ if (IS_HARDWARE_TYPE_8188E(adapter)) -+ rtw_hal_disable_tx_report(adapter); -+ #endif + + res = rtw_hal_pause_rx_dma(adapter); + if (res == _FAIL) @@ -134878,11 +134678,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + #endif + rtw_hal_release_rx_dma(adapter); + -+ #if defined(CONFIG_RTL8188E) -+ if (IS_HARDWARE_TYPE_8188E(adapter)) -+ rtw_hal_enable_tx_report(adapter); -+ #endif -+ + if ((pwrctl->wowlan_wake_reason != RX_DISASSOC) && + (pwrctl->wowlan_wake_reason != RX_DEAUTH) && + (pwrctl->wowlan_wake_reason != FW_DECISION_DISCONNECT)) { @@ -137651,7 +137446,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + + /*RTW_INFO("=>%s WIFI_DATA_TYPE or WIFI_QOS_DATA_TYPE\n", __FUNCTION__);*/ + if (psta) { -+ if (IS_MCAST(get_ra(get_recvframe_data(prframe)))) ++ if (IS_MCAST(wifi_get_ra(get_recvframe_data(prframe)))) + psta_dframe_info = &psta->sta_dframe_info_bmc; + else + psta_dframe_info = &psta->sta_dframe_info; @@ -137686,61 +137481,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + interface_type = rtw_get_intf_type(adapter); + + switch (rtw_get_chip_type(adapter)) { -+#ifdef CONFIG_RTL8723B -+ case RTL8723B: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8723BU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8723BS; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8723BE; -+ break; -+#endif -+#ifdef CONFIG_RTL8703B -+ case RTL8703B: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8703BU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8703BS; -+ break; -+#endif -+#ifdef CONFIG_RTL8723D -+ case RTL8723D: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8723DU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8723DS; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8723DE; -+ break; -+#endif -+ -+#ifdef CONFIG_RTL8188E -+ case RTL8188E: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_88EU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_88ES; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_88EE; -+ break; -+#endif -+#ifdef CONFIG_RTL8188F -+ case RTL8188F: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8188FU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8188FS; -+ break; -+#endif -+#ifdef CONFIG_RTL8188GTV -+ case RTL8188GTV: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8188GTVU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8188GTVS; -+ break; -+#endif +#ifdef CONFIG_RTL8812A + case RTL8812: + if (interface_type == RTW_USB) @@ -137759,16 +137499,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + addr_offset = EEPROM_MAC_ADDR_8821AE; + break; +#endif -+#ifdef CONFIG_RTL8192E -+ case RTL8192E: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8192EU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8192ES; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8192EE; -+ break; -+#endif +#ifdef CONFIG_RTL8814A + case RTL8814A: + if (interface_type == RTW_USB) @@ -137778,46 +137508,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + break; +#endif + -+#ifdef CONFIG_RTL8822B -+ case RTL8822B: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8822BU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8822BS; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8822BE; -+ break; -+#endif /* CONFIG_RTL8822B */ -+ -+#ifdef CONFIG_RTL8821C -+ case RTL8821C: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8821CU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8821CS; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8821CE; -+ break; -+#endif /* CONFIG_RTL8821C */ -+ -+#ifdef CONFIG_RTL8710B -+ case RTL8710B: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8710B; -+ break; -+#endif -+ -+#ifdef CONFIG_RTL8192F -+ case RTL8192F: -+ if (interface_type == RTW_USB) -+ addr_offset = EEPROM_MAC_ADDR_8192FU; -+ else if (interface_type == RTW_SDIO) -+ addr_offset = EEPROM_MAC_ADDR_8192FS; -+ else if (interface_type == RTW_PCIE) -+ addr_offset = EEPROM_MAC_ADDR_8192FE; -+ break; -+#endif /* CONFIG_RTL8192F */ -+ + } + + if (addr_offset == -1) { @@ -138035,32 +137725,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + } else + RTW_INFO("Using the default RF gain.\n"); + -+#elif defined(CONFIG_RTL8188E) -+ if (value & BIT4 && (registry_par->RegPwrTrimEnable == 1)) { -+ RTW_INFO("8188ES Offset RF Gain.\n"); -+ RTW_INFO("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n", -+ pHalData->EEPROMRFGainVal); -+ -+ if (pHalData->EEPROMRFGainVal != 0xff) { -+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, -+ REG_RF_BB_GAIN_OFFSET, 0xffffffff); -+ -+ RTW_INFO("Offset RF Gain. reg 0x55=0x%x\n", res); -+ res &= 0xfff87fff; -+ -+ res |= (pHalData->EEPROMRFGainVal & 0x0f) << 15; -+ RTW_INFO("Offset RF Gain. res=0x%x\n", res); -+ -+ rtw_hal_write_rfreg(padapter, RF_PATH_A, -+ REG_RF_BB_GAIN_OFFSET, -+ RF_GAIN_OFFSET_MASK, res); -+ } else { -+ RTW_INFO("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n", -+ pHalData->EEPROMRFGainVal); -+ } -+ } else -+ RTW_INFO("Using the default RF gain.\n"); -+#else + /* TODO: call this when channel switch */ + if (kfree_data->flag & KFREE_FLAG_ON) + rtw_rf_apply_tx_gain_offset(padapter, 6); /* input ch6 to select BB_GAIN_2G */ @@ -138792,14 +138456,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + return curr_tx_sgi; + + if (padapter->fix_rate == 0xff) { -+#if defined(CONFIG_RTL8188E) -+#if (RATE_ADAPTIVE_SUPPORT == 1) -+ curr_tx_sgi = hal_data->odmpriv.ra_info[psta->cmn.mac_id].rate_sgi; -+#endif /* (RATE_ADAPTIVE_SUPPORT == 1)*/ -+#else + ra_info = &psta->cmn.ra_info; + curr_tx_sgi = ((ra_info->curr_tx_rate) & 0x80) >> 7; -+#endif + } else { + curr_tx_sgi = ((padapter->fix_rate) & 0x80) >> 7; + } @@ -138817,14 +138475,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + return rate_id; + + if (padapter->fix_rate == 0xff) { -+#if defined(CONFIG_RTL8188E) -+#if (RATE_ADAPTIVE_SUPPORT == 1) -+ rate_id = hal_data->odmpriv.ra_info[psta->cmn.mac_id].decision_rate; -+#endif /* (RATE_ADAPTIVE_SUPPORT == 1)*/ -+#else + ra_info = &psta->cmn.ra_info; + rate_id = ra_info->curr_tx_rate & 0x7f; -+#endif + } else { + rate_id = padapter->fix_rate & 0x7f; + } @@ -138908,14 +138560,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + crystal_cap = crystal_cap & 0x3F; + + switch (rtw_get_chip_type(adapter)) { -+#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV) -+ case RTL8188E: -+ case RTL8188F: -+ case RTL8188GTV: -+ /* write 0x24[16:11] = 0x24[22:17] = CrystalCap */ -+ phy_set_bb_reg(adapter, REG_AFE_XTAL_CTRL, 0x007FF800, (crystal_cap | (crystal_cap << 6))); -+ break; -+#endif +#if defined(CONFIG_RTL8812A) + case RTL8812: + /* write 0x2C[30:25] = 0x2C[24:19] = CrystalCap */ @@ -138940,25 +138584,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + phy_set_bb_reg(adapter, REG_MAC_PHY_CTRL, 0x07FF8000, (crystal_cap | (crystal_cap << 6))); + break; +#endif -+#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8192F) -+ -+ case RTL8822B: -+ case RTL8821C: -+ case RTL8192F: -+ /* write 0x28[6:1] = 0x24[30:25] = CrystalCap */ -+ crystal_cap = crystal_cap & 0x3F; -+ phy_set_bb_reg(adapter, REG_AFE_XTAL_CTRL, 0x7E000000, crystal_cap); -+ phy_set_bb_reg(adapter, REG_AFE_PLL_CTRL, 0x7E, crystal_cap); -+ break; -+#endif -+#if defined(CONFIG_RTL8710B) -+ case RTL8710B: -+ /*Change by ylb 20160728, Becase 0x2C[23:12] is removed to syson 0x60[29:18] */ -+ /* 0x2C[23:18] = 0x2C[29:24] = CrystalCap //Xo:[29:24], Xi:[23:18]*/ -+ crystal_cap = crystal_cap & 0x3F; -+ hal_set_syson_reg(adapter, REG_SYS_XTAL_CTRL0, 0x3FFC0000, (crystal_cap | (crystal_cap << 6))); -+ break; -+#endif + default: + rtw_warn_on(1); + } @@ -138972,36 +138597,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + interface_type = rtw_get_intf_type(adapter); + + switch (rtw_get_chip_type(adapter)) { -+#ifdef CONFIG_RTL8723B -+ case RTL8723B: -+ init_hal_spec_8723b(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8703B -+ case RTL8703B: -+ init_hal_spec_8703b(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8723D -+ case RTL8723D: -+ init_hal_spec_8723d(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8188E -+ case RTL8188E: -+ init_hal_spec_8188e(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8188F -+ case RTL8188F: -+ init_hal_spec_8188f(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8188GTV -+ case RTL8188GTV: -+ init_hal_spec_8188gtv(adapter); -+ break; -+#endif +#ifdef CONFIG_RTL8812A + case RTL8812: + init_hal_spec_8812a(adapter); @@ -139012,36 +138607,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ + init_hal_spec_8821a(adapter); + break; +#endif -+#ifdef CONFIG_RTL8192E -+ case RTL8192E: -+ init_hal_spec_8192e(adapter); -+ break; -+#endif +#ifdef CONFIG_RTL8814A + case RTL8814A: + init_hal_spec_8814a(adapter); + break; +#endif -+#ifdef CONFIG_RTL8822B -+ case RTL8822B: -+ rtl8822b_init_hal_spec(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8821C -+ case RTL8821C: -+ init_hal_spec_rtl8821c(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8710B -+ case RTL8710B: -+ init_hal_spec_8710b(adapter); -+ break; -+#endif -+#ifdef CONFIG_RTL8192F -+ case RTL8192F: -+ init_hal_spec_8192f(adapter); -+ break; -+#endif + + default: + RTW_ERR("%s: unknown chip_type:%u\n" @@ -139720,9 +139290,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com.c linux-5.11.4-rtl8812au/ +} +#endif /*CONFIG_RTL8812A*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_c2h.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com_c2h.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_c2h.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com_c2h.h 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com_c2h.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com_c2h.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com_c2h.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com_c2h.h 2022-01-28 22:59:35.586652938 +0200 @@ -0,0 +1,123 @@ +/****************************************************************************** + * @@ -139847,9 +139417,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_c2h.h linux-5.11.4-rtl881 +#endif + +#endif /* __COMMON_C2H_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_phycfg.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com_phycfg.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_phycfg.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_com_phycfg.c 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com_phycfg.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com_phycfg.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_com_phycfg.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_com_phycfg.c 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,5408 @@ +/****************************************************************************** + * @@ -145259,9 +144829,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_com_phycfg.c linux-5.11.4-rtl +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm_acs.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm_acs.c 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm_acs.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm_acs.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm_acs.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm_acs.c 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,556 @@ +/****************************************************************************** + * @@ -145819,9 +145389,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.c linux-5.11.4-rtl8812 +} +#endif /*CONFIG_BACKGROUND_NOISE_MONITOR*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm_acs.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm_acs.h 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm_acs.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm_acs.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm_acs.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm_acs.h 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,167 @@ +/****************************************************************************** + * @@ -145990,9 +145560,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm_acs.h linux-5.11.4-rtl8812 +void rtw_noise_info_dump(void *sel, _adapter *adapter); +#endif +#endif /* __HAL_DM_ACS_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm.c 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm.c 2022-12-18 17:40:24.574937030 +0200 @@ -0,0 +1,1616 @@ +/****************************************************************************** + * @@ -146572,7 +146142,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.c linux-5.11.4-rtl8812au/3 + return; + } + -+ if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */ ++ if (pregpriv->wifi_spec == 1) { /* || (pmlmeinfo->HT_enable == 0)) */ + precvpriv->is_any_non_be_pkts = _FALSE; + return; + } @@ -147610,9 +147180,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.c linux-5.11.4-rtl8812au/3 + return; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_dm.h 2021-03-07 18:16:17.051955911 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_dm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_dm.h 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,111 @@ +/****************************************************************************** + * @@ -147725,9 +147295,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_dm.h linux-5.11.4-rtl8812au/3 +#endif + +#endif /* __HAL_DM_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_halmac.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_halmac.c 2021-03-07 18:16:17.052955958 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_halmac.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_halmac.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_halmac.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_halmac.c 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,5555 @@ +/****************************************************************************** + * @@ -153284,9 +152854,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.c linux-5.11.4-rtl8812 + +#endif /* RTW_BEAMFORMING_VERSION_2 */ +#endif /* CONFIG_BEAMFORMING */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_halmac.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_halmac.h 2021-03-07 18:16:17.052955958 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_halmac.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_halmac.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_halmac.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_halmac.h 2022-01-28 22:59:35.587652985 +0200 @@ -0,0 +1,245 @@ +/****************************************************************************** + * @@ -153533,9 +153103,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_halmac.h linux-5.11.4-rtl8812 +#endif /* CONFIG_BEAMFORMING */ + +#endif /* _HAL_HALMAC_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_hci/hal_usb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_hci/hal_usb.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_hci/hal_usb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_hci/hal_usb.c 2021-03-07 18:16:17.052955958 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_hci/hal_usb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_hci/hal_usb.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_hci/hal_usb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_hci/hal_usb.c 2022-01-28 22:59:35.588653032 +0200 @@ -0,0 +1,564 @@ +/****************************************************************************** + * @@ -154101,10 +153671,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_hci/hal_usb.c linux-5.11.4-rt +#endif + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_intf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_intf.c 2021-03-07 18:16:17.052955958 +0200 -@@ -0,0 +1,1716 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_intf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_intf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_intf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_intf.c 2023-05-26 22:35:36.543136899 +0300 +@@ -0,0 +1,1698 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -154127,20 +153697,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c linux-5.11.4-rtl8812au + +const u32 _chip_type_to_odm_ic_type[] = { + 0, -+ ODM_RTL8188E, -+ ODM_RTL8192E, + ODM_RTL8812, + ODM_RTL8821, -+ ODM_RTL8723B, + ODM_RTL8814A, -+ ODM_RTL8703B, -+ ODM_RTL8188F, -+ ODM_RTL8188F, -+ ODM_RTL8822B, -+ ODM_RTL8723D, -+ ODM_RTL8821C, -+ ODM_RTL8710B, -+ ODM_RTL8192F, + 0, +}; + @@ -155520,7 +155079,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c linux-5.11.4-rtl8812au +u8 rtw_hal_ops_check(_adapter *padapter) +{ + u8 ret = _SUCCESS; -+#if 1 + /*** initialize section ***/ + if (NULL == padapter->hal_func.read_chip_version) { + rtw_hal_error_msg("read_chip_version"); @@ -155710,12 +155268,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c linux-5.11.4-rtl8812au + rtw_hal_error_msg("hal_mac_c2h_handler"); + ret = _FAIL; + } -+#elif !defined(CONFIG_RTL8188E) -+ if (NULL == padapter->hal_func.c2h_handler) { -+ rtw_hal_error_msg("c2h_handler"); -+ ret = _FAIL; -+ } -+#endif + +#if defined(CONFIG_LPS) || defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) + if (NULL == padapter->hal_func.fill_fake_txdesc) { @@ -155821,9 +155373,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_intf.c linux-5.11.4-rtl8812au +#endif + return ret; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mcc.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_mcc.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_mcc.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_mcc.c 2021-03-07 18:16:17.052955958 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_mcc.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_mcc.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_mcc.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_mcc.c 2022-01-28 22:59:35.588653032 +0200 @@ -0,0 +1,3488 @@ +/****************************************************************************** + * @@ -159313,10 +158865,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mcc.c linux-5.11.4-rtl8812au/ +} + +#endif /* CONFIG_MCC_MODE */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_mp.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_mp.c 2021-03-07 18:16:17.053956006 +0200 -@@ -0,0 +1,2269 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_mp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_mp.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_mp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_mp.c 2023-05-26 22:35:36.543136899 +0300 +@@ -0,0 +1,2244 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -159340,39 +158892,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3 +#ifdef RTW_HALMAC + #include /* struct HAL_DATA_TYPE, RF register definition and etc. */ +#else /* !RTW_HALMAC */ -+ #ifdef CONFIG_RTL8188E -+ #include -+ #endif -+ #ifdef CONFIG_RTL8723B -+ #include -+ #endif -+ #ifdef CONFIG_RTL8192E -+ #include -+ #endif + #if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8812A) + #include + #endif + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + #include + #endif -+ #ifdef CONFIG_RTL8703B -+ #include -+ #endif -+ #ifdef CONFIG_RTL8723D -+ #include -+ #endif -+ #ifdef CONFIG_RTL8710B -+ #include -+ #endif -+ #ifdef CONFIG_RTL8188F -+ #include -+ #endif -+ #ifdef CONFIG_RTL8188GTV -+ #include -+ #endif -+ #ifdef CONFIG_RTL8192F -+ #include -+ #endif +#endif /* !RTW_HALMAC */ + + @@ -159500,7 +159025,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3 + } else if (IS_HARDWARE_TYPE_8723D(Adapter)) { + /* 2.4G CCK TX DFIR */ + /* 2016.01.20 Suggest from RS BB mingzhi*/ -+ if ((u1Channel == 14)) { ++ if (u1Channel == 14) { + phy_set_bb_reg(Adapter, rCCK0_TxFilter2, bMaskDWord, 0x0000B81C); + phy_set_bb_reg(Adapter, rCCK0_DebugPort, bMaskDWord, 0x00000000); + phy_set_bb_reg(Adapter, 0xAAC, bMaskDWord, 0x00003667); @@ -159927,6 +159452,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3 + u1Byte Path = 0; + u4Byte IGReg = rA_IGI_Jaguar, IGvalue = 0; + ++ /* // kimocoder: Disable below as it's not in use. + for (Path; Path <= RF_PATH_D; Path++) { + switch (Path) { + case RF_PATH_B: @@ -159942,11 +159468,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3 + IGReg = rA_IGI_Jaguar; + break; + } ++ */ ++ ++ IGvalue = phy_query_bb_reg(pAdapter, IGReg, bMaskByte0); ++ phy_set_bb_reg(pAdapter, IGReg, bMaskByte0, IGvalue + 2); ++ phy_set_bb_reg(pAdapter, IGReg, bMaskByte0, IGvalue); + -+ IGvalue = phy_query_bb_reg(pAdapter, IGReg, bMaskByte0); -+ phy_set_bb_reg(pAdapter, IGReg, bMaskByte0, IGvalue + 2); -+ phy_set_bb_reg(pAdapter, IGReg, bMaskByte0, IGvalue); -+ } +} + +VOID mpt_SetRFPath_8814A(PADAPTER pAdapter) @@ -161586,9 +161113,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_mp.c linux-5.11.4-rtl8812au/3 +} + +#endif /* CONFIG_MP_INCLUDE*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_phy.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_phy.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/hal_phy.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/hal_phy.c 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/hal_phy.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_phy.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/hal_phy.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/hal_phy.c 2022-01-28 22:59:35.588653032 +0200 @@ -0,0 +1,257 @@ +/****************************************************************************** + * @@ -161847,9 +161374,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/hal_phy.c linux-5.11.4-rtl8812au/ + +} /* PHY_RFShadowRead */ +#endif /*CONFIG_RF_SHADOW_RW*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/HalPwrSeqCmd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/HalPwrSeqCmd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/HalPwrSeqCmd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/HalPwrSeqCmd.c 2021-03-07 18:16:17.049955817 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/HalPwrSeqCmd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/HalPwrSeqCmd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/HalPwrSeqCmd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/HalPwrSeqCmd.c 2022-01-28 22:59:35.584652843 +0200 @@ -0,0 +1,185 @@ +/****************************************************************************** + * @@ -162036,9 +161563,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/HalPwrSeqCmd.c linux-5.11.4-rtl88 + + return _TRUE; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_led.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/led/hal_led.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_led.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/led/hal_led.c 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/led/hal_led.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/led/hal_led.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/led/hal_led.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/led/hal_led.c 2022-01-28 22:59:35.588653032 +0200 @@ -0,0 +1,254 @@ +/****************************************************************************** + * @@ -162294,9 +161821,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_led.c linux-5.11.4-rtl881 + +#endif /* CONFIG_RTW_LED */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_usb_led.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/led/hal_usb_led.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_usb_led.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/led/hal_usb_led.c 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/led/hal_usb_led.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/led/hal_usb_led.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/led/hal_usb_led.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/led/hal_usb_led.c 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,4291 @@ +/****************************************************************************** + * @@ -166589,9 +166116,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/led/hal_usb_led.c linux-5.11.4-rt + ResetLedStatus(pLed); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/ap_makefile.mk linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/ap_makefile.mk ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/ap_makefile.mk 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/ap_makefile.mk 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/ap_makefile.mk linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/ap_makefile.mk +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/ap_makefile.mk 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/ap_makefile.mk 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,188 @@ + +_PHYDM_FILES :=\ @@ -166781,9 +166308,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/ap_makefile.mk linux-5.11.4 + + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halhwimg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halhwimg.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halhwimg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halhwimg.h 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halhwimg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halhwimg.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halhwimg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halhwimg.h 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,96 @@ +/****************************************************************************** + * @@ -166881,9 +166408,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halhwimg.h linux-5.11.4-rtl +#endif + +#endif /* @__INC_HW_IMG_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.c 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.c 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,1359 @@ +/****************************************************************************** + * @@ -168244,9 +167771,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.c linux-5 + odm_iq_calibrate(dm); +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.h 2021-03-07 18:16:17.053956006 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ap.h 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,139 @@ +/****************************************************************************** + * @@ -168387,9 +167914,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ap.h linux-5 +void phydm_rf_watchdog(void *dm_void); + +#endif /*#ifndef __HALPHYRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.c 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.c 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,920 @@ +/****************************************************************************** + * @@ -169311,9 +168838,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.c linux-5 +#endif +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.h 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_ce.h 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,114 @@ +/****************************************************************************** + * @@ -169429,9 +168956,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_ce.h linux-5 +void phydm_rf_watchdog(void *dm_void); + +#endif /*__HALPHYRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.c 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.c 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,528 @@ +/****************************************************************************** + * @@ -169961,9 +169488,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.c linux- + + odm_txpowertracking_check(dm); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.h 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_iot.h 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,124 @@ +/****************************************************************************** + * @@ -170089,9 +169616,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_iot.h linux- +void phydm_rf_watchdog(void *dm_void); + +#endif /*#ifndef __HALPHYRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.c 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.c 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,841 @@ +/****************************************************************************** + * @@ -170934,9 +170461,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.c linux- + odm_iq_calibrate(dm); +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.h 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halphyrf_win.h 2022-01-28 22:59:35.589653080 +0200 @@ -0,0 +1,125 @@ +/****************************************************************************** + * @@ -171063,9 +170590,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halphyrf_win.h linux- +void phydm_rf_watchdog(struct dm_struct *dm); + +#endif /*#ifndef __HALPHYRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf.c 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.c 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,2395 @@ +/****************************************************************************** + * @@ -173462,9 +172989,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.c linux-5.11.4- +#endif +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.c 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.c 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,267 @@ +/****************************************************************************** + * @@ -173733,9 +173260,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.c linux-5 +#endif + 0; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_debug.h 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,123 @@ +/****************************************************************************** + * @@ -173860,9 +173387,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_debug.h linux-5 +void halrf_init_debug_setting(void *dm_void); + +#endif /*__HALRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_dpk.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_dpk.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_dpk.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_dpk.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_dpk.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_dpk.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_dpk.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_dpk.h 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,86 @@ +/****************************************************************************** + * @@ -173950,9 +173477,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_dpk.h linux-5.1 +}; + +#endif /*__HALRF_DPK_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_features.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_features.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_features.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_features.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_features.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_features.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_features.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_features.h 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,43 @@ +/****************************************************************************** + * @@ -173997,9 +173524,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_features.h linu +#endif + +#endif /*#ifndef __HALRF_FEATURES_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf.h 2021-03-07 18:16:17.054956052 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf.h 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,573 @@ +/****************************************************************************** + * @@ -174574,9 +174101,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf.h linux-5.11.4- +u32 halrf_query_tssi_value(void *dm_void); + +#endif /*__HALRF_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_iqk.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_iqk.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_iqk.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_iqk.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_iqk.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_iqk.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_iqk.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_iqk.h 2022-01-28 22:59:35.590653127 +0200 @@ -0,0 +1,103 @@ +/****************************************************************************** + * @@ -174681,9 +174208,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_iqk.h linux-5.1 +}; + +#endif /*__HALRF_IQK_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.c 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,1191 @@ +/****************************************************************************** + * @@ -175876,9 +175403,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.c linux-5 + } + RF_DBG(dm, DBG_RF_MP, "<===[kfree] phy_ConfigKFree()\n"); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_kfree.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,119 @@ +/****************************************************************************** + * @@ -175999,9 +175526,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_kfree.h linux-5 +void phydm_config_kfree(void *dm_void, u8 channel_to_sw); + +#endif /*__HALRF_KFREE_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,1220 @@ +/****************************************************************************** + * @@ -177223,9 +176750,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_a +#endif + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ap.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,398 @@ +/****************************************************************************** + * @@ -177625,9 +177152,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_a + + +#endif /*#ifndef __HALRF_POWER_TRACKING_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.c 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,152 @@ +/****************************************************************************** + * @@ -177781,9 +177308,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.c + } +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,869 @@ +/****************************************************************************** + * @@ -178654,9 +178181,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_c + +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_ce.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,327 @@ +/****************************************************************************** + * @@ -178985,9 +178512,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_c +#endif + +#endif /*__HALRF_POWER_TRACKING_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.h 2021-03-07 18:16:17.055956100 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,41 @@ +/****************************************************************************** + * @@ -179030,9 +178557,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking.h +#endif + +#endif /*#ifndef __HALRF_POWERTRACKING_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,741 @@ +/****************************************************************************** + * @@ -179775,9 +179302,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_i + +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_iot.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,349 @@ +/****************************************************************************** + * @@ -180128,9 +179655,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_i +#endif + +#endif /*#ifndef __HALRF_POWER_TRACKING_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.c 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,861 @@ +/****************************************************************************** + * @@ -180993,9 +180520,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_w +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_powertracking_win.h 2022-01-28 22:59:35.591653174 +0200 @@ -0,0 +1,302 @@ +/****************************************************************************** + * @@ -181299,9 +180826,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_powertracking_w + + +#endif /*#ifndef __HALRF_POWER_TRACKING_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.c 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.c 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,428 @@ +/****************************************************************************** + * @@ -181731,9 +181258,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.c linux-5.1 +} + +#endif /*#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_psd.h 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,52 @@ +/****************************************************************************** + * @@ -181787,9 +181314,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_psd.h linux-5.1 + +#endif /*#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)*/ +#endif /*#__HALRF_PSD_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,300 @@ +/****************************************************************************** + * @@ -182091,9 +181618,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.c linu + odm_tx_gain_gap_calibration_8197f(dm_void); +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,31 @@ +/****************************************************************************** + * @@ -182126,9 +181653,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/halrf_txgapcal.h linu +void odm_tx_gain_gap_calibration(void *dm_void); + +#endif /*__HALRF_TXGAPCAL_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.c 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,2169 @@ +/****************************************************************************** + * @@ -184299,9 +183826,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ + _phy_set_rf_path_switch_8812a(dm, is_main, false); + } +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h 2021-03-07 18:16:17.056956148 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ap.h 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,82 @@ +/****************************************************************************** + * @@ -184385,9 +183912,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ + + +#endif /*#ifndef __HALRF_8812A_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.c 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,1975 @@ +/****************************************************************************** + * @@ -186364,9 +185891,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ + RF_DBG(dm, DBG_RF_IQK, "<=== %s\n", __func__); +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ce.h 2022-01-28 22:59:35.592653222 +0200 @@ -0,0 +1,63 @@ +/****************************************************************************** + * @@ -186431,9 +185958,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ +#endif + boolean is_main); +#endif /*#ifndef __HALRF_8812A_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,2881 @@ +/****************************************************************************** + * @@ -189316,9 +188843,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ +#endif +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_win.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,99 @@ +/****************************************************************************** + * @@ -189419,10 +188946,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8812a/halrf_8812a_ + + +#endif /*#ifndef __HALRF_8812A_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c 2021-03-07 18:16:17.057956195 +0200 -@@ -0,0 +1,1754 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c 2023-05-26 22:35:36.543136899 +0300 +@@ -0,0 +1,1742 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. @@ -190615,11 +190142,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ +#define DP_DPK_VALUE_NUM 2 + + -+ -+ +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +//digital predistortion -+VOID ++VOID + phy_DigitalPredistortion_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter, @@ -190629,36 +190154,26 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + IN BOOLEAN is2T + ) +{ -+#if (RT_PLATFORM == PLATFORM_WINDOWS) -+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -+#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -+ PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -+#endif -+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -+#endif -+#endif + -+ u4Byte tmpReg, tmpReg2, index, i; ++ u4Byte tmpReg, tmpReg2, index, i; + u1Byte path, pathbound = PATH_NUM; + u4Byte AFE_backup[IQK_ADDA_REG_NUM]; -+ u4Byte AFE_REG[IQK_ADDA_REG_NUM] = { -+ rFPGA0_XCD_SwitchControl, rBlue_Tooth, ++ u4Byte AFE_REG[IQK_ADDA_REG_NUM] = { ++ rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, -+ rTx_CCK_BBON, rTx_OFDM_RFON, ++ rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, -+ rTx_To_Tx, rRx_CCK, ++ rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, -+ rRx_TO_Rx, rStandby, ++ rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + -+ u4Byte BB_backup[DP_BB_REG_NUM]; ++ u4Byte BB_backup[DP_BB_REG_NUM]; + u4Byte BB_REG[DP_BB_REG_NUM] = { -+ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, ++ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, -+ rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, -+ rFPGA0_XB_RFInterfaceOE}; ++ rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, ++ rFPGA0_XB_RFInterfaceOE}; + u4Byte BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; @@ -191177,9 +190692,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ +#endif + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,164 @@ +/****************************************************************************** + * @@ -191345,9 +190860,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + +#endif // #ifndef __HAL_PHY_RF_8814A_H__ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,564 @@ +/****************************************************************************** + * @@ -191913,9 +191428,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,112 @@ +/****************************************************************************** + * @@ -192029,9 +191544,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,528 @@ +/****************************************************************************** + * @@ -192561,9 +192076,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + IN BOOLEAN bReCovery + ){} +#endif /* (RTL8814A_SUPPORT == 0)*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,106 @@ +/****************************************************************************** + * @@ -192671,9 +192186,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c 2021-03-07 18:16:17.057956195 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,557 @@ +/****************************************************************************** + * @@ -193232,9 +192747,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_88 + } +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,58 @@ +/****************************************************************************** + * @@ -193294,9 +192809,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_88 + ); + + #endif /* #ifndef __PHYDM_IQK_8814A_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,313 @@ +/****************************************************************************** + * @@ -193611,9 +193126,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ + + phy_lc_calibrate_8812a(dm); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,53 @@ +/****************************************************************************** + * @@ -193668,9 +193183,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ +); + +#endif /* #ifndef __HAL_PHY_RF_8821A_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,1046 @@ +/****************************************************************************** + * @@ -194718,9 +194233,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ + + phy_lc_calibrate_8812a(dm); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h 2022-01-28 22:59:35.593653269 +0200 @@ -0,0 +1,72 @@ +/****************************************************************************** + * @@ -194794,9 +194309,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_8821a_ +); + +#endif /* #ifndef __HAL_PHY_RF_8821A_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,731 @@ +/****************************************************************************** + * @@ -195530,9 +195045,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 + _phy_iq_calibrate_8821a(dm); +} \ Ingen nyrad vid filslut -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,42 @@ +/****************************************************************************** + * @@ -195576,9 +195091,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,773 @@ +/****************************************************************************** + * @@ -196353,9 +195868,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 + _phy_iq_calibrate_8821a(dm); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,41 @@ +/****************************************************************************** + * @@ -196398,9 +195913,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,774 @@ +/****************************************************************************** + * @@ -197176,9 +196691,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 + _phy_iq_calibrate_8821a(dm); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,42 @@ +/****************************************************************************** + * @@ -197222,9 +196737,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_88 +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/mp_precomp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/mp_precomp.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/mp_precomp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/mp_precomp.h 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/mp_precomp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/mp_precomp.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/mp_precomp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/mp_precomp.h 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -197250,9 +196765,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/mp_precomp.h linux-5.11.4-r + * Larry Finger + * + *****************************************************************************/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.c 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.c 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,764 @@ +/****************************************************************************** + * @@ -198018,9 +197533,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.c linux-5. + return; +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.h 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adaptivity.h 2022-01-28 22:59:35.595653364 +0200 @@ -0,0 +1,122 @@ +/****************************************************************************** + * @@ -198144,9 +197659,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adaptivity.h linux-5. +void phydm_adaptivity(void *dm_void); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.c 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.c 2022-01-28 22:59:35.595653364 +0200 @@ -0,0 +1,1291 @@ +/****************************************************************************** + * @@ -199439,9 +198954,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.c linux- +} + +#endif /*@endif PHYDM_LA_MODE_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.h 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_adc_sampling.h 2022-01-28 22:59:35.595653364 +0200 @@ -0,0 +1,151 @@ +/****************************************************************************** + * @@ -199594,9 +199109,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_adc_sampling.h linux- + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdect.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdect.c 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.c 2022-01-28 22:59:35.595653364 +0200 @@ -0,0 +1,891 @@ +/****************************************************************************** + * @@ -200489,9 +200004,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.c linux-5.11. +} +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdect.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdect.h 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdect.h 2022-01-28 22:59:35.595653364 +0200 @@ -0,0 +1,78 @@ +/****************************************************************************** + * @@ -200571,9 +200086,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdect.h linux-5.11. +void odm_sw_ant_detect_init(void *dm_void); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.c 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.c 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,5897 @@ +/****************************************************************************** + * @@ -206472,9 +205987,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.c linux-5.11.4 +} +#endif /*@#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.h 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_antdiv.h 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,519 @@ +/****************************************************************************** + * @@ -206995,9 +206510,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_antdiv.h linux-5.11.4 +void odm_antenna_diversity(void *dm_void); +#endif /*@#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY*/ +#endif /*@#ifndef __ODMANTDIV_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_api.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_api.c 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_api.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_api.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_api.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_api.c 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,2949 @@ +/****************************************************************************** + * @@ -209948,9 +209463,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.c linux-5.11.4-rt +#endif +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_api.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_api.h 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_api.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_api.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_api.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_api.h 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,186 @@ +/****************************************************************************** + * @@ -210138,9 +209653,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_api.h linux-5.11.4-rt +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.c 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.c 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,713 @@ +/****************************************************************************** + * @@ -210855,9 +210370,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.c linux-5.11 + phydm_check_hang_init(dm); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.h 2021-03-07 18:16:17.060956337 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_auto_dbg.h 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,113 @@ +/****************************************************************************** + * @@ -210972,9 +210487,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_auto_dbg.h linux-5.11 +void phydm_auto_dbg_engine_init(void *dm_void); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.c 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.c 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,2050 @@ +/****************************************************************************** + * @@ -213026,9 +212541,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.c linux-5 +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.h 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_beamforming.h 2022-01-28 22:59:35.596653411 +0200 @@ -0,0 +1,363 @@ +/****************************************************************************** + * @@ -213393,9 +212908,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_beamforming.h linux-5 +#endif /*@(DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP))*/ +#endif /*@#ifdef PHYDM_BEAMFORMING_SUPPORT*/ +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.c 2021-03-07 18:16:17.058956242 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.c 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,3265 @@ +/****************************************************************************** + * @@ -216662,9 +216177,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.c linux-5.11.4-rtl881 + } +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.c 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.c 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,1086 @@ +/****************************************************************************** + * @@ -217752,9 +217267,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.c linux-5.11.4 +} +#endif /*#ifdef PHYDM_SUPPORT_CCKPD*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.h 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cck_pd.h 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,155 @@ +/****************************************************************************** + * @@ -217911,9 +217426,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cck_pd.h linux-5.11.4 + +void phydm_cck_pd_init(void *dm_void); +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_ccx.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_ccx.c 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.c 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,1802 @@ +/****************************************************************************** + * @@ -219717,9 +219232,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.c linux-5.11.4-rt + *_out_len = out_len; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_ccx.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_ccx.h 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_ccx.h 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,268 @@ +/****************************************************************************** + * @@ -219989,9 +219504,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_ccx.h linux-5.11.4-rt + char *output, u32 *_out_len); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.c 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.c 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,594 @@ +/****************************************************************************** + * @@ -220587,9 +220102,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.c linux-5 + *_out_len = out_len; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.h 2021-03-07 18:16:17.061956384 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_cfotracking.h 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,73 @@ +/****************************************************************************** + * @@ -220664,9 +220179,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_cfotracking.h linux-5 +void phy_Init_crystal_capacity(void *dm_void, u8 crystal_cap); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_debug.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_debug.c 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_debug.c 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,4728 @@ +/****************************************************************************** + * @@ -225396,9 +224911,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.c linux-5.11.4- +#endif +#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_debug.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_debug.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_debug.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_debug.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_debug.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_debug.h 2022-01-28 22:59:35.597653459 +0200 @@ -0,0 +1,480 @@ +/****************************************************************************** + * @@ -225880,9 +225395,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_debug.h linux-5.11.4- +void phydm_fw_trace_handler_8051(void *dm_void, u8 *cmd_buf, u8 cmd_len); + +#endif /* @__ODM_DBG_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dfs.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dfs.c 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.c 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,2323 @@ +/****************************************************************************** + * @@ -228207,9 +227722,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.c linux-5.11.4-rt +} +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dfs.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dfs.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dfs.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,190 @@ +/****************************************************************************** + * @@ -228401,9 +227916,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dfs.h linux-5.11.4-rt +#endif + +#endif /*@#ifndef __PHYDM_DFS_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dig.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dig.c 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dig.c 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,2858 @@ +/****************************************************************************** + * @@ -231263,9 +230778,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.c linux-5.11.4-rt +} +#endif /*#if (RTL8822B_SUPPORT)*/ +#endif /*#ifdef CONFIG_MCC_DM*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dig.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dig.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dig.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dig.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dig.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dig.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,337 @@ +/****************************************************************************** + * @@ -231604,9 +231119,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dig.h linux-5.11.4-rt + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.c 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.c 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,517 @@ +/****************************************************************************** + * @@ -232125,9 +231640,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.c linu +} +#endif /*@#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/ +#endif /* @#ifdef CONFIG_DYNAMIC_TX_TWR */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_dynamictxpower.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,103 @@ +/****************************************************************************** + * @@ -232232,9 +231747,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_dynamictxpower.h linu + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ap.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ap.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,196 @@ +/****************************************************************************** + * @@ -232432,9 +231947,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ap.h linux-5 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,84 @@ +/****************************************************************************** + * @@ -232520,9 +232035,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce2_kernel.h +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_ce.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_ce.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,214 @@ +/****************************************************************************** + * @@ -232738,9 +232253,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_ce.h linux-5 + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,72 @@ +/****************************************************************************** + * @@ -232814,9 +232329,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features.h linux-5.11 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_iot.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_iot.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_iot.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_iot.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_iot.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_iot.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_iot.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_iot.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,174 @@ +/****************************************************************************** + * @@ -232992,9 +232507,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_iot.h linux- +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_features_win.h 2021-03-07 18:16:17.062956431 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_features_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_features_win.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,185 @@ +/****************************************************************************** + * @@ -233181,9 +232696,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_features_win.h linux- +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.h 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.h 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,1356 @@ +/****************************************************************************** + * @@ -234541,9 +234056,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.h linux-5.11.4-rtl881 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.c 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,1419 @@ +/****************************************************************************** + * @@ -235964,9 +235479,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.c linux-5.11 +#endif + return value32; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_hwconfig.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,79 @@ +/****************************************************************************** + * @@ -236047,9 +235562,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_hwconfig.h linux-5.11 +u32 query_phydm_txbf_capability(struct dm_struct *dm); + +#endif /*@#ifndef __HALHWOUTSRC_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_interface.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_interface.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_interface.c 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,1468 @@ +/****************************************************************************** + * @@ -237519,9 +237034,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.c linux-5.1 + return tx_rate; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_interface.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_interface.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_interface.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_interface.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_interface.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_interface.h 2022-01-28 22:59:35.598653506 +0200 @@ -0,0 +1,343 @@ +/****************************************************************************** + * @@ -237866,9 +237381,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_interface.h linux-5.1 + void *context); +u32 phydm_get_tx_rate(struct dm_struct *dm); +#endif /* @__ODM_INTERFACE_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,1343 @@ +/****************************************************************************** + * @@ -239213,9 +238728,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.c linux-5.11. +} + +#endif /*@#ifdef PHYDM_LNA_SAT_CHK_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_lna_sat.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,173 @@ +/****************************************************************************** + * @@ -239390,9 +238905,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_lna_sat.h linux-5.11. + +#endif /*@#if (PHYDM_LNA_SAT_CHK_SUPPORT == 1)*/ +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,248 @@ +/****************************************************************************** + * @@ -239642,9 +239157,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.c linux-5.11 + return val; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_math_lib.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,114 @@ +/****************************************************************************** + * @@ -239760,9 +239275,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_math_lib.h linux-5.11 + +s32 phydm_cnvrt_2_sign(u32 val, u8 bit_num); +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.mk linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.mk ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.mk 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm.mk 2021-03-07 18:16:17.059956289 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.mk linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.mk +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm.mk 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm.mk 2022-01-28 22:59:35.594653317 +0200 @@ -0,0 +1,226 @@ +EXTRA_CFLAGS += -I$(src)/hal/phydm + @@ -239991,9 +239506,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm.mk linux-5.11.4-rtl88 + hal/phydm/halrf/$(RTL871X)/halrf_rfk_init_8814b.o +endif \ Ingen nyrad vid filslut -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_mp.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_mp.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_mp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_mp.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_mp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_mp.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,348 @@ +/****************************************************************************** + * @@ -240343,9 +239858,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.c linux-5.11.4-rtl + mp->io_value = (u32)mp->rx_phy_ok_cnt; +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_mp.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_mp.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_mp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_mp.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_mp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_mp.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,94 @@ +/****************************************************************************** + * @@ -240441,9 +239956,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_mp.h linux-5.11.4-rtl + +void phydm_mp_get_rx_ok(void *dm_void); +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,457 @@ +/****************************************************************************** + * @@ -240902,9 +240417,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.c linux- + total_cca_cnt, total_fa_cnt, dm->noisy_decision_smooth, score, + score_smooth, dm->noisy_decision); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_noisemonitor.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,48 @@ +/****************************************************************************** + * @@ -240954,9 +240469,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_noisemonitor.h linux- +void phydm_noisy_detection(void *dm_void); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.c 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,928 @@ +/****************************************************************************** + * @@ -241886,9 +241401,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.c linux-5.11. +} + +#endif /* @#ifdef CONFIG_PATH_DIVERSITY */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.h 2021-03-07 18:16:17.063956478 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pathdiv.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,123 @@ +/****************************************************************************** + * @@ -242013,9 +241528,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pathdiv.h linux-5.11. +#endif /* @#ifdef CONFIG_PATH_DIVERSITY */ +#endif /* @#ifndef __PHYDMPATHDIV_H__ */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,3192 @@ +/****************************************************************************** + * @@ -245209,9 +244724,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.c linux-5.1 + + phydm_avg_phystatus_init(dm); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_phystatus.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,1137 @@ +/****************************************************************************** + * @@ -246350,9 +245865,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_phystatus.h linux-5.1 +void phydm_rx_phy_status_init(void *dm_void); + +#endif /*@#ifndef __HALHWOUTSRC_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,543 @@ +/****************************************************************************** + * @@ -246897,9 +246412,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c lin +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h 2022-01-28 22:59:35.599653554 +0200 @@ -0,0 +1,152 @@ +/****************************************************************************** + * @@ -247053,9 +246568,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pmac_tx_setting.h lin +void phydm_set_tmac_tx(void *dm_void); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.c 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,171 @@ +/****************************************************************************** + * @@ -247228,9 +246743,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.c linux-5.1 +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pow_train.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,84 @@ +/****************************************************************************** + * @@ -247316,9 +246831,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pow_train.h linux-5.1 + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_precomp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_precomp.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_precomp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_precomp.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_precomp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_precomp.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_precomp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_precomp.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,514 @@ +/****************************************************************************** + * @@ -247834,9 +247349,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_precomp.h linux-5.11. + #include "rtl8197g/version_rtl8197g.h" +#endif +#endif /* @__ODM_PRECOMP_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pre_define.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pre_define.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pre_define.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_pre_define.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pre_define.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pre_define.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_pre_define.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_pre_define.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,849 @@ +/****************************************************************************** + * @@ -248687,9 +248202,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_pre_define.h linux-5. +}; + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.c 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,173 @@ +/****************************************************************************** + * @@ -248864,9 +248379,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.c linux-5 +#endif +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_primary_cca.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,87 @@ +/****************************************************************************** + * @@ -248955,9 +248470,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_primary_cca.h linux-5 +#endif /*@#ifdef PHYDM_PRIMARY_CCA*/ +#endif /*@#ifndef __PHYDM_PRIMARYCCA_H__*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_psd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_psd.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_psd.c 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,459 @@ +/****************************************************************************** + * @@ -249418,9 +248933,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.c linux-5.11.4-rt +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_psd.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_psd.h 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_psd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_psd.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_psd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_psd.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,66 @@ +/****************************************************************************** + * @@ -249488,9 +249003,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_psd.h linux-5.11.4-rt + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.c 2021-03-07 18:16:17.064956526 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.c 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,2085 @@ +/****************************************************************************** + * @@ -251577,9 +251092,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.c linux-5.11.4 +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rainfo.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,276 @@ +/****************************************************************************** + * @@ -251857,9 +251372,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rainfo.h linux-5.11.4 + void *dm_void); +#endif +#endif /*@#ifndef __PHYDMRAINFO_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11ac.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11ac.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11ac.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11ac.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11ac.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11ac.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11ac.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11ac.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,109 @@ +/****************************************************************************** + * @@ -251970,9 +251485,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11ac.h linux +#define ODM_BIT_BB_ATC_11AC BIT(14) + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11n.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11n.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11n.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11n.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11n.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11n.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11n.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regdefine11n.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,219 @@ +/****************************************************************************** + * @@ -252193,9 +251708,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regdefine11n.h linux- +#define ODM_BIT_BB_ATC_11N BIT(11) +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_reg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_reg.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_reg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_reg.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_reg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_reg.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_reg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_reg.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,241 @@ +/****************************************************************************** + * @@ -252438,9 +251953,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_reg.h linux-5.11.4-rt +#define BIT_FA_RESET BIT(0) + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regtable.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regtable.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regtable.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_regtable.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regtable.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regtable.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_regtable.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_regtable.h 2022-01-28 22:59:35.600653601 +0200 @@ -0,0 +1,849 @@ +#define R_0x0 0x0 +#define R_0x00 0x00 @@ -253291,9 +252806,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_regtable.h linux-5.11 +#define RF_0xee 0xee +#define RF_0xef 0xef +#define RF_0xf5 0xf5 -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.c 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.c 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,170 @@ +/****************************************************************************** + * @@ -253465,9 +252980,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.c linux- +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_rssi_monitor.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,55 @@ +/****************************************************************************** + * @@ -253524,9 +253039,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_rssi_monitor.h linux- +void phydm_rssi_monitor_init(void *dm_void); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.c 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.c 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,2277 @@ +/****************************************************************************** + * @@ -255805,9 +255320,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.c linux-5.11. + } +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_smt_ant.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,210 @@ +/****************************************************************************** + * @@ -256020,9 +255535,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_smt_ant.h linux-5.11. +#endif /*@#if (defined(CONFIG_SMART_ANTENNA))*/ +#endif \ Ingen nyrad vid filslut -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_soml.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_soml.c 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_soml.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_soml.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_soml.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_soml.c 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,1111 @@ +/****************************************************************************** + * @@ -257135,9 +256650,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.c linux-5.11.4-r + } +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_soml.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_soml.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_soml.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_soml.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_soml.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_soml.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,185 @@ +/****************************************************************************** + * @@ -257324,9 +256839,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_soml.h linux-5.11.4-r +#endif +void phydm_init_soft_ml_setting(void *dm_void); +#endif /*@#ifndef __PHYDMSOML_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_types.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_types.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_types.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/phydm_types.h 2021-03-07 18:16:17.065956573 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_types.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_types.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/phydm_types.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/phydm_types.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,330 @@ +/****************************************************************************** + * @@ -257658,9 +257173,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/phydm_types.h linux-5.11.4- +#define MASKL3BYTES 0x00ffffff + +#endif /* __ODM_TYPES_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,1469 @@ +/****************************************************************************** + * @@ -259131,9 +258646,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.c + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,107 @@ +/****************************************************************************** + * @@ -259242,9 +258757,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_bb.h +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.c 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,301 @@ +/****************************************************************************** + * @@ -259547,9 +259062,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac. + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac.h 2022-01-28 22:59:35.601653648 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** + * @@ -259584,9 +259099,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_mac. +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,3848 @@ +/****************************************************************************** + * @@ -263436,9 +262951,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.c + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,124 @@ +/****************************************************************************** + * @@ -263564,9 +263079,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/halhwimg8812a_rf.h +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.c 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,149 @@ +/****************************************************************************** + * @@ -263717,9 +263232,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig881 + enum rf_path RF_PATH, u32 reg_addr) {} + +#endif /* #if (RTL8812A_SUPPORT == 1) */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig8812a.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,44 @@ +/****************************************************************************** + * @@ -263765,9 +263280,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_regconfig881 + +#endif +#endif /* end of SUPPORT */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,113 @@ +/****************************************************************************** + * @@ -263882,9 +263397,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.c l +} + +#endif /* #if (RTL8812A_SUPPORT == 1) */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,27 @@ +/****************************************************************************** + * @@ -263913,9 +263428,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/phydm_rtl8812a.h l +void phydm_hwsetting_8812a(struct dm_struct *dm); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -263941,9 +263456,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8812a/version_rtl8812a.h +#define RELEASE_DATE_8812A 20150920 +#define COMMIT_BY_8812A "BB_LUKE" +#define RELEASE_VERSION_8812A 57 -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h 2021-03-07 18:16:17.066956620 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,47 @@ +/****************************************************************************** + * @@ -263992,9 +263507,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,4308 @@ +/****************************************************************************** + * @@ -268304,9 +267819,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,99 @@ +/****************************************************************************** +* @@ -268407,9 +267922,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,56 @@ +/****************************************************************************** +* @@ -268467,9 +267982,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h +#endif +#endif // end of HWIMG_SUPPORT + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,325 @@ +/****************************************************************************** + * @@ -268796,9 +268311,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac. + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h 2022-01-28 22:59:35.602653696 +0200 @@ -0,0 +1,39 @@ +/****************************************************************************** +* @@ -268839,9 +268354,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac. +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,8838 @@ +/****************************************************************************** + * @@ -277681,9 +277196,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c + +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h 2021-03-07 18:16:17.067956667 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,149 @@ +/****************************************************************************** +* @@ -277834,10 +277349,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h +#endif +#endif /* end of HWIMG_SUPPORT*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c 2021-03-07 18:16:17.068956715 +0200 -@@ -0,0 +1,1754 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,1741 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. @@ -279029,12 +278544,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap. +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + -+ -+ -+ +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +//digital predistortion -+VOID ++VOID + phy_DigitalPredistortion_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter, @@ -279044,39 +278556,29 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap. + IN BOOLEAN is2T + ) +{ -+#if (RT_PLATFORM == PLATFORM_WINDOWS) -+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -+#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -+ PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -+#endif -+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -+#endif -+#endif + -+ u32 tmpReg, tmpReg2, index, i; ++ u32 tmpReg, tmpReg2, index, i; + u8 path, pathbound = PATH_NUM; + u32 AFE_backup[IQK_ADDA_REG_NUM]; -+ u32 AFE_REG[IQK_ADDA_REG_NUM] = { -+ rFPGA0_XCD_SwitchControl, rBlue_Tooth, ++ u32 AFE_REG[IQK_ADDA_REG_NUM] = { ++ rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, -+ rTx_CCK_BBON, rTx_OFDM_RFON, ++ rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, -+ rTx_To_Tx, rRx_CCK, ++ rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, -+ rRx_TO_Rx, rStandby, ++ rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + -+ u32 BB_backup[DP_BB_REG_NUM]; ++ u32 BB_backup[DP_BB_REG_NUM]; + u32 BB_REG[DP_BB_REG_NUM] = { -+ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, ++ rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, + rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, -+ rFPGA0_XB_RFInterfaceOE}; ++ rFPGA0_XB_RFInterfaceOE}; + u32 BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, -+ 0x0, 0x0, 0x0}; ++ 0x0, 0x0, 0x0}; + + u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u32 RF_REG[DP_RF_REG_NUM] = { @@ -279592,9 +279094,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap. +#endif + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,164 @@ +/****************************************************************************** + * @@ -279760,9 +279262,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap. + +#endif // #ifndef __HAL_PHY_RF_8814A_H__ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,528 @@ +/****************************************************************************** + * @@ -280292,9 +279794,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win + IN BOOLEAN bReCovery + ){} +#endif /* (RTL8814A_SUPPORT == 0)*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,106 @@ +/****************************************************************************** + * @@ -280402,9 +279904,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,219 @@ +/****************************************************************************** + * @@ -280625,9 +280127,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig881 +} +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,109 @@ +/****************************************************************************** + * @@ -280738,9 +280240,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig881 +#endif +#endif // end of SUPPORT + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,503 @@ +/****************************************************************************** + * @@ -281245,9 +280747,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c l + + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,78 @@ +/****************************************************************************** + * @@ -281327,9 +280829,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h l + ); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h 2022-01-28 22:59:35.603653744 +0200 @@ -0,0 +1,10 @@ +/*RTL8814A PHY Parameters*/ +/* @@ -281341,9 +280843,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h +#define RELEASE_DATE_8814A 20150908 +#define COMMIT_BY_8814A "BB_LUKE" +#define RELEASE_VERSION_8814A 81 -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,923 @@ +/****************************************************************************** + * @@ -282268,9 +281770,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.c + + +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,83 @@ +/****************************************************************************** + * @@ -282355,9 +281857,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_bb.h + +#endif +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,279 @@ +/****************************************************************************** + * @@ -282638,9 +282140,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac. +} + +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h 2021-03-07 18:16:17.068956715 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,33 @@ +/****************************************************************************** + * @@ -282675,9 +282177,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_mac. + +#endif +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,5457 @@ +/****************************************************************************** + * @@ -288136,9 +287638,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.c +} + +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,143 @@ +/****************************************************************************** + * @@ -288283,9 +287785,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/halhwimg8821a_rf.h + +#endif +#endif /* end of HWIMG_SUPPORT*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,206 @@ +/****************************************************************************** + * @@ -288493,9 +287995,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig882 +} + +#endif /* #if (RTL8821A_SUPPORT == 1)*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,90 @@ +/****************************************************************************** + * @@ -288587,9 +288089,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig882 + +#endif +#endif /* end of SUPPORT */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,129 @@ +/****************************************************************************** + * @@ -288720,9 +288222,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c l +} + +#endif /* #if (RTL8821A_SUPPORT == 1) */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,31 @@ +/****************************************************************************** + * @@ -288755,9 +288257,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.h l +); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -288783,9 +288285,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/rtl8821a/version_rtl8821a.h +#define RELEASE_DATE_8821A 20150920 +#define COMMIT_BY_8821A "BB_LUKE" +#define RELEASE_VERSION_8821A 59 -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,188 @@ +EXTRA_CFLAGS += -I$(src)/hal/phydm + @@ -288975,9 +288477,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/sd4_phydm_2_kernel.mk linux + hal/phydm/$(RTL871X)/phydm_hal_api8198f.o\ + hal/phydm/$(RTL871X)/phydm_regconfig8198f.o +endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.c 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,520 @@ +/****************************************************************************** + * @@ -289499,9 +289001,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.c linux-5.1 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/halcomtxbf.h 2022-01-28 22:59:35.604653791 +0200 @@ -0,0 +1,183 @@ +/****************************************************************************** + * @@ -289686,9 +289188,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/halcomtxbf.h linux-5.1 +#endif + +#endif /* @#ifndef __HAL_COM_TXBF_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,384 @@ +/****************************************************************************** + * @@ -290074,9 +289576,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.c linux-5 +#endif /* @#if (RTL8192E_SUPPORT == 1)*/ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8192e.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,71 @@ +/****************************************************************************** + * @@ -290149,9 +289651,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8192e.h linux-5 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,675 @@ +/****************************************************************************** + * @@ -290828,9 +290330,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.c linux-5 +#endif /* @(RTL8814A_SUPPORT == 1)*/ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8814a.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,77 @@ +/****************************************************************************** + * @@ -290909,9 +290411,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8814a.h linux-5 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,1087 @@ +/****************************************************************************** + * @@ -292000,9 +291502,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.c linux-5 +} +#endif +#endif /* @(RTL8822B_SUPPORT == 1)*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbf8822b.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,78 @@ +/****************************************************************************** + * @@ -292082,9 +291584,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbf8822b.h linux-5 + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.c 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,1484 @@ +/****************************************************************************** + * @@ -293570,9 +293072,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.c lin +} + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.h 2021-03-07 18:16:17.069956761 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfinterface.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,167 @@ +/****************************************************************************** + * @@ -293741,9 +293243,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfinterface.h lin +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,510 @@ +/****************************************************************************** + * @@ -294255,9 +293757,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.c linux- +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,78 @@ +/****************************************************************************** + * @@ -294337,9 +293839,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/haltxbfjaguar.h linux- +#endif + +#endif /* @#ifndef __HAL_TXBF_JAGUAR_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,425 @@ +/****************************************************************************** + * @@ -294766,9 +294268,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c l +#endif +#endif /*PHYSTS_3RD_TYPE_IC*/ +#endif /*CONFIG_BB_TXBF_API*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,74 @@ +/****************************************************************************** + * @@ -294844,9 +294346,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.h l + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.c 2021-03-07 18:16:17.074956998 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.c 2022-01-28 22:59:35.610654075 +0200 @@ -0,0 +1,17941 @@ +/****************************************************************************** +* @@ -312789,9 +312291,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.c linux-5.11 +#endif /* end of LOAD_FW_HEADER_FROM_DRIVER */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.h 2021-03-07 18:16:17.074956998 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8812a_fw.h 2022-01-28 22:59:35.610654075 +0200 @@ -0,0 +1,47 @@ +/****************************************************************************** +* @@ -312840,9 +312342,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8812a_fw.h linux-5.11 + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,83 @@ +/****************************************************************************** + * @@ -312927,9 +312429,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.c linux-5. + RTL8812_TRANS_LPS_TO_ACT + RTL8812_TRANS_END +}; -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.c 2021-03-07 18:16:17.078957187 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.c 2022-01-28 22:59:35.614654265 +0200 @@ -0,0 +1,14005 @@ +/****************************************************************************** +* @@ -326936,9 +326438,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.c linux-5.11 +#endif /* end of LOAD_FW_HEADER_FROM_DRIVER */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.h ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.h 2021-03-07 18:16:17.078957187 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.h +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/hal8821a_fw.h 2022-01-28 22:59:35.614654265 +0200 @@ -0,0 +1,47 @@ +/****************************************************************************** +* @@ -326987,9 +326489,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/hal8821a_fw.h linux-5.11 + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c 2021-03-07 18:16:17.070956809 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c 2022-01-28 22:59:35.605653838 +0200 @@ -0,0 +1,86 @@ +/****************************************************************************** + * @@ -327077,9 +326579,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.c linux-5 + RTL8821A_TRANS_LPS_TO_ACT + RTL8821A_TRANS_END +}; -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c 2021-03-07 18:16:17.079957235 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c 2022-01-28 22:59:35.614654265 +0200 @@ -0,0 +1,860 @@ +/****************************************************************************** + * @@ -327941,9 +327443,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_cmd.c linux-5.1 +} + +#endif /* CONFIG_BT_COEXIST */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_dm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_dm.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_dm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_dm.c 2021-03-07 18:16:17.079957235 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_dm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_dm.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_dm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_dm.c 2022-01-28 22:59:35.614654265 +0200 @@ -0,0 +1,360 @@ +/****************************************************************************** + * @@ -328305,9 +327807,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_dm.c linux-5.11 + /* _rtw_spinlock_free(&pHalData->odm_stainfo_lock); */ + odm_cancel_all_timers(podmpriv); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c 2021-03-07 18:16:17.079957235 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,5777 @@ +/****************************************************************************** + * @@ -334086,9 +333588,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.c linu + pHalFunc->fw_dl = &FirmwareDownload8812; + pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8812; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,2045 @@ +/****************************************************************************** + * @@ -336135,9 +335637,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.c linux- + + /* RTW_INFO("<==%s()\n",__FUNCTION__); */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,158 @@ +/****************************************************************************** + * @@ -336297,9 +335799,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.c linux- + + +/* End of HalRf6052.c */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,62 @@ +/****************************************************************************** + * @@ -336363,9 +335865,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.c linux- + /* Offset 20 */ + /* pattrib->tsfl=(u8)GET_RX_STATUS_DESC_TSFL_8812(pdesc); */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,106 @@ +/****************************************************************************** + * @@ -336473,9 +335975,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_sreset.c linux- + } +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,515 @@ +/****************************************************************************** + * @@ -336992,9 +336494,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/rtl8812a_xmit.c linux-5. + + return SCSettingOfDesc; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,389 @@ +/****************************************************************************** + * @@ -337385,9 +336887,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.c linu + DeInitLed(&(ledpriv->SwLed2)); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c 2022-01-28 22:59:35.615654312 +0200 @@ -0,0 +1,28 @@ +/****************************************************************************** + * @@ -337417,9 +336919,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.c lin +{ + usb_free_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c 2022-01-28 22:59:35.616654360 +0200 @@ -0,0 +1,1169 @@ +/****************************************************************************** + * @@ -338590,9 +338092,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.c lin + +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_halinit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_halinit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_halinit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_halinit.c 2021-03-07 18:16:17.080957282 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_halinit.c 2022-01-28 22:59:35.616654360 +0200 @@ -0,0 +1,2716 @@ +/****************************************************************************** + * @@ -341310,9 +340812,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_halinit.c linux- + rtl8812_set_hal_ops(pHalFunc); + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c 2021-03-07 18:16:17.081957329 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c 2022-01-28 22:59:35.616654360 +0200 @@ -0,0 +1,244 @@ +/****************************************************************************** + * @@ -341558,9 +341060,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.c linu + RTW_INFO("CHIP TYPE: RTL8811AU or RTL8821U\n"); + } +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/hal8814a_fw.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/hal8814a_fw.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/hal8814a_fw.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/hal8814a_fw.c 2021-03-07 18:16:17.082957376 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/hal8814a_fw.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/hal8814a_fw.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/hal8814a_fw.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/hal8814a_fw.c 2022-01-28 22:59:35.617654407 +0200 @@ -0,0 +1,7741 @@ +/****************************************************************************** +* @@ -349303,9 +348805,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/hal8814a_fw.c linux-5.11 + +#endif // end of HWIMG_SUPPORT + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c 2021-03-07 18:16:17.081957329 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c 2022-01-28 22:59:35.616654360 +0200 @@ -0,0 +1,98 @@ +/****************************************************************************** + * @@ -349405,9 +348907,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c linux-5. + RTL8814A_TRANS_END +}; + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c 2021-03-07 18:16:17.082957376 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c 2022-01-28 22:59:35.617654407 +0200 @@ -0,0 +1,1515 @@ +/****************************************************************************** + * @@ -350924,9 +350426,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c linux-5.1 + +#endif // CONFIG_BT_COEXIST + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_dm.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_dm.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_dm.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_dm.c 2021-03-07 18:16:17.082957376 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_dm.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_dm.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_dm.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_dm.c 2022-01-28 22:59:35.617654407 +0200 @@ -0,0 +1,407 @@ +/****************************************************************************** + * @@ -351335,9 +350837,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_dm.c linux-5.11 +} +#endif //CONFIG_ANTENNA_DIVERSITY + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c 2022-12-18 17:40:24.574937030 +0200 @@ -0,0 +1,6769 @@ +/****************************************************************************** + * @@ -351389,7 +350891,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linu + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); + pu2Byte ptr; -+ ++ + #define INIT_EFUSE(var,value) ptr = (pu2Byte)&var; *ptr = value + + RTW_INFO("====> %s \n", __func__); @@ -356174,7 +355676,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linu + rtw_write8(Adapter,REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function + //rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18); + } -+ else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) ++ else if (mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/ + { +#ifdef RTL8814AE_SW_BCN + /*Beacon is polled to TXBUF*/ @@ -356298,7 +355800,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linu + rtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd + //rtw_write8(Adapter,REG_BCN_CTRL, 0x18); + } -+ else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) ++ else if (mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/ + { +#ifdef RTL8814AE_SW_BCN + rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); @@ -358108,9 +357610,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c linu +} + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,3027 @@ +/****************************************************************************** + * @@ -361139,9 +360641,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c linux- + //RTW_INFO("<==%s()\n",__FUNCTION__); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,210 @@ +/****************************************************************************** + * @@ -361353,9 +360855,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c linux- + +/* End of HalRf6052.c */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,68 @@ +/****************************************************************************** + * @@ -361425,9 +360927,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c linux- + +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,114 @@ +/****************************************************************************** + * @@ -361543,9 +361045,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c linux- +} +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,515 @@ +/****************************************************************************** + * @@ -362062,9 +361564,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c linux-5. +} + + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,147 @@ +/****************************************************************************** + * @@ -362213,9 +361715,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c linu + DeInitLed( &(ledpriv->SwLed2) ); +} +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c 2022-01-28 22:59:35.618654454 +0200 @@ -0,0 +1,34 @@ +/****************************************************************************** + * @@ -362251,9 +361753,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_recv.c lin + usb_free_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,1129 @@ +/****************************************************************************** + * @@ -363384,9 +362886,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c lin +} +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_halinit.c 2023-05-26 22:35:36.544136899 +0300 @@ -0,0 +1,2416 @@ +/****************************************************************************** + * @@ -364975,9 +364477,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + // Reset USB mode switch setting + rtw_write8(Adapter, REG_SDIO_CTRL_8814A, 0x0); + rtw_write8(Adapter, REG_ACLK_MON, 0x0); -+ ++ + //RT_TRACE(COMP_INIT, DBG_TRACE, ("InitializeAdapter8188EUsb() <====\n")); -+ ++ +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK); + // 2010/08/26 MH Merge from 8192CE. + if(pwrctrlpriv->rf_pwrstate == rf_on) @@ -365438,19 +364940,19 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + hal_ReadTxPowerInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadBoardType8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_Read_TRX_antenna_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); -+ ++ + // + // Read Bluetooth co-exist and initialize + // + hal_EfuseParseBTCoexistInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); -+ ++ + hal_ReadChannelPlan8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_EfuseParseXtal_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadThermalMeter_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRemoteWakeup_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadAntennaDiversity8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRFEType_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); -+ ++ + ReadLEDSetting_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + hal_ReadUsbModeSwitch_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); @@ -365464,7 +364966,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- +static void hal_ReadPROMContent_8814A( + IN PADAPTER Adapter + ) -+{ ++{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 eeValue; + @@ -365487,7 +364989,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + ) +{ + Hal_InitEfuseVars_8814A(Adapter); -+ ++ + /* Read all content in Efuse/EEPROM. */ + hal_ReadPROMContent_8814A(Adapter); + @@ -365508,17 +365010,17 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + himr = &(pHalData->IntrMask[0]); + else + himr = &(pHalData->IntrMask[1]); -+ ++ + if (AddMSR) + *himr |= AddMSR; + + if (RemoveMSR) + *himr &= (~RemoveMSR); + -+ if(bHIMR0) ++ if(bHIMR0) + rtw_write32(padapter, REG_HIMR0_8814A, *himr); + else -+ rtw_write32(padapter, REG_HIMR1_8814A, *himr); ++ rtw_write32(padapter, REG_HIMR1_8814A, *himr); + +} + @@ -365613,7 +365115,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + +void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) +{ -+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); ++ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(variable) + { @@ -365730,7 +365232,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- +} + +static u8 rtl8814au_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) -+{ ++{ + u8 bResult = _TRUE; + switch(efunc_id){ + @@ -365755,7 +365257,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + + pHalFunc->hal_power_on = _InitPowerOn_8814AU; + pHalFunc->hal_power_off = hal_carddisable_8814; -+ ++ + pHalFunc->hal_init = &rtl8814au_hal_init; + pHalFunc->hal_deinit = &rtl8814au_hal_deinit; + @@ -365774,11 +365276,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- +// pHalFunc->InitSwLeds = NULL; +// pHalFunc->DeInitSwLeds = NULL; +#endif//CONFIG_RTW_LED -+ ++ + pHalFunc->init_default_value = &rtl8814au_init_default_value; + pHalFunc->intf_chip_configure = &rtl8814au_interface_configure; + pHalFunc->read_adapter_info = &ReadAdapterInfo8814AU; -+ ++ + pHalFunc->set_hw_reg_handler = &SetHwReg8814AU; + pHalFunc->GetHwRegHandler = &GetHwReg8814AU; + pHalFunc->get_hal_def_var_handler = &GetHalDefVar8814AUsb; @@ -365804,9 +365306,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_halinit.c linux- + +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,312 @@ +/****************************************************************************** + * @@ -366120,9 +365622,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c linu + pdvobj->HardwareType = HARDWARE_TYPE_RTL8814AU; + RTW_INFO("CHIP TYPE: RTL8814\n"); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/basic_types.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/basic_types.h ---- linux-5.11.4/3rdparty/rtl8812au/include/basic_types.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/basic_types.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/basic_types.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/basic_types.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/basic_types.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/basic_types.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,379 @@ +/****************************************************************************** + * @@ -366503,9 +366005,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/basic_types.h linux-5.11.4-rt +#define TEST_FLAGS(__Flag, __testFlags) (((__Flag) & (__testFlags)) == (__testFlags)) + +#endif /* __BASIC_TYPES_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/big_endian.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/big_endian.h ---- linux-5.11.4/3rdparty/rtl8812au/include/byteorder/big_endian.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/big_endian.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/big_endian.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/big_endian.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/big_endian.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/big_endian.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,82 @@ +/****************************************************************************** + * @@ -366589,10 +366091,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/big_endian.h linux- +#include + +#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/generic.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/generic.h ---- linux-5.11.4/3rdparty/rtl8812au/include/byteorder/generic.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/generic.h 2021-03-07 18:16:17.084957471 +0200 -@@ -0,0 +1,207 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/generic.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/generic.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/generic.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/generic.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,195 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -366688,7 +366190,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/generic.h linux-5.1 + */ + + -+#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) || defined(PLATFORM_FREEBSD) ++#if defined(PLATFORM_LINUX) || defined(PLATFORM_MPIXEL) || defined(PLATFORM_FREEBSD) + /* + * inside the kernel, we can use nicknames; + * outside of it, we must avoid POSIX namespace pollution... @@ -366787,22 +366289,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/generic.h linux-5.1 + #define ntohs(x) ___ntohs(x) + +#endif /* OPTIMIZE */ -+ -+ -+#if defined(PLATFORM_WINDOWS) -+ -+ #define htonl(x) __cpu_to_be32(x) -+ #define ntohl(x) __be32_to_cpu(x) -+ #define htons(x) __cpu_to_be16(x) -+ #define ntohs(x) __be16_to_cpu(x) -+ -+ -+#endif -+ +#endif /* _LINUX_BYTEORDER_GENERIC_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/little_endian.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/little_endian.h ---- linux-5.11.4/3rdparty/rtl8812au/include/byteorder/little_endian.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/little_endian.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/little_endian.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/little_endian.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/little_endian.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/little_endian.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,84 @@ +/****************************************************************************** + * @@ -366888,9 +366378,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/little_endian.h lin +#include + +#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swabb.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/swabb.h ---- linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swabb.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/swabb.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/swabb.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/swabb.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/swabb.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/swabb.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,151 @@ +/****************************************************************************** + * @@ -367043,9 +366533,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swabb.h linux-5.11. +#endif + +#endif /* _LINUX_BYTEORDER_SWABB_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swab.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/swab.h ---- linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swab.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/byteorder/swab.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/swab.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/swab.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/byteorder/swab.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/byteorder/swab.h 2023-05-26 22:35:36.544136899 +0300 @@ -0,0 +1,136 @@ +/****************************************************************************** + * @@ -367170,7 +366660,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swab.h linux-5.11.4 + return __arch__swab32(x); +} + -+#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) ++#if defined(PLATFORM_LINUX) + #define swab16 __swab16 + #define swab32 __swab32 + #define swab64 __swab64 @@ -367183,9 +366673,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/byteorder/swab.h linux-5.11.4 +#endif + +#endif /* _LINUX_BYTEORDER_SWAB_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/circ_buf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/circ_buf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/circ_buf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/circ_buf.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/circ_buf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/circ_buf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/circ_buf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/circ_buf.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,23 @@ +/****************************************************************************** + * @@ -367210,9 +366700,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/circ_buf.h linux-5.11.4-rtl88 + +#endif //_CIRC_BUF_H_ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/cmd_osdep.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/cmd_osdep.h ---- linux-5.11.4/3rdparty/rtl8812au/include/cmd_osdep.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/cmd_osdep.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/cmd_osdep.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/cmd_osdep.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/cmd_osdep.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/cmd_osdep.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -367240,9 +366730,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/cmd_osdep.h linux-5.11.4-rtl8 +extern struct cmd_obj *_rtw_dequeue_cmd(_queue *queue); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/cmn_info/rtw_sta_info.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/cmn_info/rtw_sta_info.h ---- linux-5.11.4/3rdparty/rtl8812au/include/cmn_info/rtw_sta_info.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/cmn_info/rtw_sta_info.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/cmn_info/rtw_sta_info.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/cmn_info/rtw_sta_info.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/cmn_info/rtw_sta_info.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/cmn_info/rtw_sta_info.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,257 @@ +/****************************************************************************** + * @@ -367501,10 +366991,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/cmn_info/rtw_sta_info.h linux +/*--------------------Function declaration-----------------------------*/ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/custom_gpio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/custom_gpio.h ---- linux-5.11.4/3rdparty/rtl8812au/include/custom_gpio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/custom_gpio.h 2021-03-07 18:16:17.084957471 +0200 -@@ -0,0 +1,46 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/custom_gpio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/custom_gpio.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/custom_gpio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/custom_gpio.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,39 @@ +/****************************************************************************** + * + * Copyright(c) 2016 - 2017 Realtek Corporation. @@ -367525,13 +367015,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/custom_gpio.h linux-5.11.4-rt +#include +#include + -+#ifdef PLATFORM_OS_XP -+ #include -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ #include -+#endif + +#ifdef PLATFORM_LINUX + #include @@ -367551,9 +367034,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/custom_gpio.h linux-5.11.4-rt +extern void rtw_wifi_gpio_wlan_ctrl(int onoff); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_conf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_conf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_conf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_conf.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_conf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_conf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_conf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_conf.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,510 @@ +/****************************************************************************** + * @@ -368065,9 +367548,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_conf.h linux-5.11.4-rtl88 +#endif + +#endif /* __DRV_CONF_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_ce.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_ce.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,86 @@ +/****************************************************************************** + * @@ -368155,9 +367638,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_ce.h linux-5.11.4-r + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_gspi.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_gspi.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_gspi.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_gspi.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_gspi.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_gspi.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_gspi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_gspi.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,49 @@ +/****************************************************************************** + * @@ -368208,10 +367691,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_gspi.h linux-5.11.4 +} GSPI_DATA, *PGSPI_DATA; + +#endif /* #ifndef __DRV_TYPES_GSPI_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types.h 2021-03-07 18:16:17.085957519 +0200 -@@ -0,0 +1,1834 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,1797 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -368306,7 +367789,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h linux-5.11.4-rtl8 +#include +#include +#include -+#include +#include +#include +#include @@ -369380,31 +368862,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h linux-5.11.4-rtl8 + u8 *usb_vendor_req_buf; +#endif + -+#ifdef PLATFORM_WINDOWS -+ /* related device objects */ -+ PDEVICE_OBJECT pphysdevobj;/* pPhysDevObj; */ -+ PDEVICE_OBJECT pfuncdevobj;/* pFuncDevObj; */ -+ PDEVICE_OBJECT pnextdevobj;/* pNextDevObj; */ -+ -+ u8 nextdevstacksz;/* unsigned char NextDeviceStackSize; */ /* = (CHAR)CEdevice->pUsbDevObj->StackSize + 1; */ -+ -+ /* urb for control diescriptor request */ -+ -+#ifdef PLATFORM_OS_XP -+ struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb; -+ PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;/* UsbConfigurationDescriptor; */ -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ WCHAR active_path[MAX_ACTIVE_REG_PATH]; /* adapter regpath */ -+ USB_EXTENSION usb_extension; -+ -+ _nic_hdl pipehdls_r8192c[0x10]; -+#endif -+ -+ u32 config_descriptor_len;/* ULONG UsbConfigurationDescriptorLength; */ -+#endif/* PLATFORM_WINDOWS */ -+ +#ifdef PLATFORM_LINUX + struct usb_interface *pusbintf; + struct usb_device *pusbdev; @@ -369745,17 +369202,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h linux-5.11.4-rtl8 + void (*intf_start)(_adapter *adapter); + void (*intf_stop)(_adapter *adapter); + -+#ifdef PLATFORM_WINDOWS -+ _nic_hdl hndis_adapter;/* hNdisAdapter(NDISMiniportAdapterHandle); */ -+ _nic_hdl hndis_config;/* hNdisConfiguration; */ -+ NDIS_STRING fw_img; -+ -+ u32 NdisPacketFilter; -+ u8 MCList[MAX_MCAST_LIST_NUM][6]; -+ u32 MCAddrCount; -+#endif /* end of PLATFORM_WINDOWS */ -+ -+ +#ifdef PLATFORM_LINUX + _nic_hdl pnetdev; + char old_ifname[IFNAMSIZ]; @@ -370046,10 +369492,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types.h linux-5.11.4-rtl8 +#endif + +#endif /* __DRV_TYPES_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_linux.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_linux.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_linux.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_linux.h 2021-03-07 18:16:17.085957519 +0200 -@@ -0,0 +1,19 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_linux.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_linux.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_linux.h 2022-12-18 17:40:24.574937030 +0200 +@@ -0,0 +1,22 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -370067,11 +369513,14 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_linux.h linux-5.11. +#ifndef __DRV_TYPES_LINUX_H__ +#define __DRV_TYPES_LINUX_H__ + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) ++#define dev_addr_set(netdev, ethdata) _rtw_memcpy(netdev->dev_addr, ethdata, ETH_ALEN) ++#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_pci.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_pci.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_pci.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_pci.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_pci.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_pci.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_pci.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_pci.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,266 @@ +/****************************************************************************** + * @@ -370339,10 +369788,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_pci.h linux-5.11.4- + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_sdio.h 2021-03-07 18:16:17.085957519 +0200 -@@ -0,0 +1,90 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_sdio.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,64 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -370373,15 +369822,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_sdio.h linux-5.11.4 + #endif /* CONFIG_PLATFORM_SPRD */ +#endif + -+#ifdef PLATFORM_OS_XP -+ #include -+ #include -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ #include -+#endif -+ +#define RTW_SDIO_CLK_33M 33000000 +#define RTW_SDIO_CLK_40M 40000000 +#define RTW_SDIO_CLK_80M 80000000 @@ -370401,23 +369841,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_sdio.h linux-5.11.4 + unsigned int timing; + u8 sd3_bus_mode; +#endif -+ -+#ifdef PLATFORM_OS_XP -+ PDEVICE_OBJECT pphysdevobj; -+ PDEVICE_OBJECT pfuncdevobj; -+ PDEVICE_OBJECT pnextdevobj; -+ SDBUS_INTERFACE_STANDARD sdbusinft; -+ u8 nextdevstacksz; -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ SD_DEVICE_HANDLE hDevice; -+ SD_CARD_RCA sd_rca; -+ SD_CARD_INTERFACE card_intf; -+ BOOLEAN enableIsarWithStatus; -+ WCHAR active_path[MAX_ACTIVE_REG_PATH]; -+ SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; -+#endif +} SDIO_DATA, *PSDIO_DATA; + +#define dvobj_to_sdio_func(d) ((d)->intf_data.func) @@ -370433,9 +369856,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_sdio.h linux-5.11.4 +#define RTW_SDIO_ADDR_F0_CHK(a) (a&RTW_SDIO_ADDR_F0_BIT ? 1 : 0) + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_xp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_xp.h ---- linux-5.11.4/3rdparty/rtl8812au/include/drv_types_xp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/drv_types_xp.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_xp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_xp.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/drv_types_xp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/drv_types_xp.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,88 @@ +/****************************************************************************** + * @@ -370525,9 +369948,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/drv_types_xp.h linux-5.11.4-r + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ethernet.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ethernet.h ---- linux-5.11.4/3rdparty/rtl8812au/include/ethernet.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ethernet.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/ethernet.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ethernet.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/ethernet.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ethernet.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,36 @@ +/****************************************************************************** + * @@ -370565,9 +369988,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ethernet.h linux-5.11.4-rtl88 + + +#endif /* #ifndef __INC_ETHERNET_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/gspi_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_hal.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/gspi_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/gspi_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_hal.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,30 @@ +/****************************************************************************** + * @@ -370599,9 +370022,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_hal.h linux-5.11.4-rtl88 +#endif + +#endif /* __GSPI_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_ops.h ---- linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_ops.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/gspi_ops.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_ops.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/gspi_ops.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_ops.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,180 @@ +/****************************************************************************** + * @@ -370783,9 +370206,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops.h linux-5.11.4-rtl88 +#endif /* CONFIG_WOWLAN */ + +#endif /* __GSPI_OPS_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops_linux.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_ops_linux.h ---- linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_ops_linux.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/gspi_ops_linux.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_ops_linux.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/gspi_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_ops_linux.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,18 @@ +/****************************************************************************** + * @@ -370805,10 +370228,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_ops_linux.h linux-5.11.4 +#define __SDIO_OPS_LINUX_H__ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_osintf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_osintf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/gspi_osintf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/gspi_osintf.h 2021-03-07 18:16:17.085957519 +0200 -@@ -0,0 +1,25 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/gspi_osintf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_osintf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/gspi_osintf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/gspi_osintf.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,18 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -370826,17 +370249,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/gspi_osintf.h linux-5.11.4-rt +#ifndef __SDIO_OSINTF_H__ +#define __SDIO_OSINTF_H__ + -+ -+#ifdef PLATFORM_OS_CE -+ extern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter); -+ SD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter); -+ extern void sd_setup_irs(PADAPTER padapter); +#endif -+ -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/h2clbk.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/h2clbk.h ---- linux-5.11.4/3rdparty/rtl8812au/include/h2clbk.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/h2clbk.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/h2clbk.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/h2clbk.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/h2clbk.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/h2clbk.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -370864,9 +370280,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/h2clbk.h linux-5.11.4-rtl8812 +void _lbk_evt(IN PADAPTER Adapter); + +void h2c_event_callback(unsigned char *dev, unsigned char *pbuf); -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyCfg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PhyCfg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyCfg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PhyCfg.h 2021-03-07 18:16:17.083957423 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PhyCfg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PhyCfg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PhyCfg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PhyCfg.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,143 @@ +/****************************************************************************** + * @@ -371011,9 +370427,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyCfg.h linux-5.11.4- + +/*--------------------------Exported Function prototype---------------------*/ +#endif /* __INC_HAL8192CPHYCFG_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyReg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PhyReg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyReg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PhyReg.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PhyReg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PhyReg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PhyReg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PhyReg.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,735 @@ +/****************************************************************************** + * @@ -371750,9 +371166,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PhyReg.h linux-5.11.4- + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PwrSeq.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PwrSeq.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PwrSeq.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8812PwrSeq.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PwrSeq.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PwrSeq.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8812PwrSeq.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8812PwrSeq.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,208 @@ +/****************************************************************************** + * @@ -371962,9 +371378,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8812PwrSeq.h linux-5.11.4- +extern WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS + RTL8812_TRANS_END_STEPS]; + +#endif /* __HAL8812PWRSEQ_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyCfg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PhyCfg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyCfg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PhyCfg.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PhyCfg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PhyCfg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PhyCfg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PhyCfg.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,264 @@ +/****************************************************************************** + * @@ -372230,9 +371646,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyCfg.h linux-5.11.4- + +/*--------------------------Exported Function prototype---------------------*/ +#endif /* __INC_HAL8192CPHYCFG_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyReg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PhyReg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyReg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PhyReg.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PhyReg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PhyReg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PhyReg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PhyReg.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,863 @@ +/****************************************************************************** + * @@ -373097,9 +372513,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PhyReg.h linux-5.11.4- + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PwrSeq.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PwrSeq.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PwrSeq.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8814PwrSeq.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PwrSeq.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PwrSeq.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8814PwrSeq.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8814PwrSeq.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,231 @@ +/****************************************************************************** + * @@ -373332,9 +372748,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8814PwrSeq.h linux-5.11.4- +extern WLAN_PWR_CFG rtl8814A_leave_lps_flow[RTL8814A_TRANS_LPS_TO_ACT_STEPS + RTL8814A_TRANS_END_STEPS]; + +#endif /* __HAL8814PWRSEQ_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8821APwrSeq.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8821APwrSeq.h ---- linux-5.11.4/3rdparty/rtl8812au/include/Hal8821APwrSeq.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/Hal8821APwrSeq.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/Hal8821APwrSeq.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8821APwrSeq.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/Hal8821APwrSeq.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/Hal8821APwrSeq.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,200 @@ +/****************************************************************************** + * @@ -373536,9 +372952,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/Hal8821APwrSeq.h linux-5.11.4 + extern WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS + RTL8821A_TRANS_END_STEPS]; + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_btcoex.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_btcoex.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_btcoex.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_btcoex.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_btcoex.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_btcoex.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,97 @@ +/****************************************************************************** + * @@ -373637,9 +373053,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex.h linux-5.11.4-rtl +u8 hal_btcoex_get_rf4ce_link_state(void); +#endif +#endif /* !__HAL_BTCOEX_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex_wifionly.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_btcoex_wifionly.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex_wifionly.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_btcoex_wifionly.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_btcoex_wifionly.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_btcoex_wifionly.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_btcoex_wifionly.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_btcoex_wifionly.h 2022-01-28 22:59:35.620654549 +0200 @@ -0,0 +1,81 @@ +/****************************************************************************** + * @@ -373722,9 +373138,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_btcoex_wifionly.h linux-5 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_com.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_com.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_com.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,719 @@ +/****************************************************************************** + * @@ -374445,9 +373861,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com.h linux-5.11.4-rtl881 +#endif + +#endif /* __HAL_COMMON_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_h2c.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_h2c.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_com_h2c.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_h2c.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_h2c.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_h2c.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_h2c.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_h2c.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,635 @@ +/****************************************************************************** + * @@ -375084,9 +374500,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_h2c.h linux-5.11.4-rt +u8 rtw_hal_set_req_per_rpt_cmd(_adapter *adapter, u8 group_macid, + u8 rpt_type, u32 macid_bitmap); +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_led.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_led.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_com_led.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_led.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_led.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_led.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_led.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_led.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,437 @@ +/****************************************************************************** + * @@ -375525,9 +374941,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_led.h linux-5.11.4-rt + +#endif /*__HAL_COMMON_LED_H_*/ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_phycfg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_phycfg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_com_phycfg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_phycfg.h 2021-03-07 18:16:17.085957519 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_phycfg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_phycfg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_phycfg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_phycfg.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,299 @@ +/****************************************************************************** + * @@ -375828,9 +375244,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_phycfg.h linux-5.11.4 +#endif /* CONFIG_LOAD_PHY_PARA_FROM_FILE */ +u8 phy_check_under_survey_ch(_adapter *adapter); +#endif /* __HAL_COMMON_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_reg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_reg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_com_reg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_com_reg.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_reg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_reg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_com_reg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_com_reg.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,1887 @@ +/****************************************************************************** + * @@ -377719,9 +377135,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_com_reg.h linux-5.11.4-rt +#define HAL_8188E_HW_GPIO_WPS_BIT BIT(7) + +#endif /* __HAL_COMMON_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_data.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_data.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_data.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_data.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_data.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_data.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_data.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_data.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,1105 @@ +/****************************************************************************** + * @@ -378828,9 +378244,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_data.h linux-5.11.4-rtl88 +*/ + +#endif /* __HAL_DATA_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_gspi.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_gspi.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_gspi.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_gspi.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_gspi.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_gspi.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_gspi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_gspi.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -378858,9 +378274,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_gspi.h linux-5.11.4-rtl88 +u32 rtw_hal_get_gspi_tx_max_length(PADAPTER padapter, u8 queue_idx); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_ic_cfg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_ic_cfg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_ic_cfg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_ic_cfg.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_ic_cfg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_ic_cfg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_ic_cfg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_ic_cfg.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,313 @@ +/****************************************************************************** + * @@ -379175,9 +378591,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_ic_cfg.h linux-5.11.4-rtl +#endif + +#endif /*__HAL_IC_CFG_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_intf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_intf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_intf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_intf.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_intf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_intf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_intf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_intf.h 2022-01-28 22:59:35.621654597 +0200 @@ -0,0 +1,849 @@ +/****************************************************************************** + * @@ -380028,9 +379444,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_intf.h linux-5.11.4-rtl88 +#endif + +#endif /* __HAL_INTF_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_pg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_pg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_pg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_pg.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_pg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_pg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_pg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_pg.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,880 @@ +/****************************************************************************** + * @@ -380912,9 +380328,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_pg.h linux-5.11.4-rtl8812 + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_phy.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_phy.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_phy.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_phy.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_phy.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_phy.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_phy.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_phy.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,234 @@ +/****************************************************************************** + * @@ -381150,9 +380566,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_phy.h linux-5.11.4-rtl881 + IN PADAPTER Adapter); +#endif /*#CONFIG_RF_SHADOW_RW*/ +#endif /* __HAL_COMMON_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_phy_reg.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_phy_reg.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_phy_reg.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_phy_reg.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_phy_reg.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_phy_reg.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_phy_reg.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_phy_reg.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,25 @@ +/****************************************************************************** + * @@ -381179,9 +380595,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_phy_reg.h linux-5.11.4-rt +/* #endif */ + +#endif /* __HAL_PHY_REG_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/HalPwrSeqCmd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/HalPwrSeqCmd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/HalPwrSeqCmd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/HalPwrSeqCmd.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/HalPwrSeqCmd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/HalPwrSeqCmd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/HalPwrSeqCmd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/HalPwrSeqCmd.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,130 @@ +/****************************************************************************** + * @@ -381313,9 +380729,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/HalPwrSeqCmd.h linux-5.11.4-r + WLAN_PWR_CFG PwrCfgCmd[]); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/include/hal_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/hal_sdio.h 2021-03-07 18:16:17.086957566 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/hal_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/hal_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/hal_sdio.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,56 @@ +/****************************************************************************** + * @@ -381373,9 +380789,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/hal_sdio.h linux-5.11.4-rtl88 +u32 cmd53_4byte_alignment(struct intf_hdl *pintfhdl, u32 addr); + +#endif /* __HAL_SDIO_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/HalVerDef.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/HalVerDef.h ---- linux-5.11.4/3rdparty/rtl8812au/include/HalVerDef.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/HalVerDef.h 2021-03-07 18:16:17.084957471 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/HalVerDef.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/HalVerDef.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/HalVerDef.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/HalVerDef.h 2022-01-28 22:59:35.619654502 +0200 @@ -0,0 +1,201 @@ +/****************************************************************************** + * @@ -381578,10 +380994,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/HalVerDef.h linux-5.11.4-rtl8 +#define IS_VENDOR_8814A_MP_CHIP(_Adapter) ((IS_8814A_SERIES(GET_HAL_DATA(_Adapter)->version_id)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->version_id)) ? TRUE : FALSE) : FALSE) + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211_ext.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ieee80211_ext.h ---- linux-5.11.4/3rdparty/rtl8812au/include/ieee80211_ext.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ieee80211_ext.h 2021-03-07 18:16:17.087957613 +0200 -@@ -0,0 +1,471 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/ieee80211_ext.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ieee80211_ext.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/ieee80211_ext.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ieee80211_ext.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,309 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -381684,27 +381100,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211_ext.h linux-5.11.4- + +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+ -+struct wpa_ie_hdr { -+ u8 elem_id; -+ u8 len; -+ u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ -+ u8 version[2]; /* little endian */ -+}; -+ -+struct rsn_ie_hdr { -+ u8 elem_id; /* WLAN_EID_RSN */ -+ u8 len; -+ u8 version[2]; /* little endian */ -+}; -+ -+#pragma pack() -+ -+#endif -+ +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ @@ -381909,154 +381304,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211_ext.h linux-5.11.4- + +#endif + -+ -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+ -+struct ieee80211_mgmt { -+ u16 frame_control; -+ u16 duration; -+ u8 da[6]; -+ u8 sa[6]; -+ u8 bssid[6]; -+ u16 seq_ctrl; -+ union { -+ struct { -+ u16 auth_alg; -+ u16 auth_transaction; -+ u16 status_code; -+ /* possibly followed by Challenge text */ -+ u8 variable[0]; -+ } auth; -+ struct { -+ u16 reason_code; -+ } deauth; -+ struct { -+ u16 capab_info; -+ u16 listen_interval; -+ /* followed by SSID and Supported rates */ -+ u8 variable[0]; -+ } assoc_req; -+ struct { -+ u16 capab_info; -+ u16 status_code; -+ u16 aid; -+ /* followed by Supported rates */ -+ u8 variable[0]; -+ } assoc_resp, reassoc_resp; -+ struct { -+ u16 capab_info; -+ u16 listen_interval; -+ u8 current_ap[6]; -+ /* followed by SSID and Supported rates */ -+ u8 variable[0]; -+ } reassoc_req; -+ struct { -+ u16 reason_code; -+ } disassoc; -+#if 0 -+ struct { -+ __le64 timestamp; -+ u16 beacon_int; -+ u16 capab_info; -+ /* followed by some of SSID, Supported rates, -+ * FH Params, DS Params, CF Params, IBSS Params, TIM */ -+ u8 variable[0]; -+ } beacon; -+ struct { -+ /* only variable items: SSID, Supported rates */ -+ u8 variable[0]; -+ } probe_req; -+ -+ struct { -+ __le64 timestamp; -+ u16 beacon_int; -+ u16 capab_info; -+ /* followed by some of SSID, Supported rates, -+ * FH Params, DS Params, CF Params, IBSS Params */ -+ u8 variable[0]; -+ } probe_resp; -+#endif -+ struct { -+ u8 category; -+ union { -+ struct { -+ u8 action_code; -+ u8 dialog_token; -+ u8 status_code; -+ u8 variable[0]; -+ } wme_action; -+ #if 0 -+ struct{ -+ u8 action_code; -+ u8 element_id; -+ u8 length; -+ struct ieee80211_channel_sw_ie sw_elem; -+ } chan_switch; -+ struct{ -+ u8 action_code; -+ u8 dialog_token; -+ u8 element_id; -+ u8 length; -+ struct ieee80211_msrment_ie msr_elem; -+ } measurement; -+ #endif -+ struct { -+ u8 action_code; -+ u8 dialog_token; -+ u16 capab; -+ u16 timeout; -+ u16 start_seq_num; -+ } addba_req; -+ struct { -+ u8 action_code; -+ u8 dialog_token; -+ u16 status; -+ u16 capab; -+ u16 timeout; -+ } addba_resp; -+ struct { -+ u8 action_code; -+ u16 params; -+ u16 reason_code; -+ } delba; -+ struct { -+ u8 action_code; -+ /* capab_info for open and confirm, -+ * reason for close -+ */ -+ u16 aux; -+ /* Followed in plink_confirm by status -+ * code, AID and supported rates, -+ * and directly by supported rates in -+ * plink_open and plink_close -+ */ -+ u8 variable[0]; -+ } plink_action; -+ struct { -+ u8 action_code; -+ u8 variable[0]; -+ } mesh_action; -+ } u; -+ } action; -+ } u; -+} ; -+ -+#pragma pack() -+ -+#endif -+ +/* mgmt header + 1 byte category code */ +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) -+ -+ -+ +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ieee80211.h ---- linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ieee80211.h 2021-03-07 18:16:17.087957613 +0200 -@@ -0,0 +1,2204 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/ieee80211.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ieee80211.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/ieee80211.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ieee80211.h 2023-05-26 22:35:36.544136899 +0300 +@@ -0,0 +1,2044 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -382075,15 +381329,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 +#define __IEEE80211_H + + -+#ifndef CONFIG_RTL8711FW -+ -+ #if defined PLATFORM_OS_XP -+ #include -+ #endif -+#else -+ -+#endif -+ +#define MGMT_QUEUE_NUM 5 + +#define ETH_ALEN 6 @@ -382557,54 +381802,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 +} __attribute__((packed)); +#endif + -+ -+ -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+struct rtw_ieee80211_hdr { -+ u16 frame_ctl; -+ u16 duration_id; -+ u8 addr1[ETH_ALEN]; -+ u8 addr2[ETH_ALEN]; -+ u8 addr3[ETH_ALEN]; -+ u16 seq_ctl; -+ u8 addr4[ETH_ALEN]; -+}; -+ -+struct rtw_ieee80211_hdr_3addr { -+ u16 frame_ctl; -+ u16 duration_id; -+ u8 addr1[ETH_ALEN]; -+ u8 addr2[ETH_ALEN]; -+ u8 addr3[ETH_ALEN]; -+ u16 seq_ctl; -+}; -+ -+ -+struct rtw_ieee80211_hdr_qos { -+ struct rtw_ieee80211_hdr wlan_hdr; -+ u16 qc; -+}; -+ -+struct rtw_ieee80211_hdr_3addr_qos { -+ struct rtw_ieee80211_hdr_3addr wlan_hdr; -+ u16 qc; -+}; -+ -+struct eapol { -+ u8 snap[6]; -+ u16 ethertype; -+ u8 version; -+ u8 type; -+ u16 length; -+}; -+#pragma pack() -+ -+#endif -+ -+ -+ +enum eap_type { + EAP_PACKET = 0, + EAPOL_START, @@ -382726,22 +381923,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 + +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+struct ieee80211_snap_hdr { -+ -+ u8 dsap; /* always 0xAA */ -+ u8 ssap; /* always 0xAA */ -+ u8 ctrl; /* always 0x03 */ -+ u8 oui[P80211_OUI_LEN]; /* organizational universal id */ -+ -+}; -+#pragma pack() -+ -+#endif -+ -+ +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) + +#define WLAN_FC_GET_TYPE(fc) ((fc) & RTW_IEEE80211_FCTL_FTYPE) @@ -383317,24 +382498,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 + +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+struct ieee80211_security { -+ u16 active_key:2, -+ enabled:1, -+ auth_mode:2, -+ auth_algo:4, -+ unicast_uses_group:1; -+ u8 key_sizes[WEP_KEYS]; -+ u8 keys[WEP_KEYS][WEP_KEY_LEN]; -+ u8 level; -+ u16 flags; -+} ; -+#pragma pack() -+ -+#endif -+ +/* + + 802.11 data frame from AP @@ -383389,24 +382552,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 +} __attribute__((packed)); +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+struct ieee80211_info_element_hdr { -+ u8 id; -+ u8 len; -+} ; -+ -+struct ieee80211_info_element { -+ u8 id; -+ u8 len; -+ u8 data[0]; -+} ; -+#pragma pack() -+ -+#endif -+ -+ +/* + * These are the data types that can make up management packets + * @@ -383470,57 +382615,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 +} __attribute__((packed)); +#endif + -+ -+ -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+ -+struct ieee80211_authentication { -+ struct ieee80211_header_data header; -+ u16 algorithm; -+ u16 transaction; -+ u16 status; -+ /* struct ieee80211_info_element_hdr info_element; */ -+} ; -+ -+ -+struct ieee80211_probe_response { -+ struct ieee80211_header_data header; -+ u32 time_stamp[2]; -+ u16 beacon_interval; -+ u16 capability; -+ struct ieee80211_info_element info_element; -+} ; -+ -+struct ieee80211_probe_request { -+ struct ieee80211_header_data header; -+ /*struct ieee80211_info_element info_element;*/ -+} ; -+ -+struct ieee80211_assoc_request_frame { -+ struct rtw_ieee80211_hdr_3addr header; -+ u16 capability; -+ u16 listen_interval; -+ /* u8 current_ap[ETH_ALEN]; */ -+ struct ieee80211_info_element_hdr info_element; -+} ; -+ -+struct ieee80211_assoc_response_frame { -+ struct rtw_ieee80211_hdr_3addr header; -+ u16 capability; -+ u16 status; -+ u16 aid; -+ /* struct ieee80211_info_element info_element; supported rates */ -+}; -+ -+#pragma pack() -+ -+#endif -+ -+ -+ -+ +struct ieee80211_txb { + u8 nr_frags; + u8 encrypted; @@ -383675,18 +382769,18 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 + (((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \ + (((Addr[5]) & 0xff) == 0xff)) +#else -+extern __inline int is_multicast_mac_addr(const u8 *addr) ++static inline int is_multicast_mac_addr(const u8 *addr) +{ + return (addr[0] != 0xff) && (0x01 & addr[0]); +} + -+extern __inline int is_broadcast_mac_addr(const u8 *addr) ++static inline int is_broadcast_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ + (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); +} + -+extern __inline int is_zero_mac_addr(const u8 *addr) ++static inline int is_zero_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ + (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00)); @@ -384261,9 +383355,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ieee80211.h linux-5.11.4-rtl8 + + +#endif /* IEEE80211_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/if_ether.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/if_ether.h ---- linux-5.11.4/3rdparty/rtl8812au/include/if_ether.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/if_ether.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/if_ether.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/if_ether.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/if_ether.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/if_ether.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,106 @@ +/****************************************************************************** + * @@ -384371,9 +383465,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/if_ether.h linux-5.11.4-rtl88 + + +#endif /* _LINUX_IF_ETHER_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ip.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ip.h ---- linux-5.11.4/3rdparty/rtl8812au/include/ip.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/ip.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/ip.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ip.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/ip.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/ip.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,135 @@ +/****************************************************************************** + * @@ -384510,9 +383604,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/ip.h linux-5.11.4-rtl8812au/3 +}; + +#endif /* _LINUX_IP_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/linux/old_unused_rtl_wireless.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/linux/old_unused_rtl_wireless.h ---- linux-5.11.4/3rdparty/rtl8812au/include/linux/old_unused_rtl_wireless.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/linux/old_unused_rtl_wireless.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/linux/old_unused_rtl_wireless.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/linux/old_unused_rtl_wireless.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/linux/old_unused_rtl_wireless.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/linux/old_unused_rtl_wireless.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,87 @@ +/****************************************************************************** + * @@ -384601,9 +383695,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/linux/old_unused_rtl_wireless +}; + +#endif /* _LINUX_WIRELESS_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/mlme_osdep.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/mlme_osdep.h ---- linux-5.11.4/3rdparty/rtl8812au/include/mlme_osdep.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/mlme_osdep.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/mlme_osdep.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/mlme_osdep.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/mlme_osdep.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/mlme_osdep.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,25 @@ +/****************************************************************************** + * @@ -384630,9 +383724,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/mlme_osdep.h linux-5.11.4-rtl +void rtw_reset_securitypriv(_adapter *adapter); + +#endif /* _MLME_OSDEP_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/mp_custom_oid.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/mp_custom_oid.h ---- linux-5.11.4/3rdparty/rtl8812au/include/mp_custom_oid.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/mp_custom_oid.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/mp_custom_oid.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/mp_custom_oid.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/mp_custom_oid.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/mp_custom_oid.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,348 @@ +/****************************************************************************** + * @@ -384982,9 +384076,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/mp_custom_oid.h linux-5.11.4- +#define OID_RT_PRO_EFUSE_MAP 0xFF871217 /* Q, S */ + +#endif /* #ifndef __CUSTOM_OID_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/nic_spec.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/nic_spec.h ---- linux-5.11.4/3rdparty/rtl8812au/include/nic_spec.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/nic_spec.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/nic_spec.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/nic_spec.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/nic_spec.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/nic_spec.h 2022-01-28 22:59:35.622654644 +0200 @@ -0,0 +1,41 @@ +/****************************************************************************** + * @@ -385027,10 +384121,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/nic_spec.h linux-5.11.4-rtl88 + + +#endif /* __RTL8711_SPEC_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_intf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_intf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_intf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_intf.h 2021-03-07 18:16:17.087957613 +0200 -@@ -0,0 +1,167 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_intf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_intf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_intf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_intf.h 2022-12-18 17:40:24.575937030 +0200 +@@ -0,0 +1,146 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -385090,29 +384184,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_intf.h linux-5.11.4-rtl +#endif +#endif + -+#ifdef PLATFORM_OS_XP -+#ifdef CONFIG_SDIO_HCI -+ /* below is for io_rwmem... */ -+ PMDL pmdl; -+ PSDBUS_REQUEST_PACKET sdrp; -+ PSDBUS_REQUEST_PACKET recv_sdrp; -+ PSDBUS_REQUEST_PACKET xmit_sdrp; -+ -+ PIRP piorw_irp; -+ -+#endif -+#ifdef CONFIG_USB_HCI -+ PURB piorw_urb; -+ PIRP piorw_irp; -+ u8 io_irp_cnt; -+ u8 bio_irp_pending; -+ _sema io_retevt; -+#endif -+#endif -+ +}; + -+ +#ifdef CONFIG_R871X_TEST + int rtw_start_pseudo_adhoc(_adapter *padapter); + int rtw_stop_pseudo_adhoc(_adapter *padapter); @@ -385198,9 +384271,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_intf.h linux-5.11.4-rtl +int rtw_resume_common(_adapter *padapter); + +#endif /* _OSDEP_INTF_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_bsd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_bsd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_bsd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_bsd.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_bsd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_bsd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_bsd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_bsd.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,756 @@ +/****************************************************************************** + * @@ -385958,9 +385031,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_bsd.h linux-5.1 + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_ce.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_ce.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_ce.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_ce.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_ce.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,200 @@ +/****************************************************************************** + * @@ -386162,10 +385235,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_ce.h linux-5.11 + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service.h 2021-03-07 18:16:17.087957613 +0200 -@@ -0,0 +1,804 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,781 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -386226,14 +385299,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4- + #include +#endif + -+#ifdef PLATFORM_OS_XP -+ #include -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ #include -+#endif -+ +/* #include */ + +#ifndef BIT @@ -386586,7 +385651,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4- + printf("%s", "RTKTHREAD_enter"); +#endif +} ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) +void thread_exit(_completion *comp); ++#else ++void kthread_thread_exit(_completion *comp); ++#endif +void _rtw_init_completion(_completion *comp); +void _rtw_wait_for_comp_timeout(_completion *comp); +void _rtw_wait_for_comp(_completion *comp); @@ -386629,15 +385698,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4- + return res; +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+ if (res == _SUCCESS) -+ return NDIS_STATUS_SUCCESS; -+ else -+ return NDIS_STATUS_FAILURE; -+ -+#endif -+ +} + +__inline static void rtw_dump_stack(void) @@ -386657,16 +385717,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4- +{ + int ret = _TRUE; + -+#ifdef PLATFORM_WINDOWS -+ if (((uint)parg1) <= 0x7fffffff || -+ ((uint)parg2) <= 0x7fffffff || -+ ((uint)parg3) <= 0x7fffffff || -+ ((uint)parg4) <= 0x7fffffff) { -+ ret = _FALSE; -+ KeBugCheckEx(0x87110000, (ULONG_PTR)parg1, (ULONG_PTR)parg2, (ULONG_PTR)parg3, (ULONG_PTR)parg4); -+ } -+#endif -+ + return ret; + +} @@ -386970,9 +386020,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service.h linux-5.11.4- +#endif /* !PLATFORM_LINUX */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_linux.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_linux.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_linux.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_linux.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_linux.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_linux.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_linux.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,543 @@ +/****************************************************************************** + * @@ -387517,9 +386567,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_linux.h linux-5 + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_xp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_xp.h ---- linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_xp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/osdep_service_xp.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_xp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_xp.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/osdep_service_xp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/osdep_service_xp.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,210 @@ +/****************************************************************************** + * @@ -387731,9 +386781,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/osdep_service_xp.h linux-5.11 + +#endif + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/pci_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_hal.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/pci_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/pci_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_hal.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,52 @@ +/****************************************************************************** + * @@ -387787,9 +386837,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_hal.h linux-5.11.4-rtl881 +u8 rtw_set_hal_ops(_adapter *padapter); + +#endif /* __PCIE_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_ops.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_ops.h ---- linux-5.11.4/3rdparty/rtl8812au/include/pci_ops.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_ops.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/pci_ops.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_ops.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/pci_ops.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_ops.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,109 @@ +/****************************************************************************** + * @@ -387900,9 +386950,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_ops.h linux-5.11.4-rtl881 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_osintf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_osintf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/pci_osintf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/pci_osintf.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/pci_osintf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_osintf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/pci_osintf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/pci_osintf.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,50 @@ +/****************************************************************************** + * @@ -387954,9 +387004,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/pci_osintf.h linux-5.11.4-rtl +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/recv_osdep.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/recv_osdep.h ---- linux-5.11.4/3rdparty/rtl8812au/include/recv_osdep.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/recv_osdep.h 2021-03-07 18:16:17.087957613 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/recv_osdep.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/recv_osdep.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/recv_osdep.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/recv_osdep.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,67 @@ +/****************************************************************************** + * @@ -388025,9 +387075,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/recv_osdep.h linux-5.11.4-rtl +#endif /* PLATFORM_LINUX */ + +#endif /* */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_cmd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_cmd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_cmd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_cmd.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_cmd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_cmd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_cmd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_cmd.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,158 @@ +/****************************************************************************** + * @@ -388187,9 +387237,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_cmd.h linux-5.11.4-r +s32 c2h_handler_8812a(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload); + +#endif/* __RTL8812A_CMD_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_dm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_dm.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_dm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_dm.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_dm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_dm.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_dm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_dm.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,27 @@ +/****************************************************************************** + * @@ -388218,9 +387268,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_dm.h linux-5.11.4-rt +/* void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_hal.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_hal.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,369 @@ +/****************************************************************************** + * @@ -388591,9 +387641,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_hal.h linux-5.11.4-r +); + +#endif /* __RTL8188E_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_led.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_led.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_led.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_led.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_led.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_led.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_led.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_led.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,41 @@ +/****************************************************************************** + * @@ -388636,10 +387686,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_led.h linux-5.11.4-r +#endif + +#endif /*__RTL8812A_LED_H__*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_recv.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_recv.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_recv.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_recv.h 2021-03-07 18:16:17.088957660 +0200 -@@ -0,0 +1,153 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_recv.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_recv.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_recv.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_recv.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,149 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -388660,9 +387710,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_recv.h linux-5.11.4- +#if defined(CONFIG_USB_HCI) + + #ifndef MAX_RECVBUF_SZ -+ #ifdef PLATFORM_OS_CE -+ #define MAX_RECVBUF_SZ (8192+1024) /* 8K+1k */ -+ #else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER + #define MAX_RECVBUF_SZ (rtw_rtkm_get_buff_size()) /*depend rtkm*/ @@ -388681,7 +387728,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_recv.h linux-5.11.4- + #else + #define MAX_RECVBUF_SZ (4000) /* about 4K */ + #endif -+ #endif + #endif /* !MAX_RECVBUF_SZ */ + +#elif defined(CONFIG_PCI_HCI) @@ -388793,9 +387839,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_recv.h linux-5.11.4- +void rtl8812_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); + +#endif /* __RTL8812A_RECV_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_rf.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_rf.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,28 @@ +/****************************************************************************** + * @@ -388825,9 +387871,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_rf.h linux-5.11.4-rt + IN PADAPTER Adapter); + +#endif/* __RTL8188E_RF_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_spec.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_spec.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_spec.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_spec.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_spec.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_spec.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_spec.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_spec.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,263 @@ +/****************************************************************************** + * @@ -389092,9 +388138,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_spec.h linux-5.11.4- +#ifdef CONFIG_RTL8821A +#include "rtl8821a_spec.h" +#endif /* CONFIG_RTL8821A */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_sreset.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_sreset.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_sreset.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_sreset.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_sreset.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_sreset.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_sreset.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_sreset.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -389120,9 +388166,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_sreset.h linux-5.11. +extern void rtl8812_sreset_linked_status_check(_adapter *padapter); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_xmit.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_xmit.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_xmit.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8812a_xmit.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_xmit.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_xmit.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8812a_xmit.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8812a_xmit.h 2022-01-28 22:59:35.623654691 +0200 @@ -0,0 +1,367 @@ +/****************************************************************************** + * @@ -389491,9 +388537,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8812a_xmit.h linux-5.11.4- +#ifdef CONFIG_RTL8821A +#include "rtl8821a_xmit.h" +#endif /* CONFIG_RTL8821A */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_cmd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_cmd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_cmd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_cmd.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_cmd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_cmd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_cmd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_cmd.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,162 @@ +/****************************************************************************** + * @@ -389657,9 +388703,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_cmd.h linux-5.11.4-r +#endif /* CONFIG_P2P */ + +#endif/* __RTL8814A_CMD_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_dm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_dm.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_dm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_dm.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_dm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_dm.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_dm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_dm.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,23 @@ +/****************************************************************************** + * @@ -389684,9 +388730,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_dm.h linux-5.11.4-rt +void rtl8814_HalDmWatchDog(IN PADAPTER Adapter); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_hal.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_hal.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,330 @@ +/****************************************************************************** + * @@ -390018,9 +389064,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_hal.h linux-5.11.4-r +#endif + +#endif /* __RTL8188E_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_led.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_led.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_led.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_led.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_led.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_led.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_led.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_led.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,36 @@ +/****************************************************************************** + * @@ -390058,10 +389104,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_led.h linux-5.11.4-r + +#endif /* __RTL8814A_LED_H__ */ +#endif /*CONFIG_RTW_SW_LED*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_recv.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_recv.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_recv.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_recv.h 2021-03-07 18:16:17.088957660 +0200 -@@ -0,0 +1,186 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_recv.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_recv.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_recv.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_recv.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,182 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -390082,9 +389128,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_recv.h linux-5.11.4- +#if defined(CONFIG_USB_HCI) + + #ifndef MAX_RECVBUF_SZ -+ #ifdef PLATFORM_OS_CE -+ #define MAX_RECVBUF_SZ (8192+1024) /* 8K+1k */ -+ #else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + #ifdef CONFIG_PLATFORM_MSTAR + #define MAX_RECVBUF_SZ (8192) /* 8K */ @@ -390099,7 +389142,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_recv.h linux-5.11.4- + #else + #define MAX_RECVBUF_SZ (4000) /* about 4K */ + #endif -+ #endif + #endif /* !MAX_RECVBUF_SZ */ + +#elif defined(CONFIG_PCI_HCI) @@ -390248,9 +389290,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_recv.h linux-5.11.4- +void rtl8814_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); + +#endif /* __RTL8814A_RECV_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_rf.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_rf.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,28 @@ +/****************************************************************************** + * @@ -390280,9 +389322,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_rf.h linux-5.11.4-rt + IN PADAPTER Adapter); + +#endif/* __RTL8188E_RF_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_spec.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_spec.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_spec.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_spec.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_spec.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_spec.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_spec.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_spec.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,656 @@ +/****************************************************************************** + * @@ -390940,9 +389982,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_spec.h linux-5.11.4- +#define PROTO_CAP_8814A (PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC) + +#endif /* __RTL8814A_SPEC_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_sreset.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_sreset.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_sreset.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_sreset.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_sreset.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_sreset.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_sreset.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_sreset.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -390968,9 +390010,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_sreset.h linux-5.11. + extern void rtl8814_sreset_linked_status_check(_adapter *padapter); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_xmit.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_xmit.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_xmit.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8814a_xmit.h 2021-03-07 18:16:17.088957660 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_xmit.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_xmit.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8814a_xmit.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8814a_xmit.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,311 @@ +/****************************************************************************** + * @@ -391283,9 +390325,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8814a_xmit.h linux-5.11.4- + + +#endif /* __RTL8814_XMIT_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_spec.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8821a_spec.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_spec.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8821a_spec.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8821a_spec.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8821a_spec.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8821a_spec.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8821a_spec.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,90 @@ +/****************************************************************************** + * @@ -391377,9 +390419,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_spec.h linux-5.11.4- + * ************************************************************ */ + +#endif /* __RTL8821A_SPEC_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_xmit.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8821a_xmit.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_xmit.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl8821a_xmit.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl8821a_xmit.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8821a_xmit.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl8821a_xmit.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl8821a_xmit.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,173 @@ +/****************************************************************************** + * @@ -391554,9 +390596,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl8821a_xmit.h linux-5.11.4- +#endif + +#endif /* __RTL8821_XMIT_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl_autoconf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl_autoconf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtl_autoconf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtl_autoconf.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtl_autoconf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl_autoconf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtl_autoconf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtl_autoconf.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,363 @@ +/****************************************************************************** + * @@ -391921,10 +390963,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtl_autoconf.h linux-5.11.4-r +#define DBG_RX_DFRAME_RAW_DATA +/*#define CONFIG_USE_EXTERNAL_POWER */ /* NOT USB2.0 power, so no 500mA power constraint, no limitation in Power by Rate*/ +/*#define DBG_FW_DEBUG_MSG_PKT*/ /* FW use this feature to tx debug broadcast pkt. This pkt include FW debug message*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_android.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_android.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_android.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_android.h 2021-03-07 18:16:17.089957707 +0200 -@@ -0,0 +1,113 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_android.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_android.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_android.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_android.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,108 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -392030,17 +391072,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_android.h linux-5.11.4-rt +#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */ + +#ifdef CONFIG_GPIO_WAKEUP -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+int wifi_configure_gpio(void); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ +void wifi_free_gpio(unsigned int gpio); +#endif /* CONFIG_GPIO_WAKEUP */ -+ -+ +#endif /* __RTW_ANDROID_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ap.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ap.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ap.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ap.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ap.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ap.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ap.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,112 @@ +/****************************************************************************** + * @@ -392154,9 +391191,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ap.h linux-5.11.4-rtl8812 + +#endif /* end of CONFIG_AP_MODE */ +#endif /*__RTW_AP_H_*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_beamforming.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_beamforming.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_beamforming.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_beamforming.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_beamforming.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_beamforming.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_beamforming.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_beamforming.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,401 @@ +/****************************************************************************** + * @@ -392559,9 +391596,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_beamforming.h linux-5.11. +#endif /*#ifdef CONFIG_BEAMFORMING */ + +#endif /*__RTW_BEAMFORMING_H_*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_br_ext.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_br_ext.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_br_ext.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_br_ext.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_br_ext.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_br_ext.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_br_ext.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_br_ext.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,69 @@ +/****************************************************************************** + * @@ -392632,9 +391669,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_br_ext.h linux-5.11.4-rtl +void nat25_db_cleanup(_adapter *priv); + +#endif /* _RTW_BR_EXT_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_btcoex.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_btcoex.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_btcoex.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_btcoex.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_btcoex.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_btcoex.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,455 @@ +/****************************************************************************** + * @@ -393091,9 +392128,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex.h linux-5.11.4-rtl + +void rtw_btcoex_set_ant_info(PADAPTER padapter); + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex_wifionly.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_btcoex_wifionly.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex_wifionly.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_btcoex_wifionly.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_btcoex_wifionly.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_btcoex_wifionly.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_btcoex_wifionly.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_btcoex_wifionly.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,24 @@ +/****************************************************************************** + * @@ -393119,10 +392156,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_btcoex_wifionly.h linux-5 +void rtw_btcoex_wifionly_initialize(PADAPTER padapter); +void rtw_btcoex_wifionly_AntInfoSetting(PADAPTER padapter); +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_bt_mp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_bt_mp.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_bt_mp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_bt_mp.h 2021-03-07 18:16:17.089957707 +0200 -@@ -0,0 +1,288 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_bt_mp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_bt_mp.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_bt_mp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_bt_mp.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,287 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -393144,7 +392181,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_bt_mp.h linux-5.11.4-rtl8 + +#if (MP_DRIVER == 1) + -+#pragma pack(1) + +/* definition for BT_UP_OP_BT_READY */ +#define MP_BT_NOT_READY 0 @@ -393411,9 +392447,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_bt_mp.h linux-5.11.4-rtl8 +#endif /* #if(MP_DRIVER == 1) */ + +#endif /* #ifndef __INC_MPT_BT_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_byteorder.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_byteorder.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_byteorder.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_byteorder.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_byteorder.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_byteorder.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_byteorder.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_byteorder.h 2022-01-28 22:59:35.624654739 +0200 @@ -0,0 +1,45 @@ +/****************************************************************************** + * @@ -393460,10 +392496,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_byteorder.h linux-5.11.4- +#endif + +#endif /* _RTL871X_BYTEORDER_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_cmd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_cmd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_cmd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_cmd.h 2021-03-07 18:16:17.089957707 +0200 -@@ -0,0 +1,1363 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_cmd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_cmd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_cmd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_cmd.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,1356 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -393492,11 +392528,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_cmd.h linux-5.11.4-rtl881 +#define MAX_RSPSZ 512 +#define MAX_EVTSZ 1024 + -+#ifdef PLATFORM_OS_CE -+ #define CMDBUFF_ALIGN_SZ 4 -+#else -+ #define CMDBUFF_ALIGN_SZ 512 -+#endif ++#define CMDBUFF_ALIGN_SZ 512 + +struct cmd_obj { + _adapter *padapter; @@ -393580,9 +392612,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_cmd.h linux-5.11.4-rtl881 +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 *c2h_mem; + u8 *allocated_c2h_mem; -+#ifdef PLATFORM_OS_XP -+ PMDL pc2h_mdl; -+#endif +#endif + +}; @@ -394827,10 +393856,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_cmd.h linux-5.11.4-rtl881 + (cmd)->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ? ((struct drvextra_cmd_parm *)(cmd)->parmbuf)->type : 0 + +#endif /* _CMD_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_debug.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_debug.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_debug.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_debug.h 2021-03-07 18:16:17.089957707 +0200 -@@ -0,0 +1,653 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_debug.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_debug.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_debug.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_debug.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,624 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -394861,37 +393890,18 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_debug.h linux-5.11.4-rtl8 + +#define DRIVER_PREFIX "RTW: " + -+#ifdef PLATFORM_OS_CE -+extern void rtl871x_cedbg(const char *fmt, ...); -+#endif -+ -+#ifdef PLATFORM_WINDOWS -+ #define RTW_PRINT do {} while (0) -+ #define RTW_ERR do {} while (0) -+ #define RTW_WARN do {} while (0) -+ #define RTW_INFO do {} while (0) -+ #define RTW_DBG do {} while (0) -+ #define RTW_PRINT_SEL do {} while (0) -+ #define _RTW_PRINT do {} while (0) -+ #define _RTW_ERR do {} while (0) -+ #define _RTW_WARN do {} while (0) -+ #define _RTW_INFO do {} while (0) -+ #define _RTW_DBG do {} while (0) -+ #define _RTW_PRINT_SEL do {} while (0) -+#else -+ #define RTW_PRINT(x, ...) do {} while (0) -+ #define RTW_ERR(x, ...) do {} while (0) -+ #define RTW_WARN(x,...) do {} while (0) -+ #define RTW_INFO(x,...) do {} while (0) -+ #define RTW_DBG(x,...) do {} while (0) -+ #define RTW_PRINT_SEL(x,...) do {} while (0) -+ #define _RTW_PRINT(x, ...) do {} while (0) -+ #define _RTW_ERR(x, ...) do {} while (0) -+ #define _RTW_WARN(x,...) do {} while (0) -+ #define _RTW_INFO(x,...) do {} while (0) -+ #define _RTW_DBG(x,...) do {} while (0) -+ #define _RTW_PRINT_SEL(x,...) do {} while (0) -+#endif ++#define RTW_PRINT(x, ...) do {} while (0) ++#define RTW_ERR(x, ...) do {} while (0) ++#define RTW_WARN(x,...) do {} while (0) ++#define RTW_INFO(x,...) do {} while (0) ++#define RTW_DBG(x,...) do {} while (0) ++#define RTW_PRINT_SEL(x,...) do {} while (0) ++#define _RTW_PRINT(x, ...) do {} while (0) ++#define _RTW_ERR(x, ...) do {} while (0) ++#define _RTW_WARN(x,...) do {} while (0) ++#define _RTW_INFO(x,...) do {} while (0) ++#define _RTW_DBG(x,...) do {} while (0) ++#define _RTW_PRINT_SEL(x,...) do {} while (0) + +#define RTW_INFO_DUMP(_TitleString, _HexData, _HexDataLen) do {} while (0) +#define RTW_DBG_DUMP(_TitleString, _HexData, _HexDataLen) do {} while (0) @@ -394901,20 +393911,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_debug.h linux-5.11.4-rtl8 + +#define RTW_DBGDUMP 0 /* 'stream' for _dbgdump */ + -+ -+ +#undef _dbgdump +#undef _seqdump + -+#if defined(PLATFORM_WINDOWS) && defined(PLATFORM_OS_XP) -+ #define _dbgdump DbgPrint -+ #define KERN_CONT -+ #define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg) -+#elif defined(PLATFORM_WINDOWS) && defined(PLATFORM_OS_CE) -+ #define _dbgdump rtl871x_cedbg -+ #define KERN_CONT -+ #define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg) -+#elif defined PLATFORM_LINUX ++#if defined PLATFORM_LINUX + #define _dbgdump printk + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) + #define KERN_CONT @@ -395484,9 +394484,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_debug.h linux-5.11.4-rtl8 +#define _module_rtl8712_led_c_ BIT(31) + +#endif /* __RTW_DEBUG_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_eeprom.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_eeprom.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_eeprom.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_eeprom.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_eeprom.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_eeprom.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_eeprom.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_eeprom.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,116 @@ +/****************************************************************************** + * @@ -395604,9 +394604,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_eeprom.h linux-5.11.4-rtl +#endif /* PLATFORM_LINUX */ + +#endif /* __RTL871X_EEPROM_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_efuse.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_efuse.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_efuse.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_efuse.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_efuse.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_efuse.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_efuse.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_efuse.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,255 @@ +/****************************************************************************** + * @@ -395863,9 +394863,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_efuse.h linux-5.11.4-rtl8 +#endif /* PLATFORM_LINUX */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_event.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_event.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_event.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_event.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_event.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_event.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_event.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_event.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,130 @@ +/****************************************************************************** + * @@ -395997,9 +394997,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_event.h linux-5.11.4-rtl8 + + +#endif /* _WLANEVENT_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ht.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ht.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ht.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ht.h 2021-03-07 18:16:17.089957707 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ht.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ht.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ht.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ht.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,217 @@ +/****************************************************************************** + * @@ -396218,10 +395218,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ht.h linux-5.11.4-rtl8812 +#define SET_HT_OP_ELE_PCO_PHASE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 5, 3, 1, _val) + +#endif /* _RTL871X_HT_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl.h 2021-03-07 18:16:17.090957755 +0200 -@@ -0,0 +1,319 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,127 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -396239,68 +395239,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl.h linux-5.11.4-rtl8 +#ifndef _RTW_IOCTL_H_ +#define _RTW_IOCTL_H_ + -+#ifndef PLATFORM_WINDOWS -+/* 00 - Success -+* 11 - Error */ -+#define STATUS_SUCCESS (0x00000000L) -+#define STATUS_PENDING (0x00000103L) -+ -+#define STATUS_UNSUCCESSFUL (0xC0000001L) -+#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) -+#define STATUS_NOT_SUPPORTED (0xC00000BBL) -+ -+#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) -+#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) -+#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) -+#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) -+#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) -+#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) -+ -+#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) -+#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) -+#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) -+#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) -+#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) -+#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) -+#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) -+#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) -+#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) -+#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) -+#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) -+#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) -+#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) -+#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) -+#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) -+#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) -+#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) -+#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) -+#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) -+#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) -+#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) -+#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) -+#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) -+#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) -+#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) -+#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) -+#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) -+#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) -+#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) -+#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) -+#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) -+#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) -+ -+#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) -+#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) -+#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) -+#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) -+#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) /* cause 27 */ -+#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) /* cause 35, 45 */ -+#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) /* cause 37 */ -+#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) /* cause 49 */ -+#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) /* cause 93 */ -+#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) /* cause 3 */ -+#endif /* #ifndef PLATFORM_WINDOWS */ -+ + +#ifndef OID_802_11_CAPABILITY + #define OID_802_11_CAPABILITY 0x0d010122 @@ -396372,143 +395310,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl.h linux-5.11.4-rtl8 +}; + +#if (defined(CONFIG_MP_INCLUDED) && defined(_RTW_MP_IOCTL_C_)) || \ -+ (defined(PLATFORM_WINDOWS) && defined(_RTW_IOCTL_RTL_C_)) ++ (defined(_RTW_IOCTL_RTL_C_)) +static NDIS_STATUS oid_null_function(struct oid_par_priv *poid_par_priv) +{ + return NDIS_STATUS_SUCCESS; +} +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+int TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE ndisPsMode); -+ -+/* OID Handler for Segment 1 */ -+NDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+/* OID Handler for Segment 2 */ -+NDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv *poid_par_priv); -+ -+/* OID Handler for Segment 3 */ -+NDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+/* OID Handler for Segment 4 */ -+NDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+ -+/* OID Handler for Segment 5 */ -+NDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+/* OID Handler for Segment 6 */ -+NDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+ -+/* OID Handler for Segment 7 */ -+NDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+ -+/* OID Handler for Segment 8 */ -+NDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+ -+ -+ -+/* OID Handler for Segment 9 */ -+NDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv *poid_par_priv); -+NDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+/* OID Handler for Segment 10 */ -+NDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv *poid_par_priv); -+ -+ -+/* OID Handler for Segment ED */ -+NDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv *poid_par_priv); -+ -+void Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast); -+ -+#endif/* end of PLATFORM_WINDOWS */ -+ +#if defined(PLATFORM_LINUX) && defined(CONFIG_WIRELESS_EXT) +extern struct iw_handler_def rtw_handlers_def; +#endif @@ -396541,38 +395349,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl.h linux-5.11.4-rtl8 +#endif + +#endif /* #ifndef __INC_CEINFO_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_query.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_query.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_query.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_query.h 2021-03-07 18:16:17.090957755 +0200 -@@ -0,0 +1,25 @@ -+/****************************************************************************** -+ * -+ * Copyright(c) 2007 - 2017 Realtek Corporation. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ *****************************************************************************/ -+#ifndef _RTW_IOCTL_QUERY_H_ -+#define _RTW_IOCTL_QUERY_H_ -+ -+ -+#ifdef PLATFORM_WINDOWS -+u8 query_802_11_capability(_adapter *padapter, u8 *pucBuf, u32 *pulOutLen); -+u8 query_802_11_association_information(_adapter *padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo); -+#endif -+ -+ -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_rtl.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_rtl.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_rtl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_rtl.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl_rtl.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl_rtl.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl_rtl.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl_rtl.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,75 @@ +/****************************************************************************** + * @@ -396649,10 +395428,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_rtl.h linux-5.11.4- + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_set.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_set.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_set.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_ioctl_set.h 2021-03-07 18:16:17.090957755 +0200 -@@ -0,0 +1,67 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl_set.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl_set.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_ioctl_set.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_ioctl_set.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,45 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -396679,28 +395458,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_set.h linux-5.11.4- +} BSSIDInfo, *PBSSIDInfo; + + -+#ifdef PLATFORM_OS_XP -+typedef struct _NDIS_802_11_PMKID { -+ u32 Length; -+ u32 BSSIDInfoCount; -+ BSSIDInfo BSSIDInfo[1]; -+} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; -+#endif -+ -+ -+#ifdef PLATFORM_WINDOWS -+u8 rtw_set_802_11_reload_defaults(_adapter *padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults); -+u8 rtw_set_802_11_test(_adapter *padapter, NDIS_802_11_TEST *test); -+u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid); -+ -+u8 rtw_pnp_set_power_sleep(_adapter *padapter); -+u8 rtw_pnp_set_power_wakeup(_adapter *padapter); -+ -+void rtw_pnp_resume_wk(void *context); -+void rtw_pnp_sleep_wk(void *context); -+ -+#endif -+ +u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode); +u8 rtw_set_802_11_bssid(_adapter *padapter, u8 *bssid); +u8 rtw_set_802_11_add_wep(_adapter *padapter, NDIS_802_11_WEP *wep); @@ -396720,10 +395477,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_ioctl_set.h linux-5.11.4- +int rtw_set_band(_adapter *adapter, u8 band); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_io.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_io.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_io.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_io.h 2021-03-07 18:16:17.090957755 +0200 -@@ -0,0 +1,569 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_io.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_io.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_io.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_io.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,548 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -396744,9 +395501,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_io.h linux-5.11.4-rtl8812 + +#define NUM_IOREQ 8 + -+#ifdef PLATFORM_WINDOWS -+ #define MAX_PROT_SZ 64 -+#endif +#ifdef PLATFORM_LINUX + #define MAX_PROT_SZ (64-16) +#endif @@ -396867,27 +395621,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_io.h linux-5.11.4-rtl8812 + u8 *pbuf; + _sema sema; + -+#ifdef PLATFORM_OS_CE -+#ifdef CONFIG_USB_HCI -+ /* URB handler for rtw_write_mem */ -+ USB_TRANSFER usb_transfer_write_mem; -+#endif -+#endif + + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt); + u8 *cnxt; -+ -+#ifdef PLATFORM_OS_XP -+ PMDL pmdl; -+ PIRP pirp; -+ -+#ifdef CONFIG_SDIO_HCI -+ PSDBUS_REQUEST_PACKET sdrp; -+#endif -+ -+#endif -+ -+ +}; + +struct intf_hdl { @@ -397293,9 +396029,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_io.h linux-5.11.4-rtl8812 + rtw_read32(_a, _b) + +#endif /* _RTL8711_IO_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_iol.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_iol.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_iol.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_iol.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_iol.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_iol.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_iol.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_iol.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,131 @@ +/****************************************************************************** + * @@ -397428,9 +396164,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_iol.h linux-5.11.4-rtl881 + + +#endif /* __RTW_IOL_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mcc.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mcc.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mcc.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mcc.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mcc.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mcc.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mcc.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mcc.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,271 @@ +/****************************************************************************** + * @@ -397703,9 +396439,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mcc.h linux-5.11.4-rtl881 +u8 rtw_set_mcc_duration_cmd(_adapter *adapter, u8 type, u8 val); +#endif /* _RTW_MCC_H_ */ +#endif /* CONFIG_MCC_MODE */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mem.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mem.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mem.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mem.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mem.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mem.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mem.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mem.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,36 @@ +/****************************************************************************** + * @@ -397743,9 +396479,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mem.h linux-5.11.4-rtl881 + + +#endif /* __RTW_MEM_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mi.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mi.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mi.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mi.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mi.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mi.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mi.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,306 @@ +/****************************************************************************** + * @@ -398053,9 +396789,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mi.h linux-5.11.4-rtl8812 +void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b); + +#endif /*__RTW_MI_H_*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme_ext.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mlme_ext.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme_ext.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mlme_ext.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mlme_ext.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mlme_ext.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mlme_ext.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mlme_ext.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,1311 @@ +/****************************************************************************** + * @@ -399368,9 +398104,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme_ext.h linux-5.11.4-r +#endif/* _RTW_MLME_EXT_C_ */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mlme.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mlme.h 2021-03-07 18:16:17.090957755 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mlme.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mlme.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mlme.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mlme.h 2022-01-28 22:59:35.625654787 +0200 @@ -0,0 +1,1427 @@ +/****************************************************************************** + * @@ -400799,10 +399535,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mlme.h linux-5.11.4-rtl88 +#define GET_TCP_CWR(_tcphdr) BE_BITS_TO_1BYTE(((u8 *)(_tcphdr)) + 13, 7, 1) + +#endif /* __RTL871X_MLME_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp.h 2021-03-07 18:16:17.090957755 +0200 -@@ -0,0 +1,938 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp.h 2022-12-18 17:40:24.575937030 +0200 +@@ -0,0 +1,894 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -400844,14 +399580,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h linux-5.11.4-rtl8812 + u8 *mem_addr; + u32 sz[8]; + -+#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) ++#if defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; +#endif + -+#ifdef PLATFORM_OS_XP -+ PIRP pxmit_irp[8]; -+#endif -+ + u8 bpending[8]; + sint ac_tag[8]; + sint last[8]; @@ -400871,21 +399603,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h linux-5.11.4-rtl8812 + +typedef void(*wi_act_func)(void *padapter); + -+#ifdef PLATFORM_WINDOWS -+struct mp_wi_cntx { -+ u8 bmpdrv_unload; -+ -+ /* Work Item */ -+ NDIS_WORK_ITEM mp_wi; -+ NDIS_EVENT mp_wi_evt; -+ _lock mp_wi_lock; -+ u8 bmp_wi_progress; -+ wi_act_func curractfunc; -+ /* Variable needed in each implementation of CurrActFunc. */ -+ struct mp_wiparam param; -+}; -+#endif -+ +struct mp_tx { + u8 stop; + u32 count, sended; @@ -401188,31 +399905,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h linux-5.11.4-rtl8812 + struct wlan_network mp_network; + NDIS_802_11_MAC_ADDRESS network_macaddr; + -+#ifdef PLATFORM_WINDOWS -+ u32 rx_testcnt; -+ u32 rx_testcnt1; -+ u32 rx_testcnt2; -+ u32 tx_testcnt; -+ u32 tx_testcnt1; -+ -+ struct mp_wi_cntx wi_cntx; -+ -+ u8 h2c_result; -+ u8 h2c_seqnum; -+ u16 h2c_cmdcode; -+ u8 h2c_resp_parambuf[512]; -+ _lock h2c_lock; -+ _lock wkitm_lock; -+ u32 h2c_cmdcnt; -+ NDIS_EVENT h2c_cmd_evt; -+ NDIS_EVENT c2h_set; -+ NDIS_EVENT h2c_clr; -+ NDIS_EVENT cpwm_int; -+ -+ NDIS_EVENT scsir_full_evt; -+ NDIS_EVENT scsiw_empty_evt; -+#endif -+ + u8 *pallocated_mp_xmitframe_buf; + u8 *pmp_xmtframe_buf; + _queue free_mp_xmitqueue; @@ -401741,10 +400433,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp.h linux-5.11.4-rtl8812 + struct iw_request_info *info, + struct iw_point *wrqu, char *extra); +#endif /* _RTW_MP_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_ioctl.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp_ioctl.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_ioctl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp_ioctl.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1,570 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp_ioctl.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp_ioctl.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp_ioctl.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp_ioctl.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,553 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -401820,24 +400512,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_ioctl.h linux-5.11.4-r +/* int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid); */ + +/* void _irqlevel_changed_(_irqL *irqlevel, BOOLEANunsigned char bLower); */ -+#ifdef PLATFORM_OS_XP -+static void _irqlevel_changed_(_irqL *irqlevel, u8 bLower) -+{ -+ -+ if (bLower == LOWER) { -+ *irqlevel = KeGetCurrentIrql(); -+ -+ if (*irqlevel > PASSIVE_LEVEL) -+ KeLowerIrql(PASSIVE_LEVEL); -+ } else { -+ if (KeGetCurrentIrql() == PASSIVE_LEVEL) -+ KeRaiseIrql(DISPATCH_LEVEL, irqlevel); -+ } -+ -+} -+#else +#define _irqlevel_changed_(a, b) -+#endif + +/* oid_rtl_seg_81_80_00 */ +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv); @@ -402315,9 +400990,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_ioctl.h linux-5.11.4-r +#endif /* _RTW_MP_IOCTL_C_ */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_phy_regdef.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp_phy_regdef.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_phy_regdef.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_mp_phy_regdef.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp_phy_regdef.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp_phy_regdef.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_mp_phy_regdef.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_mp_phy_regdef.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,1094 @@ +/****************************************************************************** + * @@ -403413,9 +402088,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_mp_phy_regdef.h linux-5.1 + + +#endif /* __INC_HAL8192SPHYREG_H */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_odm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_odm.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_odm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_odm.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_odm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_odm.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_odm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_odm.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,97 @@ +/****************************************************************************** + * @@ -403514,9 +402189,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_odm.h linux-5.11.4-rtl881 +void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys); + +#endif /* __RTW_ODM_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_p2p.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_p2p.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_p2p.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_p2p.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_p2p.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_p2p.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_p2p.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_p2p.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,169 @@ +/****************************************************************************** + * @@ -403687,9 +402362,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_p2p.h linux-5.11.4-rtl881 +#endif /* CONFIG_P2P */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_pwrctrl.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_pwrctrl.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_pwrctrl.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_pwrctrl.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_pwrctrl.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_pwrctrl.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_pwrctrl.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_pwrctrl.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,609 @@ +/****************************************************************************** + * @@ -404300,9 +402975,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_pwrctrl.h linux-5.11.4-rt +void rtw_ssmps_enter(_adapter *adapter, struct sta_info *sta); +void rtw_ssmps_leave(_adapter *adapter, struct sta_info *sta); +#endif /* __RTL871X_PWRCTRL_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_qos.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_qos.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_qos.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_qos.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_qos.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_qos.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_qos.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_qos.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,66 @@ +/****************************************************************************** + * @@ -404371,10 +403046,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_qos.h linux-5.11.4-rtl881 + +#endif /* _RTL871X_QOS_H_ */ \ Ingen nyrad vid filslut -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_recv.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_recv.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1,886 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_recv.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_recv.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_recv.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_recv.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,852 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -404396,19 +403071,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl88 +#define RTW_RX_MSDU_ACT_INDICATE BIT0 +#define RTW_RX_MSDU_ACT_FORWARD BIT1 + -+#ifdef PLATFORM_OS_XP -+ #ifdef CONFIG_SDIO_HCI -+ #define NR_RECVBUFF 1024/* 512 */ /* 128 */ -+ #else -+ #define NR_RECVBUFF (16) -+ #endif -+#elif defined(PLATFORM_OS_CE) -+ #ifdef CONFIG_SDIO_HCI -+ #define NR_RECVBUFF (128) -+ #else -+ #define NR_RECVBUFF (4) -+ #endif -+#else /* PLATFORM_LINUX /PLATFORM_BSD */ + +#include + @@ -404432,7 +403094,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl88 + #ifdef CONFIG_RTW_NAPI + #define RTL_NAPI_WEIGHT (32) + #endif -+#endif + +#if defined(CONFIG_RTL8821C) && defined(CONFIG_SDIO_HCI) && defined(CONFIG_RECV_THREAD_MODE) + #ifdef NR_RECVBUFF @@ -404731,17 +403392,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl88 + + _adapter *adapter; + -+#ifdef PLATFORM_WINDOWS -+ _nic_hdl RxPktPoolHdl; -+ _nic_hdl RxBufPoolHdl; -+ -+#ifdef PLATFORM_OS_XP -+ PMDL pbytecnt_mdl; -+#endif -+ uint counter; /* record the number that up-layer will return to drv; only when counter==0 can we release recv_priv */ -+ NDIS_EVENT recv_resource_evt ; -+#endif -+ + + u32 is_any_non_be_pkts; + @@ -404910,20 +403560,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl88 + +#ifdef CONFIG_USB_HCI + -+#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) ++#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) + PURB purb; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ + u32 alloc_sz; +#endif -+ -+#ifdef PLATFORM_OS_XP -+ PIRP pirp; -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ USB_TRANSFER usb_transfer_read_port; -+#endif -+ + u8 irp_pending; + int transfer_len; + @@ -405261,9 +403902,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_recv.h linux-5.11.4-rtl88 +void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info *sta); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_rf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rf.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rf.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,240 @@ +/****************************************************************************** + * @@ -405505,9 +404146,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rf.h linux-5.11.4-rtl8812 +bool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset, u8 dfs_region); + +#endif /* _RTL8711_RF_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm_fsm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rm_fsm.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm_fsm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rm_fsm.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rm_fsm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rm_fsm.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rm_fsm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rm_fsm.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,389 @@ + +/****************************************************************************** @@ -405898,9 +404539,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm_fsm.h linux-5.11.4-rtl + +#endif /*CONFIG_RTW_80211K*/ +#endif /*__RTW_RM_FSM_H_*/ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rm.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rm.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rm.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rm.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rm.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rm.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,88 @@ +/****************************************************************************** + * @@ -405990,9 +404631,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rm.h linux-5.11.4-rtl8812 + +#endif /*CONFIG_RTW_80211K */ +#endif /* __RTW_RM_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rson.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rson.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_rson.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_rson.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rson.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rson.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_rson.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_rson.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,61 @@ +/****************************************************************************** + * @@ -406055,9 +404696,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_rson.h linux-5.11.4-rtl88 +u8 rtw_rson_scan_wk_cmd(_adapter *padapter, int op); +void rtw_rson_scan_cmd_hdl(_adapter *padapter, int op); +#endif /* __RTW_RSON_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_sdio.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_sdio.h 2022-01-28 22:59:35.626654834 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -406085,10 +404726,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_sdio.h linux-5.11.4-rtl88 +u8 rtw_sdio_f0_read(struct dvobj_priv *, u32 addr, void *buf, size_t len); + +#endif /* _RTW_SDIO_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_security.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_security.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_security.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_security.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1,502 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_security.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_security.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_security.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_security.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,499 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -406285,9 +404926,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_security.h linux-5.11.4-r + u32 ndisencryptstatus; /* NDIS_802_11_ENCRYPTION_STATUS */ + + NDIS_802_11_WEP ndiswep; -+#ifdef PLATFORM_WINDOWS -+ u8 KeyMaterial[16];/* variable length depending on above field. */ -+#endif + + u8 assoc_info[600]; + u8 szofcapability[256]; /* for wpa2 usage */ @@ -406591,9 +405229,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_security.h linux-5.11.4-r + ((a)->securitypriv.auth_type == (s)) + +#endif /* __RTL871X_SECURITY_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_sreset.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_sreset.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_sreset.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_sreset.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_sreset.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_sreset.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_sreset.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_sreset.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,66 @@ +/****************************************************************************** + * @@ -406661,9 +405299,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_sreset.h linux-5.11.4-rtl +void sreset_reset(_adapter *padapter); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_tdls.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_tdls.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_tdls.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_tdls.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_tdls.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_tdls.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_tdls.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_tdls.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,185 @@ +/****************************************************************************** + * @@ -406850,9 +405488,194 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_tdls.h linux-5.11.4-rtl88 +#endif /* CONFIG_TDLS */ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_wapi.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_wapi.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_wapi.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_wapi.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_version.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_version.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_version.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_version.h 2022-01-28 22:59:35.627654881 +0200 +@@ -0,0 +1 @@ ++#define DRIVERVERSION "v5.6.4.2_35491.20191025" +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_vht.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_vht.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_vht.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_vht.h 2022-01-28 22:59:35.627654881 +0200 +@@ -0,0 +1,176 @@ ++/****************************************************************************** ++ * ++ * Copyright(c) 2007 - 2017 Realtek Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of version 2 of the GNU General Public License as ++ * published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ *****************************************************************************/ ++#ifndef _RTW_VHT_H_ ++#define _RTW_VHT_H_ ++ ++#define VHT_CAP_IE_LEN 12 ++#define VHT_OP_IE_LEN 5 ++ ++#define LDPC_VHT_ENABLE_RX BIT0 ++#define LDPC_VHT_ENABLE_TX BIT1 ++#define LDPC_VHT_TEST_TX_ENABLE BIT2 ++#define LDPC_VHT_CAP_TX BIT3 ++ ++#define STBC_VHT_ENABLE_RX BIT0 ++#define STBC_VHT_ENABLE_TX BIT1 ++#define STBC_VHT_TEST_TX_ENABLE BIT2 ++#define STBC_VHT_CAP_TX BIT3 ++ ++/* VHT capability info */ ++#define SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val) ++#define SET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 2, 2, _val) ++#define SET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 5, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 6, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 0, 3, _val) ++#define SET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 3, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 4, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 5, 3, _val) ++#define SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 0, 3, _val) ++ ++#define SET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 3, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 4, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 5, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_HTC_VHT(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 1, _val) ++#define SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+2, 7, 3, _val) /* B23~B25 */ ++#define SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 2, 2, _val) ++#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+4, 0, 16, _val) /* B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page */ ++#define SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+6, 0, 13, _val) ++#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+8, 0, 16, _val) /* B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page */ ++#define SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+10, 0, 13, _val) ++ ++ ++#define GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2) ++#define GET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 2, 2) ++#define GET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 1) ++#define GET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 5, 1) ++#define GET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 6, 1) ++#define GET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1) ++#define GET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 3) ++#define GET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 3, 1) ++#define GET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 4, 1) ++/*phydm-beamforming*/ ++#define GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+1, 5, 3) ++#define GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 0, 3) ++#define GET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 3, 1) ++#define GET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 4, 1) ++#define GET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 5, 1) ++#define GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 7, 3) ++#define GET_VHT_CAPABILITY_ELE_RX_MCS(_pEleStart) ((_pEleStart)+4) ++#define GET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+6, 0, 13) ++#define GET_VHT_CAPABILITY_ELE_TX_MCS(_pEleStart) ((_pEleStart)+8) ++#define GET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+10, 0, 13) ++ ++ ++/* VHT Operation Information Element */ ++#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 8, _val) ++#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart+1, 0, 8, _val) ++#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart+2, 0, 8, _val) ++#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+3, 0, 16, _val) ++ ++#define GET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 8) ++#define GET_VHT_OPERATION_ELE_CENTER_FREQ1(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 8) ++#define GET_VHT_OPERATION_ELE_CENTER_FREQ2(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 0, 8) ++ ++/* VHT Operating Mode */ ++#define SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val) ++#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 3, _val) ++#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val) ++#define GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2) ++#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 3) ++#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1) ++ ++#define SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+7, 6, 1, _val) ++#define GET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+7, 6, 1) ++ ++#define VHT_MAX_MPDU_LEN_MAX 3 ++extern const u16 _vht_max_mpdu_len[]; ++#define vht_max_mpdu_len(val) (((val) >= VHT_MAX_MPDU_LEN_MAX) ? _vht_max_mpdu_len[VHT_MAX_MPDU_LEN_MAX] : _vht_max_mpdu_len[(val)]) ++ ++#define VHT_SUP_CH_WIDTH_SET_MAX 3 ++extern const u8 _vht_sup_ch_width_set_to_bw_cap[]; ++#define vht_sup_ch_width_set_to_bw_cap(set) (((set) >= VHT_SUP_CH_WIDTH_SET_MAX) ? _vht_sup_ch_width_set_to_bw_cap[VHT_SUP_CH_WIDTH_SET_MAX] : _vht_sup_ch_width_set_to_bw_cap[(set)]) ++extern const char *const _vht_sup_ch_width_set_str[]; ++#define vht_sup_ch_width_set_str(set) (((set) >= VHT_SUP_CH_WIDTH_SET_MAX) ? _vht_sup_ch_width_set_str[VHT_SUP_CH_WIDTH_SET_MAX] : _vht_sup_ch_width_set_str[(set)]) ++ ++#define VHT_MAX_AMPDU_LEN(f) ((1 << (13 + f)) - 1) ++void dump_vht_cap_ie(void *sel, const u8 *ie, u32 ie_len); ++ ++#define VHT_OP_CH_WIDTH_MAX 4 ++extern const char *const _vht_op_ch_width_str[]; ++#define vht_op_ch_width_str(ch_width) (((ch_width) >= VHT_OP_CH_WIDTH_MAX) ? _vht_op_ch_width_str[VHT_OP_CH_WIDTH_MAX] : _vht_op_ch_width_str[(ch_width)]) ++ ++void dump_vht_op_ie(void *sel, const u8 *ie, u32 ie_len); ++ ++struct vht_priv { ++ u8 vht_option; ++ ++ u8 ldpc_cap; ++ u8 stbc_cap; ++ u16 beamform_cap; ++ u8 ap_is_mu_bfer; ++ ++ u8 sgi_80m;/* short GI */ ++ u8 ampdu_len; ++ ++ u8 vht_highest_rate; ++ u8 vht_mcs_map[2]; ++ ++ u8 op_present:1; /* vht_op is present */ ++ u8 notify_present:1; /* vht_op_mode_notify is present */ ++ ++ u8 vht_cap[32]; ++ u8 vht_op[VHT_OP_IE_LEN]; ++ u8 vht_op_mode_notify; ++}; ++ ++#ifdef ROKU_PRIVATE ++struct vht_priv_infra_ap { ++ ++ /* Infra mode, only store for AP's info, not intersection of STA and AP*/ ++ u8 ldpc_cap_infra_ap; ++ u8 stbc_cap_infra_ap; ++ u16 beamform_cap_infra_ap; ++ u8 vht_mcs_map_infra_ap[2]; ++ u8 vht_mcs_map_tx_infra_ap[2]; ++ u8 channel_width_infra_ap; ++ u8 number_of_streams_infra_ap; ++}; ++#endif /* ROKU_PRIVATE */ ++ ++u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map); ++u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate); ++u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss); ++void rtw_vht_use_default_setting(_adapter *padapter); ++u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel); ++u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw); ++u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf); ++void update_sta_vht_info_apmode(_adapter *padapter, PVOID psta); ++void update_hw_vht_param(_adapter *padapter); ++void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); ++#ifdef ROKU_PRIVATE ++void VHT_caps_handler_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); ++#endif /* ROKU_PRIVATE */ ++void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); ++void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta); ++u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); ++void VHTOnAssocRsp(_adapter *padapter); ++u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map); ++void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map); ++void rtw_vht_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pcur_network); ++void rtw_vht_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pcur_network); ++void rtw_check_for_vht20(_adapter *adapter, u8 *ies, int ies_len); ++#endif /* _RTW_VHT_H_ */ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_wapi.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_wapi.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_wapi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_wapi.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,230 @@ +/****************************************************************************** + * @@ -407084,194 +405907,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_wapi.h linux-5.11.4-rtl88 +void rtw_wapi_set_set_encryption(_adapter *padapter, struct ieee_param *param); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_version.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_version.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_version.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_version.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1 @@ -+#define DRIVERVERSION "v5.6.4.2_35491.20191025" -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_vht.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_vht.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_vht.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_vht.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1,176 @@ -+/****************************************************************************** -+ * -+ * Copyright(c) 2007 - 2017 Realtek Corporation. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ *****************************************************************************/ -+#ifndef _RTW_VHT_H_ -+#define _RTW_VHT_H_ -+ -+#define VHT_CAP_IE_LEN 12 -+#define VHT_OP_IE_LEN 5 -+ -+#define LDPC_VHT_ENABLE_RX BIT0 -+#define LDPC_VHT_ENABLE_TX BIT1 -+#define LDPC_VHT_TEST_TX_ENABLE BIT2 -+#define LDPC_VHT_CAP_TX BIT3 -+ -+#define STBC_VHT_ENABLE_RX BIT0 -+#define STBC_VHT_ENABLE_TX BIT1 -+#define STBC_VHT_TEST_TX_ENABLE BIT2 -+#define STBC_VHT_CAP_TX BIT3 -+ -+/* VHT capability info */ -+#define SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val) -+#define SET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 2, 2, _val) -+#define SET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 5, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 6, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 0, 3, _val) -+#define SET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 3, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 4, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+1, 5, 3, _val) -+#define SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 0, 3, _val) -+ -+#define SET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 3, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 4, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 5, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_HTC_VHT(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 1, _val) -+#define SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+2, 7, 3, _val) /* B23~B25 */ -+#define SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 2, 2, _val) -+#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+4, 0, 16, _val) /* B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page */ -+#define SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+6, 0, 13, _val) -+#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+8, 0, 16, _val) /* B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page */ -+#define SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+10, 0, 13, _val) -+ -+ -+#define GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2) -+#define GET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 2, 2) -+#define GET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 1) -+#define GET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 5, 1) -+#define GET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 6, 1) -+#define GET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1) -+#define GET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 3) -+#define GET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 3, 1) -+#define GET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 4, 1) -+/*phydm-beamforming*/ -+#define GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+1, 5, 3) -+#define GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 0, 3) -+#define GET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 3, 1) -+#define GET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 4, 1) -+#define GET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 5, 1) -+#define GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+2, 7, 3) -+#define GET_VHT_CAPABILITY_ELE_RX_MCS(_pEleStart) ((_pEleStart)+4) -+#define GET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+6, 0, 13) -+#define GET_VHT_CAPABILITY_ELE_TX_MCS(_pEleStart) ((_pEleStart)+8) -+#define GET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart) LE_BITS_TO_2BYTE((_pEleStart)+10, 0, 13) -+ -+ -+/* VHT Operation Information Element */ -+#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 8, _val) -+#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart+1, 0, 8, _val) -+#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart+2, 0, 8, _val) -+#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val) SET_BITS_TO_LE_2BYTE((_pEleStart)+3, 0, 16, _val) -+ -+#define GET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 8) -+#define GET_VHT_OPERATION_ELE_CENTER_FREQ1(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 8) -+#define GET_VHT_OPERATION_ELE_CENTER_FREQ2(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+2, 0, 8) -+ -+/* VHT Operating Mode */ -+#define SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val) -+#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 4, 3, _val) -+#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart, _val) SET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val) -+#define GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 0, 2) -+#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 4, 3) -+#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart) LE_BITS_TO_1BYTE(_pEleStart, 7, 1) -+ -+#define SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart, _val) SET_BITS_TO_LE_1BYTE((_pEleStart)+7, 6, 1, _val) -+#define GET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+7, 6, 1) -+ -+#define VHT_MAX_MPDU_LEN_MAX 3 -+extern const u16 _vht_max_mpdu_len[]; -+#define vht_max_mpdu_len(val) (((val) >= VHT_MAX_MPDU_LEN_MAX) ? _vht_max_mpdu_len[VHT_MAX_MPDU_LEN_MAX] : _vht_max_mpdu_len[(val)]) -+ -+#define VHT_SUP_CH_WIDTH_SET_MAX 3 -+extern const u8 _vht_sup_ch_width_set_to_bw_cap[]; -+#define vht_sup_ch_width_set_to_bw_cap(set) (((set) >= VHT_SUP_CH_WIDTH_SET_MAX) ? _vht_sup_ch_width_set_to_bw_cap[VHT_SUP_CH_WIDTH_SET_MAX] : _vht_sup_ch_width_set_to_bw_cap[(set)]) -+extern const char *const _vht_sup_ch_width_set_str[]; -+#define vht_sup_ch_width_set_str(set) (((set) >= VHT_SUP_CH_WIDTH_SET_MAX) ? _vht_sup_ch_width_set_str[VHT_SUP_CH_WIDTH_SET_MAX] : _vht_sup_ch_width_set_str[(set)]) -+ -+#define VHT_MAX_AMPDU_LEN(f) ((1 << (13 + f)) - 1) -+void dump_vht_cap_ie(void *sel, const u8 *ie, u32 ie_len); -+ -+#define VHT_OP_CH_WIDTH_MAX 4 -+extern const char *const _vht_op_ch_width_str[]; -+#define vht_op_ch_width_str(ch_width) (((ch_width) >= VHT_OP_CH_WIDTH_MAX) ? _vht_op_ch_width_str[VHT_OP_CH_WIDTH_MAX] : _vht_op_ch_width_str[(ch_width)]) -+ -+void dump_vht_op_ie(void *sel, const u8 *ie, u32 ie_len); -+ -+struct vht_priv { -+ u8 vht_option; -+ -+ u8 ldpc_cap; -+ u8 stbc_cap; -+ u16 beamform_cap; -+ u8 ap_is_mu_bfer; -+ -+ u8 sgi_80m;/* short GI */ -+ u8 ampdu_len; -+ -+ u8 vht_highest_rate; -+ u8 vht_mcs_map[2]; -+ -+ u8 op_present:1; /* vht_op is present */ -+ u8 notify_present:1; /* vht_op_mode_notify is present */ -+ -+ u8 vht_cap[32]; -+ u8 vht_op[VHT_OP_IE_LEN]; -+ u8 vht_op_mode_notify; -+}; -+ -+#ifdef ROKU_PRIVATE -+struct vht_priv_infra_ap { -+ -+ /* Infra mode, only store for AP's info, not intersection of STA and AP*/ -+ u8 ldpc_cap_infra_ap; -+ u8 stbc_cap_infra_ap; -+ u16 beamform_cap_infra_ap; -+ u8 vht_mcs_map_infra_ap[2]; -+ u8 vht_mcs_map_tx_infra_ap[2]; -+ u8 channel_width_infra_ap; -+ u8 number_of_streams_infra_ap; -+}; -+#endif /* ROKU_PRIVATE */ -+ -+u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map); -+u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate); -+u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss); -+void rtw_vht_use_default_setting(_adapter *padapter); -+u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel); -+u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw); -+u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf); -+void update_sta_vht_info_apmode(_adapter *padapter, PVOID psta); -+void update_hw_vht_param(_adapter *padapter); -+void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -+#ifdef ROKU_PRIVATE -+void VHT_caps_handler_infra_ap(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -+#endif /* ROKU_PRIVATE */ -+void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -+void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta); -+u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); -+void VHTOnAssocRsp(_adapter *padapter); -+u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map); -+void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map); -+void rtw_vht_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pcur_network); -+void rtw_vht_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pcur_network); -+void rtw_check_for_vht20(_adapter *adapter, u8 *ies, int ies_len); -+#endif /* _RTW_VHT_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_wifi_regd.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_wifi_regd.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_wifi_regd.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_wifi_regd.h 2021-03-07 18:16:17.091957802 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_wifi_regd.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_wifi_regd.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_wifi_regd.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_wifi_regd.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,34 @@ +/****************************************************************************** + * @@ -407307,10 +405945,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_wifi_regd.h linux-5.11.4- +int rtw_regd_init(struct wiphy *wiphy); + +#endif /* __RTW_WIFI_REGD_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_xmit.h ---- linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/rtw_xmit.h 2021-03-07 18:16:17.091957802 +0200 -@@ -0,0 +1,1072 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/rtw_xmit.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_xmit.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/rtw_xmit.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/rtw_xmit.h 2023-05-26 22:35:36.545136899 +0300 +@@ -0,0 +1,1045 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -407373,10 +406011,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 +#endif + #define NR_XMITBUFF (128) +#endif -+ -+#ifdef PLATFORM_OS_CE -+ #define XMITBUF_ALIGN_SZ 4 -+#else + #ifdef CONFIG_PCI_HCI + #define XMITBUF_ALIGN_SZ 4 + #else @@ -407385,7 +406019,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + #else + #define XMITBUF_ALIGN_SZ 512 + #endif -+ #endif +#endif + +/* xmit extension buff defination */ @@ -407907,19 +406540,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + u8 bulkout_id; /* for halmac */ +#endif /* RTW_HALMAC */ + -+#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) ++#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) + PURB pxmit_urb[8]; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ +#endif -+ -+#ifdef PLATFORM_OS_XP -+ PIRP pxmit_irp[8]; -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ USB_TRANSFER usb_transfer_write_port; -+#endif -+ + u8 bpending[8]; + + sint last[8]; @@ -407934,11 +406558,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + u32 ff_hwaddr; + u8 pg_num; + u8 agg_num; -+#ifdef PLATFORM_OS_XP -+ PMDL pxmitbuf_mdl; -+ PIRP pxmitbuf_irp; -+ PSDBUS_REQUEST_PACKET pxmitbuf_sdrp; -+#endif +#endif + +#ifdef CONFIG_PCI_HCI @@ -407952,10 +406571,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 +#if defined(DBG_XMIT_BUF) || defined(DBG_XMIT_BUF_EXT) + u8 no; +#endif -+ +}; + -+ +struct xmit_frame { + _list list; + @@ -408004,7 +406621,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + sint option; + sint apsd_setting; /* When bit mask is on, the associated edca queue supports APSD. */ + -+ + /* struct tx_servq blk_q[MAX_NUMBLKS]; */ + struct tx_servq be_q; /* priority == 0,3 */ + struct tx_servq bk_q; /* priority == 1,2 */ @@ -408019,7 +406635,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + /* u64 sta_tx_pkts; */ + /* uint sta_tx_fail; */ + -+ +}; + + @@ -408105,10 +406720,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 + _sema tx_retevt;/* all tx return event; */ + u8 txirp_cnt; + -+#ifdef PLATFORM_OS_CE -+ USB_TRANSFER usb_transfer_write_port; -+ /* USB_TRANSFER usb_transfer_write_mem; */ -+#endif +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif @@ -408383,9 +406994,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/rtw_xmit.h linux-5.11.4-rtl88 +#include + +#endif /* _RTL871X_XMIT_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_hal.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/sdio_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/sdio_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_hal.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,57 @@ +/****************************************************************************** + * @@ -408444,63 +407055,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_hal.h linux-5.11.4-rtl88 +#endif + +#endif /* __SDIO_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_ce.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_ce.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_ce.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_ce.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,49 @@ -+/****************************************************************************** -+ * -+ * Copyright(c) 2007 - 2017 Realtek Corporation. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ *****************************************************************************/ -+#ifndef _SDIO_OPS_WINCE_H_ -+#define _SDIO_OPS_WINCE_H_ -+ -+#include -+#include -+#include -+#include -+ -+ -+#ifdef PLATFORM_OS_CE -+ -+ -+extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); -+ -+ -+extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); -+ -+ -+uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+ -+extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+ -+ -+extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf, u8 async); -+ -+extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); -+extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); -+extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt, void *pdata); -+extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt, void *pdata); -+extern void sdio_read_int(_adapter *padapter, u32 addr, u8 sz, void *pdata); -+ -+#endif -+ -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,224 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/sdio_ops.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_ops.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/sdio_ops.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_ops.h 2023-05-26 22:35:36.546136899 +0300 +@@ -0,0 +1,206 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -408528,24 +407086,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops.h linux-5.11.4-rtl88 +#include +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+#ifdef PLATFORM_OS_XP -+#include -+struct async_context { -+ PMDL pmdl; -+ PSDBUS_REQUEST_PACKET sdrp; -+ unsigned char *r_buf; -+ unsigned char *padapter; -+}; -+#endif -+ -+#ifdef PLATFORM_OS_CE -+#include -+#endif -+ -+#endif /* PLATFORM_WINDOWS */ -+ + +extern void sdio_set_intf_ops(_adapter *padapter, struct _io_ops *pops); +void dump_sdio_card_info(void *sel, struct dvobj_priv *dvobj); @@ -408725,9 +407265,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops.h linux-5.11.4-rtl88 +} + +#endif /* !__SDIO_OPS_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_linux.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_linux.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_linux.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/sdio_ops_linux.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_ops_linux.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/sdio_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_ops_linux.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,58 @@ +/****************************************************************************** + * @@ -408787,63 +407327,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_linux.h linux-5.11.4 + +#endif /* __SDIO_OPS_LINUX_H__ */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_xp.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_xp.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_ops_xp.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_ops_xp.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,49 @@ -+/****************************************************************************** -+ * -+ * Copyright(c) 2007 - 2017 Realtek Corporation. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of version 2 of the GNU General Public License as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ *****************************************************************************/ -+#ifndef _SDIO_OPS_XP_H_ -+#define _SDIO_OPS_XP_H_ -+ -+#include -+#include -+#include -+#include -+ -+ -+#ifdef PLATFORM_OS_XP -+ -+ -+extern u8 sdbus_cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); -+ -+ -+extern void sdbus_cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8); -+ -+ -+uint sdbus_read_blocks_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+ -+extern uint sdbus_read_bytes_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+ -+ -+extern uint sdbus_write_blocks_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf, u8 async); -+ -+extern uint sdbus_write_bytes_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -+extern u8 sdbus_func1cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); -+extern void sdbus_func1cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8); -+extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt, void *pdata); -+extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt, void *pdata); -+extern void sdio_read_int(_adapter *padapter, u32 addr, u8 sz, void *pdata); -+ -+#endif -+ -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_osintf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_osintf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sdio_osintf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sdio_osintf.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,25 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/sdio_osintf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_osintf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/sdio_osintf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sdio_osintf.h 2023-05-26 22:35:36.546136899 +0300 +@@ -0,0 +1,18 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -408861,17 +407348,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sdio_osintf.h linux-5.11.4-rt +#ifndef __SDIO_OSINTF_H__ +#define __SDIO_OSINTF_H__ + -+ -+#ifdef PLATFORM_OS_CE -+extern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter); -+SD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter); -+extern void sd_setup_irs(PADAPTER padapter); +#endif -+ -+#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sta_info.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sta_info.h ---- linux-5.11.4/3rdparty/rtl8812au/include/sta_info.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/sta_info.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/sta_info.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sta_info.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/sta_info.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/sta_info.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,748 @@ +/****************************************************************************** + * @@ -409621,9 +408101,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/sta_info.h linux-5.11.4-rtl88 +#endif /* CONFIG_RTW_PRE_LINK_STA */ + +#endif /* _STA_INFO_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_hal.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_hal.h ---- linux-5.11.4/3rdparty/rtl8812au/include/usb_hal.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_hal.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/usb_hal.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_hal.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/usb_hal.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_hal.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,74 @@ +/****************************************************************************** + * @@ -409699,9 +408179,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_hal.h linux-5.11.4-rtl881 +extern _adapter *rtw_usb_get_sw_pointer(void); +#endif /* CONFIG_INTEL_PROXIM */ +#endif /* __USB_HAL_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_ops.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_ops.h ---- linux-5.11.4/3rdparty/rtl8812au/include/usb_ops.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_ops.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/usb_ops.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_ops.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/usb_ops.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_ops.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,153 @@ +/****************************************************************************** + * @@ -409856,9 +408336,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_ops.h linux-5.11.4-rtl881 + + +#endif /* __USB_OPS_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_ops_linux.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_ops_linux.h ---- linux-5.11.4/3rdparty/rtl8812au/include/usb_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_ops_linux.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/usb_ops_linux.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_ops_linux.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/usb_ops_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_ops_linux.h 2023-05-26 22:35:36.546136899 +0300 @@ -0,0 +1,98 @@ +/****************************************************************************** + * @@ -409951,16 +408431,16 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_ops_linux.h linux-5.11.4- +int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val); +int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem); -+void usb_recv_tasklet(void *priv); ++void usb_recv_tasklet(unsigned long priv); + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs); +u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr); +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_osintf.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_osintf.h ---- linux-5.11.4/3rdparty/rtl8812au/include/usb_osintf.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_osintf.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/usb_osintf.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_osintf.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/usb_osintf.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_osintf.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -409988,9 +408468,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_osintf.h linux-5.11.4-rtl + + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_vendor_req.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_vendor_req.h ---- linux-5.11.4/3rdparty/rtl8812au/include/usb_vendor_req.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/usb_vendor_req.h 2021-03-07 18:16:17.092957849 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/usb_vendor_req.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_vendor_req.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/usb_vendor_req.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/usb_vendor_req.h 2022-01-28 22:59:35.627654881 +0200 @@ -0,0 +1,56 @@ +/****************************************************************************** + * @@ -410048,10 +408528,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/usb_vendor_req.h linux-5.11.4 +#endif + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wifi.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/wifi.h ---- linux-5.11.4/3rdparty/rtl8812au/include/wifi.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/wifi.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,1419 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/wifi.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/wifi.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/wifi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/wifi.h 2023-05-26 22:35:36.546136899 +0300 +@@ -0,0 +1,1349 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -410508,7 +408988,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wifi.h linux-5.11.4-rtl8812au + return _FALSE; +} + -+__inline static unsigned char *get_ra(unsigned char *pframe) ++__inline static unsigned char *wifi_get_ra(unsigned char *pframe) +{ + unsigned char *ra; + ra = GetAddr1Ptr(pframe); @@ -410934,76 +409414,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wifi.h linux-5.11.4-rtl8812au + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +} __attribute__((packed)); -+ -+ -+ -+#endif -+ -+ -+#ifdef PLATFORM_WINDOWS -+ -+#pragma pack(1) -+ -+struct rtw_ieee80211_ht_cap { -+ unsigned short cap_info; -+ unsigned char ampdu_params_info; -+ unsigned char supp_mcs_set[16]; -+ unsigned short extended_ht_cap_info; -+ unsigned int tx_BF_cap_info; -+ unsigned char antenna_selection_info; -+}; -+ -+ -+struct ieee80211_ht_addt_info { -+ unsigned char control_chan; -+ unsigned char ht_param; -+ unsigned short operation_mode; -+ unsigned short stbc_param; -+ unsigned char basic_set[16]; -+}; -+ -+struct HT_caps_element { -+ union { -+ struct { -+ unsigned short HT_caps_info; -+ unsigned char AMPDU_para; -+ unsigned char MCS_rate[16]; -+ unsigned short HT_ext_caps; -+ unsigned int Beamforming_caps; -+ unsigned char ASEL_caps; -+ } HT_cap_element; -+ unsigned char HT_cap[26]; -+ }; -+}; -+ -+struct HT_info_element { -+ unsigned char primary_channel; -+ unsigned char infos[5]; -+ unsigned char MCS_rate[16]; -+}; -+ -+struct AC_param { -+ unsigned char ACI_AIFSN; -+ unsigned char CW; -+ unsigned short TXOP_limit; -+}; -+ -+struct WMM_para_element { -+ unsigned char QoS_info; -+ unsigned char reserved; -+ struct AC_param ac_param[4]; -+}; -+ -+struct ADDBA_request { -+ unsigned char dialog_token; -+ unsigned short BA_para_set; -+ unsigned short BA_timeout_value; -+ unsigned short BA_starting_seqctrl; -+}; -+ -+ -+#pragma pack() -+ +#endif + +typedef enum _HT_CAP_AMPDU_FACTOR { @@ -411471,10 +409881,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wifi.h linux-5.11.4-rtl8812au +#endif + +#endif /* _WIFI_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/wlan_bssdef.h ---- linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/wlan_bssdef.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,704 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/wlan_bssdef.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/wlan_bssdef.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/wlan_bssdef.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/wlan_bssdef.h 2023-05-26 22:35:36.546136899 +0300 +@@ -0,0 +1,655 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -412030,10 +410440,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt +/* temporally add #pragma pack for structure alignment issue of +* WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz() +*/ -+#ifdef PLATFORM_WINDOWS -+#pragma pack(push) -+#pragma pack(1) -+#endif +typedef struct _WLAN_BSSID_EX { + ULONG Length; + NDIS_802_11_MAC_ADDRESS MacAddress; @@ -412050,13 +410456,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt + ULONG IELength; + UCHAR IEs[MAX_IE_SZ]; /* (timestamp, beacon interval, and capability information) */ +} -+#ifndef PLATFORM_WINDOWS -+__attribute__((packed)) -+#endif +WLAN_BSSID_EX, *PWLAN_BSSID_EX; -+#ifdef PLATFORM_WINDOWS -+#pragma pack(pop) -+#endif + +#define BSS_EX_IES(bss_ex) ((bss_ex)->IEs) +#define BSS_EX_IES_LEN(bss_ex) ((bss_ex)->IELength) @@ -412104,10 +410504,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt + int aid; /* will only be valid when a BSS is joinned. */ + int join_res; + WLAN_BSSID_EX network; /* must be the last item */ -+#ifdef PLATFORM_WINDOWS -+ unsigned char iebuf[MAX_IE_SZ]; -+#endif -+ +}; + +enum VRTL_CARRIER_SENSE { @@ -412122,16 +410518,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt + CTS_TO_SELF +}; + -+ -+ -+ +#define PWR_CAM 0 +#define PWR_MINPS 1 +#define PWR_MAXPS 2 +#define PWR_UAPSD 3 +#define PWR_VOIP 4 + -+ +enum UAPSD_MAX_SP { + NO_LIMIT, + TWO_MSDU, @@ -412139,7 +410531,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt + SIX_MSDU +}; + -+ +/* john */ +#define NUM_PRE_AUTH_KEY 16 +#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY @@ -412148,41 +410539,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/wlan_bssdef.h linux-5.11.4-rt +* WPA2 +*/ + -+#ifndef PLATFORM_OS_CE -+typedef struct _PMKID_CANDIDATE { -+ NDIS_802_11_MAC_ADDRESS BSSID; -+ ULONG Flags; -+} PMKID_CANDIDATE, *PPMKID_CANDIDATE; -+ -+typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST { -+ ULONG Version; /* Version of the structure */ -+ ULONG NumCandidates; /* No. of pmkid candidates */ -+ PMKID_CANDIDATE CandidateList[1]; -+} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; -+ -+ -+typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION { -+ NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; -+ NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; -+ -+} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; -+ -+typedef struct _NDIS_802_11_CAPABILITY { -+ ULONG Length; -+ ULONG Version; -+ ULONG NoOfPMKIDs; -+ ULONG NoOfAuthEncryptPairsSupported; -+ NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; -+ -+} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; -+#endif -+ -+ +#endif /* #ifndef WLAN_BSSDEF_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/xmit_osdep.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/xmit_osdep.h ---- linux-5.11.4/3rdparty/rtl8812au/include/xmit_osdep.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/include/xmit_osdep.h 2021-03-07 18:16:17.092957849 +0200 -@@ -0,0 +1,94 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/include/xmit_osdep.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/xmit_osdep.h +--- linux-6.3.4/drivers/staging/rtl8812au/include/xmit_osdep.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/include/xmit_osdep.h 2023-05-26 22:35:36.546136899 +0300 +@@ -0,0 +1,68 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -412210,32 +410571,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/xmit_osdep.h linux-5.11.4-rtl + SIZE_T buf_len; +}; + -+#ifdef PLATFORM_WINDOWS -+ -+#ifdef PLATFORM_OS_XP -+#ifdef CONFIG_USB_HCI -+#include -+#include -+#include -+#endif -+#endif -+ -+#ifdef CONFIG_GSPI_HCI -+ #define NR_XMITFRAME 64 -+#else -+ #define NR_XMITFRAME 128 -+#endif -+ -+#define ETH_ALEN 6 -+ -+extern NDIS_STATUS rtw_xmit_entry( -+ IN _nic_hdl cnxt, -+ IN NDIS_PACKET *pkt, -+ IN UINT flags -+); -+ -+#endif /* PLATFORM_WINDOWS */ -+ +#ifdef PLATFORM_FREEBSD +#define NR_XMITFRAME 256 +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); @@ -412252,8 +410587,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/xmit_osdep.h linux-5.11.4-rtl +struct xmit_frame; +struct xmit_buf; + -+extern int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); -+extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); ++extern netdev_tx_t _rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev); ++extern netdev_tx_t rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev); + +#endif /* PLATFORM_LINUX */ + @@ -412277,9 +410612,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/include/xmit_osdep.h linux-5.11.4-rtl +void dump_os_queue(void *sel, _adapter *padapter); + +#endif /* __XMIT_OSDEP_H_ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Kconfig linux-5.11.4-rtl8812au/3rdparty/rtl8812au/Kconfig ---- linux-5.11.4/3rdparty/rtl8812au/Kconfig 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/Kconfig 2021-03-07 18:16:16.978952460 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/Kconfig linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Kconfig +--- linux-6.3.4/drivers/staging/rtl8812au/Kconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Kconfig 2022-01-28 22:59:35.486648197 +0200 @@ -0,0 +1,6 @@ +config 88XXAU + tristate "Realtek 88XXau USB WiFi" @@ -412287,10 +410622,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Kconfig linux-5.11.4-rtl8812au/3rdpar + help + Help message of 88XXau + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdparty/rtl8812au/Makefile ---- linux-5.11.4/3rdparty/rtl8812au/Makefile 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/Makefile 2021-03-07 18:16:16.978952460 +0200 -@@ -0,0 +1,2328 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/Makefile linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Makefile +--- linux-6.3.4/drivers/staging/rtl8812au/Makefile 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/Makefile 2023-05-26 22:35:36.539136900 +0300 +@@ -0,0 +1,1819 @@ +EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) -fno-pie +EXTRA_CFLAGS += -O3 +EXTRA_CFLAGS += -Wno-unused-variable @@ -412298,25 +410633,24 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +EXTRA_CFLAGS += -Wno-unused-label +#EXTRA_CFLAGS += -Wno-unused-parameter +EXTRA_CFLAGS += -Wno-unused-function -+EXTRA_CFLAGS += -Wimplicit-fallthrough=0 ++EXTRA_CFLAGS += -Wno-implicit-fallthrough ++EXTRA_CFLAGS += -Wno-cast-function-type ++#EXTRA_CFLAGS += -Wno-error=cast-function-type +#EXTRA_CFLAGS += -Wno-parentheses-equality +#EXTRA_CFLAGS += -Wno-pointer-bool-conversion +EXTRA_CFLAGS += -Wno-unknown-pragmas +#EXTRA_CFLAGS += -Wno-unused ++EXTRA_CFLAGS += -Wno-address +EXTRA_CFLAGS += -Wno-vla -g + -+#GCC_VER_49 := $(shell echo `$(CC) -dumpversion | cut -f1-2 -d.` \>= 4.9 | bc ) -+#ifeq ($(GCC_VER_49),1) -+#EXTRA_CFLAGS += -Wno-date-time # Fix compile error && warning on gcc 4.9 and later -+#endif -+ -+EXTRA_CFLAGS += -I$(src)/include ++EXTRA_CFLAGS += -I$(src)/include -I$(srctree)/$(src)/include ++EXTRA_CFLAGS += -I$(src)/hal/phydm -I$(srctree)/$(src)/hal/phydm +EXTRA_LDFLAGS += --strip-all -O3 + +########################## WIFI IC ############################ +CONFIG_RTL8812A = y +CONFIG_RTL8821A = y -+CONFIG_RTL8814A = n ++CONFIG_RTL8814A = y +######################### Interface ########################### +CONFIG_USB_HCI = y +########################### Android ########################### @@ -412359,6 +410693,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +CONFIG_RTW_WIFI_HAL = n +CONFIG_ICMP_VOQ = n +CONFIG_IP_R_MONITOR = n #arp VOQ and high rate ++# disable virtual intf for openwrt 21.02 ++CONFIG_RTW_VIRTUAL_INTF = n +########################## Debug ########################### +CONFIG_RTW_DEBUG = n +# default log level is _DRV_INFO_ = 4, @@ -412458,6 +410794,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + +CONFIG_DRVEXT_MODULE = n + ++ifeq ("","$(wildcard MOK.der)") ++NO_SKIP_SIGN := y ++endif ++ +ifeq ($(CONFIG_RTL8812AU), ) +ifneq (,$(findstring /usr/lib/dkms,$(PATH))) + export TopDIR ?= $(shell pwd) @@ -412471,7 +410811,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +HCI_NAME = usb +endif + -+ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_y_n) ++ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_y_y) + +EXTRA_CFLAGS += -DDRV_NAME=\"rtl88XXau\" +ifeq ($(CONFIG_USB_HCI), y) @@ -412514,85 +410854,19 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + hal/led/hal_$(HCI_NAME)_led.o + + -+EXTRA_CFLAGS += -I$(src)/platform ++EXTRA_CFLAGS += -I$(src)/platform -I$(srctree)/$(src)/platform +_PLATFORM_FILES := platform/platform_ops.o + -+EXTRA_CFLAGS += -I$(src)/hal/btc ++EXTRA_CFLAGS += -I$(src)/hal/btc -I$(srctree)/$(src)/hal/btc + -+########### HAL_RTL8188E ################################# -+ifeq ($(CONFIG_RTL8188E), y) -+ -+RTL871X = rtl8188e -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8189es -+endif -+ -+ifeq ($(CONFIG_GSPI_HCI), y) -+MODULE_NAME = 8189es -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8188eu -+endif -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8188ee -+endif -+EXTRA_CFLAGS += -DCONFIG_RTL8188E -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8188EPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_xmit.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8188e_s_fw.o \ -+ hal/$(RTL871X)/hal8188e_t_fw.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o -+ -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+else -+ifeq ($(CONFIG_GSPI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+endif -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_USB.o -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_PCIE.o -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_SDIO.o -+endif -+endif + +########### HAL_RTL8812A_RTL8821A ################################# -+ +ifneq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A), n_n) + +RTL871X = rtl8812a +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8812au +endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8812ae -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8812as -+endif + +_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ + hal/$(RTL871X)/Hal8812PwrSeq.o \ @@ -412658,19 +410932,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +MODULE_NAME := 8811au +endif +endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME := 8821ae -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME := 8821as -+endif -+ +endif + +EXTRA_CFLAGS += -DCONFIG_RTL8821A + +_HAL_INTFS_FILES += hal/rtl8812a/hal8821a_fw.o -+ +endif + +ifeq ($(CONFIG_BT_COEXIST), y) @@ -412683,66 +410949,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + hal/btc/halbtc8821a2ant.o +endif +endif -+ +endif + -+########### HAL_RTL8723B ################################# -+ifeq ($(CONFIG_RTL8723B), y) -+ -+RTL871X = rtl8723b -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8723bu -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8723be -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8723bs -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8723B -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8723BPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8723b_fw.o -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_USB.o -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_PCIE.o -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_SDIO.o -+endif -+ -+_BTC_FILES += hal/btc/halbtc8723bwifionly.o -+ifeq ($(CONFIG_BT_COEXIST), y) -+_BTC_FILES += hal/btc/halbtc8723b1ant.o \ -+ hal/btc/halbtc8723b2ant.o -+endif -+ -+endif + +########### HAL_RTL8814A ################################# +ifeq ($(CONFIG_RTL8814A), y) @@ -412750,7 +410958,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +#EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE +CONFIG_MP_VHT_HW_TX_MODE = n +########################################## -+#RTL871X = rtl8814a ++RTL871X = rtl8814a +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8814au +endif @@ -412770,7 +410978,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/hal8814a_fw.o + -+ +_HAL_INTFS_FILES += \ + hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \ @@ -412793,371 +411000,16 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_PCIE.o +endif -+ +endif + -+########### HAL_RTL8723C ################################# -+ifeq ($(CONFIG_RTL8723C), y) + -+RTL871X = rtl8703b -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8723cu -+MODULE_SUB_NAME = 8703bu -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8723ce -+MODULE_SUB_NAME = 8703be -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8723cs -+MODULE_SUB_NAME = 8703bs -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8703B -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8703BPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8703b_fw.o -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8703B_USB.o -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8703B_PCIE.o -+endif -+ -+ifeq ($(CONFIG_BT_COEXIST), y) -+_BTC_FILES += hal/btc/halbtc8703b1ant.o -+endif -+ -+endif -+ -+########### HAL_RTL8723D ################################# -+ifeq ($(CONFIG_RTL8723D), y) -+ -+RTL871X = rtl8723d -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8723du -+MODULE_SUB_NAME = 8723du -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8723de -+MODULE_SUB_NAME = 8723de -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8723ds -+MODULE_SUB_NAME = 8723ds -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8723D -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8723DPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8723d_fw.o \ -+ hal/$(RTL871X)/$(RTL871X)_lps_poff.o -+ -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723D_USB.o -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723D_PCIE.o -+endif -+ -+ifeq ($(CONFIG_BT_COEXIST), y) -+_BTC_FILES += hal/btc/halbtc8723d1ant.o \ -+ hal/btc/halbtc8723d2ant.o -+endif -+ -+endif -+ -+########### HAL_RTL8188F ################################# -+ifeq ($(CONFIG_RTL8188F), y) -+ -+RTL871X = rtl8188f -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8188fu -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8188fe -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8189fs -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8188F -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8188FPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8188f_fw.o -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188F_USB.o -+endif -+ -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188F_SDIO.o -+endif -+ -+endif -+ -+########### HAL_RTL8188GTV ################################# -+ifeq ($(CONFIG_RTL8188GTV), y) -+ -+RTL871X = rtl8188gtv -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8188gtvu -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8189gtvs -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8188GTV -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8188GTVPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8188gtv_fw.o -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188GTV_USB.o -+endif -+ -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188GTV_SDIO.o -+endif -+ -+endif -+ -+########### HAL_RTL8822B ################################# -+ifeq ($(CONFIG_RTL8822B), y) -+RTL871X := rtl8822b -+ifeq ($(CONFIG_USB_HCI), y) -+ifeq ($(CONFIG_BT_COEXIST), n) -+MODULE_NAME = 8812bu -+else -+MODULE_NAME = 88x2bu -+endif -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 88x2be -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 88x2bs -+endif -+ -+endif -+########### HAL_RTL8821C ################################# -+ifeq ($(CONFIG_RTL8821C), y) -+RTL871X := rtl8821c -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8821cu -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8821ce -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8821cs -+endif -+ -+endif -+ -+########### HAL_RTL8710B ################################# -+ifeq ($(CONFIG_RTL8710B), y) -+ -+RTL871X = rtl8710b -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8710bu -+MODULE_SUB_NAME = 8710bu -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8710B -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8710BPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8710b_fw.o \ -+ hal/$(RTL871X)/$(RTL871X)_lps_poff.o -+ -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8710B_USB.o -+endif -+ -+endif -+ -+########### HAL_RTL8192F ################################# -+ifeq ($(CONFIG_RTL8192F), y) -+ -+RTL871X = rtl8192f -+ifeq ($(CONFIG_USB_HCI), y) -+MODULE_NAME = 8192fu -+MODULE_SUB_NAME = 8192fu -+endif -+ifeq ($(CONFIG_PCI_HCI), y) -+MODULE_NAME = 8192fe -+MODULE_SUB_NAME = 8192fe -+endif -+ifeq ($(CONFIG_SDIO_HCI), y) -+MODULE_NAME = 8192fs -+MODULE_SUB_NAME = 8192fs -+endif -+ -+EXTRA_CFLAGS += -DCONFIG_RTL8192F -+ -+_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ -+ hal/$(RTL871X)/Hal8192FPwrSeq.o\ -+ hal/$(RTL871X)/$(RTL871X)_sreset.o -+ -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ -+ hal/$(RTL871X)/$(RTL871X)_phycfg.o \ -+ hal/$(RTL871X)/$(RTL871X)_rf6052.o \ -+ hal/$(RTL871X)/$(RTL871X)_dm.o \ -+ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ -+ hal/$(RTL871X)/$(RTL871X)_cmd.o \ -+ hal/$(RTL871X)/hal8192f_fw.o \ -+ hal/$(RTL871X)/$(RTL871X)_lps_poff.o -+ -+ -+_HAL_INTFS_FILES += \ -+ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \ -+ hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -+else -+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -+endif -+ -+ifeq ($(CONFIG_SDIO_HCI), y) -+_HAL_INTFS_FILES += hal/efuse/$(RTL871X)/HalEfuseMask8192F_SDIO.o -+endif -+ -+ifeq ($(CONFIG_USB_HCI), y) -+_HAL_INTFS_FILES += hal/efuse/$(RTL871X)/HalEfuseMask8192F_USB.o -+endif -+ -+ifeq ($(CONFIG_PCI_HCI), y) -+_HAL_INTFS_FILES += hal/efuse/$(RTL871X)/HalEfuseMask8192F_PCIE.o -+endif -+ -+endif +########### AUTO_CFG ################################# -+ +ifeq ($(CONFIG_AUTOCFG_CP), y) + +ifeq ($(CONFIG_MULTIDRV), y) +$(shell cp $(TopDIR)/autoconf_multidrv_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) -+else -+ifeq ($(CONFIG_RTL8188E)$(CONFIG_SDIO_HCI),yy) -+$(shell cp $(TopDIR)/autoconf_rtl8189e_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) -+else ifeq ($(CONFIG_RTL8188F)$(CONFIG_SDIO_HCI),yy) -+$(shell cp $(TopDIR)/autoconf_rtl8189f_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) -+else ifeq ($(CONFIG_RTL8723C),y) -+$(shell cp $(TopDIR)/autoconf_rtl8723c_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) -+else -+$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) +endif +endif -+ -+endif -+ +########### END OF PATH ################################# + +ifeq ($(CONFIG_USB_HCI), y) @@ -413191,7 +411043,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +EXTRA_CFLAGS += -DCONFIG_WAPI_SUPPORT +endif + -+ +ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y) +EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE + @@ -413424,13 +411275,17 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + +EXTRA_CFLAGS += -DDM_ODM_SUPPORT_TYPE=0x04 + ++ifeq ($(CONFIG_RTW_VIRTUAL_INTF), y) ++EXTRA_CFLAGS += -DRTW_VIRTUAL_INTF=1 ++endif ++ +ifeq ($(CONFIG_PLATFORM_I386_PC), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -+SUBARCH := $(shell uname -m | sed -e "s/i.86/i386/; s/ppc/powerpc/; s/armv.l/arm/; s/aarch64/arm64/;") ++SUBARCH := $(shell uname -m | sed -e "s/i.86/i386/; s/ppc/powerpc/; s/armv.l/arm/; s/aarch64/arm64/; s/riscv.*/riscv/;") +ARCH ?= $(SUBARCH) +CROSS_COMPILE ?= -+KVER := $(shell uname -r) ++KVER ?= $(shell if [ -n "${NEW_VERSION}" ] && [ -n "${FLAVOR}" ]; then echo "${NEW_VERSION}-${FLAVOR}"; else uname -r; fi) +KSRC := /lib/modules/$(KVER)/build +MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/ +INSTALL_PREFIX := @@ -413483,6 +411338,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + +ifeq ($(CONFIG_PLATFORM_PPC), y) +EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN ++EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +SUBARCH := $(shell uname -m | sed -e s/ppc/powerpc/) +ARCH ?= $(SUBARCH) +CROSS_COMPILE ?= @@ -413636,7 +411492,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + +ifeq ($(CONFIG_PLATFORM_ANDROID_INTEL_X86), y) +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ANDROID_INTEL_X86 -+EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT @@ -414162,14 +412017,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +KSRC := /HiSTBAndroidV600R003C00SPC021_git_0512/device/hisilicon/bigfish/sdk/source/kernel/linux-3.18.y +KSRC += O=/HiSTBAndroidV600R003C00SPC021_git_0512/out/target/product/Hi3798MV200/obj/KERNEL_OBJ +endif -+ -+ifeq ($(CONFIG_RTL8822B), y) -+ifeq ($(CONFIG_SDIO_HCI), y) -+CONFIG_RTL8822BS ?= m -+USER_MODULE_NAME := rtl8822bs -+endif -+endif -+ +endif + +# Platform setting @@ -414180,9 +412027,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +EXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD +EXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_6820 +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -+ifeq ($(RTL871X), rtl8188e) -+EXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50 -+endif +ifeq ($(CONFIG_SDIO_HCI), y) +EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS +_PLATFORM_FILES += platform/platform_sprd_sdio.o @@ -414196,9 +412040,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +EXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD +EXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_8810 +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -+ifeq ($(RTL871X), rtl8188e) -+EXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50 -+endif +ifeq ($(CONFIG_SDIO_HCI), y) +EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS +_PLATFORM_FILES += platform/platform_sprd_sdio.o @@ -414377,14 +412218,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +# To locate output files in a separate directory. +KSRC += O=/4.4_S905L_8822bs_compile/KERNEL_OBJ +endif -+ -+ifeq ($(CONFIG_RTL8822B), y) -+ifeq ($(CONFIG_SDIO_HCI), y) -+CONFIG_RTL8822BS ?= m -+USER_MODULE_NAME := 8822bs -+endif -+endif -+ +endif + +ifeq ($(CONFIG_PLATFORM_ZTE_ZX296716), y) @@ -414407,14 +412240,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +ARCH ?= arm64 +CROSS_COMPILE ?= +KSRC ?= -+ -+ifeq ($(CONFIG_RTL8822B), y) -+ifeq ($(CONFIG_SDIO_HCI), y) -+CONFIG_RTL8822BS ?= m -+USER_MODULE_NAME := 8822bs -+endif -+endif -+ +endif + +ifeq ($(ARCH), i386) @@ -414460,16 +412285,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +########### this part for *.mk ############################ +include $(src)/hal/phydm/phydm.mk + -+########### HAL_RTL8822B ################################# -+ifeq ($(CONFIG_RTL8822B), y) -+include $(src)/rtl8822b.mk -+endif -+ -+########### HAL_RTL8821C ################################# -+ifeq ($(CONFIG_RTL8821C), y) -+include $(src)/rtl8821c.mk -+endif -+ +rtk_core := core/rtw_cmd.o \ + core/rtw_security.o \ + core/rtw_debug.o \ @@ -414591,12 +412406,12 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa +DRIVER_VERSION = $(shell grep "\#define DRIVERVERSION" include/rtw_version.h | awk '{print $$3}' | tr -d v\") + +dkms_install: -+ mkdir -p /usr/src/8812au-$(DRIVER_VERSION) ++ @mkdir -vp /usr/src/8812au-$(DRIVER_VERSION) + cp -r * /usr/src/8812au-$(DRIVER_VERSION) + dkms add -m 8812au -v $(DRIVER_VERSION) -+ dkms build -m 8812au -v $(DRIVER_VERSION) ++ + dkms build -m 8812au -v $(DRIVER_VERSION) + dkms install -m 8812au -v $(DRIVER_VERSION) -+ dkms status ++ dkms status -m 8812au + +dkms_remove: + dkms remove 8812au/$(DRIVER_VERSION) --all @@ -414617,11 +412432,22 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/Makefile linux-5.11.4-rtl8812au/3rdpa + cd platform ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko + rm -fr Module.symvers ; rm -fr Module.markers ; rm -fr modules.order + rm -fr *.mod.c *.mod *.o .*.cmd *.ko *~ -+ rm -fr .tmp_versions ++ rm -fr .tmp_versions *.der *.priv +endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/custom_gpio_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/custom_gpio_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/custom_gpio_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/custom_gpio_linux.c 2021-03-07 18:16:17.092957849 +0200 ++ ++sign: ++ifeq ($(NO_SKIP_SIGN), y) ++ @openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom MOK/" ++ @mokutil --import MOK.der ++else ++ echo "Skipping key creation" ++endif ++ @$(KSRC)/scripts/sign-file sha256 MOK.priv MOK.der 88XXau.ko ++ ++sign-install: all sign install +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/custom_gpio_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/custom_gpio_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/custom_gpio_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/custom_gpio_linux.c 2022-01-28 22:59:35.628654929 +0200 @@ -0,0 +1,340 @@ +/****************************************************************************** + * @@ -414963,10 +412789,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/custom_gpio_linux.c linu +{ +} +#endif /* CONFIG_PLATFORM_SPRD */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c 2021-03-07 18:16:17.093957896 +0200 -@@ -0,0 +1,10531 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.c 2023-05-26 22:35:36.547136899 +0300 +@@ -0,0 +1,10566 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -415429,7 +413255,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + if (started) { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) ++ cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false, 0); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, false); +#else + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0); @@ -415441,7 +413271,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) + goto exit; + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) ++ cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0, 0); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19, 2)) ++ cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0); ++#else + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); ++#endif + +#else + int freq = rtw_ch2freq(ch); @@ -416114,7 +413950,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + #endif + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) ++ #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0) ++ roam_info.channel = notify_channel; + roam_info.bssid = cur_network->network.MacAddress; ++ #endif + roam_info.req_ie = pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2; + roam_info.req_ie_len = pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2; + roam_info.resp_ie = pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6; @@ -416145,13 +413984,17 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + RTW_INFO("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + #endif + -+ if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) != _TRUE) -+ rtw_cfg80211_connect_result(pwdev, cur_network->network.MacAddress -+ , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 -+ , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 -+ , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 -+ , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 -+ , WLAN_STATUS_SUCCESS, GFP_ATOMIC); ++ if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) != _TRUE) { ++ struct cfg80211_bss *bss; ++ bss = cfg80211_get_bss(pwdev->wiphy, NULL, cur_network->network.MacAddress, NULL, 0, ++ IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); ++ cfg80211_connect_bss(wdev_to_ndev(pwdev), cur_network->network.MacAddress, bss ++ , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 ++ , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 ++ , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 ++ , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 ++ , WLAN_STATUS_SUCCESS, GFP_ATOMIC, NL80211_TIMEOUT_UNSPECIFIED); ++ } + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + #endif @@ -416680,6 +414523,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +} + +static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ , int link_id ++#endif + , u8 key_index +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + , bool pairwise @@ -416824,6 +414670,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +} + +static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ , int link_id ++#endif + , u8 keyid +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + , bool pairwise @@ -416989,6 +414838,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +} + +static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ int link_id, ++#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr) +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */ @@ -417009,7 +414861,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +} + +static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, -+ struct net_device *ndev, u8 key_index ++ struct net_device *ndev, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ int link_id, ++#endif ++ u8 key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + , bool unicast, bool multicast + #endif @@ -417057,7 +414913,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) +int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, -+ struct net_device *ndev, u8 key_index) ++ struct net_device *ndev, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ int link_id, ++#endif ++ u8 key_index) +{ +#define SET_DEF_KEY_PARAM_FMT " key_index=%d" +#define SET_DEF_KEY_PARAM_ARG , key_index @@ -417302,6 +415162,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + + sinfo->filled |= STATION_INFO_BSS_PARAM; + ++#if defined (LINUX_VERSION_CODE) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 20, 0)) + if (!psta->no_short_preamble_set) + sinfo->bss_param.flags |= STATION_INFO_BSS_PARAM_SHORT_PREAMBLE; + @@ -417317,6 +415178,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + sinfo->bss_param.dtim_period = pwrctl->dtim; + + sinfo->bss_param.beacon_interval = get_beacon_interval(&cur_network->network); ++#endif + + } + @@ -417741,6 +415603,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + RTW_INFO("%s, ielen=%d\n", __func__, len); +#endif + ++ if (!pmlmepriv) ++ return -EINVAL; + if (len > 0) { + wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen); + if (wps_ie) { @@ -419803,6 +417667,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + return ret; +} + ++#ifdef RTW_VIRTUAL_INT +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +static struct wireless_dev * +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) @@ -419958,6 +417823,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + rtw_set_rtnl_lock_holder(dvobj, NULL); + return ret; +} ++#endif /* RTW_VIRTUAL_INT */ + +static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) +{ @@ -420186,7 +418052,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + return ret; +} + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) ++static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id) ++#else +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) ++#endif +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + @@ -421030,7 +418900,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); +#endif -+ + switch (channel_type) { + case NL80211_CHAN_NO_HT: + case NL80211_CHAN_HT20: @@ -421059,7 +418928,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + return 0; +} + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) ++static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, unsigned int link_id, struct cfg80211_chan_def *chandef){ ++#else +static int cfg80211_rtw_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_chan_def *chandef){ ++#endif + _adapter *padapter= wiphy_to_adapter(wiphy); + int channel; + int control_freq; @@ -421076,37 +418949,18 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + + if (!ndev) + return -ENODEV; -+ offset = rtw_get_oper_choffset(padapter); -+ //channel = adapter_to_dvobj(padapter)->oper_channel; -+ channel = pHalData->current_channel; ++ offset = rtw_get_oper_choffset(padapter); ++ bandWidth = rtw_get_oper_bw(padapter); ++ channel = rtw_get_oper_ch(padapter); + if(channel >= 1){ + if(channel <= 14) + band = NL80211_BAND_2GHZ; + else + band = NL80211_BAND_5GHZ; -+#if 0 -+ switch(pHalData->current_band_type){ -+ case 0: -+ band = NL80211_BAND_2GHZ; -+ break; -+ case 1: -+ band = NL80211_BAND_5GHZ; -+ break; -+ default: -+ return -EINVAL; -+ } -+#endif ++ + control_freq = ieee80211_channel_to_frequency(channel, band); + -+ dvobj = adapter_to_dvobj(padapter); -+ if(dvobj != NULL){ -+ bandWidth = adapter_to_dvobj(padapter)->oper_bwmode; -+ RTW_INFO("%s bw %d\n", __func__, adapter_to_dvobj(padapter)->oper_bwmode); -+ }else{ -+ bandWidth = pHalData->current_channel_bw; -+ RTW_INFO("%s dvobj null\n", __func__); -+ } -+ switch(pHalData->current_channel_bw){ ++ switch(bandWidth){ + case CHANNEL_WIDTH_5: + width = NL80211_CHAN_WIDTH_5; + center_freq = control_freq; @@ -421414,7 +419268,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + +indicate: + #if defined(RTW_DEDICATED_P2P_DEVICE) -+ if (rtw_cfg80211_redirect_pd_wdev(dvobj_to_wiphy(dvobj), get_ra(frame), &wdev)) ++ if (rtw_cfg80211_redirect_pd_wdev(dvobj_to_wiphy(dvobj), wifi_get_ra(frame), &wdev)) + if (0) + RTW_INFO("redirect to pd_wdev:%p\n", wdev); + #endif @@ -422702,7 +420556,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + return ret; +} + -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) +static void cfg80211_rtw_update_mgmt_frame_register(struct wiphy *wiphy, + struct wireless_dev *wdev, + struct mgmt_frame_regs *upd) @@ -425087,8 +422941,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + .flush_pmksa = cfg80211_rtw_flush_pmksa, + +#ifdef CONFIG_AP_MODE ++#ifdef RTW_VIRTUAL_INT + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, + .del_virtual_intf = cfg80211_rtw_del_virtual_intf, ++#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + .add_beacon = cfg80211_rtw_add_beacon, @@ -425154,7 +423010,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + .mgmt_tx = cfg80211_rtw_mgmt_tx, -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) + .update_mgmt_frame_registrations = cfg80211_rtw_update_mgmt_frame_register, +#else + .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, @@ -425311,7 +423167,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + pwdev_priv->rssi_monitor_min = 0; +#endif + -+ +exit: + return ret; +} @@ -425362,7 +423217,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 + rtw_cfg80211_indicate_scan_done(adapter, _TRUE); + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) ++ if (wdev->links[0].client.current_bss) { ++ #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) ++ if (wdev->connected) { ++ #else + if (wdev->current_bss) { ++ #endif + RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter)); + rtw_cfg80211_indicate_disconnect(adapter, 0, 1); + } @@ -425498,9 +423359,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.c linux-5 +} + +#endif /* CONFIG_IOCTL_CFG80211 */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.h ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.h 2021-03-07 18:16:17.093957896 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_cfg80211.h 2022-01-28 22:59:35.629654976 +0200 @@ -0,0 +1,427 @@ +/****************************************************************************** + * @@ -425929,10 +423790,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_cfg80211.h linux-5 + + +#endif /* __IOCTL_CFG80211_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c 2021-03-07 18:16:17.095957991 +0200 -@@ -0,0 +1,12876 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_linux.c 2022-12-18 17:40:24.577937030 +0200 +@@ -0,0 +1,12823 @@ + +/****************************************************************************** + * @@ -425967,7 +423828,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +extern int rtw_ht_enable; +#endif + -+ +#define RTL_IOCTL_WPA_SUPPLICANT (SIOCIWFIRSTPRIV+30) + +#define SCAN_ITEM_SIZE 768 @@ -426055,18 +423915,14 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +#ifndef CONFIG_IOCTL_CFG80211 + wireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff); +#endif -+ + rtw_mfree(buff, IW_CUSTOM_MAX + 1); -+ +} + -+ +static void request_wps_pbc_event(_adapter *padapter) +{ + u8 *buff, *p; + union iwreq_data wrqu; + -+ + buff = rtw_malloc(IW_CUSTOM_MAX); + if (!buff) + return; @@ -426104,7 +423960,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); +#endif +#else -+ + if (padapter->pid[0] == 0) { + /* 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. */ + return; @@ -426113,7 +423968,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + rtw_signal_process(padapter->pid[0], SIGUSR1); + +#endif -+ + rtw_led_control(padapter, LED_CTL_START_WPS_BOTTON); +} +#endif/* #ifdef CONFIG_SUPPORT_HW_WPS_PBC */ @@ -426130,7 +423984,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +#endif +} + -+ +void rtw_indicate_wx_assoc_event(_adapter *padapter) +{ + union iwreq_data wrqu; @@ -426508,7 +424361,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + u8 *p; + sint out_len = 0; + -+ + if (pbuf) { + p = pbuf; + @@ -426616,7 +424468,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + RTW_INFO("rtw_wx_get_scan: %s ", pnetwork->network.Ssid.Ssid); + RTW_INFO("rtw_wx_get_scan: ssid = %d ", wapi_len); + -+ + if (wapi_len > 0) { + p = buf_wapi; + /* _rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2); */ @@ -426809,8 +424660,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +#endif /* CONFIG_P2P */ -+ -+ + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + @@ -426972,8 +424821,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +#endif + +exit: -+ -+ + return ret; +} + @@ -427128,7 +424975,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + * || check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) */ + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); + -+ +exit: + + if (buf) @@ -427151,8 +424997,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network; + NDIS_802_11_RATES_EX *prates = NULL; + -+ -+ + if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) { + /* parsing HT_CAP_IE */ + if( is_supported_ht(padapter->registrypriv.wireless_mode)&&(padapter->registrypriv.ht_enable)) { @@ -427206,8 +425050,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + /* snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11g"); */ + snprintf(wrqu->name, IFNAMSIZ, "unassociated"); + } -+ -+ + return 0; +} + @@ -427371,8 +425213,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + rtw_indicate_connect(padapter); + +exit: -+ -+ + return ret; + +} @@ -427383,8 +425223,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + -+ -+ + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + wrqu->mode = IW_MODE_INFRA; + else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || @@ -427398,12 +425236,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + else + wrqu->mode = IW_MODE_AUTO; + -+ + return 0; + +} + -+ +static int rtw_wx_set_pmkid(struct net_device *dev, + struct iw_request_info *a, + union iwreq_data *wrqu, char *extra) @@ -427522,8 +425358,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + u16 val; + int i; + -+ -+ + wrqu->data.length = sizeof(*range); + _rtw_memset(range, 0, sizeof(*range)); + @@ -427659,9 +425493,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE | IW_SCAN_CAPA_BSSID | + IW_SCAN_CAPA_CHANNEL | IW_SCAN_CAPA_MODE | IW_SCAN_CAPA_RATE; +#endif -+ -+ -+ + return 0; + +} @@ -427796,8 +425627,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + _rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); + -+ -+ + if (((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) || + ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) || + ((check_fwstate(pmlmepriv, WIFI_AP_STATE)) == _TRUE)) @@ -427806,7 +425635,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + else + _rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); + -+ + return 0; + +} @@ -427829,7 +425657,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct iw_mlme *mlme = (struct iw_mlme *) extra; + -+ + if (mlme == NULL) + return -1; + @@ -427837,10 +425664,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + reason = cpu_to_le16(mlme->reason_code); + -+ + RTW_INFO("%s, cmd=%d, reason=%d\n", __FUNCTION__, mlme->cmd, reason); + -+ + switch (mlme->cmd) { + case IW_MLME_DEAUTH: + if (!rtw_set_802_11_disassociate(padapter)) @@ -428047,7 +425872,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + len -= sec_len; + break; + -+ + case WEXT_CSCAN_CHANNEL_SECTION: + /* RTW_INFO("WEXT_CSCAN_CHANNEL_SECTION\n"); */ + pos += 1; @@ -428220,13 +426044,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + +exit: + -+ +#ifdef DBG_IOCTL + RTW_INFO("DBG_IOCTL %s:%d return %d\n", __FUNCTION__, __LINE__, ret); +#endif -+ + return ret ; -+ +} + +/* set ssid flow @@ -428250,7 +426071,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + uint ret = 0, len; + -+ +#ifdef DBG_IOCTL + RTW_INFO("DBG_IOCTL %s:%d\n", __FUNCTION__, __LINE__); +#endif @@ -428268,8 +426088,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + goto exit; + } + -+ -+ + rtw_ps_deny(padapter, PS_DENY_JOIN); + if (_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -1; @@ -428344,7 +426162,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + dst_ssid = pnetwork->network.Ssid.Ssid; + -+ + if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) && + (pnetwork->network.Ssid.SsidLength == ndis_ssid.SsidLength)) { + @@ -428380,8 +426197,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +#ifdef DBG_IOCTL + RTW_INFO("DBG_IOCTL %s:%d return %d\n", __FUNCTION__, __LINE__, ret); +#endif -+ -+ + return ret; +} + @@ -428489,7 +426304,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + ret = -1; + } + -+ + return ret; +} + @@ -428529,7 +426343,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + RTW_INFO("%s, rts_thresh=%d\n", __func__, padapter->registrypriv.rts_thresh); + -+ + return 0; + +} @@ -428588,7 +426401,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + wrqu->frag.fixed = 0; /* no auto select */ + /* wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD); */ + -+ + return 0; +} + @@ -428598,7 +426410,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 +{ + /* _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); */ + -+ + wrqu->retry.value = 7; + wrqu->retry.fixed = 0; /* no auto select */ + wrqu->retry.disabled = 1; @@ -428648,7 +426459,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + key = erq->flags & IW_ENCODE_INDEX; + -+ + if (erq->flags & IW_ENCODE_DISABLED) { + RTW_INFO("EncryptionDisabled\n"); + padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; @@ -428754,8 +426564,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + } + +exit: -+ -+ + return ret; + +} @@ -428840,7 +426648,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + } + -+ + return ret; + +} @@ -429277,7 +427084,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + u32 data32; + u32 bytes; + -+ + bytes = 0; + addr = 0; + data32 = 0; @@ -429667,7 +427473,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + break; + } + -+ + /* pdata->length = 0; */ /* ? */ + pdata->flags = 0; + if (pdata->length >= 32) { @@ -429731,7 +427536,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + } + +exit: -+ + return ret; + +} @@ -435717,7 +433521,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + rtw_hal_read_chip_info(padapter); + /* set mac addr*/ + rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); -+ _rtw_memcpy(padapter->pnetdev->dev_addr, get_hal_mac_addr(padapter), ETH_ALEN); /* set mac addr to net_device */ ++ dev_addr_set(padapter->pnetdev, get_hal_mac_addr(padapter)); /* set mac addr to net_device */ + +#ifdef CONFIG_P2P + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); @@ -437739,7 +435543,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + + ploopback->bstop = _TRUE; + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + thread_exit(NULL); ++#else ++ kthread_thread_exit(NULL); ++#endif + return 0; +} + @@ -438809,9 +436617,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_linux.c linux-5.11 + return ret; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_mp.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_mp.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_mp.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/ioctl_mp.c 2021-03-07 18:16:17.095957991 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_mp.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_mp.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/ioctl_mp.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/ioctl_mp.c 2022-01-28 22:59:35.631655071 +0200 @@ -0,0 +1,2591 @@ +/****************************************************************************** + * @@ -441404,9 +439212,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/ioctl_mp.c linux-5.11.4- +#endif /*#ifdef CONFIG_RTL8723B*/ + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c 2021-03-07 18:16:17.095957991 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/mlme_linux.c 2022-12-18 17:40:24.577937030 +0200 @@ -0,0 +1,436 @@ +/****************************************************************************** + * @@ -441814,7 +439622,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c linux-5.11. + mac[4] = 0x11; + mac[5] = 0x12; + -+ _rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN); ++ dev_addr_set(pnetdev, mac); + + + rtw_netif_carrier_off(pnetdev); @@ -441844,10 +439652,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/mlme_linux.c linux-5.11. + +#endif +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/os_intfs.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/os_intfs.c 2021-03-07 18:16:17.096958038 +0200 -@@ -0,0 +1,5252 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/os_intfs.c 2023-05-26 22:35:36.548136899 +0300 +@@ -0,0 +1,5188 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -442584,9 +440392,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- +int _netdev_open(struct net_device *pnetdev); +int netdev_open(struct net_device *pnetdev); +static int netdev_close(struct net_device *pnetdev); -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+extern int rtw_sdio_set_power(int on); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ + +#ifdef CONFIG_MCC_MODE +/* enable MCC mode or not */ @@ -443138,7 +440943,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + } + + _rtw_memcpy(adapter_mac_addr(padapter), sa->sa_data, ETH_ALEN); /* set mac addr to adapter */ -+ _rtw_memcpy(pnetdev->dev_addr, sa->sa_data, ETH_ALEN); /* set mac addr to net_device */ ++ dev_addr_set(pnetdev, sa->sa_data); /* set mac addr to net_device */ + +#if 0 + if (rtw_is_hw_init_completed(padapter)) { @@ -443587,7 +441392,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj); + +#ifdef CONFIG_RTW_NAPI ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ netif_napi_add_weight(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT); ++#else + netif_napi_add(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT); ++#endif +#endif /* CONFIG_RTW_NAPI */ + +#if defined(CONFIG_IOCTL_CFG80211) @@ -443603,7 +441412,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + /* alloc netdev name */ + rtw_init_netdev_name(ndev, name); + -+ _rtw_memcpy(ndev->dev_addr, adapter_mac_addr(adapter), ETH_ALEN); ++ dev_addr_set(ndev, adapter_mac_addr(adapter)); +#if defined(CONFIG_NET_NS) + dev_net_set(ndev, wiphy_net(adapter_to_wiphy(adapter))); +#endif //defined(CONFIG_NET_NS) @@ -444550,32 +442359,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + if (!primary_padapter) + goto _netdev_virtual_iface_open_error; + -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ if (padapter->bup == _FALSE) { -+ u8 mac[ETH_ALEN]; -+ -+ /* get mac address from primary_padapter */ -+ if (primary_padapter->bup == _FALSE) -+ rtw_macaddr_cfg(adapter_mac_addr(primary_padapter), get_hal_mac_addr(primary_padapter)); -+ -+ _rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN); -+ -+ /* -+ * If the BIT1 is 0, the address is universally administered. -+ * If it is 1, the address is locally administered -+ */ -+ mac[0] |= BIT(1); -+ -+ _rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN); -+ -+#ifdef CONFIG_MI_WITH_MBSSID_CAM -+ rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter)); -+#endif -+ rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); -+ _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); -+ } -+#endif /*CONFIG_PLATFORM_INTEL_BYT*/ -+ + if (primary_padapter->bup == _FALSE || !rtw_is_hw_init_completed(primary_padapter)) + _netdev_open(primary_padapter->pnetdev); + @@ -445303,10 +443086,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + + padapter->netif_up = _TRUE; + -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ rtw_sdio_set_power(1); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ -+ + #ifdef CONFIG_AUTOSUSPEND + if (pwrctrlpriv->ps_flag == _TRUE) { + padapter->net_closed = _FALSE; @@ -445315,15 +443094,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + #endif + + if (padapter->bup == _FALSE) { -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); -+#ifdef CONFIG_MI_WITH_MBSSID_CAM -+ rtw_mbid_camid_alloc(padapter, adapter_mac_addr(padapter)); -+#endif -+ rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); -+ _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ -+ + rtw_clr_surprise_removed(padapter); + rtw_clr_drv_stopped(padapter); + @@ -445366,11 +443136,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + padapter->bup = _TRUE; + pwrctrlpriv->bips_processing = _FALSE; + -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+#ifdef CONFIG_BT_COEXIST -+ rtw_btcoex_IpsNotify(padapter, IPS_NONE); -+#endif /* CONFIG_BT_COEXIST */ -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ + } + padapter->net_closed = _FALSE; + @@ -445709,7 +443474,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ + + RTW_INFO(FUNC_NDEV_FMT" , bup=%d\n", FUNC_NDEV_ARG(pnetdev), padapter->bup); -+#ifndef CONFIG_PLATFORM_INTEL_BYT + #ifdef CONFIG_AUTOSUSPEND + if (pwrctl->bInternalAutoSuspend == _TRUE) { + /* rtw_pwr_wakeup(padapter); */ @@ -445782,26 +443546,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- + else + RTW_INFO("CONFIG_BT_COEXIST: VIRTUAL_ADAPTER\n"); +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ -+#else /* !CONFIG_PLATFORM_INTEL_BYT */ -+ -+ if (pwrctl->bInSuspend == _TRUE) { -+ RTW_INFO("+871x_drv - drv_close, bInSuspend=%d\n", pwrctl->bInSuspend); -+ return 0; -+ } -+ -+ rtw_scan_abort(padapter); /* stop scanning process before wifi is going to down */ -+#ifdef CONFIG_IOCTL_CFG80211 -+ rtw_cfg80211_wait_scan_req_empty(padapter, 200); -+#endif -+ -+ RTW_INFO("netdev_close, bips_processing=%d\n", pwrctl->bips_processing); -+ while (pwrctl->bips_processing == _TRUE) /* waiting for ips_processing done before call rtw_dev_unload() */ -+ rtw_msleep_os(1); -+ -+ rtw_dev_unload(padapter); -+ rtw_sdio_set_power(0); -+ -+#endif /* !CONFIG_PLATFORM_INTEL_BYT */ + + RTW_INFO("-871x_drv - drv_close, bup=%d\n", padapter->bup); + @@ -447100,10 +444844,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/os_intfs.c linux-5.11.4- +EXPORT_SYMBOL(rtw_vendor_ie_set_api); + +#endif -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/recv_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/recv_linux.c 2021-03-07 18:16:17.096958038 +0200 -@@ -0,0 +1,739 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/recv_linux.c 2022-12-18 17:40:24.577937030 +0200 +@@ -0,0 +1,729 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -447173,7 +444917,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + return res; + } + -+ + /* Modified by Albert 20101213 */ + /* For 8 bytes IP header alignment. */ + shift_sz = pattrib->qos ? 6 : 0; /* Qos data, wireless lan header length is 26 */ @@ -447280,7 +445023,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. +#ifdef CONFIG_RTW_NAPI + skb_queue_head_init(&precvpriv->rx_napi_skb_queue); +#endif /* CONFIG_RTW_NAPI */ -+ + return res; +} + @@ -447288,9 +445030,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe) +{ + int res = _SUCCESS; -+ + precvframe->u.hdr.pkt = NULL; -+ + return res; +} + @@ -447300,14 +445040,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + sint i; + union recv_frame *precvframe; + precvframe = (union recv_frame *) precvpriv->precv_frame_buf; -+ -+ +#ifdef CONFIG_RTW_NAPI + if (skb_queue_len(&precvpriv->rx_napi_skb_queue)) + RTW_WARN("rx_napi_skb_queue not empty\n"); + rtw_skb_queue_purge(&precvpriv->rx_napi_skb_queue); +#endif /* CONFIG_RTW_NAPI */ -+ + for (i = 0; i < NR_RECVFRAME; i++) { + rtw_os_free_recvframe(precvframe); + precvframe++; @@ -447346,9 +445083,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + if (precvbuf->pallocated_buf == NULL) + return _FAIL; +#endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */ -+ +#endif /* CONFIG_USB_HCI */ -+ + return res; +} + @@ -447358,7 +445093,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + int ret = _SUCCESS; + +#ifdef CONFIG_USB_HCI -+ +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); @@ -447385,7 +445119,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + rtw_skb_free(precvbuf->pskb); + } + return ret; -+ +} + +_pkt *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, const u8 *da, const u8 *sa, u8 *msdu ,u16 msdu_len) @@ -447461,8 +445194,13 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + +#ifdef CONFIG_RTW_GRO + if (pregistrypriv->en_gro) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) + if (rtw_napi_gro_receive(&padapter->napi, pskb) != GRO_DROP) + rx_ok = _TRUE; ++#else ++ rtw_napi_gro_receive(&padapter->napi, pskb); ++ rx_ok = _TRUE; ++#endif + goto next; + } +#endif /* CONFIG_RTW_GRO */ @@ -447510,7 +445248,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + if (adapter->registrypriv.en_napi) { + struct dvobj_priv *dvobj; + struct registry_priv *registry; -+ + dvobj = adapter_to_dvobj(adapter); + registry = &adapter->registrypriv; + if (dvobj->traffic_stat.cur_rx_tp > registry->napi_threshold) @@ -447626,8 +445363,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. +#ifdef CONFIG_RTW_NAPI +#ifdef CONFIG_RTW_NAPI_DYNAMIC + if (!skb_queue_empty(&precvpriv->rx_napi_skb_queue) -+ && !adapter_to_dvobj(padapter)->en_napi_dynamic -+ ) ++ && !adapter_to_dvobj(padapter)->en_napi_dynamic) + napi_recv(padapter, RTL_NAPI_WEIGHT); +#endif + @@ -447835,17 +445571,15 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/recv_linux.c linux-5.11. + if (precvbuf->irp_pending == _FALSE) + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + -+ +#endif +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + precvbuf->pskb = NULL; +#endif + +} -+ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rhashtable.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rhashtable.c 2021-03-07 18:16:17.096958038 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rhashtable.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rhashtable.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rhashtable.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rhashtable.c 2022-01-28 22:59:35.631655071 +0200 @@ -0,0 +1,844 @@ +/* + * Resizable, Scalable, Concurrent Hash Table @@ -448691,9 +446425,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.c linux-5.11. + return rhashtable_free_and_destroy(ht, NULL, NULL); +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rhashtable.h ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rhashtable.h 2021-03-07 18:16:17.096958038 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rhashtable.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rhashtable.h +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rhashtable.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rhashtable.h 2022-01-28 22:59:35.632655118 +0200 @@ -0,0 +1,827 @@ +/* + * Resizable, Scalable, Concurrent Hash Table @@ -449522,10 +447256,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rhashtable.h linux-5.11. + +#endif /* _LINUX_RHASHTABLE_H */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_android.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_android.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_android.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_android.c 2021-03-07 18:16:17.096958038 +0200 -@@ -0,0 +1,1335 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_android.c 2023-05-26 22:35:36.548136899 +0300 +@@ -0,0 +1,1304 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -450192,7 +447926,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_android.c linux-5.11 + goto exit; + } + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,0)) -+ if (!access_ok(priv_cmd.buf, priv_cmd.total_len)) { ++ if (!access_ok(&priv_cmd.buf, priv_cmd.total_len)) { + #else + if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) { + #endif @@ -450641,13 +448375,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_android.c linux-5.11 + (int)wifi_irqres->start, wifi_wake_gpio); + + if (wifi_wake_gpio > 0) { -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ wifi_configure_gpio(); -+#else /* CONFIG_PLATFORM_INTEL_BYT */ + gpio_request(wifi_wake_gpio, "oob_irq"); + gpio_direction_input(wifi_wake_gpio); + oob_irq = gpio_to_irq(wifi_wake_gpio); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ + RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq); + } else if (wifi_irqres) { + oob_irq = wifi_irqres->start; @@ -450830,41 +448560,14 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_android.c linux-5.11 +#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */ + +#ifdef CONFIG_GPIO_WAKEUP -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+int wifi_configure_gpio(void) -+{ -+ if (gpio_request(oob_gpio, "oob_irq")) { -+ RTW_INFO("## %s Cannot request GPIO\n", __FUNCTION__); -+ return -1; -+ } -+ gpio_export(oob_gpio, 0); -+ if (gpio_direction_input(oob_gpio)) { -+ RTW_INFO("## %s Cannot set GPIO direction input\n", __FUNCTION__); -+ return -1; -+ } -+ oob_irq = gpio_to_irq(oob_gpio); -+ if (oob_irq < 0) { -+ RTW_INFO("## %s Cannot convert GPIO to IRQ\n", __FUNCTION__); -+ return -1; -+ } -+ -+ RTW_INFO("## %s OOB_IRQ=%d\n", __FUNCTION__, oob_irq); -+ -+ return 0; -+} -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ +void wifi_free_gpio(unsigned int gpio) +{ -+#ifdef CONFIG_PLATFORM_INTEL_BYT -+ if (gpio) -+ gpio_free(gpio); -+#endif /* CONFIG_PLATFORM_INTEL_BYT */ +} +#endif /* CONFIG_GPIO_WAKEUP */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c 2021-03-07 18:16:17.097958085 +0200 -@@ -0,0 +1,4745 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.c 2022-12-18 17:40:24.578937030 +0200 +@@ -0,0 +1,4777 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -451080,7 +448783,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- +static int rtw_drv_proc_open(struct inode *inode, struct file *file) +{ + /* struct net_device *dev = proc_get_parent_data(inode); */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(inode); ++#else ++ ssize_t index = (ssize_t)inode->i_private; ++#endif + const struct rtw_proc_hdl *hdl = drv_proc_hdls + index; + void *private = NULL; + @@ -451102,7 +448809,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static ssize_t rtw_drv_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(file_inode(file)); ++#else ++ ssize_t index = (ssize_t)file_inode(file)->i_private; ++#endif + const struct rtw_proc_hdl *hdl = drv_proc_hdls + index; + ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write; + @@ -455022,7 +452733,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static int rtw_adapter_proc_open(struct inode *inode, struct file *file) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(inode); ++#else ++ ssize_t index = (ssize_t)inode->i_private; ++#endif + const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index; + void *private = proc_get_parent_data(inode); + @@ -455044,7 +452759,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static ssize_t rtw_adapter_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(file_inode(file)); ++#else ++ ssize_t index = (ssize_t)file_inode(file)->i_private; ++#endif + const struct rtw_proc_hdl *hdl = adapter_proc_hdls + index; + ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write; + @@ -455209,7 +452928,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static int rtw_odm_proc_open(struct inode *inode, struct file *file) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(inode); ++#else ++ ssize_t index = (ssize_t)inode->i_private; ++#endif + const struct rtw_proc_hdl *hdl = odm_proc_hdls + index; + void *private = proc_get_parent_data(inode); + @@ -455231,7 +452954,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static ssize_t rtw_odm_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(file_inode(file)); ++#else ++ ssize_t index = (ssize_t)file_inode(file)->i_private; ++#endif + const struct rtw_proc_hdl *hdl = odm_proc_hdls + index; + ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write; + @@ -455368,7 +453095,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static int rtw_mcc_proc_open(struct inode *inode, struct file *file) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(inode); ++#else ++ ssize_t index = (ssize_t)inode->i_private; ++#endif + const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index; + void *private = proc_get_parent_data(inode); + @@ -455390,7 +453121,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- + +static ssize_t rtw_mcc_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) +{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + ssize_t index = (ssize_t)PDE_DATA(file_inode(file)); ++#else ++ ssize_t index = (ssize_t)file_inode(file)->i_private; ++#endif + const struct rtw_proc_hdl *hdl = mcc_proc_hdls + index; + ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write; + @@ -455610,10 +453345,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.c linux-5.11.4- +} + +#endif /* CONFIG_PROC_DEBUG */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h 2021-03-07 18:16:17.097958085 +0200 -@@ -0,0 +1,60 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.h +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_proc.h 2022-12-18 17:40:24.578937030 +0200 +@@ -0,0 +1,63 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -455633,6 +453368,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h linux-5.11.4- + +#include +#include ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0) ++#define PDE_DATA pde_data ++#endif + +#define RTW_PROC_HDL_TYPE_SEQ 0 +#define RTW_PROC_HDL_TYPE_SSEQ 1 @@ -455674,9 +453412,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_proc.h linux-5.11.4- +#endif /* !CONFIG_PROC_DEBUG */ + +#endif /* __RTW_PROC_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.c 2021-03-07 18:16:17.097958085 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.c 2022-01-28 22:59:35.632655118 +0200 @@ -0,0 +1,74 @@ +/****************************************************************************** + * @@ -455752,9 +453490,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.c linux-5 + +#endif /* CONFIG_RTW_MESH */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.h ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.h 2021-03-07 18:16:17.097958085 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.h +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/rtw_rhashtable.h 2022-01-28 22:59:35.632655118 +0200 @@ -0,0 +1,55 @@ +/****************************************************************************** + * @@ -455811,10 +453549,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/rtw_rhashtable.h linux-5 + +#endif /* __RTW_RHASHTABLE_H__ */ + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_intf.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/usb_intf.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_intf.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/usb_intf.c 2021-03-07 18:16:17.097958085 +0200 -@@ -0,0 +1,1658 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/usb_intf.c 2023-05-26 22:35:36.548136899 +0300 +@@ -0,0 +1,1652 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -455967,40 +453705,36 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_intf.c linux-5.11.4- + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881B), .driver_info = RTL8812}, /* Default ID */ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881C), .driver_info = RTL8812}, /* Default ID */ + /*=== Customer ID ===*/ -+ {USB_DEVICE(0x050D, 0x1106), .driver_info = RTL8812}, /* Belkin - sercomm */ -+ {USB_DEVICE(0x7392, 0xA822), .driver_info = RTL8812}, /* Edimax - Edimax */ -+ {USB_DEVICE(0x0DF6, 0x0074), .driver_info = RTL8812}, /* Sitecom - Edimax */ -+ {USB_DEVICE(0x04BB, 0x0952), .driver_info = RTL8812}, /* I-O DATA - Edimax */ -+ {USB_DEVICE(0x0789, 0x016E), .driver_info = RTL8812}, /* Logitec - Edimax */ + {USB_DEVICE(0x0409, 0x0408), .driver_info = RTL8812}, /* NEC - */ -+ {USB_DEVICE(0x0B05, 0x17D2), .driver_info = RTL8812}, /* ASUS - Edimax */ -+ {USB_DEVICE(0x0E66, 0x0022), .driver_info = RTL8812}, /* HAWKING - Edimax */ ++ {USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */ ++ {USB_DEVICE(0x04BB, 0x0952), .driver_info = RTL8812}, /* I-O DATA - Edimax */ ++ {USB_DEVICE(0x050D, 0x1106), .driver_info = RTL8812}, /* Belkin - sercomm */ ++ {USB_DEVICE(0x050D, 0x1109), .driver_info = RTL8812}, /* Belkin F9L1109 - SerComm */ + {USB_DEVICE(0x0586, 0x3426), .driver_info = RTL8812}, /* ZyXEL - */ -+ {USB_DEVICE(0x2001, 0x3313), .driver_info = RTL8812}, /* D-Link - ALPHA */ -+ {USB_DEVICE(0x1058, 0x0632), .driver_info = RTL8812}, /* WD - Cybertan */ -+ {USB_DEVICE(0x1740, 0x0100), .driver_info = RTL8812}, /* EnGenius - EnGenius */ -+ {USB_DEVICE(0x2019, 0xAB30), .driver_info = RTL8812}, /* Planex - Abocom */ ++ {USB_DEVICE(0x0789, 0x016E), .driver_info = RTL8812}, /* Logitec - Edimax */ + {USB_DEVICE(0x07B8, 0x8812), .driver_info = RTL8812}, /* Abocom - Abocom */ + {USB_DEVICE(0x0846, 0x9051), .driver_info = RTL8812}, /* Netgear A6200 v2 */ ++ {USB_DEVICE(0x0B05, 0x17D2), .driver_info = RTL8812}, /* ASUS - Edimax */ ++ {USB_DEVICE(0x0DF6, 0x0074), .driver_info = RTL8812}, /* Sitecom - Edimax */ ++ {USB_DEVICE(0x0E66, 0x0022), .driver_info = RTL8812}, /* HAWKING - Edimax */ ++ {USB_DEVICE(0x1058, 0x0632), .driver_info = RTL8812}, /* WD - Cybertan */ ++ {USB_DEVICE(0x13B1, 0x003F), .driver_info = RTL8812}, /* Linksys - WUSB6300 */ ++ {USB_DEVICE(0x148F, 0x9097), .driver_info = RTL8812}, /* Amped Wireless ACA1 */ ++ {USB_DEVICE(0x1740, 0x0100), .driver_info = RTL8812}, /* EnGenius - EnGenius */ + {USB_DEVICE(0x2001, 0x330E), .driver_info = RTL8812}, /* D-Link - ALPHA */ + {USB_DEVICE(0x2001, 0x3313), .driver_info = RTL8812}, /* D-Link - ALPHA */ + {USB_DEVICE(0x2001, 0x3315), .driver_info = RTL8812}, /* D-Link - Cameo */ + {USB_DEVICE(0x2001, 0x3316), .driver_info = RTL8812}, /* D-Link - Cameo */ -+ {USB_DEVICE(0x13B1, 0x003F), .driver_info = RTL8812}, /* Linksys - WUSB6300 */ ++ {USB_DEVICE(0x2019, 0xAB30), .driver_info = RTL8812}, /* Planex - Abocom */ ++ {USB_DEVICE(0x20F4, 0x805B), .driver_info = RTL8812}, /* TRENDnet - */ + {USB_DEVICE(0x2357, 0x0101), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1200 */ + {USB_DEVICE(0x2357, 0x0103), .driver_info = RTL8812}, /* TP-Link - T4UH */ + {USB_DEVICE(0x2357, 0x010D), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1300 */ -+ {USB_DEVICE(0x2357, 0x0115), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1300 */ + {USB_DEVICE(0x2357, 0x010E), .driver_info = RTL8812}, /* TP-Link - Archer T4UH AC1300 */ + {USB_DEVICE(0x2357, 0x010F), .driver_info = RTL8812}, /* TP-Link - T4UHP */ + {USB_DEVICE(0x2357, 0x0122), .driver_info = RTL8812}, /* TP-Link - T4UHP (other) */ -+ {USB_DEVICE(0x20F4, 0x805B), .driver_info = RTL8812}, /* TRENDnet - */ -+ {USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */ -+ {USB_DEVICE(0x050D, 0x1109), .driver_info = RTL8812}, /* Belkin F9L1109 - SerComm */ -+ {USB_DEVICE(0x148F, 0x9097), .driver_info = RTL8812}, /* Amped Wireless ACA1 */ -+ {USB_DEVICE(0x0BDA, 0x8812), .driver_info = RTL8812}, /* Alfa - AWUS036AC, AWUS036ACH & AWUS036EAC */ + {USB_DEVICE(0x2604, 0x0012), .driver_info = RTL8812}, /* Tenda U12 */ -+ {USB_DEVICE(0x0BDA, 0x881A), .driver_info = RTL8812}, /* Unex DAUK-W8812 */ ++ {USB_DEVICE(0x7392, 0xA822), .driver_info = RTL8812}, /* Edimax - Edimax */ +#endif + +#ifdef CONFIG_RTL8821A @@ -456012,45 +453746,43 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_intf.c linux-5.11.4- + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0820, 0xff, 0xff, 0xff), .driver_info = RTL8821}, /* 8821AU */ + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0823, 0xff, 0xff, 0xff), .driver_info = RTL8821}, /* 8821AU */ + /*=== Customer ID ===*/ ++ {USB_DEVICE(0x0411, 0x0242), .driver_info = RTL8821}, /* ELECOM - WDC-433DU2H */ ++ {USB_DEVICE(0x0411, 0x029B), .driver_info = RTL8821}, /* Buffalo - WI-U2-433DHP */ ++ {USB_DEVICE(0x04BB, 0x0953), .driver_info = RTL8821}, /* I-O DATA - Edimax */ ++ {USB_DEVICE(0x056E, 0x4007), .driver_info = RTL8821}, /* Elecom - WDC-433DU2HBK */ ++ {USB_DEVICE(0x056E, 0x400E), .driver_info = RTL8821}, /* ELECOM - ELECOM */ ++ {USB_DEVICE(0x056E, 0x400F), .driver_info = RTL8821}, /* ELECOM - ELECOM */ ++ {USB_DEVICE(0x056E, 0x4010), .driver_info = RTL8821}, /* ELECOM - ELECOM */ ++ {USB_DEVICE(0x0846, 0x9052), .driver_info = RTL8821}, /* Netgear - A6100 */ ++ {USB_DEVICE(0x0E66, 0x0023), .driver_info = RTL8821}, /* HAWKING - Edimax */ ++ {USB_DEVICE(0x2001, 0x3314), .driver_info = RTL8821}, /* D-Link - Cameo */ ++ {USB_DEVICE(0x2001, 0x3318), .driver_info = RTL8821}, /* D-Link - Cameo */ ++ {USB_DEVICE(0x2019, 0xAB32), .driver_info = RTL8821}, /* Planex - GW-450S */ ++ {USB_DEVICE(0x2357, 0x011E), .driver_info = RTL8821}, /* TP Link - T2U Nano */ ++ {USB_DEVICE(0x2357, 0x011F), .driver_info = RTL8821}, /* TP-Link - Archer AC600 T2U Nano */ ++ {USB_DEVICE(0x2357, 0x0120), .driver_info = RTL8821}, /* TP Link - T2U Plus */ ++ {USB_DEVICE(0x3823, 0x6249), .driver_info = RTL8821}, /* Obihai - OBiWiFi */ + {USB_DEVICE(0x7392, 0xA811), .driver_info = RTL8821}, /* Edimax - Edimax */ + {USB_DEVICE(0x7392, 0xA812), .driver_info = RTL8821}, /* Edimax - EW-7811UTC */ + {USB_DEVICE(0x7392, 0xA813), .driver_info = RTL8821}, /* Edimax - EW-7811UAC */ + {USB_DEVICE(0x7392, 0xB611), .driver_info = RTL8821}, /* Edimax - EW-7811UCB */ -+ {USB_DEVICE(0x04BB, 0x0953), .driver_info = RTL8821}, /* I-O DATA - Edimax */ -+ {USB_DEVICE(0x2001, 0x3314), .driver_info = RTL8821}, /* D-Link - Cameo */ -+ {USB_DEVICE(0x2001, 0x3318), .driver_info = RTL8821}, /* D-Link - Cameo */ -+ {USB_DEVICE(0x0E66, 0x0023), .driver_info = RTL8821}, /* HAWKING - Edimax */ -+ {USB_DEVICE(0x056E, 0x400E), .driver_info = RTL8821}, /* ELECOM - ELECOM */ -+ {USB_DEVICE(0x056E, 0x400F), .driver_info = RTL8821}, /* ELECOM - ELECOM */ -+ {USB_DEVICE(0x0411, 0x0242), .driver_info = RTL8821}, /* ELECOM - WDC-433DU2H */ -+ {USB_DEVICE(0x2019, 0xAB32), .driver_info = RTL8821}, /* Planex - GW-450S */ -+ {USB_DEVICE(0x0846, 0x9052), .driver_info = RTL8821}, /* Netgear - A6100 */ -+ {USB_DEVICE(0x0411, 0x029B), .driver_info = RTL8821}, /* Buffalo - WI-U2-433DHP */ -+ {USB_DEVICE(0x056E, 0x4007), .driver_info = RTL8821}, /* Elecom - WDC-433DU2HBK */ -+ {USB_DEVICE(0x0BDA, 0xA811), .driver_info = RTL8821}, /* GMYLE - AC450 */ -+ {USB_DEVICE(0x3823, 0x6249), .driver_info = RTL8821}, /* Obihai - OBiWiFi */ -+ {USB_DEVICE(0x2357, 0x011E), .driver_info = RTL8821}, /* TP Link - T2U Nano */ -+ {USB_DEVICE(0x2357, 0x0122), .driver_info = RTL8821}, /* TP Link - T2U Nano */ -+ {USB_DEVICE(0x2357, 0x0120), .driver_info = RTL8821}, /* TP Link - T2U Plus */ -+ {USB_DEVICE(0x2357, 0x011F), .driver_info = RTL8821}, /* TP-Link - Archer AC600 T2U Nano */ +#endif + +#ifdef CONFIG_RTL8814A + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8813), .driver_info = RTL8814A}, -+ {USB_DEVICE(0x2001, 0x331A), .driver_info = RTL8814A}, /* D-Link - D-Link */ + {USB_DEVICE(0x0B05, 0x1817), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */ + {USB_DEVICE(0x0B05, 0x1852), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */ + {USB_DEVICE(0x0B05, 0x1853), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */ + {USB_DEVICE(0x056E, 0x400B), .driver_info = RTL8814A}, /* ELECOM - ELECOM */ + {USB_DEVICE(0x056E, 0x400D), .driver_info = RTL8814A}, /* ELECOM - ELECOM */ -+ {USB_DEVICE(0x7392, 0xA834), .driver_info = RTL8814A}, /* Edimax - Edimax */ -+ {USB_DEVICE(0x7392, 0xA833), .driver_info = RTL8814A}, /* Edimax - AC1750 */ -+ {USB_DEVICE(0x0BDA, 0x8813), .driver_info = RTL8814A}, /* Edimax - EDUP Adapters */ -+ {USB_DEVICE(0x0e66, 0x0026), .driver_info = RTL8814A}, /* Hawking Technologies - HW17ACU*/ -+ {USB_DEVICE(0x2357, 0x0106), .driver_info = RTL8814A}, /* TP-LINK Archer T9UH */ ++ {USB_DEVICE(0x0846, 0x9054), .driver_info = RTL8814A}, /* Netgear A7000 */ ++ {USB_DEVICE(0x0E66, 0x0026), .driver_info = RTL8814A}, /* Hawking Technologies - HW17ACU*/ ++ {USB_DEVICE(0x2001, 0x331A), .driver_info = RTL8814A}, /* D-Link - D-Link */ + {USB_DEVICE(0x20F4, 0x809A), .driver_info = RTL8814A}, /* TRENDnet - TRENDnet */ + {USB_DEVICE(0x20F4, 0x809B), .driver_info = RTL8814A}, /* TRENDnet TEW-809UB */ -+ {USB_DEVICE(0x0846, 0x9054), .driver_info = RTL8814A}, /* Netgear A7000 */ ++ {USB_DEVICE(0x2357, 0x0106), .driver_info = RTL8814A}, /* TP-LINK Archer T9UH */ ++ {USB_DEVICE(0x7392, 0xA834), .driver_info = RTL8814A}, /* Edimax - Edimax */ ++ {USB_DEVICE(0x7392, 0xA833), .driver_info = RTL8814A}, /* Edimax - AC1750 */ +#endif /* CONFIG_RTL8814A */ + + {} /* Terminating entry */ @@ -457473,9 +455205,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_intf.c linux-5.11.4- +} +EXPORT_SYMBOL(rtw_usb_get_sw_pointer); +#endif /* CONFIG_INTEL_PROXIM */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c 2021-03-07 18:16:17.097958085 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/usb_ops_linux.c 2023-05-26 22:35:36.548136899 +0300 @@ -0,0 +1,1135 @@ +/****************************************************************************** + * @@ -458203,7 +455935,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c linux-5. +int recvbuf2recvframe(PADAPTER padapter, void *ptr); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX -+void usb_recv_tasklet(void *priv) ++void usb_recv_tasklet(unsigned long priv) +{ + struct recv_buf *precvbuf = NULL; + _adapter *padapter = (_adapter *)priv; @@ -458341,7 +456073,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c linux-5. +} +#else /* CONFIG_USE_USB_BUFFER_ALLOC_RX */ + -+void usb_recv_tasklet(void *priv) ++void usb_recv_tasklet(unsigned long priv) +{ + _pkt *pskb; + _adapter *padapter = (_adapter *)priv; @@ -458612,9 +456344,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/usb_ops_linux.c linux-5. + return ret; +} +#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/wifi_regd.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/wifi_regd.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/wifi_regd.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/wifi_regd.c 2021-03-07 18:16:17.097958085 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/wifi_regd.c 2022-01-28 22:59:35.632655118 +0200 @@ -0,0 +1,437 @@ +/****************************************************************************** + * @@ -459053,9 +456785,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/wifi_regd.c linux-5.11.4 + return 0; +} +#endif /* CONFIG_IOCTL_CFG80211 */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c 2021-03-07 18:16:17.097958085 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/linux/xmit_linux.c 2023-05-26 22:35:36.548136899 +0300 @@ -0,0 +1,567 @@ +/****************************************************************************** + * @@ -459503,7 +457235,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c linux-5.11. +#endif /* CONFIG_TX_MCAST2UNI */ + + -+int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) ++netdev_tx_t _rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -459603,11 +457335,11 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c linux-5.11. + return 0; +} + -+int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) ++netdev_tx_t rtw_xmit_entry(struct sk_buff *pkt, struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -+ int ret = 0; ++ netdev_tx_t ret = NETDEV_TX_OK; + + if (pkt) { + if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) == _TRUE) { @@ -459624,10 +457356,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/linux/xmit_linux.c linux-5.11. + + return ret; +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/osdep_service.c ---- linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/os_dep/osdep_service.c 2021-03-07 18:16:17.098958132 +0200 -@@ -0,0 +1,3172 @@ +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/os_dep/osdep_service.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/osdep_service.c +--- linux-6.3.4/drivers/staging/rtl8812au/os_dep/osdep_service.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/os_dep/osdep_service.c 2023-05-26 22:35:36.548136899 +0300 +@@ -0,0 +1,2928 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. @@ -459656,6 +457388,10 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#endif +#endif /* DBG_MEMORY_LEAK */ + ++#if defined(MODULE_IMPORT_NS) ++MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); ++#endif ++ +#if defined(PLATFORM_LINUX) +/* +* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE @@ -459711,10 +457447,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + pbuf = malloc(sz, M_DEVBUF, M_NOWAIT); +#endif + -+#ifdef PLATFORM_WINDOWS -+ NdisAllocateMemoryWithTag(&pbuf, sz, RT_TAG); -+#endif -+ +#ifdef DBG_MEMORY_LEAK +#ifdef PLATFORM_LINUX + if (pbuf != NULL) { @@ -459738,11 +457470,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + pbuf = malloc(sz, M_DEVBUF, M_ZERO | M_NOWAIT); +#endif -+#ifdef PLATFORM_WINDOWS -+ NdisAllocateMemoryWithTag(&pbuf, sz, RT_TAG); -+ if (pbuf != NULL) -+ NdisFillMemory(pbuf, sz, 0); -+#endif + + return pbuf; +} @@ -459755,9 +457482,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + free(pbuf, M_DEVBUF); +#endif -+#ifdef PLATFORM_WINDOWS -+ NdisFreeMemory(pbuf, sz, 0); -+#endif + +#ifdef DBG_MEMORY_LEAK +#ifdef PLATFORM_LINUX @@ -459783,11 +457507,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + pbuf = malloc(sz, M_DEVBUF, M_NOWAIT); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisAllocateMemoryWithTag(&pbuf, sz, RT_TAG); -+ -+#endif + +#ifdef DBG_MEMORY_LEAK +#ifdef PLATFORM_LINUX @@ -459816,10 +457535,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + memset(pbuf, 0, sz); +#endif + -+#ifdef PLATFORM_WINDOWS -+ NdisFillMemory(pbuf, sz, 0); -+#endif -+ + } + + return pbuf; @@ -459841,11 +457556,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + free(pbuf, M_DEVBUF); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisFreeMemory(pbuf, sz, 0); -+ -+#endif + +#ifdef DBG_MEMORY_LEAK +#ifdef PLATFORM_LINUX @@ -460559,12 +458269,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+ NdisMoveMemory(dst, src, sz); -+ -+#endif -+ +} + +inline void _rtw_memmove(void *dst, const void *src, u32 sz) @@ -460588,19 +458292,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + return _FALSE; +#endif + -+ -+#ifdef PLATFORM_WINDOWS -+ /* under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1 */ -+ -+ if (NdisEqualMemory(dst, src, sz)) -+ return _TRUE; -+ else -+ return _FALSE; -+ -+#endif -+ -+ -+ +} + +void _rtw_memset(void *pbuf, int c, u32 sz) @@ -460612,16 +458303,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + +#endif + -+#ifdef PLATFORM_WINDOWS -+#if 0 -+ NdisZeroMemory(pbuf, sz); -+ if (c != 0) -+ memset(pbuf, c, sz); -+#else -+ NdisFillMemory(pbuf, sz, c); -+#endif -+#endif -+ +} + +#ifdef PLATFORM_FREEBSD @@ -460648,11 +458329,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + list->next = list; + list->prev = list; +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisInitializeListHead(list); -+ -+#endif + +} + @@ -460682,17 +458358,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + +#endif + -+ -+#ifdef PLATFORM_WINDOWS -+ -+ if (IsListEmpty(phead)) -+ return _TRUE; -+ else -+ return _FALSE; -+ -+#endif -+ -+ +} + +void rtw_list_insert_head(_list *plist, _list *phead) @@ -460706,9 +458371,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + __list_add(plist, phead, phead->next); +#endif + -+#ifdef PLATFORM_WINDOWS -+ InsertHeadList(phead, plist); -+#endif +} + +void rtw_list_insert_tail(_list *plist, _list *phead) @@ -460724,11 +458386,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + __list_add(plist, phead->prev, phead); + +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ InsertTailList(phead, plist); -+ -+#endif + +} + @@ -460819,9 +458476,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + _init_timer(ptimer, adapter->pifp, pfunc, ctx); +#endif -+#ifdef PLATFORM_WINDOWS -+ _init_timer(ptimer, adapter->hndis_adapter, pfunc, ctx); -+#endif +} + +/* @@ -460842,16 +458496,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + sema_init(sema, init_val, "rtw_drv"); +#endif -+#ifdef PLATFORM_OS_XP -+ -+ KeInitializeSemaphore(sema, init_val, SEMA_UPBND); /* count=0; */ -+ -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ if (*sema == NULL) -+ *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL); -+#endif + +} + @@ -460860,9 +458504,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + sema_destroy(sema); +#endif -+#ifdef PLATFORM_OS_CE -+ CloseHandle(*sema); -+#endif + +} + @@ -460877,15 +458518,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + sema_post(sema); +#endif -+#ifdef PLATFORM_OS_XP -+ -+ KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1, FALSE); -+ -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ ReleaseSemaphore(*sema, 1, NULL); -+#endif +} + +u32 _rtw_down_sema(_sema *sema) @@ -460903,39 +458535,25 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + sema_wait(sema); + return _SUCCESS; +#endif -+#ifdef PLATFORM_OS_XP -+ -+ if (STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL)) -+ return _SUCCESS; -+ else -+ return _FAIL; -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ if (WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE)) -+ return _SUCCESS; -+ else -+ return _FAIL; -+#endif +} + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) +inline void thread_exit(_completion *comp) ++#else ++inline void kthread_thread_exit(_completion *comp) ++#endif +{ +#ifdef PLATFORM_LINUX ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + complete_and_exit(comp, 0); ++#else ++ kthread_complete_and_exit(comp, 0); ++#endif +#endif + +#ifdef PLATFORM_FREEBSD + printf("%s", "RTKTHREAD_exit"); +#endif -+ -+#ifdef PLATFORM_OS_CE -+ ExitThread(STATUS_SUCCESS); -+#endif -+ -+#ifdef PLATFORM_OS_XP -+ PsTerminateSystemThread(STATUS_SUCCESS); -+#endif +} + +inline void _rtw_init_completion(_completion *comp) @@ -460971,15 +458589,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_init(pmutex, "", NULL, MTX_DEF | MTX_RECURSE); +#endif -+#ifdef PLATFORM_OS_XP -+ -+ KeInitializeMutex(pmutex, 0); -+ -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ *pmutex = CreateMutex(NULL, _FALSE, NULL); -+#endif +} + +void _rtw_mutex_free(_mutex *pmutex); @@ -460997,14 +458606,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#endif + +#endif -+ -+#ifdef PLATFORM_OS_XP -+ -+#endif -+ -+#ifdef PLATFORM_OS_CE -+ -+#endif +} + +void _rtw_spinlock_init(_lock *plock) @@ -461018,11 +458619,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_init(plock, "", NULL, MTX_DEF | MTX_RECURSE); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisAllocateSpinLock(plock); -+ -+#endif + +} + @@ -461032,12 +458628,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + mtx_destroy(plock); +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+ NdisFreeSpinLock(plock); -+ -+#endif -+ +} +#ifdef PLATFORM_FREEBSD +extern PADAPTER prtw_lock; @@ -461071,11 +458661,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_lock(plock); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisAcquireSpinLock(plock); -+ -+#endif + +} + @@ -461090,11 +458675,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_unlock(plock); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisReleaseSpinLock(plock); -+ -+#endif +} + + @@ -461109,11 +458689,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_lock(plock); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisDprAcquireSpinLock(plock); -+ -+#endif + +} + @@ -461128,15 +458703,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + mtx_unlock(plock); +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisDprReleaseSpinLock(plock); -+ -+#endif +} + -+ -+ +void _rtw_init_queue(_queue *pqueue) +{ + _rtw_init_listhead(&(pqueue->queue)); @@ -461174,11 +458742,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + getmicrotime(&tvp); + return tvp.tv_sec; +#endif -+#ifdef PLATFORM_WINDOWS -+ LARGE_INTEGER SystemTime; -+ NdisGetCurrentSystemTime(&SystemTime); -+ return SystemTime.LowPart;/* count of 100-nanosecond intervals */ -+#endif +} + +inline u32 _rtw_systime_to_ms(systime stime) @@ -461189,9 +458752,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + return stime * 1000; +#endif -+#ifdef PLATFORM_WINDOWS -+ return stime / 10000 ; -+#endif +} + +inline systime _rtw_ms_to_systime(u32 ms) @@ -461202,9 +458762,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + return ms / 1000; +#endif -+#ifdef PLATFORM_WINDOWS -+ return ms * 10000 ; -+#endif +} + +inline systime _rtw_us_to_systime(u32 us) @@ -461263,15 +458820,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + return ; +#endif + -+#ifdef PLATFORM_WINDOWS -+ -+ NdisMSleep(ms * 1000); /* (us)*1000=(ms) */ -+ -+#endif -+ +} + -+ +void rtw_msleep_os(int ms) +{ + @@ -461290,13 +458840,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + DELAY(ms * 1000); + return ; +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisMSleep(ms * 1000); /* (us)*1000=(ms) */ -+ -+#endif -+ -+ +} +void rtw_usleep_os(int us) +{ @@ -461319,16 +458862,8 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + + return ; +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisMSleep(us); /* (us) */ -+ -+#endif -+ -+ +} + -+ +#ifdef DBG_DELAY_OS +void _rtw_mdelay_os(int ms, const char *func, const int line) +{ @@ -461346,10 +458881,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + + mdelay((unsigned long)ms); + -+#elif defined(PLATFORM_WINDOWS) -+ -+ NdisStallExecution(ms * 1000); /* (us)*1000=(ms) */ -+ +#endif + + @@ -461373,10 +458904,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + + udelay((unsigned long)us); + -+#elif defined(PLATFORM_WINDOWS) -+ -+ NdisStallExecution(us); /* (us) */ -+ +#endif + +} @@ -461393,13 +458920,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + DELAY(ms * 1000); + return ; +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisStallExecution(ms * 1000); /* (us)*1000=(ms) */ -+ -+#endif -+ -+ +} +void rtw_udelay_os(int us) +{ @@ -461414,11 +458934,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + DELAY(us); + return ; +#endif -+#ifdef PLATFORM_WINDOWS -+ -+ NdisStallExecution(us); /* (us) */ -+ -+#endif + +} +#endif @@ -461431,9 +458946,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_FREEBSD + yield(); +#endif -+#ifdef PLATFORM_WINDOWS -+ SwitchToThread(); -+#endif +} + +bool rtw_macaddr_is_larger(const u8 *a, const u8 *b) @@ -461598,8 +459110,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + atomic_set(v, i); -+#elif defined(PLATFORM_WINDOWS) -+ *v = i; /* other choice???? */ +#elif defined(PLATFORM_FREEBSD) + atomic_set_int(v, i); +#endif @@ -461609,8 +459119,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return atomic_read(v); -+#elif defined(PLATFORM_WINDOWS) -+ return *v; /* other choice???? */ +#elif defined(PLATFORM_FREEBSD) + return atomic_load_acq_32(v); +#endif @@ -461620,8 +459128,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + atomic_add(i, v); -+#elif defined(PLATFORM_WINDOWS) -+ InterlockedAdd(v, i); +#elif defined(PLATFORM_FREEBSD) + atomic_add_int(v, i); +#endif @@ -461630,8 +459136,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + atomic_sub(i, v); -+#elif defined(PLATFORM_WINDOWS) -+ InterlockedAdd(v, -i); +#elif defined(PLATFORM_FREEBSD) + atomic_subtract_int(v, i); +#endif @@ -461641,8 +459145,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + atomic_inc(v); -+#elif defined(PLATFORM_WINDOWS) -+ InterlockedIncrement(v); +#elif defined(PLATFORM_FREEBSD) + atomic_add_int(v, 1); +#endif @@ -461652,8 +459154,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + atomic_dec(v); -+#elif defined(PLATFORM_WINDOWS) -+ InterlockedDecrement(v); +#elif defined(PLATFORM_FREEBSD) + atomic_subtract_int(v, 1); +#endif @@ -461663,8 +459163,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return atomic_add_return(i, v); -+#elif defined(PLATFORM_WINDOWS) -+ return InterlockedAdd(v, i); +#elif defined(PLATFORM_FREEBSD) + atomic_add_int(v, i); + return atomic_load_acq_32(v); @@ -461675,8 +459173,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return atomic_sub_return(i, v); -+#elif defined(PLATFORM_WINDOWS) -+ return InterlockedAdd(v, -i); +#elif defined(PLATFORM_FREEBSD) + atomic_subtract_int(v, i); + return atomic_load_acq_32(v); @@ -461687,8 +459183,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return atomic_inc_return(v); -+#elif defined(PLATFORM_WINDOWS) -+ return InterlockedIncrement(v); +#elif defined(PLATFORM_FREEBSD) + atomic_add_int(v, 1); + return atomic_load_acq_32(v); @@ -461699,8 +459193,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return atomic_dec_return(v); -+#elif defined(PLATFORM_WINDOWS) -+ return InterlockedDecrement(v); +#elif defined(PLATFORM_FREEBSD) + atomic_subtract_int(v, 1); + return atomic_load_acq_32(v); @@ -462138,7 +459630,7 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + + rtw_init_netdev_name(pnetdev, ifname); + -+ _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); ++ dev_addr_set(pnetdev, adapter_mac_addr(padapter)); + + if (rtnl_lock_needed) + ret = register_netdev(pnetdev); @@ -462239,8 +459731,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +{ +#ifdef PLATFORM_LINUX + return do_div(x, y); -+#elif defined(PLATFORM_WINDOWS) -+ return x % y; +#elif defined(PLATFORM_FREEBSD) + return x % y; +#endif @@ -462251,8 +459741,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#ifdef PLATFORM_LINUX + do_div(x, y); + return x; -+#elif defined(PLATFORM_WINDOWS) -+ return x / y; +#elif defined(PLATFORM_FREEBSD) + return x / y; +#endif @@ -462261,7 +459749,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +inline u32 rtw_random32(void) +{ +#ifdef PLATFORM_LINUX -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) ++ return get_random_u32(); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + return prandom_u32(); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)) + u32 random_int; @@ -462270,8 +459760,6 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r +#else + return random32(); +#endif -+#elif defined(PLATFORM_WINDOWS) -+#error "to be implemented\n" +#elif defined(PLATFORM_FREEBSD) +#error "to be implemented\n" +#endif @@ -462800,9 +460288,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/os_dep/osdep_service.c linux-5.11.4-r + return 0; +} + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/custom_country_chplan.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/custom_country_chplan.h ---- linux-5.11.4/3rdparty/rtl8812au/platform/custom_country_chplan.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/custom_country_chplan.h 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/custom_country_chplan.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/custom_country_chplan.h +--- linux-6.3.4/drivers/staging/rtl8812au/platform/custom_country_chplan.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/custom_country_chplan.h 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,22 @@ +/****************************************************************************** + * @@ -462826,9 +460314,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/custom_country_chplan.h linu + COUNTRY_CHPLAN_ENT("TW", 0x76, 1, 0x3FF), /* Taiwan */ +}; + -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,54 @@ +/****************************************************************************** + * @@ -462884,9 +460372,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.c lin + wifi_teardown_dt(); +#endif /* kernel < 3.14.0 */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.h 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_aml_s905_sdio.h 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,32 @@ +/****************************************************************************** + * @@ -462920,9 +460408,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_aml_s905_sdio.h lin +#endif /* kernel < 3.14.0 */ + +#endif /* __PLATFORM_AML_S905_SDIO_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_arm_act_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_arm_act_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_arm_act_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_arm_act_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_arm_act_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_arm_act_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_arm_act_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_arm_act_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,53 @@ +/****************************************************************************** + * @@ -462977,9 +460465,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_arm_act_sdio.c linu + acts_wifi_cleanup(); +#endif +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,86 @@ +/****************************************************************************** + * @@ -463067,9 +460555,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUN50IW1P1_sdio + RTW_INFO("%s: remove card, power off.\n", __FUNCTION__); +#endif /* CONFIG_MMC */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNnI_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNnI_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNnI_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNnI_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNnI_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNnI_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNnI_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNnI_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,130 @@ +/****************************************************************************** + * @@ -463201,9 +460689,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNnI_sdio.c li + RTW_INFO("%s: remove card, power off.\n", __FUNCTION__); +#endif /* CONFIG_MMC */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,90 @@ +/****************************************************************************** + * @@ -463295,9 +460783,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_sdio.c li +#endif /* CONFIG_RTL8188E */ +#endif /* CONFIG_MMC_SUNXI_POWER_CONTROL */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_usb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_usb.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_usb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_usb.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_usb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_usb.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_usb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_SUNxI_usb.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,136 @@ +/****************************************************************************** + * @@ -463435,9 +460923,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_SUNxI_usb.c lin +#endif /* defined(CONFIG_PLATFORM_ARM_SUN8I) */ + +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_WMT_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_WMT_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_WMT_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ARM_WMT_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_WMT_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_WMT_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ARM_WMT_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ARM_WMT_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,46 @@ +/****************************************************************************** + * @@ -463485,9 +460973,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ARM_WMT_sdio.c linu + gpio_free(WMT_PIN_GP62_SUSGPIO1); + printk("[rtl8189es] %s: remove card, power off.\n", __FUNCTION__); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,110 @@ +/****************************************************************************** + * @@ -463599,9 +461087,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sd + mdelay(100); + hi_gpio_set_value(gpio_wlan_reg_on, 0); +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_hisilicon_hi3798_sdio.h 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,28 @@ +/****************************************************************************** + * @@ -463631,9 +461119,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_hisilicon_hi3798_sd +extern HI_S32 HI_DRV_GPIO_WriteBit(HI_U32 u32GpioNo, HI_U32 u32BitValue); + +#endif /* __PLATFORM_HISILICON_HI3798_SDIO_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ops.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ops.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ops.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ops.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ops.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ops.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,32 @@ +/****************************************************************************** + * @@ -463667,9 +461155,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.c linux-5.11.4- +{ +} +#endif /* !CONFIG_PLATFORM_OPS */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ops.h ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_ops.h 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ops.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ops.h +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_ops.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_ops.h 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,26 @@ +/****************************************************************************** + * @@ -463697,9 +461185,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_ops.h linux-5.11.4- +void platform_wifi_power_off(void); + +#endif /* __PLATFORM_OPS_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_RTK_DMP_usb.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_RTK_DMP_usb.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_RTK_DMP_usb.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_RTK_DMP_usb.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_RTK_DMP_usb.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_RTK_DMP_usb.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_RTK_DMP_usb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_RTK_DMP_usb.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,30 @@ +/****************************************************************************** + * @@ -463731,9 +461219,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_RTK_DMP_usb.c linux +void platform_wifi_power_off(void) +{ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_sprd_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_sprd_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_sprd_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_sprd_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_sprd_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_sprd_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_sprd_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_sprd_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,84 @@ +/****************************************************************************** + * @@ -463819,9 +461307,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_sprd_sdio.c linux-5 + mmc_host->pm_flags &= ~MMC_PM_KEEP_POWER; +#endif /* CONFIG_WOWLAN */ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.c linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.c ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.c 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.c 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.c linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.c +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.c 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,53 @@ +/****************************************************************************** + * @@ -463876,9 +461364,9 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.c + + /*msleep(500);*/ +} -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.h linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.h ---- linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.h 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.h 2021-03-07 18:16:17.098958132 +0200 +diff -Nurp linux-6.3.4/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.h linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.h +--- linux-6.3.4/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-6.3.4-rtl8812au/drivers/staging/rtl8812au/platform/platform_zte_zx296716_sdio.h 2022-01-28 22:59:35.633655166 +0200 @@ -0,0 +1,25 @@ +/****************************************************************************** + * @@ -463905,14028 +461393,3 @@ diff -Nurp linux-5.11.4/3rdparty/rtl8812au/platform/platform_zte_zx296716_sdio.h +#endif /* CONFIG_A16T03_BOARD */ + +#endif /* __PLATFORM_ZTE_ZX296716_SDIO_H__ */ -diff -Nurp linux-5.11.4/3rdparty/rtl8812au/tools/analyze_suspend.py linux-5.11.4-rtl8812au/3rdparty/rtl8812au/tools/analyze_suspend.py ---- linux-5.11.4/3rdparty/rtl8812au/tools/analyze_suspend.py 1970-01-01 02:00:00.000000000 +0200 -+++ linux-5.11.4-rtl8812au/3rdparty/rtl8812au/tools/analyze_suspend.py 2021-03-07 18:16:17.101958275 +0200 -@@ -0,0 +1,3441 @@ -+#!/usr/bin/python -+# -+# Tool for analyzing suspend/resume timing -+# Copyright (c) 2013, Intel Corporation. -+# -+# This program is free software; you can redistribute it and/or modify it -+# under the terms and conditions of the GNU General Public License, -+# version 2, as published by the Free Software Foundation. -+# -+# This program is distributed in the hope it will be useful, but WITHOUT -+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+# more details. -+# -+# You should have received a copy of the GNU General Public License along with -+# this program; if not, write to the Free Software Foundation, Inc., -+# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -+# -+# Authors: -+# Todd Brandt -+# -+# Description: -+# This tool is designed to assist kernel and OS developers in optimizing -+# their linux stack's suspend/resume time. Using a kernel image built -+# with a few extra options enabled, the tool will execute a suspend and -+# will capture dmesg and ftrace data until resume is complete. This data -+# is transformed into a device timeline and a callgraph to give a quick -+# and detailed view of which devices and callbacks are taking the most -+# time in suspend/resume. The output is a single html file which can be -+# viewed in firefox or chrome. -+# -+# The following kernel build options are required: -+# CONFIG_PM_DEBUG=y -+# CONFIG_PM_SLEEP_DEBUG=y -+# CONFIG_FTRACE=y -+# CONFIG_FUNCTION_TRACER=y -+# CONFIG_FUNCTION_GRAPH_TRACER=y -+# -+# For kernel versions older than 3.15: -+# The following additional kernel parameters are required: -+# (e.g. in file /etc/default/grub) -+# GRUB_CMDLINE_LINUX_DEFAULT="... initcall_debug log_buf_len=16M ..." -+# -+# ----------------- LIBRARIES -------------------- -+import sys -+import time -+import os -+import string -+import re -+import platform -+from datetime import datetime -+import struct -+# ----------------- CLASSES -------------------- -+# Class: SystemValues -+# Description: -+# A global, single-instance container used to -+# store system values and test parameters -+class SystemValues: -+ version = 3.0 -+ verbose = False -+ testdir = '.' -+ tpath = '/sys/kernel/debug/tracing/' -+ fpdtpath = '/sys/firmware/acpi/tables/FPDT' -+ epath = '/sys/kernel/debug/tracing/events/power/' -+ traceevents = [ -+ 'suspend_resume', -+ 'device_pm_callback_end', -+ 'device_pm_callback_start' -+ ] -+ modename = { -+ 'freeze': 'Suspend-To-Idle (S0)', -+ 'standby': 'Power-On Suspend (S1)', -+ 'mem': 'Suspend-to-RAM (S3)', -+ 'disk': 'Suspend-to-disk (S4)' -+ } -+ mempath = '/dev/mem' -+ powerfile = '/sys/power/state' -+ suspendmode = 'mem' -+ hostname = 'localhost' -+ prefix = 'test' -+ teststamp = '' -+ dmesgfile = '' -+ ftracefile = '' -+ htmlfile = '' -+ rtcwake = False -+ rtcwaketime = 10 -+ rtcpath = '' -+ android = False -+ adb = 'adb' -+ devicefilter = [] -+ stamp = 0 -+ execcount = 1 -+ x2delay = 0 -+ usecallgraph = False -+ usetraceevents = False -+ usetraceeventsonly = False -+ notestrun = False -+ altdevname = dict() -+ postresumetime = 0 -+ tracertypefmt = '# tracer: (?P.*)' -+ firmwarefmt = '# fwsuspend (?P[0-9]*) fwresume (?P[0-9]*)$' -+ postresumefmt = '# post resume time (?P[0-9]*)$' -+ stampfmt = '# suspend-(?P[0-9]{2})(?P[0-9]{2})(?P[0-9]{2})-'+\ -+ '(?P[0-9]{2})(?P[0-9]{2})(?P[0-9]{2})'+\ -+ ' (?P.*) (?P.*) (?P.*)$' -+ def __init__(self): -+ self.hostname = platform.node() -+ if(self.hostname == ''): -+ self.hostname = 'localhost' -+ rtc = "rtc0" -+ if os.path.exists('/dev/rtc'): -+ rtc = os.readlink('/dev/rtc') -+ rtc = '/sys/class/rtc/'+rtc -+ if os.path.exists(rtc) and os.path.exists(rtc+'/date') and \ -+ os.path.exists(rtc+'/time') and os.path.exists(rtc+'/wakealarm'): -+ self.rtcpath = rtc -+ def setOutputFile(self): -+ if((self.htmlfile == '') and (self.dmesgfile != '')): -+ m = re.match('(?P.*)_dmesg\.txt$', self.dmesgfile) -+ if(m): -+ self.htmlfile = m.group('name')+'.html' -+ if((self.htmlfile == '') and (self.ftracefile != '')): -+ m = re.match('(?P.*)_ftrace\.txt$', self.ftracefile) -+ if(m): -+ self.htmlfile = m.group('name')+'.html' -+ if(self.htmlfile == ''): -+ self.htmlfile = 'output.html' -+ def initTestOutput(self, subdir): -+ if(not self.android): -+ self.prefix = self.hostname -+ v = open('/proc/version', 'r').read().strip() -+ kver = string.split(v)[2] -+ else: -+ self.prefix = 'android' -+ v = os.popen(self.adb+' shell cat /proc/version').read().strip() -+ kver = string.split(v)[2] -+ testtime = datetime.now().strftime('suspend-%m%d%y-%H%M%S') -+ if(subdir != "."): -+ self.testdir = subdir+"/"+testtime -+ else: -+ self.testdir = testtime -+ self.teststamp = \ -+ '# '+testtime+' '+self.prefix+' '+self.suspendmode+' '+kver -+ self.dmesgfile = \ -+ self.testdir+'/'+self.prefix+'_'+self.suspendmode+'_dmesg.txt' -+ self.ftracefile = \ -+ self.testdir+'/'+self.prefix+'_'+self.suspendmode+'_ftrace.txt' -+ self.htmlfile = \ -+ self.testdir+'/'+self.prefix+'_'+self.suspendmode+'.html' -+ os.mkdir(self.testdir) -+ def setDeviceFilter(self, devnames): -+ self.devicefilter = string.split(devnames) -+ def rtcWakeAlarm(self): -+ os.system('echo 0 > '+self.rtcpath+'/wakealarm') -+ outD = open(self.rtcpath+'/date', 'r').read().strip() -+ outT = open(self.rtcpath+'/time', 'r').read().strip() -+ mD = re.match('^(?P[0-9]*)-(?P[0-9]*)-(?P[0-9]*)', outD) -+ mT = re.match('^(?P[0-9]*):(?P[0-9]*):(?P[0-9]*)', outT) -+ if(mD and mT): -+ # get the current time from hardware -+ utcoffset = int((datetime.now() - datetime.utcnow()).total_seconds()) -+ dt = datetime(\ -+ int(mD.group('y')), int(mD.group('m')), int(mD.group('d')), -+ int(mT.group('h')), int(mT.group('m')), int(mT.group('s'))) -+ nowtime = int(dt.strftime('%s')) + utcoffset -+ else: -+ # if hardware time fails, use the software time -+ nowtime = int(datetime.now().strftime('%s')) -+ alarm = nowtime + self.rtcwaketime -+ os.system('echo %d > %s/wakealarm' % (alarm, self.rtcpath)) -+sysvals = SystemValues() -+# Class: DeviceNode -+# Description: -+# A container used to create a device hierachy, with a single root node -+# and a tree of child nodes. Used by Data.deviceTopology() -+class DeviceNode: -+ name = '' -+ children = 0 -+ depth = 0 -+ def __init__(self, nodename, nodedepth): -+ self.name = nodename -+ self.children = [] -+ self.depth = nodedepth -+# Class: Data -+# Description: -+# The primary container for suspend/resume test data. There is one for -+# each test run. The data is organized into a cronological hierarchy: -+# Data.dmesg { -+# root structure, started as dmesg & ftrace, but now only ftrace -+# contents: times for suspend start/end, resume start/end, fwdata -+# phases { -+# 10 sequential, non-overlapping phases of S/R -+# contents: times for phase start/end, order/color data for html -+# devlist { -+# device callback or action list for this phase -+# device { -+# a single device callback or generic action -+# contents: start/stop times, pid/cpu/driver info -+# parents/children, html id for timeline/callgraph -+# optionally includes an ftrace callgraph -+# optionally includes intradev trace events -+# } -+# } -+# } -+# } -+# -+class Data: -+ dmesg = {} # root data structure -+ phases = [] # ordered list of phases -+ start = 0.0 # test start -+ end = 0.0 # test end -+ tSuspended = 0.0 # low-level suspend start -+ tResumed = 0.0 # low-level resume start -+ tLow = 0.0 # time spent in low-level suspend (standby/freeze) -+ fwValid = False # is firmware data available -+ fwSuspend = 0 # time spent in firmware suspend -+ fwResume = 0 # time spent in firmware resume -+ dmesgtext = [] # dmesg text file in memory -+ testnumber = 0 -+ idstr = '' -+ html_device_id = 0 -+ stamp = 0 -+ outfile = '' -+ def __init__(self, num): -+ idchar = 'abcdefghijklmnopqrstuvwxyz' -+ self.testnumber = num -+ self.idstr = idchar[num] -+ self.dmesgtext = [] -+ self.phases = [] -+ self.dmesg = { # fixed list of 10 phases -+ 'suspend_prepare': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#CCFFCC', 'order': 0}, -+ 'suspend': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#88FF88', 'order': 1}, -+ 'suspend_late': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#00AA00', 'order': 2}, -+ 'suspend_noirq': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#008888', 'order': 3}, -+ 'suspend_machine': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#0000FF', 'order': 4}, -+ 'resume_machine': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#FF0000', 'order': 5}, -+ 'resume_noirq': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#FF9900', 'order': 6}, -+ 'resume_early': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#FFCC00', 'order': 7}, -+ 'resume': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#FFFF88', 'order': 8}, -+ 'resume_complete': {'list': dict(), 'start': -1.0, 'end': -1.0, -+ 'row': 0, 'color': '#FFFFCC', 'order': 9} -+ } -+ self.phases = self.sortedPhases() -+ def getStart(self): -+ return self.dmesg[self.phases[0]]['start'] -+ def setStart(self, time): -+ self.start = time -+ self.dmesg[self.phases[0]]['start'] = time -+ def getEnd(self): -+ return self.dmesg[self.phases[-1]]['end'] -+ def setEnd(self, time): -+ self.end = time -+ self.dmesg[self.phases[-1]]['end'] = time -+ def isTraceEventOutsideDeviceCalls(self, pid, time): -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ for dev in list: -+ d = list[dev] -+ if(d['pid'] == pid and time >= d['start'] and -+ time <= d['end']): -+ return False -+ return True -+ def addIntraDevTraceEvent(self, action, name, pid, time): -+ if(action == 'mutex_lock_try'): -+ color = 'red' -+ elif(action == 'mutex_lock_pass'): -+ color = 'green' -+ elif(action == 'mutex_unlock'): -+ color = 'blue' -+ else: -+ # create separate colors based on the name -+ v1 = len(name)*10 % 256 -+ v2 = string.count(name, 'e')*100 % 256 -+ v3 = ord(name[0])*20 % 256 -+ color = '#%06X' % ((v1*0x10000) + (v2*0x100) + v3) -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ for dev in list: -+ d = list[dev] -+ if(d['pid'] == pid and time >= d['start'] and -+ time <= d['end']): -+ e = TraceEvent(action, name, color, time) -+ if('traceevents' not in d): -+ d['traceevents'] = [] -+ d['traceevents'].append(e) -+ return d -+ break -+ return 0 -+ def capIntraDevTraceEvent(self, action, name, pid, time): -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ for dev in list: -+ d = list[dev] -+ if(d['pid'] == pid and time >= d['start'] and -+ time <= d['end']): -+ if('traceevents' not in d): -+ return -+ for e in d['traceevents']: -+ if(e.action == action and -+ e.name == name and not e.ready): -+ e.length = time - e.time -+ e.ready = True -+ break -+ return -+ def trimTimeVal(self, t, t0, dT, left): -+ if left: -+ if(t > t0): -+ if(t - dT < t0): -+ return t0 -+ return t - dT -+ else: -+ return t -+ else: -+ if(t < t0 + dT): -+ if(t > t0): -+ return t0 + dT -+ return t + dT -+ else: -+ return t -+ def trimTime(self, t0, dT, left): -+ self.tSuspended = self.trimTimeVal(self.tSuspended, t0, dT, left) -+ self.tResumed = self.trimTimeVal(self.tResumed, t0, dT, left) -+ self.start = self.trimTimeVal(self.start, t0, dT, left) -+ self.end = self.trimTimeVal(self.end, t0, dT, left) -+ for phase in self.phases: -+ p = self.dmesg[phase] -+ p['start'] = self.trimTimeVal(p['start'], t0, dT, left) -+ p['end'] = self.trimTimeVal(p['end'], t0, dT, left) -+ list = p['list'] -+ for name in list: -+ d = list[name] -+ d['start'] = self.trimTimeVal(d['start'], t0, dT, left) -+ d['end'] = self.trimTimeVal(d['end'], t0, dT, left) -+ if('ftrace' in d): -+ cg = d['ftrace'] -+ cg.start = self.trimTimeVal(cg.start, t0, dT, left) -+ cg.end = self.trimTimeVal(cg.end, t0, dT, left) -+ for line in cg.list: -+ line.time = self.trimTimeVal(line.time, t0, dT, left) -+ if('traceevents' in d): -+ for e in d['traceevents']: -+ e.time = self.trimTimeVal(e.time, t0, dT, left) -+ def normalizeTime(self, tZero): -+ # first trim out any standby or freeze clock time -+ if(self.tSuspended != self.tResumed): -+ if(self.tResumed > tZero): -+ self.trimTime(self.tSuspended, \ -+ self.tResumed-self.tSuspended, True) -+ else: -+ self.trimTime(self.tSuspended, \ -+ self.tResumed-self.tSuspended, False) -+ # shift the timeline so that tZero is the new 0 -+ self.tSuspended -= tZero -+ self.tResumed -= tZero -+ self.start -= tZero -+ self.end -= tZero -+ for phase in self.phases: -+ p = self.dmesg[phase] -+ p['start'] -= tZero -+ p['end'] -= tZero -+ list = p['list'] -+ for name in list: -+ d = list[name] -+ d['start'] -= tZero -+ d['end'] -= tZero -+ if('ftrace' in d): -+ cg = d['ftrace'] -+ cg.start -= tZero -+ cg.end -= tZero -+ for line in cg.list: -+ line.time -= tZero -+ if('traceevents' in d): -+ for e in d['traceevents']: -+ e.time -= tZero -+ def newPhaseWithSingleAction(self, phasename, devname, start, end, color): -+ for phase in self.phases: -+ self.dmesg[phase]['order'] += 1 -+ self.html_device_id += 1 -+ devid = '%s%d' % (self.idstr, self.html_device_id) -+ list = dict() -+ list[devname] = \ -+ {'start': start, 'end': end, 'pid': 0, 'par': '', -+ 'length': (end-start), 'row': 0, 'id': devid, 'drv': '' }; -+ self.dmesg[phasename] = \ -+ {'list': list, 'start': start, 'end': end, -+ 'row': 0, 'color': color, 'order': 0} -+ self.phases = self.sortedPhases() -+ def newPhase(self, phasename, start, end, color, order): -+ if(order < 0): -+ order = len(self.phases) -+ for phase in self.phases[order:]: -+ self.dmesg[phase]['order'] += 1 -+ if(order > 0): -+ p = self.phases[order-1] -+ self.dmesg[p]['end'] = start -+ if(order < len(self.phases)): -+ p = self.phases[order] -+ self.dmesg[p]['start'] = end -+ list = dict() -+ self.dmesg[phasename] = \ -+ {'list': list, 'start': start, 'end': end, -+ 'row': 0, 'color': color, 'order': order} -+ self.phases = self.sortedPhases() -+ def setPhase(self, phase, ktime, isbegin): -+ if(isbegin): -+ self.dmesg[phase]['start'] = ktime -+ else: -+ self.dmesg[phase]['end'] = ktime -+ def dmesgSortVal(self, phase): -+ return self.dmesg[phase]['order'] -+ def sortedPhases(self): -+ return sorted(self.dmesg, key=self.dmesgSortVal) -+ def sortedDevices(self, phase): -+ list = self.dmesg[phase]['list'] -+ slist = [] -+ tmp = dict() -+ for devname in list: -+ dev = list[devname] -+ tmp[dev['start']] = devname -+ for t in sorted(tmp): -+ slist.append(tmp[t]) -+ return slist -+ def fixupInitcalls(self, phase, end): -+ # if any calls never returned, clip them at system resume end -+ phaselist = self.dmesg[phase]['list'] -+ for devname in phaselist: -+ dev = phaselist[devname] -+ if(dev['end'] < 0): -+ dev['end'] = end -+ vprint('%s (%s): callback didnt return' % (devname, phase)) -+ def deviceFilter(self, devicefilter): -+ # remove all by the relatives of the filter devnames -+ filter = [] -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ for name in devicefilter: -+ dev = name -+ while(dev in list): -+ if(dev not in filter): -+ filter.append(dev) -+ dev = list[dev]['par'] -+ children = self.deviceDescendants(name, phase) -+ for dev in children: -+ if(dev not in filter): -+ filter.append(dev) -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ rmlist = [] -+ for name in list: -+ pid = list[name]['pid'] -+ if(name not in filter and pid >= 0): -+ rmlist.append(name) -+ for name in rmlist: -+ del list[name] -+ def fixupInitcallsThatDidntReturn(self): -+ # if any calls never returned, clip them at system resume end -+ for phase in self.phases: -+ self.fixupInitcalls(phase, self.getEnd()) -+ def newActionGlobal(self, name, start, end): -+ # which phase is this device callback or action "in" -+ targetphase = "none" -+ overlap = 0.0 -+ for phase in self.phases: -+ pstart = self.dmesg[phase]['start'] -+ pend = self.dmesg[phase]['end'] -+ o = max(0, min(end, pend) - max(start, pstart)) -+ if(o > overlap): -+ targetphase = phase -+ overlap = o -+ if targetphase in self.phases: -+ self.newAction(targetphase, name, -1, '', start, end, '') -+ return True -+ return False -+ def newAction(self, phase, name, pid, parent, start, end, drv): -+ # new device callback for a specific phase -+ self.html_device_id += 1 -+ devid = '%s%d' % (self.idstr, self.html_device_id) -+ list = self.dmesg[phase]['list'] -+ length = -1.0 -+ if(start >= 0 and end >= 0): -+ length = end - start -+ list[name] = {'start': start, 'end': end, 'pid': pid, 'par': parent, -+ 'length': length, 'row': 0, 'id': devid, 'drv': drv } -+ def deviceIDs(self, devlist, phase): -+ idlist = [] -+ list = self.dmesg[phase]['list'] -+ for devname in list: -+ if devname in devlist: -+ idlist.append(list[devname]['id']) -+ return idlist -+ def deviceParentID(self, devname, phase): -+ pdev = '' -+ pdevid = '' -+ list = self.dmesg[phase]['list'] -+ if devname in list: -+ pdev = list[devname]['par'] -+ if pdev in list: -+ return list[pdev]['id'] -+ return pdev -+ def deviceChildren(self, devname, phase): -+ devlist = [] -+ list = self.dmesg[phase]['list'] -+ for child in list: -+ if(list[child]['par'] == devname): -+ devlist.append(child) -+ return devlist -+ def deviceDescendants(self, devname, phase): -+ children = self.deviceChildren(devname, phase) -+ family = children -+ for child in children: -+ family += self.deviceDescendants(child, phase) -+ return family -+ def deviceChildrenIDs(self, devname, phase): -+ devlist = self.deviceChildren(devname, phase) -+ return self.deviceIDs(devlist, phase) -+ def printDetails(self): -+ vprint(' test start: %f' % self.start) -+ for phase in self.phases: -+ dc = len(self.dmesg[phase]['list']) -+ vprint(' %16s: %f - %f (%d devices)' % (phase, \ -+ self.dmesg[phase]['start'], self.dmesg[phase]['end'], dc)) -+ vprint(' test end: %f' % self.end) -+ def masterTopology(self, name, list, depth): -+ node = DeviceNode(name, depth) -+ for cname in list: -+ clist = self.deviceChildren(cname, 'resume') -+ cnode = self.masterTopology(cname, clist, depth+1) -+ node.children.append(cnode) -+ return node -+ def printTopology(self, node): -+ html = '' -+ if node.name: -+ info = '' -+ drv = '' -+ for phase in self.phases: -+ list = self.dmesg[phase]['list'] -+ if node.name in list: -+ s = list[node.name]['start'] -+ e = list[node.name]['end'] -+ if list[node.name]['drv']: -+ drv = ' {'+list[node.name]['drv']+'}' -+ info += ('
  • %s: %.3fms
  • ' % (phase, (e-s)*1000)) -+ html += '
  • '+node.name+drv+'' -+ if info: -+ html += '
      '+info+'
    ' -+ html += '
  • ' -+ if len(node.children) > 0: -+ html += '
      ' -+ for cnode in node.children: -+ html += self.printTopology(cnode) -+ html += '
    ' -+ return html -+ def rootDeviceList(self): -+ # list of devices graphed -+ real = [] -+ for phase in self.dmesg: -+ list = self.dmesg[phase]['list'] -+ for dev in list: -+ if list[dev]['pid'] >= 0 and dev not in real: -+ real.append(dev) -+ # list of top-most root devices -+ rootlist = [] -+ for phase in self.dmesg: -+ list = self.dmesg[phase]['list'] -+ for dev in list: -+ pdev = list[dev]['par'] -+ if(re.match('[0-9]*-[0-9]*\.[0-9]*[\.0-9]*\:[\.0-9]*$', pdev)): -+ continue -+ if pdev and pdev not in real and pdev not in rootlist: -+ rootlist.append(pdev) -+ return rootlist -+ def deviceTopology(self): -+ rootlist = self.rootDeviceList() -+ master = self.masterTopology('', rootlist, 0) -+ return self.printTopology(master) -+# Class: TraceEvent -+# Description: -+# A container for trace event data found in the ftrace file -+class TraceEvent: -+ ready = False -+ name = '' -+ time = 0.0 -+ color = '#FFFFFF' -+ length = 0.0 -+ action = '' -+ def __init__(self, a, n, c, t): -+ self.action = a -+ self.name = n -+ self.color = c -+ self.time = t -+# Class: FTraceLine -+# Description: -+# A container for a single line of ftrace data. There are six basic types: -+# callgraph line: -+# call: " dpm_run_callback() {" -+# return: " }" -+# leaf: " dpm_run_callback();" -+# trace event: -+# tracing_mark_write: SUSPEND START or RESUME COMPLETE -+# suspend_resume: phase or custom exec block data -+# device_pm_callback: device callback info -+class FTraceLine: -+ time = 0.0 -+ length = 0.0 -+ fcall = False -+ freturn = False -+ fevent = False -+ depth = 0 -+ name = '' -+ type = '' -+ def __init__(self, t, m, d): -+ self.time = float(t) -+ # is this a trace event -+ if(d == 'traceevent' or re.match('^ *\/\* *(?P.*) \*\/ *$', m)): -+ if(d == 'traceevent'): -+ # nop format trace event -+ msg = m -+ else: -+ # function_graph format trace event -+ em = re.match('^ *\/\* *(?P.*) \*\/ *$', m) -+ msg = em.group('msg') -+ emm = re.match('^(?P.*?): (?P.*)', msg) -+ if(emm): -+ self.name = emm.group('msg') -+ self.type = emm.group('call') -+ else: -+ self.name = msg -+ self.fevent = True -+ return -+ # convert the duration to seconds -+ if(d): -+ self.length = float(d)/1000000 -+ # the indentation determines the depth -+ match = re.match('^(?P *)(?P.*)$', m) -+ if(not match): -+ return -+ self.depth = self.getDepth(match.group('d')) -+ m = match.group('o') -+ # function return -+ if(m[0] == '}'): -+ self.freturn = True -+ if(len(m) > 1): -+ # includes comment with function name -+ match = re.match('^} *\/\* *(?P.*) *\*\/$', m) -+ if(match): -+ self.name = match.group('n') -+ # function call -+ else: -+ self.fcall = True -+ # function call with children -+ if(m[-1] == '{'): -+ match = re.match('^(?P.*) *\(.*', m) -+ if(match): -+ self.name = match.group('n') -+ # function call with no children (leaf) -+ elif(m[-1] == ';'): -+ self.freturn = True -+ match = re.match('^(?P.*) *\(.*', m) -+ if(match): -+ self.name = match.group('n') -+ # something else (possibly a trace marker) -+ else: -+ self.name = m -+ def getDepth(self, str): -+ return len(str)/2 -+ def debugPrint(self, dev): -+ if(self.freturn and self.fcall): -+ print('%s -- %f (%02d): %s(); (%.3f us)' % (dev, self.time, \ -+ self.depth, self.name, self.length*1000000)) -+ elif(self.freturn): -+ print('%s -- %f (%02d): %s} (%.3f us)' % (dev, self.time, \ -+ self.depth, self.name, self.length*1000000)) -+ else: -+ print('%s -- %f (%02d): %s() { (%.3f us)' % (dev, self.time, \ -+ self.depth, self.name, self.length*1000000)) -+# Class: FTraceCallGraph -+# Description: -+# A container for the ftrace callgraph of a single recursive function. -+# This can be a dpm_run_callback, dpm_prepare, or dpm_complete callgraph -+# Each instance is tied to a single device in a single phase, and is -+# comprised of an ordered list of FTraceLine objects -+class FTraceCallGraph: -+ start = -1.0 -+ end = -1.0 -+ list = [] -+ invalid = False -+ depth = 0 -+ def __init__(self): -+ self.start = -1.0 -+ self.end = -1.0 -+ self.list = [] -+ self.depth = 0 -+ def setDepth(self, line): -+ if(line.fcall and not line.freturn): -+ line.depth = self.depth -+ self.depth += 1 -+ elif(line.freturn and not line.fcall): -+ self.depth -= 1 -+ line.depth = self.depth -+ else: -+ line.depth = self.depth -+ def addLine(self, line, match): -+ if(not self.invalid): -+ self.setDepth(line) -+ if(line.depth == 0 and line.freturn): -+ if(self.start < 0): -+ self.start = line.time -+ self.end = line.time -+ self.list.append(line) -+ return True -+ if(self.invalid): -+ return False -+ if(len(self.list) >= 1000000 or self.depth < 0): -+ if(len(self.list) > 0): -+ first = self.list[0] -+ self.list = [] -+ self.list.append(first) -+ self.invalid = True -+ if(not match): -+ return False -+ id = 'task %s cpu %s' % (match.group('pid'), match.group('cpu')) -+ window = '(%f - %f)' % (self.start, line.time) -+ if(self.depth < 0): -+ print('Too much data for '+id+\ -+ ' (buffer overflow), ignoring this callback') -+ else: -+ print('Too much data for '+id+\ -+ ' '+window+', ignoring this callback') -+ return False -+ self.list.append(line) -+ if(self.start < 0): -+ self.start = line.time -+ return False -+ def slice(self, t0, tN): -+ minicg = FTraceCallGraph() -+ count = -1 -+ firstdepth = 0 -+ for l in self.list: -+ if(l.time < t0 or l.time > tN): -+ continue -+ if(count < 0): -+ if(not l.fcall or l.name == 'dev_driver_string'): -+ continue -+ firstdepth = l.depth -+ count = 0 -+ l.depth -= firstdepth -+ minicg.addLine(l, 0) -+ if((count == 0 and l.freturn and l.fcall) or -+ (count > 0 and l.depth <= 0)): -+ break -+ count += 1 -+ return minicg -+ def sanityCheck(self): -+ stack = dict() -+ cnt = 0 -+ for l in self.list: -+ if(l.fcall and not l.freturn): -+ stack[l.depth] = l -+ cnt += 1 -+ elif(l.freturn and not l.fcall): -+ if(l.depth not in stack): -+ return False -+ stack[l.depth].length = l.length -+ stack[l.depth] = 0 -+ l.length = 0 -+ cnt -= 1 -+ if(cnt == 0): -+ return True -+ return False -+ def debugPrint(self, filename): -+ if(filename == 'stdout'): -+ print('[%f - %f]') % (self.start, self.end) -+ for l in self.list: -+ if(l.freturn and l.fcall): -+ print('%f (%02d): %s(); (%.3f us)' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ elif(l.freturn): -+ print('%f (%02d): %s} (%.3f us)' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ else: -+ print('%f (%02d): %s() { (%.3f us)' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ print(' ') -+ else: -+ fp = open(filename, 'w') -+ print(filename) -+ for l in self.list: -+ if(l.freturn and l.fcall): -+ fp.write('%f (%02d): %s(); (%.3f us)\n' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ elif(l.freturn): -+ fp.write('%f (%02d): %s} (%.3f us)\n' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ else: -+ fp.write('%f (%02d): %s() { (%.3f us)\n' % (l.time, \ -+ l.depth, l.name, l.length*1000000)) -+ fp.close() -+# Class: Timeline -+# Description: -+# A container for a suspend/resume html timeline. In older versions -+# of the script there were multiple timelines, but in the latest -+# there is only one. -+class Timeline: -+ html = {} -+ scaleH = 0.0 # height of the row as a percent of the timeline height -+ rowH = 0.0 # height of each row in percent of the timeline height -+ row_height_pixels = 30 -+ maxrows = 0 -+ height = 0 -+ def __init__(self): -+ self.html = { -+ 'timeline': '', -+ 'legend': '', -+ 'scale': '' -+ } -+ def setRows(self, rows): -+ self.maxrows = int(rows) -+ self.scaleH = 100.0/float(self.maxrows) -+ self.height = self.maxrows*self.row_height_pixels -+ r = float(self.maxrows - 1) -+ if(r < 1.0): -+ r = 1.0 -+ self.rowH = (100.0 - self.scaleH)/r -+# Class: TestRun -+# Description: -+# A container for a suspend/resume test run. This is necessary as -+# there could be more than one, and they need to be separate. -+class TestRun: -+ ftrace_line_fmt_fg = \ -+ '^ *(?P

    YE^?8Scrpxgwac2rTBe>3j z_(-7lOm#>}*NA%Li@i8q)0yAhn;Yr`-LPsMkG1CpIz&Vvt03)HxeJ6JBm8=C;o7ts z*^UF!z}nmy(o$opws+saQ?Ak5R-s4G#W{eyh!jbYAU405VCi23qv<^8iBLZ!aQ`*1btvn2ls7KHzTsTO3A|fswZCeF*x!dY8g;GbQdu!adwqE3>Yn1Fs0}*NlVrjK+ye21o>tJYR zrAYu+uIpWBe5p=f zxL;O`Emkee6m{5Bag4Z8{UcbUP^E2TTc(+PjP|#?XolXR;7%b;XcD{2+#m7fUVxyF zCGq<6GL)+$xlM7!I^q9h(8kjQ`uM!9Ec(~QRwz}06M5qd_UJZ(+TI(kLD8HJ*KnA~oSQ zI}fje?Rq^jl)B+#r$G6&1e}e0E>|_#irJuT=_9u%O--QnIJ1Z@zS4#Q?=@9lRmjCB zRnE1+C>2y_`1^9P68;wYpX`Q@+QCR{#~m2Is_~QgE%8&F2u^A-h{ZW?GRi=JWnRgG z@pk952sIaTEt%oVZPwX{atQ!8mx^(-(MVG;v&jd4{d5x&VcKP!m;rK9XNG+pC1Zw9 zO#Uv;#5Y`MaT{$m#b*c~+Zpg+K3nX1DHoc$9CTkE&=|D$W&wu1jeO}Kd6b*Lg5YBU z+#AxBoxTdn~sHlaJe471L}k6 zKW)*eZTT`^v%Xn>X*J3}4eW+(k(_lMwSv9fI@a9aNg2gn$CY&o8`|OCjvO6 z3ghJ$38R1T!muM|yR?U8F96pNlJL22?hz9^R5TqF%a>QXP&&QxXgVh71Gnxe7WWp>I5%d{M z_V%3-RldTF6793j8xEye9@>Y5Qs@XI0Nz;lVP|}65*Of{Y=v$C!Rp{#>O1Tt;aMlX z2>)_DWGA^0o3#NuO9Sr1@Dr`I_ev_n-DApudmG3U7q77+iP7x$zG{c(Ir0PcwIAS8 zU227(ceg4E!D@5}mH#hQj|@!lQC~U#)zT&ff((Z$4B~lXxP8x&aNhC4C+Gyr^=b;% zZ+no#@5{>TwP!FjQr{uhz!G){hVR0ARxIXMOAJ}&N&``V2QpNvK5X{khY$rMxkdW- zuKDrQU@4oV#i0F#6;&mU&bVpr1(4e09nHNmlK1O^H>q1;*e~wq*GISQfCW$C?md~0-OVH8-_QQQ*9O6i*AQ&ssRwgK8XneqJoQ;0t9>(NdiHU!zq8lkvfF{@Bn!zxHnoi z;SGmI1Zs;bjS3k`3CV-**1dcrZkU&!qgL#Ae>B!HiPGnww)3pfmh^p_SNimCzB(WS zKL}p+dg#(k5iiRzLBB0fh6?|J;2r*n^y~h`+L!$YM!?uiGbtq!8>y9CObE$E`mcsj z4q*cXk(xuNh2u0zgxb;9Cvz2)az9oS$X%r9P@ZyVTgw#?VargV$MIF(AZI^bdv=l` zZNibh%B(hYYq0x~2s~RRQgD^q)RM3h42rn@raH(bf`)Hg?8k)7hYX#0{9~A>IngCZ zpWxx;Ju}zOeHtvECjBE5oJd>Z+WoN7DN)w6&4!l2m1kY#vg`*g15jp!Bloi<7`Nqc z-RB5VmO>hIzpJS$A)z4j-i*GCxfI&q>e{KDCN@PL5GcJR4lX!Lj9@50S)p|^yj#CX z8Y~nb%oKGT8WPu?gE<^~dLxdKmFd+d*J&JB!Yw5`(&INU5Tc*8lfrt^_yXx*9jdTJ z9N@Hg{Vzi7M7ew`>?IN+iUqnxVhjaQugWa8jS|oeoMdR`rW*TY_LdZpn)>Zm^=1f) zAC5JZIIIbmld{sg@$ogCDv1qG2HCN%P1ZMR3n!m3fhcim4`?#SbCpzP$|+^04Ldfg zv(8If%5Y}Q2e0SiKl_|tCm1#E?WbK`ScL0kW;^5p})G86S z<(4pYw|GEm%3gTX=C+E7#m8WMSRUNh-1p!r8{L^bh?x?;YlJ*>Y)I9go-=v*@PVOs zT$8Yn{r*l&07Ak}s@ZT}?#iqa!Za?tcXC*<`^>pgOL8M|L#|7x+{#FYxNhOzbPPe- z^&gujZs|ZU3+~f~z=90arur9n&Stn{VG}9uSSxl?iG)cn+oPl~Pymp7F^zHrzSIU+ z_^ao(58nDN*70woOTL-xyT0${GwQ)tm5uKanffMi57M}+(36?P*;l16jy9oYmPcBA z(aDiP$5m8YNQ;n~yix^M-w`C0nN=+yn#uYV`P1PHH{WjF2^}AEU>?3esHyJ3c6E3f zDbTO3K(|HwBfEJ>GLwbWH6J%3(_0zs?1EyAy8%mx6gD_QUi9+n0c*E4U9X! z#vUi}5&_nq`s-fH9m8wj=T?F(0{nQ}aawyY5b3LrPbN`(EU#bZ;^E+4mGAySAJmGY ze#`SyC3e1Tq;_$r&%?8`%;jW6WWTzu1kj_8P~WZPV&RoS8K(s)uXG^kOx9&q{Cx8O z(w45&kdM|dQNp~-4otM=3XEnLc<5!{twRCk@>u@`!JWxH?!fbG1NUot^yKC0PX=a` zX_XugsM`X2e1eR}E#ma*XuB);xJg#Ck0-Es0929&5f10Bv6O7z+D!ARwCH-)A>xR2 z6I5`zvOIRb(8kq7lle%75&;|-w{tegU?F^NZ*N%pIduoJgbKgEEg>*)<97qry^hsn zOKvR3d@A&lcux14U472!`G}`^(NYxL0|LMrx%~-F7pWOFLf*4ozWcFkXFf>V8yezl ze#9{;D7^qT*ZNW>CqKdFIK0i6mu=eZB%FV>OZoJ@Ke7VEBoV~DbB6Z(K>0nZ(OP&` zMTVltoyufkcULT`8RCsqvo5AKw?kmqI{&$5-O5)bmgXCAzpzoWgQo7(5A!P8#|`~5 zg}3G>byPqo#{IsGusH5fvwcfSlUGH`aO(-x6iNpe{a*4A3Y(8IF+UMx+*4Xew=}G8 z{S~M704ru$Px)L0Vj{IlUI#oPEX3NbtqKiHQ%7hKu5HCQG9FH?0j)k8z<{YT)ZoaQ zb{B@~M`rDbyEi2#e6Fh-KED0PDYlO#Q#|RoEZ&0Rrm-Za^fFZwD$Euy#uX~&0Aq26 zvE@B6Ez%lC+RkFCA~uQD?TsZc?0NO4UFRdgE2=k-H4$D)HoTbnOPeEL79qe{#nbGO zKHP6z1E1+*MC>tAuP>uH{4vSLZ&E~2%xYp+DJ94NGvkoAv%GFhIgtd=|5BWKX~=XV z0h8e!t?MhI=u_N9CKv|7#u=!*^xn`l>7C_t>&yLdtORHDP()HdO$-l^E32z7u$TZ z=FNLUW@Vke3!EZJes6+@TsvM=7{|v!^6qa3O^|RBUBeYN$7zZ=0<5{o%a0&6wXCDu z>L~A&F2}c`meuRfp4Z)gqlHJwY-yCfmH{u-hwazNFx<>ynF%Z_Dg0Z6_hgZq8Dtna zz)B)L|H~6{yJ}IM^_9?2Elvoe;^|Jlr<0aN`vekbhyeH^)ykHtzBu5LF44)pr5SrH z4WOSxJlhCW6J81_ONy}fieyc@i0W{IJ-ekQDx`{Md3K$zWGCi4VLER0J2i1Kli1x) z=o6?^MbUztO}ZpA@72j)aMeBgNKz~8m`$np+YMGTQOrq03f51MS+<}Y$5&w7swXSW zO5g$P zg7T)jd~6cKaVT<(Gu%3jps5-}(Q$(!qKHsH+YQa582{(x;%8UaNuDVrVZRk zOPV-mL#YJ|HJhQuAfl3!Hq&;IXE_W+t>Yw}$(l&Jl5!`cdsnbHQlA2kR*RFH{}4z= ze*-pBhnMj3U=zWv*p>#(~5Q3p|&I7bP0;z#=2`$(mbFq|Pd@L?NX(g$C(P!6Bn zmSmoEa+@PSv|8M0^jr5YaSVTllKSJPXx3Wa)+t8_XwvR8he+#?SuE#W=SPN(6jY|S z5tiYD8XyL|1?|~1eqaV)>TE*CJlM3vQKGRL%~|=Jyw$hZ$(?(8rz~FmK;Q8qJW*$= z=PulY({*e@D9r)=t>=g}>M^cnbi&>mI10j(0A7-5j)sdV8 zGu+5xiK+{xPz>onPWh?^04@*gViZ&W5_gaIor;at3yEC-R&;ayQG4OuZ}IT{w{sOR z!_+VEU*&((Q1EqUBf}50{!6MLVRP9za^6%qKIc#I966xC&;R2sy?ISZR9qYLj8pGhbibm>LgIR%7G1Wt3plAtOCt2LRa4&d5^!OtcIt!rlIj0OQLFm18^- zU|Z*zlHMkty{jrKSF}QC(A{E|6%wK^KZ^EhQcrNzrs*uTE{s$IDoAZw4b`Pd#!~)9 zdT3{zqwCLQ=X9Q(k3uVunxvdB%I`z+QW!LcvH_p>8uhy9_Z@2@2CSQ0J>L`ZX-FHE zLOM>u6D-qiD`zO{Aq^2W_3A4v+ZMoo|Qov5+hzw0+DOym*=`vdwjTzWtcJG1aGpG zY;~5OntDsF-WrSB;?xMlQPKPVj3b=O^kw1K!e6pR#1<=Nc&bTH{qdYiD_aQ4{(oUn zDz`MCV~^XOwarw8B@Pko?9?4;bJ_Bhmja=wm1qM=`0taX(C^%9YwW}RV2D{+H zo*Ripmgd4vcqFI(;>KXe$-ovbq;({Kv|s%-<kZ*qxb`7NI6B0=6C60Cc%V6pdU?G=x$JVZ@;EbB4Jmr5OT8*R$!;! zo{D(C$ai!g0lHsrp3YP4$>)lWhS7*8Sdt*XuKryiP$>z>F~+YIX6UDIin(ISs{VL@?ioRsxoHq_ zgOz$cDjOl%KWr9qbr*r@p|Mauc_Ht!7&-v-7=^K+(@JJ2f&-R%c#MHa<&Kr(CHjne z6B#IfR6y->JcN|L1SR-n_qmyPI>guzhCf5T8NF4GHVj!xn&8&Z1W}Z#sX?VhM-KM# z4BX`!rmjab)L8X-Z(|0?)7+4$p(7_qafUK0~z`(5OjoF?3Q`j8{ zN^R#CRp?U4ht@T=C@ZvKL)6LK4MC zqU|*p%hTOH?N{r2{3Izw+Yb5w&V7mmAw6Q2o;j?JXl=x3RsqYc??diP72&q|{YGKc z$|PmM2rM6iL}xR`SX+e0np`1fS%@FBL7SW!S()mJibhJkAz^bT)!^wZ94ah;{%%Nb zn0i7*W>@|9;a}{$%%D`^x_kJILvDVns}sgb2%AQ7f*jPPCA0X(AKZxLLy7vMvAlZ@ z_|B$=Gc~+)1=yTWmPdykK1MnFT#tnmx)Y5f;BL4Jwrw;s*X8;G^S65^ZEDCq8rX%1@jsf}u z%ki`F&j3r7)SMcYhO({vx5D~EdIBMq3Uu&?o8_J)`7uZ{sf(~8l`E0oBxj#9au1Iv*l zOSK#1bBA#0vXea*_?C4nV7%Z`R^3UTbt0Ug%lRup;pd0zD zOF1M=@}r`p$V4LD9spQjeJc^Ix9#Mx?B1k{o=I3)jKxQyS4>&6hPQu}ac|cR#Wugz zjs(i(Cmr~IqRghbV&J-XmZ<|(1?xfNxCl({)o;dbo+`v(Uka_utKfG$M_L4r*{*?;vA zZ#H-|t6&QS)%Q#)M8R^eyGAi01I2~_T~GE1TesisLVGpZ_8#YT0DpS}D^FP4wTim$ z3o2u=EYZrWgNrvESoh6UyhS6ruA!+{34&$B>t!{aTvx`PoL-AEvz62nIAwSuwdyI^ z?AnWMcPQOc(1f3}$Qm7;Cudd&AT%4P8Zo-F_c6YxZEB~v+DS&b@BW=^4nBrlCCZ<% z!`Nt@&FU{D{Q}B#OwKjfAZe2^< z(0;Advov&L!TA;3##7LgFdCIsWy;#0zrhS#9&c3-@Yk*_IoiG?yu4?&1F;#_U@{|T z$7{CSPaA`)cxFefInOp#c3s7u_OZIj#UNedDOhwN7xJ_1AX2g4#tBrzCKoeF26FIx z=8(MEJq;6hh7W|#9`v$cbQReDwf0sutsS=FtrX#?&7Ug6vTt1B8J!dqbqu41UXsRY zk^GiVUeo(7<%aD(a;tn*KQUYakmT)NQ`|n9D2ne?9BM0gWhY5>?gi=Aj+yqwp>%EmRJ+2-WMmG{~d4nuH+njP=`;RX%j z$dtNEt$m-4!`*)0by1gFU%?kmKOToMBHxRkwLTohVqC4W6updAB_1W7FC_6NZ~-I^ zA#GqBTN7Xa1@Qj24ABW5MQum7;~&v^(x@!1to|p!3|p|6YVm`R+P-0m9ST6!9DCc9 zGrp#~>r0UK94)=JTr%=Cos0G)Jg!i~Q&rzz(2N>|_o)Sa5&i13kl&=xp74ctGNgqI z&A_)G9Aj`R4p2ZK9K6s0|b^P=~&=oO1Q4MAP;glkVYZ$*D?Qv*CWU52&t>LimWFvx1+ z)9Zap&o)AT8C$#b>e|5Khlac*mVdTkq`bBTnq-f2aYg-vid#4KfB&ho_M#>PV}Dyc z8}L?8L6Wp&3dD#Sd9Gm3neL3eni_fcC|g#XdqTCo_Rw7x-eEJoJU)?_=2FL|kKB}g zvUGEQC&-_CXA)HI9y=QQ<_%pgqk&!N_Ul_NB9sqb(9$UyUBW(=^37x4q5N1H69@yz zck@+lDXA<0(%`oE-m48t^3Sosn!jfI<`?BOKk&i?;o98t!+T)5oT1%j)~MFUNASg< zFh4JpK=7Cf*3oB!iFE;S(jFx-UVt)`S9)#LaP0vjz7ax-&67W8>nCE9s)^)MhRio{bd{t1x)ZO-N!^{9cy(5>IKuKmxs_<>YRc0Zo2FkJ9$H+Q zkhT5I=h=G6o)%a?zT*h?p|kT*z)4d078lv#MbM2UDJ?9D|HTPJ8BPag_zTI( zm1Ff3lR~5S(&cGhLZyybO(zMk}u;`~?!x_U9~v&aS= zBqBH%R76ed$}Ou=@-EsuC$}TlwtG`LBOrq>@ku9~0zv6Iegopa+wR^)7rbK~ul-6u zp6J&LZ+G-(f~{*bpY(uMUzUwfTQjSSk0F})J>dV8*|CU*1LM%}uR!L#wOc&*kKt^+aoT4%VhieAEBk_Xc<9Jb-yra~SBDPRqb7x#y>}A_o%z8Im{Tmxt zi+Gx;=P^m7hewAraof}Ad% zl-n;5Hls#i%TfT47z@bsK!>Y>vxb%w(`3MCLQh<|?Z1X@#Y%Q!|iS%%B3 zt+qUtDF(fow&>#+?FG^J^k-6DZ)M&=Np;6&(mtG^%K*faq6N^+FwO4*9?rzv8-CsX z&ebMeU`f+C_G7HHYN*}5SUUD2`7y>SsjJbYNn;1WAd`ZLL$FH;P~(6n)N-3 zboWng&y57s=xyK1G~7zysMzq+90>=w84_7`3t;m|R9w;trwK(4+8 zS*V;c!UyE}funU*ZS9Hqd*p$;!uNS2+Kp*Lix}(O>LODLSp%vli9=)ddLojrHMr)= znv@0OSC*4uw>5Ca@tzD7T5F&!vsov`nIaqRN|j2Tq4$8ogOE1CKxc|yPjqch()Lx8 z$rdZDRf2Oz1*@B_M+ANkH1DdAcbXD$GhTP1{hi{`G<-$sV;EK%{ z$g?xz&62wrC&H`4r8=Wt+ozVB6ZkoOK3X8?YA*Nqc)xoAI9RRYQp85NpgdKtWl`Oc zsbq}$V=HTNGZDa902o!smXK#EA%CfiafMGM#I2^+Nk&+cZGVJhkpbeeHi?Aim3n!& zN2jF^B>weRk1E`$^t{%3Wn0lnO2@O27k-xfR6WjKt8P}z1@GEyBK2n<2Z2Df_0+S^ z%9>8Ihc0HPmovCrv7e}!vzm820CtMe5Mqo5q{7OX_W*-_zxQ}{E`hc^a*mxD_8O4Z zl*@t;cYfO&I02&_paQuBmR>qgZJEC)Z~U$YeP^t}5EtnsuG+{;zEC%XK+`wLyyPY7 zgxc8Yh8J~qNZouE|GrqOTSYO~6TuuyEw}BEHMWlf%{DFEOU%-eAb0wDq~|;oCQe21 zc+UGIdv`nIlXeXwr`wj{%w@iT|KUUY2`{(c1m`K`X(sM2uS7GR=X6{| z;(!eVQ!!%L#7BW=BxQqds!bSV;nNk~59z-JO zyDZ@7_ZJp_V*we=n#g_ARI8){tPlPhvk_OVPS#YE<3{RQBbj^5)NC)hZx@oEf36sE zJShNg2n9p7EV1)gw?rCr%qmPcja86{H*ZCE~G{g{6MML+nme}DR_m*f3{}fx&1sv}A>g*O_>mpCc-`((vupZH` zQJrrqSKLB$>Fj5xXyrMOfgCpODqeEILBJvUdjN}bLibnF7_rhgzcGlB?U!Uj{ZM4- zJ&9036D+|-unAlFKV{4r3ZPSJWO2pm5e`5lBS6l)EPGCDYu%B(RuP_nW9*KF+WhrW=xESaeTLBQXtjFQ;G`s!LMVD%G~!5q)tZ6E$gzr!Xb$iVQOx46XN1{z)C+o5XBMV$2{ajU{@y=cMXo#Sm{tPk`{ilN589 zW~Q#btmYcb#^o<@@*E{hzjJYv&1Em4^wVRQr;Fh;&Al-iK;ugZ*R7-cT@fk<6w{ciXe>p)qbZ9c) z_lzQGddN)YO*bzhz%dzUs;x&`T*N?SO~4qgdU5jn;PwDR*I3kkaO)rL0iHq~!G?sr zqL?geW=i&@C#7pmZ>0hSCF$Y}w!qKx61%+=a>RF3Qk<*g1)H~s7#Qrom3 zV>SX;lg3MiZbxm}-V=r^Xccz z9^b+gY`w;KZ`m-Y>ff5iWj0nj><%dI!855JX==-8SN=7^XUwBv0Tpe7=uKZbG!1Fv zkbrbi*374m(x-mSD!rnwVwF}{zkw87ot+XJowY|`CGCQNFy6J6yw_)luj-16h3Q@KD(7`cG@*P~~(d+WC+rqyO9 zoO5(W>MG^g>E%!nMVt;-(#uB#hYv1ZER|=;HR7i2kiag*e*0Wd(R!tXn1*2JlR^T~~%h*R8SLoEAvdRbd;Ga1+*;gfcNZvRt<)3^jEQql6Lqjk;MXjUMVt8H{P; z7NPme=ny;?7yCZn7)@kJAxIGb0$U8%bw^F$#dYTh_C309{jZ?bz=I!U{bji(lfh#M zzWyj%Q!dYM(2d3sxp+yN#Zg4`9)Bq57i05 zcmLE;;hicOawsY6QFGO<{o?~C()(%icel=$gMFEPjuxGST2-voUMPPn6=z&5lg?-zx-oUA30qgy@azWhld$ZkcGx+5t zHSxRa25RCen^^(|FvJ8Jwl_BdQCOCviK$^|ian=%SsH>Z(N9Yy0a?~dUkRP%)?;S| zo?>b}!)Yg%3kT|!%8-H%Pp~}N+l7UEYf72^6Y=p*aO-;lb0YrhQHFd!Q5VU)bO3L5 zj*H@82)#_Dl}YT31!!+NScEo0h6;l*(noFp`&HZpnx^ z?<2;1_sVbrhRe%xxj-!qqmulQtm$T%yX;cEeb-j9=RqU>=Hg037uk_`;>M%=LT^2w z*vN_SE1X^x2^-)Ea&y9q&?XxFN29Ij1)i})>jY(HD}>mY1pR+j^)=wb+8Q1fsb}f0 z_v<58ArUkgkhg*@pii#wK{pcTDA-|6v3@ihV$lZgs@F%gjtiVOkz+jMDn~CW;2KnYfLcJ3>wA`buwJ;nBPPFwK_jW@NEs~h7 zN?1zXJ4i?xVZJjufjBj;2jp)oR*N?CW)5KG?YPa8nM_%H?`~V|$3zq)aYOid_|-EA zZ3cafTr169dm6dh3MVpBhN$cfuM%=>s7)a){tbv<91<=2s>{h56W(BV zsZsitLfkb6{$-xiqdUPv`$!lZ`4st_hSr!l_~$EsB_C@HnBl#>DfjFuJ=+|^s@z3a zs-ky_^sJ8lyHwWhu6}(X*pI03^K8=z`sGM~u+d zT*bb-o1PabPb++b)Pf;C?wSO07mB^VFf?;mjU`p{K_cW*Y=~|F8z|xKw=GmT2}dat zYc;=|Bx1wsfDmt2o=8r1`s2aHmzZd}VF#E&dbgEFUa z-Qmn9NJj+8VcosLuaK}KY+c0Fi#YLSQ8{qU2j&yEy{v2IEK&Y)yA;>~4s9$Ft$&S0; zkN#?_nDZ2g0XoqK>cK)X9FTaiY=3WzMB(Ww$3uBrdJ0D7G#TE^Xr|P4Kt&u8WBP<+ zy1wlMwSSdmu0rFsCbLA+vOnXxy))pI?NA1Ocwp69k~lyooNNmH2k1nrm5&iG<6l@c zstt6NBUB#@VCMl`zi`TZ;InmV)4H(@GF^rFAhiWc{F%AIXE{}ZyMV#vJSXQyFh>iB z5u6^%G!;fU+{vI!^XMi#rZr=-vvQdjIl1wBV9^BwAFjMcHb_ae=H5m!$Ny^10ZF)r z+z51R{xEY@8e&6zZk8H#txK1E)6eb^yU4dQ2Ot0=B$pML+R-_l6F=C^MIn_H%xnGc zxQjn(VV82g2&Ws`RWb;g%SuInPX=>`mKu7MD6Zqk3r6~9KoDPg4+y>d3*X3bsMEAWUnt+xy0ZX-yK zT1unI-T&VJmJuh390|Gs8f}~5cMJvYQ~{%nkRt%<12NKhhs-T;$W9`$P+N0gi;g7L zts?;2l?(SfEyIS-w*D`uJ9cU^!OT*EoDHu$atb6h{{n^r^(=5h1Xr@j$W_@5g`BvC zGoqd@AxngJ)m2)bo>J;f1vX>ZtSVRiP*bP$MW4zO2pM?QHE$(OFaHmxtA|m5!gdWp zY9#{BjJSVEp&nb_OM6m7Vo9P-W)0{@IBrAp5yo{GNjjfaxE<{;gZ}xvg`qC7(`sJX z!WpfRNdsQFc`BO^7>|~_Ohyw_-&i~FdDu(8F-qs_ZAX({w1w{3(2s*|AdoUZXkfzU zm(DJ|W=HrDM^MM!yHML>88d?`T=Tk?9;-jN+zXJ-kr(T+w1AbBowK=56#>4{)Y(a_ zq}2vp$!hUVTz~^>2Tlg1-Y8uNs(jiTV|~cN^ze>_{M?^JJjrCku78v z;TImrUM5Ji-)C}c%po#wzL@#SG<(ODX2dcWb7-e(%d(wh9Ax$;jAhDw=a?)X(D?sFDL_rn<%uE#<-Y)#JKz>_UKHx2!FF9N7Qq%7v%$X$u(kMnJ}^Uxg!V3YT{CR_;YkIdMrny zg227ACntj%-RJ|e<^F}X#4UwXO)WnCx)Q9{Gf{XJSX;{BVkqrnk+EyOFS_~Hme)LK z97?ar&|)EjT1_I=)+%*(VYle=tU$+xMy z1X%p&9$5hFc`uC_1Cu&0@vP$8aZckqv_)v>4a5u&HWrO2<=s$HPBs5*h)GC!U$MYG zmq;-Vm-Q#K(pq6apb2F%9ftL*8RoR>B2Lo+t<9`lvtL2;ii|@l?9~@o_dDjs$Hy!f zOP0MR@dp1DRb*wU!V2H^uOoW!Bb}=J|GVQP0(Lut)BP1r_RkH&TW)~ad3(Ik^9KuM zxw9J;zylAgtZj7Hn)Mr8RaYli2S6xgJGHKKpToT5W?Hv^dl#Ja1muqZ51G??mqPaY z%?vmDXq4%K+qDIbuz^&}v}`oZJkW}g5km+cqq;s)<63AOt)W1xNS>~^iAk40UP7SP z+Sm8KEN06iU|e=wFO(w$jDID~khBY10YdzVPNX$05*HC5?G<~x^?ga()8aV4ZM(=E zrw^WUblAz5ERl&eEP~~6(q-Z!UB`B($4OR?h>*tnxtU2G?z$wsYL1U9_A7`1@v`>} zJ1^Q8m!%!6qw}nM+I>FMi|z;H>R!aBwVcy?92P+6_K78+9^)#pxvu(4{p6wFBWSAe zqt{S%0lKI2w5@`o77R@jVw{rEH!)u3U5G&db=|tcnRHeMW`C+8wCG8^pUfDlk6%>K zzTTNrqL+uY;`$W3N=t}jSrH$nibHWEk9S-DE@Bgwyn6skxA@)-`AOo1-6RSi-1=MG zr6u}HQD+?*;L&5rTx+st%Q%XKeNv8lgK*qlyfr+KIlPb13#i;u-_CkUEQn??t zEvmY5k1biuqUh%ZQYoj;DDli-1=byH@lTks=9!b}bGDjyjTK5L zcnYJWMbzw5h)ov6ES-OKEXozWXG1hE10wfo-c|nAGlr(SR-vrK4eu z$eAYmf+ZtpCHfgg-YtLZZEW37)g?G-#H{;aqxl)!&@o0a0vTARZUCS}Pdnig0@NE{ z6jT_&ol5wbhyZDYVR}-^bKh-Jk-#*fO*}#JxyU;-M3wo!%j-D4&2qzejHdYML!`1C*a-Zb=GQW}lu$XeUM%gWIb)7RLu7 zaJNWdMxh+Z>EGW%Lh(A!E>%gbVj`Ix9?6UFY<@KowJW9y}zQ><>( zw-?T?kgJRr=P@`h!=dpnRI#q?_qUY&;jcSz+yVB~F*lSTz@#n|trkaXqn1R&ud79e zTV?DEq!IeJfl10UJ(yXQw6cJY*tvVmf3H+85E1QMPjFb z0P|&V(Q>4mg%~+KO3sP&b`x1Os#a0Agyn`8=W_x1b^$0+8@HTH|<4UwORTV3~j0%oU!`D{y8!B`6JZ*N%q zyFuwZlxt3QRpbt^*BU5D(}8-$Q!fYkPPBVoHy=mR>A}%*Wl-lPm8a^IXOnt zDbsN)UOB849b10HXQv|ln_96EwgU=#A5N?-hW38L+>hnsZ{b*p&7G?|3O+6Y(l)JI z>@x@0NO;dMCb#6UNl%&-lyQ4)kxHFK)Ii8Y{PDF?ML6c2B*ba%yk?Uk!eA4ac{=@)Q-HaHck{ z4qtYJ5Rkng(9+6nXK%0|oIBqe-p7SOTGs$NR{z?NJSys$FvO!umkzV-nBoUIx6c3M zZ2b#yc&F)6l6Ru)Gz$Hx_TH?sev^D<7?UJy6P0j5(J_8o@yfk5@8+N}O%9QmoYP-J z=2)?b1O{m22TS?VN$d<*e1W%la|65X2!wphSVwl{(u9*fGR-YIMoPwRs1u>1cKltl z9I@D?(1L2_0(8q}M&U3Q4L^)ed#)+`#v(CA>4#S~dw%+0XO2j1L<|oOu+ITVUh;iR zK=;aUlUL0dMWG{ojnzx(j-zYU;=?LvrTt^Zwc zvjd2W>Yy*Bnx^+2vz-PYoFnU8kXB8389+oLSf?Qn4|2L$B~F@*M4FGuvAD=0AgI&n zt!eW~$VA&`@Rv`MtrY8;ZEx-A4Qxtl+r1ZE*}({tulGnb%(cDRwe)7DmqMu@4#>in zTQUWyP~R$ol1W*E>i&;*67#f?A!y46iL%xFCrb?sD!O#e!4JynXnbjNDwa znboTKqx&L_HIDp}7P}TJpD;|O<3a80j51{+-G(duZg`&{D}cahtYgHMH_`^74}aU9 zOT;sqcxoTwKd+55=7cIFQuIFB9(vkymAZ7V?-w8Vu&~1_wW~x9b$O4DHV5Iuo4v;r zih$~vH**er*{)H<=Rn4P>3k=2_${?XI0>=U!&%TR5|Uprm2`I7hO#Y?oQ%>c2kF*+ z^2ELK9VnFL34x3O?t{q+x|`VD$C`L5N3rkFz5@OMs6x}Khq1PRn2YJRhtR0!q$}X@ zltH4gDe`jaVCo^yiePmt>Y4q zS_&G7g};ZwaLKk8EK5jkNin?yECkvhL+j2_ z5J8Zx2L5zO)a(Q~#s;ATXgA50Z`d zVF4*y3nU6cPqZBq?e~ZcSUq?k=vJURHE}%RSlDUk3?mWrXw%96>4_q8Y@ZKcsXOR&dr-q1-bGXW&ZRPA(d1EoPrlPgJ`_;E-!0?We zs`F*J5<4|-7A-u}UdX!W3s4ld)@#&PfgsiHW`rcNe}_;2Ih)fXsG6w8-p^mLBcxW| zc|>HIwPm#iya()8z_+7iqK_-Cg>dZnb(cwED`hI=KVo%+@rE z8DPZPAi*LN(u^F-xSavQK|7EiahRf}tvJm^(F_F3Y3X@Gz=(6Mi2&-LjIF!i^+WXi zD6J1c3$_DqWy?w38k+$|-9n|U<5rhyh1u>81X7Ze@`7SWN0!p5ezuwL;-A`!c#48kyu;`uS zuEX~GP=3)>`4a`uk@9VBYq zOqqip++hi#i*EJn(G}!g1(1>~*mxLnSYSR>EeM=-(9^vt$$#bYL50ib`phTI|B8p` zG@8XQuo)COur!bg1UK9MG#oO5awV->FOrO-^Y$wv#ro9)7t9|f!;qh;~=juQ(|?#X=c;) z8w}BvgfOdL^;t1(Q5-YIsy}sQN8p9c`AjDa<2osf`jmWN?O{;HQq=M5bU3fu5zFb? z!6j-5Cg@!iF3k~ujE>x-i8`-l)Y(5X`^g$P3>4$tq79DCrk?Ukh+sG0Q1X81`Fh+& z!Xyyq5Ayvx_STQt&9+yGD{Q=)sjbqczbQw-Ew+h`&jFm*pC$a;YvM9-&q#ASHs|R8 zjB0PIz26XB3yPM!8(Q?1B=zS!T&=<_BJ3{6u^Frzbr(==?$+I;P7r+ggc3+p-!wEd zMW?A`0yy<&Cd5l}=svhr!xVf${E+v+mN*8RTMY%!*ffq$czEQn2cW00`wxx!2cHr+ z4F6!pw9`w}nQaag8~I1CbB-D@^aE~;q^K8il|5ICmrAzA-oTZLIl(#~CHwE+vd^{n zxMI9`mQoyXFj@vm{1bJL=%NuU{H~XOd_Gtmw%6Td)dyHt=fuFlEoe?WMELueb z@*e{08A2s5U;;iCMHd6sHU?_DbOh2qN-9-0)k;%@PR7cb-;9pDsmY6kMy1)qby1LC zBbAThLYMEG3UJfw2J=(uIggMr3vAcz_wYjY2Ngo;!z6U@qfgD_{eHshK#jesi^RCU z<>JX_L?7qleO@)22#EX{W&G2VTI)9yOVO-d!&%YKfG;(VNl<%O&qs)*y_Bz1xa~6O zvTUC_&NpxE$Q<`pv|n?U7lRl+GYcJu!JW!55Via~8V$tyLFejtsrE(T-TB!*k*Pm` zK#iLCFL=D5-vF!O>uO(1fD_TNzpn?44?;Gk zp6MMFqU(^8-fJcER8i1H>l0C47Eq0fm=0%%4CJVqtSqUG3rVN*ZaStCBFD^jL^|`y z=YEqYmV0WHb!_)Sdv>G&K*P|+Qt&pRn1!x6la-2Ped17U1M?j!W9pvBkjWX=8o%+= z86rvYTud|t%+!0YKUAQW$u1y^Dy57Vt%$^MHg-5dKi_cz)`xjn*+WcNixuj`riE!j z*f|!mOF3^5a|DTdY>dqRXyVvIZ=R}(2H$Qh7u4u*Bz+$+%7u#cMx`Sf8D*f;X$O0%Su=!@S491;1^O}%t z%`OQO+_{hO;O~<{h^c5W;rC3}2U@Nh&oO!N(Q|g%3NVi#PUsJ~XyQb=H^T(-?S6!! zig;q5G78x?4UqKHbIGu`?!K<#ak&ZeL2h#4qFw`)V$(0_^|4j{!cNaOIkOVZES3a9 z4tqDR)6QU!gbcL9rE%?bL!|+Ufda5XdK)M9tBA{B&x@X-IydMDX7z<8b$9$R3r(B$L)`{7t6(& zO2dd{Pfzq>qF%91?}w=}0{p4SUYpv2oRX|7A+n=1e>&e}oa`LJSJH&CVTtmgh-0=% z&J?qX;~k`XMbU_o+`%l!JOV^?wX2a2u+FgPN>K@MwT!;9dOIww#>7QRLwMEcB}fbK z+ECJJ`rf-=_ZFj#6CcnE0V-YLj|7CUhuZy!T}0mUvs8!Sm;Pjm?8PE-Uw)IFB&@ivR zj&n;%6H^87@7lb_j?3V2oCa{Olg4b$1?`}_uWzd`;?rCEIk*6mV7f-Ad@lj(jznggNG&S zKVN}23KV%FP6MrNdf!phjlP`kg3<+{5gn2px|)2#b>~dR&oX0{f*!$vgUKM0^)G^Qr_yEA6aXuuh6PErekFFE z9ZQ`uK&5W5E}%K3#0Sty`*8f?WxeN6f6+RW4X5;vjN6Gw2s_uU;T0;M<%pk5Dm~OI zE|B8#J0-;rex#5y1Q~VVcSxw#IJo$OrJ2_Px)4S1f?NB71b8r;ZH<2?Y|k_VclzJ- zq&xN%Sn2+(n%PXIHcLo9ncj*izPT@Shp;H*IBp^9mIZygGX&zg%!_T%UmLYRe3KSH z_F?Zwbs|GxKxwPoDAf~2g%Ds?D^w+5Kx{eIVowzM4QVijiyIY7eLMiMF7#~zeAhdU za4dJ16Gjw6e9z(^1hte0bS!b8@WL*$9r2_~C>&t~FqP;CF zC+{|9P58fp^+wK0-mQN$kt*;9(6p9KPdW0evmr{62T;_OHNhSeBB$QG({C&hXTVItQFqA*|fS>uCpS!B1bY73u*Y_bQ z0RZ_aGIWnfkb$1^Z)RRd>)Sx%Iz>+otB#yN^9g!2_Cxf3!U^sZrsYCiNLIFYs-6O9 znfkq^v31&Cx(D)Z_9#Jm!t{;GV{*{GDr_?Y*35ooyMGXky8+ccN#oF|7364Fz)srGleiP^_#$t;H}p9* z*n;n7H9^GFie!;0DHEMn04=A(`J?9D5XP{?-l9&sktrt}x ztF=qUr5K=_>#3u!E6_7EY9UDbRrViW8SiW=f6u18dOl zhtN^?`|>ZlvzSDTPF+X%9Lj#}+)YY`T%mtJ*R@Vs)G^kT24jW4M-x^)%j&Zfp|sHP zf+|8bE?~~d#W#|?P74a?#tOag%}t#Oa@AmZPUY<_OZq^e6ri~QAkLtyi5-{mMe2Ls zmLwR)9~>_7W`00l?*8lq5(pjA7CrPl@Aks2q=Qf5zDXZqymCE6jBz52FZW!8ajv@F zWVE$y4A-LmH)=!SYdyQmSp2J6! zfq6ygK+S4o53DkQ-N~VpC#u7_$S3tN6BszCykgF)#A|njw^v7g z(zU0WSWS-1iu%zP+A&K2VZ)TU7Bd&J-3e?=tAD!}0Unc&=dsOzYLMR7v~#8rCoHHu z!1ZheFa|ucR!CPuyp)&z>oc!q)eGNs>{TiJbaHQoGu*osz`A#J1NK&>b3olO1${OM zru(NaZX%22u7?|kghpo^&`erV|KenQt)>zlaH8nPA(WHvcs;OpJ#c*9Kr;r3DY~$g z^V(?~^Tn@{iWoJjJCB!PV1==W-7_8vI*%xc(X@5jl=Ax(fcwDRunN8L6wdmZm=?lj zhPGTJF5MMs3;MJwVQ>cIR4chA)Uv$!tQ|^|)vSH#V|@X{{GFRG2`BDzeAvOMdbZUI z9)Iet5f6G9UPh)2AxulddyN$vc|S=BCX9Tx9yFVvO23KU8=69}ADpO~?=?KaH$oiC z9}xi%&7V@?FoT&cCp+EIs#}48f3hxR>4J`xnFe_0R}3_} z8uS7YyZ7F$I%?&w2i~)M-*xq5xd{q5fjO%KvZ3p z-?WMASL~6V7V?Q>&|AqrtmxcU;^bk)Lrg3Qzo|A^iuEJ)zw1A(^jB!~%4y5o7U-L{ z`E~x1+z|H0sD?sZ4~WqT-w2^7E%09Reo(*0WmYbszqCj3$QcvI$Fx`6CEuc zoR*jpjg8x#p=y`-lR2y*IFj#Ki$x$HXWW=Zf+WTj!=sUautO;;0YX)I1b6eAX{9{rF3xdd4OCid)>g28X@E^8FwAT~3zJ0wD zKb%daSWl_3N&r2L3=hn~Q5K<`|C>hIPed@dK*&SyP5zYL_8%*{Qr(@HISaSA*OFz-K}<)^e*JmlU8Bmdc5s zy?}pH8lm~yCE2(@;8{&r2Dt1bB7F@e#OY`k19lSU@1hSUu@@g_Z0GD`kbD-@`fOwM zb8+r%w^)aEXk+c7<)@0XVW=F|5>6sy;f{YMijsxd#^gj#w|nQwFR`k;l1b+1RAHx_ z*A3Tz^hCSxf%11%?H(4zE+Iu4>(vxal1*dd^d#5FHxR#`e!#OlJ{5qed=z;zA73So}X>5$R>ntu&CI`*EwV8W=0SY^# zz5_aFCz1t~!du;c@tSJa?;~zT9h!_`>>wY<8o<2S7qgArp4=^!DX|69 zJL6?Rkg1Qa#9rm0ewK;c7_!sk7UZ7tbsCos8_))(xOTwgLjyx#q6R3;`HHGqx#a13 z!0Su3Ow+_H^6_Z@g0fqY-)Q7E{f zTDaCbdJxfaln}y}8WQ(QY8EB5Xo+FWHrhoJ6O4juP-W`mg*C^KRlU?gXOe?sp^z&p z?c*P{b~wjq8~om9cW|l&eLg~)t|k^5)mTfsApgqu{-qF4JAOhE6R3pqvVHd?7YAIF z>A;m@)q=VZ?jztFHC`k~9o6*|xjvKVV^t6<8IzR{H%NaJ8yzZ7z?QD*>zka9UF|CY zyJyjyfi@B&oiW;h#l)j!-h>v`5tR+L6AKjl#@4V)aD{C2YUbScIe3;u-jExWE`B%` z+Gh?^cri%0Lc;1oB->_gZw?MjP034S_sM*;B*FE@v5|fs=Z&Pj9dUU>EmD4}d%mDs z_Opcn*xjKcI79+@KapgB-x`$tqS)Mo2>@L5>{BayPHt(l5;_@6t|tvEn43E>bpxA% zb@9iNf5~hR2=?lufjp!)J6fZC%RtpSH3^g)ut*X0SEDH^xh>lULB;I4EobOZ2J9yAY(=$yqCZX$i z*3<7OVZ3wO(FfzFDSCK0!--^anp*CR9khEzcp*4b&eyP9t|rM?zhg-m-liY? z9+oTt>m*eh<9;e1!Szlcs7!^HH%~}jn6OV4al=j$-lR!9VU#JY8P>OKuQt3`*OD2Y zqzQT%J}i9!aEg92vb>pV5I^-v2k9`kQw%HYGJ;=3vm?JnZKypE=k~W; z?6?4|w*@&mofSW(8_Xz=y$0UQx1K&jXrMPwy z1u=S!w>lNmLy@C8x_krqCRkz!YwqhCz!-~wPivYsri6#$RitVekjO>--vJvsXWm-e$QW$sn*oL_2=D!HPVn=Qxl*oYaQ_ zLj>$4XtFWVWj7gs9Dp4tc7aey_&oRm!QSr;Hnzi^#-$Cv0INu|XNsZJ-%S{J>F_r^ z(?=Z4_m^~@$j8|87D|LEefYYt6_-Z>7}?joci>y4=0!`DMBiAn>XRB-qr(Do9V_@u zw@R1mo=6l>lHh};bzMhw05I5MdPP(DkOxP|av*-E40u@A)`L*8Up8~(wj0hF`C-$j zPo6(NK-N^%<=wH1N805arS-lWO(S6oJh+#|N7(&b0=7V66 z0Ku{Z_|d}YeV$JTp$#+nxWl@rWapANKsYB4iaZK;C2E|xru0hGT19$rz3U%Q>sP5pm_gYH%D&yp@ zc^Y0Y0pb(1X11krG)!d1rW-PA4MDl!eGmnXo58wOG07>A`U!s7t2d2ZKWZ#_Do48^ zH=y`tJjhF&1K%&P`kkQNVa@PwxHDu^@^}6a=RGx$*OEPUjYMNcsZjg5iHaMa3wsrx-QRY2!6Ak4!?CSKZyuLHhckp!uXi_Q(E8hzD;{sAfa z{FhDf@}3uSE>7e0ec>L9#g=7Eso)gna7|RgLoDTkuhb{15W)NvY8Fwd)q#&tdV z$v$(*72w0i8vPpJ((Q}ban0ZX#kUuG_tdT!xNio+9_m@L>>C^BptE^*Mt2nIRfe|0 z>t(bH)s~ck4gPFy&;b$cpX`>gD;e8orK=(2zdHQKV^u~N&dL3TzGRoS7!bpsNcsi; zg8hKTi6cf4m*ex`Xw%T?G_pQ1h%ruxL#Mj#Bbm%k`{;~|g$T#W#h?UJHP;p^^j+bX zTaKi#-P7y4A08?8dZt>yONZsXZYhE9oX8Jl1DoNI>_l_Al&WGf66MM zLBBf+r6v^==h}K4~~B(3hlg7V0S}+;iRE!%5J5=W_?72pV$0+&$;GOJuC;z+ChMw@iE?C zA*O``ep7x?N3;;eln2GXq_Emq+x+QlcMf8vQ#{#8Bt|M&_2rmi8>7dxJ3kA|n`#Ja z_S(<7^;EaFFieTwYL%b)zt{@|*Cz@r{767kQ!@!wk5 zVW!&Y<8h>w_IQl+t7{!nc&hmt&P$;Sztw<;+nYJ`m4ztQT(Qnc>T0nY%`R9Dwb{}61eN2kpL zG6#%WCR6OFSZ4J5<8PDDBJ%_Mnp0tSDo;C{=Iqliq{pnf-`z1b%Jq4IeE9h+eQ7i;nLHkd=AN~Q(r+#<*SA= zUj2=FAcJEY(urhNa=xMp)^nk`X5+K3;%RR=$yo~^k?p0;lwes3J@QSn#z3+)OejIU zb|&-^0&1-!CI7_g^=5px*lB&3GZ$lUy1_3q4{_k1=pJ%wt&qgDbJdW4i&M;Qw)7HH zRLd|=2iW#@dU8AxZwuf!++OTv=Z#%583Z~Brw{7oT(}_w?ik=_9lkjB%Ze63Vu>^w zg((n1Y9IVSAqJFoh4f9uA*_?tR7c}Y>xaybgk8v1-0De083YyB-iu%YY-+&!4YQal zqA}Dql6lWQ(toBL9{-7qk!Ep$6!6emoy!^boJR|Lrexhx2bpR6>{Bt%M99h+>(tft z0xg|5$L8x)9x6lPQneYX(YfZs5+^4Mb*ZBi`71ZcBsvGnp68D_HYK8M(jgocPV|b5JlBx|)xaBFhsk`# z#>cb$(G7RYmDDktdr%l~i@Lve$sWMUaLk_Bute=CGNSZbVgsA2nfm0RPQE-ICjDJvzLLQfKi#_MU z_Jnuxd39k;t%w5&axdCV5X~s|fJ%z0;(L^HQp8Rm$v~JK&yinBg?k;{Y-0wm;ilQA z_)J`TzmsC*7_U2<=NJLqv2-jvZgzgPGZ*iS4HzOQ;11W2ZGjB4JK3?IOQ6Akkej6F zDTvXE3E?EziLfg;%a9gL*Qd@qn$B5P}h(+S5yc=dhl5l6^~?EVWOb4#f2S&^)5qS30~$# zpM-sKnhj)o+n!`8l$XXb!FZS1PxmCQ7eP}SqociZsO{aP zCoWhgzgd6mju@@-Bn%k?pm!WK!K!N($z21K8Nq`RzX`$j-#Z0&7>LCa86fEQp~)gC zCU+piGDz?8uZApOihS`LWO9Gz4plSAu2fkiQ~ATs2yd(LACjQi#*jwL zg7zT?EXOS(p(U?6P<-M4@MfBI(5&vzTNyfN|m8x>=xPvuuh#XLP*~ z6H&TNjqiU1LonY@x8sAU=~^!}Um30-tMiw`JuXNn9pZ8@ zYRQZTw8egbGx(nt(>8gF>`Nf;XT_5%`TedLfmIC5hiou^u467v0IttdJAj-w)#jIB z#rV@gutFQt$sgS6;(^kqij+Bxzrl?OO^uNv4i7lDOtaMc7etz&!<{`sj_61mI(%AJrrIAq_+V=W? z$LvYCKg!GS8s=NA?@O9mds54>aP!4yf=ns46V)|{{M~&#wd&{m*l`hk-HbLit0SS= z`=k1fFcDjIwkerK*KQaBB6+*!F?%ks{$0XudU0nMASGl__rJxa0SwB0u2dW9R?d>F zyzZ1@@AKR-Qz`{uUR7?e8> zVWYP#rC73JiphRDg?>c28$xJSCAo^Y5p=*MWU38;R)dln#uYKFiJw;6T>Ev8FlM%6eM<@(ro?{BZ=m5Yx zxdwkBbwO1Oh2of9SG)ElQ7+kHJ5OLZAak=@tEedpWEK4lc8Y85o6+yA#v(0wwurdyIZ;*{iHsXm72FFs+ae@L2Nz-(Vn=fx{ z$GdMqtL}8+V8(2CxAmmzN0_>-#!vmQ?Qj=|$N$f;HfXA-u`xXjnZZn+CoU#v%=BMcT#TS}sTl)Ry)EScTG*?(NIuvqBI_&a^8Xner z@jaoxauY~hc7D0_IjAAG%cw#QpbH?)?-q64Bp0zGpN?~m`O}rF@SzVp8wjm4E62yt zlNH@JCxth~DUEd|(o+A~+f7~jVs%I5DW^=hSoV5RSqAiw775Z)1SMPIBH&N1RN4-lG#-gMOr9`#<6gfJZAVAw#4sNKZ_ooM|^QeShx z-uZ@*?yo;9obif$4{~O6Yz?OV!G(trYUK9a_~-MnCiim5>!pY;Wf1H{Y0DHtGmf}DcRvVO?^+hdUulxl$ZxU zJ8^W7K;OMS^qw1VcY?0K5OzK$T5h91Y!6ijQXyQ)mSX64^dz@R%I)YW%@hJJ`;?*E zvDrW=G{xY3CUh9(fK(g~;0sm`V1cCSb)ReeCj~*rhoFOD?ZW^<&ab7UiTn|5y|6&q zqs7zR;^~^!VIO>f#ApX?n)d!sQ8utNE$=f>(=L+MjMXdN!O4m)+&M4c2)l^R=tmmq zMmKHABjZNB^jE<$wifJ<#hkPXU7z9AJiFH@96m(r2r+t#UzNFsyg{7_unmrlYnX^< z!zs_}Ls|L|CuPd&Q}S|~LSqVPgYd|#XX3acVFGpe89t1xZLZ4>F@B^KdW9Xz&`MTM zmd*PV8h*_XtDgTlD}>OPt5Z&WKW`IO3xa!H*An58Dm-M1% zu^~Incf0dk8>-XfN@mzRjnFkkP?oZn*NX|s=P+pS8rM6F4KQ&qVPSN~+uR3yZY(-( z2O;p(GV2H3<)6c%Bp50uuI-ws)bP_wj^M)l4eQ99)Kc9<%+r;^TIN6%{oZuSd$H1T zRgG?Zc*ev&f)K9 zx{+6~!i~2Ge<;5*R$TM82A+lVvyq_m$9A>Lh@WxjTwXHEa)J@Lgd&Nltr%+*tVp?V zAxIFiDLl&Go{0$;#xf@Be3gRgQ%!1}-=h*a<{A*nGGBlRicXCx^~BSz{F8-n_odda z`w)mOxzf%IcCuzR`bIQq#hV&ril7LpMVkpJnp0q#wmMHIdrR^8GJ`yTc%dm0`>VZy z-G-2%Hg3ma3kmmyA&y$|iUo!%fiVak82`?C+Gp67sGc$NQ$^-ty@}up>Dz*3n3-gS z;Es-Mp}U133Vj@5EByI*)`1z}rFU%>M~{TSSKiAAleIUL8NS65%bUtlnJ=*lh=?aT z+^++GC$4017&KC`KysUP(8nidcvnzrSbboz+wwqm$6WBu&m9Ov&kQ&CM37mVwD3D2 z@#$LZ_d@OhVI~#4TA=F@_!M()Y2IxcGtF-(8`vaHMkkGZM)G%)os-@ANq{f@;d_rR zo2UHs{DHkDCfizo1^b4qjnSJ2cPS{$C%+Bvt-@AiL|4>P$z7y~Gp@?5=3c?uwvB~# zUO|M0*aX!%KpuoQ#Y^;%@DVG1p0+u;+?;9X;R`N1&9Z$9`!? zgq5c0(7TX?Sv65ti24qd^38uba>*Q3LJaXs%CcAxHswVBk%;9tokrrC%-buGA~8LH z+*8ri=~4sZmvT=xe@-3$-@R3UV{X3Pc!?z#D*blYThET;y~b$yYEiONo0jjOc&C{g zE)V6fJAk?zu&9xKe%Dy#ZNu0smnU zR)uleDWLt;t(S!pi1poGo&^KRT?j&5O^UH%s*RGzZR61b865KM7-R*QpV6Dh~; z2(5t{gXN73USOtAv$zGM(~e`&fSEda+p+!*D;3@QJt$A6h`NZ z3u;5OrKZBT&fn-ZnvecwbRHcB!yzV~4IrBRWRf#NE`EMcjuTXV@Q|O^9DJMLmf&Y9 znS%J2b%pFpe1G>be^Q~k&%<;nex9>X+*P-Dr?;z417 z9F_(HE|NEOb-i<=hqLS6JLliJ36*jb=Y`rt1)7kcDh_`}04l#|>K#9YS|1@^=({g7 zCNADH_GjOeJv+ngJ!x{m;DbU^VnGiWfM?_tL@vlwb`^;QeKfxY6GJ(G-VmykGj63E ze99Dyz1#~B>cmp~C+)ikd3?lBZbatOO0Ck%BPI57%^BVu9%4eR;JGcy7LG>9K+j#vZ zd$|c;i$|PcVtxn<;h#f*0vmqddwol-gtL_RCSO1>HCr#64>0Oh481t#y@Ho4WlgG$ z7?&lS(XE0*KV~~N{Q+_^2ed|;)9F7NFtubC328ghdNAenG$9glQ-C3NVQAD=HA%R@ zs|XUN!l#UyQdDT9*!JE2Jy11R#Fo`{c8b>0h2D(^NjxL7>`!O6)?0vSK>Ge2WJSCe zP<5<3`u)K-2@>8a&HXg38}cd;_z}Lg_u2SLDLyUdDw?l<8=wZe7?{br$Z4 z#!K%gxDb<85@!XrASl8)+zAa`>=3IUhu&o@N``e)u9DOW#D6qu(%8P;-OU;#+OdUue&mKCd>0RkNdsME*M z?#+Nu&7~~zm`!y)R@mYV%@f%b9)zQ^XrdRG0*R)|FuGz#(6LrGkgm0NILsWdHMi3= zBco#@I82H7zHA~R_9iM6JrmNBcyQQ>R<{@$mWn-1jNe259^ zI`=bNs}=g?Z%6lXefu&iVP?HtjOU`G_A9)C6;gnLz2kKi2Hy~dQA{!w;@Y|>&cZ@! z3Pm6SqHh~pgE3&;0%D;8CX66(&QH-OD`na~Erlg?1CKQ{{$KB6!j%h@R@wg%*Jrq^HW;Ux!JE+pYLCMRj@Oi2(2&NvOtrT-1)q%*E%*=Y3Z)@o zTnvD@WL(QSNYwP9+{{*v&(Xl73bMlKD@sBlO)O*t& z{R6Y3>x5BEA`c{xAR&7?bS8-I<)EOwVPN1nNDsaqmb7S^O7^(ZbZveCb-c$ee;^%p zw9#LsMKb^KufVpa2TmUP>fYz39iS&~*eh)Okn_BUK2ccLm-ht_pY{|23_bPqb(osQ zUjG#lTVGc9^Mw9;fjC6YD6fQ*o8n^**=Or{B(gkF?ya9>TqC_Jr@4Q8sz%Q$IVU#c zqUkaaAVIOV~UP?|)PJnf?unPWCqvP7XC=97$HiwbD54 zoqk;hGw+RU!E$y5fp85macO2M%4V*Ic)fL#07F2$zxb_c6d=M|s17V~0+wv^{yWV# zdB=gm7A`c1zgKN#)mB5Z=IKM3AnYrt-D?H4?`%Gy}9VU_;f%$JaRCo4em|$pR~wq7J@-0p?MOG zh%vQW5SIE%Ah+ffPB`pgra=%?G{X>Xe-_wICg@z9$!CAfZg@pM$c0L*bNQRQc|(TN zpnj$LjB@&`YPfi=e6|vj3Abh=ZnT5g7PUh>0KqKoMcYn`cg}98U4k6M@}EdcjS~Z3 z(!2ee%Niz4Ip?)?Mj@6NclV`P#EqwwxF8UTqps4xb!ncN+?QQ(0_>VCXjVC0G}L{7 z@Q!Y{q|0!fkQA=iIKw!Iv;#T2=PLE$Leosczv>S@437gRLY&z zHS?UnVbZ<#~m|qz1k(UQuoQxX2B8)+kew6oS_CL4F!u1bb`jd{@3)ouHY9Nyg zy)%^TrY;=o)t>uKnesYiL_tlwFsnB--zQ6Ww(*CR117k&@PY{%gk&9hr8hicO1*Hl zfzgbS4r^wsyt=ze-i||W2GMY8@s&bvMLlVjI1`JyGc*VQ;Pe1))49est1}1K5#OC& zsVDJ+7xtf3NEJ;`zq&IABu$Sr-Hw@&V8viinl=?JTa+KhDo&TbdN@e`)e41%`;WuR*OOf0`Jlq4PmGY_# z>31S#?Gp+G1zU0;qZ*yhFL<_SEZMoDXhC@*wk}2sClf@$<1l6bG|)dRT#>$kFtgeD zB!)gyw|TJ(?NR{%QKcNx$t|5n7H)*%B65etbdQ2UdP}@FsfRR{Be%yTlj-$^<((xL zERZ0FuAFrK>)p%w&YzyY{79+cCvjx4r>{DvnKkQ4s!PykRk3|Ga1+1|6<*m0hhwZ# z3w1071I5NvtbeUsm>ofkFMx0arT7-MC`?K9t0P`7TD8=wbS7nu+*N})t*+Lh-#ZhV zB{FnrQikXw@BpX z64XM@6dq5|BUpueKgF#@mAXNXk_P9^*WQ$%^B2b0@wZee^aJ(-Bg%jH zM&`q0H4-xk1fifWbjighO#yavQ{?+&ITo?PnE|a$*6f2cH4FYhJKoG2=eg7;01%<% zbERIafBDWK@=sU6BUZi(E&$s-P2z)Hn9Np=f$ex8oJvi88LLjI8sr}hJZrx$A9H); z=QV9W%dni&C`c`$hC%*t9&c3&C3Qo8P8{;nu;Cww|%+&)BM409bU@qo7Pyc2- zZa|(1f%KE)#+zM{#`_u)EMHgHp$F2!vyQ~c2H*aZ^xxAHoFZND(%>Blx8C$MmKwlK zrGH$MJ8c9gYa82>pY5@f4|dNCl?D3v#<8JnWM+0@2c98A*>VbgkrPob)UXDEY$W_7 zC8}$f37;RA-MZ)sqn@npjB)8el~Y@dyQGtlgg6lA*8JngiEWdRAm?F096Avm$`XKHjI1{kt5(5;RTw^Tn@|5{p<}TsB5&Dka2o!?Vn+bXAwBM>S&K;ww$|w4D699M z`1in#$n}9Ug6Q6qw@1i-6(hUafSisd;dLd|J;08U^)ia#OsOor`6ovbE;&EUc&mOe zc`N&aNrlld!KB?j^;Yc~rGxT+3s0g<;}2$#K*^e+YyM!R9gH$2og-@=A`;BgoJS1@FrDPG2s0$W(=?k)-_H<{F!xgdN?z#5};Gx!37gF zemxsY*ot*7m)H$2*1)=coGQaT6G9n@&(C^Oe1lR#PhM(Q;+G&)SGXrBDnrfSmqZwy>=1x8;|9E{6R;C&G`hdm0S#+PCGLUPciZfQLc;v- zMT(pPN7BaPpW~qD8k`*n(?)_$3LRiL$_{)^J|Khatuh|fA>q@%8&Qkj0XA;6=c3={ z+dqi`S@yi6SM%ak&@x%n)upXy=7go0!~gl#G#7IiyW%Z7FhgRB8hFtyGDpGM6}o;m zl9)44m}^BhaitIY^ueppZ+L%{1ynVahUVfg1$#GSVM=3=lP-^J2bkY2^&}_O z;?8aH#ZZ3s)Qhr5HiT1d`5-*)+h=^lPctkzvsbUk2U9&Xn!91NIGG2i!{ni0)2wmv zei%n`^#3KMW^%&;(a9>8LdyX#MNxDfs;#iI2~m+sTVP;{`{Y3tS$-r{zlGC2jTtX6 z&W);)ELCzoZslTUZTh#HuyD(q!f!%*t_$^*e$q!^i7b%S4(km`zs`vV&RuSHkC^q) zts$nK=ed|W-JcGumu7hOUNMq@xxnAB1jwaOY1%vT(nXmTai8baKiSYVswZ%%IUa3i zy!_Y%WFyVtNmj_19&i|z)r)Gu%1IS2#ly5FKz<6Yrkta5{yWG&BfznCt2k1O(xcdkTXo=#< zEg#=1et{j_$}Y7nr5axrE~X0WSq_fev6bdY&D8;{x~@c43tG(RiK=%=phh;KmG2N$ z5QZKkI$ydbxL3xJLeO6B< zCbRyLp5_mHspQ<*>7G8g#0g|cB>Inhh$?d)GFdziTveaXi-K1lXv(S}>8SyN@2mVo zj1~Jnjw-eco`b1JDf_+&T4P}V3I@28kp&LI;~jilFl&${AUTJR-q<-~k-`?Tz!`;6 z8(O(eTK!FNO88=6mKHP42`~=umWA?z+E}MQUG^j1?5CY_@QY#gmi0I7@U1!r&-9{| zoZe;(2jWasy8PiSobr@;)xF7uait(fDK>0Uti3^XId<6C@LoP<2Xb%<#BGt0*8S+Z z-8P-4FFa^xGJIkk9#MQ_cyKDu$7OjlQ5f-8k8hxzw3 zJHl1U%niU3mlf%a4B8`)uss}lMzr`3pG`OtveIxd>&K(Xjj?Cd&d`_r@FALxzKJ81 zPF+}YN-xywY4^>=PH0swAtRO0B`*Z7AGaT~^$w?Al9>qB##VgfU$X;2DMhK%DON_0?m(z$^DqFtk_ z!>y8HSXALAPM1NzJQXoUs9pF%ril(*KlAtQ=gYww0`V5d99boPp=C13)%?mg@viIC z9mh$MEzw_kr4zc!71NSuXKs;=vn1(<1x?ba52sRctJMQaN?>eTjSqvY$&}qj2SDl7 z5!Jv`zP9-dc~)NT7P;Ow`4RQO#_Y)+%!+3T6(56SWHE#*0d6YEtQiKTgmxQmtl&e# zrLZ$?%0P=iRJEWLDltL9AvgXO`Aj82zriKK>cUUyr{zib)~|@9=1lqu1U4uLNy6+$ zheP;+anHUDEJ@AQp#XvNk(#>gv!6lt^8laY8?Rj zZLAv`soO&sdotnpEXBk$gnA$A0>Ab@)oiuo*4f@P?36%;NVi>dbtbbGr3BCPl73yO zS>1mbhV_3dRgi70PgzCXTu+p(?Y%WHdX}Pv8 z#e24Y5*#XbMIEZHYWS}ifFmby%crIG5$_C0&biS8W&ZM8b|QV#hRH= zdYZ#=RRB2m_lfn`A%iT*@%FE40Q_(FcigO7^{3c$3Y6lSq9ih*gh9 zOjXjPlZ9l>WOkP{g0{fHurBzMPlivT#t^Ea3jjDe&jUYI(I^X4W~z$>abj0g#vR_> zu3^*Y@C~oEEQ5R&Q)FP9H)gP(<~z^EAH9lLLHyYL?E=I1fgR!kMu(G`ofqp5S`lp* z0}Y-J7p7=EVq@~$E+{uMR|yjDN3o#&FT!~e`Eb&dQYjY&g&l?-joJx7EX=?|*4H82 z-&@}k8ci4|kYqB2(i{LORJsrNpV$nrkQ-fG2G0xkR5&Azo;k`0@f!oQpZTSpx|#%B z{Ji|a7T3Ct!5!q6>oWwZW85=U@xOjA0-$UnrjOFR_wM3?2ijyPFExFmVf%_|u=sS% zLB_{SjlyMws!p1Vsc`)z0BdV@ejgkx`$fMW@*_HSg&1`|$J0V+8D0|j%mVkZUq>rr zhZsl4p+v99%Jh|0Bo;c=b~U4JvVz|45OB%vMIA-MmQN;s9g$qSUgY2d z$kt88*FwW8&GM7VkwPHQB7F2bq>;6_@tcjX36M|{sn)zkIZ=58ngv^J_c<`Qg@nhX z29G=BK4@#?UBTgInmf;+-*#qzLqR5vM?ExZjF?ivGqR**VF4`X{7?l%jECA=9}>@Y zB`(Kxd;#1cdjG-~uOoZpy&^aR;T?I(IffLtK=dCPOCP>h&WZOUNJkF`VCPyMwfL$8 zaQAou{Ak9V3isl@YZw!Q-tPb?^x+9Y0pc52Kh} z%3@^0;!xrzgO6Vu*qnka^^r!Uk}t>yCxpSj1bhVhO$S{HPIjGbKvq|J2+|8Hm+zTd8f4ONW+wS;(uSbK%9Vr zPg@5dweShAkVZqRLI8-sUVe?+>L`}<(?j$lF<*_lsaAe;T1}<0=oz%Tfn@5xQdE{a zX(>7A3k3NQ@D>>G$ak_!=QMk6{Z-3H(catf>##RUE*Y{rz4cJ)97%>MZ`?WMw25-^ zHG_r)0k-v_tU7a(cRM)!(KH$1IE=&@<^I@WePPY0RbHiGh4@5B$;xosp#~#;=;fO& zE(DP?TaNK_X?Wguhke`scqZ{IyhOHaZfLr2p=iL#v643CG@wb%Y2PEwNH@moKj%xz_v1$zz zRvIuq*EF$8Eu+)ZqZJDTEmeyzJ_Ta4Q*^1iYhc8K73lphbJyYu?-IRCXDv$t@cO}k zAw0l&J;1?SnOO$zn_u1ZMsix<9qa!?YDyI~c&U}eeP@U*P@kK!&*mq5NpO5deGDV< zfs^JXMj@oyNjcD>PbbU@@%~v|@g#E~V_Gp?WCaEsKK%|y6|FZTziv4xGy6huW~n#k zG!jI5d)roQq8DF5T^!Oumqk6tkjJmblNtIuB(`)ttppM>4hg0tsOSC1UU~MI%mo-> zCtfAtEl#%lp{4-}u(nhTHuO%!+Jk~p@z3kUe}G-( zVd}KSE5_L)1tQ&dx}9A_K(};c0TFXH|K%exUjb8j)X_h!Wi5>cMz?xKYk$!V`*v6@ z*=x#)28~NOsE!<6C4Ep2b|ta<@)CDEArqU zG8xdl6mJ!dgmYvPe+i?*Sv5xHMf%_%yIJ=Tsh!yoiNQ9tNB1R9gaXKsqDS|2>PG4wFpc$BXasEa!k@L5aY#}z9kXS&S<}c)^ zr#-c&HD8lHVLo=o!;(h1y5J$$ZU1CF<2|_%I%ut(1ENcd+Kn{d6Rl_Y&~GFC!HLQR zGbn4CDP5tp7e`}j63fT&K}yjvuVrW3sGuY_6*wSlDYF-!=Cx4B_JaQx5$uQrPqE0F zzUhz;dI_^+hi0^Hj03PCN7#m|#SOMGHh_PI`b*sN658pi-l-B2$)dpSODLt2DFf!8 zn42j=7_SrjyC)Pi>;G!5q<=y4)-7gU*dSW=54QNl0g1b593C^*1;x>}>L2hQsYL1| zx0Xqnk88(XLT~trl|xpcfLY7VD%xAE-AlUsegZEr*~a%q**DeU3b0)o1bl95Az zb4H2caHv?K9oLtq@(*zdvWm65ha+nwhcMHz33q>pl^2~UMb6kL z2TJ>?j-Wd#Y3&oJG7C2S1heT{nKZ;AZe0G)DnZ7 z&!mT@QuSh$9}xlISorfvgXRHj(n^Hm*~HZxHG!)c@{3ZnKV=tbg#7ak3}f^c;HWg( z0D65Ci8(nb^zm@Ij(+HqC(k$DUkb7>pd&wQKg@(BW;U)6kH?m!P3*y1O_&PF9p1!U zVssgh+-91$GI!crB`ZzZLqHxLWBF)B>v}X`x|a&xG1H;sl_BYqaRt~oP_ZM4WySE^#ctOIszP2*;B5*fyll%89F0EiFd%NOXWk1g-yA zzuJfboA35ggv#i-&0orcD!AP(RDK}nIiQt#u0k5F3^f0zh%NS;1QL@cN;@a#9drRw z4(PR^eK4#i(poHQATs7iNl+YqCqFsnt#WvfO6{{`L^0L!^)~QxA>hV*%(HS(a4PEK zAI(@d!Cw=USA;+^S!n+}4Trxr3~QDfc;J#;l@VHIl^t}kd80UCh~b!kqT5Tci0qr@HB(Y&o{gyB17e3HKTTf|RT}Uh8x71!VXsdX?KMg; z4GM$wu#FXIA?#ica)Fykv;~RlXzZjw{~-b9?6^h_#F1?&tXhfxUdrIuiW_X)SYguJZAuKjCWta#2m^>(;!`6qybJ`orQq~dG^xQ6yp zK|Dd9yPuAfhoc|APaAr|I?B!6Fb{a}HcUuseV%nHOB=eDFVndiCVWF^ZD$Ou)Wb&kYO2XE6Z((KyD-6= znE*apmVwhzY7V{Kl>gy(@4c-6I$R$-b?`o@_y5E)B}zX8j5r8~l($P7Hkodl zq2BTWZE)Rq_bL$}k199sk`&e22Z9JV2>_8GzWfa4f{v%Qcgn1sU8nDlT|1;^CiSML znTwA#C|~RQm?B}Be22*i%b|ER;w6JBM~Y|C_+}$HmCzEmF{G(i+sFu(kJ!*wd?Bra zctFj5oJ4}HDY-1j)a0w+-J~|@N4hGccr^`&2lQR=e}QQk`-XLI-;AHyk1+aijxz9m zJ+O|W*YC2sLNV22(f~P9qv!AFNthR?DrEn}V~~=xYp$OW=+_Q z8#qa=e>J1`=-27CtkU?T0l9-BRE(X5B4qaxY032-ts5uG{EP93jb>T+p*t(4`WDFt}O3&!{$@ZE89@~C3qRVM0QlU=fdrM~LN;Veg7 z`axf<{DGR%-NnstSnG$)JWb=PxzLT}P!W^#MUFdwUv`f{m>H^XtY#cy{DKkDbZVIGZfBB;F{nkqx2F4o6vn{N7sE zM2-5`LEeC)igS$!boXl~A3r5!Y#!~p<926A#=EjrkS4Gyi+xFA_eZqO#7p^y4^ujz zWBpVzbDybL$Symqz(qpmn16`9?b21E*%W1_ZB)(Bgd9&Rgb^~5=xY|8(RPN)HvbvW zP=UmNZ20E;v2VwG4*YJ`nVa=Fm=#3?NA^M`qY7FV)8DUJEe}Uf?pvJZ#ky6|w46IE9h;c*!}#W}d?q7ADh%&eQ-=SjI0yz*RKL4! zw%9B_pb~fezEM=MNw_O`gx1_o|KM(p?u@J>Ca#&LF7^c*j*3gb6_^sac{nd~eKNyG ztVvs3gI54zD7{7k0z@CJ$+XQJ+7RF-`8I!iEI;3t-e_PkAB^qt*^cO_CU$dzpaAbuRZlUkj z^J%lGIK|MKlj=;%8f@KfscCYC(6^8&=j&=NWID`^>W|4l=p`OFeEMeb|TO^s-4Uc#KF+OH*R)h;#{vsROHqX1(c_| z*Y|}TO8;sj@Uzy!g2v{2H`}KM?m_4O52BC#Vv4^u-?M-1vPFMKxp-6=X-gBgWrA| zD`}lzkXxSEBZIQLy>c)yczxd2^Kd^H8A&|Ke~)0vHRjOvIEpgYxn$)9NqA}*xSRa3 zM0&9?HSNyF)4OQ3l(e{3`p3mg+=tj>uIK%UFo?=9-IZ=gy5bGG3y&837&_D(g4eDG zcC{7~lR##evuEo7JIr+BU&l1xJGvd_mpD}}J1lkZ{L0+U_2pLRLQV1p7*%%ebZO?S zQqCz8ei*INoR9k1a$oD|3g?VvFXl82K%$36m4ywNzeWlQhtt?hEHz3C5w)2Usbo0z zgYnz~0{$@Q6lfsV)Vh^j;FFS-a_&MnTSDLZ}ly2G)+jyjME_2Jg8!It+x z6wCQK8GMc(kA!yJY_F+cw5xs?39*6642&iLL#2Bm30eS#Pb^?%ekzzEuVO7L)v%Vv zl2=x$!NNK;zH*(q0i@tXgv%^F8;gbNOmp5TmCIgqr`9>Kdb+(9PaMl*%N(6 z^CQq{o<)h8z;)UArc;4_lWsav4LJ^!9;0@vdB+{yH&+>kd(fTe$}2k8tt;}a;Z(|D zzpWiwJ;D|61qg;ol@S@mDKDmd2~TA-+`8q(ymwwY@SF`V&Ih#wxO?_9jkXKdk<+k@ zlNJ8|H3q#fEJsNQrhu|WCX1Eh!&NW}ywaI1U-U`JGRdmUgU}C@Z>US~tcU*hK|B9F zycmw72fGUJTzVH5mEcQAXMQOMP+oEOiRDSaIRFYw^zm#scqorlOuTr+Tc4+i|Mit> zCt0alR8r%rI?D#hd*JhwdG+~w0deB0)y=8W?7%Lu6>h6HPRV%DWY>+6CNEE3y9Ii` zxyD1PuiTsoRdi9iwc%;w+`FdF`tccZ^`@R>Wu0CqZPv<^6n9MyV4bcmm&-;>Q1*zW-19G_j;S2)!efm~;NP%Wl_PRJA3>NjtJ05UC^rtEszw zW1mL;tj1k;8Yn(n%Pnd7>Nk&i0-~D%54S{?kzLiTR zPcrc{J1Jfx=&-@e1Yla}&`08*A1@u?Cjr9EjFL|XfKdDN^mLY}PD8!r^qx-| z1F9NBw~Ui@kud=dp?jBE&QV zMN-#W6mRA}#HX1~j0(K`R>Wf3jS}SH_lwdYT+k?Rk>X_c_r&|+a;g}wcGtd3ixLx5 zxoDZ)qNRXa4b8a~l4sditUG5kOXu+|Kz@WeYI~tfo=J19U>Cd56QB%(ea>8f^tzPk zkBm)0C?vSKC~`&+Lud9h@sMPzMDGk3S0@$|+DEXAk@$;8VH7O{H*k9ENGN(bRgk%x z+Q_ajb#Vtk2EXvgzhcL1Chm)F@JT9yUxEO8%65f4ke4;8a{}te@t)DfUpPa}EGPs! zSYcOG)SOMk9`zg;Jx@T-&eE*@jF&SY!7tYK^H#xK{?8??@G$Wv!FL%4Xd39mKWvM2 zOxwIcqVox1{PW3vVCV4aj#x^)f6(d)zQ8^ZC^-#acSFmd`*LOe z+~R~PijuQ96Va;w&tM%F`@e!vhhoW$b`4K#f4)Jq8uZiok#j&xFqXcA9J77@nnT` z18W?V@w8@Ogv#OnoxNvv)gDPt^t1PQCp`Nr8l`#dv5V!>h)vXPrUwM-rk{ONFG!6+pSMzu_UYzaZ%^vZ&2^;QH`y~~`Yh3^+SGFtCw+v1> z^|q~3D^pdJ03$A(f1YB^7HOxMn}1?L%do6!cB7a^Eu*l66D*%;v6UxdFh=2Haz^ww zJ9Khb-Q*_d82zVDEy}i;KO7uRRct;4W#sa5N&d0#QeQb1r@dJ0=6xq-!hQ0vi9-zE z!^)p=d6_}OV^v`UH(Gd#_Vez*>C~Xx4O`*jj?)iAjx+=hJ3%6oq+2OWtz=c3yziA) zti>m%0E0_QnCSMtakkIDKGq<(ypI)20;vNaSXauZ;?YINu0kE4Yn#R<;5@o}X)p$~ zvnl}j$&2lo&9D>5T-6u>3Wxv|u({`M&-xjIjQz}woC0bt{(guyeX>9?9Vz~i&0Q+H z3uZdqOhxWKl>O$seOPe$pUWc-Fpo}0GK0y2z=2;#-V0<^9`z=uVw3<{Xwm7#Wipa8 z>I5f%M(is3V-22jR*%+Y zJt&G-&N$B>2=x}#{a%x}G_r&2h)$0hZAm|8QNCzR7`NQbZ3*LCSAXJ++`zxpn9{(F z{<29P>v#)BqZLjh+uunuLss9mS_0AkZ574?pS^m(KI{urX5@bG_S zF>1NWlYtGnV}#fd@30{cb+_j6$1c;5g5O4T zcr7_#?lIgN2GL=Its5Qfwb-Vn1@jg|63&KOQqKs4`md#TxF-_xFQ6_wQpNmNau!^i zx<-(somsK*VV4wuk>Yi$kV5Q5Y$>prYbo=DfXYX9FZJ3%$%ph)m3&w z0$rx}mUSN}u~1q05%Lqki#&1d02gm(K_AuuufYL~jWL|xino2}>B#waDI13D0x zpY$oQ%le*VZIhMa0VG26^J#d70^CqbH?&SY9W6a8z8|gw4f1w+ZoDJ%c%Z`I&`8<# zB1Ue<*IxLyb4B)TKtcQQ`|zFRxTpo8 z>IhyOCcU0Wo7<5g;R!zc)ayY`Z^1nJnb0lH5{Ffk%&6nLYO9Nu_J);OH)N|epUSAa zBFMe(lBF+I;7OMzAdi8If)~j8vKZona0c5Ky5^BsiX3;T=ekzuIe+%mASaNZ;gi>- zSag=k{7&J-c>lu*tA8--WxuKmIF6Wwuui)m1$o+ijwH$1P?Oh*=QpnRFbx=fJNd;l zH}sil?tYwL+K5U%9M&xUSP_EvW)mXtx=6oMOI^_o z-H5?Bd0Z*9etZt>dIspsoySWO8eu;p>+|S4bw0AEe-R1A@*bV&BJ8uuxtp9p#mg&j zn0@;(d01|e)0M#SI3HIi{|X}#lvqCnaO63)@Ldz|I3oO=k+-OR^nZ%2j$ctVT7hpt z6<=__L3m<|{*~gk>}Cs1uugtv1@&v7hY51Eej41`c*mLUxyr|JmvFA;lNDt@!qWyF zoaHR4$(s9L&e3>c;ji{L@%_&Xd~^O_`t$Hw2f!4lC`VL0A0UM!WHk1{ZHl1DVJOq> z={qzqSEU7+=Y>?_SoTDjBS(9}xx^wi}idj}QwzSg}LQ*qkPtab>5k z7PlIo4*m$qD>rU*8483|CCBnkUZDICgq~!m^iy(FwGK-AixO-*XXuzB=c{BOz`ydr9;&r(sr9>D1+nab+yt(A77Bep1oqDyc&EP zry<6W7>ajNWsfila~>F!lsiNK)y_Ek1XqBMUH=O2>lLE<0xM6S-H@bD+0zgOOUced zg!B=sT_@buwuk%xjo6+yd!ZpUkbB2`8V9?Ld&YWsK6N7zmu%LE4esCl(kN*<8P><` zVzP=#sAEy+0_s*}ePyxd^5LECHm z$cWnnw>jyNYVgK(T%^@rkyx<9(_ceLDZ`nIymMgj4a)JBkTAxqE~FSR<=Zr=@WJ*G zxh!_88={~o<0jL}g9YRC#B)?(QLB9ARV5P(r{pz7eTC~yF$S-frZyA`POwyTbGGTDQ+3NQv zf9aY2`{6ft+7dLW# zEcpi_`_ae`?##*a$oO62U@g=gw8rJS)nT>-La5ar(SmTg6xTxn(r`Z??vm!Ia5?xB z-Yb@GT4-i+DvIt$E2s`0<|KVT2KU%<+!Bsq@en#`6|2jq+-@TP%iH1vUAMrub_ec!Pe_JUA9&wrsVI5*M)TP?G%YsFdtBq_n=GOda z>PkU3W8K+LB&X!Ylg7J_@=N^F7|1LE3)lF2gihFt=|D_qYS)M16qBH3D}l%yB8|lN zzWZ?j5X{>E9k{ucr$sF{uB3M_omG*T%yDIU&pP2+{IW7i$mOqaNiB~|&U-bNk2;Ri zMa1VH=ipVKan=@!>m26w9WE#g5Ma3Ab*wrhRu=j4Kppq(s9YudiGO{AICLeR2jr*D+w%E$YGsT^=B9I z^a%FMfmD!!B@Xjn7zi6o3i@D}$@6-@JChsUibQ+AGqO_+)GC+fqIC=}fQLu_5mZ$*V}IMPj-x?Lt*}$DbApTX>34FK` zVgUCC@wh#v4*H;C%fdigMMp1Fyr+fkdH{|u`2vINIoT{I9*b0r@Zi(8bXSE^VV=qW z$9=L^z-1)Zgb9j#S?kW#-=nd$Ufi_KREH#s8?TT~4pnpvN>6OdniJ_B547Q+8onhG z*B1Ck<1dVsezo$4-2sIbkp=85UX&D*tZceNb`IPZQ2i%_GQTH`F~oLEKsX;H3sKt@ zmjf9j7ww<|?NE$bdF#hqnPh)<;kJY=jN^$rmib2K705DQ>Y~{*=&*oVTlImI`Kv(o zDjW|#^GVWOyJ`R>0KC!Ivh3OA9uAPZ;8IhV- z7HxnDgZIDGO{9R9oGdJy2&7^?UjBEK4bS0}>C=i3t(GqKYsbl&uRbQI;mDB`Nlyns zp#HzXsV&3HJio2U9SLSiRB-8MMPzEQTF^0VF*Ki^zBF&e_aO$Cx7(-3K)Yz=`SdEb z{d69LGEB%>{M;7ta1kPJCTN6KD_n=ioky3zjqjZVT8Wrk&fPkVXDksBv z)t?Tjet(gH*{CT+C?f!VOi`MUKlZQ}Wmb_K-jzAR023|R9=n9fCPJ^tSq>IRx`K2C zVVB>E)rcQW*gbya40vPz9#^)1UbEt;Zj=0oJ`?8V2R;v4+O_wpgK)F?L^=8h9SKtk z*R@$2WpKM7lk(N=J)F@IQy%pxvTk$xvF6!w`K2DsZLBeuQ?V+wV8k6=g29pFi34BI z5;WN)S@!As^@wP+)uaP&p|PVS10H=^ZV#{!_wwPVWutcTOF#^eP%g}woJ-Y^@{t{O zfqY`kw|<0fctIa?TX0P_3No!hOKizF|w~(VpEuij=ZuVIxJrLX8(ou=ae8k{Ro&q7 zqdoh5hkQ8cO5H;-7mx1wtkpRj=+xOA<{Y4w`%dApcO086NiZrAxLh=SE15fyAIwdn zQvGp41D_SUm`NTs5Q-LBrzuoiek>cg*RAYTP7|{P)0UH-lsxXl6^{#kzhNQ+rEgtL z%PW&6$gSq(@pKkA5kFESP)3`g_=io42D4x81a(apTvr})X!vCY!YD|-8Qxb}KK#>) zv^3Z(7S}w6vq~(pM9hVa8hXfGsDtd?gh;Nwm zB$WaX%YdjqodMR+MSfD$f5&qKcz^?uS}dy-Vu`;yU2b*cNdI(`@OyUco9q+RmKIu> zkuOYLI2N>Xw$o#!uI@tiIxq-37q%#?9qUb|G;PQ)!aDRvJaq{HdE{Pr$k4bWigeXZ#@vP@2Waw6)y~CO z4Nj4JCe26?|MhdL;-6lNALt;y8lEn2Ea~V!W$Imm0S_lbxBLr;Q`GW517YL0fXx>;tP2R0d=AhSJc<1IO35f}P{GCUM`r+?{5;vi_X!Xz#$vr#n7-<D}F!+oSr1GxGjzbwDr(T|nukJ4T3=iD~AKMeZ~I-G>oV-5c(L zs1@plO29G_ptExNxgH#g)2aQ49h<5>dLLipDFdRdt4~oJIi6cJ5d?ir@(T#Qw!Lf* zRgzlMM+4@V@y+#hP8b0VJ@?7u)>Pgx+6uiaSeL(1aT`!3w(6os1aR-NLD|fK{xe*EbmxzdW~GLi@;1 zD<;^F6w>U3R(3Wy&zQO4%A>>g%k#9(?meIy*Kk0Jj!Q9fT`M}253n*^1kq!sjNwAU zErX>DruA?Bn77s(XaU2;I=-Xr$HG0)=vGV3sSS6THVP!2X0zu84r*?ALG1wXaE9G$ z+1C%AA6o4ZsKWfQ8OQnPk&Pab??-zH8d_;4DvBL+T%p~PAHQ9Q2Uo3R3DWFL1`c%2 ziFoF(Ee?tjcs-rf(<11tbOx)EMQZv*Cbd0O(iY<*go*eXv)jotRCw)G&5Tb&u?d5h zPRqIY5d@W2NOsMW>j1F)PVKlrO8W`$DvWR{>>{{mW*pU%FmkbPDY&uf{Y7-*nA+(E zbtSu)OmnHp8bnI0%mW^t1*Y%Xaf?iw6BA+Whg~+KE5?Q-7{r3+9`ZHzzq*gmI&TMG zThs|cv!38e_|j7A%zEjf)>1{ksYZSj0EI&%@Bjd%76iIz8bI2b8_M>rsLMuueI%G# zWroS%HtgCziTT}&L5RSPYVn75c+^_I(l_y2Kr#ey@FLP7RahlV)fPpwpL65jyE#us zq~}f#i1my18sJ0pgrmc^bxt^}y3r_+fz~vVK!Y2-(Ct-!M2WQ`$R`<|mp!x$W42r6 zKW5oTNCtf`f6Rqjp`pjN3^}>lG16Q|4Cz#=T1-rQSx46Vx(xTsq4?io{%a+a$WMpE zNrREaVc;mRr8qLZ-;j^6ckji%-0ED$TDCjmE+OQhU8KZRHfFcg)510bz z=PcWeM%qftiO2tuoGFfDyp}~|!`Y9tHok6^3~eN!QFhYisB0J{E*LM0Io(7(Wa?Ji z07*c$zXW+DqTdn&yzEe(KK5FVN>jH~70)O%*)SvKTF;BCX`Qmh9)Fk|6sC6yoMvYF zW1N88_jUpS&>HTCMIP0PcfXXGr?rqck)pQuVHGu4+T`fj1R4slx@Uhoq8wQ;eab~D z56PewQ#bb zQuG#vJl+h%&Ssr+&*cGo-E_!H$#ErLWx>Cyu)X-%(HwR-SRFj$dFB4?J_ADE^ z%C(WGKhe3#Q@t7vY)ySY7c=0d9i+6;EY8 zC)l_qQ=|}B4;>JuvciWb1H!hp)BA~=(BsWNzENT*G9ufBc!`9Q_G7^Ql_Ac3bcRbo zxswfNNR0jqYcE-);Gdo@vcY_#h9(KG1S84BZ?G9lS8E~QB`WI%>;a|*`W%-w2q1P< z<|Gmv=n#htf9^7ee)Xuf{!N7{jzr26`$)q-!_r@e21iG_1U`IL6vfXy`>c9z5Y8u- zUdYZ-h5eULQHt!Ze*>7JXYq9UZz!s#qZr@+J8^o8=JlX|wH_ojD+z0ds7b~+5%3zb z2y3tuiCMlhV^EF6R-+<^?}t|p4Qei|o5u}M_yTWB`cEK9Fx03klPl2qKq_PFXLQ6J zP&dGn05PH>ezvW4Clk&~J;2?odQ`S1Mjs=&W7!TmpW!bPEZ{DQoVt7r9S(W86SzST zZCCk*Q}CAk!LE-R?F0AS{=oD{A#{)8F_BG=Wi>@ zcu!`%T_EranK=PD#!y!$^Rp04tEr^gyLJPFHblConA~H$6Os!-mT`ZVjbA+4SYMX< z*|g*?p|>igUuoGZO(729=g7Tl&jE;bfNuus6$=9Ef`UGLlSgMl>t zJWyR;{}<|PJ?DcV%9V4?=K)3UE_qupI_#O^)sUgA(|Lw@WXPk19WOT}IBt%cNPyjI zC`c#8lF;ldeH3An$#AIB9R zW35&{cb|=jK%m5dC=1f!3+R^tcrLq`%vb9MA&y7Nh7kuK3gd zf~+F8g*t)c|NI3I>y9^^ep$OrDy`QP&V0$MDas99SL9>uKb)vzg{DxNgtUEWCl_yB z>-JmE1onT1C2qw)=JpsY!yTeAq$ zp1g3T#QgroD}b&x0)IYDW0t|gIaWNE0dQcUNUl&!H%qRv#i(kR=-jJ z=Owe&)lGpv=qxPEGEsydXHz*%?vT(N6z1tw7&UrJY!oE9UvA?B2qfe#KI2i_gR2G=))kg-{sF=JDvBpN^{tK>fZbVt7&A8-Uvv>LfI<}YEibn z#lBu!`v%B|j$p&sE{&}girS7{;jM)qj)rRDFP$T1X0T_fczCuE1i)X+;^i=f!HZuV zr&iZ0`Bn&l5~A57B>fLVEU*(Wqq~6>lcPz9qHly!Zf7;0eeU2|PTo8`X|;S9yzzjI zahMk`tFWax5|GcNK|WpCu`!eDk_%y~fg>2KEIPzJwIrXZ>CB6tDK}c9*z(cL`60p_Yo6SBr4%Ed*>+;%hS&7!^Na5aDe zo2H9vy4TvXbpMch(`^#2z7Q=MIL=Pj8BZ;JYj3Tpkyup-WQ;o%;gmWDR1`dV03N~( zY`Go@6<1mJ2u;gvosulCAu<;xI+ zj5!lW#Aek)DL*@<_ecco%#}jP5f4}MvOCPH79ej)Ll@wVtpt<7)=CSQfG;R^>ID7* zh{OQmyk9a(%vDw$^quA7n(l}K*sU#qwSv)WYMk9fn=4bU6ZIBniBwR0;k~9GN~9(P{rJu>v$loK zE1Ud@cdod^#_*PiCxbfYuXQv$(sPVSqD;`Mx@W#`X)ja)PI*4HCyd9W2=)cB!}k-0DOpA_qrHMjTteb5d1lUcMp`; zX7{e=5C_zXu@?8OaJ5e&EVrJ$(fD1K1uE(FCVM|mYdl;PP3@dKj()p_0C2CBcpDRYX9Yx!Nt5{OBbkbenbf6}GpV^t_akYa zDOjV|@;nXWL%1YREY$DY6Swv*&au@!bT1yFM}@ zx{n-AyH6t7Tt4O&c*RPS>a?r*aK@>`qTzp#tpy^Wm$1ZLp4(P?_))OUAA{oIJ%C@Vp1`3aE?{*06|3lpCE zcy@Z?t4fd~%;92}uU7lXhjN-SlkJX22YO8I<*xYsdIRU?(e#)X-;I-p@GT-Xlj@b9 zrkRQd4>1VyLgGxKHK~siX-5NxpMW%vLBz}@75t-r5RJD}qd_RlBod$A=bm>H{v(&3 z#_sKyeh7)mD`Sq99{y*6wD&|OXp6es_Xuof${C*+bZS3A4*ZM5&z_BrGDT((@jrkB z0JAvIDD`)#A7TSc;RpkI9i#gT!^WLxgY%D`VyP8!x!ll^j_gE1M$@|Aw#qj4n&j>< z`ljVN;jH(nhDTkFRWkH6tdY{40rm|*dc|YEd|cuenM*3WL+^o3Mdn2v0~JRMCY zeR?jI6TTe_ds+-l*>_d8;}wxCASWyc-L7N=kJ6^&$`3}fCyG*5MHKSpjQZ~+Cb z(}a>+&$eTcDWa~RY3w7y$~0#MJHd3%U)&L`7-}b#`jJ?-_rEYww9%41Xn$tMTSx)O^(>Abz%8%0M`SJuYYJ>jY}pm=VP>{6G$d_J#394CEj z97q6H$u+y?Q)F!fAsb9F3}2y8I`0;;>2A+yCeC~5joiY?{ciFtb2&WG0{sk%#vD>1 z1IQLV;W}$xBn~Pdoj-BrfEw7Y&MmY-K)|v92%XH{i$j>2>kp;kar;XcDfllBn-VY|JomAA*$eY`+ECuQ)qJ7M z>$4?_aoiu8vvXg9M0^VKa2KM!jwU&?djOx!ru)(O@;)x$LIKBcc^)rSQ25Yhw!EpLO@!P2dJa7qlmga?hjGyh_UukaJ zAHC8iRID#mp86}_gZO*?P6P6NW|KN1>kN8&!`<6QAe*)86+sOkU6jZ2CLIMI7ok%4 z2uPu7<2Lf~vIM-pm?G}x+gK=2iO80GUw?I$Vr%*FJXMwBUh}Eg8}Zi;-i)YCr|kl5 zxzgUc1BxmRmmC1~Yin55rC-Byw`|!xxwyLbz6~RUNMn|Bz2VBnLKTss2xFz}6iS2% z=S;+flPV7^%5gpY_k; zt3oo1{s1$LAUHWIw(2IcZfW09Py2Gl!sT3U?I>{lZ3qDY!+<8aFeIpv# ztp$@w=;`^J9`$&Z$Mj3bgM$ntqvUJu(HY~&^n|@hZw7rTyd3WZ%j^o3kyz=-^r(f@ zre-w;S0--(nq$LHJ9`y%UP|VmfA<;qylo{a%kd&29=7hW=LHdq*j_i_t}<}%Lir=- z%-a(<;($aF63=qrx!(}kZjB5_ts8hv-Fg8z;cZ+w9tQP%q4b0BIpZ~D$sHw_EQFk) z<9~CcfOJmkP&80vC3wDuHnilqg0%<2tq8kR2FpE@MQ|KTh^>+lxAEM@g75@NFO<+I-u z-CA3Xhyhp~G3Hfc0>j+C?Pr|pg0o>13Ov!Cz@pbA2LWOpl9wy2N zMAQ8=rr;Fl)c5h$(9}yJUmR4~9;xL}NC$GOK*7aOTU-8j=7HJY6_c%ivc({kBnu?jrB@quto&ExEgzijEd{(MB26;U@7(Qan2rlrgTXWD$wQAvOmfnFL%~s(o zWM31Wgk1Wd`q=S+Vy-29J{D3-%yP#b)=JfA0fGZ8ff9MzE|O??Pz?<@tT<4arf}K4 zWp|xh{dmHGl*|1S5#k6(BO9<_ob*!j4X{I7jc$kZhha9oE{)C#7EC&}xeF7-#9*C2Iiu4%|#Qytd9x@ik{Fza8MA)Oug-NT`M9m zFhY?L^^w!}B;%paG4Xm5ZJBD50U;%KtfvY7B!#6|*_Zlpu1x`3R;+}^KFo1g|1-=} z)Z06I%C>T-g=Ei&KU?<+X-8LDKf#kXlb)LJ8gMV&={_q+EP{#tR#=CLc$`430it&^q6U;dOG!oS(# zN#lglL7EfIE=;_z0^L^}EOV#APw%g+g3^@=rwE{;8u3{sr9bURyM7_GaLct4D-2@w zq-i+Ie%EV!MmreJU>J>VJXM}Z|PMeL6ak|gPl37@K+lN((}9F(&z@=j3P zO!JgEEisv%&(2^OhSPhL69}dY{z5(&^O;O*b9*iHDBoWf+x4e|pZC`ERk->RLaPhbLXisA~aTjheQAn-&j>V6>5S>W+lSAi_adtG>nw*3;-7HVRb9lZ5ea&r{;h0_Mx-(s zS|o6Dn6*5fVLZERxQF{s)5>*k+Nj2OnWo-UyCW*P{aC6iVY&6T!`lry z=oX(T`FT`90}Qk{PJcfs0jfz$RHilW!E)Ux+{-KL_d>>N zYi#FpCDa-&Y7ZmW4iEFfZfb|t?nhHN^n-c`%q0neXmqj`WqK>-+bi;>&dzIU)7ecR zXNyi6F1vjNw);gr&`u!Cf0epp!oar*XtQ`k`?jaV`};6Tk?YEnoz>MMnL=$Jn+pR!Cm${HrmDkLS=! zphbd?-m{l`pGdLqZ#4Ciy3x_@N>7;E(;R*jDVN;;2RnGV6q_Aq1ac@w`L?L~#@DJ=ybO-30=qu>d zKkfFk^U_5l5H@4)X)>NB=xYQg^9nCva9Cxf(d{CcvEECMaaz`~R*(hsi;+3Dvt*iy!{~&GNpjT~9 zK9+l$xXs~L2YSE^>lZ^mgu)Gx)xrS};W;5$%eUnzclUOS$BrZe2A?C7T8mKHO#zgx ziENixb{yCLFkHDquCbekik?%7$YgF{Jxh6@fOF^w0mz&73Y>h1K%hE3^w+EckO%~P zV;|xTGmf{-o!op;J+LXQ`@p0BKg z)M)#pqj9?ru0MdjBH9u$m)A9c!;6{namn)2EgMhxvuGTpCiFQU+EBN^f2!cHPe&92 z6OiKi!CxACM>a7PP@UN%CdIJyUGE1L-JzARja2Pc*X6`Pp$1H+%)J;7Lb8dmVh-9q zF!C&ZnMXi^FvOpXI-uPa#q;zerSLVHePyWK7{|fRvE|80a6_y+$5$H`?&G~7euVJg zly;jM7sJJ%FqX&??q1*LmTJwd_BRJ~s}-I*dz{$xH!#?x{HT2B=7rZDa=+j;&I0ETb!*75*UR*I@8GZ_nBJ(gNX|Nh;TLvQI&qHx<>=6MYmy8 zKy`9ZZ4o$|mkiqfl{U@Z_ZK_$eRCYSV$3Fv1ic|^**G8je%!|ue09EX-|*+Y0d=|3 zdwRA(9w2}>8>*to9k~anqF*eA1cR)rDcUV%dq#+-!L~q^opZ_$u1K(v8ipyc@^jG= z)DWA20m<923J;L2##1IuyamZKMD3Xo-&C)nT80vosrX4SYBoOSEC-(er<%7{3M8~G z?xZh0Gt91Qxuw?l>O5-yJ{ z0g6a@BwZopTamcs1sW>`hVHRTxdl+YBztU~KyWOvJ=s>$5rbv9JKtYKg<>}jIMsVf zmM&(Sd)EyKHQl}^&s&=tR0{pM!GLrIY1U5zf2>#kOQ=qLYmBd4yHjlRh(~f*Ou??v z@8Mp^#uHo~z7=h%(z6l(F4jCTS=$K_R?*e9B~6pJ0-%}uN$Z@~F1aK=5RLWIQhVvZ zbm={@QKFpU@q=@+{(cQ>O>y?1FtNhzcml&(80A@S!` zKi1DtD)mj$6Eg<^?xlu5)Mk7j#gfh1qZ#v{mRMQ^Zue;#0O_<``gyL$s0|PGlPr0^ z9)6d}way2Hn->k~xZ$C!smQ6`+w~d~w;h6`@eb~p#OyHJO$=zjCoBG14dU!DaSU{- zrOji`QfCz5WB@Z6?@si=WhMC^{=sBZg%~^3lMiMm2Zcj`?*t15cxd?7p6KJ=8Pk{?&Wo|aK?|?a=3bZ5Nv#Jp6W`>&WvypbB@cxV3-#``DMbUAI`@jS zUdG%Se5*VY1Koyi>Uej`=Cjp6t3Zb$flf92$8K+BrQI!-iBXoa@K`Uq0IF7VJn2S& zf{cVlV!)G${GmB8Q^s=iCo%C>!9a558n_PM1^KWOUQoiMMul7=(Oqzy(}>7N#OVsx z0H*45^)StP2~m!35M+J{QA2NndP5{Y#Vz`y4|yQa>;m_tmz-`l%6{sYRB~~%bE!32 z^w4!ZgqnmrJB+Q=oK*JK79}H&I@Qb%+bj$;bMhi;Gk9ju1VYE40}6`9b3|F4ASF%y zM?Z81)RJ2UGMOH8oP9H5Y5hlRTrJw>78Tb|(3+p#0OG}D{R0v@-jgO_ho!#1+Q%Tj zK?MvVv%r?G*3i&S>YCHF;v)itdAX-+mI8qhRJ&+qt@6+LUQYwMjNTWgg|_zGqCx!K zYvMAUoM%6^H7UMk@}f1V-O6wCFp9JTgaw&7z-CNrI#D8l#RB#4k_Bd&v1HaH-XVo} zM5v(aG4034yhoxec)#L=CgtV?ocHJ7$wQ=#b$gEB;)kL-ka8UQN?q~s1-%q9VuJm3 zN_zmOBWz5gqPd;x)!uu36EXoap9f6QF$m)6^! zn}h`qSFmdZe!04nqaT z0RoBg8VCj8X;+X{9Em_CG(&;QR?|_vg^fDn>*%wr>SqVY*u^$M<5*pXaGFE+ge5Dg zlQkMxRe-X`Ds~L{OH_3Xp6Ru8E<=%v;!KLdCyWtt~J9 zWATV1x(En>CB$u2^VpRJQ=e~z2;ll|TIi)$8@&g^C8H?taU=olbwLEi#6%hBkP5CW zI66=V3321{77AN|r7gBeM|&+)AEn}If^ui^ZZpL>Yl%$mlYpxRZZA+6#}5gZ8l^}I zvRJkUv_PC2YS?JMq}ZCzu>ekIlEODka@cCR+nx4-zq zys7UhYOFMNDASK!RwdyK7}IJ5kvs8qNzwC+&d*4jZx`eq)qZWRndPXs^Ti{n0BGW@ zdz2a#st=s{%X5E=-PY#4Wi~193JXM!!5(+57STuao3mdwMiV&~XWSy=l( z$Q<$IEQt8fz|B!1lm<9QbZF?Q99-X1&U?vPAI!S(8S`2f?i`nrJkR+4?w(K_m~%EU|iCEPlC;3=Cj+6D1Vs>T`Mw%ihR`XxvE9+T9}@QSgK zb{nnYoNx~JRG=;84BOtRK@5B*1kqhpk9ccNMZYlFmw^=h8yM&3D|8#zJAAimf>4I; z4%b!w{|*FBE78dWTG`+kh$44TjjPDWh4>BFCrn~0Gy^!WTfbaH+M`M<*X*|kFehEC z)PB?r|5^KbhiW8`iu&jgs6}0vJVWpQHLUbW>nQOKzoXIrFp1sE9s1yM2j#(5V#@x; zF~8MD_XB_ohdoX#1prDnAB5U`mUVJml|N(7&1L>}V6AVvbO?jOpc(Hwpvcp1b~v_DYf!SKKulQYgR z6=a;(!ij}XB|qn1KdUP_0lwlS?cTA`5arJ0v+LUzj#Ue;KqR4#?eFEUkKjhj2~pIR z+fTjm#tph?kmH1ehrXVt$h-ddOK@QH&<1>wd*v0N^T%J6fz`>i$hFPO zr$(u|*hEpptE(h_NUDcd^jm#ODj(1UJofLKZqDEqEdvPti_)5>vfkP_1+w}2-Hpu( ziUMhXKW9g1?tprf_|}uTLP{GF{7@w)jm2{7HL7huiaMGm1u0loO~J0#uTQ$CQq}P+ zYiBYBRadR+f!86mt&xb4@NL_NJ)%t@k#qoqEL*Eas7m%T;)aAXuY}b}P*^m|C3m*6 zH&zF*_kBhmD;=)k6fD4?qei5|Hl`HBUh{y4_vY`kAG!ao<~&9Apsgq3K@7Az_rN7H ziJ@$)HRvBQh9+j&oyrrqM=LkwB3Nkv&k@yvo7jmLZNa80Z7|b!*?CejOz@c(T$|fb z|43AZ1(-v{%}}FD`a^4$D&|e?))>?8Qn88vk0w{D(zk@f&9xunlgO3eFT1$_CGrML z&C!zLx7;SVPMCB_8nbpJbVEp}r$vR!JN1^40@G6ZH5bxx>OF1!mr60ja0~?{#*{UX z!FKJ%PjXVmDx}Gj9@me_Ity@?vq}Wll^;lk8qX0BZ!3x8hgE@1@rka1<*--eNF}W{ zL)%eR9fRpkAkwi2fPCoRx6!%au!KsD8-%^(0{+^gTqQ`xC#!+FSZyJf!s)=!e~Jk| z?zP5NJ^Isx5@{=D8_5d`^!k3oBvDl69n7+y7W^);u0W3e?k20Qwca*bh2LVLto#P0 zH=6S0$NmutPA-k>S-ne~G^-DrD>UGSpcbI1lI5}ZpS)s?B0WU!g9W@c%+{;xxaU8n zx(qfr+iW3#JDEcvRO0)!$f3j)b?{cPIFTQhIS8hImA3(MiWcA%yOy8sxAC7M@iPz9lfEn)z``t9y*ZwNee%nOf7i_9YPK5ICmj#fT4h_{oi(fr`0Gnwa zv;SZ?<-|+>AIP$n=cy1em&1u2;qlbENg<_!m3TU;@`0M?BcZ^{{QUzW;@VRKX(R}- zqh*mYNOEK5+Ut{Ntz(o7pv{_sNJ8A}^|gPjTRn5G99t<8_bQ326x%TMJ;Nd$x;IEVp-zDSOFPYUrb`ei;s#C`g&PZ}kSWs5lo(N@pL^=)t?+Hfx^Nj=_gWAf} z@dk7&%Ss)?^JDuL9JL6$C?t59slmxS&(B=)%d?B85NOpbO4#M7KwK3xPryoXAK;Iy z_t@vPfOQ!3othBvKYm2HYyFH~@w9nU2$$9!dSoaS6msMb`&ACMJDOrA_vzFDe>(F7 zWSh|?SYJ2ZvhO%<_~C{dER|=oRoO&Wg{<8dy{S`^)S9V7fl-jPVr=OY%{phM3zhNH zxr|A?tPh}GWkbx{+OAGykyJm^aZ5<;a5ZWWPP#W<=cl=ShKfdDiMS|VLk$-9i$|Ye zbcVO8SyE!6R4kF7%t<_WSU#Z3j-)#+!}S}$-pjoxX5{BKxGn4M-a-(f#b!lj*_ zJF)vPIV2L7T}-p{i`riUmGlf~iW4+5?clR6=BO*aE$0$;k#?+Sh8G48=4$;Ad33{k zLpWeYCNF)3LKDTp6g2ee=$N4ujvJ&abkIFhqQRqUl}uslM7(t6Z-heApsGoZab;;a zer$od+pR?78KoLP)nStaRuoMSN>igpejvy~zj|LRVgT!}RsMAkwtbhj({d`!vUrD# zR6nIYbnXfpb4~d0x;Zq=f+qj8oXB+_Y+ms~u59``S*ZahHa-rd3K-{Uf`sLy+AkwxRB`GL;PRp#fBi5(_W}3&gVn1N@`H4o`$_4iITq{w0$!2A zK^rSIqowcW1opcenB3K`l3wXK&2;a4*4nRZ)||a3#9)HtC(abPpCsdBggWvyeuu5) z>SgF!=(TPlL;fGSIrCCiDzSn+Gfy@M`8I-Pd73mVCH?M}`+$BHoY4A)lTM6*g^m9> z=l$P(Fr#|K=h%=C81xRzV8d7Bhnxq_AE;|ML07#+htdXQy!oqrrIkM z;n$&t@bsRXzEK0l^lJ4x>UQof2A;~DIQ5;|+>7=l7~={z?6y$M4-g;Mf+LEu@WL>> zr5Xj)sz&lZO@C=#*Sh5DsK%Agz z4$Lq>{p`gOP}x_i_S~T1pd+G7X8yy=0l2H&OOc0jSQU#pprz!h9OMuCwO#0jdJolC zgA4(oO~ErimY>SokpPy;h8JLmQ31B^4AD?p7YsPbQ)=g3{pxK%m!#t66ka5hSFrdc zd8wAU>t$6+RnW!F?#!R)Fhw#cik;>&kwjjFmIx{hPL4?ao`q4-kypudvJZMFyX85S zRfQ`PNHzP1oy3jDuC=)i`NRznM@fDz^XIe!2s8kW#CcyN0XjfeTFCrYb0$3cSJ4@L zkk3!TUy-}0y0*57gE0_)TYCNxC!84rIKk#!5TuJO5d>k`)H-l;AMZ;txrmZMLfa!$ z?iy)tcE{VGT)LZZt9jZBInXe8{&)1Md?NO(l*=&A5IV5@6qgc1$~KftX>ij6zu9vPCbY0(++Sm#mXSg?=K}msT$<`%jbN#x z=tf5PD?eOyyNq#ppjo2zK~xq&m)OZAOq)xgnQuY2{kB|zdAKUUgawjewE8S&>#_=d zu6mMA%VOT*-ECPSr2%u4anrnlvae^kFWLu$ouV^F@~r=Z5(r4}3$rU!0J7id)IJSQ zO`tUzysXB_@H?f2e@Od-Ni81W0>A242}=GI+0@sTBZ)(dj^Gk7xg68oa+bz42SasN z_zSt0Ji+du3G!EeKH9%>GF@#3MB*0&kh0kuKZIETswXq&ptt~s2T`O&#+i*0fNbH0 zF@tOX%cnkJXPuS_NTKiY%!JQBl-=?#O{8Ez&zBkkP51H+5nX#~)yl(7PKIWe1E7dX{OPqm+o+iw>Uz@KSxo2;_^kCpbXZ z=FK!@N!h`eRtKZ&Y5k6ISBjr&kwcr>g||C3rg->|c&Z{11RjZ-e#3HMqcjzG>QVjc zjIwn#79BK{h^cA{wu31-OqP4KPjbRj$UlrkM39q;mbGV~hl&{f^m0ra~6}L$Pp^tF4TG)BG zm4*{2wDe?<@iC=!V*6v9w|rBB)mH@YGs}3;*3yd2%&u3GksRAce%VvLWYnC=+}=H! z3iMn0h~G~%6R#s)8L~J<6D~76P&iAs=08`Ik(I~NcnG|sgPM4hN4imm1~qZ&3xCc6 z|5WzPUs$4Lace{gO``pSMXd2>7F<`U+ug~96Hu$;SO&q*;MH?z7gG^HiXAi8((Txy z`u_ff89o^&CvySw9oYds$tjB+)a)Bxy^G0O5ZK}Jd{bn)dN<7Yl zS33qNhhC>UXP8^{YzzjnfeX0GDzu~(mHI(BVh5axxFVB*V9X2VaG}v`n)O}njWQ%3 zdJhMhSqrt;Wtkosi6KM3)= zV%iu&wY^wRK5;O{P$^r0=VM33ktGtp!S-u;+b`S+{G4yEkT9m)IJj5DeJ+m3s!uT$ zw8PlK;WQ1}OdM5k2QEC)#1DhKh2~p>Y&{Unhpn$9Qo+f=}@mhdD2Hu zgQjbui*Kv{>W`(U%S%mOK>~qcQeuR-B$3hH_aP85e%R%4U<3y3@6SIq>eg&VAQ$ad z8b~{c>JAN%`&W}(W`|jQQCeLO_YDj!(2-3&Ku-zg#Oi^MsKfIk8y^9GlecriAv|M>F%Ny(p=d&2y;BTmIQT|*XuTDVpgZ{ ziRPC^%xd%W*`SDI0B|9~Lc=+2wUge~$&-*>auCqG!4S_dvI9Xl$Ym80O*MsOxJsHs zh29F1**iY1kbw>Ap{oTQe{sk{3-rdSz=pm*WSMi*sMO+|BG}h)>W=Ezm4 z##EI3!vc2fc3jM2PIB`+5Lvw>wd#tNDDzXijBcTP8|Vjr8opPe=TcomqWQa@Ul=}! zpwenyFjRY>>;;&lE^r3+A47&$C=5j?*U}%VPCjv)*vDo6cE;yV5`Mizn=gbjnuq@tU^MQHTU_u6Br6>g$ z0SiJp2|5ge+1PAWC3wGIrT+^`W3U}NSLh#fiVn1Qqy=?ZYp|S_GPMF&oFBH!w;rWg zt0x9hex5u4J_!~)rEGSL)O6Cc=@>RP%bT3h)l?&GY{+OApXs`8HG}3;yZj6KW$a_i zDPeceO9B#$u?KWSwqb`uF(`)KePQ^%XI1p~8@G~4I`Qgw7~3s#A|p3h&ZI6{^uXm@ z)dQeZBh|eh_>WL?>72Rb>&ovRD1_8xeLdkZ=C*%hHRtD)w$9~&fy(!+rfuyQ@*g@s z$qrRC2<$Q+jZA+zTeP@Cl-+geV0MwF!va(H+9+jMp>Ai{m&*h|#_lOuBKuz3wQxVv z7Qw?qKq}GKG6JP7>@QSRdJ@eniBWpIiG0&;^X*~4Je+SRn^D^axeWOZzl=%9q)tCn z#5))G8!lUmk`Mn<6-oCofI)b054}hbj;cDpEj-jJTT73j>%iLzib9U4q9L3=Q*BS> zf7Tdl6n?g7&Tr+cz-(E1#qTK?o~VY02$zH@nkRUJ*x%`Llu}?980{G*6vR$acM&al zT^Qv*uL8JNixwF^6%&U&vYO+&WjcRXV-RB(4^&3Vfqgic>tu8X4S=^m94rTE?o53p z*3h9wOlA7N?VT%rC&$dM8AjpwpQOXj#`MsDSd~#VtCu~sd@eHtVdhX;h&TitQ$nvC zrR~s?f`@#0{U-*B@&N7#*-;(%p%Fx_jq@e1gP&iA#GiI)f2y!$zo&wHG4=LW#%)s_ zUmO&;O7i*voMOkzRL^eHQ(Y(>rtU#)vcaVy-tp3Vt@i$e zvEC<`!(FL$gc0^~>&;HHubZDuscxE_S(L*w@%?M`9&k-TE>f|f*s|pY<07HteK-0f z+w*#fiKdbcNCax`ONw-eHDCdq=_Z*O5E{cJty954j{HkdB#j{Pv_pL1rLGym&K~SU z_DZe6@#yK`h4p(A=WZ=v)7jB2I;Vwi9qdApR!Dz-0(<XEYa2M6&=56Wi8l-c#NR)sg6>G_KP0 zkAHg%7+q$QCNw%bQbF0RDXF+Lw?UOY@o|aW0q` zuvf5OVxJL>6}2r#@F$_g&>h#(aXcz_Nq7JihEMmA{)R2qDHTgmh^b_VJd}SvjtX(3 zWj#E(y0CFNV-k_~@Zq4AjL0|&*x>kyieFEu$*t~2>QKq7QByEdtSzdf6?dtuiW;DA zrt$`u+B*Mn+D&OTaLQ4jto_jO)IfLeASdW*+uULjX33}4{c!uKPetXt3vOegFF6wa zMT3437B!cx2Fc9y8cpL`iuWHmg=K0bFN=`Fa*gR7Mp$WAOSzh0`1JegB#|oI9Kozl zw>FCIFkzmcDYos$#Y`vgPsdwr_oXXPfUK$wgnSxE)K7eQ$F~eWmctpB@TT;cg#HO= z%iirw%1_fV71EmMXF`&K_#q~V4ogc-jXu_SuHzXD$!ya2ERpHB;b+z}k)~mK2sCE| zfx}`y6oz2=)s+O!iKRPx5^w>928@^PO7L_xCn`pC8* zOXEKRwxRj{juWIUjvJ)&@1?Xac!0XSrUw0A>r18QsUQ)GEk);fc_8*%U#JIYwhMnY6ch4Up;cJg_xaK<_kaOxKRs1E#8v);9!=2GXF{dkyLKB> zQ`j3aXuBA)w{NR)I6)v_HhyA!Y)*X7h%kQWFaR1E$ecDvq|Foa{od4n5_V* zj;qPg>$Uq}`1h9KD{jo-Zagj`0L3Y-i|S*ZgdMufZnu ze%0JR3~VaoRwEO5vJClBtR<*^Mgb~7%0bVwFpMG9q&3@ zPbpEG{|Jqhsq<7*g#;F;aCY|({?w#QY6$SSJKzTOf}osv(kzVhjIG3P zI+S0g%+L-Su^P)SM$>+_oonD<%i<0CW|6+%`wqb`yYnDCGvm`EIqbHGlGvf|CGm)k zec3bRGtXc+EPfPxyA>A)a&y>U^H?x@cj`T0{cHZ60SkO9@g-|u$jB(uUH+&fnD}*A z#!Y>?CH|||vpu|blMGshP|({sY$SZ}69+x(4@Q%y$3$FAi*Tuu?N0%3RMIZtb6d8$ z42F#9if5Z)!>24($1mar>f)GdvXMgCr{sK1xc1*nzVInsqkrO1q;y{t$y*1<^hCdc zHSq`+gVuF;?K^jKyk!KkJN!4bC>5AGqNxW9sRO{O4=;I$PP4@A{Zj}{ZM~8}R?;U$ z=o}n#tLnBOaw&Q#?F{u3~_eR+v*co2DDP6kcJKEnM~(I zH3)O7K7>`wkx^crjdII*w<+)23%3nUMBPw&GF;`A5rtWeLZx1qGu<$QIPV`bqf~U9 zr-LKGWGni@k+`Afc+TzY-rqA+#brXN1bHV?>j5s2_871MH8*TfhvJUT^kbIbdS5}_+H<|xtI3tPQ8&zTv%v%NSOiV3MI*z@&P9cmD% zJVB9HI~++nuEcKQq-0Z)7wcgDPb0|%q<9XfS*I$_n84(4Uaz^?l_>Qcdu|Q@WIRFMHM`z^XA}EAy*z;E3 zb*3Z51QH!A2P&PSwXppf^F1?yAb|M$pdyW~7552Ggb}NzpP)0&&~f}4O9=36oZgBM zlJm$3)g-$8YGx}>1y)O{GlXWsv8*JQ7C-N)o<5Qr3Uy@!&Li3BXseS~hz zFg2Yif&y&jz3pmBvO&}7bkyw?T!h4Q^_dJNHMXQxJQH?)bq8P&O6XL`@u+tN9(WM35}MGpD#^=gH~NmmH&{nZE?)QP9eSP~>Oix9ZW~ z6&3LD-A-pt=zkXRIHaCEM#eL|(5i(;^U)zc%m0_`$GV$>RKD4>pSsU1F0tqY*T1r` z5r>nJh4ckLNc>(Gsf5K;U-L9AZ9?8)(pMBX_^=i9l_tF~wguKb zcF>tOq@}`T_uiQW<)L)P7N%`l`n_) zZc6W5%$?vCcqHAZ=Wdh)cP*ya)j-q^7U-PXI#=AwdGdD`_WooZ(gp^It@Tt|oyM3n^2%VAKhP31Hql0bZ5 z=@0&97Qad=`{)z*Tg0xo@VQwV5T2$38{VKUNs|Un1nQ6!XQR!}-bGrLJ*rhg?PMuz zBcg`AVto>D)|?GYxHozNe?c%HxpTMe@p*@v%dvtG4W0=5V50`$W#YqhtAR@Y#cg(* zYAU2?Y^zC`cMi?G`MJLRqe=-j8ia4p5&V5>&pR-zVe#1c2)XTasWJ;gugrrP(m+Wi z-#5FqOv6aEt#$~(@VBhVmzD>6#PIf|nBFc!a|aI=WD0(vYarUx5Dqd zZAMX*P@i-eD`K7UwdrU(lVBFZe79sF5QWZO#8EF5UT#&izjy9TkOS2cHLwQAnVy=NCzsM=$lA$V~E;$L`GhmLs~+QuqX6%6kA@=k}1&9Or|6uHy2 zd_GwEcc!>0e~IgB%yk7r%~m6wYOa4!eS`M)r6-$0d6M`q+rIs-U<@l>^?cwvC809| zt=!ISCKDMDd+w%o!y8!sOX}mW4yL2-$y8&Ic98O`LC~mz=QyI7{a2YZNzCCP zehRWfF4F^IDL0?t5ADFhP?(W+#qiz1OV~; zZoiLcseIeou8DoB+?nLGacI0yjagkCO*gR$|4p;+g{r;To6ZWwdOQ``bj;OCY?}ww zEmc6Xk&!5+_rFZ{rvTz^QyN*GLen;eb#DlyZ#R-o7=bnkJjc9$;!$fI77+C|Q1^jm z9UQ-O|6&uc06Ii@sCQKM8{4VALHy%BUL5_u7t1s>9mOg86d@wrV6tSu4T78<{fW1^LLK`XhomTc#?Ki9V|`zIEFC$EQ{c; z;HX;dtRbq-B_M&z7~VX6r>J%E2tz9WT%VY=qaC@7S{%9Grh zs_!sr#06uMitVwwLT8M_?l88pgh=1P!MHF^=i!oBLUPEci>+EnvJ#K@VN#)We#`=q zlLEsjmB0^k!)|U#TU{z7Ecm?HQY*rb&iB_mff+)FjB0)@*~`wIdu zy;AeHHw4cZAzb5cX}|wFKps)=--at-u1Lo|6en1~%eg+)<1VgPr-~<8sDmy@Mor=0 z=1?s<)ew6w5PdW49)oa2wOf{vs?gy!&{{?h5GrS04pm@+Qkv(iAzGBQ2iv`>`Y_E% zATli2QSy}`fnr6u+B^jV(jay%IlBQy-UhvlFRYIBL^xC9vCd0H1ho!gguWp^PJJ^uVt&s&rJ)$F-esW=MY|(uhg9OOm8<{s> z+LFE}$AUAcJrERqmc^pjB!hIy!?nf9D=e}5hHTCmiVlnn#d0CtXVISdYrvH+lq9ny z=j7{t6Z1dS>(a}!G@s8UIcO>j2_fx!a8uMCoaoZ8rw*E-hfVD33PDJ|oG>Y~m^eoIEdADz!OG0^Vhn%5dZS~ z2ZH=qVH&Y{dJ~U`E^K~2U&*G(Z7}_*==bvFv|VD=Lb+)G&&~v`M{Q}%0{U-kM|wYe zZR_J=aCumL2a{O1$bA0Oq}aR$w}uVSu?;5w;CgSTLLmW0K8bwJi)c+&L!bPMqW?z~ zQD1dGy{@swFmc0atfDGJmwI26ElX$gy;b|>tmZHB^_2yg7-g=CZaInc4XJO0$y(l| z_NWucRaUS4QC(NOREx`Vs9#QPuTZHas=N{}oIAZTH_7w+@=^FaI5sFB zO{$E`ARj0ufFWYZN=;|3AAmCyh~KqxDnHOa$PSK80S4_os9OE-ydnh84%|1Qz(~vz zHLU&Ynm8w`lF4JXS{Irs02_Ilw$PP`2CufInUKu73T3{47>iZxSMq(s2tlQi!X_bV zE~C9J*|y!NjSZ8iVf{=+GC^50OA=D@gQ8;Z35>N;=$i?C=w9GyQ&|9xsL!i5%$Lt z;6s%!MlKJ-7D%dwUc+?-YMuDHHHClEmc74R9DI&uJzT*Gu#SiKF3}Y|Q4m9D!QtR_jIGE3YXoGHw!H zDubyYFfL9PP}ioKD82cIb>k}iK-@;RCM^(;PI7cuaAUv3D9YNi{!e?Lw>i}1G+PW@ zKKM&=`}{kaS1pVkok+!{K%MA9>?a<;4hy(mxT*r^_TkwDybZ$p2`sd^##dt=a znA5u<573+|lZfuk>YsM|JeYcK9w)pHKuZb=&GB`-!ubU1pqHh`bh~xSzvD4SloDd; z_4DT0O|F^&jKa*_#%tYRyWYn7!V29FW;31e8H%g@-(CBvxa(+>qJa5X{({$`LQxwX!5*hY2K|BRXNtEqW zwPE05z1Utd_0erXq|JpMN|%Y*1Vkr{0MQ3U38Uf6bg_-3z5$E=v%imeeEaV>})ymPWy>FYYjh^Ot&yyw;Y`JUfuIcRa@! zvi?to?-Jf=dYU4(6`=tk&a^q0_@2gBGZot1=nppPZF{s*dKl+K5Va@Om_8020_q?P z+>KVN>%g4>8I__VUx}NwD#is`#(D3tU{u(yH%Hz#wi8)kl@Amw6#6$RC&>Osz>Y~Z z&4N%PocXeYGtRhg(;_N>O&$VFGPdYTEo*W2vF2BvL&W8|b(Pqu+RNV}9FF*2qq>f` zT=s16&^n2XPW{s-{%%)8phuw(Y6(7@AilXx=HXQ`hlduv3*si@ccLJr^ht>aZ=MR= z)XnEy4!F*?>_gj`L|{FQT>>|Wa3u8j*-(j!(eIbrq{;6<4KeuKl){(e>k%0n+fD!1 z@t(D?(M1EIUyDtyurSH5@dD%dDsrHjCbBMV(Be`P9m2+ohA)afJ)E$Ma(7%BN|j-QGBKeVn9q^(P4lbhH3ytZ7qt<&6bUKBWUhF znT4*(lr338Wk?aWfYg^Tk8e@pk1(CwcDuZJImT zsw3nF+U`)Ve|MjpU9R#0I-wX3W9m4tIyXdRF)_0+P<14FT{vt&ZdILViO%O_& z&&Y6&z4g6o8U`2wGeoe81FOt!B0@CZJEhN%ZoN#*+u5RXEe)Y1o>`Hs8f53wcm zOD5Y~PjHTifZZ5OOb?okFJ;Ed&tS$9``pJ0m-}!9gKe{<%1JPw5=>lLw-@))iHwrN zY+%hE2v2{<5DC=#+Em%n}BvIx+t5jJeW_8#`2AhH1@6HcJ zeN_h~D^h!);}$`PRrJZ|ShcykC6rAmMXZdUc`bd~Blsl4?5bY*pA)3DYB*zvA_?Zb z=Z3&)=K;pqv80}1vtx}%Uz0v2!2NVg$pcSrrT~1Wepl49g4(B4DinZW6`rft^K{>A4%I7f86QAB=|sq*w_P>oK~$J zfWG^%C6SD3HeSzmt|b1q0TZxU63Mob^~<_{;GI8{@?=0N3&i|TwJ1fqp;66DS|llH zWj_LAdeATpHyWvTTp>CLc0(|^d|5z?@GX&(;0Pq3BMHZl1itY7 z8yST|!+5&yj1|2pH{YHhann6nHr1p$?Z07;BY}d}25>EVTU(m{9h;1^;Qi?T&|Ya5qy8xACdyg4XOxmIF>Nf7#a z>FhRD)Iqvb(2axafR3bITbqVzZBzgX5j2qcXz#8fv8(W3C_zD%sZS=gko8ZcQx*6c zj|WL|k?rLvq(ZrdH=Sf%J$jQ!Z|exyL@vpf8u8E+NjK^adREXfCQ z^%bMgh|V$1)60`B7Jnq`4YumFp*mkI-!VloHc!JrQ>l(WIMVnFXh~cL`enx8UFEp$ zc-{ZkoAU~H$ariFH-{Tsi)XMrC+%tDB_#7QVPOdGdtoj?2+F3&Myyv*Xu9q5{3kE9 za1}h5Y!dQ?tB`N=1G^T_KKb}7+2U4BmI82!>qdTd)%fZ-q6i~QYat3ULtsOeao~0) zmhrhVQP^0Rw=0!k9M6F$g3i8+Z7 zOw3I#qA_}g@iG`+tdielN=g|k?%hjRwD8sRz|)W8!5b5KPJl}bn>G}f3Dt3HmXEY9 z8Y)W-OAok&>^XjBJ&q72|G!JW+uLp@&=kbj*Et0x!ufZK>K*O6^`i{!!G|F6u+9xmi2OcY+AA^bxIftNn`)IJ%_}E~KW%*>jL)QKVHz z=4-~0g96cU&)?XP>UX}q)7A-oe#SCc*N)tceJnRbO4zkCKtU3FnuQowP~6_Pa|D?! z>takfdD4XM%drF(dE1+e>ltUwWx$QrXJ`wimb?2R(U3|%Q^F-kwvl2Ww_VffR85d{(%fh@=zU}%+E7>S zwMa-a-;G$>kGu4^S_|iJN9M`3zz;%FTJXSg$l8JZMnDo=P(oqa) z34CIFG+zyTG4gu3J%rCG(i*GsrR^fIix-&Hb^1NYYNCVN>ilH_1U$8a#^S108Vg-( ztp`>ON{O&Jj~Rbuw84tRW83d_4f>rfDHnsAQ63+?TPrzTu5zRM9z$b0m4VaRp_S-> z+B7ulrVM9EX>*ZAjo{+^Qcka_A{&gSjmZ%U*6FHOob&>1a_C!kFUA!N*kr1ZzIbP8 zTpWtqO6*Yh!hFMl0^1N2UQ;;-6R;e-`=X$jpfvox(d*VZ@N&LwL%W7?!h+tzZMz#XEBs=?lB_s+D~k*D)7XB{ zv%t^x$mTAB>3U0=3G+1+;#c+@m`7$6reT8w;0iOs?>RCyU?mtBuBf?HsSiTp_)8i) z$v=|gMwU~1;$jn|5$emE?r-5evyjGD%U!Bzp~0ib!X)o!Ufht`9fZQ5^7Hl@aWCnC z?Nyyx3~_X%ufO8fMt;Yh#UL;}){3_<=*P3UMf?faWnwuIn7bA{W18L7NgrfbWh_{c z^z$SCux3D_Hz1bNev12xlZf6k4T>cj>p|OonB;xgO3GB!XS=2hGdM;tsye(f5s3vd zwFSE7bqdcMrZ?ND_G=q@p~y=U#t2QG$srcR<^Noy5zF`YsZn0Wg)*T9XdB3Z_;3L` z9aiTx6N;=ECOd9p?V8NW)VY$P&no?Qibl19Wz?;=U~|@+=M)gE;C*!W(h&2txpGpUF>iB`GZxgNm%mVW(nYJ>%brZvmSG=G zOxG8GuU+WL3ZV!5A^G+uU67E$kdjF`i`&-C*AXo<_&EkBDM!5BZN7#W!$Hw<8A`K%2(jL+aG-# zRaLzhW_g%(U!@48=3~kZJ?jMDWV=APouB@++H#@PC)Pj`WR;Zs7`3$A`R`8xyPe@9 zf>M(@X)xE&78<3*N$%4fX0WDLdyoLST0>)2T`~f@ZQJc8XLmNI&6_&w+dbwAZE_}H z%pqe|lcl(~ep9aH~oYck*;=vI9u%nLNpES4IJ1zag$u^)P?Xd z@YYwf&r_PFc+OUqE#=&U^GgflHe_~IQJXi#*gWHMUk(alM0%9c7<`4A_%uwa>0Ay{ z%MC=%@60m>)P#Oc|LqQDS>+ojhC?pK}tMZz>c*3e5e5GW_!ZO5~MQPmrV34jfqt|avjqiJSTsJ^fABu zO5%1GDjB8zl07l8vXDK;5u>XvUI^E&EjzbM@hv{6ZpKsr&=TFFY-k@Qnyth-W@*7J zkIgK1#c)6uzW$uiJ3F+$U)>J6?d#QpDz64+7j@jn<%h*dmHSITe)xYc5QGFZ4}<)v zkb1CEBPd>78s=Wqb@v3O^1&N7@MxJIrzQ6@%uI171lzUljmSw6b>Bwd<)H|x+75lH z%y!}7_K2rWhEuB>Aq;+C>~#4rVs(p~1JSZpN955KNL&o`D5!M&hirYXEZ+0SZnnGh zLc9dOj2_rFeFAYDq=Dxx0EK|o?@-szO%(N3a7?4~ZWebpD2&Mg@q72@t0?@^oV+;y z96l1a#j(E)_HwO0J4#TUs)rZ&pB$o5eV~8{<#=zb=XOdWY<^^ z3f<|KXhua?lie#S`&q;;5^^)|QMx)m(GFd$lMR1^O@i^~7+W@qbSZOuU|+N;OQ_0^ z9Ma$Z)Xeb#==PRD>`?aiZ^!mkXt_5xw}uD5wc*+2)Dk16kjnV9NA84(?O`8*=`dN1 z*eV&zorZ=_0lffK>m61&Eo zUB>$@RuT;WV#Q8XRO$5eyrj6K7mbZwtzN|Y;9&0jXo!P1#@~W?_QX1MdJ)+U@qY17 zYh`I^8fyG|ptx4Ih>-9QbG%G8Xus{4~bM9dM7*g`!^DwfeVy+B(3l zWS%57Z^R|z#E%^nVw5&LH=`1{&U}KOXlVm%tEmVQww$8s&}p>(iOmi(fIQ6 zPGO@Q4{_4T>+*Wle5tc>L5e<$1_J;guDe1oWrTgu)bs!x(&*KzK-vh#Z_G(4z)s}f z-ulu=B>2Hp!c4q9wQQKtgK7k9$hpuQ_nkuraD08tN2bbW7acSl2uKNN(}b{A!7IUk*{F8-*slS0>!?l5G3^_ zGglEuo#;3u>_o40TMH3a(N(EfBVOj~1#dQdaRp&hV>do+o7{bqKqdDfi1<$|UoHT{ z@L~EbPsXdXerz&$%d=2Q5L8y#Y??QM#&{G2jA=`f3!WG=vhOOnNS_cW8yFqfgoBg9 zay<5>TB;oxE0zy1SM)!&1i#(N%-7{FjibzfY%6Yb=w?rS!dLDZG0?{=xJcrQ>_U1? z5{SEnfiW~&6wk>QehcVR+bz3(fifmdi-jL;m9IZO5s>`TSnN@Wq_WTr(SGfr{m_qW z#YFF2TySG~qb^Dxk*qtn?j_{N!^km$3BB zS9)mgn{Xy$o2ReLCf8PVNS%8j2OhHT_W-jVVgodN7G!sVF4fo5)&iXJebNK0Xy+y- z9DM*kUppG;#$V3a$uO#>71>4~H-7_zM0r z|1hJHv2qUE+=uu0?%m?W%umPN1=BWrM)OySMcMx3p)@t=+jb=P5l;Z#)`8aWAJAEP z?d@*CShdz=W7qC0D;8nOp*vOR&p51h0@@sJb=t|lY?k-+KRX}dwnz~o3gR39-GOiY zN-E?$PNG}u_@TvU^7wr=M@;$a|(pe>VE+ z3_55bQBiHX0K_^R6!Jo0%by~te2=kkWx*0c2rsfdxe(@4v5jRnVo0j<4Gt#H^b)pQ zF?YYn+VkI7%c_{XrF?y+0mkEr&S>t}2M%-V+|LL|Of%6f(pI<`7cqDXU=eK$%+Zd) zW6P0&KW7zfERBoSFRB`pDaRN<<3%XOnOivdQ6^ziR+>XF6f0?OoBUZ7n%>EH#4m9j z)fDfBxyOQ#iTqny3GB-9kZKhzQ+jsNH&a#@t_il7ebSog9WHLAN>FObko<@k6zIt4hM)$#d@)D%j=%Fdjv3Xh1M+QD-sH z%+wp4=mpm@qNg9AyD0;=GZj8?kO|E+V;5njsn3vY^j} z4Nm;WhY7C0Ae(cmHCF%<6oj^R!W{c#M7!u`l`KAhuLzU*3%5;@w;Va=WrT$~8b@xV zVab-a+D$Ti`h_ARiPRt{n~pRMnYrk6`$&bdM9MHoTO$8o=PDBh90x^#w7rEnVN={( z+JI>t_>s}(`m}_-Q7{MBhL5#b+8)r|EAHHpt_mi&%!apyZzmsOBOYqv1O%~7Zc-Ep z1u1Ol5Kef+yqHi58P#H^I`^cU`p5foj&hqjkCp<}mynard{9$`Fo27Rpr@arS&W4* zkwNtVrDOmg#ns?nEFIaT!pcVLmM)%>(*E`a z)oUtvEvrM>jgPEEc9zfD4tb{0kC-@n57FI6-2-6gfp}%wb=|VFA5mh>E&KYC{HhF* zLDwp$eYT%V(hrpI{*i$mcP)SGmF%~1isGixYyeYSpkr9m!>>OIL!pBa!KTmjz^H}m zW6tqzCU#=fkZbIb9w7_8*-mqUJkg0VUU^%^ezz_=Wv&6wIRo~IY&&O3)iXxubjZH? z(Ec6KbH~Ewf&xVVU@|J7_O?c%zFW1vkr!gjmrc+-fR!1b9|KvN)YpU;@L`Z7R;ZD8 z7_2P@`5yUgl)J{j;pVKgh3w%L-n}MTd=_`HJaUk+uB$G{#@Yxe8#3_LBFpwa`3dS2 z5A;!HA+=aQ5-t%Ug4Z!7zkdz>JO|l#IR?QXWdx#vVxHj4)OlGh?-2?ZIC#yOT;> z0lxAC-Ga}`?KT}fko`Hvw)bNXcL+4^(G3RQ=r44Z6p?^*p{4QtKXAPrtUbd58t&Yp zGfmI$s%=g>#Ux?V=o=q1yEDoU}V<3Ytol35tD60Iq;ubVk76V{WLZpaDH^d9JB zL-fKIvz1+Z#);L{|Fug9y*8T`dOGI@7`LhgXcaxC{I+&%p`#e?Ex-PASP~-H#3m~gk^!^% z)GOywMILl+M+qT^`)6r}_YpVxj8V90jO<}pEoSeY<)sOpmL^?X{?h*I=S$JqMMD%~ z8HwLL;(WNXIKbhBVp*(`D78HmJ6E06p3NIaOYfh@!rRqHNX9tW*_)fg#pr9xMCOOL z|A01D){Qe`GqROjP5qqn%^}{0K%v_b{>VgdQ8-#|_hJd9+A1*WP+xK3DeJh^k$!Pd zNi}zF2qe`%xjf9DO*%4ecY*Z4p1|1sqO5uu80X~Ww-ZCpgFA%BE;pBVxAAweT|Equ zMQmnvgn(5F8BZVR=+w~B4_QwZ*+*B^imUNMv* z%XtkFhKRR%HHdW;mP&_ihgH+OP~waff8yrCYg3`iXHjp@WU1Z*pvDtibvE(?+^k;6 zGlm0j_9WXKg0V@XHgAjDL`Jn#@ishYNpdagagBjY!+Maur_i9&TPKlQy+-_7x&RwR z2RZJ=%`6N_utN7FA=FcL0Q+*g6O9fH6~#ITIhm4EB{6;8c$aQTysTl?OsZ7Wz4qxO zIm9`O!(u2F{tzzp)RFhGp2iNnf&&sVvLeTV(dW6jiH~uFeDO)GOIT1TP8_YHMVcW^M+^dUFd*}H#$NXtTvmlL|^ks|>5fcq1wttATfY-*~g<@UA_JJcx$~$z8M`zEhGJz08#>h8N>gkfqu27Uq?v3}uZmOLLxZ-36 z>-o>LfVceJlNR?@M-tUu!9UwX6e<|VdGQq(t1-rXxidBHe>QLua-LhO{RCFbpH-6g z9fwQ<#$vI|AUL!1jeu8T^Oz42Dn?(mbiUUHf&q=uev)P9$XoR`H>v7H}+tpE{V;d?sYM=Kr$Qm}JH3!nruTdC(Y?wfFk`>MJR zn`L&&e1E>p$lHhcLr6UviNRcea}tJE9snS+N1O?puSNY5cFq|6YmSeussfL!Cs?4rO0kFu%7$_TTo$GYA27+z30PJDBzP6;TE;{$LWna<*WeL)(KFO>m z1~*V4A<41v>UV_jpN1I^AxAg#y^>({{LSyQM>xJ&0MI{L8u zD3yx?^7w2qs_6Kkyw`edo!|~I;%)-rHV!Qgp&^U=D&#Y`)(OUvpm`a>+3q#3e}^6?V==bj63_hNK;#n&NLsrsM zd_}26z1vDuAnE1SLvr5D7jfVvZE0hOf-IOP+^f~38~!kJi863koQEJz*d0^2!am5& zdNNTb|{pLVBGO`#=2H-ma#W#1!-`6Gx>&BJv#{Q{h zi`0ng&VhPf2Os5TmU<~J5s!zRyZW8-= z?UW`n+Y5c0wzL_fc?20EF*`h1@wuta$0N`UUkZ5@(08j<$Cxc^`?IV8#B=&RL7A_TMlPe7eCr(;Wz^VXoE^ z=PV6q1c4n%gDJ9Q!g$_)J3xgD?zfq4Qs?ECIyngLauq+}vff1!nMfYmlfJ_oY23G? z8i;x;g*1#mjuitmenXf3JnMxx6C3kBV`N_#SX9dWaiTP=^6hBb~Gc-H_5G6H>=r1?MH zNIAyJp6(LIW_s15Wv*69UFc({ft;S*-C<{DKQXvO{*!W#3^F<$ye=! z?d`qy`;Slsp!aO@HT7T#IkqwVHY@#+p#YOo50p%7jU2fW-~FDAr5}y^j^LP|Rp&S| zR&&?&G=WTO`>#I@;H>99r|x2@mz7y-L0nA(5{?f|*1D}oRYLmWuO7d!nTaJ&3V*#nQinA~5w(wj&O!=vj zz?FF$y9`x%@)^ca@dbN5I_JW9y|FhLsZu8;GWr(pb-}mBfgogKrmVNg)oa*^Ls_RE zaZZ_yd)(#IneOFvie`7SsvnD;0a>Fdi@8tjGyy%5fLsci^d`9Y@5QK^x1pxOfi)J8 zDQ!5K_9t}Oo+(TY+|AiqP=ZN~QwCP~H7gVS&bFD#Sb`9Uo*DB@3)hkVpAgK2hFH+M z<#6vistL#Jl6EgpTUHSZ8#CI05gOdqjU4!kZ7sN#P$f!WRl%gwx1Gh)ls5u6T{^y3 zZ12eVoT*+0W5(#qp)MY-Dd{LaWRYm&^{7>)s7oPwksFhr40;W<6cI5AY()|E#{Fi| zj9v+N)782>g9YwR?(GHd$84E7%G@Dj-J;vw`olXypTLuHj&!emHWQElSjvgTGY*{3a2AfZlLz0CcY}6-gK8HaSN4f zmwydK@eRFTEJ4gz%d6Nj3RhR{#?#!()p%Pt=F*qn%=-lbfl)kHzHs)F&bxg50l6^p zE~THN8EFBx5je}=I=(1Yut!$-kL%2Q?m(B>4xsK~)>1|;Th4(CAj5j7%RAOLHAv4z zNB7O6%|o|e{;!+h@*GV$t{{Uco#HRWKT`$QdLr@ax6X{SOf?zTuV4;x+MTXVT&j1Y=FJ9qhf{22WOJkC*{PQ$fHFn`@W^=+iva%8C zwT(DO8Oyswj$TqPRitJeepo)&jQghi1m;{!EKgh394?VBxflBrX7`5B`*mR}QgYO4 zll=GXFVQZm7Qz34?NgAL2Hu2)z2)0yv`Zq&TC1Q^P2%?I0oG%gq#?K{d|1D-xaCS1 zsNiY-U$f5@zcwkfa-A=}`!Cq5?D8%OOe(g|i~wT`8Q^Ue6b1veS*4D;B^xT$Q}sk$ z>G)Ig-kll2Z)4V}HZCyz!s%il>(3}Ha_Sa<{ZnC~J|k>A>}wM~;bMupIti}H1B~GH z3IAde-g{|NPJ4;$;k@%16~xs)DSWqoO=n%SWdKluZE>Vp$hVOttYKNH$1tB7tp~oa z0mWg!aSH@@Q$&#B(7`r`61063K)W}*4`t@;_;9JE_mshWwM$h@7iQy=_vTCT=;DYX zW3nu$O2OQ$i>oYagpwI>M<5s#hc+OZ?{(gh)DWwB?pn0#)~MHCWYo`SwD6-Dm))m~ z;VLJYs#%7wOJPr_ZjA6IKhmD~;e*o+odrYr>d;so%xC@L+l?}wBcJweBM^n?aRt~; z4#1xf8QCAiyh!Aca_Rp%iX5;eEP0XNaO5nw#g#-h90lhwTKeP;F6>R953aSK!+ECk??v|EzZFxL{ z#iaI1<@qS<1ruKRg0!M51tmeWtrWlenB{+g($Q-}sK&AcZis$cwa4n`56P^+o zN!;D`zyElwPZm|8EEb+Oww`)?=Q&8oUv{?-8Mx&gquZOHVPAJ_0KMruQ*a$j&w8Pt zO@I-~6PcFM599j@8~0>hy?M`mT`{RG)mc0NBqx|snh>JKcvC9I9!mbRlN{wC3)Ct? zxzVjlxG%O%F<*xd8YXLX)@(M|9*`CpB#3Pg!kTW3&^i21731cd+SeA+yQCVz&TM1p zz{xr-^C_otB8RHU72U4KuzHRJ3qkQsfXNV4gedJ4;GG)8mw8N^ykI;lD_25}nQh0uz7w1Fv2 zW0GTAtIUttoPV_$sDH-3-5_F(2>EP54-IjLJtGtfk1}nf)@%y>%ER;GuAU1?V0t!IHW=V zOb#3rpJjg=ilVnEesY3_L{T%q-Y69ymv2)^#)?6AQ7mzNgL-V>3J|#4DL`=&>Mauj zJyy~OH$v9pmk6q5f}iCdhP8IK3IudxstxpveX%k@(s-4e1b*v>+00yYy(ax*h`7CT zfP2y8E*+&kQcl&Vt)AZq=`V%xsOn{92%s(Np-1yjTN?()u}rgJSItF%Z(W6rA)OMc z@0LFdPVw2o&(?_dOW2sQ$1$eIRLyAqw~CDR{6sBfy3Egm5DRi-`E;^_48H@UCrEPy z7JLsb*-pRJ#%m>U1#~Mzsbg_dm4!xk9+6`dI~e|2X)Xh@`GxYGM|<2(IJv!Ay@aL0 z^omkA^V@bBBH2t7GH1)*wBngar%gId%6TjzQtJTK`HSjJTW8&QQe`2dk1?Z^ z{Zv@Ydo?%4nO`G1fG@W5`bgPrsKTOXN4T<$hFIQ@%|BUD!b^_jEpIl$ONWUKX&!}NZ(f}eDYNQ$wSo@#B{%hGBFS`nKW=M?5q*4fOK zeHXJc@=0VNpQvC`?kUOfe1Tp%q)Y+c@App(aV^N+$%^H;qr zeBFaFkULP*7dlrhE2E$wVLtGPEl$^_MNb$byv*0nJ^%kqzehf&yZ5Y46}r23&rsA? z2)-{53nzr!H4hOhs;cYmJYWRASW7du3w~l4)jF37YeiJ6%k$BHS@8X~>+1m;NX;N9 zYZ3~n%z$`~RB2aNK^T2` zcywFr8mK&&Rl=1-dYMy@p2dQut%{<`Sr6N#R5;iUn#ffKHfJ%=dM>AQWKB$tS)MwW zcL(%K7S1U=S3}`bDdf#c$(EL`Z%j+fUWkweEQzU<-M0SC@hG#5D7FO>bX4Q4+A$Z* zLyiyz#kBSJAU{2m%`{2jIwf#YY$?iuA#?=jWE5eojP1jLB3_9uzV=PHG+6|^4_cs- zrJR@uDzhG%<$=qzTTsJ-ZpB%*>}!&T%RM_9#V2GKh%n4NfS7(@J}Y2=B>9KVfTt2e zaDWR9-f$n4syVFES<^5LfM7!vZvIcoUKeRjSxmE5nJvK~s6d8ZRWOmvP&O?H9Sog* z`w;^93^~76!GgQQ7;YiGK)Z=bazFDa!SYfp%qy!DJ0`(_h~P%{bjCw`45DkF2#Qi7 zK^teCCtrb5@WJjV0LG^<`voRL?gSod8}Cw!O{SyU1*xroRFv~dttZ9=Ep&!ScCIn~ z7A$MG4?P6wSSc-7M#^u%n0O>~YI&0})B68$=mFw|`SCKLCl;$)J?%Ap?zSMsi!GDU zP#!4}4dJM>9h6U*P}pfksLwGECa5PP0KB-co5ow&PntaJz5-}litGuT4vbWSs-h?> zg5cn&4=h*bX35FHWc*M<@}Uvp9>mve`42q|bns6OP&2ymQ~?rI$LAqgVc_ddM0AI7 z%Aige=64gDQ#1h9%}np*5x4@_qLIGPnTE8_rh=eNcK1W(cJH-ijCS(M?h8eBP4}G3 zAG!L=*5{?_6xdpWe_O}Hj=EFHWHU-Ng0uk-BvhS&d1DgLG*O<`q=HaTaMXS1()tlZ zseq_iGK7nz33Bnsz|kWNZE4Rt4YL!HE?k^Ly%4nKn}e^Gut1R101s~3;5>0M9`hGj zWClp1=aWy!?Semf7bPf;sZxi_LcxvD$MjNa`j9PIJC%!=@LB12p@NyTYkHnaUaJfn zAQ{Q=w21P%kIeb;rFxh?0;_{_ZiLP+R$lL3)9{Ta`Pvv{<-L3ud)~w4GwL_kj1RA@2;E#g zRqz+*l^`$Wjdp^nDH(s7O}VuU`d>3}E`r1U3XKf_-Ok|1PN=B7_*6*YX{;AbsSW@7IOZA{dzRa3R zXkpwRM@rypf>MG?ZLT3iiw-UpSfOhxMu!C`{m4x%nCaJet9g7Jk34Tce9e=@inkpP4JGApH30&1|F@6WGp`NG@PSkB_8F0x#`WRh5? zeYx#2cj;|zM}b)I_C_X18?(NtwfU?jy9mE1wFr@qar*}q4TU$nC=9ZB$Ywn;07n(E z%OB8q{N4km{u_Dbv7u+`2J7Sf%ly!)U~E&pvAa*%_Bt^oQgY@2r-@&l{YsO18x2r{ z@=Yz*<$(IH4!J4{1h=Qc)hoh+Tp$OxQI-^PPMWoOX|e=?F?Hz9S&|E>dJ2zsR6UFb zVWl3yMAC_#mz>Z^vNA>v)$4jxI#9;&vV9l`naW<84d*jLnF z2rExsR4csaQ!wf4yG)kSywZRT0^hcakua77tvZf^PlXV(Q3gOZG7h>8QE=75!&(6+ z+@kHWB&&jK%&9hBUH`V`4pXd?wF#AD6Q#>$y`n{XW@rU4erEGieP{ukC@G$Du0l(Y z&w-*~26irrED&1_K`-{16Vta-_LzfRR&0(#<)WF4ga}ZG0{}8LIL8|7vDT>UC+evG z_gP}hLwp3$_%{rZ?`rffxj_Y+^U%pZNII#<{A>|V-1%13ugT_Yu?;FVwZCyK92NXR z&T)J=zJCOM{x;9x2iV(VR|9qCC+y6fziM;L(mC$>ZBiE$>cS4elEP40mUw3Dz#c30 zahg-kS8l_s6PZZar7yOz)F)2R?k)}$S-O=HD_`}o^+-d@vo$5ZPD}%vo(RjFptFl` zN9I3&_`ObPgaF!OWwzebOAxBUHn6bII-T9r47RpuMm=-V4V+6gO+A%N?r^wA@JuyA}NdWsWCil7O>nP{Y6n0|cg6$s-0I*S-XhM1)@ zb6n@gSU)mN(80hS=mpE?X0e0I^Xxpc1u*Lu3Rt=!QbV5Yn;cRct%XIY?S@N-0Vw0P zN3ww}rvPy^ynvgGl33(=vKb)sdzPrNjEd{V0K|F$qV<0p!k}v6O~H{IJe4up?KUWS z4=~3jQcFST!-FTfWGRU><>Lp&`M7Qfck89o*4Oiy+0sWkUVRr9i-r`5Ei%e7f*7zm z4}@7pN&2JdU({OZ(A90tfZr z?rT$ig?na=YOM|cYIyJ}Tu%zM#8p2a!Vix5;2rakeV^otH{%-x1sOh3%I zlm7P&OAay!rlFk~YN1T~)KCyVEho0KS=wGA#@3kj)Ag49x()**29}WQNCSY+yjav{ zJ4d1Vva$C2v1v@%qB>xz0EGg-axTBdE{VPZ$}jmkXmjj^TfCZ!{*I177!48WPuL2q zJS}6Y`tq(Gm5e=VwVs**cf5#u9sPfTNbQ-Dc9(kU1bT$k&@JZ?<0>f7SnvJF!kUR~ z4POp_A{jG#PC)~$>zqv+ATs_>)!%{{L$meVi&lA1%R&7OWr!q%YBU|7v&+$hczEc8P z#j?!sN{G$T(Y{&_e#h_z(&rz>cU$@($yY{w5EHzQI9Jf&hFhpTKxt5i{9X7)#04vq z=VO6(V!fVPvrwB~GeD{yDFCf}2Yk(K;ZdT`WrM)`U%xV0&>Uc1D|hs)pXd=WSKXO< zxDUSC-EP<$AUP&%lP*|yn2Ye-{S$!ajDueQktk$RNF=ct}1V$HU{W(UfP1}P|dG*gCknte3Z$^fdZ8F^hQeq%&}V@*NaK> zmFh?Wi=8g12Xdod*S52p8@ z&cdodZ;Qx9)csbFIskWzO>amOWq+_&uBt@>?1&fI&3{Oz`vUYb9yx?26~p`YvrnI2 znRjR~E{W_XvP?GjXSb(t=Hs<9cseI22371+r~r?z;WfcQOoUU5otD5R6-VHE3=-2m zBQO(UI1g4=t$?lYv-np403^@H9{3>tTSJ}c&i&@ka?bCh<9t!d*Ii&2G7@ZpIRZ~w ztskV!)`NCg0GEgWEU_oXI^uK_D@)>UB%ie4}dMNIQ6*RV1pO+CIAy*DIrW6Cu^pP*ogI7Z0Xp8h? zgZC85AWQOxJn6(xwPjf{+!u!_EHR60L%!6Kii(myb#u?r}DgLS zzi_>O5*q`EBXw#JVGoXRj@B_^7huLNop3-YeR_$6LNqPHp^`8q{JN3CG&gIwXE3qD zrW7%mUM-v~tVE|Gkv>8d!;Jij7fKZ;nxtMt{rx34cE48-EDe%ipV_)>RyluAMD%K{iC`>8P9Ql5L>e?TIa$;Jiq z(L!nD(EJ)vypSnsV4j#SkRy`FVwKD>p*BBpl57zGPRO~(=+5u1fKKwlx}W;@sSKG7 zOVU>X%0!thpdm|Z^y+Ee_YvBm*{5(5q<+!5)}SB<@qci<{62sYYMlfTUx=kz*W#)h zbrZMR9sQLg#SQOai2Ld_qHsru4Zc(p=ETKGZM=AuktGz+?H??@F1vG;%*#*<$+uYQ zl5h{TB-)L|NxaoC++t%^5h*}sFUZ0I>2_Z-`Er7RU7)4(%4UE)KYtMlQ2SsTZPHk( zsox}IcF8+G?GM_}Tqyaz%ujcXah(<}nz)!7TmT2cYA2Bk8{VEPBWBLcPmp6DbO=DH8FbAIA%T6Z7#yfg?^?BM&TJgU&-9McA| z#A;N>ow!y*dKSwr@|Rr{GTj`6WTCTaESrX2I8dlTKjt)_&_riKW*das&CXE(!5UOQ zqvL?Hp8|p@yRLB!!4s)^GE8Y>RR$G(<8qP_Te_xCehgSjiP5MtFV;~RY%1#hdoG7H zTM+>waL8^O0rsTc6zvoFGi7gL?e=&I)BE z@T7Cs;#|Ot;kqoP%Q>Zf3-6A8GP)LD;i z>(BF{^t43avfWlS!X8AN(l#I!X|{T-66 zF}&qW+0giVW-0U3qy>flasEZ91CDv`=t zX}9zb7lX@EGk)*)0a+_Zq;V{oTlv%NB`)XCl*Xb$Vtg(??N>?Ok_D%)6gjkA0C<)V z=A6XO=V;pai6(OSfUe)ju`I5hu?CSptsjC9Zn|K!=xQ1+2~No$!eXPUCf1p0ESi4u zmw#yMXczGpjW}mILOY49>n+ZeaR~Tm)SnyI71||A1hRe)I{LW{_8vM3=4Z9Q?s{hD zd?^#2)bjBAct3YhP}GjP{hIKJn7n4R6qzY5vyk7=H7}!$yLPm)C*-Rn50*V{v^$b~ z5-VunIp;Bi9d9VF$K_O)WaMtI<-(>94rMU$~iG~8^tgPhec#OD< zdO}wy?nuC$#wE6EkRZ7XAyjsi9!MgwSYiF^(<|UBcCwtef-vbgfYL|pn2`dHgE78W z^9~y*YP(d~S5@KXho&lFHM}yAul>F`E5H*}hq8-lzpamNs(|Bei{sO^@=a;2Y{txzVKlY0vA3aJ*%9Lxpwt-)6=)LsO|g2p zRd#Ou0Iu<1n^$bwNccD3z_Yv+fZtqTRX2*pP8(_4b&0zOXoU{jKA9OJY)q0@P zdbPUAC#l{&p4Vs~mHd+ZphElS3;NbIZYxrUSYX;lZeJ#wYndQ4jm_M8Hf>H#V#pEX8)c%=@4;hXWs3NW5{H$qr=Y1fH z1lz{`#nN@2|24Ni;bw#u!K_imUi^3yT?|?40}Xs``10-eUx@8y@Qfd(rf9OGX)qG^ zdP@Ym&qD*6n5fzdO+|tQCS@ZMT!^;tDW#e;jfO7|&4Jtm{^LY1uLrZF-wIPcW8AuM zLE3{H)QE023~=oDYC-{H>dV69}SbW4hC9PLqs> zL?a~e_#BgzW7}R;eaAL(Co6vvyxEw*r^O|82CE8~@v;nAv4JqE<#@l$ul1OM8%7}l ztxd<_=H0Fgi$85>&O?+7ca_hQ;gR9Wr!zm^7%`9MUshd*<#Tg~nA?Ef(S!G50R!=F z`Tpzzol?Pp$uTJaIC@aIkRZCU8Q9=3P3*w>8nE_50y-DR#&`=Lsg`W()(lFoTb_T& z^lV4&ps^cS3t41GYwbSrqtGuU;aP?K0g!1nzg+%xSIj_iOeZfVH&&aR@5V(2?Qf&< zeis{aBScsuHCSo@wa9kV`bs8I(=o@SMe9Khl;|m?1`GKrL`cV#p-{iR~{3M~u}T0PyPGh}LkS{T&4eT-px*;$s9KMYzRU zhfe;GaVHc_$_E7l9Yxx*+f}?&GmQ-~7|I7_GqL#CmL*k@aw=WDY8%w5HXHv?Dk**w z|00xcP$fwM*li0z%A>#11)x>8X6s5QLE=J*RcSd7ST5 zk6f6#(C=WG2dvX7sT|0^nNm!DaOIoo89>Z!FU&VlNY+8G5>K>@&x(w4Q$)KEh;4&a zBs?yw;j!CJ8P4U2xhNu=rkgGs1>%&UwQxNKwC3#TsAt@RI`@t#0}&StiNi@E*eSg8 zUBKu{w)n-2tGrnQ8&|czhvAc7Rsv{yX19ApY-;BCOpZ(y9J6U5jO7gK6&&9o@5*4N zr*Ns4Ju6F}9q5>sKe9DD~!2xK0`tlHk7&^bM?xLyNqf_Jppr%AXyTJZf;6wq9CEY#6@` zDJ>1_bd*v%tFcACQse0;a$&{af;V_#ezOrE<@<^tmpYR*z_X~Ka*Yx8XzQ6uQ#Q6@ z@ARqUkOVWzZ*p`>wb>Sjg_k)hF4(#9nV2FRWe^Vj=XY3be{73e;R3_ zzB{NfM0sBsDiOZk0~!^d&#jP~{R(H=)46Ij3Pk1;RF}2A$^d7xcT#*Ce3Po$4(uQ~ z3)Td(_qrmbzIJr^IPGqaOnK{GEr1`Y3^6$72igC7ZjZia<#G6KSXtcOBvB%%hWR3n z01l0mgnys5u;f)(361IWE@L=4fq>n3>qP45DMJgQR=Mxi{1LB49wZ@?zxUvw`={It z+G@{M+!f~^Ohm5zHI*t!AMYL~|~Jmya|A7w}ic+5FW-S!BQt`q_A##n?|(@84vk%Yh^6 z-V!_3SDm&Ko zht}>s;ZFZ9L#Gq3Hp33_sBMe2(CYJsnR09LHEY%_?4T4Kd9;6AQgl8CC3j`kQb0?f z)O?M%kZ!m+2Kvc>zK|sZ>i8$GK2@_yCG|`bc3U>40hM;(;i%my!jVbJ8O*j&9E{H~ zL31@9eSsyP@e7Q!H!IE$OM?waf@+t3a9!M`)%i-GysFbCjj*S9@hXKNgH~?h%wjW4 zG|{DWX=^LsogUUnrl{Yoi%*3Xh?I4BBbZgj(AN^=YsyuaqUB`v{q(;liE*RoHC4BY z@V9v3Nl7A}z>Kqj!3{~uX)?24He7Lfv~#crVG}S?&1|oKoTcr<0yhfIzE$qtcI7R? zUz!74`@-H&Co9sHUEHAge!^JbT=FXoyR%lfI;f>Hm5TA5Ik+RkyUWyHm`EZZF@$XA zu<;zzA{&E@?#35a0HSi3Kninl=_tt9bW@zcE3!xu>0+SQ;{q=fC~|*gnYj@bjInQ& zOc?oWGUnU+;)@%{=Qd*0tKFTOx`^Y~D}!z>gOK-1aU|-={XerhVEy7kO^%MoNaEE; z7?sPilYYT#77Kxyy^g#}aQqq*ld;4`mR4f`G^p|u%SVSE7*E3R23z-V>cw|_?mF5r zypS)2p3Bt6Q;MWHr1X%hL$zmvn+kY|mB&Lo&ebl+qu6=+qC0|}l~epc$4UeS7dUv} zqm>>&ufWqqYo!{_<$tF#RVAvZf&(!9M(*jMYZs_R0xf96TW1g8UOMsG6f7)!im zqjg9y8>7?ptyUTxA^}7%3nAl|lpiDyJXP#Er0+d%3TC@qu%T`*8(k! zIWe z{Pe6_dkX7l(6`-anIadWz)nihOF~whFWn4tZ{=uy9ksv6Xy(_wJyXougCQSG;@`TH zxPuPBD#r&~sg`k=kx1zqpaVTv18bR%7ImfR1Q}FN@;=D!zeDuhz-L$o@#K|Jd_xKR zX$Xr2$as4|O8SGY(udLs6s8px`&@#DS#iyKd!NGs1|cd$=hmksS84{hvSJx{0d<}0 zQ{TlG@1Bi;~%uza`+c6 z@{^1>$Acv5J%c29d2kw!#r`gHm_#L&}P=j#l}Ma`|EN8574t`~Tc zFYq9{8E&Q^tv_+`FeRfn0w@im75HEb+8FjwixR`+y8Xh*s89_eeu?lvf%ll5Bv6bH z4k1jQQffl_m6$WNnlPZ8u}&vA`;$kiK@lcml@eDuBEJVpNvR&a%xRs{X$0u=Ekwqt z;nxtR0QLmT1kiKCm2syPD#2jg5q~PU>p?At2T=Jcqja%-!h@lUMw>CoBe|fJw znZ22X2DBo=!WjoNuOmTB^YKN9O5htftY|rQs_#v&fu>!YD7yM`v7rtB11SUAf5`2c z?S5gcCYdb*(~)a$WVhG6y!jF$btFo4{<1*;ZH!|^#S^(lVrSYE?scpUDuYBBR_N!6 zWCf0E?G#h!rTY1I(=Q4~>TlvJL=-*zLl~fXabn?_Uh8`eI>D%Yp09pfDT{T*$NCU; z+j(n~MxTl@zGvBcY_6(haATrkHv&ernS1=&Lq|d zugX$dSkQE_HI4?Axf&xt8F+N_FONVvfzF;}YphRXCqWiNIy~Ae6b{{M`@Dd_b?eCB zZ+bnFU3|fl_3W|=t*E_cz3bqjwMlEeNoY_5`;&}(tWFVPA)NS0c)ovZ;DpcX!+vbg z2Y{rBSjn#} znB^((GbeX&7lU~y2J5VgE2jep+HnLHV%rcw$WG_DHp3fphqS_eQGyDNuTkZOjv_J- z1EIb8v$xPp??%)U?`G4X5G!4-*8^bJt?r&y+!np;F< z`JB&zkOU>({-#-}N${6Ti7Ln3()(lTC2k8*%IhUCD4=;M+9f^L{! zkUDMTX2@Fx8wTa{EcaLq?rwl+=m$iI(mH3AlPAU8UYCuv@pwIDBSX`u#t*W>Vt+LJ zzzyu~cmWwYEexLlFEt^yyqm=oE8R~?qE(AFiUMsI$m+l5k1y#N@ls0GK=s2o57MO7 zX|SYpibFmcW-h0cUp4XX2$%-&sG7icd*<3R`ey_Vo+YGZaihu(e9A`w$qoYFmz^Nx zEm?FnBD24}wKK7+J3;1SHm`@ttavufC}!jR6slnxPgkzUQ%>AYm2a1qQtzonlG`Y@-nD)w7W|tr%|{ctvn6+H`Y> ztQ73|YMzy}5S$j!jpzHN1*%LU0MnwL)%(jeusTtm-x)qW1O6*aE8NKln>-U&HZcgw z#3eR8)NKK;yP$Qa86HXGtn47Nja79Vgy>;L31kDVl5zp)cou^8@P0Ku^mRd4WTi(& z-b0KarQD*d*}8Ij05LMt`*ub!)R@<_21nGqpPF*mFNLo^%mit=KYp>Y%wMK8$$8># z4W0r5L~U`Z*1nI~EV-K2Z77*d`GdQ2S}1neh-9zX*&L zsk0G4}Q^1pD@H+Z&RTLG| z?$8w6_x{qXdJjnc_2-Pv@!PU+ztbH>*vni}#u?|yzSGNsSM?XGTb|aepRkv<{uFh; zccZ%Q>mW|GJL3>z?zd=^(!hfA!5_ReI(C&Wz_Qbra@sqje>j+%o-z(v$iUD&weH$pX#D2R~9S85US#>)^V9`{pB zd^yl&%o7c>D1Sa=EFHSo@beEeUhu&DBc~abqDrXCFy&x=7{#WG+-~Sv<9OEYz?l3% zs`Ony8vRxe**v6PqZeAHl}8=hy)uC61`YS3)tp~-$URtcfw{oAM6Zm;iGPEl8y#;= zSitH-L(sg?zsRxE8&;)CQG;-XwZ#8B6gd?n@Vy!;&FFKqckJ>em{=pw$~xs-QHP*K z2chl-Im~sXL1#+?=#b7;!50f#D3P(OZhHU)apl5@EJtbH^96hP9aQQ}D#1v$pJZIx zZW3Bz*ouxb)%LPUJ>0F_e2IjPE|`$IA^(frYv4T{32VbQAOgaHv=9G^sv=hs$seL? z3Zwdp2E;urjYvD^Zhf!sJgvpYeggR6hY^+x>h*|n_wSEB6-_7W7KxJjqXo3B0Ir~E znJO@BC*Qj_j&~ZmUm{U7@D~=thObUA+YzH?=ZZl)UJG_$LUp-mugnY4#q~}x2CO}N z?kMu%s6(xeX4d;#0yX5>c0sXE>*zKJvT#`=H8NQ$a;ty=e)YQTucNa79f55f%J2L8_V|&7Y|(!R2)z z2!lQsP840$_!!p;ClPV47Qkz%=plHjh;&tFN2S?wS1b#1HYe9UHGu_mzxwLld@lyK zHrW$d8(V|oqQn^}M6#r;*cd!u0U?b@(B@1eaIj`UvYfMr((QK+z*(A9y%kU zkq8(Xcrez_>1S}_P}G#b-P3AH+p_0n@|u**M4CFHWIu}Bi1 z!~fkDdbgB)ImPUX8{?Z4{4w^jfA7x@=tA0N6;~mnQwP+stns--8RPi;sf9o?hwyG_uO8wcGs0abFCR86&_#k1A`Mc1V?kloKHhHQcFs06YVy~;r4(B3 zNPS**93jv-(9}EAB|0vozigj1$UUb)WCx!MN(@H%XqK`cdpM&Ti7AqOT~62eD3yy@Rwd=`wP6LeO3SvFRtc&d;2 zx?&yWJpq|h7l;+F-vx8fS)rXgv6itpP3~g8Yi*ebB`bhv)OoteBtmG1@sTT)POr@X ztz4xY!^OQyLxPfKqOupnM8zwXn&+4asGcuLTkYu_XEbg zFJoO)2${l+ZiiAqz+1mw5Nw#C$-5$Ur$F)Ot>pF`5a?IP49l}&*ZmMRIk`cHpQ*dy zTEvP9omDPnRsV1!so`Gj6}Qm@SNy%CPFQYDO`JJ*E?x( zKb`2daPmFkc($xlo&K?f65yX6(RZx=Olh~_z+lTZM zd_8NqEZF;gr2x6IB*rIE5~cD^)=%8jhE&>7;>r8WJr z(xZ0er6X&EKnKEil^!XL!|KNQ$FJy=}eq$us4vSCCPG3w@yq;N2Tw&{7{T3YWgrrMnaEC|Ho7VEPv3i=ifM7iz^ zZAb1qZluOBz`=dasyA*!%ARIg9f!Bv+CYpmh@CsTs&L_{Y-K|M^XkopwxnB51$})K z5SuU-Kwe23`pIn<6Xd7fG|An8nEr_3L6?THuKFD<<4gZ~MA_hV8BP1C(;n1gvc4SB z1y_$MQJZBWmE-4hjpb(!*JiU3b$C6$@~?u)M?a=eJ3ntYgN(KDD8xe8h{zku(byY2 zY{4eNF#T98%Pn&E+z%NR8&ekZxqyG8Jnke(OYn$uz9uQSv3%2DfWq+3=InYg(UekIistfQiF zDMxT7S?I96;)JcVnHD2?-B(N*_99=F`Y?v6GlHy}SSkycQ^$6?I;&$P?O=DaWnTv3+P>#4|p*q3q%ZgX|PTgmAYb7y?YE;td zI#7s2hSNHe#Mje9WdQ_D!G^+3ECxZ`tA=R+qW-8%rL%si7z=q^y3|y|-m@r@hCDp! zS15iwv@^{$)+r~D3LUEf>5q7$kiE--GAYQ`Er?k+>BZ2Xd%zF(wQWt36@)A8Qn`)` zt1sKju59l!)C58Yu8v#~dW)3TS~UT8*B6*?(v0N)dsf*^PLIZw2>wqV?Au;|Mvp!t za&B|^?Xunpi)%1I?KrRXhb!bzB~a-Vz2BZYqVZ7tF)k_YIkl=os?W3+wSW zwH2y#9kKL|MDZGWs&!6q5WZ-Q`=$>Q**&R|F=P^IEuODWW>ZtDxP8pDJ4mzhOvr}x z^Bh&F(f;A&cI!#%bO-PdpI6!E%V*L!XlycMrC{ifc^$;K?Gp=y0H7~FCMD5HKC^@b z2rot!?7FY1Uqo*Sy^8NN!b^1n+~jZ|3_u^dP1H6~<%lSHS}nB!0I#3-Nv9!p*Fw)~ zg%}~_27n!1)c4opSJ+B;9SX!h*ZCRpXpyD!h~+1;7LLp%spV$Agh=FhDTDMNZ(yc* z7PX=jkD_^>Tlv*ARHm%yxKxa4846LC#%u2By+K2oxiv8+K&5APZ6C4Gg{ecd zMXD&CP(pp6>;-iy@S*|!+1~xrnY@5nMGovLExD<%W%ZFI4QL)YvF_oa133H%CF-+i zp*~eQc^-NOvQ2EaN5(7FSk3Pn?jaT(JH; zrZ)z$2NRhLOOaUY0*T{@tpczS&P!G}@pC?(n_8Bc369DLh%eIX-X%gTSU%TwqArlq z36%eVZXB8*%(}7`>ey$LR08Ke1`jiUa;t5 zHQuNF@2%M4GJt1l^(j!d%D@ex>S9}#&0|txX%O|!iH*0zEx6v8vFWv)P%a_+%7^|u z3s1dnz7Jz6I!VwXRl(bgw%ivjC!L_rNS36#XZL=GwCQsLAvRh~6V}+pt@qI;sg*z} zBaH6XM$e-Ok{%1$${eQjeE=S_fLM@LuuW(%HYUXGobJy7DX5|#Ij(!Pg{XjM7m9f= z|7~!AsYg!1GMU`Xv0@Yy_n|#vyqp(gfQTV*MgoQL#FMh=?vA07>#g>}(`-doRxae=_s>bE%Vs_&t2R{H12dR^4$Kwm9$Xzig z3Mg<)q|sbhV6{VU&4mMu4jUlc#r?WtN{&d;EXUXE1A##a1%8yN-fUxEd-(r>2I>?; zt0F~x*#BFhiZH^=4l$FFLqn+^3j0!+gWxY|mbjGbjF~Ahv26l>i#HVUt`H<_xTp&+ zaZ8gE6YrX%^0l053O=pvuLvrjSpIHWGlP2?E|ww6?{*N;EB^?nb|d6W9QlZ94P+zP z>U_GXC>Iy-XPn`;@B3kqDSB(FI6;&(+n!AL!ve=CXVNi}kBDsaKDy9hDG| zD-R)y&pP?qUcgW#oAHW4W&$UuZKbVA#X`JN<1py)=$!(=yOC2XkMi4yJ7E<5^^3X? zKKBnlxpWYeJW==b`%o0n2d8f&ZVE<)yLM9-PfZ9n&d6(In^FiBtU_Wy zy=k-HX9US`7d~aU4RWas9MBsa?+aRJMHIVg@Bc`z(awd7(Hk>mpKc@1^NEV2+gHau z#}%%mh0;c&z3+F7TvtSI3Kp{KbN880pO%~NE z55$P>yoQi1_z8W_wI$XtW^k=}sT^P`4)1B=zB_7Q!#<=V*obpi6bSz)RO;=8o!Od{ z*9G#idbQC)1+1fJ0#e+03$48FDjR{EI!81AdpS@hE3kY5P{R!c9J$8`2$>LdDQSMB zpF9$HUtmLT5w1N~-?Zf!;kmJlQI5ez?%o*y9y9_0GQB6s*MOig_`~tJuvs_L91*6?75VLo?#oTOJsdSb_E*5Q*+og&!`J)OVA^ws=&g-{ zR#X=YZb25jMuGgzoXArX9Q#%guZha#gWgmNG-w5(wJzow`O5{=Y;R~h2~l#%0_dO1 zI&LH?q9DgWM+fMfi?xXY-gxukBYrr$mJjaZ_OiYi#Zq+0Gp|7HPTIM)JX?%o~S# zW{z(a-crG(Q7&5H$mshY-;S5UW7@Z4dEsLnnqUDe^1Yh)%a;&2lvJV>i#C>VfT^K{ zFxE~Vl}bX76SqLf4{sp^Q^2i)#duCyP&_EqXsQ>G|Nm-zscoA($K01k8G^ONjKx=+ zg1mirxr|bySg24{jtXHKtPv-2i3-vvSo_*#*{sPN-?I;69v8#RuDGiRM0?N3ZZb;3 z)uOm3m|v4T9c%3sFR|Ln4DGNO(Z$R-3V zN{T4(%6GOox>giBeKj2=Z*{%pA38|-O_hHJFC||1{Pgn5 zSr}2dc|fF=N!2Z15EZ}-3KQvqg9sq<7iG}rLBH&^+9WS|-@SVs*AAkG|E&)oS0-^T=@C_~;lU}6&ARX;+) zp$)O>;@LDCCaXzkH{%$HevKzB2abB6RJJ_h=65cjWnzM9yP-kDztkA3^+Upy;Y<6v2WHC#>viL~u#pk#H?obgqKt8YB;Wr^ff#=jnAR7YdbW zR_^lm8r+m`l?B^mCUm6b#*#A#-50mcuWPjc1V{5J0a$6fEV0q zB5tM)rX6Q}gPtb&En`dVf3)rYEU76ZM9}Y0cnpzY(@Gol{ucE(kHJy{!ADnS3$wKU zv5?I1Ge!LZ%qE>j^KvTQznPs#I-@ivtAm2xe;Pb&J*^92Az$1So51*1ffqNAFv1d6QeeIY@(&_aZWYo5qr^+Pu`{qU>WHaV$3uhVsE75D7A0cGNiZ+=o6hsLHzJE9HGPz*nM(nLx9 zX+>)>j1r2u=K*f0+b%yKhTvCkAewH3=gw{?2u;xG4xSrk%Dn0{U{BRyo4=`O6;hF0 zzUjdDj*zWa%L&o$(!ixIt}KfFB#=;f1U0T;)0i}83Uhc@8$?4_B{NtfzY*9fhk6n| z9K4b56C}J>d*WWwZ@LjNw?mkUFqOeUUM{FGwO{8@VJox1+Q)6O^{=k!cE*LNGV&DD zx<)wsoy_~x*#!0Mms=wM#;;dx*J>pfVyK%1cJ8!fa=~i1qmxR{ zdN3q%NrU1=0rwvUp14na7V4KxZsCrwuAP?^(=cuGu5M#MMD30K@BqPl?iF(G$~9M* z-3F5(Y>b$r8piYG+DoRyqRIzjXM`aPZ z2y+6DIE>N3XA|BSV>)<)$`2s%mOfnEZbl_H5m|Thw0t2W3t>}ecP#f0GiWp?1$8sn z3@E1lC@xb3(Uu(iCGQ!c-5Oz$-_mSbMzEffej+)bRgqj8Dgv_shH$%WqpU7Topn{c zgoLgVvF|%eS~q8nT47HVxSfykQsaZyralZ+rG3y05vS6>n_30ziTN@+XZsS-dk21Q zPkW3C?Sn_U)edkBsMm;R^&bzBN1*^vKFNw)MLU{E`7UdgEhWc&Q|z-?h}|K+Y-@{! ziV?9ZCy6>LJ8?XqIEZ)S!Yv^3F}}ogGcUIwHi)wMrIavV(XSN1&;KmGT8u=j^Iv$ z5ZDwb<;~%A8~u8ls#YZaU_+{zooU5_7#)NUP6NZ)Qe>E(CmMhP12sM)Ek9_a`B8Ez zec*mGkZdF2M67*q(oB$>F`2;p@LS@(q*TAHy_gN+e1lKY05kQ8yykBxdY7;w^yC%3 zF47-yg}`Qiaw)-uGk}doTdD8AAplLHmo%yMJR2Av4madT=FEt%4;HX5IJncEZu?A~U_yTZ#4s5h zRB?Ug+0NAoPMd)@-L5YauEH6-(-p6`^oSlC(ha=(lKEFWJqqL~8_cgpI=iB`Q7U*W zeYeuw!`W2DA*Z;_V97?vlVzHG#l>`5v;2x|l+Db!R5n2y(+ST$syEexOSL$NJ_vin z8^_$yT^cJotYz?L=vGK+d+Rt`rm&=0I2d|+tUw0kZFPmz|0QH&64)LIYm=$m+zwHz z1LMzGf8w+z=bE#OMe=`LeM-hM4v}e;f|aJ1y4`3lV6g$={>s9FG&`}496`HchY8cJ zC_TE5+#nIPB$3?0@w1GOs0a2;B~6gEKUI0-e=8>+%RCh~yWK_mID`Jh5P(JnSvx7y zt|Os+uP&qBVs4{;6(P*Bx4hO2jIib>1kt~Pec5oHXkI!BrpiF{6tvyME<>;mQKSZr zN&QpK2;WTW9>{XWq9NKpXYID*UOj9043N&QqY>Aa*1@xqdt%7$8R`i8TiZBdd!Au#zHy4>bk=R9AgGibR6iYp;*u&%S-{Ej%{Mna zlOn3C>FU@cg3IPr$#>MTp5hnZ;cPKH3Dx_L(0Pt`i1A*)b7`-pC&@nQzY0%NMLNwN zYx{cT&K?{`gDc)}pNxu*5}KZluhSDD?;T@2nA~*=RxLF*(AKXV679{?@H_U>oe03M zrXp_uo%`DU05`;p%LjJ>Y`BEI?pz_Upgc5&K_l!dB`y6T_>sIU9o( z*C}6+K_O#8Ryh_WD>)@zqREagEYM14_c&zOl_7pt0Qvweq_vuH^TyT6)^k?!5S?g% zN|4oF3FMozyt_w>y`}(U-67_-G4CX{MGD!X6M1@Bv{1Ch;*Y@GaYQ(Tj#X_`rO>)u z4dKMQB*TB86#}dqY^H1oRXi*tK=)V;hDC>Z?2vmlCKOa(kyq*hGbqG_!LYx zFbP#zK=cvxMOuSz{K*Ror{ddyGasBoXMO9dpx&S72*B-g^AyXS!U325sjMlBCON z8B0LVQl>~g%`=QHR`wBd_h^LqFwjO;dNNSA-r)-C3qkUd+n7@VfZnPr-@C(zECU)m z#*6F4ub*hpHx)=ngTs9YIm@!aS1CbBR))ju@`R)%^^uot%!)5yMT1_ah0tU+*e<2p z?UOcpAN6>CB7L*b+BRDCL})3!p!uT=V|Ak;>l>{oWH<%0(M=+3OkQ)isFOw@R9V?c z{MM)lS8-9#931L1m$D>(^+-0dL9K|H$X$^}G_e~0%l!dB43+cyEc0;*x#xm)JPs}u zTq(=t_WExK(+LgFPc11O!?N7uux7pF!b3Ss#T@GB*%m-uuveTnv_6J3sUNR47b5yec4|vfD zR$bhu0CJ7jWSl`#uA?zR#>rx0pxNd0^LD!cg9L?crg$Y$2|-k7jpNlX&2=SfNif4L zdR$f^7JC-(naxph%8sP)umW;HuiXI0Oy3n#aTe}@hGA{$rTMa$I*YSQ>bT04)q(AE zxHQ+*;nw1t;^M>Mr~kNpM5hvAvV{a|_Y2fkU~w)e4W%eb{>uQ{4{(nBJW%bUbrD=6 zi3xNI?dF3G@Iq#Mb$}a_<}}%;>;l zFu-s1UFuWpz$<&sAC%5tcvKxv*e+>7MmNGGbH_TZCFBX%7ky95~v|tf| zR&QtfsPVw()XWas-I3TasCJGF41YYWlh>hKQRUNcb9~!or09XWfVKD~2rTbdtC*=P z_4)Q& zZ-DJ`V(8-n@*+d~;$57q?vk=nrJG}%aS`ZVhH)A8P_0%&J*ivL^SS#SEq1rx?B}Aw z3eIUuN{F6@k&+Vs`IaYiFKH`uK$qE|IzH=0!YAs4hk5qW9BIhvD@#3Z8{D2xpL?Ia z>9kMtPy-7vaG@6J>s#PjmpbLyv87FXMG4~EI2%XCT8aD%3Sd6!r4mes*Bi!f^sB#z z8lAquV~EbYLw@jBmL(_eFibac0DZWi;;W9{O+WOaYFV3SP{<*8`%Ih-pv8`ptryv} zV!e^}zu+jP@bzO&A`?38&~+nIkn-F9?W0dvY-#NLHtdMZY!dI=kl^%L8}q36)U}u> z$dKtp+(}UKL|X?)q3;LR^8{3O7`!EeAa$TUikX5c_zf$|{iroqyWrnR2U35-JbxkR z>m!8~kL6WFhKcc;p@qq6LPXUC*X5l7Ht2h>w!hyEvL|IND=DVTPK#mtZ#saaYxFwG z1Ed0>HD=8JCCw1|4Yn`IugFQL zdgK~8-Nm$$5@&689V*9%D<>IK$1Gk6CIKFp*-E_A&6hQI;$A;bggR3R!SjkTcN zJeR%**SkD%cKJv7UYc_@-d=n&`J2}k;hzay(qHO3fOxw&ekdvWjlb`5n znD{uDps3C_RI0i+$qI4jhUKjF?&0n$*@gHlBtqk-IP6!D$S(p=8-&2SDqP=-^S(OUHH(O@Zk9dmh+CQ z8w%R_4+iW(Rw@Kw>ymr64*YWL8N4a9$Xz`faP;fVABRXdQn@ip|KC$#Utvi=!p}yrX%;O1KigKxsjP%%>0Ayd-^th0` zs?HfK<*VJdkgb)TSVIRBeBJ)|A;5yU5%g>A@zTLD_-^MzrK)MCR6+}HZO6(lSB65eZAE*onNoz zv#M~hGBiQECSrD;LZLA4qBJh&Bwz_UWdBI&Nu-t;W&oWqLRoJW%04gbgZg1Ayj=3- zo6(-hyK2k=Xh6n-4Q&f|=Mvl6^23~e>jp?8E_f8OKNefn0BB|w+e%}sKFu%8JrqFM z#pQc8LM+}3iXEwr>t~SLrEieE`B3-7jM1{7(=&vEJu9L z6SWXY(pq2=GyxyeD6%m9sIZ2s&XS;)DNz}&=&pX={(j(Cm)_| zG0Q-V0fdR36os$m5)uL`xyG6Yj)Z@_FRjt#U>IbkJB^@g-$PG7>me6LOw#U=hOz}~ z<4&^qCX8A2dN`uu9TY^9=G#c7kPrPYsg^p~xV&CvZ}DqfQLGp)mS{Adyz}cCHl;!d zc6LkWU@j-9|4Kv1`)$kbokNoBKOIv-!dn{B&=UDQsKl+X4~fIzF;@R1`8!3pKI}2# zc(RMv)LCgi-XfA*i-Wg*R*btyht8W+SU)s~{$tuAR zAesci#Pu~}XvK}*9XAX^VwcW9r>ypY5+(_&{1uCz`gz}N0?un>lKSd&1p*rTVmSFb z&-i&8pJpsc6Ru|SJ3|5CzW8+`JX2pVTUt8$zziMg_Rk$AQ=A4@e#c>MP0+G9F;@`G z`_bgyi|G@8sj!``Y*H&r&QAT2U`Z4o@bJrl^Kv{}R(x@EDHv(V#RRqZ7u)HtUONq1 z_&;L&sE#jz^tO?N++xMboh%nLT@c&vtR$dVz8N9zj=LTWG$gn}&au@R^vDXO{-mMD zETnCm`Ayw}Uju^lA1f)8Uhd;#3LwjV(aC5kyj$;yEp{I?03*w@^gp7W`2Ri&dJ^2p zktU(8O<^9whQ>%%C;B5s0O-pF~h{BT#bUF%6GI- zK3Cm0K!y`LqH%Q1Wt9krp9-m#ff@R!olJDo$~ubY>yp#*YpB$24jXDvO< z7hN@wtEP!nk4n|2Oh>G%;j41BYZ)IuIYx<3!q!5oO*wcYxSs?2_(E(334(vz0$b4L zw>>ot$69v7fAkOena86D%9O3EHg-EZK<;R>glHv@Z&4OM)bdvS6PR|zrfUM22~d35 z58s7flV9*H5_80>6xB_e+V->Vfh}Kk!9%%SReX3y>yIeweySFBa3{TTvGe2Y4xBL$ z3j#Hp1hmc2rWq!Hi&oD~jw5b4@>{QH9%}}J!gqW%3-Cp zfLtm-?LSjhf3T!jBYBYhmLq=dIng>^ndyJK?V}JcFkPpew>(Mfeyusd(L^91FIH0V zmC`s+!0j@YLBO!wbcA9DRlvGi?B+F((aAIb%8PP;1N|3C;6^HADHdJYbIUyX=s-CK zE59KwMie0<-S_$PB7~MvC&0;v{W1C4M6>i??yTyrY2Lkh-LEDEpPrmkpA^p{1il>6 zeHUaY`Td7iO0sz&jXHb_HyU`w)f0{(U0+`NX)64b0U%jE^omMfKTl51*z%C#LjHVt zdMRX))EJwU8iDKA&@AeOO|l1?8MdGZmo%-{0B!zyjE4XAU9I;@M)a*oczrR`53@U;{NJvZ?mH)7GM4ho55pt5J=iAJyU{ zryMZ=@3&JCkAw18q$bD0kUJbYk_^b^Txztm?YC_CK2|p{D85Qqc|`~3JgmrTr?THA z;-G}O5qfbuB^>AftKJ->z17JqYCof#a#hyOsLc?i%jw5%#S4d4=rbQ3pFj2ui7 zLma3}IxuWTx{&A-O=uceuhOsZEZ##p-N4W4gVYAL48mscNCe;gZ}q|Eu>%SgPEFkH zJfl?z38}@RLJdp&pUYe;U+N&Qw@L`BjZgYSFwI=y%n;YK{z?VSCXH2%+|_lz_rL4- z*}Ik)GSN$rHQR|bWNEkL+2wm}Y23w)LlAX{yKPT>oQL$ELkeZaX-|{^s|Ar)4^*Nn z;!?D-MqrjkKTxW8F5VM9QXE2An1i&twSpso^>IPXoXWsrDkhk>Wm8zzk4g~9TehXG z5;4Aq!3!ZbW=;(A>q#uEJEG-CZ&owh%?Ia0Gv#Xn1PWP^EOhKjSS^Utc1rb*;8B z_dpbXkQ=CL$_^X=Rbrg>M8>@S6(v6dpJ52mEI!Ue9bcVGq)aAjBM-(4@(Mo~c%7s| ztFzM(Oe!EAOt-iqEjUdQk+ByVcS}okuK8*RPZp@bf9On1Wn*|Z@g#F!DyZ4t1~DNP z7&J~M1>(06ms&};%H(YF-u9hx$7I!Z#hRa}m345Jwp8$nPrqYe8EPIkJh6%(aRu`()8)_P)e;$(=0Zo}bfDZi0bOPv z*M5FJ=s*s)P*B_iwXNUy3w<1>E}SasNiVY)DbeL5wyUa6j8=#MnH7OBnV8A`M^K%M zJCf<*X($ilZ$!QWgco!M{l;8v6y$y@6Xpf*36FSnbW*%x(r9br;~<^{8PPF5#*iH2 zY$+IGNCE(pdw(K)&$~Ts@j^28-d2^VISJzpf*!$#0{$~ctqDzs2+Z2>*jt&VJVS1{ zoc=y%kHnUgA?JyO#|Tm?5Tovc>^`7F`(5R|-zX)R%fci7Ea0f|GgZs$Yu8GTBj0x- zCOtgAnttX1%po|=^7j#P}vc~unC0i4C; zUFBU#!P57gs@uX^=wl10_!D4sNi<5FGf0G!4IjY1a+o2N>{UtUpGemRwpvS2pdc?2ILA8rl$B;US?>ga20qW_ABxq7=d))wu5*WqRc z+ExKbW5NGhx+WnGUDH?L$4GoXcV$LL+B*$T4}&8!a`ZVIUxwdnCI>8^eR^PWCo&k4+%-M_j(&E3@3K|oseuJUm zJ-oU`O?fU{>JgQkq{Nbs&KpIXE_8AACp9UHsTe$QW}nR{2L*DKigsfj^<`kkWq1OD zf&n(6H1vMzzr9flbyf-O&2rItPsK$*N>~=YUd?1*W?4%c+x$^O{`9c`rW|$5afs7f zF;g-9Lldg^cJct`kf<4v{AT`}D0CyIo0}@KKyeLzx)H{2u+wawZo@Oo!(IoqN3ZVu zCFZ;n{I@7z=l^O0i$$O1_Jl%4P)?-5RBPE^EP|&y=t)Wu6vz{2sI$l!fA`kv7gfll zy)is@fjcqJtBF}OExk=oEjRo@J{A+{XDsavwe}y6_~=~09If3~FhVHg{d5_QA||%0 zpU0SRpwBIQ;mrIcWq)6DLT5-z)v&HmSMzFveNp;|K6e6*8nh|<{8ytQu~M8luGKn| z4H@_PN;h@(Us;?Y9+L;j9wrP3Z})4rDt7S-jUNKW+ja7T=QvMFC&uDCyaTHM>{E;9 zZoYWqKe&&FJRr$GvMYzQ^!Gi3xGo(|B4=$k1zHjBnw<8UPAqhOPS$wjwUBAv$&6zq zJ;OIdGzmsNd6IjnV4jV!O$9;%Zt`WK_+=VeCWAp6XU93limPEUsxgHqh(uhXPibwb zsD~bG4z^J3^RZ%Zzl?&|`sl2WIG9tFW+)ZHi!*ak@N`X8cm4JiVjj(;7%fjp=%|Iz z5!paJRgdgCs_l6Zrzv~DZ2gFZ^N~$Ht5>XOI$#XD&woB;d<+Embs9t2OdSYhaMgHz z$P_k!SbnE37Keq;21!~GLkG*Vv6S>qI|`xsPQQT3_yIBp_ky6?XY9Rpg1MJp%wd4t zX;y7Wz4(&VCUp8NQ_jC8=<_HUd0RD(}&Kj1F6Fe6CcXBN~)X=lAW zuN0T#`EV9gm#w;~85J*LG;9&al-fZKwBY{S*+hYrUYjy(S_;*dT1IPS7U4{a(hQOj znwROJ)}mh+Xny^&!be(1#{SDFq&Jzwz6GTKoD=#3&CsI`{#OWlV&f)7I8z+rtyfQF zLoCfT>U_c61Vd4wy{*%^kw0{3?^2?XmV>pq$O~;=TEY?k<$k@TJ-Ybx*}>Qpwiawq z2x>y`@;rqzL|CjS#nI%*L{@zFsL{zmJ#n+C`k7Dra65+hhn8!zdk+bTkIwi6d{K?< z-Vy170q@yZeZdP&hIAJ*CwaiePQL=ux%BYRp9>e08#oayVhw+}r_+8B#oErwx_sjj}3D1mDW7HjL zvY<_e8IacaZ#0DLiUbtdT-O^g17fy>fy$qU^1W42bHIg)cvVr38kWuTk`*-1t#7|A;h1|^?h_q; zx0muH))u?=2l+ZhNrGDKj30Jn|NSm#XC03+NHb}#d$^@TA+K1A9 zOjvDUnbbe}6U!Z-9%T^+&}#@(s&f$&O*}r_&egD%rL#{Z7~cBvGof2xv%Upwk%Dtx zRzD-Fj?JF0&rjI1&#KY!Iq7SocXv}bHPvIk_N)h9y69Yx>0n+rC$Kg0AE`&q?7l#V z9&YO)j-2h>G^t9Duk7}>z1!=K+B$N_`NHmX%@0jOp7P;6B-sQ&447pA=JE09uCH{} z4BJx(=f#yz1S^6iJ6Haf)_a9%H=BlK(u%xp<(*?C)YBj8=biVYYwUtcgrUXWyQ~gd za};V&<4Dfi170LanV&?(LV>0tz)br(5rf5^Z1Bwam7#KS$|az^Oxc_rW_DP*jTTth z;)G%NF|dAssq~-C6tL-Ti5;2b(osOA?pWwnYhvRgfS96N@P{IH%I69V=`=1fB#wn~ zQ=KK5BP&H9VqYhSj1ziKtiat>V*57MO5?9a8TAl~^8RsW`s$wbnhY{CEpAY5VKP?x zEt-xlujo$?yDk(>c!RYj(laZw^;DneLFu%a=$k_gbaq$rfiWekIxpO0Y}KpN<;JK) zk;>jd#5#yVFdsI%Z&X5mHptiS@1SQUSN{(VXNlUZNSgVnVgLrEJJ5&MJUt0&^M}&m zTPuO)LX6f#8fOnHm~yaC9u#SFg@LlPg-p6ZOySy>1!l2+dOk=fityy=QvqDW;!1tl zCMEMWu-jBnBh3Rgj4H^GFVn$g*I4?*Ril{ggwT)u3uC<3@ce>Ytiup^E_*jDkC}rF z9tHo$kHFL@G_$ZhKe*Zo@pq1`#?cJxLffe9ph3%{ULHuL1JIl288X&?Dz9W?eE%X9 z>SSo4Nu%xd^vrkED~RS7CiWbV9vDz6S32U>U)H?+pWbSJZ=hs;dUJ1kvg0u9U0lbM087q;Kz}~^l z{bdB@P1G-jEAz4<_t#oqj-p=Vtpye1Dh^2JRJm#{1DkmH+Do~|I0ps)y4;F_+EG!$ zS$lWE3C~C9;|f;m0eWtnR6Y+C|LeR7=&wT~OB+>W=5od+>I#8J^?rsJE4b6$b`_#-0SFoERF++=qgYiF_BwM$R&gYS5+>s+ORal<`o*L3fe4z!DA*XIn|MF6j4woR z)HpKZ&35?QM6f4jmR@1hp9KNIt4VeLyLP0;Ze;?)Yf~s-%n#Tiy^w?Wv-iA+!i#NA zMjwVtzUFtQ<<5``43fiH^hV~9je258y%%T}@K`(xM_Y)O7@5Ekyp|hh#=g{vcjC1V zyew_W!u$U(nQKkB*DVBtGq?jVUSPO)*n{#)xm8^c z0~qpepM$xf4_6|2nFV3LibZe27F>Opz1&3&DZv!-0hdDVx7-@ty|M4Xd zDAQkWR=)lb z1vWN*?JIv$!#(U55|1Lp(E>44I?YjYo53Oi_^f^PoJEi8sHZ23h~uFt_P}dXA!6;N zcXT#u`1Mop5pexhn;6LdLGY$&Dy)TYID+CHmKoOGS3E;yk?OrcpZx|rywMy$adRSE z+?}4GCcN-(!BXmt&4kUJlZ;yp>Gw17lc^Tyhx#EI6`(R#?>p>vAD?SD%(bUn z=n-*ZvaQRF?F;{vj(n0=`{FwAV-B%n#4o>e^c1TFa4wtyMU$te`JYl_QSNy<##O7H zl$muWX)||5fhzr5M(Rr~pL z4kb55gttt$@sQr{XL1SgnFO48|AixRj0risucx_AF%w-P1`bJ&vdEi(h%&EfLLGTax z`A-h4`ZFCNh@~fCKbI-CL*}$sv!udZgPGN6U#ZZZwdT2Xr0q76(|4Z;nBKOc9 zawL=MvSyEQZiw1Y`Ww)ENF+Drm^)vw1fdaRxZml5Kp)|$W4M}8!De`BYz_BWHgicY zjN?yYAn)oE8yJc4A$dh2WRN<$OnHrsW(K-d!zDY~uBbj;U?xtVh{Bz){^Sqhcwgk= z$d#9NpHz{d*IX+Hm8`?pbHB{7@0r zYL69LkrbkY2vml$4zdBR#6YsnNz=|!Pcg095mDNaY=Ztk3|IR6*~)x^4mk?6W&)!&OD50mtlcO* zgvuMYZF#9qv`K?WZb(i4L)rE`zC|A~RivMv^e)6|4R?&c{9U7L{%a?gepDxSHkkZv zw(L}a%7P}^b&P~P&9ojtycK5|SQETZHPHThb7`)SP6Jc<@sEg!)xB!j8-vlRIlzoo zYWFk7lX5k%P?^ognDV4#muyTEN#&ofb+vS)GvLqPW-$djo9!{7k}Xh}&gIz~Ek*}p zDq1tZiqSlu1ufI55(!R5Ci(%-M{)J0VRw(*OwDWrVWS#9@uRg0!4# zY6`A5JV`0odjkjsW(vC&;CUI5%&Vg_tOTwJuEv#1rBpkW=S$sfb=pJ|l9ODshf+?O zhN`vcVBbXRe)5?^N9|%f;>wH{z(*1jw@2a%HhJ)rxF_87(^$Mv3jk>Cy&dudOzH3c zd4g0OjAMrM$Md+T=G$t;oiJ}pOW}uE`o8qOl`78Q7;O-h(OB6Uh*a_I#C?zwHjg-P z0(1vK3@!TTrx|bd8<9N8S2d){a0n+G)-@?(wFZU!GdZwY?v%2Fdv{GjXngn@}16UaD@t#Pj{)-69T22e^{?|&eN6gMR z0|Ed`FR!1a`_H~#ibjo8hDA@4YbmGh+{_GFZ~N;aO6YeV-R^v$HPpf6|C1sHgwk=D zu^)IQ*FUb$e?1-Ao>oPjVlD}>8y3Cx45(7`X8;Edd++G#yV_s$|Hb`1f47+hK|`O2 z2HO-nX=Ac&7XPc2UC!8WSoY*f12``%B>F-$u6ecdv&gT#*x@*Fh0pTA#oltNOE(D8 zL(uz6I$|sqc9wY~s>3(L4eKmdEP4+)KWsYrPaE6kDSXBD%<>dvLtHBw$Hz{=rd^#q zd>PAdVH1=l)w{%7JBiQEK$cy&oJz{Z%G)6&WWTW?dMOg_^KIr;3<=Buv9*eBvQg1# zXQsM(D!!C(z%#KZira+HeBs~Eh-KB)?g!;jx^5wI?tDi+8h5OaWHjhVbFY3cKw=V1 z7AJ{C4;f*0UVI(_iEa$3&BQgw>3S^?Zp%<0la!&W2tP!0c61j96<5r1Z1Uu|vU%h1 zK7SWU21vAo@8NmQ(~d}d_dTzZT$+-H|Nn;|QQ$|5`|{oi5m+xtp;O(lY|7$9%FxYxsO4X5KWK<)l&z=D)L?N#xv#ZupIxUxd&B@IKMKNTDXS!JN!@Wv_c+ z&a9`-jOM+CwJ__~FnPUvWbC>u`6n0~+$pmKk!u|Ax1%OiA4w_Tw{Z?>EI^yufIR9P z74!5;S;v{2BKOgGjxuvF;XshR*z)7Rr7$YI9TYx8Rs6bkA z3J=_>az|~FjNaU6Q9|?vHEA21Hx7_3AJP6C=BFINFZ1_bJx%)XZua7`_*6yQs0EWM zUipjp-xehQGC2a#i~ik-b&-mwdh1K2R`wtOR}2ecTYGV>TPr30a!7#KF41R zjzfhhCg~D*lwT3^Dfu{LSb3DaaK4XsW8s16EnrazbKtDKnOx1FGepgXJ`uy(x^wuNY z%B0{TRqAU;>PGj%(AI!43Vzqbnpe-$2(e&-_d{KmbuNRrNG-9W(!Mr~Pt2vyyL?3V zXA@t#+o^!3RC$2xhyunUu8tNd&Z%iGdaX0Fduc==ib$$UWPcoCJEr2Pe+W1S5ESGl6CssA3~P{^ zG?)=kK?4cD8@`$=HQ!cN2-dm?iMyF^9DDh(Y6$Yuo z8)2AA_R6_U+h1nZo?3ao=G1bCNFE9O%dbT~gw*guMY=jfxqJvzD;(A*>j&PIl_+J)W!95a?Hy zB9VTlM4Mhh;K>9agQT!i{B~mV<37h^7F6im*cMDhTfyiCad#9%7fJ zb3|n6>kd}Pjn6VoOLUtxu5(R}I~Tn#>4GyALHbN+E6p}8`6_P07(6z0`l$k*o)#Ny zXjdlbgk0moxW1ACM1TF(>g!o9SW$8%15M~oCPd#Q>RhhB)HPB$h&ZWsm!RK=+W>RC~NlP9W{*Tik zV)p06P9Q{o!*)_WizxGV$uG$g5*&~5G{j5|Xeq8dg$}a5Fz@Owu3*m!q26!j9DldG z|4M3JRg^a7&N&OUFbUB%Y4ymiTfPzCn@I7rl1CBY00$ZmsTXYF$SG*aL400#7naee z>^FmaE!^l-W~1hqb5i^ruS@sXI89s`cHaiAXZ99xzX_^0UPP&E7W4LQB7z6((KMX5 zYFQ~0RM7uhVjgjoj3NYS(%DdJ0K#mbWAH3quka@aP;CZDtwUSAZ#(9})60eOmzPFt z4^VTVdqe&2_^j(OjA|zx2MWZ^ZCiEu>4%3XEE7=r(u!SzhP@BIwk;#*KijaDrtjru zp)FSaT1a(5Fn@JUG-zF3A<)Z+1XwA64Ga&BK9YG+E;^bKHFu=dY^ndxG3I#w;+Ww0 zit}a+ymw#>O@$| zT8cgb9G`UL&bWzDfXYp~Wu$;pXf3=I)-P9&1JRu=H2;%{XyMzPuRx*SbCv?lcuXh< zfe;s`){#_0MU_wZMnPT-S9_XaLKAW4#Ze|D@|dg{hN2=Ln-Y7>#fWpR*-U8F5#VDE zMoD$;32k#75a=4F!FnHoL!rr4}RmBJ_5_qMwD) z?_{g}rx?3+K|Lt14xLQN)bvTknAePIIT9W~)*&*@&Aaw0vQXO-3iJw%XaKv4+DNLc zB^Ka7R>}6eE@7A`%;8=;QrFZGMNtvFT>UunPDC|ssxy!#q-ECv#55(lehWPJ)G$)N z@0x@|$xZEB`+81j5dM=|rnjy6MRJh5##*wZGmD|vFsCDVX&05W)IOc5+rk4d*L_K z>KEl~vtImlm%)|6Q+Y_R8+jFJEGsK**a|xM>H+oC*5VrnQ50v#guR>Y?N@knT&Pw zGBMY)iy)EFIhEnq_07|!D{U6Vc4_#fi`MexVQ+9L&JMvDedGg&Rt>JYUi^HzL{eNS z(qRImDh=L)n^V@7(lk8IH{r$$s6;*`p0BoY2)OZlLMZ2J&W|Kq%!Kt$DO`xF6)*yp zj9;;}RDO$gMrG&56+kP^#d8sqGOe!|q=Y`IXqQ2~%7!SM^0N1Gm2(17v#}p+Df@aF z2j<4i4Si8xMAw{a6!RumOXq!x*G6Fd3a-USV{8xSkGg)C1(OUMyA8NkV*_MC*II*k zM73Z5z}|CMxk1H;yWZzQw@hpZn5%ZrKVt-xdAY`@c*&>PhCSrp#I6o*ap<^8a^?c* zH*)F}28SPQMQAviFl))^=}bk$e$Ni!g6Y>cggzHE4OM6C2vGZ^ zuI8jjzBSgh&x2MhdZO&0jAiM6ORy(1&3OoshQCRcm8{FBBMQ2@PZBN*nKs0)^VZU! ze!{Df{h8oxq5#+X!zfPj#uc4(!qp-6$g5MTtmd=@?D~0G86lb^m>RAYN9n0#KLK9l zJIW>mMacJ+5v)fh$8wZ7+#f|ur0tIHEo0PdEeBS`tl4f8loGOYVPO2tga^s8re>GYHdq~X*{ z{`tmiN+?Hr%WM9Tj*Gt%A?rKv4;==hQq74Fl|&Q;5Ov*#s0V8(pF>M-b)LIXGJ$nm z)6SX(Zkdw>GC$Nmg+mrz*!uw7Sj2Wu?uuu6WIaDkMn^a^JSlGdB@1g4zSe_u?`^F|(0#5dQsFya8erV0cW0xoc9{Fw(Y5`FJ;cN4JyE$_6tBLp) zPt$N5lkary~n|^o)O)05w3$zvI1$MN4-5DbNw z?_KbjscnIua@&%!?cp9^TxsR>6+_smo~8BjnNo?4E2xwahSD0!^(yo`I*Q~3UW>b5 zXJ=pb`0)YyfBL4P-2M@<{7tE^>yw3v=>P?u(&JO`YqC!!3dtm2pqX4m*FL=@8I)UZ zeaS5>wMKjwGi36f**JpJRw*ep0#Pv#uP9?5OMdKVtc@L6VAUH(ai`AXuA z=mNkPp6VYe2Lwh5s0{4t5#FFt3a+ipPa|+t9v&A|PR5fUz;&~P)uTQb?!#MhMN{Zq zroR%kZUqga35J9gxYlj0(%b{7r^g0=5_?P>Nn!tz7K|VLyJ})%yEm+FDYqr`MG2W& zsl$bzo)hm|0dk2uEBJ&9ewAGVYIe8FBqLerUD4(D2?9Ol(>9 zRo)+o^v}~FB4Ar){X?uLzs>zolyN%m9xDN^=&(!fhSQHKa;=%v>)xtvmLL^lg-Z9MWa~IV?Ju4S zGQyMWm0ZE;sB%B62o&JS=GJfq1e_a`z80_d~|Ye|GH}pCZ3q3T+I*ngVH)wu-8dEL+#Qn;+S zk1b;J`nKMK^i4WyerXUS^m}?P^4TRyRqJlC`V}Z>Y7GGob_QW!JmNF#rexQfs9vb> zmbCtAiY!WQ={qk#LLsEmW2Y&AY=u3-ArnYt{#fsxH(4{ZCKUyicr&BeJH{zim z4F|8m;A5){s(Q*>|(0N!YoDmnkD>r#U<%$wKE7P!YYBrP#9sUHsV zcVS+O@H+U6XRg^=?U|YWae)&XI}N-In4ZhY7pbyZCfOHLiPy{g#wo9>QpE8%P#N zPW3!xkC+HdL!EA_IAN2wj!5!d{b_taCP8{6$QMq^XB1m8uwKf80;m??i-@Pthk$is z9n-ysKvnP0vnHE*f@PZl?o3I@uB_}0JXs>H+}lc%@P3WNe^2+ee$567)R<+B>@6)S ztSt953b!(O;N~-WX{|WVkd&l09fYTFOmiJh@Q`rV!47eAwj&e(u4v1E*H+CL?vOz} zu<|oWjI%aNA$NR{m9Kw66R@n0S`Fz=^iXp0!Aux4D74BAe&ohi7p5SiB)EPH@2Ty^ zkdSV{-wTd0jE2e2T7loUjrBr?47l{Ha2(A6Pi@|_t#mn0g7 z=~u!f)AMsp9H@3gMQ676pj1p#T+C%5=G;5v)5fUN#13_C34n+u1)`DG$JOE)Bj|w( zWB8he)wKlI(<`O3|BtP%Rx7?_jst_uPqRVg4K-c6^1rOt^fN>*@E!0onezldIt<{l z9-^tv1v!Go`R}JXy#oTr+RtJ(_;$`?qF>-y>l#5zFF}jr$Wf)XGGq+L14?}N!OPaY`oozMLY5Yy~xR}KI-yARL8NFIs+ElG5OmC}< zJ#)Q3699JD{*}piqR$P=b+#|o<-Vrp4h;)EuWYmVCsyUi51t1Cu z`J?pAsSl8~V z>S()iVN{B>)9MKeO|_Z#8*DG|^8%iia^qUe8<&>h%wsLQ>O2BolnRf0^1Py8N7<-H zP8m&-D!#Y~OP zK>w606{9z36tY4%^_^-#!n~xTNI{%>g{s*z_31=D^spH~$jQ=<7K#RIZ!#z8zX;fv zN`T?7OsWzugW>yB$d#G&^J@V)%UK7)#gN}#&#oim#}r-|Bl zglWkGsP1O6K3h&@ye-QL)lV5t&`-0@i}*p!KB$?aM%shi;lcd`>;ar^Z~U`!SBEwb z4xd2^KY7zxd8s`2KEx#5CPI<-?K&#(cPN0f(+KjWsUE?W-a*(M?5%JGzRBKLs~md8 z?n?Mus}R9Wmymgx&-&wV!tomBd_W*?@HvPdW%ddyI6%a0ka@!#czl1UM1Z%;fAPpt z-jYH$_H9uS@b6Q6+w`QVd~h?5=1R6q_Gg*e`X3#>F}fYAsZC!mVRVaDcrN5S#5{W+ zb_?iu28-K8cuzG*D>1KVgkp2&;+)TDa8lJAaujkykut!vCU=A*+2JB#Elr#0zvs{u zb(FznL0qby!)ZH7fop!pCtYk#8X}?hDypsvtmJ<8GBmZGP#5^5xy#jJpXtzShmdod zvYDq}!qiJekyM@zU^XEQZ`$~pqhplIw?!Vntx3%#%2fR9y9L>)XFLKjSR?YaRJv&= zdh7({B>Di4e>5hTqSz@H;nGl6!;-zG30xxBN8dT}FJ9;vxb4FVEY3xc+SG>$8Sp3O zk(&RiJ^4aF;tI3@0U9UUZrDh8IF&q=b2`!@PWP4BGBl%gOtbveeAYD^#qKSh1;V&8 z|1rJMGra)y%15B2oor-`?{9_`R>;gYwMIOpudUWVW-b4oc7EE*p10HGmpANnlFR-s zy{aLS?(?P7D`uaN+BEnJ2x}eqy*i3X-qIW%IimSa=2l@MT8AUxtI)VMotb-vC8>R-1p#)`q+t=O z&N@zis=PA%hAO|hT^+KExXBiBQ^c;Dn*jV3bvtPWgel}S=cA@)G8RteXK8Y^@20L? z<~z}JM+>sm-F8C;D9|DKKHeB_DB%rXL?G^6hVfExa*(N72_S-{!SXyd8UJu-WC}Lz z3g&n4mK>O7NU>7ei~a->G4xZ|)%m~XIB-G<&VmDJUY0ALCCcXsbN?3@GtZC<^g*go zebY>snRiRO0|Pon%%Vs>6o}JDWnYVHbG#cM%!SF?$%aig>bcd=S6DD6T)YtfeDS~` z)7NKaoYBXSwW${4*p5cXv+zi2fa+>Ap^U!vHe>UY-U+=R+xikSvps$EbjQ-z*kzfuCKj~dDpDwc3PZyX6`JLDdPWEeLK*fb)w2z?*&rQPlob*VNY($PV6xIESg^bV4)oy zR3kWz!JNxHuf?i)qVdAyxRm&c&#BlBe*M@yMN*S0_=qYGH+GYt8U2E~V_3{VWh@pw zF%yHq!rOhLBD;QZ@tR=S4g>cme0(*lTC~O&wl7Y{g)}m z5@6}@>AWqVCV6AVeN);#oEWa}Z1dk0jxgFvI{8sQv78>^i+`!%?a-y*Venar>J`W( zHKwyHkbaxUUrZSOVSV9DhR3lt@#W_%9#;|SBr6PsVX&uWDxLUHn3>-W=;}rl^>Q0F zY%@WumJ1c)JFiQ4c8ir1S+7o$yV&W$kYA&JPdln3YUw3L*?o-i*2 z!T9<`ZJ#NS_cNs!+5J+wbw^}1^=X8T2KMAnb>!isy-e$3hQbX_y~k7RK8ub!Dz84& zbOV^Zx=E|zB7OqiFj5*9&Xq3mI{b6sz-I1BSUj*VtoY8Qa{tR6qRNGjA?|Rffz{XR zF)LBiVE|a_p26?YMbVc89|!f+*4;2s%$g+vL4_G?r!B;}0s@fc0sQroHGMV~-E^zh zdmUI#*#5L(AFYCcLmn*?@kG72ZA6sO1ifYXqM^}A{0VR~M zgS`)=)gZ;x_i0-y-{+-WEduc_|I3BQKHx9yEohE><#75R$1B?pVtZWPMt9Ot2OsRI z7Y>~1EX{UIkTEz&NmTr@6B86>Fq6Y>-=fi4H5GXhw_!~=GH z@e*DNrd{C}rAc>)(duO}1HDPUzD`-gx-AR9Z3=6s7s$9Q=?_*gwRsJ>gcTRp>`zE* zCxM558yVRhu|zrCV9d{)Z|sgnD0zb*BZAeqrD3sG`Rip!LJI?mfZ?r;TdU{fiop1? z$N>DPu^%a`ussWR5-VZZSxNdlP&V2NouUL_2bnrHK1@4wcuhMvy9-sQvbL1F=SMpP zyNx(aJz|*K!1XNpNvVSGHuKNt4RiHl@qoG@9~-ea-9Qrc@{WdI$TYcAN6tQ!{-gpk zLLPfM@A`B_}mV6z=CQMVBhY+~gA25o^V^QY2I>8t#>!DrB z`)PZu$38$cf$^k!h-lPjI{Oscs{Tb#Lw?W?(d}v0wneJ5@$XS9b9Ll0)pMbxQ#AXv zDjJ!_eE#7g!+b7HKp#@$^hlqkLLV8W@8-Mf{w66U)tvU8{gJgp68+%p`gc!~oQ~h# ztD)n&!c3f;E;>Qoej!|1GxP~#iE7;rLw;gFLo1`f{Y3}}<5!N=;6(+o@3?G^{j}#N zSOZ%!JGil_;|M;K%rMlD@dK3sfX@icI;7U#gWbhYL4M;*)CO~6DJHL&Z_Z6;H0P{O zVO|Q>DSUb0rh$B}$@JJtF#~H<_ywgzat4Dc0wiDE?>aBIuw;#m(KcO8YcB~&t7$2w zJa*WOs6c6Yog*=665Q!P>aOg5;j`{kP>Wu^^c0dm8730D0b`daTvO#}30ed3g z8MhT%^ zOjOVhE_ZhXG_P5D=9OvvsuY$EF6FO-g2^5@M3utkLyKEkyub9F9}&bR2C!~MzX_g8 zR~m1<^WSox1F}5`sCxQaZ<6axQ1WOB0z6)NBU4VTc)V({6^s<`Jidt^GB&=HhXO3r z0#Urmc26p~nLL@ia${nKNx2?a4ayt{?!KD`%7KT_6T|@jxVGZIS{-hTusK~|j!v~h4jb31qZUy|WGj0nC1>XO@C!Qx zq2?gMk7^9R>4{paU~3E`vA`zPW-oWSU=rPFbty)dLv^5}mU;)-CYDv)f^=?L4KVuA z!azabpm9;gt4@%UIqin(-tf-_PVComcOX{x@1w0yTpfoO!}NaxIdY;e51X5Zk6Drn3KV zW)z~UiwVE;6F>~9FaGPjfxJQq&AinGkUAGZLy)93YJ0O4Bf2`#@X4FS^*TQ`oem3{ z#(%0QyDD2$^{{C z5!1Fp6lM6q5Mfe2$wmH;BEFU67f6rn{d^(%u;rj4K<8d}qs>*pY9w88lx>a|_}QkM zl$(Lvj6pJF5CDk@GO-_RPZ`9i{%3>B}_zygVEP}Mn%mz>(9wlF!CXJ24FJ68} z5E`2Y8*YHpl30ADUuwCnTEJ&d=a^#`Y^z>N?a8U=iwO8sW^QA{!QL2cSj_p?V0EWG z)#bh98FN~!Wvzli8|W=(i@6@>XB8o^9;5}G`OHmll1QbH7qd6t<8Lm@31%>XaQT_feHV(zFLp8jx;935O?r<0S1kfbMEqL12rhnk{rvP zq`|_I`?VZg-s;8nn9W+tZ@fR!2m8{w@>rgOD9qsF!g@*FU~x8Om>x+v4~QMuG=E%9jX#SQ09(3Rcca|$x{0~dQai0an`MxP2wO>}p|z9x zLLY2x+f(2O8Nk7{yb?)jueId*yiH@g-7rl8pNnP#sc)y z{uw)R<{>OZYJS9P;5dVylMH08179P}!t=)SyXAsxY=28)wtc}~DDJwjQ(W9*;TstR z0nCe#Vj9eX-{^qy>{0v*oXNlVI^S~DFM3Gv&y|TnX(tzA;v6#@$eM>q)uKu+x57qQ z__@qYpXzfN@^f;|)};%|Tp?*qD;2bq)x`cxW5mBvN@Q8qbL-@2U)2D))@giHf}O55F)2_a^gTY=hi>i z+(6Wn#v{+#Ag7VCBJ4y`r9>odC+0;eYSo7X24`LL9-Z{J_DZr1gP6W(I%bCtv7`#N z?pSqW5|&Jk8gz+{90<_SW|z&bBB&D|2T>>L{EeRalR&+KrGqyN%~j_vJDP=xjLwyN zE!$Y%Sy$;l5-=lge_Gltj0j3Y-n7FLFfEm;lm#^j0}&dTwWz)kI#oI8W1C!n)Iedau5@Q0wR>PieI zU&=D97!p^ZqqMs%+>_tY7W(u*t^#d00BY$V3z#!Oimn)-W-n(m*tTrBzCuGCRl9M^ zSCmzP!Y=H=wFL(N#G2NPP9^lA%fbi-Vs_+#`PVu0yfO6BLTc$S_5FrB4eE^LB&Q`Y z`+`}~e|mvvwV&sfz?MS-m&woJoaxFJ1K+#Bcv3kas6AIaTdy!@uy2d!$tPk_EX?TAzQ(OBySYDuLC=qzo7G5lk00Yx+tw}g>B=^p1PCin#*m3&{?c* zrh~ivu_~)W80>EDE9Xp02>Mfs|0B>#Z0VkCfCcM{g2n%*+BmR$$%oldZ<-hy>`_7S z!V!sYV1+EEb-41d@FuNO1%Bt*uapyc8?h4RlLVJr#@{bV4r|0Q0pUS8fzY`{?^s>} zW5Q;T>mFbldzqI*2c|0|&J+*+G7$bXD6$dp>?N)^u`5u5H;TKYTH+$;#&v7sVYiym zIk#K5u^$j+u|=SvJof+3e^Mg_y$l7b4fYhWKQo9cEd)&$Fyo08YUq=_uvy&^GR=71sYw14r(l8v7Zp8c5n&IEsvj&a;*q~BJ)L}?fO824uJ_OFKtN}c!LzFDb*)^N;6@IUHgOP$ z?^3AoaXqHC`a^=U3ZAsRGUv=I)K9ORSt9M#v7n1hSSh#5%`krF+Lg=fF#awpm!Hj{pr;v zX!no=RYbm|%Ra4LyYH-Ra0mYFioD}%a*8C%bdPCdNoRJipk!Hx#%i(a=L!|Gi)Y>R z1~dR5R14O5bw5J1Hk zg$U<1M${#7lR3UQi)~tAn&eDWe%GR*XM{{j-Zk?KIuEci9gG(n9DeF<*R_nJRRNj* zBaY)Fx%^ZOBbOS{pF_uG`X!v;9cPJ968sQ_zNKEcg|%)t%&0>_p*L->qXR|ejgv;xU7k=shr~^u(~_l zbt`V?u_`50z)V`1&TXf(<+$rZ(8Q|Oc8RDyZ3tR8=^{UL$K&rgr><@EDVk=PHI}#; zVDns=m9lGuE`D3^XRP8SSkyydRVX#GTT@Fw%W{=Rcu z{!%STd>Sjw;vktCwe5=?=8#MM!oJno+pyLLc@4i_-V=y`?WpZ`)yP{~QqdC$@#?2B z)sM5)J?m0t^WD+^wXTk}ARasp^j!nOms zRN7GY{l{Yon27Lyw&Zb8r~()D6o52SCWgmvg_Ra~<`m*b8EDuTWwnOm zcPLC+fO}y1tH47ERZCQ_pFKY%G1kkf&DHvYcOh}M6%bm1J3R3YgS}S43~=TX{w!Jk zx2zzE&xzaNW~);V6p71hslk;Jz}O5(0?}R&K;5`Xt~6lpB)gJ+IqLB97Y}Kx@`>qqWeaz=k0=756At0kUn1|=jA$&fn!xmJ{$G+=6|6d!)zA^k*cwm=> zSx1V7WG~*FE5prdzTj2#Dm-29cHPY2#w1XIr`5CfNXPaH&@LU*dk;i@moVWy&pMG- zfP_i6gwB9H$}3Uh$?pN-oZSKaZ|t+BldUwI z$BCYsJMcp9p(Eo>mLn#oalf>{o}t7AQ$P=1?aevXy>6qoN%{39EAkEC`tQx4>ziz zmBvah^~4X-=g9;NE0>3!-m1QYakavg8Xib$Tq<;4(ZJ1wxMsi-FvWIDqDw)vkVQ z$?W(}!H6T>vk7)G1qrfjplcFveK1o?iD*VlxOvEc=j&!v&hRuXsf86RzY97MFx%U z=2ZY%OywY?p;d#lbm>+{TsE?e%d7(s*)C=dFW%x%i5MU(qdK-RkslZ)wOeoM5NRZ4 ze|lY~ee|`*Ft(eCIXJ-$Gph0IyGPAwI`TpkYx_y`9eZ?2hj5TnUM#$F zDYGYG9^3?ki>EDnss&04#28rLD<^?H^{g)hh1D>(E!d->o3y|Go)jVHR3a&#qSctA zN-?wlJAXZvYN?+TKAN|^rqMh#gxJzFr?5>ZYT_cGvMy5!)WI#V zuQxJ>E5zsiZGUX+EdOmA&mqw9A{|M}gwBIo8j^R)u+yfIF`0aRtZzZ3LzIFCJ;=m> z;=a2?lp%VoR()M~7ZdvW`|Y9WU!w=w8jMMFMhXy2Y3*YwoaCl*7GwD$6#F59HHwuq zxChNcccDC>7|GIBOr(=;!?OO{abS|cyR>&nHmtzBRDB}$>pLIy0pFrozr31=l3k$z z+pIUM>V9B}ZF4r({p|;-DXyK!wHd3eDTwRk=|!inL1Ywcvnm(_F*_pDN6slhsimkb z?)Lweu$6$%)%lc6&9DXZmEV_(X?5UefYX`+;SPi~_8@wo0+5+OOo-Cwjdy}+C1hYlL7 zPR4%~tRmQ7q6w}@!T$y8PD%4=UUxh`cP9Qj|%m-O}O!8dJt>{5UE8SnuU@x`1@2`E>4#5XI`YIL)r)dK7{@p*s{ay|F z)5*fblLA5(d0sX8mafPt-jTibFqAvX#HLrs#5P{p-8g#=5(VVm<5+s-1!2H&jj$)8 z>dJ2M&DzC;+@lk67I-EO`T7T_q}BL7*6yIZVf?1JoIcaTNJk2x;IHzw_>Z_!7`7Ct z$R%DS2y%ui1KRMfRI&pi<7R{I|KS8g5iVQ~e{aEwOqhYzTJ@53)PTZkxofyCIY-E2 z98h+~Jbt08d%h;kRM%1VR-S%zU4>jcM&Jp1p#6)ZgG^>==(6@I>thxeaJ{n3ryBm! z(-hY&{ovk_js@D3NO^k*)Vr}(Vw|<|g62h0R+%C)E1l*M%OSMUEhqd=xpeX0QveXG zgsLPAD1i|!R`|{QB&e%EtScA5N;^xwRQoO66hu0o=3*SN+DR=8ag56S`!F3C5y(S3 zcS+`3?4WbsyVof@j?y!Y5gMq*(Pzp~N#06qaZ5t54W-)b% zV`Vh-*)eHkc0%`Nu$~*$x8+Jg__9&f={oP!PA+=pjbh?$GrLNW5&dKaXrvVI7zr6Z z@L`u6Iz)jL2yFqlf(AIMGX7i>mC**|W*>L@wJ-*;d1(+%Qqq|BH?vmIE}-K~Ag_F6 z0cTBwk3+nh6Uw?sllB_%?Rva1&zIZoVCni9dqy6D6i>6zWO*we-zB7ogEt08Y7vy4 zBlY~~G8B-d!y+Vw?}-=$*;5^s10k{jrQZcwtCe3nT7_>T+jClfns9g=s{#rxc7+|@ z0x^-oO2|oy|0I7${IwBdmus5ohs_G)J?EluFyaYi{D=&Ai|*8vW`ODOdb3?wtOeDH z#MV)58nCG+{flhzj72cm=Ey>*i>`xSqzsHFVx-MFEE@jMRm^* z_qQ$Y$k=63eA1MXIRN5JZO0Vqc3+GU0#U)MWfY+0#=84DH+x2PFIAkLLtx+cf_@*= z_K%ZcbF@N0rR^P8y)I89zYz=z%^S?cttv zJ*<7xL-@mYRp@mNgI&$xd=5KmfDGU(RpJtI1g8p4dYVu3|6usRAoF3F6}z`g#*5Ke zPB{{nsb~sF1~ohx>>U6sHWHxZWr-JF50Um>2?RzR-8=tv5}8F1r}fQ|{8M;vuh84a zRfs5=ei$SKfv#i~yo4ILZ*<;#q{S8OMl{8H*riZ(Zz|;((mIW~-|I zs!WK(**W-s<)6mlP+GxCa7xiwf#7}XvP@GA3x_q$<}@E(Nc!$TOo&M))=&u7?VsIt zuJ{8$AW;s+aYmkM8U)D@h&cNge9>nvQ04G zkwly)cFty;s|0v)>f(FAnhtn|)IMlwbzKyt)BZdH({DQ(cu;9W2vw>sfAzubr^?TJ z6OK28{^Kb9l0Cc`B;N(`c71?$4>Z+fSlVq8c21QOUxeCy`~Ff2MR%D0M2$cracPcX zq^UaxPDtg>*YOA&@sFIdwrLDNAF8>-_XY$v=@3EMHZN!~EN)Nm>M>IEY}Y`#RDd4% zUzf+BJ58NSrMv4JR(IMl#j}-}GBaDM2^;Cws&JYednjPU?c~Q2QncaP`Q@j6>Qc?|`QejN|rP*t?eJFw{2YhOj|0F8dJdKyD`FfUQ zz(fow*mwoFy)s2YUk~B>t4aULy&)B(zsMctoSn1!@Tr$9#0i&>@}MTac1j%|-RU@A znX6w-fgNJxuJFX{5CUV{&L5jb3>q@g$d0unNm6|=>K?7X1+)FN^qj1xvS6LF@Pppd z!;VI$C}n~i2N51vqoq|S?D~L0BSyc6nUSk4kaps05gf2D)8j&3D8A>ZHd!)& z>Np_^`!6Ay{k!+tkT-{+UUSxze^9@1Px011B4HWuw>U2np)fVq2mW44zq6RN5<{ps zD^by;@@ujV%=MsMCUaY~Zev?hJuC=9#B~iLZDY``R8_?eoB1&t*Dsn1;gji$xEFx> z-pU&93D}+NE1`E7!b})Un&UjabP_bk|OV3M?5Io-!q&*UVSiUJVJe*ck(vU_&H@5a1M(EB-|FW#8L{ zILi>{ax6iAG>u0)G@$GX-y-dUM$>r=%KuUOLidG4zzl>oitRsLuPI`eLbKQP863BV zu@gz#*Ys2U3Z>|b)Xzq^-5WD4D`{LSw;bsn;+New%h|;?H4XY_#FFvtFC$jZ%LV+L zD!D-qkmFEtt4}#PU*k&~GIVo(6jQ#wVP)yg{OWrk-=+_G*rKBpyk5bt&|daN?B;y= z*gZqS)oFfG|1nuV{1hSoMb}5{Y6tWJoilTe#MZ%7W%$)^9eaz@wpFvh*`y&&aJGKM z)@OpJctEO&9&$w^f!6?frKcdQfaL-h!?O1T7(c(%#lty^{f3C2T>ZkgUEp#w)73fe5pb`a5X8BWr0$msE1b6G$0U7iA&PChyw|ImW#Mk{_P70(@Kv}Ke02VV zmNd4w^gpl}iRS*SFNctX9lX4jEDUl+f0l?Q#^|I{j&yEMFkgU<3zpa;PTdhnpnOIE zdO+PV0DLP=$>uUBqClC;*}EB#b`0|>LMoEa&K&6fFc2&%ih;LzG09vDQ<=NNm@6U6 ztBH7^@*y!25{inLSQ{sf;dD7>#VK9*zS=Dd9LG0vnHEi7WoGa<<#K;~gs|DJF5&Gc z{5uagbR4%Zy?t>d&lJ=JKv6&x%FF{qkgr7#B99u)0yr=Zy9!I!$VyMBdD>(9=^#+? zkT@8%-i`@jCgjp!1knjG*|4WT3iby;pBo)=kMRjdA4fbzyGlIb$K~&se0n)|j9b5U5uCgWHh$qJ~_ok$F%z^W5 zb9*V6|3`69uNH|HS5cS-L^pxJ58ME5Sj5x-g616Dse3t>>Y4fin*(m*ZlcQfy0#x_ zEw#FNzbR$^zvtU|Z7R$qAb@0f#Gq9!wNx(%OIfyskQ$XZ<_XmZr!Y?@$(=Vzm`F5;R}> z@r{YMgT|;Mz*zQ_Lcy}wr;mT#aGf*$6EA0#UFMPSHlnCi&?$0@v=B4;0VwHQ0aDDa z0VCvNX6tiAr8c@q+Tt&Skew^KYL}Tw2F~r&;V?@Jk6ycC?N;9Csy8+DPLXv@y~@62 z!ToiKVziTr{?qB4 zt|)2fMIvp(eUG}kxevZ8GL>|}`M5a7ctj1Jtmj2}fQojJSJ1iI3lgTjPb{qsqZhkk z73}E^jmSWf_DyWCm3I%cAMSvSeyv7pKdmc-Re17a}PO4COy!OEgsqsx1H@bIbw1dGOeKn-yhfK7;$x8`rufB07n zu*$#v#Ov0$0<6Hm6=@{G>`AJ@Jd^_f6Yk8aSQmvlR$$X-MsiCR+3)D-3>T;1U_OCO zR;oa5cG9i+uMs=6sGAEPt^XaYdaX_?rR5!_tu_1@kx><|J%6GdIzf)ZVy;53(4ICy z1KHoqq8?P>?XLQ%ob317V7@p$4a$ilWmzs#G@j%!$?@#-v8-TfR(>O8L(is=WIQ=lKK>$c4rWbl7% zflR!wZG@q*6{+?@EgfmU3gH@#<0cJaeO|D$^Z9MYdeN%DDO5qEeDYcMyr?xv@ zvpCUH^)=eTY0Gp+P`@Jbf;sO-NP9lEU3KcG@{K82#L!b}+(Lz8#gqW2gV@^@UzQxq z##0>Kr;BJuGIwWcnIahy>n2f*+CnEB`dlvx6##CaOlw%1G1c9_OkFExUA1{a*P#&5 zq#rGBka}`&Cvz`euPSHDE^wGaFX8iKY}sG|DE6gcVG|`#aIV7ipfVv z<R%>NcxZLP~wQF;XbZ(t}9^_7R~&(a&Hgho7nl8xD8#;+N5<` zm)46$r8p|j`=dO$zFuhgm=lf@Ke-(ry3?aUj^!TE*z3#G5#tDt>1s zL}9IErVtHpcSTI=$;GKVE$mpdK$UHxe6>a5$4Pt6i7KC8n5hC)ee0TA<6ka&JEM2< zP{W}Fhq`>T#L5fTlpbwfjIS|;iY0m__}0|w@h8oIkkrOm4 zP7cUOr9m{@ICv>c>Bh{(TKKr<60FTn=YZt+e25x{u$PWoL#4m_Xn_4y{tl|*V zlTVJ${#jZlkPEkyDC3B~=-=`_BKvGz*=W&YUhJOv1c0gAssht^55pDkvCJ$u$a)%| ze22m^>R`)$m-ItDJJLEX+d--3#S_D=1@{H45PujAyRDFtXXmmo$zET|A0f9z0Vb?+ z!CAsJQ1h4;zg&3y7y?4*@gyh6LWlBeVr=GTXh9#V%^W^(`(G;=l#mgk!25fj(rfa9 zG@B)!B<%VwyN>2{bau1-2@jKXMZ^pV$0b$brP%SEw8a#nflvk8s>TF>=uO)HxZPb4S(Qk95Rv*Eo<@<@!b~NyU4Icl9XYdJA>_?cJw>;K^ zvN$kFKDNh(>LDzI{Met5iE>Bsv&s&(uQYKGX#=o@K8$RA1P_q$BjzFW2xqO`9_hpG zN}9DAHhrzS*$;`Hk)1myvSAyD3mpFec1X@r3Ih%{psaVoZ+7*FT&~zN5Z|$htgP7` zG+n*aMR<54akPf9*vPc80!QkeX#PT)?oZ<_DT5T}DKA zULyG{err21vNUaf5$!SZhv)rv008vX3jt3!%CN7Fwj-X&8weQiZ-iDwuEr5%CtIz7`jTCVYP$F5z0+4GTgOu;B72F=%3lcDmOU`t%Ml~$ z2O$^XT7;1}rBBpyMmdguC>^1yP@w!KrmTEn6~ALGNRNyb4RTJ1CDF36864=e_LEGEUd|L?>T-j z@wXBLhtqKcMFfpJ4fV@pF%UYWeS0ad0FQy8kcBIZUTIsqPSv_;DCSLpY8(9j7KrS{ zLHzH00_~O=@+R^x#l7Ky!JIQVI}g{Nqa+|fRm2hcjn+mIbDr(3G0?SOum_~Oh#RER zUb}iaZ6ZuHZ5cHL2x%GM-CtUiwwM61UV@vZE}!pH2yxRD(j6lf8`X$&cL6<7&g|`+ zf(Dc3sQZ8tA39!iEsEea^HUT1)z|+ znCmuOx`%-mB5=FBej;!gsB5Nc!NXn|OFg;2M)WCwAVsb2a0ndyCbg=Q+SJ|Jx2LX2 zoTpRS(JNq0O=6QI-yOe3+Ki~rz(+;NQLzp>Mud)0zlNh8F4~kSQPVH&)6y4JP+!K` zmP*N3n$+zXyvfyo=(p%)eIZDH+QV%+|G22V{U?u42$P6PrM^fexDZX&)m1CJ4tvOr z4tXVSa^@Tr0F~S9;6kR2PUWKEk9MPXq~sa)+1Gz!=p0?zy^0`fGcKkqJI*1^U7hL) zUOTk@69r`3lYDJS>bZY}U;v~jN@%)HW*fESTC7l+;<~FS0Xr@^=Olojfxu_o(wCF% zO#|NCFgz9!hIPbV4Ke6?u+R*sj~&(*B4UaeBjPPP1C9OSC5>+KE7stfjbm;Xt*yLO zNKUU*{>-E6?}XFhbQW{!*^DZIXn-ljIzuJzEj(Sc z2!&gQp^O%-N9Mp+72F~6W|d96zuwsFzV$Xbs+5ZsW$xeRcKSGA87(-SHQ_&^Y3ejK zWL!sTqPQ%tCr_ zoE5rwfTz@EY)lV#NcKjYERRZKD~C|9@FYpQI1&80R7g?IJ6GyONRK`-`sPRG#@9f| zWY+ipK{L*nkssI}#k8H|!n#r;F9c@cP+KNTuG-X?<;U?Po1}nvO8%VTt!+VgF-TV1_hN5Ci zL0hb^Dt7y@=FW2jr)|yxIT1v4Ew#wF+&UP|j8h)ozPStBf^TwpX z_N7rRbwU9$n)rd%7N9`=Ghpzgolu_Q@R$tmd{PeL0-F5UmH6A?hN$RDy!%+FAQGL& zBv9wXN?$z#O=}_x0$?m>%Al#!zP(S;oA!(Z#!0s}Aq0KUm5>i$-)0;eHT3jIhg$X@ z%Ln^rziXbJZx{6ms8H=(C7$FthUo#qS(RT(mG7e3Jv}hTq{O_Xy|p zJ_S|YKM#eqFFxAuBPPhl9eAR|r+pkF$tF#@$)P3S zS|^iv=XI=yi8qEbo&pbpwr0~jpIk2NZEA%FD|ugghh&! zEZ#LaQTC;*Qp4cUgvtj{U$LL?@)nZUP(YP8104oGW$tSH|JCCq z3Ki~5HYLa7lAy!G>db%xdI8qXv)pGb05rjz zxA<5zL%=ye8|dzko&2r=a~O{tn-$ZoU-fKs-B*dlpUW-&f?1Zs8y3HhZoCn9D?gOC zC&>J6R!-+cA^nTBS&Yb<%&|rnAG6c$fRkUC#5{wVBOu`j$wnS!5cUxnU#3L3#O+9!UZn^BG`l|r)2WO6r}XhN4azS zpplI41ayz74CRL?_dN#UUZBvt60*_ktqcaPBhIXls< zQRJ3dD8sv$eO1k)?IP9`B!Lbn*9$m0icmn98M(n?IZ)Z}ATwz%Xty#_i*B^BZ};i$ zz3G*@cPh|J+_u$gv1cr+j}w?WS50y*F$>6JRhEz*=ys9bN}tf0idkKD_E6hKsny_6 zq?!MJoOTtQSB07kixxz5()>+l_;9|HIuEOZDm6WAs42HOVCVoj1(p0zCl)a#Va z90_IeqrRi1kA??zF9c5tyKuExi}|{H5|lNRYK_ZgQ#WO5eIIr!++5~lpJ7JWE3QKlVx%>4L0}HQ*72W+|GVcDJ{m?hv-yHX#}C#)BEvO0Q^}Mtkx>&! zIb?NWOo35Ve^4YiI@>&!Lp4+ZF+6#t0-d5O&kyH)ik*g(z}a&}N5xy>2cn7+Cwqo* z3}2rbDDN*8G3a3>Khko-Zdp-04Q161t)sy>P9a;u9ot?AbsD)#a@Y{p@LOsd^|sQf z>ak?sYd;v*81@#^XkPS)y2wYw8uCLO(YqvUoapFxR}V~zv%;9!hX8*m5diz8+lGB9 ztNWX_mW5{$Kd@ddMMQczr$`Ih-%wEhN(Ai>X;=pr0V2!Zw~;c1-%-O!7yPYVK;E#3 z!=xDw$YNodcNsVbS3ufNuI*EXou+vCz7%_fgp4?yZbmgtWTfkHPJth>dh`{**{!!V z#)El;q;-e8bYa9{NSwQ!UEszyOjiuX=y7y}ezZQ2#}MUI6qUTmV_E9tFt7`4KR=*>%oCCDVi3Tnob z_{viP{ecs};)4j7Ma>77$z^r2j2fn3nJwd;P^rd6mOe5>`n{10Ivm^FBCaPm>_~Hi zPgvc$e9usX%}@PiqF|XThnk}z?Ve)P6&qT^A!T6*GJt(TcnizK0N${$6ZJuaJ=6~3 z-(G6797mA=92gZ`f3a0fS;0GQhNE#I)q19{sY&m*$CIF_mz+CaHJjEcDhLPW1r#hj zp@dqF6UmeFr%-220c~I3N0tVwo~xtn+(aW^hzm6j zVzMfzm#_4wE{Iy4b2VO^GZ0v-sFyE+k`>^smL2>b$IJ|!;+0Ad zIuv?x3B%Go4x};+Xp2W3Fm7gZ5!j;P4;009RlmtbM}*i=*N1G0=c^WA2p|a`%5*-0 zJ3`G8ePTgFm~B#5JQHA*YM$iSv%JDO{kdw=G~XII?RBJ}D8aKeOOHVAYrYJge}fDv z*03RB1?g@Z=I7ja{`33|?e;GH;G6V!CUA;8)8U~N zuC~`AfzoH1P%lQHu)s(gIa))1=+9czSjy@CcDQYyu1~%vaO`iDJcJS8kr}1#Y#qE{ zoB+KhVp|n8g|}f&P6UrhH!CePh|LkXtNZ!$6ul(Lt!Lxzl8=?`8--}cgQ8BBuo1cM zjK(2h|65j-ly&9kLvibDbH0-->hn%BBgpGFR8PwWtOEAh_SY;KmD9yuk!@J zR_j-^jU~arvW$KR{kh=J4lzWODPbSi$-d-OgKwKfn+wfx&rhZyn?N$mJj7L zSt;UigtX1+Y~!i-w|U`@9<@}^N%6`@5$}d0Pfx+$kt~)!?Nh@N*k^R8Qs%HLP~9*H z@xcn?^cETcl#a8Hcs@r05cL(!@BlP9`*;hQd8ry&AcVcc&oJ5tw(A=9G}kG)WnAN! z5|Yl;B!k_bdngpxOlLGY9?drT2=*ijubY!$bDV&=GWVtdfpoQuf$87suNp1UdP+_; z^O&ZHgneVCm4<31Dy7uYvLOR%EL$F|3YVZxq+6nQ(2+drL0_cuKR%qz7=9B1cvtv) z3IX%uB9JmDP;-;vxZ=rqt5BJCPEG_}Dx2k`@$KdEsFVVkJG{NSfdbx|!Zn$;6)RcK z51{yJ30di(H1?;mi$AoC*}qS5*)U0W2$Ye zy8{9%{rTPjyAHeUJIo+_-YD%}gSppq&@U;YJjUf4qX>)9YkKC~nqLs*2 zR@WNvzI82m^K-}rrzB%?aTrZTAsIs!m(&3)`d&mfG{`hl5ae@cCe55^))T7}`fs5u zC%X0NRSLFIg0Z7F(Ha4&ZQcW?i*k{DZh=*9;SchY#OFX|w8O8!Z z&Zqu4v|Ow8HmX3nsi8{USU)3)iUr96P*>LWg5OrLo*^4#+Ch5$7~>d{iODYdQMIv` zv0tf-Ffr>`r%*_b#NAY05z^Q_SR7xlH0C1tEY1xCp%F6z3?>#(;9N|{E)*pUp#JvO zZ;g-!M*yis0!v@yN&^r*x$($Ta__1Y&nfwD4uw9w4WH>Wh%3`poBBF(Wnu>!J` zvxkL(uY9Jt#95nnuYcJXdflwlM%Sx46@8$RBGLQLGY{zPV>?9;#qZr$Dj&J)%l?^J zINz47iXodgt{xd-Zw{#NLnjhlUEB(W}3y`=D3 zqlP2WyqsYbKpT|{dLOa1k5mPoBpd47=J4V%4{Rk!r6DVU$dVCo1(LvA0iRch3xPaa z>~!3wpl#OM83@n>k)A&W`Hn4tstb1ClSiMeKM{)ADU!V1sb5>yM?k1)qcns;@XFjLIy&qnJLs8!h-8HyQ_Sk(u%anblC8+BDe* zYYrYKxUhfZ4Zunn@>v+^#%OHtH`q4>pB(i@3%~||H!@K_MtfbNyUX>-#abGr*i6Ot32uU;zR3Y3Ha}jQs))~k$G!+v&RXunD%BbXn>tL$rh{bAeuCL7vr%OlG)&MB z56gHfMtE4W&V)dbs!L-KjOY-d{tTP_S;HTzX6K$IwXJ}>j`Z_x>xo3lnuF31 ztMdh9f0A&wAOsV^-aWk-=+X1E+`)DfgXr`a;~^q(g}z=oX{~KGRTtskH-$-=*A-X0 z|NiGthxJ-W8d+(Tn_hWjE$LlkfBTrOqx++XsbQ=M5je!THV4A_1yMKTdr>pX@Ln|n zw%imd@@@jQG~s9J1`G~UOP%N2+69zOSBWC*r`XFAOZ3u_24Y|O2eE~s^|Sb3B<6# z8BH8A)b^6+$bG0sYXgg!yw?2%1?%vpNtgC_(HQg2eFPh=91)VZ&jwH}mWW?*1jW3N z28RcQ5fiNlcOVM>e|MWDkoJy;&<+o+zQk3usmk}(**Tz^RpR(W{>c4aqO;ITW^!&C z%GNgQ^Z4)CS@hB_mV>3l`qfTsV^t3ftHJS3OTB~?(YzuWP~+Yu33)wy6O{*+>&Q*m z_N=~T;PS-L9$wtf2yi(#;ne5iJ@()dsPGt=?0nrrgBnTVwq9(lF9u#7 zEhXp!6k8-5E^XikQM%-)@l~|Bxh}hW5ZU;>W0sR+R%I&6&bL%{`weuwj;>%ynuGpL zYaZ=KO=k?k7S~H<8CJd$#Xt{2L`MCsqhU*wPi;NpW7g3zq401O>4&F;-)wE#dcbl- zZo}Xng<*BJKH6Xv0MR0{LgnhBW$rqiS7mO82GLcQxg9+`_n9Jyg9-n*-Lh_Os)CT( zA$}`?K!}kWmf*4#xs+XkIaN;gngsQe&r~;P??fRbZJfDAwv|Lh)}`Va8%Y%_&~xwg zJz!+BHW}s4wj7-4f8ph#mU_$2j}bi0di0pVskZ5=D5Yh0CEipPx0#-&eX$@>=Bccf zi?a4gcBy%AsfJKjyT96Epv*PHj1<4ySBdgjtNrVnLsA%1ycdXGNtj)}VDFg1X%%H} zUBWCW@$Td8nbdf@6^zh67Q`p_crRC=8K4mCkKMItRPvY9l}Z&&SjWQCN!f}v%Txye z$_m<{836r=rn%wn-NA_ZpC+wvH;;=%ddXu1{?yMnkiOINd^a3c>in-TzRBn2(~U8T z2V6HHF>{i2mYeNCe8l60i99*pl2DM5RbQ9GtE)4OqC{KBw7VX7{Z(JaOYas4N^fzi zzST`#s4RNS#>`%bGB!6}s`Xa8|polQF_41L0_{l?cy z&RW1soA*!t$*c5$V?v9mlivGdz<%jeV zF)Dxo()Gf2J$tg2_^D@Dp}`-X?rLwywXAc!bae|SH#C@l%#wsG&ABKz(e8pjLS(l8 zTL+;PP6pr;Y9eQ4^1_W)`2e0Uxg98tmW|v{L6m}uu(WPA^)fP=bJ#{61MM)ee!dAL z;}hi={D3R|?0PQ+?n8=_-xWAM3h%xEgTyfruT!2|{~=KbCDTO1G17 zO`Q%CwY<>FRt-vZnPAQ(yG9Q;VsrE0F`150H$=EQ^&v@C%YeRo{E^?^d)dTFV+#m< z)${DZqi6=tqMfojt(Ave&jQX|dhI;%lsI{dpZI?5m56iv}zRuK*W(B(&g;S-f*WSZ+upTtF=r3Oy3MIFlI03ZNse4{ht;kh2N# zd#1sVJFxj4^uR$5kwnO>dl;OsAI~M@;Ite=o`Fzt$adIGt4Y~7*|MYF_xx*ZZyqL= zFXoAy5^j|D-GMBg)F(IAU2B^9G;DpcJ4~gl98KH=aKMz~gg(*f)I{be3>U587nbx}DKNqIkq!4?}5`VLpXM&7Vl;{ji z>G1d{GFfUd8jo&&W*X|^a5=FTr-2^FW?yQUA47=Aid$1xc1E=OO}izw_`B*hMcfvm zaYEeP0c;O{sR?%E9aD3cE4`O=%lc%!+kS75-9wm;NgR1Q7lG()PP(#tByU zPmg1hijtyi^;nsTBJKgIpNo=(t|0SjstpR(Xm2q5kDQE@;Pvp57UC zx+iO!M5GW!UxO@)*_)Yoe&rX{-p}#*#nnAGoAyN3L_1cBsJJ*wc=urbB#l`?&J7-= z-ljg-^Wo+DF_ofPdmYrZHt-SHM6Wk{60+OuvCZ-KE!EX>NN%xu#a;S@Rs*S#k`!Brz2hZlpQCM1? z7O4t&iJP)sl5kD~)?_P0*LnwKhIT*MM`0I%0HmZ9$eTeN*J)zD9@erna>ySsXrQa|$1Y!ZIB1Q! zO2{U%y3ZI+#ix@N%<2t3gD>NoiUl9TcQQ~g_I8=qRQ_(feuciO9$|abFV`}XK+$oG zTLPj>8?|wM-dv+>EoyiGwmI4IBmg^+qc;Dk>T%XlG3GIJGK?prLRY~7`=k7sH)N6| z1G6!541j%Y+?bF3vFI24EJhfH$0u!L0HC;XAj4D9N~qk8B` zQVVXei>)cC5G>r*cK`tO(rA&%Z%^i-e!8DB&}xBQm_dt~UJ(C9+K~P$O#tblZ`!=b z!TCIDl>1DI%rF^d{^)#1`$F-;fys+=f-|DfgX|t^0V3|Fl;#1Ql2%_{TGyMP$~OG- zb;1@p_bRuRa#Th#7q_q?_}fI+)_#@xHf0_XwI5X&e?@OPj_s?9+{@r zDtlCr1Zo2jwQ#)9*o08%noz*5Z$;-k1}p^#jkIxMdwc2-Ba!2ny>` ztrd;-(aD`Zl0k54K|kdPcJe~)z9d{ZI5AccWmmY1gbm@J)k7n9?gl924LEf7saHuerS7#4TeU~>@);(}vR9PdF#Ggd+wM9!4;^BLe4zrWU;+)11cw`TRx|A8%94-zei9LWB)bkdAt74CcbBz0{Y>UGe&FXdDc(Y#*4CrTEST zk0B8>*1TL#j+EI$%d27**k>->6C_@y$ARmS-SL8ric?e=4uwo#0popg0-3w}G5C~> zbX;3&2!7DOtf-vqgVJ7p@^A*1H$;tGa(B|v14AQ>Ba`kANGOrv<4vlo zQW*5jNRCy5BRHy9GnIE+KhEKz7q$ieTUJ%!5r;1`?GLdLZQZ}@1&wHiNfxN57m*^i zE#*9Xts49nNWbJDL*3}q4w<(02CO#l_Yo$ogBgp!ldy0btjrbLMrWtnJu<)_*IEP2 zOT^rV(9tbBo|}!{u{gL$|1-!;dC7lVm#Xu<0X|776E*5wfU3bV*bt+4tIoa6k7UAP zxs2&NDpy8ck3ntb?(DJ@cdybR)W0fp7eKmc3YN3&r*vNX`gyWzhMeCGBN2IqY!UMY z@XlZT9QG%4FLwv_KfQH8WhSXQhpo%;4L7Vn? znlu{QB6ni#7wsMibf#grx5jfI(G=dLq#uY&Vy1b(LYI~k4?eQ1C6>e|+4vD#1+MeM zvNz}@l+_z^Iob>r93T2_*MJuxs$FFw=fOY+1rq~Y)#-*}sr_Lp0y1B6Lxq_bm(Yl| zRz-uE>nmhnd;X93vt-nCw??GXK4u*XSnoky%dcN3FQuM;EFnQjs2FQ%Sj`dqF^#Lm zi`LhN#Q>%i#4j`|Rw+*X%2OqViob(Jxj6oSJs*(j%lrsw}InfxGZbThhw`l;N?Mt+RlyGChu z36_aDotoC?JLUqN1}PD44#?@A6VjeM{vRk>=|zrAg!Xd_X$S~X%5>dCr&&RBlo zT0d3NAthOtYzgCBMO*7AZ>l`x+o~yn2pu%DMy_I-od45>ok_%XvTbhssGHfL3uN%aJe=V;C7;moY3T`qdQgWOj%*&} zS|F!PdUURV-ik zIxnGDa$&w(n;o<)mZ$SA{Rh`q4_OCdCeijN^-Z)jX z3zafC^|I!^(e3)%ngBma)deUF4On6~gN-4fmgj`2B%XsGV}^K7rlj#gK#N(`Rp2m& z(^{JP9bmFdK**i;RT<847{pDl`@$4Blq*FsA)#31ywMGp55%Jiyu{GwgscuR%M1N_ z4B8)ynxB0z8wZ}?^1+*!k6VCK+6d639KhBG$0S*bHhae7w6>W^3!D}*2>lZ6ewmqh zx%QD)d|J#et|TX=I7zOP@rqHlfbLIphIsc%ICb+D>vLA6my1Ex zTMK^vhisQz!#Eno%6ny_jIv!pEpVRv)9fZu2c>FWvKr_~15}<~m}h~N2;SkHcCvt= zgFiF(>X{mNJO}Hqk2CD~KGtd~h98gcn>#3EqdLFNUpf)Qhz>JFiWiixb3UQw zil^xMs%_L8fVYJ16d)&jtFVqihw%-4|BcR5quR1jX;D9Yyh2!g!7< zCrDQDnDO9j`+8-y#Rczo_Z%{imnGAYSx`>$Ma&cGCt1A@7U^CV0H47v?5m}-Vu>LiZ31L*ftm}WW8=PR$T(_^AyV`D!Q@{)dGqY;p zldS#_uqQ6TYU2osrdMm~QDhHOUE1Oq!RoHXcyDp0vRAC1X(Bnc4#AMYm?Jiui+yVT z@@yvTeB5`m#je<5md}?m4Kt*nJPMmk`idxLtwYyeFcxC(krjeeiSPmk;CwHWF)f+<#JrVPViZew-b%+btEAFW>BzWeG0b6ar_x)Lt~ zb;(D?@QA#wG2h*EJVOnxqkzFW-_ZQ?JQn%Wh@XQY%l@=q&`w$hSvf|A1M&Bhfvn3)^n$z~o$E7>= z!(S3T|LxP`1R_N{_Mu~r|E$>Y_GcboXFRcbQD*b({l?v_wT?6CNc$KhI^5r|@NW#I zc1T4s@if3%mgkK6UP}+8!VvQ0@Sp8GN3>T3JO(0_i$v+0BgquNE_SrvF#LQu9X(2Y)n^rr9>XJD=`XJg&DG z^DLH!LIz(DYFZO6vf53Oj8oAZAsF`6mrB7xXT68;-`8QY+oB(_?@6%W@t!Y0yIy`u zH=G$&%OLB%Pm@lGDEN}tY4Pk9>bw)t_r}%tbD%>;UMF; zsDhO~cH-eTvm~IK%Xn+$2q(){{r!=|dLisJoANZVJ$c>@q;Yr)aCcvq|M&J}-s z*Ypa~HtmB!BNYqAxxO9E^MK$1KHPmB1Ym*k1kUxTUKXgxN1_kj#eslXj-sk(#l}zQ zSeo29e^p0ZNMe%(ef|z;iMX`?%z1qGHRZbm&$jcx>`&_FKTIaN>ENtYfOH(Y5WDZ; zR*J0|OY1IBv0Cm)Nv%E-EH?B)3YY=(nWDXqvuwD=`I~BFdEH}OPit`s8LN8F2+*Mi z#Zx&Hq~7Le$gPWG`Hvgl@~OV7dLdBbr#5?p(9s3Ug~h!P8{XEV9j04_%EkYGvcNmD zx!0=w@!rl)4moz@JOT8jfSIN!X9@gi^j~MlV{)r%1kS)JVoyER+xlTDB=ZpmL@DF5wrp9{V7^$U0~2Lq6UD zXmY^3dOrwoj-%GnD^T$T{cSszyXNCUKUR`bQ8nZ$B8PHdfiUbJQ<~uN4!MB#FJ%V> z{$_vfaSh6zhfa*l`Fg>!hA@{s)+jpUS207nsJ)8~6s60Qe?H<6d1=0{0Gti6~Wpiq$FV{}C~M9tgFxz||QL zRWbF9*A|!Uj{#&@x$mi>u0*8Z^-z$EwQ-{ai}!y!m*th61`H$TPpF6~5hpQSUXVND zep`ICgfKa4AASq#p@UIdwNk+|-}PS>D-@p8d5p=DYrW4Ftj(rkD_h~cB}^km=;5$n zv<7}&`S1ibg)I*Mt%g%!UOMrrZHdCm<4GN@L#~UPBFX{6ZF|Rwp)iLaMw3AOs73== z0vN@YsRKB>Yr~mzK*t1Cfll$owYz?Y11k}VfaBO@yuqQjJEk98K;7>9mmq-}Ru)xO zTmCs!Z5-rV88pR1_^Au6d%2MJvpdjV6=*C`sCKq$o817f$B-Fjkje#knB&Yh6siwU z1z;>Y@o*?!V6k*5aPYIxFYIzUtEg4t*6Z%SxP*js-!=GwXD_IpEqm9ZJ z=q*^ha_@KDv>aNr$PY7%MTkWa7IZUt zh$L1u2meN%`TrAgJG@WXt-6grGpDcoEt5gxW`an-dpLcC7#kqR!l~=l{jcElNIunt zfstUZH-Fm(JZ89LHoJq;JSpH+-r$i)p{UJ}TA{0^6hkM=Bv-$rMubtQqxCSsV#W_h z@RF&}gs@BCRMr8B0-*%WP~!UyK?@_>*rII~|&KB%%P_qP}n z!Ka4Yz_Q*I^)Pe+hrw>DPeLf41rW}lqPFV<<{i@*w%YiP^vjb!F^vlvxig)R5>_n- zN0q>kD-eAZY%&%4zvJ=X#F^9}WV==4Xn`d1tMh!2JU;QPiAKC$W*8%a4Wb!YRIXKGAXR4{i(6%CKYf)_~$W z3Z>JP^1EmzVwl2ya-M`2EFvT9l^Amgai@&zw&CHoX>7AroiGMpGJMg6a_k#^KqM(1 zxoqLh4Ux;~kq}lM6M~V8tE()hQ?>~dUen%);CvRBq47Sp01hY4TeZERZ|gg3U#kQE z5p>6MTCMo}-S*}+Iz8yXO}Dk8WN*=DQJ}RrO#t}WaSaw6fXUm$n2K_YB3KSU?>n#O zR`BLv$MMh14mx$V!HrPptrDy!gs6(kCG|#7U z6Aq(aru(=8;)cc}nR);T{>RI{4HOl)RKjGyHh}W4Y zaWeL-9ay|2w#NLQt06he;O+w!{H*X0^v^ETpDU9ec{*kQIy^b@k9M0TJ)Zpz=}J4@ zur4o#4u4`=FdFzPVr?PGSQk4@q}7lP0Bfqr zQZmjsuxC;nzB>8R8@!Q21<(g71}#~6Op?bf$s>9(*AO-tNM=li_do?l(@`p~vQQCX z)m`$JZ#H_f=s;a@0j8OGZ!^bjX_iV^7+vi&yBupCZ3;-uXOB^vyA}T_^md)-snrHe zhUbn1*ohM!dDPT}hOSVUP|y7no`WBUbwrc5LDu=WKhTnVcJ3_X*odhDH6j|Wkskoi z?=OoD(F}2(9hU0?EB3f38$E@>2d)BX(1J>@Cq1L0=m&j}&qi|!hbHwhy-|Rrd09(p z{M{VC79EaCB@IM=X=eIgN&#!%BNxE@D`NP|X%R%HdSiypF%QEYLKT&96@HfJX9j-} zeCfCtcrti#cE}b}k!T-dIf60}3c6_5LAD_0)!3TRvSQo$5G5^go8&EOAQ9(9;d)t> zTfOtRZHvuGRVVy2hc8YwpM}1$G-5f?TCX(@ePgx(T_CiZCsv*V1pBB7SC_v=zZs;f zVanZhit)Xr8o1?8@@~c){d;&frZ+ulAGF@4@O_8x&=+OE*@`aGC26HjZ#3z!YLsVh z^~q;^iUj68puwJ0st~n^=-shKU+DUHRkHuQP376RiuY|oa?aGVM?>AOxXQ8>u#qY* z>m1@EO8$VHK;%a8MT#zO0Us{KoAxWOtjOup z%c*E~91)^4RV~|{36_Sk@`m41{ZzB%NV!#1h-@~wHBAGduXnpS|6c z^ym1B18&bsubj&p!Ke_MPp#^?#iMl~pB8gGCB2h%varKm+Ju~s)F;<%%+68ghFt2d z9-w%9l{oyjQ%k}MDm`a&0G`foO)Z}0A?-S88_o>I$xluPWm0arm5vuVWixHbVP znNT38(Vo$k5VZj5VuV1*#34e3ckC?_T8Ij7$_X&IS+SvZd%5QvSpC7@hjBgyqk+Mq z%4LKUx)(@RzrcsYC6o6Zb$IIOq2D-u`5*#vz93>i=o@?KbCGK`GdizV$%jiQ&((Q!1x%RI|QJ#BA8&of?xrMz(x5&NT#ns^qMa7 zvd%_s{Z1WU%f3CqQ1JMFW7x#D5N$RFw@?`Gg$_rYYj7L(&8=ynlAlkD7Pgsl$T%v% zOFO1wdqt%u+48vh@%`?D3Cub)*S-3B^02RzC@_J=kXQo+{A`8I=f|9Z0%VbP3L_Zo zG%xsuEqur=6&ng~AIJJB$aC5?sDDOLf@~q%^Y}v!Mq_6{V~1i;=qg|&;$MotlNg_a zTN4_&Sy6;YdM>5Z`=d15hrVYtLec##R?;!)?yZZ3R2DJ4a2S+f9IMSLN}2qs&|14>w2J-!cpzLZF=3s4m!s4_~) zltK^*3|YXOehqgIcLWuuis<&}x}Rqb&f4Ar3<}Q$3Xw9QBoUSby*2sNw_Z_dqZO~X zz*bMan1zQ6X~M^&Lh1gX8D&0HX)h?NT3@$aw0rXtqI)MlhdKcFWZ8bbj%{#sZZL4L zFe7PU*9|A)ZTGbmJf0m+g9Ipzd<^t^S3Jqn40?@o>{oGDy-W;!A)ZrS?hq|R-MR3cIa@yqA>e&>+U=D}RMhVmyIZ`|V5hrh9>JZJ81bFtJ35eN=#%G}rVRKJi@9hGKzaHB{sf*` z_3JO^(6Z+SJbVO}1fR>e99)wMi5cOk3iRyY8=5+vo!%gmoErpB&oLLC?xy>o4pQu- zt&<)d@H;&%LV4c&+*MP~E<(EOO>wI!*So+s3S!51aL(PF8*b_zlJhr!%AqN~SXgup zTdTU9f?x`+zZJA9FjJIk<>i$=udRRmQtnbhwzt9&>ml-MgaGnrEiFCd=E$SQAMsh@ zBrf^*{a~En5I<*3gv5ZvYeH$;cEs7`V8%UI9xT&28<2SM!zvwzB0DWs!;2nO=BG@= z=^2bwefkwe4_eEAi`tw~gCj%-?&(~v9zl~`LLmEL!;$ygdk}+Y9hwHrjAy&{BjB*b z+PTY_ot|lwWJSA{-X(l~#tUi*(&agI69Q4!8-CTX#si^Wuf?_xovAic^^-{jTvG9< z+8Sn)>qB5EmioHoCvv z<;jCu#mr>eU#t}4SfA?f)01M}V6%1r&ekvP^cQjzl-Ac~Lnx4ifL_=ksk$cH)#`|Rt2aZ4VejZ^`R2&+4?n2RR1{nB*9 zpKCV_1y^|@)ZF~5F{FiX{2R+o;;BG|X4?O?(EsAfNon8ZJ*WPh%h2A?W#%j-n*X8K zwvK?5-#$L$#%u5Q=?RrZlN%)+?Se3FWs#KW)y?*%x@#B`IvPb z#m^Aw=Shp$oppX&XGb1|J|HSHKW%=F`&ns`{t{tWy&+8!e8{xAlL`d};zUvZ@PWEd z)vMdH!ZNm3lEErQh1)p4G6snX8YiYc(Z&{c7U!>s{a9L=5Hb zXaQo=&ExINVg0qLLmzz~$&Ml~L+W4FQ66v zA;#L(d2{N_gPdXz?{1{&trZcmkpvrFWc*sA!n!)*9J^csmTrpYd!!^J-V1 zjWm>bwu@z`%-<#FiPKpcwg~!G0%m_dV=DK!2UHiD%?P+%Ch5!1**B&)V)JHz5B(OO z%tLEZJj@#30g5DzAp0t$^(<=-e&0f7mnLCcaSghn~%H( zvJVC$2OmO{XTO-8g5t9i8I9|u(et(Kv?Y0S>pjox#Vc5d@2{ z9_B+wrv<7*0?`Y8`OLhkv1oT!>kreMy`XKJfU{tE9R-$%>BxgDow&9cKRdkY*@1GA zQ%JM!Gm;2q1&t*OW{s^N?S+{+=T1v=iv>guLqa!2jOh%rI3vh%z~0jwtKoF8xVS)g zXjK8VTUoX#q$MuEiYuNx5CEY#I6GB|>7LB9r6#{uXNNn8I6(qX7eBhnov1bRuCv`C zy5TYFz8r%%vM7ej1%}8yOhz?*CGI5{clYiEC{CW8ErU#wC!@90k)UX}R; z0|vo^c!z`k|MHHI;$5sA>Vm4t8gQrh4iZ2#`nI6S*M(cWSiBo>8|h%oN9!d8d+Qj1 z4qBpB&~P)b(QuZM?W8?Tf`S(~JCWt3bgjU`10ev`3MsTala5((I0SzEXYx_^I3-0{ z$F*IRZC+rJl62lXCog%EOxYuq$FHzE&IRig!l>w3Myc*=L;UQ$3aw{XV!2|z2ApEy zRT0*m;hp4HF)g6~P`9Z~ouD3sSG zkPgiN4g14)l>9_YsE)ce(ewX?8gyu&!t!GoO(PqOM`{02{=Cc>h6r4!7iHY(71cFH z&sk$d4WIeH{&~xUeUaP$pp7OzfYAfA!`;yL)7qW6KlfjhD9CmFRwZS%ZIresWf*o4 z@m_rja=By4t0m3&|Jq^*xj?*L!lw10gVd^oBMX3y-t4xGVQ(=C@=pCMGn|GTNTb*& zc_$rzLw8mk7R1HEX$#xRDIYJOZpd>C_tYyz>ZzOg%r5Xo2CO`tR6f4?Ed_bfj&0QCR}X7PVwZq5HeXsfYG!RQ zw+PVwY}7Wnwa2TL1@Pn_I{MI>1h>R-3I|$*CNq7Q9AGDh04zu|$q< z8;~mA8C;E@>9n`1LfO_Y7tyaayGEE*i`q-4fhC845(Q5bVh7jOZnf^-`gV5^Gy^jf zXwyl`Wvhx7)gy;FyU$-F)6?lYoSUdA$50 zR+S5gFeo32@LQ*a><`OzDAEFhkIjy}2+M{O^m`OnLJuyV*pI$|ZRdVNda(%tc&cu1#8)m2y;`Yy#jISc5B^*nzs(8ya;R#1??xnxDt4p&6lA3z~;HZF{ z3#B0)#M6p{RKRTEF75Y9cuY+vU9hW8Xf!M^kE`HqZvmw^H_w zK_L`pOJezFeDSG*otqdGkjq4Ep4rMBI(KNqpB_g7@urt4R$@)jJ51pU`pM@*yOCy7 zc}_}TBt($;vRR_iAa*1L6YiqQXPtq_%Qi>HLg8wYZ z;W@>DaX&vKKAr{`C5&p6!w-~^;o31Q+amE}D?f0R@fy9G@Kl14%Y!|Tow!}HDu+-OJ^*j^5lQmyP1RQEG2EAwCkDT+>>Q=mpFD?Z0T1hr)d=}qg8^GLG1i+J1!@-U zxmXRZl}Al1ktPZkq_UGis;pVs6d7Cl9HirZyuNQd`1Jy7*6z);Hkb&knI%Z~*42jq zx)-J??|yf!d~|jr`9*^~7O(<-W;2g6vhGbcs8a|Vr8+pFQBw)Ax&e1&5(n&nPYy%1 zI&&G`=Vi$dGfLGjL?2?lvy3Jlr4;3M?5ceiS2AM{=z5GW(0ufY_0^_N`Fr@i4dTvq zmq*jCk!ne;U@Jd?n0|O^Svl1P$15`X#gefq=l44&IN(1P~QyxMU;|2u9a@>PHNu zh17}zfUWi87Gx1trqAlE^O11<9CU@Mh~&;QGEReL^IkL3Su!~w&7#WsswHb2!;?&URu=8z^QVN_>6LHWPYzH484Hw-A;cvk!uP9z+H?mzHTVr zj8TzPV@s>c?O7a?;_l9;CLv2uw8}m;+?u7;0LZf(@=Ddb|B4fDz-h%`731OedSB;k z0?aU&oS8{QYvg+n3}y(Y{|4TPpvocXjmFQoJmQHCLg%#W^GX%WZ?$SI0<(BT+q3&SX`ih1-qGg z<*~x9*v^C{+@;_<(4*?sUJV#xyKFOyS8B<_apXr_&5ZCD2_YAg#xvFd!uT_%1fcr{ z9|j<1E-y_oCY0?1<9BlyKYKdp{Uz%vxw;paWS?m1IHTqxPCN?;yJp39#-CU687@pS zhe%|vi&PL+hs!A8i1$e${c-Yd(s09LxM!VhFuKBp<&qD=3P=ll37ZqtJRR|uRwu+m`UPn;ndlt<|6*GZw)o~P_W9zYFTb=@?Dlohilw zZ}A++`IZ2dAVV9t71MtoDatT@22kV_qCvt{EkeiE!vF0;MP3BD=wZoG<*GLP+Q3-q z?82OH95#;cT;yQiI=B76rHg_iE)j%YJ#p=YB|Cp{-kFYM7U%?wspssK#U+k;$8?CDWJ5UMbn{^oz*eNmet#9(Olj}J&6!1R{0V!ZFypin zyj2_p{h|xDuHsWE1+|dgx~;zN%jDi?{(qNU{+LY#sBZ|V%0D$Dk3$yAr%m4_tjpNs z>%;4@y5ibwZ;K`21(9v*qg(Kafj`doqzc{*?G3<{d926KD#r1*CpJ2}I~6r`t8aKv zI_5!KZXxkUv4%J5iqjeJdzX5q9=^P^e9;`?NNy-Uz1XakMkezX#Q5*w2v~0GDM@Z@DmZ&3@<)meC`rE^jzcO_ zg1cZC9!Gc;hYx#ehD5}Da%*kH?`F^W2#gpRG4nAlECAY^z!4az+sK+?v~JaOQ2%c3 z>`u99{>Ou4a&J%*?glfqcrza5%XO`|1yNX&``fRZSw zZpf2M&z}Y~pf0=b`N7GnjZAHEa;a3+f`<3Q#ZIGd&;EeVF;DLMvP>b=CJ$%Cs!78z zeY0*#M;=6&Jl^W4uWF}o@ch&%@3>|dAlx~N%ToPHdjrUN8%F2}jE0b-?!Yi^ zc?KaZKa)kRH3jz@&6*_E2}}18p>H6p>#VDINSPxc!i9yJXTU~)LjT)kpKkJyQQ7J8 z{9CSug;$Z1FNIi_0x|9lgtKnoz5Jn3U98QY+RG^AH*1z)?=`&vuU0HY;hRk-+HfRQ z>X%W<6%%SKGN5rk+kdwzM2b*^Bxv*?73!q*HsmJ(IGM2Hkf%R@C8U1CGaX)B_1xPu zAN=<0OIUhDm8JAjuwpo{OTsU+z-P4ggeLH-btwY7L`$y!)q|`cHKG}OU&;keOmr-p z_8|Ly_cmj+92rls( z4a>TnC<+|zoozo){|=&P5L{;t?2*)SH7j|cnu3&x7cy5Ty8ZyhQBq`;^$zsQt)%gr z1Q#~G(J0?!jzDuAg@6k7!&1t17DycR=ELXAlqCHnc=h~+0JWhunWL5LQ^eM;lTws> z%u{WD>+>~v{;WDQp;f-el_i%W+d>!bPn3k%DvJLxzLz)~F44wsin27S%KMBM-fN*LLBEwY}zR^th7p3X$i`nef6u8fsl zPFPT7P3AunL(JkC_hZ9SB_WCcR-)j3y*);_fj%Rj?pswn2rDFyGU&CMNTD1EVTyPG z4>oddk?S1)U#9^X;`;H)qX{ApTr7(eie07`aN_bTHFp_wdy2Uijm35Pe&in34*W3b znOED14d@Kd*uv(cY{R&up3tfj1%00`zE7^ioqchHm*lQzyHXd?h299dLNqNQ?+1;F zka|VqZPA*@Wh3|ZVMwOF>$9%OV$TP%cr#ivAeJz$3aGqnugtGZp^DOgK+CuuPa@vf zt~J6KSow4dfBWCao0BmC1|dk=Pwc7fO)*{+!qE|_qbV2w>VIV*VIRC1 z4{heRF=8hU^l>LQM=_+>;rmF;bvNo-a{@!;qctPOF>M5t*=}0dYDko}i22%%-z=U9qmkqjB?&+{4s8#ryw#@; zu^E1%{^|?mb8I-n9VMjqI5m}UvwCVLw`&e~P|Kt+ySZW|-vABJYOQ8hESULmXe>+N zISp=O)vn^F2bjJ@Fvn5zOI-4Q=bx3r9J=e`?h$yodqOXUz-?pD(l{)nPeq}kjwDNR#k;HQM3z24S< zgA5{tPtP)>Wru0WV+mzVxti5u_9oe?-$$?kHAIxbFBh_qRl{ncoeH>7?x8g+R!Eps zN!6If+eN8wQ?)}kp%n5P&G-0K5kiAl$0vlB&!He9?I4647_42kR^ddfXKycVlaTR* z8OKL#Xd>U*7d>6Vv8Olsn?`Ucl5kK*;fD-@c5E^4d|-U|#0Q6#Y{ z?oejJ`lS_Nw1rS}&HEYScHGSb8@=qc#{epXM?c1H{l-)npWVa@x~bQ|2xL`r5%BoG zVn}U?LV`_)I<=vZZQZTVg8BJf1H~Nc#0aFk#;*wETwmUaQnaxF`&p70L;U@QFIxl) zpIt2}9-`4byOrL@Ea$hd^k@hr zRVSCVQWYCHI%4sm8ja(E&nq2DQKa(b+gW^tyvstUT1nY)y>V9;TEQTi+~sy&4h(F# zP%JfEMZfW2F7N40(N-QYXF=zZcPBM9W-_Hxl+b{Vt!DVNo1Q>|6l+U7X2o&L^t*qK z(Yw&D+;vU}2H-1YOQf-jwSq7%?>(?!(Vc>I>%)cB)4%n+n zIrT~v`RWZt@TNvcCt3^wx048eTiSCI`$_F5WYNn{TCSE>66qJul;XOVX=_?K2G#e& zo7zD>l38PgETdwR7Z!EuXdHLn;i9Y#T`{rFi5h(ykG54B4Jx7+tiS zF+rXlPvrG;WrWHnf$Ryb=g@5Cnh6_LtYn~1V%_QN^dEt>TxD)E$Mo@9;j)?-Ne<%_ z9}96hmYd(8i+yXysdtl665rbYAev!h5x!)V27MA@N5JzdUiibBJd)1tIF0i(Mnp6u zQg0$Q{X*(s$Z!|bBN_=&1(_4oMZ-!?ov@*$DkJ(8)$!%%n9C}%i3I; zE+zVyCsUkYG;N{cdWLb(L~rXKX!I|V^|tvB3-=?OuRQ>{!C<#Xhh^q2XCy1F{yWTe z2IC>mPu8Z_)GteiD#nKl{@CVVlVE|nkt)l>8SaRsm!4WNJYPG>B$Gc7GM2UQr||hU z;hne!ulnw>1C!3ptbq}g7oL#42Ebmg?jE`K$+!24QPdFg--|2f0ryYa@iqp6*rta6 z@{yYBtJU&$XF|_%0MVu;o0UlSrt+~{=b3H#`e2-yOtC&CxEoG{swk1l+iRpYC&i5T)Y6)^jg zt;bLJTsQB8(l!~IT}-&bdgOT6fZ3GUtX}#=puMo!DbxZ0x(PU{%SY&u54QHlApu@# zD?-&!aKvc!%b~omOKxj7NRZPQ*Hd(YDyIFGaiaQ2@Pq9I`JJClA5xm0JFe9^+r~%# zwO6Vrzngv#e<}Qud2E!vVg_63W~kn( zuDg|r#fa^(Yao7hFaXO;-`6sl1~{(+qq779!NZR_Y^dX+BS*oUX|tARmja%6%XR{n zemO9aZj}F3A%2umX9=2`r3cokELZA5eV+1(hD>LM;h6@{+SnSYF|(zO6;FA)8F{u! za4H}f&9l-?k0z*^1!*LKGk_0JwHwTliUYr{Kr&Depvmff=D0`Z}M6ZzmJX(791&2ID;$oua$EZ%|U=JPc^akIE`Ol zu|%p7dIlHz6{(NtQTZq|;?<^=20W3(=rK!e02IT(=-%o^DqA+c6^GBItvA`1+qg;) z7wSpssfod{rjXhPiT0vbWt`0=QzyEtW@$?{vNbWur|KHJXy&9pYSi-mU^Fz06L%nc zzJ8?=BH}!eP*SnHcqpN!TdLGfji4gI?C;#YSG2+hU*ArH@GK>i-#JB?s^$n~624PL zR3Qh@a|w4=XTf)`XSo%a;Z>2$Kty`yO^dyPzUa;{vaYC6`wWBN5wrg4{HhEqBQk#F zW++3SMCyAjbhegVa2yST-FD;SR2`Uu9IouZggFK+TzeX|Jak5aV?<}&H=`L-m8urM zz*zSbTZxJ*ZA9ai^Zpn&k3er0q}gwBjPCW3 zR5G>u4n60%V<q;g`VoLBW<{=`3>g4H$=iUUQ|pDzgeg?8}) zG3CzTXp!x&aFB$B4F)p94U01=>fSI+I=Ag%dJMODc{5s_jhrsR0ZJL{n&5CT+6YlN zFeye~*%rm`8`8&Fwn(3M`A1Cu06VZ`$6YidUF76%;0E38fI&IgSZ<;@*&qN{U=0Z> zazTC_c6v@T(D&o zW%*f^dC;UE7k55D`jBK>cky6t(dk9aw|iq&;SZ5K7ECww)_ggfa9XO-G~v!!r_4x- zpK4^T<-hD|dJZ*+7mVn$i-qbzJ(64v_kmL;oCMcFMM7btJd%i_0;R>ycW}$*cpun22p6Mc#taA7lSqU!%Fl8g2JW-)7 zvMWVsrQAEd6sdN=S(n)RN3Ke&E`PGQ25S5xRo9oOraHKec&K)Ay1>2Tne=^{XUO^` zKhKvbU3{~k-EWK=Hxu_FY19ddyK=Z>df|3&-bC5_oPldO8kemkmWhC7!<@{g7B|b2 zIuvRgz9lq`U3btINW~J6(_hyO?h89`8O6GwhAPA-fI_R5rl9oud7$DBp#m1A`h?=17kzkW0WupD{tNW-*-Y7!y6GhD8;D@l;jZOcamqw@qRf%((?U$5FO{Pl6eV zO%UaKKy9n|Dfq^*rA#l#C4TTTY^)c+oWsc62@}AA&tVlb41mQJfWI3%NQEMC+tzC@ zDozUYV#nm^!O4JB2S3m4hbw%7e)EXxT^tMvo9cc zdUX9H-UL0gvMX#FITn@R)Mp5Ug-lH1G^3{)CJ+Gu{H=SC+P)vT;P{%X41<%+88fbY zEsCTur+udJwqsD#a03FwB+gSDuG!Vyr!(#BFNV{{F0!?x1mS|@(vl}yFt32AxJ#<^ z4lgWqrz*}Ykj4&OlkeiXFhB7wBJNDUJ8WRnyaVS-AiK){1ZQ3)CE6A=h1dHjW!A(=LOYa!Vh5P zu@V@!B&<^bu9auJYOY#?#w|}h&$mJAx=6EvB{?v=nqyq&3zn)oIpg`&9*xc%KmS5h z8zaU+GclE%cMgqD9G`!|c&!!FbMa@Z=xm5b4XpAPTxV_LsK?;7%o_yu>{!DFz3*ZX zPim_7GIadwC1=Z;wA3fs|Xdf)$?Z5Ah z+o2bzLPQOU(~gJJ7!RF-EM_-AA@zt9Hj;*Ifwy?;O>Tnxc_bBBAuDpIufVu-`?m&G zdGEjowGJ@?Jlw2B&8kJQkWNK(1!4PQ5YUT}ezzy?-oQmi1)84273^CV#e+sg;YB+- zgIp2Lt~W=xhx8*YodYT@e;Tm)&3O-9q+0G`o3jr1`b)dgaVt4a%T_!K=3*rtEpp_Q zDIZFwiL&A$;NoTy8_L!`E~*auUH9otr+umi4d#v7XpTEg-xgwteu>m3zC|DMQMNBn zHQ5o;4mB=SQMWw z$lksRDr%q;G!zhWJ#ynz;q9UJX2_+>fx8A1JydMMXcBFppE+yFShKo5Xw`xF?6^t9)a{D+TyOnULR%8PjLYbsAB>1%P30!SL(lnDm}Ymn4d4 zW8;k`>SU!PDzrHCs;eu@q0;HI=5f>&Dw93WF%FBAFvSoB_Idnxss-t9#R4QV>0v7y z|9lF>c5Auvb?J+mCaU-er*t^Em$(EqDVDXW)k7vb_c1iaP1oNP7?1OS4A4fSIrr0z ztsq%}v1Zz{*zp+uI9I)5>WeLu(O-W-H&6` zys`D7m#Kv(|N&QbU$GWqUonvSfsj5WY9efUN>G3LU7SMeI}9nVD);`$D!@ z5JlZ2#jT3J7Udz-Jcs&+Nwf~DZVjME6s7uP!!d^FA$$*F%MvDKkHrcC6BPbY_ne%j zo-(o=Z3;ctJLDO9q(fhmwZd$B=^_1J4c+kHco$naaK4{XKD>h$)*(pll5sJQ4~E;rO>MH`&nYyLb$goX-2y?EHUq=aW%z*eipQ()y8CB~dCVc}ERjUk(kz z9o_Ahzl$P6Mj|@FA)b6T9_S#;SvpKM3!!mvLW%A=(i=eDnqo9_x7hL4p4@mO*wTRiV<0i)0pu2 zk7E%dxCzT*(iIbd@OWs2H3EDRRRRpLVF|`c|G1K3U$R0@P`Xic7?H+$|1mpzt#K9@ zZ0xVRf`8@PU+<{`ocXuO(v@x9y{#sl`Emmr*Bw-G!02DH`XM@TK!%3H0`Qs2)z<|B zG4gL9!)o46g5t=CtTba```$$-qNE?OmV70=T_$DYpRfTsHq4ByoR(TF^2YXf6 z)xauE0+=_HQ)!8a|7w5FWK35HlQ=mBdj5=3GQ5=S0!VoDdFbsBHY*d|ZRI0{dOnFn z8`e@3VN1^SiRR^6!gK?Qf$_{;V!eas1-R0%X;nwH`wfd-;HVqvi2)gmm@GARtgO6+ zx&pBHp!5K>yC{Fu_3uTX#Wi$bt~pTLPafCHvo)`d zRWt;hVW*>G6{x2PXmE~^<=`YREpsC$3yC8^u4Cf+$6u3nS5Dmvle=V76+>gkciFsN zGwkWf3k|vSJ-OlLq@#?1BlVf&INx~l9zNGO_bqybIIS2UItLYU*HwaXjv#x!p0)Iv ze8O3c2=j@N)OWmt3#E2SB+UCsb3UlLhC+~)QR>oN6|GnTlv2}vW5+f3Dh+Z-L1c|* zHyrY(f5{XvGKg5QW*2bLEX_M-&$BK6g=@oiMFUg>A{zs=e#cU844d^Iv5hUT2E=8n zB3YXQvh9z)fXQzRzldEJC=XB+`ct_eWNQU)Zfu1$1#(p`*D7(7ok3S=Ezv=A?@%^7n0;lYGdVu`fFE3AKs? zyZCTWT?;0c$t_msJ{8A&=Kf2bMEsftA~HTpd=Im8J6_~vnbddO6$j1)OnLKktdYyG z+|^c96oD^sAUNC`gyAhs?f(yXC1y*RFqMb;Owvg@9T=;kq?ko!_Pw^$s{n8tHe47{ z-4?j+C2-l|eOwd;6S)1(=+C+QmCcTD?P zH~*+ej7B*jBa!pNka(oe8{#Z6;O&`^LxQv4I4!rG%9#Ja?W!efT%m|~0py@i5e^TC z2ulo1r~Cxr0~FsOtrML-Lb~9!HUs(dD8m@U)>mS7j}Z_I%+jpe{yZ8Nv;5X|rPovu zrc9#^*?k&<``2=m5Z$s+>{<&Z#Y%{e)wH#^ zxcI$Cf}qBHP;^H2Dt29O#+>%wEsz&cvpP~zTxA-W>8`zbtxQT$@xDh(t0W|UHw5cF zc#36x1?ZISa%VAOHwfQO(HyT20j+55lbvW;3yr(U%6U8>ISY!<2LfkTZGZWiu4n<`gCuTQldzmzWS5pGdcmlXquhjD_GA$$?# z&_H|{Lxb?PYv$OMjedN30t--r!VW>@G1j3)Om^n{bPlXycSXycDJ!1~=-J%<>v;1>#em*&^D?wQeCZWQ-Q%bH-|Bb;Zl)y7 zD$n%Bm3wqyIZIw1OJh;KOx(WG-{wQ%Dyu!ra)RqfN)9(-8QceA%9+t6&>#D@8*Pf< zw-c!JyE$vpmj{dXH^(z`GVn-@L~w2(8c63bL2(t=vei7_NZeQJ)_YKk9Egb!Q=5f`OE|ZA z+h}h3mZFq+eicmPs_-pt`H*oAMPMdpgi|3LTz`XI)p$XBz24*}tyBI$pi8`kZop2- z3xW-Age!8Fz8pL!=sP**OwF7gOdo+Ihs>rn|HiX%;`1J?wFm=jo_Xdpm+1f2n{RSM z3Kgw)U0FvxHh1exjGkPrEG=T;XNWX7?k~mP(|SLaLk@hVD4vmZCZgP^aeK>d##klU zQEcZ<<&SAl-g4jf6tYW(?2Q`D1NOL8Z5AW_>Lx^eY% zh-}zcvhQ%`a0m#-?x9&Xgzdb*0*&NdbtFMo%m=u#*B14E`vg(*jZr?~!!yn0v7p^K zX$ogQQ(nsq2%jjQkV`}7-?>$ioho75>}Tj{1Y;w-d;~fEGbrf#ZROH5S)&gxZmGU7 z5WWl%CR0}5X#7KV(ot)PS#dn2?~p-@)JYXNRdDr(IL?>YUABl z%~K~C63-?MGNFz;Kca+o|9hZ-ckHLH{`xW!_s0w%PDWq8Fg=w=0%69(;ywu{iiA4i z^1CSNTfp+*ZL^4tR_P~E5V7}uPBE8c{B0-kjpad*Qi0ycpbN_PuQ4o0w(!f8_ z2X%N7x<1eSlkFZkz#d;CtWA%B)igJl`pA=Bl8+Kr1j%KGYjLS+7H*|H-ZrR4XjerI zKZ2qE4>6tdl|AMett$}Sp6RL9wEjG*lIcqVnnRlm6XdaALcV`X3&jh#>7FA4m5*d0 zqi-Ut1o-_KRqWN!(Kf8l?;c(~HY6!{^cGSBetH3O~X zaFyW8m8*V!McKq%WuFB)b^dsnx&iCsD3wa&fgNhL30Sj2OFXE@S|jPwWxN2VO@3s% ziF08+YKS|@G07>=xOSE0Q0o$s!Q*oXH`=SP;-5Htnq;g21A3dE3rM0`EW0hssq=;P_L_8XLbQ)nbznT6kbIw4w6z8R6kM zca+fA7=j($NT|1ZQ}}s8pXWxQLDQ+~aS5cGu2+wUKq+uy)N@UeLiC=EiaT{H-Xpx6 zTeKzMY!(fJ0t5W>Fq^6mLnk;&0*DFfYi+_bgQ-E~wtpVdMEqDQp(q=afglsGPKBQ% z&XnLEuWaeuikj-`eyf2&M_)Z4a@6peC?l#TffxQFNB~5LWP+gxum`VV+rPNEUuZ&mX4sm>-$? zoilN?+4pc1)E+pK>WdM^ruT6egH!#lXemA=IO>=vlXfnuRyU-UiiA0DvQ7Rv8T5=i z>-+EVt)VmN{|txg4t7wsJzGYUpmS6Ur(E$(S%22Naa`-FTT2WziRn%03D4VzM+m0V zdc4Ai`_Vk*+sFX820;ZfNBUjqtE@h|k`4^z!#fA8g-Mb{QVr7EDb{5FS%F1EJeJHp zEz%*a{`_lr>xRn6m6w}!z5g|XwWWWhRa0ZL1h!JK&L_8v!-L`%4J)(=?pPzIMRW^;isD>Ij3>Vkf_KC zDH?qyRIMxXPnY~z-Jjl#3@xd_SF0IwN6w+u>#xe}&8i!wg?-m4$H0?50MW^yGA@Cv4D;_wQr=%yn*Wv#KG> z4rg91Ds%I(PEZBh?c2Eebuf4q(*Z>GzK%gh0Pzbp%|HCQ11<#0ZOlPt) zD!?jL3d@GLpeZnPD#4^dx{rGj#f!7tf1QD-j7EpOB}AkV zD{PelgM5s-jeM>kQoq-Sqeym&g5&bWfbEK36Sb*Nt!2_;Q6swSMC^uuXC#6|QM<3t zw7Ky*U^ub;9tjvY`-ONpUUaJ{5VC0P6fmD3?p|4^^h(hY3d=EKmA;OKTmqwvp~Zhl z_z$N^!TqKfAsQ~Ok}*0Z3}^lABE4k-oZOY{gT8S)TH~gcpl72N8vT4U*UME`glO`l zT7MgSez`^#U;faaX;3xZu6`mVS(7Ryt4VgJY2=-?!ZgA^x>ls6l<#YNMgY zww>b&AG9K54DysRE=U=77WYQ`8L**hp9Fj|H)qxN2NFJI=Mnt>LHG)jqo2fmk$#sy zmYp{XA2k6s&5|Rs#^x}Uc*X8wbkxhg*>gR!vEGH>mlKRko#Kv=VV*$rJ<-5C5WdQ4 z0_iHNPQ(dlTH>{VAh&eoJI2uw5hLYgev#-zU%~`mPGFhQoROtQB{HH*4^pFVd?Y|P&O4*8=4vi&Y?G_b`P8BO2%n+Lg_Ip75$am} z2#&qy9yY3IoT1JzLy$+;rAcuUrsXRW!~ir)aISB|KWHb8-JOLiN3v zkCu~FU4CwcIv9QRY_f6niH^No{y8%mvL<=_GS*sTAT)qzOTr{hbvm??M9wK{k(kNF zaxzttjy(B_NL`6o$a(-|!KzeZ+0Un94Oxbq8%NVWI}A6AMyB$PZG9G=RlHv~*#K#h zumf&{(@oqNcL|lgpS&+{jc~1MR787?Y%1kF>^=yjM_UdMpxGQWCo4AGiH9*$~;V3DJBWU zvN7HXCb{Bcq7*NtI9o}KRBykEBDo5@OmYV9;~@rF!H`+qK;qXjr4wmjq^{KQ>Ih?y zs1v0g(&M{_pA?kgu8d5QorE#vRy}Ukgx;3UOYfkamY-S$Fg#s&g%PcBuuQ0Lv{}*h zxPb#hq0WU9c{H}YzBZBYOmog7{ z-oP7J_k>l=26xxaYe0!R3|V^_7xLqlQB?-H;S%Ez{U$BxtK!OlMwHNPDfxEnrrU5G zal^kyl0smOZewEDtzd^>@4gy&HgyNZy)i%JtfD5ftEevtG%twX9oM@W!Gs@7!Y!ks z>gCRh{U%tHfDLL&A6po4GWKTc+KVTBs!4 z0YNQNIKcQ64h?zK@7AW*eX?4CFf$9vAI5Skg6{`SO++#;{7*=?P2dR0?N7i?vwVEn zmq{@}Hn&_5gS5J28#wjbxX+`@0C0GsQd|d5Sd=@G%Uv=DaF-vT^i8R!w+4_8%@9p2 zft%h={biW3T_FU0K>qaw#t9SN=)p=B41cIOZtM-|&rts*i3%Tx;|S^Xz+GXcU{d=FouDV(Yy~1WyH&h-ZL$mA3&Zg9L z^B&sV1}g;8?#7>ROZ|m>6DXYR z(x!P>718r@riVWsz)`$m_rx$*T2_JQRCo3a+IHwFb2NV5yXHRQ1*Wl2OE;cC{R!=d zCB5T=z+BNd(iPfCpR;%1lU$=C#s7Ft-UWCxA{Fpd3C!_7LLA6}tXwMWm|Nah^`X`z zZCkj5)yq-=TbCXyrHIg9-&EPc`TcV-mR^V;pfrKI=L1RQVwiw(Mh7tpuKySA)_|(f z$#55pv!l6QPpq|K6_%mqew)AMsnJ%=5lUvaAl8e6{uj%phGiNl(l-2@r0B{-lxjyS zh|-w(Tp%H@)pT7?=i)BaIDWYqzH3uXGP4umApgxyDI}<-#`|nKQ;hSgusFslo{e&D zqyOu$!k}jZh^R?>Z!l(MJr;?y<5~TDLNMfoMVRDCGS>qcAwq8yPLnhB?xULqwa-Um zrpK-R;t6I01%sFLDO`~oD|5Xb|6qU_Dqh>0#G1FT3Fw<;=#d+_J;uGzJ@FTx-lh#; za}2lp8CMsVzcou9dD&Oac~+T$@;RdP$kqms+h~ma(ffr}-tp)umOt1E0Si=E5G-#C ziqwIGhJSk6!WZkrz-lOl4vDHhB{5GnPSjpP>gCcg%ppjZR%Pkzh8GE=q#2v)MTuT@ zXw(PNkI8I;_`drMf1tYMS_z6{S4~s59;QD@8IR}LRCz`yFWXx`BcA)id@NxWP0+Xr z&r_G-IKE7_gTw9-udye!X~B?8$vyo)&Fwc9^6!Cb6F!K5ZV8-otd$%G?pNF%)z?tB z-+1sKrWK1hN7-b&L8fly3z^{-=c&C{_+6^R>O_5d>*rl_uzjD_o^ zZ_nV0&&j3M5)z)))AGj(8ZE}aHJ1;Fq99nRQW9vokeHpQmo=g0Me)$m^dw|55Gbvn ziYZ!&NE%V6?0=J$xur-3N+8J- z#0K+(bXwt?-Uw?~rQgFo|A=E++@ur|V(P3Q z3i2W78mfV7QGAW-o)zyrA7FQzJPO3|SpH1sXd%dgA^!x{*cg=S@U5K22bN}F{;Zfh z$g1I(;pV&cR^nM1uY>{6f`o8HiB}0W&m+7Ynp{sxnHrqqXjP;PR?G}|P)9~&ggtPO z`NQnvZlkPln4sM-hP5Mf>S#0{~{xVZ5yslRtuz(u)Q?)%~Fq*jN`kHB#3u zQuJ4Vifi;0e;92-3fAGgood2N?Vkc{Y(k2ysKyH@=VDhwe|E|OJ%;U$%G>VuKty$n zs2fNg*j=5Y$2s%@Nbe?w)9y(G=yQvaMm7|V?)cB#$4WZa zk5!0YZMsXR*(~PfFT&-y7-`{eki1yJL0}tNweO(GoFlc&(+1r0Xyf3S?96dK-&G-S zb={qYn+pBo?c8x-vk1u_VW5_pt_jUL5$odf-$woB`eOezVdti~9Sq0bvSr9g-uyN0V89AXZ>@{fVMkCa?rf4BkqDc z0xip}H|w1KDw;%S&aN)^jQ&bJJ`!nb#osfc_S*s1Z+nX_%;+C1kmo!9;_d0;{t{Mq z*vI5SmRz%-)ZgV*l0>1UacnQ;*$fs5?~{W&F{AYw3p7Mmal0+9e+jSTX=+ih?yDFj zAmcZqcnC*ImveM}gGCO9syx=VYQ#59U|h)eB_dDudiZS|0s4vx&PasccU-$35J5m> zIqLXS{VIzNh@vaZy2@b%wjpWvWhfzmtKTRB--kNd&G=QPH+08`fSIS*b}WoOXF@WUQ+y#>P{31tuGS-Me{qTJ!8sdO;j+BZq^29ZA@Z0n%eG#gc4O!c~a^FF8YgXHm&6`IDb z2WdP&hqaAL6}qR%(#Pmcu`n=MYIdj#<%lV?k_2q};XUA8P=;9b>9-1aU_Y5En=J1+n$zEjH%9v9g08&b092wbx(|E#b0&lW~j zZ7KyifXEjiguu^m=(&t`>So2TF&)_>89$^{es&0QZ`OM8&ob(8xb>$_JM(EV-5ffb ztVk#zRLjT6c-i<$-0%IpRmG`23mRVxe2d^!!$V>DCG-)VFxxOgLnrxM^~7=z8`$|a zf=trtc6ix3{uZ#@9sMQ_P>pJtMI&DLCbQQ^Z+3E7?eI|1H-R4@0l|HM2_a3@jS@>IO`yemT|J4c&Dp&>i9 z;+^wx-qb8IYA(D{FdMMC>Z5R+3S*OaIXCj4th2?sm4_EVN%iPE#mT4nZ#3%D*sJNh zn>TwW_GFw_EO;$V{l!+k)EM+SdYvCjNY=+wqp}KeL3%vO4$AJ8pLQ8uieDM&m>0VeoI`Qw0(n(iq zwKKds$bG=`W)-`l)jLQi7UIvKNdv!?RKN0q@YUm7bC8-ltG9} z+y!dw+Lamk3HR9TL(Y*DzNZf9pWw-^NcpA9&x3D?33Dxc(O}@5!W7mqu;=eYzji{e zJ+LX=u3eq7YM6_jHoUV2sVjrhou*U#&9dbopJd@R*5Lq4K(xO=ja}%Ty#b?%mM+yN z3bON6jSi_I0BnJn{jK)P?6VsREMvNO zA!-U3YeQ}3L(KQ|D$(&cw5TbcH#_nilB=xk|M+7&KOwn@z?-)^G;eS5A~!*rPMsK& ztq1@9SOJz!+HYZL`v<_c2i93`%CZ68s)9Fcv8i24cQUM`S^TeCOKr9`G-|MMi!mQD zpKp~))O&%czB1&Bez<>;zUo@Baby96BpquY1k$kb6emNy^3DVl`mj+FX9X0o~*55CuJAh`z{Yef`oQRVQoLZ z-Ts(l>3aUVcf_NxFiG?AVVA-PNYIZc8IVVFTl>UroO66@^5TML)B?USX7gf>+K75( z%~R@~Du&y>zis@j$LD&QTSy<6VJgtDtY8XmjLVZ>u`z+$`I3}#-b-m@-*!1ZG^k`U zRC+?tmg65A8(z0b^oIa(z>glIkOmm53b-$2*d+;#rdWH0F9I44*9GsJ3-#1%wME^0 zRjg0kt|mVfZX=`XlKZ9gPC8|K!@c2?RykeA(SmKQ6cLT>e@Bss^qI4J@tl&yxNMAi zHT0?UDbx8}z!r*!@_Q!&-v4@GQbf~UW@Evn7jvGACnPUS)Y{}?E6-9f%Mk8J971bL zV$b`;VN}Y}I+gS%;58~Pi}#Mq!Qqnq`YYJ_J7X5;x9$zSK7rHd_NKe6S+J<7wq2G+ zJGIv6U^Mw6cZ>11~)ctuI@2sKhaNDe4_f{&`!6*?i=%icLHm6N@N0RDTmOew0 zms6Pxyi*Z_iEpS^oR1ckWi6rgP)fmv7#N>?cqoy~j=MNaeazsNwd|`{B_;aq7`TbK z9fBD4Jl1p%UJzmMY4T}`SqE9T$&*xSo1>$otbq}2>cLa>#6cv_7StP-uRqij@;b^w zpNeI=a>aTI`u>x~S^?~6iU}04y>bM^6w zH0z4*9&rCb@BpH2d9TW&z%>8?_thT!njo7MY3X3q1(_Yg1x#E$#k+p~Z42bQqOEl( z8U+N~XS1d7siWbF>2avfbdbvoyyN*+uOv@b# z7NJCb=)!8;GR3DFbGOKcvj?W&sVRuH^Q}@VBMC-c7i^8AyRY~f1HOBWxH8z2PB&eD%tMKV8KYR zl`U(vByua{L9hJ(Gl1%fNqHWzQ-+;PT!JYv;wOx{8I|wrKQZvJfBLDQ+0P^n{k{-l z-dx=t{0$@Vn&l&C*yi5FaRM3O*EVrl5FEE#Y=UTBV_{E04PhO>T?yf#g%+^3>s}p` zWLH`->6)i;-XIqo69iE)9@NhqbGVWH!DO+HjC6r)N4icI6`z&Z&YEVo}+s|S%wu_HVKNCXbQqEcMNbJ7%*SS2Wtej zs?U@Q(e!I;53`R{`9We|ju$WS06zg_mdC9Fr+{G~K{IHv%ljV?Ool_Mym2{x`d!LMfRcPJi9Bz zyeZ3rfqOVL&(Md8d}4~znh}M;=yt$+72KG}DWC=JY0F@E4tML8%647QawINBxR+C* zyf6%XrJ^ViL0gf$?0Olc7DDveF3-PEuv``;uh7>rbmn<*Wsx=Bw~^h(_rQ#TX?TWe z_qi&FBsDWY;H?Vq7CuE zV_u`wp-6SxS&pMS<_N?K4beVMBzAN-ebLL^caLK!M}|>BZEJGK@yQjuK5QOw|AdEf z^7KEJ?ZF&g3xUj}B5;Ii&zlbSwrHB-VizoYE*m^@5REBNMLGGvIzOC#H~L%&69Gi)VtF>9 z$>n!|26rcLlNr+XBj2-(w)_dkYFY3%*|5T@%je1c@NX6KRMmm9Fj_pVf#3&i&dO*Z znX*Zen@Ig*)9SM{-Wdin=m#i>b|QHXaRX--Qo~;xM5*xsP1gKo=kD!kIZ?MY@GlRB z?{eGWtjFj=hdno>Ytc;G&Z@hU?U^L9_F|h9K6Ig~sl|KU>K!9(Bw@i=IP5ARg^n_2 zsC{BeBQ3RSDL9-a3Xj)16&DK{xh} z7aDE^Z3pb6vPQs#;NE}S7s+aOW!)k#;|Dfi<#zGrJ=(SO2N0m*ZlhvgFt^9pOv8Wv zFv~(LBW6ccCarpB8ff*K_Mnriw%TzKBRN)k9Ck^?;w0-xoTW$F&BHijrFDL76@q!8 z3JcWyA0O0qhH1VXqXKdNqDL3;Zvgk!>tQepq3GN6S&@BhP_{Wqc<&;Jdu?~pL66kA z#^hwKo{7fRdnHTKT%N7m%23b_olEsAnZXe)8uOWws(j5p1Uxy1cB7nWDc)4PIr*16 z*=FW33IU7f0S`T>V<4f2es^M(Y)sISYbCLI**3C`eAfoV@V)>_A0jchlvhZ%rq>z? z$EKy{bautZL)4u*UZA>Xl=k{IM1yx8zcW|ui7OPc#{zZd4xs9Y=C{o3xyxPnzVEhQ ztp;(_4uMI+F#2|8`3w&VX-CXZl#X24BiQgv$#xT8r*p4HGCT=rejl6Q%7soWiJMs$fzwaqA zsaduH)BlR;J{ZVMtR&!^?4OWGTx^V5=lqBa=xPXy_|@P%j2&m35KNY79@ zxj~kvZYh6Dgs>>bg^KR3n3M5*Y}IFMHI*nFJHO2fY;{~UvKq4cgyjjp;#KiA*LMz} zw+Z~NkX~J6-Er$QXM{HcQ+&%aMGaxATOoM$Yz<5wxZGqZ4gUQE^nY0*M6K!5Cl{Iu zi!6Eugk&Wxbl4=93lCNHX=^$NdqP{lV)E9~`VrkJrD5pp+wz509Yf8?WJ0M5$0*!t7lytFOZZ`tY3qZ9^Iz`e`MuCFyVK7v( zt>zh}Y_OaLZA?uKRh_v*Knvab2<|=g#EQ}tRSXHb2;s7zCs8eSu%tbZ(f=z;z<{*T zD~3~w7hn9kecaPDh4QJ~dfkb&kkbNmoMc6tyM!}6fGRP3SzJ~VE&Be!5cFMT1+)1s zSf|<1FmIe+I!l&OB)Rfu$FitpuC+_JEo7XVzm%f{p#{(%=Nr&|D2?F`*`qv+4VqkR zGkv`MCNrtpYKJFcsV3R8W)5>swO_$1*lvdHhIaFOQtl%Q&QzOX8}7l9zFh&b()Nqt z^Eb+GtAWvS*Q)vCU{o{}=%f@8knj(fxm~B6_|9NihQcG{y0Jz>NCtI=y!XIFb`-ny$=#!kzDs;J0On1J>!ee4y7>=dlOih;?FbiZdmqq7_oQc~R3H1A0 zqD>3wja$ekM%P-;1C7^B99xDC7ZaNL_6t(){!KscY^_NWQT?JcQs6V>Tg!s60sM1b zxy%Cmd%mWkjX%xcI~2KB7-I6jHg>^$?^jc3s>2&5I`8e!IniHE&;aM%48(QZ7 z^DQF^;Kq(*d4!yYYFZ}uO+M%SOGh~4682lT=1fn`JCZSQnd`21>j~gV{`uCYGq3M! zU40X&o*Ou=&Rn36YBKuJ5ZIse9-kYG{Pmh2-pIV*Z?A2eHAbESAXFw1R(= zk-zJ4kWrfv4uc|wHV^vB63Y=>Z{ye-uC&$Ae;1msxnf}62HOk0up(0FR z8it9@t7Y&p!@6ttoqszLvyPc(#RE7iKl-DyX5r}C$g`B}^EeO3#8D$0G!eq^5AJ<9 z2B#*z>iT9qH>e5f&D%Dr-ohWyjQ4+(jo{6#aH!Ou4#c1ERLCz-k z4mk3fW7Dr}d_%kpxicZs2y>nk`5N% zO(*=B^FH3h=5joUp11d*E6i$+)J7;es@LL?pe(>Zt-!QbcXYzOg z6l+lbT6Kf6`r3Lx?c79Ahm&KhJEVFhltf#|6;`eLiM4gs>;8W)J zOKZ5g3WIn{@1DG7saq|g=K8LHNCtXKg~ai5!pvMJWhOj9QUj3*hwRcGb1|6eilQ#^ zDvHr`L0QSALqq-`m3)MBzV8z!Y9inFCtn&}+2sve7ET%se+ZT*l4*4=R|CHIu$j-2 z&num4WJLFJ?`NFNae!v=D;zQ{j2(J^&;JW?ZJecH;AiZq_nAupcHxEWL`_{;3jwiTX=Id2b`@78%nn^8_pRUOR()%_Xptt9&ZH3xo1}<(irsp!ZPV^4yO{ zTF3s^#kW1AnQJx5t?Qw^TTq;oZ*i$IuKYl9calmS;lj`$qOqt$0xYfHc52}&~ znhCb=p26#`sY%p8%iGP3w}T_X;E}<|_ouMPkWZ1o%^9l05L$VbI<*M5yBrANAb~2c zI>Mv;6S8P~q|+6g_ZJIF@TihaaxCXltcjy;W)+DP?=XI|6oVYXMRo}HcFlD(s9lQ+ zquW!|`Tw$W0_Wb{@2TeQ5lQO03}66$aN+9k={^~(Nc&UW<&I*g2+9DoJ=Ej?f! zI8ohsBWDIEHvDCroyEV;6>hF&ct{Oi-SpsCtYO0z~{0?q&p2W6~0MCbj3m3(4}6 zL|OO5?uvI@0KpU`;VlVe*ggnou7=^8qm#@%lH*yGz{{`MDW9phIE0ynd|cqzo?-~g zsE_Li09Lc%zz0Iv!_jr*leo5v6$$z7jo_gFAEg>J>?qab%1RB$Pu+$^|M$(l0Mwf%yA*NCHVju8s~eW6V}36JC6)c3k;s0to8355Cq zojTN=t%?+|s0G^@Hrm=jiwcufj4%TCl)`toO(5VmU7grl$-}N^F;88nr!9D-8C?dm z&sHxiL=279n5htNW_`JYBEHJETF<$398xq)#yu){@rIp7f0@VApf&jE42KF|f{6

    5xJ4N_=KA*RRCYeQPyUR?DW=A-}{c6QD$9e!+ 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 z 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≺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%0AA=wslxy)wlV)?JtzLY#1AVn{aFAIN8w6;&8+ zLV9a$N zgBpPATh=#Q$OdycLfJD7~IGG<&=N_gDmk;T?Na9bOuZC~&nTWo9R=V{Jxkj9*Or)>WwuY{V z`Z1_;BYk~u#QPP@zp`B_# zh@Sm6tVaE|rsG+X!vIGZCnk+Qtg*LH^|`z4D3^PDy9?Ny%dGE40M;0biAsi=Bd z{FD$FF|V$6=dIv*Pm&-(c6uR!;}eIzbz8}M)Bgy4?b_{8Cy3UlK>^}NM1F3GySI`r zFUg3Ba7e?-=sX{SI#RqG8Ec)2>7*?0LPo~Yw+K2T6i~~)MwN&S z>po7CagaY4v7ktprWcx*!N=Q16SSg5dLPiS`_Nf$(bro$TceR$@Gh*0#5}6sgO%V! zYjU;_sBXIxlHK-Hom|xYo7)8p;jsnmZL~2xK!ZMMv8Jryk7qjg(VY#MIiiv8% zfv~wwGXa9cD@QUinLDIewLmLK@5>!a=Z|2=I@bL;4H}u2AWh!;vFo(7v!T-shIz4; zvmbcfZ^Zu*-R$F4)w?Lwig%Lc08#U@dv%7&NZXN8zP7)Bqe}-MsU*2z%t|2yp)$c& zTY&90>Q%6&O~qs#u%Gl8YIc^~aU8u^?kx77cTfpO2gN=wkoGBt8(1UUSg}BEa`cu_ zL5XNDAqUL?xWh#OTtue17sr|<3eQ$eWv=di?r;1ZE$9}V4E;P(UhUez=mDX3q*C+FO7TV~n4=qv{!OqycWtVfKe4ew+ADt$ zMmUXTT-qGl?SCMQ;?W)&VyS0`^&$c-%4Pw8zA2vZK)+2q`=tX4J66~?pd#i;QGn|B zpsTJrXRu{m>)d3`^3)fDX$#bF&X+WRQv5CONCjuAj^|d=0|Mm(7h>`W4u1SDR7S7A z9G*b|lnu%vHo>#vd@q`EA(7d{Iej=8N~evxHYpXRDObFcicG@?DqVU6_GlAI*%K-Z zC`VCae;;h)3OhZi?|#AufAu19Uxyw#+j>q}5WQSc@k*8}Keao&bPS#@#X_V<#3|GQ z(WuRRp2qIBE%i`M9D3k0ez%?2m0i=4Dp36t6wv0$t?iO`J+f?B)-yZU6-Ga+3U2q z`vkhT#z@+CxzhJ$e--JZ4D*#2Uq-;+gm`U^T#I&!sbl4IV#FtvVMrD@^{GF?bvPCT zp~BL};8^gE#WzO#PODXYO_KJeEg(+A%;9)s2@cNO>Q*&oKTQnO3)ju~aCR*!0ACYT zzIZ6R!LpCugy{q8YZh8T(uL$fWq*HMdA(wZO04R7CFhk|i7IPQ4lPOW07i2=EifV`}Ho}>J%y5Dw z`@NYW1x3U6RCPc3XAl&S0m5GVSC(L#is&Ivdeo^D;2qxFA!)?tUWRE;DsG@{t8{&z4P~VgVn`m#PHR``^&DQ6T^d@1hL_i$(m0wK0 z$cRGSV8{?<-6Gm8FeRMN5%vT6-t;1Qp~yVY&8fu74VRF zf*E?+GpefuSvpS~TAR1Yu$+)-A`W4TElCF_q_TFGt}X$g)lG7m!h$E%Mr6lBKsb1q zgh=@Er3mz>jpXx$lP7~L%1iYd9DU#-b8>L+lJu05gg8#KenEBRw!i&0s+NevDl&<< zkk}sZPz{o{@~DE;ld-SeKo8<|Ts|Z#-1&!QmmnW*J>4-RQgeDH2(qkyd}}l4%aS`U ztgHl}@fKMH6!f+2Pj0GO`{1f+gW()l&Er_b;C%6~_s>8<#~1L`p*CAR zEj!pVi>L$f2ceXsY3BAgM?2@2a0l(-Ie%-{N(QPYMJLmuD@F$-h-VyHxODH3&!@p^ z#`M{f$BJp!lu_7Tq1!Ca=081TseQ*V6uQxU7zHFdqYMBYOQ$AI-LP+bU%!>nv>zmuQ4MNQP@I`3a znu!*d{bY`x1I&%!4Gr^TG)u|?Rj`3xsgrh8&TV!-r8JbkB9?@*<7Pbe3Y!RJJxtb=P5;(F4JDKw@6YTw%mg zUF$Iv;Iy57j zLiaMUn>``jU?J;f`3@jRCy{PQ-DT@xb7=YoV{8sEv$Ha@cFPLuZuEsm*Ks{Zs?*7G zH6o>w*W3!t%_{TQ>>2F;CRTGrp+(bFD{Za?4#Lgv6x7R zR~w4q6i}f27y^~h&(9lIqyDNHGFbx7XTB)LcU6ZTaZ^r{>$YbjDs76v>E6(~9(m7) zQKP>)$tew8MO&LJK0JDE_I({1;I(0^rmcU1iCnlaKM+h5!c}Z}!^+7qcJ`d( zgFeXhKIf<@u{O$H0wmqnB|1dteA%`iHdt@t!DBm_)1>cO5ug5=tC8y(RzJp%X0lNK z2y)FZF#x3xI{~BL zYdHvVe4-H3_i=Q5i&FWintRS19*H&lHvC98U3vTygRdA!bg~~LD&cs@~N}z zxBWMLbEsP}@I47X#2xfNglK1wFn{*y32?qQ zGLQSlFT5*cvs+Ou;(9JyHK~VIBZB@dVS<0?SohL4pJxWCV|Ie_BNfv&IEw$QSw(l` z7Jf;aKD~tO9_r)4Q9y@uzzl)C%eVLI^Z$gRd?Ea@NiEyfI-|ozp$$4$7c7OWGQ_`b zNJi2ZEP+Emf)6Pmg)b`+-Lb?ncvnGwb-S5FXT5CQXY0FaEx_ZG;LGP?ZUqrS=C=Lx7LdiB&Dv`+$Ie>B`0E9&RK% z+32UVgm)8sF<3LzcA@TC+t~!&p?kE*oi_W(Y7yXT8*>Wv$%G1(RWG|lu!CiE@5Amk zY`C?cI~{qzoAE*cSX&p%AX85FN8h;CJdWf-zwUStafC0A26{|;-dFzMOcu70S~7H4 z;6JM?n1l)ZKY(CP5eO-oA3b6_N{MNbyYh%l4_8#u-pzs5Fb%zHbQdf>dv*gonP z#MoI^YZ|U|OY#sTedz>x&=zUNZvdoX7Mh{!67Mf20Ie}*ST{|h;<(BhS`3*lvG2<)`CbJ5s!prdO{i7KjH;#T zA*M|ze;sfdD6X*fOH$4%n|ADeOJ|tjZ(?Xa5lqj_I^mVN#F>utxGB6hywR|oTO8M_;n?~ z$0N~)ID<_=y1H%YyAXzIA}FqguG>?E^V^PoVnY@_q2*( zTSp1%4baIGrZo@PxBa#7Oim!?h@jh+oon@dO|(?ox=1@T*fmFA`+xM!P<=_azeFBP ziSzLSE+)Dpfj2d)0A54LBQF5_fIpYC#Q9i9GuquFKKX@n+}LD!ZgxTpl9A*34Ogvg zFt}w2YbWERVR6Aw3y25V8}k#4LQ!$Dvj%tK?%0G)IE?}pe~^yMLhq9eOdk2_U>gil z)6%R#XEDb1Wo?h9)j_MUP>5zQ(3~Y271p5|Pu3wRUz#jr%;vcy3Sn*y6W&561bO2)| zD1S{KA17k5g02>9ebA`@0Wy&$sb6@JA_2MI@~w3*fLEAb?}#b&U0&mYr?o+;2cE~b zxnNgJ2k`?{k3pFtBVXac8yt4Zr{t#HwdPnD zj@Xx}=hahd6F)3oNG>u(<4-t7rs*P=<^_D(=wWGbtd4AcQoq05o8G3DwPOt}Kb5Mb z6SjWAhL95!y9mxSllSGbh&4Ox#F6eS!O4HBz&rP=R42R^()n+1~ip$7pTNKDfG@+N~SN0vnSNP1iC46)XfVOci6!I2k!QZq|&Q!oQ zW}2i;=FW>QOQL7a&(wAFvw)3a*GlXbYx)09@) z+XFKnLSzkla^S|4``j+s^05eZQ(n(>w=4wyeDFQDHYuO2IUn-uqSjo)i?X+9@k3~R zu;LXw!}jGj3zC{l5O(b8J5ptHk#!fZcZ4nn3ugVO{9A{fz(vpD%=xUxA()BL_4}W( z!i(-@ePWHHT1qB-yYQjuEH?I1QmyeQA)^PSCzW;^?}kYy=+Nb#pa?A3o;`Hz-+@&3 zT2q}aDnK{l&1)-|@9Sn%O*01>TSLaRDQrq=h?!mOEz6XJOzzk7ScAQu`Sa0r*!+9w z0rBQp#N?v%_LE(|ND2?^(dAe0v$Y%SA4-KSzxQHpUF?&@HfiELnT2pH&$BMJ{d zFgwh$1&Q*Kg#VVrur|zDrL2XG*G~sYR|_g+am({dre!>VouyF4zM-IIDKwtl=c$2s ztq&}NDH5}`>?nFsXdm&-HG~C)tI*fUe#L(-nJ{MYXl!B>RN*1X`w@|^sn94nC3Qo?56hfpRsU^c_;zKW;cgAO3G+o^0UV z+8Ta$?b4zrLNfY+@?Xec1&!tEAh-aLv6Y5wfK^d|Gx$v z>$!(rI#&MR0d=+8q-K-#(|bWIbq4q#*wLmv@-IVLS(gD`}LH`l0_PxC7{I#Y$`fF}sw&C6a}GdkEwjdK=>aAR)j zV*tIuy4Acf@e=JaR=PtUt@d?pBT~O%HbyhLS-hh;5_Ow1qtXHmBP#< zZzz20ITS{C?fz#8oZPS$*u+j~t#bagu}FGHeky4zW-4L|H2LG@fiPMYIQPMx2>W+MOXc(dS`H~ zgJqkx0`cnMOA3uvtWU+nvBGY+|MAmvnh}vQ?*bpiPRG9A;mFpu2IDtZre}_Ud!~S0wO@>_ZLyKHIO{A5inz85 z%(guI$cC^$>^h>{E;yh{6XkYkhpyF1e4x*umV<$6ak|; zms99A2v4g@kv@Hr#vWApKjC?+arO~uAQKUL^&0V+WxKkDiK@mvgK{(%Qcamm8U(o0 zl-y4vtaS53&^VU-6XGXc0HV#WxINwW|9m{|fV9isKf@&ZlQhJGq~TvxmpryoBHK94+xJzraoX7Yl(ZduwWFN&+MfB(#$oI@w70%5Ea=n#cJ*P=nw-9txw770A8Y}CDs6%5E=9Q#uqtTcxTyYQldN(v zG_L;orn7szcUz+ku2ZDbTK5*7mt_ghQJYR6Fif@bI8BBd-o{ zJ9jES_jAiKIM7ILg>fqc3tS2MyI0}3luTnv`9>jkJjtD$8MAFFnE6dYGjrq)$FW~r zbKmtaWXH5N;2CAI#z?LMj7>(BKl{ms$&{_JlE&F41#u&kBK#Z{jXG>8>oE-%2JU56 z31i11p7N|Gu*A!)nPM*uXpv4V4}x}PAFjjSwTiIv(yhkE5q&F1#bbH3^0!stDANoO zA}Re%t&MGfu9aC}Cj%nga<6%0kCTip?w3&zV11%c)lMhv*zM|RCh9x8QEguaNmr}X z86+^NhX!mQg{duul;_sXah(H!w-$kL&c#K4@th4P>aPbHtb%7hHQ&zJ{lyDrod7Ux z5GBfH2j}MUS^2?z01~rwpUz}i%+oF#IL~1a*G2r#Gq?%WCF-&-cxLzbPB+pks*Jok zCbSdZ7JA?b^WzG+f_Z8@+*P9?biXG2gTXX6u+LF)hn{YW;b1T3Ozs`8IRmvQQJe(arXB z)w3|jMUTPqj!ljw!W2_;7rBA|vN+54S%)YKHwKG5CdXfQ7sg}`a86~KctnA7tQM3A z348c=!a6PI_;Uagf87vfQA>~&Wg_#`aPQSYlDfieOrC@8iD1qr6m(}iQm&@iQ*c&V zx;Z-Fpd!oxodel{dv%A`-C;b zZw!wWaaBODK!NZ@6-`0UbaJ3GHaQfg$WFdj&vi@FGw-a-ky8UXQ1mcvBugHOmXJJxR4fw==j$opZrdQMr?Hd6Daa4U*A8s zS{B@GfId7=;6M6rBv*C6SFHmGZ+lb#)yJxY^Y2uImXT#pFv8{LYLwi)k=%nq;LWb< zVpyzb%ajWF0J>y^sZakY6R+5k4}UERSXC?Vb@Wf${t4jKHABPXC-Oxl1VBuIm~NzK z5Wfu6!=fr6Sj%}ItrhHDO3|Ohe#=%dfQQ1UG-esO_a^DL;-O>UgA7%SUq|9}JHX zJBav2!w+s#PXX_mfZQ)(O{^iI5iIicxxhGN$5=5Mt;lvVZ(f~hJv-D{8*|qcB!igz)9%IDIL=+Gn^Pu(x14`T&HF?S@U(8Y zTLM6}tHgE;#KjT2>^+&{=zsgBqdG?NHP)lN8w0-D86L?UGOqCvbWQb2g5$O` zU7<@2z8{_Va_w$rqOL-CeFQgcGLLXpFt9wsZ!pwT=|BpEYYxM_r@##Q0gRlh)1yFN zkW)$5E`ifQE?Y-UJQ*F}$;2^1%P#a3gDBTp`Yl7=tdD4!4n|#sW>7QEunCn z=-8)zJYd?D@q;Mo3Eni(0vrj&bg^REO<>4fchY_AB$pHZS}9w^hyk;l?dUHE_Wq$l|tY1`K8zc{QNn?S)i~(};J+$FaxJb4~qC*KK zo&s-*rvWAp(!u^#`c13#zGFCF z?*VX@J{zY2{_jf-bwa5Vggf^bS&ZS{r`-F7F;H{_QAWA$i%aaaUe7>3h3#qm+M}@5 zPMj1g5Az-_aJ2ei z7=nf8K%r8t-&IT{M+5<)nfr6@4@q8Vah#d_l4nLu!iT3a(qea0eEpX*O}9K7_O2@4 z+krPBf-NIfN%wHQra{g01WD;kQolG9C7TpSmPx%5ZH|BkxZ2wXc)w1RFe1ZqsE3@E zj0@yOxH7)O0LSl0+NoKSLpV)8&;u!E0xc!?9*or|XiHY-tgG8$US2nHzRNS z8y-zXu0<&gb6Sgub8AnGKT(_Lli$czFWxkPXCOVEnySY&GH0H$p;OG-)Ru`2eF2JC zh>-l7Ep)Lb1H0OPcK#^h5snG?9l!fyo)LGqVn7}7;Al88DX!udzk%9FAlLc4%Cx{;)8BvI)NKuRoxgemByM3n!r+KKq{LI+qIgi?QGMF*b zOU9yT?yuJd#=?=0iXNrmF_d5^Cd`5CuyM>*mO_e_I9J355$=Ux?`I_GrwrjDlsLPK zn#9_piJ9kUkI3e93Lar38B6SqgIItHZn%yLO}!f+rMv*9=X86$D@&v8B$%S8ydEjN zW2vB|LD%UmaPLg%M#$ZD;lPN8znL@`P|PInP-&*bFR%cQ<$6C>M44-@FJ$?bc{Tf> z{v9c!9B)XR5U_I&TkR=_I(y)0RHqR(%rGAz|foS!pZArWexcvy>wD9 zTFV&(P^{$EQ!;<3HG4_;{bkS#IBGcp!~=mD%YLR(Mvp|e?QDkwc`uKaD3Gv1;*2bm z8k!b2G>!CZP1do0(>`-3Hyme4$d(Uur>*>g>!J&X`F3s3jj%i{PB|BwV0G2x`tajR z%DVZjU2UGgG(viJEIlF5F47U-5=mj){1m1FgdS^#f)Fsc8SUsX5Yrr4T0wG2=mg^* zjJlYX?v2wpX@?KQ%Uft2=gBi`Hi_;G8Uj-nhsNw;+z6QsOI&991 zsWz)9kxs8d=sK_a$7O=la{?pWdW3P{x9*@XZHP?G%vZx*`+AC%Ix3F8UM=hQ;#Xi+ zStQ>%Vp$#E4u8P?%qx1e0%tZ?(8sB{H|i?h7=}ar>kC1Nd)N`Y1!OPAVan1~1@}?< ziO9=?I9bL+kf-B_a#0yqqGSovN1c2?ln!aMQztpGY!I*v({hQ%$oH;;#E11T#d(q< z*?D2M8mKaZ1G16~u#gnQAz85m)^<@+ppY(@uulh6r< zt_2|6J@Hk1za{+-XxCxrM4{8fOZiO5Sibdi1TQ`kdX=$+&;JyLp;ztzGL!(50rQ5E zQm>L>Yo5V#VlSMS8^bs=)yCEjJj`v(-LDf-C5r(ai~^hb)Qs%8Pa8t*gl!Gf;Vr3c zn`+;wE}LLRAIQWx7@j$OP=HV^ot4a#q9Taxx(QLjjaNrDN|dnGrMiX zk8Y9ueo66sQ-IyPc|1aoCn4$#%-Y8AbnSIp==|d*s^mzH46Vlr z>9PHXzad?>uUh~FL6}x(pIb0djhEAbP96h4QK1^G#Q=;}+aSA60U7wV>L$4v(srLz zp|s7=8PjB-EklZIvYulM9&@^@Qgau?pq7HU2oLcXusN-R#-C8@wy@4Y&6SZK=wifL zS`i!>Qh!bB5R$R}T|I8I^dSG(t(+%f22slWaYika zEnXSRRVu<+MP$L6wUJh+ugq>l0+V;XH~hI|%3Jc2Oyn;AZ$ z;9IZbBORzzVm&nvVRvJR6buj82@%TeGB6K@6PSlud!NgyM#|>7*_6p+VniP%qP%jn zsfD~(!4FWp^^dfy#`)OM#!2MAINO~fl9!SRKr6zafo@wXZx|7G z#fKtdt~!b5y4(u^s<~1MVgE9KG=R*c<@#H$;+7Z;^E+fTquA<<8?RB>)#XzJ+3pfXO>%E`AOD66L-Wi~8PVPm!FHLz z*RX>-H(Uyyxx78kKWyiS>-$WiQ>TS}uyz1w3e4xo)xI9&cO}6OQpXnTW{O)m?SNT; z$q2+N0VAu(oXd$l90Z}6HSTHIk-uEvmZz;6D>!GcZC6d2caKP^(p*W4{nqmT`_Zho zRix9_R1EW~E~9Yca* zsM^K(G5%xi9oh>0?og7m%x`%RmYvwy372i!a>UEq+Cd&w8TO+9)D|UPCwHYGKu3x^=7yolfBDkdt|3va>Xz zu%xl)TFUdR$R;_myNRx^)XAcQr5wnoCO~{KUvQ&X zUEANQNT|O(4io0eD%H)GV17K>^nhY?E1~jyM@12d0oMdkp|dMy4WZz6gaZva{iD)! zxAJD(3R1bX$b>{lrK*W|r&Fkt&<%hY`miEwRjF}wE(#8 zZ|-SSuv~*y_jm)Zum23v_lTpTK-6N$WbS^;Mh4@R{LZn7+NtWVr3I==m*moo-BfOZ zWNG46ke29_mTuPN5p4;)JP?I3I}UAmPhN@I;LbY7R_<1fMF&juG%U}vy>g?#2meE9 zoE&bN*pMyu+01L>dh~C6dxpFg9iZN~hXLwy%c8QyC-?=l>ryh>+I6qPIX+hgSE(hq z)>gXv1hLB@4z=o#_)5i&mqY+lkfO?aq|>y|*$eMesXzNjtIh%U#i4>+y1r1LaDO3v z^1xW983wy>k&l@N>C{v-pL>IGBB8#y*;A=?7hx!zX!9nuWuj2vL8%-V4r@gkv${wO zN`9`sI6u}Cnd+{0KDmiFe|#(bYuwMVg^@>*1s%RMyo~jF8I_#32fRoW4O9C=&F87H z5w*QAnyMhyUXxZkAm@xT;wy9rGr~03Xo7$8);;O|zWN|lQJik9zI8Ox zCT;Y>yCn%EKFND(FqanZG$QwfB|JipjYs>TmAHns`mwj-C96&F#99^5o$azNC`A%% z-<0$L>F=!Y3D(SSgSY1_jt5MM;}?Eh$J4v^)~45>E7pam=w27)r?fM{jI3EM2SWmIzR-%{iFQOK+}q&`BIZL zON{0vL1wpD5d(&3a8}ttVf{>sfL695${^S2{(M(tJEt?yq2*Hzg9kZ^Ig%J*GLfv$ zZa3R*>3r2kj*j`jK?0qkmc?82dEcN@JFR0p``v#66E|(BxF>mR1`jp7Wt^21hf`$Y zJP(J>5ODTkeXaK#?tez%%9negpWpasO6v~re#MYV&V}-}Nsp}b#Y9Sg{JdKCOUhWk z=B>Wrtl-GCfxj~0B>#&82O@|MHl4$4P9vtY|IUK=WkewXnJKPDM;ESdafpwaXqWYM zc;&_vltcoA)ja8V{G&huE=Y{(#!$B9>W|CjvHU6r&m0w))>>k$Tx2knvN|~okIKF2 zn#tCjT|i1sp!BZEsF>M>C@FZia$>k7>xSy@wW(%lIi|QYOs^x|a3k|uB)~)*j^%WV z)fo21(pjXcq;lsnt&HlEHP!|3wzm?9aIhu-y3}CKq8jTJZ*9H8eEN=4LDjHtEJmWH zrf@ZuR$X-KzC=BlC<1pm9e#Vb(*j9mE$)bdYR6!&JIWpu-9U<)6U0P zf!Cx+Tq};anLy!C58<6(Qn|?9-)%n_J5IT@eO2~T-yha-wVRc)n{&V=cu9S85e3XI z+dlmUCj|(PYxQ6K?8JAmRS1_^;c|+)+hy8X%mRZ0j{Gz5)Tx`;t>lxo)B*qE^(QzO z!YzEi1chBlG_*PZ+G9+_Mme*l^*pty;gQ`s@?HTQsco8F4mcgjdgcwRRh2}o~kOpe-i1P2zePbbd&WpFxN4*!Xw%6JBtM)*b4<|X8?r6 zppv|@3&0YDfpe0rK^!j?#gYRcy{eU)fDL7~?;zl!T3N7&J2Q?-CG`KO4Vw#_K$yh5${>PExr|w zN#^NBx-R*>Zu>d=Zs!)m`t=#c|Aq|Xrtf)Zg&R39Wk$$F#Y&v`!bsEy{8=ng z*v>hrk%K}tR=uY?a92hYWpJ7y{)UN=u7dG9&XsE6p)25V64h-ds*;k~Xfea4{9ffp)RL~xm01%k-)7R$}A?qh-r8Q*5 zVSSZL#5FBl44L%Pz(fL1Btpq8dc-&5s(h|w-_;(PyRvj4`F%e#N`(YSRWB@;gNvm? zmIC05MXNU?I&X%(urkhv6Pnq}a3Ez9{IIw(A(zz20D>rUk>hQ|H*Ema&wRJtCC!~F zAqhX!ug`_>NqUjJ7e^heeCNPRfmXaLEzgQy68GBsbRnu~?NG9-6W-M_C~%9DoH9Z= z0xnXeMUQ^cO^}O zLjA-oU&A}Ay8LL^@0gvkyUuYY%uTA+3b~3ghs2un@-m5Xatu*o@jVuKRis8UmXne_ zcFhZUytF&dF4m@H2)onRfjryOC%Qxi_c4)RSiu)W1iaybv z*GA$@CuwIyD`(t|Fd4d~sIzIFBk*Sp%hi{jsVu(fk?UPXV$bSyRmM#zlnB#UUKDj3 z8u$tG)|8xa3ZVB32nNg^CE8SX2$ZfQt(r02Lx#>nS6rfHrs>AFL^Z40C(1-li!aut zC~MkYjVz$g-0ks<@uo>NxgEr9mB>!B43mhToiV)&xA^CwxNRJC2~o9&;!n3iqu_fE0HLv_lLF1-1Qp+QsUY9YsoQ}hCid_a zkVfDDJ3z$0J7mQVzF#ZX!wXdaID zT&hqE9{|+BXu(!N*vfNB0h1xah4q{~WhG-P z)ome14c;$YN(sHgMCLdbDMf8N_2k2J|AyOMQW-t%HM41U;x#BUxiV>V!C{(GbtMBn z@Fb02MoUE#Zo<941gf%<5E5ocywGZCN$BVGCvH{5qFNRhw%0+&p`%GK*LW8STAIAK zyWJODuU)L+nl$~Ole4!Ij-HB$>f8;;N`3qr+ngjyS``MKMSY-ZA8_M5MccDnXkqSX zV6SYkUG=>8;E3ASj9Y%pQ2BIt8t$)K_xg6IWB)yl%u%Ya(i;$PLHj6sJ3J)A$-bGZ zt4HM5w8FoEW;v51ciHdzf91zFD|_$A^IruC$rM16HyT5QJBF<}V3aBJAToKDam%8) zWVHhdB^}MULN;)}jSC8p9Bs{7Nuc==eq&zL7>@2bK}L)JDgxi+3-qU|J3Cz7#}iPE zuc;cWxWWctlYk^*T1%TUO=Afks`<(PmKY?2bmm=J&%NDMBjb(;c&uo51dZh4AuOt* zEKvWHdHAtNnlcG)%jUluFIxkam$BAA-Q>q!Fhvv7=v#&D-_{e}7GKDqHWj0tb>@kw ze>*N7a_fDk&rgh_?&zoGKXy4fi`fj#Yd3SiZcNJfHx$d#JCB!d8+nPBv)(zR z#gup#2tn&PoGf_6Lg>ym4Al&D}EnUD=vWT9^0uZ`Z+A>i5gc>%XmVIG!W%J@z{ zpt%c=+3hKK2 zt!Y3sjn_p@@K z_zG;L=R;=#whKcF3jYcLq&0{CWh4U?i_)tT#)-3?t{XJx6BVBz1eaWqJU_5ULMMu{ z9YW*;g##GbE$(1)egEW+qYBTam8aYyZvA={1AcY*p{Hf2<;JCJjF>{z(qrpWxECCP zl!ufHnn|!LA3@KVL0!}a88{zN?OGy*!GkTk!F0-lc1?kl49-?fclPD-jxSxMbZ^Cs z_?&%NPE8$wgRBfz@|=pAhw}gG^<)&NtxPfNGWcv!S|^i)V2xxv2iopkd7=U@120Xi z!&xBInp^esh9`cj_|&WtoM&T1(Zm*dHwe3?ztvGr<+)XdxNBFZOw%f5`Xs(#(#kzD z;olJW&oT42g)0of`mp;pA^*8X9s?6SQmC3D2inl_P*Pm6NSK@%Ti?<5uUddL^&uTEP_@eu1>nb-U>adLTBqZGR5iYI*n!q(WSPRU|exM z`N(}Z7hZ$A5zzCr)R;;u>|${zIsA62_y_23gfgTh#dZ)k>R(c{4Qg|(Xv_enNzuhO zyjfO{X&PT%V+szSYB`Hrk~p5+8roXwN9*&f<57XvAk0j9#$#)gxv}WAAG<3n$T|fdT^cHl$&6hv&6%5ehK!d__2C8V2iZFr}u=s@C zwlco;RI#G4BiDU4(IWhy?>OIBf~FC{gnS$mj2J+9;DOWX(G4*l61>XUq1!FBmyDMC zd|^Z4NY{d5{)Se^4VgY`Q32qZF6OvRfo!E2>wJ<78)SGATD%? zUydRwMzk~PsZqt8#8OR=H~q{Cm!`$UOenH<&44SU*Wa3Voi9DTM~^1Ic88C1er&N$1g$rrvNf)$`5=XEwNgedd}A6LwL-&tUrqAAbC)pU+*&<-tQhyrojGE+ zn={`#H#j;0l*99FK^}Q0B@||xIrN^y z6JxLkNS;6IDUiLpsQ&?Un>gih1$0Qi0T~TEcx{HJN9_2$kpvn;X|9V$d35h2HaTb{ z2-JqdZ#EBPkOY{iMNR3BGc(okhj&RPE9H{j1K4X9RtX^S??OE319E76wy_&E1UPk* zzdtF8$U7CloTx0dT!LKYnX35;r755kZ&31;i{s8ob@IzYurTT0ff6y-Lv6n2>@?M;$X6y7kBYElz=4SVJbRkqU<)iFd4I3SQO1Ae z&BmGW+R8Hl=Gw7dmA#MYp6rkZ0l52g#J03oaO(b>#kKo5L%w?R(3b$3XQ6!%;Q|oH zQ9t6xi1!)6w35cOMy5RM?Ck|R@pHeEY?@2D6Z`0?g+tH#A*zVpI7A&29KBhh17^M- zb_#zr^zEkRS_V&MRK>~u;Jdpvnw2yn*%BwICO8;->#!IBX!Fynv8o>7)!Y-ycsAMa zi*GS>qt=S7XemZRny04o3XBWHnzt=iOb5qZzfCM~lK-j}x(GJjF1xY`12)vo3&7ij8 zDE!8T{iV{;WIhTP!YT_Q}P)^UqLUm(0frC2c;eY0sttz&BuLO2@Y8m zTwQl<&35SX*&`#xAk*XiEU7pbNO&57_?B}h#;$emM7)HY|iW!7x7JAW<°&-^T`58E$-CGTLWZ) z>JFNtA-3J&;?-%!ln%DuMzj_2<)`M4M^F&Wdx7lKDF?c7wtt z4uW$ZYF8c&3&dJL5j8;t+8Ctl0_Eh|^pYd zsmtD-vuty-I}95?3w?c0GPLx~5!bZ5iBoy$^B-by#OJV2XoJo^aRD#ujLVhPewT{c zZw~t}Im7A)S5?IFGEgxE62eGG?Oi)ntv3<7q?v$(hGmG#IiU4<9PjSZzjwo}rEzj8 z2pU#K{qKD4-ddf_Vs^f)Sf*QL+f)WSU=VWLWBQoy;42q5s`a{r4Yy`WV zmnMj+Z=|R}xm#0+mD9QMd<1V$VTM{WOZJ1 zQ~{VJTesdYO$TlFShqQYF0Pv+V#r7@xOIbzx?42jL_rA#VOYt#?DPSKT?|~kiatZk z+4Y8UL{WvH=mQyta$ZAvBXEc{pKK@36s&uDgSeqgMxK6s6L30>C4%biH1+1%rP$v< z43Xh6;C5l6c>(}y$Dcuvv69`%V4kp~B7kJsIy@f$M8Ykt21dLV#_I_WbK=GEE0uy z)ZMWw#m=SrqwHsAr0ntlDFumdFMXx=C*g^)Hfss|R0n4o2_w<1iwAV)4!}71<5=4Z z65p$10j(IDBA8CDuQ+Y;AmbCcc*XJN8pbm3QqLmis-vEfG(eIMc{MeO4E%X;*pg%< zyWF`OWNFJJ$GM;ou4pLi#|8h<>M-tDy1Fka*PdjZ1)Z=majpI&i)etx6WlgNw!o7@ zCcEJ7_il*TxOGlCN>P?;m$y&GzdIUt+!G^Oj0Wa*c-5d<>U-SN-DmVT`kIq%$x6LJ z@O8TM;;y-zXz zEvdT_9^h&BvU2<(aGwsAu2S`p*{4$zo3UlPbxHMS4mIlE>to*p(L9#Dr9_FP(;^VP z>Dr2$G-JCm%d1R~EG&NYTPh%}b>ZC}>8V<5QM2 zr=uO#L8+91qy%GQ#d{I{pFWcKJY|?aAn0LnL=5Rn^xEk+dv519KQp(R&@mDJ+gCf2 z0lM^=l)Cm?GM~Kbdgt@?b7RfqLCdJ`!Aor?y^rPcJ;bKe1h4hJ;cF1(QzQdRgr^&TaHpZ_rP0v{((l7fVkVs1M;ln{eAx#j4Dr)58L32 z!2+c0c2|f8&voV+vLmtD=mtoobxbtd8uYlh46i6i+$= zkBvh$ucEqvXbTyH77T=Y{4n$&05wmu)G8=lxNP8AV`$Dg7_(aCR6zeb%0da7-rzP+ z&F5_dI)}7$;Cvc!(mhX|_bvUXGHO;_nnv4g&3(fBw;W~4%#yO#QXQj7hz6e6y}7*} z&K(!=)*(;A+jCwQ(wmwOm48bJ^W$_rszQF_ygv-G^9ouC_>0ZyP7kluYj#*lpWxy9DByiS01Kc$)5L1+3B@+CCLbVl*rw(9BOk>6uR0rLh_Z9 zvZuE;uG#1yi@aFKRjZvG>S9uvrKs3$%yhY&8HvW8*2x3*r3%)W(I~@^B;~W?MzY#+ zi*WZIp>nw<`-gUeH*rk=LkM$-i~UsD=>z6zq))Vd&>s1X3ABnRa(qeQb1e^QL{+nh zwol9`j%Zo!-%Q0%*J4RCGR9C=I?)AUJEMKSS|i()wvE ziNizyT8hH<2nN2JF2>9P9S?6<9?3?(q}y zP1lkBS1i+qIbPF#pb|2%?ZXfTu_sS95N;qpp8``e`8IkZnrT&l)b}LGguOd}^)QYx zxT(~IzHBqv`v0;!uhWg$uBhpl_ogSdMP+Yz_-K_)Stav52p6)Mll{IBi=p{QWLE0*4+n!w>yh4-2W>ou%)8@hK7H>tVuxuSY{r zyrT&qko;nTK?*L5bY$za5^hSX5n{qZ`h?R(S`w6^DyaF?Qow=|_Zl8|pqUxq0L@*v zgRE^7uI2r-e@PneA|Ltj_ccWdQreS^|J>u}7bX>^m%qAxT&yTU%}fzgUe-m=orSu8 z`gUvCYLA3_b&XIEI3D*aNXQtLilLX6aaZGOgQ$$Ul{#y>Z)J$HU^LIGE z5}jdLhO8@X+DwM@>n)Tqe@g4O?)&dLESp(79^EKLglv_C`WJy~UT>_F6A-48hzPGNf=e_R{nciNYp7(p4X3E5bXJK|19z*FWg#$#pX8V0_r-s4Wz8F~XYVkHT)|6M z9j<-JIiz7(5HYHd5(o;iHR)R^O{Bit`3iXxx44iQ_rc7xrVTc%Ax|kZWQ*vP=0aXt zVCDW!OZu7U9lS5}RP8Q;H|XKO2sZ z397&*?4ZL}1gw2DAR|Qhzk+46HWz6zmghQFyU8FK%{8SDLz0?e2Tki1o%L}qV<4hl~9 zY%|8U5v$MlSem_zZoXesI{*MR1EXh>yfG=YOA@`_=N3>2LW%+v7cF)!(m?p=4FpLv z^UkUU!M;t=Ur4Ab&Z37KR!^Vmwv*{nBWa0^XyFza16W9bZWRJL3u5XG+{nAnKpoCC z^fk4LVBl4~Cxlw{w~X!wxp7gY^6^njhdPTR*=UY!X~m?|x0*^yEI!QQ9~?T8Vba@m z-A7}CASDd1F`%|Ig3L#x1y1*^1Gdb|jXc(TSJU5=x6Ypusoby`NP#+kxK4Jpvy(g# zXz~TFa$I!%e5J<}lJlIRE5htlllR#cHHh{LA%ytEQ{AB)63M#5rPQ3aXuWOR=pHMu+_+qVDb&ykO#(U%W%r)`|N4=hVr*{LXumb{ zuFUSc;9D&`zd;rSadY+zT<5_VU0Pj*oY-*0pE}$0=8vWvKy+`RyP@05>`^k(AEzoA zX&l?TehFU8>QGN+f_Z^MS`3pgVS6POZax?J2108Afu?u(Rw|L%vcsO0V)tC%7cUi+ zDGgU|CD+QDptfliTF{|-!D_$-l{x&&$jiS&0j$qsQgo~=XXHL)$S`H-KvDWb@#+3G zRdewAz5G$39r~ral{$OFdcAVR@Lo1?%r{x+8c8Ws#BwFZJ=8CdhFwogOP@FqQq{3q z>CA1fzjXc&rUPU2{-{RTB3ADHIfa596WLI!`si#Y=vGaGvUI5v{SRWFu;>2Y*`!Lf z9K>&H3;dYAd0nICDtP98lTXn90jQ-YG%O({xMm6B>+h$EM>tqy4N1%BO{HWrn2Y@5 zfZ%=QAJSnB!L8J-WWJc<@vz*I*TZODrZ@GgU~wR+OYQsATAe5#X^q`|@dzmu=Tt6_NAI_zOt(Q2YltxGbk*ZgtbN`X z{7BG_8=QI=?#-tAD7ce!x~*^8dE1%@+>&y_bggJ$g_3zTPc;AU`(4aiO6>p0k|jJy zt$}P109&A}$j~C3b+6=`-*GI-X^UHG;3OX*Gl$4z9?$G2f~ze;F^#m-D<(5{;#79^ zKLcFZW3^ztr7fk)LAuR9rdTP;Bt&dcp9^`Lh%q*$;Zeu63nSMT4#kz*}kDMXBJ9atKEUlK6R=f zD1rUZinb7#Y%+yDwwUSp5`aejdIFIJ?H9Xa^DEZEiKF2;6EHbWs@=2a+$}2hpc~YD zY&Uf|sG!57%E!f1VcKf*7yh#48~?|*H*Y8<=^d+cRpeE1Bfgd=258TjLksVFL$7=0 z26#F2;*bQ{nXcq>LMWH>wY?bbUW0hM9Gm|e>f(oJg5N8NpLOSv?gh5Y@Hx8=ml#QT z>+;@a-6I5{p_SAPl9XY|5_9x5`;x0Yy?Ty15w`A0j%bXrTGL+ow!_VD;7AP?Wnx#b z^O_pF+1QayJt^nQ!~}iyvEzH4ljs4!Z#E2YX4^HQ9K%h*7QUk}xOK*wl?Ix1^^YmCXNg3@sXf(R z139{%Irwidan)W!XXM@ofI4Y@{^^cZ!T5p-6!V=ar3VJy0-i>ZUpd2Geo37}-x7P` zB0SpWmO(Le|E7T2_`5a0B?3eY@zmQ2mx`|E{yI9?kBF4Q9KU`8wk}w2(3Dg zPDS0vKEXrGqOfDcM&@C1{07MpKX}JtraviDn+g6A#Jh)}92&)T4V7-Z5L1ugN z3c$o;r&GLm1KaV9{Cpa2S5ILprUf@xhU9KVf;_e|p0cZA&b6;#1Xr)>mc97Q@KnB_#NYJ1awfPu5K3qCKkNLLnQ(>^r$=K_@ajSL)LVq}c*;ba&I zKiih$J6l~9kFwHP-bSra}h3;+v#MBQ7LrIrc2SiA>i z3Z-o>*b3c(z~GFg9B65-o;yd-*LTd76^fTcwK%J(3yu)DQU*2J(M*w^Fvj*Jo&r`T z{xBZ*bAv9hIF`{G-{GFVRZv5tK-pC8Ot#6EpBF6TzW1>mgt zDFbDqt!^Cv)d>~x?(S(ck^26rs2*62>lM;HwxBoYsGB`I=imgcU_=S_ol|x=xUHuE z3EYy#3nZ^XuVCQJ8#BlRob5PzSwT|xcVS~;779+1V;NsL-!zRH(eFn(&!nSZr!GfRcK4Xl)b z97%VEp_3vPo0DRuji6#R94BQbCs`J>-1}?J>?qVS-!HlxoTe}Z5s7Qwv$Chr>I*#V z8k3sTF_F9TBe*@ixu7AhKIquLq4O?g2q=tLu69*iYLk7yFo^uGZ0V*v@V~BD#nMNW{4^I%8V*Ve2nWa(Wr zna~TF5S}y6Xk8LUc%S==6F0$O0{8OwLtR*mP}Av!uK&EXDngX6&n*QARb`HvHPq=G zPl%o~c6XS77nOo#B8rC_P5Ul;p~#onfxYLqxfKOh3dbu;gxnKcsHZFmtXduRty({d z#0z<|Q$!AA)4jRHWO860s!Fb%s50Hk_6GdLb%ZHOV+_o#M`bR=Y8+LSmf)^47~W4L z%L7&2N^VnGY;1S{xaNS`#wjYDWvOoOz`AI@O7pmO8kgW=m{}yMvYotcH6Kw z<|kiPtt*n>jkV6yc#XU_=+ojMS`%Iu9VN4Z`Y#R6he2tKew>H(eo%FO{(~N)Fbz2cWPWl-TmvT!=tU2VO__jAa&Umx4MjAQo z${aCA@(jhXX#e5LxsEb_aCk^?uhYGleth{SE!nz}O6NT&_cCJp@NZE-qXcLJW-5?N zRCtx8g6akP)50Jx2ttLs4xsR-B^^I4SSzhNkKKx0Bx6gYBt<{XXdsw~DTEPa`UBx(g&7{5ESH0Ees-Xp#z2iqYL9`2g zpN0HpL2sUpVn54M)S$f@%7*h;8Q6#&A_e*+1i8$?b>jS4WZ;@UhlM{I3D5}wtO>>x z`-u9g9n=Up=S4!=ULqkE;1kw_m$ez1)@M)wjyOL@^y;?4{E=;;(x!=2w*SiDg!Gx? z;kuNd^6lkR4?v*O@F>3z@w5~m3_gk|QRmB^^cG`la6aFf5gV)@ws1dFMlO*b0 z1$(t>{v9;{c)dc%poB_aKOnWJ?Jrr+igz@n!z|yBcD4zva6aqUf{Y$mhi(9vo5(KE zd+ALbQ11V=QHv32nJex^hcI7T1t&J`FiaD>>8I}Z zB9=fJZxE+bXQ{O?ByeNRK03$?BSu=w*LZyXUvD|^XSsO_iUL{)qonx$1jxlF!NX9K zO5n3nj+^nOHgfceO1X(|Qc zvYe#%-&UI=jH)EdN#N1M2^D!uZSIXf+ZQI>WlR#A9@LXCEeb%6j0RzNgBX>{{BCNqg^P zNk^-#OU-?1Rz7P->A2<5G;iV5b~_3Aw200rkt8A`oEUi`uoyzol-g7iW`mm%CCfxd z#6&kl?h0V*6*E#}?bZgl9TK3`VRxy7%H=%;Ud$1Qm)OX|W~8z<%s=s8MHNhbBlm=9 zf(*1QC+Sj7-iZhck4@0H%{BU!u?O!a9&b`qW`^}Va5 zM?G5;nM)`mVqhI!p`;xk=|@>aAW34(DS~q;pGtOF8-6q}h-P}pVqpq=j|c7)<6iZF zY%U|lHcPzDBcKpa9?+JGQf4ld_fGC^76CN_EC#f2$>3fXv)h7$8RPK zN?P#6g;M6NU0e{H`WG89vf051T$SVFX+LCns9YY5k(hszzQi&|x!Qc#6VDE}{9v)5 zX8_DlF_43$05tf^LK_|v@Zg+)iSiO;yb3ixiQ|V}2>OeR(bki?wThUG1^;vk@}Ru! z6ep|!iBD0PU>s-5L~~tl>$)Q1#ELwwK)f6!;Ra=ce5p04O8PAJ82ine|*<+qv`=^Z3MlmQ4+1(o-va0L`p6mm7qk!v2?K5w zcc)>#%qm0OG_vSyx-gxx4ez=Fy4bQr*xzKMS_W?)>Q3l*eT|AUpf|^+cqCcMZBdv> zvvJJMDwHQnQOH~FsCP63oVC%;hQlG-<+mS;Y2mOqrNdmZ-O`4%mU;$r5jL>JSLFINEr4Nybu9= zd^o^lc^C1+-uhcd>##f9BwA7XOs!IO0Mece&bwQB-km1hP9>-w9j+OLrNAYmbnX*q z>;|WA;S{%|?*rop+}Jimb=K{Ak%Yx1Y`P@M2%6dA5_#oqXF=m$%rWZB9QD19BQK#UmsEU~vhcx8S9!se!DLS466Rbll>J+0u z-?QwMwMUg?P?6R93lL9a%_A!B7k6KT>!|*dE43i4`R16NZYw9dk=?8okXrkQUu0Y3>(?lHZV(zw&nY=whZpMyjz~jjIkcinSF(| zTsuD?1_B45Xx12o6S%;ju3$FN*oII>QCbHs4Kk#Xak7qQhbpaQ4VUMW#S7XqgQ`HTRMnaFEKY(y!o6ZK2cFyoZ*t( zgbfZiDH!6IQFQ;-xL&5Vr#%=#fc=%0(f1N^&=Y@eYEV}qBug{}NLUiH->gb`uAZUQ zxF1~+HV8^bvy;h-eGKy=k53SDvtqAbjQlsGl(7n36FL%qoh;36uHC!)x!!a&edL&K ziY!O*V6f9-mGGH(tdXY6`aFX7_00;HU9cPXw$L7F4V*H6q2%az+ZH(4HTppc-cae?EdXM@Wez$k z+fK^~C2bZh$r$fHuj!8QUtnibv@v${lxC47y91#cLO3WF&2OZEtGu+MTD90z-m_={ zKVr8se_S&%=Ph*}dSP+SB}%_XbnOh@y;AZCW%yineyPpMeg8F0AUipNJBwUIHK&lf zN3IKKhd68edAa}-!MzjRfwN=o+2B`iv!?mGpaxD=AyLGn=LCPj#Ia6=!VZ*4Ng63- zo;^5yJDua|IV3E;fr#?6e6x{j!BGJxCV?LetyE@&6uG3Zj)4yagDC6;j@|8BuKL38<4J+Rcm(5@qw# z&AHhFMfV=AXX3tio|_<`r_F*oh7t5{A1vQI-)r$EmU?K+`3$z_=ypqVqFl{JXh^_ibQW_qtC><}v>hBok339~sX&4h3qP zty9W~-p*yhIXSRWU-$)=hdQM)2j2j&2F?hJ5$TG_6BZocWC*b-m*UGq>EkZvJd9|a zqf>;2n8so1-uaIh>|M?g(G6x)!Cp%`L_F%OB z@5h452SX4&=sXaKulW4E>%tK;s*L6mBr6Bc!b8Hd1PV7_nTF?Xt5{_aFpcJ13G)U} zpD!Zmu)TVs9Jb`9>p*bo(W$UjRah`7IjRTgpbxRA!yFi-K2T{*#k ziFAVmkTDO8YE##4Sf4ywinpD{t$Iz{?Bp&(pRa1@3*CRJXLHS`E;%8~6aZkKWVKlz z+VTd<4}tpCtcEfKaP#VgFWYzzb8UVv+x60es}ccN1MxAz)Sx%oGwH7^gd3^yHGM1q z0oiD@F*SFzDYcp9wR!Z$B(avG6+gMmA?~p_!u^gGBm8Pzupulc?HrmwlPdXlQ(Rf=Zv0BRMAC=tPEeXYvwYijd$P51;sO_ z6TnZI+>T8YRNTT3IziC3v90bU+rk$f?=i0s5K%&K1ygE3Y*A9oZka%@Sfbj=NPg}! z%6Fd|t-cUi1cABf)rS7T{Wpp=zp=$ItlyLy>vjqSyS~q+ki*jof}#7L7?d@z=~>U$ z==w*-CqHJ4^=Rw_weBpUBB#a@hO@M$E#&DApd8x&RCW|ZgyowoqQTIpb=RFSLHlHR z4qd)CYHeyPIdWVD{Z>MhqC1;{^LTo`;xm6h?nKJ}r?2AxsR4CYjPVUEPOX*{JIi| z=kt(4NmNSkB7T%g&yJj^FC)WIz<^6P`u*R=OyD~FG&g5{K143-NXf$QA(qSE1Zv12 z{#!T1d{Ld)!RV}h^>k70UK4`9XXAswdMoze@DG>Qwk& zm7GCYx;JY0Ne(k#AgYqx{_OoFTv*PShiHF?!1r)~^&q}m5trAm8E4FP+)9=c7xdPM z)!WBCyqjg^F`8AQNv!jeQ&mbhtuj>*w}ahHW3$?L@5(ywMoz{Of4rPy4d6ER(1;lf zI;LOH#(f_Xc$nsFbuk7*m5^dmkwX1{%nuezaH%P$&N{o4!lI>I_!g)mh-5#42sQ~7 zb()rEvCPL(GHMurHixwvS2I#}Br=U@f=4znxV4s2V+|+~wV`GX_Gci}9TH|mO@q@ z{3IVgf81#;NoxvHxQnHNywfB2>%p-fhKQVa&xu{cI34+qiK#BG*gPu#_efBZQaYon zGlh^j`MZ_}Z~!ruer2LZSEOUd>T=dJlyHx#E9o+f%QW%`hF*sZxZgpCtYYw6%N8j7 zoN>aSK}#ZMI+G7qb+PEo^zs14^q7j7w-D55-xF6(PDTvpKQDZl_Yw=#)f-4j%z1A(|^TyB~kc;hgeH`IcMiUQQe~exUW^|77T=jR((Sd}1$V zB_;12sK8$RR9lB8A@pe;cXe8Lz*uRm@NE^z`2941zKN3)T)Y8=QT{^+PRjm;k}ago z&bP;>D+!uwf+fo@njAjvc4)nxc78PLKoNy0PWA~;k?&!E)L7X(l_YcW^xf%dzyj~X zUBTrmN;s)YK0QfiE`BR4uA2ddrvkS0Af{sU&IYg;^(Kpf{tKh(80z6a_=z8M9Pd5L zw_Y?W%5Yr~Uy!;e23QEws&!-z^t}Cf78G|RUSF`E9d#4n^!5z-xnW7r?ZPBH)C890)!8$o|B++7v)Jsh-;XQo)*J!mc zsEB7lOlE?vK%#7EcvJ@6?Bx%ys-bF%?r!TAY>Ji4ywXM7EM$OWE{k9$ZRbMx@_L-XeX zo#gz8;8p+yp9&EtUHm;5IfiDH>XGg7k1qfW<=TyKdPV zie^}g|4{`BN;6S6K-}Iov!$VtEnJ`}8W?)~lT+zvkx|_)m~o$|(J!i?X=B_zP5PcO z?gGjXk=;8;U^fRLR-(5|2i2YLvT~tI623|Aklba9l2S!plp*{(7^bk*(@uXTRUPnJco1=0WvK+I6IG zIBa0PW8*6dhmv+VsAA~}FI{nMN)OcpE;;=&xY)Bo9 zBIyj8Lp8Lq-GKFC{PpjmT+E2Mr#KmrQ%i*kJO8LG=?@n^LIfWUg7un(p#8aJ@$zw3 zio1$c_tY2IpaFVl{4^E9N5_gZ|VV5p%xD~^oq{B#N zsR=Gi;GOCiwx%A50`2F%mmT04nYbtaY)DRBGU|_=eThuiNo$}bpAh~lh~U^574b@7 zoZv6b*6w*xF0!HqntBGWbNxleUidRYt)d22oW_{)H(B@c&be?IExnjL5%t>~k(MHV zYqRQ)%S~5;pi6^U!;*D*qezp;<+&ZKeuBTk9Si)9JZ@z=_ZmsvF2vhneYh=DO%L+u zQ@N%jB&p0&Gh2%<=QZqY8rfVKRi&a~nc+AX3?X-)k}kJFRGi+w43^yaZusXaqdAte z@S@fS+6GN>1{+W=kUwb!1({RdY@LqtXy3Cc9=VRG(6bR%M5;+EDd_lB%9AQ{#6Ph{ z>`RJ9h^IJ7lJ>6yzEYOcQ;30b3U`a7%6_Brc)Xjc{+e;)GzfHPm|*|e?X9P_2yAGc*NuY9ERJDm!jajV$F-<(gty!bhYJ)p=2 zX5=22e5>LV9|eRNE}u=^20uu1ht91jpG6xbs?ai_qy>A8MstpD9V#zd9sNzg39&#F zabowCVG&S=Ck`>;h3(Xb)X3jvuxK$h%G;qLO%LzD?j~A)KCI_Kp&L+JCU#s=qdQ(3 zj#8kEe}%4v*k`=zf@*_1BZY@~rZUi=`!F@!DVOBKS<7zHfB}bi0De<;fGTZDm-|EV z4|ysiL8Q0or$Jo~iA@h06pn-{$xUn2seJfJKaZJc3uwCZnwp}EMsoeR3`ee_ACISX z48Hs*-7M|W(7+-_eo=8)>|59*k9JSJMQuSp2$P7QBy4SJqr6)XC%?>5(c);>sSaaN zx^D;}#rCrM3GO-;4IC+W)?i}rw!ZjaIE!QVY*ldQgMo5@Am?`lG(N=)!^{3(WjyMd z1}3mwM31~w`Iv5Udx7={z(-_i`YV0`mA|PUJE!l1%c^=Voa3Wdw3O*I)-WwEFJjsc z$=`1f>uBf7f{ArBn26Hl)uwU)JwU?0Y&^=8vgB!xH5)=c&N>rQv)y93=R^^5+mHCa&f^MyT?jN0v6@CUVpjEZb2SM{J4RJ<}(FiYeD zt=iN&5na<3 zXvUM{45j8tnVbs`fTDnSRoc)Df#t-Q>W=;3xx6~#t(wgn;L>04-g-OG=+8Ilrx0DV zQ16u_r`#}l)ds;n-hyl;i-F%AQExRJuNhQveA~DiehF2~s?sB72~1!L(8}FxY~}yv zZUG-on#Wg^31jQ(0%7`Gh}^@O%+Xg@#gG@W_ImT-OGK!yHfy7@7<$f{K#yOm9JG5% zo;y!^c!vRi=8(fj>r&FP9-A}JP?0!;w$58MA6|?dKw|`xf?;i+h3Mnbr${fgnIO)eYb;l z+qNgfRjOKAg5DQ!-L)4CzW1Yla>{56@WPuXG{e<})sQI{+IEIqASC6T)pPr0MF^#<^x7 zR^rw)C+@`T(9p>l5Bzp+V-M^({CSI20W_5TV<68OWV1ivOmunR%Gk8&Tf7oq(E~il zFjVk(QM{Ba1XGYpjja)}PJeAeOch3sJZ5>B{7o)A4@_LQf=q^OyzkKc2r*6Ui(o45 zq62xGgN6(LuGKs=SfB3D6=G;_sNPC+4M&q4A%PM6v_~X6$syVX><8`n zCQZOoE`t1H%6(%36~AEem38J0F?zUb(oP3;IeOajNnY=5$Wrt7)!j5gI>#we}4 z3CL~d&q{6HjHV|#^LU~w|C=@Il}Zy&rnAba))CM#`^A)Y%N3Y67}$}zaK@RVr;{-7 zt?s2ZLiUawAifYy#cG^T)eYFg{jBBGf$;5 zbM_-h5OwcBPWCq-0yLkYIBDD8ZXzyTp26u;2DipV@Q^Vq>MJ3L4P)&Pj)u6F<5!teTH zz%1P~xGB6OWk0r2vnxXq%Vk1HqNV7)S>9f-dhLVIunl#0puiy9kdw^m$oJ=dCRtpue@kR&ce?NNRoFE(s z>la+xIb!0t$;-M!J7bsE4(?O)_<|B5#oC;g){=D(q`YfZXzw!WoGrj zrv6{v;$5{@b+K(Z{d8et$*;ree-@>7Rb(GjF=l(L&?lch80}Z^H*VhmUzd1TZ+CD;AnCmaSrVL%{v+kVUIc;c?xd& zU0BHn5Vt|%A!(d?AB4&s@IenXXQ^uXUH{j;&T2e++XqjYuoS@Dh)O^j(I`U`!cuXT z1$*cfMuk8Mqd@NccISafZTteNIV5u3BmsR7PKr!@6l0w+Zi|zyjJ0tfMaX~0K~NA? zX9_6(nwCfs^mLTmb()g!cxnHG-7G)qz~ObmN%7<}G{xdH^swcs1h*7g7n}iD%Ds&X zd@~MqUV87YqAzs2PjMAiT7)8`r2ig!Ha89s{AQzkzS|43WgDi55p)db4_!g4z@FSo zqr_cUSfM>?JM74`UGozLGv}8W&3vlT8>=q>rOP3SQaXKuA?AcrZmgm5IE;L}A@{(U zf{IBgnncI%cG>_PgF#ueG{zSM>4HY$pUpPDJ_`0JnVmz*gy6vGfI~-@*Dp<#TrwA) z|1Xwg*iqz>U%j3ul+f5ci7_n+5Xq&U40|25F#yp}ckwsqcF0aQbK-W%yhkGHBav?g zX3irg1Q8}&aCqtNwZFx<&(hem&sQnAed>0uF(k@q>9S5QG*m)QCtThT3z13(zIB#8 z)E@+FK(@)P2)uwOq8FleRJdiO7{R5L>-}?nQXAv~#;jOS7oe8+B*T(2)z(H@$Ix|p zRu0kt^0L5i@+GYsK-CkQnCaS;qNm}dSZ$KE0YIPc=X=`Rfid~;DPyO^J#)7+W7Awd zugWj84#A9)ijqsE&57x#t{GE4V8Pupc-k(oy^AtSG=d7*@-KF1WEHIzQq}lA`=BRomVu$0!of z|ClWLi?bjH>S&mSA=dY=@a>7|;W7b6fO}2malq&1MqOk-oI4Q-HIk@tvIM}- z#oXU>=x{gD=Qa*go|1hl70}8c;~7cE54=$25S)^b#0iC!862o$;mwB)TR=#ql!7`d z>zHcsM*s#NUXr%O_MH&X@BkmcbR2MM(?uiGWX>b3mdKE4?mG^&XktuCK(bap%*jyi zH7h+(IH44XRGq8=qI1_5WaJECS9t8F9z{P9Y0T_{X@8Mc7`6_hEaSj;3Er!nQ3^@e zj3Hklj7R&Xlqb?*{Z?Pjm;swEP$zT6p0*x;B!S*>zPI*17)JntXw)EUHpA|3xx*&f z|C&rU#E_=aKcQ`UcD3B8uk#=B=m?b^k#dSCpGo2!N5%dnvaPY%V+DulSt^-OH~3f- z3BD{3GkA=QJ<{6?(o}2r(+CyIcP{Hm4x1VW6u4vJTp9_fh;5dVPPWP^+F>;GLOB*9 zh3w@;^haK^SI-JsW})hB9d3{LA`xaf?Mw|vjp*6fwILyq87OE}Uj$@x>fBCWr2=|^K*nL9p ztY0>{Ci`|p1oV&D#7tnL3l(+LM`{ePrAtg`5J;jI1tYTCO4ruz&SMNUA3SyvSU2Q` zBh@n?*&Hc?Z@y@v%oF?DqYvS~kThW=HpOnKEH9mFzST9;O&TU^IE$iVLP>V7r!ZN@ z!!yOIdoE{}jeI17Ukx1Hjt;_TAT!CR-5oar&mXyHg;k(;P}fu>geUAV^FQQ`HT5Yv z$}Sa8M_y1Fv*Qk!%cd_7{sv|W_-Vi|AI0m5{s^E)wPqBgo@YcX#Y5+f{tg8^`;=7= zHXoW37^k{}%@ZW*ES!e_un}H`sk+e2gK|n=ojy8=tZ?08$AI8DR+f9UKU5}7%tIcf zLOVN^R9$^8kaGkr9isR9UeIS*;NxfBjBIxeu4UmP6y45K=!+QkWg2Vu8;Y!g z@inhn^B&}BCdYz!vid5GMYyA@YgA@}N42i>ktUToa9WyG_xv3!0XCpQ9b`@iYS7j_f{3q(w!w^sSn2{C1S&BC-84oZ#os z;y(4Hxcb4Ny!1VbAH&kRyfIq!n&s2a94>Y~$Zqon#A^9%11}~*DcAhDJb`tpHr#oi zSiQyRsp+xL^VtO!w3Qq!V|sj%x^ZNQ)Rq4C$S|8=0gYgpC)ze)r&_c}betcJnGoxzh`Q>Jms5o9j(TpoVlb^i@clP9{J({>Y84;bEdKF1Znl{Gi z;U2^}@(v^APha_^z^Y-|=uoGSBcj}EQ`Gdu`I=YB;uc$}F1~UcMjqrjnDCkHc-;bh zOq38XTG?KAOf;M=TI+BWXbTr*!NiK>ZZ>*xhw?C;Bo$yn@d$y1I#lndihZS5OkOWv zlE_%S*8fGMmaca)cgAXQwE|@VYa)BsN)v9`V>_1}VGvv{VaPb1l3&rNxTW7NO*rZ4@Y4 z?DzEhL%+vh&yiS>#Kydu-L+--c zJC@Ddu6PIRGUDp#QZW%ygrT6~h@UtbrgJW+1#ZeTdU*X~r|F-@3paf)vNOApR$0wN ziRrUoNO7>f{WEk58wdMxhDj;7`KVLWl14{AcQxe2Lysi|+29Q4KUccqvC&=gm2c|+ z^-g^xIiYBTT-xv5u~ijWyXei&%vO*HF;y1#qMv;%_;ha2`zHza5aT12xd?+RHJzI6 z30cF`4$mN8KJ+6omgG!`|K5oRch}0|-5ci$e@rlX$lTls&i#s~6Jt1BXDgYPNn35b z?>gvFld|LKl6;UZ=<=@_oln4z;}2_37; zM$fc*g4R^CxTJWqV!`R)6%`l9e5)*~d^ydZ{Cj&{0z(&rm|I&i5bfa?pA9s8=$8Dl z_qBMp?&)IAZ$hjccaqE;J^`mx)~nvEVfo~i^D{k`s)!m`I_Xdy10J#!YVSKFRV|Uz zS_VPi6!hilCGIrzkd;7%B5qixz0xC4j`jme6HRXFe@w28zKJ8cwPZ@omi=9$5rHEE zGWA`5ZuRc`Yt%`q9=`~foRAs=`Gh9{GkD;!+$iQ+#9+Lx?Ivj;-*hPxc;X|~ZXPx6 zzKi0SM^-qRNu5n5AT1(6*`N6HNWIYcuf$=kLPF=dd}sFjJ~jZ+oyLwnY>sw$a-%eNZToBqSLPo zN|4$L#Ma0fxY?`ZAW;hCOOvag_vc^@1R_&%bN25LQ^;|MX8r(OTqullV zjsF@gNmH!VKX_wz*LJnk+LaIIC1yAs<&;G;vm)3u~B<;h#LzBabOXOhps#S9s& zgfIe=!3L%gk>qV`Z(W#_wGEzdpK+V^P8I>DP`wTAxhEJzZkBW^Xnbu-C7v5HjzgSi z;;>7l4}*6ZUmS437A;^QWL$RNP^X8l8^8>JZ{ldT8^|Bhpg8ASjYy6K@CBiyH1m_) zX^+&W;0ax=$8QQA1ukDfOCBJc|88j(NzSOk8H15VS0W=-y8Q|ENw;=7c>BEg0J@-0 zMFdeZi?m{BSOxdFl`e5Uw<1~|L_6M`Tn&^54hhkyTXK7%_cGf=IkhhtcSfJrO;`1MqtF1L#G> zj)lcRQeUA4lZ|-SO+Cqq@P|1&K3j%$!)U{GEM^S14MAobfRQ;aY3-!FP2h3OKPV*D z7qh5$z>EOdcCT*gVJz13ncZO`7!E~HuxH=TL|nRb8gj$SPMlOcf~-V-f5N_%8q3W} z(*!*B5{IPO0eo0-`+7vrNzAZY6maxeC zAgBzjcdDCU=(t3g0l|&*QM|y4QOb%UL?_)@`W;wLQj?|T=aR>>f3+jHkowYszkLy| z;uJT#1gg_D(z7R8%;~bs9|STm9o9;w7V+;%O33{%A(=zSY(QHOZor+aHwfXDql7M% z$tN&=TaIi?oN&5lJ9m!E6)xXl@+x@3alvIZTY9b~w#?hv?hQwi9}smS)-|;1#TlIm zz)VV!C(~dMkpp%{@t6rD5oVEKZ7+EDrE`0r;yq7}TPtNvyIdp&8{Vy?3_br3x7fR_ zea?jPF-B6rS0;FgT#Y`Mf4u;Wn-;{5gV*KHBCnbuJ+(QTRQ#OHdM0_W<63)M#UBR9 z!bhfD#xj3qI6G^RXgB>neYxL!7LpMfzms~VBj=Us+WEtUd$S+|`SsmAco0bHcCj!F z=i;y}66`2VH@nHPA?@0-Dc1ofMc7KyRTc?+n z($XzXP>zoZRnH$9Ht=}x4n&f|NYK9Dy2JRit+lWuF?X)O@toXf+Q5Dy$^@m*{1Br-qabr7%xQzbuo zSOySeT(YGAt`vXYU&apSY zNRF~NuTT5NP-EOZGDydskE!tr@*%mHCer!%u0;W*!!1vN?p(ZH*X_u#p)YvRKBcjK zaJ)6|anDqW>#1wePVjLSsKu@Q;iv4CVdLuee`f-q#RcIQ;wo1U@Iyd0c9|ev_I%F6 zHFc%>L9_izt$h82#O80WnJJi%kB@i7o_MnhTFNqLF}#`AX*;s&L0IqUx;(Pve10V5Z&IYMF!b1 z)T4w_PJPm~0*}Y2eedJPUSisrye?WzcO z8QYOlq^R}hM|QcOXRG(kTiahos}qV`M`s=g#t<~} z?wnjf7|K*ec3fW4=!n@8f!w@&7rQC@+eEJvf3`zjiZV5-rJ>?>H5qfee?KxJo^AjN zlPQtW#5MF+$dZfa$GDXGw@*HTbdwM!f4qc>%Ex+Z>l>O1p-aWVgNK-kmDI<>IvZGM zMw{nzJ8mtDsT+cz47}xAQzPmJIL;_uNhm?re+gAh=GlEQW~O`KBvo}?O1=4rgwFTR zmVMZp5_l}$nm^~4X1Nu;IhvQr@b=a+#no*PfTvHo0~bqGEYYjoQv$G<*F8!_ z6Bv28Kf(Kvo|ggYfD_O7;EfKHt?fD)4835d`5t!7yV|J|<@9yNH$UuyKf@8*7uHVN zc2$c0A;H|#lp%}&JDssBqq#D2_yDJ+OCYy^m1`9$;5(4%I2f%15)5qWji)t(K33P? zv_S^9tY@rKrB-4#F*41YIB>if;PD5=M*J8&ePyXzwje;3R9Jx!oTVu1Hc?YtlG2O# zF5TGiZ4nld1k_eX}>yXW>fm|4mOM%7&<(%@fl&P{GdSV=KdOLbIfuAxn47-WOO*+ddg zT+8-A5%>I8~9T1utRlJbM8dR;^Ee3;=sQX3C|HXasCpbD~Z^(u9P_VRV}Qt?Vmxk=WIiZC6kRwR4W z392~_yfqy~u!}n*32-0lf0$@MY3_D*+zVfWp(IbM`dz#3B05Ge3npgI*qBp?#f zn#AX;sLhrg+crN?DI-d!!xT@$^WtUzjtbKu)t`Y#;8g1QudQLw?z$n78p_5aao8b3 zx=tnUOcWB23|uZ1nN&XTvI;D){U(m2RcBMQKu9lqz9t1k5olJYX_cY5h=?_h$lt(9 ztx4)1-ozp>o%vpR->e5gO;)oCBSC7YG^S(Xm9Xt+W1IPqW#BN(J$2-ecShc?U52Ugh>3$KYZ>e~@(k-ORTLEaPK&XFQI=wNqf z4bOLK>yxA$Df%7(pw9bs>MKmphF_qa+2eAOZqZNB(B?}_J9B~silBrdE}!=C?S?|Q z{Jo?OcFV^WFrg*Jv&_`J{Uty%Ujd2~q1*_b#5l8Z#mO0ti*^+I0p0|}?N&!f{LKqT zMWWCs)vCgV({$dq7uoDUyMBwOa482!z<1#?&H^%}CK+K>a5I8)Yz#g!#q_p-o4PNS z;~`BOm$B)KIIgF>uRI=9M;pgxr?c8;2amVOq5b!1&Rv(4vg%k9@&eEt=aC*K5i$gD zvmzK^zsC}aYAt)|vA|dea5rw157zhW$X!O)B&65C6?(fEa=oD2!!V9=hF(X3X2a`> z393`i{edYOTMf~_GL)EzyA7akWt7ugF$)jC#Lm9 zYv}U^zlb3QBSLb5#46&w&1Vmzeo8b9<_ibzm4$Uy%PZtT_Mb&>ZYn5qp2~>i2H-Dh zA~GUs^OJ>APexqdV`&!7WuUTp4b4ifEjmf`yMtE!AC>W8>vo_+?`*^HhjrsRW04B6 znr?^$p#@jGE(EQ6bY zwuiFWD>h>X)&P<6%58QtHZ-G3ShyFa(#Jn(ulTE7u9uym)K-kx)}iV=ZD#O!6U2;S z-X;gTw&^bW2AA#CAA|^y6&6#ak`f?RpCdxiI#n&FtInL@Ik(4=;Kn`c5%$F$=iumw zOfLBSeq#NrhIv5Wg0-KgxmYQ7vu0^ixqYF#CT7^i6^0oh+CE&gvh|cHpBJp=?w}hx z#l~#Y@@IjCf7bK(GLG*G*6*ux*D4}3LbUfdS|uOw>j(5hY9Ry1n@++>@9=P2NShd} zO4Xmov+7P3XytzM<>{Y7W95nxsm1tN%kE;AWR07zT8#~#f=;2<&b7bPwrW%_FRF+; z@u>u!%fT-3wnFLD%c?cdJ?h;Q&0hDH0mp}2(Jq1=Cz3?Sdi)s{AdF4Q)+9@NBXgsg z!&c$Pb;PxXr50uPL+%Xo3iww6QB+Z7H~45;rOJt$>^)Lw%4nGG%YZ_Fu^Bj=r%%Kr z;s}v!r0)Q{qN<{n^n7Xp3`9g9WZ+_%fOZaF7<^~$my=txjXvSkJLA1L;n*QHGWXlz zz?Uv>QjxhC@&#yzE0=S8<>$H+!)07D5tM`D4V3rEIBUSkQtlwEIVqyzfwt+Zy#~3> zWO#v3vSqR09@(!@Uv#Z{BxVmX!SB(N(g(W+2YH-h>z*hhH(aH%Jc?s3Cz9>6>0jAX zfj%C~=Q>T6Vo^a(6Lh1hr z2TQVY*&b@JSF&lp-ev9Jeq{-7L97=m^spA}E`mz~hivgQ=7QENh?Sr(Q{;c;`)-K} zh1h7a+$-$aZ+7V4pA~>n8ZOGEn)NB-;RH|U711z+H zPjJRgaa5-mf>25QF>7a6`GU|yixX`Q9*BDzsQ$SdCgdrw=eg~L*Sq&5pJVgO-W31P z)8sFCkfX%*YG_P)e|_qaTu;ws{}P>+p(gF^{nU$fdqIcj8of_fyuu_fKl_xdeDr=Y z>#x05Ee%sWA)vG+j@N7J#uG0AUDWRP>_)8=)0pSMo}S2A2XHts_Omv+T_4awZrCDV zGnk;&hF6&V-jDvSX>CIGHc)5f*5l7-FDt!zY9xiMEHG4ze0Un=m1I<2I+$t{po~wR z&nlR2tp=;ticFeVhX+ji<%CkryhF)RB&;>;pi5*Hnr`^$INfWL>Nq@ymE1AD|^>tdQ|3d z!W~|ho(7VoEe6_AWBxlJIJe4a9ehr1xpbu?NdRAcoR5%bJ~}|E!ZtPjo6>uXSf$#c zC2GEsu;%14MI#rtdAbvz!(p}$<NG4oo418l~ zaA&#Sa*((P-49kjrOXz$eNjdiV-Lb=w59z3G%hnL3Ck?rK0kXMpJhs5M|cAvAa=I= zwRWMZ#$fZNnU+SSN1JW}{AN4KqNRTDb6TCvbCGuh5w@lfDC{0gzg&-+d{Ip|TbE=K7l~Ho=i)}9qULX8mzt}3Q_!vm|5uQohDjX8I)taeVCwVygPJoyEX|GzL zAzAMTpW-*3S_jq7d0NCt7L9QYn}gi-b6YVu$TZU`7R@S@Rh&{v^?|W#nxHD};aKNf zP&>H0&%D2`^Q9sohpn>eX3=1rR%D3+e_`O*}*3 z#3lnL#=Mu@#GO(~1^iLeiro&-%(8wYLd?AF_7S=SoUhs6tj)Czuij)g_~CCJtPj_Dd?C zcA=}}bp-7*IIkp}rfi#~sg;K%Rpzx}o>DCCcAIsw3p0AXzWa#I{yXaO-AzxjYkY+u zQkSx0JOa@oQ;W_@JlEfY7`ak$@LaE}=A~M>12l*6|9is4_1i!7duWd54>0+^_hA=| zvIl5%*mV*ps0h}$Cx6fX`pApUBim|cFT>FcaAJa-26`SWn3GL9)n|<&>1e1X^Q(QHgUtD(s=lpcNU~~X@6&$f z%f~+gCyEB9HfBY+=8FRmDEL4ANouD%J#eQuFygy2?fqwogn#-)psPnF`HZG4Fxk<7 zx8duR2<+LOf60WGfb8rWaTH{uyzVH<9h?E7gEHSLEI4o6jG; z4Fp@6*1!w)DdL%nG1cHB_os9^qB|weL;3jJs><;Yh%;=WWXohjJBeMvOQtKC*!JkA z$!W|aIdime!ZdJ)d^Y8gA-nIXQ6wsPeHI&!(*u;T9bOcu#w88eMx@|aJ^Gm-H3=@@ zSawrK+d)Q}ufY3}Dz&9D%Ws) z<@d|3Jq{&vsN-zpaOgsz*(t_>nFVdv5MiGqK+>4(d+S@==&mbJQr1C39~!vQ;l`F~ zMr_sc(wo8DgBqn(nH1KG&@?>!ar0b&AR~5JrLG*Sb_AKjvd^zuMPM^4sX2G8M%>4) z!0W8q^H1qrLgM(ZI1WZ!Q5xUE`v@=}=A}eth0iVBRfEd21;kITvD^{-+&78hXCSTY ziU065UtR$A`CuyRM4lU!F!XL9oian_xLgfjP=~o&n%FJt*0Q(EZWepiUUQRwH-)j^ zR-Dwn-AxC^_t>F|$x%y}U_0>h4t$f5WCsT$s>-e5JfbZ-(|~i}p?u0j0=7KU$`O{K z>;Wv>`TL|ArO`RfC~>5gx`5_vici~Q&#>8dd`&p3hdr`z?K`Xf<p*+<+8}GnRW; zh>6dnxg1S2#LsBP!~Wi|D1sCH8WN=T?D{Hm2MZ|p)~ZhL--CTdXT+e7Hw+Uh|zJf{NDU;19PSC8aO2)8X9sVh(K&S93NJ&Rp;L-jU?xx7krbf_V>k%M(`8JWi| z6r0&P!cBc*%al;LPcySq#gR#IF<^9|nX+jHXyE~NfY+*Z=^F|hPnNAob$UJ%g6Sy0 z1-!j1E_90iJ@74oob-?M3eQgsOHe;l(W+>Rk!{C%*zVeY&b;G?@nBn{L1GHI5BM)1 zGk6Mp&|W#<2arSs()h&^s~LLR8~J^5Z}9T@H9vFV=E#nghcCB}u9QW46*C98`z52| z!=`^qcNF-xTHxVf^tSUCUojFg#dMP#zHF8*4g6j~?w1#isK?am@WT)hg&L5!2Jg5l zQ*r>6PJFW?e9>VMqYYodUD~UgrqMFi?J8mh`S_XCquWxVs;0(;myvpgq=Z#j!L1J%!VKI9W~%+p&W}epI9^(z*K%uEehDQg!J5I9czJ zQF-fn9}ycKJcMpn;IW|tic{+lBbMLyP~>keAVT4lA8VFa_yNQg@Kgzf-cnpYb@$H; z0dj4MBONRoMP%IE?{AUV-R8m9do+F1;X!swDN2s%&_2wee&V?nG-mX!ZSSqY>2c(X zpR6pe4`f_jwhd?~PRBAGgJ^-T6B)*B5=p1ug3kEtc;Ray7t^ZZ0Wm924E`%!Rj*tUQ$*r>*5ZrH(*iFpnB7ne%jV-IW%NcfA~0MfIQad( zJ)=XoPYpmLzX(}%I{Hrx#Hc@r&Bt6mHSjY9vY$4%lIi30RC2Jon#b)SA9+xtJY)lL+^TU3psXyzYI4kr>^Ney!y+q z-*iIe_MWXWtwA2>V0L0n;Q~Wh>8*`{h#hGw*DY?A5kjQ)5U0Z*OB-}_;dmEJFj+v+ zQ3jtTs<*+wP@~XLgF2VyVo8714l6!ekOJ)4sR-VU&|7nbTL5;809d?YeTC{^^RGY<;HchgnxiIzrdSFHwN;-60 zmJ)-hrl6jwbWWK_gUYFfcqTFaUeW#H*53W*{i9>P*T@W2>vsiW?zLpJ)D^*FOd=ZF z!{#qOiHVw%T~`eivj6v=$q9f8TSvN7JX0~Bf{U{0^sNsx{;;AAwKlSS70d%~nZQJu= z*%tKwTve3m#p zzBEtI_Qp*5{&|uSK;fEW;TE(?pTWV^w0dHv|Lw@f<~I1|Eu>(XZpezA13YA;5nn7F~6mm~X`L{?>_ju}6ezt-V>W>YItPJRaqLPl%g7~X16aTl<9M-XYL{@Zu+CYQt z-2VUYdHsOSbX|Wr25%=E*oo5bhAcp!fZdbh8xUtfIL7eB36N zY5WpHbNV(DxWLzRzU5@wNw$5Ys#0Ecvp->`29X!$l1`f7G387%!95RbI}-v<%m=$V z&sTE$-(*=%I>h|qQL)TpJ#`b-HqLu%8jT2)?Ko@iD}|wFywiZC1TX9U))?8H;Bn?D z#&sMXqF1MuSxxavJV4g023=W`H>A=x#rv1kGhTI~j|oJDVgJ_J#gJMF;$I1b%iaNe zk#lc6>u%~E!_YdVrC0bQA(>##FM61_Y66`$_wJdQLc@bZu;kohscVp)1v?)$*8;^= zsn;b?XXR`JCPesM4@*H`#@sjtyX?pbZs-q0I@ovLK_KbPu*BHyRo@-fjXb{)(ICK1 zWb|Bc+V^|{xJZ&f7|NNkQ2|n*DVs4=VD${Q!L1xXSBrbdAK$UsY;djk?WG-)e(G{M zfW*vf{P=E^0Pv5VWIRIFt2y~Nm62`ZyATR3#z_7HQulXM6C>O^MLCr2T-|Drguq1C zg?fp8_JeOC<9Jni58m(tR>@teX&Yzdm)%l^Qn7#oa6Jz88^FU~vGh54vAy8rp2z;0 zR6=xDRcF?eBHhl=CV>a!fh5-#(ac}+b)8}Tv>ISxc4DhxLeZ`y7@#?19JLI+s0g$| zES-Alu}(t{^Ah&OY7eZvG)dbZH;x_KQts*7zvTc5;Edpq2N+%{JMdQF`vpXDtzP76 z@|qE(>o+*Sp9^>oMT8)tLN(&5Tk^hD)*Hg)lUTCR#%P%veU`(!c*_TbmXr|LDrar` zOVxmKO-vy&Fwx+9P)mnN|2|2E|IO5K2vi~p?9yL~dbQ7$3G7;F$UdPX!4n$_kD)%G zz-94O{Q=!E_nuW*F`5+ClG7;pJC(>6u;)8nqS9|y`8Ir9?t*QJf)xVnXQ6dUKhrwQ zutKwe-LG&9d>lWrU8M% zCWx-)lOW^u28SiuLMb{ngu%VDh62KHL_q%U3MzaZ)R!6Y!UND;S$~~~=Avq!`#B!h z)Fam#40ej&n3#+YTb7xlGc6U)SIi)1-L**uqw<2U{uLhnSg(4G56OB7MM%$K&IX!k z6nNeNvB}_^q&59)qlI5MSmA>m6*HNOa6Xd`WGE1#@%`GE*=bTYw%Vo*A~eH1V<=F^ z$iU3N#)OeU&23=?V8yz_|08NKt@t_BDS&UIQHt8AeJR9MY?H0fjG{U@HHjCK@aqFCrME&-426YKO2sqyYC)cI$TuWBB9xH~n zA=L`vITcg5sq|=S#`;deO$(ch)L|%laEw_~&GBNNUlV_4HA>tv+s=3_#zUM-TW1hY zh14WAeVyK)$<7XuQ1$B#1(WBb6;FVdh-q(54&JBgUxajRO9*>f7gjdszXjn6eNnpS zug_>tGVshX6#aUd9v&Za6$6#d-xmBvsO5|_vA8O&z8$9O?nHa>AvEPy3+c^hCKFN| zq7qNIM~hzZybcYUz3~s{vO$<)OwvNxc;wuKkBpTVb)gq)9$jCULVu0mg(m}ERFt6S_%hiQ4Ey6b zu`9dgaT@)cH8+YjtP={B^gB%UFjZ>zy;GyHN)M{ka?7#5Zyhx0)f~&pSB{1M(!lKZ zPB)j;h~0%*>?u!_1)&pJEhiwH{h$)}THr2!te%`hJEg|b8cRB8 zQ^d2K*Zr3Pq7G+96}PEfKf(!=J|ag$p_!zHtL}|eGG*V)tk?loeZp_L-U06RAkW>( zQ&s2U^lRArI#xBGeaiTo`_nGTR_*@K)mAZAxl19M48I*;V{_W6w389(r?Y54~! zKp*FG;RHu$2jsn>BA+Ju2tIl5Oc74z_}jS3GkLCcwo@hv??*{40FY=BNocWM`^k6X z15*1xr3veHnM*b%b~ORQ*hu!yBR-fzfjXjWmNq!%WdS5&LgLK!WO0?k98Nwr=6-`m zRejkmE4n75-b<2H{ng1ffyn^-0BBk$PH0D?l6?7&_Q82Z^s)8CHUtD6fG8Y_I4Q$Z z?LHZ5YRGnvc7JBsjWh>DU8?F&ah3X^_f&bcW9+NcgT_b)Sx2&RlxowmQmi?JeEVwv2;PM7~D9 z4|4sDPVOjv+w_$yKo;HVlw511J>PG`ElDeO6gqHNyi9G_brTc_J~9qIEJA%J@ZF&L zD^`0GT$;Cn8T6O zng=Q+>9;fWwy_9~{^&snMe~UF4U+nQ&~Zyji`wB*X`rEJ8j1?d>AHMv(!qv_@*s&k~S)INb_5W$!?ZSR!I1J7yC zJa+0W@=-QGx5x$_1H`*mzVe%Ff+BvwMa{#% z+CA&@QxXxdcYlnFJ+Tz>Y`iS1S?&ajM~A2i+!ga4q7o6-djn`QPmrFFu08K_O%=RM zVQoS+2}OKsqpcw1BYgKt*^4sWL}?nY`aKj#*hkkWb_ju% z>gP;eE|sE*?DukAz`1~)xmP?-sc>Y|X z9&T}Xx<#4fpbg_hFo;HE`x$Lvp$Q}a0kddaoLKr(F;s~?ifGc7NJZo-YkN&aps?Jw zdAL=I*K@m0^%Jp(m>-e4Yp`WK>bJ9-@;l(*9vyF$HRDGiUVS#%0X0k&^Q+2tB~)Ch zp+%PWuqn1P*&1CU^nEK@AfKLQBb`}Hgx7?Lb~Cjkm?Y-3NY`9Myu7{m7>ygCTrvf3 z#!Ez~0{lC-t)rD!u!~~Vop}tdz&gegGweUchjxe)4qN^l_>T3Vr^Xg~pr(_4kT-px zR2u7RDC$2TuN}WTOSvkP=kc|XYfbz87*oV{Y+WfMwaE(km3?&PYUsCp!`=5TnXxo+ zXXS1Lt75F}Nd_R;22uXw@&uKYhxhPSVx*e~E2-`Wp8B-?j=Z-Tpho5k#sFqBb|FF7 z#_P_}w?~bkXg<~^HaMDz+S&7*#z);@#nWmtO=pZR#=2#jZ4e!h8p^4x$RXiqY)lwv zvP|lP?pTl@B$sU>U-bc@6k=KW==gA@kp`hv5)WZ5M6ft?6Z(=JKBVbE+7x@uR%bwl328!@IKQ6ZY0Y6pX*wIu^5qZNF_k0HIkL|%J|U^|YaR)u z@<)S?(!csl8;RyW#Y9p@$9;!;qpYbI9o;f=bon%&-Iv!}Xd++fgOuu9GR7uZ83ti} z$w)iswgJ=8&dhV7ErkKr<|Lz17ml4Run(>lRDl_}gaU5HCxD8ps0<@C$x5x>pVv6c)nL`H zwa(m<6&sq#p7&?MUtv+*;hsQ<&uT>^Y!z7hUe1YWaZn|crq9<3rNqB_=P==@Dz0EGJVFC3lu5`*`a4~ia!oZ|e_8ZLX{E^7Mc<7U&;Y}#)aq1 z!^geK>hP6_tIY*C9B2FF*;rX`z-^^ezuGMHQ$~UD&}b3DG3eA(5%%MJG|=?BsH&aJ zLiVL(qt4PeybXJ`u3~er%)E1QRJ)A1%-1f-Q=K#L9|2DnRcIzS*w52!nd`2j7uDwE zWWTrhDD@5@L<_mtZT`~l4f~c$fjFJ$R7RCD#gX6-@R9P8v5|*_4L8o{(y|#Mhhz?z z5C2JTO|PF^t`enA(o^{nIEjLA$U*=25CV{f0baBoT2rzBx4br`MN6c&w+W!so;WUH z0aP{30-S?TM_JTwN0%XFW24F0^l_&nEAkR0n(Y20vqy;V`!M^Jm-zYufZJSbCZIWHkxLx@GOy9uxmRR~Uu1 z-Ytc!#9SKpPcVVEQ6_sxjp7gG?hcK$y2Buz^?1X=W7@o`qL@e*RM#o7IqeErfyBm- zHybR)=~%M-Kb33YYyzg#yY-t~Rf4yw_u;Sm_x#$3R8Dg&pre&OJ}Bj+YLgOUzk=}D z@eIMlY~6zC=Q>mn4eKv1z6)m8A$5;l_p+&{BEHfjN|2}>;8smQB&!vSh!VzpNIL*9 zT*s-SIc&MU;@GaD>sN=uPkmKv>l{hGskytl0yF~ZB`vlxS~AqF+uUme)ItW)Su^_K zy6nWAKi&WL=5z_fbVeKU_}HL_XrZ?Mif=fvKTkOn%f>ot#ska?)T}_DTch{YZbR&5 z_SIlQ!O)I$RsW7EWIOCqK6V#O6m9f+a`~q;0Sx@3@RrWiQ@&H#X+e=~EJD#Qz#ZKh zIl5#Z6o7E6)ZwZYV4_u3F|I)G<9KYBu%LAdFbFdd=gDRx>M$yz1mwYeki zl-brK$bKc)cbPa5ReVec3HS|9sn~u1*ImQ{@++t8afrRJVs*=|;LU$)P~o(((;d!o zc7-f1*K$pDQDk~A+s+2YjxZs#90N#CBG&;T%w1(+!9*e|d-XFASfxiz2+$abavou) zz*4qTPK38-5`8-0<$MT79!VqgDduHLJ_~i_CkGXA zZFb1qJFU9NIOfr)%%BE^sS5+ahZoMbHqPxT;$~A+dZ{SAf;4&tvC=PCym7K9D;u~t z?uF)0m_3kd&KbOrAi_j?dhO>hxgi2L@=K#%vA!D_0t94uafT!^>E4c!t}+GAUY1W@ z4CI(g9FU$vNub`m;Jtljt!-_bNs=o#M3OGFb|fWn1wPNpov<)8+PFBifLtfguQ zPe#1wfEb&2B(xekft?sFXa;lN-Z@rH(s|yx-!#L~;Gk3S@vnVD&i- zBJU*6QV858_ge!ZNUDaHf}Oz$n=&<%ZE3FXyyPJuJ(B0`bzqINu3U3|^u9WvaiDie zQG^6#fZBWHazifehWDuTrF7mqMsarl05N}Y&v}rl3{waP-BQY4^e5(O3#z2T!e}`JNO79?$RnxOF=%HqG~V%)wPdq5RI}CYyJ*F@wd>pez^j}cwjY-u ztvAj&L53*uo8$wV`^m$RpsW03;)*QzX?RVVMSs1tDy+{nT)3@cxwi?xU?u#BJ^=%Q zdv#(qedz*2&RJ4^%(+DmM&UqF}!Bk{A##iJpV@UY=NAHw#Tc; zyka=2p4YcA(W7>&T@`Xo+DY3;4}Ez)citqRW`O>BhnWd}$NbF}Q)y}8(LH;hEVw%E^)RPg>uggjU(p53 zAK4{v%aV1wX#!TbYw5Rbqr!7E$;=v#lOCcy+nLN$eHiJpy>G2u<_KUbETZPl+Rvuh zdO?Jwg>l8PWF>$yJ7Q_M>Y#H=7$Bo-P{>`!!<&WIBw}q}cVD2^EkDFXMzV$Bkd6O@ z`(z*IGz8i~`7YLZKmvQ3R8F~>0N!q8%V}U;Gk91en*I$N5te1Cr=_ZDIB+i*os-DB zVLPYC1e6v=P`C3Td4%85-V2B_Q>wbLO?#n;jqo(z{G_tYPz&A{l9`y?Ag>Ld48oIu ziNl`B@I5DXCrcX0Ji>u`g-^qcGSGnV?Ry~Z92C??;D(Dhth5qFn zr#+-gL2&ourlW6vmwGFT0kgJf%19nNEhR1=IKdF9T{|ztt-e zvi)T@Bvcz{fa87vLWy*?ORAte6l-Ux;}#cXE$zcRfE)h&$IdDL;@zBQM6nKlYPDk zpp&&usAGSdx+i#^aI`v-u5UDfhGWMl3YKW0uC!%#Vu8cIJu^eY@X~~-a-0jb2Q;Fl zB@km>xWS__1}(*=VV$MNwP`v_#>}ga{nff}i9QQsMvJx)>~kj_$sojF&CQAWw4u=w zaAFq~FFtZe%G5T-jh)wJ`2*!^1+yN)PucE23kY#KtLU6NYi&ZDiDDM@(`NI0g>XPq z&h>)$3(`LQx>49jkk($TkVoDfJ^S(26RlP-0BY*JSvYc0ZHG@vSG(c}HSQ1u8x6Dl zT}~>ne;c$A0axaY^FNE#w=0SD$ zDm52No)o5R97f!f007Nf$CX8*&A&CHG+PA9zi> zkruqqEoLIw`iTb#gQ};H95VxhS(Y)Y|AV6Kt(XGjh<4E`ZryqHeao#7lZz?T$Jxad zFqbsc0y7!ld2@oP9Wz{W3R-Yj^77(zr1c5db{v%3amKc^Y+KYPSK(YmMTyn>o6eM` zJqn=uN1stT`SgKH{L)usav~MA0bDyT;}Ym(TdmTsYUQ&pSRGS)3m?WP%u0yZ7>S@F zMkSWvT-ZiKIb$LEdy!mqQz&E$?by0QBU6?56Ly9CXM#Ipc;X-+)z`Qk^t^lfgh3eF%LH^@fm9u;GM z0%YSD6Q$B${E9|6Cm&c!v4(Opxt_!qjAlNjwwNi_`g1QGI&Hw;M3ba932)kS@Iexl z=4;LNnRih}7yFTH?Q{e9@hCwuU?gr`L{hjA1GfU5P5cZ{8pb0mDR zR#uUCdwZ_A%*T&GHSG@S%gMZ;sj+$q)M5?vbh4JVSNWnbHB@&RkDIyj*R5%4JH)T- z$e2hQQp4sQX2B<*2gQJa%alL9snmyzi&lq2aL4ukR|x*Z-oZ*=0B)QQ$A>bR$4fJ0 zv;Ss8cX3Zz56y$v1Cp)dXi*4<=*(T6?u_^KUqOzJxu-PN8SlsaEXuK9nRTO-y8nU* z3I=i~ug|~TbOO%^UKhy}xQ}~HrSm|K{T`9FN>@{$(O&$=KI%wX>`g(qQ4?Zj#!s>`nXD{Q@NE#Ftb|7utd)%T|t zMs0Oi3S(0bZlpomZ(bLso^=Tk6GR;W81LJs_+noUxJp)ZoM(P#@pH@kla(>jh`pbT7Ip0*1C~)Dm zb#lIu(};pQ*Gag%nk=da$0vJfvZ5{#y2z!L+sWAuiEnxezo1C>eI40=;KzTPs8YePAby?E))YmuuP&xua71%8K zg)fxdMBmMj>}f<%MBja^N+(*GMmTKxdEgR?p7V|ZJN*4H1%j9?7E-$~HRWK*Ydb9;G9Q) zHoNwqc-b`OVWd{N5`H|nY$)Q=B-Ogrl@&kCy-$!WVsjnO(XJU118{&+&{FSrn!H1i z7+Pqb5l|5>NB!;U4A2W|04r|&7{}l*S_NH?CoBXuT@H^GBRZX1i;&V88Ag}i6e8^) zr69wXCFz`^nFREB8etPJmgC(vpg)hKi-_ckd4fO3ijb`|nFOS7=ghg59vT?2W}GA% z!YB3a0{UyDymAuYhddVF=!IgnL$bpw+yvAbMkcn)=_DjhHGH)SrofQi2vcsIudJcm@{a_5pQ9O0yfar6P1WoAI$Ta!9 zxuHKmmRM@$UtS<%8WwpC55NW|$5Ad$;Bto-l5>cM#R(}3_F&Cq{K!&;Nm*-EXX%+J zf+MIMkU`)U&DwD5ajgammK~ZV`z5eL=pVT;Q>@xk5HtVt0w}S&@fsRAWW2q?@U)3b zz{J3cpr;shlrTAb^UT*ZYbe1DV=m#^zT)Pf0tqDh!ewZ+m8J(`T!Wb36`-Yj?LU6e zjQMoRFpA?;m1G!2eamJ!Q(9Qt|2p$^ z+0?wj4#S)RFN~N76rmbv0OTJL<#6se&$7EEqo8_x$9XUfq+L>UQ7%srPZE9t3qwU= z{@ESVxSj(5*`7&*=ioa+`30$erX0w@Om5z&O6bXd zzQQh#{Q6l!BfaHIpO5wAs_hO>M8@AC#lmh+a;~-v9L2e;H_y ze}%5}#I|=y z1~OT?TQU==@AwdHY+Art(Stm0%QiAd6_2CJaR=W%p$$9Hc3t=pV z>VmB$$+x8%;A>Yjtg=IJf1kbk42+Ggck)#g7u#1;IDXM+iKd{Nolpa)F(bguG}ZES z_3()>!NMMuGW*eHin(cETxcOWaJ|N*Y9T1)t@c-j#yY!OZ+K>L2#{^OF+M>k5p#DjpvoIB? zx0J_wK=x#`I+<6&-03}ElnD26svjE3+@V^AU2mN1!?1iguyN@RMj|ix^9NZV;VH9| z81siKrw5=1TD3E$r5n&gni=2%Vs!=A%Gi5k)99>$ZAO|Uc7*A3BuV+bTU{&B36ca zXkaV&Q`3H!c152gxc<8g1W|A?DaHr+bZ7{~go%9fT6zkKyV_R|O%-#kc+oA@f>-;(dLH9&SGEJ*^t8WKgx>pVC8xg4k^pLFxCziHoA ziF-{U1>=B^cY?+_n&ZBZnb(rNquVeS z^aB`e)jZaGaV@~LlGgZ-h}dJH)O)&b)O@_LWeMutL1yNa5i4peR)BfYb3)D%YgTyu z8f;@x)#tC)AkGE$kqSz&fT%&)5F1uE4CQ;(JLUmp(qlO?4T9@kw*{q0B0FS$rXw)Y zGq7uv-CGM=M@V5s6v^I8C60JN71+p%zQa`aWQS9!UUY}i3`9C@y?@bn)E_6(`Sj4w z1!dQs+eA-93fWl)Cws0j$;>>Z^OxMdb1R(x{Yv;tEbO`n!osdOqYF{?QT1d_`JslU zylEc#lJ;xmy<{ZTmbIS`21C{^+a)R{7o$~k^57$ zIsol5qTCR9z859?`a_7V|HxaP$ukP5Nj3$ESgrE3Q&{yW7&V&*;x_1!kLfnuE9IEb ziA5$yHPr08NnBkfJe;u%1~*R$Ww9r!H~Y*GG?-cV=n`171UlbkC|lMu2X}=M!HgWo zlzv_PIj(LHy@_HU`4&l9vMR10ZLr_oLSHKmS7^~o<4xmDAGr@u{S2({H3|~u_Ie=6 zT6{EdDen>w3)BVpa1pyRl?21K zD%v=Fk}XSVc;s^J_s~YJ%c8Nz;!;e20^BrvbW7n8K!ft~RUia?5xD zQ3Egd%9jlCwu#w$db!BK06N$j9rpO6R%|P&UZq5+p+4$#k7r9kCM2A|+M~X!q7&Zn z)jl2L(0Ntg^EIARU1Rs^;8;*pzjRP90k9uUxTTSILA8!vc2TAI+&EnFg;b0}`yd@< zaBi5^{4w%(FYn^!X*AIM-YZ7+ws~PNyNBTJ8nkTdqTA>m4Rhb`3!F~BvCDf)fHN#b zm#5s-RtfI$fw*_tGX(*HRaV>BtX*{+f2JD7T9+xBsSuxsQEW;NT5i(LRy=H6_0#3a z;vF-tU|LpiU6`hb4NoTkZ%e$A#rLc`)TUfyI&lU+{mH zDWhf)hD=5}8UYMcoFz5vMHeYime`|hz{U+9Gs_E$tX9DRXXOtB4=2m6`yCyfA%-BO zM~}A2h?(kU%qOR^Q*dQX3%Kd-PW zt7Ijr-m3qJv!6ZCC#-wLQ>r|@1@{3Vu`jVC^?OOz!#>tY4lrvLF9@XkdPZ>4JT%Ry zm$KYSfkWPlyQ3%{({>j~B}+2C9AhjD*;Q-I%r9@{nWolDG+p&4Zt}s-XLKQH%ixTt zglH5M$G1Q*!5^i=Fp57K#f5k_JB1T{g&#;rLopVRI6RBm_K!|De zHB;Ha^6|V|{|w?x0l2-=}5mP@(ud z*<-BF zf89bt>Nu>YxqUVqk^B+Az50h3;tBwyvKRWH>c3JIx#sA?88o2u4hkK<5V1 z$j2eUKyu166;t5SikB8PvrEkSi2%0(iwb{%-}D{5QQhc(8X+uT6WVEV>@nV6FMuLR zv}dvvaG1~Wj8k?UR)deb?*`{S4e%PAnc$A;A5_BFi+WD0;Eb_$CgL;KcsKsoo^014 zGioi9SK(2hi~mt3M~EwTfJdM$j|RT+R3&Z)L9z`0)CeAvm9C6(UzHJ+4hgl9fUceE z3L)$d2&G2U-r6U@&O_o!$nYI~VIJ))IZub8`9h=BVv10XG*ZIKT|?k6SrzI}DZXd- zI9`ChXKj+&2IPHbOcTRCM~77=H?)kRIH{Wdt2|ZX#XoOAi}RQWeJj>cYHn&v9OSOQ zH-(Sm!FoP#z{zIxY_9hv(TMyiFhZdX0JxSET+EwBtc=iIvv~5u`rDW;J$_g08E>CN zChfjzBPe)H&5|UWx)?bSGEEIwRXjKD4S-*n?d+Z3zER{&zLo}q4t%6Sw&KM-@b9^S z1NT=qCicGBN87cSyyM!w0~44M9p55SWPBQwg%G_uerh{-3X+fH4|+ek{g5p5i_|wb z+UMr$xMoVg2^M+DKHgartLT~JAt$Trc1|LuA@$RY`FKS%$s!cCujq|yG92+Nlzj{5 zzDRZ_>7TmJ5<`LXTei$?3!*7gJNmcX*D4MxOwQQ+So844SjxQ@W})ti^t$Xi4%~#8 zq7*8){e6)s%_>0Q$V(5$AS7x$7Sf+Pd)9>hUz=bKSJ1gMx~65?hprpErmCIQ@4P&} z^2U0ChHmZ!D^1~#YVB_xgc6NDz>{GFQpbP5`T96SI#u{5Eg_>j%Q+IZc#!i{q2_t~ z8B!=t|3Y-)_mot#b}tbk4_~4307(A%SEHmh(auObKoiznO8>NBNiwH+U#y4|c=;0e zB(xwY_DDG(VRl_bH$d*6=9%l>4DMDT02C_Vq4!j9v&Lsc0X(a5x09@Pb!~Yx9T`4J z-aa#7DyjerN%~}(Ru>(0K$PYV47{tA{(nZau+$o;Vm)h{qL&gBWTh4@*X18ePVRkTnvFegfIP_k*UnAx5P zt-N2OAU-js3a1Swe-qaZ?N~CB_2ZHy2h$8q1Ta{?6-tDc@FX`-mCi*!Oel5xqhNC% zpgvoMP%ptC3Aa8zZF_X0-xpjnb%BY(@J8dysewzw#|#}#7H-sNEDO`cDboqbLvYj< zeC3LytKf04d6T(lBhj@Jt~qy>>InV z-0LGY?@RRl!Ycw8%4hEzmf_v0T*EroaB5DiR9Y0cwAC4vsA!rN84@{$VDxI6VLY|G zUf#N@0jI*Clm4>dY_zl}8jIGEVlCnzloe;*MrJb`f)FT;qJzf z%U^3_%D-=H#pddLuvRr5*H^Pj*wZ3Yp@jTD0&aJLoNhkXy26nBHo+OFNzxq6wyjJR zN-=>W;=Vi!`$H?VAWT8Gn;#OTVb1GtEk2^id_lcqIqZrBkTX87clLpttPLPUQ7x&U zKHIf=f?#SInhh-;kWA1e2+d?yy}ObH^(@ckR4uX40r0vI4G}E-@v6gKN{i#*VVf-a zS`>M^x;GJhg#{J6UWb-B0E2w?Fr!EkRBP_|W}wHF5G|FWIJ;(Lsr_PRZfbrzC@QB# z*gY^dNdnpUb!}FBGnmh)n5`}(`^mj|+Hd6jf zCv!k!aXCPunZOe=t9M1O6x zxgBwCEZkxB&kH-5Rryk}1l7S_k@G23V;H7L0(yM6u?s0Ce7?czd=xB;sO*C$#=+8& zF90_h;92j~*eS)8I}i_V02KujdAOHz{%s2|V%p`Gm2GlFJYv=w^);u2ilShX$c-Ke zw`yYc0HzjhC8i0P45ukPLBfbClYH*9St-N^&s_1>w$Z1T$yRWA!w<2V%OAQ2T+ruC ziNCKL&7m}o*gw)q$-T^BW|ckCb>F#?OWI9gl`U(C&3Wf|g#e>`DlNmwGVl(0KR0p( z#grO~_pr`J604=5F>E55R%c)x>SKZ@$YG$|0L{HWhfvQ#5h;vkksvzNJr71c=IM}k zu+z_uQH~T`Q`E%=w?tW~#p}0z@R8qQ$LuhVnkBhMf0!zJ1 z%N7lq4$N?e!IUV>o>NT>h1+fR_+;%S-4%mwz6z?tABB<9=QLfN(=oz!?S#o1!b^-` zPs1k?l~igz&@SlqYkCa z9@hAVh771Ud1Y=N!urq8j};u>{Yd4b;r`62JSO6rTlcc$$jlbL8gR5*K^Ib~@BS@0 z|JOxEXZ(nru)@{&L`}S97CT{9TiLQVnpHQ|ots>dk|;862vB$Eu#E8m6@|O5k2xXj z?dmA%RkE{H0SrkbD1o46uJjLK=3WaR|cX#XrGXc=h}Z(2%KVPf!!@ z`L-&CK!`U+ujq-VU7~+u zQAs9p@1@5#Zu3w@mmM0`hY8E)A{K9Cxv)QzV@{bjHX-DG#D?kQOA1yH8<^*C&&d1> zS}kczITqr77)r)8@xELmksyT<(3x0^jVpa(t^@XOEol^(q>cL$f@itj%|xnntQH5Y zk`-RlHnSsgy++Au*RVmkOBhcH*D4?QI!|$xLC0k9#(kZrtZ`J?antO2S%&2jcg~E6S{M{jnLrhHMH#9-m(x7Jjq-_qvZ_ zdW@qKh{89iE7{72BW_B&P4x2IIR}}=Ef(w>$u+*zlh)fvhzXciC(o@wtSAX(9W0ZS zznN9B1__aKG&vglnZuI$`AO*sPoVR4IDd)Jcn1bHX%@2!Qn51;f~I9o%(s5Z!)M-W zg#804ixxs8cr!~W+X_yWZ@`0WO&xN)X-jE3OL1e`F1<7m3WOq>8)RnS0TO+s%vfLO z6RlrAQ+;_aYt|{$!;mzrsn|@@`MKlDrO`OMZm~B+!uBUdDtd5|G~)n&@2RPaxBUyE zhhr=us?8{mLDdqS$9%2&p8vA7wDf?b;Agn-YFlh&g{5reqsp zK8An6;$n%R;vl8u7Y(07qc<#osXircR`Dj&M{c=xe7$SM2pTJOzIE;lZFs|_ z#n-Us@iGBb)ICD^9D-H=xdrX;OrQb`nF&SKmR9%U>O7cq33dYEV#-6S zZtgmKal4HU6g_Qs_o*WR2h4OUB6fsJXFl>MtavL<_L*)dOjm=XG~ncPyT#>k-(0Lq za6gqJ)he2lTNUAV!U0TWJ5CdjF*!?R*sx0R$k!R-KL9B6nLa)}V6YFxtNXD`7uQ}O67!4pyx^|=Z zm98DMOEa0DQvYWOTf@ci!UP^bShznp@XA<3A#Z{=B9@06-R?-$FdUhLjeE#8XCkQA zWB<|WV_|;k>N4<-?1ZQ3_hP?`HV2-^6R3Ge*F8B|@8b)TT_J!owM4q?vz?* zh}RdF`b%bxzMU_H-&rfIBH0tPx^o2cEa8ZQJ1+{d zk1nXlvrMDc4^!cskSfim)NOql%qWUlA&6@Vt~ zcb}TRVB&}(xT2VEZ5TFJG_rwwNx#IB9dyziXH7Q{7@#6}$~etpu)M_0Ci9Nr_OCYj zw6*x0Z?BzMc_JHz3<9a*KPRo1lxHA@XMIcZ0sK3;Z;p%Iu#`?nuDu@k@a3@Df%g`( z`k-Eg^3eH;0g7Y6Q-I)DSg%nwv*YFEAA)e&kQoz7JyWSiBSv?(t3PStGs10$M;)iW z1V~d}w?K+08MSm!@Oac$1ZP~cqr;>na)a(3YQ0G8#u#)5(6b9O>qRpEW-Z5Um<6L8 z;c!?(T>t_on2Ul?1}>|dr7I&E9p@C0JG~edkEGR(?H|Z;%TOaEa`06IZ@$;R=V)@` z$2MO5vY1I-`*mMw(KXZ%MD7X0Upey`=J*mQ5I~nL%Wy+AShk0KbebqYQbbsc%g=Qi zq%(>Y>WsZgeR#rCN0yc-REGOH!-Sv7JexvRg-33r9{L#^#)K}YceQiu z?Kz`7rRvk6ohhCbS0+L@*z>@N%F@epxKOv<4l1~}VBteS0Tx0IOx||9RmL|}g^NnJ1g+jc{l~FF0(Zr9y#dDD>F=9wcRvr9_ll$}c4O@=9~j#ehmW!21YS);=$# zi*SuBzvm0LA>@^a91NAgp!{K(d;O~5Hqf>*7KRTr&Pxgoz%*9Xk(l2o!lG>rz3Zr@ zmkiFYHF|AD0E?WoQ}?TCPiJPno6Wf667(aGHrd7sMmu&ZG0$sN%M}I=g4SoXfune7 z!tPWd-*wUgG9@hoGNQ`d$&>rn38}L;#Y(VCMV|4&zf1lQLw3$*Vcpmq@hVD`Ffo4M zodgOlBux~jld`kQZ>E!8u|L2;K9bgN46~^7z3T-X8di8NU0LXHqG%xf5Jxnz^F0SI z~A!LOl;*@K;5snh{c zE959(Vsbb-O&gKS)hbh=h^I0q#G-`wcc}qdbs8?7QNqxL8vavWi757CDHT2;>M#Rx zYg{s*ROq)vgG14nhp7WQ1k;sQ}gBNjs>;F#&-cH^~@p9QjVKxHZnk@)Xa z!`3R}M`1Nvpho=Knw zf$KQ7xt-It%p0?8dC{eLQzO={`BYWkR1Kj{KVZHU`vYKh3bBhttksS2$xg0uj&6}$ zu%QytbBv)01g|61fok)?^uDS22bg>ICDT&Hha?7{F$)$+x5@TxD!SMxBxX5PZ*NEfw@4 zTj?4km9F0JfwiAMerAg@8I4Do25xTLf>v+~XbYD8CBQSd4=6dOce(Nf5yV%{oMr#C zbo!0evZVMB9@m8W=y+8zp*Ya-Vb2{mt4`O34WBVl%O5yL`ve_267JiOVG*phfJm%# zB+*bHwQ$oZ49WBAU)@+xZ{At*Y`praKeS8Yxm4=iKo@z(Oh&K^qCGwuM5Te+9ZL3_ zzFK0BdyQ%`ch3NN^LOpuwh%`%X=s8cf$>^A4lAk~3X<7?%UkVudF*NRHIip3D^`zp zvbdP3m%NLoFwk{b+c9c&p};+tA{7@@oMH4F*LUa8$z$c%UHhO+H@)sH`0EtT#ozo# zm8o7*C6ym+*;o!x(Xc{Uf}3clpPtG3<6AgKtKI|m!hjUm)G#NP-IK8;TJ8=VF4w() zh7QPh!SFmtd|I(g#@aq(jH!GTXJiZ$yY;udc6yK8`FWCtPj;;CxLvX|+mlS_nysuu zJj@`GAPu1D5^SJOZcaWJJf4?fLifH)p#QVl$)K>@#euq3E%iSaEuY?FYwx}=;hG8A zxaqb>4T-=lpPy2XN-XZH7zLK~CUoo*Tt>oUl9ktX4IDD~WQVh{+F@9BCVqp01dL7y zJyv{{nUqxo;4$I_H6m#!$!oh2OLdu#<;WlXM?jABFO= za=tl%?2$Ie8x1zwoQmQd2;R~#g;Y*!RwP`0E7@r1_aP2+RJmPu`Q~9eDw5QtXT;JY3Dmp!++Siqf=S@0DyqH0_U>2)CKFXAvVrpJ{ zwc=fyEQJ>@Vz!*Hy)x@OLHynYpKY~3+6oRx?kXDMl1Ws{BK}r9RL>DW-|Y`xOqfe~ zcb5h_ERghVH|SYQ2;ab(0YPP1H-#Hyl5E98!vOL9-?3x+_z$Jvy}(ExekeB1kQYu6Hu zWqKW=3e$#=i(BkpB*!~G&s^EQAGw#+o^q5Q-WrrIWa1oj%>{KsIsNXqQl-fPm{1OR zYCHo7pl#K5f1qyo1Wu?6HNycKSDjzK#XW!08vU&&$$V4=y%EV{eY~+el|ai0jm48U z7qSnh+Vzy#$^I|W%-6`+w*{5k#D{QhFjOm&(av8UW0vH<5sgDvS=5jj^L|N2)Hok z>7*g{J&$vmz6SwWXW<}oO>vIwC z!~4=sxs0MVVB>AVD-bR3pA;$78H!<>D=?hMQty&0VzY$v>=za*{ie%X-@HOw3=niE zvi*u^25xy${PRr{CAKty?uDtD7vX|2D9y`k=g=7WSPZOVu1YtttYmwlOor^2U)g)u ztO1TPD>qqRK7*#pp^?We# zd8=!WKPbV9;>Vr{$}4;qiNppWiKhr^;zhs%+W^gCmMpSiVlYXt{A_ZSsW*n~5%$89 zHn@?Eyx~@jVph&4?)fl>jfqaLJ&>C-xFrud>$Xfe9apX^;g)LhbzJE8uWIRIz$G)C zV^`{7;G1o>F!?<5(O6)U4hDpHlsB4bdY%(gYUqDnorn7zEKt2bQ^p3twnjQkRk6ozA=E#vkDTBP6At?a9=LhqkMS%Q9(jI-m zu$x<8a_7bwm9tkS6%e^APS$e}CQG)y@XQ=89d(RdoB2{CSDdHSNWfieP$?Zui263# zGL@IiP)tBZZT++v*}biNI(vzLAUL#49=Z>>^^ zVWl~g7`j}cw2krE7B!C7%+7dE71~#A6iX8%C{@lUYwA@RWADla&f>)aJ|^9TSJm#z zh~s(@z+>IGV1G>10k(l_@T;gxPwQ*L7P$N@&5UT`Zl)Q#3vIn!;b{o1W>OGebJ&B` zQos&1MgozO-7m~UL&rl{j|&JRa^C$F($xLzWORUyOrbE z7o5K3(w0IiJ#q3Cmv7B6oWiw}@#6`Jry?W#DGleW09GRb^>^^elRUIhLJ%-MX%#IY zT*n3<5klJHemIe4AZrD6D*idl$e^eDX#p}r!g@6}#JD|wpz65nOjbU0vlYuToPtW^ zL8hDtZ?9V+qo8Gfw>^-N>)yE>20jx#i3;iiko^Ggq*c>~o+L&i2s8Z{QxR#Dj|C^k ziNC+1X1Siqa$!b1OU{m26+vZKXGEVgc#rmv)jC%=X93nED)R`UiHs?3{sc{LT{q3@ zei`;MvPjnw9|&ec%dT;evzf*PUkY`IFtvV@dG4<)eDN$loS1oMI_nxxQ}YIj64q(D zO}U56SU9&gr<-uZvc|#Czu6lzDHNZQfvQxKGaYKH(w!Is6av&Y-w8D4GsX@N1i4?9 zI3msA=2WY%P{?Aj*KFau($;B=2{PY$2-==pfnv}5)uHZfdzxv_Qu+@gMx16Jyi!?BT)$U$WF(E5jI%iP!_ z-Bb;8jgT4p-daP9b~Oi&Hr-^g)GHq@CG%BGR^=dPfO8%JmcaQqX~HM9e%Xw^PVhO9 zJzyZdK491aeu}J?zdkRXz*)VQ|Ryqx$^HkCfNnoKxu$haTWkx$| z3Z`AzG|4tW6$_TuO#L=laYggVIszufgH*rPk!_P>46J9r^UJ$;d~)yem}Nv-3H0QW zN@ojb?Oi2P+TAJL{#7ZawS#o1d}^jj!??|V&%V*DBufS8z6M1A6Y^|BM|BchpegNl zjH4RSTnH32r7Chi5UC^G^KA_*nhaXdQhqlO6};o$TPh-{g0KHyyEAud>g_1S(FR}| z3B_GU3omKMpL}fGI6>`l$|9iKONzw__R+t=fG$acf3i+ZKsuFMQ^6oj#4Rz1F~fGSYUyeH%`V+BAvB0t`5xyA|#kHNnqyGTSqa&WoO^N0B`h6WI@h!VCer1_CLD3i{5lz1>YNGG z$$fOK$FKe1sNp@7gro%!KKVal*TjZf~aZRi)uu8iOeOo_z|kY!v)(dotGIdar-|L3$cUXyg_r1ad+pzON(Op zq?&pDY1^(+bD(~Gt0qH@Rk^ySyeurkZr34LwIPKc#^=Q3*Dgm?jLqwTMJ~Y+y;ABA zdX#h$ygY};O4)*`g;~@jZXSVUH;NVq_NuB=P&s>PhUIZ0i(bz+yW(l;Lgoz);Z`lz zRoR%=%36Drt`SN*LJV%fKcXQwDd3MzFie06GU9YiW%>_b$M+rE^DOay2p&TXbI`H3 z<<5{rGC8|eRZJgXS&UMS38#$z@({A-7j{yJZPE7~> zN&S^Y#O2q^;=aoMTpkJ_+lRfu&JAaX{+W&iOG+M&H+<0 z8)0{~I({MEnAqzKG2v~A@=~H`(j9po>hDi97@bRSpO^+3aCNZNImKU2*W3`?BvI4* zlN0v*&=?_F{j9RzWN7IE5=VU&^*xD z(~v97h9v^CnAu7LTzVY-Elc~M?P!6}Be}3<7vtsz)i-@h!=!&4l+NNgE4w@4p6caq z4Zt3qpIKNc<7Q?rnhd=DIg7v;vRD*xx+LXb|Jnyjt94qX@tfJHCg7?-zbaL~+{RZB zF9>CWy>k=4j;vaT89mV$UH4&9RsCY+HQ5v8u1?bd!j94gO>v``sv`Jjc$QgqYLHXGSAuJg}_R^6#)UG+0>aJ{cG@}>Z zfs(rn_85M8@12mNS2+)u#9}~eEjst6Z}v9wd~t6%&;-scl$g9 zRob1llW%TDS_Gav3e2|YsPxyk&ArdtR!|}3TMUC&hI8&T&=b9FSN7>*fl`CCfp}pu z!49>Cd64fg*k8g$?chPjOp6|%Aw+)5C(={um@)6X69!YmnG64{v%m=uK{asA4=P?! z@aPzZL)xr!mDyX4yeA9(w`^wL^_--KsjdhOJ3jvrW7;;py#u&=`zHIw&5v!aa6 z*{pp0okH}e5BbgF0q5iPeT02me&*)}7=-s(%2w7MsdI3>LaV>So9ADuB2OB!!R1U0_s%72tz;?sj zL-@81JH;#2+oAV?s7NeaU$Pk^=rQh*d~-%YtH%@qd3U25J*S#oG>6>=;iG_7);)T< zWh0%*YHIGSsjA>f_bwzDC!nu#- z*L*q>mHqfIJ^Bx{+_ktS0q$*5Mc0ppn~4k&^3;d}Pg|GeTzFiv5AA5o+lPlUC`ZgYs#K4#j?2eKdAGwk-dl*VSlP;ztRlC*NR zq){)OB8GLyB1Ds#wm#eB$>AfH|1Nd8Dx=|XpQ#iqrhS}gqs0>*BFF1Uf_~Vbv?dk! zw|vRU@^HTZ=yIEWUytjO+VC7i!u<;KmrA^Hyk&FjPr!gTvHVDOcFV<+)TajQg97JMp#^mR-qd>ZVfS%qYG+ae*R}I8Tt-4zxbn zRpn6f=Tr84nDZo+lP3$-BSl#2}bJ$!>t#ejaZjl|F~tmo}Ns zI2dN2{8;U%WDEN*S`qCAY#0f(iM-a?(WK0FAWKy8fFP}{y+in4J`R!O0JL%Mu#($p zepWe^-!T)A@^ej5z(nwOc2utD7_Om9Khofz6y>clX-zn~KAY*coH*{$#5@4c%a=uz zv4}bf0weoy)yoDoC7UV9cMRqL6{!PvKKIl(RF5kf%x)dkIz}^!R%Gp>xImw0r5Qmc z7dst;JI^G}RA-E&Ret>A1R01Z^Hg+igSRg=+T+-Jk_`_!D%xlOM`H+$1kop?CShgX z&Yx~{r1LK}Ss5BZbfr35XGT52q-khL)Z%Ovk!^q6iIL(KNfbuH{D_Q&yIJ<_afN=4 zhC;$zCda7!IDrywu}7!C2n3NS93mLdVF?Y3V4(+Ddrx(w`L3$!||0KpT2 zFfq0R@?&(5>0GWY;oct9?HS}`xh z{5jKy7*kf7b~1*G839dzcjYp%>Xd|*z=ka_ca|Oy6WKRS#LXxqH}SQ26gKUTiuM%5 zua0FG6&QeFgG*B`$125avWuV{TQ(`{=3DJ9t2G2rlTx`gM*50u z9ixu`q}xg$ZV0>@zU_<`8MD8@nBFO%fQBoH^ z44XeeZYJ<3%rzh#71p%4^6vQZ;XuW`r+mx2;f8B5QK;j+!xs_ZT0*{K1R4ykd`2vj zGgs&T?b}g_$#Ytc9Wo2@^Y|=UD%-8O@>$_*04^0|OyqI#v>|7>*GuYT2D7b^?9rEc zb=c`IEogPekMAO<6ipns92ef_pb{@BaW2lIYF+OnTH4kke2Cr;BHt;>5j~@$Plp=< z@Vh^L_i$WeIB@#NVe5V9Y~hr&T)oK9lqKxeo;C6dDzpL8tf=~o;j=QTD2X%}~j zjO;Nf5OgbU;sHv`%yz>XLk2%X*6mXZnVeb36{O-LKylJg(oHy+CMi&T;PPD)Q+nvj zpquqSKuugIbr*GK6){abF;)^9UVoYICpgy(u+MW~l!;|`H|7gFZM`&e`(m(-kD>6P4aT5V7c2CypdO_5TT%y7Vx z`LMiiI9|xTi@z9e&qPbZnv8eMIuroq)GFDyPYUJ;T}&|PvDOfQ=VVyF0G~Rv^gdS= zGKQ}+pe}GJp-0Nn>8zWX^<`JXMvkr*j||)v-5@qHUgBVQxuioVhDGa-c7+23$XQIl z2}?e+OxIux#~Nw^J`A(cBVR@;*>u?2LZ3cz-uCx5QbAK@y# zdA|$S!f!R@5QwCQ*E7gOgBRF1+~`1s7opg#w(IdJTd+R^)}TUwGh-YgbRGg#>Lnh#>3|RWR5JkOXKPg{v_aW#P z;n=l_NN`L+)4Mm3o`{y4kMUy*v`g6!Kc>h2ew7e1p;fX;DF8kN+&MKJo|{}6c^_Z^ zg4lguM5OifY2CmyQ(XV=%^?U&FVVZnGcx=XGzXoo37KG~>yjxmBd2U|E?y$V*xgK4 ziSjU+Cp!R1&Y51a4$l0kjq(Uzs^-;T#!NFT6~`1lvCM6kpD2fuEJE7IrC4LQ2r{eI z173SF#f?CJ%Z+IlG81WqaH>4D>=V#>FKvn8N7ah&5GM0fA>`h82>|J_F8H0vMFN~c zx(8^wyG3~h(Zj`zHJ=w8rsy><(9F0P^Sk}kOhYo6#E^K1HCF7}m9zP7W5idZaT0IP zS8Q~;lpi17pM9$SkFFnS991@?-!!7C$8C_G_IO7}QkW3xB^5w@>^eK=B>r16Y+m*( zb69B1sBa->S^ei%Zi>_4uSPXC$QyAc^I>;EgmJnzP@pqaV>3Y7%(^orR*1U5*$zZ9 zF`X_hSD_9LH#vBjtk{p79?!V;%#J>->5JH73HApO+t7s$%Vyu~urb#9j4^vcZp`^yjsR`>#%H{%bHzk?BHza_}2Ef5kH4@+8L;d-_Y zO_sT4xR6b^-AvW%JKZ?oK+`l6tkWjzMoT|x$J-J%uQ&2~X&CK&w9ZyrS~MC?1T%pK z%mbKSRGG^~lf@G5a2DVGl+3VE693W7o_4$vEAbkP)sUt=tPX9wW$GpV$zZ}Xz&ew= z>kBv8oVAlTQtZaOXT{;|&;Ge85)@#u_yIV1X_XpByR<37<6HY- z8(&Rq_?QbOnEBwjgm#l7g82xveB;a8;0YUA{&u#maxwX)VNBN>Eb6O{vDX4M`vdSH z3kXCI#KC2Hnh&Sq>(sK#R8#(vAPf{i@F~_tnc`MmSp!WN!x+}=LKMve|9nat3 zqht%%FXQ}d=#(nRpbhqM4gM5E4HXYT?W4lroGW*tgTFHLl~*V0zWZn{H%j$W%$}R9 zHaBQtr85lCaqY+S!65JZ0TSZ9*{!2utAdL$yNYYF{2Xt5Lr1T&BCnG2;I=_zr&l%D zxO46Kk82ZkpD4IbX#Z2d+|P5|Y_VitlD__7 zWX;s?n7Gw)!65ah+ZtBQX{A2bmG|u9%{1LL?==fCCb)8QrS32stJ2)TehdaZuc<=< zNDL&3;po{##-p}uX}!=v$G|fmLlzHyHvj@|c;_xhm2lK%S-eTsn7Vxo#UriuHKgx^ zp7?8OMBokM7H(qO-Tlcu1wO8)@qMc_QE% z|Bvqw?BL!ed#RGh$E-6v_Cpn2B)j_i9Uoqk?qiVh0DT_;+xLHhoLw^$2hWME<+_K( zU`>>^761cXmA%EkFb~{^9;?y#G9;m$3p4wbB4NzIf()Bsd#00;&+d-Rb5LsYV=$-1g>Kp{ll%~r2jJvax@HIfBfG2avgMwXJOUxQ1?n8=#BE*z9-1*P=mm??X+B4&;F^cKG$1i=hDg!cCSGU_^Pxx7+hj zvA*akMe$h+n>mssvvkF3Baq-Z;MOSjxYR)Q`O!ykbdY8g!D~fD#6UZ;4qcSgLdh9% zJJ%e8y`tqLq>4^~#nE9GCE9LoxdiXrZ<-x=!h;&a5`Pg?tqhNBGiYr4jvZnc ztImQ6n(-~nLE;TJf-z*D74x%9;y!$U5)4GJM_DAj-U1%{NE@jR&;2ctJN){Uyq_rd z4y80^-eZayR>1Fqj4nf#_-KnMl$fltnCRl*({I6TTE;aBP?On%exM%|i4SVLAB30D z9HoS(FTMAE&?@;SN&-%8{{RGemd^q;+sxu-DCYUNFwHp1KiHjcvnpthjeqC%-YlQ$ z??<7ZeEXArBJaO4JsWv_^807DRNPD0ct*sFS{tFM`@K>T?IN*MZ~_T?Y7uW094PpA*G)1gZJbOZ+1qFRM@sSx2DpKx!?4Pk#TzroSIFXdFuNqbW%0N zmBe3S$}Ef}%?)p-FN0&mbMrM1qP@{Z=JKyp`Y<5vjgF()=@Va0R|%kj~Dr zel>-sawAJ|MW{KYpnlH&cx3hHkcUW{K8!c6#l&6(%!VqN=V!JRHmmy$ltzxI1k?gKW{8FaT~au6E1sHm*< zY)n7}p_qmpvW$Np>`W1)!f{aheJxOdBTBe-e<_ADdcwdZ$8^OER(?pcTVegUS)|kW zZcT(CD{~3|sX!l$uX-3kHWVZJ!Cg94Nl`dDYq5!8=8P=q@INd|sELur@5fZH+d*89 z+WZ9b(U2%lcufOUY_q7E9D@zPjavrUXk>-}?xpQ7zcWTFt4Fve#?y{uBkpKk?omKO z4`^O(Py!#!_o&IWnhc5iEMGX!_CBfuQSaT%FyOjmhB$TD+8*#G_8|w|-wFn&^J&@| z8YTTypX#f*7~wveBdVUvF+WZ#b&X=^LaCY}ejV^`Hc?NjEhp!i{aE$S8Dak)arK|y z^d|G9$S2xK>=cakoS%-Ta*eBU+E>$2`a)mq=zPH{^K2&us`PTyB)5Wh`~Rj@UHnNpwsEy{|^R)X%qtH2>bWiIycc|_) zW~7-!*#o}-B8n@#uiaQZrs4-+ho-$pd1!x&! z)4K9B?BY+3M`d;5{d6qm#1CB9x|JxSI_UK?mey9RgK^Hlf@w+Jbb7Kd>$5BX%6DFO z#aW0az)b&EuMl8rQ$h3G^gqPLVh-Ntu$CFjqtOhDx)hiz+f>~|peTdt5foUa%y`J1 z1pvWqd?*PAeHl8Zi6M$`Fj_;}WI*%x9RasBd6Q`9k1WMeZkQ#%mE#tnqaZ=T;_edx zRX}A3Ikx}I?+%oL7Vcw=y6RpHLrjY+_?P={RLdBwp<*DSlA2NVj4VADi-!GhSi?(f z_~R3OCL zAW@7i^`3seA!y|*cI(E^2s@w;0Mzf&sG*=dX)6>}Ul0(%FYox@oKpUfId!`rTD8t9 zV!)W9ukJW98HYks8kR;S{Aj(UwkG;4Ntl2~)!S#UGvfE2{<4aM!t#7gV?qFrp};#e z%`;c)Ej!n{!CLM4KzEf6eX6AFqFpJ)6rjEh^EoVvBW97!6PTQ|B9Z}7@_CkI5@0RHI06<(= z0cOkl#X!K;SL(F}2m%uxuN`OiyJF7~fTa^qFO}w}f@8QC9IkN2Z>VI_X?^Ar4hq33 z@9w8-N9mhwsC{2swl0HMo`2gXI+diNXA}iiTF1s5uJO@OhhNvw7;Ke|<{vh#;6)nQ zUXPTXo2tAURN|$#Mh=H;iQ;2;J&`GuPLTLahE0})qbtoi-i!gr8=ci9Iv25A3V}A^ z6FF#b^3kg*mn^H?ZGXmqJRTJhU;|(WSW#ZQbK|7!DDsHcCdGx&F(^VIX|Hf;YSG1w zLFLYS$<7!KS$r=6R_*#vqw;}fccHvwViMYCWLw0$yg!?IZqtk1yGn% z+X-CuTJvK=GS-(3QcTcjaM{d&$!wk~1=RZ)w_Q9$_;v*p;-R>f25437H)jG-L{A~U z&eyX74I#veTP`2rPoYXw+jrs`o~&$_jjnE-uus~hFi;7*-QrK!hg+}ut&Zm#0NBm) zA{2aHw>^WCy7(ZtRRhKs25?$m6!|Dl9PN$y&`CAfW+TnfuS#POdxn&*JL{*+PNXos zAjTd|7B%x59FstTcx>;VQs7T7Q=U7(uw-{R?*L9B! zey521%BAo77+l&?7{nzg5Bb#2%fnpX647DGtH64d$wWQfpcZL~aq!aMZ6*kz8-CHtT2?5I zKYX*EJhm+fc}BpuHf_Wn3D8yXN+jB&hsJc5#W^uf_#-{&5!(= zFHAO^j%sgCkHQW)MM@sJid$leaJFm{lvK;c}|36C$BeO8_{QW~+cu_oYZ6~qU1{oPGHgNt6;>2l#3 z7oDD?uFzYYXOl!^6lEGCZLm@<*{jgXcs5Enf`QG$*DUTG2A3xjf+8-t-`%Y6uBVy9 zNlPbiX|slBUt&A&Uk?~qhke}8?Q4B~U^{T7@W=gLr9m5o7Rwh||1}nlmE8Gov2;Hu zja}|fPA?xDYAa2(%{YJB`;QS!V-%a+DhtL-+56CeAY+bu)HM{U@DjX?UB0j+wK3iF z59m$eYILrtd~B{+hZZCS@n>Yt5t`ytY_+mvmDyA6pSPl1-op4BBY(01G4CNKjzsbM z9N?IXj!h`YjNncWmnn*hkmo$-9D-i7dL@xG&Ao_52a&Mc$~FO03-&qq-0OT}32Q76 z4_XllDr?lO&~wIw{;ftfZ5C#ZNl;=7xN7qr zMO(0yN}LsoNSoZME+^j56?#Nj{OLvWS8pS%zu!=Ab||Qs zMp-SIxdMqjqf*y1XmIcdD4_y?Our`UGr89sGW2Ho)fI<~N@~Zi>x>&MaXsT&!KYJilM((1?(HY5&iCvcmBl_r2a#_QBST$Kx$r zbmoQ#Mjryt-3!R6!2X;jjtjs@GB;Yy*zcx)i%`6<*b%eMXo|zU8c@r`{HEW1wP`3* z7N3kKN!Wk<@AN7LAT62uHOA(L_dIeq^y*$3s?a8uKk)2(e8ApyX(g$a8Pu!qT3UCY zCTi&NS>yEgbC?q@prvj=mV?pGT;Ueq=ITpO-#;z55?A<}K62tVILOgC;Wgv6PhYz& zep)>m=d7nhc!#0CAz1jlIqce8+cUgu$0P~b4ir2ZRSOZL)#JRkE6J*>h+>~BK0Sq^ z+d5?90g#3fxSJ(Q(fcGI8j1X7SzD;&=*qKF$m$Jh@Jh6pN8}LU5!$`i8CY6ovH>1*lHmTbvY=uIGRr9m zVjoegt30a%mCN!z@6X_i5jiV?E}qD;VRR%}l3*QHQdgwmAai|hmABdTdUdI>pD~sy z0@C7y_yg7LMb9zv#O;viDAfmr-%TnRJ@Pb$=#}SYxIoGuW@r?wEeDT{U)R8OzORjM21+;%YfQA zz2-ervATTSHwv8`RYAag_2OxFL=#UkvoQ_Hy!r|F@c0O>07dj^mtck4^={VZN+Ymf zybf~u1xFn6sH-YXya`RV4DcD0Z&(lOL?BqBs2(U@5;6xeyPW|ZSNin=`*(( zMNU4qpnazT7{~0>a@Z96BQk zPR18E1v^1*1(T8yCAH32YRI)zP&9D_;6hT$mQ-*p+iL9@YI|SaH)6*1VXq zra?k?Tz~GKc$p?T2s$3T@3I($UGIzzNylaA=8Vj>DegUN4(+9qRG8f>`~amL1-pag zQt|o;)v~n>;$Cc}FtLh4Wws(kj!>)t1Uklo0)4lLx^5|u4r1)tH(1+o_dHBIGyso+ z!veX)`E6%tkS`2a)%Ypy2WHeSa^HR{eV7vAjB^5T;#;k2rN!WPotyti1{6|w34SiQ zn~YqIAOd3*vtHUGwgM7(K{XBVlEjG0iJ_4ok0|XbtzbjFAfUmkcTAb?B>s9`AcN#r zhK1v!f-5mBQ`Dn&^1e?%g=!DSof-yhiIFSAm$omt{{X@xV>a>ioiI1e9gQ0V_~xP= zC|W1ru9U2sEfrLbe7C5hEj28^FO4yMnONAqgsXg1x8E2<16Ww%>=I#AuaE!~6M(K; zfHb=&cWAYPWjo#Vu%;&H%Ipe>Lx%`9bGd|W*Vzhah_5;TmaSY-wiaKEEG2;RbC!u1 zCu#2#M4ZN?174M~F%Gb)Y+7G z;F72&L79e%R0vN|AcsYttcNwT?>Zoxi>hY$3(4^IOkhG6B(J1-wHd1q{;uUe?80Lq z9JsP_bcbBaj*lHsGG_%VmXHw=5cGhGelcEc_NHnw1Ve_uUMq<9>-yKp8Q)HY1Ozd~ z_jr9$aoK!iCxTYU3-U_aF`Y4J4hmemcB5MMj*Z8wyPtQ;f?>MNlfaJ50R^O(UXV*C z%zFjDTnH0tX~TZ-{d#W_BV<6D-q_*=oAsK|0HCV`*uoJ^B{GJ#iKn}5OIk=D$%gUKB#>U_5Z2q@hxD2Yp zbU)S5Sup!hfPptJ{zXQ;XBrq1M4xtAN9}2dYyK5Nlvx2CxM_rEqmpbT5S_6P^k=ON zMaXsS+arhvv<|ju7?A%~tW+T79r!S(^xCUU0s12$GYh^e1AZ-WvY1U)3McrCR4{S< zR-aKgz;rd!?jF|+vKvDcYvEUa8hJL0Tk|d<+r~DTdW}$wQBx7)c|}CB`HSMS<_I}W z3aEpzFqoAcQzBS(bs)NHyuSU<5DrW78Q~QaAimFT;WcWKYoJUfb53lxWYp^1;<(e1 zbAV;99A8N&F#vkhDD#El`W?8%zI}NOj7sxosJ+(MpeOC0pP_uMcFx)`!XK9uOaHjh z=}Bx1r^*j+FACr&E%UPhO1T7H$JRw=T^2%RWV@P)X7kfXc7|%`xb{PEpX*1|yoxAr zD&D$msf#WA`#-X>PY!*GaJtSA2ND%6boJ!J!+=J`%pw>CYyW)xyWXBwknOB+()mJ&mA>i60yWbNzrXNpRhkGRc)B1UDc0?+c$ zzc=b{Y?XH|rbZ6=IVY9xc?b(%sICjN;XX*QAa4Y>GnGEUK1f3e9tv+4sb{sHia&*& zu0c7+K#`0SZD+`Ck3!t9bCJ?wX*jp^ODD!opgtmsr{W@oZ#$U+fQUeryKyWjS>Ap_ z=BR}<_62LEU^WL_YKf-h4bgyv=`MQc?ir4Up$oJ@hH_$kX?V{-Az|L{B?h`&-|H4) zUwGtXN+@Em!defCJd(8sE5zd#n*nFiuma_nb|2eXZmHm{wkS=<_|W-U2786PBspc= zG3@{bo0B-O$VO_MS)blh+>Zsj$)+rNlq>@jf$@@Ib0ZK!rcnWNj80RwQhOy{HRa9a zxq2Iep+86tpb@PaDJs$7jizv}M-w?w+0H{y{P4GaFQtQG+uEF0SL1F;K8nIM;>*h} z18imdg^(Nt!r2~9s~;IkVPO(+6^?Yq6#)g?$7f)X^Y!hlW*}GL9iQKEzRd@08jsEi z9NnuYGu1o8@saOI{w7#aV1^TNTeP#2P2Q5-a1lfUWguRC!F$1m37=-k;cw>qmM#(z z6zqn*B7C#Uet%Ln5Iap9bG}%ZGBp6L@anZPJ37pHKLCTFBD4Ijr8B>uls)9p48bm| z&rK>P2BJ9k`5`zAX=GUx;Ab;CcM?lt3t76G2P^a(>sYYGuQlFU!4Hb*aSP0^hlbqU zXTX6kLsMcQ5*So=t&Er7f;dqp+^V$vv&#zofJ91IIYw?O*Z=5)XRroIE1BTNHAX_R z*vYXT>4)Uj_gsn_$a=zdaqmz3)*GZ}NW2xTT4d}Rn{%lkK95?t#K~;ZK`=MO4kKeT)S|WLx{el(6+oncE_ssKG`-3sGPfabco&UHlbx}0D!#~>P{|;SFuhpnIi+Ur+KLz7x94n{GiDChB)zB6YY*z>HRs&FanEMGxD9{D%k(@$ zA#^F;|3o{0pgw+z$tzRoY_}406QX2FTCJUm%5okjV$blp70zw>)FMOUVE9W$dONJE z_3vqaQIbnV6$G8YEF(Q4k6!uBEM zM)8Lfx-HV?P>iU+I`)c%(@Uw{GIYU7ZGN~8T3H!`;35Oc(zecD0s~nRwFTns-1Z90it09Uk}P9WF)$#eMdF$gwH_l8 z&c7e(@#)+Y3Ki8e)bA_6d0wBK)%Gb`#I;ma{k~qSP%eQ)z=(MA4q(RQnNa49Y7S=N zB3seu`=EGCAX3`~o?JrRjN00{^q{_(+_IpBpDAkcO+FVRBm9Er?#W+7;1DRLgkhfxg}vT_RQJ z6YU(|6eHmkqO7K63p}?)9a-8OgcU*k*VT{D-GDX%T#bjECM}bcRWagqmg95p3QgtQ zMXOatzFV&@snN}d&i-()NU-g1TwD=gU2$yVM%OFw2np3@GK1`9X)aZnJO>Lron6;@ zy|0o=8xxVkV#Oh)1k#`e0#*6Y9f~?{XPWY-gjg8al}YghrY+(=%--Eo_I@DPc_@kx z&wW!a^_p8QUWTlh40R$OSkHrD!c9ReS{UfOeJ*&d2)7}!!?ONWCmVuu_%!J@)vu#;8McigFiV6z*=_aCuqMG_uDR5&m>+V2fd8l}oNu!FqZ+OS}eA5yL zr}jADl%uxWJLQFrc&LqugwrBLZ_>9%cC?@grAl~9u~~%U2Z0=FWfievP~p9ceAE=q z5IFRH*jym4rA-=Fl+zX3lC2s`!B~1EhMiY(!5=2RtxD#f@NgtZ!>J&A;6=Xkh4HWN z>CxrQA|LZ2VuxeCZ@bx7hVrOnzUYZ14W0b08QfqcrxL;XrRlVMgI>sP@rt5(Kv1Hi zG5eL6@eZFg_3tLcAxRg?+OxiU@Tj0mwFo}S3g3|x$kR*ELLmdu3$?|G#~!wDLOc4T zd)_Gf#u_5J^;kx8l}Ko`XDLOp zIn|e8IvZIz=Yg%-=%-x#O?df;jy3pZ34byLwl11aR0rtYyvWOB?UWaM@H}oN-v>Oy zTtK@FpQej;k-i3f4Wlyx zu8$-A>I{dUVg^@qA&WdLH1kzv?=~dcNjk@SzJcOqglk3$(7~Seg{F1;z9hAF`AF^S zmha=3JxEl4$#P;-olw&G#!1`20m)X$;iOchHy6yCKM!Ll?eF7D>e-d`so=lV=*WWn zKJ0)5It>Z}i!7nQJ5@UxY{BriP=BWk7Bmax4@!q>eI-DD=I(>go%}qGGQ9a2Mfrhi zx7(G`VmxH9*pWk=TslR;`sT=zXygEGWp%xiS!7P$#~v#y2#cM@8Qts}(8TyUUdf5L z4!&?)wxMEOihR#7eO_xE#?t!d^C@g|3V|X5YD#4aU^y^U?e~S5zmiJ}KjM1b_O&h5 z{EELx+i3wI(KFYfVx50V@t_8*rUlf1a;xUtg+T#3-Vp?D8rE!sE{~<@J)$mtmM^U$kEf$Wj#C8=>gT+bM=uVHsrWr?R*hs6MhZ4^y{Kv&Z+m34Hcs zbxtND;$4BU$`><8Vo!j|$U2R+ zX?T_q&8ur|a0#s0jm4;KpurRHG6+h{Cr_0dkobyVE`;xCM4Z8QW|tY+JpNV7%9 zlBOD+?z-L;!xXeD!>j|f4^r|fjQ0gKyqrMlA9&~~(cH6pDn!ifs#0saKKqa#A0pFT zsr?IGugJorivv(Hr?yPEHT*U`YSA#}FFkcmnP2lg!>!+Fb`puAL&3$;bC%(MsUF@H z^re?Pp3sf|oPC{9GA*DyU=8F5z+2I3`L@{u8|!bSBO8re4H1Z$C`af{^{8i0iozr;?UnC#hebXQ zZm4M@vuj=Q#@0^Mib7$IYM%{8+R3)=VYgUlV`Yka-xbs?Emh=?5tYRva=NOyo~KHq zz^IgTipm^|=h9wT52DOKxnWCK(*7#|DL~f0O*4<@^W|}7VJXWF#@o+Mq~=U(pr*@y zFFE#=fP#PH=NO(I1FM~l7-w{@yTG-|Db(Y+?sUs2L~?B-WU2ul_z`uKNc@@T!8Z8| zQ}m*TtpGqrs!bAE{pWf!JWB~m)^{f}z@iP79>f1blxB81m-bt^;`M`p{2;8Dk^wjy zFC~O)>auoK-I5L?X;BC(D(xQO7qGB`i&r91et8lRhttWbim_kl(4S=M+o@Y50T#f` zX52=x**R}n&yDF3VFr+?uyDJX@SdLwov3A!2oY+Jw!9Oc~i}n*pQ0$#I-?TChE&kRF#geM(jw zVXfor(w!TE04rPo&yIzV6xL{tBDElKx?hM3E10vt&MxD5J^sunobK-35n?38l{}W4fEv=u`>pd@MW6PnJ05sn_*6E0oJudF-K{1l@mHogeKaa9)SM8EVPXFkn9<#nV4r>J& z1txU@sS+AVZc5ty`h~S_Tfdja86&ff0avZWnS*WwI`bv;8fxLQP$GuhT)I)5bFsT_ zR!?$uSrF=(J9>!!@1(>0U!zI*)R+!hbSzX7t{rVJ^D`!;EqHciWij#=TZ@clv~SG= zOaC`QUSLowPEVHv)=?FAfZ{pbf-9QrsgEgLl|B3sc|ls!5%qdIF@4*YOxC4_d9v7G zgR*m9lUL}Pk!g))nq33PX|wZOH#NoO`^2%8eVj#)xJCUf8s{Z4?Y1EPf5Y_j#p5)L z3bZFh<$3j8qCL+X1(gtCh`u~F_-gH9H%kuf{tK&nqr8(;%1j5UfDPBJ zJJ^|=(QX+-EAj*yXjffUGZkjPi<|rYcLNVRTG0F5iSwr|C=+hOCM(Cf!~pTx#Y;0@F&E$IGcfFs*@KwExSVj9$jl%ipU2T(tr!JCNZqKrjz}Pz z_|h>n<`V+yGYZ7s48ax!XA0we%Ob5eO_9LOd>I_exz(#V-*e9WcYxEf*UzltG+FYi z8lhv#7J#Dd^AC=&*0A%%Sxc~Ct%umk^K+joOT+BG zZ8^<1VVM~YTUCr|j8|sS+v{r)c|Ynprn;38%@Z7Ku)^Dwt-^Mx9fqKQ(1*)y9*iLH zjw*?AQbRa!kBfSy-YUcVeN-l19oE#+a3&y6s?xjoMuTmJAi+KL7S7?2Raa1#5U9%q1 zjTU+>c;<8WZaUug(Xhch{+IX{Z#Z<&Z&aMJhWQBLD$``+J`zJDt4L!eJ*HGKIIFe-%Li%vN3?2*L|Ji z=McCc8^zzl9(2Osz#0ELanuU_Q^P;ALz5?8K|v>yg^imAyDSVR%H=9b1XVB~ZKZY{ z#3o+-vn01%UlFab*8Pm9|>D#t+5)B!>;6KCRqf z)nJ8j!T#b7DRsRqb_z+A8W$pO z9?TH&J1KkM{o{xb*m&i}_r zZ%b^YKH|1&m2EP5$bXv`6N#XB)&s<_8>ge!xgE6_&viE_ycbDL@YNGHUjZt*`bXvY zlIx6+);$SbJW#u2wSQR(n_xrn^c8WUtEtpXXALMBlI{f(LPa)K zthEBdR_97lhKZ1Z6T8c^tJH`Yn4`ZA zUhNWpvU`pSYHuE1{7yANIk28neQD}`pzyY*!q>te$`Hg;*@@S*E z6W`LlfQTIU6bZlHY@c|B!&sG6Nd2wVkI_-ysxxSgm>Lf)-2o5ioz9IRxce9tjqZdV zvwXs?xkl8{d)q7a%E#dUr_04#@BgqLW1GkhHza;&c>8#9AIq`?0k3%rzhq$H;4U}c zFfc5Tz`yLfw>Ey&Wwjgdob=nvXS_#HwD{gIow& z3fI7UtgKvS&$Yx6M^?02vUETTTWcmGi~|Dut1-II150Fhk0(? zm>h+T8Zq=uO)q7)iK2_i3(n-Uj*|252QGaj){!Bi_!sA&kTfo{KekRWp)|Ns1rmuw z{@zI=OvS&>*#FdRTYGX3NN0J(v6kj>_vVT*@kBmTI23}1Q)1#q@{RWItuv}MU9sAv zM^t3GpD^tIwht5KfEBKZ2WNh*RIE&%dcL+7A!dCGaG@@)gy(@c*VQkDZO7oa{{2P= zPx^w;xo8Kvr!*vjE4xT_vaZG@Lg2?w!@4dW5O|UGo)fi+wBOkJFTWQ>?xVcQp8Z9> zY{`||YNhJNUYV!m5qD8}DK}>HZNh_lR~;HN+{!#k=g0Tt>Qs+&uQ`Y zFnx&93i13-b1B=*I5&E{f~kE6eaD@rpF&PxCzLZW7LPR767;*ggRtvkPeL-z&h}|r z+mvcTYuN$B3lkw;ZtX^VzpwWUK{RfwveVXU)y|0*Lu;wxfC5S%Hdk{G-;)LC{qk76<fz&;T!Ig z!(E8Gp2|2>Sh;Wa3w{5QU~@3D*^L25Zws~laCQ{?0qg2E_wP&MEdzB-25qKDBZWG8 z^4#v5!<97We{Az|$c1$;d8QiMWiOu1WjShmD0A=aYs&)H4MFfEZZO^iL;l3eQBE~J zZSFMQA|IR;L%UbFmG@jyv~C723*UOJz)zazT6<$Ac@JN9EG~LGnqs8D zK~2E*vqBG6Gsb3gRB5$#Z2kat*e@h?rJH1&Z0D)NE@&#rV9Q5|-=l;nQT9dKET4Pg zRS5U|nSpf-8KU3K%`Ep2J3}0zBLRnhK@fdAXc`>Hl+>df1&7KtC2Zsra>0w-8P+zb z4x5M^q&#xYqmlBZIZ{WJ@EQoYGyI;?Iset&QyEn}A-hBjf0J=!mTgvpHQI1*(pKyO z;8wJ0SIsep!w|*41%LF;orm>ilmeK^K~Ob1+08~k#l=MA=N>JfCe2tjdB!T9IMYZV z4Te<(qyJO+Ag7eJf%9H+79_ilC}6x80d4`lw-^1w9urpf*!IzLP>=)z$~{Cc=Tqjq zisFFA?i%~@+TG_ExK9qJj>W3_l+?;fDvGKPzB)zR=@>5=s9fhXWl8ybJwf1OIgH6$ zz^TiRu&&}UQU#o1>E5s6xoua=Xkx_!p(~F@MWWD!?}8gyM>WaJ33#+~boJ_Q$d@%{ z?1)-FohZNpY^SB*^}fj+UqP(C5hLzj?doYB0;a15Kr5+(>}mmC&Q9DfK~>U@$EAi! zx=en$b@P^!&S-1(8}lcux39to%B2Fcgy-~w)2TpJhJAz z5m<&b`43gk9|6-QsXwskzrWcuPv8CBE?ZNwB{lU15Vewd=tAbS?%uG6V@@*pF;Wh1HAv`BX+k+FjH{=1aBrfP+UZh_olO2YXUKcHR|OQ zFexO4*AXEe1C>{E~P_;}H7 zyBRepBjFSW@VHSker=$G*=D%Wj5B*8?S{upI9znls%f$CXJhVaqAx*AKjLCvW?JC@ z0IPj{!&^$z22QQacGYWRR1&XhwAp$!u=(1JZh?T)Mx==KAi$y?uB^$41g_T>?AF8Z z(^AD0O@mFH9dY*JGSx#Jqm=d1AjOG%i|%Au3S(z(N9@zSxYj11bw)oR|247t5Fj98 zK$41Ct#!eK9qC0sgj}L0`r>h0(u_839c3ovfN(=yK`-b6@Ez!_+jE~OhUp&5`%)Tt z*#X6Ykc7W13fS|RiT15sjy&SFDhzcjNL4Lbp$SCX_j?tgXHu6Mr0p&3p43?Wussz% zSi5S`?yF0+$Tv-RhBqTS_I%{ipS(p+`PM=9YsW!RbgCmO4eIC?D7MPj&U!lJMjo?% z3?`2WL9PcAqZCQs-Zj}QMp?f-KO{JIdEmkI11N~M>y2om#&@+;bbehx5sz$q+mn24 zp1HT}jozgWnoy_%w#2C?w_bccdan^de;?6;M2wPGRg>#UQ?i=*ZEQGE=t{6Vjr3=0 zw%4M7#gZXVqWu&Q)MFn{oE(^1u%$)s`kgvma5HEKygyluIs1rqepr|8dqJfT{nM0Jg1`%aXY@1#71KtAL%S2owIs{6!k##?|GJBi&jq;TvK-UX?%K6!u5P>QE zjH^BWmsQj%2FzdHAy$VE3w00Xs@us!n=k*5x?z5h^TdcPXI=AJR4Tm1v%Kl?hgSFR zpYfox{vd7PDSSU3WOLRPE^~lJdvcs}6JQj3Ca5sD!Ya1)j6j)$+tg#VH!W=P>XPIc z^ofQ?3$Ln-O@{AY+#C`$5(8i-t-qf46}@@lv|VHp2E?gdXmueJPa~sGE-$-DSoD+Z zg8r{FN*D}H7vg_v3JO!KZ_9K%QMzB@WtIh z6DN)CN$)CW>dh2jj3au;IO&wt(PV8c0!fgf+ewVWiKUX2?`Z{tDP)w)%$pR)VR~`L z$xdU$`a^i>&ZBo#LV)u5nC4ay8gxVW7~eGVqK%zPEdkdA!y!nY0KRThS$RL(|iz9 zV429wP5T0JBQ~_{=Zf<%$81)kuE5_Bbin@~E%^e+jngg{DvkAq1%*k@vZd)B*;R#Y z2TsaWpfHxj0$u6uH#REhg`SBml>KHl`F3hb!Sv>NU2zaVAmjs)XC znb(OY$Z1;TaM6+M5F&7;yW6!@L%jmymJF5KP>*Er33K<`~P9Q1UXjIVfTZ*SHdw#K>M+<5V}%d zG&V@R)-6AJ$m+`9;VPinRR6Uo6&n18bfD_jnEfXZ@Hg~M{-II;6sW(ynWm%}imDDB z_W_~Z3?jk{$N*pN#}oFu%Rg(!aIGT4 zIZJFzo0LeO)-{%=ndfu$E#u5LWa6hf*5K=2?%lMMSxCY(1FB#T!iAgU);8Jx z!CxUezfbfH4SUvkWanjcon9P+o{FO-I*k`FV%9aei0~le;k_WoLYJ7gAV9n#re=zWV?Z%e>hV1bk?6lOd;CrBb0}}ul!7Pa zI2*zU-m43EZOSZrhvw>~f5wn4GNlPmv!W(MlGl}Xgbjoe4&zIMr9(ouJCsuA+@(zK zkaf=s4n5=zdV;OJ2x-n=y*S0Ccpp_Um}8$MHbG>`dyK*=D9y_PG+E-&kKW+H(@L=+RU zOA9FHht_t7!B^}1RtXnridPq~bUJE=NNLRoLSfMH@QV^{9eO6+Ar75CMtsOC+3dCE z$yYToj&(^iy$0z1hr-dR8J8)KX0^XdoC%a5?Y=Lo|4ES&IVKTJIom?U=$G-jmyHq3 zGB<{hmk>tQTgMTrwD#EExIb3deY3-=O(A{`AKFgqF$WJN1g^)x(shyV6gjc04~~P! zw}FvXgK?8`up%mU(dyq|@Ny#_Woy5?D91WW>Gf`ch-4lvea_}W)2I~I=|p~FPqVym zI7Z5jzJA6XK(NTBM{_9W;Gc~8}tKti3-rnORU+cL@|lQuH`#Tc7lAKUI3HIZUMaj zKBf)hoj85fU-$taA9F`s;JSGMN*goxz#OQ+GMCWx@P89 zlEIJQa^o2ADnUiPR(F6NX>y$#4YF;ISgWbAZfY5Sga;oE9q-!?y<)~_{oqpuCuxME z1wtaI@RUmCPYYu+i(QY^NY0A3{TSM8_->rLb&Q2I7DXl{s4FB6ah53Q4u1EVdpOOt z`zbTqTwJ&wOP~>6`(s70j{GMj3jlj{0M_CcEh@G*QLK3W6PJovl_)sRU7DpDOZihU z6uF<=ZKx3Ey6UEpkS~ss8yaL$-kqbZYQVD7HRTe~SC`mS$gqP{pq#2@uC-Xm??7;) zJ4Srvo0lr?xD;-lNG7}f-6G`|#^_W|2Z7jH$NooT9i>5rV3ZeODPvR^F(Q$$&G{#r zOuIR_)^3Ij+A48`?0x$asWY00Mcv2lgP)T$AQW{I=yEo2aI?O{cIM2ls`uk%*Om2i zTC6#^ysBuewQ{5}nk+nkY9gBkc|llWwTI{?!~b0(=f&WG(Y8V8$kQ^`ds64p)C|?m z(oK(}KKg~`#w>pVck;|?C(?CFryO`l<7f*;$IWh8cLG*KM9mz+*8kfA&nan3z75aQ zAU+aJk|a!sqKEYc3S{>T`J@Yo4&Isc5=Dgu-{oX0F2`xwr911;3 z!XC-(1Me%_yIl_vRM!>j> zcEDJ@n%hhNxGT*lDDV%Lp#@W$VLbpA*&sD_~y0g{!RK9PYq2bSsn(`jr! z8U0V=X{&>6l5zN>y>Z3AT5gDz`=`#b>qi&;Z)2D8f ztt^AyUgv2<4@uehgMbAoi%TinoA`=Zy&SFMsjCy#e0!#S0j!cu`Qr1eunz5EX~#B>Kc$d>F5`d~Vi+rpd^m{| zg+`#uw7)%*(N;;lohL!mt%>T%ufZ!dBhx!893hzXmYv>~Q|IiYcueEn}hMSS_cqS0VT>t?)~o)5>m zNK4jUsYT$bc1*$*D_L3mCZn%q4OW7ljc=6%nj7*qR6WDZwnG){`|tvUw$uN$S#iiq zn;eyEH#Q4;(IMx(gVu5|-#J_K1WaNYWhsAmeU!`Ezi$<)dAI{QQIw9VfQjNHR9Y zBmJvhI$!+{YN7M-cV(<5SP$IbLo}{A1Y4Y-4G>-gkR@>F>K;8SU09#sJVpC7pSU}0X=EtEiPu>{HGM*(yTcFpN`Xy!FehOh@?+U9d zX{(G#{M%(b>OxD?PD%%C?y!FrMkpOJkS-F(I7T;|9Va;Q6x1Us%tLep$`0(Eol1 zF|BwfDN2?KAh?UG51HhEzrQVxY6hjU%b2hrulUAqoPj&1ymeksbptbPa*<4;Hm*Qm)JT)7$mrKtxCfjLrIpwuS=PJPmUq!VHqRK!t?ntkUi*K zn^W4bG{lf<-CsONhtrjUw&HNQI3PVhAozkMYQ zB*hLoPeu<|Bt%@#3Yu6^W30y@tf>N|@CrSSmgmDA5@~9c7E!g_2s?2NG^OHn-5(d# z+MWFVxBz=}19E0_RN^(4fmK{gO~!M~ZPkv@`|SwZslg2h8$plPqxT%)hWnEcqi*9Y z47VQw9cP6{pAtP|MK@erzGW#J^zB(u5=QbDIL7jj(urs9MW&_4HEIipm{P`GGpYi`PBXAO3j~h?_{#V%g8fC zCX8ZRvlJ$|`cg~2i+d}CjTnLL>n`RLIK%_YYo6*2jpzBOPx8D@A=p`oH%TY%G;*vb zm8M#@?H1L771Bm{V~6uo#17zNuNi&Eg%Wz7SpqL7nz1VDWu9q?BACS60|9G?#-jEE7stFOuZ4^(*PBHCL5vdRmz5lC_5_Dam35w88=o!L&oE11R;p0U}9+ng#1>W{fywR{V6LkXZi zAv0gkhiWLp)^!l~be5=2kRUS-yMVywGaSF< z!tJr3AWP!;<$ni6p zcLbcD9PO3Zc-e^HwgybXK6v}Y?RI0eX2K4Y`J^g2U-kE4>$&4O<*}fmO?(@6d zOXm%wV_t2(sE3s~pMs??1eD2Lt7Oc)+9!V=I_!$G?*ph75NqGdQezI#w0eW;1TpXF zx4|W!fk_?)5wBJ2PB#+JV%d_aawPFk<&t9^%3BVC543(b+cwS;u`+oUH3YIQE*Wl= zY@n=ws;vJEBDy%j9d55DtTjgAaLXy1iixgrlSuLwozBzv%{`&!Fpc(O7TQMn2LC0~ ze$)WQ1dTO$#J#u$WW?l<)afnCj`9%IFjv%g?pe4R5UX#{Ls}CS#whlJMtgROq=s+(3pZr8imY0%z{w z@yJ_JG#q|MnOkZqIWYPp%5*svjPll6_z3?)@ad)&g+Se8yV^mBWU zp@}c-N%`YkZ(edWr>NE}iU8c|CY8dpi<;z#hy=bw>w%b(N5DHj?D zVTj3cFcanmZOpGml(fTx2+^q2Qqr%STOhd}gTBoYw8V)T!c$6!v_gCNhh1w@x8FC2 zQ3)1Nh7K;s1+8m{5Pynh5D-{M2X2k@TNRrwLy^{;uPvVpJ5>z6cqiEeT_E~d({-gm zeb0b6Kc6cq*bi$UueGneXRqLNLtof0SEKH3Ul}gdJIZs|CHf~VE-&|Y!Q=4;H>$|u z^(p4<9pcp@!xpwP+)A+aiEsV-NT1Duw1y%uUmL6&7!|*(R!_*hv2a{NhRhghrBD86 z9TyV%T2}LHm->^`Z}yWD$}RqPR`Y#2qkU+|5GHCjPL^Mpcu2@oFviiS$@;4)8=*#$ zN)3eZ9hEQ!OSaOvT{~am3ZFc|8f?Bfjaj(!ZZC8|RPy2`G+vZD1~|Nz0<{Tedbc_l zdc$~WXj7V@Kt*?hOGctxc;dU?*W4Q43vfi@(-wlcEsc`lhnAyuQNm>EVh%a6FAUdg zYupIuncnSszJbmTA9^)J$rhHha0V^rwef1VgN4o4OzECsBo|riLQA}g`7$w;6iCEp zG~0xLT8Hw4?gYv>cNQSQEPOOi!Sd8#dy?i_k_SM_BnMzBYCjZ%?1UpH9b)oW%OPFb z)>=d$`UzwPXk_Tgtc1+sX}0Pu0Xy?p%;1Kmz7ztp#xHT~nhZOc(HmUUQ72aLwEDsB z)tU?z_lls5A6}OY^K!T1+wwVCjmd8c!^pgDXCJNy-6|qG-^^}8FbkbV?FYj4ZV2`( z^c6N$ljQRnw+XA>?nn-957fC|(?uDSdw=O!LTuSf1xL0Er((g@eB{r@q4}J?F5`)8f_E9jJ$N9S58GJ~!p=(TK>;y6$M*&YgS0 zGAJ+|-b0<+B96L<#f$;6ehsg=^|Dk7#jJ2yb+aX2kIEj3hb9RlC#03D@qbY(Gf93@ zV-NWo9CeO~De>`xR5`5+_ptrfLwv069?UhLCB+7hgzp1!q_wW<$#Uow}sOCUVLrFzUmTJh% z8x?+G?sbYqZ$iB!cb-}b+98~fLQDqb;n_ z*M59OBo1k4x%Kw=<1~|{l2M`_``xAUmLaIqL--02DptA%q&F~*gIiX#|IhbG+zenq zc%YBb0I;+93E69q;-CjT2S0jdMbP5pCOwJ*fCeX5_x!|)vS5bQLS43Tt|CbB+WwgE zFPmei|8gk}{nV#WyHBybQW29Gt8YGJvmJ-8N2*C+1F0*N9X6>W%TBo()_rC`k60S1 zEqTm71QJK7?ndjQ>b_gfP^13#sX&QoRmJZx^n#4>63}BQuieH#E>iaijb79xW2gaA zB8?WBmF{a&F*C&2zBU%6mZ730q5%Rz5-c3_@%(?*n`_#`!5DFxHh|HVPUR}yJ?E(* z(PGzVNY>xJMfv)|7zJXO1J(F+o*V8w`(_Z{VR2)a^Lunx{n;NI1~bN<_NdR2o@oF` z1+#pv_I8s|^?Y%EGd~i()EMmc7aAOk+E1x76K&->>#g{x_nTAf_MtZeCAWDWdeU>l z*+68u3ma%rXMdGBDs%W(I*@mJZ4i86j!#&O;1UGSDbDpFF6&sjuY7NQeBLtHyX6{#ETd`&F6p;npM*|K41V^ zvN|f^I*AQ;LyDo4?^M-AnKTf=vHPbXTC`uzyTqILS743D)B9dtwF+aC2=i+&Mr%#= z0}frIOs873cc*b>Z1>1pL+$)>!nw$@Kp zZari0+FDiCZ96zR)+4q!7pK#kqZ%?zU|=>@2an$rJNobCu!iy^Wm>jJP)Jk)Z%;Xi ze{iE$>+Fdn6#pyw?k3BZ0q>scS5{Rf82C$>`gPxlXVW&Mn~f!1{Z2+{DJrs zUCi89+h+9)ra3BvG;dv~ZW^cJyuDh)gRc#@7|?p_Zq9aoO={$4tP<=BEZoW?&~_99 z!Jq?;G)e?^Pu!aqP4U)!nHqJ-Gl=obwRgF?S>K;uSMr0<)W`j6wc9?M8$a7($c7^- zaxk*thG{)I6^1u;8vSEfD<$$sNkAaFZS}|y;x14-=RV&E!rjr{41Vn8LWqoOu*x{B z%=<_Uo&aA;w`9b+>gf2Pds-g-H9lQ9MtkLF zGs;=>dB%o78fuL;?8)v6dFj0zv@=~Mx_fbu-J2Yi_+%uk-N?dF%fG0A!C#?syE@_>c z+o}fM7&a<1u?Dt=e=c%>@KX>JZ){L9nU?Twp@sU(ll!n`mDuS46ZYx4fU(jx-c7Iu zkXWC#nFF7^1j`0#4PAHK4p~CGX$XW>@QlhWN-58fD84l&ez|~%$U`>t z8jn8Y@Z7$_EKp?xn8$c@atT~g*&3hSsn!OltFN)Y&dNsX)iCybvJWRehbqImmr1(L zS#UjZqgE8(wgE>_H%Idw8;gH+ssO7pLl1;iamKGDF0u}Y1g#K=RUyNtvwou6(o~u= zsq;riC1zjPb2e9Uz|%1~Gl|d-dSpkt`YJxoN`AhEryU8~iJZx7E!n-F5;f|(Um-AC?$Mr5ptD^Ip_cchXjAd>nv z{`}a*vU@fHe5$NnF`h_L$Vlqxg;b>Ls$s%*2EC~#X@P%{QhqjA@OA-7@=+^B`~#R` zixV6ipJG{X9K;|~)hZ1)#X$uk;qz4ceR$9pb|{cd5f{O?blR<2j`uZMUWJ&-A3|tI zuN`~I>J4>2-LF^weg83hdbrq{ehODQe#m{UbjR)kH#$*jPlaVDehnf~l06gSnl{h* zT|T{uD~DrmS7M+s%;D|$GMhRQzX^r|q+kC7N9@aQ)z91vCOEp0$mf0&5L_TwnSh@=VvzaJGd)i5|wWj8ROOz2t*hD1~$ck zOUa2eBT7Xt{99)Q4Z9j@+C|yD(?)0U+l|YM(AL@qv;BZ@R1t(OkYd zzZy0AfEqymAj&$R=+4))U?*6`MdYk!eqrzj{#5dB%K`DV{wDzB*;ONXALP9&B~IoB9lzZIYDTzjVmO@iC(Wxk4KJ?XA+$afsbh@&v!K7DSSc5Xi9fNx-lD>BLzSz zR2X0^ikcVrI^#BrP6~sy<%E3OV@$ukBITM9bAdYm-n=>K`|R=I7AdS{Y*neyg~wG1 zz5SD%O-PrRlpcgHqwY7H0+c9XB579b2kdSQo*9_v``({Y)pB8L!nk0CXIuJ(mQ^Lr z22LhQR92nfBT{jo9DnfwqJn0;v=kTV1JBks&WG0sf7nZ8_kRu}T|ErO{wvKUXtAdd zbbnWt9TkM4i!{Xfb}eI2dz?ct+($`*Bfx7oXV~`EX7GTst&cIJ&bf5A#fFxd%j8BDGADdBmb>Tu#;9H9v+h?)xM^7sO8M{s(RAPrHMT`x3ctz-sSI z9>z<*tZ2wfh(iAVHx|&Wh~f7)w-cEC0BCszFF96e*tsNabP>KNrznvLj_cGDp+hKt zg0J8~)N}R{ltx`mtdgxVx8Q%&2QpuRw6tZ~vPDg*|7gmyXKzQEt01a{P_B3Qc!INd zp+Gur0=btq=u>pU)tqYC(8lNCXxSJu8Td_`rCTwd<4=JYE(m9sf3u0VM*?L%Pd-pv zECx?~QCgL_;vV0$8$wjoG%n8?F=C+j-N$FOxV)88F~3n%2l4xnTWd>w5YxR(d>G+z zJUJ;O?ck3v{#_^jWJAxgWm|Ax1Ji;ND=NKGhlTF+5-xWR^@jDqQ*PlgPZk}NXUn_j zLL{;Tl4sS=BIl5@RP5#~u#7@I|>gK6dHl0KTiY@%(3(yw!m z3TOwHA+KESEsfl9OGi7v#rCR`F07sp`|qC3c5zLrpMHD`!RI!fhw~sb)b@qa+3$VY z%)0vx*+TtcEr-^sQn8gQ!rk%Jb)%BZwpsDP9O{WQOiLN>toG1xKy~grs?gG)i;uuo zEgsPp!1NV|Qf(UcPgDw6dyznJPG>DH8jd0lZ^nX^OsPhG-5ej9X=az8)tLpp-@8}d z!X`sLS+L~P3sAl_2D8a*@WN+lBEDb$oUr`YT#)Nw@FL1+H!mtb(39T~^lJQfZ~kCD z-Zcrky9K*{xfgM3v=Tgef2iEV`L z8a;vlq%VTy0m2|i_XW;LE{P=wS?3{;ONN!O zUxUYCL@Uvuq~8@jh`^-X^LsG);*Aqh#`#4erIa}8PL8lUs#0!jvhp;k*-tkdU~t!2Oyu=_Xg zU}gJBXY1ZDKTjEl{IyZvb&Hvo3>m8uQA-7!m5EEeb*c(uva3!_+cWUp~YhrME%%L}A*U6MoH2_;-d<~tWSQ9?fi#Aw(dgu)-SirAj9FZq6Os6=6 zrz`5E-^S0(*|nEOthC-1KP}#$hZAq(0EJuM|NSz+X_O!IeccZA(dG$8nZ)>OOCsPBtYe3HqwR_j|AIxJcA&|f>rk=dzt#!I zgd`N#o(aMC$(8t9T@&D zHN#yppyow$`>$bT@f_OUEwuVD$E-|G{=vi_V6f`GJa7LRd>D+ z-u8kl4b4c6JZ}0@x*MHSvgw%Cb&Z_y@ZjvPNXI_xBTE;k2r-btW9Aqi>P!oLz)8K+Bj#J@R z_;q8dIbS7As=;moKhwH((U1)^fz-tzpyQrDUX*F2}THO9H za5ll;{R|&@@hU!p5`Czz-NG;6Tp0@?I;L5CglR#L_EZ}eT2#0M8vruFm!LFPdq|)% z^-Z6Vj-fXAOpg@gc$WBiRr{)eziWS0tZC}CNR5NT&pAmD>&+{a0GAO)A2d+m4K4qr zoAecM+5B5v_&)dl0uH!L#tox$u)(qn+KWIcujFM9wm_-yKcj(0<<*Wz?vzK6?96!~ zOacqxES;5lvrHs*W`He6k3YJXnr8hGh)16Glxl{$24;5ju$Z4<%?P)0jSipZK}Wjttvt3XQ=`H2tGKTT z$%VtJ z*-}w_q>CRsyy{(Tt~aqE^X$82;Y6}b=NeGlL+WJP6qWhQLhw~CMz`vE|WXt1trRq%zDZx;+d> zKf3>~K+{FILliI=L_$e!{};@wI<Cm2 z0n4Si0=#iU=WUFUCCjDq6TJvHBk@q&TH8^?IVm!ep-@-KkiNyy?XLJNR$jAFs0R;_ zew1h|zd7@PJrp)|5h5DFaIW_xfVRU_9ENqli*8V}rz ze(x9(`jT5K$h*Fhps0MZ63nR_7EwR0E&vDrP9)A}Jx4aVjBPa;ScxnmllV@fNCLp6 z&i`nulDcUxF7^jgP+p#0vRT{H5p7H>@ZyO4Hdc)ZEGF`GUsz zABuE``gRi`wH;V%llb!P^@);RtJeGV&X0eT>iayQJ_QF~x9&y52i17u>=$rk_v9MK zOHFho2fpAcMg zWV#8mxI0?r_z$vFDL00I6FP)}q>3yuG9I!Znr(xN^8aQDgr8UEk+7N4s6+8{BVi); z$5}fyra4VVbw{*Sc2;4yBYQQ_f?dlzC-LhIo--s2o+XJ|$(eO_{m!|yw#L+ru9FGy z-GMpA;m&aQ6s(skS;N#ubd6ACPKq9_(|bh*Jk<~(gGob4=WzTZ7s08`^5hAOs)Y#y z`u2~zYKC|ff;KF24s?mC)ri0q(i6fz&Jn6FZAPYXvi=#2kbdFu%gwq z3{x{%kVi@6+C7nYYAaECg$xF`WhVB+z0Of8yzxP@nz#eer=afRP3e`XF;r@RBC_f= zYA7>0E*R!bdvi!uNWH-k1EXCUJ&K$Y@)vX7G1b3FQtSt)D> zc=I464x)J*7qT|vJithM;yZ6FXOXu=GF5=dP2h}yToTP&&R|?1M75P7UJh}z5wto8 zxLtu#7popNRlaPGPmuBm9m{l?SyE zI<-!@Zod;ELY(E_3I(vO&AD^$>z>SlP%j@2FK}!dr zg(TJRf*4m~-Cq$ueR2kv8XD_N_I=hA@V4x=Ks@xuPCrf={BW&1e>1&5#lsVZpazU0 ziDweKWkPGE5+0{^0;^E(Y#*0}wwtZ4SHAvsi0Uoiq!JLsRhY1g1_I<#ZB%&Og zxfoL2nsO)Dw6O3K<#?@=+$k|t!OONrQUSlp>)B`Ik8##Kw2>RRTDbI z71&Rl(qZ1gr!20PjBgiH!F*nMB#72ACiGT($Dy48ccT2)I37@3O{%tu1MmcB-_SmX zs|S`sb~^*BcR2vXycI$ASKnxsuq{QeHhY{#vAvb6;V(=~mP}JJnoBe?#dg`gnD#Vk zgN9VaA=Q8h3-ui?k&n1&Xeb-|g;>{CiO9`5BC;^Sqi{u*4wmW3^?4G$s<&3uY%1fw zPCB0M%i|CbXfw%N{K8NW6hY=hyoIm%I(~%q0TaKkt98=^x`YYkFsvwMjiHn~$z&L& z(X|gLILvt#Ayk=^2)J$LJSYuTI)iREJmT=6+s_2^keFy`(-KARUC5{Kgnn&FP3526 zNui@%x#(R?A5l1p?qWx=zq&qnA?BR_r7YtaP}9enTI;-xhmp@w-5F>!5FnhRPl+LK zY+w*LY_OZ^mL*k>t5k!3WO(mj4|iSTBYyvHqJOhRP`l$0Q> z>T*RjyA`vgvTeToX@KlAAr0Y}B5#s+O(4aWCKU2*QFzc-mZ$FyPMb0eEtq)S#K~kf z6npJ?sSAKl_mPZhpr&Op00MtHEElXZSnBlgd~9e9_Ga0Q4T@PAK_A2(hDij*sMWR! zl2sD_!Y@Gq{$a2hRW}w+$8gQKvuxcYkY`R+Vcm*qzMaamX<&6ju46g3CH#9k zKe_4tw6zL|b=8Lc;yK2o@Kr1cHuiW{#~oQhFuV|xhH}7F)=2l%nik}Rbu34p{WGc) z!!medbJ~RQv@x>YTzUpBN8(Ehn4FfgVn4H`VMrs03lC#lAI9^uoANW=n_0pR4DYm< z15;77dg&YGz-ZC=N~XE@SluE|u8$-ZK$3*CM3TFh!wQpSlv9Z0UOy2t*D z8;QMsKY93SA+C1&t+rSHrEb1gdVVjwr7|XIxn-U-2Ovr?33Nuqd*TTUm7S+7N*vIb z{0tZ4n&R%FcxsiZMLxD5D+mpc+s0TM0x6YS!F?zWK_Ud7G&WNh7YFJ@fIx6bF%=6? znF9*xP&V9Xepkp**&q^Sd88xft_(`oawBUXt)kR!A*fWyt#t_hz zPRPlTDN#$$DhMS6$FP1BUfkSSDXXC3qNHt?cChS z)&D7VoY3`U(t#4{9T)rG(jRHfSf4x`^#mDS?jss}j;c5rKOM{WIX)O5-R$@3|EidY z8x`gRvd8BsErj}3ri3eu_Bptr%Btq}-?^%-qw!*}OY}Ys(3kEdcU>9w!I9xm!Sayw zWB&#ezX1ipyTY1C8))5eG4sjoFSz6^g4{V=YK zXtln*gJ|q}N_t)Mt%O6n&?#o36&$dcS7&r z)`1|AS5OU*8hx-OfaJ5lf`SD7>K3!sMf9=jk=h4>E>n7KDD^pi`qn`i)K4mR5ptQqYMiz=E z|J|^_BUL6Mii7U3!*b|xl<|$xeq@uPvdgA&%03x;Hb5Swk><9|ygaaSFj>8p4n>lC1?*qH)+MG8yntcNQT*8pzOmM z#-CI%Ewu*oVzeb&9zamJ*wB3Z2?RGtyxZ)J^gmArVN^<;cA7LIgj~=q$u+kHo44}G zh|$lk#++SukI=(?zfj^JeSQb!UDd=x?b$KHA2)QjUz|Bx2xMJ4g^V*ziGfrBlojF@ zxz<;?UUv;5-8JPClw=0s4b>(+(^ce8BggcZIpzTY`pkIyf2hD`o{qjtsCZ+UAyvRPWtB|cZR==;Z z>#AKnu-9W1w_D=H4Di`Ih|cMflvw@ofURpV4(1=Z@?4cDs-yqoK7nD|gPi(|1!4!! zW~-3Q4(e+1Rg}e%4w*%WDJjBVNu%JJ_%vZA*=W!^M z{NBXJb;w2XcX3iL5(#l#nIuRcb~$#fh?|j-d!d6m2mO zEfMj`A)O>v+(i?L?;I@6lGMvKds<#gdJ>u6VHG-vs80j>(@L{UEQ(W8)_><+Dvfr5 z0uKdaATlVrZ6N9pJwzUaXnEdGrS>e_+8UK$Qk%0FxgC6E1||u6$$5Ns8r)j znG&~$Ds50N(fSUQ$L}7Wa~fY>&(#+@f2E7+!qBD}h^aPS7!?1K)N?V7&j|d|rZ^fz zvFt66e@n49c>acf-=Cbf$*lBK7h(yg+>!0fBL9XfP1`7hd>EJ|WB{15;X3PI%OoRK zk9DFec#LZZesS~!m=x!T%+c5|6a-l9OhN9pmEMPf=f_nQCGKF%$>sqY*{W$IU+~Iq zp20J@|DeCCEFcoeh0!u>_6+!enYqIw*euv4EJr1^l(RY`oOXGuku5LHTYtg|273dzc_`7_} zv}g2Fvu5ktyI9Fr?kjZ2<@oED(C1qFpIi2|&&>j!(fDanr(n#s!9fw21uK*`-iabC ziC0dm;AM(!4b-6~x(kRJAYIYa)W+wTk!b4yv+Uy-&ZXTmBHE(d6wvQOBZeKyBn$KU zuA{yxf}^7a0eW7VS%82%Dp_M9Zw7S)DJ)xEu%%NZu`qH0E}XsF6Up&Df)^K9>s};q zAYM$B`cFVoOQOyz>xNIz36}!mKxaj4^OzAT1`DHtn5l15)g%Z!mLc|E^GQB7Dd}vvJIxISB6^ zc6pd0HFcAXyK2BUM8Ouu+tZi=aseUR9X-vfyRbaO*!P5q=k-3oI4tsb-;)2!6KPn( zhO9I(82%Qo0POv9Zz|x#*Zl+!gORghgCu(li2j&!a%*LTjS*Edo1xi2C<-}-lI7=y zs1i?}tcfFn`g@{x`3zo9d(7KC#y>R!dGz@xM}M$(t3gbl&VSAtr6i!rGZQFW#&7hp zkw2NYWN#l*1I&YR6$2pWT1A7ILzuNO5P<^Sg^Gs%IhY|tW4hQ@li@cXV#a$;~` z!~@}8W~dZK^20mYh}#A^K_+R<)#>1N%cVUHQ(J0SE9^Xg%bt*D?Aio_ebLx(91A)p z^*s4Nd2ehGs9E9(=1X=q%^#s#W&T_hB+OhnbL(!vXjhRXy)1XGz_-Jr7tGj61@mWP ze5NE}nyu#YUAvJkm3%8aHV`LuNEa;nPF?*(V#{yFEZ}ET!O|!nM(!>gdNTirkZwMO zv@7mZ=h$qW0U7SWtoo44v&tADX*&45fCt1`MH-n1b7i+AaAwo%OuUT07Ih*o5EC}X zb1E@0to96*&8nSp+OS;j-K$_=`Xq!VYd zp4^1cz`1`XkFU)^et}=WZ9nt@M*`2Jy|05HBec!t9rjVT?{oEdNmf;Nt$;Z6rg*SY z?v6Ey`OFT#r?6Q{aL0Bu;}u)j4)9lrRh?r@{=oTXoNtLpcJ&0dfKR{F<2i(Wj3yHY zkLNqgN5h1G*tI>s0}nti+F+^0BKGegp%p)srdz4I zhj7~G8@^m0eO4^emo_4GF`cnsWH95KV_NisQ^Xa~r_g45UO41vJbH&gNF5E1Zl%^HvSn3QG`c<+ zip6I54DBh9gk9M@-gv#IohHD;y{vqa@9B7rrrB~t4w@!Cf0 zzb}}jC+k~Zrs}y@T0to4z*!{-QYaa_Xn_MV8iAe(f?pdy9c)%Qhb&E2hL+V}unP_clNxlZE%_X%KHdvB4W3Z7!Q?Fua z#Zw4DQlIAh#-NfPG*j#>m&TqWa(eJWz0(nW&h=2KJ7mu${HX1ytN~u|TV}}J_M=KL z)ScNkJ>k`WA9ibbMJa05=Iw^ny%#V6g^__JO(}#*?9mK+nGYogw_cNL1PS^rL1Y{r-zd$^`e2OR@WC>MDJ-f)WZ;V4}Np*n)Zk z9;kx{Ofq!q^mYq|DB#my!bi3;T*>+g06SQ258a1g3jElUa7vIBDj$ajT-Sln=^$uP z?Xc|l-#dgbIjjzq*TZU8_Yn7dlAy1lduW7;%mu&hI=lVpv-VsC8pfaXJS~iTsgXPm zoRkaYe3S>@{rHJYArto`fg<4B-w_gi_g@U*r<|_$+M6I3BQ3yWXEDOVrlLRl`sO z#R=`s%{LAzVR}57a0mrx89D3n#C3X!d*8G59*7k!%*dvs3mCJzamQHgC2;bmlz3X; zf9YyolraeLmkmW7fyGn-%Jt0_7;duzU~optI?Jk913z$`4(K-TgOnV7bwo{ta&5W0 zS6G?b#YaG457<|hNgb*_LvkMK>*UmlgK_bpJp(ue{A1&b=su$;-rUO> zktoVVgtPWkB$~6u!~(PqVzt!S!rfr8?Ua^lrq%W1tpq)n%QzPRC#i*c-8@2n?e$pV zxpMrDN4%aY_nS%`r$U{pjt~P?w=}?xnDvgw9KJ8ALNX=j)V$*VxB%1?3SGcFH*Kz^vGCJ83P5L`SGWt-G;8-}$eqiKrwQycaM zcdAJO*eX|tVuh~#r8%IhiLC98GoS|XDf!`w7so5l6p$p+rfkTAkG%EoR^Rs^Qrlp@SlQ9qqg>hhD}?IcxyuN()E* z7vnj2sS+yz(O8{$2~sD=CtL?e^L&sq-3f?I+kMk~6q!7wQr=^KZ#7A9uv3d)tL3 zv#pKmzDv>~k$3=B?dmde5zf)2B^=35I%J)PlF8=RB4F+_0xMXi_TO|3tC()*RNvDE zBan2=>Ed20z3F5#O+8QfPkhvDOiJD4ydtS(JPjAvmoj}}r=(rTF;f6vo7e(6mV>_u z+GjO-o1H{Q+FfbC8*pGJAsCs721aI%?wz8Z{h7;S0a4GB-EM^wp6Ix~MeyVgCSZ-r z@hMs|nZyq^l1Dw~Q7ytC3bqI?=z}nU)a#ErL!qi~qa{yUo-VY@(Ev&FcjY~u9w3Vk zQ0lC7{?xsRk<|nyl;8M8jTr*@-!p zl0s>nO(GmVK-1oCP(rXI`Y!F@`lOUYXDfP=Y}+Sw7wcWT*1sf3R!U2mdIh=9LnZB< zu&1=eUX&4evEVZ4uD9=^moabt<$0x}*s89$aLQ<1lzoYacgda}UJkaO~Wt1@rLtDy22&xqe zf~+IOibe7XX?17m54A(segJRK8JxntrKS1v_X zBWGV8Ly75Py8+vzSDmwp&PGQ+d0JcRKn@jQ< zuAaFvY_~JgliOBn16pT80m^_#R*MM(sw%N{fzo$sLfKwynsYV1DqChq$-^@8JBk7Dh6#{h{~x)H_TA z7P`m&GPwL9buCp2Hx_B#ww2^5FjWp+TNtYQxZWt6N0%`0Rgq;A;AYJM;3&Y^a@FkR zPJ61xG+(W3Tm2xHxwX`4gY|`yY~hVXL6}$>(=>Vx{e3qDa7s~9VZlMh%<#iI65+mu z!Nv+*@mky`3a5muEgosda zI>OGorI=`NID-~g7orJFSsk+Emt(2so7~Bdf;|wMUo%99m1Uoc1;c(Fc1@L%y@%M16uF8oO8KmlXtv73!{OB7~xK*;ri`jKxW|F z?}ETTF6zYgjhkD1oABSqpGq&8#x&xb*LMA=g7%ZHu^~*`k5Qrs8!HKBu}5)X@#;Fk z7fjF0g;NcF`Y|Cyh6+20k6Zf=#RLcPN@#atcTHGh9ZaZ1*p{r-u&E9h>R2dE><3Eo zX*_bGgk<8hhYXQ`6EVS@HC0amE7tAM+8sf*D1o&*NQr=Jw;1xe{iSI+Inz{fM3wDn z@FvFXREGFp65zvAj`)o-PFTx{Y+s1bempR1dWwbVnWJcjwiN%AtR(CFjb{l^=wOU0Hti9l{kZ}l|*QD5f2pTUCda5Ux_v@Pl}{9^m0ad%C8&= zt;kmQxlg?-K?R8yu#arwp1%5+akcSex%Bcf@fj;j;ugIQ2cuhkgc>y9xNZJ8W0v|S zJxGRB=FqZ>+n~Gj*wU|d7JI7(5_OtBgB`k8p{QB(XcQtP6$S9)^Gy@`b~M}uIH12f zRitCLr-9t=2_~-8GAbW97CHB(TXojt7hjLd&q)|nDtPD+LT^M%PFCqOSSYSw9fGj1 zF3)*O^)?_(^oaqpG7S`r!u)MGN`w1*oR4XF+u|>Q^s2+O5q=Sdl{azC6wB(@6FxIK zM{q!IniCk;LK+sV9?Hx`7}q#piLXH*>GtC7btq!XiYe#Ln*KqENpU4UF5@Qo(wPBYhREh-CooWR3ATwfGa z8^WUp3bd$){PiY27(m3q{;@qK`-PYd6T}x9?1hr_;NM6_CI9Uo@T}2GYUsUVx5V~J zg*B5(7hs5?FZKV<*o!;D$kMq)pqmBSMSe!K7&mOh07OHRD;BiD$vgEod`V_`oBHM+ zTLcxrIeaJ>epTI@pX0K(y!+Varh*+DY{_~-<)Prn>Uqcq#Hf`nVTY?%CIh#vd1du~ zW)Ezw5J!+wTa`kkD6Qd-{T_AL&W_L@Z&%Gj-VBG7Ci5ATsGA*nleA}jbslNOrXZG1 zudO>r+}D1aFn%HfCV#rOE;@JrOJkz>fsvl8;*Oowu6VHg!tE79tnS7P;cIka@dSvC z9q~cP8?}nja#jS-%U|pwYAQX8{DSia5IPkQYJJ*f`}=)iAZJGs4cu0NctTTOjPGX^ zt(-ynkV;r${(j?gl+7r^#!h;{hgOzYz3-!JbDe-yAPeQfq7L+4%so(0@WgOQ3D@fh z9a-bl`!CiHUtQ%lFb}y5BI!Gk>KyRR z$JGDOp%_ma^@IT|U8b*uFd#bRMb_68$u(N=G5g1I37n#;djV!%8gX}@GN>y@hnzX$ z3zjyTQJO+};JuJoe-V%fk8RkF4HxJMrc%;71rx7Z_IL$U3X<37?-aC7s;(aF3GpxO zE&H8YEHy*a0yB-fZcK{9(^O9WE4UyJpl;OdE-P110?jeW+g+*! z1-yF#^%O^#Ctj zKM(K0c2g=>z|BQ4BIfeQsC9)4PS?EgTUSGA`@Hi0Yz6^D$0`WsaNz%9Oeo`;jQpL^ zTjx?7Q?UbzUUdXpiCNIL=MgZVSV%GF1qCs5=FuhWBgfDwkBAO}S`kr!bYcliH}I&! zOtA(3?N=k!n483np;0#`7oA~w7%3%ad}UIKtK>@KhlLrY7Rj3`(>aqfmCzZq|Gf94 z=S39L=+e(Gre@~0zRf~~cv-_DvfsL0fC+0~-9O00j9`FrxsCV_C^UL>L<~0GSuF?66LM zUv9y3i{@Gm7c&+K!&AAZjgdD9kmtsKX`DxWgF;#SR}R+mWqqpLvT*$6TIntEkYjUb zVfNDgIdze|9|VPw>NTK8f@pMN1rZJ2Q4k6k|)20eBg$H zH7OJoQrdg8v6@jlG_YCWquLcnNsvj_S}`ryDC{Bv{GESXEUy*57~+SPh`LsD1Yp&# z_v)>3{}IHg2`!xN|5QAXKwe5mkkf4?Jh`um#{NV~IZnbkJ|1G5gN^!eRcqSr<{}4utbO17yz+4sb)OBqYo-{Yo;o3#j(*9;JP6isuzm&2URu*Mw8%+2Phb zLzu1$nX-^lexYj~+Vop7NI^8o|I^A*hsh!O)yQ%gvcvtv-X59*dFUr-fS^hYf^7$B;T7 zc++|4ZT2@B60i;FSa7*{i|weYHRarJaoAD`*r>eH!v?Oc`;Nd7i;pkUz;_`Mds9 z5y#31)=Df{5Y6jmgrb&?wDsxA>W3+>qOyyQpYSJ?*Oha8(-S6Pb&7o_08_;;PYf8!J(1eTsA!p7XUUBbIEO=o?q+|} z4qY}^ekTX`HoPt8#QAITYbaCE6OKBF3|R~JKb2Z=^Z|b$SuqPX@FnKq)dW|ZUWT8i z{4nUjF5AbAT4)rn3eJ*}eQ3uI`Px~UYe&O5h7kfB<qChUw$#dGx83)uV zhHpHU(SyJOr|R;Dr9E_TrZp?44P^RY188^=*)ZM zKXiBidME)fjcCst(9hcLPg!?D8m0ZPDseNAIm0Yua@QVLXXktM;4jB5A_Z#KcPoHY zkacPRfK~^wQNgs3A9*qoe$JA$eZC_vS?WY1q-N}C;C!ZgDt!sBT14TZAJ{tCq-jn+ z@%h)bz!WxaAp}m+3W#8stT+}dr_Rn$xMK~}6qWZ~BEHUzj*O17brN09!RY$~`+0%g7{T#7tqn~IXB4z|Rh=JM-iEv#DMdURB z{0gG;ttX0*kS4I)9kz5Y9W~FZC{rvUg+&Oq@jTcw=1rbrI?SyN7wYr-1bIa(YMnCCHV2UBu{L*2| zuIzo1FBZi`Q~%nr-ui24brX9^@9lllRh}*DPoTaF((mgSjfH+xIo4#ZYS{WKzK^dB zo^v|FC1&J$fu{P4WIq$H2eWM16C1P}ZdJ3;kW>v%7X^(BU%KfE_msOKn2M01!ZEu-#^1My)UEQilH^5zb`b=9IdQ*(vAE>2A*=VHNu#;)c>Z!o_>C*!1@P5w z#c6>d)?DXD1m4piNbbDYho8FGM9LQ{&>EywqJX?&NFmFg1!O{2>ScrED*!Znt3KnS zpkwZwEQ2K7QqL%IcCgp|SWc-nQVc6;#|Pu`i~lo!Bq$39Jl?1Hdn4{V|Mn$ zd~k$8TDw5(gMc=3$X6@;8+<#`5_8sLYw`|;i51l`Vp*ut&b?hTyvv`ok9wWCh)*Z` z`+1O$bL{p@37RZF{($v-13V}^&`T38BhOc7QcKoHWrRX1t3lk&5H-x2mCKkqim^1) zW{~0NWo_z~tB1%-BH*faJAdL6WAH(&MeNq#T+Dqt?Sg?mU| z^s~?_$C~m2uN65pw9kYGXr~L&6oqV;l zKBzuRh@)OTjch`r1^6O+0`d2pM+XpOz(firQ;5!A_503U7HXTpSXPGT<(^b+{T4vQ zcT_N`FO?0ob*E;>q7ebds3W}eIg(EjTo5blMLeyx8&~y6+7a-#s}=&LnX(Iveqyij zO(CK2<6+<5f1CX+Vb^JAm`}m8`qq~Zol8i0-w=gvH39BSwQb*=QEUesYuF>s*XEIg zcQvaHiXl9WqT#g757M{fNnTdLw(w$yabo_#ppTd)k>gk^F4nTpI-`XhO%}yXn#(w-R zy9p=zyZs4)%=uMtWno>#FG-+-v$5>={mmdOn-$J%M9udR$MY4OZD0wWuL#U4dL>d3 zGK@YnEbK+80dg4bnz&{vdl*B_ zwP}eT*@cw*U{B}eV~LiPv{fHR9|O*e z7Mp^;PNOgy9RxEGtG24tDVQCZX%~`P$-~#IMy`qek|ckzDaox-p9ujp?Xc93pL-s! zQPcnb)Yfk^r&F_BV&#%iwhit;sQWLpXK(JD)YG;mgKmJ}oy;5JtJrcuoiw0P*bpL= zYB1J)J}_-@{@j%T4Zt$L=M{~RW)hWGwuhN568d^Q^iwv&)&QfDV8F#Hh*cBg^ zU~I!(>gMq-FI9xsyV)*+QyGBEK}3yqU-zIGv#kyl9>xa^V2ldRJ9%SutKF}2Cu*zJ z)|>r35yI=JNZB$viX`&7_=U;#n<6RTu%0I==KPBiR2 z_p8*B+4wS&@4=X@>AOnGnItfm>nS1FzlZ~`UBp-T7yJIfw6=7R+3&hc|H0{9-n7DZ8Vj{e^`r4 z4Ku_)p6wcgwJtLb`-O`H*!K>AH8qQlL1$(@QmuUi*J6`P9V}Hx(|+d=5D9H8w*SE( zuRdLE|6nqk*Dq4e1tsG)XTEnIIBHJx#9Bny1UUF$U?=+;K&IBVu_9*3>9t~)9;!~b z#NWAr_X;+n$Q%yb6O5ZI%WYHaoS^*_hYWzA=w7nKGbc}oPa2VA*t!}m9Yyd1oOI0` z>+aNqb}wkhz2o2@Og5VYTX9I7s=|qaQWn3gdq4{5Cn6~Y(-JyF>rv=%=0tY6f3%!u z)Tq>o;lsx(jLB&44)#^g9n^Sg3)-|ND^aRh-eQYxQ>I%Mi7RaaWQ2$`r=wPO7Y43q!?JlfD^7*l(@)RAR9&b*B-cc7&&z_Px36x{ z{)7!0X|gA4!?|=lRGW=!=1XCL3NF4#X3p=e`M#KMxoV}}P9g|c3!+h=l}?My3M%3s zkA0>Dt+!sUMuov=^k|KtlSCqzb{ylk@3@fs(=9&`NUdT;7qrg!CWZlf7J{9ot_H{u zR55|;N>I}hwnjY`d~$92SfHSy#~4GmSz2Q}e@K9VV%gS4dq-)efI-ozRH}7g|*3aHaFi1~zaH z_S66$4?!`sT|rbW_AjjyWSVdrm@)>%Mc*N`O66Sr42&Y>B>Fss#&&dT6Lj1&Y>FSm z2T_SfJ8QpNa8grs30^6!JtGT$y`tsZk-C10lOAJ9JU)RxhX!?%6V6&{46%RK_Qra_=6I^AT~d-bDBmlWD(zUJ#|zaC4u40>VM3f|)% zUxgmDJpJ&BXfcX&+P+>v$?Lo681BCMCuHopl>WV5gP0;J(q~ys%ik0m*RTbdRZj(a z)nlNUST)X=DJ!ox?7-YoF$Y&AvdWZ&Lul{;0FmPvG+oZC8t{q3W2r<}Qf@Or;((6R zgrm7wjSo_Kt3a`ePwsPmr7W7oZb#;J@A67W`Q@HhH>&9Q((4$=?4 zp;9BKs zz}qE+pWQ=Bj-_J=xU-*g%Mwc}+^r2os!}PAk7LYnbCq&d=Q@rQe+3)7(<58L8~LJ( z;Y>CQ((j zqEn+nz~|2)e9=HpbDx`IYjTkZP1rOb$>5n~yiQWChWoHDKPhwIUzj3(a|l1jc;1n3 z{J|U#s+63D)Ck%mGTG(xLCsigZ5?I*QX6&fn3=P76?w_5OO9sn9zJzi(+4xF)=52F zAKIuW4uDy%<7#nt2f7r|aB|tka!?-|yfI|rcBVR}w!u``;jM>hlw_SGwFDo;dsM_Z z@#G3I>^Y~`TCLmHlHuOZi~FSVNV?>orLkZ^n_5WT#P1aX%{Myzj+s(;sph4K0o`w?QzC!Cb}mJ(w8HfBqIWz^ zP!J3=t(*h}b2M2X_y6(L#Yft(X&JPuO4)5i; zfP;on#W`{Y%(_5&SmJ8M|J*btzs7aKxozN=%(DHeXlp*53R>XBjt`vGY9Y9uaAm7uXH(Jl(mDqJ_d=h*{ggIVJgm30hXAZpjq3-iB!+aj8HkkAB5NQ%7)&zV zHyy@HT(1AU`~xHc(3ZFfmvJ_M+;_X`)-sHhl}yW)G!AV>Q|zX+2dd&^+U&bscFhO# zAR_|GyoJ2FsCa4~{j(=VpPhZ+)VODSgw}m$LIG;2)TtyvVKAV|%~6ZEMWSUts;K|b z)+Rl9e=%CdUa)g$um`d-@J^(0VI}S{2VsCdLS~`q^Y1&$Y2*}P1%}NI-d-{f`khD;l){-g?+iP$!srCmxN1i# zv{={s8H=`hsi(pluQ->ky0u5*9a9_*J?RkeC(l|z1%B9$NK1d+zb}O5Q-C{JF!@{X zl*cdf_$mWZBKT1fM$Nbh^Ne{R`Q7+#-bV2%Y4qEB6AW_3BgIZijP-V^!541@LI!Bs zudj+O@4S%TkgY4+zmLBLRm}orns-5tY2yiC~WJvZ0}D zJt*f)6C&gq|5kfwmweurN~0`(VT>}IkkV|VGC<4|;Ny+0e^JY)>I&U2oIY>8;jrhO zg>J2pckRfy&ZDM%5u4yl*ttd=u%Xstc1`YCgT-TE6KpvsZyA?(F@M?KqBK5NxenBQ z{Z_y(AKe3Lo@_T7U|dHHn7jbS~T7N6egx z>I%orD^#|}npkK#?#sv$2 zf~usYKyORGm&;k%BRystT&h}`+9vt-y}r@pu}EyX6rY8u1#`$t`>o7rMqwVwn2cmI ztg70LwN}sCUh~(Ya-`QfBIdF_uvkFWIbC?3%QtXC&f?^pe#P+dXUVAZ-3se+ z>dd@Ux2C;N|0;Iwj*UTDKhU#mK=8!7Sxq=mm*C+3RG+kT0WgrtNcW;lM{_DnhB7tf`MJ>~mEV-G~I2cI{O*d|v(r zXI|2gIx&Lt69}CF=p9J|#d^Z+hk+1Mx|K3gZa6aoDjVE|T*8OxB*RGrq>d~^a@#;m z50xaTc0H)bGeg)Oaz?AOQCy2bd2pR7uzJo* zr5lc+@7NM(%Ym{}o}pc8dD7}o;P&Pibk{WjJ~T2tU|swl=e@m5 zde=nb?draPs>oUp6@HkH)iJx!P|d2Y*N>@CoctW>eIjsg-A68SgD!|P)v|jBQH@>Q z`AVA`ki9ASrKbkh4glR|$dx9O$5#<-T>vvE?ypLvgK`JXu#DJAB(ac|&i=!MA-{Bw^#j!~vJn?6 z%=_U60rrY#2;d226)nxEpS1ttZpe+Aw2GlN>5tD{AcIamR@ruT=CZJlo>GHQjPdgQ zI~n|vC={L+lkP+RT(guNSzd}=?1I;FR|9B-@eY$am1ZFN#^a`*uW~1&z7dkgEf0gtz9E=@y!C^}_?PU9 zzRM0oHIK;BEYuD*^Tdg17T>8n^gxoC>9H?{F94cC@L2+qIQYD`Fau#%C-Apg!q89f zIE)-2xGIci%Hf=Z9T$52nYW)Oel=DzaLKM!fvuV#H&TMrc<%P^dJj9cO~=hI2KTH% zkts}ASuV$j4KLt}hN_G*p;JnMxl=Fa;A-vP7lCcwww!puvG$KOn`neX%B7}S04n2clkuqZG|R=_$8?b-k8&n);w8j3O% zxdlC&YbRK?cE3pQ$ai=K5!7E!<;HFnurcgcVI(46detue{|g(MNuUd3S7N?%!Isd2bIKft`=)3!fL(@; zhsv#o%1cp>i0=I?9QlGkf#M2rp{DO$_xGQiq8Q>`x-|6VN+F<)CgU3_+Q%;Y`w_1lGkAmex>AwIr zHdpf?)}{_Xe#Zt1w87rs-wWR+_o`_%8S^O76W7K)5N{@v9&93=;T}B#W$OI&YdeqT z+-de>^S9iVrMnSwrK5T+BEom-^V&joM!w31u`!Yd z!bQ?3)~!8xV%Xr$iNLVVs5v`CFRb@fXn2gH_m;Q9C@G-x7M|T0LvGxOhnvfVEJ}$8)Mu&j5SmdCquxRE>&L6?5rHIOf%7`^v+gGwX6;@5 zxp@SHBk9L6E)5v(wtr-tgHTTk*Yi`h?QyGz?>r(6k8p;qUZ8G*oh zuvNc8s?dkJD1fHN*VRR9+^c~tWgLJj6+&fR&FncvGqZA6y{ZdLi&pGuEb+iSkvtkB z!ur=k9lxBC`~uZX@QpOahaxnj5Anhq?12}`{RdOYU3}8}90F6n;2y=3#j?2V=;*}5 zL}c|$;RksWHQ9?Yy7DEqBAW1jEBCTqdXqL(QVVHCTw?Uh6{eU0IZ!i$WTqKHM0&tQ!1Ymor5;-HZv1{l=a;J?Z-^chAEtwOJ zC=97m9N&Fg>yAw3iBCORS5o4>g3gn1F;0>xLP%mj5?bO4atIhl%EMD>@%K28c+fkk z4(ePajY|_06t^-ZfX59cUGmk|LeV1z<1S3SP)7u9?pBBmqU+R zduTZa#;C=(Lh%~04CfqNJRnzL3-vr>1RfGY!Ji>Q=aOlqVoK|O)DlARZ%_DY**Uc& zIwvy`t-H-A$%dR}72uj40?Z13#_v6x9cWu6SuwdwnnL)1&GfxBK=PArte*#?y$&KW zqyap29xsUqF(bxMjICJE0m&tFL`hkgw9j6tbp!|u$7MZVr)7nGrU)ATo`Rkp&+8^XYuPA;#M*o($61{JOa%`wrNFQic{<1CVkU(xCuIh9Fm~50!2<^~@ zgox6TeeE@u7Ly>26q>ae6Xw>&p-biCNevk#oJGN(s3U|B6i5{{pMNx2sh`xWKx{Vo zPth6XZy}t-ufg)Di(#&*oVpKDhIs1vPL7rB*SM)qioltyfse1FGP;Q6&6lX?RB&Kw*68B7lXrOi;FY=6UGM zf}zMiC-miYi7OB{@urO?+N~o1Yi7FkJRs;cGdMx${Ad4=OxBH&8N5Iw77-)Tv%*Cs zyJ3Q(x$AVMf_iRj68d6wR+C*prgK@qJHxEHSlS%(zr#RP^WJE0RTSx7It9j$vuH>^iUP-w?pQ;Z`8oJH7pC~4LKhfhOE))s)bF%mAhQYs zbSu^6OJTLb6ojCl+R*hrn@3U4#m|D#$@p2eh=YqDmysUB;0I?dD!bku!@w5&2Be$m z?ohX{eZv`C%->Ksy1+E%{iWJpVATT!piy5uX(&XWBuum04rMxMVn~>2dF}gs0)I zIjuoPE0d|BS{B!Yl4Fpv1C8XnXBo(LjWM-#XA?EZ0UbnZK5?bor%6E}fbD*6o(__Q zWjm`PFD8`rY+##c20($t`Pu-+&L#tNDH7*tyHf+giHnu?ZCLEq>pV#uM;F>M6;QE; zIov!QSUQ*dH7trlW{9_K{#V#`ySvJ7Hs5cSW<_tc>?A8uzFdmH=&`l8TFwSx5&9sn z9PfPgQPgOGH`TF0O2$OCdwn=bhfsLI&$=<36fk%t45@<$v7-%7lc^_3V12D+lwM)3 zFf)iKhOSt9h1zArFhd~7|HNBUCLUOSkupns9JldE9v{m_@Ib48W{p{IjUf?qqnY7P z>H!Jox_F>q7|C|Afh2X|&USRE+_Ibaoz!&!;TqQ6%#i`wu}8!@vxk*) zwk$_E2AsgDguD%t2-gK9HgGhS!EkMGxp={a3Kpsw;nM9&SoCjHXX+B+=M6To*2cm= zw?*(d;w1p@nmV&S{p`s-{3CytmOw&gv6}i|iT8+}x*8oEk;pbCKg`gKRFtIi?HDFy zR4j#~1y()^1b^IYRjCnIzL6+aOzZYMhGuQ)e2>L%;v3w-xbvBWhy#qcxJ>vsw)v#6 z0Hs3vjy$z%oSq|o*$-116GQwZn!i6o-S}u==idC$ad$NAk{-m~{YlAdKC=zjv)N`Q z+OkdEc@tb)M&<1I51f=yCo`WgN;pi#MWqr&5`8iPOnAwlm@X|RA=MqcXLnaG53{f_ z(9cCMHufarzC;?{{bW$HctH910chjWOeq2l^=-0FS3Q)rSkxOxr)!qNhZ(Hz>iB@5 zb!LCX1~A~jCHv9Eem3$*eg-{Nc%90t{)v#%&gJ$G``qjn*e6M<9k)ik(y7whus;gI zSUPx>7P*nH>-@}O+3c9T{Tf$<#NTqzD>a6-YsgQ}NnNdgOE>d#X1(>ia53mrha}$5&+2J2G1Xqx|!n1(Xq*W0{-ZhL%@(x627D&he;^v7xg#4GXe*TY5PSi8Fd;< zE_czV-Uy&?W2+7bSw|srBg!l#eB}$WS%h;OCp=E$nWX4KA?U`PADG2?z0NiZKl>Di z2G#%UQqVs}MM4Tk9#eQCkCw2?4=3j~w#R!EeJiiMM6Ed1lBu<8Go2AzA8b@4Eqgo! zZrA-T7m@@)8kJ3i;!xWho*|LketsXwmEPo#J7+x}9fK}C7z|)x_hzb|um<7IUbA0_ znv%;42dmHuQfN|b$c`lIYg!;ls$+sNs0G-uapY6+M#gN8w!_Z>DgXtcRAcN|OCmhr zckqXZpGd%^cGeon>8+2E#Q&QACTUNSpr5lOd|Nl4?mOg(MMPCu9-+l+2(_5U#*-vi=NnNw{M@ zk!d*3r1Sb)asicGTLh@&&DQ*ECA1)o7UV|N?GPOr!pt>9YKG4OmZoLw!&U@E zu8!5Xfz#j+tpoG&wJma!-TQ(%ydPWY}bR6SKqit4*p5CJUOB?NHptZmO~ zbE!@$d3L8 zOZc*iz;hrmxI{n9vaLDYZ^*H(a$Rx7k4I?^g_oV;5X|^uytrq2dkVhkfgU{g!v$KL z+3v`oKl*gj0Ofz(!A?!0|55%fud;n_(jvO;Z(-Ml@0az=tt2YV0Zg+6x5!P&@cTWo zx@*0R7gcENFZ9oaj`o`+FUTdJnP}Db9TjA1#*ry$h(7l?42eL6Of`As2?F|MijO!` z`-ZyjScI(Z+;Q^7r%hyW(Em(wc{GZ+gNQe z0D;Jn+!RMKcDBK>>{@v`HI41&n_3)uih?_1(}Z*UOX=iJfWVP%I$hN8%!)mf(#U?R zPFMgm6Lw*P^v-1`(v%IS5q@>mSb*xw95kq2XLVD_`RDy@4Rcv7wBBGcc5G%&xnFSi zIyxC^NHBl(kf_@PYg|BPMm^a2WH-KJ?rH zn+VoWwI$kR7}7Cw;tdYunh#d`a*os~8L;s4;qmA8;Mn~JsC&g()tlsHa6iyQoz{o@ zN{MLpxnMb;83r*fh$vjm-lhq~=F}k*sU6*dV9%txQl`N0CXPtn=u@KT1Nhb(wGYG1 z2x*Zy>*XqJs$0wT9aFIVt~sfHCxOoU(vm~*{jpf%Cw{p!6JSgdio*aP)SY(~W3gM! zquo>gel};%JMsUEihSf3fuPu1*_VL`L<05bvqb#Mws@z%@Gu*ZJ<2)^$8PG?=Cne?FE<~9?H z7yhqG4g@Dkhoi6E(|yNO-~IkMc{p1oL=s5gWD!ndVrp1)h@2{`hXx0ADz}5@KI2jG zXC079Un7yhla(QqDc8G>E6z2bEM(QUhv0efQP(18y%`xMy0<*$BsGB2)ltXhZ3e!$ zNj}ZuisSW2)0S4d@QoyEp)4F&{?*rk%V80_oddO$4h)c(F}MK+A#bLv0&lolYqe?} z;;NUrC`3iNrIG2})Iy1t#cx4VLU~}=r4&OTp(C(Pa*F~MhW(BgGOf0fS%o^6+NCfK zvijvipL=+Zwus`LLJ8)Z04$giW=kz_@Iwx9b#eXEeyXI}qdD7L@r8 z^7mc1f@=j+>yW!e>MWrZatq5d#rs%EzO-ExP#p+aO1?&Le@3*&A+Mh6_jT^OF+%Q( ztQ?xU#}9|8A5*cR!Dm;#7rw*^!r%`Q-|A&5YIQ5oUu{T0&dCCE9S|VbC_>I?4H5@@ z5Pdr+9(EbE#A+Du8sz#qTy0|Zqb{UzzY5aL^S}Is-;*Os$4r6%qc~SkdANQGmgk~x z{|~D2u`mDAu4!GNbKc~9u7zIP`K!-PfzAC&&E{?zI5v(tHYPJC8dV%2PAcS2bK+X{ zejgs|h<;742$mvX`7t_m7EW$$oWB2eLhYw%0Uz2Z?6aG)c%E|^jW&T`RVP|xC+F9p zmE6)T+aSTL9KyR|6)IE^DR(ISv2|?M=>PmboZiEI8veIY`j6y?7O{iU9LK;uv%e$z z(HW-gx+K|qUkXu6>#JC%dF2M)Wx{vpX_@>RX*&N5G`b(3bh!KoJo39%7FV`z7N1pf z_?=D%ng1<&693WKT3nN7dTBh}T>_A}imuCSmIpu;pUgXBTtQMuTX8c zhZ`nfDus~tLJmOj!vLoc^6-)qU0^>rM@Q1IXxkHXg$UtA5f&54>;|4mr-@CN#r(vQo{BwYq*zvuoZNI|6vAuFolp z<8JWs(1byqV2dwtLZMuZZRFeRHKvm&5K0SvA8dmW3Xe+@nWn!&>JV!FDXWni9g|}l z8#W*lKj^mu10>HQ>o*!wnMie8jn{pu=bs<%pPEGJLfBiX2c9D{0PVFx`0R=3cGM!FBx2ik)1(T2Dkp!!`?e7AEnpOiuP#1o^uIlpD2e=UIY` zmPsS|ziNrBD@FN<_9q5oh?bbyGDQh{HcocRuH1;LmM5wdo;v4q>Ot|&1azx=LfxoY zzeNmKv=>HgF`p+d?`&+hN&`Y!Sq8gWs9MTBBA4V|%^+B*f)83#g=Mvxs6{a74Ix4w zO;fD}Vr!4AOaqH{aWi$D919pR*Q6qMr6caGD?$i-P34W?uJ^pf9?mDF9urH1clX#1ozv0!ohJi0dc*96$4 zO~T2bLgBI8@4GOjvESUH4>G5yN**sTebnPlNo?CS^2&1E z=y$MEZQl})q{WWvLuxv%CUYh-#naUpUZUtai4QUOn>Lg7;@@w=A?kjVbH zx5%91C3XjM0K%!zrIwkRjJmFG1z*<5!P;YOc|9)V{(Nc^lzE|p*k_`sYy@^b{B{Dg zk9!5sL&mx^O-X03KB52)k_tMZ7U$%hh@JU~?A*;arK~O*(4h(mnuYr%*%W*# zfni9EO12_$PP-%yKfu-yj*dX#KYPwsQame~ia#DCv16sMmzR@gHJ8JXenM1)qJ4J* z!?7!j{^H&_pZwOemlhOPnY?_=g&i4Q4pRhLKqoVeRK+h~YwmagFU~=&`#b~y(Fw95pa4IsHl~> zU4aX73bT}=&LS@^@+XC?-e>khJzfD^t%SDMR_D6$D8Kh85}6Px;R%w1$NbW~j+IS% zDwCNCj2rc%QVB9B&@}h~e#?)u65McLddo#{FCDw>Y0fjR ziNJ@fuiBHS25kaYTWBlw@ur`$0RA|wgFuYi;q_8g@}9{VhoBLvi#JY^#hhyua^ zs`PgCZyV8y#k}B|2)g@_O`q6#B9`GEwbW-8$|riqDl8sB1$UIp`m(oF!X`4VfjCI& zaB({4uV*y?k|M7ld|2T-Xi;^ItIaacj${2rSb2LNpTu-Ux6^Q2LUZO=hqC=XQ5a6F zSmj5AahO_PivP&my*JVE<`B#6O9%^|3FZpursR?zzH3*WhKNHuHML`~LKZ0rvxPN`42Gx4B(2TK z_V#5^rHvCLbWmFvOO+ZFj?>r30q?%n3M1x-qMAb{P%5~)j~x2iFR=(!9d$z|jD3W< zx?v!b#X8+*jJo^a*)_IfY`%cOLsEfv%a+(}qKdqr2EY|6xLRQ!4*I^dM2FjCjz-j+ z#`saTO;=+u)gY-53lxaBNZAjDGmPjcHH5f%q%IE1$Sq84Vt}+uMbz;)d}8##?yJMU zyBB{AtZNbC5O)@fde5FvZF6_zwj_OS;hi2jptNign{3AIv5AQL0MQLP+d+=j&{5kph} z$fwUVK($Es0B-g1(FK1K?Y@1ou zwfj-%y%-qZmDdA>PPVY|PH1`iu8}H1hcznMIcT`&ORYj7sC2;tl$WDZb&g~gg|Zd= z3ZK=?hD1+b-#AXJw!&kk+_Oj1^a$?cjY=K|cbKXiYdX?x)U2Jl;)uh}-5E6Z(L5bd z-t2?EtaSrq!*t{H$g11HE00)(w$F&0LVX)jMX#RS#qpgYd&@ zGNQy$awVWp;PtCWkH|7zm%E-&UWEqHxY}TP7&QUMIu9fj$40WfnefCQb2|}AdUIr4 zTxY1MgRkM)14pb8*hN{;o6Ny$NJTGnCw!#gmS|@8*KvulM*^`NHFwPLT^jc8_6X-6 zdf;>-N@f5&B)Eh0wL9M__Wx;29>S3<5@3V9*N);xeizZo$XN)oGHoKCTOKm7j`9=N z6-Cdv)D`Q$$S;2uj{`v{-+ls8S+DHtQu|7Ff5m&Q#U%W{B(v6~$V zy>4#J_Sv#R!HL2>y8LfxR)OfpoSjqo-Q{?FQe5`NVbpS05~K6;d{fw`cXedjn92rf z7(zG}YiZSB+I={#ohTA1QCXwNZ0u^y(-Xn@g5?z#P%Bu&)_FEE+qf^%H9lBV`o+Ywe-^^Ug3<^u-%w%46(z#;C3cu4q@8ou{le0QU zc^#bxkrx|;prA*(^Z^svoJZ*`xdH zYtISoKYc;-QG^&ZGn4NyvaftnG5--|b{rh?2C~OJ3u(TsBo%+^ z09qByTd4k5w8C&YojgQ$N&}iuxkx{%uc7A5SZsmuFpp^qGnqJ`X*>8`e%cS?hnt`C zl!7qQx@I4}Ikd+)w&a2nh%o)ox34e$sK{=*)-T_Y{Bn{n;Yq30%hah>ejJS*lyR0Q)!aM1a6haeq7GD zKgZ)~3IJG)+b8^P;03)e1(6OLVSKeId!)0etrdqw|EWR{ht^f}VglMr7A zu{=>(8b{CXnVuBg5cVyat~20x&@*bBg-&K8?3w(HGg=Ts%tb>M@Am)atO}C6%bPEp zE398rM^ynFne<20hkErKds$Sn9j?s1(HJ$+QV5h}Dx+dX=rwRMRhq~e61+V|LB_>e zh)$A)9DyZRIeHq`3g*e7jeh`!&feaUJD;b(gK|%V{J(MtxV%YEj_{9(T9&ris^Zb| zxvGr=`?0XWMaVy3B6^)@FCK_lXyj^GHw7&)IZ;~!n}S-(2DEgpO(0p86#Vy~FPT@( zO39*#QPk{TVeq0h=Oqlg5n^@7No7_G+Ogzn&^-j9nDg*rh5w~Wq{7fJCB1C&b&1Q( z(}=&2&(GwovCBvy@9lEgx$VA-SO?71CXkn~!$!Gan(YE<)#~7yv_x1eo}#@6KeeDhxvfz}2ij}8t z?_hzF3U%v=)4`&sqq8i5+QgDFRr|FDB9$&fqXt-8L|AX(t>JTrUeW3=7T?)jbjETD z@|>3g&&l!Q5VQ+jkDqv-o|opb1pmjzy32e7CDsi?h+>4zGTWZvLk$2!^jAHA6Gs2{03Yr@Mx>Apm37J&;?l9S=~R+FS8YFKI?uhO z^ZS&ZHGL$UzKB;cZLwC#@+9cekXLHA5F()H9!IV5x?JO7sdVQvm@V5d3ItiiYjbVaIpP1HObwQ? zm1PA?ml)I8-Nw8DF=vb*F++l+y8yZxMTJZsbqzud^}IBRkx& zJ0w3ne~J#vSkUCtE_Wvpp!MgnGz96LvEhp47s_(x21?Z+wxakU1QjCiiYgO7(O-Lg z2nl00!aA%ddCjg%*!E83hW{Rn$q?HRRivWuJ5TGD$3uzDr5z{C+j323B`wQ2y3QLI zBh-x8E8YWEY$k{}o<3@8AM&!aw^ii3`tZ@FdBIZ=4KxXC%p?ErQ#!ftVK`f(xOelz zGoDJ=%$!OdWo_;?a;pUqdIw!2di4uLW4_Z=Eu`b4V=MHR#XPV}TZ_vLJZ|BTUobOQ zgmD~Bq#xtw1p$;&pC#w)R$;S0vtiH&K*Xuzdr7K!(4LVsvn|HY<{xpH2GNh6SsfDz z$L+ES8IPEl2ysVb*dC>Lq?%FnRpm56H_wCvJOY&(9pG4@)s^5MC)q%^VJ z8Pld4u}x;0D5}DPK74lCg-m8!Fm0zwr+9BeV# zGd==$E0-;)cA>pz9CoHm-@+HKaa5WD^6da@YCuxCUy>E-Yb1o$qr035W@|YL zYEw5!f8r+N?)g(tZnW-+2#;uau2P!ltuLQN*952Z;h8nwaC69wMM^_*@NG)bD_(3n#0RdQ#jy5fY(B_ zQ!s6{hP%i%DmrzjVzQGQBB0WDVf&EJMEyj7;?Mt>8E@F@F3q`NFL#VM?dl=g%s~B% z+&U)hdKczk^N{6P3050ZEQ7iH#i;1{}wFqO~iVqx7}=&AjpHieOD~PpBMTgikbk zjA3S>c}c*D50KtiIVY4v(PHBe_Q}8*`Fzb#pb%(;w|Zba{4rBpI<2bh=Sk{=hN^1v z4Zc_ZyIlQ$*gqYXDbCY_X_b@cZUKH`fI?cM_%p~~R&?VRIvL^f zx$PH+&^YQ~QjWI>X$7U-MvZh&b|+i~8;&Fop!-#-|7$)->*_F4LR}0Wz61k( zDPzvav}`(5$o$J#>rx@Z$BzhL&f{7@dG~J?MbC_%05lA3=zDaiHml~LZ~Vsk#cM~; zx*4ekSE2FR1IE3QPOrLmMf%et&L~rlyNc!KRE(wQi<sB{cd|8nnAQK z8d5Pux3A~D_FYz`+bU%DjTD^#lr_w9T-FQ1OgB~?pkzOr-Gzs_)bKP@ zkhXlF!aUCk)U2y}Qgu*@TVd|T(4mO&M={%}wjV#h0#HPi=Y~87-u_rAUHfq?5KZzV z6Snug2Ohn>dR^yFcvUK)f`0llgJB>4!Kc&1S$xI<9+Q2p&sq4oZ~C20zAQ956{$V# z{zz?BppQvYlz0v7CgGl-6CrRx^9ZDE+3(GNWw+Sbqf!K`J<(H#AerE1q4NIQ8a7k; zfnSxJSFeqziF~W+%8iJEH7ML-u4d>esVpok!`!$rMyH@3qz~%_KLNNvFifqy-bVim z4?_&QT8k(R0*QlsYoe#@yw<+RxbK^v|90}VjFfOKF3A-T)hU(b!V`AU`*=Ma%G_we z*^M%3PLjsOI{DyF9bewaHh;tOf?QZe8OYK~4Uu)ZrQ)C!@;Z(@q3vTkU;9%6ec*Hm zE8Q#?N>P~6bp$z}_crU9Wy$fdJKGQtWB!_Umt;E-k`?zyb9^#121LwbZ5bgXm3Sc= zW3X{(Z<4_ePmITDpir-dHmINYlA5NFK06pWAizB(i5KJpdC~LJ-MIUl*P0_KLyw^J z!F^Ao4+m_tz6734KX9>)2Q$WJ{4F5P7dlA)%;WFV2zDsbMF9GC2FxX;3U(zpv3@|E z(zGlREVMV;JTNpbo4gQ=A9^gPUZCa#(n+cP|D*^E>Wl3^#>}K`wQl_ML~5d!t5d9b zbN~?sEr#;66;Mt5_&u=_1_Z@TpMA1!Bv1rsoMoKJV!zSLwZ~mJ44O1FE>Yo>IDJYX z^SC1!%|v)C{YxC!KqgW|4*IPjjhI{Pn-`B- z&BNli;Qx!)Q=&U_No4!E*d-L1n{c&ec?gtd;jHBU$j2VzlO?iaHvLzjTj=D7*#e;$ z7Gx>E%YxV>BwahH+2jH=F4DC^6_S}f7XH?#OHX4}w#SllYoCwt^x_EkBgT73e!^AL zHO(M|B!0Q<1}3dF!8IUun6=srNxvK51(Yg32}H-vb~@zJmPvAKX-v^(qwc1SSL@uf zm#HsWMYed<@;WcNzm>#`U$SVy_msS7YBG&9|Hb|flO&6I!o{S%m`%0Mx$23dZ$0IG zu?;1t4(*g6Zlb(!a+`k9d8fD)FHA@hi+0gNNvjGTCQxBuXj?Wu9g_-3_>nUPk%bf1 zl8>izz8ioN9ewpcn0LTz;7((HQTNo5b8f{S z16ljwC#J+&={N>RE%DAIr|P--5^pYfm_eGQweW5l^Um&8N zFng2$G~HMpHQNcvO}6pEr(E zMR&m6t}c4?nvu5)H$JQy2wLQMKw{()hFt@{h5+E4Rgm{6-m=V@Hr@dPD^mtG0*w-0 zh-J3gxjazq+1})vyW>6;7KjO~echN`g66`paqHW%L)(Ewm=o6r<~4%?ftZT9_8737 zXeb!|bmo@>+DO4P7Hr`Mn@pD7IMq5KN&#t!?*e~(e5A~1y(xxPPc3NbK&;w*&r6K8 zDoeLs+W4FNxw}B0OL>#9tZ`7d=*aT}@nNoxa*N$m4y_iZzH%66u(n5?o05;F3~Lcq zoF-VS8qwWb85W*})JRxMd6S$DOlT~eS`wqqO)2fCbktXkL6op+6edtS0g4pnXDAfF z#i8UZXfm{;H-NKFO90i73QLEr3N6`d+si_ZM?&re017ApMXojn{TO}l)u^M3!f=+E zqozGh$P0#GpbvCw?C+M`ymYI_eodkGsu{|w#(Nm3wiE6AE670=(B8E<9{cT>Purx! zr%io42A>rJk6{gBTqb3ulugcT56BhV=|Vjb{hsm9ZG6-S?ZQk??kT;at%9|}`y)@Q zu(4s;x}F)=>vO5YQ$B6}AZnd#Q|?ZHR!T>OuwVCq1`g^k5NM^>ZjR6 z*+Y80dYoWC#tRB$KIJ~^{AAx=J!Iq~UhN-BIVZ-PS4>e0Q(p^TGCZ)&o!1cv zb38<>VbvMEtD5ysJfGzV;}=~bme6mSRq$0{9Ay(G!4PH8u6%ae;SIh9xWK;iQjHeQ z-vNra*7%DGndkl==CGDnDew>H-99wpk_>f?k1RlBSF73pqZ2Vn=SH{AJ%HX?dYWxl zy~@3`VMRTZG)k7{i}|(R0q>^mjenj=%3Rkj?;&O$-{IR4!jYz-^?EW4PfL0@FW%>J zPr)cMs>W*PU9_UnwV*@ZfgW5aaS0eqnJ&7;Ugqn|DPW`w9)+o`vl|We_m!lAY@F+d zJvR}QYIlf8b*A+udAVtyiQ!+B1X+EsMi&6P0!=38p_#Xsp#}J^A~t<(_M(~zhVMBo z0oQ$U^sQMac>IYWF-H-s4=J63_e;D7xfD3A!DiY;i_mYazQ&Z~)MD(=M|fi>GE=B1 za&qV!{mY;4O06a9Lopw$cV6G(K_BXG>U%3f!4VOY=XIVd7%IuR1r5al!H-h=8jLC! z8Ht&*wXi65_0xT!<)D4DGMl6t=y&ZK9`TM_Bn-dvSNbcBm*cn`xKz4yw23zRQ!yUh zXp>iAZmNO!mN#+qFYqLUn}xxQsfG^8rWUXJVO65q5hMzipehv>vTk}^Wd#T9^vg&Q zr)?J3^E=_{96B{ZToY-YbE1H(uibqQF!Rly@=tDolMjw~Su@B2G!%aR8~IvZUpdQY ztl(*jR-Kvj8Kb^Q{(}c5-~Y-Xqu)BhgHf#RR-nC3ApoQE%ja@?&rn1~4pd+luiL64 zbWNOKRUlxu{~QT5{E3c*Yz1|%@Io}dEOmH3Wiq~QCQ99(!>DHdNK+&7F|LRT zOPQcvtUxY}NSlpsY}iIn{i(+@3U8d%g`Gmby~g%|LpiQIyT^nwanQ)^(Q!yRDdnne zz@w6JH7p?k#XtBK+aKE+wDSMI83IvO;18 z9Hip0#Vv#1#9V7cGIemF$7v|nxS=&~i_w!WnSfTOE=q3JzzVP{i4`el4Jb zf3-uPaWkwgNt~N}W*8CTh}8 z@4vVnnVn5CtO3j|gzqsAoUAWp^Dn%$2JdSFDP{&7|FKYf6O=IvM`f_<#lX#rS_+SO zPVse_n2Qnld1u^E-r;#2LzZa@8uQw`P54Ev8d|VF6 zHa>t!8N@^w#k=$zv;?49)didm=b%wrJ>eR+l6ooo=!5-bfr$>U(=g^S3s-q5&^04xk;Pm$j0>0+F&Ad3Wj6%m%LQ!e6ObbPvrMf zs9y%~DnX`DZn|%?Y|Q6y8vf@db~#pE#KcZq z>`xl01L<#|BQ!^L!Ku`_I2|_cHBZj*(97UT*dyhOm*Mtz192I8PfPG0MH%H9Rf+Bo z1WY>$_6;idq@Ft4ykV+SDD`vY9UFOefZ%j?&R&YX1uoG-cv@Kfue_S)4{+xdwg4og-#IC<1A ze#h$Q63kkVJ5DzoLVlCloUAhgu4*r|&d3~CqK^2eb()OTgX`>#Xv+;=v{4SlPum~- z7TUeaQ>AcR5-NrEH-h|rQ&67H`*_yeghxcteMY{kh->_m-KyR-DHJ{X1bM`tlBlMB zOT(($y21xK3)_mKhAaI9GVGxCrQT_ffsP-}ZHbwo%k|V|h5s)uVWaSnev>ML5C-Qf zo+#&Ym!J=d3Gc2h+74E?)aG#Hp&bs9C+g_z51~MBuV#(277z9R^EEGvj9v{WRCsIk z1&l|dgP13j$JP)xL?KcM_zreu8>CsyR@3ePEXQVYaej7}Bt}>OuCDJAT-5P=Cn;*q z&Um>>8_|lC+nxQjAHl#R8@WGif?5E=$q#7uFwZDB->bF?Wuapa$*8|R!!EN$vd_HZ zwYD{J`mpZR4qkp7#Ni3@iSzPX5G50Ss&Z&jZBcl^*Wzp2=8p%a)$$N?8=;@F;vGCS z!eC86&HmSBlPis<=%_fnO4V;tj)i38h5naZXLUow%z}lR1RLeg@>~{dZa3>a0ip2M zP~+0H?lSF1cyY!aQ~->YQfJX*HWH!_2G{TnbTEnW6P2Q#nm`OR-}?{j-}SyJqDie% zx$c*xu1YVw*3@uwez1->M9 z6ruTHy$M<}FFS@u*a#+akQ%tJf&EY&vLOja+Ky~zJ^_ro!HKc(Km01%^Anf0)|cbh zMYrmF$yjy7-uZSnBdtHUvCBAR*A=NqQ7Y^G7jTF?yBSYo=~w&es5)DbNbR%UatzIf3eH>;k#4 z*5GJ_cNUJ{t~TuQhlf(2#1_s)g0rU@Ct2x)JTn@PZR^gjDxVWR5x-`2vd}hi7~aI{ z#{U?)vUQi$kh+ZSLMCtd+Vc+`8RzfgnaSfkcbA+f{-%^SPPeqk>k?#SRLzAov50n} z)64s@$2D2-EbH&G1;WKG1HsIP8ZqR)50#3{ZO^5y0YkF2`YoRe>GL)UgOTV?5@(r< zY)bxu?Nx>2q!J20|Bh!vm!W8^z~_G>6E_P=()sKXw*6O4SeI&V6xbxxMAz8|`>;y`*bB9L!5{!|jU zdL7NQ_uVSdx|1sgCHvYl9n6rGHe9@GVP5K+>sdGsO9T{%=e}XAP3Q7%$^wY9q0o^3 zzw0w-Jt<|D{_0l?%jL_g8Y>p#WsdomRC*(!lAzqydjSQQdNP~k1A3c$u}%EIv&ly& z_3+%&Ev7y}fUIW6W7az6y{%9qNT$=H_0$%$slU5mGm-+nY%iH#J>)bPuHN)GAtp5J z8cz)PY#3O3FS)zMfTI+Tz#aVo%Y$;&Bi-O-Lvq%FCsECuB+ubtYT*HiHr=|}XX>%IysmhtGC)!X z6pr0P0*3>0a>TgajFf24Hwc(Y4(}sTxDpgfTj6S`)kLMsf~WQM6ESy-U(PIk>dZtP zm0a+MB12h}j58IOXa_2OZj+UwtejlY!-9efOFT-it;0}pk1@7pG&O8M z-`3`!P|@vBxLWI5h6U*DinN76GRtd^Vm^Q20H2l>#+gKbx+@|LPfIeF3h{BfO`5l(z{2D41$mgmPOaA6%c0uh(a8lMNv^0SBU+2# zgB1YdH2YwMRTAf(DV-u#){%8i$CI_?@gx#~Ge}yGU!8#>;ry(n>yTd`mjT;BXyB!W zCO|sImdQ!k{a2cfpzS@_oe{W^rV#+@VnXqJC~F@@RCY4Jo05iET>+>JU0LJ$7V7;n zb1Yg*IUgKuT1FJtZ~jXi-E zfN+ot$k@@4$Vq?muG#+~G}{FqbITUam0wWSMs5&l2-edZtnu0toeGLO#XA`2jyr8; z`mqpS>aT-zi%7gBSoEdH28}9xkvxVZD9q&)wmv$XrO~x+Gjv5GJa$O>h}<$&SAe+P z;-RDl*CJ&M^3-Cn_XhG8$ztWcrcr(0-$2W^$Lm*ejiOnvPgDjVXkc{O8Z*e27%;he zY8d$A3Fn>*q@1$PYq7V=22_G{*j=?F*7iz^QS&Y-iKoPKc8J%uNa^nXeogT>zthZ88)&m%sc1-$r*i?#%Kx-F0akva z$Qe(3I9^{+_I0DgPRsfM$3t{D)>mg5XUqSvC5s4?O3(}HY|qv^i}1Vd1nSQl$6;}^ z1*F!zQdC05U=xeob?A#ZIIXqzT#ifte65-X5;f(dDD*1941bSFy{H4VCtx@wpv;sH zEoHs1#99=G)j0jZJ#o#m1T6Zj+iE|xc_g-;o3GB=04a6^&@awf{Pl;kOxsZwMv((d zd#d;$pTw>5zt&Z*z~_(j1_-+orx4p);YYvyu{k66`BQY+5Lt)_sGUiLd<^jA@2KIT zq}j67lV3(>#;KE@JzF@gXexf2T{HIHU}Kncz!6FC-^hlB692pH>;S5G_ zK$PHYrC82TZ?r#Y!%7)$<;7#(681>;sHcVy<8qaAhQw(k8%09*FOMSssmHm4_bCC$ zy!Mor4_OwT1VE3ge@Lo66RO~Bb9c^PptN$0c}2z$40gK)LB5ZX#!VYj+uzDN{NA8c-b&1O2?&j^VDz!MT z`z^_W-KP?Ej6;1oYJWHf7t-qK53pHLu$unmux0URx;w9mzP_ZtA=Hp4a^~-X-a}bh zDY&6r2G;`tPi`;4ir1Zud)=8JypUSUv%$kB?-k5a?cmrVrpKSKZlrQhZW@wQxXeV- z3wR#Vf2A|?l03lN!k2h)^ESIZDNkD2W;ExoQ6x+Z)dk%#>iHuyTTCY+hc}^yuDNs+ zL%|zjBBDeZed0~p$4ZG}4phm=KvjeR*zgf9)WzcJQwVJLF(4#Td>Q=oP^m|xS}`fk zwnd?j;ObIwnzd3Ax*(J-{f5XSxoiv`$YMTJ$+b=|8`h|^Y3sY_c7M^7`3(?kCj}>X zA!qs1Mg#cm^Od`+dk0BOA|5dH`Fu$J`qiETv*=lc>Yh+44jKz4bk64FUr=(=WKd*{ z{e~Lx7XLPg7<{`|3^IKJq299la4Vz4F;6W5EsbJW$%~9T^Y+)NJoeJCZe?yiSj>bD{Vox%z74%BlMT>JL@_NzVm(m`2xjxmhjW9?w?K*t-M zpYV&Z!phr520*TZ9Wi0vRI0UMMhs*i=-->TBrk!iD%S-;Sl zB$}YyUIh*`%P^m)N=GEmYWZ@xU-~j zMF#fN-l_8PT^H!LW5`{owquj#t@FriSp37!qsFmJ1t0{o7akHIjTpm>U84~p_4WgI zOH_*^b56bipWR`eTvO5ke?Uiiyvy<#(wuTQf&+C>jiLM)DT=K_a6|#9qAB z%`6j`ehI(1z+~h67v#9=fl zrh#;N1L$U`Z*V44E^Msyf>f2m`q&Jw?0(OBX62|oTt}k7Zt7m`~z%bTpm{Isj0szA@Wd>k_-pzq{ zrO7x><#<;wg)tuPebG)dGYF0P2hz0T;_QIk>I19R{EcT3(GJiJcXEXr<^_6jskE|C zZU5K$h&P%1ll1=j_qnBC>G%&gW=yC=Y|v%^*T`T=WO+Ss$Q-E66Z~J)d8jA#E+Y=O$Bo9(S_zS{KSR~%~NraX}W^0m#bbFf+>gwp4=-De|nPjimq z>_)^zkg#N3tl^K-(Tufbg75sK|A0~&m@xGqZXnTAM4GNc`^3TxBE)7Do>AuimYEn_ zP;`KZXv~w}Zn#<+w^Y_Ts0t760N1`jiwXOkyhV!E>5 zBSpdNIS|gN6wv~G5=>zGEqI4DSH!@Aur*PBVnUln;|sEUio%?%e;@mIkt6BaKvcj5 zWoK2=sRk#~^rd>D=L|2$@kLuVvxCa|nvo-sRasB_JIF;PMrlvtYuV+2H`GTW`gF^0 zapk49siGqWtng3z+OIJ4aa-G-{`Nl!S&qUji*p|>tF?{SRaIf%nX0&>y#QpSdSjwR z?hK@X&@jFWOrqi^onjg(qeX2S8IfMX@vD{?Bp_IDdOI`rKJ8bX`ihAn33;8|I!Sfd zgdy15!=WPRrO@L8$RRCLJb9L$Xg}vNqvAp+! z8*WvswH02GY1+rdEBh6qt5QyI3y#ViQOWIFJfovCgca#~Zk+9f>L@!rxCL2bPg&Ns zK_Z8y>}DLI)lDPW9dHojE6mEgbmw_L%A#byukY3BnEfpDE9!LjtuJR2zvu575`G}p zhp!^dV3QiNfE938z;zcfO$Jeoym2t!gNVldvgPOo2HD%h@9yP%HHq8eduB1}!Oc43 ztNiyMNijPeu|g|4nv|hg3HPj{DnZcety+gG>F@>nnDq_oDwE(lJBgkuP`O>otd`Qt zvJ|Ja%>fJ0aRE*6<}Em_AZ+pWG&#QR^fh4L=4MD2dpJ56Yu~8Y10iH{bN#@&o{+_+ zw5Z9cMGk0eH*l$`Oah5dplX+?SE3x_u04d@H(15c^0vj7o*96?+Z;czu`wD5yz~A0 zFrbf`!^;UKtI|`b#G~Kc`YA0tiX0dzFjrk!+YlOlr_}-Nyg_3}*@{LYi`8n) z5SG>m$Q7({;$(T=Z?-AdUiclR`TWGfViN;9PtGX@<1j)lb$R<{Cz#{f$~Ex;bpQ9( z-2Jc1F7cxRhFsjc=$(FR5uImNS+^i)Py6~Wa8aySj}M6RJ*~_0pF_54+*n$Z-CUL0 z6-GKdUI%Tutf0}Y@OL<;xu*?$KKWf4tNeRhi~>*WyHt0$T$k`cK6Y)%I3G?;;9v6? zXE>PqmbXmo6~&k3&EdA%5xXBP=H<%wqqR#i_MKA}r+RDu9u8-c1ylEXoGr@NwQ!#g znPLdjZt^c6JZcL(>c#cO|GD&on)&prTu(D&Md zEVC2nj+XN&)Lh0@gjmlCEVdvYxEdp^i{56Zcts>Jy(}0vxZaznyh_lJ0#s-)0qPXW znZz`2)T*qQc3|{YW0c)8@|Es5yPR+Aw9O^Xw|U*FL!T~r9_dWI!5=vXW@2KpQ5Gk&F|o?^@-RnvAn9%e)-Btf0Gi>ZfDm8pvQl)eJ#hxbh*2) zwv{{rb)2p}Ngq06n$PxW?wFHs-Y89r^cz+ z**P^-8J?!Mpd)+oQ&hnwTZYyqP)eJ5y*P+Z6t8&I+wKD~rl;nhcUx>qe7+Qhg}aa# zOig~plcv}l+?6IliJG_4yFDeDZ#mBnIj~f}?h8Ur#$mI<9y`o(4`2!0t2tEn+_^|M z4^dlJ(6PZ*$xMh@|3~?erass6lvg)lJ748G)IHm5P9?U}x9+KWM=Ux=(d?KbwBKX{ z2Ej6r^DvN@k?j*}9Uu2y?p>yeu{t+GeZeC8`&U;Pz#tR*_7ZQgp+Wfv-RM}|Fr}He zs8n9?-7AiUE;7GnQ1YFItzJgm15;pwZwgVbzLR&cJItwmz?BgNB;i~BsiBH+SrKVm zT4;IP-9Nkk>b*ir(NfgeaNqF^3+|U1&aVR}t9Rr3$`Q8a(}w36k#$bJehddEFOUL} zWun4`owmW*@D{A$f68_^1z)4{`pa9hh0LL6ZYQ@ET!4P>OoOdr$U{Vxy^NoXqN8Qo z-#nXRF=1aWMpRX`2qFl(zgoON0IV+1rx-8)Y6)1&Xb>?d-JRx)?aZWF1(DdJBLMC) zoO%aHIp+44D7P^VOc)n+K%+y+ji+`-UNZiYbwQMRh4@r|0~_K5m{a72Jjq;+@O>hj zE0&S?G2%-wHVcQN@nXfdw_*aHG;q7tx%RAXb~fK=oPCo%VMt17YFT@Bm~=d z^tp*SXvD#PP@o9C24g^&@D^2y(*{{d$^Dkuvsi!BbPAlJVkD1*J z9~{JotX_GHTQOHq-uU58F_df2*SOU>ObISW@kvz)a;*?&C2N?vMagL!UE@_v-)GO| zcuFX{VeAhWYeQ_0V(J+N~XOxwUI|sL2DcPbWyZhH`_fvPE$B^8uR>2+05aphdL{U>C7#I z9MGv^XMLSzLj#??BvnCJzT6Mqh`79Xwl!noha&}TMO*Obw=rUMFRC||UU7`%oR|6C zBX{%ADS526CFd;`Y}|KpCsi~2JxXZiGBV_spmlC*Z6(toJt9CqK=_S>54_n^fwJM11 z6KDm*o%HZM=5n_IL8`Or4WSw{wPAHm5g#d#aZ%!c;(?U#fpk7;=&D1{QHR0r+pxo!qL{&a5!u5B zL6RpuUYdE7Py4{ZCMbO;Chi}<23?9-A_H3=>;Ribn=K7e77RiE88ypGI!9n9*#3XM zUG$8t=ld6hVP?AHDUhf@D{EKIPgA!hQZv<4N03$V_iNRX-YGb~&F$%F)Hi;KdzmVE z34LPQ>=^sxlTjpjonWD{fC^W`g-N4X^G~t)iYL~UV1@|U+wg=X$INW-)r5$Qnk^7> z{4ot8o7Nte|6(wV*8M&eOW0{@*L&^fcx;#*LIlYn9VPin$S9=zk6(7W#ValV>rO~y){8=j zg%_Kj&^cqIz$V9ZpTF>*u}=M)tB` ztXlYj3&f5M2%fj6oFEQolU`9m(aUH0*h&y&+xGM? zKtfm7Tk|I?Fi6Uo7pRgwI+D0$$*Bv~8mG2Yk~4EQE%e}y z!CyyVxQDo2?hQJnQZIzLQ&-G zy=q|~D9x}zs==lnZ9@0MRgphZz{oCX5dr2~V%gLg?s@M-jVSWy-hN&zgLF9#Xx+G> zrss}Qe7!1DC{-14@gz{t z{A{e73O+V3>BWhsJv7dVtfMTpcUq}tawG4O^ErWvO~5xP$WOe~oF#}T!q+u(!-pq@R1VfBvV zW>Mu&0l+jF0;yQx8CsBH*J*tihZHW~UW$J--knWV|3DA;V~~@e&^aE-o^AtLqsrnf z41qeG9a5d{FJ5l=`~It_Mdfi)z;IT;S5BiJUd-93z0(^&b@Dj?vg`4@LnDG(PF{5x zXYS^t5o_8Bx6q^$vOACI_3PN^U3vqBS)e&RQ{F$C#ml8e3Bfoz$;I(m{NRU}56_CD zB*jC+)hQFo1!WDeh0V7romgjQ;Y7&&j#_X`0z3OJgOkylS>@t<`@)+1^-x5=2Izd7 z|G++MVT~w(oFu1CO7<=L-d&@f9?7)kPe-;FS$hgDQOTDaVoz)hsMC@#ivE(dr6wwQ z&9ZrqgsU-YVXP+JDF;L7r|5hrvifxy_va0y4Mw&1a2|^TArg>8UOB)lf)Z+;7qQ0c za#@a!VhDO?mgY^?-(8%rT`TH~c;Y*i^sAfh0buB7>f5kb(WX`~Wb7>{+p!9}Jb!6c zFhEEIFcwg@_~F;Ucrgr`xN)kkjg5Y-pwNYLA8(%H(9a%G@VzDlb2Bjs5Bw^g@B(Br zC>#sb6koIHT@OAOLCNVD@0zaH|>TjY29~=G-C)(dP@rjMs-6*P>>0f3!pE>e}0=2zE zk}P2~wo$9M$I_w{cp{J`bkB=WL+p2bPm<6Y8>UsX|B|;ukKDNdYqk%Llc8r8cW0K% zmC=V9-y?8~e#@}&g5{zh4)wW80u_K=22oaB{@BR3+m+OJ{4az!jy7gaNLIczY)lY( zdWp!>GoGVS)e|lhey?z`lgI4nWsT+J=Y!6vDqm?}78j ziz)aXaW?*@vfzA)G0+{J8hc+#GmFQn`y`W>?mVdY`PP$J`@bDgHO5O9QloA@W7?hK zwBFq;sz5Awb|OoI)-NKRz?R@ndRcZXvQwu;-Jn0T>EpxXNDZX^y|RP-&N-DL8oV1r zRbuE%W!*E^yrs{k{EaMmSk4@(ptl&?LsS zX;pBM?+^n|u2hsqK=6HS0Z`C&0nQACH z+WM~2$ZmkQE~r)`TwEN?zYi}=Ee@~3Kb;c_IFbkFpisw+3pn78bkL_W>8J(0+SR2{mt>7= zUchg%u{1_RoeXe75eKStj%oY#X&+L!qmgY;nPJ4nhn#kX3u-I7wMfR;UnX06rXTsU?}%N*KzwnBlO zzA>tA^8(}8pnKUqd_dM~RMZmt=fy;>ApIjNTOH1x-@Izuu|<|DCr;_zBEoN>M#(h! zYmzX?`0^s;HN_CUF5Az*$INJ-=Jl4T;$Mhmnax8N0P^JAO`c8+@xr7*fT>=^tEPdg!vPev@>x6+W#M za=e`O5>I7~ts?^GT_yFd)1$d5J~!duayKXn>A`c3Vo^K{za>^;D5zcmJRoik`QrcT zqi&^#Gj;?a@ocAZSw}QRD2n`vko=Ch!M2noAB&}B?9pH7^DS;v&@&acFo*FIvUZH+ z#t#NWQfYeBK}Z~Rd!{5HmY&hOh?G{Azf}-fc&p_pN~Iq#mR)^pjvZmcI%^_9KtFX1 zQ_Ypod>i_2E=ED|UeoGh4AS-tY7%x%d`ZkOf~i=1IiA~c!vIIlHqQ3z7m?5%Y6$o2 zt>4s?7{k>uq6<$=mNpf(hdG$8-v9D*xp{-3lbGMtpKK)UG;|=8#PVR zZI9t@-#ywv;miLfzm@_flkiV*ziTfc zIW4gX7~5^+kGYiFku$y6Wm|Te@bO^*@vSFd$q+}fsi%!eX>2qx*50gQeWLR>dXoHQ z_0H8nGSI?9t062m=xcC@Y;vK7X#BnnlF|}}x8@BJ@k7Z%dJ7?xkt6_kFtN*r_T%H4 zhSqe0_s4s;JE0J#lmKGn98cj@c?G>PKfyfZ9LHfTgGon}w-|O7Oc|hu%{o*J==sv0 z03nHZp#bfcpY)NY0*(K1R!VxpjW`v`#mWr}HyNtMdA*6566A6F<;*l))YTj~$SG=( zttm~a=Sz5*E}qcuv#5cg>Aj?RiyTvSze#o-AwF9r_QW|QdB|`FI>p- zZ7lBr!TrygF~yXEaSg1}VQlNMvZ3f+l#Ghotp1BoKU3FZ;}1)@&MMYfxh=`OtrbIg z>}_=bEH9`^ENWscXB_d;8YBd|m%b?46Vfr4&klGI-}(P7yF;~bm6FvMRTs-(U)K%4 z7L(5vv4Gp71HFqUs;~=Jn^NO%{t}PW+5WxC<*VR|fRl9KQRt83tGoZY4cm^|hCzsM3-4})H-vH;ji~|9kveTppFK#BAGrMh=&@A0 z&i)12zR5quy^BASPL?{w`wjbAQ>obn3ioa@N3TmT zjzfyzp34Ym=|c;0dnx_)Wowd=U^^^lydh2R0C7fE@WZsRuifo-Kx}&ZqK%6w?cjYkk^lOFhPZFKbYRuRt=#?>dTf zh2VkC%w-Qpfs~TmKxtA%Rs{jj2`#5V;>3ovLCsSnt0{?Q3JwaQJF7>fANIY6Db)!b zg+xw7wZ;mWqm_wlDwr9%;lz&o8QRv-$ixr|faTCP>^WVC-NLuSxdnR{URfJF;Ct^L zsjsYpq3j%JDq$%Ie)FYf6`<1maKg%>dV4=6l$ryUEle2fmTQ`zL-)>Q;@LuSfTD7%sD?fXPy63%Z7^b)C`uF0x)6(8bLB+-8bh+OqfPPE1KLpikZ#yH z%E8Wk$nz@JlD9dMpyv@}T zez+=vut(rhgmkNK`=g`!WEBoD3m3KPOW}nQu`wI#nP9tiJBd*5&ofv_BrBq<$N=FW z&3-i16{mu?BKFOLpU>lGu)2@2)1JwC>w6!kTtt~lCeDL{Vx(6$QD0)LWfiFK0N3i> z$10bTXib5jYa#gCw+Qj51`^gQ2LQ=awvC<(!Atlz_KXDX;Qq+v-j%%VwTp*%p=i$G zC`50+vSR7?^>JFQDpr-2+B&wq5Je06`-_j;B+USHlD29%1UFS}kksT*Wqz!HyI>o?{oTSTU@9Vzoy+jMY_#4rEp0+= zL70MW!V=Ih>5$$_p59R{f9SB-bYDbq-Tm^SkV$>@>WGu{)K>}XASYf7f|>ZTVdqdu zjc!;%&4qjSrOa>ikd6SuJE-b1AOX&g8Vkhm=v=}dMII4?!uFgAqy5$84Af6$;Sp)V z;(<8uEz40Tb%*i3%C5CBW_3&sBy-eMe(O*YiOBF6+2_H561SfMuxJ|cTwe2uYMI4b zum1?m(Uu&O5h)Mgp)x1C0o^yKVmmNPTaut=R}Ml%=>~#2+KKm=FdCa&_o(nkG(-X1 zK~0$AtyGi#qt>DO7N8h;Q91boDo_q$0-$qjsVfcr`uDmG{mpF6FuNHqqs0Iq&|WV( zFpERcdr{T(p{A@JR?uWHGm8&884hI#hW#r^N~)|Y7#?fS;*8lgS)A6w%Lm_lWkSV{ zy~IR6sA01AnwfNv(^@#3E+!m(#<*ctm(^m0RBFjTqyrq{yORCf$&W<@C~TA6gw6fN zh)u|U%!$r={4Yx&fQlU<1%8-M036Y=ePnQ)1T3MnU5kA(6vX*fv!MbV_Ano#S$Y%d ztdw@6@Q{+vrx(RYesu^+Q;ty{3ju>R)(P)WI1F^6tc~#jcky6OWXgJVEs%aMNv+@x zH#xMdg6{IzJEi%7$Rd!4T%>-iq>R7#J}ru2f133}y0O^>LtYZnJc$fPM39JsMLM+f z1kCPsHnG9--&@Z`Qc7yD9an1a`NhB7Yi|AC#b3pXw&&s z2clgu`ya4t6D_qhgnEJgE@8*3H&*ReTT4IsXVRNl;s!UBVpMYTo#0OAls%|A>5>MJ zY7O}MG-g{eIf+R8k=hff`|HSeHJ)vuWda+p}&J>G}YjCX6iIh?R^e6Jbp zUrth~6F{on_jR1JYh?DlpH@?+b(UZ=iA+LUtb#|=<#EKZkofBekOVATT&-Lr(p!gV zl$T*Qg5giC%MV!oPVh%ER?dW3&d1J3P0Yr1QGZLtqd@1pGq~ASpTziwtWU;JLOKW@ zYR==6HHW%oe~5NR!2ag1_f!k-vLUN)$CKBWCYZX~~;jzb*@wEBoyPVubqb8nb8@T>_Vci@X zAwp)pA5}6mXW)LiQM%-={){~gM_*odIXe@Yfr~h5;QZ2E5xjDE>!TV05G$)BFYQ|H z^%a65+UF~4XLM3OTyNFxpe#H(^)4(66SH|oCvw3LsE}v`4wPL5G^4|aNOLhWX;npU zYRC3L9`%r)+D4f^S3dfe8Zu3QU~|;|r%KrQ8sa6oras~=u@To3li(Q6q0XVZBa$NH zCs^3=KFv#E(H`86Sbg}COH>@h>AgmrAQ%S1<3holxmoBTW;tjA zf>j><6Nc0g5r`#7pdC6spS-PG)pkLGP|Nj|SKzc{$IZ#ek1G51KnLZM$yhZ8G z7{^KH>PtMTmfvYy_6#UEXLckq@&M=OFppuH_`vi>Ws!lKY>7o~DSf7Q^8IqFVAv`2 zs#&SHPaQ^FzS0Sz>l2hdCgXqW`h{qiU8S6+4&<6aPc34x1T&Ty@q54{gH%q~c6o3& z@Ab5{Rztk3O?4EXJxOlJ{0hwKHr!8^t@#f(%x`H$*HSX_%2yx7(J!hK3cJq0!v>tG zwo1;ypJJbv=5>c++?j@O}KhQVI=3F@p}|>y6*LMQ;zUR6#IE) zGbh{^l#|s+)#)i2PMAAv6qIeUMSH3FaJZ!-(Qglk!(|SeY=Rj;?WtxVi9|&EB3Z#5 zV69Le1T*8<@AJ^51y}&gaZe$$%4-DSNOIw2%DG=vP$-H^b9`Kfi< z50#8CQ*l;G7R2QkBevFVb{gwcp%coOI)%Vj1*7;GP5z&_1~3xLFI{@peu=ymq$8zS zagdXeW}_0aI<`WJ>MUy5F?WOZ^hQ6fB6O#hKZQ%#@)b55@@b*>DhTsG(%fnqBg7ItIO}Fwz`4BiyXp z*x23m8~y5jAUo(kGZXR;pJ&kK;^%XuvU?WTy>q^eXVj~5M?qb`FFm&jWi<2k>iD~oXXl^-hOP<#(~4>NL}d8Uq)J4T|?ndFm_)@eC?9>(vCdB9nR+%51leoXz%s_y#Es&rnFXgr{iV*~Yor%EWZzd@ zW2OFUGw)}`&0d{fo~K&+f0uI*x3Gz!0(#Q=r6S<|sabp(lNv_&AFIFaZ@??Z_2?fa zkY`R&HA!t(umQa#Ncw!089Pa!Q#y`R(7b2pm2A#J+hCT$Cl0X*u)oE0@4)~AKX+#` z9?R<>;lJgzfxw_!MuQJU5^h=#2j{+URji;QDp58GAzWsMM3Uz<>3wv+iy()okE#C# zBTbl@YZB9&MV^OWwIG-BrdGHpS+*eGoFN{RrWuFfRq+&Qx}`=tFY3zKdtFnJlVH%> zTFarO&$YK1rUBOJy$KhWR3aZcPx;Pa`TP4Pv>xqV z1;OH!WE;}eEP<@bmLaF>(E&!#|7d7ni*~Ed%H#QWwyTyrNxf!qB(teqfSBZ>?*4H( zZhB0)QymPKVQr4g_hoo7`^xMEB_^=iXbSZR zZGcdPLpPK2EGtxA#2@zUfXGvriJ2kpXd2)k#1Nqt`14XN->5SAkIByuDoInwyvdJ* zu^Msw96P3-x8#D&^oPaFktrA&+ZpMRybM8ly@>FWy4TxYQJO~%%+u26kT>FmxZP-1 z{o!lbhP3hkuJj1V8(0M=lKI@RNtEadAri4v<|m9YBa35SV(dj_p7(L9E7*{ z7fKo^o2Bxb7J083EE4CpeZY`ZYZ z%uh=8R+OusHypm&(E#lT_~nv;yy$P-^2!R4ZCJl!2rG)GW#&NRd%^He@YqC?&W0{P z>&mIN2wE!7fxyR%)WkNMl7N`;XK{m0;?q0bu{owlttU%wn5@-HHP|F53g_|_l_~LX z+hc9Aa9|~;GFmCG!L)xeZuRY`xL%G&AKAn2>b~Bl2p(X;^uP;GOjHj;P7}I#>8`gx zd3T~=le@x_LgG$hN0sg!SCo4hkf9zK{UnN7qM# zkIy3JT!epXb>YRyN>)*HoNDuQf8N!0wUF!T)*Sb+1`&`R!N|LGRPv?vNv0zkx1C&6 z%$iqz#r}T66HYn5SdG>JPiFxkM|&aMblzinG@pdK(IiKlfhy`^zc>Mc8t%!&IfP7tE=oLPkpkj#ixsp`rhR3Ct`VO(=h6YZ<*!VUHVg9=njA;y)?WtoQ3S0!fpgC}7E04@74$37dRk#gaQ5xACj}7~5ro zb`^?$v(V&Kx0#BZf5mzV`Vik;Y)a`cYUJo5Kc1T`8UfaJiN&mtDwK_JU=>DVp=g~- z=;s8bdk+f3#u4KKR{X{Bg{gc1k) zFT1LVYUX#CL@HD#5l)McBT(9B-d0ub6x75C`b2hBRXrEBkKF^Mr*?R5XeW8vZC0^;W%>T!EMIi3fPjY~qly%8C73vWJmYiB?cESw$#TAAXg4ilcRi zkt5&mtYn!`v}OWr1!GBCYn4g)){Tk~RX%G65b}5yOcxe2&rC`u)&2{^I~tsA_?x%H zXE*np%E(K#6*VkSOW9s%Fk)w0N9=_N@$j9$>Q9H9tV4Sk)mjA|8p|_qA_YaQv%UP4Gi~UxoJa`( zn^Vo!eFGS^3@7BPNIe1lQT%c^U%EmCRU+Cd67B;QCypXE!?Z~lrJmCv$ws+`YLEED zVPsdFw_gbI_Vsee(>31s9JVN4Ml0Ia7Hy9w#WvcF4VyW!j=#M7N)SgjJ32>~s?MTZ zK3A@T+U*y@*ix1{phuN{eFw)>h~IC^#)J}YN(%a%owTwyq;9!SaxHhMqQjLa#es76TDt-MqeIEH zI;`46Q~M`%rpvDD_R*wBw20J7A=q9fIhx}cNIEmxNZ4Epr@!1UZ>_Vij{HrS`tR=( z!E~8WLmMUE${?Gbc3AdcMnkOZc%%xv|5I`X{P;^Th%cV*^#8H=gWNKU=!We%=2Q+L zX*NyBt+(U(T(#|US_Wz6R|ZfXAJ(Dd6ym+<(eB*oR6UHxnj}5}iY*UFTA&9}IwfV+ z61oBu!fn#wak1>bTn%s;9aCXx$@$+(IC%Po&VK^%vGqm)eL@tLk9u2 zaz8a7$|UWqsIz&*$C9 z;vqGMzk%tu7#MY8d@xs@7vxqm9PCWM$3C}_96yoazv)zHmpxKV+Y%XBp|y*JZ?4*1 zPeGXi!GqZ!!%6OlYV#TL)+5c`#<*~TCrTXmslmf}f#@kC7Dj@i{5mQzIv;h2Dqp`Z zO|yNpD6Ub_MSaI0_cRyo^v4Cz6rhvi>nU0n(?2!Vp9Bq^nrXkL#{0moiGj4-)Ps-k zeuCrY>zDb2myDB1*G&?z$pr#&I0Q7~z3Lrv>fp2P!sABH6o=fVZ-VG-_6 zC0skM#eX}-9toyqq*L`3*yzi{d=Xa)dDP2256GJh4vA?61#yHwGNQnUgXuXN;1_qoL&4oh_^0`3f zqbyRSefL3zWV*szd|VP8IVU+(^ei_xOt7UzE-O*xtMpFOpnd}}my-i{9PXr0@J=Sf ziKTy&bL0pxP6i596CBW56-($qz6uF^8aL*l4+?MuUj8wn{>kH2oQ13VOy~Y6dij{v zyQIj0NvUOr!I?MQjufuBj;qej34yV+GtNuyQR4$kuR3xMmP8t)tGQf&E6RU|8*ZJ4g&9&T)uZkF}H05Ru&H z{mO#0gxyL~1M5qtm3JVY`BCWuWNeDOG~%OY=3b({*DE@go20GKR#d?F znIYFKQi4#+Y#zF_8cOQyhuWaI8ww_ldxQO^8+&zTRk>qa0BP?CIJXOT4}@eV=h{zAs(;L3$Wy1~Kp~Qo-g`wQ$@2^R_hn&j2zXnYyVOKQlbka{ zcD*gcKKd8`WdZ9>y`V1Pno@Y4&r8~@Sex!@+Sl#f@9k4+JjiWGVxMh2?+=ur`Vt~tEce4hlAfwMXEy-M2^@Hg%5$JX!}bgs$zB($tn5g?%{E?}8jg_f2f4lf^1;UC zP{gEGYyA43G{X2o?sQ;OQ*y;VWpw2BGD zh=R!HDJ?EX+%@b zpQMuFYwuAP6-1H?#TraYW{uyIYUk*cPNz+iOg}fzy9a|NP0C&QO{9sPgwOooXvLCap^yFO*SohnAEYAp`g19AHK|eLR<~RDH4oPx)NQUMx zAl0nE*>TH!0XaOJsx|NZr5;D1-9&qymnEkVDI}X;otm}Ye-sd;)~}_{t<&k!bk*#6 zd6uq?Fx~GxaMAoCPHk-00m!yodB9@Ey)`Xgc68nO@RJ~epQ--@x&+hDYzKH@9lWk! zTeKkX@AE3%et=?RCLUxp{o}TgnFY={R5!itEH%bxH;41qH;_+0Jaqn)*59??Y4|kd z&vJS$#Y5MAn|L~K%QSxSpzi`zowY)d4{n?e4p~59!AsdQMeuB7P^xhUYwgm-NInas zumg_^a-w&6sF`gR8%~gX=C26-UuO~pab%5PYtUO?i9p;Ib=lt_XWuD5S+Mc3E4NdK zafO6~N0S@ylX{A`!&!5L4)LCE>F8hDOav?E4phM)HT~KE= zE@0}AL8s{3eq%oEwj6$WDO=(6Lk+17VOL!{1~TqC1bTvBG=wMDl)`G!TDzIXy5*$_ z6K<=JMuJAIS6uez23>&)m}jB{si$2RAi>S$*&K+3;uf6_a__nrillUgG{w7ZQaJK% z=}FQy#$&P&$=+4;@i321H(*}ACLTaC9}Sw4SB(~&`Led6 zV(tbLV3LBf0P;kZwv<8Lw`u$aC}`NnVxNGj1G8~tiQuclq~!qMsHp|X?68eRaSb=G(sqhT;5LIaTTOK&u#sQw0o%) zY7~C?Mri9A=FChyRW!9bJ*kmwQc#55c{Vy5P;8Ax zQw7RAbS=pXIAlNgT^GNl*gUKrKG zLyT(J(dLWy5xC1H1sJ)Ao#Hr=3`rv)v3+e$H`&PcP4 z=!G#Kcv63Qkp|Q*)};r{fF!W(3mFlkz*NTlYY$>}U}kG-^qYkRkz$9!_yi3VUV-(o z!r??&&kNd1QT&-=jCx`s9PkW^?*v$i5X5`ml76##m+=N!Xby~v)4FrVn}I<|{pXI< z7X?VtijJ2T&3SRmC)17^CaFcbyL$}@u*!!uCDXJ18AO-hfN^|fvPg5OB%FPqQGSP* ze8pg_nC?BMmsrzbmRyCfvhoYhpY#0T9z;WGVl4%Wp?anTq;kcE<1S3Lm6PP?PIjFV z<6hKZGTT*Q0^wls@XQ7X=gzo5z|$<{+=`Whw#Q1uWpS@FqVMvq5Z2b*X_)%hIFtE5 z$Fye+9C-#j37A46CEnZ|e|qET9iaU>0JB}StPwO7ENL}Hb}q#*{Mh{8FkAEc-QA9f zR7PQshD?*Zk{|T!Tmwmkr|C!~h%-H7$!0C=bVSdwoVBDte!iEB%zCs`IV)TkL$B3B z8L{<1fzlU__DgxzK%&n_f7dxe_?OPOROWofjCyi(>*#L%dsU$GKi+>X=J%_9U3}LB z!V%&%Tvs?J?U5@9e1dJ{fpcO$K@;?v6-PY&0vv%ThZA#%uX4qb%h9wW>kR4$kD>N~ z5DpdGuuX}3h!N~7$h$Di)%&&NpcJ2Ja?h7dv25z zD3}vBK2m~Jz)`)tRdQ#xnJCTV_2#`h>*$@E>&F7+=Z~JgnmRnby9O`K`oo>F9bwg(zM5AP<(b@e7-U$tH)5g|N zjOoQ1vKd>Yv>xL=dVXKB2=U!v3(bB^JoVnUKZ6tnI++cFHUfk*FR0Xw5#|wXBQi}e zl6lM=QMhIii#-44oXVpSza&@#W_^0l7B0j6#b6lXy|nn5;|d|b>=PjbX9e%tzUjT# z?@UOp>wY&|&svW8gH0t*AgjO>eUcc88B(TJ6d}ZAT(+#KHLf4em-@5swkbnpDodd} zQ4G>hX4GUC$>@BzSXY$JBMo2oB%0jld#A2k2TrHAZCkfo^d|S+7+^cOP<`Y`3sNxW zOR(;=pL`N0x>KF+q{!Q<^eS zRB4DqwWRV2UB&njnTzBew}La_(sA#S5S8EqI{_K|BexLy&qh4Ofi(O|c`g7mG2pYr z2k;Us__)+7m1K~aLo~Omb;?(-e(apS28v9ep(O&orqe!7PY}>j0|8Yq=LN^MCp=w# zBTkfoAo~>SD+g?& zs@=~Rf;8YVqG1u2+$617R_0IE%4UxWG?1hL>v?$Jznp#;DI46ADZmgu5s%PdK@gJ; zf-$X*W|$;Ka;k=n;H#etFPrtC;!%hlyS>CycW9}pH6ZmB-p4a4&BSNRB%=-N4N!b< zHwB;=Fi654XeXU#%ceJG0N@pK_vW~QP$$ap>X3Si4^!ugdm zgmCncXZ)$}Gb^~~V=X`%I+^(<}33s4B6dgt;epgjUBJy))Sz)!Pbo#12M2~blz z!kjiiHa9if(Dqo+1@Ym)-7-KPvf)N^rBjwl392!j(bkcm{~DwlSCH5{;3k`AHJ%_d z0!K0L$==g&8r2>!`w;+C&>-)!aS7nYh4+ zFm#}vCW`u^JlA8E8%*|Z4f}|nn>LJt&^+K*R*$Q`oB7X}vg+zYN$!K^sru2(V6qST!?r5c9)Lz94k_vdy7(5}Nw6xS zVQCI3*9U`{KVjAB21g>x#8Af+-!c)YdMvcj6yBX9pkeRM5#Xigcd9xV{#X$#XmFs) zhOL-lA9Y7t8lLS)x^sT?S)6SCot0h+!%d=4Aq>qr!R0)E*}-9v_5%_6+yM$iyb_bGFpmAf}~?5 z5JP;!jfQQ6Sm_a=O;sA;MY)XFmx++=u^<1_t4nwQgkS@ig;~{OqXZ*WWYyoJGTI(R z^1V=AEWr!@mTe_`X*#khwB5{;ZN8HjlK2cFwG=!RuHk zcCGJBze~QV{&PT&QVh80&iOEO7EPUXzk7-OVc4W6FtLUh2f2>TK-=&{B-FPY#%UGn zN6Tu3zQi`fSyit@A*H6{zb0vQ>~+TIE+f?~8mO5(MqKo4|OP*LF4~ zNC9-QHm8-v(pOwOa`bN(G|pE}!`AE~rqzzFboDSjjK|_0qIJ%ilerjyRJLYvx3f!C zKIVPSVG(g$h)m6oF+weaPiPk!xRa!}UY|n<7<2XBjJ*CRZ12rrQ@4Keqqs9(;yFc0 zNyweiUm#cEd?RSJ?!!g$yKe;G;CHYdswN?ajRK~RYoR4H$>HJ)X41Jp>8gK^pf3vC zm@X+x@m~_F@@4^_y1DEXia~n{Lpvae|7GDZ>ycrP6m(fdnVZy3!Jt5+PQ}|V%OazOhBa&h^uUc=69QQj?-lulfQT-;Q=E3v=+p~ z=H(EszdIF4GFebJ0C6aBgLJA5tmo0Y(csB?AAw1iSApvh&5#?2!=*^=4UT8c0@)8J zXZP=LiqMs)R8KP8M}|qd#yW%#0A^bL4Q~f`Wm>Sx5Glqyu*1WH5?P|uJa79n?f&1? zMdiKqKNpzPrx73<(m)Q3P%YRyzdf>0LmqW{oE&c`O%&jyc~EkfW4UqtZ=-3E^p_|D z?K)HVWnO&8i?+%dv9~R;d5$0tmssd8d(Z0w@S*^sS_)9sP|p&QN~Ejqt+ zK~q0&;8}>isHhZ<5h=g6QYvGe!XfH1yS9w)HP+#bvwx}{-1i|lbwAmW%rEybU&w4g z7r~-dZRyFW$=S?H-3?RZMOK+VwuGTR@YGD!b6;XTJV2_k&{w5MV^edM=kvmg^Ks@# zO)X6*{QpM)^rjFOiC+F(g!fv8y>DLR8R6KW*4OXK%;4}DUI=qGc03Xo9XIu-4^ahC zwCG{&#!o1raTUQYfNOkJx9**{72@{rDbTs4wI@xqfd?%FTsJEG{?7NLQO9LA4RY>kV1ZE6(Jd|pj(`so<7){mvQgBM)c zj%oGuS_{T=U7`wa5FNWE5&Yd5Z@d|YYz8EcWiG9%6cwp#7!RTkWzGzECQ*CmKN0g1 z#+#sCf>VBedA~1Pz=0iiQ;6HTnkh4BWtW`)^v>^;DnIwMYdZLc`*lVsi8LpmD#Fq+sr-xVRI_3Xzg#;TL zIRzghNiAiOn z*$@iZn~Hx)o#jjcg=3qrC!Hb47aZz@0UeiYAW0q~d2b=fJf>1^)`7N zmwANl5CjCFM)k^`1pK_>)s~4JTxypdpNwJC=-Ys>cgr}oxrP+)sE)CC#6L}y0D?^h~UxuZSZ;8JUUx|YrK-H zQ%TLEoV~pfazssqU01{|?Fdw0>%dj{f({1u4Ktk8e~0@^pbHO~ePN&@hT z=`UV(R?rZG+((up`(&|1K?NCf`Lb%4FN^BFDr;(XY#CIYdwIyr{f*DX%r=l%vZ&Ew zrX1&8-aat>MVtcg9YqhN?WZ)0?a0{kddvtI~g?Y2jvIO($ z+Lt2O{x9u!*hl8`iC%Gk?|py0`d^%U2sF{GQ^ES6w6&dVg$HjR54+vBv5P>U7wb1F zeH^hr?pf7mNkkxtxo9Wv2u_(bm@EYky>pPB`B}^~CMmLhxeT zs@3}W;|x9dQoMxvLq|Pt#1b0|upD|(Nu;`uTP}Bi6NuVN#9^csGy9pg#9R$rR7j^c2VhFYbf_jv+E@P^9;YXSc5yu4|Ufu!6292?{F^ipMeb7Ba+lc2B!U zF9Hod;rGhEa*Tk{pwg;NJrO@ku2QS`NYes~pXCp;i_!wa91UlqBLJULnFWL5j~&W1 zeSW=z78H~zAA{MT4J3GN*8J`pJ61n_en2tna^a@qVD-hid(%Je9Nk(}Br>&3sJDI^R zI1-2ocr42zQz&U0aHxFZl1HbFeKntin5&5~`?_)l0HEG)?19Hx+A?pz_&S~DEQSpj z0}TIPUG(A{f|L5c4S&WS#mJSg>T!j=tL{KjXha;u!`ih2QR>%s+XYPQ3itYtR|S`P zn;%KQHuB4!tMLQ~Bxi~}@0 z)51MGu3klI8dGa3YmJ0Neu464iqZN@^X-m9 zUai%Wyo|(_A=g@CFJTe-CrWQ;i4V(+z+eQ>t%Z|T(>`Sdzt;~NtW-@Jb$Q?m%r(;n z%eEt|T<`5jF$)$JK5Cy2q5grGFNMh1#;+t)PFCBh(VmW(I0NeU8XW)QT6unhct9*jpFZ9G{R^N}wAOE;f&glZSJBNgSEcY~Xa?JO@t7f`Fa-0Qo z$9+cJdDIy7N}ODg*KU0PFJ1qCr@Za#gFHw01@H(iq)|0Pv|$)mCb0Gv_2cJErF>rI zX^%v@FX^qLWedv4G4*3crB$4jOZfRf=7U7Kd4JHQk0gI`Abags>q^|%tM@K#x-E)! z<)S&|e=mWi${@w|FE|dJ$6cR6qQ{j-5xn*=j{CLymaQ!w$Pd>|499dKr z_48j%@INx}$^6{YW`AH5oS_MwJ8v}h!z!C>iUZco9y4h@!)H}?524U;1sF4f-LLLJ zXBZCt@Y~IjlyxN@oM@6VyVchzqppVE-ZCt8z+H5`?P0;l5E!(o6@n)BSs?cAOG?F- z*T8THUwK|ApsxdjrW--8h^c$7FWPG0=Tg$c?Rg^?q#&Irvi=5< zq_Mi_*w;+;?HNx+*c(pP25S1)d6O9T9Sc4VZ<(nVQvrbu{kcl*EXl;gw}gyi{d*_V zi$l1>`OyWYO6c6p6s;INW@9kqg{e`j5QK*H`G;B!jzByW@3I3qIvGvh@=UjH@xX{$ zEJLoJGDx(OuO1*SlSrIoRM9*%A1gj6R6z!!N$8mLxYnvzY2%^tht18_X`)ru^9-&7 zEAX2wW;fG)w``+cPT8$d?5M-cbar$~r?eZ{IaVPCS zLsYIcDZU3EK1G7^S>B0&9dc^f6T@7DEXC^GMIJ@hc`QWp{0D%k;{HC z6g#@r+x_Htg#ZhDtSMLO0Sx`_cJArzt+0$~$JBhM*7SOr_VUl_-wa?~jMENVgW><7 zIU(o%JL&SM{vczxhR-?t_%f3K?g~TxLA`C$`~(BKqyJI}&iLQE0uU&=9*G)q@zxI6 z3pkD_DDWbFwIkEiE4kQ@Qy$&}X$5V9a1x*&=Sf$^y8_iq?%h($x^deQf~Ut0PV=!+pA05>XT12<1@e^j$IN3Y5g z`-*phhxI?Q>QH-=4t;fbf1%w0!1;{+&@pvG&YRFAohS;22(z22;^Wj!W?(oRX-49};@Yx{BuJMIU`h-o z!w%trvgWYmk=Bm0xHU|xmJ*yajVT9J+U`-h$8{34q z;G*iNEgWj?X099{3Jo3E3AeYe7P|cL)ld0{pL4wBjG;g0m1DR8b(-0XT-Ng4s49z< zrQwE#G!gLTmUm1i@-@|VouR#|XZxGWiGtGP1Y*heh#R}XYf7p|JVf_!)@&k2i$(J* z`|YY1b{+c zOWK(idxtce+r@mk4}Dt1lGao9QrtE3q~$UGnm`#k!mMzDtb>r9wmF;@QL`dW;q}kj z{wXe%8prUIYZ9C?0^QAP(kT>7bjcbHCIvYJ>BIz2hiN3`4hkX-KgwSOD_Zleuq@YL|nV#&*Od2GAtURlwV*AQ#8gyAC#5Zch z=h&f}x;A*zg5!>=b>W`T2{2pn-dz`(CL}SpyD|<^pc6W)PtiCB1b(d1JE7p!AG=o; zVV@QqepYQdH)?Bdik+J=4@r%+jv!Jrf$U6a+VrQH>2pWJXbQN1FWW}rV!VlO#*M2U z>HfadIR~JTfS=pOJ3-1Na+aiqGgk&p?W_ISO?sA;W;`uL-|K#ID16wpqB~ZPH$c>{ zo278rWZ-xe>nqmMdbr|pAQiL*F%v6WL)m^yXp<#r8FZb}v2Ue9J!(Dcp=}qGs-%sL z_T33ToH0Gxg;Pi>5%X#B`6DPw9qF1?JwvG7c69d?<*1l$Fn>`gZlVJuty)yL0$FaM zT+WoJLMJ-3g}ccUt~C;2ZSLd$y9fW3BZabjCdH*OPMQ=?#~&C^n&*=BvA}GdHFvp* z@X=h?X)3v0;(}=EgHD}kU+65YM)uzziWZLCDG_$FmP)?pl zpTmwXB!8qVuVir8|7^=USjPwK#5Nw317?g_K=H9`mc<{~F#O&OnK4|jC!#{J*)1se zA0txV{aj(upjsl}F?>wpuY}av)p;bk`7l@QCZnzad<)V~d#os>Im2m{yuN-C>gPw@ zWYNr0X%RPA=^V3n6{26Dn&=I#>vz)G2kf5re3 zdk{v~Km|0+sKYo3sV>);{vbtBbhmJC`*0Z({F9M1W`@(2(P^xTT@x19aZKpbPalU_ z6AB8OA${%y#sT8_E2g#jSr6%tX_v4ShPzFL+S%{Pz(oLzT!o_;Oj(NcC7aHO)7fk6 z0$W=;L^x`zw5HIgGi-mA53U5yXppoOAQfg~NpXug^I~hDZg)y#4%{Kw z?xya(L8HopD;p<2n#@@rhJGv~nBA?e;NHWa&O7hw@yZ{QXkeX3w?S%>78@>65x>W+ zlt%kB6IUt>8?BXHK@BT{xf4ftOtmYDbAxOCSK{fK$jwvt2VSp$Wq%QGkEQz}3L&o2 z?rnmU&8@m4W0!0z#zj|9RjVs6`^!L@ss2BxF@QMR*<|EypdG0v4(`a=xrLR$y$<%W zr5sdbu`BtK7q{#%4l|aHe86uqMGDG@h++=mBrS(kYXx`#?*te3D29dLtVKdo4LJe* z!ZAJ%76C8N5D)%~H&kczjJU|4N3&*o2iH#WY{MivH~xz(eB0h@Y->gcB=-2WC*n6O@Xy98!C z_{5G9$k85@{oGOpgoC$%fMT$1t&2w=7{x4{glj?-zuK&IYa}`vEr6ZUYL{NU8W3n0 zd;N3W%1>F=O&Hop$j?q4pZuudKyjA+Y1)~_oxV?b(7j!EacKdf{Pl(J&*~d{svSHu?s#&;ayNZ;%yEmxM}Oou1)mv|M{PI*7+x( zZXT-7OVUQpH*22`Qk*IK!OKNf!FGcWkUO4scvJ5ZoQ;wT5<~@gydUR~XaOKh)}+zY zSfTcXPm{WJ5JdRF22Rn627a^V`W>;Fx2cJbAvznVtwYp0-^Uj`ye=U%e?%DEqTUWc z4E=#5!wmjvD=Aje;LeL_Pzx@F_W*qC#1L0-2}@9HaJ8ey9sNp{(^#9AvGP6J(ZH<8 zOXJpDmNIi_tpS+gPY9+iY&ZHudStuZ^o&F$s6BB$h}eUEN_IGC2iA@dD!Ch}aiN5p zly{)Vn+CgS7Q`^OX68*hCE-#C#q1j*fev8ma5w?n7w(ke-~HV0DRnb)Ha@}>zt<<9 zbCYiVnD zCApGBid@V@fk1CbDbY=Xt(egp1SSkA%uG#2_lqJYPIuho-l#66oLOg}afurY%gw$( z&r3e}Q5t;?MDF$(g~Nu?ugl?qfxmYBve7Y8YklRCi!_tBHHflqakTxwN3kS6_9|BIV>B%kJ0iu$5{iIG#s^$t6{`a=C?Q*`UV=__glALMUl(1|^oRQkfRUNbg zNI{sP4}wyROddem8sjtgRPG}pf_F}KkQCzQl-YV}F|(0;J8v6>Ot>4O;>NW##y6?h zm9{Z7y&s9E1jS6`thb(#sr0rdEr*g0?EVMVA4IiWVpT_6t+JtM_o-kOByMK3FwqK( z`Im&NQDtZT5EK|XQMoCMH&RU?c*i8u`FovS4AsW3TjTBiVhSWB!X zI?uV>X|jg^qvts{OoQYy;R>djV3R`kF7g5dg4)%z7ZtD9^PbQJOE<3}WEw z2{#J|`hJ!>e+FqGpW@`J=)Tzy_xMh$TGq69Hnuobg+fi)>Y*+V@FqtAFC&xRGckOF z>oNEzF)!zT*8b#?3Ab1k%&a$&t}7gSFm)Lkc*gUw%4%4X##B9hyF{2fB$)Ere`6qTQ0^eTb~vj(s~cdOrU7yEl^gNK;>zc0Z%QENJ}2 zzs5GCZv^ttXqXmb4~d#T=W%;OT~zL_Gd67P%1a7Sux4rog(@gHw>Dn=<|5&(XyKpp z&!1Jyw(sKQDmhe15#r)a>JLMOP9Bfe)3a0_WC=1>Vta*qu7M_H<1EA_{zQer9}F~7 zKBMigZ={jSCR00?m5{O8m|C)X;3!B1!-rg?ADXGPR6%QU&3}q;1iZ`1Vd~GEV1{Gr2(?)_)o($=?V( z?&75M~BYp;6C;#xu5f$g3_ZqwoKngvXY1$_-$e;vyeOpZ9-S-uLFJ2IoK z)ZIM=d9672rl>pMn{>okUxRA@tRi9|%pzYi2N;C}6z(d#0$21Iw|a8I=$GTz)3*R7 zfrYpWYl%{p=zK0qGHGXh?5OY+eukOM*%GXwK^$>=KY@Fyp^WfXa^?-fR!MPOgqy5CszUzxmS^K=t(Y@0AcU^HLU zthzWgUc9oy7p#D6b4`K9q*DTWEA`N^O5L1{HqLG+f1cmZKr} zU%S7(NljTqc%Sqti@za3a(TNnFNrz+FeH6t;zX2VNmCJufLvB-Z^2ukv(W!8K~7|I zjCW*;q;c$x@BPi#9QzHDcU-kS)X5vwvzFfZxU9-W%xwX3UT5(;Ner`%$*~rLWMh zlugGdOoY!c;{<1?AT;2yBjRoSL?s_VHndGLZoc1qVpxjK(T<{I#AIPGtO5K@MDvNy z9gET44?0b+)YZxDbhixkdiglU>FaB38)(-V|NAoJ}fSvXBr zHsYQc9om_`I`ZQ_H`B$TuU0bzV@a%1p z=}rYPC5}$MNc5kBk?WbArie;Ld`UN{3Uxd~G-^H9IX&=GK?x^6s`0$RyBS>7rtLCu zWQODmbQ`<}PSBY)nCs$MXwk{IEe%Z)Mij#T-)E3RnLrN^!=a3;W`PVe+ZSk3;|p=2 za*sB$yFn>d#FC9Ou(hqXByMRw57VI(w?mye^9#X(ywBfWiP{aXI2X&F!Kwnig_mao zvuLZClPC4u1`(-rJAc+D%$%;uFa*YqY1w0^u(n!1$EwYz&~RbPQ=SevKTUDhGuTsB z_so>_EwDMx!Ig@5UUZ8%m1744i3yafF6O0X^muQZk`ZkA@9S;_Q-e4dn{8T5OR%(q z=Vp=f(Z%isLg8#}zN~a%q`&5H7`Lt(lBu3asc`NfmO_hb27TNJ2uz0zr~hwF)`&ZER~a|HO2Jr^=eal z817V)s*nwpK7nTS1N^$`1#I9blwmQRSUKBXZ3zSY6r4|db$p-(+?NgI zb|HDl8SSFvhIA+))akrpevng%9hM8f)DP@A$V^82rD`X!XU?dJ>~MzCBBT{MJR7;8 zm^XrjROmNwJZ)6a!3=iJsA)46B$nm_lO}B$92DJ^Ki<)ic01-{tJsDJFXc)Lm@6Y) zdL1gA<=wbDi+_W$RoihYU@YNl4cxvT=%$PIbqYHWp!`uVyJSCj0RCuoA)t=HMccmGmi=v^SX(Hw z$^xQ&H<{zir0vp2C-JN|CUqVlkp_$?060+|Le=&XVyMiFcsOb?y`6UzY9cg{03R$; z!P<><^i`WV!v`&9Sn!IFEf}L5w~>dkFNa7vvNJ{OAk<0wHL#*yRiKyc;gB-WdkuUP zlmGQu`{h;BA^0kVNttl3BUQnyAk>oKbT6zkM=PWsau|V5CM{B*)xC1hxqjM zK>ArNzcL)yAt@+`O@;20h@x7>xw&cTkiwG7@`W)jw3^*rjc~h)e$hd@ulxSH-qP>y zI5g+D9Nc!4W~UbMRvaRzBE~L!wpDE-`H#~WH!d1Xj2tWy~xk6l8^(g}-4s5n7u{ z-+aBxTkp>M*K^3bF^3_e$#_RF@>CnO;$gpi=rDBt-AM0Tk1`X=G%%c$^k-oPk27+LW_bJQc$3u!1&;?nU z@P>-QR%klv!T1hx1DGBx`iM`cl!-T)h&9fdw>^zyzVUE+liX9u1iR!I9+-^_eywB! zI5Ki5p#fFp)$i-k5$*W4-0T6RWImNS7vSwkaVMFJEH_`icB-NrM~8FM^_9p|8ldSU zszPpZ#z877S+`wlB{1 zeNgElUYH#ixi89+CYh#Tmw2T4Iw|U@bzn{W+DW+xl(wcWID3jHUC}~IIcm~jMh9%L zSWYh{RV_hO=JuoL8_Wv>nS*Z1Q{D#xcE0ApU+ z&I+=>Uk|)Rcdkw?^1L{&aWutRq``QTknpR*Z6Jh;7~FMTN4Xb}Y%8`_R2lK*rCPFh z@fuI>+#W`DM0na$maLOjJkC@@%mw-Yf#7qSpv8#n%G+~2M}#$TrHZ^}c{cj)Lrv&} z&zvOql<> z3@vU%fwZ1GdKd<&0qL0*=y>{ZG=s8SgXv_77dx-&xZ|I^X7Sn)yUP&Ol_$N?UBMIJd~Q#F8OX<`Ow z?5iiK@qdzs4@TiymAee3F)9nW>&|L2Z^@cZL9m#;Mb#GXbGUhqpeHxKE|6EZ)Re&*72^Ct+B0N>7sh2nhs}P0$h4pvc77y+vZfAgkv*eYs(KF~ z6E-WkpARw+&~`z}c_}d^GEN9aU@4!Dh8h&c z^`7E|TI)V+7DVOWjRKU_O>iNOxo7Zh2u5P=%>EIPxWi(wmBJ;WR3rA48dFDe;`RaS zl}D{NqH+hYVa(W^bV{lyD^XsTceJKE9j%GXKT=&Kyl-(IbntGC(~JUKdl5T83OT*# zilszS_1cq`{4#0@8yqc$e>HjHzMwZl1?^_%M$eGh2?Vp zYiKXWpb$GW)ilGLa55IU2C)j0$Z6*F2#^H+#+UeQB9X6XOD!UEFPA7MJwfst!PgMKC=#>jUz}#=g!q3_>Z03Xw{F3mt`fyA3}lA{iaWp zOCbT{QK!4sn|{Qu&Dvl2F*EeixJt^785 z7TSEZS{X4IlW1^2S+lAQ)zrZ?fS_vt5ep|BZe+pOz|3>$iTj)@fogl)?b)rM)s48n zJ^_M@2H1l8q?EA>(H6gZtC6OBgj%7)S_{ZJFWy(*p(sY9)izH3tv8MJKe|PGn`kYn zz5B5gIrO0CPDP<-XS1_v)UtY@9!$1bUT0q(c&%1}nIzp{#%dBHu9O@87$t?AYVPLR zV<4spxwCjV&%T}R(m;SZtVGRad}}ksK(%u9#l1(YP^@UgJUI6 z_izRWZzAm=EcPMaVe1uWQK&_aLA`YDsxu6z;@Ck8)&iu)@9x^39a;^M9<)VC70T9GBVlS;g#&nNO;vp+DRN8=HK$-v10c0YrdmaiF3O2NMK!vj>Z42u+A^kY_@D04x^c}gr6n1 z9m(>l05w3$zYG|8UvwifU+fcpQf$|{t|6l(LPh?8g$)R%#XjRY!NiXwENLaMi5h)W zmZCRE-u>08w9Is8eMo+BxTzDNK5SyGLcoLolii=g0H)h+`{*S{V6EUF66b|!^(bLe z3>K3u;{>M0wvro+iCjG2R^wQB6iJOBbq|wNye4)oX(4|iXX*gg3(~2f9K3%7IvMu> zV$UV`yycRKRP2ni&&zs}G=w^!y^*0cf+q#*1se z4vlDGRYh;lYXz$KAqp6Kil|f$)y!cxM~5^*d@X%y8~`%(Lh`=moOcD0EUcP}=G`lL zQS8}%*lqGK-a8;d?0Kl4T{q&sR0XSq_%tG6q=9IN&#f;5D$EfsLzcb-)p}?s5*;=w z-chrVgAt}Z>VLM*=z`Zc0dk#}(55aLRIv6p0^t*h);`^Vj4|g;InG2iLma0*ltlcx zdAgC1I5CX5108J<7QorVb;7HxPZi$%(wCXSKBKJttWw9cFqZVNXDhY(9e(uzx$x3%yJzq5F$k2>3c=qJQ|6))5^k(@w+2C4Rb;fkL@2-GV zN^cc$vgJ?REP*(STz1yiZgwT=pBKwEuOl_WBRCv(Ru0~EKfk58#`)+n*U{W%!Xr@f zzz0#!bG46++sdLd2J^YGWM&Q{7jXD^sX@MH?E7<(V^YM`Gc5$$Y?;L_ld?}4khM>S zF|c%~&hax%Jp3G{(@ejd)bXf*K+f7oDA>dPMfWgK4W}bvzQ0@A9nCl|vF+H@ukSU4 zJAe*$&H2t~cf~i`ZRP#yn0M~Y+g(u5EmZQLD_i7@;YONL@Ri`*>sE6LeI!dKPp-{_ z@vVGbmkSGOF)4s624kPd&yRybf4!bY9htS=tM0mNkaO>2O^3kY`eHe*K-U+#Xm;{m zb;yy@DOsz?bTeCLGza-|y)wUltLapFC!RE7eH9Aped!*%k&9P|J^V%rj-j3FTfJ}h z;Bn%!P5IV!G1MOVw&Nb`vGQc(DoP-;z@-4gFrL~74Fo_xWEM@3jDl&l*_)Z%Jb5`Bl@M>_S^ zW(wc#5@gEQ0znJ$5`H!<82P_WYSv*nX>}aTOKWCd`n}R(lD&}a(Ha!T$e~gL($4UY zb~8})(gPU~$+x^Fsnm`ic%L^4?b!b3YgR%-;Fy zyB^S`7y5hwA78xS<^_R^Xm2FqM{k~ zx4y(xICt3HNd_E>!D;}Fdf2}G;aRRb@S*M<;TDrAik>rLCY!{HJoL$MmL)KOStCG{ z95B9yC!nNMBP7D*TMyGY+BQVW)f*Rbssy@>GM8Aoa2ZyVxTNP5v$|#bCF&}oBe`J? z0A=Pz3*nuCZYc8BuG>ykCFa4`YkQ|u-eNumFFOv?fzH9Cb4c))uT@D?HXH)B*8f2VSJRJk04v*Cwf{nvk}cZOkAEc zQtPOT#<(+!V|vhrZKG6QQWdOH;}*3N#$joAV4-lPDB-pp$+59;)*6zW+B=qYGioJW zv}>a<#m(_zC&P3AoLJ-$R2Tl}Kgy!UQCNM9`5#R%S~+cN*2C0*Np21LAS~8ia^mEi z?BH0r+G&1r{=BjfifnufoX~z_VWs9Ot>^f?9F~ELb%XLstUjdM9YX8uCD|a`E*aw(ZfbGTvl|)+I`k z#yjV#N!91Qj#pStV3IibQA4fU|_`y-jKXEfEky5Ez_w)h{PI!B9mNZTgv?e+q3LgRE0SLCMkQfA4yJ zleyWOeti*O);nY#o@x$g3Y@7x?;n0p9ia`dhP}Ovdxq(opsq^m|2~POlF|}mm#KEIve!PYC0$W22KQb0;7i`6?v3rpRfaq}%p;ni z0m>on9%vIxm&t{jF^sty~JEZDPOT)$%2r*4K!HHPfJFKut@ zsLtq7ue7am2L|Qa9_>k#!TwBt9U8iH-Dy%{!SGBJWG~bzmFIJ`1L5-*d>PK+UOdat z?-`LJoSSe!&`xzaD3n}FI0QL7v}#}55|cFe)|y!`$o1lS)oKe>~G0;fZH$`UA{JXEZcvwN)_{`R-s%2C`caZf`c`9{ILI2 zX7=&L2xa7bDo}jSqz4hfxnTM~2QV%Rw*hr@HYtQ1Z~DULLqsr+W1ZQsge-u~4$zR9 zjaWT_E4LE@-%}K$Z2T$t9d`Sv%({>+`YP7A%PQL5aFjJmBL0Y!$5gZlTW<^GHCctq zBt9wJk+h2+ggV+??S$(D{DNSiL7=h=sPGT4d%3p&O2ZRK5QP@;Ds4>_ZpMBFl_bAh@^tT?3AR;KR2I+l_Cf?p$_?wGFDIZSu7ib? zO7Rd{nWro9v7>{CqQ=HPsLJUmg#Mj_8>d2FjxY)H0_KX9Mw+D*h_~~6#ZiWdp@`oH z$hOhsF5!)*D%@F#mOa~x1Txkbo?{PJ`O$}$jerw!j3^AZUzoe15*1F9afYU6nGoWw zP*85^N5Shvocz}oBR|w%J9Oc>>2raC_fm7E!jtMlIg;p`Git{EtI3gaoY%#>l1?eR zU=KDcqiM*U0M@E;gno@6k@ms@H=<d(R8m7${e%fNVknigAfsH<)J{gpDvr@cENO{#Vh>k8SpRcnBCx4A0{qY z#sHG270oNY?g^Dw3Nf7!8;;RPgX*IT{rZ$NYlIZ{ZNkQq%lVD+U=*ww*N7xb%sEXc z3S3lp=E^Ca(t!VN zEQi6`+6{or@z~Ptx*sowBwy@XPQoSn&qSj;FOXd-WyP^-kOlp|5kKCC^o(h5ijcOd!_nl!N@;X|Y_0>k=ZIVKhk2(y-5X%f;e$Js87sbSCb$4bjs*HrD}fhCDK0Zri(Dc^BFzbh z9ipWYOOxh4QL&d#^Z@bW=yOi#gsB*^#B4+t^WiFBYALZRYl)pj?!y}5YYuvT-j8vV zdaOSaSHqn*VumBL?{WKL5OBO|6O=&HkfMI|jM)OR_N?DAbcV{b?}j#7fm^G(+!xrn zkA~gpPsAR7FLhkqSA8;4jTY-+ZhJ2Z#!UHmUq34~p(R|_VN^(SA1s=@O|$5M>M+Sj zrQd0UXmWy+2Z8Z;nzb(g^^oURWTHGQ)c*-YKE0|`4P5Z}<$L@(kgk1xcpuKCzJA1R zi#O8qyX=dn8*0>4X`^#7UP=c*To9y)VlF*}KFqL*0XY#6j=npOLC$n}YIvq}er{{+ zebyA4wg`=tZLTREjMbeRQQ}ZHi_utAJ0gKHJNki?PzeVqar+?=NI;FqTwDDfzXH~n zHK2ph1~kmF0$}p$(%DEKf;agdMie;);+tr~+9=SwW|SRdBh)$#2Iq_d%`B(ZD+1xfe`OB3ndOwYGE`4v@r!})w*iQNMD)rX?U3Bht!!$& zBV$?<4mk2ga|9D-Fp*+!G&(OG96u=Iu;SHHg{P#5 z_d1YIUt0}~=KS~SM%02i?2AtU1^ETPU3(f-GX#=fGRIBbB_|@{Tu!m3(Hy;(RVfd+ z>0Cd{fUQ8ZH(6Q3{|w7YNcpX*_|@F`z2ji-TU|-qfTGVER@2jwLv@z)bszezp?XSl#vk64c5BKlu6f&RWvcI4}eF$Q2zkkU8D z)&StzakGP4JOu^^sJ!e9#<)jHt~lmb6T-@U-p5wUQR<%x{a7xM;7HegdAz&@D}%Ab zr6jfJf)RmEmXkz8V9O9C8BQKW!KPePA zN{ND)r+VhCG_VSlciss2JT5U#6mH0oneKcXCqlP!m>r!WiegFuT72eTX)|N-R03HmbGa7oCMM%5h9uJ9^I$GD{Q{$h0`CRkEWY0rqu_mKW5G>>ga_C`qW4aOyxgU@`a&Prmb}dMYjx#i zHKkab{Wzg5V4vCAQ!GXt>8*A;ZdroD>gv5QoHXL6!7`@{Qy8-KT`y7s*F6egU|o#R zw*JBv5bQ7{@>dtl2ua*Z5fQZmBn}3Wx;MSWj)ZkFcV1rttn-yj=6P7kmph>_VIgvm zcka49+9Oeh8Jc+ddXY1Y2a<*!Wh#H+PzO!dRgN4VS0W^fn0 z1K5FkMtksB8tLLtNWyjX5}BKA1)P@K?$kL<+4|;>Dz8SalGAK|wtOc!Fs+b*e*hwtM|{G@FhTLTHmB-| zn0*;yocOjO-pA)3lbUB4iNKEj&tFUR$k{rP8<+Tn`6LN(0^i61E>uGh8fb;Fori0K zuU-Ib!*=$aXD1zv-uJioavPaG1Y?z*X6l~8%^7|GYQ$1gP`#03RDQ2xLJ+H}|C=W* z?E@-~%Y!%>>Of{(1~M`49jew!GNsRz#Gzw3xrNy42;+7jnq z1Pm9ShVSVJy&9myxH`5N&i`o&x(62nPmqz%rC9uJXXlJ`>#tyNHBE}SIC$ZCMj-PpM~RnMJQr8?xr48oW8fuCUA6_kkBa|b|8k97L4?BkmA%G+g2j}q}qDxYlal@%28Fw` z^YQ&zQqtBV^hREIX}(azCjI&ud_RH*ciJ8ymbXPN7^PsM;ZqdHNvhxwW#WW@E8o+?c)QO_IDGatO~}Bscp7oKxvJ)*jYFk0W941p1(j4C~U;}g!P!mE_W0;JIo$%^^_&kLu>nMfD-X&b z5#j7mj-V7bCJ;A)1Z^+{xtv!22NGTJ$#0HR%puiG#{HFh4)LhpRZ*BoNLmOzm6;C_ zc(fEi8I4Y$n<9+3#TrM)m45yj);CH@t7M5AEIk^`E_7IR;#{bXph>Pjfb!u3^_ZL? z46X9*Byw2N@~+(>;RK;uydm5(52pP$LpUkrv@~wkrY(_}q%(3X`deergS`O<--5+u zogz{b#T+cev~HVl0e^u@c=o`p(lYn-DY%Jb*7g&bl6>*)kU_KF2zkUIcad&Enk5N8 z1MwiYSwz5v`K)HNt+XMu8U&&bvo)rK5L#KmYylhlqmH|cC&dKYx_m`cX%bl=iUbFt z2$K+%Bm(t`k_mOJ9v1Wu!G?Xxb#XqF`qi6&do=M2hiP}A8YH~&2~oxz#mn)2$G^-q z!13RJfD?4yk3Isot)i$B(tpm^eV3iXf`X@KzO;a|(x;UYJjU59*(|h6Dj8FB39V$7 ziLx5@=hv75;KZ+GJ>Il73hBlUNqtmHyvNu54B>{z9q2X2TjF{?8D>v9SPYSGWZAp2 z&;66O9Vzw!deQ=>Ql_g(VE{Ux3Y~6C$wBVy__2HONwAqbf4+)NQ=qxLG7fE*4$kWN z1Kng6v(3^lgcPN_br>MUgalx*&2^DPSlFs`x98a)C2aEX{2#D=sVTb2Rzc<@#ibfZ zP>n3+%$1mhTK;tq!d)EA%RBBFOVd&2?IW{TNWY~fg9M!rpmHVL4N`GpY)ftI&EfUN zG{Qul3DpTKf-DjTo|L;9OTGX2sXF+aidT0WkR% zt$mYshl?4Ck)0M*m|SWm1IP2;{s3~f`~UIpCem@|b`H&%k7nC}Sj?hO3%rOvj$)}` z9Ai$pGAivnuu2qpAPTbGeG{XS2&5k9f#eS|liuc_Ki zb5&)W^T|%k3MZ`ymHU<)FGb(-uJc`wi@c7i2>^3+z+Hn$!K~t$r(ZlGK40X2iDdZSocSn_`_{UBdEi64Oo;15Hbg>K`Rq%3Z?JjgNZQu~NxQqwsrWh9MJ)Qc%gr%nMlJ2>&&< zn_pP<_#TGo2})u5+!7S8>>8AXcgBkSh_nhxJa77Pv!rgCY|9O7By~Jj$uV1g=V|wM zf~Q;x+$Q?8FD6V%jf+?Ae5PwFnJUDn`dVvrbt|vNo_m)FKVMJW=J`8K|5psnXm=at zV3E{QT;}#>hY!aTr8^{zC#3gLB~q`QdJBn&%$Xd*^`fD!kFgZxW30FXE@JtH6hMGB z@SkPlgo^fWUt0RCp0^A1-4!_lc9mEo(*_{uQu4LhZB(M)n!IG_rq8^TjVoTE#6ftd z9%`lD0l$uc?0-GU-2i8lRzQcXb@zdLlR#i#?hh8Qv?WDbB$7Lf`F^|mR2M&qW&fzK zz`(y`A7F*AI~=IXu6zAKJZ(bUt%MLt7rA;7XKKGm5GjG&DCq_8rNcCtvCvBjOcm*p zia$WZ_;}A#DuZWy2@ZNS+kq(hqX*M)+GW4`S*5o)W(zY5&&tN zogM|Bi@S9Q8-^$MWOk?EmmN4T;(xP&CWA*clKzi`CMIg+0^yOs%KH*`*91}7GS-y< zyjqs#tN*64Y~v*zzpF$lhcM@HUI3FwbzT9;l9|8yfjy?4nHT1-y2gq!H6SPQpgq;1 z?=z&j)H323kfD{_X06xH2#q$BW}n|2v|YWO%p?6q=-y{3$EWfRzWTuVRW%F58`);) zhm5UXe?1lap4qMKgEOtAEs+Tsrzz=XR4XmyhTDcNG1wXO+ecj)T~{GV0*k2-_Pii) zi7(f4d3=Gqt^aHws0!iJ$ge%nOx^)y^&8|)?a;b&yk zV~xq>;bfUw_sU|e5@C3kwTaOI6CMum2%-BU^96@vhL4P6)vMku(vNoAtU+ih{541| zKYI;u>0Ttsa?24o*oERqqLJD*(%`lj_(~EMprP7_9FYmVS2Y93T#!Gh97Ks{Hz^+3 z)HS=uBvts506YeQt=N{uxhsFrm$oI@I$$8Z6n8G7tyzaOP=pBWB)bs*GA`A5&W|M# zKWpIoN1fc@O0yXZtNmuopjY}{(^(cgdYm54rVD2t_JG5h3@NyvJfwO5;ikxA8>Mn& zU|neu9!NOxwjHh8qb*O?-mGld9&@~86ZDIz0SrQfeadI;k!#ZgYaYD~K|QIyK1j)O zENQ&Nz4H~c({r;0?j5vk0tjT*vdD)7hc*COnsW`kl5y(28Jjdg!(>IuHa~wlOGcROZSo zHzQ)=5;}~Ee^pNiXuxhtg$J)et{PQg@H}UAmXMcZ2!M}5v8hN;nU)=AsK<0n1V<$z zNd|$_GxR43ZxX+OZVz^nZbQ5a8d;wE`WoY*F*Oic)&B#VP$ViXC8{dp=4tXJVa$aE zcA3oObtB+uz17Tp7bzhRZ@OKwZCe9QBxiYtR)Ck4LIc&nR}f^4r#jL%D=+S0CmHCs z&p@z$+ajz-yHlx9Hr>7s?PWI>Ve&YORF4?_2(DD@Db&YDi8XuDudSe`7vcY#|8Nd; zuF1p&U~sW*`#eag=0!GooRDz2L=bk+J)GW5anzck%id;K6-nf(t5SRIfX+Y=Jh^eV zn)vDVH&4E+uSe>e#DKWe(@1HY-zcW+TqekkjzX?^C%d&Rh*nNBFJTj6hgP;byUCF! z$Jy+rE+JCQ|87`v_#HDy270ftc2mV=-??0%f@V$<5_PC-(7GXYADRx{#jjNTOlwNH znFz9n9;5UqylEiL6{R(l?QlIVG&W>+(_g0Yg9-fzA z>PfXUL^P{I>~9|Y`6bJWSo8>wrF}ApO<0kAt9zEyCt;4XE=C&>W7D0(sI8V+c*dp` z!4A4EQ?UMsgk6C3xNd7WFQM1?WQ3R-LmZa?~J&zM1?^tZE4OSjl5v3{2~7EI{T3E9kU^* z(Bp2LpDF97G|pc^FO;cj-jtwTdM6s*!5rPnG%~*vZgM1XRZv0xxN1M%>oE}y9Pdbd z`7mJ~{yy136oiQ+wULzNlkoU;|A=W{5Q?uroZwP0q@!*a9BoU|~(I^it86Z6DQIT8yyddA(-)+Bz4RI73Q$V*A{t_UBwO14ZPG^Eh^q!JJK zOqAuO>6DDf<(}n&zQC0sQurLSu1}61DAYOJ6_@vyIM|{QD`-!cKiUYP@q0^DHVx+r zV_n!fJx@*W1|9X_7az@1+LH^Zg_DqE8?ZSaT8RlP*eOuS0M37{E$~`(5@Rw5D2|Za zN$@A7Ji{ecDWN!K^vd+X7HL-NRqAEAZlR+-%G;MuE7r`znz4y z&m}v^r(U{zOL#*9c>RklKK>9bZwq0m^WcwEw)lgY@@xCKUrlJ<@Qr=O&dcp4`BRAl zI3-+>3a99gEmb@3uK(Y9c5OdhNxla!J|-oDEcSmzKzsVN?6sf~Pyp^c4!C)Zlqe?| z226p|ewp)UD#ZW)x+5D!M&v43>N07UazvrOSgLB94;>}P%a)5Le96H+T5!AH^<`~V zt!^dI7p`0#J-yKVgLG!H9QB36z3R3~K7LaIg^Ey>#}mR2XppsQQBa zbJ=0nA6cZ)9?L|Riw}lhw(kj)sk>f3dE}wkUdGhbPLgyEB zf(&Q#mp~(fc7{9P9|%HhM<{@{&>V*OJe8F!EO#aw!4x%0wFRzig$Js$ASq8*sV!`( z(%-amcPat-L6Bv6RT542laQTIR5UOGr8sh0#d$x7M4>tJna_ZJ9-AQzJlYt}xO2we z>K;0{i~ByWd~9Zu9O$Xs0C`y6AUf2h4j`VbQ1A`ua72~9M<%!excS0E`v2W`6mapp z(;g(pPL^_kh-8`g{`gT-(!93GN+yUbU|zbRl$rABhlajN69xOtFiT72+Pu}z^~K@o z-GXRd-tPV*m>%U#kIM)3{xCHXh^s>Lzx>ZjV+_tP!$OrDJPc{>X@6cR!ecV)m(m#g z#mdaEk2Uy_9qLTW?t~xV=MJh~R!52q15|y2BEsC^r)w}wf4gRDLRMxQLK*Oo?_1g- z&5TDjI`Hl6ihn-TDs(Z)gTJ}5#$C!(7u(ym0~@FE&7VTLe=lT&v7x&T#J~@iw}-wk zv)yQtAw$k_^f>5Ia-bEdS`Wm*mRI7Mc*gb0@6C zxVJ!LFN%IbhVO}4=of9EplUJZq>%Z@r_C5^y0Rk!Gv5m3fjqKfr^>8N!I@@-*St-u zy3n$D^Dk}g3uP5LN@K05nE_jx+(KW@5B~#HlYN}syn2aqK+)@a4T_CfIRUk=D%Yti z?*GOp1P!B;f-_mt{%2>EpVSDYJ!1Nh-(eoH{&~S{;wtr$-WZWWEUdFHF-wsOB@P06 z;cKG>!K74jQ)yDW9ihkP+<8Y9h(=2-8H}*gX-bzVZY@j;UBNDY5&rzqz@MR#WeTKS zsNbj#{5H(i#n|1HzJ2<#zO&5r^x9#Yjs)|az?)e62csPromag`rxbdi`$ajyN1fgx zpJfVPa%i9S@WxiYDg(KRZ9FZM3@Ij;?en~e1_!B6Hm1WG!Hw^AQ%F>P>#G@tRS##C zz9N#ItC-+Io|^ugAa~(HRu<>2Veg2t{}TX+WA$X0u)ZUviq139C5_{Sfcw7Q)uvet zR?!j*w4D0=RR#9Me4ulYRGH1c(OWAAgp0s>e_VMm8fKfO`8Pyny{lG6tOR^X1qJ{?AVl@7(oXnx-}34?~PmF$d~G5nz5h(v(wW7bjN_hNxj^kxi7{ zwGbcxd&5Z^wHu6pnHABj=y9tC;)`~bnpQHTzCqhohBT|Wcag4F;U9&h^ja1k=E{R^#n`$oce}n;*fGnVXVIDE-Ss8CkoB*YR~2`P=LsmNr^EVpc-Po zpGkxi%%*{*a3J9hyP{(7O}OjPtIc1j{&{__+E=6e{=iYI8mo@!+36_z?Mri2eIv5e zvM_=a{l$;!LA1$F&s<|7K)Y;L&`C2Hj!87v&#vdY)6M-JbOGdz%9VMfACi#+D)IYwRmtOsGM{_G$|Ay@M5a_CGOXLD(c z>WeTrFQ|tETi;+?^7oO)dj7|EUFmXo2rJ6?9hbiwge@N*ERUtkLdf#r3usRJBM<&1 zfx4Z5XQm1#!k}oo)**;HJk@~5#f)i4KNN91ITd{I&{x{fmHkonT8b^1?Y6`sssq44 zhV6u`FX*x#R-CJUnhh>6Pas?kH4nohcDX0In`x-z8wAd}B*#{9JWgKcKa?u$O|*R= zqK~+>Q?C-A2h?*y4ShDG2zeHgvtCfQx4|xUnLPK?y2wWp7`*`+`Q#?v1!ZI&k`y-Z zQ{4NVFPPsAq6nsdIGxge=zV4x@F7%ZHRo?A7hjNr@;|wr_RS<+Y{uI}EiC=yGDBU! z!0QNTsg4`Z^S!}}^#AwE$YvuRF6Vx$NA3Jkcm(8bNmr+UkCLr6+k|fgJJqJtk^f|o z=}30B+UD=eWq|Los!VgEqHtkL<~x4WBlEQ$mj=L+t_O1TX7BOa?e3|11y4C~^(mXk9Az&1H(u2{l zwGPDwm&fLw3Y>&B;O*x~N;Bqj&K^B#&1Y$G^O-cE5STHMXpTyFdetqet}uIeA4fY3 z=LY+zC9(TDYJwcE3NKYkSUr5Ns(t!fmVn=II~L89ACtUZyRi;Lfgo|AtBZI}Thkhf znvAQr*IWhBlMjV-u0i9JSK0thhLzIXIbtVdqr>nOAPm-YpOPzKmBtM97 ztu-)u@*cOGWev)a46;WtV7I#uGNn~B5+!YVvxu-5_UT&UH)()DoNpmCO;ZmO0CI7F zNcNMFv@CvFT3`F+?)&JL#5%04z(B6hJ%&QA(V+5*o|>&g7?%eVxoNx>G_L$is}*FV zgT+`dJ@>Qe&%M4C_@{z~d6c{#M}aj$j3A(a0TAe@mNEEiP=Sm)GPFq=8VOOzuvn=X zfkIxvkna3d=2bUlnk*x2`I7t9zTUA+Yb_h7W>!q%Ja8AW%7d9}MR;mZcr)L<-9=*a zQ5L|HqHQZw?%O-~-;`Ob!H6f$21iezobl|x%6#?BobF-AdlvIxz9(Q%f`LHxkX(rn zzDbh-a-V!s%#DC@IETzURi!>kiBZD0YTKgk3P7U1k3N5Hc zJ=Maq(!5JE;)Zbf>vDeCe!juoNc5Kqil(yinjEcXI{`#zbh$UZdM%OqCV@HdoYfMX zfNmJ0qKU;4zOOMsZ8RrnZ|Cx4a6z9~&yDmnwX2!OKz-pIp$Z1yz7V+xTzPo3F3eJM zS>57)Qb~AW)BDMG)CM&ph9E!Br_kpBtG5Fz-Zf}s;)xo}>+T7wwt8J6xIjXaqhzXu zkY~1%{Y;B7I*1GpA}tdb!oi1Sqp%px7y^okY6I7zJ#;C#07}*2N@05-OTX{bUBT>( zamN>osz9(Cy^NwKc|}YQi|)v8bcT>}D zj?xOOE~8$fA+@DmxZZ$(e2q_drAfVLGnu0OH=nn@TMGp>2oRpZ2o!_@7F1%5md6uy z|BAD#S;b=@QUa#~BcX6KBGi2r=Ie z?p#F@3g+)KUO-2!T79078L0i@aB#+g!W_;rxjR%093{YUj2uft40RNuuUPEDDV5`# z9r0FW*SHtIaAP$Ls3 zWxlQ3Wh0d`-EC-AVfoMvkm7YFb$K;?vXEpDFI#l)6Em{kvo`|BgZHa7a#5hHbx}2+ zV0RV!p74yOk6ZuI`J!-feno$9Eu6N{!>TX7+*DiKA&xiTl-u?Cd|p1Ud3w&)F5yiy z^ZKW~EcxUj&K&jlQEm0d6a8Pp&Q>JT(l8MPN4Yn{_jv@4ZCR%}S}*IJ@@M}QfQNbB z-5@hT*jtuyE6?j$fNT*80GPL97`uDbe*bv^5dIR)BoZB!uET2Q-#f7oLEEX=I(q?W z%=75cvF!uN>g_B9AjqKjB4xb}!N6Bh7>K)@Y7eXABOw_M#^3enqI>n45*t5PkQ8I7 zMh)S3(*2KX#Z4b9NqJ;nmLqvcn1zWW(UjBqULc+~KpkOTYn+i(gJ5w(3){ducfM?X zymnq>GOOJpgdZczDyl-i@mxkw7&1<>_Y9=rdl#^CL~*J|SL*xTSw(~mJeg9Rcq!MB zxxBW>C{&-O#sWuVdG@>SRcz?{S1a)40-bYk#cTaL10oy4ewc0=+)>w!oEIvv8o%_K zriHD-SdCivT4Jg```oZLd@Mj(wiE&}Nr@Ky)k75%rK@YFm`ko;LTHH0aYnLpQh6RE zxpp0OV@ig2;h&T~Iyo*EWK6kLw3`M}*CA3pJ22M=uz*8X0-Ie@m}4QA@X@nhdaiS&2 z&W@N)kXQ5ob!sN%$~-Oyk4NGmwwr-Z9nIX(j)RDOz(yi$JY!46vGa(oxD}STq|*CX z>7Bm{?&mBl_4@8$nG8)n-*TL5Jw&*kkL%R{Xh+dR&HO9nPUql3v)(giAc}el3zc=hi%!`z(^w znsLf}=xn%NN)ZtpcJ(F}FSZYEeo&ML|VNV0fRE|R}1MmpQsW|rv?L)1P z^`J2K!$pFX5*@cKEIge+sGM5b6cD7+OIL1g$ z^m`ux4BhF*9EIP!N6^fB+E)RXnyWxKzZF7~d?%=;Kv}&i^PADTL6%QE3HMbuR1e&D zU;`P<)9K+p(&`)>D-D3H6!tcoPD>lgE74%6SX;oUxF`jVAd1o|Vx5Fv!SN3*OI;(k zNVY_=BIxLP>F^Of-#2OQ2d&E-#h2>D^OOy=v#jp;jX`qAzT$oEZOi1o66ugex6h^4 zNS=JrQ$y~s(`5vXilrGr5?=MYYS1)5?Jn9r>1C+bJvMZx*KWeAbPc+KUJ~^W0%>S> z7%Xo>eKu^1f7?+H8D=9??(njaJgqDj+D8q#HoLh=Jc^Y%=~5BM`07iZ?lWZF-|gqOmi@ zL4i#))1>Id@cW$S2#wUwHCQ*2C%6YfGAU&Rm_df!J!>cTJ(RCVE+6RhvJEQ|b-^kQ z#pbp){r_77U~Svzp4r0Vqc`Z(l5aycA`JHXle5h;B6mmpL7J^LyzRtikG=7oWp(3} zQh#a+vbI}sO1Mszu_z1kkK1wrVyVx50ARv-jC(e~P%?^Jy7S688qAIi1?-KY0uxDA zuDK;QIwc*kI*Zpbc2lXJ&2)x(`tVG@ZyTQTKnFU-<-|~GKU+T7fA``DPn1?a#0+Ji zjcr}qaWaNVGq-*o(eTjhV#usdM+wuYRu4ULRNw;wA&!aOSEplAa*tr`k5C@}=y;Oh zSC5Ez%C2L>fq-aKm|}XC;}gM**%Awg(4TV0w0)XE>{{ASQwr;DAAD)yB$fl$%=bju zsuY52C!vu`>F^V591rkIM+JBNA;&9mAFxuCw0w zT<)7kzJUAh$H{HNn}Tx@n9XfB@|XNd&{Sd5Cr#xd#F$!w6w->V0N?}xlL3=9oUiDM zAV@m|kmWP`<@&`D7D0;;HOPoSM#(d(7R{Oeknc`++?9KS3%;Ya1C2widdsko0QRYlDS(S5aAZ<_ce**1Qj9_H{=F808N%12pTtYQ;yU&4gN2aQf4pLIh~}c zT8YQ&iE+eFp+T%GjA{$Ky}sI=uoxx7K0?swCGQWW!_lJ*uz&cDj`8-dzioWiO)-29 zgG=>13o$XIyI@MyAVbUl0ZNoD%X%Z*;jtKK8LPer3oA#Ew0TQ;? z;ofW@#^{BP41__8v?|@0n3-QR^K_Y)lV{oK_s;X;=2V?PR$GF@-^OeuDKPQhyvJCO zC|#p!1YexA3dKPWm=46?u3E?BwwTSx3s=IZ3%edbvUz%OG?o#gyO1=Z_WjcNj=;n^ ze|#Q=U>q89I%KsY4_~_w1#1oaPdg3-0rbxLWGzkxHhL-c{{G?zZkU~O!S zL3fbB3DRJp2P2F?9aE{Pw)cCU?>+smqVo$5Dot1uy(Jd!qY}gXfJ#|nSZZ)+>`tFC zcYhGt^#;XJoI7w%rgL{OITH7*Es#gRm^F0~&3*r?UR6CReBAG9z9s=A3heEbLmCj(?VsD{H+8+>NA1bKH zOn5vMf10sSa-ZhcQ?|up0*jhzzLN}tmgvYcd>K2e!fOgX^~<1u6t!j z!$=9q-}>Nxmg9~=j=Mx=5^wOV{ZgaTK>TNGo9K&svD5Rq(xW|rdZ1Wr;c#b8`=L2L zq&xET=hU$$gmC^ue&$5@)1yj7SfPbM;X&;U+l2rgN*CT;D3rcY+L3+<;(DhdFLJJ;hJebR;y>O zoWz`p;J<2S0eG=`qkn#c>M5MfuwMy;4R%s74m-PQemY7iE%M3?WFN#13%v_xOKaBP5v<3Z)fOle5@9`TNh$=%AavVB6oxSDVi z2&JPLU?I+_;KC@^M&6%Rk6zhbl!5c6qO83r%!I0DQgWZb_k_a~G<6vuQy!u`w2=0G z9%z#3W4vya&yNbrd}RjpoNZBQWI@{#qDAY&lXB~ladAp<9`&Ug^b2j_k<0-mD}dzf zu^ntVMsNrmiGbzXzL;FhNbJ9=hYW%?JJGX$lN^j|=wLk=mU*$viIqD@-h} zZ7qBrTxl6cT>zy9uyz&LA-Y;u$mP4vG4w2V~_L!`VyLv{&Bc$vy3p#={m z*qL%FGx`ob>yzVN8cAS=5;&A!u!Er1!Mx7*Wyo|PWAD6nYgh#J(YtZx^NF9wMNQNF z*IYDjX9@gR!PV0$DKw>OofE|Vz9DI7^ZNGHg2q{>)WIe!51Xf$C1tr23@nsTAuXW*&FD$sQ zSDG++{XC$NAO@|X1{(lPK(fCcSU~)XxJ);+O_?Y4#OCC1p8*4h*vr_Jq!x|W(By^N zy-Kec)#rYqyI$PbfGPjwKyB*8&e&by)gV5k`mHT^!B2`!)UN{WogN@6vAndVlJhrq zCa-IDzQ%tnNHBth!U*Ii_m3S5lt|jW}ba6s0>Kf@#Nhj6+Fx2KZ-9A1ftw>n5w56dctSjfWv=AXW>3h4@Pn@ZFaQ%pu7^p! z{-kxc3%1aD5$f>@(f$#4pq)|Y4ZPa#)7wiBH$Xb_k~NQixUHgwUaDW>{eAoKt0J;9}&zHaI^1R>ndYY1wIn{B}fuM!FEWg%^bAA?|#B zTnLEK{;&mNo!HP@;1s=r;;D#`gCxIx`yc5%r-L$n?bED=GQQxz%qrt(6L2Usx?E69 zxMDdxz@PZ$CmkIc-*e^y;!`9UNp<4 zEoNF~(txK&7sT@nF=!ccfocuW#LlN9NvUdF*e^_1>TkFY8TBWN5q>$(`A-I0c#UXz z`F9=MM2*rf8amOd+1}XNz!3c%uq?;0`P%F&j+>)!g7M5{Zn6|YjpsS5B~pVE12O2* z71(XjmGu-KfWeJiQ4BxxX^go^mp;-wSrD?xIvnue6s8B)q}3*9K+1C};%v?1zyGU^ zM8)m1=s#JDp7Es3ekKERS6+SjJ{e*X5yrb*sNZ-ml<(j5t zdlI?vbvk0bWbA6cQ!bpk!MdsX!pR)^2JWYJh`Oa3``k`Yj(gYOeMP3a0<rFcbSvo?veAxBgH-Ala8(&?ll8$6*nxi^(k`h4q~JlstzIhR@D9vPivE z3~s8kM7CAeAccq?cHkrH*)K>Up!D~NYby_0A z{L{V2Dfjr6FcNHAz3DmJ+|>SM2NAgZgB2YSvuU3SOcwfzR3jzTA@Hu)sVoPCv!R5R zh{mK(DP@L*qBX}z?KetHg*2NL%|+@D7M2C&wvHh;ba_4C8C_K$OJ1U>bJt?bU7i>c z-;kJnwV9h3jA)JO50%sT06*Soi(A^J=>ish5?BWOORVU(4|Q#_WobfTk6|OOlvLis zaQNSi;?QD(e>dp$YjuEq;Up8O*-+a(u3e;eEXmseU38&Rk;Gx z9d56yM(RHi`REUs*i1w@Jv3&CD@hiOtq0I9W+r-sHq5P!;bCJNB_91dw=JDC46Ydn zBK!RJ>#!)^n;=VzxfDov8&ckZEQ~ITDDyFgoT+GgEFM|l@qW~r9#4RK)F&=!BX;sx zQ9j3NP(f8M?I4069pL{3aUin?*QPfUhn?fX$=Vur`yr9d{IQxKN{<$2ZOuwjoU zD&a&c&LJ{#V!&RI(KcgK4<3wDA^j%o)+Zxd$&;11*Aw~3K25|Dp%iN@HZjiA!khG& zJ68M%CjOq|?3K?Dx351!F@$$mbDTwxySbBUC-YV_%xBEw+vxTFxz)<2nEoAPxK>R6 zfFlBGg$%jhDw5=h`1#Ls{wA{eHRvpU>T{orQPn03EFP?HboR-?&)fKK@dy-VeJ^P<_BBY~)vk0qeJe15pz+d!al6{MuR{Mlk!BN(srV9KLSD7LGc?m!~vS zyj*nW1kVj&Os5~Mg5$iZ};}{*&+1WvtoP$spEX5V=K+= z{CKe);6N?uo9c82XYa zoSTQPOHlRQ1l+;RqDF8a{&Uq{stHmH{K2Q}a@-AS4|^3ww1sCdgOxx=|;`}>~1)Oj}Ne1}+1&G#h= zHs62N1{{Elewr`}65l)t)|$V-AmXUf|#! zh|IKTgIzek2W7N$d7fZ118W*3M#h-|4cA6LFJ!5Dureb0-O47OaY14Nu3y$UI24hJ zpfVv(M~{~d&?v%D&V2_Up$l}5ViOE^Bmyj51(WIj8zqi_Bvt0TBLZkYJg|DAyFsR# z#NK(J%`+lLJc-BZr9g~Bh^SH@+Ztp=!Pom=LdG_?&ZEJZG_lCXRw;2=wM8XAYy$1X z`2ebeCvCcw=>diy?99iCnW}<6D4hpag!)^X&}QqQ_@|PoxS$S6T@WcK2m)gvdyNsO zlp`18%O7|TPqKlgUv(zZUdnOpqEIO06o_ONN0`*y<&)L_h1rumLiABpvbbk1NREs} z5CX*wV@SvnijKwSfjNRDB9nTof`7gJSzj&h`U$%Tm;_p>$z9fHOzo`2r_s9>Mn@+W z(Go`B@F7-QOdfnNorGUHG6!N7@QwEvNX0miT8XwSx`locp5700dW`GTS~T8Z0MB2S zOyqL0b!)*J{UPddgI0T9D}9t_Sc^U5w!7E@aj<@)uZlB~>svY!x;=4FB1~r%G0BMZ z*aokVRGDMy_Q3J5xK3+@OnwD4*f&SM+osZMGHL!&+RYvEOHMZXMMeaB?}d83k2^W} zV(6u?r{h}Ig=Wtyl$T(*ZudOC;t#XY?QEh}PYRi@?l|C2dn5br2zBBwY0sL-=(nE1 z>$c1}-5G!qWP0Vt|Awx_{I3RC`7J#l`Qe1p?ysmT!|%m zl`tfzkr5eoLK}sj`{m55HsTM)cS#B&53pLW98Wao9t(p5N~7l=6E~xVLt~imc7OYT z74RqhPNIqA2>xRHxJF>jg^>~mR@qhWeGN6d2*SZ9A3vY}eUpA`JEONJfS(3@Qo*7X zGrI$Ez<6PJ?L^5@A({3 z`6@J+fQZ7?TnXFq#3(@mE~R~Pbj-8o>DT8?h^!pfjwgMRj0PQ$51?V3&RsLXB)tnt zOcjrFvn%k&m78|oMgLuJOJ2)^#G2hH&{O%zXBo99k(@4m8nIuSzISa@5;MpFH$@lN zpdlbUgqO&5s9JPppqPw>bI%=Z>)Fk{OWZD?*1mMQDy4EnG5I^{oJER`@qDAZkuTx8 zf1@GFbV}b&p^F4$dH%eDqlL-;mRY<7Sit^8)>j8}pA8pd>1tSW17`%I@%ErJ#n6aP zEB~l1&BYnFON0v$9ew%z`wjUNlG?E2KjodbMs^@uPyc}ht-6>Pbn6F<2=z2y5Ud0{ zNWY+9#Vc^*HpBy=8AOwU0V3;NdHhAl?c`p6<&F@!VdAw_W^F;WS9AYS6p9@MImn7U zQ=xVPp^=l>Pv7=W0akPoURec2Lb*uno9=7!5N2GG`nSj^_xII#vFnTsmB|SC4|&~8 zXzqw6JTj`60Q&gdXHO87)B-f^op#FEJ}`lmKqh-&=!6hCUzNRqLZC`#Q99&u&y){t zSoqg(vgF(1-uw279=JSlMALNRR&FzzDg_MCzsVYkE`522kX7k6i^!lKOuzJNM!Gc59 z8%^*>DnRbvD}pfs0@knqZpr3EM?x;^a=~(LIWX4eoPuu5ZXg@_@0k9_Nn&tdlY8P+eB%Kj0;k6?8a85wN|-u>A=2hcdSG2c}Cb`jWsuU{aWsu;%FU zrP%3MscXxHFKA>ON)7t5m+!wv3r0H6Dgc4u@a9h?%x9x(!n)5AZX99;yGW;P>;9Tn*^ATC#g_BZ2uV(NRDg4p?%O=Uh zV7*J(MTf3>){^4h8yccFj7vw9wjSpwjC)=g(g_u9)Q0J@KK@W4uA1w8ad^G#&$_M)X z5fBlBnE21DYXw90BralSwJv~}9|>KMyS4N{KA`I(xQG^!=#@lrmw5nJV&n!5?J&F0*k%#%2K>PG@z9g-jk)T z*6Y{x_=1Zgq)j28%~glr!EcdHo~oUsLaT#au`*q5c}C1Q=0~hxzm2v-tH1(G&)B6p zd;_mo1(F-0`m&(k-JS3jgwR?{ZIseK2s26V{b;`IdllBQ#l!NbNYa%NkS54TXD?l% zL#av7SXoed)R1Svo;lVRS`|{lE5H>0-oB?mDyyU+3sxV#)*VH0u^<7h zZ+w}6*%iCRb%`9^%7*SaaXCETVHYY;bx@fA+@4tG`=akPUc;itUe@;G}mv>(;D(ue;V24d5FK)`YnxaR=chiP1&v`8gYIoYD z>qUy5vr)o&vAHR}4i~PUf0fBVaH0il-@hq!qv8?iqL9!iCy2|TpTUA)@yBL`UPt7nOt}3_!T=IsPwn`;;2au6!C%XB&0l<6F z4NDMb@^K>nJBU)xh)Oy4G}GYd4h#X#N2x$FczxABYohh*n5 z7QE8}vlu;q`#%WOs5iRrq#nd_!t1~nW7rv{=i{S~;sGuuX9l|qD3ND;P&{%*B$pT7 zcva@oG{ur)mnY345pFAtw76O3ZEV6a>h{L_q6UI$5+E~Lmpm_S(wY=}?g~2wE3n}! zvCtLekfG(>WUUJC)ctp@4)gKj0Q_J9@8-t+ zYU914tH~_t(`ro711cIvL3=q}F`INUs{5yW*D2sD?41hQ1+Xr9qnA0t#RBqH0cwVX z1663?Xn3PZ$alt6$r`p}IE##R7EJAuxgDpEJ2B15esvS~{J)1eMg-7SM7h{2hYX6_WdN5r$sw&tzlhPw1;|aT)+rOdI#uj6>#I=s~&UK zi-);Cl@s-CbvNO>x>DdVozI1Rhb{7$4q2A|yuwDR_9{BAZ8Wldk{}(ls_c(q7oxvb zg{6NN4(F^F-EE9(nOyc>^ptO49_4z&ca44BSs1c%^0#-&N@k(%8({BcJuqw(<&0s& zlY;%@hw-nViN~9L-%4DA(Swi|>Pe4a(UN(9c(F~f#mzj|%9?Otg8Y;)7j$ODP=T6s z5CKr52BQ}raWO+vf{7j0JzbdvwMkngXLVN^*t6RM<7nwPGKvz(OgIff4g^hsqj3{D zeQMQ146={)#coi-BbNaJpL+bfz)IXlg_+NSk|PotEc?h7sM5;ADHO5L7}LNqzV1)g z3YCW0=OW>gb4O=}7Klp-i7Es6NrVT#tbPLY_fMTGof6I_9(UaMGq(Mu95yDw}7`QU?0 zqe+VZ-!sa$$^cP%j}nAO)T?a1{e1tdMfEUiqN_Wr)%;0A+46_Uh{>v=$6FN_B?4;W z4T{)z>z;A6AackvQUltKUm`CEET0`ZR(;w|RG%iuaIi<39E$KiBTU4eYsx%Qu0|II z2d;C-B#}sUk&D>K49uOsq=5mSLgVTQgI3UfP|1$)y2msQsqHf%1p9$9QQjYfT!K)- z$&cc^+KJ*jVbc-ucd^f`=wCl5+K5};&>I_u^qf48yVPkfa&=3ZLypdS%0bh_?CUOR zqPyC05i^Z#!%6-poEA9Pow6tSZRl2E__$skG{5n}4O&YQ@3;DP(b~&9J)iRMH3ID| zr6k8>^ed4Epi6C#O7X#Zr8|$Cs>-GVA4*Nq$GC=|XHh2k zN4F9Zg-)5GB^`yr6owg+ZYOX;#5RpCW3bBW-i=mi9?UAgJ=9N;G(V;0Ir@LwzxF;t zO&o?~u2%jDCZUHdmF`(uU`bhy&uHcIeI1n38s1akDT%LChO9MXj1*554?z^2KbfBS z!cj$cL@$g8#B^8ZGe!Yr_isWZref_ZR!CkYwI08d(HB4CJ=R46x?wA93BI$~F%9UM z3`VYa_@x?PlTu?ZaX;o%TV}J`PqHz=^q?BY^XXZ{ZbZQj7s^y;E5c&qecu6XIQG}x z^yfsAY$m#VYZ}4gF(x2dYp|Kgj4f$^hcS2!jAdrEx8f6~cb1A|d4m&Q*bRHe4JJ!y zu8g({A}KGM2I^&k&cwsA?%i-6*Bxd5%f*Vck9ANJmV{HyZ$T%@nte&kImKGQw8@=2 zp#H-BjyL&MF8PvAm;I%{{tEiJ(XPh|cq*bUvb8r!1t2+E zU53v)H3P55Jhy#!4q7qa6U5h_h)B>tIq=HMIw@g$x38yi22iMrL^7DGO*(E!zCgSH zDMf+0)Q8J-wHI66N=yh1vQpzTJ!_!(_@`25JK2Hn%Kfnfi;9{3`D+102Xa>?Su+Na zt8Sq>->%se5l(eK3M8Lv-Q^HI1-x5lAY=AH{qjzi6l;n(Hl;niHlAO+>m(Idg25H& z)FgGZ)z>r?Ev%;~8E419zAAbyoElK3y|B{2iQ4fXjnFRhyLlU6DP6)$#fTCPZO6xes;%Fgzq;^;geU zbarRdS%K?kmttG>Pz@ow#qxMu(^u(bk~ALo_a0Z`8>Y^+lIQs=T-ajB7k{Oq10Ywh z+=R;p+;a`Rlyr#*ih#O8g)Ea_m<{bHUztj%u#h~ITt=d>ws?jbg{dWqG$1GABYk1V z^#~`o?%H=FXhyAYil$GRoI@!OZt96pAP7K7n;qawr=FNR#a2_x3dEXg%`h0N_F zNW1Z0wkq3LoLab=71(z0h`V@M1=|CyF5JS4&oanwB?v69;G$pfn(`QJkondsSu(+2 zaRlR>#o6iw7Rq>?)9Bha{g${t(R^Y^f+L@p`So@LA3b%Z6Y!)eqvsL>zR>|{v7G`b zT~Dw|V>2#AH+uh1rIl=FJI@%&uGR=_h7B!?7xm6|#hPEmO`OR8w8p?Ijk*6J_pF z*#!;Iy$w7=-X{VQZZ$MsSWcfc9+#LH0|Je;yXfqGJreiedCfZX=v_D{E5hpPBa2w2!cJSE0^<6UyV(EVL07pUREJGWgq_>LRK`_1n7Hv9ui03?R(ToMInCvF1ucM*4oz~YvzYZb(nR5ho$O1oK z%njJ4*51Hi7h8ADY5n;UFp7RcEst;A{d8}W^Yv)V)zfu(KC(0uo(8|#%FJ>5kH7m6 zUpt{jNo4gzU%~ABOwqlh0iZfhpT8`!f33?yv7D?68S-qMc6w0-fZYXdJ4G(;F|hVI zG-LW5kZGS0G;A@EG%wY8`hA+A^bB5$F6nmz{-~^?3Z{;~EN#+J`yM`(Hr_Se>S3aE zm16qnR*n$P7jIJW=aVjyHwKh5km(S37jRwqA3{~=*YyO|La)l~cfEvX;%y@u;L+~y zUDBHU(U3T=t#Uu1u5mVV8*UkXQrFAS13R8Q0K$f%tL&UfNh6iA$7Jkvae_{@b=zA9 zaO;+RD{*R3hrL&vtu}L_J#E`1czRlEo}am#%qcbSi>Z4u!yoiNtQ33tvhJ1TR>WSk zwuA3%<^cd?Ld#=5ZrNV#G{fQ3a-(8NlGp+x(`F0S7BI}9j{^(Y8)hLDAizN6X8gk7 z(7{4jmUqD!V6=s82gKksf%lckdNIp?Xy66*RAa!IYD=>o=W={U=rh*0$q^=#x1AYq z8aP<0* z3P4DG>`@B0&3Qo)x;m?0z}OZ3AtJB30)=nl&T1 zm6Vq7%D_Po>av)#-Ya(Aa?A6*M*dfBO4XY{Yv_WnA5iDc?$-*K!t;t%V>OB`CNb5< zaEnsAZ^d$$xmm>E#b%FG`O%wvUXxAsMJ>7HrqS>V2G#l^PlNvMK^N8d;F|h3m~)dT z-#oPAl+xnIMzRb-{QLfCACO~`R8Q>A_j17wkq4Yr=y{~K$vj$c z=JdXI?l=zRXmV}Z-*X~*=OrW5N%9~&yKF7m#04=)G;sJj60bR9-eM7yQOX7?xaLR-D zvPvy@C8Za_egX;vK-%j5qIqpr^%PAw=&f-m35^3M0R;udKP+e$-7L1i> zLi41mB@Oi7qu0Od&g+@n=9dX#jwpehyxR>v`+vfrUZ-=nDyUJBY{1v5r0${CxhRNP zZHN-fTl)iMNVEBKjoOOWJ-V@>Bwd!542-R?9Qjy4zeu`;T|F!J`WPxGc%+3s?!)=4 z!ol?wkcHCbCLASdhjz5$ja^!#eNdel=qhX^$fjs$VnQ^L2pq@1c2HTrd_|zao$H=h z>MyJS`t+{=L09hJkQiG>U1w|sdt8VAXkHVMP*^J+Undd!b6uaA42;1y_dHx1bAMTT zTvp)T7w!@K4spq2O-?4cv$VRv-J$`z7)tf8lu7aAq1 zUyRhRVgwd7;!gZ_6tQ-4$9~8{0%EycqXIS!1m6`An?GRg*|&!tsY6HX|3e&Zca&>w zJD*6XjsAB@P{0_n&n8tz!kTy5_jCP<0H0pnR$WsfptS%Mdm;f;)2+};R3X*%W7vZ8 zxAC}owcC!48N5D;<^?dV^Ss4gUkINE4d-$|KXD6j7lh=q;Q*2!;V_M+XM)i+0P&<4nWW1(Ux`-znFGuIQIj{~gtOfAAGj ztY-ZZ(W4hAES`gc2?C)7Sjox0O9V+eI5pAz0L`C=VI znJHdb5(`!k=eVg+9izlulb1C0l*o&M;@IwMNbwFtpFX3+AhBLUJUhS>+5`U=HQalQ z*+vHK7z@xn2#lc(V(li&ctzn(n_L<2SbFej*8|Gr5X8pc$dZv6mRi+b4WXnm z?1L$3xLx zyJ*n;*kn}AAjrcwa;^Fw0eFPRl-Es^%MaxuRD@7ClAcY-EKnR3MD`v?mWhqK#46DT;nkm6~zdsVT(9}jht(FCj*b}CxGqP!Bz)QZc@&QIJ z%VlbRoxdA<)S}Od8m)QJ4jwHC?On;ZJ29hD+(e>tqCzB{dDH^6F^oo3z@=d2v1<81 z2Lcm^;>JPvFD!Vj#(N2OpF=>g=TQ8aud?U! zJZ973D8R+nMW`Q)QS*Xh&SWa4&(RIgWy z&EuQ8j27qB9JNrOx=!2p>2MTFHw-dOu>m5nyGoJ?bbpE_99B0k3z83$!n+Og(H$hg zUOYPT=Gv`j8}Kk_Zqw+9xn5Z@cO+TSdhi|3Mate37-AheHp2hdj}afxgkAawl8$_i z=I^AgX26Zi!G$|fgdD_0`AG3#&M7X3n_X%=Q-VmYp7^~gSf>Xk2XgPz@N_$ei>U|x zcTbSdTZWc|$fE?r%F=yj%-_F_pT?=B!Nt-EL+ahl(Qhi@`G0?E&srlG{x~&sz_mpc z6G|i)LapOPee$ivZWsa78n?XjH5*1B47{*V_)J4Y z7-7PE_d0ALBjWz(A-NR8I3JIQ(phFUr6o;En*-TD4qi;OA3E?&;>IUb2lt69w4Ke^ z3r6dO>TG5QX$=G?%C3}`Oq&|%d3G4f+SNa@Ncv*MPhDf%1+|V?4HLS0`PE-~3Hg%@$$q9%%#O$SoZa@C^oUgwUv4TQI6P zkURv(7z5XH^utyw^xp(M)v>$c2kYT*DK7A)vVNuP+8Gs!wuU~E6DK#)V-7=44Zs+e zmh_l>y|uDsic%Pn>F-Ra^`blS3Z>&21(HE86zur8JoR{mn^X@^pwDYK<$agY9FYi%){ztrZ-lbo74OciH^J8`hg@`NFLP?=Xs-6xrP*^(=F1 zwlQ`WyDuL2p*>0$Lm`XVEGL`x*aHOiQn$ITTmvPAd7b_$H1PV9BT~q6qE1*-o_Mzu zBc#!>&H;RZG{sHV%U67_WmM(Y9y`s)(DQ_H5+ti{Ao9KA7feC1HfECjZ%|AhnZ+N) z1c=bmjA~&6znIal)P3PM*BYuVYo`Ig%QO!uYW|zE8G0zmS6jBqkF10(ce4ZHl3+$I zGjtaFSDJOP`HI)yDUckhMtTSU5V@F21lgqNSwa?aaupsa|EY8F3 zx6&Qg;<4+<6TCz8h}#LP_pqt2LGl?E_?X(keb*rQ{8nEK+S;)LCV>?}k)bLpE@7tZ zb4eW&M_3M>RG@#fiJ`z|wzjcya_=pR5f*Cw^~{BSYi7_~O7ZU>^qoa;-Pw7Ks>A)V zt3Xg|(w;|_p`3}03t*W`=5zulB#au1a20inD?>p3x*jAo<;j(ue9(zm^xfof(pK z%u6Mp1%}CSnGixe*0(Q7+w1TYAikD=4O7*ND!edCS-1`wdm8UoRD)kfGON$YF(v z#7#kK%qvwg%nr!hQ-5UuJMBdmWH5lFeTN{PPhaQ^_3x}|f(Rb9&ZCx127zM);zf9= zRfu{l1TN}|0cXU+EI%*bYFfGhI<40s|l<;oA@MH2Ia?XQRC8@e~pE zg_~GR^sCZVdb}I&^$HKfUlDeS5Wp!iOu(TT2FyVY8atno1T*}QniYx3$711CcC1Q# zEN95)fqfSZ8_?~4Qf(DMYExXz^m*h+Q6I|T^_V_lDP{Bl>uSwf@N-f)P9UQj+0fA?R-Jg$3I{MVX(Nyn{%k;>3@l{^GAR&zi)b|9$R% zXdADS-%=yXhd`IjSg;8Of6F^Opx_G}DblX_*nQ+omX~)05!d5H;%yJFPI^HW7fNs) zW=oJK2B(z^s4kXaz}N!&ip>CHH_^2VsevPrck*iu=nwhRaMUvgz8P3;xBuy5&3lx@ z#ex!DUy0_56K-d6>~TQITX(Z)FxS2&T)MVw$1EXw8bDv9){cnMVWlg!pD(Eud>CDbOlrF z5WNO`td0oZ-F1Ydb_dE?%qUXc-9V^?@eA?mHffAVtd&ob4?m`yjkp98%`e=bUsLYe z!#1mKr>byGmvB<){DiTnJ>JUhdvP63gkzcqhYt_g#W{S;P;}Z9gKnzu60o+dFv_8` zAsAEBT{5E^wsur%v$Su-YRB=l4#ia`xGUc*c>-G_Vl~<8Ah9s&n8vN24IQeRgP^g5yMsL_=^mqMWF#u)vCs-PP>-s&;wJ1;(l$W%IL*X zC9(pWizoO>2#3y`-nwt2a+|6sjE5&m)BMdcKQ5074XW!jD!hicByB zWnXLNbQOPMm^D96YN0QW{EZmZ{yn>Emvgm@qfRyVNvzGhj_fz!fkPey2C@Cy< z@em$voRf32&>3tvqzAIIq6VL&RYB17ErJde<`$(7$+?)hCtM#}K$ zrbtLZvuYtYrU+KU}~*uEGpi933l8y?66_E*VCk<6u`jz?>1uN|)a zaxy?Zg6l=nLBOJWa>EtH+7-#d6m&$eU6j0zCSbGGh?JFAk^D%8md3sFwQ7-MKmnq3 z*_rPA&>FH59qDO%y}$Tt{e%|S;;3sq@iI%uV~2wCN}{Cged=v(Qeqq0?u2`(7t|r( znfihP{;|%&m#%P}ncoY%S)%>y@JphQqda*yP=*mf6*>?j`xwZ}$#0`W$k%jAsROeR z*qpds+Ph#Kvs`?19YSOyscY`3Ra7=~+#wm!^$-9-{G*oOZq%%|Y!lrcBcgc#m2+Dv6~q{qy# z<-Q6HC6C+?*10R58QCk{&^bk#-cGdNM%F&v%UDPKMmbjr!JG!0$(JyjtZgg`HdnL~ zq;ebK3(+m6cX^NX8n>=&t@ls_!=8glJuPPT7$`Gh~4rHN-RkkZ^ zTtO2&uMI|^dGiJW4O8KbqGnG)oAV$*`v<9gWMm}Hv*FFt9N)l{uMHW)>S(?JM)UYd z4?^U}&u5k^TK7LzNh#t*K<+(gGfAU0{0J)|yet_cM#{rkWWzy=TJx}yQI|tiNgOnd?>_s#+IFx~wLIxX zMB#;!u4jbSKAeB$hK`nG*bvpYM%J$p|i<>u;F=&r73~2cD!~x!;|thoCy;E*SFU%ku;%S6p6`!EepG1Ar+F zF@|hc%um;sF~Ic#Q* zq~mLfBdyi}OOR7u-RYaCxX$Akq)+4)@wFf6fKBqRkwjR%3;HwM6blwPASmARBTKSW zuYl_A3iC!fl9bV?rY}P(D?fBY*yX@LreEu03;DFX!^#_T?;=R`a-U`|TItcs-XAu%3-l_rc}zb5L(_f(+@RoJqka3tvL#lRMu_P(ZLjn@G7 zytcO(wSx$e;-~b}-_FH0q=<}wYd*iW70}?>n^rB&+A-|%2@==co>t$%R&JM94l*5y z@VH81RW7(x76m1&5w1^zB?}96Sh4f!cbXdD9?QQ4nI~=$k%7%Z17({C!Fhq-z?JI6 zJ7XE-0DS0$(xCuy^+!Zg?f)etudD3uT+gnQfABqwu3yv%c$IzGMxcQk#|ksBs>8{j z_V{~`Bw~5WNY*XsDDTg{_p~&(RlUo0nL#GH2#b*50M?K0y3Y0Y`Igab40aBZf@2rL zkrZ!6P(XU^8V@3r$D`FVE?5Fq;Q?YlX;8m(;r2kuI_#kCDDKhKb&yi&CQR3Ub}A%L z@?+DHpaiuJO1b~rx}5()=pU1{1!R2#NLba@(O!*4bN_;ck$I4eBS+(P_Gi6}k{{o8 z?jR#Bk?HShZcuoQI`%@xs_L~_r{oUpgMvVEI$fFe8SHBbUXPNe1y*0wJ#>EpggT%E zMoR|}G=UZcQhHH1UBPgA>!&tZH0FmTp75#^tIHPT^5k6j?>i)C!msb`LXTq~n>%&hYx`GxuO>D)fZgcM*?Q6eu6h-DQkP0Zjm;3=N}D zaXblen--;31pp!j7mEmiyyrU$=3R>eB_%nWZ4{#`k^4-TJrPC0lI8^+m%vuWea@ZS zK1|8$@G#)vFzpu~28)j3>PiMOW-YsHN_ix3QL4F}Y)zQ`QwiH5o< zvjtQc#KA-;521FWXQ7w(g+B&?@d!1tY}KFkJD6{WNlmQFrEdQn(5mmQexC?#q`Fc` zG&nesnNs8EKFYyl7luT1y&VnnrMH#z`AH-b@H(f4V?4tYSaX;P3tVz8QlqaB34^?t zr*%1I%aMb{7y%7ou+Vvi{mO&L$)legWWp~y8M ztIdsuv+nLJ^$)tV%8quz0}RN%zn!*z#g}Bq&eG3U_ogq%9zch)Z_=;M4IeVxco+hP z42!|n*E9lc#Zwc+yb%V|FgnV9lp3oGGT_qLB=c0+$F0*}+))!jy=4u|%qQpoO7NY3)o9x-i0vCjCPK*-pr! zcynhzm+FRZ40JuH-$w88(!Z{f6b9<{m5ve-+!&QpsCVQ`GT2XAnxm+b_`28+;`OoOt1*>#T<1wPE85`Vra|`bBh?KRlwVJVljk_B2D2aUZzyCV)Gkmw|i$8MdiXiNE^F-ko z?#leFi6l^{nMqL({{ha=-0_;YRpHu;!|`jGua$V<7WA6jG%Vx3c~aZgsmt$Lumlw@ z^1hTjm!TnW<@+R%I9Z$!4m0OcJb<WWzjW*t1dIEp zn2%TKZBznv$;!{8z&Ih#|0n5Gs2bi+MuQe#2^5JYYbScwqv3=R$z=$}Z%tKt$n)azu@QJcp@u4l6PZ$Z zdF=ZnkceMkL}!VrlnM0jSe!fjG2c|R0*IXy8!MV#g^4Y!iB6XYZ9D@H9Dt|EPm$Z& zgYCSKN?3*>Dy~cA+Z*=d(=)TJdm7?_EW`lr35JqmMgb2>HE$?xNfCr=zJd~}l2HWO zA(7tQHouVoYszd~NuUcCz6$WD)5IZaxW&nshJY^Jq%K;WnwZ@vAjddPj}fhkj;#uz zZ#W5evyt-Gla3lvxL&qiz0HFsq4~7|Oz{+lB=G}?M!(_tkrkGoS_8xL@@&Jq2tV;9 z&Ueo7mT{MMDJnf)q0N79No_FQ&%=+iVMW>+UXB@w! zV=K}GZ*Am>KUx2Bi!WAhcJX&Xx%;_`2nP3-#Zxl$-1MOXB12A1-lo~d9}VQjEx8CU za1xKf*19h{?pRZh1xm;U&w>m55MyE&(uvJANuTgSwOFTHMtN-$DN87GiRuoJltRP6(&@jook$>Ra{eQ zfZhw%2S7Xb4c=vY+MKV6P_d|VS(|`fD}b<&9%M%4hv=#%|B{l4a>%Q0YUI`iCe$yZz8HYZdWl7zdcV4a3FNuYNUuebVN z!>!J=dwri-avhZhy)TW)AHU(TMiII=zG)i$1=M8+DRIW zfSCkz|N7Jr9$tmzrs|8o&ph{Y&W4FO*SZqeYN-4#&m5!}!N{{Ka=z2Xj}Ry6Jin2- zAd4DbWD=eASt>)ZCjC-`waO(YyYOVvjUiEbyam&qu_%vPthBGRitt!OONDk;06{>$ zzp^nD&3dBF<5@w+l?UUCXX(f;vrF3Vttq9p?dhjt5kJx}V>fXE`za7iZ0EaXJhPJu zMJ37)YvQ@z(hvfl2&^3X{G=l1<*n3T_rM5KJv0HYAY2GjFsLmE)kvlA2-%9G02i7c zp0$yZCT*qsU7@P40`&{p5jZ%R1*z|@gSzA01GPXKa+zzEKQv*CbmeG4l-Jn9|NMw* zkBE;!YAQ3tQqw8|ih;_mNIG?4zqXA4y;*q~=*$q4b{7sEZ1 z`eq$Z$Sf!8@=;~Q+%_*`ygbvTBYd67$EpFiF`OqM5dwMW7xfP^X=S{rw_;Y7XWuc) zp`)<^Hfu{cWtbxCD521Y^U?03Rl3zg*>PtF4UN_i*!XZ1eG$ONqKRI<{j~OZU$#a$ z5v;!97?{-0=p|-COH<>a(P*G-$6&MGbOj1!+u@oqQF7EVFZU!hxtYycbcfzYmk649 zB`W>(<IEICVBQ0WWDi{%8R4`?5PpyEmsOA!^etCgTK)@ zV6a0QO;UawG8&rk(DF0jkd*fY?cnh)Z#$80aUO})+C>9duQ)X< zW~0h~ob}Hxo{qmm*0Z&}+zn~MtK14A`iab{Q8kaY0(WZIX)d#)az0>g zkXBgNVJ^EMfPlM;(42uig0$V^O7!NL&>>>=C5ncDj54P%IXQTvqbA5)T^K|uan7vm z=f!{s&tA(91%hD?pRT8g*dHh4uwpStZKhas@(+9+3n)j6Qb~U2?&QP~4^Vyj#EEqA zc)ES@1b?25Srb{0#2ws`z1^P~1JG8y@*6f!Mejopur9?Dm+p*)0@3hglV{pJa#~2T zvw60bl`wB3Fn^QaMM2x-rDpCwJUqw|a6TqjHu${7esZzM zf;^7Ma(Ne56bM|8nH}f^yAQ$@XR~Dz#`h|qnq1Ln-ApTFGuf&06Bybusj0wJr@?2P zc;HT&D-8sC4JLrMf8s}vvDfqWtL{7a>Ub&Q=coSOm-kHAMo@sVf?EO7#t{FV|3MYn zu0m!*139i4H_|*K!n9Lz3MLljAHJ_G6aX^}4S9^Iw3J7i|+{-G*SvRBdr;*GIk`4LVM44Dtyn1Z|`0Uw~X< zr1dTFz7dIZuZ&YedwIw2!)saJ@3i?Ejg6#@aCKP-05xI7J~JRw=vXKmFEq0X)=tY+ z?Jfy(7k;7}z3Z)%KRtJw(yJm&)1@L?Ev!i?rv>xaWe8mEh)P zBTzEFr_vc)oG(VFac5s)mfw)g;7!#ix-#l1Xt%a!n_~eNGTlflT=wiFZJ@P9?&By= z7QZ^bVl3(@ryGFnqMuf;<6GjriPZ5Tt>6K zi`y9(hVo4ueV)c(yPN)6eDoeH;XF5o@iX^^BFIBzEe*ExE6=KHcrWz9Ak`lDl})qZ zZB2lXLPMr`s&Dkw0T&4uD8L0Lo&!1&xm&%-)!%u93t4H_&8u8v?yiq8K3VAIu?C~0T6g8o@C)ov7UzQf^(<{6K3 zmGqkI7MGb;D@Cx~ zl6;cz4Zx2K(u9X5=vgkOH<>DqP|5SGEG%0KQ+RLqQ6$pa5Ry%f1||#w836bAT5xE- z_p3DijC``jDtwrjNJPb~ffmpSc`WL4Um%I<13CrGUs~XXOnChpTAJCA%*w>%vJDL9 zllbx_p9$~iETg+EyEVSn-A%Y4hmxmO*a+qbFVUMHwZqZ{5WOXz8M)d6k7p5QZ-==vZXfj2OvosBt~7+%|c)E$(`r+BmSxAICl0V`6*hj|9#eD)&$ zK5ICOQjz7Ciq+*P*u&QBO7)&b*$#?ARCjJY6fJjN9#EZ*FZc-mC(nj0^8}nC&Um;J zMVot!qqky_JeJ5R!n<~dAkaz{wc9BUEzy3heWdNCVX2#~dC)c4zEB^$UMQoeg$HvM z*Zk1{!JDMpq~H{Dy)RbR_D-~gO}H3KpIKu9CG4kI*t3z`g5CUBj6^hT0j~%Us)eI{ zZG9sSChOXp?`hfQtN`P&XfMjzq(4*Y?^95;(Avhp`)c6uEkRE{`#B+qL{Yw=mmgKR zN__6Pf$cq{ODa;E>>jPQK&@Yc2(aL)HM}#O4w`UmQw_b`@IDirxRAsK@d$g*zog?E zXWh4j(^yA)t9Kis0JJWwBv6zP*&pL*EDJBug>&WJd}h{2+~G2kN^3f7t0LBh{90jD zf<`P}p{*C>2}Agh248wn7#h zYSSA5ai@o}5=N~IWyjQcNFvV{8`fA+dw>tQ0@E}WN_>7bo;=C_cYOEus`Ar2^{>^GHv84P z`admKlrF!aW`3W?1#U|zRa-QGiWn68v09QgvXADxi!QUp`OfV+KGVNj=RPO;??V;3 zzJ37aM2W#daVPv(f4#s{WnQqx9(O*1$A$^~0pWC#o)6Tf)=S*)0x_zu$L&W4ej>{u zN^7kkkCM;B`3|`IURwtakID+m>99ytRYP&v(f2S_@I+DBE2Orx!EF5)<4J9X2TVPV zIFT3P@(6AOdSLE60O{1MrsnwoD;eb*T!^M9oxGI-db(#}i_O%~L2+zScPS+CZWW4W z@}_-aYWJBIcBUwu@dR8Ird7*0A|o(Ll}R0n3cm|OWH&1V0`Z_w7aa&K$5aR|J#a1fHt5Z;mJ2rt0*|lIL-_A=U$g5v9Jt96;8)RVUMMtv17cy;m;8fs!`*azm_L>#sgfLE>WoZ&rR?#` z;s>URS{vKy3dW`rr+2=9WX(=i5p^rUQwCq@*Q%`bI~|D#?po}1MRebA!!Ju$p2*Gn zFYQRCT=tA(O|ReiM*l)jw9Oxw7@y`;19R5(1s8YsCbv^o zZn!AVGXcV#IkO}(J|i}o5?!QA{g4=*`%p8dUaz{GCRLi-MtcWI*X4wZcBv`68+QWH zEjm`@IN934U$wkmW^g$Fct#Oy#%#FV7Q7&9z^=Dxva=Kr&r|X`mJu51Dl>sn$@H=% z>B!eA9!=kfB8$&G#${m_?qs)9x8fWxs)L^lunxS1|NE5|nqq6msD<<4y4%BY!46Px z{@sOf`po<))=K(znY$-_&W+!9^)(A@v9iq7vE9b;-a5Xmm6v_4@h^3niBZD>@`|V~ z;yrAifk>C{z9sVkV*P#m8=#116LG}lVJkonQ->Z~HfYh+Du-E+(Q)`}+{+RVFWx+u z9{Z9=iT?=SR=n|Q73+T7asOZm|6?r%t6-@fI9l=62xKv(w)&EW5}<V3*90NQY3+3xVET&1+Nd zjqUAhz!(~(R$_=i=Hi3u?YrKI2#czjOjsNMs3CPxln%0N^FVl5&At<5sLpz}=tKZO zXat6CBfW9)#YaWkkVjOH#T<7Cn9Ru>972{(oB0H=tgf+o<{B8e2X9G&^K?$GG_GKd z%L#M>Q^B)KQTii>$~)8shjEutsT4sAs_pnWqv74U7krRut<9bq7=hU?I1eS zgrXhwnVdbn=g$#z)reK=i9ZL|P-b&;-F>}&maVndr{_(f!4+>t80U~M+k;bdmK!w5 z{otJC{!+_HGSa8gZ$?KJUJ_xk;Y!UBkUyr*s(wiW=Ojys!?PGxi>HhgV`kY)qfgIM zElnhYJmBaFv`;Nr=`{EBow2Y#K^??)0hq#Fgyr$FXHu5jv`gtLGNc<=Alp_la@r!N z8AgNh+L{Yrr&<_41`B)ha#LBzeJ}bcfV#nKQzkWG#&}OoJKLIeIK$d$=pGS;+`KZF zeL|c5^1Wq;k=_;4dj=yl$slsI`SOjf8;yU<(>B_QvwjtN2PA5XEr_P23UZdp!NF#| zt~K5|pT6l7YBJ!x6U*(zQTB7_dnzM|b$*Or zd^i&oP#DhK>{Ag#p?Rlog7nYG{8~jR&}nL#Z4SS%JZG7mu;d? z031wIUUl28wak7H{}B<;>yuEX(_3R(PJ7w|im%;Q_RDHalEMRb{(w_vj%T&r7P1ej z2L;Z!W7n(IrX+jRrRWX!bf+e3!o~q`?E{=>)e8Wz_JlqM;_yop&T4LYBJIa4z9A?}q-6Ao6%jwi zR-@OUFchlcXvAyn4EoQN1Nzm#eG6T8R~RO>(?_{kU(NfsAxDnDNs0D4SnYtnE%AA@ z4w1zFe;uig6|GAlsQCnWnA|Za_3vJxb`wNrGYCp;IcH$q*I-AF=5hjfSvqU^7p`Np z5BduTNvcn@R69>s-qsA6Qx!oZxo@o`ZGr{RbW8W>@DyDcZRVOb@$-*7NLHiaQI)B) zLcgV8d$OOkbC`T0+IL=jtprY|oZ&^$+UFX`*(&A^p4Z|)o!!?E^QmH1G$8Hun!@Xe+FO%!+YOX_Z&UeX{IW;1AUJfnU^5}0hCC>-CB@8 zrP?VGhF16Tm+%c3cU4V&B~)4dK*a0<2Ul{$tNuLK?HPWHv!@u#t*MJlIA$k7p#Mf& z2TaINJh}03bdT4A2T6IsQjZhwFJ^+H{Kn}@Hch4GAnAI0Lyy|XwZ z%SM#bcxJwrxUcO0Z+1L-5jc0UZ(b=$;)KG#6rPlad?I2pMpX_G?P(j1)KB==@h+($ z|K^ZYD?-H6O*zBNW#5rpB(Itia1vecXt}w-D)xZODxCmioxVMG!Fu2q|L)FD_;(4B zKMQf6-nUnPmTUo=uChv?=wwBqWY{jB2Ah#14XXKx_tdP4nQA~oz@GB!S;JvJk7&b{ z?5Fl(H3j#-xlXr^FEbLi;1&9N8?J|vXX9m2?>CSGMKZ4GdYVn*3h0}co4xbTwpQIf z!f(QbwKXl8Eqi+ARE={Av!5Qgv$>f&U&{A8>q#&JoWI4Q5n55GR37*<9Ds_Kci@60 z+NwIDrAI-$7eqhsmAsn9*Xk8_o6S!jjh9rm=e zzdje`qGjm~1lu)6Hj?yUG}84yD{hWJg7E`^QeL;Sl|oy@icCQrzl(;0ER9(f7ehQ# z@w!d*Yy#;Nr9N&OuwYW}_^S4Tj0=roey{xX*I5*PQm5d^ugh-+rU)dCJ+rZi5gXGU z=>h0fnC8&rdKLi)dQq0|&91>(IvhgCN3fD@*x?dR0KbvaO3R-S1R((s#J4a`-=6x6 zCTWk#72GrkXr@R-VXrvm2yli zTT++|L|#rc105_a8Oy#1dcfSWL%!P>@>S#ax<6c&t^ga3OvAS@3w!tH=-X8j0q6t^ zwok(mX`D}1XffvqYxowUC+-&r{QlT?o-yo&o!+T#1zOC9Eq**mxe_$WoSCsyO_%^L zjZdT%V>-JD4?6+bf|v2kE_P?G40XNENTiAz7Kg6hjwqcfIwtV6>rsW7`zV~&IfLky z;Krnr2|;+}>X3dGu+f|(vZ}GoiV|qKicU26bV%ZArbp%hrz>Hrb#WU)YuyE8)vR&^ zUpv&~zVBG~yM)@Y*DA8`UL(g`0Jm=#1vCb-=!H(za&0vGoT$ehz0Av70vPi%6LK>P zr3@dOq+u{+WM$*8MU0)C!!;WIdB-ok{84A z=EDsyMXAqxfnr&GtDt5Sr^mQgfxQ4=7q^7<=Grru++qfKPIbUiv8(p`D))s#Y*cn< zr&5C>E02<3R3;7;bM8%Ytm7Inw88sL?q-O_@UZ9I&1?ZIMIh}4m`MDkLJ}gpd7^3v zA({q9YY;lEIF~L;90^7Qp~XBb6)F7Xn(-gt@wNMyIUvHtJRuN>Q97!Umoez*7vfdD zJjXuqxZjkkP~-YDWIB!&w=G)^nrWgGD}D3xEm|HTkgjPQ9)IqebCTY!*;T)}D!^$E zJ_Qw}5qFH6RD9J7CWZf5EQ(|#WEx2V!;8;t@DrADKM?gR5n>45VBjZg^w!k1s3P*t zpFB-ugk5&%*SIutR+Wr_=|~KBBNF41y{iBqi6LZsCvK0C3Ru%6u}qVvfI=8*unCeN z6DyjQwMu2sKlpmG>_9g8zz`jd4F+TTW3=Ln>TO2)Ec@NTp^!yhKt(=5^PWc3+;c&g zF3I(wA57cw{Bw;S7%~nhMFL!S&34`mWecW}*S~Mk)g{Ag@Ry*P?bi$3SfOlf{elagGhuJkMyh|INkqj*7U!! zzm2OL34C&IEC($4WnD%z-T^k2-U9x^{4d9pm_KeR<$?Y&sEijL$ehZ+`}X zV2B7zR)~B1Hqgn>d zwmudkCQ@q%3QR!f!7ANW$m{>CaJS68glkQwG0=T(5a>5On~r8j^LCn(Lew_U4ER7N zH*&Z0bF^Uq7f;6$4hO2!uFjl`Gc*U9nE{uDkfwdn~%(uRD~<(`q^a@WmLwo zB#Ibp;7y7BUNx8ClrhQ29_o)Spt=k+Dp<@U3Ne9_(#nv9l*wy|ewu@Ff|pNg9qQwVUT5fs;yrbd%l9Xng?F-vQ0w6X`|5`hsQ zQ6-H)%gJ{v(KQOAgMR@X^W9_vN_%=@8QgE%O^F;{i(FiD` z>Iso;f#);eT3Ns3+y$kS#ghIqbUj1IEiy%cQC@;~$UWDh^$p!zENAKLhWQ7=uqgaa z_6RuU1n3ykpUHNguQ$4S~8ne-#H%5(Y&voGX zLk6lNN5xa!dn5Zb!e+wYSO*whDF_9jW98_yxI5k=z!g99+N`H>5qvM6% zu@kw<3Y2IHLZx_%`9%Kl*zNSYc&w+)A0(IjJFFR3OIwV+C%GI%96?zdMyV z<&A|7&c8;`U93)eKnU=o^?}YH`+T-(+^oxKBUGY5jrytlG?yK>s53brY&YbSo@d;*ulFU^&XJ9D`xRc^CgXjxr>Sq{34iPd3^E`lQE75%AFg3P=HRI0GFA0yA%S_1K3DD-a)q(q; zI414}E7N$qUYjWZ;{kRyy?8nz0YOOeeE=MHM&AvG{<7QXM644|gOgPKEvGr+;~|xu z1qmS*HY<%(*$GNyY~Izoe@P_}ayQHMtrE1lE({->8L+4-Y#y8Yv?%w802?6MpP?`Ryt?&?8B`DJHF0;vQNdbT&Sf3n^c66V#c>3=VBnm z*3_lDoQG|GTEyTJkCSfrTWZvo*cqipB^e5Ze#lkdL}$tnfn?+3EReGy)lZ}@Ugiv< z;-aVQD=Hb`HdoAyf=HjEbiuc5l0RuPS@uIus(K7IvWUZuWtTG!NJGrm_U`z4xFJx) z3L#!3xAO{BHGi!57=t!V#Ha;8!09vNJ6Fk%*;o5zF&rxT<6+`~$Ll`L0M@ z$gi%i=YBhE`hrr_`uFJzg&AR%O@HU#eIE-+3M+*>qkr)bQXC0&(YeEDB$S$==0`32 z9iuKYV@sgwKcQ7@idt-6?bONj%iIC;Hj)^IMTT=+4!#2Ca;#tRTKFD)fbAo&42yOI zCip4a?BuPq-Ly`Z+J$t1pXtk;a0ujcUsZ;)-~1@3O4G)%G0nwMHbOm$?sU7J6mq>f z{S`JUtYRXmo7h*aa4sGMx|96a40=#mcnnaS+mNt0_7GWfLz$m1oIZ?SU{^W{q0^P$ z-=9Ee9pV~&EIUHV`WVZQOR5J9!j)?>0bvIm*m|V(3(z%;vO!EHBW|XoDo2(*l_|ro zeo8|kxuFaqSJhciAREavQPa#61)TdY24ijs>dcHOPhrt=Xj!B z+6gEEhg_8(ZYQyq!g>5(7mjb)@T^yn%}3xe(8>ufEkBe?d7 zA%n2QMTVi@R0pM6@-TZFPr0oA3o~th_#AZb0faT?f@~2)5D!ZX&p1{l?5p%H>Afx( zR(XTc3vbv^mL>2=AqfZpi$u=wkxY@>_s$*X8Ey}Mh-*($`Vsu|>S7WogMS&aw5wi9 z6!&ZU2;9_Wo`%jKbVE!CO1w@$)=xP{h4r`t)ejY?(1%FJZ#QpV^REU>VbX(3+o6gt z3^52iZKwK3FZ$t0D+DE*d}(tIlSb?nmx958(@G>;hdt@LP*58nB<&uC<6`^VSZ~g+ zgr8~6t7Wo&b1=T)6-9d-;%AiSZg5Y1PG<;s)mx;|Z8{ceZGo{VA>W7u3)lY% zR;;9g3Rt)1x5cQK_k~ZA4Bj0(c{uPxvNgK*kYAGenl=PBV1|<`XzN|t>=ly(?0C)* z_{>6E9x@A;@c*Me&Qm!urccHQjt1r>2>WR7ff=9w!8(O4wN=v9ZSZolY)yK#A@&$} zXyX;re#K+Sn+7OSeE-KMlq@Q-^V=@RUzDq{i@?;;BbLO|vUIcQP!GqJ6;^HdUtUK- zj6X~uq0}jtY{8f{V=Jw|c`ICD2=MCn_l2ev!kx^mxVqam?rt`Ae?zKIUPc2oYkA$}WEh-k(ynidz) zC_6WloT0oaZUR8)o*&lzYb$Tp)xRdRPDG(C z2jdO%{?yD4|5?0xJdMopE|HyEDdQY^ z5nFJaS$yNv0yM2Y%^39D=hSC@x7FvY-TJ2+1ONmMGKL3AK*@-EQ5!Igj)sU2({Eo)Z|j8%;YLCx^5oUe24+B@ zUo5tGa?XDl7V-vZj0_2Ho>5hb;^9m~7HMJhwBz$B*9W~dp87LUJiLK2ZmCNDOkYsr zaIXQ`y@b#a5_djB!FLN{w(#AzV=EUjrlpn_Ghtfst*WqP0_XWW?-G=2w29dF|Exm& zaB!D-0sVG26>MF6iGTyMXJvsHYrfcjT%AOi3tf$VM9tgcf_p5`SywxD}+J0DJQeqSdoH2m}W??}vF zqcp3S{dF^yKfL7)(__7|F#YIEw*cbqIwOC|ggAVT6~sOjqvBEjn`xMNi}xw;KvtvV zoTF<@lp$6)Ep9go(kn%1{2?3%WU#J)D2Z_$8vTJ^C0zM~r^wbJzC-&MenSaB9=CcG zs$wG15>~;mVn{hOXc$U(MSaOf|oHo0W!Fi#n`+Zd2)~G7o!MQvS#p^w}3OE z-jX{IP#uC2>{PX92{hQ30gxr!PfqHeh$ArAT{zrY5WH|^hS5s6yr-I~kIL15)&l-N zLPQC4?ChQQV!mAJ4Ah;d7B&7}dKgA9{cJl7i{sEud{IftWX;WbA=l&r18F}%2Wi=# zE7C@&-8TFZMdNbu(ni&`zj&9seSdQXpFT7nNGsKyeY;W$wy;RdQkSJzt-*= zu3d!tQ!YTNYgak)e34g<+)S%1S|MBttO6vM;W(DpzrHD9ZH`SH#~xz9q(qZ#=8_4? zR|Q{-)kGp$&(`Hfx?$(q<&?`)G% z84^Ex^X>WTYa<=tZfhVVv^9vo@McKp;?5N#-VMY&64{(N0646`zc&8u##J>)X>_*L z4j&gL*0DC-+YxX$1hZnre0%cihH1-aV7;l50q_0P9Kh*MioB!lA`sBzXo9C@_vR~% zi((f+Y~7biIMN=JUbKB)hmcp@zCLHR2HzMu04f5?NrDX0=4g=l1hF`?=YbmX4u=w* zK$7lvU*%^adWEke_ge^35rw$)Ds@OCvRAs9H*!0}po4#_Ij`FG9p^E+=B&-faes<* zVpODM_I-b27^t5_x%@UWJkT;P9i%rfyi5Qc1^$LFpz+EVFweQg@0p3T0YzXGdIXzB z&SMiQC8e`KB^(%tNhV$P!ja``0^E58`-a3; zW^ip^d*q)}0fcWd1$#5qvX!t%gnrV}4q=}8Ov)Uc(mNFChI_2XziB7+m?WN%Yu9ExhBD2mu- zA%F^~VxkG!z>_vL?r}+5?_@i55EiL+q$Zl`?pnjFx?WXe>xGKntpR9cp}(l1Ym<~= z?!dh$R-(!OTd@@HW9*)+2M9Xw!A*{cE%wctTDwq#Xgxl ziN;r#M%}JEH+@7@4oKm$yC-BT9A5rU*-Y&nK2L4~h>(3tgCV!*@t& z6+_MaHk5ERoQ;2*K96ef5Nv+8v%^{Dl358%nH?7`fzYEZ2?+ORA{+T&Uw z<8HWKk1VsmLiqAU*j;;6=-laxBzKY=)NsO?k${^$5D7u^TSlU+hH#ojqof2{T)%CM zAtF9j^}KA-pZBy|R&JpzHRq5qg@t{}#aE2NF<<7em6P|SV0UcvdW?ae> z1a(vJTw&jWBDuOe6GyI>JnX0Ta?mfS0e;^j8H0Ms$^!}zINW$qdGv11^)WP@P)9Ie zb+=`1Fv==-zSz))d6l*X*om@nQD&tv?5w~?iT~0`^slrw>sKn(gxTpPh02?lRE^J$ zr4FxA&>mB8(L18#8ILMuf%Uq!^Z=gH4 z@c-OaAvrba&7F}kidReY!jh&a`ZiwUkZGqkfDNxxN)mIK z>BsXnf4u+?F}*ul_qkArDpg6Q)8+d!n<5Ec&ad9j7BCbcz!#1llK z(acdODQT--!f`dkUpbcqdX~WOI@Lb$A{lNJXA5toGG|;n#KXGTw?0=ZgEwMLnNvkE z{*fL&h5*9d*3B)8h902se7g4aekzVq6GZn?#OG4SOnA~phJ+19?d5#c9?85_tfdW` zHX+_NM0TFy$Y5md zSKnfXU68HijhwA1;OS~j$!jlS1(5oyx3e7)Vqx0U?iL5Krfc11#RRJdDCTJ%k@K1r zc8Ay#X7kpNw3%-gT2S@rRtWWSu29s8sfFRu@|Q&-QB4;b*iw`V{`Ml1S1s z>E?Bm-{Iv`J}bc*$?Od2%jWWi#9O7}7#qFgd||TsZR}oGX!;#5M~Z04mN^f@=Zaw4 zBDv&MFXx>PG+zb$m?WECU~QcQ9NbU+} z1ZKh8#YE9q0n?-*+NXtD7#yrq)7qlr$iwJA1yZ$S1qE};u%F8ckdQ)Wfo8}9vw2t= z=KHg9pC+S|AzR+>k>#_I-=)26S_1I$JOGwq76;5~v}AGh4cM>IHcwW0&NYh0n^BPv zaMU5esKgg>^!N`$17UZCUr1Obny;4&(ziX~S?fUpyUtnn z5sxNWQ!mv6TFs`I(!p@gPOY55rWIIz%P=-u#4W1zhLvAb101%UAEROh2Bw0t!|T^u z;Z+}0o6BLFG-+Lv=SD_7o5C^=o$;9%;wxcdEJ(1I))SJ)N4?=-W}60=P3D867lm^s z4z514N2{uI-Fjo4hoRNveT7F+EuTD|;;;(Y5+uJ9o9Kf zKr}@ATr(N31UPHZySLg|_$HX#(sUx{K)MIb++fl=5`@LJ-EvBw%N+Rx#A%YwPPz$JY9)Dkcc=j0Z^?pFFTq(%5MeZ~|GxRVdhu9QP!AyW1>*A#^D zv0pwg1BVz7EYFoUHZ%Pfw1vYDKMLva)L(V*O6Q{m6r@sZM`}n8o`EgCE_O zXnah3Z|}B=o-M)E%591Su@i7q2bd(lE(D{Re3)Zbnt>KBKL8Nl1IQ|2mOh!kW!ZAK zqX%UGsu~RiHQ?y%K+sGy*-W`a1;I5LEelKYJVJu-g1t2UqNG9o{{>~+$N2Tw+1g0T zvf6XUeqM@)WeCwTY_7c4e@ESAc4RIs2{!)i6eRa^x8{f~(TIv@D9o z;r8AnC!)RBb^-vvVDxyf^Yo5o*FiOEmp`|wOZ7X*l-o%oEK1rU!%jOjZlt2fbru!D z%h+SG@r)PB&D&npuugkrDhYtL<;uf&pbMd;<=_0cJ+66z9dhagF*_UlYl~R)r{HTHw&UxQ+oQ_dZbeQD%11#Ah{)-v>g5p>?gbtGp0#=*6Ic?u>cix8NFkSASbU?P$me|yBQ~#eg zfT%J`cS^B36h9_zDG&oP6nvKvc(~ubOM%&n3`s1`nRhz=@}Vm&uMOt)?wxjws7KW) z=Ysi>gg@ifE7j?kb>}w@9h>%qaA4cPUrU}%t|2T|(7pkGkyUJRwV>f2f^iNBE@s-q zuRgM&Peak=2hS^=wzma=9IX=voJD5mO3i5c!3*dHBe0CH;7Lci5C+dJ%;#7;&gNi)#~?9*d0j}R%ZX!$D5sztlc6mPfHP!V=0b8P6fwnfYmI8`ju0On>uz*uJxFv}5Lt z5Vy=Pn}6rKGqrB$PBFCdIMg1bse};>4t+3}v)XR41iIHahi&K>Sq5GV`vRS631gn)Uv*P=I#& z+BXxJX;n5oi)R!nw_>_IY;gB*HO6YdbXVd~K*hd|T`yXFtOqLjbEU{P)PPYjh9akx z(3lK$Zx6WWD$}bqCU{)wKI}p9iDtO(P}6VSnY^H~_{FsZ=tWV5S6%q6z?56F8jvlHt2Aav zq&O(;n$+k)jW~nOk>>}nGm(>8|&IR|<%wq7(Lu2ckh^o(^1Ayob4?u!m$0Z`~W*@f% zCQgDp_%e<)>72*H6X*kHCbnz`Boo3@>NC3`F%A@OgxJwlh$HcEwqC&GJIEXhBWGnY zaS_c3Q>;f9S#C_~25s6KeQnr6cF%&#VY#$wK-N*Ar9i0ZL0JpN9j0Sz-MGu0c%^0RZu~=31P+=;!scQLFv3;O>h8h+ z)dt$FuUa-m;VEiOicI{G3o$Z5rt^J&606m>vM)~ORZKcEGt<7abv$EEXm}P#Fr|1{ zSXZw)_U{q1@sm}jERjIkv)zLVp=N1j*CH{sCnY7&;Bp>yY3lX^JHxHW0U(L#m;$ra zt^5QAFhiYEijK5f69xpO-dKs_0Yyp=1Y?r3^+!vcc-24jow%1ms2}eJxS2quarLgk zjL1ON*YRkYZ6Afh3{}2mzv6u^svtFfDUhe9Cjx6U-qu1VLW7t(^r2GJo~Z5-G#oW{ zHd^2-C_DXw78D4%_dgmS>No07U$F$WO(?V495EHXc3$GGdK9 z^}o7tuqOg>@P4e#z!m~!2#{pK>&;-E-P%vYEsW@NhZn@hjeXyRCNGXKHeMYLid9v) z88Lp~`B@UK%vC0gRwd6q1A7Uus{9VS^OHimet7!vopV`^orBgIMsV7x7;X7q!Fey_ z8ask@&rx{K036gA=CXL3IyU#jB4Xyyz3>ZU-G{&arMR3KFnv>TjO zG*BOzI5@3n(2hy3#JyWZSQcDpuAlvUe%4TB_iwGxDQ3g&{WNcC?;@mICeOZjHoLpj z)cXip@ip44JHbi@&VaL#;d29UEntmrh08{u+gmNbQLO2JH2s&s2JZcBkj(Z4*HYIc zoarZ`@9*jnz{x zr){uZ#QCW-&Z;k$eI{X$z8`E3y!^I}Wa4GiYOVx~s#!)FvVmu8_jhoYrE`2vU{rO! zf+B|9Uli#JO4jvxLnbbe2%#Q@+Y6_Umg=@ob_TiEPao@_p(ZEelLxXnY>REVf+2w) zOS9pxDML`xVjK!VONbC~7GnT6K*+!1=Z?KA@l8tRq!Y$%HEqtqR2R=<7~lkMR2wf% zz}N+2si`oj@-TX!KE;(1)fGjH@RgWN`hBG}>6-ekcK2-eT>YbI{1=Pb{qLXv-3Yg7Lu33&KZn|(OW95XY9QsQh6 z__~4l)p!3K6Zj9Ff4XMTHl0H)7ko(~gAgK}$>qnClIp*+&+TT|F5&cnA*=jwmb4Gb z&YqTdV`^Qd)ilVa3qyanHA-j~JnDPq!vS5_h<>-+pTabkVH<|^AcuCw9TvL^{oL@F zLXx6+#|DniHUPS@=_atFf<6gxBkK1WCjD7b4@W_i@!$UoKlfpph8uKJZWJpjvnDOz ze)08h5V?F9uQ;q1eI%ny!Vc!*l)R9g#BHdV9-tQZ9tt>1D$vukq(IfRjuI8ZONLYg z5%}y}|G)eEOKF?0c0O>N|6g4#vs(yGwd!l^ z4DSFg2Q5nfb|Br;m9%@7=9H7v%&1*J^hLc&ajrKjvQ`O8=*2YtI^aV8{^KC>qyuCn z=ldKQOHU0KAyTaoMZ);GUi`|_A6?5>WWZ>Le3V3ywD)~A70{F597O!qBTT{}Io#Mj zAMnvq-Bl30_~G2ZFNcFeiD1xKjV3LS1B@IoPEa?G%%$c87~%w5Q&>EtIsDW2OCr$u z)a?mvkI#xs*-&Z&2cdlJpj5&Ib&dWUx2M=@PNtW)nJGS}cs%bUh@V)~pHk%iU z8_fc7#1htkKz{Qo!D)2f%szMowpx;RB7@af6xG6EIv2~^DqTL;=XEkg(oW%h;Nt8Jsw(vaAx)ys#7b zk=!RE?DIB13m0xD4h=0$ti1Q)v!i!o@K}80Asz?-?&SZ&OU~Pkul%YslhRR0VGj5ZLftLqGCF7&%^yS0LX6aylYFf__dTRA@@IK@?2? zE*L~YJjz&1PC!m&30_DoUgq9ML&>OP81dq?K3cV7!o{D`=<`MndV`VcGN%&E>*Lr4 zCYto>$2Y-zBr#hZ!_#KXpS(COK(M849A8Zo7{ns`!GfNGG-GO#LbxK+C;7E2ILy4^ z1SgJ)zret0!@jKsvuN+VN0)S=2+^z;LcBP|dhd@H8#{rl*Z?G`PYA^ycrwL=1h2eY z7%SCDeT$&NuhFkNbWeA!PY(6COs`M13k~r29_2ezFGa1WJ&z{LADId$x}uo&g&7fx zUZ5L>k>Zs`^NSdXh9=OAd-U4;NPc~WsuKD^BQc&4d1#1T8iTNpt~?Ie5*MT3+fD`q zsuGoB(gmeYmogWRjc8lowK+rAeN3`VR&;8QlUbnmKP0aS@q$OL`Hzpl=!;l#d!HQYn*O)2j9OLdy>Ck{hU;i9dGs_8zaahm7O@iDt5oF%h8l+|s zudqmY>wW|ovB0!AP`{N$ZO+FppJc=MI7t@iopbE%o zh5oeLBe1iA423-m9yypvYAg6FqZ#sYb;NQ>)&aIE${6z%-U)3j;?`Sfia6yT+bZ9` zh;pE>rAcUYIZ>A|k~A{=0(c>vTwTEvCoLP3ef$~S-04_$HQx2O49( z!M5vhdU|&?daHZ|N%7T^LQy@BUT}QfvSan;rh~vxU{x|tVazi1?D8@q&G{WL0p~_Q zZ4v4E#0 zQ2*6c2u{s;?X!)E>OIQHvnH0jm2X{FEzzyYxqtd~@=X>$B-XU<)vh2+6cNAJT$z~Q z=G}9Zx)dm!JZPtB@9n^(-3ny_*bJD~Pdz9Uu|Cp#sn zMhWzv0)w*zWs}6$(HMECX)V%aR(2Oemsz)#Er&0OY}_j8>b>R8f{)39S$?M7bI=*K z@|t&Dzq#=pbL29}X}~DM@r`$f047LCN@RMTUaz_@oueeY#YRE!jN|OzvVL=6(j|=V&BJJ;CKC z|DyLmBpi$e0)5L2r$mFAhtvl)ui#6|f99adgvPl0a<(4W1JmUhk%iwv@19`Dj<@UM zMcnbf=`{5(B*B`?3sBhN%(pu_knhv|;h1D3D^cTxz)o26OTbjfGv1BrjpN+ua2)}M z6BVEk%@*kQ#AG=-#;Fxw2T2rQa4Wjj>~&4;Yd6Tc5)G`Qyru~6`&e%+`y%3%jXeMs z4E$keVamemxZRK*gi_H+M6F_oGUapl^s zDDHE8X}vY2KA=&^d6BK{PK&k9X2n2}i6vc=jr-Z$<^nrp=RpV|GPawdRnZgu5-(`> zBu5^uuubJ*F_#A*Xld)?pJ*)=VD2#!th{_J51RIAl}Nd3&Y^;j!V~UWNmoVev2$90 zK8*J~QPEQkkk4x~`!(w}VJ)TbQmeYrABjzjN%Jn*Ybd^IUQsBjpZg$Fp%GEi^aS3$ zoFuQ)I4E9caDRKC31jRjbgYi`+NwrbC*uWCKO-BOy*SvlJp|7n)aZt$!P zd8+U{6^5s~R++7vY!t~#0fLDq5LZ#C8xk0 z8lyBDZ~3d8e|?^D4rLz6V>e-e>^?4MZe~HjqFyf0u`UZKX@R~F2O}poeEx^u+phHT z#Jcl>10ljsto7)_d*IrpLkkH8%U4_~9iS_v4r|gSX2Dd4oN6C@{6DT6hgKGqH#3%H zYC@6zwrmHR(q#2k^KJn>K>UJwh3@X&2B_P2VZ~Bb{m?f_ex0e5@dlHe&6657Xxx*i zNOlZ}BboairJX3Tc%4FO;w_VQ>!iFlqpITse!A~<4nUVpQ`e4Dp4%Iztu>!b%vbHN zy_qllXMyZ7ZkkjXXxIk&vA{Fa7WMJL`dV5O0)l0J&~9yjC!WlgHSRpg8&qPkzH%$r zur7V6Cf)BU6qW=Y&0Ph$&fRBF2!%%7j_9IM|ybe^j= zvvWH^tPK|#EzQrRyr4BCSiUN zlN<$MUsCzZ8u-_nY}Bgq0aAfXVIHd4c_7&usKwZ80eT2_l{G{>?Ku&o+RK;mSMv5C z;FNy!dtjS@4xgKoN#N_@+Ok266e!D=Jq$4^C43-$IRB|#Z$^`vmj=*Yw8zMoN?`If zT`1HgtS-NBO%vs>feoSUT)pOM-Qeiz^Q)8n9v>oATk}Ospv7N`M-}e9u;mW{JUv`E zG_0C(e|^bRIGXuCcvI&|ZWC+n z_nyd@W$181RuYw@UY-^+<*r93aR(WA_n>#EbS&0Q(R^%FK|xB8Pa4tTdI6poc9;+u*44FbsSl& zR4r-aiQoYvnCQcVp(32Gaxgn&)-fwoW594}E>a6eqCha_NOvGgeq8Nk7Bq5zdr0!cdWh zYphaYCKm23S#Hz-H~8QqV82{m(Ira-@{@{GKkc02EN;cplli6TAG!<5i>(4wvO~R?c3v@NU47$VWjE}$y1gabT8CM1)&yp&70euy^q@%k_)xwlK0d9Ja zL~%7WOh7Fl<2tv@S-IvF3i^w&JLEiE`{a)5brIn}dhO{(Hz+(s(YaK$0pKn_Oc{k4 zom5^|MQ_xQ`7>f(xJeX>o>;~f++7|Kur3?|+pVQ6_ao?Dc7B=n?k-(C8_NJ;r1w=t z4y~T}{Ho%1a*m!A9kbqquDfWa8R%CibY*BKnw>lSv<6rlMy278!rrb$Pa{PExX~A` zEu8p`9)>n)o@xwV?GcHo$}gHv+qVNoyxWadZAQFt|^b(W&Vc7W$(__D3%Qy z$D)zRI{+qi(waj^YG7HM5e*dfO|@d)8uV&9fK=H53ieMD4a71r(AkoHkaton_Ij1s zy`EhxW!M%F&){%^P1J^8KN*!5K`E$indHs=%Sg`5yLmp!@Q5%418|kBKcpX5ambQ$ z@|LwzL-`C@VDn3WyO|9p?%Zlexs_6LpMxosS$kCFvY3tvnI?0W^M$VtFqvAM+{oey z)BvWE(XblGbp|@l13F6Gq+XT!4E@h3R7}|k0e)6HLJSg3vYvG>E`s0{fkq-*n%hrp zs?Ii${`-K@B06Up%Iz16AaE|fha%Vz@gcl*sM@8|$b5k8P;u|?^S-|@55J|v(^8rx zNF4r(rKwt74g-}La3Er{dksWj;LP?ty=jv)ZHq$TH!yr~Su5_74+riCQy72N;?bf1 z;RHOm?=ffDV2vdSmr`|HcJu}lzev?R2pl%Dd4$zifJnv}1m3bwA~{`n-yA{+s?pS~ zq_D1^DJM9cenfLchhfXC<1-<8V)MtmfOE)r%po>eks&ZD!m?vGJ;Fb`MmB@X>k!~6 zS&gO@-U6H2z4RQ57egF38_6A??unx$HC@f`4eBK2mm3!&%-eVVRvSQKD+v&5q??1X zclYZ{ExU;t3g#(rGs^mA8>;Ma_n6{PC+FR@y{v$7@T8_PUxxt&eviaEWTKdrxjCNM zt2VhH23-Vf1Gn|;!Y+G>pR&@FfG6MVBj{r%sbf&yKh1y!)vDqCsiFBOj9^g%U zvUt97M^0DAv$jhOzjj$xdT|fFjpH@E%=EKXsPA)B7eup?U{&lWKT0NFl%ZyCmf?BK z;!Idhxc2B{){Cw_H_kNt2|F z5-N;dU{9C=pyAg9hWMIuLmu^JLB^V$et=nfZN^fCI2fy8(Z7Q-gI|m^HOs8TmT*r|ggSYbg(9`+xWtTbjvQ3Kd)H~+1(g_X|ZplsjM|c|Y;GZ}`7A*n2!xQ%vBFJDSQHrB-m(pdD zroxete+>a)=ib1AqcrTM#o!n3Z_#jYtsOiqHqxWJhv8Z}v7|$1G?{2~E6^6d5p;0o zFch6gyJ6xGK*(OyWn&7HX3>19bASK32lc4U^)Dx1F8}PZw*11GDR|w7Gm@r>k*B96 zQTtE@n&u0V*NJTKV5WyjMs;u8N)o}VEu;R9J;SF>@S8R&^cG{=b&jbUgyNywpgQO( zAWlVXTv!l6tcwi{Ypet0Ud;90ZaclS%wTt>p8b2i9aS6Uw5oKu)|=T9=>fcAe*z%18WrX(>RTf&f(^2v=x@}j=f8vc^zEcc^t!rlC5`@LZ&{K}Q zGb+1rxqnJ#_yiJsZiR*pN2)~4`5F?HA4N{uohnATFM)b7{qsy(7y@0lUCBjW(6~2Y z7BorzQaURZh5wNt4M-GleQHSz3yBg_QalkJTDgFgobQsYu4c_A!HXrsQzE1&3D1li z`cX>sxp>d&S{gmQ(V-EPwA$fFmEysuaGg!?lvPaW>>oOa?gR^{`lww3cS!kw0%)qAKSpFBxsS=(kXS=Dgo+B1*5IBA@7@?@3^aa=Wo}bo zi^HIY{G5at&N_G*MmGy-zf>=GjKj>M1ug>Ib&cobhR1tjiXfbg_mLckM+OmV>J2}V ztIhj7UN@!mm4KySMt@D+LJ=V-5}!CkFQ7GvG1S@88oUV00N2X**B`q5$bqKjB9l}6 z-{m&0IfoXpcvaAvu-jowMEXRA#z>H~L9PC(rvM}_{KkUXU%^n-nF|?+j5~rUToV0p z_H54M#hd!V)FzrkWYrO%cpRC1J?1*|2V<1&s#dFj&R z1ez%PhwSbAqv{o-5uv?g9Z3Y`AqrjJ!W&It0c?7pn4)BEUfQ#G5^|n)VStI4B{cFZ zqTWdr|M+NRVA=A}QRt?tzg1KmwhzivCSHNBp^98gYY2+;xKRjMs{I$)zWYC$n^2c0 z(@bGIuc=!|Hb*e!&6?K;fyv||mzjtid)TmYuJzukm=B4&{x%$eKi1WW)zF-H0a6}IG55GdZedE(&ce`I_FW0QusdcD1iu+0O{XJ=q#InclY7-;4EiBDPlLdB4}I-c zMZ2cWucf2SsmiioQx{A+lI<(57&iUx4g*O}T0D!rL#ZdXZyN=JW2ZhfB3%IEs?SG( zzqK20>}GqVc3~RxZV$k-t%GycAy7SYh?j;BUR^$~qkupcUMq@IZ{&<{jy2#kXyV>mHat9T^H-TvVHVh(&J#pH z$36A$f38KEb&%jJX`Uu9cjw^X>J2u^YXbv;sIc5VP-mZ`(o}xt`Xp55iNK_pR@AyL zDhby99L^%nK&9)h%lh{d+0TrEc2p$RYh8d2Nl1C#@2m~hP|DEu}m z<5zKRr%Fa)PjpOvU%BL$=gCrmKAX~zYNu&5v(S&I5G!J&Isyw79X(ezwAn6Tx>V0g zC6XDHj1IkiRZ_-0i6Cj2!iB{hYa{Jpp#(LcX+& z@Tjfrsz8N?LKOHLdeFmFx7;T1dDk}5iDRlJgpUFS^JQj@+jFs$=DJa>0AS`?xC_)S zvQ|S}Dl}O@0UKUk4Xe?=A)N6kN*qJZ} z{<=Dv>Wb80O)TUCId~eWOKE(WJgP-&MJY5`@amW}Vw|kcS53j`&3rOqrRsaTp*hhd zXX`lvnR^H8Vm~z{#u0oZ4UjvkJAB~`&UX6c@dz*k5g?r*2LCnO5>wwHqgdMkA|0EQ zrVGaNWt8S6f{ew*S}7?0%Fa*8NHpyapMgd_uf7LCjf=zKlP&DtiBkZ2Uad1H{PVwV zE}i|b{RpK90~*m^xvWBr=1e@SJvq3XuG$X!f=cshq0D$(VW(?YtYl&bwCChLH)}$| znKn1=z6w6-=^DPlml`TvLo^l%HqnjN!nFGP8b6PgOhbsl+oc9d&n{baKYR6Pj0>P& z6#QLdzdrV7D5}@t<0bK?E?r*kmxcH97nN}Gf(d(Nj!FDLTq+VH^j#8Svl5J8Kx-)z zaJE1+#ry_!DO*4u-y~?5g(1Kg=>zP^Q76wc0#^#Ccxyfy3VROA&JPnA`;^Kl-gLBws^dGH|TY;)T4r`7K z;OQP%5K>8$r<3elUb6hpoNDMYA64`5O&{)z-zAP{re|I%*Kz&;qsD*%G_b{6pQt7V zy&NwE2Zh)E*f7KKjR`+#{ibslFEN&kdRJgvEL-RQ77k^o(HfnM{pC7H1>*tf%Wn`W zcvHlYH&Kz#x+aXUppGq_kQVU=80HrKYq+kkqy ziTFazD=IC;+b~bK)83&Uwij%C6Y&HrMit=6H&9+`Hqe7=L zXP;E4=Z2{c;AoW`O{7&lGD${;(_w6s1AM79*eWyKOsJa}5qLYfc7Qv3Lww`_{LCGzy949s zFyjpRNHp-#$wz_+%bV3bW{S1tkL*Q08~0~NDP?~5bTeC8E|bRm>2pPz>F0*>h;4SR z3O$t#+E^V#1|(66vyJ^W`(<|=VmqUgIbsSMAx0HWey_5}rVpuwu;(7BNH2-QrD6u6 zZl$_g%_!@vjiMvO$2e*D7zJEd|5fGdLv+*b)Vk1vq0>S%V0M)1<>bR7PTcPb#}wAv zUJZ_^A%O4wS~U70_M+P0R^ZSfrH-Y-5`!|a6um}lnmE6~>F&o}RM&&twL(yen}`2E z_hFc5AHG?YZy^uNPSggVA@m}=q9lz+LgW`e|KQs*CBqg2{;?0yywFLZQ!{zz8$Z{(!qi^oqz3U$8b2%&)2SjW0sAs2e_D3*P@ zHqru50TzjFFBEq{KDJDtMu+0w@hl4C9~h(?aSrt7M)n!e6ry}LWP(<(jkZh%V z61m`e)z1aDjv39of{~Pn5%sr^BF%(*WhfrWB+{^)R!Im^RzcVBp%J0V z9oB*4u|g4eLtl4=nWu= z;O(%5SBuZ<6OO#bYKoKr6$c;Ht^Yy0lnR^$?EE&S_^7BKbcU3S*0H^kCeH}rZ15~Y zYniboUg;yO6!1;e__4AbCndW!6>CMPc+k5iAgVV#JcEjXF+ZOeM~NtAApOK$27L<> zOvnJvvKLU(rAG3+VimknmIwI={MZbgA$?7_eD1T|G{<^DUkSXtOPVKPGgKy1bObV( z1AHJRIH4OeUTk>)lL7I6$B2v^?2X*GHExtC1L-R}= zE1X;$`LTo<@IHB&v%UlQo0XC9K=Fd1=huP;cKILkFSJk@7gvt)uSi)oM~XkcBJ?HY zo(J0?U-yC&k@WjTfx--Br2n`>ynO9i(BDnYp4?*NX54;A zz6F6bUSVrrS)7O03%%r9!9A&zj+dVM^ncPVd2dG^@rAMjZ4G&YOOD;{$ZhZ7@uYYM zL{n*pcm}?Q6rgwc9+VfE+>Bz z8)!u~*i{f>fX#46R5rksdvJsh?=M9zmc*pmm_anQh~%QsG7W@O`T5Pf4R2_e2g$E8 z8>4t^OU5wHt+;PGrR>N|hJS-n3de6{>vlMo3Af|_%`XzvDiPwuHdz*EEPtaBiryUqNTg#+q_KCX ze_`O#ef4AM&00;(2hO>>3p2BvTHcl#LldE;DFKQzWVf%xfnK zMI-m+0@5=dC&eu9#FyKNbDDB^5g9x2;ML^pElJREukBS>bRKAIb@&i4EjK~GG0!pp zBaTLc@x9#gfy;J+*|YUG^HA3{(`x;pu#kU3_8IAm5@`Agn&*7n*9r)wjujO(?WD{~ zk3iGJ&e83dnFrZ(<(=1+#AM)y2w~k_$9A{vqXnnPAOKf9O_8?a?!!Gnf+q}YY*dut zW&g%y8e7;^+Ah)CwNgw*6ZVU3vWqRa%>k1Ld!|e8($UF(1NN60kn;S;&nxNZJIYtV z$v+HB7f1LQss4k&iN+MVbIFeZpBYtz9W5?H;5FRuOu{=?aeFFAiEaKv`s;793*1p1&ljay5Q2v=tUTHKMCg|6kP1b}%r6m-ZeWec?{fU3_I z&=wg=>*3lj{T-!(bIDS+aE;+Q7T^Y7g6A*&p<%`dm>Kj) zAJ=+z_-(dEC!j|4;k45$Rj=Njwuyxl+6khBKn@@fRnipJPa|G7RNcJpm$s(%jKW8i zR*{83w$a3p`{xCMN^-Qu6M0=}$hVvm*H(tfHECo_okXCheFuWP!(-5K()imRZ7z`f zRR)%1wqyKg>Nk%5Nj6IQ4ul(<^bX>Ji2cQIW76nT%sR$#2)x*9q6W>3-4;&J-m_w0 zZ={T9-Buz((n5d;C4~IwCEJ@hAa{*#@oYk=fn{jDp`K*yKq6wxx)|}YN)*rv-KLh3 zu4!`xGsPhi;YAsz4^RRm)4Hgma%=4W1_$6#Hc>{pP@z~@W5p~_ zug(8L?!#L0k93x6smK>dOW)gqG6?;t~H z{Dq8MHH58}qs1ArRy+j*Bhci)5&hNMV&kT4=ZAXCvW?1WS4Pma!TelVb_L<)kTy;; zUUi+;$6W;^7!up6?l&o&xTEFkRTcDupVkDNv3M;~? zeaM{wKQyb0ntSjO0T#1Sko}}-bM!!3alyR7eSsp*Zp(CL?{ojEAx@qKSeY!H2$wbi ztg-VXIq7MsX3@7@bW99c`}&762KUd;alGHUxR0@6|)iUI(q5bYq?=X^nD(s7oO z{tMTUqGk23b&mk}#Xd6>tfBAhfKR*9`9b;k^{sf3ry|o3{nUL-dCw|xhdf-v#4#fE zV0(S+WluR8PN2Nu8mwFM!y@H3cqf7Cy!nY3AgF@QSCf00IFcH%dO5UHUZY}Ur=2@U z!ql5lj!NbWKuGB8bX3*nk;%2_D#JeH(`UZx1!pe(iK=W1k?Q)*!@*|)3pOsP9!<8p zQ5i!g60Gf2s@N#Go3_f|6QR8oMgv-sp(yHK-TH{*h5 z#F0b^xHp_!(ilW5PDyZ@Px4D*HY9EZe-L7SbCrKR&M5_Q)WZecS~?`t zh+4Byl3&N+fgI|dEW~wcdfm;rUN$-B3x%LpLX#OlodK+$Ril4iTT41iJAIgMvm?#&I)D%9*xNarJnU0B)`}!xhErbWw-jb8vL#CVXu+JUj;Hj zW0;;Qw4Cv(r?{ALA5y}94Ip|xRWnsFG`Q(MKlD~uXp1o0tK^*6^ss7pM|w2Ji?Rbno;?Sbgn!K^;9+|0!-I93|b(uydENP&WgT`=4v!}r`Kt4Ughw45V4ljJthFE9mBbmMb1svMQY9SXL zc6&P+9;EKR$km!Jp1nMmukQ4KZqRU4WM!UbnxPwXvt>Ppi-m~@99PfWwQhQK=qCA1 z!kVdM=f_ezP-O6D*&v0)lGqEX1SGW$rdN`7o9*Zn*+&$0HwIpCqHFSkYJGGvz8}T= zY$W5t>{~aUt4C09^g|^xkv!-7E7h6xbiKt6kh(XXP~_?{+48H>=(ntiF zO4f~nL`HrAW4+5+D@H|wd>;R&d|IswHH5aK_B(#y7xB6@dp=5N)L~nibBVjaM;%wT=ZSr%mRrqTJte3 z(Kf7cx#Jmpau{ydIkhUadj8caH6vswbVM4=U7Ioxpw|m2#!OpSbn`6eeI1PTEBqNL zXrNFJPQNzrbIg_YxX%*6OLBuD$H~FQpYuGl5$$dCk|L~FIbxDFCisE^mG9N4k~2uC zjh@m_u1%L>FL&I%+Vmf3s;UHbIm%bOWENzU+Hf%kl*2BsfvujsM)9rj&zqtQ1}lLN!wx4t3#J?t z)~ViXkYCu$vWH2lz!E^EmW||? z8VJpgbTT4%#=@D{IAXJDPdwe#>X$r<5%Ir1!4Epo$WTrd=>p^M<({=-Ti$x+BMzf; zaZj+3?M+3?b2qpff$GYKs1%JcBRyo&905#(3OhTRmJQw+lrvD2>(tIwS0c;OXap+F zGJ*7Lq0l&@5PD1L2-zRv_d>%{+>Ty-e4XE!uWqg$8}REKlfCw*xsLSO><3~|T7W>W z+0i)0`9=o!AF?LyBi3*n4dBcbnRGnloOK^erB&(Ug&52C-h8_EbOgAEMl(TClK4=X zU7*j^51Z5j&2j_+PSS%;0ME@mhgG53r;+WM*4cVNuru)xj$x>}n>N6}84uqNH$?G5 zolPn*?63?jxuP1IbvLt8zwnj!Fpk=jzno(PY+E8&udx1THY?Bw0MrQ!!p~y<$1#E< zRs~Dv{g9bH*D)8|&}Yp(92SHXJq@y7q2vr8>h zHJ03gYCY$qh7XxLFx#E`{y=n-L`b)d6AQc2mPW^OoDn^zO=?BHTCdydYTe1njjLPS zk&%>{)Ujex@Ki39UI@hhKqs+wt{wWlVU`#ecj_x2spIh37_gwU($e3}L{bXI3j|{K zlar$NXEr^Sd`mMd_3vR0jM?8NrR13ZLCQvf$QITcx$qawI21T&r<6UZROt?F0COG# zZZu3(XSrL%y78#<(PS9xb4fJGWK|$AyTZK@zpU7_Yv_f?T~q*pA#Sf6MWF7+ zTh{i?Z9O#+ZIQUBPS8d7W!`L#PB7C}T&q5Hin+FCC4IDTDUNa618pSLlsN=c;0;mN zcM!=CC~vWg8*vnv+eXzIPYDKCv_ zM9#oPXG3K-0CD>SW?9-_4Z+VS(sOlBBI2{B0f7h){cNL_*gm4`-sdf7?3vnc`hV>= z%iFqro<-4f&2qwSHU3hDx+SDc4G4quj9gp#YymVsXdsjgL&q=K*oN}uvPEX~ zsa2>idSxHVN6_Ywl7TBh#(*%4k^@=Sp)7*N^rdB|`ue^zi2HRy54v#sFK=hEeOF-> zt2G*HzDu!M#ou2+Vuft2IuSEkoX%yu9_VIfcx#>GFU3BpR7~3NYYYv8!1*T?zr>94 zKX9)xNC0rESuu%#*Qa=!6t(T!k&t5TiDXe#@7A6?nc_bgab-uXiK|;v>aR~t_luy6 zNo~slv||2gKO1iKqyfK`cbD>v7^){Ws#7kUP3^1cms$FtV_js!$mIR+#FsA#We;7s zz4wP`bQV?VF4JB>`eO7#`8L$S(qsu$nWxQ0;vlcQ$DB#^(s#&_7>)c$29(#W;gDD~ z0npA1Y2M%_BqhoE#633jO~H2PU?0yU-lECpU7Nk%R3$;pmLLE=bd138sFa`s?EFBF zmY#Fvy)zv*er>B%G&vjs{pJmbYQOrA0B8EHsm>7u84}lLYXt<8%k1EiXos#WX zlpB%l+xq;IIUIDLfIWZZat9v142ZQ%n^qJj;dG`%NIw#=Fc*~XnX6#I9W+QBu#1UA zlL(?&ty$j{4NBcKFtmkI53-QbaTgpzL)zL}FyS*(v4CzY3Mw;Hn~5NUyLf}>c4vDM zT`S#1f_Ae`TWX_QU1+9MMdq=9TxJ^Iw5clEt+_tfsYGcTX7cSoHMXF+0C;^QI;p@U zmLe;cc}{-8)B>9*R@H@-76mF%oB70G96Dul#sb^k~0R8x4M{ovAq7Iu+p@)eG z!E5qFq$St>%aF1=NY1y}Q9PNqu5-RQPZ&gPf&#p5FB&X)Xt2O*6Gth(k!!T2|<)xLUe z_V!*UkpI7HQvd5vt`?M6-?m>(*#bObNEY$MIYNYS>;>?DmgUr%0YyFqx8(oNH$7iI zNA)zUgQOW1nrlx}gblD~UJ2R5;RJ_c5_|VQtYvle8uiKHxvIo5t-m3hSjkt!G6Td@ zI_h!`M`_3uKhmS|=h)zEk4Wbm-o1Tojs3^Kd~qg^CuV<|X))DXfKkplUTl?lqlQxC>+Ky=G9Nca9d0KsvpUUNp+yt19?lbBFTkS(kT2(n}M*AoO1k^Lv zdooWdzdfDeKg=Q``g;Z|x+O}G(4M5(AUm6@_~K0Z4ei1V@c$^(X#gKT*xGoRYF6qR zAJ$R_P~BQr3A@Sd~3m_cpPJtmEcuDf$KGsd) zuR;b%!=Jm8mkPY_=<{d)lH4Eui`h=0J86HIXQSDWc~x9mr^4ha_f`8xtIb8okbi_z z?`~#xAPpqv^nX7v<_)Eeh9$h*KnH1MW~e-@F)6%aO1XAhw$K;>gob*rW(Jm60Bz36udAKnZhL&QiaH@8a2+gBs z@51>I{iVCV0~w~L)q;5+HSo96Bz@HQ`!z62s+YL`YElaGWJ+8?wZ^CFSojsTY+j)T z#0wNJ$W0Eiu*JYb4tF3(Bb6_U5C#Q&nyd;2*OGDuA}-j=vkpES=`3gMa|r+PrmdVv z7ZCMbJtH6-{71%+qtx%Kovo)D_gY$tj-(DiXLmd>(@#qqzUt96CNlz*qi~>uUWdi`+m(OM^s6AATga#jW@93>_kN-1Rp1sgxT*r1YQ>Dg6-+YXYvGXj0 zHi(vIX{HIHFI{XV>S0o9c1`t*ul=GEMtuJdnbvQfZebQfnACRyU?*YU37ASf%r5m; z>7S@svyqXv5nB9dHNr4II5N)-?4tq_TUNE2>gi)Af{Csw8Yia_Voh>Krj;ew)*kP^ zZ=@P7h8zn8S8)dQ_$U%di*f+W;0D&&T;-ML$E*N3K*qlm($aVDVSc)s9^M#xPQHuRZTQ3^D;J_L;n zWT3-W)sf;60F<=y{*cOa5o$~cK4Jp)4$;ZUistqMZrtm?1iGe9=@Fq_ehjxnSdG$o ztake-Es$LU85g#ebb5*SEOj~y{S^~@1PJw0T1XuB@x4@*kHdWOAXhE3UwN^IQ#-ai zemQkE!VMuO7FWO;lljtm^d*sGN1_f3jpR$^bS9f5ToWKp4Qsb~e8{=%xHAc~Z(VHz z=a*g2sg9$wqnJ!VK<42U3&6~3?h%}@p}e7<8)4Hz8F~a0A&(2>t3g_2T8{?IUIu4q zezUrL2M^?}K`(1jGz$J{=pfG4;W_@1KmE|dkIZ?r1&!syi1@B;_Q~h4>D-JzpgrzO ziN8tFRS&r~C&KR3y-ET)BicoHHux7gAO;Y2rZ%v(>{{9*8>N{WLRh z$9yM9?Pgz_@=S#{p14(;h@zMHl*t2Ay>H^e$7e-no_~+gg46kKrR-}X@D#`wNY?vW zB)~q@i~upJr3g9*SYnB3MP)%S?Bb~4#TYk^n<3Vo%v=F9uwmmFP&nemII_|t~Oft64J zi?5SZYRwA#Igbg;G!PCwj?SQ=^&DrC=;{=w8wJ+UzTLkeyHi}hn51S)fGtAT;EV`> zBg12}OCCZbxS#v7SN+4l$6cLVs%0brm<|RSfYfAS-W?*b#)Z6DMz-$>H3tV?qrODG zHDc>Wjj8l6$N3s;NQ(flU(pdlR{q#^r0OkpWoTBj*RUV)AMgg{!*OD}Ypl#_M)m`|enCuf} ztCVNTd*&R1%O5_o_J%KY`x z?1T`wEVdbyyu5%eVA|}bs*O!vcgIzl0FhlzoARH^D@WzoAVfBU{0NJ`$5E@lE0gr; zJf9!ytj>ZlR*5KjcS2$85@fge!%tHsphJ{+8J=)=?whw)3Kn=w-Vq}Es?5<8h=hSx z2BRj~BJ!cY+?oXA8o+gJ)Q6(C6PsPsTrOJ5B3r(!7faC8NH6$;15C zG&H2hlIx4BiecB$2eSnGk!1yj7<+wsS~#-37d-we9)LE*$GcxiAHyU$Q-)vPT!cqu zde(<+Z-nC?)1)G3MFtm>jp0!_@uiMc{{B=*qTlD?zcSZozr-h2j&+WhL43`&aao;K z&`V?D=UYE?43;BS+JL~f$4}*JgV>4-sT7S98KTd_tc|hbQLvPU17%b#{_*JmhQ9zt z_$j;~+{35&=Ka{b+APD95Ja?c&mcFlo3{WX@T!3=B5I*~v*#odql z5r5wdZgB}G8XAXGAIU-xy%q(;_ab;#2K>gIhdNuA-lo}LGTT%uusUPV*RQB~3b?AR zAxsjuw&$J|!PTbz7T6lZPtH%{Kt0_FoX;H?fw!mn!z%C(t3W`&iO0hrJ~X4b)22t; z7dX|oJV6bLCiqFXEM@IG;>E`GHe79T4FxFgM>p62+G~s~m(lmWR2lgcLoD|po#JB= z+I%6J3XS5PMtd&IrUS7%C2*t9OL-M>ZVT=oZ8fopkV;#2;gC-ZTyqRSNxI#&WnjS4 zk(7~OAEhATlgV=lo8k|#6?owspRNufi|3v)tj&u2%?oPff!9Fi_ZuG zFh}L>bXHyb38oTUFY9|@doq_96 z5eh_RB4f}a+~%HAY+RDvjhUfS(6ieC)leM$(j;xpMu(Ln)GnSS3G5|yP%yy(B^a$P zC)U_#&)FAqA?k443{3jG*XIE>Eb^;^*ZcEgkP?8~+(yiSfqUT?kX5;j74kkzXLBjC zJSzHW4a!-1of%mL>)?;@)?bws12M~nEkR+yOX-}9!#iQ^d!T_R z;G8X%5j4QeQ30{-s}Kj)M*jZVKLPv?HxK24%~7`Y&v*O9`~&qmq4q?jJ81O95D9m0 zbTzQMy8(ZY`wM_0-+U!#OM@q36HY>F5w8g)H5@~v1JDt3QYP@=q27| zOyeQ;q4Ie>XT9XjS#?2-sxqIG6BKO#9hj4yL0Y*1HZ6`WR$c{{fE8eAW5+_u6R%vA zZG2nOeRE6m{ll1Ji1aZOi@*Jv2H)8cWH!q{c$d2mlr9EXgvlpJ0I>02txp^}#8Iu2 zI*n<+ac&!*9Noo9&nXN0vy<_s;;+Mz0Z>&rMw1x<(4D!630W!;b8w^B732@B_6S-- zlz^9gO`>lB61MOU0@l(SOnxBgYV6QlFIjs+s!d9On7NJzl8|Vx0J>WEnDb+AC*%;K z(_ecWC^an5;5HFnHP}-=nBbk%U)r*5i6n&{-Du}%&*c~Ct~q}{O;fg(#?h4LiDU$U z@J{Gcr3Z=liQ)Aht9Cz~Zk2y5R_2Q!%}k)Rm~f;fp(fLzzJ|mHLPq^Cu4$>*w*xKL z_^RmKAD_7cNR;;}Nr@KJxTpP1NXbCEhZrai^?Q&kh(14xsl8UEbrkQl|Gjm?l>W^@ zc4oTWLQvA(~D)-C-dytB(`C0W&HN0gq)06@Q)dQsNqgm-YqUb@x30csY@-dun^?@4h04U+)Uie zgo;D~|D{o5!6-OBa=%jl+ua=pFY2a{F_mT*Kv+sCOxXk1J*AZdi?)NI)s{ zkgN36G!CR0+z95{4CRRcgrr|W7a31@R?wH;T0SX;1S%W+p%wV06I4A!K~mlOqZ8L}%2L|*uxz2>v#AVy;CkLGIV1ml(}X{HQ3 z4|Oe`KK(P5z$hZ2LW!E@CeYitQhz0M_bQc%!c|Mobtp?rEky%{P*JK0VWdCt>yOjf zwV8H#77q9=_Rc@&neeK%Z{`SbSW^6bHDq{?i=BRa$7k0T7X_Qn#5x{}>0;j_@%f*c zArP)vqY&M#08SFMVe=db8wCxo`kA7+J;i=^Rak<3S1+3YYAZae$br;lF{iz*`&MX$bF{H%S{iE2mu4`yqho=;ku7LHdb-?>VEG*<=7s?;kQSC zkTnwIIGc`oX0rbv(K~X)xmi<>J^%^*s&@)2oAfn9LwXqlhg;o}B(58-@u7u~fS9?b zNU30_Jj9+|(Gm|tm#??V@S+U?1+Mih{UaS6}{Lc@&3k}?N{!U)}DGrb3gz_ML! z6gUtx_&a%)oeMj^5gGb1F9}ot7~jm6vH4bB16`w7kag&zpRX4S+gdEvy4qa#O8wS? z%a*K|E!NE@BG7R~>Ei?Nrgu0l05}lJzVg8k!|INRcelFX{x21YJmRCOB*BCGxhZ6Vzh%@<#hSU-}w7?n-X3e9BxWBN2%zeI9j z!Y{iHDxQVW(hK6vZW)H)K?7*|%b|-RsSN$Wv?oY8i)K87=G{gNOO~nUo5M=j_T_t$|lq@s2!t1)%Mbbc} z_{~(@#Gj{f8LXWby@Iv>OhO^BEqC?e6I6e%-kXs6{J$X53l(RF9Euq+Zg2%_G zZHw&2l8=74;mVny%Oa4{rzt0fA;cVL_6r+)`PWHE^J`)^$cr>v?MZpv3ygsCvC0Xx+ zAlhUh%Jhr~g5++>P_O++r9hg7-V&3Hh*uf(@!iACe4&@ptLa}afU^cPS;ZOEa?!s1 zw;r=*&mGtBFLg$Y1l0%|q+YwsCUMqNQDF=uU43o#+}xIlfB(H)(*q>KPO+Q59i0xK z{Eey!9f+La^>UW9#mVNTl}oor<5}fm=`*2IBNKvgV^88qvALVW%P6cbJkLkwlm!Ul zxRj61HaxDV!DkA(7ggt87e{^!)6S>iLvO=q`m4H#)~tNNFI!Ch0avGE(tgQ54Kz*C zPwQdNF1vIX=bfC$=M<#`n4QfZy>+Ix?P8=JHt|ro6=Eulu{L9pcU0TowwL<(ScBg( zbY^Xh!Bql8!H={0?hp{jBgEt_(evt}6j4uZHa-LPr6!5Qo`Q-KO_(KHk??HaO?@ij zPg@+&WP!Q=OuBo0>31_whBB4MVPu!4)_c{wgy=AEGQ9Rg5Iv9D7E((z|3+D`PW?AZ zj|aRY&-(_fg++%5Hd_1*x{kaw8;t+4~EF+hsTNtWH=Y z>t7-kAEaVA!s{vgO_joBA43f;a{p!B=XIH8q4ZsfFHcb-?G3zA6vr5VdqF+5>2Ao) z^g5P!{e|JPh8z4-=NceAyo%fPO>PQ0Wft*REB&%FA*IcML{~auVB-G_qqfB<^9)f7 zR{26ru<^(OYM`!7xMw2iis{xD84}9gwNCVw(el47E~o{M`C&2R|2s%4Y~f+x^XQ&G zgv|Q}7S=H-8^DYCk)R%Zq`Fazj>9_TQBZzx+T-@SOST4#fIl-(o+R(6YP7oHsx;k1 z$DCJR_AhBqJg=C5uAsse0?IL55bDpZTJbQWi0Q+B?eenTsm9*4DQ5U-epMs3M=;v( z25O>*4j14UuRvC1;O&Ld@~CjPz2vj^zeA0q;gWr(3irc4uI@B(`>R^EegcxK4c>$|UicYGn9i7Qld-sC|&= zcy~y@%^{%>ZMM=u_XZ8ekNpDA<$IMjjjU%B0f(SxN#@Ea_HDjyj3+Dc><#sPw)U6# zmW9`z8)g#2V%;i4bphL0yb1UT_$ncdw>;OWv+&<0s$19AW5T&5q%umXiorh5Nkmj#2_G_MtL%T_BzN7xpbI89&p_yhL(zt zaagMX)RCC51F-^3Tl3AYC&#nQ$0b~{Y^f{r&Ar8_Qq$}*roO+@hFVFd3`4%w`wNZY z?+!?oP|fk*48^7#u-G>_T<=@NrUY@z%S&Ll@7=NFIqLd0K|snmVQDcv(@Vnw^KHjX zLYBW>YucMN`vt_a*sk)>Yeoq_)HTAWM|pNo$F1;H81IWI!@IYJG&zlsZxi*TlWRaI zmM{Ag(|uOz_7mfFCp;rB2qI~HicMR)d3YWh9{?^mnXem&gMxDS1E1feX0EjjpN`gW zFEGy*9r+vLE>p`az?^TQ)YO%UK}8Z-+pTiCPDMSy#9CWq8*Z|LR>a-|;CZ-D!Ttqx zza`NXy|4k>jC$y8#R|&uMC&+m+UF`8Z;T@lG5z)*NUVcFaN#K~f2u~EeSD@0t^ls) zw=X;EiJB*x)-zhyLYcz-;&t9qPIIajw%TDlv#zh`}?YEQ6;E8FutS~yS)!d@V|o7ST$;BUY69)xj`6x z*C_UZU1ysu>3;94eCddNd?a|tyBcc%1+P$JQG~wU@BRSKh4rN_E9q()-v=e0MO*pM zo2UDLFC*}H7Wq1iqCQMb>1S#O?18xBJL~<98CZ1qIvb5Hr1xX0uj@U*OdkN7V8dZR z8_qt%yUp`TVK=J?ckhgHfLi7X{E<&cQNSF9i06%2bri#Y*ECo0h)X$nYBsr%R$@|> z<_V`&UC59YtcFJb`)%Om>t(H#EMZ-U_cauCUO8nG)RhOWKJ~#eNC@5zrlMrBHsRn5 zDOx~V`)3^!91cV8Q+>{n8vaFXaghq|5(K!BGADWQ*_RBQ=jn~AJtzs6-Y*4VZ>n&A z3&Dz}aLxh`mouJ7=tve(v zXc8U}aQ@qrR+r^W6tgG_UAPhXQ@j$B;i0%QM|hYXn3Puxg$;}ykJS`tS^J8)x-}JW zB)5!?f|11ieSspYE5Hd!+S<;4Y&i2Si$;koH*qXFi6yEHzDWNZK&co7-g=;Nvdno_ zsVnBRxVm7@2_2bz2Uvg!$&`i6hvc2Y^cy01VZ_& zaT>Si_GGe1TakN)-oP0l4YT{8S3LOzm<-rj-fhr~amYB+<50xfjSE3h8nN;nk;SU4 z1B2)%;|?0ru+(KL+}sm>ra!@S&GqNKHk0!Km)83@gA0luz8HOEAfHrtw1M(~dDZ zA+U`S#Ic588|jdDqntYi4o`jwH1-2)nM=b`2cz34AN{jT=kjG^=l5h!^`-k1@dZ?4 z57lv}IAhwg__Pg^2M4j%AxOKob|M5rG8e-dj|e>Myr~YKo0_$uiir&ms+qi_7q72;%eN2}fS2=E^$`Et6SE*-9+GB8vCMH~|p zE(V7zD0PJ|s^>{nIdtsME@f$<$8Me=%oaIx<0@9yLJ3)xFn``m;WBI<&)k+|khq^b z)Cr1O_h!U6DJv&ba1JtTuZ~AqgCAoWC$`jGMlS_V`*@xrr*D&)DHYbteVXbO6;Ss~ zy;<$4W-g7A_ig9gRF z{dS}lT=qK>(oVFK>h}_DYEC?h2-Dsv_Arn z=YFoWh`f>_L=EQ^Z>Ja&RGI!DT4P8k3R`q6BI%Ov@6BlHW%Xa4sT#*MXY3Z0^h#4S zYR1lwIE+Ho5fJs5)@+{_Ol8oY@6Z^2 zNwQyQ3@Jf+fIWi%VExlUtN3HM-Hhj_*xZ(vjlD&E=E~WO zM7$Du@rl^h#P#oNbx5ZxAB^_!Zu;1g;I7@dV5fQLAB1tqbfE?YLR^~KJK>#V=g|5f z6%mj4M@NSaN!B^Hru9fW2o}+f0-x49#_qNa7BnA+GwQa5ITcis1A)_$JgY@!P!O1> zjLdnc6~7930E;W`gU-GIz7<1KEq)}jS^fzoM)~R+S(6FdXqMd8{=V`frBoa@pGALq zvniVt((u-De}7Iw%~x>xXF(v{<%sSLtoTA`wBT9BDL$8VLE08qSRSC*nl+TvPv;~n z(caI%F#pe09$l27a%ADJ1!R71FHtIP?Db91BUOeK2oHmyET3P$WJC6agvuNeGM%z7 z{g=2Mb|TCe?KlAUc`Cop!T9{Q7sXHcsLT!hSBi3GpLapctOsUhA~-UE7OFqM8;=Sc z10pChqxm7=^!&sAbSjfB#byDrDF@?#UWB6Pq1b?&G&{NL8p}GsXm|^M9{6@o#<(TM z`tlgFSrz2$lDKKN&+RN6j!i;2x|Tv-RiaEDjo}In-)kY1v9mP=7?+J={}DrK-x|j@ zj3~ZmsiRO<@u#@(E~4_T)z7*v1ckx#=aQ8aP)LpN78=7y(89?EE{D^D1aR3vnTcJV zn?jv(Re@My)kr-F4sk45LK76DS=Nb$00hl4C8_ci#!$b%)=nA>$Wl;Xu!_&k;bchL zuVz~6IE_VYbW;_@VFJzRJ((aV5#6M`7)0!R(Lr-I_A|hwh#5*N{j!y`O5w`M-yGgA zv3>tr&i;YqbOp(e;j68YBI*YN1<^5I9#%lEpZX^B8uK99-bVcT0VjMh9j zgG59PxwmvsM7S-c;9Q7OWyMm5UslLB7DrW$Niw^lisQ^T>p(T!+$e9t;O^Z)+qX`r zpg&!wWl~t6=lp3eM28*h>)9xoCcJXmW;bW3r)(+(l!RHv#4HssxgprV2{w@gqnoci zKdjywa_i))$!$dPqgjZT%SISKa0v4oY+a*Rwd5;ODr$CHFsc^$%lX0?74&--2+x zuv%O`but8?*M~xYK3KWX;O1HS&T;Zor8gAjuS-AQo&wznOJ*~%rVy%jecnUAjy@ao z%cTOQOpiq*)1&IUT~rVAKHyO-#0-(8=V}81=hENquP~;qTm*l2LrextBR3yGyhO+s zPf~^D7v!0Qkw#Ljz;9=K0~L=COUn^A#kQzT7x@NuT)voZML4(Nt45QSzz=(8S>?_R zbz>Tm8*X_hQ_&Ah?~@2fT9L`7d*yqZD!hzAV41sNg<=s$sSB|8VY8=9HjBWX2Y~*P z`4Y;bGMJoZY4XRXa5)Eb5)C&*J8@lDvCjDbstFhOgqkq^1Bc-u#N}K)TOcA1N>Nie zV`uD7lMI&6XJo1eJO-`64KwdrPep0#{TPh@h2o00bzxhs{F+`*aVqgeY!moN!t3k3 z6R9)RtzFGoS9h#W%=LMPqin(Q;t;JOyPj_BN4+}zgTc%&FqjcsLD_XL$rkJKav{4& zJrZ1a4N;4NQ(nqasSk0%1NSnF{LN&DVSbSGP)CAXxX9v ztTcP8qPeHbuhg^J^wAJAp`HtiZs0f~AI7FjO>;j~Os)yNhss`}l^ASWwcDT#;EyEK z@ne}t@-qk0Jn<7n?c%WBQ@4xgnIEGuBZo_s0ZSvy;r<=|(fYW=Mr-=H^ek(xN53P` zIQja*GKlenBd>DYJh@z(o(&nPswgEB{Y(D`Xp;$(sQhD@TeTSkMVc-8H8LnQiG?F0 z>ln}+w=+rh1TcvdN5Vm7LtJx_>6PzM$&j9otuh9NQXodl>Cz|jc?$J&{VwT*S`Eui zl=#~{sWK5+=n{15&2z)$;O>rJmKuA*ek?SJpqxAdiqHQMdbdd)`N$rraR z4klYqhfha9Q393N$9EYX2qJCuT>U2<9}ib(lq!>%s*F^GBPL!%uYUPe>hp}iW@%p$W45% zWO=`^IUw49ZQyY5h0$>#>Q*&C4KpTDOFnbaE)!gO4NG@V3wL!V3jRx2|d-$X2Lv&Nh*vGFYK0n-grJ1nj)7xtZJ#tM zk)z<&1bJ)iCvV$Y_}zdlQwx+Jf^Xjn(FhUCt;bU!BZeWK1rDfLAzCrV+%Cnv(X>;- z3X6Sc4Uy&O$OaK@S$a-i)$-D{oT_eUX~4y$z+M5-N%(Zq2~uF|l@ZllaSKf)G21-t ztqqUEahySE=bw)v90^EoLf+ zx+dgSg+G+FyHtz$MJ6NH@!O5%GKvT=k;#860-xn#@`~htyU-oQ494&YZmU)l#-2Y9 z@a=;76${>KGvT|EAi#rX^6X8>+1h_}5j%%Ng$r{$1AK{z`qPcowp9nxI=NJQh=VDK z>KdrrwP^S|7TsT-V1oo^>g1dbP<#-pV|P|p!EA}rd9N-ZfE)EScJY^0Al2|Pq4FY; zh4VfGDK|pDh-t)P4br>%&NGiY8N!|q&}^A;(=N75=UCBsodtbBBiv#t@DVwluyo{p;P@&7&jah?+!iB)_v z)1jgCEU>tc8VNINj3NR{&l}pp#T!RV9G!GX-v=RydL)yt2H$PHVWB%*?W-QR2}j~a zxg4{eIZSabpTj#>EfmhRmzW;q27}iY7{`l1R0ttJLbalyw`shbM&T-Dj2zQt(|Af) zOeetSBByokOlfetPX@kev%N9L2(AGdxq2Zd@>eu21yOgsU|MK{cV{tb{a1xXDHh1k z;sToLCCkBWGOeSxTJU9d3K2qhWsCidhK?s!8BT3R19A~_!GxE*XVIhRCR8sJMRr%? zbt)j&+4%}jQ<)8z$RN#N!796!i^?{l=I}|lvCL+IzWzsNPe|h6Tzd5bOk%ho-Qkk4 zi}N(msnzM>?Ik5KB_Czb9LUB97O>-BW?5M+%cIOE?=q2sZ8i;*Rg$dllBKkB=-V~d zr1%d3L!`r$yd<_F;=MKtEa2TdqDU?aK1|l>*n@_H`g%2FcrH*H$jN78nzv z`DnF>(Iwd62HWO;$6IQ6Xoh&V0xZOWB`61210fO}oWfP3=Mbk00-%oRN)bxc+ zfKrkZ*lqB1jey>R0pi9)k4 zIfJmo!r1+o#YYIN_}sx|B=5nzZG2mv%cHrCZJVG$^)e#;jTP|S@Z)_sn*7{kIS_ctKLf7yxQP$a!-^UnSB;$rQ%SwKq*v6PXkbN%wn4XcLclC32@X+Z zQpT7+XDzH^Z9r>2qvEHFeMjC!odKv#(uG7Vt*f8#oa+z-s||F$U>hnA>ERxNJ_ zC+*}t`Qd?q5JROPk^t17A*K_(8A1C+@{m2R6!_$FJq z)b^uMQo1d0@d((OzxLHvW-tX3+{T&?uo0umu7l%HjXj3%drc8N!EwDM8>=Yi}vGdv*QEr<=Si5E52emrEkT2v$GcnM0t^Dd6>K zegdh%sbI1|*lj-R@7+yxEH$~r7sb4K>$E6GJ+3&m#7hX^sdsn$wXF0!^Xvw*k_i77 z`F4-ZCM1oRPd<*OHn_RRvgfZ;k}5b+Q^;nxAlk#XCtQ_EGo|K7!{b(GDRK5<>BH8S>Y ztdex~1fZ7u;bkd#{ciUXC6epZCAm7!&%?qIMrxA;Wq|cov!K<7Q!@{KwCh1Kf{g*) zGLlU+VrUPea^q);;%UtEUR0u~hEUy@NO{r(0UY6;S{agB{CM3*KbF2n1@}rJ{I*hE z)B%h8`M-p)kYet22EelRZCVs`2^vanV)xbO=#rrhOAU@vUV9!f#DA$(8H)Hu^^mFa zXSJK5g+VR8<={PayI6@U0&xi&wi2N#xMUm>$jFm)Ufo>FFp!?wOp~p}k|;-HsG#(g zhXdteGlO0PoL>bn-hIhh*p7J9x$Yhlyiwu)ryp61f0!Xpx+@s1@EzNYTOz_JS5Mb6 zRl}FL?{{;>446Y?0Q{`X0IfY%o7*DDD-s|Qw+`coWOh*kFu#KenkkE$gnS*v;=(5` z7>93E-xrEb`a!t&XO8>!KI0lTtEfVHM2tvcQU++?3$dlYqP(Gb%=8_M8g;NNk9E!Z zD)0GqHcy{5AWVY^jSz^F)l;YrhFn!@rrxiq<_BKEiU-}nTV#g#3mo_!A+>8(0~?wFmZOIUAckx$c@WYj zr^eSJ!(>XWoy{^~aV&yhn8XKac% zer=9ZjxH&62_o%Ex-uyKUt}d0R!4i7(bmzmio;{3=HxwLY1w{z@k{ozqT@SH8b$8* zM;^;puS^^m;ZrqpqwnY1GS3Y!u6%RtQR-r^!rgH~;OFRUKfrfsZaJ^6ZWn@isY|HM`d;$3FOpfFVdjXPR4E;rd}Q1wg6{WM&=7xn zMN#FZRx&8x`5-I~`PEfvk%*a;qist3jQ%{vS2FG0Rg;k-nWKMWfsA9Cxo3tFJ6wV}lnnlQ#o5)aR$}|%y{M+`4 zCo&=08jvWb){){7Yzt~YA5>}0l^h4k)QWh1GkWb=x`>~3S7u`J`b0wElk1@15m-)n z-|~UYz)<^Tdp{P6@Ax%e&4{is*9qi@Ek|0b0zJA|$X)^=06=jZ@qP-bnL=dUx`|7& zC~gfVnI*X_VOpcN74moe<|DP*Pj1C{Ju?O!SaI*_K}tPES;l`ZTIPJ&h(xm>Tpc8L z7sT%o`Kcurp|UN5Q2Ia%9fbBPix(zjB!ycU254^!HigEG7CCVvgg$Qm)ta*Oi;?nJ zfmvlh!&SYD^~{OO-;BHYGGhpn2z!1BpYhI4P^he1DYG!v>sCrPg=0t8XDLiEngKd; zMUGFo+PkiQR$Sg(E-znT?&@LTW59bD-wO^gk91}>+J{crbjy6`!lMX9YZUXlT42iO zAtgib?gSb%_@x7#KI*H|_p*yw)>!Nxe|W$hQ|5R;iNxnT+}rAWMTuQZEt`7h76U<> zR%w}3BoS$6pFDm#5gg3g3sdT6JkN?OVmp8UZ+ zRO-c+j>F4#s!ZAGSw_qFi^o!>U~Y7gJJE;u5fdP}9c27ds=#-+KitEIbV9&x<$oAx zLm@rV>SVSN&}BH>E&cppcEnv#k2Tm`jIiE2el@aX?s4tct(3ZFtRsR_CJ*q)VDf8sDaFNC#fdCu1^e& zxvrGuBIGDJ-n%e<(swJxL_0wgV+@6pfv~F!cf=(r9o9`#WTGd0owN_nzb#zbzy)I4 zk}ppk?PXtJU97#E@N5eG#i=z32z5qmndmr%bF!psK~!cx+*=^cZQ(_@s-|rPM6=ax zC(lR}Z-*S&!!-H7DvEeBLTaC!=~fL2u|DURvH(Y+?RuDqB4JlPgklS(>dl)g$2m^T zigKN-&@?qB^6oFgC!hV6BeD#g1;rGsp8@) zv|Y`y54)|z8Wvi+Z!T^GKU7HcqL|)Di&4$sr`#oI%C%*&#-cd^x6GZ>`n?sup1hPM z7auOygQdp;uOi)Tq@yLZZNL6jNBtJ)6Pz2L3m2QEoYa{i|6QXY&^x16oEv&UI14d9 z%Wm4e`;uh+XGj9}nX@>1aysz)7nD`}-0N52l@LU!6{-WFMUtm}Yq*#<{o znphUw8iGtj{R0b=3ntXt`MFMmpd?iJII4sq>!G&z_fSu`Q^c~ znU!gH-Qun3Cd4D>$)!zG)M0`?=(1s5a~C$7!!N7>J+!XVX&EY~>)%%W6bflpL%@0# z6&C{Pe?vX=k`hyCCv+trj$HRcPSwb^Faujtk;}`_+-a9nFKip-E)6vY?p~@f=#fn% zzS-sIO!3-cPLVA!ChO3_7KH<+P*Za!KC3iD4>r}koU+~TW0HUlKgSTMgI^yuBJ^vH zQ!Tr&uy*c39)kO8o_aFf*yP|FC&UqgAe|=%6vzR{zyRfh@O`~|PC8`n17{DI0$GMJ zmQ}eQX9gr?7jNih86#N*2;d>herBX&{f=w%`z-XFaus5z0hKUC3S2=z#5KxS-McJT zA0dpOe{oR%g2T~%Xp6w6vQ8J1z#hpa*EOF}t3z)dSjIg5>x*@>K|6=x2L_<=+N7}O z=6}33UY_Ld4p=0Su4vyXD==J%44_1Vy>((?c+nhMnhr~q&_ES^RV;XjoTqYI0^wnkg)b09uty+zqJ zg9#C09TL_Nuq#RtD7?g>hcyT09B4Ryuso9_J~WQ51DB$A z>rlT5#mX*K2y9qlx@VWKPtvDGm51HRv*D5)t=zu#zGXY)MK}1CEhXctkE+}a|3to! zraR(0f`?I#dym0LLaS-r1`}rYJ^JaAf7^yvF+9jDhaMpa&eY7&_<-PK7<}-hXWa}z z+w6?xWl75G!ElDjOA5JuxFt*78m*P&S_zx23LHX!`4BQUlmc4@?L_@RY+`XGqcAzM z$XrMviXv&-Ng}gZi<~n?;k=346|{xVsTX>oO>!+r79+j?3AYNF`sO1b9ZT&-W2Mav zig(murEeRw84&!q?%=O$W?|cSqOYi%nDP?68#61^j%n&`?BC*` zq836n*o~4-cHY@SDl$5(10uTWBEl1uH4S){e5ZfFNd(tf4)oXXziE359o@=10wmLM z@chVIztG>onz0ab+fQ>z=dprpr%&b&Q|BHuCTbHnN&na#ArU(c0tYKQQoa!5EcJl$ z!#Y()b%9oH`+jr4fY@{*nH zzQ5YffUrD0>WwqIrmB$7yjrc8fXl&f(t%;zAH20~;l*?kFJ9GG!Uiz02hXYX_}U zd4dVEn*G)>m&f-Xxfyo9Wskhg-?kM^hqg43&0Y?*zD&S24!e$pll5N`^zozDOf|r^ zRRLsd>wO&Iru0eE3&|M`9rS>ytjc#nNE)MW%C{Z9DoVV%rCB`M=1lYl)i?Vo?t&~( znD0_%As9V##V;5B9MNX}#^}B}gp*j~xK7oTCM%;P9nrSD%`^ydFs%sk42;hpmN`I6 zYKsg>!DQaUA$m1qTp7CxpgL>FOj0Iq{wSq2;*xUTe0M8|PVYXI>mqL{Mgk1mF=O22 z8Gor2a?LPc@g`GgLzT$q+3)kv>tlSH0Yt!SYZgW(<=`>{JHA%(%zb^Gv%iU4m$Cx# zvYxZVCK?d3PnIYcuTUlJA9$L<=a!uMVUOa$63Y~V8&`U-bs2BCs+g3Ay_VIz)_Ogh z9xIqw*6LxPOXqx{q|BKET1%%lqJiSbAZ`#r;&Jt!UzKPPFn=374rf<_eJU(=kq^lt zx(Q2Um3)?ZeGJMRQ-R*^XrwE1e0v1Tx|O>;g#=58rI;i)qEn+M2HxmRP)jdz@5ttN za&-&55gu%UrBPK7Op<~7n?fhl?sO4jE>&fbcreCv>KCvh?X*@eu4Vk?yYBS^)s}Qd zE{~2_?nr84RM+4;JrWDKBs>@U$GOpz(D%t=b4TFD`M>vGrKffVCxTCAPChr;!TaR= zwK86QJ*Ne%9l*8x7EZZ)u=mewam=()cC7*gazt?Jk5b##0!3blWUd8l!PJguF<%Ja zVoy#5tcZmsQ-q~-7Y z#KSYP`%QjgV1?eZnH5B-1+~^cJ^)Spe``(I@AFC+P1k1E*{PR~53+|t6x_P{WT3t* zgID^GtMk*y=17AU-xZODH5HEbrvRS+4QucJ?PBwzwYy$`C{3NTP+xem`GQp*XK`ED zwtf6UN>Zj2)@MoiIRsepUJT9}1k(EcH>g%ht{&X?wCk7E5^1y59T3KRv@^qrbj9L_ zR8Pf5H2(Jvb3!kDOWgYUKRivuUB;<(geGEr*3*U|JV(VKLWnq=S6|4$%gOsYc4e_o z1jTm3KkzXZc#;af22u)snRnv9ra&$X)v;*2qsAi^@E% z_(7KmSh5FCeoN|@{7jg50`!EsJ@xU9L&K;W!3a*a*QrP zXMrktCyp8)nCa!aKtkGMH(-Yx;BDMS!`~ap1O8ZLd4=J+F3m`>mbYFoWfM$sgCQNp z!+yXFy6YE5peba?Gyb4z8)D8^((T1Y%VO7ttq3?d$GF4SFqqoL@<%g>fKT&WeSf;P zGIlIKr|`gKoW`&gdi@jOiJd$MTJhBHft_!@^r6Llw%a|1u%`&TG`otw@GmfikM8s z1YUE&1{{DWO1+a4rY*geFr}52J@OWW5dz_{+vES4{KN1be3jMik0WKj&w`dakz?Hv zq4!5Vc&V(S@%w}jbRL!3M4AatUYsuWoq^p{9@aA5V}C4aIYOEp-Nrci06Rd$zX)T~ z8=J1;4BeN@Pp2v2>0PjFBHY3&3V!pw_h#=d^J5o zhTQ5fQzx7{a>tzwfJuBVE~&xxUp-YNT5Fh@{yJXHI$KYHW10bX9pnt6;7gh!zQ0-& zT-;NRN>BH)RP66=!39CV%DA=B2`?{3p^ZwKwMs=J7EEzxdxn++8ndEqC7j(CI3OEB z($Z7iYppQ z6g2ynerWU&P~j45GC%gs@I0qj;l8No_cIdp`{QI7%WqOd*_+U$jv4QeWiq=h5-D8R zwca9HsYFSes7N)EA(J$N5Y9<;N)q7aWI&e^u=jFoZb60Ef0Pd*1_$}QMA)g+qJ6l*j?T9pK ze#F!YCMlXav0hCRF%@Zp?;@ng3G-K6%xuIxzCwt9=?}&CCkcBf-WTUVWG!4|HgW#4 zSi`K849greqqFXM-BSvTutfvP1S}44x5g$LMI~qG!WGHZ zC-)aWJJuXx+l}wo<9vCNB}B3r97Mn~*jI}jpV~p|%;>=Nb4O@zObYET3%Sne2*Oskq*}0bfstr=CfW zShBiuXA%e)q4A?so-g2%AHk1DyhchG!+rp;%JD4m6mGZxS$4cVhZpb#;EgYkStJ+B z41Qp#b-=%|2Zj!3i0?>`2Ov_)RT#mn%CtTJ=QtVEfVjrmTDb+RS_MmQO6(=T!wj9Ib_?g`(%?U{G z(ZCP8)*$KGT|jGIs1QEvx`#6CM8WDX{Mx>@1k!T&ZvHOJM%59F7L_ZY)8mtdWyxvMJ^cxlCQ(M_T$e1d!B zf$YX9d8ln(0q$x@foj-fCEo*XCiXSNY@hWo1oi!2S!C@3+cq!jd^EgVWVIM9^T1>6 zd;_+%aX*_FYkXp+S5F|Bb}#w^_@^Bl-M^Zo_(-=`M5d$`t8g;Rd~K>@r7mN_+q%53 z#pK9dN4jI$0E%yOtcPcCbOhYLNk;la%YU2FJ2!p~v1`f{rN4*KD`@2@c^$oRMU$s^ zy5CC@87C1XN+v{GKDoc~CXMjdNZ`%5_b#~i@LH30igzO{J*o;aSm8M}1*6hKoD=^8 z6~pg!4M-QTmhR_GA;GeB4K6HMx7QZ|-d1rQkDZB-%(2gywRe)4w5Uhdp$Bmar8v8m zGc?~Np;L%lneX1k!}ktK6$mqPU@|8$jW<2kk_4+=HRLTcxS|i=HSC9-oK>?^j+5bk z9{X|d{0A{|3$mk=pSB?P(D{fr{{h)jWzLBQH-2G-uUD()mVcI$)9VIoB*Q@hE12h^ zdU4*2$XxUf%^&sAe)HG3%LT)BqUWV=m$2R9CfeFy!{nL(v>OPHw)Z9g^I2EC)-e;ihhG|CF({Sxv~ zW!()?lDBwzN?e3o(VsY&bg%pSTjo`X{1KYIJw-j_8D!M&e@TIsj+eXwY}qJ+iUMKw zybzA5IEbx|rFG2mw7`?z6%{N_2{6t4=UyWFfRok)lY!<@7tql!lXMAf`@(O_7t1vO zdg8HQ&mcTr477o#7`4> z{>o-zpySK2M%h4()zF7pk#)g0$egwQE*^!P9xx&!Is$P13lQ6I50B8&ux3CwxdeN4 z-=&|r{Gp59;6*u}4S+gmSSc|h$yPA=3ew){UapO+sdg^|*tA@jwlH3M0n*rXNs}+m z^9DT|HtU2nq}{8V%j2O1oiDu_iWfD;cf`-`e61H6oxE{9)2vP&*_E%VI<^zac0{?d+O34HT1_mWtepTcsZ{#_KqB! z{Sx*y=At-@E9oP8yllj+(tdnKE>$pWW0m)~-t$FyLEiDSjqZ5{|LX^s;+x9Gf$nT= zWT8ovL&);+gw-^kOV8 z`ka32B;!_;lFgoiLBKnS)W(vr`+X$nA`b^?tWsoEWeg>4spG3R^ApUMotCO3Yr81> zh4f_>Oim!^BDQjbt-! z)wKmmf|73FW3kq8M#zJng&9UjJA?q+Y9&<@R1q*C#$Xs8t;hZYYXiJ0E&&U5e=pr0 z?O2wu--Ix)aN=MpNy)L-cPRP9ujfFZ%0e<&E!>=cD=455BVddzY2H|Y zYncV&g=rJ{CM!y+;oVv{YVp-Fx>cc9XV`L6qq|!vrIU zKl~QYdNO9DvBBEuIajsedINr>r=MZc-cnn$Y0ENJvB6Qn(83Cs?0C_JfEJe#G@#Fm zAeRXf&QPu~T;!(Z91xxC()V;oGLc7TZrOL|zD@epMGFsb4+>ar9URF6Ymk33p}}gn z+k1VI$;k?$+NHz0rRZeH3ZLCbo9sX3jEh74y71F0{O*$}vdU z?8@qv1F|B+WwWR!DFqQ8H<=HLVGY)?Q^ zAg)gWKs$InO~9VL>IJc4SqryIAmehb$zHeP-s~yol!iu2weEymCvGGZNeX`PFY+V1 z@4#506(Sv|wPUB=X9GLH<^IMG(KQoANWx;YLntrp9FBijUFd9kR+WECi4TXSoM^^0 zI$5p?+?S^ZZP%48io$w_;l;B{0&n~weropRt7+QN>pjez@5IZW-XK|S;utby?p~-S zA40=ph9n|GDbWx>>g?YH)Hc{Cn~?wE*m<9p{Bf0)ZF@%jGW8Or*$qmt2vVRDkxSWPytJy z*ZsIf`8KXUq`3(}9Os#$=g~$aY0{XvZn;ehMo@B_2)8U*9Y&GbK%)ma>k~L3j~DhJ zeWSuT;M@vn0$5Ck4v%(2=E0F5F8eMi=hw{0iuF|jVW?k`qu0#6#((e>;T4b4b<~3mV zw=@G%_8-rUc8gDKX~v}iASW{o#f^GO-^QRZbFpM166OWb!L0idba-5!%9?1-FREQKe&bGedXZXqL{I_lNgjZ#o1#BVR~YB z$JdIdu?j7LGq}i?QiVXcX7Vk=r19_%@FWm%iUb$->?P@#7#44M3*f)ZuZ75Z=!0LU z5JXqNmC;`e9T6~DsWj~%)E-C1a%ii)Pc$4itYa@d<^JW+h}^=0&Sa~*a-FKDb4$t& z`>C9Mm7XfQOOlpqulay&O8xxtoTMurQEUx76r@%YhmpKPoWqQ}LhOQ3fw1nmj$c4@ zmb3nO9iYTVSzyJ~xfx*4SKQ$SSK+=lvR8%K?Y4d9uOwyCLB!jZ=h8Gn^KmJic>aoa zLg^&^em+BtYb?83$g_OWkXiO%-_}m%$KgWjq|tOH4ewLav+V~>gZiUK6C6oP{Bs6?o5u&&Vd1bPBg}}3}1)f$-NCHx&YzwSVSK<>x{FBD15-HDB9eTJGA>- z>d(kk#nXqh%cdb{`IyP#S(|muq~&cw;ZVZz?F=+d9a$QO<+!1(`5w@?hJGhud91s? zU@We@mAXF#KQrwMoPd6M*CYw#@h{BXB}ugO>-?oKAh8EB$^W$if8mlxlo;6mO_3f2 zBBU_8o=0eb7d-Top=&1{rX>b$!W$gUC6fd5v+qKAhx~zK{+6c}EYeUmWqN!<>r-Ma zdX_8dbc)(yEGO|{82&h;F?lh-mIybehYT9?cVtBE~Mc!L9kvI#G zcMlb2gPj9hf&H(3McL+i0J(XnNXw~vZ(M2Oe^Oqwo9d~GVM4}Uf7p)5oo#>{%}CA; z?yTTsz~z}iuCHOtuisuzfPKqfsUrA3l}QvEpjjwfiEa>*>=_>yJATSLiLr)wow70a z-MY$C4(Y%NKx8cw{#&eLX-H@F9zdRM?E@uDC8OzJ+hXu$kLY5%NMS9sy-U7hisT9{ zMyNga-O;s5mhg8Uz(Pv>@@k361Gn2%7%3^JH^0v`H!gaHanO=!q1YG2f|liofo}>pd1EMvH{Y6b*(}M|CXwC}DzR zk+%jtCN-}4z#I;JRU$Kw5>>hxIR2#D2Do8eh8EzZHa{bsoS^;O`mUG+a$xq)2CdK} z2I^WdrqRY9+S79#MJvsVEnQXJ@jNIELqu3p;BeEXlY!SWKads>ZX`Cbq{h>KyC!LW zgsqQa{Qq2bhviH(Ne(?A&WyI#2ks_eUQqYq%GPvm#>A)KD^RFnw^PrR9wfR6>(JQa z?=)H@{t)9CSDn=+XTCp+CYp0f3vA!>P&z6H;Qe~AKiTcMolgtoq*+<`7C7%@PTn0Z zM=UQ|D1`z zku%EgpPPTq#S_C}j#~G<5LK4i=uppPJhIbfgOuXS2^IA1aIr7@(VLH?txkckOxhDF zt17~Rl=7e%$hZuCPD~u|=d;WPyQGVkJoNW3C=6c_`_ZenFNe<*9JF^CmKZ#T?zm(4 zQU4-l6+UlgfL>Xh&ACI6b_q-(R|(;8)Rch#G$zYaKWHuX_&az_@;ftqS;7A$ae5a? zf)>tZhK5Qj!+B=O%$%3yMWIo`DLG^&(L>SF-aBZY?vcCRim|vjDyB5M#uA|;7iMNg zKFeJJk2nz^CjUJ&<89n!4VEXU-vf!ITGSt?oUc?_eQ$i=| zsH+tpcz%=zW&P?sUaK-O({zpdz zm{3C(=@UW}_>thneI64%OT`n%9(?@t0bH!jmmJYg0$^EqWIn_5Jp(f--6ZTDtHA>w z&L^w38u^GZiWfw|R8Cx}Jom1z=!5wP_w2+P+Hq|QL>@fEA-&0511iirmMRiGUt)Mz zHmaX&KsNqCRDdMy#Nj2!DWl(L0uoA<$DmLl&TzwdErGG&`tgtPCUwczVYi zV~O@h0p`9!J)`UngH$+1;mKG{r0sHX)L$Vs4qBl5(ag8d`E2NZ2A(j3xNwH^2vKJ^ z2bC3Ek)=}}V|~}ACWPvjiuWPGvT=n0Jy*>;Dxwf=hgcwgQjr3EH39l>rRaTq7r@NeF; zRr87BolmG$60m-!?le8R@{H!$ETxGgEJgHgoZ$cW%hySKz#B_H)%(+6#}2dOQ)$46 zj860FAflD4jeTjJf3 zeKsFcC5aS2ei$=XFcb4}tBnKZd!rt(IV_RYK}4FN!D|e`NN_aB(@f%H(=dA-E@pqD zdj{{h>2SW0vtG_NZQJE_#a@GM1>mdOPXU{?Ysvwtc`E)gEh(5F)ca+H$w(DL8aa*zHmo$0PW@+ajPMTq{d?;m`6fcxZ{+A~0RQL?2u9n*DDqcl*HBV2ap^ z1SjC~vScR{J~OaP9zc~Wrxx^2#4xT_e8+JPBp~v+7jJD#+9WNp|EK#PT zXo_AAxs825t&Bfx)VyDDZvE2g>FtZVsh5P!6F;XwTfg8q__udO+&MQ zPzLR^l@~(sXMBnNw9vX&vfdgAS$%3^BFjPm`5$N^#D&5q>kSsKp)5|41{3g{NbM|H z7h-e>Fn*YGI?$Y%eNa<+MknkbJs@m+nQ}&K{yjmX0%hg=H|deFPqRsMxuFT^KH;Tn z5JlaUUs5>uvcPZ0u>Ji!mYVtg8=F#>nWxrL>%_)HmzzvBZHsyKq4zs$j%75fw*|{n z=8`{N$Q4r0wiJ!>CI9;sI-G^yrf8oU69K=Bz6Xu5k&#TLCG;m3bM$6|7nRGkCH?9e zH#a*g_)0mA^z#A)Ku-0$eK)gbiS6?h@Ps&}D`K zmtIZ-#0}@4pM$MH&(IF!y5?&8MTa>@!07cx96cu3;xbOLX968MA2c1+&#{L!WY~$V z;CRKZp&es(eFn2sGnm8hWSpIp96XQp7|o(6^Bbpu)4*z;LC)=-Nq)y=y`mQNJSi&E z?!!?!IRZAij?}K4WihVx!yHz)wDyUs6MFziEuxuEw0u&{N)M zW0Cescr`t5BzgP94|XU0;ERo^)j@T!+kOC~eFTSqotq}X8T zb_<$Cr|>HtKh^h2v6PsMTAjaw&bSmejikMzln(#y>~yL z&umb<-hTx;w$GF4XWa37w7f#5T)6w4yPQS7e+M8_c&mm3TE6B+v~iW<8zF#zu^j-` zpQef6^#@zTTl48--3T3M`^&B}8Oyr}(xFnROmQQ=8*RKj8Z`^*0uPKTBI9v5wyCy& zdr-Jw-WeLdLF}n-r8@wd7}+CMww?3vIYhEH>V)yP7x2~V)RXd3=R{T1Qy%%x`0@Z% zaz{u`+JTITan#p4=TkyO^F`|=DXypU{e5pp{4bp?sxtSb!B44v99}oL5Z)(jyqN~^ zc*}|kk!qiR~!%C~|>~aH6?^WBez^VIQU?3yxe0E^T!@+}-yq)+}`3z_@gKQsk@!jxy9q ziMVxB9{lfHri|AQEynt zbHuQXJm^qA&;603UIxwmW6~;<^q;d;HB>M!N?=CF5tAcR%$lJ7>FTDGmv^2H0hi^A zomB{P>!FGKQc{x40i&Gmg|%j^S($!u!5Hb@(oNfACRri_${X^#6jTF|{VIw{rYdj~ z2@8!dDIn>|cZ%3DVupimm|~zhtaAFME>znKoe82o2~ zeY6oCsvMJv!Apg(Nnt~<>63BU$m$}KtNHscnxL255bF2P4w3$w&k)%|`G2@;?>{3? z6}f_N|2{}b{zK`vzw>f<8_nhvkt*RxYPShQoCm8BOtdGIA9xYSvNc#2iYt;#b$9b; z+|lr_ciHbW77?*I5usppaMy3bj#-4dhxh1KOb-@u&yeS@PWrVe+420jo>88pvQu#m z%ZSrTZCK__HWUq%bI`pptu@xaSuXyW6?V_5S<+|ccEt^|DXe^W!oMM0;{<5<$`yHT8~+v z1PTgG7z>tPnO>KYEr9y2$0*{N8SNtrhkmCQFy7tOd3t|C=94smptL)!W&kSGbQr>C zpMmnV1n5MSEZjBAv+qW>4+pFdKgUGEXhxACWwFq>Csl~3j0iv zx6M^rFy?;6vfx?A>W)sppB7Q_FU0e#CtN)a)|a!~)dL3%n-_*a6t9onX5Vz4pHiYg zSTTRu?FI{7gjBBf-OlH9Qucm!p<&3Vd^+{xb5oP%6#5Xo9*ZLKU(F~YDuU>JOHfDR{Wj4zO{Hw)-DuTkTizj=4aH8BcT|&OnoPxRRFZl0M&}eupGA zK*@6}wh>(z%q{MFcYqm>{(QgU@GjgDHm8;UX(skrmW1nO>iv>fFrSk)M1riDE1c#_M4y>QA)SDwMJcbF9c# zwm{zcaptcb49{>HFe}7IkxMg*GlB`t@f}$E2GD#)^>5BR46}Kb2eo44?$WzPs3UIx z99eCH4VUbP=3I-3C2&1V&h6m_(Va>OjCs&vH)a8(A_(%^ozhVrnw<#VUQgqO9B=o18vlenAB}v{+NsX>ghIEQIf6CuJ4Z}d>ND(M{l z6}0r;GsNq0hwr{G`P&R~)|Q2E%Ri@2%-qISm){Qa0E^%5&Don*K1%KAKJzm!l*VBc z4ZJwuS^`sKy{^NO#)u7p(Y-6{=P6&CwV)lEfD*q+Tr+kQ7($4oSHOQ!dX~k0HJ#P7 z4y^%OfrQ@WJGTpyLrZiM08-|3H-@hx$rfRa!_`EFo+$QIMJVft`JV1N2A%OPaW+HD zik`4Z+kgBEkhZ{aw&?Cyds#R;aZodfXx1DoyA1&rLRZItQwK&4`>Hgp#@d{x=rR@D zSDOMaRKE+PWn#oYaa``}HrTg~oZndgmWnXSY?5)Dh^^#(Z zCH;H7kisD`w{)Lu7Yr~=2LC@LPNKxya2n&KZ(7OFwSZgqlb!hpUsHk{cAYc>2SDAf zO(Y|W>6l2Q7|&xogm-R;Cv)zKA$nIs{|tcdynVXLV&La5v***(L*T!uqZE z1xWIM^o)ZJDZY*z75eHTve_6qXTGTLlAA}C=C^_gv?F}E2BAW1Cr{e%a_45C>go^j6OzJ6YDoItJB&JTBk;`vPX*;hIWEWs@(L#r86*vhM z+vhMZG_|s-vAodcM^Gd(WM4Xu6POMMKjd=^DLcQXnJY{|EetRAHTlxfeESd#WyovEF6Ej5;>bP6L&uZ@#W?|rU@=O-bAtaeV;&1A`aJD z9`o>`DRS6YjwU1#)e^_0W^&Kc0Ccy)<6#m(IWXGIW(P`cxH2cVNnZ@|xK7{>N;u}s zrxfyfqpHV{ENPsvZ2Q~GA*t}Y{V8aebRfW9Ul!d_N#TKRBpe`6sjXcCpZ3~sQKojI zM#PY5Z$!kOWXGi*Hd!{PO>`Gr7W6$7FT6aQb!oU4uPL{IYi55EJb3NzZYy0+9Z*>W zH9?S5=s~`=GQwL@QT0h(RvqcypTlcG<JluNa3!{zvwk0$*&Gac`( zAXN`&r{12!z~#=s5glAXE67@gJ<+nS{ODGUg}PqmLi^bB4Vd^!k)(_BGZd)#adG4& z(F8{Pev%~}I4J2fF?*<4fw0K*@ljpoe9kJFT68-{YaxW&A8Ru0xhQ$f^h|PN#V%N6 zc~!>bkskc}igAo@i-w3iiyC!#p4Nh$KEYm;O+7q7m$z{FreB-SUXqP`p&M1wT#*>t zO310j8D+kq?*ho!G6w3TI*?FYR3a7Xgm({9u-T2>12hgPT5!^6ubFX1l&D9m-Knyb z{sCx>V=pMq^v1UeTtTxf5$>X{{aCa@8Q(X&nG8EAnF^OOGNmNzv7o~;c^pw(G5_to zWbFPnM(BhmvyDvisnzdl4`oejlSMpXu;b7bjRY=qfj_|KgcsJF{p!C0{ul**Zob+G zdb2*xII6~Hzx=8vFLDfUQ&-SoO~Ne^(tS4&GSfx^tAMU(RLI7jX$RP=$B0**z@rv9 z!p5k|Xy{Tx1^wg}=(McVAT!NCIQ?u~MV#{TaLf6qGgePMVcvYMWN7V$_iISk2hI$M0__t~3rP2YmLqU^zK&~*^1L-|$3mXxkdG?*EimLAh#YDg{neVSb&X}*^cC+BF8o2h#e zmY!k4%gC$GCoo+rnb1UV5$B$OTfc(TNzvC|0A0{%{LMA&%a0dLm$aENt%HtRu#%Zx zZ>)`<53@&#M&CKn42~GK`!HVt;)!rMI7tJ|tbjlyzQsu5gZ{f_i~r%}0kZ+=>bdH! zv=87=vA+Bslt29l93R0|9LlFf9{l8*=zD6Hh_<>}T^a#FXafmQwb?}s0@f@hs9{Yq zKE!n#4^QhvLZk6kYEISIBijk8WIHNY(A{A2_>Q|j`(EbIYR{WN*ku-N^-&HvqQ(Uf z+q9(0P{M{ox4nyD&{%tj{V1KiFLF+mIsFK_drGG$B|MAUNK-?`Ln?(OIK-RmbKEc% zqhFU;P2 z6A0;nN`xJ^n|YF~xlop{)#8siO^0V7*h8c6&-`usI*WBQb=o?$i9VivW(l6btON0@ zE2=sFDvhe_7jIj54cXDaelgnl(dQB__MF-a`_=qd&1q(7 z{2=C*DJ?H6TV>H|L|U{T>v)ie^+7LOz`1w#Xr3z(yuo?-@bsnziw@E z@p%Rp6J)5rkW@{Uo^G!Ys+p|5&QecD7M%s9veBIaTZ}R;4o-F~HE>%@)on<1p*E-I zUaD=c(P$=CO-cp%{a`4FV1zhQUmRglG;C16OHH-xh?bXn+JV%HbCkh?GGq$0iQFGp z+n*Q>a2?q#5~m0Fgt1u?J~ZWx`woV>Zi182gJN)M25bb=~+emn=fS3-5MX`tI z`9xsgiUCf);FFevsm{rG{c`^$@TidfvQI4L!F;&f9rJ)2lH@kKWi@y1tiySM4arhu z1}|G~iKJY{9!#kwUJFfbFUIExoB>8@m-WSqUKnWpm#0*uKU7p;FD$ZT-94StgJH4> zk5#150?tH$CeY;bXWYs`MCT7rhPB73<9BJ+=}aYO!ZHQ?{^buixYP*0XU{)1&iHZm zEm8w`7pLiFbb56neWauJvKpN$)F-TLHbyYHWMlOm?PrWmrXY-PBCxx#RXGkwri$;d z9$Md2u5T$|GZ6Qq#j;vLLi3f1X-yuuhEn(BzBjqmv(Zgc!-q+p57|3u-gF66D=*KE zAzI9pvcM^v2J}P)#b7bI0dPviq+Uxl;uNo`%1{Wax^P#spsZqNH;fZ#=E6X}r}ugU zFzkYHwZe*oICFzps|R<5{B#$12e<=t^Tr_RJW+8T9W3o8)O8Hzc0CZ1o0(MITqS6Y z<+STK1@Zunqru&W`SVK~5@vA^1U8qm%&L@WD_t4VgzKAe>^ms+&QxADC=A_Lhu^RWA#y1g9HNu7yc;p=W(7A0#dmeWBHc- zdReeEAHd?xx{6JJnWKEO#v3$P^Lo1jf!^QB>iT=OZIh`kLy-TUHWByBaCBO19SvO# zZjAd^F{6sD+#euycb+Q>hH`DyYoCWpIUFyy!{#3J9i|VvW)*-fYC_s8=>o)y=Lq>b z?oRr^UDC3V270>4KR4MkW6*_3>*s3wUD1K|pylbT9+&S#dZtpdXk|Tlg~cFaS!t7( zkSl_Tm`>lJ$XB6ugZ-|aa`y}n0n@uJ#o{d=7)x;5%QBbcfQ3R_TKAJ#nC(jiKTu&Z zw|8=Ok=tfz!z;5A4`P%SN2X2ou-`8^D4Be)RqlM0H};xtt9EfOc7RykLlZLz-UG!9 zK%tDG*uW-6-WNKIWfOg>VC@oGbf0EAe< z2vcW1CkwXy{ispQl#hc=ik~ucZ3%CveA!3i?Hsin(6LTHZ9ASt)N>%drY=SxLl$$0 z&)t5xOu6Z0fHc=5cgPt!m(Z%j9h16^fIh-iK_~b?eizo!iLoVJ7Tg0UWg`tzF|wY7 zqdCz^w?nc!j?5pbTDZnr*fk?e8R`dq)l^5$eC{7uj1wK8JCz|hob=c#U!Na_0~`i? zh00CWL*5+>!fDnoyXc}MmH48>tbsRy!f~=$3O6!!*)*hIE1}ygIIRv;`8JKG*Scc? z-YUDV7Ll)-^Zex{ZM{*D07O7ZdAsG8)SIu(5A}U3mDWtW>b-uOz>~^O=Y;So&~Evi zOVmW(lBDSclpIh(DPJFik0bTmn4D?As^vq$Y5lkVTB=(;Eek?YSH-R|O! zaV6}mw-izWYmxnw23%SS4EZMiWTTVTznrWO#xDQ=Ld40!aZ@UpIvE`-c)pVla%56O zrTed#m#bm$#i=3-Q>w36L0f$c-vU2>_LQQue{uB5Mhr{bqu0X9eih1`myT}Xm-#z0 zX-7a)W1#z#etfMCooO?1SxA9H|5P{S1AVedfrtg8OIhvKg_z0mnjF%U93{y1ndF|? zx=US9fhWhz%uLz0p@{XLc(KR5f1X;ws^Mh%mrJbFxZXVSpTX19frO(HFt&p-rV4f@?%(wz1ZzzWX~;6DjYg>MI~p{l##w>Y7p>` zbtC~g>E_18`lK`wA%9ee_#<@F0lr0LM_b=9q*|O}5~&Os&KRb&U&o>moKjr2;9JuS zX?h{J>mN{}sSrg=+7DIf2K)6q+_>q$XRuptv6<)RrYiO@eg735I%$Nc9}xi;BWP^CH;N9_LtBv`Lhu4#>*?`UAs!vOM` z^aRO$1AGctjqUl8qb^12O1T(ULGE_3{3aA_ZDIZKJ(2~bn=4+B&qs1^B;E4Ji4(du zwPQJc`MFx|fZuY&rM0f}seJ$4TgOZQx17m76e6N>2(6=5kg5`XYf0T?WvGuo4wk2! zmF#a(>!`?+C5DJlDrg3cC31DMW+E%)amJKcbC`jT;K{zHNX&11VB3*CVKuZqM*)dc zhiAOBVnf7y{q{48)T2ECTF^%NB)f~6TM3szI8UNwb_=!J@p|VO*SXs5dowquah&CO zaWJ%`NEz!I=&3Ly6}15F-Z0bQg-2!)a8-3u!$H@%iW!*vq;vO;g&>!+F%w2g+c=Bn zj#*+v&fJw{01v!{qQ>prSt=PQu9v18goY4_Gz@q0`si~5#b3kK(fmb_;&pR zD)*{6hZI;Z77Jb9w~N*fuMP{rgKzH_1BHk>w$jTchZJbq{My+9-KweOj6(YNp12X| zjONIY0o=Q1Aszc%VS0z(LCW5ow=06lDY9-(Rz+0ix^SPJt@q}Y0%;zf2I-ErrRQ%` z&sGQt%#XkwOpy~bTpSTK-fh3Wzt{(Zy98pE$y>*__AId8L%*Js6H|a$<&sNC2XE4%A`8?$)Q`r zL&G1}2{0M(n=&eBW0VuJDa+w>i72HEsMXv+$=P3YF`U@;M-`3sCzv5%Cm3xoXM(+Q zAZO}*uWBqaWr9C*RP_X!4v!?rV~&qbqcU#PrvGvsyoN;mqs+Vsa|0jEQGii4yuF>W zI)w?#`A`|=K-_lf8=C^P3vggXe--8P4T4U813=m8(#4)rmQ^q5@Tpu9DJ&Vc*h6?~ zWDafoC*8zx^}bS#?yC+05*V7mz}=v4%ElnsMBm_st4`d}eXjOe^}(OzMOs1*5#S2B z7)XMmuyGanT7r|X7a%urfR@66$IRv|QFrHPPjAXsDY89_tlJW*v2?p*NlP(;cYslg zbDw6=v#*%GnvLl&_z-H)nIJ}T)Kil1B_h?y*>3Hq6_Grm6JI(jg1F2P>rN58fVm2BX%yvVYL1ji=%F@u3mvT*+6q5_*;hUqlyRF z+N|*0=G4%3+0%nLr!5ROpiV3J3(jIwNx^Ec$6!Cqs+kDR+LEB<4hlFVL6|F-@HN)} z-=M^YSU#KDH2F&4<6Y;^S_lFTxh1}PmO4ma`Tz@M z4$`s?k$sDam17zB8G|bKWU`Gvuu&+;Zs@2x82l(>1L!A`my=;SGL0RGtYnSRwh7Q{ z89lWQ7nn{x@Of$$!j#JPX6>|tUvaZ`bR8C3(ZY^A2x2*L?z)0qo+lak_LVFv5%t_7X!c zUf-}P#67@?H#615ux~QFwMv{Mxwvrw&oPITOl&0=Vj?E!O_+sMm^?_ai(0h9VHK2km9h4I` zJS|$a%wG!ak@-k@o}Twx>~1u4DvW$YzP=iu`|7ZA699i{+-zQ_{jHO{irwL$QZ!)j zUr#ZousHIH5*fJ~tO_h32i^qV4CY>dc`8IW7A!{5FR4ItK&cTEt)ZGJ++O)8riUl7 zr0RJU4$zk*ZGye2_`7Vk-**{JY}|^*TX#eAd`{#4W$qZ6&t7TeZJDsC0~!rAabf$3 zS)4O_d>pNdJeugimO;j~x5@?N;TO1Ox9qYdC7BVq)U&3W?$MiL^nC};I9`9@p(Wt# zo0fo_g;6ukVTM549CKQIjr%VX**-}!k@i3+xW=LB+*o>h65-vY_px#FdcKxz-6~MT zUwBJg`xD@WO2g9f^jNkFqfgja&fJvj$Zf1Na71IO`e%yR!vfv_dOyCwqGVu^SP@YC zX@tva0n-*2XM*Ak{|AVGqN6;U{|qY!4)~Td2~Ad0O>z-N*{{mv0Whk>e=(W@4%a>W4EX=E67eCU$H_}C4v#w_=bzu)l(^kST%A4{d19&u~vgao({(dJT5uzTDClLSQZ*z?huZmFHcQIHhamG5UZ7OCBw`{Wms@Y2w z=nA>@f3s4(DsP)q;6-*UciCSsb^0KqNv@a4g)`VUMx0$qsCAW~mS&9>jdl5RmyZuY zocMvF7u$_Q=cG!f)m3iim9SUJAlrST2nDVd%L*j?>%t*;t}kVJf*l+BI0ic!W_1BZ+4ib+4lUT#H}+$~ zAzp9A1H|eBuFW{Y_q8-}f>9;V6yxWXaYV((Djb;5?Cpfr!NRWl%)a9-@1kb7wT@Y} zus+$jEWa7g(}ciSpU0ySOAEh~Eu%5JfN`#wQk|@S1dtmA!-SHGvoFO4duQSg9}d%Q zb5(e`0x#`G3~BB%@ode%^%e z!Gt%c?d9xRng$$~n$nZR%3yLAm8$fQ_?mA#6M8!&vvVJ{mY{CwkHSg+qXmuIn$99mn#y zHx(X{NiN_4lL3qY^FTFgo{dlh==Ip%&B36xpNJ4G96md(6Sh_kyjK)I`dnNvi2bJh z*@m2SdV8gf0f%sc`#lS=L?U=&QT`=wS)wg%#*kDHIQjmwbJ%*6Sl>kZ7VSB=c9JQU zGMa52kRaB#G3=9l_+`Agb&Q}Rn76G}N#SY~d0wt|B+P+7o8s?rb+%*-Z^+(}sAc(q zZ#Kdk(NGJ2%yv=AZ2kA0^u!8x2Tm!QVBnHF_K(q3Zm zlUKS^9m8Pnv)f-7s;My=4GB+yuMQxxRWX478lGH&gpxx6b&X%(+@+5X;;vxGs=pl; zDkiR8b8^7GFjjc}{#;WoW!XEY#kxw=NOUE# zvR@mtBC{GmttiJZ(bYvc3$PqP#Ix(94C(=8)Sau_OO{eXe*%MSBRsQ^{(Q&}j-L$K z7KR^!9)0eXF#YH$e)j%2R`vN{ey>>r`lgru4^0Jwk;~9s_=$Qr4_vZe-}YeQ8NuIM zXQ1>@ASr|RX8Ft85lJRf2}{sRh{h9uGJ^xcrn3eCcP2O?P)DR+KLdrY>Javko{MG4 z7NI&H`|gCv3rs2T4(;PZ>~n8_h%QWt>mzh*yqvK1cDy6IZA#ihimPps;~Xqg^>MM? zN5-TU;PY?q05L$$zb)*<*k1+~H!P2%D35B3X6N4ZUqf+#$6?ekS6ADbE0&qtC2HZOp)2>7`Fq2%h%t>7@-RW{~p@2n5 z_U}y8pg+l$OLL_Fw`txO!wS@!e?PA{g6G;oxV^ntNT0NQEsp-FmoPDwfGHhBkd^Xy zbtnz_>k*O-|9F3*o1612{#FzyT&=N#s>Up4U;oHA8c+-??6vKU%QXJ1znA$GTuNEf zyp5A=BL4oMEGW%RnHg;kt0*KTQazh=m%2}>tUxQ^ zW4yuiKMdmdz!3?tka@h@eeOMBVB%#vtV;Upwd~0rNR0;qpn6s!SM~YuW!an)Teon_ zUNw&@AAr%{tZw3Ef>2J%*GgP7I-vqqL#bI7&bOI6va(`0~)zw*5V`~qZX+Rs9 z0GEIrkAg*2HDSl0_u$YX{A?}&|3X5E!9Qz4uCLuUrkv<2LSXYKi-bIc=fO>A{ElN2 z&u{vM45NSkp28h_z#lA=6UOf8lcsWgFwh5O6z1k{7!7v9E$z#o!+WCoqf4Pol zT4cZ*Wpjfw*%AG8hA7O*r^-`2I)tuzR}q_#R_s9H?JH`2w-_3-+EvJ^$*guaU8XBD zJq2+CHG<6^3N|VHI2bD~`7A$@w28nSt9SrDwZSBW4)???8<1ZJ_M9UT#eTqVJ-{{S z%_~b5aWQ+?l_*KXti_UhE-0VRCeJ!u`Im z+GG1oRQg}R5opYd8?e4`Z~4c5PD?xev*5nlsHrFhTL(kx1n0OI8RSf>!;U=Neu%l% zxy?u^d0_v-7(!i*iGaIYRCeKTOZdW~@U8{c@DEDADr;Av##@u5{hgFr{_)B^*^6-# z@?_)}Q9v?ao_yk{SUbeKe&J>*fjo*LxwAw&WcbK2F59Z!lsN)#x02l#+2i;`@?T?x zteGQLo>ULO)pR^yi8myN*4)3+9dI0<(=fc|@6oBu4rC;gJMn{K*FxYJbdJE4Slh5{ z1{ya|d$2*W_i*f?>iETphPnS_tFH$INJ$5~EQ|j2%C&ZcS-)B}ya1Gq;cbf_x7-Jq z$CXL8mqHe>h;5kgPoZ{|@HpL3lTi@e9#3-sTGTlY+-vD*sw8N7f&;F)xqz&fTnVrt z#7c$dJQOGHbh@7hN@d}XadPqY)Xf&a8F+577khH-tmz1Bo%kf!$Xk-Z+i~tTJ>K z6}hP@+P@;Xan^|NbY93IP?*`8dOF{7eI>qu=mPB*A#>@j*&xV@taf+mxegg6K%20e ziI4`8D;fsS_aEar=&4KH1_bwPX$-XL-mw>FOK&QjIUsa)WFc_kP{-Oh?Rj9C0*0_toF zVjCXfN%{I?*%|?8*}HFoD(mO-BGeyG>oY2Z2Z35nrop%Sj#1*Q^dcT@%M~uMp$jh( z^-O%tFO|ZccQ6#>Yn^lu%xgAt+vy`a1-LhkMidX(SZJ=d1zX>b|17rX!pVnj5)%l> zZmeNu*F0%_jrl)x>4Gb1GfrL21i&URWdenTmR7HNta#cR)NaCj(5-JQ@Fb~o?7~&W zKBUNN1!jlWy|{Z%w~E%`euG67@AyN_5J^$Gumc$GuD(~`V|%^typDO#i5bO=5O7$p zNX8{_r99mG00iu)TbFAjewzOo`Yg_~iQ6D(3cgz2~oFS9FB_yhF2VsS_&G@c9!C;s#un|MIwJD7B} zzN$pdcO$JSF$Ic2(D?}PNXxVMu&nycPP{72U1004R%>{naWR`e9wmn9zJA9wuJ5%% zw7TAfyJ&R)1cz^6FNVBWUPa^(PpHwYjxcC_8K)veQBIGDd;3`U5a11)s7K@xc{%>S z9Z43O^dP)4Sn4KsHpff(o*M~ZTJkdIL&m(k)dvt*&OMJ$@LndpLpH{5$;-yj!N`xc zk2wr)WO(~RWzG0NXK}I~>wdiA2#kS+o2=Hu2NP!F$RGXAneAKj&x6*FnvLD(jIV5Q z9pkuc;ww*N#ym8QTXJ{+`e2=#{01kc^!wSfR0M{Y)rj+5r=;Y0&dTxOcYBymfuqx% zXR*B3z{uNIk0IK_?lXNp=kXdaE$ObkESb%L|LZTF*3p%pT^e;e=ruKqEW#PS_{h^= zju;9P#|33Q@WBt~0WV;NI5(Nm0dd^j2dnp5Oi>n^dL5HhHJVR)2McL=O$~k2^xs@g z#K%BP@*IeCo0rFR{biwb2UpYiFdv)dy+)=IV7t z5>t!(6R_rZ)cx>hVTNB*E%9~pO_gEB3F>7Hq$?q_%_*Sl`=5)WYo>bCViHp`-LXkZ z!N7mg1{BRGKDi6{ zmxcHF^?46+i*)Sl>gEUqzERGaQzPL+Ws)?LoE#pWfcxG&$!3HG?i9s6jI2l+2FQZ{ zsTD%0=jkvIvMBF|61RhLCCB=*B_ESLj#n0rZQyG}pdeFUN7~m+d%%ZtieX2qV_Q+M zz55+^=?HoB0FoI?B%tllTh2Sq$!K}GUM2$ zbjv9gOM3`O$f%>@0)&dU?r8SB52j>FxO2`It-MA)8#I5p zAGI>c9gVe<5XPv>(mw>Npo8j(fZl?XglQbRhQha^hY6kCXaHmp^kiaeJZc?CFnQR> zgB~rnn2Fbm$_zM>pQ#{)Gtti%_~)F%?x3^yajSl0i+I0}FBWEEBnV7ijeaT3@1Lr@ z+lr*aN7O}0Nr1x@#j{k&F_3GY4P)@6&*jb>U8kKFONKht686A=GUk)MWggw=hWQk_ zSfsA?Jxk|Z>jn-El5lQE7dljF=6QHF)Yw1<*I%A4+>3L}>R`AJc*tJXitpdb)7I1~ z%j8=2whT>Bnr5vcgC4Jv8Ic3@*QN+&fD}w1Wln)S>MvVLEbKc*Yo)$U3v^FLF%~C7(iw{L8kh8*t6_b@i}NT?9llGil${v%5j@oxev#>*&=yo4 z7Qcq*K6N(4#@Q%3H#zkcfEz|HI{(B=aAg7M8V!*gq7}TmL4n^o2ZS#dH%JQA|(XWq|1kJ4;+o{}7Xj!|oiSb&G@**{2W%&oOUPi^* zhV11i5ZYZPRPi7waGK<6?@R-qa=9(M^ljS_P&-+<)4O@nMBB`FM3we`8UK0ImW08r zR329m=8XI(enUR@fhEwy?BgDtK@hiKM3&3nKIas8;#@m=)OTcOt&m}%dkwI>!%|j! z(qn*}a9i!;^y@a=d0==l*bTj!9LO!SDJH z4mq{McTzr5uCwx?#QY}ifp4I|IcW$s_fieB`Wfc1*9j&R{Y^rId5TyP=!&z z&gdLKL<=Mk@k(@4!?g5PckTmQHTbwdrNSUU#~WDH%>y1?%n?kVWD?Hy^ycR`M*8~x zI}8FT7?%?q%4EgY7}aULVVy>teW{&$y0t75Lv;e-&Ly4OP>d-8&CR7R6`)o+B`cqP z6cPB+701$8FPc~j+I-ZsJ#C^42u=pvaSe8#pY*49Qm*4```loJxX;oksVE0ln_8z%G&XHeFwiue^MiQ%_y_dwLT zEi3;Z$!hmtXq3=$FJT8#5hK?iZ>Ss16vaRSfAe-5r0i zwBuVAEIzITL&RVgiKhj()|sUnhg3YUX>YMXi|;aOOzJb`Wk*+`y&uosL98mvSU7)` zca?Bg|87ihK-Cqd$UpMgPs-+f6|4!1+T=A_y`-J##*px)-Rvk|fxVuHMzqQOurd~Ju^%8hHY%kDros_Z$ z;D1OI*{ee%RYl3r-?b_3a-mfqbD ziAri)#z` zUon5eH~>=CYv8`bO|Xh#It1e8(JmhS;LkFP!DUf%P!Xoh^=+wx)>^9zEC36z^%=Mg zdD-gy8aa=%a=;;04*s^0{;>HOdqX|8*P235nRHm4I_GP&+Gn(Fhur09w|Fz_1#H&{ zE6%Li$Pz!ge$)>Kh%yHTDDsk5jI6WUJpF1ERvcjvf_2@t`a9fIEKrbMMiTX3dhn%o4MpJrp#3TraHME=TU74ecrP#nAYlERG5dHMb4nv~D-Mv*A ztNpZrO!}SVVMMBF%n#3o+_j>vUo6H`Hr0|hL8J+JC=YmU=9Jn+UVZZE!}v7pjYirx zg>foj_4ma8Hbc3q=sM;6|KAPPdl1X<=u4HO6Ui@~Pbx-?5ZBro1MNXDD}Gk>n40+Q z({_3y*vf@ z=p)BfjU>*hM+I{9K*iw(55DwfTVgn&pfPAhTJIb?BBW53QJGx){#cp306iqmzG%;$ z?dkEZ_qNu3q2&x`og`ITAoiKRi#8#x?RYA(7@m%+2Ieo^3wmX8xTXYh&P2&zXboMi z-+9pWvX*t+vM=J)~u)`Y*(QO*({H0)%<*r!I% zoyW6x1jFul(n)vx0i-L3`<-67{%)wIwt-FyUt?kh7>V*icS`fX*};m%5j0ot7%r&k zE6`9IEG}P=Q7maB@L~hrP}tsQaP$9T)S{1D*uPymmXg&n#1NK11K`p((8|L<6z}4r z$>6oxMko4sc-js$>EK-8mncni%o6jfOpPs#~)un*k8MvifL>fiA5ABeSw zt6R4hYOL{=sz!1^m-|dE*D?Oae2cN7OmoCsqXscWOl~J@gjpE$`~w9aN37v{SWQb5w1GmI|s0b&UTs9W4$)#8J4)R%1xuF`p+n zesnB7VDmnJK&Elst z7=s%=e%SUBBRUA$Idul=19`@V_r=%u8{06-e>0y0IJMrZ%gytcIJxJxzv zML_3}>DkfLMEO3J^pfY03vqIo6HgDxG3_G+H7_~Y$Jb59w%q(PfywGJSTF&en-k~T zBxWRxv@TNgF%6fzW$W%>Tqqo=pP?K&<6)A9U0)uCMYrLmVRkDb>+$KmyuhYY3P4 z$mSHeNS5}cRF-uARO_T|`9@vlO9L$%1&C75W|)3L5HG1OA~D^8e=Ztpi(?>|lKI%p zo1I#W%Kt-=1Z8hTe3;LsS(pd8c4O&;cQZ@D$OY`5L>8RZboU9l1!38A+Zn+vl6GW_ z`J`3@RK$4gf2`d7Rt*@-@iM2c+6utPkXUPkFJEv9;`%=m=b8|R2h$PmHR-lQDfupx z4*~!xZFGu@cvFsiouz%f^OQh{*+o}4sa3>EYyV`gW^Yz==zV4vfV;Ku^?Wb>>sW3#J>Ww zlpE$0>P=yece7wX<*^mHx$U~JReRwH+-Jiy9 zEZpviZ_kFALIFqTt3djO6Iah7#4+q7iFZKsv$b#K3*X6_REu7$W!`KjVYoNdYH{S8 zk`y+^P#8b(rnCwlr$V#YnQKvFWg~e?ieNw~&W`8o9N+iFKV$h!ZJ(qpeRw$Mdi+(q z4M^gdx2pD)D_hRj#%xak*>_c@pC#sqeR|qg3e}{0{}z$iQ4i^MZ6~#Pl0HTkO)e|p z?AZ11YHk0NzwslevpO^B?4x34p{O|ysBFU4qqq*X>zWyet1PbNdD>$Ydk;CY1+!4j zP*3?7`}e`KF_FCr6F1yU)GbFTO*(%N?m$t#Kh-y5IVe*`AJGtQ#skXz0K#~qXR%-&{z;+#ogHx8TT?*-Lcbe;}Ck!biuSO87;)errH*N=O zE;p<1t8$bGT5J(hU7M7t!{^_A8()Af2soKh!Z%|Sf||Ba&IK_o(M{0{PY@%^yfL7_ zaF>Rs;VcxrP>Z1fGW5f;V<%;BAL>#LS?x5U6)t(IPgi5Y2;G@Uek}$Ntsms7bOnIL zJ&JrnCe*(~C;+YmdGOiCFZ3*o<*?bz21_||!r)$HcuC8x!Y})9WTNlSBekGfzf@WM zvDm_<3d0U|D{n;w1AzbcF>zDQLIwW9^NLEiA}m zo(!wmjE7xtVIh3y3yd$WUrM0b9jGPNONQm1NJM2dMJ9RKSi>D1&(wbG}a1Q?$K(&)e#Hl z!PZej?DVpSQ>5_ncHtv!Ln6LE?&T1#at_KtE%MMG7O3a^9nn@1aD`R*0`nL4q~;!z zfB8Uy5Ho0VA3o5`Y@}G&$oUewi3bs1wf`bZWk8R2fWhaXW2?oqMm-L&fTVDk9kp|d zREEs>58KV|Gl$uNh1n?7b4Ngn{K`LRYQK|xCoQ;}ksw&v`>8?LX=#6z>$6=zHHj_7 zHpZ$|t-*N%{-A@Beg)qq{ zn{=UO|3M(0{gzPE%e4ya8{M%fhkp5%t^mt7GS1%n>qi3vFnR+Z<1Vlc*pCjjA=NA* zR-;{R&kUN?#0fZ_4vO$~W0gEyo^-Whnf5zyt(~R`5VWN-H$`}8Jadmn@9eJ4zSE|% zRsDpJ7H5zTw;U41<_5ozx5v=I4A#h}GJ8U07YN496VoW&SIwbCaCCDXUbOC~CfGh% z-GST^kQ-=)^~4WXB|WlySKvl;h;^Uh!uQ$)TEUG)x9+a;DLrL%BK1qqG3sou<^e2? zNlaR?!+(5&!~KsHG={{T;FODAe#zR|b8S%E7}LQ}WzkQ9db|R}B}DdP(!c{ptgV%f zEFYOk7>fl3fvh$0vG^m~;3o<|^zMaqfgXGFsPNOgRW=^~@B#TMf?Z#99CZA((jTW! zz$vX$*};2ID3)!dk0W_wckow=IJM^9hoe02flJL*3wq^iigY)ev~C~U-ioLiW?R>d z!1`t;%vFUgI*TJqnmrx`8HRK$J!YOqA>pXb90PNN$g4+IN3u^s07gEG4I|I_9ymUY zSrnt&$=E@!Mda(xzyN~tbjM|uTfLei3Sz-hTpA(*);`3KRTI}QrK@HOo~;23X;9< zmO!!;TX_57h7wxs-!J@e6Ac6AkpON;J`i)0NXD&xvmy4XXxd4)${$jYr-J8MOW~5q zl0YfpUo{$BgQ{NaeIsNR?@%Aq+-%LC%EtMw%MIk%f_X6_dKkr}p^ssU^~Ix_TAG_W zwUvkA!yFn?ur8g}Pzm5OyUND4odt!-^hg$8qfd(;mujWRW|hj=NY&m@)Utd#022z-m$} z+&$S^?O~4(@roXr?pYTxAU%S_OKO{|k}Ra`f~gg888z+wdwE7p68_YqQ(OH0WLS>CBs^AGCo&q=d+$ zDj6$;$R-m>TR_YES~c~O`>6`*4~G{pKbR*fb5Ac#7 z@PxcRh*hBay+qdE+|SFQjhL^~FJvTpp4%Vo$S|gea_=~gT@vy| zRANsm2Y2gcEVXOkU|!JUlc#AOgjUYdsyuY{KKggD%V8(+s6?ka`Bd^S{^J6Jm5x;1 zjws=HG#cgF^AJ|B?z=evj2V3t-6kL&^!)pY2(h1E;6L0B5P@;Yn&y9}Po}5vIxV^j z;S2+iLGB-`-K(q3v3IB@QDCJm)&Y-6G#GSi&V0&)>hME#`qxn zCm67_=MPjqD^;5d zuEX3ks4`_!C&iM2c4iPF7#V1Ap?8OCw?ri08&A(~KMps7@@>gGz{J%2MkIIda)Lur zeAF`=Z3JAow)X4M^`)i_E&{$#m zRh#DZ_0>PQP|XTjc8Luo6<|hS;K01%1#lN5`%kWbJ_aA1nZJPIJg{MN`KUwvhr&_;}UMUXaCv(hxD>Q8BD(# z#%yb4s|`DV`l8iGzZzyqf@m7M?G82n$KS(sm-d2QjK%fy)x5=#unyvrYNr-2=0F!- zY9-`OW6P_-#P0*_;V0hWaQcbIJ;b8ez=DT9del^1pL>O0NE$pZ4?e+?nh5zadb*GU zA?i(zN8(Yb?JA)5amekQO}@zGAQgne8;mews%*hpCA=!yQXF z$n0s`zO{S+2V&j>${o!!pq(Q^X53%oG}y)mEl=Y*a&zcHzaZpYTj9!)?}#XHn$oIZ zB@1`_&!wF;$baGQ@Z3!JOM5V2vwTp$-1A2tyN4&*9r-M{pgr@B%60pUSm7&Sht;%T z1LBB(B8_64D_Z;IXD(P;&@B!Dmp)SHqR>>ffl~)#&ve_neWJME+KBiFB`g*9W1fc3 zOoWPVFKmRXA^4RWvy$6%3>wsEQK6dc)*C9~sP$aDL7y%Rd}%lre(dKW?6v3b+J=)} z+Ba^INNW8LOh2s`|20o=qav&KlD|P|7QI$tNli^gPYFj7AR{-lU;UkDSI+Pxs1B* zrXq1I4^~#ws29=cb@B#ROW+Gu_n%t^6`GbPh$uWH*>P%WHwmZ0Wp}nhY4XbnpZ+_e zn&vB50p`-9%yad&>2CN+{vUB>~5%+2i+?#kq3%(>^jF10* z_>Z`aQf3PIo=w*P)iF{R^HUN&($U=KLs9 z9`}PZEu@TFd@kuFj^lr8n#JN8AMJjQ|9e4`q z)5lDg1NTM(V+!+OixHY$_ND~yN*;`WzZUp<#$9u_kVl7X<74zQoehHe>XrJ7THi7Y zkwfr}Gti;Vo~LjO6f9R7%}JGxg2d(aGfXh_a32g7L$OHc^G4j&%1JM^Gg8&kIO#r@ zL3>EioRXnCFQqg6)g$9j6?E|ON}3~za;M*kA3y+|@>(_E8M|{R64stGklvSF`sxPMTbW zqrL!+eJKrSjdt*lQN)G6wS6_m@(^zi@^A#QVYK6pJvz+vsO&SfBL#_)VDfd0u2LN*f0`#T z?5GPn@n_ZNF?R%?J~Pew>1yw#riQ}hD+b540g50^T%3^`!*K?_r5vC#p_}7~NmdSd zhTFB>BU&%&a6aMNCHqS+1ep6wMNk+&A8ciF*Ca|zxQY2U5qCCGRS^a-M{vBn{R5;T zqW?zkKyRZl!Z7BU5shr^w8rNvH$hVZZk-%m8gQ+WKGyw?m}#i+8qNSwq7ROimD5(ULyXO1zQ3 z6Gh_U6`3L>Ku{<%{M$|d!(T0wwv zUlrRgU9WFJjbJ;a3&kL(hK2Y*)&C7IZ@Jp=C#l9HKz3U+K)SE@1mRa^9tvW_Jn9?u zES(sg1|q%4zPS9JXgxtW}ir-PbO$;YFGtgQvw z@T;B^T@;*S{_~-p-Uo1Tgyqd6*8YB97DJyC;O;n#I!i0R^oWY$MO{IT} z(}%{&Oh`k?;baE3js_(2tpBuz^$~=g(QzZ0rz(`H%JPCQC?$Oa-&AjllP{;P9Vl+S zWk1$LnZ3Q;%_e>Xghnv^Ho6^yd!U@P`47HBN>5al62$6k94NC6gSKUJ%zVUFT6)uw z{{W|)-$ME~QhxAnN@y9|CbQ6l(hw6OQ*acL9q<%tUKmT&^gVN4dTWb|3D49{ByT{;f6FH~1zRnmj zIMpLYo=K4my_U>}it+9#@pz?~30wq&x;7$e4meF!9phl8VpSy}pg}g%nHqogLB{&< z;SCVmSyfL!)|lcs^#*dbceX>%sh5q>jHfa($?04EO~s&JOuftZ@~>)lCF^^Uod zQB=fzc6+rjWnP!k56j9-x*Q(KE=DoOye|+J+Jn_ep}XXLlDL88Z?tIKsB)&j(sBz# zV>R1$us1VM<_L=eEW5!6oyJgJJ?!^EMj>TO`+{^=$doF)RIAMh z%@k3!Dph*-DvKyZHc{*dzr2NwrZ9g+qYjE{wW~r^@TmzRf8XN_!W1QAdgV_)-~iJX z$nUP~c2>VkRA&tbC`)~oP4!4BUo?TGgKuo5zjG_QRez)E@i7lh_0)rZttR>7EX)rs z*&8SF*fJ13Nk|K$qTc<9g)!w8^3b4>XNX5pqD#q(&EpFEK6WZloEiSX6BN zH&g7To*lQYUFGODaY^1o-M7lchBp4wnMS=K za`RM1lQ0-I+1e04XH8|mNY#gA z|A@66lMJbW8HK0pyCpXsu1iW6@Em_wLmIYc-8D|tDw1n%;f8h4PKL++tb&|vs&koRHB1q8T5Wv{iD@)>+p=wbhrV5eZP?2)Xleh-wcHh z5xYuA~STv9TeC(4C2QvwOoo&G^IJf0? z2KoVsQ+r+QBC9xc6eZ`a6K=;#+Q>M(K^M0cw>k@jbIRVQ^rk~sE-oAs`Vx_s^swl8p2SVZHmyUnY|k`Bb+ zXUpUG1WA!&%EJaoNYzI*UPgQ`{yB`D>{qjR4LKkyxvKa{fXW zML>#_YdAFnWGfBk>$eJtTMG~*%adwZaREaI*z*NHI6 zH)aF~)r8yup8G@f7U5_?2rbM_OvJEo)%(fdxyZ_TZ2UR_;w>mLUuX3cXe-|tM6sa~ zaO~mw5aQn%o_IA4Nifbj$$j0PGqci9@b4oJ2`G?zb?pbjfAFko(c{qpfF#dDOS-yB zB+voMaAwhvL6gmACM)w`p?sxOi7Jw(1hzkgu$3u-Zr@$TNLbt8EC_&1)Cgn|cPyOp z*@5!J^3#zJo4E0Exr2oL-&j&6Msyt>#o=PU0~h~Z-{3$kf%8sk@K<+XvK30@;~s*f zHI7fG%hiZJH*^?rsSQIFnLwdE=yop_i|*l&x=%_*v`(K-TSrnOp=HOG58|#_#+r zG1}|HF3Q&@0K|R2EH6;8in6x5y|>x)%#*PRpx+D^Yo->g2aamRTv=8+Ce@4ps%VBK zNi$dlA&*eIf@Z;(36*(T55omLCp{~}>4n?5xr{7$-B5IyWNkll_YSu}E6k2;`hq6r z7V8V_-V2R$Gb_y9ev%>UVoSaT#mI%+KiYlm9^ug%SAyb}igiI{b%OMk6as1yV0sP6 zi8eNU!M+u<{tuk}q&Z2Yq4o_q0Gw`Csd6_71l!EyyS_q(R^ae-xjne1S?CyKW+Nu^ z(jbFKZ;qB!({67NU=g}+<77H3cz6O>B1mD7`1@EJs=C9f#_%=!e4q6?scC?~2;NL7 zdk%piVa0=9FE^{ddSj1n(q9-;HZ14mu|hMZW#B`;Gs^mju0Ib}9*1qhoZV@}$GmrZl-JaV@X_2h0X!Jzv@LK1kTNVTbFCL@2Sr^`l$63UYIe9ns8|lk?(~20Cab~smvT2H;LpzuY_~x+e>3c z@oe|O3r|&ROA75=^TrHbJ}dRm{lh~Zv1K@SL@!61*HLmiVB#Q`3Xn*mM~lmwG)#Pb zhsXoHpWRf+vMn$V5sfm*OJ-~w`GqeT3cZ?C)yqA>!R~HQMpt&3EdDQ4I|o3rPz);n z?wkcoTC}pWGf`2hfPVpU9=lHV`uYdR1X~>om5aP9B>TnTLkQ=RBCfNOJjH))#$Vx`13klC(ia+y z${oPyY$Ra+`X0NMHv$S_?q`clq%UNM88T=5Q`L{D{KfqtsEM{U9I#G>$uAtF8&X8e za=Qam zZq&Sj7_~}BTi9$nLwbgP>{&ukrrvU{PwFtR#*bBqh<44h1oG%h5>&xvBbsU$Ak|?? zN$6eKT+aYCQ-BD|AfhTMD9R=;64KbpHI{BBZgRJo7`GsoTrzN_(@VRJ7T3b=_*G}9 zJ%YhD!+9YB1N3?6FxaNxC7ffNQsLViA=^78)O#;KHL!jTx~|@Zc57ujh1nKPA2IKL zOI?9fqFz1^PEbC zwICSyWrx*WXXNmlz`OyOn7mqf6#qVa!a#v2j+6JD?HVC&MWnrpnZN!V{wvrt@0_0+PG$q zaw{>AGdbc8xocO%{bvT7DAR^0q+=BP(&W;XnAR+s$b%^d9O~2Scrfkv6)5y&F4k;( ztOHJEd5dM)l@cW7!;BfjV&$1`K(3E`{wH|J8x$1=g1d~kUg)X^fd;Zoa=uv-gZeh? zZa@?s2&;vDHBZ^D$ZNJCPnybeR6NZ*y3Nfn6>ToaRoKzeOzy;UblkiT_v6roQvjC8 z6q)N+4djUlribkJfDj+fh&RngTdG4lqc<>FitLAo@Osq*Z@tOwjH-Ee`Ms&FA<|&q z1NOfHC@hz}kc8zd@{*Z{2C9v#17HrH&I0fpw-YIu+=*fqHIF9$g@SgAilaR`5fV)($IYLWkyl!Cbc(~>mt8S<7V}2e!nQ{z`>Hy^CEqL!;yc45!Vtv=1(LFiW~3bI57J>V!-~M zoWfLQPnDj$wO-y)x!|F$_0m>s zbyMdA&nuiBmCcy5#l*utnXh>Sn-4)aKmwj`F(>JXat4 zr{t@-mmt>5jfBV31ZDn$*zB}Y$?>dDY5t)mkYqItE`F(Lem+R!rqxaT`h%?s6C4xJ zOXXN=Kcd=>BKc+J*#r#h-wayzw8L%z_z_Q1h^?zd)H*a#lv z8~L{%%^g@!mP!^PwITMsqs7j>2$>`e*c~=NbfCMygAnUZ5839~pU<(1!WQU+*i- zGw?;VIlMqIxw~(w{(z8&_WM4z1XQO(vdKdLOJ8Ens|PeN8?J@A2p7XU@0ron^92|p z3FGW=;nD{ClK*_Co(4^+%A0YNZ;l2S)rL8QztTG6Dy_V-$VQ1kGnVAfWj*}9ZTx9)&lnQqk<7H4 z5DV;1tF|0YQQ6Gp)-uRak=RN9uzIj#>r3@!4R(~g3HqQv7FInjA&pqx7~-PezMnO7 z5LM=cuRiXs2IG_kYSdv{e8B&W&OUBa5vDHBXumq&ZW3`@Z{+eN?ZkCn_aPGmK>Sb| z7$I4S1G{5cMo5xmevJOaN*<2!@nE~9K16!aOK*bjs6I*b!V^PMLinh|-Cp%P1RJOr zjl}X5qGe`1Vb-1b{4()SUvE&Sa^Xico4i6{rSrWA{c03OW4+PlZYf1)%%pJg?CEy| zs^#Nslc|CoSJ0hIqaCIwP_h{65n3|4i+2*{U%3Pd5f{{Y)2yd$ifHWwYDYaXkyAV=EYfL&C-zn98>KJ#|tYd~gs@p>lsHOo#`ba-hP2o?jIz!f81VsecqDi|!b6P$n^6A$lPp)r^nD$vW<&k<>+E(4WI-1xm>1*qP_q-F2;E3`7kcqZ<&R zB$MmJgvz55a9M{cj8uL5*>r2;>X)h9ECw;vZmOD2VdK$Lnx&B{E?DQLLEnq0Kj7t{ zxLf2Rem*l;>#r^sD=OGt1mVljyC*^zr$WVaYTtX3^C(xMu@s=|xG4vMhXB?h8bA$@ z;S2)Q8gp1xX~&NxGn|w5n`wXo#s~Ei-0)EceBf~^0w-}%pTZ~i(C>w#6?}Q%Tfb$1~AFM%~X0-Fc7#~7E`ScS`3cjo~ z6%s_Udy!aj3?fPGB0tD49Z7!JhlByON!op6LYt=HAE@;1Dg z^nBii!;Ha);SVf7)K6#!{cH5nK!v732R78Q#F{t=smvW|v4X+&+}f1~HmsEf=>vS+ z{`h^e%~bk23Cdyen5B=P8rXW?KoO+Z^}mx0M*Djj*Jewpr8k+$^wshR0RW&8o+EhD z!UKFkETOG^cUn{g10@#n#P2eZwEceE?h(3{VkL38e(cqLjd57I$R8({N}#%tcN-am zR)V1JadKQG97VE(>$*Q8AC^odf&ov~ivDDuCf*zSh5|PH7dF_>3o6jAaJT%W2xvxcCJqhk;V%}(%@woSH4TL%gkJFW~+?ea)s zs9P6egjbzcGxn)?b8U%CE|x_IhO1!gME>k0$sKMD0vCv@@BPsU8^D_s{>kFgJWTFo z=&5zoHHFN_SUtjr0{Qb>;}vibd0j4+MN17*>Yg(Wu%Yna2R_u8w)ldTzQCuF zIc)C)Zz?LKJ(*P>BX7Zp!GK19$Oef_@r5>hE<2oNlFydY)Khh~Ot zTk^Jd93E4=P^7Pa%PS3dLE{MCn(TGJ8 zT9#$>zkeT^zj;`)XhM#}4VAKrvV7r{Bq{rkc|F*V zG^P_gk{G7a2o09nFjqb)l2D)kh%6Ucbb%KWo5uZOAJ@W6q~Mm#pl(K;yq2 zzsP^~W&)|flL^b;2n zDtfDzw`_p)icCO=(#$Y>QhJCIUs{YNneD)b)CWf%^8EiS_)oUqgNY-BSoxmkga?AA zsjT$HgA2pCjnmvKtpS^DNB*nURqSbT4qjFHSFS4+<5FlRIl{KS!n)VGK-afz|pmBHnKA?M%lVZz0!4cV_Vbm9S}#I z0bGXa`!X}0W3PL1b4X&OdSW9zNUF@M*Zjh2yr{4Hsy$T;dQr&0AG4avVi5}{pE75x z|L>sIkUmJuD_8VUGxJ@+g>EM+&R#JhI82z~tsBBM*-~MZ3fIRRWfFDMl86@~cn;e7 zrg>I3j<9QLT+I%t*Vj>6VGqFQw@28Z&b@x1)=~gg{{s#-%*Y*xsobKFy4RL^kPaPr zy%M1eVK+3*Zy&5RXIlzqVbK&D>snTCqg^y1d`HQhORXcn=Od{`G^AS9fwjItw^k{B z0TfeE?%Wy5Z$qh^sFrK>vo-@NX zCk)9s)sY!K^3;>kdR_lELT3=BPC_c)QHAYi}CCh6+7fe8^BC>D(uMj z5wxUBa2sBfTj?A<_01T{;tX8ZD4Js8CawT=C-7UqoejizwL-A3#doUCD3Szy-lclM zuVSm0PT^%RlibN0KG`FWD#%Ha(2?1^k=N-$R%&Ro>as4aDgpve0Q=BT)Q<@)ZdK!m zoWkx)yf-CN+LFOAyk%Z(0edP=5G2%2>{_27pW3J?fqQ)F@K$4N5%`%Jk-ZQ|;z~nv zaI{X|4W3dM0gt5nxgr~Uf&s+C&dB3`axIS!!W9UjOa{eNikb8G!}MBIM>;f?DA5U1 zyVagay8yZZC1NR<+e$mx4dzmKU2KZ;qZC(%5>08&71g!Hc*yr$w@9<8*cmXVjOzbbe=G9yL8&K@ zrW5NSrJT@mY&?upYad6$*h^;!XBdMOEy2 za2qYy5^^$7A3>`PkHoSw%CH)dQk@`p?s+R`!EhCIXIiT(AsC>Z&>q+)-!#dn!kqSx zBT|0RQdRMSe5A{9fK*sIG(WKuaN!7?!Y-Z6a+#O5ZK@>^z}G`$Z(30$oAGfmfUJlu z@!_G0VMeN6hAW?>K}MBp)MM{kc1O)&bQ6CQX0Bd3nr0hpY;Ax0}Ty5JLQ+HuPaY^Z?^y9qoiHB>A_V5v5GZF%&{Qz(9tp~d%(xZ->WnGYR;MGQ^n`V@xwDvmWYbDje&oskK z*u4KJ%nn7WiP)%#7X9bE37{T{tcYL7qa|@gvVnm6%A=Bn&E?%rg^Pcik$I#Uoj2#b zYyl@%R6E5z7S!BvyrtV@! zS(*RhXcSziW;cpI>?`{XC0RsEt5FC#GIb0l-Jod;s_-2(%+U$r@BJjwTAouXK>dT& zgzg-m#B+7lESp)w3TM6Xqs^QzXIhN}k)fVBpp_Sn)2lksZ6nPg*}Z3NOlIR`=bese zF-Wb?dT5q#F|;9c7TMbdv4I*oogjwyeU5P%8mgM~izg(f|EVA(Idj{Y3Ojh#5QJHi z164~Q+yGll#tB!po!JB_Mo`@IFw!EEC>}Aj;9UX{I98(lAIiCR;LZn-`b54y&}T+J zlU~dmF{sOo-^x6l)Jmj=c?(s;qbIF~jo#Y+k_ktYpqtPX=zZuL8JMlw7r_PeC` z==o&&l9rRJn7DdaD4q&$oB-=&Aeo=W^o|!N^7YM!XN@_=JFEx+4E!NNEM=zQl9qwgPI5aHU8sr3%sCTPNUd1=Pq0cz+ok)P2?;a13uR>zWRY7ULa*C zeCeQ@;9kln^jxhUmw57nKmWbS+%(!i0LlG^aY?gXJl28jexcX^#afo!UMtbbN&*t* zMb_jys#b9zs1QGw*pgYlV_6Tr1}*p7MI-$>Q$imIZa)BlhCQI`^R=olvtqsf1}e>G z+(?Ng$cBUj*3t|nKeOKK+CR!0TIbz(Nx$CI-gbJ7Hl>O!=TUoWrEsr(D*0@FwW=e|7b3YcUD zLTp5l+q-K=-9r|@eODI9D`Pg!X)ZV?=`%XEg~Yj_o1?0M{1d!tiI@2raXv(O`(JIE%md7$StqPOQ*{ zwPBH#KSR&TxzCdk@jrId>LQjzBylyzv2JD>xLz24vGw6l)GUCpgd>84Y@^3)sY~ti z5D~2Og)%u*N!oEG0n#B8aF!6R8=PL+fv8-<1Zd?L&|)V~xzIk9#&iQ{qO|YQZ~}@a z@nzI$QyPSTz4Owgk@2X)x!dE4+%gQn*H@SHC zhiCWrIWl>I*8qQ3J-2d#&HO!H8P!^np@JBHeaJc$@%CG4pQ6`}UX1>Q(CVP#TSiC7 zqRn(IJHNI#w>G+^n#!hptmDgwoU7%EK9DGwW;+_!ymSx?ae>=rB^zXDMQ<}sKhY|G z#{Fqgm~;MB*C<%=2_h<>gHW+RYG1JD^PWC8E{vMHS$1@>Cz16qmL12vxTj!$o;Iz* zl^TP4PgzH1RKDHiLoOCPFzDitZh(khevZi0*Umy6o5Ezid$ufbiK_jN#54@@QHAO= zuA{`bZ0L&?#4)^&krWXpF*??%j)0UnKe{EXcRScac;K1!pU9&#v4QG{ONUR=U@N9BS7l5 z)UohYQS!6Our5YKFR}0_J+KTG(P{EtFizZG)v$5_TdwqSH-+dNO{>Eb{RPoF14<{n zGFlK^B-|sa-xR$0My|6BgNM3d0gK>2@M{w0up%%$1Z~dG&@+vtm<7(tCb)XIGCz?W ztko&Xv+{ArJ>42IxGuLms#j`165`CMTluM@opQ9h^yvmx6M^e4qUejv)425+aV1+- zw&m%pMeL_VpA}#D@WvqerpmPECb1fZ7FZ{jK!Lr+@TDquL=clVcfJdC2=}JPujua! z+U7Q6w(AR3m=$G_f1YVH36hFR;p>YG!a!!M{Vg^ZwwAI#e`fYy6_!80rFhX}Y>d6- zm8I$V_?Xj~^Q1xP_T;Mf^lkg$Nd;{}q=e%Qt%{wIOQ}>wQ5Ep>DJUmAf)u?~+Fwoc zURP&}H8Y@Dn#o6We^NK2h?o0)s>`E}tCMh4L>B+TZ36Z1_9N{!mY2fle|Ms^k|wi0 zZb#5Dmfxn7#)EYAfqqHi4+;G{oMHsF(uj(RsLb40l?d=YVXt0Ky_JoPt|$Nxr%aYN zHTL(YYtxKw#Dza4tj}c;)On-?3@`E&Mm4Q*&8&@$EDZ9eX|2HVhVZI!>%8Bx+mmt( zY?qYf1dXWz%K^5>k%fuwg7ROfxx{L~1M?vKMw*k`E>v!xs23|0mA1mb(_$il7T%Hz zO743blS&c8km2ewQ?W8>^Dtj7oesfE|AQuEQ$m2`U$v{tg~^wqw&a(Q=5$Q|E1VIG z->~6Ez6UNRJ{SLy9WTTfjKwD=-?39OorcfibuZ+`3mpx77<70&w`%G+3am%6s35mb z$P(t%xJ@QObqC1)>De{#s6fJV<3}G~}(HlrBN>c^)u@=Er?Vz+j0VYsUjp z55%`zI-@c(h+JnykMhanOt)Br{NnkH_|{ZLj!fXJk8=XSv*1FN~39|A%S0TFr|9Qaa`?tUEkWlvRoF{+B`>P~BxW*}YZ3j4GleHVQYJE%R4h zmBPEwNkhVOZC(Az<9$SuQ5S3cW+77KB?pbjTmKn)7r(+!7xEn!qK=@P>vQY7=1L_* zCG;TQ!HbmJbHu*6dkZ-)nQfr$Icd96*` zY$aQj!5Z-WJ^9Ydo)N98F?bFW!L4ewzA}$WNIQad7x!rOG-J4Rz+HKyW+8hp8v5W! z3Yi7)9}L>0xhUkcEWh+acoAq%42U}L#ZL0jk8Y6o6J2HtafOd^#h16Y7=+n?aduDK z*UtmmuO=r)A5WOa{Okg}u>p$;SbNeEp6MloomSX=WPF$lASskAYnozX3&0H62Lw>^Dzw#&*zbP;-kd9IAwEpVg6MpB{kZ)&Rfagf zArzNrwkw0EWH>QJFv~KNw6ot{>c$oHifX$b4e&X!bB+w*Et$(7hj)jf%fIub(PI=p z^CvRo4(vj30mukGaV2*>QAc_FU|ws7!`&-!86V|8;ZGq}ZD(_m0mNR_vZr?@L=NK( z@P$&2E#+^Sq^)`!|qKIY6Ks01G8RxUSF0Z0;AHK|* z+J~N{MU9>>SK5;oYG43#X~nd+_-|kweR;=7qvjRFFni*a8mHnv!D{Z^9qO5(VGw#f zvdjx9(_&)VQ_(bd7UFD3Yg^3vRDntX=v3w|#q)`Wkbkm^m!HMnEfloV+Xfq25KL|2Z zHLt#t7q|Um@7?%EFC%rAsV2i21EYV`2^O4RYIK3YSWh_F)OF>1G7yD-vpAGHjV;+v z?=XD4P2yaO^wF5wMwijxkW@JvEN&ia= zgK{Rt8QDYzVFg5z0bf_Qn1fjeC&&{uG8ZPsBU69n@dz@aOi1WxS&|&NVCe&LQrAnB z2Z~;_nHl23u{{)s>S?ojF|-X1Jz>aeCyRy!_NQ_4)_V`LD#Zx5TAuj-T9tC{^Nwg* zX=B=QG$Obt$7j&rE9O`U5r9fkl2t|eAE)-cy1M@@Ni8QH6$KwG zg}M0r#&--{K?=%jNgG{6-B7#HtwrCtsvj8_!OhwDhLwr_DO`5@2~oK;b>l`LDMf#_ zbi6`MU=Jj8{@N3G&ZJHsHo2){Z`pOi6W(a+x*hP*vzYRksgwYD9#X$zn?!Cj9+!oQ zH@$7~`r&exna;h4=U|oskC`D8h8k&}L#CxiksC z2?~!&T3|Q&LL<{%hk&X+rr2An2874}u?K%zHq9f*z4yojb{56siIOpy@NzX^NMbnj z-_%_NZfp#uikt$2IKK9`lNRpJo5l_Y(A*^3~UuzX&wFeG0(GlK5 zQ1XOdOz$E_4WpXnk1Q4jzh@R`i~h000ji6MhG(n)Laa$T$sYdpQ}tAGp)qumr_gNy zjooUe;%EM-GTGSi9T~pVgOT3NQ*dDBM_oYJuShc#%!!B3TP=xm^gAC}H!K18YV+`p zmx1xqQHr+W9}^bsFlaqerk8O7{|6!@mHtM~AHG<{4OFcB_47J`c*>1lrP= zXn7}&%r}~;ZNMaq0}YNSs>DRnjApzV0pVkt;99+`Ya%-`$enR<=Mf&o&SQ7R3g~6< zl73}s^O^^q03iFMDJd=}vly2FWn88SVq0^dUk5?P!|vmuT{M>Kns)o{v(aUY!eoJt za4j0{hb{7X~*GHcaq)wwjSj9?|eKubgMjPh$s01+DSDYUxE%0a{i z`4~^ae2tIpO30V_wnmmu?RK_#WozKT%hsKNB0j>~z(=aTMT`V}PVgh@zLrrM2I37Z z_3;=EJh*Qh#s>yzDGh}TG{OU>bH^@WZ_%I#FcwwBCY0++9%Z7$iw=o0%St zPD4fY#6k()we##{OH48Oi;V#!x{ecTR!1l&)%NV5(BE>e8b7)%W)dle$0%`f^UY=Jif(`7 zJAe`l8Lo~{Wi279q0W@!|?atOPiTmK(iNDek&qrC>1_jhbG- zDv4}*+q`y`0MBb1G0OJig)%znPyIS=`{_`18$>ckqyi(zdGN(MHF59aQ}wC51G}ly zxzQKOXDX9e8!-CJFO)*>gQpQ6i0Du=)>Nd=S5n+Od>=7JBMa~2!=SL=h&>Acljiem z4CwSIuXm20Ye`$y{@7`hg|qi_QI!S%D|-2x`*N>YX!G0A!p$q@(0ZGTk}>~ z)S<&OIu4ZN2VLPxkeQ(A>^Pqybr>e(cpOm+0VM$6BPi zqF?<5+wa84d=~SRIOYs}t8H3nDb4Cp287NQiyI5!4da_MZf(6L#;mxLXa<<6x6p%< z85di2IHot|%l8rXapaI4A26IXjXE4r!k;eGlsD>PSto*0w=s*0ej&ap+NgvzFoOal7QDo%s&Wm|advA+FUZP`* z9QdS;bHE5bq{`1C>-xH2KIFD=f31s>O{szb20;J~S?i3zye7Z_kuUGF+`M_@5e4nj z8t+^k&tjT)C;0Jf@7G0@i)fWeBH_`+KuuJb5AU`oBgUDY^7MbG~^!`Or-Xl6>PdYcJ0tgeagzGb6_LdZ6$SR;=L${vOH=-%> zG*;!3xZr1o<{!X7bv@!(l$zquewAyfC<}ln{#&9?gpF(#O&|uX&0ixz%7g*xSeo{9 z=egC7U1Qvn6#$BJze>&v#X2;M-y1={?{?7u_`4~hl~yueVXCcAcV661E53xcS!~c^ zQah(d0!1sTjtQVC{!G;pNhtVcG4K=DMbEmlGPr1s5mvqKXCv$BEart=thz zQkjl_y;uzxqQ)Qi``fHZqo{;UH>a>1A4WJ#rPj2jB!nQxnVnd`lb~ksZ8%$z=wjsV z-f?B6-gY6?A~;fa_fv@CQoEch3EcNMYoQyUZ0fKpO>5`grgLX=**nRm+xr9ILSMCO zgo0h<&LfbZMRN(Sr%w~x3vJC)YzHBtC7*yrFR?3>D3^w*{GwpgwOG}8dtr>kI(rwD zTKg2>h^F|zyXqqDuhD=|z=EziAx*7PY5rtvYN&N)S`X5JqoV2YeN8hs6Mdox0aS>g zwe|W#KNOMP^sc~L{)M1`tX)ZQT|szlBmL$1oj(2ql_bk+U4r_lW*d_aYP zH8jf*3yd7V^w#T}(A=>{URC;1@bamkFlBM+USYr-FdU?}_K}Uz2=+%axehnG&=x?! z3^@w#e?GtsLl$=F%3FqgAC><~-}s-W8y7o^j`rR&3UUGC)kKh^&8Y;QKMGVA9&D%- za7FsLuyHx}a$T#dR(OfZ+EQRm^;7u5K`eKuyrV z?==JtZ=XsHOEFUk^YjJEWGHIZR%zUwc{FCNRc91X%`czTFSN&BFE-70ATgum?|Noh z(yptY#Bv`S75<-eTh0z!G}Gy3ugXcl?YF3^iR>Xesv}zj5X>`FLe%8-0j%fuGENT3 zp=H7L#6D{?3K<}K>!F;DbzE=dy8h%ThfG6%QHY@ZXP-m{DG+tHd1-nmc!7t$KoYW+ie)~eScWkyfVUloP zx^%hp9qB8wW=?GMoSe=r)lU)>eD)gggEcK(uubH|Li9%t&7m(VzlA4;ev721WkDtt ztQ5#tAovXm?2)kXDgZiM#y4v4cSk6pw$VMOdeK-==OgPRKm84eiJDkH( zie;o-P%96W%mIoN4Z*dwvIu%}oWAd0Ljg!-xe-5NX^wM6%PNG^FDM8Zq6+ECC!6o6wv$afQtcD3wBb zx`c-!fg}=HhaGBnp`V=MUNj>dG4#$5Lp^JuPOC=DdBx?mu^HJ0K|F%Z1+FA1^&<9j%t=% zZ*fg5f=Bwlhu4m)u#2Q8(h0`>NiSy~=fnfDjY-lD2XJ&>2kzOqvH*SaExgWMm9ACW zQ77Z>+7*=U0l|KXtktF@%BMo6pcf#f(?K zoZ2_*C2}fsR7FjbA_x~;b8m3Wj$0}%o8aF%rSE~#&trW_!Y-6Hfpit%ATT;5ng-Ww81Sk9-rX6s-rD*MAX0Ng1(~}HxNr5EquQ}C@t3MBb}w_dXVN{uO2FS(-(Sd3 zlXm2?cn|q=aalJHP|Gc)@>hTvb_cs5OpyeaoT`O5e>C)3Kx-X1bfIVoTNYjthI9^I zt-ZmO(#1*P7Cb73bu$E}MrQixC0q%7=|rgxdq+@OXigVb*=8Hi37w5o`y&gBCaH2^ zB?_ZwDuh)l8i(iWDbOI;YTe-iZ1#ISdosGQBYJTgLw&|>pPi{;SKozv@1UXPVEOu9 z(>U{Sc87+P-%zyj4b_URWRGJ8l&86!Hvz zP`W6qnEz2&d%?w}n+t3Cq1-9Jdov5bM2=)igf^2;*yPa@J(l%`Qd=9A1sj;?YVZSk zdrlBuk6zRkU4U8+h3do1v-ZvGO)W&i;(W|(&P;>FZ8;QAKdVFuCfs1xHZ6YxCShs>{A?4&7I+Z(3bV~wrk7b~dk|zU8aA?e(%!4|k9qYhznl?7%7SP;&o`Vl41;Oiv z(Y%{^52Bl_UHnZXx<-Nc2$VtXe-g8dvSea7P&g|mI>-ct*VW<*e2YkyGhWpnhE*kT ztrX=yBH^wUQ?fDMPrc}tNf_El2GYx4iXRP~r@N3xFf_h(dsXk3OumO);$l*BGhxOskO zA!qyj=z{p!mS&C4Haq$0Sf^o1lkT#NuY28`DdIKqcG0lN>*L8@hGL0BuBXRTyi{VD z?_-Yi=ofNmRFQW0%wpJLLws4T{OSnDPjy0X5D#LPhJ?d*sjO>6dg6SAxlFlUF<0cw zlR4puv!M}GGw4?^QMauxgF)$#s}|U0UxNLjE-!IYD|%)7^vKXXH9UDSrVB%_>Jk+akU_8r5T*!HN7(NvPQm z&^w!c9H}y`bOJ`0n95aTl|H6*?RfV-#*$U}^(cnOW-7CZQOtt_6IIZBzD=Q2G6PhW zxLK1!?GoepKyBQn#{(O>Ph_Pr9nHjZtLRCLm-m~=8wqb#oV`XLq|Z|)>9&&&(v7XD zcmY=SmZztA5Qj6ena^ z(6w6|_rKEB?zWx(_It!}H0jH-i!)}0U3U!XH^@6o#g3F<+RM_=L3L-XrotNS;n-*@cwn0ICXw@=DA544at$T} z{4ET|g_*NmKt|>XPP56f)J30SV=*^QCWy>i_q!FfyEWbWeU{vlso_>8`7a9WP;Qif zi{yE031PYxMMqw9!fr*7P!m)%=0Exa0ja2%>vDs>>y%Zav7rBe8A2Ad+=l*p!Yu#% zz!R&5zeCj^OyK5S3Q3IjXm8Wz@_jcCx^0n}>T+p;R>nWf;{6Z5Ib5x$#?fiys34~S2szYc>I znd%*V#>y?S&;#-@Lvf#y4qc`;TMgAmDs42`J$N2jJAl#pKUCD1BMF3I>6eaH z&Jr7uiAS^C!e*5n%vwuug&9o>9nT{kBl+}au57qy08ky9nrohB%S%?u5Mm;GUA~}fAy#5KRAGF%8;#tKC+gb+Kk@4M$u;gO> zk=}PxsiOWomj8erTURB|o1~=y^i(Z@XRc?P(ZIE5JH-Ma;IC2<(J($`5KP6fADP!_ zIO#}{jM37oI%NkVJ^lhHtz4Vea-$Pa0c@2yARxR6bs>ou!=lQoesEVjC*c!ApLrK*9T z>lhJCFab@etZ$P^V;(ZSD@?_&7c@>l=Tj64K9`%*4I5VxM!CFbY;o^eo&~|B-{hA> zL*aW<1yac%@QW~uTsAMpAZfB1o#2#ev75w(k(k7j9l+!<&wD{~| zo=btFN(@eyKRNxthbyk=Pl|9rCo&sO%WZ^#O}c@;xw;2fKZyxvr1s`=X+;*?_Wmmh zlVW1r-^U*eD$p{inyfg*O463JjFYVR+FGZ>9tT-YwM)BdW=q!9iHSxd!R*JaLmJxO zRc3rW6L-RK%E~+js-y#JWY>B!(oeRUUr1^A5+_EwW`;f%z^R{J7Am~oTYA&4e#6Vx zFFa60*q@W});dkT=eScwOHrIf@nH-SWh`s`Gr9CnQv4CsHHRqK3zU~mtSS-!G|7i8BO$aMHxeXYKM;W*jlgws;SZX-nWqMBg~#RdI5~m|8A0iM9cT=l(4*64O+oXC_9z+TO*jg@r__DNv?#WvoBq&pY z+iUxUJNcv&e<0l&CW)~dWVvAE;2UXgro3gD4KvQx6iQenO`IcfrJ~;+MRj1wBR}Ph)q*M7)dGsgnG8LZZNkw zZ2lsTg_K|<(`u{ZAO zE7uYuB0L+FH;hQL)D6rX;8m@W5o9@k8j+$-z831|{)bIm^-W{eK<544RJsK}&NtM? z(YOfb_7aNBLD#>YBiec@6YA(>6U#hWWv7MgG(VeX&#jmYRBski>LZ%OYkCtnFrBjj z!7gFvfbP!`sx}r!e#{Irp&7fFCnXw@*&pTgeR}>a;Z(~iRHnzs1M=sQ&w6Fdk_*xS zhZvdF41PNBm2%8Q2IK=p9ZjojpZhz!l&GZ2aBB$zqfqy|gF2sdU_Ns<$}qH5e8(0U zHEqrKPHf*2CH~xj{U=&yi&(Uq^?XxK?uRUn9OPfnq1QuP^;%DB|Cay(3+GwnR1#B( z9FV>2ZbyEgAox-2-Hm(!_^qm?kh}xl%qiQORP{wJR`a$Tip~E zGKSswcONrZ`zp32)a;*Jp)6@LR)VmAaw2Zw+*zaI5%G469z?ubC3YO*pxfY~okoCH2++gRdT1VM1_~T8Je+IW z;zJ9+uOknhB)V)7U>iM)!TBHH9-KrP567z>ikr1@B+Ur^zgwXDKkQ z3+7`HVc6*a`@Iwr4OL4ze}Gi5)SQMB8QA?=_=6uD6M$Ed!;9%7rT2>~{4g{wuHlb@ zP^eVZ6ba~-7%5I`GEQHyamwm3r*c{WKa2pbwn3~%Y_o?13;{MWrXjmZ%6Bz*(B|vO z7On^e-WNX~0Cef!0IKZ*@|MPpNo))Wls=R89JYF6au{bJfCqWe%F;34Q>eX9uNMWQ z$WRui5zKXBfJSDsjiNWQ2Q2y#u(7Cmm9qn^xkSa!D%qLdTRqY~O=ZuM){1Ss`cpnm zHeZ@Qu*#F}+c+tk@{W{Q<)1lC?$Bw(&`XL=-V+m|`O3O{E^lok?p3=n;k4_2vkR5l zS;8Z|Qu+&NjjEu-jf)!+i}gx-c*%jx{j2=@zVW%Ht#TVR=IO6Pf~Y(6lk9EC;u+SC z&g_*`g$`qAENr-KYh+$SA(|f(t!{O`9pGjOs<8}ULnD5;iQPItPKlx(WKpA=JJPL< z!-L0*e}pE)xfHjN*OrPADG{Mat(S>UYg^S>!84JA-rGLL>SUT!XQKT$Ybo9m(x3dI z2d|rqRH6WY=jB_D6+WQRMh*A6TpwZXIHh7+>({g~L*lS1ydr*DpkoR!M}X1u3q=U>dwujk*OSGl9i2 z&J4ap4WuBMnOeD>)@KpW0(Pc&${-Im0&rzf^~t{04IUTNDQkc54t;sJYte07HbT%S zG?9gOFOA1p0FMaI@W48T3_1SaDqm{ly`!S7*zvgGBxxW-<%8EmJ!vEGx+W@+e^t5d z7nQw0T}+`0n>xRG4)<+WUGMyAe#)JX+#++z@n42&gTTeqRDQ66ix(qM`cjViOKGx$ zf*%NNK6>>@1JNmtfcm41O)co9hi7xFt&zDcr>vLzvs zESIN@-&(T1dA}Dc%dm$6TXA4SUSj-i?ZyvCZ54rL6#yy{jErZ7y>T$YWx3$NWsTh9 ztg!sr?^t+V7^DVA!~!naY<@KmoXdPn(eEN4nQ0%7C@j~gy$_f{GBPi^PjG9ly)>je z#q8+uhLrSxh>(OC)i-a3b2iBzupm$|*=9qgTS$^2k^KglL23TevF4&NWS$1D;!Y(7 zkuEP{w~`^0j95i7+@uZgc)>h}f`}z|KT_m4;tL~N zcjv={)&pB{C|ScO+M2<*+i9ZwFm_;7vYD6XL193oH#9$Ck{3-wSX^IW2S4omSaUNC zV9X%!5qs63!IF+RQZgUCp5H_C!g0Gul+BNh_uHj7-+bm6ISn0p z%nu?HY2u~H=*Mmg$rj0~orJBsLk zEolvyr8w>`qZD{KSLD|TPL5nL3><63%}m*hwv#}$7&fcLABf>!dUhqUogI1Ya>@Eb zdAq`R0P+5wq|o(#GX<|*iU`q4=)$w%^DFXV6~|75MaEC*0MyI|fZ5Bs5u!ypKUsUHdq z;Gtfm45@e)cXS}A`c1ZF)4$BR|M+Tk7}rSLF#pJ|dkt0tSD>rzOOS&Q_YY@^yxcxb zpwrrvgEmY&k=}sa(G4#y&{7THcQHw;{@>9X@~%-~)Uv7v6(dBn=0$&-Sq5=^<|m-) zxGHxfCIw6U#27-`-CyYqX8TkV&6)pe&Af7R zG&BE{N7U#&{kDv`od2ytBT*j>7B4?aVjI2Hzt@E-fknIf1JM#CZ`puCCr8}?q)w-@ zLy&Nf05&Pb#Z;D`Wb@0*j&LqD=HqCXtr~ySD1nc_-daFEvb+A8L z5j+C7Y<;{MAD))oS7jYT*HV?G-~G%%(+qwvoS(lh85DMJ>3hsrid1nK{eXWN`zq5G zivZW6wX#ey4&l6GbKqu(4jg3a1Fh5x^~|R&7P4o;YpRa+sg* zXxL_LJva1KYicZ3UGWpYJ%=5X_>jr0_ux;1j7v7V$i?;K$|-CA-R$1W?B@UHKsPRBA_N;a!pX#VI5!4L780TQC6TV>!cE)VzRrtZs1%~U`r!h1Ut zGm}EU`aX^(*zoQoDu2bt9S{*x9C|$aPGcuYyWTiIIhC}RIIen-_OrP&eBsqi4iI4i zn7D?KI0%+OdP5?dgroPvW4PWGJbl(%JaeUAyF#SH_g-DYnF{iL7fLNeC8{>h?z(v; z7h~5AN-c(6e5oAslbI$th>Gj-CL3cRJPSAYes%4PuxPr#$H$Yoz{|*-q$!;%NO!OW zcusGMsC@fCX$WQW>VQOd?5CwY_o5BBs5?Rx!z(IfddBGtn?ocH!EB8R2e&> zIaFkK8}7x%g{z&I1r&-W^?Ce&MnvfB<_gGCGRMp`d(`#6dvweiDo?|vnQSFic1Zxp zj`(n2y$rylfr3Y}^6HJT`BMy9tFk!7jk7`L33G~GjVx#dknV^6@tu8uN9-IW`y=i#zr z|0=*g%~_^xmu#rqM$C?l03VadHm76)KCz7#%MLjpUuqNFs&zD7lC&G~*8uWa0Y4_M zjD3AbBFqjuh08^ThTs9A-+EPjpvtB*X}MpBc(`;?5-j}84upC2J|+0)pqq*B;m|}% zfNi^NMeK#VrBn-ag}^k{#*;Ow5X6;T%D~s!i0%N73c%nPct32AA|3I)qzP}iSVr^} zgbu;c=Vj}I#@J`Wv|Y-F1iLoaOHPWSt)h3_fK{oe1=(z^RQ+W+n4B#0rEIc5)w6L&FdsNv1_UE7cj z)mK4wfr8g?RvdR6u`R_YjYXp&qKFxH;Y62l_X^6Z8&AE_P*#C#Iw3aM0KR^k0H4B` zEc51~0X)v)3EK4obMf3^tCbP0s$y=!(bE*-3GU-1^R0#Sq6OhVqyhj`MY@3lhtq59 zJ&LFyS?lNi-&tGD4D`OGHF)0Yi$#C19r0j1-GPPa$Wk1KlGJo)u=qyK21!b>>E?RN z6w75Kp%RwTU|%SJHA1a&u6MVvuWi=HxeMRD>#u>7a_=EsOPR=24vY>(bq7$X{3_2* zNzLz47x#O#+);kF^USdlKFi>!W-?~8d>{k&W9*!uh(o(fLj=TSis~AVv@U(a*#hm& zi_2OvzE(>0*b-S=HU6n0-5203HIGes%`&*|zId^R!2h^Z32l(_w$<(~R z#e;k>qP#}hJ_QNZ!;~Aw+!7(D`M_E&Iyd|u6$znsLsm}e!2qz&#X!TD^{bTj5N;%x z#j3er#YRgyee7pv8;bTeqJY;5WoH$%-Da>l3(HCYICN3`6jO9WZ-DfiZj>?vz=6^G z11YNyUFGo;s5+la&6Yd8v~mH8My!n1y_JtQ=N( zB|pA34|31fU~UIc#VzG|Jdl!pYw#Wj-)2T}41?u*){Vwy-8+!&eMXd;$NgF+AFNpV zA~CmfYf3pl#W*x+3XYSo>tGYkivn6&%Y#@V?9@JoC{*EmT+R?Pe?($|H2zPD7Mq{@ z0a{O;Xgy(|R0pO+MbgEu! zqL8xF4!ZG;*wnR|jkchmURa*B?#o_qrze0QzuKLZm$|hsQ+9C6e&nS#6bTQoLO_30 z$!Cq&=3TrHh))4i$nmV(50!t+MfF*T7yBiZ5N;UD&vJw81S2u&YH`rr_1;HeQHyNL zx2bqamsA#8)v%Dy1kNV)<9U`HM}yG46F1E-prB3e7cH9bUizYO?3?qPm>;v~?U3vD z4K>@6R85g4HUC*f3VmzaltP3qDWEqqk-77DV(M$pP9G6)NfGT-bv)+>O{M3dftaB+%<}5BR zf%2Ubjn!y*M}3+$v4co~q)XFu4!_pr)-#q<SvAOMQ6eTct)W;jT3+}St>$`?{FDHm&1hKlVE^LIXcK7wN)>=Q9`Jt74yLh!sQ^82`Ge z3}(j@>w;b`LN&>Q;68{skTXlM)IQvuS&%UwMH6=JrkZ$eZj%mRVLSw+SK<%sfJJ_+ ze%19iLHz+J${+=p-RjmYcq0civ1WfKiT&*8)GVVf>{lPhK(nevIGKihuD0M>a_^is z2oxDLS2T?`!~gn(0#A}SB9JdSUcT-mwsX?QA8j7to8$bysR}Qknu9j6N0UP<=wC{6 zJ(x9Qj%*pQL}{`BP8RI2_G#xLz{+yIb;D%b`n&J6HTCBR$obS-Tj%1QIBh6&VL4On ztD*i@E08-K?)85%Q`u#7Utm5Je=svb^cJo|w-1P)JnYh2^PEP7lM%($(Xy~Gz!CO( zvc|e$?}Ri_HeqYx@pYoA-G@}zj?}!17UYE6_qk{V@DK!3!HWK|x1V#Ilbh(BnwS*G zF-59-_GC@RC=870wad%qu@)#Tc05{@M1*3h3`d@!Q-L%p0^} zP0v9CuBms5NP!@xgb1zY92qaA^jZZQXpSbi29I5`eza^Tn;Ht{8K}s=7=C@^-i*$V zM~QULkyGUa=(EYJ-mW~7MT!k}fUU|4E@_ua$x2~9?GnwQ zaweqFKA#x=e8umMi4${qF#42J!- zcMI1%y4~iymWL2nfxHBr=0Z2p?({8TRDN2w^P2a~^Km>63Gdx#!N2*n`|hl-6rw+LZQ~sZNpqPZDS?cvIXjae%J7_voUqawJS5trxS)f-z#79Vo-d z7HJ&iTor<`LQE5txOUf3?^;d)11^u5u!+L{7U~}c(w4JHDv^0~aU4iP)cC#MII?@X zy>e^RzzUbkP*?_8iWh(C&>sdSZ8ve`3IGwLWD^=MW%j@QnvgX>Ll2XRJC^Hru;c;N z6<@O8&|G)~(2S@k#4Rf?LY*K`eEiAe1k(-#BHoiwVF71n!!aEuPrc-b$whl6hAxE> zDe=Rd2L*p&?NazT;#t~fKvn&1x14p)$k5EiZ>SsC`=T&!?rWh&%#rCa?bsi@GBn-s zU(p$wW_+3Jw}X)k29HDP0ap|SnO8C9d9;-LME{UNAM>A2wtPLomn)|2_}prn2!AdF zC5}}!Q#bk{0*1y5V& z3OXcMgvL_Z?5EQ(%f9Jl=){%HV+QO$pxe_>4wxe}*T`@74(RXjL7P62G`4}_N)Dih zFzmd|W2BDzvAbU2yk72Fzm})ClxD0_ko}q>jn!HuwK$*A(5BEqARKMKmEiI*z;323 z(s!#cNFB?c(1KkH&pqp)(~aZKTDe!slp^J^-XNY|suP02>$jR&e3-n;@Il_fOt~5N zDc;b9`tH~`Hg)adup_;(YH4*31)*vqDrwe1f5nM3`Z|qZgPKJZj|-nTV_Yv9*M zxhW=+m^(rNdI)j_JLByK`}%$jhwJ@Tv&|NeySqdZ?;ehwlGq;?WZ{XfD#~X79Si?l z0);I!Wle@a3kxA4>CVt#6~&vO#EFmMgB^F1OeZYmWXzM?ZkTII2pbfycP1%WYp7v% zq&n@k>G-N;=rALD|F?Gf&iBHDc;jeV_`hEoVVh1G3YNHlDgvSFz8z(+R+tlV!8B;< zJ#k{MXJ-q6@EZX-MuQAbb73&12<)FW$5_KlGPy;LEm3pc$7M)#NQ28X4p!lYC}6 zj`LEE(QtH(b=!^O;8@$#H4&`oWw&QtK4P^7C}tV_MDiuPMlP?vS%L?ABQ~io=YMT* z>6!*l)X%%H!t2-JQ}LKut2QE}vPKg}4O8ZRzzgkvQ+rSabG%1c{mI^zp0&ktXq&Gk zLI~P=rY|?Eg=zsbxq|Y+&N|KRSbhO*&g2gV+g>!+UeND#<(~m-C$^n1ers$amuL$U zG`K_ak=hM-wO+;Qw?Yx`so|FvE8Pe3`-Rbek?UNRVD>l#`W);xRx=fy5FJ^daNydu z&HFLld*j}vV!305rq8?bwAN61YR1FTW{O{)E(n-m81jY;`T301j50w(yeCxd@0)6t zPQJf9qoRNriQ17rUsjPzgY*vb#7g9VK6*j4>-6@WK@3(zLEUc9crX8qMMWI-1y+L| z-QddKr}6x6%PPM71Z=7)cQc|D36i=NFZ@qJ+s_zZMq>uIhs78Gs$f((48P;(YOKKL zKTWLY&d=9JKeCo6O7RIGvct zWFCSy50r-^lAE9ahv8Q9YZNiM)0^bMwt>r&hWVW4^MD&9KoZ9V3sr#kPP!{Xw?AVn zigQZ&-U3w3%A>7t!b)J_x)=lHGx)T=A{K_+zn0zOwVTr zr1XK`QHHmT3XLXr&q^?>)^Wtkw=cMlZSXayQl)dV;DXf}{_*-Y)?YlXEE(3D@`|ag zE^cplF@x;41lJw=)$6>>J-WW{$VP-mhgsggAdMVyN3lo6x@jP6!pD%&t;JiSZUBhC5MDIcthbxuoN_kIvtIHH zqgh;?7koW@@glQFlw)xNykRI5W^n*Jmr*3K#ksPs2?{wFXRo$Z z{!c4Q9zz!UPweDZngvtUX;-*);B7OuLpWi)Nz%-^>3eypmRUSe=&wfM%29Ht@%}8f z*BKXqWK+pkF&eWU%d9W_XHIK_|I~)P72uhkI}b#@RC&hk2Dm;&IC$0eA0{h@&1A=& z=5aW|V&j_5S#RG*xE6PP-7q?NPaH;iP_mJpZR7Czx8h~jY;EF@81aEgh2$a#!m2l- z_k?xwMS0(abqewt5{4lPBh>Ql|Aq;>TcZTrg$uiws*V=Xx%;6G znF(k%C>^%@U7~$*lwLbWa8<=i2u-YjV2snHN42(4JrGEn?NhtxH4`x;a%ke3 znMd2#-R=i359H2|)xj45B5g(aZH>njHRI<;)valkpZkpqr8h$zr6ISvpOYsG=HAnX zo3ZhhZ#&islmZ9{h~ykBe2NEl8BBOA7apRg`NY`dPnaCAr*%}Gj1Ieu=>hHM_^?w4M_Zq= z^*T1==b5dW(PiV^IRKqDu!d#1x(OR1*M*2{|42Yy!Kfv9XQ5JplPZ|c4id&%^Z@!^2KUb(bB3L=jAQqz9(jWWEm#%Q=zCN)U>$_(CPb<-Q< zIjJ#4sy1(BLjMhi_3$d|U0Z@HPk`P?ko1?ZDZlZmFFKw|6`opF8H9w-?f{V@ETMy7 z8)A!bB4-0~yP$h@xOV7bb;B?%@XsWa{*|QrNqi=@>?}#y%y`}C@Tq9H)FPPA`*s{I zz^52hRpy-_QmDy#^MvPi@4_k z*0Ij$OA?d-QZa!U1z^Av30`(7bdKE7- zK|x86b#*yd{H5e|3jvCagg^nS*mIpq#o0t~9z3d@bDU9BSliG*3X8t)d%>dc!`ZX& z-{=KiSM7kwJTLsA5A;`zifSw0>XGaIn|~GY8>Ls!AnsaSZSxrV@<+R;T^(Oa%@QFts zet74No?b{8rc+4x(Z2v_L`hv{ADS6zaSy|I!ykh&V3e!-V#+H*J>090Y-qMMxh^;Dx3ML_uBI|QUcV4Owp5Xik(`_yHGey>mVsv7o zzc?v=L=4f=#Vw-Byrc5p)eCMmqyEkm=JGEo2@owc5JloO7lI@1 z8-ZN6DqRo{)2dUx-6}7WXH*rcsq~G#S;E--%_FsXY+w;eFPza%N_v4q$QC@ z$?5CwrO%Pm1GZ@%(>Bj-l~hPGDZ1c<;>I7*frzPlCrI4tKx+^t9a_INCjuZ>(vTP% z2zJ$K@iGm+H5|zwbR~{HqB#9ul;bq}r)zo)@BESMa@9UOL%l-ISC}dyw%Yw zr^}6%Tik)1WB+~0CO?=u`#HvkMhka8_!x)qaod4(eVm_{V$e#73DD4{r*t*1LduZ3 z&Z-s!Mw0+$KLs!8`&1XYSEhccd7Y+^zZe7ty}NpLGMUWF`r2H(f3Q*p4LV2c6Obbd zKnZx6iT+jAv)(u;!QX7LfpO*L)bNfOy4RG2p~CiroiKdK%WP9m1Q9iPWumq+l36m~ zLLAsg1Wy#*RZM|EGB5e70usyVOGt_%O*b1vhRDUxt5bxlxUF_W{${yK=V^W+m;T!@aWd zPnszpulQnwpT`T4S%ig7tQ`6&gzQNl)Z*=9FY!nbXc`Cvk?rkS&r`n zoDN>7N;RuQ)_3_!x9g)%B0_{D_8qbfq~CskWhnSS|CzY73h@<_$4iJJaeA;7W}(~L z4vc%eAug&-O366N%gM$H=jT`KlBmR{q(7c8oRcXI*6vy7txrSMmPjFWNr+?6`cGvpaJ zK0Vw5LsOf0e)$YDu0kQmerqc{2P%uS2s9zZb9?4FZk5%tLYEEo0DNEj)Ev?#kpmQ) zS(Rp6^D;l9RApN?(5VQKo~zYUydIh@gpwQ)FvHS#(0ibD1if@q#SS11^=ez?!p^x) zpjG=v6U)LToQoSmY`bXRBi4YZ5F~3#id+91sZ8tj4P64WRZ*1H`w7rrXFY%pK>b_S zMt3`ByEOBz*!WgS*ZY`bqp@xAo6d2!O`($&yObg-ObD_5Vc#Bq`l-uGSrG2mn^miV zmqFxjKWm`=%=W%`Cb1ylt;A8U3Pp0rQ7TdEcH$4OyqPGUb1279Yg z#c_BYRnC3sKGn$ZqDU*Gh~V}F#Vr!BR5F>OqPx&9;%vgf9&l&bQDHxUWQ3%Q}r0_MuIuzB;sUod;3fK1Uls4#{D6n3Li}x zhH+0vXYZJ=Vi#AIrgW<${E8{cc_59RNK5w(+4FOp62b9-St+!#f*sFT4fvr15A>X_ z>H4Wsw~d>@^l=D!6~SRMW$^$AIu0`b%UJ^u*jLmhvU%_WwM#NrN9HW#%tV8SUrD@eF4b<(`_>X)Y zy!C4KLD_?lfm1gLwN7cvF~=oyjAv&S;gL4CSv29H%&*$*rzcY)?*qdihGFddM3k;H zO_WI&k$Fe`by>1S>f|a*z$%uWX8I0lOXD?R=GV=Kfuxa7Hybhq6C)$WY`NZ{Fe2^i z6J3mlo0!yA_1Epe$c&$VwnulmZ=BlU5H&Oj4vOlW%?uY9xVJDvw17 zoqKrDk8`u==Se_+|9zc%0NzD;u*sy6$3INhaYiMn_lud0-(*ME1*tiwPw%7vC10Jl zn35gjK~F|1WDh#kW-h76tk@h`)yt?v2Ff?YD};=HO+Dm`sGg+CJtO&?(S@2&EjUlV zwnIT{3PT*Y{(6A_&%O)N>3UCA^SKmOZdrv{Tr|LyiAUD#c!tie(ywBADRgBD8mmBv zDiM|~BIy8@RWedY-`_xVT6^j~dXebSdMM3xOGcDoN>-P5t}n|~nb;k(r)XImlL>)l1OdVR!+={c^9G!V%&J~dA;q-lI#;jg#I1jJtl+W@w zSP5`nof1Va)Z2H6=MrW$tKH)mzSw4#BTbb52n-~(aKJt!mWl@?AR60W%QxkX=rTJy zz+&>FW7sTj%6^`lRY_N4?Y_`*K$1Sd+b3MSsN0m0TG zO04}fIrGDhFAyMUwZ9ZEVu-^dF(0C-JpPH#QkKIh&j-b#3?Xkq*W1zW&OZ%}Hb;dp zK}Z|I#H#v)tR*GZ(wZC@XVquG&FuHVzkVKI;yeF_?K{M=_5ShxEG@Bqc|M4suQvS}n#Mdp zKkrW2Tf~VF9*atFm3N4!VE-9uEsr-NW|<-9$i`a|Jm;=!bt8yi05$~n6{rlt*s2Bh zB*nfkiEh@zrA{Kpz|?Cls$s@-sX;Ag<5BS^U0QXoX1WahW1Ue{QFRuo;DUv(@<6eI zk(Z=E=ue(IzwlwIiO6uUgMHU4P3U-@qri;-TaNj@>pAQ5+(KS1ixW^XY(-Bq)_&u0 zT#as3c`)oUc_!)4wYIe0_&bUaGuY_WAjEVeOMjf{6hK`n=$iO{_=wOxE7zYjMMI># zDeE&12_GqRFW;XrokWEn`HZ6Pfvfw=wrjdBsZmqBR_JjGQjF|wy-HzwnBgd+)#|+p zB3Q@CcqrbmoZP@mKdjO-RCp2GR_3Bk2w?4Tu6*QR^rJ?%hNW;#4$X+ zJbIOhk2@`f_)^mpK^Qu5RtS<9p*x=5SWB4I@f~H&2J4J`PF?|i5g($1iZ9R)qY=OU z8kHm%(k})xOC9g@-}9bdXUK>Hi!Gx)KPzH`Z3BK0Lm>Hqb465-E~}YRDbn?0(XyKH zKS_gPl=)x}g7I60%~PbLY@}R$(6FO;VVCG=NG*-qvdC@x*$*kUT;evA5T1rsm$Q;1 z_p(np!g2wGKmMToU>C*U@~CxmxzQ)H!#p3WxQ4C?gWh$4wR?P3kI<~dFxCB>H{A}n zsqYiq;|3O7<(eWRR80Ht%z;cx%%cjXAB8y6;8ohsG}-cU?zSHu1WcZ6h~&v zk(7dzMPEL}A2{bqx-XwFBwb)2uh>W}@|mitP5-t0ha6>&4dlJA1;yjx#=P;ZafBs{ zA`+|7!*aO!Q2A%f)Cn4)sK_gp{Et;uud{6PcfcF^i2e&^Nx(Fa=_oBGr|a-WG770z zAvYx3f#neM4<{uXay#g@EDm6K*Tmy-9AM^LB_KI}pui#tW|pM9E$qq}ppMGv7-FpS zk)~K*yzXUz*SZ5-i@9_Iag1(aZX{yAK@#aWv$wZk85Y9o3Qz(^R%SW(nOG7o&}xQl z#PRQ8NdiA}pDWZV)^jRBGz^g@!kcD$ztEuI5|}9cvwkO3WW+FzCEeljd#(G;e(f3& zeozxKA~2jh*V5so5z4$-J8vZaFBe#CW}SjUsv{;l;yhrptvT`t1BY;t#(R(z%z8y=IMYg*9AzA$|pmFE3R7iO6H zi6{SF#m%h~Tu_1CS*8yH1Gnef!Qbs@)jOpy%WLbb?%Y_ef-pj-2T>gk929UFTm>Yy zY12pz0WHdU)0XX|XcXEWG?*(?ef!oeV$WR+kdca%f$8pX(9SDH^ zx4_IaGnpgP=DJEvbDTje-?Kh62?2$Knr;dTKQNj{o1T;x*xuq9s@T6I10jExeLhv2 zSFDV5Bo-Y?@na;Yrb^wP2uM? z0jW;(Zutd@`r8loveyl9R6es#vj#ajZmfiSCfUR0uD_IZoHT}E{YN|gCX=NU7HsRO zOmkMUnHaLpZa}Jte&Q`E*TpWwM%i$y`#GT|)!iX;O5lazSrv#6SwM)%jzVd%mEcvH zfsl6)UBi5Eluk~W!6GpQ9rDJZsIz3V;qkZ94!09?BBM=CZI5oI5#L83qh^}bTDcKE zS`x%R>&#sYCWj{56w5{@iyUEwl8uk^IwY7^BoqGE$z>j%3$R89>Or0}a zbCZjVpM>akYVn~co_tfo@x@Ujsn>>MV^eFU^4PijQ4M0Y{!vXztOhuw&pHiK=bC-= znBUZhb7+$*%>E`V>!*f;i@ZpJ;H$^@J#sn%`yd8jupY$M>1>b*18hm^q`{?UBCG65 zE4)&xeE;5;kY7Dzhxfh~LTAhMo79Z$Bf#B%fQCKY#(R$Hr6#&~=XR#kgxs5F2h6zW zg_<4DtV2F9FPhGf*55t01@r*@MJN;ddv5+|C!Hn)#MP_rtK48Ic=vkyDT4_T}$~3_30RYNV|d0UnuoeqO$&fF8`E2GB#C=BcPkRZ}zg95b%RYgcTI0-#>7& z@#7~{3_Efu(ZAc2bbvto5=tw;7Sr`8A;1E?aOTPbmi~bD@a(VJ-k^YNLYR1OJ2^OO zN>>FPM=CKofq+L8TC2a6oCr+oHpFG52nhN$QHJUNOx9+3H>S*=r2j&LO46VuH~!B?C`+?P7;^!?S& zxw98Ps2s>MS_3R|&6lTGi_MA38|U9UT-yL{uUxLaev6Hvvj(@{t za5-_0t$bjSS4?$Mk%90^;8$`g-lEkZ@=%I6@!~d6dTQIoMzILCqCS{q21R*CNJ7a% z$K+O8Ql?(y_bR!BriHLU(@wA(AYb%JIx-0U1@VI?y=hlP-(}u(RPrd@)0HnajfuxM z>;`*uPY?d{eneoUI4WU^II3e2z=l#Rr2DjSP2Tx}f=qyVl}`3w|1A*fu~>!8W?IX{ zo^#Y%=TbcZCmxGBD{DI`o~u;prib!=dADm%=gmNQEKuNZa@#F#>51MGvil~PvY&I` z?dH+tv|MH@7Tm=)c>jbLp?s60sM@q#b)nb|dPKRo>zwW>PHpB#+vfNVM74SQy2C5@ z0@6EF_bRGmaxM;PcIQ$mBaqt#476fizy@p)1`(C9@yW=RVJ=Qza4;m|5w_>6X*AXo zg(4o32X7rg!_vwk#M*o3r#NRY{s^(-e!-Nhv+m}xdg2Vr@#_htcfSO7RL0$XnA@PN z`1pfymM?r^HBK!d5kQwGm)4Xid?fDSOu*Hb^3Ah_VngGyA~E>iV%WG^X&_f^fH;%2 zelB-$5u_(b$uZ)vh-kWr4u8A-aVRKT7Kw3>#hQ_;O;dKoYxC!??|(#?{Vxdmbn~ml zi78H>*rN;Nh+u32uLh@R7hLMv5oGB^EcEfIGEZst_QN;QjK+|+*N$!Q>BP;u#}+$$ z#EIaaz@wvH7t^70vAkfmecv4_y=>fFQ_b{~=Uq^sV}pXmB#@6L`4Hh4lY3jK8$j+} zi8?noN@@9?n0#!_d4caXNR-8M<`wvy$gm&$6!Vb)D0&Tkey{A}Gh0cc6}->)Jqpbdgy1|!u;E0SbdIoM?eo~omb9>-NsrOQi)AGU^QJ;OX&o%yajmDs}}IV z6QyZ=vPFqHNROOFgT%}?fJu|3r6tWm8y!$T7V?g4$b*wzCeAT^0wJWtby7Vq2AMh{Wtzu^eK z8HWu&=={zZ?QF$Ow$wpVfO>IL`Ig!ITWKQ^Ddwn)%V20rPR~`^H}*aT(Bejdr{9+5 z)HvViR2MniReV`2`J)p4+wK$){95@4mJg05@++sP^PCW#;T#J-Tc56yu$Ms{2zvX7zR!G+6x!$$m>!SYc9X>DQ(^L50KOX&(d7OHJlwlk-Ln(*iF0w0q}Kqc%7aC zNNIRT2nhp~A(fLL5SI&}<}?hpY+*SkuzHNUExY|cIg{Alk5kU0zm~2jV9mp;kZtwf zJ#4~0h_N)Gk}CZ2-rjLHr8H=c5s?P@9meG_MR@b~*~9RbQSxS z1o?rol>MQOF}7{YR29Mg9>2ak(>d<&;SN8#<0}f4?3_=K`d`>is zX`E&3r^c9EH}GsVE516)rWYxo@GS4APw0Lbs~vPp+m?Bgtv> z3b{>_)aAj50`hqR0Zx1F=KGJo_pL7&*;d~~)624wRa!3K`(Vs_o#DgfPQI*8N{!IA zt_bBd1Qq0f?wS^bMymudtNV3=!rc`QA9F(B*Ix#Cz|9hQN5NE0iF2^J!6!&vA58SC zZ!K@~xI!<*oPVz^HY?w^4gTCb80Wxyx&yuUHlH1{0>WNH;NX_Mq56)>n79KDLs6q< zvg0TCQ;8NWIeO`u0VI^uos&$AwzcA&$C1Eo<;V#na`KfO1!N17x?dC-;F| zQbwI5&u6wRLb&`MxRgI5J{8--mpd}8+0kKx`;=VF2??#;ZC%;X*J@dap*I#ebdnguLitT%x`1{JqGc#yj_Q}0{V}|s%+WqLne(oz zG@ph_wtS?6;Vs&1M$T;=JK|8<=4o{1PzIKL7`B{=udk$|RozjI(S64G9Q5dbkKph(ApEK%t4m0iC9Mr;F2_lrbj!RlY4~cO8ld;B35Z^R00Win<&d`GuDa2_` zMLYyFs6KmZAvV?ZvY1vOX!)1`1}YGs`kmGQauSkG(+5y){0&0*uWstP4u8@ogH?`^%TQh}fuX!mpe0Og$gWF1ebxw9rJ z*?&UIz8*t9Bo%5bp2m*v{?yE?|HqdvSKg~>J5{2a3ky}=_|G7r=nqfw6N8Gwg0R)4Z1V8~=J#)Y7Z+#!H6Tk){mRp= z!I2@x%g$FGzUrc9Zsx{l)ZrO30Qh+F1Tj;w2UtE?FKnlG;uSt^zUdiFIo#gYR>DRJ zoENpkUw?n=L?$$um7f#damD1EnGYb>KCLZZDE`!2l!g&$yhsixWk5##-fyTNiq)~f8((u_b@hfFf@8rJVptefN)0Ng%bc9 z)23l%{A$Wf(-Sbfj%YuwQZvzN0~z79_o8M?6~qhig?j;b|6$%Wb@?^>V^DpCU!T(@ zWy#F)*)zW4f0!0vUHd)He!}Z@-KhUiE$hJC?w=k$WjM3LS`~0I*ynES@<$zlRk{Mu z0Ch>I-hO_70vhOn{-5u}zEU5)rwK=L5;EEWVIC}y)e2~zPoP=h9raumje|Pn3E%Gv8@yQYQEG7Yhxv3cwOyUo)J|@Qo&X`} zJ((USOv9-Kow{A0r9br)^SweJK~DQs?TE-z#B@~u!IapW{$60N_{l_R<_-!PZX;am z8$%kUfAeZ^J1oWVxEa-dA4BUcaT!r3p%&i{GhuM(;<@1^%c03eykEpVMp(3MtE3Zw z7laKOnum?@!OLT?CM;SxWrOvjgQR;;^YP0!4*{%<d-{qi`<*`%L6c|(LKCA{y$lIVW`u=IgeM#n@RwUum ztP#?^ib7B0v*uIJw5AyBldSLz=&kPU9u`Uh?&kz<2ymlGnqh|sSWTat%&TjnjjU}k z3d$&{6^^<14qy_KCbt7SW6L{(ZC0=6K$5GJFD*korEA@$&nhulRWM}Q*7 z!BH{e;#n>xP?>N$z+6>c=L0_Hjl9(6%b0+GON@J}jcr`cWBa8~{#q`<4TGDEL)qFV zz-)axs;qNJ`t~0AK)+m@pGp6eN&LQx(FR?(bUq~K%!?Do)qm}_PJo=irn}2DWn5sG zz_31E)02~;#XCJL_R(lx*S+6`svcj1UZ%CDca%hPh`MW8#_eO1i+8JxgY)hAJ7#$oLA+z5DG6P+6XqcW1sP&{;2L!hF5Q&= zP>G8o3Wyu zarN1W@|p2%=n#PWs^AX-^|mOt?~W^;Z|Eg+$JDaJDe`rMZ{cV+m)+aV5ns#uQ2PKf1QljYc1O)Cbfwt{@xa^)Aiz}WvbSrIF(9cYie-JOc!^8h>` z>!M?wt8lVX)oYEAU2q}aInois;+0^UYCSr3)(v~2UD3eHB98m>P+UM^x^jTn5 zy&b)?-&h$PQukbOdU=;FldS~a|JE5~RwddDI(<=G*4=z*!-1`f2!sZUjM)AN zZ^kPIl{Jo~r*z6V)30>xO?53O3ODKo%U~xxwYoOS*8iy5MH|X8z0FF2K9XPGlvixF zYvH*?n21HC>K_2gi7EXqA=PSUFK%^RnM9X+1};4@~H~` zbXdN|(cS}M&!)@9bl0}HH5=FsP5n=^R%MK5U87Hy!)|)emPf=cI+UpZTff+4pFp`p zF5fpb49ean$NmnX`rAtb66F$}ijOE(xrx#8i;RKlK`Yu2&h$n(>z#fQ!xJ6wy_jO) zujdG%44(_U%qql8-{hg$af1xn?2I1PN<``Qs0*ZXw#AK+G+eV$CL}J)0Vtk zb{#a8|BJmX*EoLxc=2g0+TQx>=N4yC^Y+NI^Icbp`If)T`KYb^;|16l?>h@4laNE+ zF?z-$zmYj_u)^LpwtT$*wp3`(mSX$F8LOIufA#*@wfi)Nfk;vMFY8}P#E6rZ)IEq` zh(twLlMC!Ia)EQ^yKp(R6};m%>#%0{j&g(a=F@a4Xu4-S5(ht(=U~dv!`BkPHw^Mys3Q40z!_G$`GdlmZpYCKQh%md`ajmeL+^7 z6)12LFt*?d6r0NyG><1<^oWbLpShFvEu51A#!6`#U_rb<($LcnO5--i3lOP^{G_~@ zDAVbBm{ZjoZ+lersZi$@57X9h{U(Q0W8I>Kx>ot6fQwXystSZquCc0rp!rO$vkBHB zPO!x~k#-{Ek~7WzH83>5Jif)u@garbpbOi%M4DHdWCNx1UCgMHhckj65!TH~f(7(aoF59N8>6u8JNoYgzsY81Mfc)!DDo_BS}!(jHvlC z;~_cRDbEj}+rr3S*r>81PNO_vfK?{FFJ=0>eUcEV%=_H4-?TsmA%LE`{B;cOb=Y`u z$;ngup-An#%EXX?vOHC!+wK!gbDehkkXoFq8uE&JAx9W|&}wH}(DuP+<6I{2XVC`6 zO8ht|hMvmTNE-53X|R_aFYU4yF1)-JeI91c6?up^afX#V87T-Y+ZZ)rCPLNPA@kV8 zLMs72AyqT)&owe8FG~|zUZmu7)9Z7vcb=Av1NYOnGRAi=p>8CIC z6vBaga9;qHlA%{x4>t!>6=fwq3IF}Q@d<^#V_j~ia^g^lT9BE-heb%K&3PXXO)|Y* z47vUJoQ`x!mYqk*5+*Ut4k(fxf(?to(uSl|?MDpUI!=P??D&ZE+|t+WYJ6eN_NU##fA`uVY+Q}UI1Btu*z29s6W7T=TGpJC2iK~ zbm*51*)lRq7{>gO;hn8*lyz-OsG*?T_9&8{XgC05>sR9#4Fr?pc zf9rQJz;aZ+&Ip`06^RQJ_Hb@L{KCuHopWI>W+YVnKAs%I;r(TE@G~xPk$L2vl5)_* zwf(fsxuriZcPB=ZxZ`jJy~t{zVFs;Pk<}766yLsWO~VCu1S|SJ(R+=o7s?^o^M?WG zeW`g%3X~EAilt@gMx972=(9TKf==|frK&gaHcWEF`7B1+hYm zcVyh)bSR+t>dYl{G4&Sf6r=s!$4xInDbLHw7cBH(j)&O zg%!nQcHuxN$wko#J4e-Kv~7{>=cYb>WY7kdkL8)$e1SW_NKQD)Fa%87VCZF`y6*Uc8$kQL~N0P|#O+eWnBXpa6sUzK3kTMmb9JM$D z37tz_&U;F#5PQ!;;-7WIkJXk-|5$$~F_Edp86=}n7ditga~>#1 zyDe+ihB?x906sv$zb#;Alv|ZoGk2n?US%q z^kpWPHYFMRT>*Dqi>}K}7eg;a`PkhnlE)@$7e?49hMyNehNb6VOof)Hx9jEvk;vjn zIX5FG#VRtv1j+${EotnS+)mgBFVm>h_i~H}o&*yW-~F)?c{hCTcq}YoOf1$)7e;G} zegnw{s)xZh@c&FirhCs=)gX?D)lx0(-mlEmonv2ky1Qu{69VgAAsVZ(1@-}TGeY&{ z!3^1N7X)G5&Y|BM8+IBbb)d*k@GCcBu7SxWOm~$o5jmfh(kwN>MqrV~c%!agEa$0Z z^p|T*YUiCnI0gDfj@THLap?S({b{;E_ncxsXcMr=d|d!Dm|_nZ>SlwQJkW(Zyr$W> z{dUzsy|ix9{X+%Uhh-AHj>rG&WqLn`8+M)gqu1S{TdRw@;AVks;*$9 zU#;aNVXW&e&z#-8+bF{T9$d=3V(YhWc)iO2zHnQ|+t;cbq9pG=N9va;@zmx^tht!P2`lRiLek6RS9b zT`hfW{E%i~@f!Z2dZU4^d62Ocw4YxKAIiAZOy?}t@~K41wf0)IM33A6NNoP~ir~9lm=t!RSm{WMPZWeS1-&gUZ=OJ>ZfEz1KB|Vwp%-{G!9%i&s|dpgJ{bi8CpQgt z?IfWDXI$GHA}@&E5Q8%be*8{{i8hBgJwzb(Agl=G3m9txa?_)kyUVp2Xg*0>q|bIe z?1KhXoj7jEOPu&zgK%~|%}b+WQG5fC$iTOK+$cjKO!t(Ji85VM%DS??DUnSeS`e;p zOr{g&FJisg(3(OSiRrgpu%10D1jISFMh1Stlu_C}U>#s~FG3~=8)sS9${#FJ~FXv&ix#RFJAwDM`Oq)>E%E{sVH=Xa7{>!KJM_lo(a(PQC4 zT8z-gO!dH_>~Z=;kx|fIROF5E)ElZEQ=x_+lGpivu^bfl z(>&n~AREH3Kd^%|7583bPzJnt?iM_g3kU=PfqX+YQ$Bp5(dlBH*i)2t7v=U-N4n_d z;D-6n<D@SldvD7;X5eL0W zS{t>vS&+zzu=*-Zqoa;k1}f4b68iQ!A}L`Y^O3=tX0WgXgp)tABfh>Kp+C|TEsC8_ z@qWWUBiwQenV49&Id-&Kkrxj(wqEU|PU2&-o4v)Qy$1&MD{NM^0t2RJI%WE2BYwIj zZyQ{njl9UB*F`QwGX~eidVQaSU+=K48tdH+oyB&`OO{6{^*coR_y+naSkrueIerm~ z8GHt+cBlm7w|q|rBype~jnt~>LI-R%`>tyH`qyXnK4(V>+ zdUfmlp}avN>*k3T0$)nKv^p@!jUXJA<~vr(aR*JRi+liY?PrOWy5U%t05A>BJqh$- z9$w=1MaGd#KY->-vqLK*S9yB`+=xM-%0=ClydFizoC-fhP`GW@90>!4R1#ZzTmV%L zlF*z(!m$PZ5e8&@+_;ALQ!2#To(ADYdHc_chDz?(dLf~egScBWm$|26F)m*In$6AL ziF&-&H%~bW2X7Rsn%<>3Y|qtU0DxR_Md`IGMvf*D?CZ>IGG5U{z(y8N0n2ND2_?RA z{_wOL;oQ$XqJ)qi$1!V#0!tlBW zS|KvPKBdQ~s;qDBOyo$JBAQOD2XEGOk}Be%e*a+X`nlBZh_3U_MrzJqqT0CQWH3^E zLITz=T*rX$+Y#KJshKlPDQpoy(3ya+K;-uh>riPd6W4`+*><`RzAdk+wcnUMIhRfL z=2Gx{ZP%KYe{7sPSLl65eH93p0s8`gZlTI#Ht&)r2*0mrDU2lU_t{grbORWwt(Q4w zYgQ)~*lG1+?BbgowvS+NuQ_-3BJF0m_&fxiid<~ZAX`~6oPM}cG;g+wkqApd*@J`l z<8rg%tb~&ljcI>PURBurgn4>0PzU1gHjsIKpQ$j#b}qzgk%t_>yPopP3(RnOdb|-b z=r(6z^Q?nQU`i5wd)>m~FO&J;og=08R)CKF!O<&JD$l9hbK}q2sv5sqeDw(g4vG4>hd0r(bw|K>g#0e+n$_qpJHr87#WNdn8+G%zi_JgoSSU_zJyCDehb=;e)0Tg|VB|e>hv)7nNra_In}prr6{3+aQDc(MIf`99vsm@f zU5!89>QSK6MVX3rU2`RhHvKB>=tgrZH=@@T&PMB43uhEHEy4ch-ffpntK(N!WPc6m zR5!kUg2mMSG}W`egRCh}8qNxu!aH$c766%j@ww;1Qs!}cnX|eUv~w{PsO5;HVumxk z;z~j;zF7*QTW6S9(TA`-n3bCB9ZAV}oJA(2aer+CdEpQU{W|?i;$oj(F3nAs&JVtE zi0e#I$v!~EE+FRflSUNh$&->nU2CXo?I#}1;zZi3)Fby}shRd}MT0*Cmf;dcTHUr% zWncX}QdnIOpi1&$8&g>#AZHk_x5tqw!h0mYT&cxF@i+%CR?eJ;e5K-vW-$B+wqkAk%D5q?5lcG9cnwJ&>KfF z#9x7`c9yUX1S{Pg?<4~f`=F17Tl{#=B11{z)R5`50sO|Y)O zA4(7usbHH>YK>S94-op}FFc{x^B^GP_69Ox#>Gm8%p`|7>@g??BbR|GWhCi~72+)J zP7qw?%Y_i+sKBu5nbZTJGdt}l*gnS2HtmX${C5$gD5@>RX48%an(o9RU1LhnWz;}2 z?`^0M=o7X>hQF#~VNlE)I;{Q~D*_%alc;seO~IP`cTN5skDa$-RD!l1zMl{9Ywe2` z=3Ty?V3G31f3#-v{dF~&b}{RxsyJ??Tie?8p#TBp07F8FSnnpk3|8WJ4!`rwuCC5_ zJqWRiO7G({ltZT|gka8e@lM3sTj@;Gwze#xEp-t_fY_o~W`o6FZ+PcKeV1h!!9%pb zIkhb+vqRYF7bei3Eg-u5;|&QtDUQTHPXs7fEJn)3J>^DQNRX+{4zWr$q$m?i9btzg z8;w$Ivo)xxyFv?K7a5lFTh}99t>(+)2^uukwX$uO5iizUv+-6D9=F1Rfsw~No{ls^ zfM?pSXt0xK<~aR5*>77kV2}fF?PN%EGse}fANm>mYzY9uYq?fPtuVXMckPRZ#vFcX zDBEcTyQY|k8CX8g_{j`qKeba z13_-~@m8U&n_U3m@Gb#Fb99{I>z?YW-x&#?#Pmyoe6q+nnY5XFae_(>G$>kB4qAB5 zQ03Q1J+9KF1XjVr>4}*-@$oN-a+5xVL-jG|=J6tY3#nlRviNu6tYsPH}Nzw=1zvxQw9Y*iNq*Rs;tL zjZSjAA>oS}yG~P^rCHmcT549G8_|%bfo^lc!Wwl9}?t)+0&AATn7wSshdPIA$o>dHU388(+IPb+0GdH{Q8m0Le*Wwx2dzKlcK{t~O=CYuVrawx{>cl9WWAZo zVkG+n4FO=JHbHO8HO~F}Ag#l4TtEktDCM^FPaHYOuaU&4{kIR>3c+4&V3`SP;f~2k z^{#AMK!vMxI~VtdBZ*1_uH4s70w|Rsnqjhk)B(0%e>)bs3qxew&taUDDapsxMg?Lt zj8v{qnv(b583+MWhE2DsFqkH>boxn!VEZja7R9iGBhGiCa* zJWZ5i9eK`%n_C9mWCtmbT`2r3&@V2ewg{%5l&d^vyxOP6dyl3&?;;sqMAY7}7Bz=z z=-Y4fbv15P0X#CEt(V~lprE?Lwz^TM()x15@2-#FME3aGyXlsZiuww_+nu`r>A#9) zlsE8KA`}Bd`WBKzl7z>Ze3y+}&fK++P{c%eV$D8h5zG2~9=;=wkB6C|9+X6sCc3Pn zpB~P#`>;q;BNwj)<@!!S#6(QN8HP`P`H*JJU}XYo`u9egoW8=z=#XxJ_gn z=fbSa;9DN!w2{>~D|VCB7&dP~03j)}eA}s6(EBG|c_#$eF!4Z*M*6_`Q4(Et%SJ9m z|9Z0_wK1`RvA_P`m6x{)qKx&4kUlMjH;VT@*+RmnDFCTNzKn>J7Zp zzVof|j@mxQ42CRF>$K`lCzs4^z{+T5;P>;`!)WG6r&p#FBH3#sLsE)6Jqni{Fx}0p zrz1#3NzW}&#Qfd9M}fy93M|yVs;Hl!k)2zCr7&?Xs#YylpSSrBds7uloG2~H%a9b3 z!S;zVvJZ~!Kj{=HQDT`)GG5HGT_O{Jc9~VNq__}cgfUVkdw^r9eKy{ZD80-Wx^IoQ zua^cr!4{6vAC;0hc-~@!z`h$eC5Z1WCN#YX5?|I>af(M)q6OdJwFXSidBx(8>q7J4 z&?g{`*s5MRF`at=&W=+tn1WzVV>*Quf(4J$zr%Rj+R z9B*c2>eQ>3;SwWpRMA&Sq5Z6*`aWaB*sC1Ib_m%%ID|{lOr#zDG@X#DTvi?)ZH9CX zrCgP#WL!XM?v*%7#jtrB#=!lB(DuOc2UeaGv7(Ddi)V3L*GgTH*<)>`-7-$8T+EUQ zCV{?sr+>r5JZM>j27vh9gLW_T>`_JyE%gN6xP$k3l`>DhRKF%!egkma+DRU3OGx&y z3E=7609KT+0xYDQ>;Hn@?x;}A2C%aSABJO0a~ijcK@W3~%|&seVtFGGKbY|k3Q5{@ zz*Ec1!p#fgSrk$1pPUXD?f3Eu43#mEnzW(C+4$n5;RH%*j3q(GGDv8Y!&s#X^vI%} z4MrlzZ%5g5R>o6x=z$b1_ac;oFhPM#4#_w>khoUh&3n>PpbGkWMS2M$LWFLA+*smH zb70DXN(uigm|T3UKA*YFYYz{JMblVdbcG{?=pOuIIrG(DB(LhT(%>K9>|yt9q(s$_ znB^)ps#O411??4WJoP!ui2Kh`0LP(yHoe?GvGE21<-D!)4%+1Yy}NI@xz=iG2DYeo;=Aa3D1slYk7m*9b%BpQn5O`hjvfS~P=L7L*CF7p+FVJ?z~l0nd( zPP9W%8Jx#32gMHe%F!MkZ&=vn+E>+M zBh!Sg2u5f9-reG-rnv^~lURx`r@+EX&k$gqW}loFi%}&SKxNAhAw8Fg*&}twt_~~& zyO@}}-tOQ6QeSXGg!B9ye)WeC`#%jJCP_Vo`D}{{He!HHM==~2*fdEO&*OIId%BrAXXrSr zlIbUxoA~>h7X427JBlensvW{;&X9C^$i9@VvmevFk$Que83-Sxmi%g=KjMm{7I?@O zHRkf74=_|X=>7i%sGl=5*;g6Pz{%Yryu@$x0CWlX7`)`%<*aOZOo zKeqU08NgdWZoHs~c&bj?_c9@^16W2ZwFWQfnDtg9zQe)BRBjRWU)-$Pit1$*?&}=$ zj3>9)piwpW_`x5c_wB^P&Lp)Q)oW>Y4^fn{-3*H%#rQA1;Vx%(~e5<2?MmSxqQ%Pr=3VKp&?jjGJc`RG@x2E2lZWB!{`Q7Bnd5M?2z{ z8P(=v+opnIjON7&xa@^-gJn_s^O1xW`D5#h76^Zf)9Z@Yk@8*4sOHo%-awXjMAsCW zOsI_!aX_iZQlx1!81Sh|0B=DR28#049el>7<%HRoC4%E!E(b`|_&5J_D8e=W*CEf> zZ*#tv9R1J)9>Maw9;VYR&wZec)=4>M?;M_~=N>+fA;+pj8wT?@P9Oh{3M!%d2;xm_ zw}ZQF4<^IMRB%u}Gul_{ha5f+Xdm5_*U&a3acRmqqbtFXgn+mvnGlYbF_=_zoWMeQ z@nEBIit@_sV`T;ZTVXFZEHkFbrh9=Gv3%erd_9VF?@^lN8#H-qUH$pxDV*Jgx8Wr< z$M~2K>l5^gj%Un*%fc>kHwfXM`}3j&{#GqA1Aq&`Xxs7Lz+lp=UR<%_yTH6S@K664 z)>7w(M#tjK@7HLjHw=hQ?vee~{U+xj4VJCmBX}UyF{zPDW9}D#a37*Fbr}U*eLTY1 z#1xbmCk^flt>U7*xT?N$R8Qg?%6EHzbO{BWcQg`Z9^}+)I~8Tnld1&hkzI$`5rBxo zm!oEb04=ogDPYR@P`cM>&0MlshFRzPN zu)vB}JnPZp!$gFyeZrz84~gTUW$F{K@1T!_R4|=K_f@{^=CF-{XxA9# zDuSg)CFE0AGTwVlL-6mC)Qc|x-qfa-K{6w8BYiEG3`R;MGQw~)5LVeA?LyPN?7tH5 zY6t}|>`u~|Y6D`vJu-2kDNDJP-G`lfrime2lHpHD38_lu3dob@vg`$Adr#|e(SIk<@v05IX0q^L@1H=J5wR$ z**&FjTPS`}#tpWY71S`KswAme*hjvY zb(3S`Ad;PmW5^y^8g2T_!w7cp8%j&p7uV$b)Vlb^bDm9e;k~FrLJYAk*NS6y=ItU6 ztf?N^bjXss7O~dO=hP!^OzE9;!!`bss)O4>Z#~A&W8fmTZ^-$r30a6)C{sTj@Mj?f zsPf>4qHw42jY=WS%y`Le)A^DIVaSY&K`7(o693f@3}qa4E0uQ)t1bsnWxSfcSo|%% z^DjA=)cjaPN*t{J(+Mr@QmoRwrMC7+$8=gFfJF+b`<@OkCQ$*WqT#Sj5I9PS8iI_^ zyqzbw{&eT@kR5LKav@Y@$q80Owf@$w}Hk3)M*;dtQpuTNND#r}G>#Sf0FWdiOl|-PhhW}OF z%S#yrDhefxfADej*t^P$t$sQU*v3$V6K3wkycljL{e>cpTW1Z-q-HM-U|_eYgC_t$ z)nUvb!^&+(*8!X)`2N%MO{L^@3%I`Y(rTNXM*!I-SeW=hNMK%c7nD={zL`Az zgOhZpJg?$|HZ6Hy66TD5cBbmfHP2H@Y&!1}A&+0AqN!7TGR9wG`j_8{-y5(#f1~al zfV2p;DdA<2lg`Xk`JR^CzF>k`3!_W1K+8yJewrfXBkjKKHXQL4UA3@OPbP}^OQ%#n zP0|G{m%P8=k$Jo088dy2%h89k>}0*getLc=Kb|H4|KG^uD%FYVnEu?F&?kKiv*p`2 zeK57;CRxzk_$nyzhK;oMN|%^hEfz*%H<|!l+jilGWh8JkfZ1R$Gic9Om1->(5rvY_ zsSI);@6yUtfx#rC1>mk!A;;8WJR{G2Gf9YDJ$`STGnI~2og`Y{TTU~GFwfjDe5C}m z@WZgjn=K2b`YxZw{U9PAHBG!u+X=Gqi$}V+k62yg&y|gY z4X<5HCA9FDsgkzW9J_l)!tO661!mJSCy$OC`Oaeywrs$(8awuqADSju9Bb=vUo=fA z6sM6<6y+DxDKkA6Ita1qA$Dhdsv2@xfNEYy<_akIxATfSv8Rmc#9jo?FfS;hD#x4$ zLDR$Zn$vB9S-bH$f;N_;A zzl!^m?s#MMj5zc79qmu9bvYXTGArz(_5Y%aN%tcrzeuS4Cvv7Iwrzo=p7FL@?!I%@ z_!fK}>ac}Z4_5=QqCPf*os_xD68dLs`a-bI3pPp2kNRYOV6X`DRJDlgHYmU6Xp)TO z8agL(v$Z-fU}0Q1jcXy`3a_YSm*O?>Gg?=QwhtWQ=Ptt7G|>nO;???Qp3Mj2w=>v9`ki=G zF8^zwhRZjF-1f=Zp%~9kOnx{rA;qF_M|4P1<0~BKojEgR#@nXpE1@7#5}Tz7Zh7?| zuO=t=AO&;vL*6Naa)tLbTA(zAqHp(B4>0t3i-o$HQ(20Q2U0;%SDd+1iqcbj+A!uC z)=1btlKMaXbr;TR0K*NeHHehd_M$QKN9!qV`AkJJgk{&Ia}h*f=+jjBRtcK#*ehV2 zjZ8=vJBm+4y*Ph}dQQNzU}!;!J(;NcSK<9&P61YhV|WXgx5oxqPxow5#|g{o>B&UmZCDhYI2HC^$|oU=?D>x&)y8l z5QFJXV%u?9m7!innR3krb{&(=hG1+GS7TO(esEM%Is59q4r*@7bGsK%)`3YVVPSzF z)8zu_gm|tie7B}GFf>CsxV_&JfeaidZ2AS4v#}{VMrlXxb{J}oYDgBu?ApWu7qa^h z2WKybeAd)}gs==+`l5=xrW#Y>0!v%JDj^KyM)pYq;2-B9&KCUa5yv;oE{_}jA zv?LG{=^8=TM}Q5zJdj`m5s|#57>`vJW*;t4F7{uR2ZF4yyjW`O(zOkeSvG7c)8i+L z*}}F7^MjdB^U@+DVrg|1vVS%=2vgu0g`1wx32*~A?pm58I+tPPb|j!qiveULzHOJg zW2oR10dOnUU!~_xCkpn4W@>%2^WG68-s$$i*88R{Sx|1* z8NvCHf`bMIiY}@ha6m^Fm4lR_Oa+2ohUM?`LvMFI5vz8TZAPq|!q7Ds)iiZ|6d!6@ z@N)ateYIAN(kP z+(k_Er?6X8yVEae>){`_{6=mdV(8S0ckgDS;^pcbt4=YoFaa?OJqCsYK8Uy@01E6d z)`O}fgsMvUm`Ul#i=W*$EiO@$*#!D3XAxF8KRRIFwSl}v-0oru>2$I*GJ30F|L9+XE z=GpbNp(0lE6n--8aSYw%}N~YjhVrLXfDQ5LyXKLZwvDd8vguYHLuIiXp zG==xZUh8|3yv2JFz6flwrVdu)Q%a*z-IA-y75Gl(-z)N5+;S&RuocAAFp-)7WAY?9 zY{4_={mRcjSL(v~DTEhVEL%ScvosN??h`_tIBD0>CB*s&=r_>c%w*Qx({uo)$WLC` zwV^0T(P-Bk5P|=o=jFIUvC5|egcETr6|qTJ zIH;d@Pz)Z5^@&b5TT`>`%F(HnwJlK%#Hd!R-ZNGa%jSko-b<1tCo5`21a(!RzNzZ! z7zs1MNVo+p8h9$IEyFre&8x8fIP?;Gr+tA2zHg~Z}>~FA-%qg zIv)2_t>L1VzKo*WW%mY4xSAx5hKvM2AWa%bg5)HDY7oNnU_YPD3j{r?6P6uF4 zfNztnuN+DelEOrV$7;y(K&`mP1Y@VIdR!h>0fescb)5f$L;JSj9pfE|<3PaR$8YYq zB^3fGgg30fpvTlhSQ(Ec$dG~P*s^$`1fkB>ml!6mkLS=$JTEO1*0Lpop!L_h7ay6) zTye=tzl08~nn282T(ibM1)D3|Z&Y9^WVo2wD;_Pd3-NR<)~E$j>79&AYuT&8``qpx zzEI3K!>k$}Iu@;S<__Bf=5?f>X_NoaDH_`XDnZ)Ilqz5b+pHML5$M=@ zr8oFL7Z}8GY5CWJnLD|b@{KE(XGcvhC3}h)4Uhd!{Gtpp^sI!5IO@vq#JilPkBh(Z z6=4ZNNr8dx=-WGEkY)CvTeSazXVW0LXk|g0^h5!*?e8~DE3h9k!2BkCdCVvZNdwtF zNN~^UumUBIHwfQO$3~V}2hF1@QydTumnros=-wXvxY3A9oZfKYoFwB{)mmDDJ0*Cz zkD#CD0{uXLYgN+VFQwC!u;cB=>aqKgsxWwVE+U~wO3TLaIC(GwYS%+;e%WypG5L(f z(h>de=4N|E%tBzZ&JkqSuX#3^k_YIO$L{WUH01skREaDqRM^?T`>@VZ^RruoyxG(U zs@sdttoN{@G*I}(2vdxpm+{brB3u75D!>YQD75fCTPFsb=_%vhAq3RczIGl8Pk`N#)ZngziomjGOJ(@ zo_2ddN36;B0f+fMSW174K7}!(hUk|TJ(z1?I9gx#j>Q`N9_1kkP_5$6O~PpT z*&yuF&@R$zJ*$7>y0w6V)lILQ%C_Sft}_8;BP~BXi9<(c}_=!jt?}% zdxMBWNFO6XN&tLuo)(*UaA?Fea8;36=XWr6YA3QQx$tfa&-DBW)owuy<{IqAZS2{8 zW0pix02_uVzu!>EpB*dAR@$J2@-R;X}kDLq;WS?o=|<03=YOgS6~CD zN6iPgDKW{zjZ$@JpPLGr@fKS+!fUii!!O(S^s0m8B^=s)nn$M$tFV>4mfS@ItF4Vf zU=FpYgB-ymZx92=EE6p6G+a_?1*=!?y;VqW`Rt89)I*^s=L=Z|_k`}UeZbpK39`F{ zaZD>&;Y&hyshklM45I#g4KsqA z(19(19D0dINFD(fqAYr)&mhW;g$}nWB9%cJfd|ROkK*Uqqnj=D0WvnnLab_)Jyu!^ zslOoQI-i{i?G6k-YpCvmcWz+0iDhG;|EhdTK`1YPNRyfh7F_Dod>`EB^aO3w?2{(Y z$NhQcdDDCKdbk$>m`xZokV%(|x#VNQ+qnfNhbnjEzTAU8(NJWv7H1W0Heq(E=P`p% zG2N~Jc>W_Q(I_4vm`it^k@`@gZ4y~lq~T&9Q+LrOmOG`9aZG>kY`9AcIz0c?O~BbdZINLpp_H`6H9_=Pu>iIa=Z(&W$i=rV$&&+#zOZISLcfsr zy(?)^uoe$k*sR}2G)Dk>DUFk#8!jfIg~M;M3WkkGXz?|O!Adzs&*7WTTTha{JpywD zeUGr%MlooBTy-yr+*VDy!zSvJBcidb9hhH-n;SfshiybWHHS-Au~d>+8r4j&@h$y` z!As!JVoLUp)eI-rwXRDq%hYb3BF|1USwWHY30N~$iHoWE{>PwZCRoKenC+uwjfs;s zO8V^FQQ<8>0Y2S5yU&?glpl!Ii}?cVT?oo99OGK3;qpUw(AWofb>Av&WZM3Rk@rur z%4n3d)AC(Jo8OER9&FzMvU4bk8P{K_0nvv+ zyi0P*K#rzAn8W5$dh?r2#sLG_pd@e;>=AKKXsT}-!G_+VcOM_fh?@qZTGu6)Tf6X8 zBVzZzZuRIZJYq zjG9(Nm{WNF^`@2Z8ft|Tab7%;iSg8%N8Oz+JKLlwQv>0>K^??L&PoH^jSuk-D;_uZ zw)OLkuNtNa^6)uyx7ruF2s|Z!Hl`*er^h0_${(mL=$eH1+o-7IUp=?q z_qgZU+j9nHo?Ytd;=)7-T^*Q4WANV44{0 z;PxkzI^fbO}$tCk!vgC;8sVZEFyVj;p#@Py-O!_2Q!HM-V^{aV4==P>jY zbH$LFWMS%bFo1zct7_PGee;3yiG9&CjSM>zGxaMwZ|{<#2jfNPM1{Y(l6>F$Au*Te zow^L9N563n-XTIsh#4bZZNu`h^!=!+Y1E8b_M~E@m1P>oF-`(qW~AM^@4V(s2mbGf z#Yb=eeApJ3HPw^;pe<=2)m1Nc(*r)S*n{95TJsmzR-vO+(0vRja?lJC@_xJomu)v9 zD~f&Wff>{ZgvLE8$XKphDI!=qxvR;@eHfA-UIHOL1@Qj<2gh$0m2Ls3#bTvz>Rg;Q z%$Qog3^=qlmy^%oR&8l~vp5=`pvUD3V8i70!@!a;tx$B^C!QRF&DwR9=itgyb={mpr2go_)r)|i9Z^k`hYVMN1 z2`Qu)77Q*~uAGN|T=K77-ZE~|(l7fcu||POhmRMj?l^);rX>&zHEk=BFgqrzz>Zf{ zz+PRJZi2<)r7^$wEK)-wLV>YlGrzqJ4Nk&EKirhKP zg1=`nDP1`WNfDwTfKZWNd0P%-r?*$QZA=#3X}pb3@n?Shn3HHO59}k=*8+g+a*&5*-RZ&-ysyZopVvE;R-c%3o{-~FZ8jwb zvV5iCEdjAmJmUa2vKjdnqxVaup%)?_*A$4X)RMm@x*tAI`5LgGW`jMY7@VQPHfRD`u5U%IGk34@c zoGJU|C&KTpJg)Cdb8ezPlmW}Vf7$YAX(hOXJmRXCqEn8VqE(fqK8n?W0 zX}xX6%^E=8epgFozE(_GU_t2Q3-R$;tZ!L_vo7S})qL=psfYGMspCE~a2cVNCvgq{ zA9HWix{G|%f=%H|I{0thd)F6I}s zCfwP?^3e|@*R3Z;kWR{_#w2BD(+R&Ik>QIOeg!&# zV|q_==tX03$@*-=cTp8sba|!zOsf;_={2|xDVK1E8FyZ)KLfp!8k;c*Myi3xk?}yu z7kYWedVN%wcIgpEtRvN1)fzIOaRed(y&reLAiL|qvOp}{5db(P4mU8{>uepj$M)X5 zg<+4&7|^`mg1|8sc|(-#Z^Y@wn|a*5UxTLhA8!7$7gSbj27==uT2bW&E^CJnS! zm0zCaEm+!H*DPn_w+Y^pa*x^iIY5K4IIhO&p@8vs?{*S7B^&1@P_B+9PqGrkP!q7I z4y)v(UdtlCVdpN|9coTz5irJ2JN|5Hdfzqy#tL$5K&~4ho#y^FH^EwW7J8wSvTm6z zM2<_f-{bPe%++1yvhCs!UqQ;(q&QNNcx2X1O*Sfw0hr`$=WF{zxYkp;FKs{i**rat zEe+n?b;TwR_sJtHnt<(5XO5zL# zN(_)?UU=zX) zi?rtd$QS`VA*=mrubyZ~})64frTpOCYvpzT?gjFl&&r-dmUUc6?I9Ae1eI-#^dkrXFtO2U7l} zZVS9%I=M(p(;Pb8*tAq^YW5QBS$O z7(d4jDIu8aZn4zroSw)x_V=d6(`7zu%+sq%1`cXWj+zf~gdw00HZ6|j*gql3sqa&| zCu9=ks*tP{sE{H4kX`HPhP&T1N@26W?QT9TtTc8`|51EYUP@2!@|wCK6F%&5E|6P3E!n-eIY{~X4eKqWmQN%zELS&_V}>i*gAJxYU{?`A z5i&V~lF^GfqO04qr~W&<5{w2HV}KqG)n{P$w>Ha^4Z`pBF$2>WFe?V2Ya1skt9>Vc zYtIPq@y_C9%lPL8(co#CKrEGtBR~`CiNRn76cX?Y8~gg{E2RRada*FUr}CiUoqB%h z$I1Nh8W;PMwoSRQC`YDh`PKQK^=C| zvtbxp3>b__^4>0C3nPKsJMB z9mQ9Tg#{}JobC6s@G+*kq3o3k6@tEJ1`ETidis=5wfGP+PC3Q(@wuP`epYrHZ#Z^a z9`p%3Jdx+Ka*0;FA*oNz7ab5o(_7UBA-jxMJvY(yV@aF*tj$r0z^$L3)>E@k65CFA zoXOt7kh-JWD|usHZ#QKf2ge}_8ZiFtRC;4&tmsAC?k_aVq-x6Mr`KW@JV;XwM%9E7n^8JwU?0w1YzDTieKh-K-Ju4~X}cVAvUdYoFdR*0g1J9S48N_Z=F2wkO(8Wm z_Bl;({}n))<90=qI+%lF;5v*>S7)O@Bu#b-`OtSXjj3j7KdoFUO2b|9h!&ElDZb7= z?>~@-#ov2OLSevqM3e{Yzoc;03fYG1nJtF6$;$A8V;S>C8UYZY?c;U>m3ct(^)Ap| zVLSx%mLRK>Tjrv|^xxxXat zyhQBuh%HFrUd3sy73v;#npQQ8S(;mGG(8^LJl$r0fS$Fi(>l9m1;I(@>4NMdudko3 zZ{T3-Q7sKa!cFRtOplmpmAXw3*lvSu8w_jguJx2BtZ&|N2$NkcPaemx1bc20DBeaq z#%cqA%5W)xiK28AE!-c9oD;?@Hhw0;tklh3B(MD9jMo;4h#=n^VG0+3Ase!fiySXx zZ?+PCTzA@w<_>D+;hNq;FxWADd|x&{-$q@EzuGMnj+!WE{NB?EN61TCY*XV2iDvCo zmt4==`SE>QBlJ(-svskJB%)Uhx}4Y2rq}gCH3qhA;{+Qc`zDEhlbiAwoNw(p0r==j zXwBc4;1UO85%YNdn>(iN%s$l^*t}Fjstv_2%}?`v`G``{j{=Z-fWDW8*kLZaEX<(^avJ5w z?NW0#(ve+=k;s{@!N@v!z~2k>5a({Xo@+?6QxYo*^)H=p1@{!hEpUQgEs)0r zJi1e9-}1Qdwo|08u%Vpwd7uutU=dcVZs(-kI5_m3Z8+`D5mk3_uw}#>%$P9NIN};n zh4YFg+F9^Qqx)=tv3wAj*O>U+)ZVrfvDOaw5h%LXTie*hp}>x*MyaoeGmHhT%5MDP z^mLl>`*D~E`p@#V0B-IYaeRi1U~*$SfxQ&(jh#fGafzFjq>7R`6LmQVuJ;$|MCeHo{j_;NlE|}1eOskfZHN23^(NtH~ z?@80_hBK}q_3+6BGYc7w;u_>9|x5X^NRct#aPn-_!2nIyxD!>cwi7=m(vso_PD5Oi!oO0yXD$+rvD zet69`1&il)izGt(Xdhhb)lc%U?rfgiAhUm=z?;y6vErK(!bfCz_g7~@ zP_`x+r2Y0bEq?omJgEC1IiyxmbLD>YpFF~MY-9@xXHC${ZXNfpy&=3i*XXW!)zkAH@p-F_v2)w(aQ8G9s{hFdKgIQbi~V2aT7@aV`888Fpurq)5w8!PDZel&jR7R=!K^T7u_47 z$My`L+wcpdp2?l-pd+CBd2*Xi{m00rvzmAazMq_o{Eh87R@<`cmAoHv8PJ5oe>-h}VnV5oL59Y`hc9&aM;xtC zN@*jm%Ov1gP(yBH=t$+#$iq9Lrc=b2@5J`78C!lhH5A-GF&(F9GCVSRG3Pp?pL7t{%kF1dpvv(va{^j&xo5_`rE9 z4AgG>AXE;2CPOEcx}ARxk}c>sW7*E@}GLCt6%**;*qiXTNZib*ej`YY`hPEnX07(%I zF5H$LMeVvy%Qz#^$QEcm2~sttkAD<>7=Oy>ebGNx2*7`$)la#g-APbBoBeomQ(rw=wEw zNR}|aTSj1BNL+3zP%i1kYkZedBP)ozHI^C&sbugJyd$1&0G0DBoEIAPfw zj=z7+*@hmXK6QLjxj$IWr!t?M?8B?em+<*v4ZA@N-yaPh2#_~Xu*1dQWv#kR4SgjZ zv@t(pA3O^76Y_d#DtFb^5-Z^7G!y zHR8Y=m`^Y#yhskazD8;}Zw^5nb~?jcp?Jv1yDCUIrx|dw*?cADJ9Ca6+rZ5xKTv7> z09!3d%ZT~@VsSv%TZxBOv-X~@LR3<_@fj;66L_bHne|@}2k23Rzt-L#INSHT+ z#Tkj=s^XOwVhuGBDbn!ZQJgw58;B&!A{ILsG@u?%Lgr2eU7& zqo<9w*orMFWk2g!UJzeT#qvy*1mh>X+kCYj(+yX84FD1J;|Mh0$s}NLz>x~OxD@KB z1iwb^p~fYK{psGct3DLn+!9@(of>QA@Y?(ac#%pUm^qM4{4*v&tJ_ud8>odZolG;GDa?ZhKp04)c7(-iLWcSd z#?q|RU1T3%aEi2Rc?-RKkr~BnygNl2kt;IlsRLw)i_w0QLJCjzktxVs5jDXNLaq}? z^z;8~P!3bnfDo}hjjJkBWt+Od2lTo)6O2AltY_O$iaA1KErc{|r0zgX5CQ1Lolb^8Am$Ny#jj6ld>|2t zneehB^i`&gWP;jwahnXVZJe$iuF z5O}^XCBlrn&pAk7W>&oJ>w!-jZD|KQ*98>>sWSS^;xz6aWSh;r(f?TnDC~eIGQSC= z>%~(LrSrNAM?Y*lb)87X9hC*F0dB0$1IVH8QA0eRZO|>++>KUI8uf3lr$_Z8^NAJ5 z9ohD1oQw5qIRwaLW^f4Q-P?$K9-CAiFaZ!jfi@v)oB*qu>-G%fO6u@YcHO-2dDE=Z zDy4xZhkOg?qvhd?*@d}&^#~@9o!o-6IS?=(u&MKQ7`ClOCZ2gLwcJEa3FH?u;DAhQ zn=ia~8>!D*wwk`87*00f!cWc>tFTK1&ppj}^CIFkS*Vr{MQTLarKe)& zoCNw;Au_}J(@f3O)F0>#-Ik5l$h|p@&*m$CZyc7-GbG%M1<=7TC>y+>VM{yY%hLN3S^qRHSVWE#)q zx3AfF(WI7x+68B^*(RILJszL5Z~pjb*$I-LA>B!96JAwee zxeVvC=C4Z8r04nM9XiH_$l8L6 zE?femzP7s&_*-AnvAD+@zl0>mnPWHq3bA)C2#8S<)n_VF3XMS-L>@KB%AZa>B>#Tm zabpk&r3mveaF{GI4gjbrR1krj0&J0h+aQtAPQ8k6oo!>(lak9Ce_@R~=VFJOr?egV zye6>%H8B4tj^OBWVDtf?0nO70X@OAa|I;sDGGxZ}`|Oaq3_zPJwRn|-Zz5Pc1-*+4 z*QO&j;R-nOUz*ob0ddG^S^AYjc1CvK_PiddA8SVH>_@FV-R9*1C&>xVM!zB~h8D3P zfGr6d-PWI?k%Cb_MI9_uow3)&U;|9>SqzGFTR8}?+KaXxsg&WfvB_uvc*2K{Aa1)G zke+xdhEOmHTY(*geQfPOXWl;p{-r^>z);3)BwbU-4T0N~BQ$s?KbFDljG>4(OBwq; zZV6O8|J?N0B@arm#mP9jwmdDcp9QfZl&V*$<8xtPaqUdTPoHmY85dTTwsP|m_~UoI z#>zJ)F{IesUrFD@nfI5Xz1NOhTEUsu`I*O`N538?w2KAJ+iZHI;*6-*-H;yf@?-FsT&5b zv;uUHT{S&vX&!>>lXruqklGM9!q-KYo&NJ5c4F#{!miH$piURbFeki@8b2jt$|eX6 zkO}kbCWuE&uONz6BisqkT%nE*TWKF*3z*nD;RruzPIv$8(bv=1h8BQK)Y7qvXeOA@ zpf_m(u2L)$jaY5Ql^3Kfk@+#W_8oI=6YwxFps95Y>Wh@a)rYvzS9TE>Ewn#zqE8&v zvy$RAjtDeyld?g#QU9f;B-M?YH?Im@V2O!rjs@#{v6Q`8W}=p>*`cHp6&wbnE2nYm z`tRT=cS5n|4)UoT!R$98dTK`68S&+Gsp!Ho=*-R=5?FT?YuDB8s#N%K@M90<9kYQV)2>V=o2Y zcq%y^mhDuo4?|0=7^2tB@bab2J29J(q5_a@`eZ(=UXV2#__5d|TqL`3_%agqZ6=Fj zuJ`#AxWlF-wVZH#C1)N=iv)ta`fiYXNIp@^{GId;>8Hrh_~$4wzlDz#fu3J^G!p*dhkBdC?C zRBJ7*K4~{1v*x(qU$Mk#PlyAtRzFkg4;Fa8uy~PT7tRpCixi*H-BV)X6j9NCGS#zG zvb(AaoxuxTJZFv`0_Xir{*rk!sIWDPx|yxQ_P3*i)oDC%L0ge@a1T9*dFA0hYFzzF z5;+0gbLyArS^du5yD>WMYX!6rHrA*#rGo9w*6F^4D{w~#5Ea0bD!>!)^hWM8hK5kF zQOlm!h68uZS;8Pz%&!m!3X#oB=fwXJ@7MyrcMyC25Vf>LLL^OiAp9{?`Y-9%=A!CV zy96Ze7a2LMILAp$I2RmM#;ytVT1I%daZ+-_`yHj_g z0WcF`weo*if~CA9}SSLPuSg(TgGw8^tZcA?G5O_)QLySis%;jqH}*$by&u~tY;d3iYU6zUWf zQRQ#9uQi_o+@5aH?kl*C5C&ODb^%+hab&kaDQl_i?V^Hd9MiwN{DPPEiB$C{;w^K> zlQn&KiJnUt2>Eu439IE%HQQRAj#zChyY{Q>qAA7szF&*lX9)^9iTdOQK!GIGxBW+I zd7;&^#Uxzze4B>G5Q{-uI#&Z7fdOMr+^Y4}32=5&3YP4fDm$!7JTk|N;4i<}sOH*(;ik9IvlPqUtRORjaCDOAA`mqtmEN0huze5Iq+ zI! z2SC*L<{1HB0w2GEF~Lb2A?HWF+5UbttJZw7k?I&dKJzvyf_CV4L{0L7sm<_@7oRp1R) zG%#VOFZ7zA6iYtv+8e>>TvhLzl9l1EV*7rhPLv*#u`N@W*=e*m@TV7SDOaCcO`jga zkg330qq#h(goH?A9&<{6lzL++f9%HVgws~mRy7X$Hou`d6N_hot19)z)WNUl3xF0R zTjmzGS!;raw%`%TVsnPJ7@41bwU(+uR5sZ*sxY*Qk3&IjFh$mHRq=xEMNqAiVUV*jb-z+_ri@N7d= z*@iS}g0-TUyTm8YGKe&{+h~Y}IyEmgtU=-?B-Yq>6@V0-?q1!~Q9>@U+wg>^z^#m$X@|k@Lyuz|(+>K10kPFDa=Z0>K4jDp@z5E#ar=!3cL4C(y%0J(d zSIF_M>zic(Dj(#c-rS54#SsRaS?uhSalMYizLsAzt@U*w%)AgmhCqraZ@8Ha`Y%kY zm3w;5-S?i#&8HFJ^ zfwu`Miwqn5zr7xDJb>}%5@MK^2XlS+ayc4y(2oE}NUnNRxz4j}Cy_h^B$#Pz!qDHe z7EoUg#cE}tb&kYEljeR-Jy9@pQHY(zQE#&+|61G$I87j<^b8l=aHh%PR^%wX1LLwq zUH+>Bw-{6>H*?l2^1GUjZ%fhWe0`b)wxDszdVy|dNJJ5HoV{@{y++9#i&1*XraXtR z?W@z){A=JW+M^R9^bR>f!$FYZUay|ZgeYlkSR|uwtTFbQ=EOk;4R&ez;nrXO^-&_0 znEB&)w4r+66x1T2bD!D)%vE=@+z|a4LuaG^!Mal>?{?0&HoJQ!#oFMIbzcgaYzjRZ ze?&ko%!H3)Lw&7r<9jcUrmM0pE{tfdKoTm)G`^l|!-gp)m4uxi+cOhf?--gy!2W85 zK@}8th^IeC2A>t!-|VqLqiI1*C@?Q;`|*6%t)U(st2?%xk5|e#kEO_sq3@0A0xhf; zI#30sd)T0GtfDLPt|J889QEXT0yK@5CK0e*eB?>k4nv0ay0GrX#5dy>@XFj8Ybft5 zw2M9)DoF%cXXIi^2>#4a_+ibH7u3`#+gLNGf1^%p-M<(0c=h08*mR`@CwE!}cwKf_ zKgasETDgpzAMgPPS+fdb2jmKaT_b~RcAl;Isfn6Ir z^2{AkCwEhG;-iPpmPiDbeB?`|m8s&4;`X8aw)b@{>lZWa1c{;4R;rIL_#Huz@pgl8 zq5=Q=D}mEpGf!X4XY!*(!d%@;X*3izX)}15(&SG3V4wdcYz5>UzE{HMj!=XpNn615&!MjgCi%N}zX*x-nnJ0KuB^oeN z-_qVdozY~S9ux-NBb#sfb#`N<3&mB)vll1xW_H?<$da2VSw@TgResGB=X-DHE_t0c&M=n?L$uVBLYna4}$C+vu(6un}CPGf|k`&MpCMSymeK zd7e{$DQ$L+g^fv=$(@B7SJF*ym`XX_KtEu?N%T{0>6p9fbOv7?PRs|%+^6)#>J*pR zN8TKc5F%j4rJMknS}xJHK&|cvP-8#B&Z3eZ$#ZG=i+^;?jZkNXW!S=K^_(UOF^6ZQ z2Cq2>yu{S|oUa5J8U$aP+8x<-fZ-scAf2=l^{?6bt>BU0R{bj(j`6r~V5Q$9Rq5jc z^U@W_IRauxGt*l_wAC{z$sF4-Z;^0cVB?KL7?#uf0!rU>hB?e1Juju7`YN$XTBpz4 zW%UI1;{;WHj;yey9O5`70;sQ?q&8<&9zlsfj{({tpV42a1u%v8@G&PEc7v%f@vMZ^ z^F8S(&-3N9bcS60poJy0_H)zpF}r_Yk;Hyj?oPyrj9N8}i+UYC4Q3N}!H#t_55GD{D@(U@2X&*yaOZ z6y&GWPCMf-%mHnMBtnjdHw5DYBbBCi@*(M|sSGnw@)NYQb_y^Vj5J|GwFXPq&dx(p zxM`%E((`81`6w@a+4<79S8$#-@M9F(cZU>z3k*Msfz9^5gHh>}-*7@Jk}&E^Qp|0w z?35dr8ZD74OA24+xGyy9a4g>;mQ&oxcs^d#>=x0IvtDj$WI zUamD7Cs@HQ#TqQDPdWmRz>-dZZD+KuiH4elgj|umr@LY4H+LTpQ>&gul}*%dIMJNQ z$YXlWbF>BDh1Sy%ak6o~e5#?WRU{(7>)vmNPsa20DdXwv*Q*r&o4z5DYiQqrA|aad zC=Nc$2l%D)P;ggw&;vbHV1P&nIa@FM^hD_y&(S(-bMihk?4q{4B~lobV-)i}#(f$^yjDn|`GzMjB1? z+|8?yYI`dY{59H2qyI8m1W^QsU^(0%H@@T|ACtNAai~#IszU69tdL|^=a4Vu%td~f z(vOcBwZ+OW;up+hy-Pp3al2uAX%FJEdgih-L`Qi{hwx;OKgBT-&%U)f=8PSD7A=!9 z7ra@+D~cHjGnSP!4=toXVL}Wc_cUA3=8K>Q?1!s$Hpg#bI8W z{`Oe=JTQ}d0sPNnO?sUJ;BGOlE?;)a_C~wv_yq*any(mucZ6E=KO2B|xTx&iWPrB~ zJzifjR4!18(7RAM2@SdtI;>W(>XjcwgG&KMR`a&_v zx1FzuGf<+la2VXd;!@ zuJ9HJ5K@e?%o^UDMfq*IvOIJwts??YS;-p=H2_vo(@5hvIvCxENp&3EUUAb*i%1}W z?j=lkuKd1p2Tt|$xlEPvUpvgu!?WhsecJpQiKgQWdR!pLcY~;*a+ZbKM;S2II<3Ac z=`o5T5>9Bni7*3^Zs17s(X>RsjgS?-lsTS(0x`uP4`BP&pzSPpn3k$ZMHLkx!|iAU z$o4N%$nb;e|DH=*_6y0UCe;IqTuX`x*27TY#6hrBEm&u1%Cdxe9b{iHJ(0nf3BbJw zxJVqH5MDe}*9gNZFolM5F^}i1D~mfq>=iBJd~Z7JushD#%1aU)MNnZ0?ThKGogE{a z=Y%_mxe*C}v&{=i78R?|6Ow;eOQuc78499=wU1#?d550lKXG`cd}XUD#xME)0^Za3 zrj!+l*YByqCx1QeU}X-vM_74lDIARzyBuL^ zOFfZfR0SyJi1SELGIKVDf#@{|(5uYuN#rjpp zN`4TdJw{@%Q!QiCk; zi+qqv=+IeGnkD(ZjUx36+@HU%{S%dgeo*x9W78mluc~iqpl=(jlJ5(hqfYf{>;kz( z3&=9AjlbNr$Wuw`HXrDz4;o6WZPG zs%Cbe60pceQt%K-e&#<;StbN|-E$o~R2)1cRYDv~<|Dff!m+FC;`Eu7+0_)QcLZd4{wVjLcHQBVDsWLj|P7+~0-4ffE0m8!JF|4vh0Pg48)hnZd8<2NpCK_?4oU%2XX4U)ZI zbu;38ra2=S>4YZZ8;Yi|@hO=Y(Dq>jQ?EQN91ZCAel0>1*AFRTNxt#Q_Any9o58{) z;y}#%Mtn!ADZ=YxTB~qd*9K)kKk8N!XVmXq^NZdeNX~km#9dw*w*PR(jWuCT4Q0yd z=llYhuWz@(ZLIMt`I#=r!+YO%T-ziftS!}Pa@%wXvV&-I1{8?Z;e0L16f`G z+!8q+Ryg81D}8V2y`35WrL+$?C+E+-FV9tmz`L^g)Wf%4{I9pYLfU(kjTN3_I;h}G z850DQ8GOM; zHhTG989^skpgkaJ0SH1(0HBxbAxAXYe^;@RL*eJ*vQ@=Tg4}R4oX^+%^!v>nM490wQ za-hmaD;ltAD@sYKN`WY&kd7HhCDG>{(N?mizb#V~`^~8zI;rx~LNz6Mzb|B!bGO>6 z1l7Y4+JbSx6H*Q9?g?9utC46St#D|IGMqTtq(;FmvnrO$7i2a$0`aRQ*U$c`s)M15 zU<31UD8cdRj~ioCSSzY2G12V{-H^fs4wER@Y7#W0=h&(-$A5c-5b7KWV1-RHJA91S zFk1UyUT!0N0GA={1U%0nLl++Ln-Wb~x=7S<6pnN4c<*Ml(Q@-v+&$#?9N%C|J}K$h zg!-fH7BvFiPfrU2p`BSFQbd~U?71ykYjtt%ZBe4@pA`0%>%s&(Vu(981gk!WJ?47% zmSsX924wgQU8K}#R4WHTsLUer!ir{e=z+|v&D^gBw+nFuVjg@2k)aLy{K8)Gd=j~B zAu64i+`YbC<9QbDetfF}ntFki22q8}AG)(!+@L6IW^m={2Iyeda8hhd^GRw(f%cdC zH(N;x&bz|T`+}FyhLuj}xfJkvt~r3}x5I`6 zqh%vCDyr;iLAT$?3xyYsGF);O?fSh?Zxt#Txp9ow5N#n+_xL-VroNcSkRSGd!rzwg zOUXC1i=G)EkU?C{LmO^vD?V!rGS8bVA5X|-iJ5A&Fxd;VWi(w zrSC~_C!mBeeMOnn{&dGUOcI4{W#}ajg~O2zrVN@wBnzDM{s*vNH{Laa<6tBApD1`V zVK=2j#^QCTkL4;FcmqC+Rv5s&F0BQPT~+!N7vGC_=kj;Yk$L~pPwaTf#<`%`LB1c* zb7!6YLO~DL4KZ;g>QfSf$)(5Nt(;9Z+jQ@GbML1ut@>pp0^=At2Z3CgdtNVzF=F19 z+5*YK{7jpE7ofOvheQ*Z5?a&b;GGN+&3(< zXs$N`lb%0I=*E^HjWFIy(Q+00SR`AvlALOI_fYV+Yfe|uj&_aKF8;Xmq(jsJ&B0h> z*BDr&CRT&pSSe2P{+NW{Wsd&BKm>K@F3x#IusKutVuhdJ($U2VTYTiIzbTH)PRS;o zXepplJ?&S4y96CYrzWVbIJyTHDk3D^xkJbp_Ik#wk1!;K^qfQQyuMI#lN~Zm81W`u z%nGO22L+)P6QzV>TunzjGIfzE0Zs(rG}Tw=HX#NA={0h zRql;l7<#7u;jMzoo%5YCl5HxCZ~YW@blCvrba`tlkAhr&IX4|+A12OImK`mXXd4-2 zk7VV8Q2dwdE1A|I8SarLDJh%in?BK!vLD_+0--`wjRNG%vwK!wb}f~ae$;2GFSF;_ z^AYTX!p+}JPz%Wj=7k?61blQ*>4!>z)DM|x{v=bs>xqAJjImSkmy(etZStOHRIdoD zS_&!fevsVGJ+!2!Svi{KIWU=$lB5W2k(OeSra2pwVR-c8MZ4ITQ-6(vku=D2uit(5Vf^Y|w8 zDH*{*f(F58BbxPw8e9Rrff#MdK**-)TRv)D{!<~!?|x(@AAR>NX{i4 zFHFtL?G1g2mQOh>dt}6^-6v1*4o^gcL-DdO;zp@LS1{7d9tSYNBZ;xm`c;fHUMJ`k!jUX@nWlZXDXn+3scNmefCL#N7i zuKm~QjPgonJFr3=#xP(@^C3NSz z^=eX%7ITSq7kio2#f0@fE1JYM9X-@%RUdsC7W&SR^KKNPBzAH&+yMn@%Ru^kx=F;Ud^$y#i8U&EG;RedKB#ELR8a)SFD zWg$mYd&ysYeuHoTZIaB+Znb~G!HjSb&3z2V`u>gTeSyOl0CZgL3+q7`%EnD6#!*=+ zEwG59T3ONnki}=|M!^$o)-6oWF!jVO);M+_*2^P?%GFyQfZcHR$V3^eHsXxzFBaH=+ibKF+6lhv=z#9#|vDXeFNhmYh~ zk7OF2y+vI>n$VoY=lVTIg04=sxleM+RzD?eEz~Kae25R9ZHwrHIlo(##lb_=EO&71 zmIg1^$sL!ikY>$ug*r;GlK{^KL*QK!?JR1jDhFr&`2&&Kpt1PUmF{Hx)V)Ezd49*6 z^AqkOpT{6JS|4C?zCF7FJjgT2#_^c&ZaXyC(^7@K#omxR)k-iK`_cyzi zvqa6}=6>O4wC=VgeM28W1+ERAUp{@z)x9JBcF+Z!N}G#&8B86lmfoAoCI-dS*KAKA zwlAvNm;h2BJ5~sGycEr}vzz6)H}1}7Mh6J+JRfF|mFiCI^j-jw#;Q)>E!gLF967*5 z+f=1U`-SH~VNSQNFdP_}eEeHC_&q^r9a~T2&W7d*J%u+smpuPcdOm(4xy;m~E*?c1 zi*S7M@Std2`yXO-iSe3!UUAmgd5e|p&(Hxw?C$H*JQm^4_m;(H^t~Efe4$jge){N63;;KiwbSlsO03{)o&jlpXUl=` zJJ4UR#GLj}TXNC4@dNQAf*SyaPb{&u^Jr=B>3}~uty8pqLoF=u_tNQ>JF04@oZlcKffv4jPPt4)5&nwha7ywB}}@E`h4OY*X!kt+iBlj#RP zY&ma8C*dOzROUS2moB5t6~hQA5%5zM~HhTI^;LXffbH3HVc{W-FX=8_}`BUKtLFHuKH)yh5D2Q>j&BIE+%>*DMnoS z9o114vp1YWR3C^{4WEnumQnDMQG9Y56ZKJGE}p&>K%JlDD$6xHYFl;)cd@(c-ktRv z?due>msMB6+Xc09D^bJt{tCgQ?Jh`c&<$0rVEm6`V}oC_9#qGByOUkL@Wdr3kj1jJ zDQG5n94MIiO!BmS5-<|~-k_(WbBGDvv7Dy&9{s!f{ts8=!droz3lko7afN1Zil$h2 zG5}`xvH&^CPptp)Ij`AyZy!_4Vbd0OyU>%Hk>Orjr(%%d6t=gX2()AtXJQj-kW*2+@iX%7r1sKXWyiafk3IY5 zM;L;sUN+J{f{*hO62`gi0fOm%$6`haU0S#x?lrlQW6XS#MbHbXu8nMd)J#`kbXeFx z=wavsKVBv|c@gbfG(FX%C=jqcFl6(uuqw(c)KgMlZ-39|bL;Cd;R*9cKF2OHhU3O$ zZm%^_=8ncf_a0(-Y|y%}n%?+vl9L2=Lq}Kr?~1lXAX@Iqxapb@P9C@!9B(3lzUvk+ zl?pGC?v`vJC-H}d+>5|$Qv4{Mx7|C7I_86xg7gy`_Yg84&BAq<0$OcemQat+HhX3X zY0Z7I_FGVB4*4PYR^y5f6pYfF=V&L_z3QAf+Wk~XSB`U}T7#jXwP-6!1RjmyUO3@D z<3lr|ajPLjJQFv3Rd*%C3nCO8uD`!ehb&?@3N;vB?>cSz;VRE z4VXejQmkP#R0T4fso$;ucxe6lV)e}ye{;M9Ei4F_)P^c4_#gA9W^MZ&!g20mI>$b= z%xRQ_uY_u9Krht9H3aX#M8*-)z$fM}5-K*<*?v`0n#B)zVaLmcwL|}D{LT8(=WQ{t zUUef3eo;+<^U>(vbp8ZV)>)sN5@{1;iu*KKNBduF^o{nzyVnyyFnvnq`4p3`iVx4U zCwvf!^B}7`ZuXYR>wUOX9R(wdJ84A?(vxNj5Ptb8r-Rg72Eh#k>g@)9C?T&$yv{aH zqVaCB-_J7#-qY;M5p`pHh)LfF>L8wdUtx#5JV0fXStI1{e}OpZHlzp!CkbW8UG~&u zn9^kB&Z{U;9yK(-@f{Kt1Tg^YIX~3^0T^^rAn|2ADqczISbpWvlHnT5Pl*c2N5xA# zh(VWIKbcRmCU1OyJ{NR)V=;)&K9v*<$sShNMyet2C7YsLf&H66Mrt3QBb!KH(Vd4^ zPK0Cd;t=Ch+-LQq6-OP_FeC?4^{x}${uKn04O+rRJ+VR&Ip9-6to}IxN7HwRvlD;s^E$et4a8#!@1n zjLpiRy{ib$B3R#Br+a(_UpSAQfqK$Y^rWST93acFiP$IguT|k$?abZN(dtT|73Ft` zi`0uSvYE1?IM`68Dd@}S(+(g_V9{7{_4W6^+uOqMSmt1ryj*YD2Myj;0>8k zxGzZCE{Lsp+8=2ZHrf6yvY5~RA;QW8Uh8P)ggh?Di%{t*tbV5ED%cP&o`r zAAodw+=iGBgH7gV*}eL1tDQ+&W+!u`qjybB_+`B@4dnChBJzHl-W3^)z$}dk`T>lFN%+b^KYBGGdQR7V1wgI#VybPGKIE~yK|l^8YYcUX99j9`!4(v z4b*Nueu>vjW7QW&7Pkl)S+|j46_kbbgn6u`{c_cwW=lx0M=pD_)0a1FhM-~fPtXmC z{)_;8g+^3}we(_5FMzTaUfM$To8F`7dJ~<9#mQZsHLizN3Drks8^xK?t6Hkk_j||ag%_QUWwW2 z3+0G&$TQ6JqCxxz+qUh-^0%7U|HaF&ht=;qhsW`hsZzW6qu!G5U=GGQ!Xo_fuY7TF zCK(v(SBGdSdfLe$@8pHRfJK2u6m19AwQTkzk@L=9>adU~-K0rG28K%(T>BA3#&+4R z826IN;y84K5%?MNjMPv7K*pdQMwvT2Q4yZ=0!aTB)T6bdFE(y8cGS*Qge3b@yHE{c zPE@O)_J|A>hZ&pw;e77zd2xeWf72@Qzq?drk^#`Kw->;UVyUve@@x|8%NUw-C3fu6TB=%{-`Ya)%ij)^wQ%5rMm`(c(Mjgw;Wz|B`~Hf_o7SE>-R ztgS~0I{+Fy*}!LzEnu#YaeOM||0XmkdXE_YL53;C^Nu-z{yQ*-=b~BR>1YqTx3%`A z=nC4`VsWC$MpjAJG`qtipC!-%%}H|m@O`TIz%mRYHVm=B#%o~ltsT<$#@Z!%%&Ns| z1(nfW0OAAZI=^(6Ny>~qC61S$>;p9Isc~12FB= zm5`+W1A&uOO3XoxR7+B|pW?!E!;5MSymaWe&0KJv=Rm*g3vY5@i1SXj7zyusD^Uhx*U@*0-5+Ifz?t6y^UkA4kWF?U*FCf`@X}3N&>!};2YHrQD!&`>*tfVdr5#5onq#Fh*!k);Sj1(P2Zjnk`g6hQ%o50f!n=VUeQtfC3cKI=gDgEC<}k zG4=hh&0=5J7&xY%{ICpXr8&BObqnx2YD6Vs&rckwo7wZn7Hy=4SGo}(&3bf4U7Evm zuQe#!Eb2HC(?x?2f>r9k2N6kyTt-%pqq8XRF`__SeX&-c`r8~XyO0d7>iWBQD%EQ1 zz`5T=z78O>e?(?i)oCJ)WC;qU@#(U6BCWN<70L~b%v9VkhPTLpDV)CF4z zV)24zS4*jManoX#%1=aLlDRRlo7}E|(INfAD~w-Y&O_&%RxV_Fcawfuq<6Ol_N{iA zg|$(rdOM-^IZ!^$WpVzBhTN3Gx4$>o1P*&6)(YgT4(7z&AJ`=0iDa-N9Gu3@Dd<@x zv-aq_o7SQ716DWi&0G*!(wu1S3&37dF275a#l^=G%s2rY=eHbNw5TGKhLgEzBeY=g zSra_$p@Clkl$V##qa@CI6fz5R_8#USv0gphytO1jMr-XGPvve)w1aHJTGa^+>}eI^ zQ`9uesYj_)i$qnXtOn@`oreC4gXGu7VJ8fYa5Uczah)}-UCbj`ZMYAWzM%<-iJpq#?t!Ml3w^txq_N5}+QUcmI{EIp+RSsgBog zq~)6dWgXo_It_;Xj{i}ZH?dG)`CxKBim!b`S`^I(%y`AV#BcKjdzOxxUyKOC9E%H6 zy_)tF!-b-6yd{Ucr`mzgzJJu|dkrr8N|@YUb9vES-zx9QcS6eWu;h`Jnch(Mq7|Pn z0>~0%$|3Q4)~45T3lolD_1wYQ}=qMo5*Ru%h^HGcUOTvji`oCu&V@sNZgfN2sKd3no& zOJNLR1@|es)%lr|2675Gy;MW=l7=&7WO-XVW1*Ih<11ts;d=$Zu!`gtUf>P8L%1!1 z#EaOS;4nv27x-^7DSM$Cm{{6$Oy`ZN8s6e0xP8H#>OLdJ=Nv1jjjq&fc%J0U1$c|l zd){wqu3*Wmp!fyncjRE|gQ_ z!tI>ipcHJS>Kq+caqw2}WHYt0u#SFQp(#7>E!sOp76O%GGCN2mr4VrnZ3$KlD4{H4x>Tlf^;|1z8T|Y@$@7u zZO3(5DkXdCK!qG-(X?9m{;7^=4BJw&lHo&V5|^X;s@tDelno)|l1$(bc%meY=PzVU z3pMJt)z;-5DFvNjPasR4xA7e%gHMr0ELHHwApqEX1z$kb4wmmfHp-wgG=lBqVS5O; z>~m!v#bb7%dtoS^x2S|$;=*Z7jbJ|WN8X{#ld|4Ds=BRxWM|1ef|d!kjo(C>w|1op zRVJx?|HF0h2m)zfbK5K)F9^D$x&77o3KQRbo943sv+v?;TU(DT0X01eWL=ac5;BWW zjDcMLoaiaz-gvS$*<=nQ<)QFY_G|EW)?|27gYKsC-^rO?y!8&6@a+DSXY!uvPnVWY z*Ad}%c%7sR^4Yqairvw2f(!~N@I$%?Sz${aPC3cZ^@RlJeW`hFa}eGkbYp6I)C zi8XA9zoUlYHTos{$-#N^5|=Q_cl(_fm+6RY&0w3it@4;I|Eou$z@;j+S<*^<4IN5! zAC|D!qr=84q=?uy9r1AdrBRQM;fl++%(U~Qtn&!SiY)h^Z7YDRXsg8130R(TSPE;t zNsF52#!GQDn|2#WttC0Btvd~{_*Isj_(ar=K^u}oZNk2Hxhl1sDDNCR zBWaju7CXj!f1d}PLi*jR)EO|{q$|t}MXA;PnDRmIyg>j>klGEH z9Xj&2H8cFuA%YVPSZJD@VRtu*J{n%nkhYNdpEF{Vnx)2YyB8$jAU&Sd3kv&BStJ&h zGr6{6O<{W>%;>qcGD*Wx=JN*(LZ!1h>G!}>Ip{*?aJ#K=c%@jVcc`1V-rW3r3sBPV z@;uVO{e;(>PXayuPld7Kn54i^sNLLs6mvC8c}#H|nBUD(#}Umsg{K}c6#bkmqgVet zAIwo0r$ji>E^PP@lbpn12rcufJMNWBYV*LoEpXzybdymrumzxOjvikFnY|2Pt;;SI zkdfaNGf~nr(>y2gNy%{d)juW3ky*(Pe|GiafmjnXvzul%;LzeMI$p4#7kwI3bc&`g zQPwY-Z)k^-9QkP zUnVk|E`JL?*r`62>a#O&Jp2+QruITdZXPMbnkm+2Y>@;{>%Ue3d-&1YBVb8B%<`J^ z0M?Rz@-lSy>kuK}!B*1Czqg%$0jd(QvG#EqmVEvB*^-leMs)9T{5LAQ@19a8)6Nk; z&h>p|7O4t6tv`T=(S{D(+1U2TQeyjv4?zLbWFQgJz_5BTtiSUNgzg z2YeclkW|jW!A~5&{3+gh^AQ4k3eZJD8k0(|46yY(-R(o+L z_4WZm<%q||Z)oj^ubPT@l@^~x4euRTwz+hNBqbn;Bi;C%$e-G}S8iX{1zhqGVsNvh+zois zmiIA4BX#JK3DKknh!i3Dv>pg*JCuRfo5cy~s~s}5`Irz`9W3g)>}gMw_f zR<$mkkV2%o9&MQ_lL-Ho?cpHFT}FG)^d#H_KgY(>18#ME>yYe2ic4EBdG$%{gv9vh z8)GmX9n;|;R5+oymx?M7Hbre|1Q?F=-KXnP(zsL$TevC7i&&I4W< zY~qUqg0$iEnP@*LSffGyzoW=tFGJ9C*L)D_XLhj{jmrHO?`+)4;*4=U=7L60^bs?m zuzmnu4(l@N;y|NMjjD)50u^++@5b}m3}BrRs_5p`F<@E@VL|GB6_zd%n$FVfS8-R}#ZC_P}7OOCV$Ajsc)&qn_vM6uekl zmsc}k#4Tsx`>_5=u=r}-C-r16X$bb1DekIcjNKr3U^<6 zl>B20w;#wrBScj@H+th(HjT+GE>+u;t?}b@o7VO`;3{f_O^p+-MN(dTN*0#Xcd#1@b64PFuW*+Tqr2d8W9kWp0438ZLYquXU_2BsY4PMNVHIyHWH(?DvB<&CNqy0Kqu*anHc~f&jTnT+!_C*7EfGgQd8LxnR&Lg3r<6!^ z(?@>&0^4bKF|92d4Yk`59||&;b>)pBiv}~x1%HCvP3bHsO!J^aF=Ce?tpV>1j$#%p z=hX?m@QBcL5$+#(z$va63XlCCvkWotEG~6*6dUB+&_d5xdzy;|c4Qnv3Tl4F5`2h6 zRAowT*ZqA*O_vfT7dC2|_Ia1T_)J@Zj)vUIbgF_d;fT*m-mZOL+upg;G-*TirwH{p zW!X8laBCIkd>OZ_fDKCoEPY)%?r4Pxg66qv_*y_cDgpBm-;K2r?5D_V8u_C0Z&!tG z6@TFWH)~+y@I~4Y7hy!N&Kn@XL@o!V3O@lOmUy>Dg_w`49G1OU6TEhzP4iDoA~a_D z@1_D;6-_q6q0^SH498&LzmsjWCcta9E?aF8n9&L6zN7lB~1 zbAuaLo93+B0W&(TO}s4QV8nb}CileOG0%|_OdXy>Vn(jpMKIx;I!<>nmOLvV^={QC zi_QJHGU7IXeN);cAY52ol`APL8<%dPsq%bE=BoY?tQaDYMPC0&{=?6J7D?=@6e@Sn zv`_<5Z6G|}Mz8e#=6?K+FD zucgC)vZD|yg)p`ziTZdGKo-wfybh-B`dV@d7D#HispFG(GIiaU60-cPuEMt70RF(p zg;gMnpb*yJ4NISWYmKnSh38j!FmdCHlPypM;dTS&9d~!IUJoNg8P?4mH%Wp~{3c_I zHchq~ytY@Bcx;h)r6`H#^%3rECtE-}*Go)ps`iqx`OFaPXaDUWQZ&S-6^WQp@@ZVepp=PJsc%&9Q4k0zL8cDj!mjYvNf`r zIYb(gL-9vj4oGoxOGo|IHM@Vz$i+-N9mG*6Ud$uf48ws1muff#6^lrBFV5V-V!x$L z!7ntN5CRtWV#r=%ZX^~!b9-<4c}s>jQIvJ`vEc5cw&=m<;b}h%09emqu7it@)eIR- z49Oqme|D$iaWKxxiQ{c0T~+5ltY>y=>o;`P&Gc7a4f9rXs(^H9Kv`&jeBG2U$kuxJ zisD>qhGXGDP@Wtjy-}6%CN^n`93v(v>{|H>|Ic|gfy|`@+F@ib81SVkKU}0b0$iWJ z8YRCxa6=ao(cIFc?}V+leK^3K5?DQh#FgEYhgR6yL1y_t>J^ zd|*;=mFNvAXxBh29^m$fBgC&)DQ9(kvDu$;t0n%Ef7S~%LwAN@d0%Ptx6V|A= z`5e@!VEg^T`aC*SYakMSpkoQkZ|*R@+Gn7xVJ;Z?h-PG*O&P;Y;$!iZ64p~JjM1WC zdw>|O5*UBpss-_WxE6*MZfOGDNDXC1aecokw_J9nm*TeA8&%#>YkzMdvBtTCHT+v^ z67`UJ*#THPNGwv|eyCE7&+LvBhmupNy6d;23B2(@Xp+;S|GKbs#Kf?U%}l0d?;xo> zU`~Gp@e79)&g*pj=1@2ozgud~oMIgu>5fe>G#A3-@wxyyD+xgRDuEDi&?nz{n4_>; zRGDO*=%}^pHt*CGP~c>K;kH3qpVwleNK|(O)e~8b)3(iB^b7+jT-v4piOk+qyeY!M zebT3lFfdHqVA;owc#rolu^jhh-ArxG#_X21mXZP>8>Ae?E_Q;qmhay$yMpKNI>bGMq zWUANZ(%urSoW}r9j>|Ae@mWIbMSVEPanW57n0h_qOjRGWH`QOL^eRq%ObH@no7t2b z;Yco%EAhTi!xC%MoN;}mCSWIm#}ros1!nmibS z%+&D}OyeIa@&A$vj4FTM$hC3e1vm9N(I0*5ma;r05X929!;@Hmm|XKl{1?eWA;y?>X|SUsVCqwWcd|=$`(4Q=| z0u6+S5g6)xD3-;ITD9E9;FJBK$X#3)CM)5tmr)3*-iIN~gDq<7$C(Q26@5h^96Ch8 z51c##dwpD*R2z!=${3jKvPagBj@nF51zf{8fKvqsA^rT}m9;;8vcps|a8jZ<`pE!D z2=1dQk|va`%I0~^eJlSX@_Fu<=^P-9go6t9sNe%fU04Euabo!|jT-EA>M{g1gcb*E z80MI~GO-=XA_d_T=+D3U`l0YTO@d8N;CN3IL$ZRWfZ|zpZwu zfPV*cy|*4KuGwD!97C{kaJF9hQW)LK+CA;#j24%p?Hgl8&}_P>Ukp<`a=N0Dw5C3n z0?59D%8mvf&Jr@Pb7$PvY+!Pj5s-9=$PB5_#$l4=Fs)nhOgxmv0~#II(*Cbckht~v zLzZ7PCA|07upe%54D0Y&$5`OI`LA1SAKh(!E@_-U;k`3_Gwz}<11m{rM*S@_5LrYj z@JmwUNG!{56TMC2N#OcFMEKLb3atPlHN~ehWE8sGt~>iWe_~8#g8y41%(PF!HVqka z#?~)SJf=*AaL7X+TTm|I@T@RFNx)8Uo=7@?ze=+wl4B2fZVX+=H~^3c!k(mc32s4`-ig7v#ZO^Jff!Qtxe zmt}p^NOI<;+K3b}A8Xa~FT+~KG#tv|rV~O9|^Z?eqBBPfB?+zNTle+W|pH# z&OD>ZfcUS6frRtl>EhEp{gMODs>w~bVjv?%iDT1AYm3};?H|nV5$ygm_y>(kcSbTB z`tV9&Ut1EC7^C*XZs*e-p&XJ|Qi9=M7@62M_~^z*04RQZK=GOV1h*=B`2JoSy=ks{ z+=T$$-cEFO0@@5pC8?wnl2)}afbm(98@l4DKoa1WyXw2<3eWf_%i!C=`O%6v5)><) zc@DfnZAWPsqYok^8vDNxwc{%M$!rhZ>7#5K;4yJclK5aV*yLDjvQ1{_0m^oOhLe>^ zE^BdWJ9a&#Z=LDhuGbo+dnJ5hB(S)@ls%{J;~u&mpZpf>L-ZO0-eT*{Ntt-^Z9tL* zqLtIOf|b5lB7pHmb`gs~<0iHCU@EyK!&}{^mB47o`{*RQdPoc#p9f977h}@%zzBHw zMLF9#xyzv##kFyoS~-HZ8&&l3O5tpI1vYx@bXko3zkOBa;n*w%PyAN;-W#})^{-{Q zwTCvhG5|*1eu$zZ!&t^mExT38w1!n9i(qCh(v)Vk)N zC}l^|^D-B(T{POfTz93vzpmh0m`%hpeej8XS`MQb?v9$I;=FaCFXUH?gvRH8d-whL zZMt6?6cgy^BGw$do0{z$7xsL#wN2XpuWj)JFe;SSP74sC(&>0?et+=PW}O_SOu7Yu`oJp&w|e zcuCscf2$BC+G3DtI<5wcM$+forR%F)+Is*#U!se+x)B(eHSDYH@WY4Enu|dna-DD} zolWa$GNKhD2r|^nH}=GLCl)0n1`?8UQ@4L6Tnl5R5sMI_0PYW`0EO=R>>M$vm-2_t z&3hr+j|q|n+_pw;)--H#r+W?}PkGdiC+k|QV6ayK!Aiu%h8wVef^bK{Lrb;5g2qI3 zWXm#{Oo}E8@9AS@Iame|t$7E>H;??{;=b88btgAYe0H8j#f=0c9vzR_rhNTAc(i#= z(>dUJRxwW7BnbE@DpS4~!zpwSzI+ONj!clw3(xAE_O_V^0w)cML!tn>gDowal~rlO z0dI8qAtG6k-vfo@!R^b2)KxuRjAR)TvX;9Wn{*X#JX5s`5HEQby_&Fmc_~|e3feNr zY$ramQ#WG*e?bAK_U0N-gj+ec>bQQpdzsx45pox;JpBX`{Au8RRgRe_^ur%bkP9oz zk3k~fpE~?t^c-?tU;?V+GZX*r5ICAFYtDcNNHY*ib=Jz*Bd23h7v4D7+0sWYF_A5Z zD(~Bd>O@4#=i+Rj)e7DfK@Gjk*jR%hKJT{NLU^keVMX`Lf^X%HGfR>WKCC!i+C zh)TOivgXBU_=!M1Q-6|4UOG)$$a58R_zeMbu6(Z6KZi(3I5>)V9($0IuvobVaWL>z#RP$@!~Z4|P`GTnKGZGyM2B^0`hd*$zn!>Z z{VIi&U;o%dk62fQl~@$9$&N>K2E3Q>Jt1K1D>tc6St|YvW<2A%O-c-bOcboj^bi!B z__M#(BLX}gc^@WN0$0B4w71!jlCUHNRj9x=b3uj0CqFQVFA8hD>P zzukgJL@cgHPCqwFhs2=}QUsHZ6oOK1vb-{j<#LzW2bLYD+x3-grRKCGs2+cobv*%hQ}}ws#Y@g)%F+dacAkw~HTZ_GTlP6e8ecltu~Z>wUiEhj4HFG!LSf}NP^8_l8Ip- zxtHxdr+Kf!zEvvrHQr#GfxSLTpjPB;EYA+6nVUp&^w~y*mvXIY;{j{ShA~k)w08i) zaE|mZY%bP+=h&YIwZNs+bK<6S`T522^tXfxi*2?q#L*l)l)3_;4hfh$+9YKo@VlB= z64JB;8RKGfFpoZl{PfL|r64y6$g-F6ZoO3)Lpc)8EtSWpBvM@D6O>C1_ds3e+`R-&c zY6Pz^zo#kP?%HpEI`-PSamSccE_-yBo*}(j(0$+198RIuz9lW3#H!nr_EH2uk5}VN zj}xdkuo=ob*h7N6IUH5}=iG>`%-A=2!4>jz`0y*ZM-*YeW4L!+lR+wu-d8AQRNyE^iN4`QpLxM1VTm9C9|olOJ;L3qC3`Q{^B`* z?aOGnQ^oUqj0r=5!Pu|-j>$pv@e&n=*LDQ2R|YW3YB=wB;WHivtC;~|rQ2LT z5hg%gVs(^fe8YNH%AFZ5omMF~UTwo7&o6w9x%6_*zcX)%kD9G>PuU!~yeDo{sC}xR z2MR^#jY3&`VTdKH?sI4eCQR08Ht5RT;yuiL-aSUKz&g^0nNU+zA3miN(ZJ~%CMnM6 zyXos(!;!oBLvjYLQy2RlngVZhE^f)vMiXC#BglPj;G6dR7ZCC?v0Nf$i}$89&0en5 zCgv_Oq_r7f51itiGI+gO`)$q0CrrsXkWKM#0#s+p+3TAO$T;gsHzCXl$8ujf_Rhm# z<_Uc+(#!8M9))8yFh!JE*BX>Yh*5u}iR}2+V_K;ju(r}3=D1}f(O!-UW>JV_>Yl4s zVM+K3!+TUAconnmoPSA6l|(n}?Fm@qKg05e{{dShj^!Q3QO-avhevJ_-M(KXPX)w- zT+!Md(10|3^+l{+VVCYHg-fL?u)|6HjzV(9l|xtHm=68 zjdp@e^RtNw;Xx|Dtm_bj13bQ9UUKNm60xLYf;fr+F+;C5@FlZE`8;aY0grm#$xAP2 zWN@rDOFQqpEi(NGyVZ|^`s?uaDNFl>0)8W78oUxc??Pj4$k1_D-m|^;Q9)Zh7mN=+ z0zbL^GZWCG#3sNS=*u(yjb*=<(G+Bd9+HcGIe(7KXsc9|O>u=Un|eM2di!st7*rRl%U;8AFIk$3y&RjKN9h_h}L;bE(%eXq%ELy!*)YC+#vY zOe(Ffp?3x3QTKedI?Z;{5PIixxi@Slj@~4|!9hN+XPZm(^$}Uj>MJ*!GVMyHsk4-;0qVlq^jZ?e3j?t`~7tT@I{)Fts9Z8vlRcPMvLYx^m zF}C#OuhG=9&Ssm9W)D$>$7L|^y1F7+!7R;<`NNHwyTvN7x|v>Z&%fddIO zviC=gOm95}RY}rM@sFj=qOzeJ<5M&ewLTs_oY=X~ORcmAoqY5w5jqo#5?}<)Q~a~O zKU67oPu8_Dj|Fvc(ZZ1zv79{?OG9UghJMLZxqZa!f8F%$2U+W>jB*NZh|qyRsTNEF zLCk&&i@*Gp;BUu6bb_!anCl_$kpD8zz$v0taeZLfc+s}RmmW+?>_W}@w7*mbl9NTu zL|xVRss}h%DBuoV##l_&sx+_=VZm*844Og~!wsrk3`<(jt-$$)966Eyu56NbBHA~$ z!WF9(A(K-GwX^e+VVe5cMyLZb#3yGzOxo)5BD2E+EI{i}Py%CJmfHtd#HmI$OY9Td z_F&_w@Tt8&+B}W>@xLxv7hIKKDa>HeHoxPB^{Dm$ghLWXAe%MNZjP*0eEvDL3-C9} zH-=?Hs~WHh-`21DL9}|@a*%MiKCoaaDMb*0U1B&%P9y1P!uSYHsq`72(Eg*8+WoestT72QrvZNM>WqmL|&Qw#P2e)C|xlMo~Am%)`}(>ucFe!r>7x zgV?UZIY$47tgPK28PV;g(eZ+QTFY5? z&9xv+5L{9$#pU>I!s)6_q?w@LG4FBj)(O5^HbPMLGj@4Dl8s81t1j~Xln}@#Nx-n> zM*BoCq}y~zdp2Cgw6}pd4Qg}S^oIM()I_KGV(Ux}&r|msgU6(`uy1?6dhV3CaZJ`j zTLIVg9Tm8U!Ii(T9KK5U703Kid_7-vS3pZYs$*;=QBv{Sv?$=FuPR%=~OvvkvZ{At5?fEPvpv8zkeA zO-y%D4)6%p2ZGtCeoTMB#RFXu^i#ecfKF5@X2bT4;N;`x7aB%{Ou-bnJ?j-ycs!J7zjCw015_3?^+TyCjoPDktz zXa%n&PK)bl2I_S|Z#6aCS1JVU@HkOr;OxC)thL2VvlE=0VFU;*Fnce%yI+pyxy_Eh z2R)k8mPGf%i=J@V67d>k|LV4EU{JG$fP)NCqC#NHIp;uKPbVi(nvm;7)(k7W)n-aD zLqTd8xR%x~V>WVJIG-Ls@w)G1_wKt;M{@&{`D_ik=|iw_mD*aB+>byb6d1H&^>y0G z7D4JE;CCzHIvRkX8LwB9dJyg_6`h|BO+=7B5wOjBbdP*TSmKy96J>>zDe@t?;wWZD zt%RGUb_xUcbrzi0Za|UvE*I`LanNF3#Mx7SRi6iBRN7fnDJDs@M<0@D!h~gG=8rQf zFPjKaH>o1vjlaZAU_l7pNPJ3^U1C$77O@~UJ6ufn0{P{osFT%I_+*~g^cm^`;Jd$M zujxe}Np-4ZYGZ@$%9K=&$oEp6FwBewkDqHdZGhuo=j#0T&T^# zrP-h|q}tC~%>EGt#+^FYK&rt*&Mp0Hdq!-QH5w}MoH+ym+q_PwAIwao$+8K$`1F|# z7CGA9)>h8!gOgRmnH*YP2Sh~0^v(Oh8#hmDQ8avUc%3LZ zkn+g0B+e!5Z`>iyD4{#-39DbQxeMCXOC^i$aw~^wd8Xs@X2b@N7R&dRxq0WK! zH7l%N14(pjjDROiN=or;fWPyzf->xSM_l8O{y)?#yc9kfP0KFvD(ywVjMe{yOZPs6 z4R`gAZ1|afa}_tbE_r%X4|M0z~u%NX;*)e zd4BaFc@5GdTQGk6ktc&)NVZZyMxz>sX|i+=7&fWS7%3nEmoVwf^5{Fxp(1nM;{GM3=ec62M6kZsgAt0E1 zm^mk(De~9Aq*pFi0j}^EZl*hC#Y5+T9@Mf}xVyb$88^qQmNbeJgdYl%wy(Zesi z@xQRnxmgV9mhbFDj9Lly7W@*N+XObBR9Z&dp43&b!>FCU6FRNXM@a*zxI{LmPAQ6Z zXtI}ZujyJ|Z`lbLh{`cMDhHNxfj`9TuB4D>Vs@a5{QbKc*&PnU#C3Z$vVF=@V+MIF z@$$2qk=wCGVt zvXC)CAH5W6`^U8ZSX>R}aK!(iu^iwc(tx@TW`}GBFQ&`9nhn=FvSSh5ulXPN9etZ5 zH};9eUvdmLHh}uUU6Z~X{rk2EC&LKN$hZy#!)47{k*S3pY4eA0Pqfxm{cDIL%jc5qK=_xMmx5EYX$sS{>D$qS3+*U||DE~6EkhDJ3Sc%UBI7(a>d_z5=O|lKdCJ*@2XBqfYmRp9 z0|SZ{(CY8M{J!=L-VYuH&SEm|+`rV9_sK)gQDez7*%%qOj6hG<+oAuj8gy2bl9URk z;N{7t8sRrH^+)w+9PU%7-3LGdD`28I!IP*92kK0~4A5y;#v@T-(ihqQreRNE34%}H zch}wWo?+Qpt_P$RrIYemu?eRU9>*&11fJ_}iaCSiRFlj@LY?C=Bu}NJuP^HPoul=u z0QDHU+OsD*j+>)cAIo?AbO*}+Zl7om()O|K8fDs3vJ=cD4^5FeY0`r{GTJ8=qYW-7 zqnw0L32S094?b2R*xh*BZrSf%-;chZ)WgR}>lVb^w#6F3{M5+TRof5%`Kn9VZt%h4 zlCoQe?bNh8&++EIeJIro++HHIz<^q!RlAxTvYml8Dn=-H6d|ei2IgMuW`l;(4ww+} z;W2AfY;`Fly7kREeHzy|B>C7(No5@z2v2D7zbnC|^dHa3R&;uh|3`+0fwl0|AWPZ# zk`*&Yb?;ZuHP3^W)9qO6){`tlFC&M9qv+}%TURb+51zx1*;@y%?0dG%b9_E_*g_2v z^SRWq`|7{Vvr);;U)U7P&L6#Q_a0g+aCN{s16T{U;$P^To7TcOw%M7k-b~O;WaU zGDa4B(7r%GkMCMa&7PymN-f7DT+WOr^wO%yhK#&K+>8~-*qYzk7Rv}|NSkrr&hlf7 zu)|+4r#yT-gU^fC80L8uMRrcAUyumxdkIQ0F)v#HhQg?1YJbtByIC}kEQ^NC7TaYSEUn5J<{hFF4>fldK5!kY|m|`Ns zG3tn0Rbu5|%6p?mgzs{0`!T=jlFT`P>=-pG{)a>~lx<&4A-7pN%{WGfB4x4vHFjzM zN+7`go{c0^^V4HJjh5rw3Q#)TY>>15n~jd#%sJbczZCK(Fvh}!YA>6y8vs##VDhMv zm3v5Q%&EbfHB$URjdelb0M=4Zp6>DGan4yap8(~#o!?Zd^_dEcJ)TTJYg)&U1IWyzy^qOzm_;w6WD(C7mGp^=k}8Ze^C<)M3*@30 zR?DLN*|F|qs(Vd+GS(zqKQPQ z=U0_zhupr*)rX73iQl-ftI3(lPa12~T1*-jikxzql?OEF`I7>U7f3%G)B`(Kn(r6% z;+L)~Smeo9jB5^g5Q$X?MJ_9W(^SETHgvx?kM1QS`??~mVPW2%OiQL4$@MFWn%m~M zU0%ItpuA7OF6G6xxo)xV$tNa&e^mRqfbp7QwYMmDTp_A>8_D-F?iFzs_th{Gps~ZN z2+~XYxd!p|2l?yLN!q&ak>??X&1djc1D+m8gEFFZ9wKCDW|S;Vb2gH#Q&g_G?FcK?z)xQhx zdrhxM#|dt@1>w);G367`Se>Q;WIyJyaa@O`Didvq=cWPr!lr^{W_k{Gt-~a``Qc91 z+q&BRwIf(=7#w+pUY|3|0pD_M8WR+0mNM{16gvmTgZEBth`Ix-S-?4c5Wf2n>-V6r%(KNWb?DJz6&lp7Vk~q z+`PYMzyO;*RXZ;A#I1R853K&*&Cafxv(xq_f!ba5l+>j8 z<-@DA&AM)0zOurw=JUT>Mc^V1mhs?Vq{9y#kn&O_IO5cQ{@qwmS99CvZd(MN{wwb9 z2fC!EHdCcJk7Q^yyMJQsC282bl}`+;Pgq1YqrgRm$m>AO9qKjtKt)H_X^6<^euy0& zV}2jIrf8uw))w&iPD6eedoFiJ-A#EYDMNq304c41zgWLY8_<_rI|kuh>PcdE-O=tB zW$5SN1*BknU5}NdFTA0^RfFc?a3#b9=FPlLSUE$|2~H+>N~b#vgXcPKf#`KkP?P1r zKYTgrZRnblf8QRv?hu2GcLn-XD%X(@#1`^0yO_8Sc@dMuPDj|T%? zXTrL^V0#Xlji({kFqFl->+Hu$+g#a19^DVPL;uQGkMYTcXt4h8D!jE?!m5c`gW!Z7 z=Xyp0$D;KY`<}JFS2g=*OIm718F%o2^e8k0AE`?IP4Z_3T{|4FgWN_Cjk-iP-$)-3 zci@Roa!XG5E0qpUQ{wN=WuvvPu+(h_I6H{Zx*YdBTugaKA^~PiWVa12Glo^T-y#I+ zV}MD@%mT6$;0%n*OHIK~x(JoJ=7r$B{+0Txq;O<}6To;lJO+5SCaC4{-Z15VhPrz< ziwoz%-CgjVH8Z)i6=uBIyox5H)5<2M4KI4|@E~$7iISb4w&3BmhP1xXn+eZ;#Y1a2 zhZ~}283vc#6$#`3iL73n2TbJzNlBb1FUSf1a3%U_BmEseI3t|oIng@2VEb4`l;mGz z=0zn);MVIbt#6CH+rlPK!%es*A>&AVJ{4NL!QhrX`K&MO;N&vEI#vmk{$q21a*ghK zZf=WqV~*G+1zgiVh#socu+qSIWjX6j8V$rQ5d@zwlI3)xhxA5Qf&Qsr zqoI;OLQ2a&q!as83Dhb&Xya#HlI9&hX1ic6{edtN@4EkP+_+#HoIVF3jaX1YbOpP7 zM&%7?CjL(N!k+$v)_m_zrWc*P3Xe`Dn-*lv+Zg}Zob=?+c-6+TX;Y>%$TFbR1K^T*7n?s`6*sv!MVOGX$iyZInS zL~~Wpc!DtceTqhUyWS$pLj*93MhS_FZ1j%`ia^zrjo|3)^2e8-YROrbRFwVcKPy=g z?!yqPtFe_Oh_ik5JBsV{7o3v4Yu5xBPeh8}CTx65z)83e2&~X-Wck!L{h4VboTmfW z&V3n+0ZkTtIV(_&PwlEO938=s7(Hdlwkxm{|;LWP5IKE!FLZ-jeiBVsZ35))l zxi_ERzI}lY#1F}sP!iImxYkzj@S9Vi^1#;b?K12lS=aSoj)aYBGf+8Bf+JQTCM1c; zwr|Wsr2m0QZ|kMfy8W*H3T#01HYW}yNrXZ;Sv!UvgMgM zXz9vpITrinO{Rb%anPk^X%T0j0M%y1#9+N*CGs~$@4i3plf|jo59n2qbplB)`wm$< z#aa7+F6S<;fyzYuLnN>pPL@MI?8=q+%_sMi>pNYAw#KV_9&TylhN@1xeCZXIi$@>X zJ`Eq0AaT40+X+v9FKB#f<4h?1X-2=qpJ!-wf4BoNV1Z}IxU!E)dm#*v8Xu?(3 zCv*9$k+y^v!{_BTCm0J}+*+()vsXA;xnqgU4^Dv>@-7q{sZIo=t zvp|8-G@d`yoZ%J7ZJKCo*gbnpf%(Ut%*juRW}=fG<8w|14-rB^)p3olE-a9!%s;XN z9dYcivM%ioT!ycm7%xd)s8()v+C^3Cz|;aU)QF%S4Qt%`q(Onrq@aoVu$_st?Ef0h z9*fKknL6fr*53)&;Hcs#QvPx{Ky`i~v&1fq70~>$l8LyZ;8y`{_5H3{DJgQriFw!@L0gU->70gM)d0zo}EKi~F5cbj=o+RI*IIQaD3;0?1S#zE! zgyw6sS)>cJlM~e$lbhF?=$jtWhlnQW2=jTMM(-Gvj{WLUFfck2YasHjNP>B4w}rAc zTtj@K0nBxsC3MkFK1#PhLkZJeE1URJb5i|WMK})#QB1AIM0Oxw>LeOC^J-J(j{-?z zPwtcK1FGO!H+-i^R=Qyln#-WN*#(p(9N1;iW`=ke+{oC`v0_=RT9@<*2T`x}9l*;2 zatDqhf`vFROD&>w_vQ@cOQL?u7_lj*x>i4stKD-BfQG9DrjFlkADwdqd*7iu_j{!G z;CJFdHr~@C$)z)y6)2&=r==tAekB)3h-N$BeugbC&gdQ7`Z$&DlNy)3l(%0!+{jzqx z`f1!Psk%!uSDnh9c4JC50R1kw!pd3j{f#J6sQXE96VUiQ`r4m}{t=iV_Rqm9UYp=S zNwvp1&7TQcj0eN*HWQhSQk$J<8g7V$ah`IS6@a%PlPzBM6!(iWX%W~a$28?bHt*}n z4OE-_7xiN*0eHTINlNovqF%mR5%y~6@<|7*&MT6;_e0G9@+$A~(4iqrZ8K-IMO$<3 zSd+WPF%gOSdkDcz&?!LEknKF<2>Y}>QGeuNAY^tp>QqV2_9kzHCLYce2)&6uHvN#d z!w=#~9bK^{2cN_a!H8?t#QWcgz|J7{j;ZwIf#uKjW8yX#D{+$Jh1QE-K%Q20aTSR; z$+ppb;@%SWbQ4I?oZy3V;-B6F-%s_%is3AH2&`FdevfL4jVGI)Dk{BmHFcDD+)0Zy zrB8!{|0MjV)<*%{qQLtg2K0Qi%& zj-CHFwdEQ!>K88MP4)r961%Vl6kS+AGd1!H)bbtbxqkPBepT-fNW9_vLjjzn zVh{1oPsY3mpP~&w$Y_-jeJvw{fBwK-sz%s=r&BKC#Gsp@YHPCF(P7r`C|`6i+$>HnnjKFvs#27PfDi4F*iIPR%+(~ zNq}YfA54$;K>X5X`q-?{yLvixtHwuZvnDD)G}cvy=@DnnS5I|VaNqC3r{F1oT|775 zZ1Tr~@2GX!QC9SN4}UsuzwrD`+T0Sqlrb$o-#t|jcJ;niagL0O{IdR-k)Y~4Hk&HM z3XT_SZ3WiCj68)-uzYZbL8iub?AlKqZX=jw_!9osi>*nYvV=fgf3Nb%_vf+v--mX@ZBuyn=*)Zi>qf4Gk z#7{PG1yHSive8p1CdRR;3o*gt83nWxcRJ?c^(=BTB_1%eXDlBn)Q|f!@XoVWHrE{W z-VsZbiMf+>M$Ag=ob~pN(?>D>7&xIn+0{yP<{=zM`^Ku9`98Vq zBJb!j5A|-wgf}jvOu_phD=c%#bgXEai;V^H`omxCMGf2A}gu z&GYV*ps9!3u*sh)%%_(UyvlfsAC%nL54#Zs()57+fjZ1e>pBEK#uG7ghboXsx%&A# zob$tMZV7mJBku7Av({!bG{MI`SWz$**yNei$61uvbFYyY64n`YMp{sK35hP)Chv5g z4m%TMolD_ek*bncEop}rST9?yy76J*>VXJ1?DZ|C(-=H$W>#AK_%6uV;ax#k4r2n0 zdq7UBG@AN(;*)D$Z+E!YxTs&n1QUCDb?ky>`GzrCh$i;co5|#&PT935vINusv=3s} zqK0i`NOGdra41R9zGd#iH(nr62XDF&&Iq*aFFECNXHnXHwrK-sah~pN84zS~(mryl zm;c}fMhi=@)t5u`ql6(@_U`!S*;_0COgz#(3nfKE);j~1Lov6vT+uQ)x_>#F?W{`T zC?0Aq}eb0cgdrs7|Flr&QG#wgehQCWc~URDPk^nT(B3{i#XBf7xf9O zccR~mA>dBXwnb*|p}$9a?!5Z>Awd~*P$Ehu10dr1SXo<5SY$!<_WU;Y!uefsr<92&jX{+)w(U{?bo}VK3~v4>q5csL^LlZ(yJcye@yx z8dkFc-TD6GsMmGHU@%nM$`%|{o{#|$x0id+A4|PBsm8xh|UU*PMlbI!YgXlMqlexv9E#xgKTV^XA`|GF3%oG*#{?x-# zT5Y6?Yr~%vD^@PO#!OsGiSpK($y4SrP9#DC%qefV?hIkX&uo(kmar5@axn26y-L?O zs(uB2L{M+rD8gpGPZ$zWXqdQED5`c(E zBzlR?d+g7|B#z^J5;dic@?PUg z;RK`j>q5Ciy`0mqK9sdz7{2tBZiNs%A`=h95yC7u?>ok7hIY3hWVeOdPz>fAk6J4D zaBoAQWaRf1NUC?C&WUL9PKnj|(FU)76tr&(shBpRD7(s``nfi2U*Q)BD^X!}%S45l z!qC(ry}*BLXH8oJRz7&cEJu5mhIdsCoD6BCc%MD#;U&ui?#b0gRGgA}6hM*v<2B;b zLq>KP5=lz8SN0PUE;F%vd-!LjO(FX=gvFc+JnY*zw1sD#cb#$c+Sl|533?0SS>*1h z0`4-_O~CZau9gO5kYw5f=XtLazte1nZ7o$@$NdT5p0LeH1*e&x+9VVvQ_z!8w5Z;Bh8U5fyNr-- zZ?sT1)`1Xy&oybt5Ap~Y#FW9PX;1TJZJsccHQ1aHRN)foemy&>-lb+U@g3NUm#cX7kzmdRYf*+Cl|*_cT*VsU zB&ezXpa!I;HM1@V&=$cf#@dpmv)6N8$hlR{+zRXYn{9UQvmvfrC;J359)$0?BWi=Q z$bK}2*r4$2ON023-~dnB&8_XqNgMroA~l3Xc!qRqb{1uz@Q%NJ1wnRx-%!;i3O0Um zDGA^G-jh0QK=CTJ^a!veo%naD-LE{h42}sg)yX19@)Cu?7-K+(dY81uX~_Fkx3kr~ zi_Da+hjV5|4gI60r+R@ib;})SVd|;Pt9F_NlL44Y0Q0JR@D|vAip<6Fj?rFP?hVO6 zVI^ z75Hhh2VLWyCbXiykX_gwYD=d7s9ST@0_sPs>^~80CA=kC{jd;lQ&^s%7}nf@d`-`T zQ+P!pJnj=G!p@O^Jr>#;A^xEkjWdD|vVg_7t7CH3sMoC9f@aBX7h{>BY5=bpR!hjG zx_@4!*8i7%qoqE0Qb~)uyWoML5c9#x*3`jWaaIm{2oPf2SQvg%|8hkLO{uy0guZE$ z&utftgo&2FC^qa3QmqbdVImNTS&`+u;q^-0sF~Ub!pTUL^Kb{AkOcSGUvMYy>w<8=5GDX0n= zr>O}>IAg;S?t4MBC|NS2fwEi7x0VF=oM9@(y6GB#NWHWnhbz#Cr^zs-aJF z*z@8u4rM8>Yt87f!lbr87%OzjItwzdUz7DxdU(S91HpM8UgVUoFsUFAL@(3E=t=8xe z&E)$WU9tb0y*IxO{r(DEW4D)*yZ%|W3pLdd+al@muBc_je-TgiYB+0t8v()ajt62l zT_%MmF0;$FX7n+A2!>ad$wk-65fw=22W_Berak9B-E$qWIw6J~|7@yB$McjsCkga2 zI``5J_b-%C93AF!&fPWj7*^sYR?ICaV_1Hu+x4C7KtEpi3-oZx&zzEqG~UKK6LXzw z_33Dx4`vyODrb+~JB>#Qa-osHj!_G-jie?-7C6^ej;nY3#SaD!%$Xc=aE7#;&r{oe z?0|r(3qSWY4ddX|hYZ0alRF+;{U2p6PE{k}zpa=Y%yWdEMD}-dFYNocXthyiFfZZk zeUd#Xvtv)>HK)OY2L_Vr^CHp17*fZxJH&f9!1Ny?SgU&oH2+=kdL3f}8-2F|fCekq z(I^DyqZ=923}=pnzVxUDV0s-j3XAYD+iV1!80C{i^Cns!qUwO2t7HAy4P+L<{sZ}7 z>S#bC&TA4K#2b!7=Z{6HPko5AKX%5v@ygv@LYTx6{Qgg4n8kAZr!&(R6PIBTGM7OF z@(@!#5APvo==F1Z5$|!QjLf8`v4S5$fRad`H*eCc8pI!eqLjC;BK?UnyLt=g?8X}F zdT6a^lww#Hk@R?r_`<3=*zcDDuR+l8b_sxx!-oJK*l+dAgJ`oFLf|}HYhT!MYNcD& zABRS_JRvCS6n6}E+Y`Vq_Gt@I9$1T(!{;(}!6`8+wIDzXk}|{2#hpuc(Zh_?e`#`Q z6;L$Omb0aRspDa2hW+oVE+}uutDA(_*Z)=yW#-8rQQN_Lwru{E-{`(OChzC5E*A6^ zg$SUebe7x&1ctWWmCku>K0up&ATU#Fm)i8O*pvJzbtC-LGN3@4%3Cz9hcw;On?yo| zc$Hs+MZcV7MmvFsaK@S?=v&C?F+}xvdoc9J=loTInY`t**6q z{9KZBzxIrX0YQOM6cLimB;&T#KM!g*)79a|tOeGbg9K>)8LYY5Ap)O zH+O$SR&?1&5wq=-q>LdA1pjh*iJw^T@4J5Ei!l8@-G97Z%R>Ef)Rp#3LIR{YCb zTAxu-|5@ENaG`1(g{OF@N z6_jncy6BZZS+g(k({}s$xPmIrX6n}zGQE+hJKiSeX6;Ep*twpr=;*?dhu$;)`-DGehPn8kWfCQJRgElK%L#G??H+X}!FO#qja&=E z!|N0{kym!TxV6rV^ooJDvby-*`3p#CcR(Ap5aqj-$SHTRAIu{rOfG`{w}}~-LH^lD z@Xlh&M!h`4QYVi!_t=DqbvBCPc&N7ooQTlt#+v_x^#}fJ|5)RJlmrPgFfxB$+QA$x zHn_=wn&=F8-F-`fSs)o$CcBTti;Q6wc*()qhMS z10`eOaLYEScWvPe015{efw0kH%|gICiQydMKOr34OLjr}5LzkgwkuDUBiI$Gh zEZdD`qJlXZ-|1Mqx7)5Z=_LQTj~|24)+(g-;j7!7BOM^#ltRtJ%WZgxVr^;G^a>lW z^gLi*4_J{Zk10$ovtqAZo)yHxJ#kgic!#O+qc^bOeDc!Up!A;c0PXS9P?d$As~-0! zw=x#8EKIxeKXwm~c5_yJpIo0)7vIhrE6-DMnRt<40uQRGWcT_SxO+X`!Yy8{MU*U$Ix7J`ln_o5EahT6_|70NpjTr>kK^GC#Izz4E#<7JcO?YrKqV;@}5x_L&-`QQVw&xJMQGEiG z>%N>!m9TU36=p2B&OxE_SI-}yKFtukm|?&a8j9vcoO3eof9sqf*$#zJ2;ygS`O_mv z_=$O*0H32$Ro`Bq;gx&^w5%=*V9Dc3z&Twh(~qvU2T1>-BgTZYdGlZ8s`zAD#9=gA zc7QwF`tz@G!fpyJcG)`smS_0qox;TONiYUE?kY7?Sqk zkg4wh>1{Q$!B$1f?x&@I(A>#luddZMf95IB}PA`FMUmETFoc=@YrEN7!>$!Zio!S%Q2~?S{u!c z4XH+lD8IlahBt`ON>+Uxr1mSQ3>C!6!yhEKp!1;JywjP?8@Gen<_3AIpU_Tw?6Wk! zRD}r~qq0#+>xpVuo;(BVx|&)Ey!PHTbhCvG z+2^sq)q8_}_QQvq*!xnZ0E(>|_&bJE2?vTr(bJa+t0Sj&&a9;3q`*z8sR z+V)C(f#Bph>52EX{UGTx>eK`kp1C}x@gz+)WRfs4fD;RsxhzVJ%oIAbiA6yMQt;P! z>6{U$Hu|=my|#`MD&_ol^za>1r}`;claWgEIBRRgz*m0J>BX2=YC+Pdj!lZ9PT$1f zoxs!bW&i1R@$LIhWjaXEw$8nq!n5m&vw5vI0sCIky1NNnEz%n=SVWzR*4!1K-sj`MQxKWwxb&%!ZdI7yCCjp|~jRFb`b<;8X~k&TH)cu8M83T=u!PggRo?jm^!{j1w8=3?omb9!WP)1)h``F0q`vc z`XPlG8Q7}f-=)o#dXMNTD;U4a&GfZD4Th61LGa0IkUxgKcA)Kgc37W9dzqvUGcAT& ztQbV@OQ2JnH^(aJM#}d*XwH|rz@E+*B0GHwOQ!>dh?77x^0|a!Js62srDS%F z?+1cYZDEI^x6mx|+JSl3jm#Uwbsi0-dFX&Z5*X^>&*S7IQg7`eVq>^(i>X}crnKcj zVa4e)Ychf}19H}n4|08J5?elHp|EGBT4B9oA*;J_YWE9e8xh0E9WXu5vXGh@IG!92Z%2=3d!z4<7nnYfjsP zeV5d@Qe?pDaZf-ILaBpyA=CD>#h-VTKI<*=<}w!CKIhsZa!@pSLF~Fm(HPc7Ik&Fh7HaE zB-BO|1uxJ&Ju?5&6!Kd}Wh|Z`I~07j?G=SXQ;!d?g6# zVPgV<8g@qpHp6FSUj&L#b?-N)7`k`~=TYpV%;nAzQNbXHb%kgCjrmQsF$%`t!cJdC zsM!zOrD88$CvsC@C`?MQZU4+G?hBAqHEbjzHoB}p8*yZSCu}hYOPUnSCHM3qL;e{A zdE=l0qUSo&mu(>YXTorsn_tyBZbXIL79bFeye>r+m41(8-EI(l=0ANKWF&WHvK&9PFb&-J^oSr{}DKi{CvaEMz3*M6aP z;Ef?$un-#qqcek}ekB0Efx{X_PLnoN!h5^ED)|kMXj3pM6=Aq)fnwhA8KXHUe`YSv z?60I)iK@wV!R_4n{~5187HBJs@Z*U}L&ZfV678y(NCMayaITqBowg-ufXx)0r3B8^ z(df3{x5B6QvN!Fi+mq`p|qMGx?%1_Zqh{yWv z9+7KUli7SQ=!af~!bfKsb4JyT2QDGbwrKIcnN8phYgK98)-8v)jxSL1kOxAwMu{%f z>%c;;)dH68j<{>RVh(2<7!O4{s}O04pD)J*m#ewRRJQ_Bnw4T&9q?mU)7 z`nYS-R?HK#WgsMZ%dM!hKe<`?jkSTc=&TyQhZ#VPBkp{&0)qwn%c0}fyZxdD-mahJP=BNRe_vh%#jgULfE1A(%~Mi`L6&th z{sC*&R0?Ucraz{GZt=x=!-~2pG72Bnggp_PZ6sjO+SMzm_a();!rwcZ;8>(+o^Nwu zpDU))`K>Gv{R6LI0IeqNk_&P(2=82ky*m%<(*7?onGGWN8k;S+xRZfWaM}!4aW^iF zir_8D)L&j8#fRy!blnr0w@nEW7rga4^`#o8&C>Zu+t9?FIug16_PT6tFPPaAbX%b? za)iZbrtkLxy?o+;j2^=BeO=L_)(I#=Wz@5Fx0$p>&Jl!84|sMcq7SoZpLNu}c1I(Q z7fU3WKU}ewE?{oHD~B>mddVkQ9USl*z4-!j_iP^R^k2<1an+uCb0%b;BkG=J28(rP zIRWERXitG^7tpgg{)3d0LN9_e>sVqXUcGXhg&%kaRq0=VY(paK@|kQ@t1uYDO)ahJ zc^-NG#Xmt?@Y{vsZD z!MsJW*E*nDrC$fRUQj)&9*!ySoyA@<{~TqZ6_>mr1&m>h7zoa`YO5RzK`27m1K3m4 z!QxGSV8hTig78vE|A(L+P@13vK6v`4&t1Y!i76w%LlwL`;lHI7+chi_et^AU-&}KV zo+&ouyHLKVbx5hwo=04R6k*ZjF%|4RHZBpJZUrhB?JBm~*3g=COra8bz}G6#3sbe9 zNAXTJprg8^5$?<~K4Rk}3#TY|E>P^=w~=}M-iUy6$(_r>mnqC|ME94#rqT@ct?9Zr z>epzfsm~_(sBA3i!V?nX2r&Q-_WhbW9`o3-B;*^x0ZpkQ3Y8$(10< zOO3j2Wr%;!U>?0&_`BiyiU0(gseaO8dZy~c4=IQ&4#a<@vtlG76@(MM?Z~@gJ_nTzdRxep<#L#_}*{Qb> z@+3yo?kTgFKWI^Avoh3RPnaW%8yy*Vfv$E*T4$vQ+Vu%9*Nyp`6c+sDWaV}XOfM#78Qp$iBKO2@7RZVF2$&)5A8pd>3k*ww^ zpeq7HG)W^gfl0>78Ckwu?YX>!iMFN{8CrRFdb#IFq2r#T>X}YcWk}n5md}@AVaOC(!U{c7f?1bd`$RSx>;r2 z)mC}9>=9%K+#pGJq^KdE0cD?i%;$fi{&sI}K+RuH=o`^{8LB#jUGa0L*E5J=h`?;D z&oS~|Mgr}Ir=$pO?}q^)@aTnwHh=Erk1K&`DICg6&EU2c!Q|50=$f5)YGp4Fh?zv78Lz>1^-cMeb>{ZI@J8Jf<6S5M8Gk?zHeK5HDxjP2U~f7k{NwwSI`C2ju34;! zqJ~7l5Y6G=3Cs#dvnb<9vhEO4MHa11M$UqI7$;~W_sYx|UT`{8gpDAY>0W#};pXa# zG};$!TUu1bA(8!ty{aMtOaW0WUzEI_RIIHq+4Ge>53r57?+GEUJaSvXESp(aO4_~y zGBV>ql|BqpPVXP0ES_9qVCAe`PRoZ^U&|EHlfc+T*|@oO{3scmC|V5~9Zc2jG+9+Y z#zUtK=7n|{*qp2h`+xG>0t>Z=*PvIu0)jh1tQzH)w)sk@a~wXTC7twkTPPh^w|#-3 zu2O0)F2nKhUh1oGqKh%NHO@Y?r{3p86Lh_Rzjg$ij`J(|}a*D00?o=iq5 zKoQn|&w51z5{XoPApOXG+MN@1Sp2H8(y?#wsNEnLNuN+} zdJ;TvaD04VrW)@F`G5n$0yE?|m9liUtW|-oYbu8tjOFw3uOSx?oIDWKY&5t)U5Ey0 zIvw^(C}~Jca|AfgvmEz~ef2Tb2&wr(sJ;Iur=O%-l~Id^T}Gp8n?;IB3p#Zmg-f!q40b>JBL2#N z-@lmwGwM3NaLQ5U@r_QddICewdh# zJ}7FrC^3YjRDfaNj^ae3Sw%tLTIEBx%@8Lu-r*Si{l!ALf^IAl^1AN|P5j#ii^8S` zzZ0`6PJUpsroRmuCW=QV$=itSKSv0~@xDvG-ma>YL-~M$#w;zs1R4XquTovNNHbp& zXnEA~%fn5@nW%|{W>GCkvm0CEO84^O`8KEVVTq|)niLj=8%D(g<>HP$d&l7kJ1WNe zu4xCDiwp@g6~N7#7~U^NM|yuS2i*9X3%}rPq`P)mw1POEW&13QeF?w}C@rL(sfYyE zQ}l@7`-krt@I7!!?7o0w6@J^x$Jr7_aX~(*KoD~lf`Lqjmeo$5Td}--5AwE5X`Q=H zF!doRNnT8cb98+-k=kcNWES&g(k#BB#V`}Sa9|g9II(<~s3}rhJ9$1{$WO zF2BKrx=@!&3HasHBs6`Xk#>CCi4vNKuF6?8+!6}aWw4>7a$#p&!NtV8gFIA(-y*^1 zZ>+a>Fk$FV|C;ZplcA-Pa>$0i{=@C!|MEcXQQ4p?90Z(TSXCEbbTopuv-F9e+=)$E zk+5NU`wdSXh1-BG)l-^z@D@;BCp&kB_iS5;XwG2Sh+Q0_e(`=+h~VwRt_h~Dg!~hk z!ao0pu92ekcGZBfS?9D`qgqJpns>1#x?TS+dp7xQ&b-lf0jTz{I=o-8_8euzv&bIK zOauxwYrev3ExgUa7~Avtlcvtd zKZ}$xaypZVtl|9g6Hsv(1{3whLZvp0*5ze4DJ?)R`f$@&GBSk1C4rNNuE1 z&GPEj^_GfQsN#w?t&;Hy1(vQq@kf@1n#n)R_n>je1D}E7qgW?VOg-Qjn!KL~5cw;| zlbB&@$#{dU;P61%VuRcbh|&phDA~=C?#w$rm(d$eK%mD)>RTp-U3vCQNpn_+zcl^xPTnRu;t9X> z;>73r0}y(^nu#DnTlOQ9p7w|*K*`x?olA@T>a@V!4JHhb6xiV7pfnChN35%@1|1@G zF`{YwYp!k<>7*873#qA1p5g39qTh!j5nhrM_V4*5%nx&aX-9>qh56-ll!TFnFm94y zf#bO537rQpimEHHX5Z@EnL~BQ_U~48I7yYIA@_Z_1TG*G2y<+%3zdn?LKEB0(lO>i zn6+I7m(ZUDjxF;$&IHV@VGhgN;*2Zq;E7H193;&m+1C{yC+$m;88_84JPy#8VBe8( z2PcW@cA9EO55`S|B$oE_7lwR8vhF!>tJ%fmK`)yHk(65BjjZrK`|s^L4Sx|4t+QKD z?5yk3&}b)LOvsbV{0r)a7k15*Ar1EDhqN?4StPVb2R!274ogp#`Wv6PHCT)~WuiOf z2N1W+JM3Ofs-v?mT5czSC3M!vxiA63)O!bK8%{uTWd5heQc z+8FGwXJA7+xP;6s+8_eIA)Wj@*s$V-gBrcOcR7d>mYL_Lw`T;V@hjq&qe zie#0%{YomNXnN+%ok@9^Izdg2axccej1h5c;6IQ*Uc?Er$(!&PrY00-L!)+Y*X)Y9 zj~t##;Z&7ya7a-@Zroa*in+qvB#Q-;d|wNIME?cp=z7P6`Xc~er5G3u!xKahvlY6D zjKR49AOjyD$G4m`puY+|BQyxTeQApUjHw`v&KQW%PJjD}k(~sBycww;J=kkpBh$Pk zOTmz#G4OinYoIO)me)BVNS?JkvG7w3(38PY@j`7(OTtb=b_vWBTWEV9&6kh%KY0%m zZ}188XU7T)?h+2uY>dTksm;BbB?l5-hS?r3xt)4j9{L_OPww+_eJgM_GxmS}>kA#A zJJwP7#|7BC#o}qtby~9>J>h3&6*c-I&4Tph0DA;frr#TEVFt|ZVQ}ZjaAz~W5HZ{GkfIc_5y*-}(ud7EyW7mAlfQCZ5=ye;F>UoW^u&`t zww4H`7LC;?OB~3&R1dkLb9e~CK^&Bwm-k}~a`?7jCwJc+ZWVyDUm2*z0-Y~USG_243 zZB08r6=dlgHE^&XhU*mNo2s&G(D^Y1H*3kkQc-AA=&acp3b3)O zT+Uh&m9j&FtA9yKfP{?@kIru#B}h-Q$)NiWsWrHh+3XnnW|SX4-13%OMm8%nC#QE~ zfFd+8u%zd2oBC?(~b%p@}r75&s{lJ40G<=fu0 z|HW(!jab&eoW(RmyQmY`sF?5jV*p4>ht$UFP}JczL&hFQzu8Y<9yzkNfzr{*q}8uq zHZu5b93asy>fpt%NInpMD`!Zg#jx-opCCcH6N^pH3Ho3$;C92{Lb0Se7?^$h2Q^)r zY35|2?}P0a~SiW|0bCEp#0FFx~Q`&i4e?Tzl?_yps#Bd$WJAcppUNE>$ zV$pd#4+^D4ok1%9Qzw@^f<~5+$n?t=*LH1Xr9)yVJ*oabP4w$4UW!!pF^J48)E*V6 z5!<(y9FY%j+857vU1y+_sEOI`B~&R`Qo(3la%8RNA2(p*-vaP&#vm5!8-$2lz~jNvZ%Lc_1s-aFIQ7+$$~_l*p|N2D{D?fjQI$LGK37ec;@a- z!J44Ia@eVA+rW8 z4UaKJ>$USa;DVZ@Kz3|HOujX@U4R!AYjrH;o4mvF79(5W2N$N2OJ7xVq>h$4xK8Frs&pnN)@O-3yn6 z=@7^Rb3iILZk>i&u`n-oMXuy7CKT4if4ahv5X)ylP-^M4wBbOF-15B8sgR{5IQ)7I zIDSzV=64FV)@MBi@0H#em3h*VjqLAP=u|8L@HZiD0WWxbIiJ~s;xQKx8kNz&FoC9b zSl20@e3xs0kD|>|tu$a+IqcR^kWf%ge^UUC0N(^nJ;mMNoJlt2G~KR9!QTiwAd(0R zG0Km!>`uYh+2;SkC!Z`MNn<}TR?0H)0-OfN7Y~#$1i0--A7#xHTiLP$fArd*G(1s! zj}gF!!~Yvm>n}es^YQ(rsaCc?zMhW!%t3eos2aC!rb^U!i{{IK*Z3@Lp{TO9xmwuJ zJ4!fuSG|f@qup9=Sl20nU>CCI3jH70N2Xp3BCdmS8svddt&PfcO@wAF=XMAhhCQAHLCbrwfGy1gW&JM;LW_<2*$6De%xLM~_>acnEZe%%@!gpTGv<@UI zqor#9(zYNbeWS|F9K-q$HnQCktG27@=uXEGS(qa%LrxVF&L;By>|r2$R0Kg&Ky8cC zus)iseJXzVEGhMy@?LM?@(wL%?b97otS2i)OPNj~SC*$u4=p&z+xSo|<&IStfyYDP zqOkWbv9{Ivon;-dgXGWA6(<&_|8xF^D`6kXk?TVVWsoN9mhQ zt`NC6-H{h~wsfKDcO_NQuA$PiH~u6e&MIx|Eei<-YF&*zUAHBxVL>uC^6qPi0oWl? zSM6q0mLL~b+d;0P4~Eo(S|h%3eWi#zYpbq%n9gN<2@RUm!h^O6q^69jcjDxWo2gWy zVqkk;?jr#T1*_i`(K}Tyah5x@)Pj35BuFH${1GC4h=Nbpr#=VG@0gn1d zB)_J~(*HJLF%SIQ8U~yaxf%E6bXsm8J6~izW*w9{o9rmU)htO6U+{@oh~bE_lfuAF zmuDMXgq)h*xvvpQM!0RI3XC0-gnr+tE-$3z&W}#r3=cGa5~NDu>O(+IGz!~c;rWM& zy-(n<)wG5pea`}VVg|>Z z1*5VIWp!li29C1N=knz^!nPqa{zuo>9DqC5p0fRulC^c@9S}iI!Zei@JYcIh23(S!M9A7; zi>(AinDpdX>PB06TKlB4d)?SvZ-hj861)>sTC|tfU*d4dD1{}23Xr6&#!QRQ-TSI|5NFozjBQ*PX}?hN_@QV z@I*BnZ*B|Nug)Xu=pJNWD(Vh@h)XU~qWsNyw)Tq(latkizepa{{GU&1JS4$<4U)fw z%#d)l*EhRN44bXnpRu|yX-7D6Pt+}bB!_>Gwdz!G)60a#VP)zk+iSKg07G;T%L%9+ z8BDbd9P3$2viO1^lGrRkzjDd4{9LS}SDC^7cs8c4C_Yq6I4k?0GP*C>2zJhc7AZX6 zUJEn&_}%}QC9!UnX`GB0ig*wcpQv5*LX=rfvl&~Ct@Sv*8+sBq0)?1Fv0eZHD)>G>vgs)m7-7OK*@_#g*uD;O`MC}|x0ujAh*U?f z+1ZuU`O)Tr%*q_3ZCntP7~AP9csLR7x~?78e_!_OFctzwN(tzYs|^gP0Eo8uXN+29 zfVDNMe8c-}U)n>nLqaF__k{6^y~-9EHryjcxe|V^z=2`oO5(YtmWB288O`{;LwQL{(DvP<3kY(MHrNgm31`vH|UkK`mak&@H(!b(B$F-x| z6YWnV`uX)dqd!?wRLG$0@9-elT{?en%IRJ-!8mYV%RRt9fF`kS_;`0)ejz9Ng<;Di zluxOe$43^KE~l&VgQmyV>-3)h?DQ6#U{FFC_3=`U3WK%*hR~GZ`piYlAI2`IB9#mY zzAHxEYOq6KZsufK#wLc2OTkc)k%_(~-|xb-(4<7(XG`#vjmQTPxZm5Nu;@t=JmERnFgxNblrOkA=(v_YqdeZqv+?m7eI9!) zw!zt6s^thXLl|RCBqYjWI)?NplWD&zqRsMxUP8*}z0$sB)7BUB zP199R^CB~4L97w`2O2xny)0z8Fw>s@UdEy2%iM2!OMOK()Y})T`+-CUEwV8IHNR$w{lrRPt0tmu@x@ChYfcK{ou?+Anw@}|%JJkgv#e7cA$p9U3OIu{t}^b}IS)vNIp! zEh!aP$VcaZj^?!=23nK&1GVWx1k8K!7&p7Cl+`+L|DmEmn=OeH5)@Er1$7*LgWHpV zMclNlc(K6JP@3Lmu2g2==;GeAxSEc2K;)PI7K+&+FeG$6tn52n)by)AvFP97I+c+rj&8AT_5 zUuPRIuDG43%hWz$6ffWaNmh+vx8TKd-hr=GsQNn_UWwb$5|ek~DqZ*+Wq~tmr66F| zAKu<`-8c2Jod>(IoI*h5n`)c5T<0rNmyEi{O@xmLx!z8OJet&dAv$Q|LroeY9yxD` zw#+uZ5K>n5cmK2&vAAHlHrb$Ecpk@O0*L}OfF4J55D~$8n**=YcV8cl`K?qmPt6Q| zX>eyUAoMWRD9tZ;qPT!1H_1ZS07FI>qK`j?|Ml9P)S3YBM*L*Nh$wj z$;~*H2P9-4vBR+bOcuJ(_fnU_^z?fyt->r4{y>iWqKUTS!bFqR}kZE@?`QKXeN zsp3vNl$15(aU|UNkfFvNVstFgF0j2?7FffPWBO^sh?Mpy>k&q1(LYHdh_=fEDtKk-m^xDK0jrquT;6Jqc zZm2jRGc6~#;0=CZjASQFbfnE4O7&Gpuc`E+inMof+_gcP+qsgFScOhF1Jl166touO=ar+?-zWFm=h-Y=lZL#?AwL!6q!QmwBzC}QjN?ApZdd&tMjA` zbtc}i6)+VKc;-$Lxahd{scgjv1#g^Qo2oUN5ON8B2G|<#pg9DzZ&ARsersDG8C+E# zS66xx%=+%I<_vi(3P zmL7ETzo^rxo+$!CYPK-!*ln(BTyaW1{QDqpNaXltL{LwADh`~USrn|`eX!_smXHf{ zhkT?2ONCt&6}c@a69#+y;7uXn(Fn(ky=eIDQrGA^)65H!SwCd-qhvlZ;rS*(GU*sL zRgtB1^@Tm6y>9Vg_@JbVv#(HLi&!r0Cb??oC!o*L+|9H!j?sTD@BXa3Il}WM`4Vve zFxPh)AYT!iTQ5MeE1TL6qO!XELX;h?nNnK$ce)_jv{PiM9b7yZ$(hF0?x*fYGPq0XY@DZbQRL8=hN=xuP}RYEW{cgQfv|@{xHA( zXydYr^l;&-bw^}v&7xo)C?m41hMH*HZz(5In9qS{smBvb>=$nifcA~vK!>uPdP=m>&JEHaO{eK#Kv$8lbCp7+9g7YiO!d_JcLcWU73)1>%%*G*V)tvWGZ8XQ|tj8?pn_u~{`r(@5k<1NdEp7=Iaa@WF zsWB#5?QJg=w#drnm6W&Gc?MopT|tFtNu1k9#B#1=&bei0oFsp0O*$<$rpou-Fa45h znB~oIt)WOxEhxADx-fW9fRXpskA?W@R7t*Y;tCXE#y^gLfS4J8hEL1SJ$~8hOM3Z1 z|CXVK7HGjpuLZfKcic$_zSYAOiF{$kiN%eCMjy{;ixthDG5fxhg_Y=B$>x6E*Hc*7 zXjeM|miCLtl)N+OV2fCIbO@8#TcD7n|0*7Ks9{fKs3iPc!5|^UM>L-mf9Gj=C5}#+ z=E{?*RFVN+Q*<@d8r^=Xbw-A2Jm#TmQE^f?+Y~pu-CVf24B*$cA6qH&$hHgDGj~zk zp2k*{Cpg!<3W}##XL#cbX4v4`P-7IBN{w@6(m~$+iAY3bWxI6W5DQ-!9(@^*W57}({8fOJ z-Vd7k$-Z=Cb9CT>OxM6I;~(}WNE!G>i(89E47d}%&=YId5e#SI>yaS%ci{kj*8vjO zFX5bD&1qH@d}!99B>V&PuiVL+An~(rLczI5Fvck1x$cWLpH?J zHwsUdQ<5)`&m-#ha!>RTnmpEuv;0~o zP~Uv+A`_#qc}mpYTt$S3xK|a(+RXeT_zgP(0?wR5Wo>e#A`uMIU z?(v27u3)8|Qw`-pnpF<9y@Nau;Obqb=$@@E!#uFk&fd&}M*6e<1-Thon;`Wy4y=cE z(k-*(cqP>*UvR4DW--UE5+MJ?fIMp93=g-5KSjd+7;W<$msP_s2~i{D=Ox#ZiE~T| z7CrfhQmIXsQN}_)&WT-#NxD8Vt*is=&W*W2Z?etS5UIvWkOW2Q;J`t*n@PdX znk-eu3U44!%K-bpcsGSdTDVfK+o!L%5*h=ExZh!)8hF?P7~_VYEPUKPlKR>EBz-OV zt|*WXLvGDZNN_Pm$Iq&TmGxjp z)Qa_nb894}3tbA$0cc&G4Nl(r-PSXl%3vp`3@52L`UqSl_V&&@2gvW=v@_P#h-^J1 zp~RDwp&bBB!Ce?+ax>|COxv;at5m4>th8$u@f^bjbyQO$*rg^*`7{TI%gv5?LM($3 zI5HU7i19>cqF!^#l`hH9n&e^6Dnog&NQ+QXVbdPran$*2j-3#(#|sbmx3jU-y^zw{ zLjdTWzTIyLf#tnPBg^-4j-bES%(f0v8AHx*Zbshsq{ukR%^Ho~GU44PB)q z%bJ-!Xh>4tYT0&|O<1=w&QJgl-aFPns|qWo@RtPUkuhC@Yg3e5p?uv?W?N z>>(l*#)Lm8%@m$RxsdkYH$5&u!+uw8mhxI=iBOyi#{O8adc)ixmWEb;Qj!`Jate*~ z`+N~2)g-g2=MH$T2j7qx)0>7b&(QLT$cBr4d4uG`OQ;-al~AZ%5o9VTSlA3n;Qi=0 zoEafL#Qk&Cl~90^MVpS>4#n3dtAbq~LBvv-+ zbh8t3s#9feii{mvdW!c-TZbL(NXjd-GwlB5OEeiYok0@?R-Lr)t0ylq}71 z%Ex@BUqKRRrZ9%lWAssa*+60dn&te&$I>a1hd+3@Hzmu+Fq7j3teD%jQ;uHi(gb9C zbb@6-2Q2!^liDdR$1QQ6bXU1e`IL>}RJgJhxwF!PwZPY0)aVC8Y4gb{t0}k$l{jwC z^oBem5))zA2bkGbM%?{@Ddo{w`}W`#8Cye|fY zVVy^j_ed{(ii)1$+QHCIQUTtahUUKSN4TmBpv1-w%f4y59pZ!Q4!1_&07u!2ymlUa zzgYKIw}6@FSN}||RmrMf{rT?Z`x*6=hc{rz)PN>ltV!IPPS0JID-f>=oIXlVkCf3n zpAlRxG>QgM#Tp?Ky(UOyf2gOMIDa0`Fc&)z5*8@U z&HuK9u1+jK-y6=zSh@5y`1;&!>3&|sMI?tEIbt{ZBC>BKZKC5$3BV{_zJO{YVzr#F42 zUG$``2&eD~gg{#MSec4z9*Nk-3I_>}K@X+NJAK5U%-=!@Q1 zg#t5fE?|+x52J}Xs22^}PiZn?mZLko8*3I;AV)L?Lg2=@e)xu3BPmflf1I@6*w6gv zGW-8T?0>Rj32N^$n%NRux0K zb0TOfu-&G&iIOpX7%f@L*QrIW1$tTaGbKrs*ABtzq7jFJhIu^;CrR-}rOR`y2g?@! zr&9$1cy`_@8;JOddrxlARVtdhTUsv`Gz3zMni0<26TdvVTFQBRrsxhEFj+iB_cUw2 z2x1KDCRg|$U!SNN>a){uOz0SQ+5j`h5G#(5Htw0{Rqo6F1ot5lPUM>0Nei()w?HEf z-0-L^7H_!y(cA_OnTwENYe@TTNX{V%^f*qFuk2sxbDR%W`b;OlH54GbvW6NpRh0PU zL=1soP%3H=hv5$^HXcw>UlK@|Wmobl%0W~;GxZkPMAc>z@?B6YMTf`i=2WF70A#S{ zw#qSyEU-Fev=FVA#_wppspo#Z9-uF|9Jtn}oo|;rgDs5(b({i$YVy^yO=MNdB4)LA zc_unZFtDOrNSsL_n8?>cUXg7TI9&6f*?;iyuV9%#`DgYSnI;|4wRZ%&^^b{4&HxDG z8^^^AI7el~`kDOM&&X*9)UzO7k^b=f9Q_p$tEsfqn=HRwpCPLg`)yGexE^=dwM-t; ze%aUBq#h(TU6gv`v+B2BJXTcodIAK*sm$tAxk`^qgD; zCVkAkW{0!*ZEKV{_g{P|7B@rUn(|z!wrH8Q6|GXsQwNhaNR`Jtghm^+{qW=eCB4ql z(Cqcd9N{|D{In|hc3~}$&dp{&QQmbD`^#yXhbPK`LGMwiUcmPP6j=W6FULdek}fDp zN~ZGFLk<;6;Lc$CS-l|2c)Pd*!3d6%B>~b2({B7^uka+d8F;{uZs1(Wuv=^N_bp#; z+C*6pqjG-x`&9?nRSRs7;gS~^bfpX+zUt7%9!p`BZjfRKFeyiicOFT1c_6qzHG@k2w#X+ zTm*;M+ze6q-h40xh~lGnhK1~GsvC!4!KX8LKMbF9M_d)G9(YvNh!dz#a$Agr#8Y%UEn*uaqJF+@&4&@jaMsPsB>TN z!va?cg!P_T&Su+W1`b4X(=N z{Or?W4Cnf?b3kRfGN&!)J|C0GmV)Gd5GNDE;x>F)4eaL%4!lJZn`TsZNToU}md47> zhONhHMqTIeVV`lZnNeVl;)*796?AB4 zKT&LVcSuIXb926P?B&TtJe?7rtedI9xZb?rS$?tvS+R%&9pMmqr7E-Kk4O6@t8DcL zQnFtn2m79iaCjFOw&Byp*UD91uNDMQY*wxrmE&PPQW3JmI85AW%yvHwn=m*^Ole(qFi*Ty?C9s{P*b+om# zIHaArWV+@*;DdpQvEAIy#@$cDuKjU|uh78-Um(?%Kr6x6+D2w1z&OOdK?Zsq!>1bK zOKr?fVS6foQGITN=`kN7^hxDmqPjelabXd{O`ov4&V6K693IdR+=$HtEmyMH9VgAp zL(qXFet_NDQ7<-mO{!-+&jeuhQ%WZoj?U!>ndeuiH9R9a0J_X+K;8k9-8l(=A1|HG z){eTuAx8tW`H?LLMzcN&o^)RMS}jRuT-A!wcB_E>a$p(c+Fm3uxI`{2$~&iCgOIz{ z%&72*_l}a@W07O~)f%xnR};Jv39gBhEjY`>X7#|IyG?)!kTkd$mzY|jWCeaGy2jAl z88YOPS+{BACwLlE(0x!%Oo$G3rm1jxomw&vgc9695(C0+-{*4YD%B~+XWNVKd@8%& z=Djlvz;$e)^;j{%IuSkm1iz0m&)aH9%69uP?8r&8ivD)0^)0d)s%9_5xeO;4$CHPK zbV@sLW-^{pB)-j0Jb-6kAI-)|1!aw(v0~yx77QR30bWmTRW7EoxMdV;hkN()n!fI2 z-x69G2h-N`z;deu>4V4Z(^DH!Oc>~#@ZQ$*{Wncfz5f?#$gSctS|OaKiNEy6#HQgbl?RRz*=uUY1J(*?2WkW@o)7`ug zNfd!hvOglHOEwV14Cbci9=LlcY)Vm`c;a{1t5R|Iuw?An2Z~;4=p|2DkwC zPL1|AdM0QjX}X2HdU2muz`e#e{_+lwLNAM@LLN#zslf@plUcHX&C{;!3bk@8h%Mq< zhyv%W@w!FL4qHiF+rrrFeKinXK>A3fh*l|85Poxzg|kCw32WHtNS$*A0xo%XF_#s# zIj9HtV(s;dkQlJgAYi$(}U;FSVT@5uW)TY7afry%tmn(QYmTN zzRgd}G9~$3rfBbr{w0lW&0ij;E4r@kCxO@ff^DOul_UO8(zL%%y(BqcW$W_ zMt6g*YeG2$cexG94IcISOaV|DDi&SH3_0dy!lS7p0?rSRWWoa(70DGlJ(8$wwvN;r z15td(r0fU|6A*#VQE^&?PAnXuO}H9PH9RGFz;CVeB%k*M%;S4H3F?%mhKb)>Vu7CS ze@qj)$$A>+Kj=scVWHe=IxXzffXBbHtcjPEJ~D^-X+0J6#fc!eQY|d%?KT)L6tcz5 zxX0Esa4Zk|D7p(WqZWnY53*6!a9e2}ov0Z2Qz&6XV^O_e@?i9Vh?`T@rM2oTYbI`N=8;g~V+G#P#(X8xderUrO~gq;208`0!7w5zobUFoph_S(fuw z8$85__*G=xsgiV#d!vsa!*^047mJ8+9;)Z}h0E|cf32#=G{Cz+oWAd}{+j-ses}Qx z10X7}LjvDto;oD-McV#dYSYhR)!Sc;{E;xf>2~k>_b4+bWk)TTA3S+?+ zJOD|_X$rJqGQ1Axw!3R?b!6ZL;oBYL0J;Hwm4P~kSu$R|6`RYJ4%ioAH~L2YA&HZH z1+5mb4Z-Pd__jO?H}G@=o&OC7>TH@2b7sV7)3@oJM_J&!QW4%EpVpLCs+2@hOfoNT z^)urF`)f|}NUC~DDelcn$IS_MmAg3`f0-P(_AE)pV(=(8s5DWUs_;y?RCA5QqhZuC zwP>N4x>G!StQX8dM?*(d*9Qkui4J~rM1a!jKc4={cpw+mrC6D54zYa!-fR}cfkAh1Oo)|ph(Q1?UCTU1i?}U!Q}`V-t>}}? zluPnA5HxRr9_)mu)^yrwSrRQ8fe zH@|*q)0teg54e~KA;S6^NwTDEgNxC8ah5)ulP%J_4U0-u+aLO+C^lOKdhLpocl)Be zk4nT#;EQ-{`BMpr#gvGY;6Ev23Fe8cmvvqMUJR|3L-jL1MBdSdmgq9j!_%l3=ofKl zLpd5k#=Z7hBnueXrY1A4(`KxZV!w^Wkr-kPujB3?xU`ib5jOl^07w@$>Qn>h6MtYf zyeU5ry{Fb!Ri2S9=c%=OsX^WD1COt81W)Xn8J~)~pocJ1X1M38?Dk}tM)Dxz)KmJ?#B_&4d)cx$AbJO1dvTVZU}m>)tNGc&I_MkOuqY7`Iow zZle+u{~#@F z(YoL@wR-!sV`Si%5f?A!DQU~ncfP$Fw&aOo{Mmm2tRZ+gc{}Qkt|;m-@jaC$974?q zfEN+-KG3{dbbQ48kqa#*7pjS#<4n=j12|c$E z2H$n(^LREP=yc7_Gm!J3+C)1!0+Vx}8iMbP82P}+a?ZhT+pz}BpymM7Dtvl6i&QD6 zRsGL^oNWJkI9xieP}+3{%C)KWXUW*Eq>=BA1GP5#HSY~BSb66Ozm?(G&f-ixm#AH9 z1hsZ7RSd#AWyVMRKO4hbU3jHs=!FMIE%;40)M8H8qBLAuI3i;30m)G5E=3e-fA9rZ zfDE{Z6c|`Xcop2kBt16_gBi*+RL=Qp6RGM2P7?t_(2u(x%)LiI87y1gx;9JH)|I@_ zKh9;;rn4(Gra%SI$eN=SD{?)PFsI@#96L=&(5b?Z-A4W}Z@!D1|8cREX&0>5HTso! zIo+X4lRxDghCS4H^6DPQ+&C*(S$z6}?MpegZHZ1i*!7HGVVUMA?|B~O?^B~{`NzP{C=HbRa4&)B}2ck z3icTNNm8nZZ%ut=(zC-=?R5XeH%=DCg#zfMxp)ys6`dh6DUXU~F5*n>N2`w^8!Q=D zbXgFTBks!hqT9;??xP(=2WR>R$BheR2fQS#6Dbt^)q0PAg4O7DNQ%+zFqVt|jql)A zFt}CvM`>WJ(`I60`UrP9ABze^3}kXRV6m`F2cYMjT%EA|mw(xB1p4J*YQ4CxRF=5^jDZ;~N7tkyhr{~aoS889L z6-&lO42%cQ^|K~@2^1nFFYfp*@fN%F{Y;JS*#Yra>gZf%&xtlf8&hJI$mxKU`xiv| z@3wei5PTAbQ2h$363r49_fgV7n!#);lnuN7#*rO`)G!Qi*lPOaZH50~h*V}_mO$yX zR<`{ndiqGTS_ZCW3AW zSMxPto&jesKOwOe_R;Ix0UZDex5_brvAi~!lo8s0nVM;Cy^~bPbY$9DjG%fZbXy-b z*`DwCZTg}mC#*J8ikjNKhJ{BsEGot8V?zH;e{m)Kc4!U^L4Z?locrMcapDQjdzhXD z`MbNYk(HeygW`1Oqar}RzS5Muf93(sqh&tnnI6b!kuF(B!z&{{>1vU^d*9>^LsiF#JR`1t1TD1*mgmN;ZbQvb(Bou z7}b9*s+cSb+G?|@PqKIv5e36&90Ba;4UPEWy(Cl_5e;BMsqmA2vwjdu@m&6nK`Mzz zYf1UJNiXTez|?-3mDu7I?XXEqGZ*QE`qC)T$7_`W%iah0_s_gMB0zDUsKV;$`^cs_ zQxgJ1@pmo)RcWe8Fv{&5{?m(P(H;F+O;zUt_{w}Ht;M#S5B~?2Wp*5pa?%+Lx36A- ze=JloMJ`3Zq9tvZ?-Yb6;buq7nc%xFIo#)h{xOj&uIqvoOJyt6)N`n*VtLbIf}oz_8F^8CA}{f zP)@SO_tOI8Jm!r)JkD)2K{{x@?YQo!gwnNrZg#to(q>FEg7{0{eJD5csr?5CwPvf%U}tWWpqr@em^FyU88Ho=%O?oX zL%BB9X=7gb2ndp0fiH*~J}ndmD4@<6WRPXrNYFLkZBQ}SWDERk+{Z#eosPmX1st`u zJ+rLLA#0ghM%V&_Z!-={&cuv3VYX6TCiD+|RmMgak+ipi@!eRUvzl=lnLO?@x}xc{ zU|zI#)p57$iUG5hZ#Q8Z6+V>_<*Mo$U2OhfaxZSl?#9h(L`-w3;XpVBL$xdFk8HM#ev2jLMp!l$)@)dfLHOSQpRxAl|?}OMPjA1Td zk^@2VO29m>C}afKKBh4lzE>S)d!d2-c+c9Pq$o1Ov7Q}rm)qf5jkx3B(!@n{1fN`Q zHsT_H<$=Qql|DE?@nx(YrW8D!f8|EYbTR~x{z!Wx*sp2l!T^oh?s?Tra^ow0w10ib zvVmr5k12E47lfwl(FX0@S&xN)jkH5gmcx={Cc|Zf3z|HAh~=#sOnMCRom`b))WZRM zFA=)rxqFFfDEQl!6zRR32QWoLgI!KT5x)}pyrNKg*gTOI37@OMlJ;r75QtN<(nY-D zvJ&MI@EsII5%k5rZ$WwOu(c<@oz8Y-vkqZesiAly1A08c9Ub%q z8icQLvRvNtqbVg1f>I=d__o--3y(c;;N>hMmriLW6?J|VH&_Xo`i-iRVMVi86_nr= z4}J{iY4G(MAo)<*4&&BIRzqs)Q?8NVa_&gP?7vR+3#mh8vXheJ#k?VA2*hx0nE1vd zrVb1>7Zh>vt5rdd0UB#jrP@5;u_@in*TB%UjOA)$ML$A-Y1Q~rRv|av;2YterIZRZ zfZa>}Vxwsje6Nd$1xGV5mDbfu4SX;-9`X53!Q(c-V=>7mi(#$oK&F=FfXZRr1Ubs! z@bf@oT2QliiwWWzf+ksAaSeHyleEu2{jJp+n#3s8G~w0-*L zfBQwtG2fcF*0bp&gkS&%+TWsKyJhOAA58Y0%G$r*Ax>l_Y}*-;biMIWmTL0n0B{!lKn_ovAPF0VIL*9O?K&Fupa z9sMiDM|xz#lUpuBDwQhZljxC5idMg25BUL5ik`X3MC;{X^>q=q4t&^Q!DGe$?d-vB z=Nwxd6@%+|(Z+77gdUB#@YZqb!4P#=!0WU$^WnLES8kIu%#k$bKJ!hTD?;T?ojO_9l@t;fHNoU$#3773%U9`^#JH(2>e;6Z zG%E{Ua;YdeLSuv~yS&Oq3Z8G08do6}KR}C;LIy@waWNOcde(4QXO68HD3CG~14cj}PpuEB@$* zjq&o>J;^Z&{tlhF$T&hdbHcivh`wE4f-ujLQWrhZd~xGb_X7!s=={SLpB*EamZ~~# z`={{Fki@B$=WWCAfRaA4))KlwIe;2R(DioeX_Uw$gCw%GllU*2?~#1KNnxliPBpRz z^sNUMgC{&IGQht7fI3ojd%FX0p00p0w5H?T+>I8z8CZJS@a*scE%)z~cP`F3 z23@k6V(J%sf`_LD>$VUH%8(8-VJ|ZxdJ^?-_5QXG&ox4Yk7p3WkNXz)${?$BU69%< zRUT6Q@nXlEMSSOGZCgx!>x{{R5_=T0Z)hM4lqWY04@v4Hm58ZFdOn`BoKmI^^$JV@ zkNv63O0;pa9Zd7e{)p_Q4LivazM9aN_8+WqPAQ(zGD`DCVlG zRBabC$QbKnYi=qK0>w?xXNIg{yT#|>sMYNti^0&hFZK5!jVUxa#HruH*ZiMX_Wd!h z$~c_&i$yvm2PYo)xLKWc@C9GI&CIMcqK%b9iJ@(=K$&=`@{4O9m|&801u)8jN_&n6 zMTlq&>4%*3r0kFg3%!q5BlcAuqD~3>k`c+pQ3w>>jn-M9(Bp1p4LSo`;rz)V?clU& zffQICIgbwqIa^Q zL)1-*y%bI_7M+wdy<{l9Wrp(F7m zxx}m)BBAq|>>qhuVxc6RYti6{YKOP=)HP)5qp>|MLWQeVguHgEyzW-|xF?x=n$!lT4s=yO!+w(2E!HQEBX`T30I8C_ z;~arpLb*w>ZC7nCs9T;FQ_m5DX`O#VR9V-kkyCj&Ib+PP5~^I_k-JfH6-J2bt0u>y zbiqHQ9Vjn*5`Ar);c$W&i+e+rDU@#lbNS8y_z?!4N0z<1%AO)r!e&TGs6G2oau?W< zQfC!GLz|$8H29cpC_EAPe7}jiUnQjr**LYJg)c4BwbScNT=t3?Fh!zEOw%LK^Y1(c zT>K}*J^*qF09p`xkI{DvLp)SYB!ROe1$0N9!ZRjih>EK|!dRo)jd&^yWlq2{UpSt6 zk(XeG5}LGTQ;3893VWNnl>Tc2uu;ABJ9cC@u$xfnR*74^K>Lni()JCo(Zhi4ggc|4 zp!RcXhOZUE#>j`*A}iCvO5I^2j=E88CJW0Wc2iX$PE^|!b!hcm>HS%m} ziQqT097aQ{Ckw56d-}sXN}u$Qu$3oA2rrMX$(sOLmXOy1&U8LbmDrDyrza2~P6%QO zXo(a-0DrOv`k8q^kZ}uAO@fPE{GSFmPCShK^8Nf#;{72ZkbI8mA@wayE}khr;nHwC zfqh4{rCYI)-yo*wJ(N2KIT`si((&XldGQCsxg)5R(OqLwsH24M1319uGt}=G!BLeW z%R-3Utd%(P_Mr9L^2L#zQevnZCc+7X5Fh*()(7kn)ojBKT`X>DBEbAN>IPx>LK(p2 zK+dwp-dX7nM7-zbBPR{rqKsH(lUjaXzc-qggYH`nRT8#uze2m2v<T;_$0jL25@E^Y?7}?ijxQChV~vWbjZ9q z84}2d8@xncu1tUJpC&7<1+p@Rg>vmt@U$?bc&Mb^RFE67lFgmjl+-t(ncTuTP!hs}D2mJcyo4 zd&TVEMnA`rEhtEXxIc^Cl+j+!PqvIHRe5(2>s*25s|O;XRno6Fzg%Pxt!-``@Yz6% z_s!|-CI}WNZqgU*-&|5Bl{oNjmAv}2WDxTH#*0nmiBQW6QS6N})Bfo$awcrX``I<_ z9|6@yx|_zH$0rDxOCazgl>xS{U3!V)iLJp7jBA+6d&T5Z5XW7a|I%fxS&24l(>U26 zw$AzdR=JARHRUlH#ma@=tZ6Feo3lzF>qW-%E$Ap*I8_LmVyt9U#B@c}u}$%L}KzwFGpzkXLkOyQB@YBVjWkCJKsI!(@WX z`=#8o0Q_7HT&iMz7G6HfbS`Zw%CSeD-z78pv9_6?E<7$JD#n!lQ2nXM$zZhq_GBj{ zQWwnGY1)wcm_n>u26PU|hR4s436LS8AE(h}J+5X8eX7q}#1b1Ll7fEzTTQ(f=wR8h zGQ>b-M|-RS6EC{AI6pfpm1K8q6c}2-B=Y7>HfNQZ@F@4})cL|nax9+A9yq1EN@Ms^ zZ#<>T*2-BN6LqT#IT*6T^arcrmbFwI8MH5puYLS`jh{WThNI?I!y=;~wdW>8KL}`J zgEdVKY-f$Gxk1$euupEQA_1Hd#58XQdU8B_DrdWW!&@k#M&d&nPXD9%q9sw)!Xh!c zE~f1GvvTzMj-=-4nscsCvIx%{MZ@V(x)+ks04~2jmK(h}+GWhtDv@g<%w^=RCo%6> zc%@%%W~GC#V`ulghFb?N z69t*x)S|2xlb(6<@355jFQ*tHl9tyn{#{}ncRd(es|~~lOsXmCt~NuXd4zr#17?|q z%7i)Jsu7q|x~D>qSv=*bjD9BEbj>)9-d+hdw#U(3J)8%Iiz(hv`0ihEEqg{!S*9l# zorre#!*#Jts_3b!*h@}5{R>w{@8CWCrYJ7biU{DsPG*{}1mnO~_#u4(iWvrjA+I`1 z!ra<$IZc&Acc|Pb{BVjop!ybG-us<(8f+Pk!|W$U-x&%LcUvp__8jYQU~U{H^pfwtF4pwQ zkmi+qBTGx;Z?dvLu=d~RO1yPEmh>L`+l?n9AQAq0Ex}Ja82X7Mn3nIu0f)u}naXv3 zHB3*=-dayDAQR8?ywgMhi3tfvGSq@Odl!gxX%>V#j7Wds!}l7*dsPu8ntJ6+;ML8O z5yZXG-MYv(y3KmiCe+QKrhopN^#EU~tg)|KW7WdxnKUg2(i%;j?8vQ$;`{9z+07wE zi%7&1`kdc`$qVx}RAz(-0pj_V;M0Xw&OF~Y^V{~cmFkL`k>X-%;{HZ^G;<;uiAo56 zv{o+InSR5J?<{dCDgCAR#dTY#Y}hw$|LPmVEqsahSd3-i^Ss>ynvA$E&3nVbQ&J?_ zLvGFj5Y@k*wgG0Ju!8gd6#3lPxXZ-$T_F7tQMBaq#%+C$LXk|G`3Qait@90bf)C8> zdpo1g8E|S;IqSJd6g<4s|Fd&2NudWW+rRWC;7FuI?Sl~-PoaK&6#p9LM8)5z)RS<} zOKU7JTyV2}%8Pn6oI9dh@t3y!npLjqd-YTx3!tJA7z3iw>?B82U8$S;6ar{)?YR7- zSXc@5XmAJx72}oxWKENMZ%CmOEY6vym5Db>Jrvo6NZwP*#r@~^WaO0|?My;&>>nd- zgUUWGC^wkOM|}gOEX#?*ekREuHE9~?1_DI$P)sP`M=>VPFo1&!{KcnV0n5qB9d-}{M< zy(*iDob5iXQCrn=b)w|-RR;&;(mfg)gHFU7U9YjaRxMC|3bkYO_l`Ui1uqXC0Rjq{ zYw}R1-Pbvw_y^V7pjc6S+wCEZuq+ZkVYJuXU@kM5p9J)geG%K@R+X2|EP`f%qm5WW zwct54e{UCxsY-J>i^{2c;`T;ET1EJ1_z)q>ZGT~%^f^hGT4|F-MuVE0K8~Kpf2a=E z)f}WC0Af@=A4EzYIjllbhQ_mG8Wo30-V2q=2C+g+b+0xGztDAq>(Dz29KG}c0u#xb z=E5QY#|5_`8XcD|egFqE)lZ}Zg>yk@Q4T2ocurxz!yIUy8}R03y7JZw{Z9Y8f~7px zf6m!^@ct`I>3c@22EkkqkW0U~^s?uqE!kgIOEA^y`)j!K330?o$ z7F-7-j8#+<*()dWjmceWpnegdI+9V?qb$Aw41o33>)y*g|Jh#uYxXqWk0pfdgVE4g zl=ZL#GB_^=eh!Hcr3NZ;ap+Ei4X;zNw=$;|s|hFS|4bFLFH!TG zWI%p@Z`0bKRfTn8*l%T2=OWwD02r+ zI%Q_EZ#-_xEBARYoyEySjhWaD@e;?)XMI;eATKrVICN_RQdeGWfr2OiD?rr0NeL>j zf)~wQ1Cd|D62UCKpyFoYs$UaH-(zysU|)&)YLI;suhP; zw%F{xKLgh+V^dG)4!RD}Jo$?rHp)}_=`G%_8s$tZO2{yoE-`ggpW~Uj&=yu}LvWN! z4N44T^q9zUMjug639ET0Wa|T0Kkz^D#!a<*j40pcuLzq>D}2wDlr8cXyPqdOla7K* zXE@P+!&U<&C_+UY>x0;>j;1C$XP}N?=B5krGO+`!cCHLKNfTAo=b_pJU~RQlT3^HR zX9(uTJJ=wu(jr_errPE)k6zZuk50ganZGFm_alLrLm7u?rNcl+U6elEcsY!Ir9-A~K@ct7-c+;+8@;KJh+sM6*7nGXW_tfZ)zHAU$OW#iX;U z`1nQd^E*XXp(-knr?kBNEfQocf%2F%5pw(c?V6bgL^E1o5JQb^klH-?);9~sXoqA2F67e8+g6k@vujBgF z+j>;xZ(r#c7#YbN6-(qVl&cPe9}{GU%X$20RL96!-&5OeWSjIaaOM7L6DX$Su1dZI zX=1V>WlF^`L;#(wCfBKWot4~zah<0HW3(e3Z%_B|#5pu6i^Z1{$pR<}9{l1E(HM7% zOZST!4EnQCJ(C8QAuLCd!CO~?C^wkifLw#+4oEFQP=0nJl!5vD5M91nU|8h1y1U%u zg_G_*3Xh-3XFfH+kG_BC#6S_+i67MW?UM~ZY7XI<5|gpLI&rrY4eac3p$d-zOyXm|KB|KAS147%MG)C1 zQOLE5!jG@%^?mx(&mX1}jg~$hI~7{EPIdvSxkL`_;x_ll;I)(rb@<9Dg5^2z-DptH zGlI5qINvj#hfZO@cC@xxwNyJe93>m-je+=X8k#5t0mh651Wo+B*7)O(R2Z%_~h^aJXROCoWI+LPX{v2U zE`;gtkxFJ{c4&d@M*o{PHpUqW8=wf%QmrOlwkaBN69Xf9R!V8P%bpXY_63sboKrTW z%WyId;?{^iVX>I+){*Nn0kXm1z*cyJ0Crenu+z`!9W-G_Xiy74I~u7rOk}kPjyr0h|yT!M_|w6dppl7Z!LqG&GyZcvb{D$Z4`h;ES5 z@yaH{XA2#EKzfAH3^y9Vx$z%#Y^A&KNXUr=)xwVnynwm(pY1K@gf$-x%x#@n1~pI4 zD}@Ad(tTh@UNvm{0~;KYsk5H44NZ+JB=flPxZVhPcCBL^zzhw#Q~DXl`VjJxgM&)( zwWXk9;_mQGF4ZhUHG^o4)9_J4r)Z?+B6gUyU)c(Bmi~~niZWk_6ru6#lww6%_@prf zcgQ=^y-L0vqwdMq7?W{WOvks%^`*r$`?^=ghw?rJwklft@b@R9zYp@wsA-QU30Dq?D zL%k3vU`$WPY~>UDD^Ooy^oE(m*$+c7;p6@@?4Zxg2noPF^H#S+P?{7Kk=5b!W6fBV za4E8udH$qSeKq;MI_EmHg){er_2fg&+8a_ne<(R0rpU(kQgk@wz_MBcG%pHQA%C9s zaUggqOsh@ANgcT(7)MM{=yQHw>BXcAnS8vtYG1lAQR7rB-|}A!n(lSrf4r*Qbzx4hB6&eLc9A6F0UaWNF<&5BF`I{=M z8{#Vt!knyw9XhfnEa4B}Q~)HrsIO4?DT|6y>tEWm+XZqFqk0Ry+1c0(>Ud+^j~giJ zPYg7OyL6=7Ut5l~0q)R7sUf@)PStpXAV6`9c|v8HQvYPvCSMUcy?}ge7a(=hqOm}?6A;H-(VYBcgt>Yzg`$2hA6Wq37JKH)ki zy_b>d^}IgKWCXt`&6fca!UyU+TD zRTdA|KNtE*8szOF${4H{b#%Cm=}ZDrY>b(GoA2Ca^Erd++1{jLqq`LiYT{xYrpqmc4k59*NR!W`~atGFYh z@oj|{qFYC!<2h@YiYdrn1)@m62lcbzqk4xXcBC4HA=$B5Ohi}l*b3J5U zn3aWejOZe{jJ?eTYKNPIsYJ}_Ml2^~#(2lrF-gio;8Qr|%4e8GW>1BpdkVrCcKY-} zCR7goA8JU!kyswdrm>mu{HutOV72ZI0>whl{5$RRDdC(cLe`@LO+}q$@sBzb41E09 zEiHEJfVaeGt}K)%stQn6NaMiI%&T)Wf#q>?i(aH!Y*1!#4R1s#e!FZ-HNk4FYdP@# zo_q7+dRjs7D~mW+4mZ@SOSlV{yIddDPV2WOg)=C#PZ(6>vaj=0V`Yl((h|JjUCKo`AnQV-J)1)t+mx_F;EC zR5k$~_mAnzN%#90CA%eNv-!7DZGn^E0pKoMO9J!@<$XGrMX~W0Fl#!N=U&=nHt}w| z-UyW^rzL6Jj46&CugO~=HiSik`^nckSq=H@>_hAbZsn$C#~Un)tS#UTGZg8vq5LaBIK&Rqj})i8*uKM8w5%s-5NI?j`2;;#HGU+kFj$N zo&WN{tD$Z^+AB5!%8|b6VZOQ+I4v74Wu!GbPV07hjFBmy1vj7$-bpm(vMAaicDcMf zr-;ZzUSHG?oRPg@@7uF~vf!*rKO7AbR8pCaE3F|mdd|-_CQ*}U^l0Q1Y+V4ImIq}u>C6P zO>e<==HhC2Dazn%)i4PU(sw^L=OyB+xK5i!oEB=k~-1P zrwvIWIQ>;?ZXu@*Esz3+p^_lckN|PtcwZf37Xj_Lh%1 zK}y7GTO}USDX?-`zjgg4RW%!>5~fQrCMxmqXsmu%@m5EuVGL()LOZ~ti;~FwAY4JV zjupFn>8$KhbNXwFURA#!ZapWWhw>K8w&22w8B;amV6dC-SND^6j3TyYL6NA-9yC!(<+%DhQ6vgP_XDJe(r%QfnNMn1wumu^8x6uB|tC=Yn^? z57}UeX%_QD0Ii;xThVA$6?6!0#HDjCje^>jM^89KG~d-DKNrHI`=GLiBS8C2&QG}k z+ryXnl^sR_rb3Z{ZW+ni>aPKC)6Czf0G|6K923WV&Nd}OkiFb1y25JR3 zH`-~9mrp&0T2s&F(~)%Az(E-xgmq9P!#(=F znHsKpcLSUcwTpROr?U3j%Hi3)6BP&hlaZC^Rbfg{Tu9hj1VH|6aH0!!laX#BU;fvuQA}HEHZ6G0&XF)QG_B#6RP^9e!7D z6E476FB%Qx3jI^#qv`tYmPs$55cut8dN0i9#w@Y92?&}kWUkmt4X19@5yoRL&sf8C z)1qtee2P2UM?UHM%`Fo76ynzCZQaZ2*gKn-h09^%8<~#au|IjPE*KN2Hr+aqDI>3a zni6>i{mX3cVYdZg-~}-gc%dw9vn#m9DpmJIa94B%R#Sxq$J#DFP0Nq1r~V69G~;?9 z!Wo*gLBk!e8_>eGS`PccdOQ8wWbotkSIz&DVqHZZ4aFv`4&ZHVmGE11C#)2heCdMJ z|BP9JP=6)88{$bnQi?ILUD#tzfY7AwKUr8BdaP5CNeWJz0Mi0MemqayCyltXISfSb zxixnCBL>ro>wq6)J($n(53rP#gi@3@I%RNdTSheU-P9L|L?QP|S#{JwB@`j})&+a7 z9xVs^x~&z3TiNd9bym(k+2btp$ijLg>#t6XmCs-Qf!w4mEA62>SnK6}Ib1`IV5r(4 z1+xHSoQN}bJWcXb!gC1wxXZU!{sl4m{sr9b5+c?$rZGZYQfl}mqw;e8$W%#r?eDDF z=Hi&gn+LKO+`M>}tx<*=8s})O42kRoEQ|jE<|6hTrK!=4{w{RPDjAh%N?4f^*`ym_ zy5lJ;V6H;0`i=8Sh-+I%ovqWVoHs4Y+bC!&X!f{>SDYTsq(D8c?bhS@i15I&f1tBk z$x})RJo`*~?w=SNbHEjjltsUV?#s^GIqg-Ed5-yXvPS}@EiKS(Oe$6MOI(3KGPwh* z@DQb}Qj|ab&3jS2ikqgT9QHii7=PBZ6hmJNp;f)Jg6jd9qikwMPTe(H#GHM3>tscn z#6LU-Fj2VwUdYY8D$Qk#8jPKPXnV3GZ0>dFmyttdq{@dP|FXfjgQf?;7_LC&8eIFl zXo7TRk6TR#<5dk!7+-LZ>zE<~i?nz;wwK^Y?g6)0EYix-X8%cRvp59@6w868fRH{nQZir%Qp9^uacON#i8QL)gWfX;2^`2dR5j&ACp|r#lX% zG3)sjzCScCu@jx&{B>Gkr$9ut8ncCk>`!e_^G0Uy(6Se|Km@hE7=okr_IRLPd9I*J z%Yz|AZIeT1qyRswjm1WFombJFP+k9oc7-Pur`-)m{qmnT6hJxCaL2bgJ^T}o`n&0n z##FG0-WoNN2DOts?BKyr(yXvKT)Tp9*d90)#Q1IN^+Iz9(3k zi=P3Z|Dfzt%W6aD%7oaKjh2aulSNhZrG8huOu0WJ3gRL!JKd;Cv&~r_`;lY#b?FD8rI<8w#U$Py!xfoK_kt(R)$>1)V^HlYZJM!Jvy=f9^0Cc zm#EM*YsNu`1@k%s8H0$li$;5z;BO$QS>iWxeiE*_ikc9L$zP^5LB^ zn&!uOEX+r$gK0bdGq@<6S$?U$#~ z9@qv1>-Bc&jQg=ll3SK|%t$H2>P}+ATe6HjYcBq$&Jf)FTK#j-``Z@$e|g*#EChBx1}=Wm_sF4hum(-b&z#r0;0sRXuj%*+8QkjOgeczTr8vWP z3+D)h_>k z^cHn;hNpXzuDiqONEc*LthD=Vj<5%+mC+2h>oQhpuJLb6<=%h`m0Nb&2ZF{%#;vZa ze0aj2nhwNh*`FG~?TKhCfWiB64HJehXD7yN5O7QjlxYuD?&Nf~e%PC`5NPZB3ygz0 zw8XAc3wZ6Ku|u`jumlWk55Nd>KlXUi00SgLE4AgSIJ>~*h1Aw(;hr=KLM)+AaGiC* z$iPavs_*5ZcvLzn6Ic7_V>HRgUVfq?SXhGLfiP29-`m1F;^;e2SKJxWT+H6lsurjG z00+M8t;=5t^>Rl$vPQbxzpfpr%mcz?jZ$`x&#e^o*dMH7&FVpM>gX2|^^&KYw=F_|;g^{B0Xc4F$KnD>(oQ&;+U%@v}cbGc;q41qu zd^8JEcSUXR>q)J+I^BlMf;!--FJ0mit3fMo_Ar|s$e)u1|NG{&e*6E_Xr>U}GZm{-?se__zrlCe#AWW_ zj;{ssYGxvDzYc#Zh1A$lsk($9G)082I7bCNJ09q@?&}ik#k1^IbBZ?(q?9n2Z+~7Ut)?$tt9ZW-?szdHktTzY3B166; zQaMVTaguKF@o-ZIVioP&l}o5D>Q+5oVZe&Na@s6S*XK?!vg-XFr+L1x=xkx*g?+fc z;Bq-s5Z>=rb4W_dbUV`)&5URq=sa<98P7`(u)uQW$p7ZqyCF!tb=zimec)!r+futn z2eAluE?_-R?II~4XrYTF516x5kUuyWB2k`>_{!-W;W{ zAf$rtqEmX@s>JWaoLJh9*lgab*y5=~ zvX&Dp?Z&xn1On)9NYK$;RjbA5g&za?EJvC~(yBR#=kR6qpf^b(S*QhCTLdvATUB*~ zQvWFesQQm=tAm`(vDR4S?D;am zSVbb~7Ok1)`0U5dNvny%w9Gw!iL^c@gofW34@+&4s^fRT+IJCy{?M-p>hZLvv>|%a zPXii2xoALmFfR^}8CyjTlcL|&1smXw80pmDA*z8q0&r#X*yIknc*DAdhzc0%5t!X;Emn2cDsc zmpoAlUFMnPS4T!^Nvpl0UG|^C6S5E>Wv=PN8o1Phnc9aZTpP=`mc9Yp%#Ws}pQeA& zvxt6cWZp~S>;qXL^wU4X6!ByiQ(6=DFlB#0QLwPC+0pc^MU+j(1w)_LVLktmLhF;(zYg&GG{HXIG8T89e&ZaP;yq_ZoTVxotXg{4JT+m?a6+ zf^Ud=OM#FO%fGW?u)eR?YZN59d*ukNbK$ZDaM+AJ(SVm&_i_0}SrJJdyneY4pgiDE z4IFqXT%Y~r4;U4l#S|<+=cDJg&w2vS&XAlLSo17thjKO-4%y(+Nn#71Si4}J6!oq# z0%(Zcq87j9@tVVPsHw6e2L+U7+ee3lZ;f6&V~f&XQ2zyDUt-@&3+(ttK5VKw>edxIa-xnoCCE-)7aKwvaPqW@+=yYAOu{tQ4VCp7#pb=gGgs~LwymMyO-pJ;mlPi^=!wnwdJ!L0zW6# zB?6WOPdKj}n-8yuwk75dj%pB*)k)&NQkm#UZK=OD1W#e z12?%24eC};MSSz8^}}(U4mif2fQKMfioQj+q_4^Rl$Kk-*cxH>S{6GqR<@+Cea-LL=z+`3E)EU z_dd!fQrs{zI02DVJ&$-*7bh2GUvc=jejgKJNQt7uTmzUL8Oz=xyA~I=t6LGUS#T3E z3a)6>-#rVr5LGlv>EMIe@82)t-`Rh}b7zdkIJ_2MqO2Hy&1*#Ux3V?P;e>3|Eg3`g09f}_b&TI>&@7wHzf4q4j7iwAd>L=g#z#QCIpJRo@EBGoc>h@7Qvg` za8HwFEv!~b5q(Sp-y(_hiXjJU*H(6Riy zS#Q4#!zd$r>6VYsv-Rws^+vxR;CjNt%K z&hoMpbnMaOu zO|fcg(KF)Kik&SETmZ=jOA)*laeJ^)|0K|Y7GVNZK}3bs3 zw0`0o(2H_GO)GRkP1~-=)8XMboOEK}sa+Eub>^-u41iekxjB}pODUhm{VEMM9bR-} zD?=^bhB7EX&D6Ls#K4O>%k0KcQH*1y2Z``Uz()uCVd&@Z*cmGmD$P(;z%{1v=pImXs0D<>J-J6CtZIff=G)nR{tWNpIjAcLt^3mN#n3U8E!I&YFd zx_WWNs%lSZyhJuR<08!E;)#QmM6FSj`;iBd;yc~eMmxJ9?v^hCob%(m%#VBF8-+SSAGD30N-@vH#8YxY;e7lY&(}c%e+=I zReZi>6ae3dz*~QqzU8yAyx?{ly}7=IIzM;Jf~)qoFA@tMtop@s?ZtJB^ny}rj(u4V zCYwnMr6#s&YcmON!e2}y%EZ_aL4$&M%^Z4OqTP=t5c1VR9+>zD`6|^!YBQ8br7P<} z*=#AR=?x@f6X4)2Is^NHlFu3%Qko(pDsXtHyti%d7Dyd@jMa`Ciz~|hNrqgOzxM*I zAR}8YuP${t&5Z)Zc-u_5jTtZyt66P4QPtCGb45z0quazl1`2#~IeO>@!?MrT#SW4u z#kSd*wRrJ>T&5Fw7a<*MCVV+Dkv91j16b^SKpKzF8vNYAaZ9L44lGr&fi|nGy)gGu zmteVTccZ|3jo{X_A9LFjn9D^z1$(ZrP%Y3*%-Lc~chh-fvr&A9(zGONYuc*@0gi10 zQ2x(_qNGB8Fv7(nNoT_oraV7Z zAQCq$iI3XfIDI*nFfg|N#;QLQkUP$ktv_2JFU@R+ORegk7QrjV z_>#@2-gdbG2L#V&8pD95dNc2YgcUF(z!<8NPOobWzI=MF1y9;9l2& zXo`1s3eC}Le}V3o3~SC_Y!;2>IgToU;DK68r`+l$E(be%Y(#vl^DR;n-SJ_IOX8y< zkeK)&SSyw-Pk5PB5`I&~jz7@{z$NnmJ6q73ysghdi(^E?{36hDvX+)afd zag`sVAubh(trX?uM8c@6)lX}tl*aDJIe($q3>2=*mo;%d%tg7ii8rLHvk9C+A6#DG z(egriF@1J3n%iq~OOYWW%H3s^$TVgEh1RtSwTYo_eg{QCSeL)A6r$q$;7eQ+MsBdL zY&#MMJc0sodXdJ8YPCMlQ$eBl3V!sCza?7y5I6qZk!S{b=@-WJ&&7tzu8`tZrVr|-KQ^1E=e*)ay zG+KvD*dk5GBgUflb7k#M%>cb$N`67Vcgg^jRitniGp^7Kq!y zf_&7puxpr%u4=xy=28+wGFFay$$?i2=iSB)nvmE(swXzlq;>7;Qb+G8bwvs(;BIt9|1LRt+Z{5K~HmDdow&N<63yWJjr`ENUuC4~XqekNH*Zqk_(T<(@$S=3#*FN{K@0*`E| z1n5A|9Z3#Px9&2_k)1m2XJCNZ#*qWQCQxn7tEV3q*o;yG_M;Qj_ocDeYsq zQQWnz8UKiyIF2x4I5K-?rM&&DRq?9mja}J^c*L8`gMNEmeC{!Ako^@xeK4dUrpNG( z4?pW3l~uk}^Wa7YiKi|r^Do*6XMz6)3lvX(k6Ye17svO9GyyiX5?O~oKp57V{%8dt zzR)eUk5hX|N2b0Ts`Ci!8C*HfQ2XbM;oK+PJ}3$-Wgyhg35YZ)@pnpCIQ;Pq{iKkS zhVcY4c|C2AZ_1ef(o82Tm_{b3P+xuG>@TfqK`Z=gDD83bwCIA5@h)CaqIk354}H9; z(wvh^f)0ukO`kK_Y`Nc{F#V?sz#?U*sXnW*w-Ci+MRTn(W(|Z#Mc>bwX5e6djZHHr zTC#bk3<@ZSq7iEFPPM+Q{}}JCo--6Is5b3%RI)R|xpDmvV-E3+1OJAj>sWC&H>TVYMqFY`@JaU%5Inh+F za$o3th_pPyG>FPiJj!AJ-06*io6Hh53fsTCnk_dDbe5J zafy&2As@S0t-M5)pNPhd89teUeSbk-2!*BbD!A}lgt|zH*qBX1Agh^;#&>->rLF(xZ zeuan@24G7hO)P3XQRokrsLuyqtlmWjqgtw9Rfj|d3Q8yCYi3OzhF_r~sS(G z@g*g-fh!na-+zO?Cp~l8IanW)v)PQ~L8(eqI_;K92%^N@=D_q8WQCcWDl%&DviG_+ zVhw&YvPc|1?^A)-Td*WSqc}eJ0b@z{=x8ooxUxt7V7tcIp(T})ku$t)8g(QAk5C%z zqyq9Q9sc2A8K~(30fGdTs+8O>TQ452pog6 z978k@m`5*{&0uHfJa1dCw_r_BQa!pmb~GI#kx_>>l9~F1G&Q&Iyb7azQ1%JqXl%EW zUv&kgN6{Lo$b|u zQ+kmTzW<5Ef&)n%k*SpNs(R8Q99}1B_gT2{?rLt`(0&tYO6D0V7;Berf+n46QQ&I( zZXi>i2Z%UlgxPx$Y>M}(7?B-^rD%sOTB(QQskCd&HQ^T&DvYr#kl&FK#I}x3@2qxP2aP6lQH;%(`*k}I zbb0v>7vM+-R50c1<5aVYC&zB5V}&L@u_=wfo(eSV$FH< zwuy$L-1l}NKNz)Tmc8PwrnWyguaA0n^|Y22N3j2+xK%x*Is63WM8{*Lg4F8u>deQ$ zRB>Aj3h2}R^cp@!2pW6f|Cn|mAK*OZYA<0TvYYl7J=-j2f}Fq;sjE$IkF9f3_zF1n zq@}7o_uvam-gBL^_d3rD{h+>In&F74QcpskWY(a|Y5ZwdRNRa;MBo~iUU z@h~F19tDk_!9HYz6`>hLY#1ND4f<50&FC{T^>ne%jDzU^lP%y{in4>)QDajkL%&=5 zy4lhnAFea#xIR|H^mwEBT4$!PlWpZdc02!A`l+lyX9$@*<%|ivG{6hAW^41m91n6} zG~&7^Uw3HyE#7@xRFH}9a4xl_Zozns!%tkt&V}uZTeI5U>VNW>LJ@m2*m|`>9~^|j zX${;1{dn#^#^FU3DHZ1DqogH5EaE2j|~ zY>^H2kW^qh#JdrcrgBPRCCv+@JB?!QT@BR|7Pga!{MTrVH85z@wxa8HX(xbca=3hL za@s0U4S(9_&tREOLNKI+=d#la`-BO=pBODGWcT$T>TYi)&s2nBI=Le&#dFfm7lKmP zJ>JNUXK;Tkbwp&=y=8$7a+jovmjtBKyX%QKtD+NEISra|nm&mAKGh!0JJtWYPOEyyaF{_I%!|eN_FW3m(YC6!bKF}%{7dic$14@`NV>z+ z^0|}Bjo*+r!P@6jzNf!eoQto%)7^!ys`S@bDs!UO!}kSjLul~C!>6a}x$2goCtHiI z;9N*+*m3>nO$zg|f0?AHBP9|oc@IuVQZ|$m*iyU|@PG3!HOLNz^_p+3 zq68k<-8vcfKgqwy^JHk}wcQ}Za9GDcZvY}gOR|)y zF*s`mh%lKvD~eo3G#hSJAvIP8z+q~3e=>H{8Cl`ZUQ>kzf7cYiP^z=4m#^ktz*_lLVr)I(iHt`8NXG7>_pWX;uqI6}!FOBRsA4MT zN22LYhAaj>RtOp^2QiF?5!d7*cQ{Q~_)Ezm+Tjb9V!^e|l5%KNEwcBPvA z3ab&eV$Id8tvsHXwVxX=RQ!MS9j_Rk=oZmyK8b0CWHuLj*ee*~&dVD^^ z8rHZ#Z7EwK?!$B$!m`e_eCJoq;L~e@55zB4773{9_!49L-RJF99BQy)p+F|R4^Ib- zjD%L~#d6sEW}JD3n05W#b45A=9tl4;) z5waT~pFy*jPLghWy+;9M4{b}`j5~knjW^omT7kace`^2lNF<2FVYUG(@!Vh?3;!Nv zFx#!d6w%^g)vUZb)tf$=mB}s-Yl)T<6&_{yatIM*A3*O16SUel2UvZN0HtZs1|8uy@wU+holoTsPS}#stp-a|HU($`=6PfWZ27k7DI0AusrH%b=LJ91B2sS4pB=gQQ z%iWrE29(s}O}zihx{(p3+nr$ncOV#u6~;qb7WK` zZ+%ZuA}^dIhyrEE{Bo?&?7b484GA;jji|%YqL2!tgGyKNTq_h<_-g`+(O@0Ered6= zAajC}R0m?=+VuuRwMRlGnr!m#sni#AT6TMgJ==qMmNe>@NW|k`a>I6@iVQp!yB2%D z&}D=kf?-S|k08`mvBqqg7J~W0DlK?!d9`6|U@VEbV-A*Be2|ZDBMNBYN;Kl2A=88F z`B(&-B?2@AKrEr4G75S*!3?ZA4bvgGn8LDym4;2MxblPN~SD&@6`=FiT5 zDCZY(%0~ly5HbU;4?O+Q;10NoMr4IoI7Nku%0Q2~{Zn8k)QMjQVI41?D8uUmUc{h} z3c1<6g_}nyf-$Cf;F38iuk8OmDzv}%Luv$o;v9^VIpy+qcAXy}(lPMiA(YrxOe^tt z1w+`uM*Ot>@_2e=*HIBwK1@@{wV7+KW2;-hohu<+&sz9E)cp&UzYtzj47by#a=^x4 zirHOvH%!Y_CPm6vo|C|NWcNAjx)4_N+jj2iHrKe&xaX{Po2|ZmdoZJ99~eo?=&S*) zJ1-~Ip~z#c;=Z5&IZtAKU;~~;*hwqmTFMjF7uWQsxTmi=Lu`7K>iC$>bta2tRV*@& zp8RYqzVw2=oicZ9pEv@#eRnqUAc^r><#RL=kRz(JhsVc%qU2i*%EoN_8{2>U;4!7A z7gT^YT>MU{N&yzvNWrEv=B;E$mEXdBPA`}RZ3KSrs<@zhtCI1$z8HBn*} zW!09QtqE(m%7_Mf?G>ohXHL18to!2%9`;K$rTFg{X4n$ z+kn}(3vR?1?!iVk6dq1+f(>p$mcAC_0AQo3%v~$1W(A#(%>(4)jt{ZpKfxcKr zXH06c1ev}SObU)sViQQ5Df_r;HK}*$;C0h@y;QR1{_lOTsL3^2wSmU)@k!-;viYL! zlK|=dx@DTPLnH7)pEg}`S=aWgGLSus1+WAq!5skuAKwxaaL(^ly*qVE!>7hr`!t4o z$fRFnO^zvR!wp9saO9KcRQ$hA0)Dn6LA!BWob~?ji9M0~4MD?)Bu2ZiaRe+$^c$Ca zkIsbM#cDw#$@23roe2ac{GN?KZC{-wigBlf;RzFf?{e-sP!j*7SBk%2pMudmMJFmJ zC#U;JJLmP|0Q+>}o_YgQc#KG;#%3cSyU;?#L#1bSY%A;r#k@`6KY2KgIuHB|;Ma)Z z1Cyp`mDJU=DuY0+r@gl8)jMl z#IINx4kQAjY(FvO#utIu^;INP$Wm%zu`za8aIBe+yo$Jyf-u)$WH zkp@miuTj=dvcf)?t$mugg)4orGNg?kOi5}^O7KFR$9yZYG~72Tjc_FaP#JUv`abq( z(>PB=mhhTv^h4vSv}_tzW8^g=;ztIF@>De9yp;D$16=+q2Mpcb4$K-TcudcZ!tblM zt||INN3Hejd#YFamKry?S3~c{WL9Y4iy2IDA9wxcGCxEfDgw43)R)e1 z4!QweT{BRlvScVFT&%hFp1VFzQ^Smcaz@*iTtqjr=FE2Zh>ltNjpF?aofiSd3ggK8 zflSoTjkNIV)a~1R)z$ugVbp6D?#Y-(yD5MC3juYD2$^_1I8aIUZL%@_ZtsSyx$ISx zlZ`6N>nuji#f&Sz;O0^F>5|rngkcMVI8)G(J{vG-CEKda_yO5mq?P-GW`M`})nMif zX#5DRdbocXfa(8iz+Lt^)H<93x;AK~tR++W8Zu&~F3T%bCYCuChE^*(aVV=MrQb;` z?k!tYfOo)o<=+9SGg)A=iGgQ?r^^%_gFz)Y?|$p=EV&C&I;TXBpGJhdykzsBF!0dE zq+E|Ga$Q9XDa?WV_%G@g2I({c+0sr*h)|W1h>Na2@B&Be4Zo)dHv*jkGbN85^Q}IF z&9|ok3jOj3^s}fdF~5E$CxF9jbY+R%zd3#WabSf%6J!W0y^^Wsw;z(!_87QUBXs{e z7YI-nH%$qa~OE}lM7l${*6-31aWv&9Wh#5UJ^-#P%wy8m%xJ3GldFJ zYheVPwvma-P60=l_9HrYbeHJ?Zd~f?3&p*AROxt3sDMoF-4%%!>1a9AIE~}0XBO<3 zIf?We^#>{&sB})^Kpxgnd4cuHXlzhwXg|yJ_9yWk=yT5O{POq|(?=qlMLN!wsqLM^LLO zomU7A?FgvQVl6A^tDEkx4DzHFpD4=9^Q&@=m0OC8D*yGZ!RlO_%AXi1oPsFgG zwcia}&8q1R^KKbxs54>L-#+M871B1tZhX~F5wTa9;hiWWdMh(RjGQ9biM-niq(Ga= zuL+?ZCb50xFbH7MVk>CZKZg@h894xyWS{3km}fkd$|=NbkZYrVRs<|KA4AU4KXMzP zSUZHabDswDLM_T34|I1z#|2h=78R;Sos*A&nia9ZhPn=u#n2OK<=MqOws+RsSuV(C zx*a4mu0acDDNU%#F~idTK-7yP1r2lK-;Vo)&HWSs3~-d?N)4tY3gw6;U;>iU#xC|V z70yfC62PRuwUDgUnGmydT{%jAxv7l%W25*XuBxt2#v%`N^GyN)Q13OSP7MSxCbwcG zV_Tf4yuRhxk#po}>6bU-{gvPZ5bn#yS6@%fve&i9sS5r0ZE6Kp%cJXc3G|Fdr^TQ> z*JYi)eB+Gi?^=;Ff$1L4;B#n2a$hV3;L0NrP5rG0jvyAkZ}+SD2}^3HK2zzb%DL-$ zKYxjwCDkjiZCu=YR~P1y$=c)0-+NLo?*NNw1PEuf2naLU!dF0J;FtR8Na#U`V}Od+ z?W<&#_#?{QA?eC%{?Gs}X6OF~<)?~hn#p%lX5{@?nh`%KQvh57Wd24Yqys5hAQ+f4 zGIW*+CE`y7onY1&CAYlKvyfJlCtJ@x_kphNyV4hXVEb2zSUk4$l5Q7}{Jn?}Edz=| zNXzA$SyA+HunsMLkRrMnec?Pzml}mSEFYWEl2RA?l>pyr_frrQ$1vybLvz=A*dGEi>0zDj(~IA^}7JQbA%-Dsu|vBGr}^bGCz3gDds8gOeDC)R@y7 z1|;fyGwT!v1C{1r-D-p7-J1Jf2G) zfn!gfImqkLH6~#O8NAmZ?_%x*DI%kG;+VG#Rc&<>Y@b zviUFE;vTBF7dP-EbLh=iYDQ6}vc~Xc(--N~;yXiW5r?+R{1*yb=1Di~%&f&;PSv)$ zKpDP4V3gasiPw5qkI(KM3zkOMDm1<74rUgP(>}=`IvD}&&Bec^VAwIxL%Y1l9D;pr zQ@Hy0&T`tC^c@+DoG@x1g^{O0xTjhjnr)2XTNXQu6Q_7r+h7C!+^>6r34%$pL?AMN zI|0wEZ`qou>av!_aE~og@lFa1Q21XS{G!$1PK{wkzB|ZUO>jb?0pOK4eTF|Dz{s={ zh(Sm2R`?T0Nf|>9gF58oDq4?r{%I_9xmwCJ_2g-F|6z#sFUZXEY9=fvo%;eW{C)a> zi5(IK5n=hdNG7xks{9YW$^~|3+VVl<0WSz$93@FrNm$z9I%bm25%LpWx}rM}`;qr% z)#W3o$Ukofp#&CBG9S^w-)SM1D+b@fs4y3UFR&qDTItmXs9W=nuzD`Y>9R)f#$K#) zDngVbdqE!U?-I*f@RO`(+6$(+UH0oyR&dw2SPsZehROmWv%uBb>yP; zx)?nd=V9{~dfJxf2xgX}sGp$VfAdJ-}hC5lf{M;$(50fTf)?Uizj5+O0DX==-59+ak+ z^#6WxcVO9s-#zgtmf3x~00mx^>B|Cuq&}uvnOGF^h^U9E{a;aRrq&a|859AC!wGwn zR@|DtZ1YNd`mm&K-t~+czuJ>6!d?b^EeLvNHE>+qdU8wyUO=&3)vHE4k? zI>V+H>>_~S3y)4G#5Ds?Cf;@l85^B$_}_H-WsmW71Q6#d!&o(gDu}6P;2GRWBHvPc zetO;PbP>z5%fj#0ftB%Kd5ASlk-N}F3; zM+%JHnbCt)FW;hlSN)^m+wuN1#zG0JJ~cNzyGi>=yE_bK;I8H_aT1&`n$n{dJS z_g=R{rn_XnnN7lQ`kC>X(aNnHm)guxtI5V9z%!H(B)#5wdwD;$DNXe2F`57=BejEGlAv2e0;XN}F~7EZlQ3T^JtnGB4Q12YP2rLMCuZf!>``%+FQjDXh4FpvY6Tob zd0$G0ryz6St330h4WK=@Me`~$Eq4do(C&P3>;x6O%1v>)4`S~cSp^}b+JBEpdE)Z2 z{;i+LUQN{63;V`z(g^*L#3lZ!-+OJJPAxf;_$`QSPwUlWEfp#{p``_XTN3OYXV_-k zXy=8!1+VHoKLCM$fee%vc!Zdeh#F}KZvvv1;&DJfTj6mUp~jQ=-Sx+xPyAJ5&FEy< z$_+s0FBR4cKgLiJkQgvw&R$6Zk7zO+N8sRZEfvfw$P0z56u$zWb)6brZ&fS3=cxXA zJR_fklOXs^CVy{O!M}I(9Bh{Y4-$>RXdM895?vj@JIiZVA+YGji-X%i#pu#rW<>sn zpN7}CTr4WIbOymM7<6-^ys5FW)PooP`EgO9rSrY-_ZZQ7%t+Aro(xf0o9-AyH*s6W z4ySu3WLc)XMTtrs^CyTl(hn!&mF))>{W$J)lNP@3MBqe4vHhw^IhE3>501CTlO|x+ zMJ^@M<2;uPBoBxeiBu<*obTKbvf9{loM4Ws+czDl;%@fU zz>$uln4VWU_*&h@8OufBO_u*YjN<6nHx|Kb98bC8=FV4f1B~oM2m{qa2`-^EsmOt# zD}3dQ56Nvq%9Ah-_TP+%3mX@$rl61_K8^R1koP2R1qZ}RL2Dp} znh%Z94Vq~hrh8D+TiFzW3p3VD__h_jNzFNJwhJrWq4rFI31~5kPOe?4Bu;x$bRISh zs*w6oxZsS6@(`D?dL&mZ;7j;33|F*}V`J{cgd3`edTOMS+xFN7_k_1nWVH3jC807L zE;44|GVknCdqTF21zn2W04miYAvgR3luarjAMLKPy}4P zM>{=;r2uKHe8PRl(Y72noh3yX>XSM34*YGH+C>FmgQV&{OB;Wq7j%RW=_+m9$;_>l zA)5ggZ{r{}{CT0Og=heSc})t2tam{ho90^J%ItTU$^yocg#xo?wq> zuds=$4PdDf|nR`YyM?A~l9D|w#;t>8!`dU>chBo|EQB(2h zwt4?$@2fKks8b}?Jc&ugjwhP%0eaQPrZkfG_P~$0L}v@JaMF_#=7b5hij@GrM) z#B=$z6ID8X?dLgnXN4zFiIUaTZZ^gQ&E+w1> zn4{r}O!e$CSMPqx3{<_7VrlRcWT7{JbDpJ)H$_~J`y}vo+h9wq?1`gOQ~rD0oFwFP z4Qdy|pS;fR=1~RMG72;1&$q+AWq26U*v82p(x3esY4-S$Zmaf(7!9^|+p(J)1S$u> z1tpa~4ZckxsAf&g9x`u#-U9VJ4dr?bn5To`yH?szgyD#>@Vs+o@B}L`8P-rI2|yfYh=>PObQkc)0IWX8dS+ z1Vr-^Q21D&46$%=?-(8Hc_3*XhUDSCwx58{cFu6R`QbfdWY2abPc`=K(z2JA`@8~K zg-n)-T|L4KD;`++9v96Mk|>NCCfB5$hY(~g&MoCtV2co$(2e)g#!nr3j@8(Dr<6#k z42yM#J|k1zmDvO4A?z-cjhW}*y*|;08gpK&Wbb%2b1%nn-6BJS341h`m^3zSN!g%Q z*5}Y&NpWRrh8vEOOwHxIIH)DmoctI==xg_RlRK^#VtXDw$i9DFY!2}Pc%`KI(C&)! zQk*@?03*9A;?}HBnX&vV%9_8uNCATzfXUM{S;rgnmQWzj2GtNWXc*#;zfoOx27@>5I<6){EM> z?6FdsMhB^0AtY0Poe6xcMSj`DGRv4)vpuuiu;)P?Ef4a0OE0nd26}sv{4M5-ARB)) zMK!>lbz3dlT<>v+f+)>C8>Y$GX<>&7#ebuBOUxQ+s6%`ztpUB(zj#OF?G{|_15wnE z?WoW|POs$Kzn#7*8N4+d;qIDOKqP}Ya9sK=xt13RO8OI;qvkE&S}yq=E}bx`{O~b< zUaVT^DbPgbAVfr#5lt?}pl;FynaX!jon}5F>dTD}J3IZzbQ=N{iGXZMVDrPa@9pt? z_W#apv zOudYE6JQIxev1~C?f7bo2zch|wRYS+NNc~uk|dXtLdT~Uu~cpr6swLq%1f^?BB%bBT6E+cYI-%(jOWe*C{?>DZTt3v zXOk+)M|ONLfu)=qA7)o$x2Mz(dOhK7UWay@LPdn5tK^iel>=epbJPbV?eW4jAI9N}xZc@Z7V?kGQ>BlTEX z7hHU<**>_w%wZ0>1&_ z;i2X-h!>gq%0{nB-6)hPV^Z4(h8e-cKfnIf+Ma)rh@-F8pET5c zZZ$T6m#QOlZ~&`^kFwfczPy%kF-SRW+h(90`^ zkyc_JujUWOaq9VWJW z=NLkeK+dT-IM7ktq+K6~Smiz}VAcM>s$mX&_cej1q5x~Z?+#9>qiyo*~OS8AxC|p>jbu%7#B2mO&X!&JA zb;(#+2*Yg!_X0&#n9zPBK8Ac|I*XCf)}eVfpnP^(@8@9EqPl|q9e&FCF5!5Jgd4V% z9FdC2PG9Sfh68j28j&ruF{R-VSRiO;p@N2^8V0OfmiMGg%6C1>@zOdZIzY7+WOC>^ zxzEe5x|-<<9~dN@SHoY;I)clT;`aNT-O_X=Q+X($DCr*4(#sR2K@Nce%m)f>*lv*b zQgsyL4TwsJK&t-+>?e6a57cn}HQ{_EUZt+w9IEeArd9WyWRBTa5OXzn3>jE80x!06 z#))_Gsh-~kGgQwS#Ht*dJuH^y+!) zlzSuctnvo;d_@$UJE3yS9wi3K(H#dv|7QUQ;6t*{xbu-Fz;@rF6=zNnD0??(bpcs; z(v}}Z2(q;izmY!qCdEbxx`%$gAiC~yUfHTL@Zi-Ea}RqN!v6KnnD9n_q-id>wO^k! zg&y^xIjGA9`MO`JqnQURXDf&@4X~wuR?}*6Bj?>al!Z5q%T_2bEkz4Fe z`%5_J+Hkqx&{6x?rD8PLmjf9U0N;=)j3Zlro7(`}6{rZBi}mr(AMD=YjO0x|yG087 zqwqi@E{<$nJ6Mh;30PoqrfHwHmWh%X5(0IzuQZdC8WWjAXtg z1YlF;>RLzxAP(kc&^B?xLV-zOJ-(9z*RR@GX*xAVS0L$~EQ)riTrLveoj+*FcDz04 zrTg~D5NJs#)$?AUvmI&WN~#)D;hq@7vILYsXHGiR%vtIN%CIKIIsI7TrezYQYo~F+ zXtIQ6ThVMZm6Fv<(4kuqQppPEp;o`5!T0+>eN7|t74Yq`4&Nhr>3UuvlkN9 zybv;$5AL+CKf_38@R?rJ<3Jht;*yn7DXk~52y)++X*GP#5u`!wLsg)U>&~sh%jWu4 ztnu!vauzcyTxSgg>kpLeYGTQf2QNM&E4{PN^g)$lrUhNW#m?%3QE-BIzksJ{w4jva zRnng|x;6kWPM-d*C^F@~L12mTB5A~<;@K?I?>K^b2Cgh{R1EKPkk=t65Pq%tQk}m? z&!KSU+ZU*K95>3Om^Wm0sbq0@|F+EtY#pj#uzQAbOPKJCCPA8A_XN~jdGf@;(xl84 zBU2(88t(E-b7t9rb>t(0B}LFN_gIH?KEK1S;97!Q24EeRng&Zn8hkzXh4db&l z48)8bHBIq8s~QbM=o4Ez24g_O0Ee2Qylx8Ua_!AL^^^z%%KQWG7|lgAvQwy6_n(>p zZ~wE;gc2+diTYr)hi>B$!-j}fj?9|);#Am4^EIEHfYXD`T-qcR&3gZ_;Y<@fMS;W7 zZD@EJx(j%hek_E-)yk$HrbZiP@EZ}^>kW_6nr6$wnl}(CjS<$zfYT#MeIbo%8a){I zqOgA^TQXT}jZNm&{W{M?bOr}oN1kbn2KcgtfF+3h+6U_MNF?;$WmTnl#{U(5o|t+i zxHE*ODJ5CUn_!sg+qp8nAYCo>-n^Z-I6r9m2lGR~eL4-W(H(bA z2o&CS8!MB?dn@S?PB$s-ei~whKG~a}h*=sbwvU|V-eI9+9Y0;Ozk@wKL?5z-6)bHS z=l!f^Xu84L>2zD$+qCG7`QvSd$z(|EfuPUM)`X7$2RK5RiOtdqVEn-_ou<_1KKiKx z#(;`<^=GRnWHwqwHo0`oxFbM2= z?%5x{by4zRbC)kh>rCD+wLPZQ=UPc8R9#H|db?QT@N=Qs{vI3r<*GAk5@PxL{YOX^|jR5&>M^W`^OsT5OwwR)4L;+ zR%H49XFb&wo`r)~WZ{U6rZtJ>jyZd7uD75-qzA$_fK*+yUqr#|5-3>G^|0aVXx4V5 zf#x>#;iTjT%sL@eDbMLexuMXxze-;(@*rJXcSBp_(yitxy6u%r!*xcer>A7L$EbgT z9&?7Sygl3C+P@710QnODCu`tuyRbOi_Bn2vbpgX4EJUA8yo|dMEtOnXY>#@0TN*UJ z9M~?~r_9U`Mg#*2ioHG3YZp0fAgM!Lx|T>WfQ#{+PKlcQEU)ePXJ43z0SYw;q?+OR zTKP9I<=9j)zDn2i9~W@s!4^IxblEu8uAEotcLEg?9Ch1y>YBRE5F#LCD_&LI{ko~5 zL$OwnFsE+^>28h9kCZVfU&hijso2NMu|{9p3LJ8p?esDQ_0yw?WnhD*!#IK=rWZY*w;XHGqy}7t%RpB!fhA$ljG*3 zUr?4}%Rmk6^!>us09crzB*6s5^S=)SZ4cY~!#Q&rzj|@t3?9h5iC0`&{(jd+?XDRP z8#9R{(LZy~F1lW2tb^bYv%Xc2 z80hF$7uVxKD}hKyg+3ZpgkxS7?{x*Lw`T)jhi%p$?b-E0)>^KD_p0EMTIKxE|Y z~~U~s--ol3SqFN$Sig-u@l{m z&8VDu=z(R0I<7KSVz|TGSPhj%qnfFX%UFWefl|Yxx|%p3LW941P|`-7>K`J0x`d5G zjG>9F9UlUMZqmk)7F=NFu*00(=j(@xx-05|jV@=8H1XSS`r9&n3c*SYb0cZp7LJf> zTjw>(?Ew@5jdpc|P_B_mJqt@?L(`d;+8^3?t8W1ovi#Bw1gqv z{a3H|mkwtWT=}MloH!E~c~xt*hYH0J2yyQcqK98(9zTlaSwiv zATZ%aGuD|?thXfh{J}dx3g@iDn%3y?ct<$ruoZy?CEEX5ScL zmBYqe)?M}S(_#~zt^gSyV2_r~^`Zuns0u|a$#z+TJM+ju1`9J$2?0l^D04Q=fqeXg zt^kCpFKh~Z9#{dQ6px2yX*y~!d!b0sYmgdsF>sb1hDY~7@O_|ack1=Uv0C_wp(4>q ztiLk%EsHY?%(fS$5)JBBYNnks1V~fuS}gRsbaN#l`e}IUUF+GqhDcl#N#I=b!Mdhj z;Lo3f69_o1asj3Nn$wdN&zc#Rr?5iDp;^x}E@crvYTfxjciP;_aH2Utti)kE(4+*3 zqpY7WYHg!f&D^Q{0y#hoh-KjMQCtL4VJdDa^?O5)~^ruv!y+ z4gz91$N+$p3;Dw}l+xS5^qOlXL=!sWlkpV`x17n-x#db#Ih-a?Hb7v{1g9I^Wsiy^ z!{rlPDc+Jbd4ijjCb<4aNR(6ZU_KdhW77Orc|kUdHd};EVo)VQ!(@+zZq{sGRmj_Q zdy_Y#rGnh%f+0AZ6fm6PkYJ=7;Ii<2HOG(p%OTtP%%fH4UNa}j@|en$oHxW~oMXT% zSU&y?EMY}+Hv@I+GmwPoTaf7SO>|8p4R}D4@L%{TgFxI4`bn|)gHRLn{}qO5L0$F> zI|1){QPfuiMEVAB`b%7~1p#8Ks{@-#0uHA~^%EYAG@YI=pvLHGriqRf*_b;Z%SAXbV&>r zxP>zw>!PrI#3ESzC|zu;=8Y&-ivYq;y75+y|Gj!WDsv%i+X2D1CF%2m>XQ#_UQbQuCS+8Ys(5%6pC%eXqmaPX`#W}b5)R-S;xsBYYWjqD-Y7$L`Vf&A#rCa*T&fx zTl{m{{D)7~H)N}InZtHMfAh%ps~|3AS`lA<5d2OA;6w%~AqepbH!Mk-<_jj^0&*C) zBCOU&=7`7Gq=@TvX)`Mpx|bJT*<={Q2q1c18r|iJiCeorM=;WMAD*7Wk3qE<`J4dh zQFHB!Aydf$z2J?$2(F}I$Td8?780?)QYxCeAy^EdUh~niP zQ&V4?9M$dNUv)is;q!##-(L_tR%b}LKma2SbSw79DkOG8R_0bTthSx@rSbj|MHiE*zU1xKG@HC)%{pb};&Ca}5S z?icVx`wc>C{Q^K-0U^;p`+Q?Bg{sR@?90sJSd*fUv)Dso^(dIiy>kl(=S^gN6keaW z`hVV0!4fq{T)vJ*$7vOUcIByjOr*VmXW@HhN$ztL6WD4kh$<&gN`I z=!T3lo)|E3b)%MubmZ(qP$^*iyFlBuC;9J2i(r)*IJO^Z~2SCy$0fDb3 z0%C)GC~jTJXH#@@wD+yqn_m-cm%dqan%F8^l6|=xBA0#|a)^D2x%Th@QxfIHtFh%u z*im+*D=LzECUkTkg7F&&Gh_q6Z7`NX#)R7h2PAMwpGW#2nCo-;!E?z?B_Ma0FZDri z$BmIXu55@a0o||nkKX6Y7GtmA(HefssgU)e0$drQI34(S*IcK5KH-o{QAQlgDU%r_ z=NS$sitX&g6dAH0`00KI3ODK~DX!uxkTCVDTWd$ZUvBgaj; z@>SI;FjmkQ;1TA(g8dfsh<%-2rJy0C)5BA7k(b02GStX0iQ5Ae{_uxr+uKPVP6ujg zJWLBkk=p@EZCTZ2#e;K(c4^%4N$1QnG`mOx!P1j7`r8~(;{aEt9s0)a7}Mf zF6>N-}Fc8+B=;D-Hi^D3VsJczh7k`>$e6eJ7JJB#DpXl0F@KCE)FrhYlY{8NpR24)2U6gL|Ft5$ zGw%d*4}`yk%GcgrcG$(-PdeD$q(S|Ur2%7rhCh)W#K+KYFiVVSYw}+6Xc)4(ID5`R zaqoaSbh4wnXmy1b1T-dJC+hL#8eD5bQG`SCmi71ua|GZty`(u>rI0-oXOwz>KTIv~ z6i~mC1!fzf#)R8WIOZx>=urPzd0_^bop-BwwVdcsY(hlDzm!k}XTlnE;(#fmFSZCEEl><+G$ zU9}5Cy&_h;xcVkY=pEE!)bH@z>y%t(|9ZtC!=7f;0(eswCCY}O>gjLImHqSYd7w~l z*R`L7Jg$Z#!7<%ovZ>|j+Xu$apXc~ z`mbQ}hFHsw4-{wc9P$Ci0!7mJ=U2jMc?HT-#uxa;a?^4*_v#)5R%?YFDB8MHzQL{b@9irn&Ob zA>h4pchW<4iL2EgP=KE=hSJWzcQQ<~Z4hdq`ruQ807_$E6@;q{A0F|+BF97#Ig6MQ zM2oDO&iS|cp;0WW^|)aFxKz5P1HcCB9O)q9lL;EqS$qK;{(ks10kP2pHRnbt!asxJ z+GDCPofat5+!ivb3tsiH&H;{A$5Z@iPUZ?CxdpiGnv+{KE61^|BYBK2cEkL=rRuz* zfJaY6G{KUUR$dE2%V%gDH%$RXqt5_7@PjE|`%QjkCo7Zc? zaWWG;!3FMD0+Zmp-(Y)!_q?mWY;Jz|gs%7R{{ZcY&cxkdtAp)87KT^1Y^5j3t z1DLL_l*bC_R>>hhET-YrU$`p01JbD>lpsCucsT46z?ur1S7_!#uylHZ0TR_Tlzxnw zSTjV>NpwpOu;=PICX{bILOU)`FGaK$pJ)H)6^8#5bk5fQ%RF&^jpDO8%NI|A_>AG8 zy2TxB`X6KxU2=gS1x!72JNxvL#9&;NBaTp@2m;GU2NTxd8(OPE?-^}%&%5HZ(>-fl zol4~*esy!jB$So6Yq77y2nlL9IV%$`dKQ zGZ1oO)qKT25*UuhwX06Tv6u7f{K+D(DwhqLid$<5sx{3ANxjzql`HaQK=K+$_`Y9DuD25Dz-=I$j9h>o{F~#B*h{ zfKS)j)y|nLHl;6W@jpY($v#M6lvjeitR$lPa%|+dR?KCx6|!vcD!LpV_`AntwDs&} zgc2efhxl4o8wJm4@w_<9ZtvfO`E?hGEAjvj!2{C~RiLG9`d3q|vV@voxk$9uy87HN z#Y7LCsE*E?VWGO#L8`Y&CH$0DnrfbxxNf!+D(zj!V_Rd0GtR!%1X&oq&q{f;dfE0@ z#pAQ}kTP*4v*MbsL{UnP)jF=+fuo9`EZVBgpT_<36isiDY*Oz2(I-eyjV?C-)dd#o zNA?+Bp#_=PbvMlXJq@`N?uEIbhLirUz6#?6xY2;6V)V?X7?j6$zT{;i{BHo6ktMy$ z8Mi!RbA|3k@fxXpP0?8O4oZT__%Lu77m(?rmJNth91mP!w{jpN?Sne?&qo|?y#y^| zD@=*@3qg7|rn!n0mb@wYE+&HwnlZHxE*dC?_C zUoxPnqe%7cnMsjX6*6#ag1kPrVoxj<7ET_;= zH4NiFkPCZNR*Rq!3Q(_#*dj0kR!X;F^-OAnX10XX6yd>CT}=jajWIO29t_eB$FOF< zI7;5nCW;tTACn74+-A1e(TAaM6D1kL#LBd3rb1ndlxE2TkNyxEy?k^;MQ!rehNseu z<|}Ief-)8HMFwRaNb@4Ok@%J1yHWd_cqYjSn>g@DU`V0AxA_;{%-^Bg9a+y}*x&MW z;uwM)vi9tQH?VmaWj2tDr&{#E{9g4r(ZgnI$?whkL%bLF_@^yQfK36Emcff%$+CL+ zEl1R;e0TxIxYK}tdZ_^cF=L4iFpnJecP#p77)L9xeLYwQ*_>(XZj}dFOmx1?>^EAP zMZmATnI70IXcI@^D>D4mk6*hWw7l+xLOXS}BD;4?B_1gxqx7mfsw*tHqwpVi<-SAf<$JurwVk{`FPWhZCVFG02x zaQ^{GKRR|i3K8P1CuZkK?I8C{vexrdzi4B$gg;V@yWi)@j}zl=Z)b`oE%-v4cwD3>>{@|{KM{(>|%@3AE z&lg6nqwANe+IW_MiNKdk0E2lOw?`J{*DMdQN62GxVSR0n?xP1Xrg%77Naj*gBLy54 z@Nyw={{`|?0^H)~kBPcDhefanC9mdjp2G_#GN!{vGpj0~c{YkxP(y=*sqnnS|&`CxnP0EY@*3Hge6F)ch zy*`_rM!z3Hv}R<-4XeXZA^S{w8-1|(JKM(6F2@3!Gg_Is6P}SipDROf>GZE5wYguh zD*Eo)L#~zWPm!P&2ru3w*<4iXx7g5N$ZOsYCRx65BLuG1zZ4Ps`GNsD0Wv?JT)2LP z?_=avwp-1Qo{S!1yAm)M){KKt+*@*f*^F^z%g#|AddO}!MeK}wEhB6m8onK??Z_2{ zNSu|fR7-|@SI9fvB%bGO`#?|~vYf`_dxpH7&KYy$tP_{={@)Q3b{@<9Cpmjo@E`o4 zkzKUnN4Rs&;K7cj_A|LMTOP-x;Sr?XmK3X4+n`i56CWfNh|F;HmMW7q>`#dVwCvnw z70=C;kcQnsMCNA=cC*AtFPcq92d zt`*Rt^iJ3uZiOoej6qRu5a#CZC0L_Jt7_>0aDUv@c|OT;jM5;9RZ`Y;Nz>MbSp=)! zsFl|xG8DmtV3szK8LOZC27ptw5>PchOsP_3(UCYx&IT9bpw!GI)XYmt{q9YXUS1Gq zZT{2_YI>E(U_}8UJN6=kPF(Pbcczlnt6SG|N}W|yJ^@EMu^#YrOl50!7~?jwnE!qu zIeeh%jcbGtpGS3qqi-h00Wh-CYKZQM1mrih3mM+%^KHilLtGAm@nVwH3uRgZ`kc!6KZ>WLl5qmpM3OslPrjU^tm7q%NQ@H;huv8Z(=Yi?V z)UsY*J(*VIuqvMU1=82K-D$=O4`d2B!6oaL*`ta+`X~HQ(4|T5=ufp%qXcboKOTS}D zTwy%H1WKqNZvXIH>1i$ijkfN%5i@%WI>~n2yo(w@R^RWvk|5m}Vt?Z1fHd#vH@uY< zbK#Tpm$@Pi>5U=i1`h7U^lr#yN7%vA07LBm>-)tU&CF{sU$TmBrDs*b-3Vmnr~X=p zV5y$ghEd-YaSz!Wt(?0B^aCE&D`U71o$7WS!pE+BBGa=<;l1 zf3NYgHDlxZ-@D%Gkef|s?$;5QM7UP|fQu0lNJ-oE#l=skgqa8KAhR`IOAD^tNEFId z4Sl+b;gsy~BU`qwsIE0rr%&pX;Q^>@EV^OE2&s9AA?95mUXKs?FSM1gVB0DI(t%mm zCM_t+QGoO|*-k0h6}6Y97r6z|!-YkP7msUt1Q~|k%Pxbs=+7QOg%vi;wI|bdR1M}) z*Y_x_xlRD!>ybW!uBr&=$_b<3xTRArv@7I@!5;`{E|6G_^^S+T3cy@!7CkhWZoWlY z-o3}ayOmdA9{8LlG+?52^Dv?$(dWmiqhU)DYFM-fALuek?%!!IaP$Jq0IyIWB;)QH z0@v_{XH@NbWlY8bIfdj22r{pjxM2@)mgDz?=nB?dn@tuh|GA`S$-Pt)NzpT5?ASqA zGEqEKF84OMbkw7y?RGEC z71_8V5RLv&d(LJ`hgYounD4P$a#o$mC)vPnExiDNX=-NrTx)>#wMw9c>B*KwJ^h@5 zsX|tgcKXn)%`BKXT1oY7aB(H%$=8U>hn*W*Rd5FDHwTH&nl`fUV~@F2enr?ESJ3Gp zek`B~O3HOD^dMtCG4z1|B5n^5Jx&*H-AOGuKoF_fYMm?YN0V&8?J#Rhoe&~2#W{^c zAw%X5Cnm;Op&XD7q1N&S-<3p$QT&P#xDx;U~+EZiit{Dr@CRF9Zr=te? z{!CH)j{dd8{T&z6vr+tdcCVczlk_axgo@pua%9)b@#N6YK)GCedrpfZPPv}_v4&<= z@8Q6W<#6^%Dj5Zt%Zei(adH1}C3L4HrNz-N0*=Tu*g#Y5iQ-#@}Zdg?ZD)1&Yi8BNi5OxYz*IHKM65)rSi%bD{tSJYQOqh?FnTc^`4kuVRfS}Zm((=~hT) zB&Oiq)VRf|7g12p5wvTF$DEAXWnXG{UDm@F2{+%xJURt)bnj$6!0CRn`}VjLr6pR@ zqT0U5u9w`y*>EUbp+0l_WV}+>yiP#f#z1)4TAw9{iWwUa@f0II~%93;n)EEbAlP$qF-#HvEE z{Z!Q3O&7xMU$=aX`wip0bHP^u$`dMIVchobYAbP3f>;34SrA_dVn>9i%z&-_sABIG zB8br`rL!mM-wTa7`vjHp>lUNjW-ap;S8}sq*5&Swm%r@0TU8pBnIpxJ_d>PFW5_&4 zmzjh6!8(fHPIMSBQa%L?RTKY(iGC+M=aw;LxvBD4IE)FB5H z^9b$t3tGvW6i<$O2)x!FoKRj%`EsDgrJs%9VCc@YWZl|=G z#{`Oubp~}jhMMIHp)t&bGd0HbBqSl3o4@gLd;qqLGilsd8q9fn25K#FlVdUY(dxT{ zN%-8X5H(S0mE{cgmY)x~Kzzsj!}G<*SX9XNm6bz-R4Yj6ouO`v5~1XnL$rJWF?*0t zFQY+15RZ7=mX-8<)G~zy6YvPMwQuJ_A%@M9ZMrsRpWcpx96a75c!>|%fNiw{Ln)J* z3hcEO6!8mSKyG?IP;$8xJP-O_BTr5q# zG)0J<7soQ~hJl@BIwUUkfW4{sI5s;S0)Zu3frvB7ms^K=ZNV6;>(2jKH5ZbqALyQ4 zfsxw{S&1W>^OOBg+GY+w{g-E=;;|Oi>JSPJwLi=Wj@-2|X#~HH;`MhQlJ%dEALrqO zRc!XD^vae+Li`S)F6K>|JD#;u&%*7a!6oIdcaPkaH{kYR#>RxZ95@6}rBHpx4Hvmp zkgA+pciev(r4BmrsK`kS2Wxg)i9jO*KkQ-3_r^W_3JHa@$f9O)ra|s$3S7mxX>&%lR^j8Sb#|AO)$yr`RUN z<8UZAqYYa!THS*5gE`tGNf=bjKCttEH%#m8h?EJH2wc(_*XJo?plrafJo+C$)jJ52 z_{|Td=lADZ$cj&qSRgR__7sNu4CG2geoYg|l2yIT$ykRqCbUa8;vVUKqQ~x;QwL(J zphC)5dNA>|(+DN9aETGq+@xBi0V@L2t!t@JY)QicF5kOM&G5f_F<-NXF;3GY7r5`6 za-~|;q7A25CK;W+b#;N{x>_x2^zg4HyT4(={E1zvt6<$JRgB6qmC;$vUPlt|HuFAW zmQdrj?;MXTeVF|6(i$v~CBpH>&T$Rd@6J9-65G#s+pgbrJ+pz&K(9t{_u z@I6FnTHmg~#+n>EAVoSOaxd!>Cz5{sQq5t?XlLroEf^w#kQYE`OUpNlbXV2OSuK$+F*hEaCC zvP|2cH#gablSL$T^2F+63a4jCoPEY9~VN}Dqk2eJR+}k`wAUD-?|tCEmZ|_ zSisXk(qxX?;8>FL>7ebrFG^1L(H+`=0>NSaIoyG@oivehj)UxI3YR;Chn-NXT0j4r#I7MohU*b7q$gJp@yO<*g)nWY(u9(0bi-tfP1JmNuw&~IQ%tdjH{ArGm~`zRw9<$W zYVfT@4mf5^^7UQJ%t`ZrzhMt|Aq{kxrviT#m(@O0EJ*?n=FuWkNg)O?FYWWVoRB4I zd=U$hU&b0{%FL{>t;!u01X5XjyIF_V5&H_dtjRhYV)r49RYW2oPwA^I{<)c?o!L@h zcpWk@R|TMat5FlkQikYN6}XX#)3Ukc^($W^^AYxBitoko*q*&*Xhum^$%p#rcPXCP z86gR!=dE2}!l58Q^k|Od{knm}gzr{{$>SK6&-u0pWJ2-{kVoZhF_$Lnti6IrewiQ+ z;0VG;u1$unNzwd;w<%?5+g5mOsKT>P`j1n)Gr##!ag2$Imy;tSD4nY} z6?1ZTEfPFKTzLp@5JuZ(# zL{T752PJfd>D0`if#R3FyL(G?T;ROuj-5*xlK?$H!oRpu0wHz@G}*{YW7|^VC+eAG zu$$TRTwd~?lUgIyU;z|7%DIWYz~S6GZU3j4H&AKP*sOo`0z)&J>i70+i}KVYHtD8I z5ey!rt=U;rGPA>>ho$$0YpAVZ>iiUj7Qal`>6sSFADSS|bc-w)@`Z4E<=*!SrJF!#;GKJa_rpGlSObaIA;r0^y<87v$;0F~TYKZ(}qJZ^v zB*`bA>-1u+Hq6N^NY5Zh&dGe=kD_BM6>Nxw9*69D;B!(;-qyH{G#9Uz;Ms9-unO<; z-gA6BWA6=@ljchhmz{4=JQizd@2-$qmrJ7ijpL2Fj3!3oD9(}E3VboLHs_kS zPkr)c&5nwRCVaa4i)%ojdRl2efYCDNCf5iuPsq?-CA&^`+ClDtD)gViP7pfaM9l?& zVe!7VCV3tuqv`j*dbt}|I+c}^g>+}lulL(KIfZ&@=OHul!;TM8|9K`SAkq z>_9VRnf1ya#N;X)ep_-Gk6A2;58K3qG5I)veOkZz&79q#11YfC96H<@z_E8cpg;g1 z7==4Do3nf#{NLOkU$Eq%1)rRNjfDsSWVRgI^)wC|=ew%$%V`w%MeJ1)*(Bu-Rv0-4 z1WzY@rEIjYEyI4e1cMC<*W0OK+Dw=~v-gm4IGp`H?}+V_SncIMbRgv86GtDU)^yA* zj^unrqN2(kL9`$uN1Gk~rLUiM_hu8#gnS~;`xKeawLynv(Ep<;w|Vx}acEUqn84vR zx=mM0Ea_*g?@V{>8kz1vNUF#0IstT_MFgcD$T_;lUDuU|{!LQ}ybY1qd$znE|0APc zVczEa=gK+SQ`wx$9;qTUTTuk=q{SRs^fN5%6^d3I!>Ii`4t0 z2?%`ptDyEPUZ04?t+I$fDLaLPv#oqe7BBusTYV!qjeVmm{^%w@H={vA=);w3W*@*W z7=A=8SAIJ9?lz`l8m@!iY10?9Shc@y__t#ev?ze~u@S?`3As=$)}$8$k|e9Jwm?NV zY7t4kke79~snd8u>vkT2GULy_e=zeZi72LL#R8zP>EBDRw@>cXy6u7bz;&+6NJypN zGgCuL)kNf!_VW9E!f)?d6E3-h7$*A=JhEM0(p&VY^Vvu5C4P*41d!oR~^UUlKlK_c<;$^4x;a(D68H#;fFcpQyfT2-d$X~ zxYzsZ=aJ?u)js}R0VR>#5i+X2DNx~S}77 z^G}UA!Z;+{8*8M!@56>vsg#ry-&oVztKltRohRb@0EcWQqF3VnsX{Egzqzy>K_e15 zgyZ(b2@grJa{cT6R%1}ytK7%b>(_Z=P>5ArrS7fp9inG|qUS9HDcidX$X9aU1NnDf z9vg(qn(+MZWAx3wCsb}TL=N}1>lF^f7#?Ekz+kZ%`377v!p6k&{8M_MHl9B}If#=u zYMXIAgUq#4AgNb~oPiLx?vL7|kJIzfg))7o_7zh5Qr&@}AoZ6~Y~;fp`mVK7VU zzr|P@fW7XP0aktz)P-4+ z{|G1CP!>$^3Coal*W0wPT+CQxgnUJ-4D}O(N!=O#%j@m%!9VAP-}CU1lj`{EC*y>1 zDX&G;a0v#?{=HT0-Zs$1_gk)vWPM^vKHIS9fb9UWPtc|ACQQCpEj}vF_+)_seDexx z1vvd<6YeoleH7+22S%`8&gF|~UiJ+b;%XKP5R#1;m5_7X!&!3zGXpjs9?T*q;(|14 z#}rwc)*GdKMi?TZ%yQ#AaJP@3H^DZRpI*PFRgNkFVmr)^042&^xq60vnOR zF# zcMJQ4DZ-aBz26mwyGng?_b1XKjAfyYIE#F?AY3CACF*W97tzIZbUI<{#)IbD?0+Au zzP<#W8YYZP9Vfb|qsmJ?#MspM>v7%zMolUc$tlL7+n4hiw(P z%OCkFzeUDJd_S9^fC6?VUEPuEW~7U7`O7XW!+oKYy6d~%ELvdjKwHtPV{R>)qH2&s z*JE^iB;2XDBt9K+Nl_KpF(i@(cximqqJ)qhlZ@SqOH%zs2fnKwO!G?fdq_&(6o_v0 z&aPFCkn-E61xF}*0<9x+K@@xENh93^#@m#3-!L-VDpD!#se;76KqkvqV$^HV&BPT3 zwb7f(b#C8cqm2s)$Sq~OFR^m&Cl5_5CZ3SNBqY%AP`GV}aExW=v|c89a2NVPr! z1O&Ve)Hu)9qwLL&)@229b`iL|)IEkf5Bf{t=vl|T4L3`_X~jIBdb~pcXM^F-ikwwf zhD~julT7-U6c;xg?4IFq7_@!0Vb}!9IZ47X<@&CI$dt+i3yy&q&sZD_?`@W}--sXj zWN%53T`Se%VWKRrce^@YxD%F+!97MD?mR< z_H9As$UX6GBsTgR##(=?M98MOGrv=7g%A@Vnz!YLCXr$Wra4Hb2E=3{JoyBcWZ};| zo>A41YR3I0J-;Ql4BwCn@9rsz7nBK!Pk=#N6o>SVoVw+l*8ZaFV?sV;K>4jVImGuE zMHRuCs+fBeaYhx-hjyvwyLKN--T(!Jvr*zbRs5XCh zi58mOak>v`X})Wqw!ioHxuR}h5eHLBzMPl>qvpw$L%Z3$TX#gs6nVG<7j&O0Qy8&- za>KNluStZUxw93+f$zHccw&*Q#yAQz_xyZT%CFo0RZru)IU9=55dqsK+pW;RY5QE^ z4O~Xgoj@a6Whchm;T8tw5B)-+HvHw=eT%_O_yo`zMIPtJl zDn>zyc4G=VFyKG>uvp5_7crUNJ3n^iL`N%K3&^NBPK#(F*TB}DJi~>==ZR7oaI3`U z>ToOR#>OSJdsmI5D@OWpW&jag32>XD6yikW3HM}Ctv|!WUFbxg9*0T%Om5XI!#g@z zB2))1Z`_Eb69olC8<0Xhwre2>86v36esbuv5+~=Y;eECM0>eFya)W?xAW>}?KKxk- zO$EZO*V=b`5=srm;8ECtclS^cFH3U^xx;)eU=7(35)7Y(9ylAGG7DN20C z*wt>WXrEy}zj4<@hASUo%jk*Yk{6BHfF_}U$h5Du;h@kfAp!XiqGX@(&2=5dwk&6t zMMqBgd`6O}aAT)M;G(Y`Cx=!)FCfEEOc2s%Y%p#oR}cgh{+h~C$g~Tbc6BD!h*z33 z{OYDz068#asc^jJF%|iB!U%B>Se3~y{w1rAXXf;4q@)V)2?X|Y?IYO zUo@hApBL@1g}#^F41CX!P3Of@vji}6c1gtdnhL%Pn^f`qC*o5g{;IJgg?;!bT%Xc z2R$$WZ%H60_0D&_HM3NT;?UCCk@2Nu8 zGM`$r&ugAxzo)MhN+Z*e+L{oHf5;0b_^OtRy2$Bb%A^|(320%$|M>z!{-^+SRZPuu zJtnD}9o*U!Eiyq};)`Z^cOFrn5G_I@GEY$)=<2su zwx0RF9oxwMmdME2#3}Ny;oPMzcs^(*fPnj@SbJDdDq*-h!0V1ZUvGhQQ)Y638AQ<~ zPuig^^4+b2*s|}n!8npTlK(8FQ=UXGQn7!Y4rQgG&QEZ6C!0*!lc|#-vP_!zJe%z^ ztqB9I)SVOZH>w=I-h!_mdxO&!Uc^#SiDA~00{;?NY}_W1t>vbAJVZwmrf5^4hS&{v z9Ui8@VuQt!-1p#_BD6N|QyhJQ_hIs8%Qr@CoT#Gy=5&oF)e5~PqL&{U7k)srEepuS zpn;1lzd!bjebp#3Y6neG+7`a{(_=9FqV`U6NKhk=8EwQ<2VjOdMJJ?Dv@`50EHXcn z?mFnJ%m%5DA)*+*c*qM#R&Rh)d|ki7pimkvz>jZ6gW(M}TDbULNkMMshaf9J_lesQ zLJ@Zg7y*QX*MSY_#O<|z&ps1TB+#il>|`uwYhx5d7P<$ zV{eJq>?qB%I`(e)7qtqgR~q<`59Go*Y4D;B^d$72;9nTP8z4$1jj$k%FUM+Aw5I92C zB_Lz$cYRnxn4B_`ZyTVfskQnRpC5na)It?}Y_1%TlC@LsqubSX=IDqXT>prS8-%CY zN!qsv#qQu+=T;1Gb?L&>?0;ui4&RZQExr9dlW0G?_2G9>*bWW`k zv3lFJX_&=Q`>*#}-myWCL*FQefE)+Qtye0-h@!?t0y$ETSp3VJIo#WILdo0e?5$#% zz)l&BeEpe2Fjjugd+7_dG5t-OWu0^!<_1u1*0wK#eK5Co|7j#mDQK$%u@W#IehpRnRFk#9KB5C)VWA<~0IJ}HifH#Q(bNI6Cg%5%@mdllwEXiK!H-f%6~ZtAy0~-Hi-7SrDPHv*Mn~SzLyKps=3O z01ltDbZO(gh)qlte}$$Q4hJZ^ls%HzDUKVl*(C$}P>L=H&jWL?YA{s?^^%(0U9FL& z2=nE!AD%*OLf_))V`mY3T(ZUiN785L4enRbS_`E(v}swC zDW`7R=(N6V9mYsUwE5L|sGlw(H~=QB<30aYmA!>fdZ7nGgX*ZAXLeX#y})$HOT{pih|-r3A=>{zJhPC3GSok#q-JxFW&=#qEf2dVqpdy&Z-}}f z3EpgUt?RIzX6Ugh=l(+&4X@g<0dmft5qs!VN1u*%pr;i5&hx$_YRgC%9g(in!{-HF{a!E%Fu3q@hqJtR&$i# z&8Bhuw@`KAK@Z5VK&M@%4NdB`Hj-z)zd5>({1yvADUG~WuV%;0X};wZlzw(*OOGk< zI(mZ8=g7o_@A^IQhG(<~VoisND0eCTk!02*}x zib>@Uc1VMdZq$z3GoL!gDrcJ_=uqBc*e_#Q_wDu@muegf9(cIHpG7qoGfE2E0A?~x zWd)Q4^XP3}%gPn9n}5uZzSuiMMz^cY$dappXv4gYuVIh%b@A=XqeuaL$tzqQ zBUNvZLNQd@bNi|bkY#cCrQUDZ_@T(i?Gr7sy%Rj2v(f6$D6DGD9xB}&MJM#~;VSo+ z<5IsU6gUMy1w!#_>?7ZLgpg(Y_LW9|?4th3d)Q4fTP%IO|J?6mHv^j4=)ETT4r;2o zQnL4g&d%%DaHF(W9r~;7qfmzZxGLK+loU&&YBP!^A@({;kZ7(^?5~hQwT1Fj<+W%n z(ITWT!1U?%E3K!PP%0eFKnYWmCiK5G>yaCNu^KFS)(yDjDMzWF6_+UlW*=z0B;@*n zY;HZ10O-D}43@eA^Y0$sMXa^l4*0JONk33@pbR=zoGYut8`%6biGV(*ZiNHYP&$d zI~dFBr`P#2rV>A55Ecr)T!Px%pW7>uH+oaL_5xjVELW4;Ks|BHvR+=fT84n8fB6n( z?In7Rk;$Y2*X|qH3sXRYjBq61IiQE4U+ZPj=xWhOXJUO1UwY;Kw$j3jwmPAtM(I(A z0d_%%P%Sb7n@M*%GqdJ%pqm%g0nVO(C`Aq!&9G0Y~010RuLXWOZmgL)dT=t zA3*{IusNb4^?`&J8@gx{aLgQ%OHepa57#7%H5D7U`mtU=d}!Vb*!C8Md*;VL{fnOE zN%^#Us=$kDOar_^eg0x)!{5L-Ot!z3$ic z#-Cy_kGZ7&#K-6a4m%twnjg7xierBVT#aumb%QeOy=NMe2z^Z3p6;>7+*Yc@vEvW- zkT#9P|0;;28uE~)c!$(i@JV$(Ar1^(<=LqP-F4o%wZ!XsC-{p<9xD^M>VXMyzVHr8 zkKo(>&F9YolhNnTO9fBl#r>!5UNpwnQdbJ{2bcs$yEk*w0gEfh>rI)hT7eVKW35uj zoQ@PMRja0o+QTowRhbGZ-Fl+Db?%b$@Xo_4D1w>b;_kWv(?TzrDiW(>_|(PIR?^!` zB_=VXSn~?;0kQ8My@h!&zd=PN7nV4_oCoLvT4Lf-ZTOI*otS=)FI_3Nb=XC3B!ZK7 zV@pyrh^j&Oj!Yho+b0yjOyBQfJvWG{&`ku)m^8ns!+PMb89V2AqO*q)Zaf3k`jPvS z_KG6;;wepn4A3Cij6lA?TZ5i}JOopj6_>8%Wj_i3z7gbWz};YTOR`YTaVz3Y*+zpg zE(VsPq9=Khy?!9K&I{p}PYo3WlR$Fzw%3dIB_hneIzl0}k@bsr#5&**DF>f1eIq() zB*pPF7a1PUgVLYV?#*72?|d0L33IPZY;zF&GG6gJwB9D0I6NK4L|8bi2lCI(*1i+h z0BlD}@))s=`ji%Lp@DIn)v&m^TAGOSQ9}e!v(Uw%>j89t>GtnR>2s`kYNmc0uW7xj z=C)>}DCsg*MaV)Fs#-aXa8X~oj5%Jt7GMNNV&V_AZw6wIb7!G^pv7@R{acbp1KTQSm|Lvv{Q;N! za#EkFOtc=-D&p`pMl&Tlpcj8WutjYSJhVbAL#q*4>p~;VZ)%{1@ zh|eC>hVMV}rFxs)+b*Yzccx6dN*@B&v7yTf**1I7Qog?{oYRl3Q$O~kX!vEaABMpWHeMQ3f1m>Aq$#5Rwaw#R2xXIv(z z4=PszYj_YgMQ>e$oSOo#n#VYoZPz;DCnD+Z{Z<(wO;X%b0~C$p8YTeKefbZEyfMSB zTk=pGGDJ3NOUsa?oge6_X<#hrwj;uo&Z7fZ1RNFyOFb^)7Tj~FBHhRhtZtrq?=612 zWT>MD!ffoTZ&NI|DAK00Q`H?Mk?JZ73zX-0sl#fC%2x}~rzNp6l5*9m(ipnNbW$o&da)ZJ|Z3D6MI! z^gU_4dPEum%d9;=(#>-BpG|JJ&-@O+W1IlL)LOyAW}->xwIVgTErU=Z*@3v4@~1eE zpP~@NOs^-LrJQ~z;dp7HAZ5=nMXZh`48`7IByKu4n=T3-m8$fTt|dPwlgta(2kM4J zW?*j%xEbYI9UX01MRJfbe=zL^n`l7=pa``1B4aTvh*(v3&CquM5HBwqD18qWaI7%u zMDRk_tz@s-cgJ^0^6^#+fun(~dwxk+@8q9Qv@`Czw<}L<^}@lEWawrt)!#XbgMp-) zGf{FA^s9n*3;k=(dR7h~(i65E6H4ne`@)Lz@6KkAVBvpe z2!bSZzauQ(-mPX40cmRCJR>cU4jd8t=2FO|$u4u(wf0~g+ZDeQFzIBT6`GB43w9)E zYx`-k@2Joi<+^EFNEQ4&gh3I*W#vSL0&|Ei)=DIG8K2L!agX-QOUeQ?HHM=LS4jT) z@SVuf3!SD7&)vE7g48{>fnTsy=$NhOh*Y*Ivmn}cZGPL^(=mwJ0O?*QN^j6pXX&nW zg}ZDot3uxJWX~gIR>vLn2RjSoYsGUu-!B#M>D`^3Ye~^K{}K;f?7BBc#L5iZ~n&-i=cgeX$oRB-L6d{uAD-kdt&T_^A9^-oQIV zy`t6{5{rka9ptvBNOqTDAI`9Q!nQd_!Y^bfuhDd0Zf|kXwcU?t%3;>V=_EedIl4ve z89#jgb!8H+n^5CSK-#9q5lfO(Vql-1<`FMe3uShoYQBJs7%X1kLvk5t6-p)OBlvK& zPyWVcKt2A)xjnPIE{YS40i!PA)WE)BOA=7F5I2U?ZO1R^*G+t5-kD^);qvb`Ibt~fj z)d1FNG@|s68NDJdvX1yi)v+4NhF9lj5ElUct0>JTFQ;Rr>gWc5a8<}%PBlT)j}-i8 za5|g5M;zjH1b5>J^~ZT;xojelmr2KopTjLlvgq60>pq#r>zzC9qE9{*URD!!JN{$Q zl~P|E%_?-pTu}ZUMq+z-S$rb`-1%5j->sM>aUsj8a^9QZ{Q|$BTQQ~w##n+HwqeXu@ld=zS*O=!vD8zy$0kGe7eNh|($?B6j<{U| zvGx~O(ONatP%He*cOgwxRRU$8w<2)^q$i};FSt=FvL74yE^CsdvVx8D1Kc59a` zxqNum2jv{I$oL;V^1MLuJsHdEnqw=I4U8k=zMKwL?swQ=LAbxo2QejF3L^TXaG4Ne zWh8KCe$=x2(EKqv{>-j~qI2A-8K32`auUUr0mH4K8iU5|rSd5~nn`BOMb6HQ(-$G< zdqKNxqTP(yVgHm$UxdYUz)syrVKK!OhlkuBkA_Z4AW=!KPng#Z#MU(r?^Di5{Ux70 z{~pIz5^x-7$(F(+PHDBMGxd1`6Zk}A%=v$MgDjXWRJMfy0>s%h_b#~E@!XeuJDsg_ zX5)Fl%H`0YX^4bk^47)DHg-&p`|qRZQ-fpDQGMem@nPjV2||F_1%n>KD9g`{gsj(} zi}GcRjma81+~*fQh}FAH`OIhg-t=G)Hp=V=Pc9j;?4xKbgT zuK%+nv#b{v3yt<^JVMyn^5`zuOcP#3(T70l0#0i;r>xHnmB%Ia78Ca)^a;y3iDPDF zoVc6&%IR?fI+KNu$i6!RIBMebz_>ORx_c7TUIXTHnah~O%~!5(eFn{WIK6sZChC6) zdXnL3XhxG@_uyH8`Ve!e9Xn3|HgWnz&}T&OUXRZ=p|vXpWVE^`#%A?ceQ~U=RUYaj z+J5zDp(H2|!jj=1KOWl!;!AdQNSLZ1j{P4&MYV}@pIZF)=!$Y|^>+2G{|rPSk|n*m zBPV&yn$N@!@?Z9U+lBd082dWWs?MH0P7aAx=Z}p->>A7H-fo@vYdrR6d`4d{i*N#x zNB94VXR*BYhL25qg{-R88Sxysp9+Ag&k(Im*Cu;c&b2iq#s6Ml zSY)rfMvM&PVS?^F&BVkfc-K^q+&e*M2SQDdmZ9i2C`$gm-67*SP z3IF0HEBsicZP!&0@)ADO{AFW}MtMgVX~#G8XIH&@40jaYY-r1y$jTAr!|J`Ba*vL3 z1i!HtrLb@sdKadEW+}sJ>9Qp20D2F1g}Hh&$)GrNHqHF(h?oHnpe(f+O6%(Pa33Xu zGd?YqO8nl)7z@;S-j=Xp9gzKkw~bT3Xv5w*9;jGEpeC6@f!&msgL?xVSxgduG>ghr z;lJXvj?W@NhH{J=lU}JZfK&Mw+EJcdxrcEKffvY;Sqd^Djx+Xpk~ z8@Hd5$Q6_`D{IX}$&>>Yom1aF^sW@yHyeyB-ezbdh^+_WNo7bT(2e>qu!}DuvL@*{ zE@d&8b{e4SI;1V#I8-Xl2`=%ksFEaEn zZs)M}UCz^#NI8mbGqW}a32A32;D!b5s5bOWYH$3}Q&RBbB&kT7Qs)>-GZQ`8(akjC zXLiVY1K$RGtrQL!nQWA3?a`6G6_*MeBdF;-U(DVuS)OSbmggOn4E2R@E%i6xh4HowB~^`>l=pkD~XyKvjZ8el~R?Xv&?>217>ZHTF8(N{(OTqEni zr=8VOVo$zDa$jf%WlkV`l$=s~-8I*s`_yg-6pyJGXkua3+}{O85eTK5^Ng|R$4j2x zSo$2TE+iV3)+zJ==A9;^!6YOT22Wj*Km_jq8T6JPGmC=2q#8SIs0|xg*@GmRq*q=FCyIIPe0IXW(*d}g(Mf<(VVD3naLZ+d zi?~wD=5``VfiU+Ne~q7IRPxISA&VpJgV?YO1vb;Qthqu93fVze+ENXFSAvy^8Kv(( z^7>6)ua1@Xo2{d*orhs>WedPo3D3(cd1Kc=eWCJH_=}x?F-X0Vful1c0s@(Wa2JxK zt~wH?#n`?y(XQJ)G9lbS{%FitdHixQS!=CR5Ixn8M0BcKs*Oah_`(r(Gdd>cc%|vO zr0kxM5EH~NKAcntp_=9+e|;Z0a?aA=WNfU`A^27*D>~#y-l_iC{W7~vjQ)zpC6yrK-PFE%4lDx}mEe3iz{u)a zyl+QjK=!ikzY=5pnBTX|i0E-*ZI(#f6qGn%8?nQT;f%Ri?yVO|Np7KirT3DOLj0cL z`VxWEzgT5l9NA$sTsxzYF-0Az3K;zFJ7Va*K;YSCpK88#it&~TsXfPr?SqOfKC8K( z->j{EKWWc7VRZVCYOLy)uz}{w zCKd48tEyv#ALRYqO2(S2*X<&J@!9=-bo)R9 zyru8mo{gy}mT18XR%Ro>DiTNVnYiBiI7^(}x20Gjh;`aw9 z2fTo4<}He~$R0dU2Pie(l~YkEj{iR1injLZR4U!eglHIsor%BTrqLV;`{Fer#uTpB zYYwCf0Tk|^Q-V4UMdXe796iTLK?sS8&0xi`8^#s3SmovEna20@{gy6 z`i++Cm!>Ms4LP~`pWDcE!GHQ=|Ypt?obBjQM% zL(0Z1mZ+f3uEf+`V$<(~aE%f{dO_%wVZ~A$aInE1bHbfLp(X9ivQ|&@QF}bY~BYfW8pm z|DLehPYJnoMmF{z1-jD55Ufo)Ub~V+ax+c9H!%_mB5h-kk?2k{s|Co2HtnXQrxfv> zAjSwEP9~o&8Wj@{FB_K75lnr&4h3ZNlM&^M69qEF5}Tk*@Uh%f-TRWa9vAMxNEzc0 z65$XSdvnh*&}_uost{^W*96Ql#v#z7S(`>(=)KG7l;MVxe0A#Ki^+IQ#r733Q-fy=nOhIkr4}Wfv0h*PME{ytl$cdU-RIUhPxf9H?DJ9+87LV}N;eM!I_@@bomc?~ z(|6R*JR#;Rtk3qd?%k5d6gd$sBX{*%bFP7sAOcnWg%e?fae+B?52{W6?aXSbxed&@ ztmAvW=POqGEwuk52=kIzrfLt4j?xvE&2Zq4*Xmf_mlN=GoDd47dwWN*K2E{;CEsq zNO(bqB^G#-D5O6>oe6u6GS`w7lI#49mJb@E);!3YvR8NjRgryeJ)S$$5YR*gDye8E zh6}rlokjEGj9L{hoB`475YPywxRtByF*Qn&`6>8iL_QstYYc@#X!N z=tH^5Og%l2hWaFTJ@amWsWed1EEuYfIOQwh5@KNX*vu;z9fQm>L<+Bt@*KxX$f5PYraT% zpeH?#&lTJ;_ICp}b>*8Mxif(9(k)VkLmqgy}vspWIfpeT+0v;AOvXakr^KRj__hcSQCp+Ln zXjO1L+>{RBAauoZZgbyPo!q;zYaKIg*%CK_$1p1^&?K(Dg&j8E+nF=0(>B2K(6GPIF5fC);UXk z7q=LbSF2NAy(Sd6?@~RKzUvOpRk?xz*MR!I_%`KSk0ApwF=0pVR$M-;BE8kf0P2lj z658w`-#`dB(xC~AHOk~4)IT1e(dyC_i)koAA@Ab*pb|e@3O$3LF%2E;;S__-lb6q* zEex&egBpt=lCsG2zdvDNVfhq@qkhBX;mr!GT?bPqCVnLzn&yB~Fb2t6#%=hjS`c9V z1Rk%qMS5HNwOJO|CRXN++>trIo|c9g(c zWPWaVx>9b%H_^CeT!x;&+l|Wp&keV~`Xx%ZjW6pbu>g$M*-7nsuAp?{PIw8y;nk~QpleA3Wf{)EgV@ry1v~t;1XK*S&hIH~<_wK! zK`un7-8!`duE@HaE3=XkAqjZ3lcy%19qq}FQM!PN--`mO@5!e8T z{PL2h>a4=~%$&b$r(W^C8{u2JUFjOqw{gAzF0WBWs`NsX6|LRn*|!!cL-t3no1YTcQz zcKz8w{>VZdi$%+@(Oj9sG~>##J7%*2a64$zALU|>Fs!>wJ|ZtB1x%a-ZiOQLRNl)v zRl;*_J+h0sYoor+tc|$1;>xF)LfHBUD7@~k#q8Rp)LMjetg=S4U~ciJFu&wRZCF1e z0ta&@e=SU${K+6BOF_xq50pFJDu99J=WfC9dMQ$rpw@Cw-s>a8QWg&eJjQQY*n zl`OYFk0Hk*yOWUXut^DGA$qeWOal$6OA-Y)f;HIx-inZP-{_x$*`HT%syn`VZWiS>*#UPg0nQ)BL+F`o>s@*m=Srrpxs`*_fScaGM>Bz6k$UQlr;R6`L)CophjfQn8c;4?M4o|Drkt!c&kKo9M#7Xadki=i@yv<<}*f|8f>D@5jy!6#_fTJs#S26c`oBV;_%#g zakc-689NFKZlPziMxieTAL|g7bI$B1Ce$>HcM#8exfKmP9Ym7T!Xs-iB$`p;A*PmZ zg-d6sEY;?1=HZRbEGy@2n+3J|Bkb(ni*AhaVihtHYTMZlLQ975%58C?4!K;P>l^{a zXNmv29zo#L;`t>HY67aBK|6>+FkRUp@{A4~665hw#+-t8pm=4<1WLY8KSZ(HXu0&* z%}3_R0fTtB)sU)TDj43&@AGJ6uXe~fvuy+y+X4!chK1@Bn#gwV?>g(1a5 zo7E@4AVdDoqR8>;l4uoP!_2hab!_XS8cEUr)Gl=N)C(N@f<#=&0mK9#mSyqlx)1>TXU{)nl8iheq1|8ky3+f)O6;w%!pOo6k^y<>0+#>3nv%mFI$f3>+j&SyGuumBM@@8VlVm zodbEV{D!g&2;3>pH)jq#QM$L1ry6{Y?heIAkt_;&w?Z#ag~Pwd{i_?ORvXdFK(vIg zuL{F0WD9n5x+9qIevd%GGsrO6JQ*8sk}W6@pyRWN_Q6#70~Vmj?OAU(nzx_!EsK=Vzcp zMc)`Ruu%;s+uNjMEj=$`Bp%*&9mvYBV>P_tY`yd_%s?GJO>9S16sK}kw2yKVbK~N@ zMJG!6FqJ>cg?m!~vnmk7((r-D~#8 zd~MzFBW|biz0(2pKfEfz;%c6$Tst+}iLx{*Q{Hj0!sR?EVIo1r9uMeo_L>Ky9bKpRxx*7RfpR2L!>&)_2bg7|(SeDUK+eIWv51u5 zPFmw92SXTOw;#sgbvyK#$)JIT8!II{=0Aem+?z5Op@BMzX z>*RURa8D3HqCS!A>zw|*y;+*CE#Lvx9K%;mrLxkg@%8O|b&J2W?0ce?6UYt;dC1XE zsTH&rmOxSMqzM2~77F9~|9j)o&r{#h(NvBUl(EfF^>k^f_gHKu7wo(u4Pe^PAbKp) zp57@i{Vo&K-moj6izV>(9K{M5>tqKJKB<~VDnWnJ_2AY;YhU~zxA7C1jiUBZsXBqr zg|JCZkAwvN>*h5(K<|f1Ux-PAI=;|<5vVDUKguH=)IiK(A_Lu60H4W$7Zj*b(;4%e zMDtOF$ElH41q+j?*Q?wsChrAmxy@rl3g84yx>+OS#fq5=esqAX^zB0wF}z4nTz*Zz zI)#j>g3A}?)q4#P#LBKL++`cE!Q2|V0AVQsJXpz~_jal}h$Eoi$i&4(?yqb{{Ro z)AAB+s6xd-2v+WM>E?oQK(fp9MlJYt5$NEVHqf*f-Xa^p4J4pb14i75CgBnQPe8E0 z!9`~Em)Ih{sjlp;o%>r$I4`U{NyobH)t9j@2fh$4bI*sXFv%Mf@}?HH?1OWBd41Ug z=>jQ>y?&2Vlu<39Jv~GANRjP#`FxE+M~p*`PBUqeEkRsBk7M@ZyUI>!VLe6$rMyl= z@frRe4i9}M_Ov?oU$`B)N*3vpO$WXA>Kf$}9#=?_-*uEaAL%`WJi`+zX&1XPVF0t` z>XM7&@xqRx3wt=iMOT`2(W}$vLqmH-upy|>K&&6RDh-FaVQST4LTQuuR-vx-u_l*K zw*gQGfvOIMRg&eH*BMNEQ3`slJtM4I{b`KwsaJh>C4SO?GKmX9Hw#6m2H*W;()e*d zzVMk5N`s=33kCsK!@IMY;bgT{dyToI_%^B#FI-(cJ&c-}H@b(BRV4F~!zZ;P^zRV7 zbwAd8=oW_D2Kn}t)y7b=D|GLFpXd2_7YlopB}76bBmr*XR`$zzb-GD>Gev~lUB4S~ zA`m#lfK0~6G1m5Emg$;}TXo&$D>PvyHHN^D?VcijxI4r)iX(AS{WISRBX zvUE3O^Cxs7ZeXF&^3f4LWrig@hoj*4_+cs7`<^z#rnKS!r-~*DauV9gG1&Sw*< zD%|}imwi6I_51)1I+17LAHxZ0Xb!D=f{R)A^vZ4CvjL}1527;307~<;lvn>q#A$^b=ljswO>CVb zJ(zsK{fX-pz7$Vd+>vBo?B0)*t;=e54Sj%G8qQkZ50_{H)njZyauA*a;l zm06gUye+ps6y3YQe#ci|>@xrnE{WR;GI$WSj2ivE&#-SDi>beZw8GwGdOS3lEa*Zfpl{6HEyE?EYQ?i)+}1# zr$~$9UA{vDc;6`~Xg8yctb|d0Rf4}5;acPTok$y3?7@ZsYvFiGn}s$le<@Ifok!M% zqVsgAmN(Y@Ss%FNfB3)Srog00?J|pLImpiq=kZ8|Da&DcEIak8AQLG!Ebzx{Uzpcrq)mS3n|4`eu z1`&Rzzaa9i?5`(e6;rX}T8u!c`7JM+e{2W=#CrD&kTu4^DC4E4xb_u(2I+Pq6&j>mHYMlV+6qS>% z@`P_HJi~a_L`XHv)D7S~t6Ne|0CyzZgBvTRy~aL8N1v5`GcxWx5cH%Eb)4bEPa?dK zOoPC4hr&`-?N2SwZO3stY2LF7V0|d6V9e?(sz=J+AbH*Gx1N8ohM>@2&NI0zlh&nj zhwo>|p1l0UQ!;^djw?DyPwV+!ajXMQ^*dDczZDDg-De?ijvc6!_l~5$(i*u(NLT#e z0a+&yzZoWPho0;!v@slG_IEuR)sJ%U00A{6>WDE>f&;#4Bh%UQ5ryq}^&GbyNa364 zzA#RoTG80tt_)}JWo2d<1@;s3;SaAZ0#d=F0bc6c&)nM?PF0F;n*d9@FgA8qL=+km(v(H~Bzgi*<>Zw=yjcs2tv@0=w)4kFMLQUYYj@UZKP zg_PeO=abSkT%1NA^;b}-U{xSjXm6Q`A6&i-LP6*#R8{2|5Z+871+Sl0NuF=-6>oPx z?25E5Y%Ak}%$Xs~G-uL{AF3*jVs?SEsNgI|{v9?>N!bT2ai8j`zR|0uuqj3@IiO;F&Z%tuvbsPYgI zjF3R@X1RU#2fHT+&E}z4{*RBO1>-?XBg%k^ z{V+uAD9KScvo>%o?Ng4CQBpjkN8-s6>YO8$d&z_TaWuKgY?7>+df_MH7xj=yT@gO% zOgRX`|9)fLhXH&j)uej1*U~@7$WJq{pjqqiP5_8Tr5Vnm{3%!-r5{|uqVxi-=epwX zJ-pdA3m1BjpZp@f-TF_-1%_dDy-pMk~-wW~tx=mTVK-{#Q{`u1j+PMV~JNu~3R_pv)6CzZ8TnX|2nnAJ3rhm+bxoj3c;Q*X z28!CS*i1`s*)}yR(D6QS@6r-a`!C-8FheT;AeRUruwpHT6g8mW*g7n}VGu5-41q{Y zkm+O+7O?-pm~yYwE9^>ctq2o5XNDo5nXgU|NQdH6&}WR3^0yv92c>m`%lrWqkz`gm z7F+SI{3{j`iS8P63ZO#D#j`s?Cjw+NdqRg|?Zml3zGT&hu2d@mXfG`8N1lnht2tfv zNudKqB+>PRi@{3hj2O(;gQLc)dD^`}C3bKB4SkKdXd8du1w7hmdsO@$O{yHjNurwm z_*;6IGM{8pVXlT1SHU(k`Kpx@6#_yKjL!c-d{|1n1z@~35Z5~&fzBi%8!q*cnPfVE zQ%s=Hg9a2#7-mhlNsB>V5>-0aeDqa)&tRN1cZeyxsrOzqV0ENxKwPgRv)r%D%qz)( zOqPZLT0eKJ*C)Q0E#me%&!9&66Z@^+=SN6%V7I2)d*?{v8bAv5!A$F*(Pnq^oCGr0ba~jf_K-ICD6F&V0Oe|;pG)+7Ao?XfbU|dK_!^y} z)9^G4syys`brt@jlM>Vj1W@l!o9>nl7*UyP(CgWGesn5%LS+yVF5V}%Kyjc7-QOdJ zGoz0OSJw_8_}NE-F!HFNk+@%Bfv^aww%#k@CGuNaP0WWV?#2UZ@d$r3znvlG&@w%i z99Vj<5yjvf`0BEr@fGVVlD^@v1>wO4LkNo^%A@ir9X|3Ku_dl4UC!`Sb=OsO*wQ6xsQp%kA z>awHLqC#U9WB{%!YMh~!sJ}y4u*uy_-wBB%utjc&4Z+Mk2EQcZf+(kiJ)I%!+05+H zGTo^E;UU@1tuC^dn!y1BohU1R9s*2n>49T>Dg>QWfVSxLM&ySa`Ta@so`EEstHRY zEX#StFSWDP`zG;$ZZAuIUDprh`RgW@ttXvLundYS|2!Nlb}Xti2(cvgCO1PtIDG-L zDBveL6-e3eRhfdzyJzsGh0d)${^AW_rN<}#${qHDMl)ca@_HWs*d+)|$|AgoJ46tX zHZH$1hfLxB7}vXtrXaZC5~xrZ(O39CyAdxeCNwN_wgP5hhx_PwV{a^C5%?3 z&R=`!gkW4!>s&UG&ySIe;T4f0UvGht@g_7L|2fExJ8E~A0WUZps=Ym!$ooK57%_C| ze+~4eUrLJHtv^x0vn_mEk_0aK)(=&+&Fq_mZc$zF=fc>G?1)9^6qqZ4e*e*(utUT9jshMf1II zo!6obk#8gtntR9lusK#RL~urZDEMi{Q0n#eOs#2NqA(#80Svo?^>CZxYA?URX(hJs72~5Oxbs>%tI`j_dAjF72HMbLiN3d!)mk^Ha#BP>mN@$$B+5nj;Av3cHx9l7^Hr~XhwWa(qHuOFap(J^hwA6_Uh~yNQMeX|( z0MT{KItn3)fLL}WGrBxOiY=AD&kgh%(wXNS67FOw4s|I`T)M^o|1@Xd=VF+TMWnk1~y-DF~Se_H*j$aPsAEif+M>b!8lqA zw)Z!sRg+U;&+uQGUv}gftif5N*S`-B&;|e*zi`;?1{Yqr=<#jJ4pHT8^gH9&uioTf zmk&70G6u{C(<9ltjtQ7vT7umSw&aJHo7F)1n=<9 zA=J>VZQ=Aw?#YE$6xD-Rg#^ijuGL`(=YuKPX=Lw}z%529iz4Xiq~a-FFp|7^wXp@B z@FZ~gXo2Nsac)V=*C`sk6IaMDxPhr`NBLeBL(wlWgD8>6GQ`;QGszL>t@#eUcDmAZ zCB&??VDj-8`u%P2VBCYTgSN)4iBy3JFEb9wJhe|-vbNqYM26`&yxsLF@Uj7N8Hi3^ zg_3%B91hif_YWfe@9t^^n_7*b(NTfO-m3;9O*C1|aiYES+M%IPrSJ>P75*apzioz@ zV4ywci$iZk)5yBB-GGX4D@ygc8T_oe^Tjv@WDB{Eqnhz%Jj=UW)XsY5M(jJ3YH0xx zuA-kh(MJ9v{azMf)&m{fIXtfM;Y?mWqhD7&S9|!-(v&NYF@OP5}Dg#^59*uwKXFuU! zpnal|b&t^1|4D@)S$%-JlA!dLI$xb$^xH852L2zvJrt;UGU)8oi!XOJ)4FV8Q*^g~ zRaTC!q!Ekj)_t)Qb2D@_d$Lidwt}EIa9UHv2f0M~D!;DkB$^!VSPaD9ipz*q5YW96 z8&L3S->iscb;%I|Np@56isSh7q9t09mG=9Tsv9O_4Giv66~zl|R4qR2lTcnC1~g9h zse69A0Dlw|cS*EFVr`Qn0iLNhcktozf}<<4T|dFmx;THEp&Ri)$Wqr0Q0E}^a?m`T zTHpCM%=ZkbUZjSW`9ulYWTAkMnSmsk_A1s&JWxWyWfSF#NB#k-Tk@;LiHVz*$7Xlk zz5KdSo*lFm~#waR?|JArFna0mM?$?zN>UtWT^rKZ;T z#;UoCW>ekSz)mMm-^l4et+KsAUvfvi0{ItFLLGlX&>&rSp)#trkqWF47mKOrFPRct zQaaW;fFt0uPsJJ#zE;-Se2d~hYqo}(rdbQDE^?n=$5Jc~b=MIoVJ+P7qIdSiv}~~W zWJrjRTdvHu?C9o1oV|kU0Z^}8IF+kRu5&qGGQVgEMNjy>=yYR7KHj!Ii(z87sLpfz z1^tm>HYNDtK6@rW(7d&AtVKrhXm$+@U3V)$#><-@ zm9a{l;c}&ycS}4w5CAFxz%>hsf)Qu^J(kT`G;2ctooJ1SnVOu7`dke?T4P;g>b4J| zC#?;d2e4xYTV^N^_I9h_(h-gzl!uA>t#$93Wf;IdpUis*Y5YbmJBl&Ew)O$D z|Jl-Na_h^2?7GY5y{*R)2-4xS{f*?zkD@o>*@SP4hWD3k_<3||A+kwNz`h|OFJsNS zrJI1C`~0(kRe%UhBq!bGC^j@mFeuGT@Y0? zMjIwPQ+8nSpb>HI!rP7XtNSp42Xu9ZJo{uS-eKD0a!;G#snwFrw6XegJUg{0ojG3@ zE?tgR4y1frUnpyS*r4XG_P&EFLCip{xwiCDqnpvO`BdLgEz5Ttv(P36iV*n=@XZ6k ze5#q8Hp8F(@yHC#+M=+gU&M$q7rO?Q@t&-(b%dOUSo_oZ^qBInb#o{eYqU3zV@%rw zl>fGU+^pC{T2OfH6t0n8Pti*lG)1qP=hP13DY52uci+maUP3$G^PaR%XOm(%Dxvt9J6NgWAD6M zqrCrM5Q=Yd6nT&pr9U4B`mbZ6wqt?H*`Bnqrzx1luREFk=_Bef{AYc~hQoIiKM?WK z1+FrcdRE%412kA54iE@;w?-)Cbs$PtP#O=7q6;~eq?#zf@(-vgG84p)`t$KEq;jJ}GSsR|O2PW^m*3wC0m}4n2$9bZVGSuPMuniN9S!Qa9V{)1S4D%VRe|-jh-DRWhHWp}x6}^#2f~ZIu4}5b1ycA+Z%%2r zsN&?aMC8*62&0|AY}LHTvSzZ`Of$Y&aX6@e&b{W&G%dI&@I!@}u}S+#cvMT-PtxD- zG-RNF&mImY#}t;O?)0aTUY%CnZxO^W$vOLm$FrrdQpq}l-&T&4K9X39J2>Pc10U)5A)a5 zz5qk)wpgrHJjU`=C=nK^eCVQ;@C0hdOScUhxAZ}}zS$ZxIA|?>;;vl=a0MxRiO*#E zNrqTp5%A}e$CItLVyDs7FDG_^v6P!ER~|NXAgy%wQ4@0Z0+uj~h-mjR>&B1DdQw2M zd%;f&%3Uk(h=z#z*oYTAr>Xt6uOGZ=jk)ZHW5 zOJzSd-@3#e6S!5-70>+Uo8!^KJ>pv8#YocVu_qR0=X+p8>2R-SU!9`Hc zN2PT-THEk7g;#%nihSSU?UW!Bny||Z=BEJl=c9%*>jRNeU=)Fg)$li-;vlu>qN;}X zBCUr+H@GGXbK<$ss30w4QmqXW~zw0=H-!-bi#LaHLPKL<0x`#fQ%o9~z& zJW0N8F~xrCvX*kDkY)$A|TbsVtNI3Xq0LF9Jjf4m$PZLF0=FPBm?Xo z&oVn04Z3k6zXq|^8bj6qr57jmNIw=B#HvCB7sr%11$SC0L>G}UOQVJ@QH1*kSypx~i|>1F8zw8M8aJ_nz$3I{8JJD- z^+r;bd)?#9o`}AMHq?5#G}hqGTN?2tmGW6of>c${JM6k56gZufANhWtW7^Ck!!vaPAsPdU^Z}3ZH7&*T{|cZ<#;tr%<7~j zs7vQk)TFwZAgTFhXnPsmFq6svlk*TO&fR|@0MuayWO#Cm4cTIxKEyg$V<>3jIrp;R zAT<}$Q3r`Qf^|43`IQ=$Gx%s>_;_v3y0qE;3PsxIFOg;WSV2D2MmqC8rx;HZo$Oeo z{twKuJjIM|O**npn(HP~(EJo*3XzF0VS(;Z-=`80*xdEcfC{zTj)QuhuokHgOj8jx zw<&mkKyZwJTTYa8SN8GuflqRG9}3$U+gZu$gis)Q%cWct<}>{$xR<{*J$hu)VylBy z1(|6Vjk9@zjMmV7B;k<(iCcXD_h_G|b~Q%>SiryKyFQWGz4Ofl;-M#+R8c&OHjk7o zW{rKM$R|0;TQle+?V^rFxdT_I8lef=p0Jk}S9~D{c*z5~bihOjZmqPbeTg<^?JA?8 zf2f$z&?ZLo6*S9^7xM=xdTvHKnYx?_Y{6^W#&VgJ@mdO>UKr5-;ULcX_fYi}mj+2C zxyeh?{1LLHjy!@@XsBV(mPdIfnY_M1rc|ayyxZTVa{V>@5}&|n)QgMf{rb1Bx@rL} zdH6rmmdMb|Ui3OZAKa$g5eTl<%%!021jCZTOT@T?^7_j(E=R55C*u(v!w&GbMWEVe zXQIpVud5D|btJ|fP;y$(oKPAgaF{(~3ps0wRuB4WaKyiKJKtxcmzuAQq9uxI3xvp6 za#JDmPpe8^Ki5Tk@H&E$I0m=6R+QHTE7#3bJkXN5fb&tWic7FbvKwZztY)a8!9Qn& zpF)*3bkSxHn8u}Fwh_5$vkXNw%WKL~l>c0NNeb*&Ohsmp&X#AbxyG!xIdTk|nZydK z-Lj2Be!ULew!g1~iLH^HR+JSkcAVm6oMsPkxc#}Juu@x%FR{R<-z}>Fkax9;E#Y)= zrqD}((`YO(pfJ_oWa*INL+n z=m@V)wq3gKXw)@QClpJN1?PgG%fi$@ z`~FQlDo^J@XG|}NXp<2B+&O6ky9o_oXDrZOn!$)UB2qHu%@4y88s>51IPXfu{?DXw zkB=KcAkIJkx4=ZP!PTuwY2_b@kczC7?!}{>sfza!8>M*iBvR(>Ppj1f>)C}fWYiIW zV>#7IAqTYcrEze0+2}3Rin*ojQpnO_HxRLmR6VBYfnpVloA>QC$C#_CA~V4-!+$AD zIY}MU57+~-1K-rg@?8T!|G6Q0yr-m`_Lq{BIfkfQ(DUDu$s#_j;eVAbyxiS+{t^LQVQ}cstkzQAm6oJq$qB%c`_+tTl3+aWk2Uy~bk}ii zE$(z7grN$?1zks5oIC?5>b~CZ7iTiN1 z`sq87 zRAB3LVEz72c!Zylwuz~VL6xajNwM(eEgntQGB9TPY3g$1EZH?1s{e)z z>?9%dq8s81aW+3QhXcpui+t2NUS{D^(I2XSjT)4u!;;HJx69M+;tUc-B?^p@0tNt& z9XdDo_WLs=J3I_qaL!}P?}Tc7qIefAz>Pq^kZgAX6p@b%P*B=j^DaS~koZCVfw&QphNX3}6AkID^^y_sK^3 z=9JD7(CNiWlnvx0%L}KRk)SSY=~x*9{qep{0;_6k&tJ6Nj^_c9Twf+@jZ5=gQ=sdq^-icw} zhNXXODu_(8M_6??xbfj6M*#1tS3%;Sxl**n>)2z|`l+L=kkH!jTT4trbXTIFuT+Us zBn@Zu(wm_pLa^+irCNZT6BONF!g?hMjpr#1yg`x>X+p_>3By2L5)KDZ<&TLWks?VT z_Q5~=1dFyFy}|pFqB~fMU%hjyg-(`Xb1pGEhBv~e%xz!)Vj-bMzAn zQyuzix+&k(Eue)KWtb)J)}%`EdZq|6(957Ep~d+gFxz zZ?G|OE=^d3dzrqH2)RH)Q7JoMOflcW*{{Cs(%Q4}foP=yoDKWs4D!rjV4{?5$yCXE z{Zehqw8_iWy}=6+k$GG_W9mHz`7yX4J{RB+2?`VhV)~ir3O|Jlqm*usSt=TdTfub> zcT1bqmx5*xVuVPa_tDkY&!P1!?M&lgJpIHWAdYnfhY=}ElMOFX2hqPHt!+#Q$v7b^ z-+87%Gay2=}~l{yC?0{ z<*Ih6G@dmx?J8019zt|yII>-MEFm=7=!We{Uz>1WKX_-pkfE_YgOepw8R$=;FtL8* zpa%CT96QLmKwyurH6_^<8EsjdxNOx4I?}asOoB4>kAo~FV{mO|POkh9Y>6q0h3hCV zRH;3o)u77_aY*pL|81ip%29G=J&5)DeRe}#8&l`V4MmsIRdcnd|2H(hg9&@xCd7|{ z9BhqA834HH7cof0PUP)F)Lw1}g@M*Rz-mgpNrdzLkg$q12rS)<12Sbm*<>vFm}Xv2 z1Md^3JzPmMBZcNRE~)jB7wz2lAN1V4sAB4A&KU|gxJKn4@K=M$i$cUW5KgC5g7NQC z`16bwh2PIKHV?C(EMc4p>{=wLPUUzUN1K;~v-a41QsgCfv|J^X?hF0nSujwIA)!f7 z@y2DFcGh-j1g9wgWnuT-gCk&yCEPr+jDcdE;SR8(6K5t9Pkj_-3S^sBBiL!tq>MWB zG{H`f3lFFKe>}4nSZ6_TpNtHbWR#lR$_#W#zl~=}RPT7$(|Dan&@;t^u%6+24y}2t z-;dQ|qDj~>TR~CevOM?!wO>Qr8rd09;FB4=X352AT{8 z{rXHW$3yhi2dbHd0V--F~a3{X85b08do(1S}K+Kf7 zg9Gl;5bGovd)OQ1jGZyRmt5~wU;C+jI|`Siy2;n&e%EtCiKWwYVKgvWW9U zZ%ptq+BY;Cfj#IZU${T!rt5fH1lu+9&z%MxyaYVn2~*UQ8G%KWp036IZz`DF^FT&V zjtOZ`a<6Ky-AUW^J8NweP5B0mDJNzRnMi1bgY>fv2cj23$K7~`u~pomc3+lf1efn{ zp(}zLK$iHPh=>$wdGe>Olo=7OAn=8|aYn5H$T>DJlSbK_u)fVGZm;QCwt)AjjChmw~r( z${E<-anW=kIy<)0PWYbH{Z5|2Q>L`u=Q*EDuE(~7JRByGnft6LlTk+3;Mv4R+2_Wm&so?@l!2X%E}-9RAj<@Qm{dMrtPIXT zZZr8;15sX5bgVfuJe zgeXYUGRl$F&Ir8W`XyoP$t#?d{_ycDTOZSGQ@vbYEM_|`WU!4v|%en(zb>Q7_>@rSS`>F7h3yX ze2b$PTtMj|IW- zzNr7a?tkYWt0?dZ_g+tM2aaiS+taVnlMpvXPu?Bb=i{xY7TJBFf+DKUY*SjgsFeo? z27(~^`!$*sWJ+X_gJJBr%&ijkcp(iH*^zDb&@;}Rjp~Zd z)3^@7sKK}5cEhmf;Hr~4pvo@6^8*u6{<)FV0}=qD@QlC*Ga$gkzS#R~f>Lm&BHwKG zZk5greNgNtOgsDs0ZrFufJq@%)vz5DO}i&xZ5h?0_KR2JnG?sXl+3uFNNWnAoGS1l zNb7E)Fa|0ZWaT-+*llA9HNsroMv7e^_Z3kPGv-@_g_Rf?K*z>m^$&T& zc;5X>NWRuAU@5|v2z7*95&T6L{!IWn5wNR3AplpoRLoB3|9m^6sVB&sm6;g$^a$-a zl1*)1Q34n%%r#jeo8Qkb<>9f807?P_<;c1lIMcl@gTA_$GSpfv=Ja_m@$@ps%~KlR zuK;}Df}g>t;lN+~6fd&`mwb*9>N5rYq$uqNJ9eGDlgR)#E_E{|UT9!vv>1{++*s~9 zW9hNEH#ss+DRV_jw|%3;DkEXs~X4doM}FiLZT)OQ9+NA-8S5+gDM($4X17Kx%i zLjVd}%|0GGOpIqF{r?#SV-rY)-94#JQB`S7$Ev`-R-y>9y(IJoDT719{!m>UqEVhy zrq+0?*B`g-ziF^@@wgn@-4B%J*N7r!fhLBpx8}2x3V049E~>#F+gVEE~-ee8TsR28v3uMTm`Hp_#kTIn(1VA{oVt2DKWT zzI^o*5mfjF`3{1Gq&LHPkV>L0DTd7*!E_MkO(8(?Mf37etRX+gl=&y@3m}^HLn4V4 za}rI7DM3!)`du_~2r+Uv&&;WyU+eMad!N7QcnmmwtkKUm)DHPZDb<^kSyJ~Q5EM&d z+a5W(3-jjFl$4&(L6kcYBJbtc3Y`Z6e()zC7eeay$q>Gsp~)J<8A4KP>QDpn9==$u z@ntBUD^7C^Y02Dg0ajd!&MDAhN*>!=spkYqxS0Pwn^+vV^AYxpmsYD>50}hbPJN_4 zSfoqPUNX!|HLEnn_lLy$9-VVzhPcm?X=VW-^OyB70L;7y$2sK;et;i(37N1X$e}LX zlfEBjg2c8SV$`Ln8GbitLb)DHs-9k$@qT#U;HS4Ys8(e;mm~}+{PHTBU5V+QlH2$T z+>09?FN*@}Mmnz%I-i$DGDRwjhazP^WKl8CEI(dFVsZwIxTIAsj~!d(J-<6=WqyY; zL_$j*QnmHGPLSmY2%&WfjigC74}@DBHn_L&&1hAM_JaA)Oh>m23|C-=%%mj7E}^r> zR)-EL6J(HhJ;ufSVhUtuFOApsjwVaq*sB`#BUz2*M`hu+*Ks(s*mUXDKZ1y3Yandp z$xWLJ-2h9esxljDn#2NprQG73Gf8a>huikHO%TaWLAHoIX5^}sU0WphdX6ZfVLADf zi8#+Wm|h>RlSTyUksruaFGiXCC#|3z;N=^`QZH(hbgRm}4Pm;X5JY+7u5x8f=-ic- zhQ%W#L}1}fK5(YSv{)cc#p79tWN#q`uTtQ#Upyn1)UKHi@IBx7E5-*RKi-jRaA#P{Qiz2$x_cFbQH*cr|xGw)QO`5tdw0>xFs z{Qz@FlDAr^spS*Ref_SoOAVGTzg<7dby`TIWT}WlYX{9HI#%ngf+(713qYUE1AV;I z`>ay!cpbLHlsGO|xN(Lemn5V=^<;3&Ug3O33mL{(+wWGbsZH|WK#U0-ti{KTB(iCg z_}2h|fneGWe}RdKAZ*LuKEmRn|8oj^L->NThnP60wSd%9bMys??%Mji3GbLz6T(u$ zr@1zEgo~W!TeqmmEXfxJs4^=0m<$O?&vi5L4=Jpl?*C?8ggI^cbp8l4O3)Zjxc&NY zV)nS_rTQqR)D+j!!+tn&d1gu2$^t?mXX!W@Sn0mbk{L7##t!LRrajO>ZqQ4?i;jDLmeVvPM>hrX!zZ+x~XJ02%1yi71Q~T z7|?Nbzl7_uiE=r}jDW(~xfi%}h85K{t45_K6K>IXH5V_d42j7a3y(h*knN%l*v(a& zsK_>&bRa*pxvi_z*?w%oH2SRtsQaJ)u#ktWc#jsO+QhUYacT(C*L{@hRmpASW7oc^ zJ%SSD->jll&U33t-W2$5Np4P+h_#B7no2-kKnMQzQ13ixEvwFz-N28w1gv&z*fJGE zF+Bvv7IeM5b_K#b{ddAYLj8)_+M-#yG^r+IT4o?>9PX}T1ALM_AK08fOxyjo%}a-0 zc&}L#k?lsCf4ry$l9{P5li({s8%-}TA`a|Aki%FG{D^P+pIIGaf zO~A{aKZ8^;xEyVjnnfY@_sAAzKVIT<6YDHrXU(ZGgtrF{tXdF-keQbSKLHEzxwh(G@`TVe!~@*L!yz}Om{qM0vfP7k4SEz!#LKUXKGPY0_Jd`~3gh?5=Cb+8Xh zxHlqJy=C|=QHnZ8s4OMEGR?kkBpzgZ=Jk0XQ)~h{{`GDWFsQGYK(FObavH*^AKL|P z>LXFlPDg_EVNUgRKMbX;-_kgultW6;iuEY6R}60+8HZ>noymocP* z{<#!hGI8iwuyPLL);ZXUP!3aA1Jz`Rk`dI`Nb+8GOq@_Qjrzio^grW*ib&w1Q(K|g z56#i8N(#k%NTjIX@-InleaC+@kXKc`zK^M1=z(APOkR5_8)GGSzkTNcZ9Nm^o&;5Gx-r%;kF;ZLVRYJfbOBB>7z%vr#i zOUH>nS)~YRt;qv4D7ro&OhQ1^IOZeW@93%=?_;$Q>yC{Jld2_naM#^VPjc(c4-Ui2 znztje<_yiHA1^!1&*~F+%yc zoIW>2!TEe=q;Ayd02TAm0BrkC(Q~hm-=H#3o6a|gJQ75EvcLUnI*vGEd^M=a;2E$y zkKl~OzU_X9yo@o!@0ApW#UnRWfta#hh6Lb^#!xmHufcNjQ!QqMd&1^nR7v}q0P=Tk zI#08cpRPDE=rwUb7De0XGD@hg8tBg;=HC%Pqx(DJUz=JfpweooFk-FtmoMA|W6Ee* zN?rGUf9_b=>1fl`5bs;6|E%|eutFU9?S`aD>Edr|7~{UuUS;Pf6l&VGcv}};!(|w3 zlD5wwvk{X|2v1T4Fcpiz{4=9(VZH|8K@Z35F9u|8B(~-cd4BNLZt_q|t=dwy=Y^T) zTeV-qezdzRs*I%E_VT?Dv_Zx}U8Z%wOx@;B@b@z43$}h#Y&BpFEA^NV;@E&2{*tN+ zipLtD#u{!ireu3t&W2~}c^g*(U8)on82pMqTK|W20h{5gQ1X&iQtBVKCEqK$eF=zq zj8xKBNZ>njkUXUhkHYmJWT+10E+*XTf-Yh8B|MP38ANaFWSkX3>TK|bTjHgDQD1~AIIL4hk zQl4<2S(=6P>ad=DIFF9z^X3y`#tv9n=KEv8K)}P{kZ?j8IgXrSsB~o!?jXZ3It*=H z_dA+*jDH)h`Y#QF@{*Dcd*7dOfW!#q+BmZRIkK1SJGxi8!I3Ps4m@0)0|Y`?9(#fj zOYGP1%sVfTylxFj!(Liqx(AH$2?*7-E3i>TRfli0RsJpwfX`1af8*MCV zDI+o0ULU1ohNQYd(kJah?;j}I_3oARu7*<5JfAu(Fr_~Clp@cGXbCO{U*t z(ujaSed-pIZXY@IwID!{x&BDlXkvw-litw=uXYyWr=Zm6xR7>; zT`|%9wp(FDW2dx?)t2A1%OOb9d>Kuuq*T#q=ADKC;p%#&_~Z)BaxfMkj|Y@&1(WA? z%YZCH+B*ZmY8VTLt@)>#JMiK3qwY@w<=5o2nmViEG?v1SHj*iT&^ zn_#W#SGA1}l_co^tPNBL)JI_FtNdCC^qm8-B8E*DYutS=KK2pNwRk@-rIT{l!Fq^T zz9)ifI3@i0cBOZi4y%gn+rm*ySE%;(5RweTVEs`}Q1XcyU6exi0Q~1CXz#nUWsM?h z5aOS_j%l`PCiXQ>q?2+-|K||1F?l{G@V$D|TcSCQRp>#-)bP%~=Vs*XhuN) zjvCc3Cvu%c*PlbxG*5IWIQUt1Os}<+53pwqIB@joUhzkil?5L>^&3Wny5q)qNz*}b6=Z?~(hmVfO z2Fehoz$SJ;4K*QqGTb=>;77r;oVo^Lve9X*U`Q?C^kk)pBjDxmv2wOxR1q(Vxh3}Z zCf;3FvZPnpht{YPPaoX91f6i+h^AUIM2_XXY1Ev~hC~GBqY#%juYFkte&LhxnI-fY zU?^%z1xGS@CVl8Hq!4PJudD|G?=y9>$?vrBv_c6=a&O#=qnRnd5bZM?f9%=f(3f|* zuE+;8(pBhK)L7`C?lG8Q_wtSu5uPC+fH)NR%FSYgX{ynASiE$EKPCW(acNMaNsd@kZb)1JML@d0uXNl^NVw@WWD)#y^VSFQ zWw{wYW4!!ELmdZuY`Bj<88UpBQt&OA*y`9GYSs3=Uj>y67^Yd8ypyuQ&@@CwAQu$@ z`2zAVV7A@y)iYWjeTm#fn*a-_{bDGP+X+)cd{l*}G&98Dm$tgYcvyw~yY0pOg^Y70 zn1kZQOP_mv7?Im8ccZ3baZQm31ysGv5IZE;u+XEPerpC@3N?NCM-jy5RmGR(K>B7~ z`1uzE?R*r!1N`7#0XUSrLC#xElk*3#1p@2%yt6uKKABat(a;Q>9;D0{>3teG-&#ln z53Dk|k?x`*kT9I!k0-KF5%&jd^AqP7lQpy?;pPimoJCwLc2IXat*aV9&sbDA)|sR| zooq;5+t&gh{Qie0#k2G(cW}XsNDJa*x9ZP_`Svkm?$U$4(^3&14b$H7w%1D?@~}9n z?)DDUQ9lY$>PqCuG@7|?LG!U6JzGv6sekb+MXz07VyGxElwXah_9cUgxJ$)$OSk!i zEp{%3k9L|$<>72pOH-))?%{N}%dEV3`Cz?$C?!g?k*y-A5any_kCSn}K}Z#v?{EN{ zH%Vcy*{oIJqnjN+EV53QMW-FaLLk-Ts1UV@ut$1rgjiATp86!R8luT#M^bR8)C}vv z1fD2!@J!39R?abBp0Ht2g{KA^D4}aWb+E86hFOjjS=Pf>bLT_?o5=e-L+J?CLDpQr zO3cQqtkZTW*TpP9GJ2df@sCwb6L6ZpEu2keaX_rKC7t7SH1LEhVLnf{akOlsRlsr@ zi6xrIp_j<&_iU*6VR*{(}pBcI}EYYjUJl`KVT5fMge`y$c7AeOH~;>MYwn4khH z>XOB-c{i;k=z_kzd03= z(B|ckJ3kj!??_o0;z5*-VU`@CngS*fv)p*pG`kY4=e#9Su#@PJ_*K8pKD_4c${4v+nrd$S$CGh2gS#QzUPv17>)~TBcOCP=NKg!}Lmh?RB z*41*05J0BQL9|IJ>O_g4X2?>%d5093>u5!9Z>2kpumpS+=$%DrdEOR5FNg8J_wsrY zJt7jC1RbZh_UC~_2=v|(8w%yjbAbto*%S{R%~rdCN{Z<(6y}d2VE`6G_cxq-X3o4S z#SXE}*lZ*rKUPT}9>b~WR36+2`d+C5VNIQgI)YQN+X`@3G;tV zeuW`|?_gx@Dphl32KLg6cB^~lwK+m_$4vwcz3F(-GKTA+SM%VO-Au4+Chx61A+z&6 zI%lrnJH8!5#tH^^I5R(;qj zen&KZ8_o;~4b@rkf=sBxzN#rF=H^WBTQca(XYfoawa1xj@Axv1Zc+Osb3pMVZPzXIoR$OrP&)u-qt)EhO9Z#x+bc>FBSE^^2uXI8Zi&KK81G1S-23}z6>rC$QJ&{27dX#M^8nsbEXw%=1= z7bs|BAid7=8Va@pMA~1DL6Egg8nbUHu{e{b-aR#Ey1s!R_7!>K0#H!QBGBf!Q_rdv z&Q5ZKv_RBa=+NbJ_coXYJn=&MaoP6|$XSVpBKfYXRR0C8`Kqn5!}5Y2!fnLh8mdJ$OI-yK>Ysg33&tZvMx3HImSB!bIFB^pL)dB9 zX#fq-2M;v`iuvOu^I&fx7(;<`gHPwSmB~iyKcBnCOgq$*FS=VBSk>glZ zrYn6>uzJeU9Xqi}=!!OD?tREVP5qAbY;`A|WMl7rWgxm{{gN}&u{Qw>hO(nN?#j2D zr4Ldvv1Axi5!uW1xTW(f1*T!FQ8M$1D3rv#OWjq+Z*B`%wBEhY(XaG9Kf=@01joY) zjsMG32252(#By`EzSA!8&k!+BRsu}m!c#q+@it;eS65ylabXt7d@<$_bmVeq8vt*d zavR$4FM*pz&Efm51h4&^w&F_y6*>UE+FFc6L2svSQu~MCY)2}@FDk$_x(aYj3|bSA zZ($6#dw4|jktlX_X(1@2*OCMhNkc*P)QEp{eMuYze1Bs}x}aZh3~D;G9p`UoohW=@ z;F+;2Oh6v2U_PJ4BUBo8NNHUIb`p4qu*DXjO+$X^-gKfIV^m6Pxg&kavhE18`Air3 zOOeA`IVekqrn+s+H%EA056mJliwyIg&Bo$an==d)X&&`|&g!7+q2V@F9 z#O$w4_Rp;&Q#(N}nr(z)Y%RJ*F8<16ICNzd3LfZP{no5lIN%_BjLjh2g#lio%al^r z^Nm=^&_is5=&l6Z9SuwytmAo_VA15)#a^78FU9KG1Z136yTXOLLD(Vwoo(m1*%J;2 zL`=nDRxwI0V~kFja4yUraH7i+tX6fC*DIY*ZW7k<`vg$Iv&>?UljttN z$!6bG83Z0GG9^9wa*m!wq~cIf<2!F&xJ<$TQ}-uVFs_1;cG3nClhB3jQAVJ=$*PuMB48L_z#!4ND-arZirffSY4sXQ z5v0XN5b)X)bCUYw=UEPy!wRhaCn z|AJryoI7R^bDO=jnTQt02ILFVEv24wDmbQL$v5RSJc&y+j%u_QC3dh;LO`F|w?Ah` z97t-&eL&M$0yq`5Y>9I2JRzSX{uMKeRje}@5`oekZp)MMtQ1hj*C+r~5Iz{uBCCQH z-hYaavUB$eXuXfyz2mQf3%QpFgxEq`^aytZ9ns$oixFvq#dO;IA!db8&Vj%n3~TJC z>OsHx)`=d-WEiQtX;!O{(qK%2TcF6-geAt;8aDEjhs6Wv>Cf8Gu zsWtr&aQw&KB;UL#`Jg)S9bb7=gcd_X&-k<=AzMYtYwVmepMQh{EeVCa=m`GE^PGKI=^}G{d3&~$VqC^GUPNTKbBG6=PGUN{_xE$qF$feD zls=)V6Qm<9+3ViAcVp^DXH)Iat};LM&t-Uzmy|(-)~l3lKSk=ak_`ucQ%cAOxk1C( za%>BWk%mz-c^lBjog5J!@^Xy*Y0OW=sU5yrD1GM6pW_-54!)0&lzwi5bWnFYS=8*V&b#7EfTHO*>47|@79=}Xj(Wn-STGGYW^^5wd6Dwyy+ zMp8s=c0;{S&ylbRA;*dXwRfIiCfb0pZvV2$DNDGlK_SW$>gy8K6tw})WR52|r!AH? zR`)6nQy6B?g*T>HXmOjQ*#({zA9ys;k@C_MdSxc;u-snAF;js?b7>zJWON&wH-{-_ zo8Nb$;8KH{x+$&rc%OYAzKQD!F}B+4{22JWomAMIPGWEK&fgF9`9fa9#jm1#s<9+T z&3hLI7FkSI^Y-j_)k{&^1Y8;8fmLMSvOu#K7_FZt(B7q2|2)!Jt!jIbfnJ`5vF(sL zU_6lx8_DZn^YD12J<_?iukZVkCZn%X@!_ik8p$Z#S8TI8p>3YC*h3}$Q>{}ka3-9Y zGBJrAIQ)Pp!#%>`a1RIxH_DMTUtHyV&plHw%6nHw76H+5zw)yO-&iw;9;1aY*wEg5 zwj8lCg<@&)!oXi~kF6&#UDmsq^0)Ke6|s9V@xzQ7NCBc2i|o6Vb5%GOD-8)6PvTVU z3lEOUJ1n-;6Ww(mp+s#I@MDJ@qTlX~zc3~nQ;k#gpF(G=5 zoU^gK#OL8op%#01>zk=4!SDOQ?P!y#PcY3wfFSvlR{m~hmke35uezDJq~75QEWO_q zK=JiDqhW9q#4g#yoorC&xP-iYCcK(iqFYIZ&FYcZldImi$1zkmJg+il zO5Yeb)k7|HUgS@KYJ9-s3rHh8BxunDUfF^#|6NP=|9Vmn!HA%{T>0_O(MT%8UWD~7_Fyxe1I zT03B(&ykMrk-!Vr&slnbtS}jEjx^u|Ic37Fk92tItCsK_W-Y^IpAoW2?U8nyc*#ku|ZsG*rJpn-|pM zkmz+Z)0Sfz#vSX`V|RrUDCJ!j9$xHcoN291QNKxf1;OxE2-zkykcEyA5>*<>x3-GR z9IQO#9kcNV&?lZjX1IrdM(`J(>BX$l743q=5eDW9Ltf`zwPfqh{u~e7o!TguFk@u; za)M-BO&qoBBcUyu?=k={PjD&^0=xodv+xt~O|x5ix}pr?+u-aIzsdfxk+46+&D#_0 z9dU6St(Tn+Zy=7zl|R4z%cM3AVQ1)($1!Of@143Spe0jj>bFx=1}BXMJdH|7Y)X0+ z9zk&+_l?s>^?l&@SX^oN=uT|KV7+tOjTp``q;e~*vvg;Mu0cXyM_*lq5t$*gI|SEk zJ((ykS`N*j!ltA6bO@tzTZ2Fc5yyei7Z#I}Qp;}cq^x!L`$MxwM*EmBiLISN3>OdG#JF))Qjo@(EU60?Q zf4$%;Y%`NWrg2oMQ)d6H*S+LueU|2wy_EQQUx#e7;#rju*QG&y9Y8C*Xi&Z0Cs=rN z-qcj#y1YcD-E8()#<99#k8s@2_o~a4>DMnX25dYqJgCIs)X=Fm8R^rb3Azm1(B$V4 z;HQ`!Vo9uK_5C_tctj|rDJ=mDjvTpdcObv%eBt=+$({VcR6O?@<_&6ohc|R|{jt(m zqm8>HebC8mtR8S#UUWRZxmf}b+s97|KEoCRm%|H|cbNX2v+fz-VLQiMSreMQQg1|m zF4kz-dCLLXR-ZcIf^gE-4ghc4837OKgi(ru+-$d8<09hTbZM!e@P3Qrs()zU5J!0f zi_zPZdRigl&F8hl&H;z#5~t5&IvS9@L4W|)AuQDYk2`TJBseRW36=qcnb7>JkL{38 z$hy@ZDQW6&UdsMqGF)InG5B|=sI>6knKDuKz2m?ilYV^-;*xu^1f$;5)wa|3Aq#=p z3+6%*BPqZ#L$B$<%}PxIlV+KP5RD~0-*v%ai?ZGJRm`q0Zwv&M^MAFdIl|}8DF3u0Gg=?M$Y{zv9$CSQ zJQCSI!;h!sN;nUgEqB$q{8mOg2xDpmEH?y*mg=mz}tS!mCj2Ix=b;h%-P)=6l3>_hlAPTtbLR3 zZ|~-#WZ-}>E4+8xrt4(Uxj|mfjH2QF2T1r!4LgYlqgqU%W}Y&>OpEr_DjQyh#rlgi zWdg(rypVRB4+w+WDi69>b?#=lkU3vrLX8#)#Pk`OOB-+1UafI|njO7Mh>5XsNnrK3GtrD~2sq~On@9^%8A>0rR zhr1ZSuv7$S+27#NB=x@n{1XAh#)Bni|yB??qZE+3&04! z8g`KRBVjx_d`=E`^>|nok$xU#nLe+F+)4TlWtJ6WzbJWXP^bc$wDJpLREJJ%uPj}p z)Bv7r18EYH*`Ra-_{)v#%-!2ck`=(8$S6GY>g{iqCd3pnJrZLRwW-u&G}mty`$Jmk z_@2ta4*$R~Mv)0z@4{!gP-uB(Beyk}=>dObNfNekNqBcr^-GLZ)0VET4^R7`f7Rat5aJT;k~MoqDH=Tfw!b~NREA=*++#KlKeYCwlDLj6&< z)Ai1W0kG z)X|DI+Vaa8%^nz#4w%neXq0jXChRw~(_-QTS;l^*DD(VZ8`u{a<_sSEe|$yME|ZXY ztcKQE`Q1RxSL9#@ffA|bx;l_9An5WV^8Cld+sr)q8Gi)5t0uGP>2bzI<_|s$$Y6A6 z<-YE9N^E3LhrxEOfoepgqroECGaaUk1OP`Pghx8q?^Iw@9jvM6-x>5>uJ>L}f-z|X zy<~8^X~ek5(@!Bm(g6QYQ)n|uKK2xQ2A4Evd>H+^ep+r*>vNzyX)BlsQDZ-04H1IhXKe+_L$(WFW`5$+If^G0Bp=T0~pfy5$K7FN<1s>VuYi zTE2tUjI|@b(u<^Z9&IbL(Bg-_ZT>-LV-MiN--*;t>-4c+k&<8L+o@Z&-J4#>uf5i6_ zL9yp$Gny?F9W6FCs?SvUDvJ;M%lutiQ5_g!sTh^5=muY4;qN+jRY_kGrM7n1&`HqI zW8`;uk$oZh3AK>1`=nGm!DA-_eMy z2K;6|xXYgS{*uW{P9#rBES>p#4R;1inp|wv#Fj2s%&J;9;!3x%R0CGOHx?Q*{nOTY zz9s+}BkOBFpCX&ZfBJ4j=`le^m?PC&(B1IlX-U>}48PytWqfSBc{W3sDb$VoIVvFE zxsmx?_%mE4ja&**zc;s$t-uET#E-NpAlX;-50pwy%8)Cs7GdR5W|I37#M#{o0sDy- z{{LXBE-oXXa(bUBwi4+7Cqk`hhF^%Rs6l=^-TM|ykYmy3k@EGKbK4TFU>1e-jU2aQ z9e1KLVyFk^KN?8Hul3~(DE#pZTY1~1P!~`BR_zHy!U7pyrtFud3JpO+jfn%Xsr?l^ zc!Nyz9eLixjoK&UlNZF-vsq-RxUO zQ^N{>J6ntrnExi=%Nix!H5Qvs1mv8FxpUmb6v!&7S_6XsIxsD|p=PMUSr0LuI&BAf z>`KR%7|yC3xxqOq_#{E^4p1@8G@x3J=C5(zL+z5%=8Ls?RyCZ;X#$SA!HXv&xv67F z5R|wbi%VG(_BkNEtx4(n^cDNoxZIw&V}`k@rN}FUtvMT2BVLBpC-PZX@i=V*YI$QG zwjE>Faz=vusfkXwGR<3mcq|5^(ga=J@F}OH72*Yc&|xCQzY$ET+7m-;zS``a>%d@Y zl;xZ%bw*q^y0TB0YBvpV2s{sJ&_dOVbOQeC_OzC}!u2P=co91>Oq5!r?rWIhHly#q z3#n_QqMTKOh*lA&z-%=W~iU zwXu;((NxSZcg`6y{BCs+(QgGz>Q2Yv#- zBpTh~lKtrvT6|ddR}R)>Z1bo;ah*~}qayBb{%enSLoIP~x+>4r{4@()g!beMi@s4) zSi8Jhn38jKAt{0$R)#F>oT{{V7SM#)2Vf|mh6}_!*|LrPF#h3CBzS_0T1C~5@~lRk z=O;$!yiDbezzQBZay3tTZOjOpQB4nuA)7z|4{Dmza_|LsAID1|-v);Tf7Cw`;+td6 zaKj59U848a$Z4vFGWUaZf$BgTc{@~Z0)2z>T*h#VJ)P}zT(+}pmYduL=<3Ld^}h}k zT2L=CLZns~qKXQIlC&k*hqu3bneYGwhtmL~ofW%P7Je%iI_HT`mdFC{X|+12HE$Db zE|LhB@u&_dV{&KK?h?>reoG5=Jj&rA-|nop3*}uVdyejVTjQThgNNd84H_RI^ zw1gL!mPmDjI)=G+y_XsHP47f~&(5e~eM~hvHC?$PGD2jFVrM$-wV;`BiONt&ba zw_N9r3X26}c`eR2RC_z`Y;O?Y-!A1+mvWFiH>t(Mr@(h-@dRLDRY6%*F9XoO>%MDs zV9CX5Bq>%2WzmFo{B5jeqamEyX2U>%nRVQfYSD(eyU|!k0?;NPV^sBLIMbQvJp&F{ z!{^2)`Avtp$$+0_p`;FDxOIn&I4jg@Bc`zAVPym|^WnxMV1@_|Qr^_sq9Vq|*$Enb z>k>q*(RdD1ixjrj8hN(G`|N|)D$F!IWP9%}hXlaoH4K}x&_ZfBu-P%KjGaJFTS09J zcZK&`zA4+pU=Iv}$10HMvX~$VI+y2E5|wY`5d}wC+sEHrlUer`S}BSh!T~Vvd}qgY zjG7W)cOAfJ{@>C7Dq7CrAY$U*QL`ku7`3Cr%i!Ux;_o6>x3`BJYM|J9%Z@{wSuGmM z&_iv%9HsTA6iv<4#jZen5#fn}*vK)j%)qN{6_-tepZ7qW~kB!`yHiDld*KpoHZi4YvvD0aP;^ z6}7#a0MeKc^S+!c>H)P2z&o3La z8=Z)~Sq`tu@18)b2a(^ZP*B9;pfH)BpR9^~I&L0rX7+GLq1&6n{RXeWfZV*;gijjq zsK9nuDAR2p}IgbF8>AQBK_Yf}jDsl_ksE{})>ig=Hrv|SYqTekPO5oz>4t0pO zU-1sq#q_Yjrd1nr|FZt$4dnhYz*EMep_Z`Ek1`{F-QAC9x$#D?#ZQ_+VI&c1L*?RVq$Xi>&YXCRXWilb`%oFH_^5tISv0Ip zq^R09I;$wxn@yuIY7d*(1)yl{<3Dm_Al7Mh(vZwYLzO;Jr$Zj88YB7?Oz2uj*6nat za*80@vKYVcs`E2h+3Ox%2Ck;gJ=t?diC`~N>spdfBMY3BF)**Yq6&YL&;s@WZ_I!7 zFFsQ&8!B;xffT72Fi*2cf-HJKs>a?;9g@q z6`hT?=E`P1Ds&JIl;ZAyYlz>iIqlA~2EzdNOoASBV{F%|rKCGKf(HDbP<6usYkP*8 zzNtc01t_VHi6sKPW7D_=M$GLVoGV;ViggC@sF`>vQ}qOlXW&WMZQcvLPpjV=gP0fF z=q^2=W7p1SQ*I7*Rf6UAB{}RacjcrgS;A_2vEY+lvav5!}WE18k1@tfqakmb(2K=^r zI>y85TT_(mhxOUC2HnNCqR$v}G1oiap7-Dz*}S^M;Yq|GbOJeTe~FZ2Q)bV?+WSJH z^oIOB54Yn}#XcaO!|&;OTYI}&Vv$}<8)fy8l@+PU3kJf#0CGiAWDQt}-<((-D-p?I z+QnTyn#!+1M`5>PvgJN^4nPOM3_c|0_D~PkvpH`tRT|?-d^^4#whdAFF`o8<)}0&F zAA$k{BdvDw5pB%_-Ez8B^wNY=W;Z z8@K7a!bj(V_p!r;?gs1J-#G>HGLIgyWUp>cG5`7|5r&xCCe3igk{dTbj3<1|b-C(U zrsVSuFw?J1K47HvCIC-@6qQL@0p{tchQWbPq-HdWy?;1-a(RIWS*o{eE5uth19;TY z3@f&mdu#v)6Y#jAU68qwsIf||$1-b%&Y;n%kk)=WAa=jzAk6WwK+uV(u;)A4T!jwc z0U@F@&~I)2o9d>%$N(_TXIS&R$N7dHv9S(+AxPHM%UB+3cL?HbRSKAaS`6f0w#O5tDC14jBTx0+KE3?AJg}HxG0nbFN zhEgx^D>!@gACkVgL1UL;!Z&aMYSdGa9V%KAK`b@gX|#AU&_ws7uh02M!>pJ#2mx5U zJM=&1P80|XHop*d)YkeprcyB=&=R>hfgC2J`g&p{CM_9EOKQzU9Jbqzan4k05{tr!Nl+}b#?7YPwmgb=S^u?@V_+gI1A5`+f%Q_VWW z^BP;}Ds`q`Ph6(i6fFcMdpRrjD&R<{5_&G$!P~q- z=@1T!%=A}{XH5X-iunx1vVUMx*J1qS@W=uo^$99Ka&acdWA zchP(CvFCwiSsrTH*;S}FkqsU@btfbEMM{B-NR|ZEZ2YMUHj*Q4y7HU6yMM#$@OiV< zoV%VF(F2eIdz4Xq1jY^)t`_?48QG(3JZ*JbpE$fM3|wpBrZ{Cz#b9A?x4n}FM zaNUaFs_fHT0~in<{RgBBt`%P`cD9#1(NVPpmjyV6^Wvqdon1kXj|#*Lz)c@GkKCGN z>a)Zc1y37T@Y>gVuHFs+!QD6ttM>7zDQi=xN&ctrm|H8>@3rCno)+Cl3AvD~AQeoB zhdKGh$t!U?&AU9SNSJ)mQj#)b2+s@Jhy-K--;TX>>K-r(e4_reV4Y44FRmTzrX{th zSs#1Hll*CL*knPDBuvmfu66xpP^=mlXwGG%Vla~n;29^$(R-<4v+QYx<~9g|pUEl- zaLh6CHxkb|zEIgWjBXNReml;*&)ZJ`D7;cvwoMQ+YXERfN;xFbKAxnKegEW0d(Oh=LM2wk(QJ+=sKQOHv|IG}1!|016X)Ja;fnKvNmZrWW@!LgI{bQ|R+kt0f z=XI#MuNiweJ$tdW!^X!b(~R3=H?t0nRjvQyiK6Vqx@DH1t7Trca9^I$^hY$n-QaBY zUrPA#Rf*9dg@5Y!q818Y#m%^HHXva<`%iJG01O4-Kry_l%5w)~D+fHPNA0bl^xPz2 zGig}(g;R5v$*MD}MiMx_aBaALP(3oAeDV{hA3C~1_rCw0+=-8DJhIw2iw+#eSKC9d z#BkIFl!Cm&w34xS+G6boCC2KAH!3aqksG^S#k+ZC!)ZvPNO!kb@V7()&3yzkXWV2mUOjmOX%Wo{@`NM$^dz*9nv^&Zwza^`Zv;5?Jm_NHOo7 z=HPsrR6v+OHk`1}M0f{6AzY7+zsok*H9Pi2Beb=P8ABjJ*TgjXe`g!p{)BtJW3t+! zoXX@NG52gVh6Z5sZOTmQTnjOu3(D?wJ+8%xE!oyM{dxKyZck!YAWV#Zq9f6iw?rF4 zoT#7kRE`z`bZ0nbB(FyGnse*;nZOhtEcfT=I}VCIA$*r;4U}Av@Dw>3ROc1Y)$)xv z`A^K#dMUq49*>By2Q*A|Wop!kQiT+gn5dsYhC9_K?8A&n@T`w#yz+Wx5J8R}i zRYiHPo3FOj*rmPOD?O_VTB}2ds?G)|3fQ0R6Jki9@*D6C^U(;QJ6W4_`8P{<0@&=J zi0(H~8h0RT%OtY&} zc;*Z(%+n|=N3CFjcF?`8XtbK>velyG!tj|W5>qF0GLO^62n(68cD7Wc1C|Mcr?eH; z&!&k8>O@T2W8?m8tjhr97dwUl4jVua*I$9no}KzIbsNogRy5+aT)2G4`I$!gd_1fXROb7ZWG1|54F`Rf23*;YO9GwpN_Z6bdX zP&d^`#g@_e<9A`)>VgkTueD+w(!2TLnE&3KHkfCeGa+i9&@PeIb?7fI;YuAbrCyf% z6NFL-cLYDqunsmJdTU*IC9!3*DCZXrb*2mt`?a^`i4+l*>;%b&v8%tYlYwlJo$ggk zmg19XoQbB{NAbD7t%qa+=}Y=+l40Lf`vhiQ4v>LKht?nK_1C*e`qPsiXC^-z!B;Z@ zucLOaA%~_*6obKpN=L*ul!1Z;@(8T}YOGQ7@a2sS81d2c$(!V&V}MtY6QQ;j{ix2! z&G)46dk|FU(S_TZO%Ud=TI3*uKvC${yg^=>rNJxab#L9`p7X5YJl! z{7_~0YgbRq5HqHdxj`kHIxX$EUN=az^48lvb?wV%pG%fDnxNSsn`n0wD-* z_>0f3pz!`dlTXr@QmFYp=LxxlPhD(st2VlMOqIX$fEiXnji`rc9B{rlR$79Aj%jcyBF8}>7(%8T>RANFdO!+{>o)yzFC*J z)r>u`>>ORV@VN{jee%JVVu4fM;Vy++2#{U1s}eE4+gu8qashYeU+5K|+p=?@+F{%=~1D0SHF+ zbtYvrC0^V1p<1T>#1=tK@q#AGRAp&UCxnvNGj8 zHIu+U9m@_c3LwFG4|UH;P6tv-?P57N+9v0V#p>y<#oI1mJ1@i7%JETcr<*CD@ND68 zmHu*d1s7<>6raIoh?%#{T40c>4L7fLCXaGLXv73~-5JVd37?8u>Tt9sH#C^o#)u7Z zDlMY52R9dVjl3!No_#%a}!hbQnRrf zuy$+dd8cF1XCAk6et(~w*fxWM4;>>PpbpHz(?Su1FFg3#y$Gqkt;9vYRyr&0MGBmz zn{3ijlO!<%J37e;e6-J?XYwisdEH0rc(FK#5%RR}}kNrgTX!kokTLr=ZZMni-Y#n z`#%X;SLB_>=yM!pmu$djLZ$Kv)+4>mkmkZ4 z_OJ+%e~*}LE3$sbH(Fa&>R=asNULkxdy4c?`5SUuBo$DqM==1$4Gl)~BkomD&fyoA+pOf%*hQ`z=cpV#s zdETRH^?=?Yo;8&ukfy*3*ogrlqrS~s>Y^OjYr$)J2I;Lxg#+L`^PgqZFA9B&fu#*3 zrT7gJh$cyv!tprq;{<&zC*nW#0ubOLsVThn>0hMsDHX`Xa3ysvgCoH$@X#=}u(u#{ z#?@&ccCAAyi>;vch@9PzOeJ90C^)(Z`IZ$dkDv0P(3#y;FIQql zuqLot%zWwy5&b5i_(l1k47dS(1F`+k;HkAT2W)lB0_6q+&G31{Erbz!{jlvGHb*rI zr#u~i)>#s0M7PO345Q~HBKsupH#c_S@B|9-7|n16GQa7n2jRa*@!?@sT3_h z-P)bLmL4763Q$ro9)yuut4;E4ACL!~Yj!~ecS73tswPhd{JrLy2<0z8tCUl**PO1R zPduYD=2e}{R@Fg@oJ&Yd{RY9QT&j*#lAM;SsvarN{bGWE)~>9p#T&wWoc~qg2afhI zF4It6XRb?_O)bpJ0iY%Ebo+%X7~F==hnU2jW~z;pT!|=cuFgtuJ>knGW3CXH94>3d z!!y`$84@ZCeO|n{Z7n-UgEVd!DRESS{t~8xg4}n(Y@lVx21nySC!X1%W9Ig4cXZbk*O3cA@1@x>+ypQk;SE53N2!uwEI{0guZ+A^rzL$K7IE=b<0FE~w*wa(Fp=Y$30Dgx zha}{T2@6HC*gm-wb7#YY*nU!&(NOo?OFn}xE?w*SSpI6!CY={-g0B>`epy11lg4yf zFDz#IU3|>j?!z--7p_+smZneI`|{fzH02+;X<}TWDWb;xkhhdQi3C}BBe-Qfdx!tn z;V9=T+x!miw4ERlbhFv)IF0mUgO<_2JLlgI_9+L#C`!L%Qs3w0XkUmj)7lq)tjTL> z#i@K8Mwvu%3o+FH5MM5R%YAZ`rj6FhKZ8gr-R6uLta+fqNE|xK%B+XL2>G^Veyh5} zfmP$5zQOBfy>IDLO9JyM@ME=k;#OK)$N`A^qN+|exAu$|gY8!-K>8XHe6NI{tz$&y zV6m4QkV&Pb_ewlVKxI)n)CW-;@rF&=FUuRwF;%!K4jrg7 z(C`p8`xEhk)_R2~D!+|uZ~pD~0@D+eh+t!cOCC>69kWm*IFyX_3o6|w*&=gPzO$enZc%w*3lL~~e5qEZ?jlXhf!Ai#ktH4; zLTZS=eO$KE#9g)p4m1ksVd>v)Q9BYX-e_lr%&ID-_=qQzPpg*8rtFHoYC*?S*2n&q`&7oF^ zNP&qJl@T@`J)U!pIX3le=0IJC3bRpzphr)|^ z@EA+f-=jbwhOkyr-ai3W*SJO2&oS(diKJ>l&9^L_*7gOhd>qq4Pt2lbX086&y5`jFoF;X@O4+}YcXwk=^Phx zGYchIvv_DRA{Zt48-OoI^ftxn6U^zM&HG;Y28HCvCm6zx(ZBl_S{P9wrGQ@(FAMZO zChllAnkJ6>O7T|`NL?c-qp@F3v4F<(Qu>{oMHBPJp$iEf`F>`bB!+TpW1|{5xo33=9da+Cj!*mNgW zb|r^9gb-`i<)^W>&XH)=5B346-mljUQh&gc=77i3kVEA&u@9!4+tQ(PN$qCMvYj&Z z@Q>}&NIeapr0`G2-DhL_{{uG#h4JJO^+BhV9y#TY#AwY_cWjBW6<~{}$5W6Z10* zuous$7pFC$aIu+ZK)A=*_@@kJAAR+Uoshm{v;|TE@AV`3zNW8^wW>g;Pw!@3DsI10 zzD`bV<;HA=9)Q~mnxr~SKt;*!9Jx9r9#I;nIy!`cqN-+8^C5#I(S?8SueZ2kbm@Ol z#ff0Ej~}Q+tA_Di3Pqr$o4X3FS=5QTsvlsHNu42$7b30FEk_A_pP^vB}~X#)hk1u54Kvs0=2 zsP2cOCjdi0yuToVH9<%R9MLPrW=;v@fq`h=q9kT>D+`!8Aj7UM&dPrY@G}@~7w&&) zW}vLU=K~DpB>eI}_8!t8nWvUP)b52Mr&MD8Z=ZRAR6Ukh)C%HRBlfuu2Eb6vmzaD_ zEhXW`j=8vOr`;dq7C~Jg1!`*ZlLt;R>}uywZv4d5Sm>`nSIqEzLV?EKEFq+- zO@(WQ16;3T;NJ^s&~*8$8&U61wmA3rjW85tV5`OVfqnphISo$(#`OL|@fcl^E2jkE>z0($m(mDPU@tsWrvv%a;n%D zu6Y|dpgFVe3N}f+*5p85g=LXiG}+&(pD_qMR_b}g-NHBuSTRM%p5Fox$Ve<5^V%^> zEj+)kopF+Sngk0}fOJKozDsj2f8il;afu0!%Rd3ar>gG;c=LwJq;f zd)+3L237tq&S=8TZ>%iVLZG0{;t%<7F4~3uVvg#3Bqxzk#TcLug7)**FscZ zFCxV@7#bj8OfdRgUXw3I83Ptc(>-%~!B1@YehdJVTDJ6kiTq`)KkVs$qJ{ii`f=fP z&je~SFRk3v^;eaVG7zGKNPxkRQQ0%M9IWOg2BO)-swr7t)Otm?Rmm%AzF#qN>cp76 zGplkUe%@f**e$G5spRk_Kg@~1M5-BkC-hAa6Y23`@niS!Ov=(z?T>a}oMydNr+!8T$%FW<7mf}{= zPKHd|rb-Y@o8+0Uo2_!;JI9TSD#98kRc1Tx&6dWc>Riue+r6@<u26oGH(N%1_KjiH! zO!kCNxqgA31(qmagq`WIG|hhqw@bO4m(cTMNigZdsT!`7H7<`<>)BT>ek#g>>x^Sl zEuv}$+Mt})_k;4u7p{Lh!(-@W@V3xmDmT#u(+|4%#Li(gwfDnL_UCM;Y>OB~IVwVWxqK2rI{pPJ~ND zF73?H&w&rlMfJL+PCG)9lJO3tPPW*?1^wo=;38c?B`xwW>o17gNLJuizUXMB3aApF z3+fqeEEl_!JxmFG?5cV=@84DU7ac~=t|aXjNKxby0`k2izlCjQ*{*pN(H!GMl&F=} zB*aEboWl&~?rh&||N~ z+5Iq4-7%=T_fc6v*ZFGV5|;+xk(Y&4kZlIKPI$P{r;t_=l}ota*V2~zHeU6YQoicq zyJB~ZN7am5kF}#cK#fv%tQ(<(V)ien?La7qU|t??U4fsyEZUh=@Y2+GrH~UPreDc@ zQD+y2u7lhU0_0gf@aQ(e_lw~i>`0I-Ze;cy&(B{K@lr`~^pJkvACc0>@gH7Am0)O^ z#qLXS%gpwrEmO9&Q|F3wjDAohw5_EYO?l|kh;)n!i0Elqh>b)%^H0W#w-Dtt%tA&cg$4Kqm37Eb3P|Qk zFdeG1ELJUVkoBO(lMJbbqCX59IvJ|Y+;7eh7So!4)Fq&7$H$g*jd;)My$Ty^G~llH z){NcA9-OTnC$kP<+Mnn4I>pt@Iz1JbVO7&TVw5=HU9@=MQI*uf9kn6`86A3%ceP%? zhw{T#?c=c>dbt=F!u#jBFY#54?(kjjB5{`@A^(d?!mD_jC zrgR_b^nC=U3H2WI#I4w;L7TxWrV+Jz{_EY?9^YBCdgc2z@@vr^y5Ta*;(q%yc%~`V zz@#T;zQ;pj|3Pf=)73vb46*dZw=s)xafgkk*vz7-@Oo!=qWQ=wBu0;NK=!+T;eV`y z-jt{VXaQPDrxPB;SE^?Di8*lwG8@#fK79(r1`(b9Tb_LQmNazAv0RHWFy7m9zEfMauSLvbaPKaB*HTaEYG8@)sFO_HuYr8DF6{M4C)HNn)4SM zXkD;R!oDo<>dGU8XI~#rtcklBQ|Z6%djR2r7HLTAHiL%J(7U@m!$hg%5|*2OXg(>% zXG^O|zvMC&py$&=w6c>mjeY*E)^5Q9?un*gg!%s8v=!}_x7zLf;Yw|jzPT52Vkaa> zl(D@0zea2TC(hBp^?Wa{r!96X(?$|-U8<#OWxDJ)LSYr11F{Ux73~RD)7G;&pxbHZ zJIz53RlH%jM%%9(;i{tsK3fy1K!p6~nHTCcLzjMV_>gXu!AWLOj>!LmGtx5ZqGy!3}6QBGv!`_CjvjaPY+2B?C z&g+Psk9v|2kRZ`}(K=1Lb>Xd*Dp~H^^UNZYQ|Imw@HpK>{kYA-I^w}G7nGxmn7Kr3 zUo6#6!fMT=ZeywIwlJU%y2dN!=&$rw8CO2XoYqXjT!tf8RV;ozE?2bg1b&E=sRO2H z?2mm0)_Yktu;@3vKn4;7Mr~;fID=+Y&;x;w(k2SvEp+~s?1(aawPb&znN(Pkx(r?B z(U=iB({Q@684(lIpzan?fgrWETZ$UPAbFEyi~P5F##>w?_)TZ|$z7%#GVqY?y=Cc= zl$8iKjuXs?LxZre#4Pz8?PpH6$w#_n0Q9|G8JJyM>CS>aes~~X=4QH9cqxDZJL*p6 zVy;I1af7^6^}CYkf-qqT-n+efTOZJsS|!9ft3s1e=u_c_F$cDM@dg-`b;YMtItL-0_rb67ThI8zRO`O}ZxdRVC;~JT~}Nut>U^TA?tbUPZqbDK2)Tm76&&);syD~%Wu0B>)r||g;}Zx_R>Wf? zMLkBU+6B}nY_AjyAFyjZit}dj1lANemA>HWGa>}xXq~xcS2g7EMmlCNK}sPgSOP8` zyLdBYAPw>VV0o9znM8#g9&XIeJRe;A@&zg3VG@C2&asSWNbg&Fi`?XMXgm<@98o$hbgSul?)RF5>}!llx!*~i@Slpr-QybT^ z45m>Z(Te6G?l-!8e2`QsIPp~=3feI3dXaUO!sT1v?=|5?D|+sV%+$7|e`tk z&!!#*YI=Fvo>{(1lSAFQ#?;)SjtL=}(RR1ov!m77 ziB11Vk%`mE3Q;w^^Z^TB0+y*9Csl;|N}J))6ZC3HpmoYVMlU9YA*BTo4iH}W9!R@Y zS%?Jhq;|s96@81_aL~Ty*21*41wGk z8>uD~!Q>%6Y@CVycv-kP`iMg>$Mi&--s5FM{IdeWVb3r5Fqs>@DNOwDg(R7XhxM;0 zmx_2JIb%$|dq_0)PjJEjx&>bi2Cm?nttf$uxnYt`yu~2R`>7s^Vd9zg;ADDFt!i2< zHH~#0ODujmawVBT%-@pG_^JT-Ogf$j8gxJ{0GrgHHQvCUN=J{I>BWW8S5mJA+=1+T zm}cqIe+2zq*O9xYj+@Ux#Mp*Y>GW*JynN-ebjmvjA#GxcH)Hf%<_oU|mw4_k3hNSg zziV{cfI`TY=vQLRAoRaEhdJVbK(yyH#R}i_Fg@^nTP@^#!V&yi;U-fsqY@PuyM^ zf{JAii8tB@2GmqI7Q zg$^aPWLFW+OVs}IdLO)P$xjt=PZ^aJ#Q;Xy4O#%q& zdw3u%BFyw_<#~(bMLIH9^==soJ5_y{x>uYcVWUL9Eum3sAad{ctcVcO7M-%dfb7*u zGw+NNiuT{kk}8)EK6n-84e?gbTN><`MlgAof6+%nBIwY*2HZ(i?Sk$ed+w_mwl#oPmt5WWh7oSfB9i3@g; zV`Mr0rH%=%uOuEu7DF2NdxKN)4$pk@Z`+2OSRzvc1U+>4MT~C_s*oHsnN_3Rje?H> zxJEB&1~n%WceAKMdX({3gowRYgTvS|E6dc)AMnByddX0{Bvg6rwarz5|B_X3oOyr` zTkJ#vKF9VYX0LkEJ^=nRY(1IWyQqk|%!HzC@BjeL$N@KsWobABG|j)m+L3~6=&t{yrrd;ke5!1oxnUSx575gd0PrnM zaa9izE#pc@1atd^66bj(!!!@5LB#HsWM_EDwfCt>?_tQW2kns2>-m?!T7PyFOLZCs zKC1O&R=9u1hv&R-1g|J>Qh7;j$|mZ2)-9IELUYrxz6hFm=9Ah@82OPugN;bpJz~*E z-&b7Egu>PE)fTN79 z&@0&Qu!xF9=Cn?Gf13GY=S~lH9}-n-G6jl;8lb|Tl%78oB-%AlFQH{xia_<$q^?OIWgLTCKCPkj@?kIkZM1FwyK5#+Ll6z?;tfl zmV=G3V0CXqe>AFK(w_@YrI+xus~siY2{L0vIVA-Z;2NeTORw8+#U6Q*PCB)EWR+fK zj2O`TjMG(}?bZ6?fn>VD3L&oH<9>SX6Z7qX9I_I?f>M}|8&E(w6jglW{wL) zgyMQDw}$ip42zym-OIiI4X^$)lhLs)s4Avn)4W$10=<|dC(2q}fFIyo8v0)+M$R$i zL$q%VxYdLjn(l?tw_s`5#S&FWd}D0pgfS*u$~=u-^O!G3@bQyA5~tpA@8D-Y zAuSNK?wqo$II!b+!0LGr*J87d&`e4B)h0}M()5%{sBOHCt-O&F1T*h&$dk)FiX zlgk3R_0$zu_(4<0D=JKJj9E8 z)oFv8qWbclWQE;M+QP#+rt)b3H_DQ8GD@OzaMrZn@usNE?q|GN2rvTo zNQfj2(H@XoGj%yP+(03OJ1z(f=%KLV%r+LzF)_rwQQCjUmH?{cA%{3{ys#r%Vb^Q0 zz{U$h*;gG*ZG_=ZZ88R|jT4YXDbr##f61<%Ft}|vvDQr62qZq5;?uh>0dp+rNDpxx z=^dj&0;`(8t7L=!o8hifke8Quowo$y$Z1?qYJMe`gx<$3 z!N#>gWjgybA}tgSmh`kaPFBW^t!hR@LU( zuy5_shF_C$OBF_Hk|P(>_i#}v$oXT$aGauj-c|>6?;*TFu`%9aI0yxf5)AIpx~UIB z-Z?cA7J`Hng@64gd41|)>i_eNCLl~P9U@}O+R+&wVTdGq-z~zuyML-d<20m24bIG` zMy?VvBZDECf)^_eO>C2~Ba$s@I=|=_mw!TAaHt&~V8WfxSX(Hmp2Qe$c~13_zTuMH zt{tBk?*G>rwcEBz&J=57Amm^U8GOy(8BrV7n|1;~|B>V5BA@(dMlkwo;m6(=6bnm_ zx5ZJuq#>3J8DclUS#DG#-tuX{Uu;`fj~}I^H0&h(#P*XFL5AZVJ>g6|D~IHvpgYs= zCRlos-tt8e5?EsAYXh2okRB1l1!sQz4+w+bUA+*X+?wn+G3N*R{3?UqZqRwzE*CU% z1&l0xuS9u_*FBf#{wm)~SA}?rJ8h&`Keu~jNg)n)F=C$YbO;Q!X zujTN}#$8Py7A^IzoVGbx)^VurpLxG&(5jn~Z3HWUlopEiJN*vtU)c`bzmabK6tXU7qZr%V$3 zXS)5uydqFiPNe4lMY3#yC%wWWeCTI-Mz*~6FJ>_;^;XG7wzuOQHRhM{BRI zSz2ik_o|akjkw1$;Swdj)ky(L!8^CTRmxnML7D9rjhKlqQkn#|7006(W21-8HcSqo z`r7S$FeY0dr)eCdHo<+Hq}p>f*Bq5}^N7$SGm)tjI3lB=Qprg_Efo(4TEB-kfOY9o ziig%)D1a|8DBIF90{LNZQRLdUq^Y?>Y{P-axz~+_>wM2Rh66cKAxP(o=UO;q>a!Em znLaI$OWUH4yP-xcXK5?CRlXM~Av_aGEs?{*c`wlc{Zi2NwRf_L$WUP)G+ETEGJ%@-A^B~LuK3P4Qa2Ho6fFkwe6CA@m& zR!0w{&$pi`6+jJ@x^#OUnoz@mIvCWDgs_3f;H#L_NH}%3 zWr5=AB;auWbyP@Yf*(po2v)E%t#DJc3(>%)Z7*F}RE{#APE8Ts=Dwpu0gAbE_L`%2 zC?4F8;@krEzNg|8pA(PIN1Xh(_c870mZzR!fCV8=#VrmSZ8*wJyg=D(rFZYl4Ed~W zHn&ZVT;5RUpK2T&J;X3GX|nkw9i!|3?KncsNC~?NVY@RqtM%`_$02S$nufT)PzrV; zcfu{T4RAT+opsSv$0#M~LG4cFnl(147`PH01CSXTK^>Sh;#E2U2x%J&XzH9#h+}ml z5j|2Qz%jJMOQVYk3&?x^TmYx{?!M41D3sAODpL)dH^YA1UAwGG=Y-FHJGh`y16mLC zG43r{6l;qQZh;>>+7LHc)qE%aYYpJvX>5%Y_ZYlUs@M{a>;?n?&A6FGdo`S?usCMFjcKX(o2SpxLtKoRg26=pt zV+r-2Z!XN(KXY0+l1XO{k#X46Brf0-`cIKjvO9lEQY8hdcox?;=AH z2=j@~1w)%WS1!!ofE-_zp~#Zj1HP8RERXmTGuq>m$3fmmuT0%fjzu6zD}rP3ZHl{i zv_3a)p5chQc1R<8a)G}w0EYhp7qNWKgUVr=MWxu(9m zSC8+)2mkK+<^?sV5!X3@@K>&`!GX8Kx7V0lMN;WA?WrryDA{5h#T2KMP1(W4GNRY~ zB0*G$PWHc1vA}7(!E|S1RlzB%t|(xi;+iPG(sFD3&kvp*+=qCDfEB`9z?OCKQYf?t z_EM1{D9(5(7EDYIQEoDO_B$9Hw-UeAIByx;8Pd46cKzEu z8`)3rBFA8_D*vbKoFp9T1CF7b(u6{VVc_1BA7efKpFW4OL6pNxGo52WEJ^_}Y^srI zQ$OPFs+1_@zTqOrrWLT@yE%A*Nw7m|h7{h}xg6fxP)5LSP zu!9c|I~K19^6&WS>g4CRBdakedF9ofCsx3xSmA<%$s)s7G09!RX6d6vA46*`59~EQ zeyGoA&2MS7A`s+aH8-oXquLPKR~{q3i4ioSw8W9EbRvPwV)8r}c)`eDcWactwG5`- zD%FTqB>;%WUIme!PvgoD6$MQ|VWecLiG)1EzAFXxt$DI09{y+j<8nXJVPHfj9LyH+ zR4Lqf`74kEcRs)eTXR@cdkFo)rqI-oAfpR5eQ=XzZIYGxLMpXKZP#0B?G@VGXYtDR zc`(9crdy$nHJDptuqVEtTC#MZBqAUoBE3+mLI0bP%Ct<=@n|JPug~#%D%jYfFcV6n zgQkxWgA>e#yDQdfe`+9MSn2)-BZ_i@aHwI7$m#R4^AW9wV=~DPH%!P*kz`KkuBqBB@{d3i}vj+>8V|vuM{)c|JBy%a<-z3J^UE`s% z+3d>w!7fbHK#S*=UO+B`TcW-lwQPi6mdl?q;<6;cnYiWK*@o}bANatVUq77h0>A|J z9SnJm=PrnBp*@PI?LlwT8m4q6lQN+!7{m)IvG)txR{*kz&&1XiTVenRs+b6Qp|adF z{7<7HprTX-*ve-Yd^j#smn0(AzrE*4KHNrXgOY!#-qeyqSsbbA1`i>-5NA7LlCx8| zZ)%$B_9MWo(F+}=?_JK3=Ix<&{pox7{ED}>xw2|3k#|6$4%Uc0MOXjbz({VY4==VM zkg22W1ai^7{}L^b&3Z9b4Gp-y`faj*=ixhJ`j7ps+^08iHR>1;5Q-2fEsk=9Gz<^# z`Fw{w)lP_s2Bv~3Yf82Qi__%9ErGqPsXHK}d>Vg?5w7NX_7-nXULy17_wuO4?mtwa zu%G|cX=-A0_^>2eiS*~=87%BY=jHM1V{)Ru;L5;Ol_q=TeZE4#o?;lfpd(T;_$O_U z3Y~`75&NNcP>e_n13I&Gis2wZe^I)}ce5dvU6vwX0m)5&8^F z+bJI0<+H<?rU_s-G{PG-z--s>aP-THuAgmQ$=(pmMlPVak zN#*ubW|D^HTLF`G;4>ozXp%9(r@xE9ZJ0DFi!+>=Vbn}`a$d%8{WixK#rb@-@CLt|O06BJA)bFC8;WVSsrkt(jx7 zVCtI7;03Ds@+vl$~cTLMR|`HsoHYc#|!>h;5K` zGY*>S@i&toe|D+uFaSmMJyy+CX|g7a0RV0Y&AwdlFC*{z1w^Y!f*(His*@o!e_uyvkyzzoQWS_ruUgdfQ2 z3Sa-o?@ed6+8|ZOZ2>5Ssz)NpD}Wn%s}d)zAFcP7M&QNit43$iJC0dq0$WwC-K_NHG2N%JG|v5Oom0Ro?VmTj zhScdqRHtzlcp*c?T1m!;B&`~BJH?>YEW)`Pqfm_d+t)F7u!{)IH?^zo8A93;?c%I4 z&~)qXvlTAXxaOixs08Fh_7@4>Ta0Dmz62I|Re_Xci7OWHZ-HlwpN0swRK*SNgkfV< zr>3&pGz_yWdd5^SNT8^hT?Jg{bu`kBL7)(ZQ3jt~9Xz7TizuiCoTu6?{BPWhJUzfh zo&9qwqgKY6D&mqxq)pJ)vzMzge@mJM#iKA3@lU~1vLfI3H69%(Awi7WK<7~SSo7Dp zhN>F^vr>HIDIt*+oF|~xKt00CHSq^tI|S`aEl4X#x$yTYkLf04mXp0Gg8z3@&t{?k3cC0-(T%%wB2W=ifN~zPPmUN8_fuLn7N<4{MYdJyJ6gr;emf8kpLpG3JKjRP#cO5#N>$eXy3Aq%-aod$L2hw zR~h$@j?fvEo0oj1ScVxvmh=}iQ26YeR^K%=c0Xam(3j!}VL4GXwf2m-6$tgqCk%>= z%1$_uN5{GwQcdG~;t6I|&jYUE*65Z9VjXGtlIqk}9poW4!8`LvKotiY15#0-#lyl?#w-KXW&+GfumiH>kD4~=KM@UM(|UM3HUuFnX@nxBrRJ>;A)L1@dP zX(NqKMChqoG=QthpeYJxo-mew_6}{17#)!n^r;#6_SAQ(!2eC^rJ|nJv4)2 z`-Y-^PwMEcDW=>sa8=Z(Cb%Y)2?3ry9tYIsF+F3@w@vs-Rh`pMFg#%)gIGH*RMKy-5Y=|~O#`4;)h!Xm z(v%(IZ^6c_quo_-2@xKet{H^ib&m2twdMA>1CJq?AJr6tPOoMuGco1Zs9hDs+GY1U zJv`UKYhe73Kvwv3d+j+BmJ`iL=^>P6#^rsLU8oY3qkNzxr{jN9%iiC@6<$hPu#`U~ zw)iB7kr385G6_C)Y}_Et*DNTuIZ7qsvU)=@Kik-^R$gYrC zpkq?}pT~K?xq6ey&0?dMAr=$dd@hGQCmtdwmcCUY=5vN3K4_}l?)a^cy*UQU5Y*?m zKM!TtgN7NN!#$(S!t+kQpG#%U zA8iB;ZgROwNUkD3fMV8RyF#6~2%t2=euOPHPxqsvC2i2f@@p-V`%~1KV22r~*1i3c zs{P0>-e2}6cgx>E7#ESB;m|vLT>yKF*qJ8hT!$Y-X$|t3^ATa5bNDmP9P#d0woQUm ztHS<-w%qqx=@$wiOZ;b~O)T%31gE|LlDJwNbBshbV{oRUs+Jo$H=d@=%qm}UE4GoW zr=dYMlm5pK=7^yQ=jdt`Sf6^0Zs#yxfJ=^6xv9712Y=!WKbA4r#{!-1QX+QEpW1qK%TnWHDp$2LQxq)D zgJ=w8)Vm^J*pRT5NDf&V#*XwgjKRf$!rU$QG}s(vPNLG zsW(NP_JB54Cv*&sx?sMpf-;eV{_vyTo7C)05?wsxCKB@pJ}|rU+D~m{%K)Ov9RWNU z+ya~(74a;wF|6S#+(O}Eet~Bl0k|y;Z^BH^K)C|Ano^3A?rlrQJNF_scnC|apuBvk z>HGjpGOCy@UeS#qpJofWHN^;XIZ7ddX=;*k9L{ZQtUjKFHy(IUUOB_m=_i0(=x2)v zJ%v#B%raL_r<^vf6U)|Z?9=3P1JPaCC)UkbA_<5;e$Whs`lVmO7yJ8OSp zc7 zRR7dT1Igz!7ln-78Onn{1*Y*PEh<2sjrv?^Ki#>)ZG5}de~ZvnZTqz|4j0j-YZSBO z3?2H2KA-9uoeU7u-{;=3*7wNV3Xr!&$T*s1CEtiyj53f+j?{Q>9>jqrY)bKvDsTs3 zUe?8{;wbXK2y_JolpVfADIivJ!Z$=pA#lbv{GuFwpsag=LBIKHO8A~ni8@NxwV>j{ zkQ zhIw1q?%x!L4TE^6uL5-kI`@q;CY6&TY-mM>gWbjmcRv?A;;4peI}vyp1hWc1!5LNm zF;CfCuf?Sk@7Q;WI_qTnDPq8&0}fs6c|DyY4yA1nDojHvR4m+-8v$fHZ?PI2=0{u# z+l%vvb#|e>=cu2@2`Ak@E;t#k6JLGdKko4Kwp3SQ+MdF@cV3v zj>6#}_3j-X;RRFX`Z!;xphCLoHS7hjb=)^rU!Cx~KTiZADesvj;D>wVX` zu$9CtPuCX%ryYz65^Z$$$7uYVxzzutPHwyzUzZ$l%5Y_M#gf&*UApCAohP;sh(U+gc$JY+R@v@iOJASNR!$Q zw*a$8DreiokXx6;(C_sjtoxRJ8S4GZV-=GFEqYH0VI#p4^m!VcVUo{I_MY*Ip$Ig( zU{hsN4G^jF06dHe{o6mj$Atlb1?VKibVRoRn!T8pTuQ=x?`%hA0V`bKXIFwdaT-o9 zZZcy_EXj7kP2ES0?FwWhauu=vqLyf#R#V{+zUZhZVQR5Ccr zHSI0Vm1c#Og&>>94j>k#_`~WF0XQl{WC}Wnsi&t~;m#P9H09BFQ9K*s^I}U6R~%<< z%@Fl~>~@#rlQH38eWPz4I?FY@wUgn-WlIP<`>H<|W76CaaaAO_!Sr@i%x}3eWAU9~ z8B+@Cy8o*Hj9RiEQLpA3rWMO|ZJVh!w${-3F)@Mln2+iG!C+l*ZRu>+NA5H>gI@MU z$61^@j$l#6+z=s|K3stjlZ_^*i)=00Cc&-T(wsIYarn^CN8-23P#?O;lgMyVoGtxx z>BvH9w6T=rajz^$JJ%Z4(Ai)-uQuaEAom$*Mkl*GXqC0DHQu|68jK0!T^A@1LMnJJ zkf_e%{mYC>`=*xia^Lb>2q6kNMa)3=MwNB^k1f4Qa|XR~JcCZHRgz$b_74Hjp^xIY z^<F8~A2hV20y z5ThgS5?SMpX2A9ZhTmaq^y1LG)qzC{&y{DN(z)j94v$sRkOb_zY4MlJrf5N96_xV~ z{4qcY&$l1LZzi1@A~&`MnP*fQkQemA;k#7eu6@hHR*Z;4s33o6{9#!pW*(rHZL z%@#_E3B6&E4L}G)RwTPYguZF3GjJ!N`ZmCMw4QTG>(e97CJqs>yv-1A*zxiRB0I!e1wKEK5K`3lN?MB>`yt z!Ib`QQp|>J-=C2jBQRs$tb3DbU09eycpQ4h=ecc_GgmtV$G8@u2rG%xALxY}jIf=} zk`Ke}oaLRi^M4j;zGTV1B%(u;me>@G{fL_umfvjyl^xDHA!S3UB)CP#edW+&wKVqf zZ`PI03e-gmN@65{&OZE0?0>c{MSvEV<1s-{-J6QS1=bw;hs&{m~q!6b4e?v$NKK=O}9QOK%dTjV#^(c zdS~DbQst95T*T~!+hyHv*fWssA}Q$x)t?#1C(aOPUk46@2br}9)STS~ysGk5`t@vT zks{XGlvl3JzO_Vc)YW&{%SM_U1aVvxvaEzx|2;K@t$4S#P z&Yj;;)h({PZdYO3Y?IAA(0jX1?Nw@n>y#T7<$gnR!lq-JB}KT?h4|wE`Na9ezv5N!AZ8g(`?u(%I%=qg zF6NoE7}DvFy(gJ6fvQPqphjJUCa_jvqg_h@ZA0drj8)TVr4suhrlN#qU5Dal6Bd|g z`-vo$KDdRDR{6jBQLetkhF6f4`Sp2dWe_jeHR^G#FPkvQ|d zOPqtGGfA7(bjj?}A7mxxG>iPC_xNZ$OjvNM+@M#_jPeoH>1FyXZ@$6H1I}y zfxOZmZX`JMR_IBLLkz@$2U8(k-!1KZ_tYx&r1}>JA)jGux&aqTOgrMjU>y%?K*?~+ z23e-`c4v7MN9er3+5k14!dL;cggoA0Ta@w(IFvJ;lrnA^u`cHS=-@6Wa3_7Xb=Pi(!M_?$3Ll4}#7-v?ca+yu``V!lh$)O?E$6|Zt`cbm zM`|g}TG)C8*`&7$K`X?k?m!!uvTN1a@dFwUJ@dG9IcD#5j@Ew&r`QP>0fYdsrI(Y6 zou$Dz#LcKkHR%wH>-tW3I^i*r0l5{1?vTzq4Q-`6E|AOiJBynIe703VG(K^{kWJZ= zJ{RHY!@vT`tLP?k?s4{n{5XBBlEfX?!Yk`&V~i6SiDoUbDB|H9Ks4~UAo>_^jG1_m zvduK*$m2?7IS{d%9*9ZryiFhcN z8?6oteyqPpW{)?G5P@}lvi$JPt_sTta>qilejJ6z5XzL+v?h zMABXYrloBlXrBu)KD#UlQ{?HI))Z0J?B+7ExWK>sgaoXF12uYf}9>l2^8C z2^pj-ZsLwaEWr*p5D8+KWB4PRoW2GBdT_tEnTwCAsnN)dGz(toI?W4;7Y%j0(BhxN z;RWyaoxHGO0VdB8Xji4CB?VU&SDofee%DJs0s%-86nVw}0QHtV`ASeO^{ARkR?5CS>c}{N?qt1k>+VEK$@2&+0r2Ys5 zqxbapR&YBVN(^@Q%VCFmDBdW_>I6jheU+{eGz9(teesFc*GwVMgr(z8u?9>WuB ze+d{Zn~Jq|#M_JQb1jqW@;5n;%+54$38S=O6qF5z0TP8_;(Bv`DTNsDF}%GJ(;XAk zrL@8%68!LY0cFc5-1BQDNJ*i3>4_gsCYLZq7AoKBW&vxaTDIv%V9{>z<2NHs1&rG{ zQNfTnVWQDO(g<~xf{zsm^R`Lq&M32Ue>W^2+7_MMpOzCto1r7~Piuq^V5Hx9|T%kIDP7(P8mG^0*m{J<|>x&UUqjt_Z(kejIhgzsO1 zWiTW6V}z-tHjPg;p`iB42H$&<2sHdgy#<>ifHaVf9xNovkH%c1am#Wo__>OI%l2S5 zAi#B;k1x{Pc3fp~fx@wr*VwoFGYbN4&t6{zxBx{!y1&XV-(tLpKzlk@#%A-LS!_z>r9VmmL(! zvFKV;&KU7=l9w>hO3_1rPU&$Sbx{v7s!b<8T|RENC8#IU`lnzI(SxqEa!)pT-xb@IIUK6p-=WK0G%%? zst*3B_>|{!v%W{yX+&pv4(q7l(AvnG(Wn>={st#@Lov@6F^|96=bE#^K<)|)*%;k2 zU$9cQ$aUcj9nA7YU5G$Os=?@fK4uUV1jjSmLTy^-tV|B+!!Jvk-kVPsEms(ObO0JD zb$By6*aTyMtf+`MOcHqYh*5+$xJiea!0m;j^!_j}%vgehy0O4w1tRvRRkKR*F#NNY zauBfQ^hwpD{UL{e&OlFOZ)@&H_rAU>CyM_?wKzOn`3tkxw6OaMSeFI6nyj znk~#Q)Hz+YFuuHP%aCe4IaY_-t+P7;AhE;6fQecJZ9IYDqZPr*)1y9JZ$(1Ij;Uu% zAn3Eab|EKnYr+@es48mlu2<`1-El3utNRN4Tqm7O(u}cSkems&d4$2yhzT>m6}K|D zN4g42!KdO(D8nqwo#f`dnt&W~o9)mX{xYlCIS@D~A7!%p#Fw!d1-R>CY=SV&>svJ* zn|2Ph`LcF_Ml?2LG-e4kNXS%=6V$157p2Vcz}dq03FXOp8EwMh*^|_T(d_e+-d(;K z#cmL6R+Aa!b~d`C4nQ9LR_^wDN%bqV8O$U?2U-vRLF_TbO8SnTQ)&HnsI!a10w|&K zoyt6i%J(L>=iL^U->#{}{v^r-kDORy^K8%6kHN4;ExbZ^!7irXO}E2(srwFoQyDQ~ zA0L~7y^gK6Pr-RPc7}U%5sgQLHVRl*56JF3A>!@rL-q5621LllnLHFoe6LBJKm~Ft zcxW)jkOY*fx34I-|X>8J&@$2Ey7hdXP+^ z)I1Do$+XV|jPqTKSl3|$)6WUPwAH97-f;&QiY<;%k=$NIk3d>D7beWMXmv%_V%K}g zIW9c?Zwc;e(zwpf8N#gi3JqupOaa#0+!Qmy3|W7KyYmCqC>BkZAFa!-?cBEu#c)VF z?d0IgCFXwOPc7`DvC5yo<52Yk>O5S;Htfhq?{%1tj+|p$yqF`AO%iG8E1(%r-0 zmEP^!fgI6wTe#ZzCNQm}u5kFuo97^@%jiafHG6Gpnem8cftf_;US(d^P7L<;Q7upE zPcSC7n<3NGU162ukmLaR+o%MT+LAdk{4NRszdQqpu7&iAnis+~I=5Tb@(V?eP((tT!mSehOkELA0dJI&dHe zd18%8m2pWD2c?1yA{oktlDujmrNz89mV7O^93@MsUa{>xcR{j!3R_(k6$?$Zx2h|< zHg>@dX(ug}eZwXIkWwIg*42t#GRBY-DfBZx}b?gSqdBrlHsl-laMe*{Tf#s6S{ri5=lVxm+a#5i+A=&}%(G zXW^CK>eqwK4FL~5H66_Q`mcFphG>Ld~ z%W&M!w<#w&XqeuIi9qnDaoks~F<6xg);sB`US@mO*%-)gXK8%MJG^l+xq+4x7Sr-5 zB~^%uefjDFAe~wY((H7(p<)%*uh<@OkrHO;MrDy;(aXgklBZ(ugX;IETv1s0%FB}s z&`koJVdbUpLA+JP3;R>2-+-@ENVY!yC*$9z6wUii8UYvx|B}hj$y@%f9Jsn%bec@Z z39!S@9q+gzCTk4x)9A^2r-4U%XvIeRWEogiF5CSrJN?eRF~@64kJNP`p7J9R>Tuq& zKW*Pvk!zUO`HC zk#V%wZ@cLaEuZ-G#yEHX;~uWgs_cOALQ;)wHvV{b^}f%_I#sgpe1fY zX4|~a1*m1DJ(9oE;EIMatHF-m+JxE1UtwM0<;T=`tk;5j$DfbRW1|| zLlhqdu`)!buwc%%=B(3GhqrLJAJNOj8Fcra)p93Z{ew_}j~H-+cul(_WRmTHacG(WZw}AwFEI_hRlxf=P;-S$241SyFm-R^F<`} z#E{p*tjYUNsQhpJ>$1h zL>SB#4R))SSVq(~6&KlfF=DM5daV_I;)2%r5ee~*AvD9*9im!+tGCTdZ~mO(HqlT1G_+{Juw2a72etssc zbMF%)bcC&wmRM=U_8EBTS=GOKPfIR@#X)x4Cq_miG)xb0fiFll&;bl!$MH)NYR+1~ zujja+k%Tl6qfc}fo9-mp_li@-!H9B2>(ydTQx-?nKMVM62BG_;5Ss}**;m)MU41k0 zNF_%rDN!c8OD<~0fD zi%FwPZKAlW{hRYEUnkQlsNQUmq2QjYO;3qK1YFGD7Y1m6Tqk)O$2VwOQEip=^XEJn zo$G*(;fFn6OgGm`>k39O9%2tQR9K8?qa`92D~WuFS$p1bartiST4Vpfz zM~BMGigiesolJ`HhUH#=Om>l}gCstH9j_w8n+y`5qz78Ob-@bAQ+?=d-~6Cyif6l|U`d zHp`FR?Acw>dr^(NF^7{%@0>?H4i3)PxOG7iJRHo{*cNcRcKiQc8QoJUdTHs{2l$|I zf8Fb0>>B6@|aK-o+bg&DP!Lo{wH_iV%o5g+463D z+vc)Czj#gCagjef;B7xUwX*BdkN|H^4QT+7RM8``2SojU(PXe6=^5yw^0^;oeebM~;UFGm2tw-9RgdN~CCUC6T@^HnX-GM8#^j-I1a3Lgl^ zKi)w;&a3LP0P|UdR^Xp-sRh9}-6M|n)E|7n(%ij4j(fJ6xXQrIPcmi@ML|i$ zh>)uZnINtlu^agShLV!LvjYS-et2s@!CaRzrSSO+RcyKKW@&t9DIo4e>PwG6UmPVd zq7&=-d2pc|8`Oc;Z8FgW3A!|P0~9lC$-T@Zm8y*RjkNCt>xZ4y_Wi2J#Ov@prPuGV zE%V9Gr#Vv;P!`ZP?F6tInuV~o+I$$F8-wQKo5fXNNBw7R9%Ubx%$`sO?W#(uG^rN( z-7^o)I3w9Q&F(-*Sl(7=PHxWvAocJqb2$n-x{U8wC z$8bs*O1@$XGjRpMEgZu5>Y0z;dtpf@eu!;80yenIs&VujeY2d)q1pz_&I~ zOq?ygVA&&oS?<;)^!eFOB>S>xi*0$(A~jz89QE$+pAF$Y!!R$i9iUqjtg4oO+3`8Q zK@0r54Bt!sp_0Dk)Q^cx8M!}m~ zgQhu##>FgAi!lm*xLC5v-20N#fHt`_&`tTY*!BhBL+^UsU*#t|JDo6dIdKo2c;sa% zb%&AS8VQw8dCK7#b**G1E2?SGU_muy<3|ujAajMjd!oYHmEe&08WZ?7Ar2bLi4}9y zyRUg~fi7nd(8h%#G}44Z?dNFRsH`=moe)kfWx0>lN<=t#M;kJ`nPm`S9j87Qvi*eD zfl)GzqL@^>b*l5xBUY@R|xww%yT#?>-Y+ zg6mG-FTyWIqIDp1gC$$qPzKGTKoIZyO%|n(^Fl3XutD$oSX0cW-0C;TEG&rBcY&#r z_d_^AXI){=}vGGHyNqo)LNT+{|HxnC{?eGNgAIv`GoD%xn3e1avQtk82n&~YNy za!~`ihlLH(OlIa7-x+a+d@Fzx_=9zF5QiqtHrB9?l2g8PamXU6trZhGd(h-?npYOV zJYqk}F;@T}G|6*-(wQZ{dH>kRYX-qo^^VgmfMRec zoD0X_?0AJ9Q2Dj`|b?lg#iqu^SrD_tM#tcGxS+->^trsL`fOcB1EL8C`R(3>W z!E%h?laa8IA56hKv^%W|FNvayu0WzvO`dRvy3s(iKdFXd3GIi1RkCUnl)ydO@@w70 zZxp3Sx_oE6!s4cTlBdDDbRPD*BlUEAUp4X#R#x8g%%twtrIM#$fNs)Pbc{FIi2;)! zvl873qohnUs>uz(d}(kB&bxeBsP_|TG&!=beH?L$+9N!q8mR=inZM7v6_6NqLui`X z^@St6pXr#(inaJs``UDitYrNs=UC=uEU9n1z9fXDG@bepdH>T$%3@MP`O|8YQ+xzU z%|O%#WLBU-lk>f2N8~;%xJ?ezR}SVrM8>%$I}H!;@Q)9}1g~b@3^eVrE9q%XAArS0B49^dZv9lm|U2_T}KNLGrA3eTJNylLcgB-=o+UthejQq=*O<1khA

    2NQ&UBztN|e03;h0L+Dk>vrAq|wgluoovd%2 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

    WOJyIzQX6=mw>oHDlM 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

    }9v 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%0Dizoc-o?#z*GqE$kCS1Y>R%DlqJirjv07Ui5k;~ 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